Skip to content

Particle instances (.particlebin)

ForzaTechWorld and streamingApplies toFH6

Ambient effects (falling leaves and cherry blossom, bird flocks, koi, fireflies, mist, kites, streamers, light shafts) are placed as particle instances: an effect name, a place, a size and a few strings that gate the instance. A track’s are in Ribbon_00\ParticleInstances.particlebin; each route has its own in Stripped\gs\<track>\routedefinitions\route<id>_<track>.particlebin, beside its sound scape. The install holds 170 such files: the Tokyo track’s, the home space’s and 168 route definitions. Proven

A .particlebin is a Grub bundle with one blob, tag PCLB, no metadata records. Proven The blob is version 7.0 in 169 files and 6.0 in the home space’s, which holds no instance; the layout of a version 6.0 file that has instances is unknown. Observed The blob’s data is a memory image: every offset in it is measured from the start of the data. Proven

.particlebin blob datavariableFH6100% known

Little-endian. The 16-byte header, then the instances, then the strings to the end of the data.

ProvenObservedSourcedInferredUnknownNot described
OffsetSizeTypeFieldConfidenceNotes
0x04u32 = 8eightProvenall 170 files
0x44u32instance countProven0 in 92 files, 1 to 87 in 77 route definitions (508 in all), 3,959 in the track's
0x84u32 = 16sixteenProventhe offset of the first instance
0xC4u32first instanceProven16, or 0xFFFFFFFF when the count is 0
0x10129 ninstance[]instancesProven
nextvariablecstring[]stringsProvenprintable ASCII, each zero-terminated; each is named by some instance; empty when the count is 0
particle instance129 bytesFH687% known

Little-endian, unaligned (the byte at 120 shifts what follows). R is the offset of the instance in the blob data. A string field is the offset of the first byte of a string of the strings section; a link is the offset of another slot.

ProvenObservedSourcedInferredUnknownNot described
OffsetSizeTypeFieldConfidenceNotes
0x04u32nameProvenstring; 986 distinct in the track's file, like falling_leaves_customizable_Instance12
0x44u32 = R + 8linkProven
0x84u32effectProvenstring; 50 distinct in the track's file, like falling_leaves_customizable
0xC4u32 = R + 112linkProven
0x1016u32[4] = 1, 0, 0, 0constantsProven
0x204f32 = 1oneProven
0x2412f32[3]positionObservedworld frame; x −17,103 to 6,743, y 93 to 856, z −9,899 to 8,500 in the track's file
0x3016f32[4]rotationObserveda unit quaternion x, y, z, w (length within 1.4e-7 of 1 on all 3,959 of the track's file)
0x4012f32[3]extentUnknownwhole metres up to float rounding: 2, 8, 2 for 681 instances, 5, 9, 4 for about 600
0x4C4u32 = 0xFFFFFFFFnullProven
0x504f32distanceUnknown0 for 86 instances, otherwise 50 to 6,000; 65 for 1,914 of the track's
0x544u32 = 0zeroProven
0x584u32 = 0xFFFFFFFFnullProven
0x5C4u32 = R + 96linkProven
0x604u32 = 0xFFFFFFFFnullProven
0x644u32nextProvenR + 129, or 0xFFFFFFFF on the last instance
0x684u32tagObservedstring; empty for 3,956 of the track's file, [TIME_ATTACK_DRIFT_CIRCUIT_HORIZON] for one, 0 for two
0x6C4u32 = R + 121linkProven
0x704u32routeObservedstring in the form of a .pgeo header's route string: empty, 0, ~1281, ~351;~8008, ...
0x744u32 = R + 104linkProven
0x781u8flagUnknown0 or 1; 1 for 248 of the track's
0x794u32groupObservedstring; empty for 478 of the track's, otherwise 25 names such as leaves_ginkgo_falling, seagulls_audio, koi_carps
0x7D4u32 = R + 88linkProven

The links make one singly linked chain through an instance’s seven slots (the five string fields and the two null slots): 0, 8, 112, 104, 121, 88, 96, then the next instance’s 0. Proven Every one of the 4,467 instances holds the values above. Proven

  • The track’s file names 986 instances, 50 effects and 26 groups; the commonest effects are falling_leaves_customizable (1,911 instances), cherry_blossom_falling_customizable (960), wild_birds_flock_customizable (237), wild_koicarp_customizable (168) and Light_Skyscrapper (134). Observed
  • The route string uses the same grammar as the route of a .pgeo header (~ before an id, ids joined by ;); that it gates the instance the same way is not established. Unknown
  • The meaning of extent, distance, the byte at 120 and the group string is not established; distance takes the values of a draw distance (50 m to 6 km) but nothing was run to show it. Unknown
How does the game use a particle instance?

The strings suggest a gating by route and gameplay tag, and an audio group; none of it was tested against the running game.