t2-demo-parser 2.2.0 → 3.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (95) hide show
  1. package/README.md +170 -7
  2. package/dist/BitStream.d.ts +14 -3
  3. package/dist/BitStream.d.ts.map +1 -1
  4. package/dist/BitStream.js +28 -6
  5. package/dist/BitStream.js.map +1 -1
  6. package/dist/BitWriter.d.ts +29 -0
  7. package/dist/BitWriter.d.ts.map +1 -0
  8. package/dist/BitWriter.js +76 -0
  9. package/dist/BitWriter.js.map +1 -0
  10. package/dist/ClassRegistry.d.ts +23 -28
  11. package/dist/ClassRegistry.d.ts.map +1 -1
  12. package/dist/ClassRegistry.js +75 -84
  13. package/dist/ClassRegistry.js.map +1 -1
  14. package/dist/DataBlockParsers.d.ts.map +1 -1
  15. package/dist/DataBlockParsers.js +60 -85
  16. package/dist/DataBlockParsers.js.map +1 -1
  17. package/dist/DemoParser.d.ts +23 -22
  18. package/dist/DemoParser.d.ts.map +1 -1
  19. package/dist/DemoParser.js +218 -266
  20. package/dist/DemoParser.js.map +1 -1
  21. package/dist/EventParsers.d.ts.map +1 -1
  22. package/dist/EventParsers.js +87 -58
  23. package/dist/EventParsers.js.map +1 -1
  24. package/dist/GhostManager.d.ts +7 -1
  25. package/dist/GhostManager.d.ts.map +1 -1
  26. package/dist/GhostManager.js +231 -146
  27. package/dist/GhostManager.js.map +1 -1
  28. package/dist/HuffmanProcessor.d.ts +15 -0
  29. package/dist/HuffmanProcessor.d.ts.map +1 -1
  30. package/dist/HuffmanProcessor.js +45 -0
  31. package/dist/HuffmanProcessor.js.map +1 -1
  32. package/dist/LiveParser.d.ts +20 -1
  33. package/dist/LiveParser.d.ts.map +1 -1
  34. package/dist/LiveParser.js +31 -12
  35. package/dist/LiveParser.js.map +1 -1
  36. package/dist/PacketParser.d.ts +22 -2
  37. package/dist/PacketParser.d.ts.map +1 -1
  38. package/dist/PacketParser.js +111 -48
  39. package/dist/PacketParser.js.map +1 -1
  40. package/dist/Timeline.d.ts +5 -2
  41. package/dist/Timeline.d.ts.map +1 -1
  42. package/dist/Timeline.js +25 -12
  43. package/dist/Timeline.js.map +1 -1
  44. package/dist/cli.js +3 -0
  45. package/dist/cli.js.map +1 -1
  46. package/dist/dataBlockDataTypes.d.ts +118 -117
  47. package/dist/dataBlockDataTypes.d.ts.map +1 -1
  48. package/dist/dataBlockDataTypes.js.map +1 -1
  49. package/dist/defaultRegistry.d.ts +9 -0
  50. package/dist/defaultRegistry.d.ts.map +1 -0
  51. package/dist/defaultRegistry.js +43 -0
  52. package/dist/defaultRegistry.js.map +1 -0
  53. package/dist/eventDataTypes.d.ts +74 -72
  54. package/dist/eventDataTypes.d.ts.map +1 -1
  55. package/dist/eventDataTypes.js.map +1 -1
  56. package/dist/ghostDataTypes.d.ts +125 -131
  57. package/dist/ghostDataTypes.d.ts.map +1 -1
  58. package/dist/ghostDataTypes.js.map +1 -1
  59. package/dist/index.d.ts +6 -4
  60. package/dist/index.d.ts.map +1 -1
  61. package/dist/index.js +4 -2
  62. package/dist/index.js.map +1 -1
  63. package/dist/types.d.ts +51 -2
  64. package/dist/types.d.ts.map +1 -1
  65. package/dist/types.js +6 -0
  66. package/dist/types.js.map +1 -1
  67. package/package.json +4 -1
  68. package/dist/BitStream.test.d.ts +0 -2
  69. package/dist/BitStream.test.d.ts.map +0 -1
  70. package/dist/BitStream.test.js +0 -419
  71. package/dist/BitStream.test.js.map +0 -1
  72. package/dist/ClassRegistry.test.d.ts +0 -2
  73. package/dist/ClassRegistry.test.d.ts.map +0 -1
  74. package/dist/ClassRegistry.test.js +0 -83
  75. package/dist/ClassRegistry.test.js.map +0 -1
  76. package/dist/DataBlockParsers.test.d.ts +0 -2
  77. package/dist/DataBlockParsers.test.d.ts.map +0 -1
  78. package/dist/DataBlockParsers.test.js +0 -294
  79. package/dist/DataBlockParsers.test.js.map +0 -1
  80. package/dist/DemoParser.test.d.ts +0 -2
  81. package/dist/DemoParser.test.d.ts.map +0 -1
  82. package/dist/DemoParser.test.js +0 -472
  83. package/dist/DemoParser.test.js.map +0 -1
  84. package/dist/GhostStateAccumulator.test.d.ts +0 -2
  85. package/dist/GhostStateAccumulator.test.d.ts.map +0 -1
  86. package/dist/GhostStateAccumulator.test.js +0 -201
  87. package/dist/GhostStateAccumulator.test.js.map +0 -1
  88. package/dist/GhostTracker.test.d.ts +0 -2
  89. package/dist/GhostTracker.test.d.ts.map +0 -1
  90. package/dist/GhostTracker.test.js +0 -64
  91. package/dist/GhostTracker.test.js.map +0 -1
  92. package/dist/IncrementalParser.test.d.ts +0 -2
  93. package/dist/IncrementalParser.test.d.ts.map +0 -1
  94. package/dist/IncrementalParser.test.js +0 -226
  95. package/dist/IncrementalParser.test.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"GhostManager.js","sourceRoot":"","sources":["../src/GhostManager.ts"],"names":[],"mappings":"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","sourcesContent":["import type { BitStream } from \"./BitStream.js\";\nimport type {\n ClassRegistry,\n ConnectionContext,\n GhostEntry,\n GhostTrackerInterface,\n} from \"./ClassRegistry.js\";\nimport type {\n MoveData,\n SoundSlot,\n ThreadState,\n ImageSlot,\n GameBaseGhostData,\n ShapeBaseGhostData,\n PlayerGhostData,\n PlayerPacketData,\n VehicleGhostData,\n VehiclePacketData,\n WheeledVehicleGhostData,\n WheeledVehiclePacketData,\n FlyingVehicleGhostData,\n HoverVehicleGhostData,\n ItemGhostData,\n StaticShapeGhostData,\n BeaconObjectGhostData,\n TurretGhostData,\n MissionMarkerGhostData,\n WayPointGhostData,\n SpawnSphereGhostData,\n CameraGhostData,\n CameraPacketData,\n MarkerGhostData,\n SimpleNetObjectGhostData,\n InteriorInstanceGhostData,\n TSStaticGhostData,\n TerrainBlockGhostData,\n TriggerGhostData,\n VehicleBlockerGhostData,\n MissionAreaGhostData,\n AudioEmitterGhostData,\n PhysicalZoneGhostData,\n DebrisGhostData,\n ProjectileGhostData,\n LinearProjectileGhostData,\n BombProjectileGhostData,\n GrenadeProjectileGhostData,\n SeekerProjectileGhostData,\n SniperProjectileGhostData,\n ShockLanceProjectileGhostData,\n ELFProjectileGhostData,\n RepairProjectileGhostData,\n TargetProjectileGhostData,\n ForceFieldBareGhostData,\n SunGhostData,\n SkyGhostData,\n LightningGhostData,\n WaterBlockGhostData,\n SplashGhostData,\n ShockwaveGhostData,\n FireballAtmosphereGhostData,\n PrecipitationGhostData,\n ParticleEmissionDummyGhostData,\n StationFXPersonalGhostData,\n AIObjectiveGhostData,\n} from \"./ghostDataTypes.js\";\nimport { MaxTriggerKeys } from \"./types.js\";\n\n// ============================================================\n// Ghost Tracker — tracks ghost lifecycle (create/update/delete)\n// ============================================================\n\nexport class GhostTracker implements GhostTrackerInterface {\n private ghosts = new Map<number, GhostEntry>();\n\n getGhost(index: number): GhostEntry | undefined {\n return this.ghosts.get(index);\n }\n\n hasGhost(index: number): boolean {\n return this.ghosts.has(index);\n }\n\n createGhost(index: number, classId: number, className: string): GhostEntry {\n const entry: GhostEntry = { classId, className, state: {} };\n this.ghosts.set(index, entry);\n return entry;\n }\n\n deleteGhost(index: number): void {\n this.ghosts.delete(index);\n }\n\n getAllGhosts(): Map<number, GhostEntry> {\n return this.ghosts;\n }\n\n size(): number {\n return this.ghosts.size;\n }\n\n clear(): void {\n this.ghosts.clear();\n }\n}\n\n// ============================================================\n// Shared parsing helpers\n// ============================================================\n\nfunction readMove(bs: BitStream): MoveData {\n const pyaw = bs.readFlag() ? bs.readInt(16) : 0;\n const ppitch = bs.readFlag() ? bs.readInt(16) : 0;\n const proll = bs.readFlag() ? bs.readInt(16) : 0;\n const px = bs.readInt(6);\n const py = bs.readInt(6);\n const pz = bs.readInt(6);\n const freeLook = bs.readFlag();\n const trigger: boolean[] = [];\n for (let i = 0; i < MaxTriggerKeys; i++) {\n trigger.push(bs.readFlag());\n }\n return { pyaw, ppitch, proll, px, py, pz, freeLook, trigger };\n}\n\n/**\n * Read a packed ColorF: 4 × U8 (32 bits total), each converted to [0..1] float.\n * From decompiled binary: FUN_0043f040 reads 4 bytes, each × (1/255).\n */\nfunction readPackedColorF(bs: BitStream): {\n r: number;\n g: number;\n b: number;\n a: number;\n} {\n return {\n r: bs.readInt(8) / 255,\n g: bs.readInt(8) / 255,\n b: bs.readInt(8) / 255,\n a: bs.readInt(8) / 255,\n };\n}\n\n/**\n * Tribes 2 object/datablock references are serialized via FUN_00436ce0/FUN_00436d10\n * as raw 11-bit object ids (nextPow2(0x800) -> bitCount 11).\n */\nfunction readObjectRef11(bs: BitStream): number {\n return bs.readInt(11);\n}\n\n// ============================================================\n// GameBase::unpackUpdate (base layer for all game objects)\n// ============================================================\n\nfunction readGameBaseUpdate(\n bs: BitStream,\n _isInitial: boolean,\n _conn: ConnectionContext,\n): GameBaseGhostData {\n const result: GameBaseGhostData = {};\n\n // GameBase::unpackUpdate (FUN_005e3360)\n // DataBlockMask\n if (bs.readFlag()) {\n result.dataBlockId = readObjectRef11(bs);\n }\n\n // TargetMask\n if (bs.readFlag()) {\n // Optional explicit target id; otherwise remains -1.\n const hasTargetId = bs.readFlag();\n result.targetId = hasTargetId ? bs.readInt(9) : -1;\n }\n\n return result;\n}\n\n// ============================================================\n// ShapeBase::unpackUpdate (layer 2 — damage, threads, images, etc.)\n// ============================================================\n\nfunction readShapeBaseUpdate(\n bs: BitStream,\n isInitial: boolean,\n conn: ConnectionContext,\n): ShapeBaseGhostData {\n const result: ShapeBaseGhostData = readGameBaseUpdate(bs, isInitial, conn);\n\n // ShapeBase::unpackUpdate (FUN_005ef0e0)\n // Combined gate for all remaining ShapeBase masks.\n if (!bs.readFlag()) {\n return result;\n }\n\n // DamageMask\n if (bs.readFlag()) {\n result.damageLevel = bs.readFloat(6); // DamageLevelBits=6\n result.damageState = bs.readInt(2); // NumDamageStateBits=2\n result.blowApart = bs.readFlag();\n result.damageDir = bs.readNormalVector(8);\n }\n\n // SoundMask (4 sound slots)\n if (bs.readFlag()) {\n const sounds: SoundSlot[] = [];\n for (let i = 0; i < 4; i++) {\n if (bs.readFlag()) {\n const playing = bs.readFlag();\n const sound: SoundSlot = {\n index: i,\n playing,\n };\n if (playing) {\n sound.profileId = readObjectRef11(bs);\n }\n sounds.push(sound);\n }\n }\n if (sounds.length > 0) {\n result.sounds = sounds;\n }\n }\n\n // ThreadMask (script animation threads, 4 slots)\n if (bs.readFlag()) {\n const threads: ThreadState[] = [];\n for (let i = 0; i < 4; i++) {\n if (bs.readFlag()) {\n threads.push({\n index: i,\n sequence: bs.readInt(5),\n state: bs.readInt(2),\n forward: bs.readFlag(),\n atEnd: bs.readFlag(),\n });\n }\n }\n if (threads.length > 0) {\n result.threads = threads;\n }\n }\n\n // ImageMask (8 mounted image slots)\n let imageSkinDirty = false;\n if (bs.readFlag()) {\n const images: ImageSlot[] = [];\n for (let i = 0; i < 8; i++) {\n if (bs.readFlag()) {\n const img: ImageSlot = { index: i };\n\n // Optional image datablock reference.\n if (bs.readFlag()) {\n img.dataBlockId = readObjectRef11(bs);\n } else {\n img.dataBlockId = 0;\n }\n\n // FUN_00588870 payload: hasSkin -> (tagIndex|string).\n if (bs.readFlag()) {\n if (bs.readFlag()) {\n img.skinTagIndex = bs.readInt(10);\n imageSkinDirty = true;\n } else {\n img.skinName = bs.readString();\n imageSkinDirty = true;\n }\n }\n\n // Per-slot state flags + 3-bit fire count.\n // The retail Tribes 2 binary (FUN_005ef0e0) packs these in a different\n // order than the V12 SDK source code. Verified via Ghidra decompilation:\n // the binary stores to offsets 0x3ac (triggerDown), 0x398 (loaded),\n // 0x3ad (ammo), 0x3af (wet), 0x3ae (target), confirmed by matching the\n // setImage(slot, db, skin, loaded, ammo, triggerDown) call signature.\n img.triggerDown = bs.readFlag();\n img.loaded = bs.readFlag();\n img.ammo = bs.readFlag();\n img.wet = bs.readFlag();\n img.target = bs.readFlag();\n img.fireCount = bs.readInt(3);\n\n // Mounted-image firing bit (FUN_005ef0e0):\n // Read when (this+0x18 & 8)==0, i.e., when the object is NOT\n // \"properly added\" to the scene. Initial block creates and packet\n // stream ghost creates are NOT properly added (isInitial=true),\n // but packet stream ghost updates ARE properly added (isInitial=false).\n if (isInitial) {\n img.imageExtraFlag = bs.readFlag();\n }\n\n images.push(img);\n }\n }\n if (images.length > 0) {\n result.images = images;\n }\n }\n\n // CloakMask section (ShapeBase, binary-verified FUN_005ef0e0).\n // Combined mask: ShieldMask | CloakMask | InvincibleMask (0x1c0).\n if (bs.readFlag()) {\n // CloakMask sub-section.\n const hasCloakData = bs.readFlag();\n if (hasCloakData) {\n result.cloaked = bs.readFlag(); // mCloaked (stealth pack active)\n result.isControlled = bs.readFlag(); // bool(getControllingClient())\n const fading = bs.readFlag(); // mFading && mFadeElapsedTime >= mFadeDelay\n result.fading = fading;\n\n if (fading) {\n result.fadeOut = bs.readFlag(); // mFadeOut (true=fading out, false=fading in)\n result.fadeTime = bs.readF32(); // mFadeTime (duration in seconds)\n } else {\n result.fadeVal = bs.readFlag(); // mFadeVal == 1.0 (true=visible, false=hidden)\n }\n }\n\n const hasStateB = bs.readFlag();\n if (hasStateB) {\n const useStateBFlag = bs.readFlag();\n if (useStateBFlag) {\n const stateBMode = bs.readFlag();\n result.stateBMode = stateBMode;\n if (stateBMode) {\n result.energyPackOn = true;\n } else {\n result.energyPackOn = false;\n }\n } else {\n result.shieldNormal = bs.readNormalVector(8);\n result.energyPercent = bs.readFloat(5);\n }\n }\n\n if (bs.readFlag()) {\n result.stateValue1 = bs.readU32();\n result.stateValue2 = bs.readU32();\n }\n }\n\n if (imageSkinDirty) {\n result.imageSkinDirty = true;\n }\n\n // MountedMask\n if (bs.readFlag()) {\n if (bs.readFlag()) {\n // Mounting\n result.mountObject = bs.readInt(10);\n result.mountNode = bs.readInt(5); // NumMountPointBits=5\n } else {\n result.mountObject = -1; // Unmounting\n }\n }\n\n return result;\n}\n\n// ============================================================\n// Player ghost parser\n// ============================================================\n\nfunction playerUnpackUpdate(\n bs: BitStream,\n isInitial: boolean,\n conn: ConnectionContext,\n): PlayerGhostData {\n const result: PlayerGhostData = readShapeBaseUpdate(bs, isInitial, conn);\n\n // ImpactMask (only on non-initial updates)\n if (bs.readFlag()) {\n result.impactSound = bs.readInt(3); // ImpactBits=3\n }\n\n // ActionMask — action animation\n if (bs.readFlag()) {\n result.action = bs.readInt(8); // ActionAnimBits=8\n result.actionHoldAtEnd = bs.readFlag();\n result.actionAtEnd = bs.readFlag();\n result.actionFirstPerson = bs.readFlag();\n if (!result.actionAtEnd) {\n if (bs.readFlag()) {\n result.actionAnimPos = bs.readSignedFloat(6);\n }\n }\n }\n\n // ActionMask — arm animation\n if (bs.readFlag()) {\n result.armAction = bs.readInt(8); // ActionAnimBits=8\n }\n\n // Control object shortcut — if controlled by this client, skip rest\n if (bs.readFlag()) {\n return result;\n }\n\n // MoveMask\n if (bs.readFlag()) {\n result.actionState = bs.readInt(3); // NumStateBits=3\n if (bs.readFlag()) {\n // RecoverState\n result.recoverTicks = bs.readInt(7); // RecoverDelayBits=7\n }\n\n // FUN_005db2d0: two state flags immediately before compressed position.\n result.moveFlag0 = bs.readFlag();\n result.moveFlag1 = bs.readFlag();\n\n result.position = bs.readCompressedPoint(conn.compressionPoint);\n\n // Velocity\n if (bs.readFlag()) {\n // Binary (0x5db850): readInt(13) FIRST, then readNormalVector(10)\n const velMag = bs.readInt(13) / 32.0;\n const velDir = bs.readNormalVector(10);\n result.velocity = {\n x: velDir.x * velMag,\n y: velDir.y * velMag,\n z: velDir.z * velMag,\n };\n } else {\n result.velocity = { x: 0, y: 0, z: 0 };\n }\n\n result.headX = bs.readSignedFloat(6); // * maxLookAngle\n result.headZ = bs.readSignedFloat(6); // * maxLookAngle\n result.rotationZ = bs.readFloat(7) * 2 * Math.PI;\n\n result.move = readMove(bs);\n result.allowWarp = bs.readFlag();\n }\n\n // Energy (always present after MoveMask section)\n result.energy = bs.readFloat(5); // EnergyLevelBits=5\n\n return result;\n}\n\nfunction playerReadPacketData(\n bs: BitStream,\n conn: ConnectionContext,\n): PlayerPacketData {\n const result: PlayerPacketData = {};\n\n // ShapeBase::readPacketData\n result.energyLevel = bs.readF32();\n result.rechargeRate = bs.readF32();\n\n // Player::readPacketData\n result.actionState = bs.readInt(3); // NumStateBits=3\n if (bs.readFlag()) {\n // RecoverState\n result.recoverTicks = bs.readInt(7);\n }\n if (bs.readFlag()) {\n result.jumpDelay = bs.readInt(7); // JumpDelayBits=7\n }\n\n if (bs.readFlag()) {\n // Not mounted — read full position/velocity\n const pos = {\n x: bs.readF32(),\n y: bs.readF32(),\n z: bs.readF32(),\n };\n result.position = pos;\n // Update compression point (this IS the compression point)\n conn.compressionPoint = pos;\n result.velocity = {\n x: bs.readF32(),\n y: bs.readF32(),\n z: bs.readF32(),\n };\n result.jumpSurfaceLastContact = bs.readInt(4);\n }\n\n result.headX = bs.readF32();\n result.headZ = bs.readF32();\n result.rotationZ = bs.readF32();\n\n if (bs.readFlag()) {\n // Has control object (e.g., vehicle being piloted)\n // Binary FUN_005dab20: readInt(10) + resolveGhost + obj->readPacketData(conn, stream)\n const controlGhostIndex = bs.readInt(10);\n result.controlObjectGhost = controlGhostIndex;\n\n // Recursively call the control object's readPacketData.\n // Look up the ghost class and find its readPacketData parser.\n const controlGhost = conn.ghostTracker.getGhost(controlGhostIndex);\n const controlParser = controlGhost\n ? conn.getGhostParser?.(controlGhost.classId)\n : undefined;\n if (controlParser?.readPacketData) {\n const prevGhostIndex = conn.currentGhostIndex;\n conn.currentGhostIndex = controlGhostIndex;\n result.controlObjectData = controlParser.readPacketData(bs, conn);\n conn.currentGhostIndex = prevGhostIndex;\n }\n }\n\n result.disableMove = bs.readFlag();\n result.pilot = bs.readFlag();\n\n return result;\n}\n\n// ============================================================\n// Vehicle ghost parser\n// ============================================================\n\nfunction vehicleUnpackUpdate(\n bs: BitStream,\n isInitial: boolean,\n conn: ConnectionContext,\n): VehicleGhostData {\n const result: VehicleGhostData = readShapeBaseUpdate(bs, isInitial, conn);\n\n result.jetting = bs.readFlag();\n\n // Control object shortcut — server writes true and returns early,\n // meaning no further Vehicle data follows in the stream.\n if (bs.readFlag()) {\n result._controlledEarlyReturn = true;\n return result;\n }\n\n // Steering\n result.steeringYaw = bs.readFloat(9);\n result.steeringPitch = bs.readFloat(9);\n result.move = readMove(bs);\n result.frozen = bs.readFlag();\n\n // PositionMask\n if (bs.readFlag()) {\n result.position = bs.readCompressedPoint(conn.compressionPoint);\n // Angular position as quaternion (4x F32)\n result.angPosition = {\n x: bs.readF32(),\n y: bs.readF32(),\n z: bs.readF32(),\n w: bs.readF32(),\n };\n // Linear momentum (3x F32)\n result.linMomentum = bs.readPoint3F();\n // Angular momentum (3x F32)\n result.angMomentum = bs.readPoint3F();\n }\n\n // EnergyMask\n if (bs.readFlag()) {\n result.energy = bs.readFloat(8);\n }\n\n return result;\n}\n\nfunction vehicleReadPacketData(\n bs: BitStream,\n conn: ConnectionContext,\n): VehiclePacketData {\n // Vehicle::readPacketData (binary FUN_0060d740)\n // ShapeBase::readPacketData → GameBase::readPacketData (empty) + energy + recharge\n const result: VehiclePacketData = {};\n result.energyLevel = bs.readF32();\n result.rechargeRate = bs.readF32();\n\n // Vehicle-specific rigid body state\n result.steering = { x: bs.readF32(), y: bs.readF32() };\n const linPos = { x: bs.readF32(), y: bs.readF32(), z: bs.readF32() };\n result.linPosition = linPos;\n result.angPosition = {\n x: bs.readF32(),\n y: bs.readF32(),\n z: bs.readF32(),\n w: bs.readF32(),\n };\n result.linMomentum = bs.readPoint3F();\n result.angMomentum = bs.readPoint3F();\n result.disableMove = bs.readFlag();\n result.frozen = bs.readFlag();\n conn.compressionPoint = linPos;\n return result;\n}\n\nfunction wheeledVehicleReadPacketData(\n bs: BitStream,\n conn: ConnectionContext,\n): WheeledVehiclePacketData {\n // WheeledVehicle::readPacketData (binary FUN_00615840)\n // Calls Parent::readPacketData (Vehicle) + braking flag + per-wheel data\n const result: WheeledVehiclePacketData = vehicleReadPacketData(bs, conn);\n result.braking = bs.readFlag();\n // wheelCount × 3 F32 (avel, Dy, Dx per wheel)\n const wheels: Array<{ avel: number; dy: number; dx: number }> = [];\n for (let i = 0; i < WheeledVehicleWheelCount; i++) {\n wheels.push({\n avel: bs.readF32(),\n dy: bs.readF32(),\n dx: bs.readF32(),\n });\n }\n result.wheels = wheels;\n return result;\n}\n\n// ============================================================\n// FlyingVehicle ghost parser\n// ============================================================\n\nfunction flyingVehicleUnpackUpdate(\n bs: BitStream,\n isInitial: boolean,\n conn: ConnectionContext,\n): FlyingVehicleGhostData {\n const result: FlyingVehicleGhostData = vehicleUnpackUpdate(\n bs,\n isInitial,\n conn,\n );\n\n // FlyingVehicle has its own control gate flag (separate from Vehicle's).\n // Retail binary removed the V12 ThrustMask wrapper but kept the per-subclass\n // control check: if true, no FlyingVehicle-specific data follows.\n if (bs.readFlag()) {\n return result;\n }\n result.createHeightOn = bs.readFlag();\n result.thrustDirection = bs.readInt(3); // NumThrustBits=3\n\n return result;\n}\n\n// ============================================================\n// HoverVehicle ghost parser\n// ============================================================\n\nfunction hoverVehicleUnpackUpdate(\n bs: BitStream,\n isInitial: boolean,\n conn: ConnectionContext,\n): HoverVehicleGhostData {\n const result: HoverVehicleGhostData = vehicleUnpackUpdate(\n bs,\n isInitial,\n conn,\n );\n result.thrustDirection = bs.readInt(3); // NumThrustBits=3\n return result;\n}\n\n// ============================================================\n// Item ghost parser\n// ============================================================\n\nfunction itemUnpackUpdate(\n bs: BitStream,\n isInitial: boolean,\n conn: ConnectionContext,\n): ItemGhostData {\n const result: ItemGhostData = readShapeBaseUpdate(bs, isInitial, conn);\n\n // InitialUpdateMask\n if (bs.readFlag()) {\n result.rotate = bs.readFlag();\n result.isStatic = bs.readFlag();\n result.collideable = bs.readFlag();\n if (bs.readFlag()) {\n result.scale = bs.readPoint3F();\n }\n }\n\n // ThrowSrcMask\n if (bs.readFlag()) {\n result.collisionObject = bs.readInt(10);\n }\n\n // RotationMask (only if !rotate)\n if (bs.readFlag()) {\n const zSign = bs.readFlag() ? -1 : 1;\n const angle = bs.readF32();\n result.rotation = { zSign, angle };\n }\n\n // PositionMask\n if (bs.readFlag()) {\n result.position = bs.readPoint3F();\n const atRest = bs.readFlag();\n result.atRest = atRest;\n if (!atRest) {\n result.velocity = bs.readPoint3F();\n }\n result.warp = bs.readFlag();\n }\n\n return result;\n}\n\n// ============================================================\n// StaticShape ghost parser\n// ============================================================\n\nfunction staticShapeUnpackUpdate(\n bs: BitStream,\n isInitial: boolean,\n conn: ConnectionContext,\n): StaticShapeGhostData {\n const result: StaticShapeGhostData = readShapeBaseUpdate(bs, isInitial, conn);\n\n // PositionMask\n if (bs.readFlag()) {\n // FUN_00602da0 -> FUN_0043c4c0 reads compressed affine transform\n // (position + quaternion xyz + sign bit), not a full MatrixF.\n const transform = bs.readAffineTransform();\n result.transform = transform;\n result.position = transform.position;\n result.scale = bs.readPoint3F();\n }\n\n // Power state (always present)\n result.powered = bs.readFlag();\n\n return result;\n}\n\nfunction scopeAlwaysShapeUnpackUpdate(\n bs: BitStream,\n isInitial: boolean,\n conn: ConnectionContext,\n): StaticShapeGhostData {\n // ScopeAlwaysShape vtable +0x4c -> FUN_00602da0 (same as StaticShape).\n return staticShapeUnpackUpdate(bs, isInitial, conn);\n}\n\nfunction markerUnpackUpdate(\n bs: BitStream,\n _isInitial: boolean,\n _conn: ConnectionContext,\n): MarkerGhostData {\n // Marker::unpackUpdate (simPath.cc): Parent::unpackUpdate (SceneObject,\n // no data) then reads just a Point3F position.\n const position = bs.readPoint3F();\n return { position };\n}\n\nfunction simpleNetObjectUnpackUpdate(\n bs: BitStream,\n _isInitial: boolean,\n _conn: ConnectionContext,\n): SimpleNetObjectGhostData {\n // SimpleNetObject vtable +0x4c -> FUN_005c5220 (single string).\n return { message: bs.readString() };\n}\n\nfunction beaconObjectUnpackUpdate(\n bs: BitStream,\n isInitial: boolean,\n conn: ConnectionContext,\n): BeaconObjectGhostData {\n // BeaconObject vtable +0x4c -> FUN_006a3ae0:\n // StaticShape payload + optional 2-bit beacon type.\n const result: BeaconObjectGhostData = staticShapeUnpackUpdate(\n bs,\n isInitial,\n conn,\n );\n if (bs.readFlag()) {\n result.beaconType = bs.readInt(2);\n }\n return result;\n}\n\nfunction missionMarkerUnpackUpdate(\n bs: BitStream,\n isInitial: boolean,\n conn: ConnectionContext,\n): MissionMarkerGhostData {\n // MissionMarker extends ShapeBase (confirmed by V12 source and empirical\n // testing). The Ghidra decompilation misidentified the parent call — the\n // real parent is ShapeBase::unpackUpdate, not an empty stub.\n const result: MissionMarkerGhostData = readShapeBaseUpdate(\n bs,\n isInitial,\n conn,\n );\n\n // MissionMarker's own field: PositionMask\n if (bs.readFlag()) {\n const transform = bs.readAffineTransform();\n result.transform = transform;\n result.position = transform.position;\n result.scale = bs.readPoint3F();\n }\n\n return result;\n}\n\nfunction debrisUnpackUpdate(\n bs: BitStream,\n isInitial: boolean,\n conn: ConnectionContext,\n): DebrisGhostData {\n // Debris vtable +0x4c -> FUN_006844d0.\n // Confirmed in decompiled binary: calls parent GameBase::unpackUpdate first.\n const result: DebrisGhostData = readGameBaseUpdate(bs, isInitial, conn);\n\n // 6 × F32\n result.value0 = bs.readF32();\n result.value1 = bs.readF32();\n result.value2 = bs.readF32();\n result.value3 = bs.readF32();\n result.value4 = bs.readF32();\n result.value5 = bs.readF32();\n\n // 4 × bool (readBool = 8-bit)\n result.bool0 = bs.readBool();\n result.bool1 = bs.readBool();\n result.bool2 = bs.readBool();\n result.bool3 = bs.readBool();\n\n // 6 × F32\n result.value6 = bs.readF32();\n result.value7 = bs.readF32();\n result.value8 = bs.readF32();\n result.value9 = bs.readF32();\n result.value10 = bs.readF32();\n result.value11 = bs.readF32();\n\n // 2 × bool\n result.bool4 = bs.readBool();\n result.bool5 = bs.readBool();\n\n // 3 × F32\n result.value12 = bs.readF32();\n result.value13 = bs.readF32();\n result.value14 = bs.readF32();\n\n // 1 × bool\n result.bool6 = bs.readBool();\n\n // 2 × string\n result.string0 = bs.readString();\n result.string1 = bs.readString();\n\n // 3 conditional object references\n const refs: number[] = [];\n for (let i = 0; i < 2; i++) {\n refs.push(bs.readFlag() ? readObjectRef11(bs) : -1);\n }\n result.objectRefs = refs;\n result.objectRef2 = bs.readFlag() ? readObjectRef11(bs) : -1;\n\n return result;\n}\n\nfunction projectileUnpackUpdate(\n bs: BitStream,\n isInitial: boolean,\n conn: ConnectionContext,\n): ProjectileGhostData {\n // Projectile vtable +0x4c -> FUN_005e3360 (GameBase only).\n return readGameBaseUpdate(bs, isInitial, conn);\n}\n\n// ============================================================\n// Projectile ghost parsers\n// ============================================================\n\nfunction bombProjectileUnpackUpdate(\n bs: BitStream,\n _isInitial: boolean,\n _conn: ConnectionContext,\n): BombProjectileGhostData {\n // BombProjectile vtable +0x4c -> FUN_00636050.\n const result: BombProjectileGhostData = {};\n\n // Parent GameBase::unpackUpdate\n if (bs.readFlag()) {\n result.dataBlockId = readObjectRef11(bs);\n }\n if (bs.readFlag()) {\n const hasTargetId = bs.readFlag();\n result.targetId = hasTargetId ? bs.readInt(9) : -1;\n }\n\n if (!bs.readFlag()) {\n if (bs.readFlag()) {\n result.position = { x: bs.readF32(), y: bs.readF32(), z: bs.readF32() };\n result.velocity = { x: bs.readF32(), y: bs.readF32(), z: bs.readF32() };\n }\n if (!bs.readFlag()) {\n return result;\n }\n result.endPoint = { x: bs.readF32(), y: bs.readF32(), z: bs.readF32() };\n result.endNormal = { x: bs.readF32(), y: bs.readF32(), z: bs.readF32() };\n return result;\n }\n\n result.position = { x: bs.readF32(), y: bs.readF32(), z: bs.readF32() };\n result.velocity = { x: bs.readF32(), y: bs.readF32(), z: bs.readF32() };\n result.currTick = bs.readInt(12); // nextPow2(0x1000) -> 12 bits\n\n if (bs.readFlag()) {\n result.resetFlag = true; // FUN_00636ae0 side-effect-only\n }\n\n if (bs.readFlag()) {\n result.explodePoint = { x: bs.readF32(), y: bs.readF32(), z: bs.readF32() };\n result.explodeNormal = {\n x: bs.readF32(),\n y: bs.readF32(),\n z: bs.readF32(),\n };\n }\n\n if (bs.readFlag()) {\n result.sourceObject = bs.readInt(11); // nextPow2(0x401) -> 11 bits\n result.sourceSlot = bs.readInt(3); // nextPow2(8) -> 3 bits\n } else {\n result.sourceObject = -1;\n result.sourceSlot = -1;\n }\n\n if (bs.readFlag()) {\n result.vehicleObject = bs.readInt(11); // nextPow2(0x401) -> 11 bits\n } else {\n result.vehicleObject = 0;\n }\n\n return result;\n}\n\nfunction grenadeUnpackUpdate(\n bs: BitStream,\n isInitial: boolean,\n conn: ConnectionContext,\n): GrenadeProjectileGhostData {\n // Parent: Projectile → GameBase (Projectile has no override)\n const result: GrenadeProjectileGhostData = readGameBaseUpdate(\n bs,\n isInitial,\n conn,\n );\n\n if (bs.readFlag()) {\n // InitialUpdateMask\n result.position = bs.readPoint3F();\n result.velocity = bs.readPoint3F();\n result.currTick = bs.readRangedU32(0, 4095);\n result.quickSplash = bs.readFlag();\n if (bs.readFlag()) {\n result.explodePoint = bs.readPoint3F();\n result.explodeNormal = bs.readPoint3F();\n }\n if (bs.readFlag()) {\n result.sourceObject = bs.readRangedU32(0, 1024);\n result.sourceSlot = bs.readRangedU32(0, 7);\n }\n if (bs.readFlag()) {\n result.vehicleObject = bs.readRangedU32(0, 1024);\n }\n } else {\n // Non-initial\n if (bs.readFlag()) {\n // BounceMask\n result.position = bs.readPoint3F();\n result.velocity = bs.readPoint3F();\n }\n if (bs.readFlag()) {\n // ExplosionMask\n result.explodePoint = bs.readPoint3F();\n result.explodeNormal = bs.readPoint3F();\n }\n }\n\n return result;\n}\n\nfunction seekerUnpackUpdate(\n bs: BitStream,\n isInitial: boolean,\n conn: ConnectionContext,\n): SeekerProjectileGhostData {\n // SeekerProjectile::unpackUpdate in build 25034 is FUN_0063c010\n // (vtable PTR_FUN_007ae54c + 0x4c), with parent GameBase::unpackUpdate.\n const result: SeekerProjectileGhostData = readGameBaseUpdate(\n bs,\n isInitial,\n conn,\n );\n\n const fullStateMask = bs.readFlag();\n if (!fullStateMask) {\n // 0x0063c010 non-full path\n const isExplosion = bs.readFlag();\n if (isExplosion) {\n // FUN_00639370: explode(position, normal) — SeekerProjectile detonation.\n result.explodePosition = {\n x: bs.readF32(),\n y: bs.readF32(),\n z: bs.readF32(),\n };\n result.explodeNormal = {\n x: bs.readF32(),\n y: bs.readF32(),\n z: bs.readF32(),\n };\n return result;\n }\n\n result.position = { x: bs.readF32(), y: bs.readF32(), z: bs.readF32() };\n result.velocity = { x: bs.readF32(), y: bs.readF32(), z: bs.readF32() };\n\n const hasTargetInfo = bs.readFlag();\n if (hasTargetInfo) {\n const hasTargetGhost = bs.readFlag();\n if (!hasTargetGhost) {\n result.targetDirection = {\n x: bs.readF32(),\n y: bs.readF32(),\n z: bs.readF32(),\n };\n result.targetMode = 1;\n } else {\n // getBitCount(getNextPow2(0x401)) -> 11 bits\n result.targetGhost = bs.readInt(11);\n result.targetMode = 0;\n }\n } else {\n result.targetMode = 2;\n }\n\n return result;\n }\n\n // 0x0063c010 full-state path\n result.position = { x: bs.readF32(), y: bs.readF32(), z: bs.readF32() };\n result.velocity = { x: bs.readF32(), y: bs.readF32(), z: bs.readF32() };\n result.orientation = { x: bs.readF32(), y: bs.readF32(), z: bs.readF32() };\n\n // Optional source object + slot\n if (bs.readFlag()) {\n result.sourceObject = bs.readInt(11); // getBitCount(getNextPow2(0x401))\n result.sourceSlot = bs.readInt(3); // getBitCount(getNextPow2(8))\n } else {\n result.sourceObject = -1;\n result.sourceSlot = -1;\n }\n\n // Optional target descriptor\n if (bs.readFlag()) {\n const hasTargetGhost = bs.readFlag();\n if (!hasTargetGhost) {\n result.targetDirection = {\n x: bs.readF32(),\n y: bs.readF32(),\n z: bs.readF32(),\n };\n result.targetMode = 1;\n } else {\n result.targetGhost = bs.readInt(11); // getBitCount(getNextPow2(0x401))\n result.targetMode = 0;\n }\n } else {\n result.targetMode = 2;\n }\n\n // Final timeout/alive flag branch in FUN_0063c010.\n result.timeoutReset = bs.readFlag();\n\n return result;\n}\n\n// ============================================================\n// Turret ghost parser\n// ============================================================\n\nfunction turretUnpackUpdate(\n bs: BitStream,\n isInitial: boolean,\n conn: ConnectionContext,\n): TurretGhostData {\n // Turret extends StaticShape (confirmed in decompiled binary FUN_00655f60\n // calls FUN_00602da0 = StaticShape::unpackUpdate as parent)\n const result: TurretGhostData = staticShapeUnpackUpdate(bs, isInitial, conn);\n\n // Capacitor energy (Tribes 2 specific — not in V12/TorqueSDK)\n if (bs.readFlag()) {\n result.capacitorEnergy = bs.readFloat(8);\n }\n\n // Control client shortcut\n if (bs.readFlag()) {\n return result;\n }\n\n // Barrel rotation state\n if (bs.readFlag()) {\n result.phi = bs.readFloat(10);\n result.theta = bs.readFloat(10);\n result.activationLevel = bs.readFloat(8);\n }\n\n return result;\n}\n\n// ============================================================\n// InteriorInstance ghost parser (partial — can't parse light groups without resource)\n// ============================================================\n\nfunction interiorUnpackUpdate(\n bs: BitStream,\n _isInitial: boolean,\n _conn: ConnectionContext,\n): InteriorInstanceGhostData {\n const result: InteriorInstanceGhostData = {};\n\n if (bs.readFlag()) {\n // InitMask — full initial state\n result.crc = bs.readU32();\n result.interiorFile = bs.readString();\n result.showTerrainInside = bs.readFlag();\n result.transform = bs.readMatrixF();\n result.scale = bs.readPoint3F();\n result.alarmState = bs.readFlag();\n result.skinBase = bs.readString();\n if (bs.readFlag()) {\n result.audioProfileId = readObjectRef11(bs);\n }\n if (bs.readFlag()) {\n result.audioEnvironmentId = readObjectRef11(bs);\n }\n } else {\n // Normal update\n if (bs.readFlag()) {\n // TransformMask\n result.transform = bs.readMatrixF();\n result.scale = bs.readPoint3F();\n }\n result.alarmState = bs.readFlag();\n\n // LightUpdateGrouper — iterates over bits 3-10 (8 slots), each slot\n // containing a dirty flag + N active flags (one per light in that group).\n // The loop exits at the first bit position with 0 keys. We don't know\n // the interior resource so we can't determine key counts. For interiors\n // with 0 animated lights (the common case), no bits are written here.\n // We assume 0 and continue to the remaining masks.\n\n // SkinBaseMask\n if (bs.readFlag()) {\n result.skinBase = bs.readString();\n }\n // AudioMask\n if (bs.readFlag()) {\n if (bs.readFlag()) {\n result.audioProfileId = readObjectRef11(bs);\n }\n if (bs.readFlag()) {\n result.audioEnvironmentId = readObjectRef11(bs);\n }\n }\n }\n\n return result;\n}\n\n// ============================================================\n// Camera ghost parser (simple)\n// ============================================================\n\nfunction cameraUnpackUpdate(\n bs: BitStream,\n isInitial: boolean,\n conn: ConnectionContext,\n): CameraGhostData {\n // Camera::unpackUpdate (FUN_005cc8c0):\n // 1) ShapeBase::unpackUpdate (FUN_005ef0e0)\n // 2) if (control object shortcut flag) return\n // 3) if (camera update flag) read 5 x F32\n const result: CameraGhostData = readShapeBaseUpdate(bs, isInitial, conn);\n\n // Controlled by local connection: no additional payload in this update.\n if (bs.readFlag()) {\n return result;\n }\n\n // Camera-specific payload (5 floats in retail Tribes2.exe).\n if (bs.readFlag()) {\n result.posX = bs.readF32();\n result.posY = bs.readF32();\n result.posZ = bs.readF32();\n result.fovOrDist = bs.readF32();\n result.orbitParam = bs.readF32();\n }\n\n return result;\n}\n\nfunction cameraReadPacketData(\n bs: BitStream,\n conn: ConnectionContext,\n): CameraPacketData {\n const result: CameraPacketData = {};\n\n // Camera::readPacketData (FUN_005cc530 / FUN_005cc650):\n // Parent::readPacketData + absolute camera transform basis + mode-specific orbit payload.\n result.energyLevel = bs.readF32();\n result.rechargeRate = bs.readF32();\n\n const pos = {\n x: bs.readF32(),\n y: bs.readF32(),\n z: bs.readF32(),\n };\n result.position = pos;\n result.rotX = bs.readF32();\n result.rotZ = bs.readF32();\n\n // writeRangedU32(mode, 0, 4) -> 3 bits.\n const cameraMode = bs.readInt(3);\n result.cameraMode = cameraMode;\n\n // Modes 3/4 include orbit-distance payload.\n if (cameraMode === 3 || cameraMode === 4) {\n result.minOrbitDist = bs.readF32();\n result.maxOrbitDist = bs.readF32();\n result.curOrbitDist = bs.readF32();\n\n // OrbitObjectMode: observing flag + always-read 10-bit target ghost index.\n if (cameraMode === 3) {\n result.observingClientObject = bs.readFlag();\n result.orbitObjectGhostIndex = bs.readInt(10);\n }\n\n // OrbitPointMode: NetConnection::readCompressed using current compression point.\n if (cameraMode === 4) {\n result.orbitPoint = bs.readCompressedPoint(conn.compressionPoint, 0.01);\n }\n }\n\n // The camera packet updates the connection compression point to absolute camera pos.\n conn.compressionPoint = pos;\n\n return result;\n}\n\n// ============================================================\n// LinearProjectile ghost parser\n// ============================================================\n\nfunction linearProjectileUnpackUpdate(\n bs: BitStream,\n isInitial: boolean,\n conn: ConnectionContext,\n): LinearProjectileGhostData {\n // Parent: LinearProjectile → Projectile → GameBase\n const result: LinearProjectileGhostData = readGameBaseUpdate(\n bs,\n isInitial,\n conn,\n );\n\n if (bs.readFlag()) {\n // InitialUpdateMask\n if (bs.readFlag()) {\n // Hidden/already exploded (mHidden=true): initial create of finished projectile\n // Binary: sets mHidden=1, reads pos+direction, computes endpoint, reads decal flag\n result.hidden = true;\n result.explodePosition = bs.readCompressedPoint(conn.compressionPoint);\n result.explodeNormal = bs.readNormalVector(14); // binary: 0xe\n result.endedWithDecal = bs.readFlag();\n } else {\n // Live projectile initial update\n result.position = bs.readCompressedPoint(conn.compressionPoint);\n result.direction = bs.readNormalVector(14); // binary: 0xe\n result.currTick = bs.readRangedU32(0, 511); // nextPow2(0x200)=9 bits\n if (bs.readFlag()) {\n result.sourceObject = bs.readInt(10); // nextPow2(0x400)=10 bits\n result.sourceSlot = bs.readRangedU32(0, 7); // nextPow2(8)=3 bits\n if (bs.readFlag()) {\n result.excessVel = bs.readRangedU32(0, 255); // nextPow2(0x100)=8 bits\n result.excessDir = bs.readNormalVector(7);\n }\n }\n if (bs.readFlag()) {\n result.vehicleObject = bs.readInt(10); // nextPow2(0x400)=10 bits\n }\n }\n } else {\n // Non-initial: explosion notification\n result.explodePosition = bs.readCompressedPoint(conn.compressionPoint);\n result.explodeNormal = bs.readNormalVector(14); // binary: 0xe\n result.endedWithDecal = bs.readFlag();\n }\n\n return result;\n}\n\n// ============================================================\n// ELFProjectile ghost parser\n// ============================================================\n\nfunction elfProjectileUnpackUpdate(\n bs: BitStream,\n isInitial: boolean,\n conn: ConnectionContext,\n): ELFProjectileGhostData {\n // Parent: ELFProjectile → GameBase\n const result: ELFProjectileGhostData = readGameBaseUpdate(\n bs,\n isInitial,\n conn,\n );\n\n if (bs.readFlag()) {\n if (bs.readFlag()) {\n result.sourceObject = bs.readRangedU32(0, 1024);\n result.sourceSlot = bs.readRangedU32(0, 7);\n result.targetObject = bs.readRangedU32(0, 1024);\n }\n }\n\n return result;\n}\n\n// ============================================================\n// RepairProjectile ghost parser\n// ============================================================\n\nfunction repairProjectileUnpackUpdate(\n bs: BitStream,\n isInitial: boolean,\n conn: ConnectionContext,\n): RepairProjectileGhostData {\n // Parent: RepairProjectile → GameBase\n const result: RepairProjectileGhostData = readGameBaseUpdate(\n bs,\n isInitial,\n conn,\n );\n\n if (bs.readFlag()) {\n // InitialUpdateMask\n if (bs.readFlag()) {\n result.sourceObject = bs.readRangedU32(0, 1024);\n result.sourceSlot = bs.readRangedU32(0, 7);\n result.repairingObject = bs.readRangedU32(0, 1024);\n }\n }\n // Non-initial update: no data\n\n return result;\n}\n\n// ============================================================\n// TargetProjectile ghost parser\n// ============================================================\n\nfunction targetProjectileUnpackUpdate(\n bs: BitStream,\n isInitial: boolean,\n conn: ConnectionContext,\n): TargetProjectileGhostData {\n // Parent: TargetProjectile → Projectile → GameBase\n const result: TargetProjectileGhostData = readGameBaseUpdate(\n bs,\n isInitial,\n conn,\n );\n\n if (bs.readFlag()) {\n // InitialUpdateMask\n result.initialPosition = bs.readPoint3F();\n result.endPos = bs.readPoint3F();\n result.truncated = bs.readFlag();\n if (bs.readFlag()) {\n result.sourceObject = bs.readRangedU32(0, 1024);\n result.sourceSlot = bs.readRangedU32(0, 7);\n result.clientOwned = bs.readFlag();\n }\n } else {\n // Swing update\n if (bs.readFlag()) {\n result.sourceObject = bs.readRangedU32(0, 1024);\n result.sourceSlot = bs.readRangedU32(0, 7);\n result.clientOwned = bs.readFlag();\n } else {\n result.initialPosition = bs.readPoint3F();\n }\n result.endPos = bs.readPoint3F();\n result.truncated = bs.readFlag();\n }\n\n return result;\n}\n\n// ============================================================\n// WayPoint ghost parser\n// ============================================================\n\nfunction wayPointUnpackUpdate(\n bs: BitStream,\n isInitial: boolean,\n conn: ConnectionContext,\n): WayPointGhostData {\n // WayPoint extends MissionMarker (V12 source: missionMarker.h)\n const result: WayPointGhostData = missionMarkerUnpackUpdate(\n bs,\n isInitial,\n conn,\n );\n\n // WayPoint additions\n if (bs.readFlag()) {\n result.name = bs.readString();\n }\n if (bs.readFlag()) {\n result.teamId = bs.readS32();\n }\n if (bs.readFlag()) {\n result.hidden = bs.readFlag();\n }\n\n return result;\n}\n\n// ============================================================\n// SpawnSphere ghost parser\n// ============================================================\n\nfunction spawnSphereUnpackUpdate(\n bs: BitStream,\n isInitial: boolean,\n conn: ConnectionContext,\n): SpawnSphereGhostData {\n // SpawnSphere extends MissionMarker (V12 source: missionMarker.h)\n const result: SpawnSphereGhostData = missionMarkerUnpackUpdate(\n bs,\n isInitial,\n conn,\n );\n\n // SpawnSphere additions\n if (bs.readFlag()) {\n result.radius = bs.readF32();\n result.sphereWeight = bs.readF32();\n result.indoorWeight = bs.readF32();\n result.outdoorWeight = bs.readF32();\n }\n\n return result;\n}\n\n// ============================================================\n// ForceFieldBare ghost parser\n// ============================================================\n\nfunction forceFieldBareUnpackUpdate(\n bs: BitStream,\n _isInitial: boolean,\n _conn: ConnectionContext,\n): ForceFieldBareGhostData {\n // ForceFieldBare::unpackUpdate (FUN_00676d30):\n // GameBase parent, then two-level transform flags, then StateChangeMask.\n const result: ForceFieldBareGhostData = readGameBaseUpdate(\n bs,\n _isInitial,\n _conn,\n );\n\n // InitialUpdateMask flag — if true, reads transform+scale (initial path)\n if (bs.readFlag()) {\n result.transform = bs.readAffineTransform();\n result.scale = bs.readPoint3F();\n } else {\n // Non-initial: TransformMask flag\n if (bs.readFlag()) {\n result.transform = bs.readAffineTransform();\n result.scale = bs.readPoint3F();\n }\n }\n\n // StateChangeMask\n if (bs.readFlag()) {\n const state = bs.readInt(2); // 0=Open, 1=Opening, 2=Closing, 3=Closed\n result.state = state;\n if (state === 3) {\n // Closed: position = 0 (not read from stream)\n result.position = 0;\n } else if (state === 0) {\n // Open: position = datablock fadeMS (not read from stream)\n } else {\n // Opening (1) or Closing (2): read position from stream\n result.position = bs.readU32();\n }\n }\n\n return result;\n}\n\n// ============================================================\n// TSStatic ghost parser\n// ============================================================\n\nfunction tsStaticUnpackUpdate(\n bs: BitStream,\n _isInitial: boolean,\n _conn: ConnectionContext,\n): TSStaticGhostData {\n const result: TSStaticGhostData = {};\n\n // TSStatic::unpackUpdate (FUN_00690580) has no update-mask flags:\n // it always serializes MatrixF transform, Point3F scale, and shapeName.\n result.transform = bs.readMatrixF();\n result.scale = bs.readPoint3F();\n result.shapeName = bs.readString();\n\n return result;\n}\n\n// ============================================================\n// TerrainBlock ghost parser\n// ============================================================\n\nfunction terrainBlockUnpackUpdate(\n bs: BitStream,\n _isInitial: boolean,\n _conn: ConnectionContext,\n): TerrainBlockGhostData {\n // TerrainBlock extends SceneObject (NOT GameBase).\n // V12 source: terrain/terrData.cc lines 910-941\n // Format:\n // flag(InitMask) → U32 CRC + readString(terrFileName)\n // + readString(detailTextureName) + U32 squareSize\n // + U32 count + U32[count] emptySquareRuns\n // else → flag(EmptyMask) → U32 count + U32[count] emptySquareRuns\n const result: TerrainBlockGhostData = {};\n\n if (bs.readFlag()) {\n // InitMask\n result.crc = bs.readU32();\n result.terrFileName = bs.readString();\n result.detailTextureName = bs.readString();\n result.squareSize = bs.readU32();\n\n const size = bs.readU32();\n const emptySquareRuns: number[] = [];\n for (let i = 0; i < size; i++) {\n emptySquareRuns.push(bs.readU32());\n }\n result.emptySquareRuns = emptySquareRuns;\n result.emptySquareRunCount = size;\n } else {\n // Normal update\n if (bs.readFlag()) {\n // EmptyMask\n const size = bs.readU32();\n const emptySquareRuns: number[] = [];\n for (let i = 0; i < size; i++) {\n emptySquareRuns.push(bs.readU32());\n }\n result.emptySquareRuns = emptySquareRuns;\n result.emptySquareRunCount = size;\n }\n }\n\n return result;\n}\n\n// ============================================================\n// Sun ghost parser\n// ============================================================\n\nfunction sunUnpackUpdate(\n bs: BitStream,\n _isInitial: boolean,\n _conn: ConnectionContext,\n): SunGhostData {\n // Binary FUN_005b1620: TWO separate readFlag blocks.\n // Block 1: 5 texture/environment map name strings\n // Block 2: 19 F32 values (direction + color + ambient + extra light properties)\n const result: SunGhostData = {};\n\n // Block 1: texture names (5 × readSTString)\n if (bs.readFlag()) {\n const textures: string[] = [];\n for (let i = 0; i < 5; i++) {\n textures.push(bs.readString());\n }\n result.textures = textures;\n }\n\n // Block 2: light properties (19 × F32)\n if (bs.readFlag()) {\n const values: number[] = [];\n for (let i = 0; i < 19; i++) {\n values.push(bs.readF32());\n }\n result.direction = { x: values[0], y: values[1], z: values[2] };\n result.color = { r: values[3], g: values[4], b: values[5], a: values[6] };\n result.ambient = {\n r: values[7],\n g: values[8],\n b: values[9],\n a: values[10],\n };\n // Remaining 8 values are additional light properties in build 25034\n result.extraLightProps = values.slice(11);\n }\n\n return result;\n}\n\n// ============================================================\n// Sky ghost parser\n// ============================================================\n\nfunction skyUnpackUpdate(\n bs: BitStream,\n _isInitial: boolean,\n _conn: ConnectionContext,\n): SkyGhostData {\n const result: SkyGhostData = {};\n\n // Decompiled from FUN_005ab580 (Sky::unpackUpdate) / FUN_005abfd0 (packUpdate).\n // This layout is significantly larger than Torque-era Sky examples and must\n // stay aligned with the retail Tribes 2 binary.\n\n // InitialUpdateMask\n if (bs.readFlag()) {\n result.materialList = bs.readString();\n result.fogColor = { r: bs.readF32(), g: bs.readF32(), b: bs.readF32() };\n\n const fogVolumeCount = bs.readU32();\n if (fogVolumeCount > 64) {\n throw new Error(`Invalid Sky fogVolumeCount: ${fogVolumeCount}`);\n }\n result.fogVolumeCount = fogVolumeCount;\n\n // bool fields are read via Stream::read(1) in the binary (byte-sized bool)\n result.useSkyTextures = bs.readBool();\n result.renderBottomTexture = bs.readBool();\n result.skySolidColor = {\n r: bs.readF32(),\n g: bs.readF32(),\n b: bs.readF32(),\n };\n result.windEffectPrecipitation = bs.readBool();\n\n const fogVolumes: Array<{\n visibleDistance: number;\n minHeight: number;\n maxHeight: number;\n color: { r: number; g: number; b: number };\n }> = [];\n for (let i = 0; i < fogVolumeCount; i++) {\n // V12 sky.cc writes: visibleDistance, minHeight, maxHeight, color\n fogVolumes.push({\n visibleDistance: bs.readF32(),\n minHeight: bs.readF32(),\n maxHeight: bs.readF32(),\n color: { r: bs.readF32(), g: bs.readF32(), b: bs.readF32() },\n });\n }\n result.fogVolumes = fogVolumes;\n\n const cloudLayers: Array<{\n texture: string;\n heightPercent: number;\n speed: number;\n }> = [];\n for (let i = 0; i < 3; i++) {\n cloudLayers.push({\n texture: bs.readString(),\n heightPercent: bs.readF32(),\n speed: bs.readF32(),\n });\n }\n result.cloudLayers = cloudLayers;\n\n // Initial wind velocity vector\n result.windVelocity = bs.readPoint3F();\n result.stormCurrent = bs.readF32();\n\n if (bs.readFlag()) {\n result.stormInit = {\n startPct: bs.readF32(),\n duration: bs.readF32(),\n indexOrMode: bs.readF32(),\n startTime: bs.readF32(),\n targetPct: bs.readF32(),\n };\n }\n }\n\n // StormCloudsShow mask\n if (bs.readFlag()) {\n result.stormCloudsOn = bs.readBool();\n }\n\n // StormFogShow mask\n if (bs.readFlag()) {\n result.stormFogOn = bs.readBool();\n }\n\n // Distance mask (visible/fog distances)\n if (bs.readFlag()) {\n result.visibleDistance = bs.readF32();\n result.fogDistance = bs.readF32();\n }\n\n // Storm/falloff mask\n if (bs.readFlag()) {\n result.stormType = bs.readF32();\n result.stormMagnitude = bs.readF32();\n }\n\n // Storm timeline mask\n if (bs.readFlag()) {\n result.stormTimeline = {\n startPct: bs.readF32(),\n duration: bs.readF32(),\n indexOrMode: bs.readF32(),\n };\n }\n\n // Storm cloud profile mask\n if (bs.readFlag()) {\n result.stormCloudProfile = {\n enabled: bs.readF32(),\n value0: bs.readF32(),\n value1: bs.readF32(),\n value2: bs.readF32(),\n };\n }\n\n // Wind velocity update mask\n if (bs.readFlag()) {\n result.windVelocity = bs.readPoint3F();\n }\n\n return result;\n}\n\n// ============================================================\n// Lightning ghost parser (GameBase subclass)\n// ============================================================\n\nfunction lightningUnpackUpdate(\n bs: BitStream,\n isInitial: boolean,\n conn: ConnectionContext,\n): LightningGhostData {\n const result: LightningGhostData = readGameBaseUpdate(bs, isInitial, conn);\n if (bs.readFlag()) {\n // InitialUpdateMask — only sent on create\n result.position = bs.readPoint3F();\n result.scale = bs.readPoint3F();\n result.strikeWidth = bs.readF32();\n result.chanceToHitTarget = bs.readF32();\n result.strikeRadius = bs.readF32();\n result.boltStartRadius = bs.readF32();\n result.color = { r: bs.readF32(), g: bs.readF32(), b: bs.readF32() };\n result.fadeColor = { r: bs.readF32(), g: bs.readF32(), b: bs.readF32() };\n result.useFog = bs.readInt(8) !== 0; // bool read as U8\n result.strikesPerMinute = bs.readF32();\n }\n return result;\n}\n\n// ============================================================\n// WaterBlock ghost parser (SceneObject subclass, NO GameBase)\n// ============================================================\n\nconst WC_NUM_SUBMERGE_TEX = 2;\n\nfunction waterBlockUnpackUpdate(\n bs: BitStream,\n _isInitial: boolean,\n _conn: ConnectionContext,\n): WaterBlockGhostData {\n const result: WaterBlockGhostData = {};\n // No flag checks — always sends everything\n result.transform = bs.readAffineTransform();\n result.scale = bs.readPoint3F();\n result.surfaceName = bs.readString();\n result.envMapName = bs.readString();\n const submergeNames: string[] = [];\n for (let i = 0; i < WC_NUM_SUBMERGE_TEX; i++) {\n submergeNames.push(bs.readString());\n }\n result.submergeNames = submergeNames;\n result.liquidType = bs.readS32();\n result.density = bs.readF32();\n result.viscosity = bs.readF32();\n result.waveMagnitude = bs.readF32();\n result.surfaceOpacity = bs.readF32();\n result.envMapIntensity = bs.readF32();\n result.removeWetEdges = bs.readInt(8) !== 0; // bool as U8\n if (bs.readFlag()) {\n result.audioEnvironmentId = readObjectRef11(bs);\n }\n return result;\n}\n\n// ============================================================\n// MissionArea ghost parser (NetObject subclass)\n// ============================================================\n\nfunction missionAreaUnpackUpdate(\n bs: BitStream,\n _isInitial: boolean,\n _conn: ConnectionContext,\n): MissionAreaGhostData {\n const result: MissionAreaGhostData = {};\n if (bs.readFlag()) {\n // RectI: point.x, point.y, extent.x, extent.y\n result.area = {\n x: bs.readS32(),\n y: bs.readS32(),\n w: bs.readS32(),\n h: bs.readS32(),\n };\n result.flightCeiling = bs.readF32();\n result.flightCeilingRange = bs.readF32();\n }\n return result;\n}\n\n// ============================================================\n// Splash ghost parser (GameBase subclass)\n// ============================================================\n\nfunction splashUnpackUpdate(\n bs: BitStream,\n isInitial: boolean,\n conn: ConnectionContext,\n): SplashGhostData {\n const result: SplashGhostData = readGameBaseUpdate(bs, isInitial, conn);\n if (bs.readFlag()) {\n result.position = bs.readPoint3F();\n }\n return result;\n}\n\n// ============================================================\n// Shockwave ghost parser (GameBase subclass)\n// ============================================================\n\nfunction shockwaveUnpackUpdate(\n bs: BitStream,\n isInitial: boolean,\n conn: ConnectionContext,\n): ShockwaveGhostData {\n const result: ShockwaveGhostData = readGameBaseUpdate(bs, isInitial, conn);\n if (bs.readFlag()) {\n result.position = bs.readPoint3F();\n result.normal = bs.readPoint3F();\n }\n return result;\n}\n\n// ============================================================\n// FireballAtmosphere ghost parser (GameBase subclass)\n// ============================================================\n\nfunction fireballAtmosphereUnpackUpdate(\n bs: BitStream,\n isInitial: boolean,\n conn: ConnectionContext,\n): FireballAtmosphereGhostData {\n const result: FireballAtmosphereGhostData = readGameBaseUpdate(\n bs,\n isInitial,\n conn,\n );\n if (bs.readFlag()) {\n result.dropRadius = bs.readF32();\n result.dropsPerMinute = bs.readF32();\n result.maxDropAngle = bs.readF32();\n result.minDropAngle = bs.readF32();\n result.startVelocity = bs.readF32();\n result.dropHeight = bs.readF32();\n result.dropDir = bs.readPoint3F();\n }\n return result;\n}\n\n// ============================================================\n// VehicleBlocker ghost parser (SceneObject subclass, NO GameBase)\n// ============================================================\n\nfunction vehicleBlockerUnpackUpdate(\n bs: BitStream,\n _isInitial: boolean,\n _conn: ConnectionContext,\n): VehicleBlockerGhostData {\n // VehicleBlocker instance vtable is 0x00796ca4. Slot +0x4c resolves to\n // FUN_005b9d40, which always reads:\n // 16 x U32 (MatrixF)\n // 6 x U32 (two Point3F corners)\n // No flags are present in this payload.\n const result: VehicleBlockerGhostData = {};\n\n result.transform = bs.readMatrixF();\n result.boundsMin = bs.readPoint3F();\n result.boundsMax = bs.readPoint3F();\n\n return result;\n}\n\n// ============================================================\n// ParticleEmissionDummy ghost parser (GameBase subclass)\n// ============================================================\n\nfunction particleEmissionDummyUnpackUpdate(\n bs: BitStream,\n isInitial: boolean,\n conn: ConnectionContext,\n): ParticleEmissionDummyGhostData {\n const result: ParticleEmissionDummyGhostData = readGameBaseUpdate(\n bs,\n isInitial,\n conn,\n );\n // Always writes transform + scale + optional datablock\n result.transform = bs.readMatrixF();\n result.scale = bs.readPoint3F();\n if (bs.readFlag()) {\n result.emitterDatablockId = readObjectRef11(bs);\n }\n return result;\n}\n\n// ============================================================\n// Precipitation ghost parser (GameBase subclass)\n// ============================================================\n\nfunction precipitationUnpackUpdate(\n bs: BitStream,\n isInitial: boolean,\n conn: ConnectionContext,\n): PrecipitationGhostData {\n const result: PrecipitationGhostData = readGameBaseUpdate(\n bs,\n isInitial,\n conn,\n );\n\n // Mask order from decompiled binary FUN_00681260:\n // InitMask, StormShowMask, StormMask, PercentageMask\n // (Note: V12 source has different order; binary is authoritative)\n\n // InitMask\n if (bs.readFlag()) {\n result.percentage = bs.readF32();\n const colorCount = bs.readS32();\n result.colorCount = colorCount;\n if (colorCount < 0 || colorCount > 3) {\n throw new Error(`Invalid precipitation colorCount: ${colorCount}`);\n }\n // Colors use packed ColorF (FUN_0043f040): 4×U8 = 32 bits each, NOT 4×F32\n const colors: { r: number; g: number; b: number; a: number }[] = [];\n for (let i = 0; i < colorCount; i++) {\n colors.push(readPackedColorF(bs));\n }\n result.colors = colors;\n result.offsetSpeed = bs.readF32();\n result.minVelocity = bs.readF32();\n result.maxVelocity = bs.readF32();\n result.maxDrops = bs.readS32();\n result.maxRadius = bs.readF32();\n // Inner flag: storm initialization data (3 F32s)\n if (bs.readFlag()) {\n result.stormLastTime = bs.readF32();\n result.stormTime = bs.readF32();\n result.stormEndPercentage = bs.readF32();\n }\n }\n\n // StormShowMask\n if (bs.readFlag()) {\n result.stormPrecipitationOn = bs.readBool();\n }\n\n // StormMask\n if (bs.readFlag()) {\n result.stormTime = bs.readF32();\n result.stormEndPercentage = bs.readF32();\n }\n\n // PercentageMask\n if (bs.readFlag()) {\n result.percentageUpdate = bs.readF32();\n }\n\n return result;\n}\n\n// ============================================================\n// SniperProjectile ghost parser\n// ============================================================\n\nfunction sniperProjectileUnpackUpdate(\n bs: BitStream,\n isInitial: boolean,\n conn: ConnectionContext,\n): SniperProjectileGhostData {\n // Parent: SniperProjectile → LinearProjectile → Projectile → GameBase\n const result: SniperProjectileGhostData = readGameBaseUpdate(\n bs,\n isInitial,\n conn,\n );\n\n if (bs.readFlag()) {\n // InitialUpdateMask\n result.energyPercentage = bs.readFloat(7);\n result.initialPosition = bs.readPoint3F();\n result.endPos = bs.readPoint3F();\n result.truncated = bs.readFlag();\n result.hitWater = bs.readFlag();\n if (bs.readFlag()) {\n result.sourceObject = bs.readRangedU32(0, 1024);\n result.sourceSlot = bs.readRangedU32(0, 7);\n result.clientOwned = bs.readFlag();\n }\n } else {\n // Swing update\n if (bs.readFlag()) {\n result.sourceObject = bs.readRangedU32(0, 1024);\n result.sourceSlot = bs.readRangedU32(0, 7);\n result.clientOwned = bs.readFlag();\n } else {\n result.initialPosition = bs.readPoint3F();\n }\n result.endPos = bs.readPoint3F();\n result.truncated = bs.readFlag();\n }\n\n return result;\n}\n\n// ============================================================\n// ShockLanceProjectile ghost parser\n// ============================================================\n\nfunction shockLanceProjectileUnpackUpdate(\n bs: BitStream,\n isInitial: boolean,\n conn: ConnectionContext,\n): ShockLanceProjectileGhostData {\n // Parent: ShockLanceProjectile → Projectile → GameBase\n const result: ShockLanceProjectileGhostData = readGameBaseUpdate(\n bs,\n isInitial,\n conn,\n );\n\n // Target (always written)\n if (bs.readFlag()) {\n result.targetObject = bs.readRangedU32(0, 1024);\n }\n\n // Initial update\n if (bs.readFlag()) {\n result.start = bs.readPoint3F();\n result.end = bs.readPoint3F();\n result.hitObject = bs.readFlag();\n if (bs.readFlag()) {\n result.sourceObject = bs.readRangedU32(0, 1024);\n result.sourceSlot = bs.readRangedU32(0, 7);\n }\n }\n\n return result;\n}\n\n// ============================================================\n// WheeledVehicle ghost parser\n// ============================================================\n\n/**\n * In standard Tribes 2, the only WheeledVehicleData is the MPB/Jericho\n * (vehicle_land_mpbase.dts: Ground0-5 + Spring0-5), so the wheel section\n * is always 6 entries. Wildcat and Beowulf are HoverVehicleData, NOT\n * WheeledVehicleData. The engine computes the count at runtime from the\n * shape's ground#/spring# node pairs; deriving it here from state\n * accumulated in earlier packets (e.g. the create's dataBlockId) would\n * desync parsers seeded mid-stream, which never parse the create.\n */\nconst WheeledVehicleWheelCount = 6;\n\nfunction wheeledVehicleUnpackUpdate(\n bs: BitStream,\n isInitial: boolean,\n conn: ConnectionContext,\n): WheeledVehicleGhostData {\n const result: WheeledVehicleGhostData = vehicleUnpackUpdate(\n bs,\n isInitial,\n conn,\n );\n\n // Always read braking/wheels. Binary (FUN_00615a70) checks\n // param_1[0x2097]==in_ECX (GameConnection.mControlObject == this vehicle)\n // but in demo recordings mControlObject is always the Player, never\n // a vehicle, so this condition is always false.\n {\n result.braking = bs.readFlag();\n\n if (bs.readFlag()) {\n const wheels: { avel: number; dy: number; dx: number }[] = [];\n for (let i = 0; i < WheeledVehicleWheelCount; i++) {\n wheels.push({\n avel: bs.readF32(),\n dy: bs.readF32(),\n dx: bs.readF32(),\n });\n }\n result.wheels = wheels;\n }\n }\n\n return result;\n}\n\n// ============================================================\n// Trigger ghost parser\n// ============================================================\n\nfunction triggerUnpackUpdate(\n bs: BitStream,\n _isInitial: boolean,\n _conn: ConnectionContext,\n): TriggerGhostData {\n // Trigger::unpackUpdate (0x0061bab0):\n // Parent chain reads 0 bits (confirmed via r2ghidra — the parent call at\n // 0x005e2840 chains to 0x00436e00 which is empty).\n // Then reads 4 raw bytes (U32 tickPeriodMS, stored at this+0x44).\n // The V12 source has a full polyhedron (transform, points, planes, edges)\n // but the Tribes 2 build 25034 binary strips all of that.\n return { tickPeriodMS: bs.readU32() };\n}\n\n// ============================================================\n// PhysicalZone ghost parser (SceneObject subclass)\n// ============================================================\n\nfunction physicalZoneUnpackUpdate(\n bs: BitStream,\n _isInitial: boolean,\n _conn: ConnectionContext,\n): PhysicalZoneGhostData {\n const result: PhysicalZoneGhostData = {};\n\n if (bs.readFlag()) {\n // Initial update — raw MatrixF (16×F32) + Point3F scale\n result.transform = bs.readMatrixF();\n result.scale = bs.readPoint3F();\n // Polyhedron points\n const numPoints = bs.readU32();\n if (numPoints > Math.floor(bs.getRemainingBits() / 96)) {\n throw new Error(`Invalid physicalZone point count: ${numPoints}`);\n }\n const points: { x: number; y: number; z: number }[] = [];\n for (let i = 0; i < numPoints; i++) {\n points.push(bs.readPoint3F());\n }\n result.points = points;\n\n // Polyhedron planes\n const numPlanes = bs.readU32();\n if (numPlanes > Math.floor(bs.getRemainingBits() / 128)) {\n throw new Error(`Invalid physicalZone plane count: ${numPlanes}`);\n }\n const planes: { x: number; y: number; z: number; d: number }[] = [];\n for (let i = 0; i < numPlanes; i++) {\n planes.push({\n x: bs.readF32(),\n y: bs.readF32(),\n z: bs.readF32(),\n d: bs.readF32(),\n });\n }\n result.planes = planes;\n\n // Polyhedron edges\n const numEdges = bs.readU32();\n if (numEdges > Math.floor(bs.getRemainingBits() / 128)) {\n throw new Error(`Invalid physicalZone edge count: ${numEdges}`);\n }\n const edges: {\n face0: number;\n face1: number;\n vertex0: number;\n vertex1: number;\n }[] = [];\n for (let i = 0; i < numEdges; i++) {\n edges.push({\n face0: bs.readU32(),\n face1: bs.readU32(),\n vertex0: bs.readU32(),\n vertex1: bs.readU32(),\n });\n }\n result.edges = edges;\n\n result.velocityMod = bs.readF32();\n result.gravityMod = bs.readF32();\n result.appliedForce = bs.readPoint3F();\n result.active = bs.readFlag();\n } else {\n // Non-initial update: just active flag\n result.active = bs.readFlag();\n }\n\n return result;\n}\n\n// ============================================================\n// AudioEmitter ghost parser (SceneObject subclass)\n// ============================================================\n\nfunction audioEmitterUnpackUpdate(\n bs: BitStream,\n _isInitial: boolean,\n _conn: ConnectionContext,\n): AudioEmitterGhostData {\n const result: AudioEmitterGhostData = {};\n\n // Initial update flag\n result.initialUpdate = bs.readFlag();\n\n // Transform\n if (bs.readFlag()) {\n result.transform = bs.readAffineTransform();\n }\n\n // Profile\n if (bs.readFlag()) {\n if (bs.readFlag()) {\n result.audioProfileId = readObjectRef11(bs);\n }\n }\n\n // Description\n if (bs.readFlag()) {\n if (bs.readFlag()) {\n result.audioDescriptionId = readObjectRef11(bs);\n }\n }\n\n // Filename\n if (bs.readFlag()) {\n result.filename = bs.readString();\n }\n\n // UseProfileDescription\n if (bs.readFlag()) {\n result.useProfileDescription = bs.readFlag();\n }\n\n // Volume\n if (bs.readFlag()) {\n result.volume = bs.readF32();\n }\n\n // IsLooping\n if (bs.readFlag()) {\n result.isLooping = bs.readFlag();\n }\n\n // Is3D\n if (bs.readFlag()) {\n result.is3D = bs.readFlag();\n }\n\n // MinDistance\n if (bs.readFlag()) {\n result.minDistance = bs.readF32();\n }\n\n // MaxDistance\n if (bs.readFlag()) {\n result.maxDistance = bs.readF32();\n }\n\n // ConeInsideAngle (S32 in engine — field type 1)\n if (bs.readFlag()) {\n result.coneInsideAngle = bs.readS32();\n }\n\n // ConeOutsideAngle (S32 in engine — field type 1)\n if (bs.readFlag()) {\n result.coneOutsideAngle = bs.readS32();\n }\n\n // ConeOutsideVolume\n if (bs.readFlag()) {\n result.coneOutsideVolume = bs.readF32();\n }\n\n // ConeVector\n if (bs.readFlag()) {\n result.coneVector = bs.readPoint3F();\n }\n\n // LoopCount (S32 in engine — field type 1)\n if (bs.readFlag()) {\n result.loopCount = bs.readS32();\n }\n\n // MinLoopGap (S32 in engine — field type 1, milliseconds)\n if (bs.readFlag()) {\n result.minLoopGap = bs.readS32();\n }\n\n // MaxLoopGap (S32 in engine — field type 1, milliseconds)\n if (bs.readFlag()) {\n result.maxLoopGap = bs.readS32();\n }\n\n // AudioType (S32/enum in engine — field type 9, written as 4 raw bytes)\n if (bs.readFlag()) {\n result.audioType = bs.readS32();\n }\n\n // OutsideAmbient\n if (bs.readFlag()) {\n result.outsideAmbient = bs.readFlag();\n }\n\n return result;\n}\n\n// ============================================================\n// StationFXPersonal ghost parser (GameBase subclass)\n// ============================================================\n\nfunction stationFXPersonalUnpackUpdate(\n bs: BitStream,\n isInitial: boolean,\n conn: ConnectionContext,\n): StationFXPersonalGhostData {\n const result: StationFXPersonalGhostData = readGameBaseUpdate(\n bs,\n isInitial,\n conn,\n );\n\n if (bs.readFlag()) {\n // InitialUpdateMask\n if (bs.readFlag()) {\n result.stationObject = bs.readRangedU32(0, 1024);\n }\n }\n\n return result;\n}\n\n// ============================================================\n// AIObjective ghost parser (AIObjective::unpackUpdate @ FUN_0047dae0)\n// ============================================================\n\nfunction aiObjectiveUnpackUpdate(\n bs: BitStream,\n isInitial: boolean,\n conn: ConnectionContext,\n): AIObjectiveGhostData {\n // AIObjective::unpackUpdate calls FUN_0066a8b0 (ShapeBase-derived),\n // then reads one additional flag.\n const result: AIObjectiveGhostData = readShapeBaseUpdate(bs, isInitial, conn);\n\n if (bs.readFlag()) {\n result.transform = bs.readAffineTransform();\n result.scale = bs.readPoint3F();\n }\n\n result.unknownFlag = bs.readFlag();\n return result;\n}\n\n// ============================================================\n// Register all ghost parsers into the registry\n// ============================================================\n\nexport function registerGhostParsers(registry: ClassRegistry): void {\n registry.catalogGhost({\n name: \"AIObjective\",\n unpackUpdate: aiObjectiveUnpackUpdate,\n });\n\n registry.catalogGhost({\n name: \"BeaconObject\",\n unpackUpdate: beaconObjectUnpackUpdate,\n });\n\n registry.catalogGhost({\n name: \"BombProjectile\",\n unpackUpdate: bombProjectileUnpackUpdate,\n });\n\n registry.catalogGhost({\n name: \"Player\",\n unpackUpdate: playerUnpackUpdate,\n readPacketData: playerReadPacketData,\n });\n\n registry.catalogGhost({\n name: \"Debris\",\n unpackUpdate: debrisUnpackUpdate,\n });\n\n registry.catalogGhost({\n name: \"GameBase\",\n unpackUpdate: readGameBaseUpdate,\n });\n\n registry.catalogGhost({\n name: \"ShapeBase\",\n unpackUpdate: readShapeBaseUpdate,\n readPacketData: vehicleReadPacketData,\n });\n\n registry.catalogGhost({\n name: \"Vehicle\",\n unpackUpdate: vehicleUnpackUpdate,\n readPacketData: vehicleReadPacketData,\n });\n\n registry.catalogGhost({\n name: \"FlyingVehicle\",\n unpackUpdate: flyingVehicleUnpackUpdate,\n readPacketData: vehicleReadPacketData,\n });\n\n registry.catalogGhost({\n name: \"HoverVehicle\",\n unpackUpdate: hoverVehicleUnpackUpdate,\n readPacketData: vehicleReadPacketData,\n });\n\n registry.catalogGhost({\n name: \"Item\",\n unpackUpdate: itemUnpackUpdate,\n });\n\n registry.catalogGhost({\n name: \"Marker\",\n unpackUpdate: markerUnpackUpdate,\n });\n\n registry.catalogGhost({\n name: \"MissionMarker\",\n unpackUpdate: missionMarkerUnpackUpdate,\n });\n\n registry.catalogGhost({\n name: \"StaticShape\",\n unpackUpdate: staticShapeUnpackUpdate,\n });\n\n registry.catalogGhost({\n name: \"Projectile\",\n unpackUpdate: projectileUnpackUpdate,\n });\n\n registry.catalogGhost({\n name: \"ScopeAlwaysShape\",\n unpackUpdate: scopeAlwaysShapeUnpackUpdate,\n });\n\n registry.catalogGhost({\n name: \"GrenadeProjectile\",\n unpackUpdate: grenadeUnpackUpdate,\n });\n\n registry.catalogGhost({\n name: \"SimpleNetObject\",\n unpackUpdate: simpleNetObjectUnpackUpdate,\n });\n\n registry.catalogGhost({\n name: \"SeekerProjectile\",\n unpackUpdate: seekerUnpackUpdate,\n });\n\n registry.catalogGhost({\n name: \"Turret\",\n unpackUpdate: turretUnpackUpdate,\n });\n\n registry.catalogGhost({\n name: \"InteriorInstance\",\n unpackUpdate: interiorUnpackUpdate,\n });\n\n registry.catalogGhost({\n name: \"Camera\",\n unpackUpdate: cameraUnpackUpdate,\n readPacketData: cameraReadPacketData,\n });\n\n registry.catalogGhost({\n name: \"LinearProjectile\",\n unpackUpdate: linearProjectileUnpackUpdate,\n });\n\n registry.catalogGhost({\n name: \"ELFProjectile\",\n unpackUpdate: elfProjectileUnpackUpdate,\n });\n\n registry.catalogGhost({\n name: \"RepairProjectile\",\n unpackUpdate: repairProjectileUnpackUpdate,\n });\n\n registry.catalogGhost({\n name: \"TargetProjectile\",\n unpackUpdate: targetProjectileUnpackUpdate,\n });\n\n // TracerProjectile resolves through LinearProjectile vtables in the retail binary.\n registry.catalogGhost({\n name: \"TracerProjectile\",\n unpackUpdate: linearProjectileUnpackUpdate,\n });\n\n registry.catalogGhost({\n name: \"WayPoint\",\n unpackUpdate: wayPointUnpackUpdate,\n });\n\n registry.catalogGhost({\n name: \"SpawnSphere\",\n unpackUpdate: spawnSphereUnpackUpdate,\n });\n\n registry.catalogGhost({\n name: \"ForceFieldBare\",\n unpackUpdate: forceFieldBareUnpackUpdate,\n });\n\n registry.catalogGhost({\n name: \"TSStatic\",\n unpackUpdate: tsStaticUnpackUpdate,\n });\n\n registry.catalogGhost({\n name: \"TerrainBlock\",\n unpackUpdate: terrainBlockUnpackUpdate,\n });\n\n registry.catalogGhost({\n name: \"Sun\",\n unpackUpdate: sunUnpackUpdate,\n });\n\n registry.catalogGhost({\n name: \"Sky\",\n unpackUpdate: skyUnpackUpdate,\n });\n\n registry.catalogGhost({\n name: \"Lightning\",\n unpackUpdate: lightningUnpackUpdate,\n });\n\n registry.catalogGhost({\n name: \"WaterBlock\",\n unpackUpdate: waterBlockUnpackUpdate,\n });\n\n registry.catalogGhost({\n name: \"MissionArea\",\n unpackUpdate: missionAreaUnpackUpdate,\n });\n\n registry.catalogGhost({\n name: \"Splash\",\n unpackUpdate: splashUnpackUpdate,\n });\n\n registry.catalogGhost({\n name: \"Shockwave\",\n unpackUpdate: shockwaveUnpackUpdate,\n });\n\n registry.catalogGhost({\n name: \"FireballAtmosphere\",\n unpackUpdate: fireballAtmosphereUnpackUpdate,\n });\n\n registry.catalogGhost({\n name: \"VehicleBlocker\",\n unpackUpdate: vehicleBlockerUnpackUpdate,\n });\n\n registry.catalogGhost({\n name: \"ParticleEmissionDummy\",\n unpackUpdate: particleEmissionDummyUnpackUpdate,\n });\n\n registry.catalogGhost({\n name: \"Precipitation\",\n unpackUpdate: precipitationUnpackUpdate,\n });\n\n // Projectile aliases — same wire format as GrenadeProjectile\n registry.catalogGhost({\n name: \"EnergyProjectile\",\n unpackUpdate: grenadeUnpackUpdate,\n });\n\n registry.catalogGhost({\n name: \"FlareProjectile\",\n unpackUpdate: grenadeUnpackUpdate,\n });\n\n registry.catalogGhost({\n name: \"LinearFlareProjectile\",\n unpackUpdate: linearProjectileUnpackUpdate,\n });\n\n registry.catalogGhost({\n name: \"SniperProjectile\",\n unpackUpdate: sniperProjectileUnpackUpdate,\n });\n\n registry.catalogGhost({\n name: \"ShockLanceProjectile\",\n unpackUpdate: shockLanceProjectileUnpackUpdate,\n });\n\n registry.catalogGhost({\n name: \"WheeledVehicle\",\n unpackUpdate: wheeledVehicleUnpackUpdate,\n readPacketData: wheeledVehicleReadPacketData,\n });\n\n registry.catalogGhost({\n name: \"Trigger\",\n unpackUpdate: triggerUnpackUpdate,\n });\n\n registry.catalogGhost({\n name: \"PhysicalZone\",\n unpackUpdate: physicalZoneUnpackUpdate,\n });\n\n registry.catalogGhost({\n name: \"AudioEmitter\",\n unpackUpdate: audioEmitterUnpackUpdate,\n });\n\n registry.catalogGhost({\n name: \"StationFXPersonal\",\n unpackUpdate: stationFXPersonalUnpackUpdate,\n });\n\n // StationFXVehicle has identical wire format to StationFXPersonal\n registry.catalogGhost({\n name: \"StationFXVehicle\",\n unpackUpdate: stationFXPersonalUnpackUpdate,\n });\n}\n"]}
1
+ {"version":3,"file":"GhostManager.js","sourceRoot":"","sources":["../src/GhostManager.ts"],"names":[],"mappings":"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","sourcesContent":["import createDebug from \"debug\";\nimport type { BitStream } from \"./BitStream.js\";\nimport type {\n ClassRegistry,\n ConnectionContext,\n GhostEntry,\n GhostTrackerInterface,\n} from \"./ClassRegistry.js\";\nimport type {\n MoveData,\n SoundSlot,\n ThreadState,\n ImageSlot,\n GameBaseGhostData,\n ShapeBaseGhostData,\n PlayerGhostData,\n PlayerPacketData,\n ShapeBasePacketData,\n TurretPacketData,\n VehicleGhostData,\n VehiclePacketData,\n WheeledVehicleGhostData,\n WheeledVehiclePacketData,\n FlyingVehicleGhostData,\n HoverVehicleGhostData,\n ItemGhostData,\n StaticShapeGhostData,\n BeaconObjectGhostData,\n TurretGhostData,\n MissionMarkerGhostData,\n WayPointGhostData,\n SpawnSphereGhostData,\n CameraGhostData,\n CameraPacketData,\n MarkerGhostData,\n SimpleNetObjectGhostData,\n InteriorInstanceGhostData,\n TSStaticGhostData,\n TerrainBlockGhostData,\n TriggerGhostData,\n VehicleBlockerGhostData,\n MissionAreaGhostData,\n AudioEmitterGhostData,\n PhysicalZoneGhostData,\n DebrisGhostData,\n ProjectileGhostData,\n LinearProjectileGhostData,\n BombProjectileGhostData,\n GrenadeProjectileGhostData,\n SeekerProjectileGhostData,\n SniperProjectileGhostData,\n ShockLanceProjectileGhostData,\n ELFProjectileGhostData,\n RepairProjectileGhostData,\n TargetProjectileGhostData,\n ForceFieldBareGhostData,\n SunGhostData,\n SkyGhostData,\n LightningGhostData,\n WaterBlockGhostData,\n SplashGhostData,\n ShockwaveGhostData,\n FireballAtmosphereGhostData,\n PrecipitationGhostData,\n ParticleEmissionDummyGhostData,\n StationFXPersonalGhostData,\n AIObjectiveGhostData,\n} from \"./ghostDataTypes.js\";\nimport { MaxTriggerKeys } from \"./types.js\";\n\nconst debugTracker = createDebug(\"t2-demo-parser:ghost-tracker\");\n\n// ============================================================\n// Ghost Tracker — tracks ghost lifecycle (create/update/delete)\n// ============================================================\n\nexport class GhostTracker implements GhostTrackerInterface {\n private ghosts = new Map<number, GhostEntry>();\n\n getGhost(index: number): GhostEntry | undefined {\n return this.ghosts.get(index);\n }\n\n hasGhost(index: number): boolean {\n return this.ghosts.has(index);\n }\n\n /**\n * Record a ghost at `index`. Re-creating an occupied index is normal\n * (the server recycles slots after a delete we may not have seen), but\n * a class change is logged since it is the earliest sign of a tracker\n * that has drifted from the server.\n */\n createGhost(index: number, classId: number, className: string): GhostEntry {\n const existing = this.ghosts.get(index);\n if (existing && existing.classId !== classId) {\n debugTracker(\n \"ghost %d re-created as %s (classId %d), was %s (classId %d)\",\n index,\n className,\n classId,\n existing.className,\n existing.classId,\n );\n }\n const entry: GhostEntry = { classId, className };\n this.ghosts.set(index, entry);\n return entry;\n }\n\n deleteGhost(index: number): void {\n this.ghosts.delete(index);\n }\n\n getAllGhosts(): ReadonlyMap<number, GhostEntry> {\n return this.ghosts;\n }\n\n size(): number {\n return this.ghosts.size;\n }\n\n clear(): void {\n this.ghosts.clear();\n }\n}\n\n// ============================================================\n// Shared parsing helpers\n// ============================================================\n\nfunction readMove(bs: BitStream): MoveData {\n const pyaw = bs.readFlag() ? bs.readInt(16) : 0;\n const ppitch = bs.readFlag() ? bs.readInt(16) : 0;\n const proll = bs.readFlag() ? bs.readInt(16) : 0;\n const px = bs.readInt(6);\n const py = bs.readInt(6);\n const pz = bs.readInt(6);\n const freeLook = bs.readFlag();\n const trigger: boolean[] = [];\n for (let i = 0; i < MaxTriggerKeys; i++) {\n trigger.push(bs.readFlag());\n }\n return { pyaw, ppitch, proll, px, py, pz, freeLook, trigger };\n}\n\n/**\n * Read a packed ColorF: 4 × U8 (32 bits total), each converted to [0..1] float.\n * From decompiled binary: FUN_0043f040 reads 4 bytes, each × (1/255).\n */\nfunction readPackedColorF(bs: BitStream): {\n r: number;\n g: number;\n b: number;\n a: number;\n} {\n return {\n r: bs.readInt(8) / 255,\n g: bs.readInt(8) / 255,\n b: bs.readInt(8) / 255,\n a: bs.readInt(8) / 255,\n };\n}\n\n/**\n * Tribes 2 object/datablock references are serialized via FUN_00436ce0/FUN_00436d10\n * as raw 11-bit object ids (nextPow2(0x800) -> bitCount 11).\n */\n/**\n * Ghost index reference written with GhostIdBitSize (10) bits, e.g.\n * Player mount object, Item collision object, projectile source object\n * in classes that call writeInt(idx, 10) directly.\n */\nfunction readGhostRef10(bs: BitStream): number {\n return bs.readInt(10);\n}\n\n/**\n * Source object + image slot pair written via writeRangedU32(0, 1024)\n * (11 bits, resolveGhost-style) and writeRangedU32(0, 7) (3 bits).\n */\nfunction readSourceObjectSlot(\n bs: BitStream,\n): { sourceObject: number; sourceSlot: number } {\n return { sourceObject: readObjectRef11(bs), sourceSlot: bs.readInt(3) };\n}\n\nfunction readObjectRef11(bs: BitStream): number {\n return bs.readInt(11);\n}\n\n// ============================================================\n// GameBase::unpackUpdate (base layer for all game objects)\n// ============================================================\n\nfunction readGameBaseUpdate(\n bs: BitStream,\n _isInitial: boolean,\n _conn: ConnectionContext,\n): GameBaseGhostData {\n const result: GameBaseGhostData = {};\n\n // GameBase::unpackUpdate (FUN_005e3360)\n // DataBlockMask\n if (bs.readFlag()) {\n result.dataBlockId = readObjectRef11(bs);\n }\n\n // TargetMask\n if (bs.readFlag()) {\n // Optional explicit target id; otherwise remains -1.\n const hasTargetId = bs.readFlag();\n result.targetId = hasTargetId ? bs.readInt(9) : -1;\n }\n\n return result;\n}\n\n// ============================================================\n// ShapeBase::unpackUpdate (layer 2 — damage, threads, images, etc.)\n// ============================================================\n\nfunction readShapeBaseUpdate(\n bs: BitStream,\n isInitial: boolean,\n conn: ConnectionContext,\n): ShapeBaseGhostData {\n const result: ShapeBaseGhostData = readGameBaseUpdate(bs, isInitial, conn);\n\n // ShapeBase::unpackUpdate (FUN_005ef0e0)\n // Combined gate for all remaining ShapeBase masks.\n if (!bs.readFlag()) {\n return result;\n }\n\n // DamageMask\n if (bs.readFlag()) {\n result.damageLevel = bs.readFloat(6); // DamageLevelBits=6\n result.damageState = bs.readInt(2); // NumDamageStateBits=2\n result.blowApart = bs.readFlag();\n result.damageDir = bs.readNormalVector(8);\n }\n\n // SoundMask (4 sound slots)\n if (bs.readFlag()) {\n const sounds: SoundSlot[] = [];\n for (let i = 0; i < 4; i++) {\n if (bs.readFlag()) {\n const playing = bs.readFlag();\n const sound: SoundSlot = {\n index: i,\n playing,\n };\n if (playing) {\n sound.profileId = readObjectRef11(bs);\n }\n sounds.push(sound);\n }\n }\n if (sounds.length > 0) {\n result.sounds = sounds;\n }\n }\n\n // ThreadMask (script animation threads, 4 slots)\n if (bs.readFlag()) {\n const threads: ThreadState[] = [];\n for (let i = 0; i < 4; i++) {\n if (bs.readFlag()) {\n threads.push({\n index: i,\n sequence: bs.readInt(5),\n state: bs.readInt(2),\n forward: bs.readFlag(),\n atEnd: bs.readFlag(),\n });\n }\n }\n if (threads.length > 0) {\n result.threads = threads;\n }\n }\n\n // ImageMask (8 mounted image slots)\n let imageSkinDirty = false;\n if (bs.readFlag()) {\n const images: ImageSlot[] = [];\n for (let i = 0; i < 8; i++) {\n if (bs.readFlag()) {\n const img: ImageSlot = { index: i };\n\n // Optional image datablock reference.\n if (bs.readFlag()) {\n img.dataBlockId = readObjectRef11(bs);\n } else {\n img.dataBlockId = 0;\n }\n\n // FUN_00588870 payload: hasSkin -> (tagIndex|string).\n if (bs.readFlag()) {\n if (bs.readFlag()) {\n img.skinTagIndex = bs.readInt(10);\n imageSkinDirty = true;\n } else {\n img.skinName = bs.readString();\n imageSkinDirty = true;\n }\n }\n\n // Per-slot state flags + 3-bit fire count.\n // The retail Tribes 2 binary (FUN_005ef0e0) packs these in a different\n // order than the V12 SDK source code. Verified via Ghidra decompilation:\n // the binary stores to offsets 0x3ac (triggerDown), 0x398 (loaded),\n // 0x3ad (ammo), 0x3af (wet), 0x3ae (target), confirmed by matching the\n // setImage(slot, db, skin, loaded, ammo, triggerDown) call signature.\n img.triggerDown = bs.readFlag();\n img.loaded = bs.readFlag();\n img.ammo = bs.readFlag();\n img.wet = bs.readFlag();\n img.target = bs.readFlag();\n img.fireCount = bs.readInt(3);\n\n // Mounted-image firing bit (FUN_005ef0e0):\n // Read when (this+0x18 & 8)==0, i.e., when the object is NOT\n // \"properly added\" to the scene. Initial block creates and packet\n // stream ghost creates are NOT properly added (isInitial=true),\n // but packet stream ghost updates ARE properly added (isInitial=false).\n if (isInitial) {\n img.imageExtraFlag = bs.readFlag();\n }\n\n images.push(img);\n }\n }\n if (images.length > 0) {\n result.images = images;\n }\n }\n\n // CloakMask section (ShapeBase, binary-verified FUN_005ef0e0).\n // Combined mask: ShieldMask | CloakMask | InvincibleMask (0x1c0).\n if (bs.readFlag()) {\n // CloakMask sub-section.\n const hasCloakData = bs.readFlag();\n if (hasCloakData) {\n result.cloaked = bs.readFlag(); // mCloaked (stealth pack active)\n result.isControlled = bs.readFlag(); // bool(getControllingClient())\n const fading = bs.readFlag(); // mFading && mFadeElapsedTime >= mFadeDelay\n result.fading = fading;\n\n if (fading) {\n result.fadeOut = bs.readFlag(); // mFadeOut (true=fading out, false=fading in)\n result.fadeTime = bs.readF32(); // mFadeTime (duration in seconds)\n } else {\n result.fadeVal = bs.readFlag(); // mFadeVal == 1.0 (true=visible, false=hidden)\n }\n }\n\n const hasStateB = bs.readFlag();\n if (hasStateB) {\n const useStateBFlag = bs.readFlag();\n if (useStateBFlag) {\n const stateBMode = bs.readFlag();\n result.stateBMode = stateBMode;\n if (stateBMode) {\n result.energyPackOn = true;\n } else {\n result.energyPackOn = false;\n }\n } else {\n result.shieldNormal = bs.readNormalVector(8);\n result.energyPercent = bs.readFloat(5);\n }\n }\n\n if (bs.readFlag()) {\n result.stateValue1 = bs.readU32();\n result.stateValue2 = bs.readU32();\n }\n }\n\n if (imageSkinDirty) {\n result.imageSkinDirty = true;\n }\n\n // MountedMask\n if (bs.readFlag()) {\n if (bs.readFlag()) {\n // Mounting\n result.mountObject = readGhostRef10(bs);\n result.mountNode = bs.readInt(5); // NumMountPointBits=5\n } else {\n result.mountObject = -1; // Unmounting\n }\n }\n\n return result;\n}\n\n// ============================================================\n// Player ghost parser\n// ============================================================\n\nfunction playerUnpackUpdate(\n bs: BitStream,\n isInitial: boolean,\n conn: ConnectionContext,\n): PlayerGhostData {\n const result: PlayerGhostData = readShapeBaseUpdate(bs, isInitial, conn);\n\n // ImpactMask (only on non-initial updates)\n if (bs.readFlag()) {\n result.impactSound = bs.readInt(3); // ImpactBits=3\n }\n\n // ActionMask — action animation\n if (bs.readFlag()) {\n result.action = bs.readInt(8); // ActionAnimBits=8\n result.actionHoldAtEnd = bs.readFlag();\n result.actionAtEnd = bs.readFlag();\n result.actionFirstPerson = bs.readFlag();\n if (!result.actionAtEnd) {\n if (bs.readFlag()) {\n result.actionAnimPos = bs.readSignedFloat(6);\n }\n }\n }\n\n // ActionMask — arm animation\n if (bs.readFlag()) {\n result.armAction = bs.readInt(8); // ActionAnimBits=8\n }\n\n // Control object shortcut — if controlled by this client, skip rest\n if (bs.readFlag()) {\n return result;\n }\n\n // MoveMask\n if (bs.readFlag()) {\n result.actionState = bs.readInt(3); // NumStateBits=3\n if (bs.readFlag()) {\n // RecoverState\n result.recoverTicks = bs.readInt(7); // RecoverDelayBits=7\n }\n\n // FUN_005db2d0: two state flags immediately before compressed position.\n result.moveFlag0 = bs.readFlag();\n result.moveFlag1 = bs.readFlag();\n\n result.position = bs.readCompressedPoint(conn.compressionPoint);\n\n // Velocity\n if (bs.readFlag()) {\n // Binary (0x5db850): readInt(13) FIRST, then readNormalVector(10)\n const velMag = bs.readInt(13) / 32.0;\n const velDir = bs.readNormalVector(10);\n result.velocity = {\n x: velDir.x * velMag,\n y: velDir.y * velMag,\n z: velDir.z * velMag,\n };\n } else {\n result.velocity = { x: 0, y: 0, z: 0 };\n }\n\n result.headX = bs.readSignedFloat(6); // * maxLookAngle\n result.headZ = bs.readSignedFloat(6); // * maxLookAngle\n result.rotationZ = bs.readFloat(7) * 2 * Math.PI;\n\n result.move = readMove(bs);\n result.allowWarp = bs.readFlag();\n }\n\n // Energy (always present after MoveMask section)\n result.energy = bs.readFloat(5); // EnergyLevelBits=5\n\n return result;\n}\n\nfunction playerReadPacketData(\n bs: BitStream,\n conn: ConnectionContext,\n): PlayerPacketData {\n const result: PlayerPacketData = {};\n\n // ShapeBase::readPacketData\n result.energyLevel = bs.readF32();\n result.rechargeRate = bs.readF32();\n\n // Player::readPacketData\n result.actionState = bs.readInt(3); // NumStateBits=3\n if (bs.readFlag()) {\n // RecoverState\n result.recoverTicks = bs.readInt(7);\n }\n if (bs.readFlag()) {\n result.jumpDelay = bs.readInt(7); // JumpDelayBits=7\n }\n\n if (bs.readFlag()) {\n // Not mounted — read full position/velocity\n const pos = bs.readPoint3F();\n result.position = pos;\n // Update compression point (this IS the compression point)\n conn.compressionPoint = pos;\n result.velocity = bs.readPoint3F();\n result.jumpSurfaceLastContact = bs.readInt(4);\n }\n\n result.headX = bs.readF32();\n result.headZ = bs.readF32();\n result.rotationZ = bs.readF32();\n\n if (bs.readFlag()) {\n // Has control object (e.g., vehicle being piloted)\n // Binary FUN_005dab20: readInt(10) + resolveGhost + obj->readPacketData(conn, stream)\n const controlGhostIndex = readGhostRef10(bs);\n result.controlObjectGhost = controlGhostIndex;\n\n // Recursively call the control object's readPacketData. The engine\n // resolves the ghost and calls its virtual readPacketData with no\n // fallback; if we cannot do the same the rest of the packet is\n // unreadable, so fail loudly rather than continue misaligned.\n const controlGhost = conn.ghostTracker.getGhost(controlGhostIndex);\n if (!controlGhost) {\n throw new Error(\n `Player readPacketData: piloted ghost ${controlGhostIndex} is not tracked`,\n );\n }\n const controlParser = conn.getGhostParser?.(controlGhost.classId);\n if (!controlParser?.readPacketData) {\n throw new Error(\n `Player readPacketData: piloted ghost ${controlGhostIndex} (${controlGhost.className}) has no readPacketData parser`,\n );\n }\n result.controlObjectData = controlParser.readPacketData(bs, conn);\n }\n\n result.disableMove = bs.readFlag();\n result.pilot = bs.readFlag();\n\n return result;\n}\n\n// ============================================================\n// Vehicle ghost parser\n// ============================================================\n\nfunction vehicleUnpackUpdate(\n bs: BitStream,\n isInitial: boolean,\n conn: ConnectionContext,\n): VehicleGhostData {\n const result: VehicleGhostData = readShapeBaseUpdate(bs, isInitial, conn);\n\n result.jetting = bs.readFlag();\n\n // Control object shortcut — server writes true and returns early,\n // meaning no further Vehicle data follows in the stream.\n if (bs.readFlag()) {\n return result;\n }\n\n // Steering\n result.steeringYaw = bs.readFloat(9);\n result.steeringPitch = bs.readFloat(9);\n result.move = readMove(bs);\n result.frozen = bs.readFlag();\n\n // PositionMask\n if (bs.readFlag()) {\n result.position = bs.readCompressedPoint(conn.compressionPoint);\n // Angular position as quaternion (4x F32)\n result.angPosition = {\n x: bs.readF32(),\n y: bs.readF32(),\n z: bs.readF32(),\n w: bs.readF32(),\n };\n // Linear momentum (3x F32)\n result.linMomentum = bs.readPoint3F();\n // Angular momentum (3x F32)\n result.angMomentum = bs.readPoint3F();\n }\n\n // EnergyMask\n if (bs.readFlag()) {\n result.energy = bs.readFloat(8);\n }\n\n return result;\n}\n\n/**\n * ShapeBase::readPacketData (FUN_005ee9f0): GameBase (empty) + energy\n * level (F32, via setEnergyLevel) + recharge rate (F32).\n */\nfunction shapeBaseReadPacketData(\n bs: BitStream,\n _conn: ConnectionContext,\n): ShapeBasePacketData {\n return {\n energyLevel: bs.readF32(),\n rechargeRate: bs.readF32(),\n };\n}\n\n/**\n * GameBase::readPacketData (FUN_005e32c0) is empty. Every GameBase-derived\n * class that does not override it reads nothing when it is the control\n * object.\n */\nfunction gameBaseReadPacketData(\n _bs: BitStream,\n _conn: ConnectionContext,\n): Record<string, never> {\n return {};\n}\n\n/**\n * Turret::readPacketData (FUN_00655d70): ShapeBase::readPacketData, then a\n * ranged 0..4 state (getBinLog2(getNextPow2(5)) = 3 bits) and three F32s\n * that the engine copies into its current barrel-rotation state.\n */\nfunction turretReadPacketData(\n bs: BitStream,\n conn: ConnectionContext,\n): TurretPacketData {\n const base = shapeBaseReadPacketData(bs, conn);\n return {\n ...base,\n turretState: bs.readRangedU32(0, 4),\n rotationValues: [bs.readF32(), bs.readF32(), bs.readF32()],\n };\n}\n\nfunction vehicleReadPacketData(\n bs: BitStream,\n conn: ConnectionContext,\n): VehiclePacketData {\n // Vehicle::readPacketData (binary FUN_0060d740)\n // ShapeBase::readPacketData → GameBase::readPacketData (empty) + energy + recharge\n const result: VehiclePacketData = {};\n result.energyLevel = bs.readF32();\n result.rechargeRate = bs.readF32();\n\n // Vehicle-specific rigid body state\n result.steering = { x: bs.readF32(), y: bs.readF32() };\n const linPos = bs.readPoint3F();\n result.linPosition = linPos;\n result.angPosition = {\n x: bs.readF32(),\n y: bs.readF32(),\n z: bs.readF32(),\n w: bs.readF32(),\n };\n result.linMomentum = bs.readPoint3F();\n result.angMomentum = bs.readPoint3F();\n result.disableMove = bs.readFlag();\n result.frozen = bs.readFlag();\n conn.compressionPoint = linPos;\n return result;\n}\n\nfunction wheeledVehicleReadPacketData(\n bs: BitStream,\n conn: ConnectionContext,\n): WheeledVehiclePacketData {\n // WheeledVehicle::readPacketData (binary FUN_00615840)\n // Calls Parent::readPacketData (Vehicle) + braking flag + per-wheel data\n const result: WheeledVehiclePacketData = vehicleReadPacketData(bs, conn);\n result.braking = bs.readFlag();\n // wheelCount × 3 F32 (avel, Dy, Dx per wheel)\n const wheels: Array<{ avel: number; dy: number; dx: number }> = [];\n for (let i = 0; i < WheeledVehicleWheelCount; i++) {\n wheels.push({\n avel: bs.readF32(),\n dy: bs.readF32(),\n dx: bs.readF32(),\n });\n }\n result.wheels = wheels;\n return result;\n}\n\n// ============================================================\n// FlyingVehicle ghost parser\n// ============================================================\n\nfunction flyingVehicleUnpackUpdate(\n bs: BitStream,\n isInitial: boolean,\n conn: ConnectionContext,\n): FlyingVehicleGhostData {\n const result: FlyingVehicleGhostData = vehicleUnpackUpdate(\n bs,\n isInitial,\n conn,\n );\n\n // FlyingVehicle has its own control gate flag (separate from Vehicle's).\n // Retail binary removed the V12 ThrustMask wrapper but kept the per-subclass\n // control check: if true, no FlyingVehicle-specific data follows.\n if (bs.readFlag()) {\n return result;\n }\n result.createHeightOn = bs.readFlag();\n result.thrustDirection = bs.readInt(3); // NumThrustBits=3\n\n return result;\n}\n\n// ============================================================\n// HoverVehicle ghost parser\n// ============================================================\n\nfunction hoverVehicleUnpackUpdate(\n bs: BitStream,\n isInitial: boolean,\n conn: ConnectionContext,\n): HoverVehicleGhostData {\n const result: HoverVehicleGhostData = vehicleUnpackUpdate(\n bs,\n isInitial,\n conn,\n );\n result.thrustDirection = bs.readInt(3); // NumThrustBits=3\n return result;\n}\n\n// ============================================================\n// Item ghost parser\n// ============================================================\n\nfunction itemUnpackUpdate(\n bs: BitStream,\n isInitial: boolean,\n conn: ConnectionContext,\n): ItemGhostData {\n const result: ItemGhostData = readShapeBaseUpdate(bs, isInitial, conn);\n\n // InitialUpdateMask\n if (bs.readFlag()) {\n result.rotate = bs.readFlag();\n result.isStatic = bs.readFlag();\n result.collideable = bs.readFlag();\n if (bs.readFlag()) {\n result.scale = bs.readPoint3F();\n }\n }\n\n // ThrowSrcMask\n if (bs.readFlag()) {\n result.collisionObject = readGhostRef10(bs);\n }\n\n // RotationMask (only if !rotate)\n if (bs.readFlag()) {\n const zSign = bs.readFlag() ? -1 : 1;\n const angle = bs.readF32();\n result.rotation = { zSign, angle };\n }\n\n // PositionMask\n if (bs.readFlag()) {\n result.position = bs.readPoint3F();\n const atRest = bs.readFlag();\n result.atRest = atRest;\n if (!atRest) {\n result.velocity = bs.readPoint3F();\n }\n result.warp = bs.readFlag();\n }\n\n return result;\n}\n\n// ============================================================\n// StaticShape ghost parser\n// ============================================================\n\nfunction staticShapeUnpackUpdate(\n bs: BitStream,\n isInitial: boolean,\n conn: ConnectionContext,\n): StaticShapeGhostData {\n const result: StaticShapeGhostData = readShapeBaseUpdate(bs, isInitial, conn);\n\n // PositionMask\n if (bs.readFlag()) {\n // FUN_00602da0 -> FUN_0043c4c0 reads compressed affine transform\n // (position + quaternion xyz + sign bit), not a full MatrixF.\n const transform = bs.readAffineTransform();\n result.transform = transform;\n result.position = transform.position;\n result.scale = bs.readPoint3F();\n }\n\n // Power state (always present)\n result.powered = bs.readFlag();\n\n return result;\n}\n\nfunction scopeAlwaysShapeUnpackUpdate(\n bs: BitStream,\n isInitial: boolean,\n conn: ConnectionContext,\n): StaticShapeGhostData {\n // ScopeAlwaysShape vtable +0x4c -> FUN_00602da0 (same as StaticShape).\n return staticShapeUnpackUpdate(bs, isInitial, conn);\n}\n\nfunction markerUnpackUpdate(\n bs: BitStream,\n _isInitial: boolean,\n _conn: ConnectionContext,\n): MarkerGhostData {\n // Marker::unpackUpdate (simPath.cc): Parent::unpackUpdate (SceneObject,\n // no data) then reads just a Point3F position.\n const position = bs.readPoint3F();\n return { position };\n}\n\nfunction simpleNetObjectUnpackUpdate(\n bs: BitStream,\n _isInitial: boolean,\n _conn: ConnectionContext,\n): SimpleNetObjectGhostData {\n // SimpleNetObject vtable +0x4c -> FUN_005c5220 (single string).\n return { message: bs.readString() };\n}\n\nfunction beaconObjectUnpackUpdate(\n bs: BitStream,\n isInitial: boolean,\n conn: ConnectionContext,\n): BeaconObjectGhostData {\n // BeaconObject vtable +0x4c -> FUN_006a3ae0:\n // StaticShape payload + optional 2-bit beacon type.\n const result: BeaconObjectGhostData = staticShapeUnpackUpdate(\n bs,\n isInitial,\n conn,\n );\n if (bs.readFlag()) {\n result.beaconType = bs.readInt(2);\n }\n return result;\n}\n\nfunction missionMarkerUnpackUpdate(\n bs: BitStream,\n isInitial: boolean,\n conn: ConnectionContext,\n): MissionMarkerGhostData {\n // MissionMarker extends ShapeBase (confirmed by V12 source and empirical\n // testing). The Ghidra decompilation misidentified the parent call — the\n // real parent is ShapeBase::unpackUpdate, not an empty stub.\n const result: MissionMarkerGhostData = readShapeBaseUpdate(\n bs,\n isInitial,\n conn,\n );\n\n // MissionMarker's own field: PositionMask\n if (bs.readFlag()) {\n const transform = bs.readAffineTransform();\n result.transform = transform;\n result.position = transform.position;\n result.scale = bs.readPoint3F();\n }\n\n return result;\n}\n\nfunction debrisUnpackUpdate(\n bs: BitStream,\n isInitial: boolean,\n conn: ConnectionContext,\n): DebrisGhostData {\n // Debris vtable +0x4c -> FUN_006844d0.\n // Confirmed in decompiled binary: calls parent GameBase::unpackUpdate first.\n const result: DebrisGhostData = readGameBaseUpdate(bs, isInitial, conn);\n\n // 6 × F32\n result.value0 = bs.readF32();\n result.value1 = bs.readF32();\n result.value2 = bs.readF32();\n result.value3 = bs.readF32();\n result.value4 = bs.readF32();\n result.value5 = bs.readF32();\n\n // 4 × bool (readBool = 8-bit)\n result.bool0 = bs.readBool();\n result.bool1 = bs.readBool();\n result.bool2 = bs.readBool();\n result.bool3 = bs.readBool();\n\n // 6 × F32\n result.value6 = bs.readF32();\n result.value7 = bs.readF32();\n result.value8 = bs.readF32();\n result.value9 = bs.readF32();\n result.value10 = bs.readF32();\n result.value11 = bs.readF32();\n\n // 2 × bool\n result.bool4 = bs.readBool();\n result.bool5 = bs.readBool();\n\n // 3 × F32\n result.value12 = bs.readF32();\n result.value13 = bs.readF32();\n result.value14 = bs.readF32();\n\n // 1 × bool\n result.bool6 = bs.readBool();\n\n // 2 × string\n result.string0 = bs.readString();\n result.string1 = bs.readString();\n\n // 3 conditional object references (-1 when absent)\n const refs: number[] = [];\n for (let i = 0; i < 3; i++) {\n refs.push(bs.readFlag() ? readObjectRef11(bs) : -1);\n }\n result.objectRefs = refs;\n\n return result;\n}\n\nfunction projectileUnpackUpdate(\n bs: BitStream,\n isInitial: boolean,\n conn: ConnectionContext,\n): ProjectileGhostData {\n // Projectile vtable +0x4c -> FUN_005e3360 (GameBase only).\n return readGameBaseUpdate(bs, isInitial, conn);\n}\n\n// ============================================================\n// Projectile ghost parsers\n// ============================================================\n\nfunction bombProjectileUnpackUpdate(\n bs: BitStream,\n _isInitial: boolean,\n _conn: ConnectionContext,\n): BombProjectileGhostData {\n // BombProjectile vtable +0x4c -> FUN_00636050.\n const result: BombProjectileGhostData = readGameBaseUpdate(\n bs,\n _isInitial,\n _conn,\n );\n\n if (!bs.readFlag()) {\n if (bs.readFlag()) {\n result.position = bs.readPoint3F();\n result.velocity = bs.readPoint3F();\n }\n if (!bs.readFlag()) {\n return result;\n }\n result.endPoint = bs.readPoint3F();\n result.endNormal = bs.readPoint3F();\n return result;\n }\n\n result.position = bs.readPoint3F();\n result.velocity = bs.readPoint3F();\n result.currTick = bs.readInt(12); // nextPow2(0x1000) -> 12 bits\n\n if (bs.readFlag()) {\n result.resetFlag = true; // FUN_00636ae0 side-effect-only\n }\n\n if (bs.readFlag()) {\n result.explodePoint = bs.readPoint3F();\n result.explodeNormal = bs.readPoint3F();\n }\n\n if (bs.readFlag()) {\n // nextPow2(0x401) -> 11 bits, nextPow2(8) -> 3 bits\n ({ sourceObject: result.sourceObject, sourceSlot: result.sourceSlot } =\n readSourceObjectSlot(bs));\n } else {\n result.sourceObject = -1;\n result.sourceSlot = -1;\n }\n\n if (bs.readFlag()) {\n result.vehicleObject = readObjectRef11(bs); // nextPow2(0x401) -> 11 bits\n } else {\n result.vehicleObject = 0;\n }\n\n return result;\n}\n\nfunction grenadeUnpackUpdate(\n bs: BitStream,\n isInitial: boolean,\n conn: ConnectionContext,\n): GrenadeProjectileGhostData {\n // Parent: Projectile → GameBase (Projectile has no override)\n const result: GrenadeProjectileGhostData = readGameBaseUpdate(\n bs,\n isInitial,\n conn,\n );\n\n if (bs.readFlag()) {\n // InitialUpdateMask\n result.position = bs.readPoint3F();\n result.velocity = bs.readPoint3F();\n result.currTick = bs.readRangedU32(0, 4095);\n result.quickSplash = bs.readFlag();\n if (bs.readFlag()) {\n result.explodePoint = bs.readPoint3F();\n result.explodeNormal = bs.readPoint3F();\n }\n if (bs.readFlag()) {\n ({ sourceObject: result.sourceObject, sourceSlot: result.sourceSlot } =\n readSourceObjectSlot(bs));\n }\n if (bs.readFlag()) {\n result.vehicleObject = readObjectRef11(bs); // writeRangedU32(0, 1024)\n }\n } else {\n // Non-initial\n if (bs.readFlag()) {\n // BounceMask\n result.position = bs.readPoint3F();\n result.velocity = bs.readPoint3F();\n }\n if (bs.readFlag()) {\n // ExplosionMask\n result.explodePoint = bs.readPoint3F();\n result.explodeNormal = bs.readPoint3F();\n }\n }\n\n return result;\n}\n\nfunction seekerUnpackUpdate(\n bs: BitStream,\n isInitial: boolean,\n conn: ConnectionContext,\n): SeekerProjectileGhostData {\n // SeekerProjectile::unpackUpdate in build 25034 is FUN_0063c010\n // (vtable PTR_FUN_007ae54c + 0x4c), with parent GameBase::unpackUpdate.\n const result: SeekerProjectileGhostData = readGameBaseUpdate(\n bs,\n isInitial,\n conn,\n );\n\n const fullStateMask = bs.readFlag();\n if (!fullStateMask) {\n // 0x0063c010 non-full path\n const isExplosion = bs.readFlag();\n if (isExplosion) {\n // FUN_00639370: explode(position, normal) — SeekerProjectile detonation.\n result.explodePosition = bs.readPoint3F();\n result.explodeNormal = bs.readPoint3F();\n return result;\n }\n\n result.position = bs.readPoint3F();\n result.velocity = bs.readPoint3F();\n\n const hasTargetInfo = bs.readFlag();\n if (hasTargetInfo) {\n const hasTargetGhost = bs.readFlag();\n if (!hasTargetGhost) {\n result.targetDirection = bs.readPoint3F();\n result.targetMode = 1;\n } else {\n // getBitCount(getNextPow2(0x401)) -> 11 bits\n result.targetGhost = readObjectRef11(bs);\n result.targetMode = 0;\n }\n } else {\n result.targetMode = 2;\n }\n\n return result;\n }\n\n // 0x0063c010 full-state path\n result.position = bs.readPoint3F();\n result.velocity = bs.readPoint3F();\n result.orientation = bs.readPoint3F();\n\n // Optional source object + slot\n if (bs.readFlag()) {\n // getBitCount(getNextPow2(0x401)) = 11, getBitCount(getNextPow2(8)) = 3\n ({ sourceObject: result.sourceObject, sourceSlot: result.sourceSlot } =\n readSourceObjectSlot(bs));\n } else {\n result.sourceObject = -1;\n result.sourceSlot = -1;\n }\n\n // Optional target descriptor\n if (bs.readFlag()) {\n const hasTargetGhost = bs.readFlag();\n if (!hasTargetGhost) {\n result.targetDirection = bs.readPoint3F();\n result.targetMode = 1;\n } else {\n result.targetGhost = readObjectRef11(bs); // getBitCount(getNextPow2(0x401))\n result.targetMode = 0;\n }\n } else {\n result.targetMode = 2;\n }\n\n // Final timeout/alive flag branch in FUN_0063c010.\n result.timeoutReset = bs.readFlag();\n\n return result;\n}\n\n// ============================================================\n// Turret ghost parser\n// ============================================================\n\nfunction turretUnpackUpdate(\n bs: BitStream,\n isInitial: boolean,\n conn: ConnectionContext,\n): TurretGhostData {\n // Turret extends StaticShape (confirmed in decompiled binary FUN_00655f60\n // calls FUN_00602da0 = StaticShape::unpackUpdate as parent)\n const result: TurretGhostData = staticShapeUnpackUpdate(bs, isInitial, conn);\n\n // Capacitor energy (Tribes 2 specific — not in V12/TorqueSDK)\n if (bs.readFlag()) {\n result.capacitorEnergy = bs.readFloat(8);\n }\n\n // Control client shortcut\n if (bs.readFlag()) {\n return result;\n }\n\n // Barrel rotation state\n if (bs.readFlag()) {\n result.phi = bs.readFloat(10);\n result.theta = bs.readFloat(10);\n result.activationLevel = bs.readFloat(8);\n }\n\n return result;\n}\n\n// ============================================================\n// InteriorInstance ghost parser (partial — can't parse light groups without resource)\n// ============================================================\n\nfunction interiorUnpackUpdate(\n bs: BitStream,\n _isInitial: boolean,\n _conn: ConnectionContext,\n): InteriorInstanceGhostData {\n const result: InteriorInstanceGhostData = {};\n\n if (bs.readFlag()) {\n // InitMask — full initial state\n result.crc = bs.readU32();\n result.interiorFile = bs.readString();\n result.showTerrainInside = bs.readFlag();\n result.transform = bs.readMatrixF();\n result.scale = bs.readPoint3F();\n result.alarmState = bs.readFlag();\n result.skinBase = bs.readString();\n if (bs.readFlag()) {\n result.audioProfileId = readObjectRef11(bs);\n }\n if (bs.readFlag()) {\n result.audioEnvironmentId = readObjectRef11(bs);\n }\n } else {\n // Normal update\n if (bs.readFlag()) {\n // TransformMask\n result.transform = bs.readMatrixF();\n result.scale = bs.readPoint3F();\n }\n result.alarmState = bs.readFlag();\n\n // LightUpdateGrouper — iterates over bits 3-10 (8 slots), each slot\n // containing a dirty flag + N active flags (one per light in that group).\n // The loop exits at the first bit position with 0 keys. We don't know\n // the interior resource so we can't determine key counts. For interiors\n // with 0 animated lights (the common case), no bits are written here.\n // We assume 0 and continue to the remaining masks.\n\n // SkinBaseMask\n if (bs.readFlag()) {\n result.skinBase = bs.readString();\n }\n // AudioMask\n if (bs.readFlag()) {\n if (bs.readFlag()) {\n result.audioProfileId = readObjectRef11(bs);\n }\n if (bs.readFlag()) {\n result.audioEnvironmentId = readObjectRef11(bs);\n }\n }\n }\n\n return result;\n}\n\n// ============================================================\n// Camera ghost parser (simple)\n// ============================================================\n\nfunction cameraUnpackUpdate(\n bs: BitStream,\n isInitial: boolean,\n conn: ConnectionContext,\n): CameraGhostData {\n // Camera::unpackUpdate (FUN_005cc8c0):\n // 1) ShapeBase::unpackUpdate (FUN_005ef0e0)\n // 2) if (control object shortcut flag) return\n // 3) if (camera update flag) read 5 x F32\n const result: CameraGhostData = readShapeBaseUpdate(bs, isInitial, conn);\n\n // Controlled by local connection: no additional payload in this update.\n if (bs.readFlag()) {\n return result;\n }\n\n // Camera-specific payload (5 floats in retail Tribes2.exe).\n if (bs.readFlag()) {\n result.posX = bs.readF32();\n result.posY = bs.readF32();\n result.posZ = bs.readF32();\n result.fovOrDist = bs.readF32();\n result.orbitParam = bs.readF32();\n }\n\n return result;\n}\n\nfunction cameraReadPacketData(\n bs: BitStream,\n conn: ConnectionContext,\n): CameraPacketData {\n const result: CameraPacketData = {};\n\n // Camera::readPacketData (FUN_005cc530 / FUN_005cc650):\n // Parent::readPacketData + absolute camera transform basis + mode-specific orbit payload.\n result.energyLevel = bs.readF32();\n result.rechargeRate = bs.readF32();\n\n const pos = bs.readPoint3F();\n result.position = pos;\n result.rotX = bs.readF32();\n result.rotZ = bs.readF32();\n\n // writeRangedU32(mode, 0, 4) -> 3 bits.\n const cameraMode = bs.readInt(3);\n result.cameraMode = cameraMode;\n\n // Modes 3/4 include orbit-distance payload.\n if (cameraMode === 3 || cameraMode === 4) {\n result.minOrbitDist = bs.readF32();\n result.maxOrbitDist = bs.readF32();\n result.curOrbitDist = bs.readF32();\n\n // OrbitObjectMode: observing flag + always-read 10-bit target ghost index.\n if (cameraMode === 3) {\n result.observingClientObject = bs.readFlag();\n result.orbitObjectGhostIndex = readGhostRef10(bs);\n }\n\n // OrbitPointMode: NetConnection::readCompressed using current compression point.\n if (cameraMode === 4) {\n result.orbitPoint = bs.readCompressedPoint(conn.compressionPoint, 0.01);\n }\n }\n\n // The camera packet updates the connection compression point to absolute camera pos.\n conn.compressionPoint = pos;\n\n return result;\n}\n\n// ============================================================\n// LinearProjectile ghost parser\n// ============================================================\n\nfunction linearProjectileUnpackUpdate(\n bs: BitStream,\n isInitial: boolean,\n conn: ConnectionContext,\n): LinearProjectileGhostData {\n // Parent: LinearProjectile → Projectile → GameBase\n const result: LinearProjectileGhostData = readGameBaseUpdate(\n bs,\n isInitial,\n conn,\n );\n\n if (bs.readFlag()) {\n // InitialUpdateMask\n if (bs.readFlag()) {\n // Hidden/already exploded (mHidden=true): initial create of finished projectile\n // Binary: sets mHidden=1, reads pos+direction, computes endpoint, reads decal flag\n result.hidden = true;\n result.explodePosition = bs.readCompressedPoint(conn.compressionPoint);\n result.explodeNormal = bs.readNormalVector(14); // binary: 0xe\n result.endedWithDecal = bs.readFlag();\n } else {\n // Live projectile initial update\n result.position = bs.readCompressedPoint(conn.compressionPoint);\n result.direction = bs.readNormalVector(14); // binary: 0xe\n result.currTick = bs.readRangedU32(0, 511); // nextPow2(0x200)=9 bits\n if (bs.readFlag()) {\n result.sourceObject = readGhostRef10(bs); // nextPow2(0x400)=10 bits\n result.sourceSlot = bs.readRangedU32(0, 7); // nextPow2(8)=3 bits\n if (bs.readFlag()) {\n result.excessVel = bs.readRangedU32(0, 255); // nextPow2(0x100)=8 bits\n result.excessDir = bs.readNormalVector(7);\n }\n }\n if (bs.readFlag()) {\n result.vehicleObject = readGhostRef10(bs); // nextPow2(0x400)=10 bits\n }\n }\n } else {\n // Non-initial: explosion notification\n result.explodePosition = bs.readCompressedPoint(conn.compressionPoint);\n result.explodeNormal = bs.readNormalVector(14); // binary: 0xe\n result.endedWithDecal = bs.readFlag();\n }\n\n return result;\n}\n\n// ============================================================\n// ELFProjectile ghost parser\n// ============================================================\n\nfunction elfProjectileUnpackUpdate(\n bs: BitStream,\n isInitial: boolean,\n conn: ConnectionContext,\n): ELFProjectileGhostData {\n // Parent: ELFProjectile → GameBase\n const result: ELFProjectileGhostData = readGameBaseUpdate(\n bs,\n isInitial,\n conn,\n );\n\n if (bs.readFlag()) {\n if (bs.readFlag()) {\n ({ sourceObject: result.sourceObject, sourceSlot: result.sourceSlot } =\n readSourceObjectSlot(bs));\n result.targetObject = readObjectRef11(bs); // writeRangedU32(0, 1024)\n }\n }\n\n return result;\n}\n\n// ============================================================\n// RepairProjectile ghost parser\n// ============================================================\n\nfunction repairProjectileUnpackUpdate(\n bs: BitStream,\n isInitial: boolean,\n conn: ConnectionContext,\n): RepairProjectileGhostData {\n // Parent: RepairProjectile → GameBase\n const result: RepairProjectileGhostData = readGameBaseUpdate(\n bs,\n isInitial,\n conn,\n );\n\n if (bs.readFlag()) {\n // InitialUpdateMask\n if (bs.readFlag()) {\n ({ sourceObject: result.sourceObject, sourceSlot: result.sourceSlot } =\n readSourceObjectSlot(bs));\n result.repairingObject = readObjectRef11(bs); // writeRangedU32(0, 1024)\n }\n }\n // Non-initial update: no data\n\n return result;\n}\n\n// ============================================================\n// TargetProjectile ghost parser\n// ============================================================\n\nfunction targetProjectileUnpackUpdate(\n bs: BitStream,\n isInitial: boolean,\n conn: ConnectionContext,\n): TargetProjectileGhostData {\n // Parent: TargetProjectile → Projectile → GameBase\n const result: TargetProjectileGhostData = readGameBaseUpdate(\n bs,\n isInitial,\n conn,\n );\n\n if (bs.readFlag()) {\n // InitialUpdateMask\n result.initialPosition = bs.readPoint3F();\n result.endPos = bs.readPoint3F();\n result.truncated = bs.readFlag();\n if (bs.readFlag()) {\n ({ sourceObject: result.sourceObject, sourceSlot: result.sourceSlot } =\n readSourceObjectSlot(bs));\n result.clientOwned = bs.readFlag();\n }\n } else {\n readBeamProjectileSwing(bs, result);\n }\n\n return result;\n}\n\n/**\n * Non-initial update shared by TargetProjectile and SniperProjectile:\n * either a source object/slot pair or a fresh start point, then the end\n * point and truncation flag.\n */\nfunction readBeamProjectileSwing(\n bs: BitStream,\n result: TargetProjectileGhostData,\n): void {\n if (bs.readFlag()) {\n ({ sourceObject: result.sourceObject, sourceSlot: result.sourceSlot } =\n readSourceObjectSlot(bs));\n result.clientOwned = bs.readFlag();\n } else {\n result.initialPosition = bs.readPoint3F();\n }\n result.endPos = bs.readPoint3F();\n result.truncated = bs.readFlag();\n}\n\n// ============================================================\n// WayPoint ghost parser\n// ============================================================\n\nfunction wayPointUnpackUpdate(\n bs: BitStream,\n isInitial: boolean,\n conn: ConnectionContext,\n): WayPointGhostData {\n // WayPoint extends MissionMarker (V12 source: missionMarker.h)\n const result: WayPointGhostData = missionMarkerUnpackUpdate(\n bs,\n isInitial,\n conn,\n );\n\n // WayPoint additions\n if (bs.readFlag()) {\n result.name = bs.readString();\n }\n if (bs.readFlag()) {\n result.teamId = bs.readS32();\n }\n if (bs.readFlag()) {\n result.hidden = bs.readFlag();\n }\n\n return result;\n}\n\n// ============================================================\n// SpawnSphere ghost parser\n// ============================================================\n\nfunction spawnSphereUnpackUpdate(\n bs: BitStream,\n isInitial: boolean,\n conn: ConnectionContext,\n): SpawnSphereGhostData {\n // SpawnSphere extends MissionMarker (V12 source: missionMarker.h)\n const result: SpawnSphereGhostData = missionMarkerUnpackUpdate(\n bs,\n isInitial,\n conn,\n );\n\n // SpawnSphere additions\n if (bs.readFlag()) {\n result.radius = bs.readF32();\n result.sphereWeight = bs.readF32();\n result.indoorWeight = bs.readF32();\n result.outdoorWeight = bs.readF32();\n }\n\n return result;\n}\n\n// ============================================================\n// ForceFieldBare ghost parser\n// ============================================================\n\nfunction forceFieldBareUnpackUpdate(\n bs: BitStream,\n isInitial: boolean,\n conn: ConnectionContext,\n): ForceFieldBareGhostData {\n // ForceFieldBare::unpackUpdate (FUN_00676d30):\n // GameBase parent, then two-level transform flags, then StateChangeMask.\n const result: ForceFieldBareGhostData = readGameBaseUpdate(\n bs,\n isInitial,\n conn,\n );\n\n // InitialUpdateMask flag — if true, reads transform+scale (initial path)\n if (bs.readFlag()) {\n result.transform = bs.readAffineTransform();\n result.scale = bs.readPoint3F();\n } else {\n // Non-initial: TransformMask flag\n if (bs.readFlag()) {\n result.transform = bs.readAffineTransform();\n result.scale = bs.readPoint3F();\n }\n }\n\n // StateChangeMask\n if (bs.readFlag()) {\n const state = bs.readInt(2); // 0=Open, 1=Opening, 2=Closing, 3=Closed\n result.state = state;\n if (state === 3) {\n // Closed: position = 0 (not read from stream)\n result.position = 0;\n } else if (state === 0) {\n // Open: position = datablock fadeMS (not read from stream)\n } else {\n // Opening (1) or Closing (2): read position from stream\n result.position = bs.readU32();\n }\n }\n\n return result;\n}\n\n// ============================================================\n// TSStatic ghost parser\n// ============================================================\n\nfunction tsStaticUnpackUpdate(\n bs: BitStream,\n _isInitial: boolean,\n _conn: ConnectionContext,\n): TSStaticGhostData {\n const result: TSStaticGhostData = {};\n\n // TSStatic::unpackUpdate (FUN_00690580) has no update-mask flags:\n // it always serializes MatrixF transform, Point3F scale, and shapeName.\n result.transform = bs.readMatrixF();\n result.scale = bs.readPoint3F();\n result.shapeName = bs.readString();\n\n return result;\n}\n\n// ============================================================\n// TerrainBlock ghost parser\n// ============================================================\n\n/** U32 count + count × U32. The count is only trusted if that many\n * words can still fit in the stream (a corrupt count would otherwise\n * spin until memory runs out, since exhausted reads return 0). */\nfunction readEmptySquareRuns(bs: BitStream): number[] {\n const size = bs.readU32();\n if (size > bs.getRemainingBits() / 32) {\n throw new Error(`Invalid TerrainBlock emptySquareRun count: ${size}`);\n }\n const runs: number[] = [];\n for (let i = 0; i < size; i++) {\n runs.push(bs.readU32());\n }\n return runs;\n}\n\nfunction terrainBlockUnpackUpdate(\n bs: BitStream,\n _isInitial: boolean,\n _conn: ConnectionContext,\n): TerrainBlockGhostData {\n // TerrainBlock extends SceneObject (NOT GameBase).\n // V12 source: terrain/terrData.cc lines 910-941\n // Format:\n // flag(InitMask) → U32 CRC + readString(terrFileName)\n // + readString(detailTextureName) + U32 squareSize\n // + U32 count + U32[count] emptySquareRuns\n // else → flag(EmptyMask) → U32 count + U32[count] emptySquareRuns\n const result: TerrainBlockGhostData = {};\n\n if (bs.readFlag()) {\n // InitMask\n result.crc = bs.readU32();\n result.terrFileName = bs.readString();\n result.detailTextureName = bs.readString();\n result.squareSize = bs.readU32();\n\n const runs = readEmptySquareRuns(bs);\n result.emptySquareRuns = runs;\n result.emptySquareRunCount = runs.length;\n } else {\n // Normal update\n if (bs.readFlag()) {\n // EmptyMask\n const runs = readEmptySquareRuns(bs);\n result.emptySquareRuns = runs;\n result.emptySquareRunCount = runs.length;\n }\n }\n\n return result;\n}\n\n// ============================================================\n// Sun ghost parser\n// ============================================================\n\nfunction sunUnpackUpdate(\n bs: BitStream,\n _isInitial: boolean,\n _conn: ConnectionContext,\n): SunGhostData {\n // Binary FUN_005b1620: TWO separate readFlag blocks.\n // Block 1: 5 texture/environment map name strings\n // Block 2: 19 F32 values (direction + color + ambient + extra light properties)\n const result: SunGhostData = {};\n\n // Block 1: texture names (5 × readSTString)\n if (bs.readFlag()) {\n const textures: string[] = [];\n for (let i = 0; i < 5; i++) {\n textures.push(bs.readString());\n }\n result.textures = textures;\n }\n\n // Block 2: light properties (19 × F32)\n if (bs.readFlag()) {\n const values: number[] = [];\n for (let i = 0; i < 19; i++) {\n values.push(bs.readF32());\n }\n result.direction = { x: values[0], y: values[1], z: values[2] };\n result.color = { r: values[3], g: values[4], b: values[5], a: values[6] };\n result.ambient = {\n r: values[7],\n g: values[8],\n b: values[9],\n a: values[10],\n };\n // Remaining 8 values are additional light properties in build 25034\n result.extraLightProps = values.slice(11);\n }\n\n return result;\n}\n\n// ============================================================\n// Sky ghost parser\n// ============================================================\n\nfunction skyUnpackUpdate(\n bs: BitStream,\n _isInitial: boolean,\n _conn: ConnectionContext,\n): SkyGhostData {\n const result: SkyGhostData = {};\n\n // Decompiled from FUN_005ab580 (Sky::unpackUpdate) / FUN_005abfd0 (packUpdate).\n // This layout is significantly larger than Torque-era Sky examples and must\n // stay aligned with the retail Tribes 2 binary.\n\n // InitialUpdateMask\n if (bs.readFlag()) {\n result.materialList = bs.readString();\n result.fogColor = { r: bs.readF32(), g: bs.readF32(), b: bs.readF32() };\n\n const fogVolumeCount = bs.readU32();\n if (fogVolumeCount > 64) {\n throw new Error(`Invalid Sky fogVolumeCount: ${fogVolumeCount}`);\n }\n result.fogVolumeCount = fogVolumeCount;\n\n // bool fields are read via Stream::read(1) in the binary (byte-sized bool)\n result.useSkyTextures = bs.readBool();\n result.renderBottomTexture = bs.readBool();\n result.skySolidColor = {\n r: bs.readF32(),\n g: bs.readF32(),\n b: bs.readF32(),\n };\n result.windEffectPrecipitation = bs.readBool();\n\n const fogVolumes: Array<{\n visibleDistance: number;\n minHeight: number;\n maxHeight: number;\n color: { r: number; g: number; b: number };\n }> = [];\n for (let i = 0; i < fogVolumeCount; i++) {\n // V12 sky.cc writes: visibleDistance, minHeight, maxHeight, color\n fogVolumes.push({\n visibleDistance: bs.readF32(),\n minHeight: bs.readF32(),\n maxHeight: bs.readF32(),\n color: { r: bs.readF32(), g: bs.readF32(), b: bs.readF32() },\n });\n }\n result.fogVolumes = fogVolumes;\n\n const cloudLayers: Array<{\n texture: string;\n heightPercent: number;\n speed: number;\n }> = [];\n for (let i = 0; i < 3; i++) {\n cloudLayers.push({\n texture: bs.readString(),\n heightPercent: bs.readF32(),\n speed: bs.readF32(),\n });\n }\n result.cloudLayers = cloudLayers;\n\n // Initial wind velocity vector\n result.windVelocity = bs.readPoint3F();\n result.stormCurrent = bs.readF32();\n\n if (bs.readFlag()) {\n result.stormInit = {\n startPct: bs.readF32(),\n duration: bs.readF32(),\n indexOrMode: bs.readF32(),\n startTime: bs.readF32(),\n targetPct: bs.readF32(),\n };\n }\n }\n\n // StormCloudsShow mask\n if (bs.readFlag()) {\n result.stormCloudsOn = bs.readBool();\n }\n\n // StormFogShow mask\n if (bs.readFlag()) {\n result.stormFogOn = bs.readBool();\n }\n\n // Distance mask (visible/fog distances)\n if (bs.readFlag()) {\n result.visibleDistance = bs.readF32();\n result.fogDistance = bs.readF32();\n }\n\n // Storm/falloff mask\n if (bs.readFlag()) {\n result.stormType = bs.readF32();\n result.stormMagnitude = bs.readF32();\n }\n\n // Storm timeline mask\n if (bs.readFlag()) {\n result.stormTimeline = {\n startPct: bs.readF32(),\n duration: bs.readF32(),\n indexOrMode: bs.readF32(),\n };\n }\n\n // Storm cloud profile mask\n if (bs.readFlag()) {\n result.stormCloudProfile = {\n enabled: bs.readF32(),\n value0: bs.readF32(),\n value1: bs.readF32(),\n value2: bs.readF32(),\n };\n }\n\n // Wind velocity update mask\n if (bs.readFlag()) {\n result.windVelocity = bs.readPoint3F();\n }\n\n return result;\n}\n\n// ============================================================\n// Lightning ghost parser (GameBase subclass)\n// ============================================================\n\nfunction lightningUnpackUpdate(\n bs: BitStream,\n isInitial: boolean,\n conn: ConnectionContext,\n): LightningGhostData {\n const result: LightningGhostData = readGameBaseUpdate(bs, isInitial, conn);\n if (bs.readFlag()) {\n // InitialUpdateMask — only sent on create\n result.position = bs.readPoint3F();\n result.scale = bs.readPoint3F();\n result.strikeWidth = bs.readF32();\n result.chanceToHitTarget = bs.readF32();\n result.strikeRadius = bs.readF32();\n result.boltStartRadius = bs.readF32();\n result.color = { r: bs.readF32(), g: bs.readF32(), b: bs.readF32() };\n result.fadeColor = { r: bs.readF32(), g: bs.readF32(), b: bs.readF32() };\n result.useFog = bs.readInt(8) !== 0; // bool read as U8\n result.strikesPerMinute = bs.readF32();\n }\n return result;\n}\n\n// ============================================================\n// WaterBlock ghost parser (SceneObject subclass, NO GameBase)\n// ============================================================\n\nconst WC_NUM_SUBMERGE_TEX = 2;\n\nfunction waterBlockUnpackUpdate(\n bs: BitStream,\n _isInitial: boolean,\n _conn: ConnectionContext,\n): WaterBlockGhostData {\n const result: WaterBlockGhostData = {};\n // No flag checks — always sends everything\n result.transform = bs.readAffineTransform();\n result.scale = bs.readPoint3F();\n result.surfaceName = bs.readString();\n result.envMapName = bs.readString();\n const submergeNames: string[] = [];\n for (let i = 0; i < WC_NUM_SUBMERGE_TEX; i++) {\n submergeNames.push(bs.readString());\n }\n result.submergeNames = submergeNames;\n result.liquidType = bs.readS32();\n result.density = bs.readF32();\n result.viscosity = bs.readF32();\n result.waveMagnitude = bs.readF32();\n result.surfaceOpacity = bs.readF32();\n result.envMapIntensity = bs.readF32();\n result.removeWetEdges = bs.readInt(8) !== 0; // bool as U8\n if (bs.readFlag()) {\n result.audioEnvironmentId = readObjectRef11(bs);\n }\n return result;\n}\n\n// ============================================================\n// MissionArea ghost parser (NetObject subclass)\n// ============================================================\n\nfunction missionAreaUnpackUpdate(\n bs: BitStream,\n _isInitial: boolean,\n _conn: ConnectionContext,\n): MissionAreaGhostData {\n const result: MissionAreaGhostData = {};\n if (bs.readFlag()) {\n // RectI: point.x, point.y, extent.x, extent.y\n result.area = {\n x: bs.readS32(),\n y: bs.readS32(),\n w: bs.readS32(),\n h: bs.readS32(),\n };\n result.flightCeiling = bs.readF32();\n result.flightCeilingRange = bs.readF32();\n }\n return result;\n}\n\n// ============================================================\n// Splash ghost parser (GameBase subclass)\n// ============================================================\n\nfunction splashUnpackUpdate(\n bs: BitStream,\n isInitial: boolean,\n conn: ConnectionContext,\n): SplashGhostData {\n const result: SplashGhostData = readGameBaseUpdate(bs, isInitial, conn);\n if (bs.readFlag()) {\n result.position = bs.readPoint3F();\n }\n return result;\n}\n\n// ============================================================\n// Shockwave ghost parser (GameBase subclass)\n// ============================================================\n\nfunction shockwaveUnpackUpdate(\n bs: BitStream,\n isInitial: boolean,\n conn: ConnectionContext,\n): ShockwaveGhostData {\n const result: ShockwaveGhostData = readGameBaseUpdate(bs, isInitial, conn);\n if (bs.readFlag()) {\n result.position = bs.readPoint3F();\n result.normal = bs.readPoint3F();\n }\n return result;\n}\n\n// ============================================================\n// FireballAtmosphere ghost parser (GameBase subclass)\n// ============================================================\n\nfunction fireballAtmosphereUnpackUpdate(\n bs: BitStream,\n isInitial: boolean,\n conn: ConnectionContext,\n): FireballAtmosphereGhostData {\n const result: FireballAtmosphereGhostData = readGameBaseUpdate(\n bs,\n isInitial,\n conn,\n );\n if (bs.readFlag()) {\n result.dropRadius = bs.readF32();\n result.dropsPerMinute = bs.readF32();\n result.maxDropAngle = bs.readF32();\n result.minDropAngle = bs.readF32();\n result.startVelocity = bs.readF32();\n result.dropHeight = bs.readF32();\n result.dropDir = bs.readPoint3F();\n }\n return result;\n}\n\n// ============================================================\n// VehicleBlocker ghost parser (SceneObject subclass, NO GameBase)\n// ============================================================\n\nfunction vehicleBlockerUnpackUpdate(\n bs: BitStream,\n _isInitial: boolean,\n _conn: ConnectionContext,\n): VehicleBlockerGhostData {\n // VehicleBlocker instance vtable is 0x00796ca4. Slot +0x4c resolves to\n // FUN_005b9d40, which always reads:\n // 16 x U32 (MatrixF)\n // 6 x U32 (two Point3F corners)\n // No flags are present in this payload.\n const result: VehicleBlockerGhostData = {};\n\n result.transform = bs.readMatrixF();\n result.boundsMin = bs.readPoint3F();\n result.boundsMax = bs.readPoint3F();\n\n return result;\n}\n\n// ============================================================\n// ParticleEmissionDummy ghost parser (GameBase subclass)\n// ============================================================\n\nfunction particleEmissionDummyUnpackUpdate(\n bs: BitStream,\n isInitial: boolean,\n conn: ConnectionContext,\n): ParticleEmissionDummyGhostData {\n const result: ParticleEmissionDummyGhostData = readGameBaseUpdate(\n bs,\n isInitial,\n conn,\n );\n // Always writes transform + scale + optional datablock\n result.transform = bs.readMatrixF();\n result.scale = bs.readPoint3F();\n if (bs.readFlag()) {\n result.emitterDatablockId = readObjectRef11(bs);\n }\n return result;\n}\n\n// ============================================================\n// Precipitation ghost parser (GameBase subclass)\n// ============================================================\n\nfunction precipitationUnpackUpdate(\n bs: BitStream,\n isInitial: boolean,\n conn: ConnectionContext,\n): PrecipitationGhostData {\n const result: PrecipitationGhostData = readGameBaseUpdate(\n bs,\n isInitial,\n conn,\n );\n\n // Mask order from decompiled binary FUN_00681260:\n // InitMask, StormShowMask, StormMask, PercentageMask\n // (Note: V12 source has different order; binary is authoritative)\n\n // InitMask\n if (bs.readFlag()) {\n result.percentage = bs.readF32();\n const colorCount = bs.readS32();\n result.colorCount = colorCount;\n if (colorCount < 0 || colorCount > 3) {\n throw new Error(`Invalid precipitation colorCount: ${colorCount}`);\n }\n // Colors use packed ColorF (FUN_0043f040): 4×U8 = 32 bits each, NOT 4×F32\n const colors: { r: number; g: number; b: number; a: number }[] = [];\n for (let i = 0; i < colorCount; i++) {\n colors.push(readPackedColorF(bs));\n }\n result.colors = colors;\n result.offsetSpeed = bs.readF32();\n result.minVelocity = bs.readF32();\n result.maxVelocity = bs.readF32();\n result.maxDrops = bs.readS32();\n result.maxRadius = bs.readF32();\n // Inner flag: storm initialization data (3 F32s)\n if (bs.readFlag()) {\n result.stormLastTime = bs.readF32();\n result.stormTime = bs.readF32();\n result.stormEndPercentage = bs.readF32();\n }\n }\n\n // StormShowMask\n if (bs.readFlag()) {\n result.stormPrecipitationOn = bs.readBool();\n }\n\n // StormMask\n if (bs.readFlag()) {\n result.stormTime = bs.readF32();\n result.stormEndPercentage = bs.readF32();\n }\n\n // PercentageMask\n if (bs.readFlag()) {\n result.percentageUpdate = bs.readF32();\n }\n\n return result;\n}\n\n// ============================================================\n// SniperProjectile ghost parser\n// ============================================================\n\nfunction sniperProjectileUnpackUpdate(\n bs: BitStream,\n isInitial: boolean,\n conn: ConnectionContext,\n): SniperProjectileGhostData {\n // Parent: SniperProjectile → LinearProjectile → Projectile → GameBase\n const result: SniperProjectileGhostData = readGameBaseUpdate(\n bs,\n isInitial,\n conn,\n );\n\n if (bs.readFlag()) {\n // InitialUpdateMask\n result.energyPercentage = bs.readFloat(7);\n result.initialPosition = bs.readPoint3F();\n result.endPos = bs.readPoint3F();\n result.truncated = bs.readFlag();\n result.hitWater = bs.readFlag();\n if (bs.readFlag()) {\n ({ sourceObject: result.sourceObject, sourceSlot: result.sourceSlot } =\n readSourceObjectSlot(bs));\n result.clientOwned = bs.readFlag();\n }\n } else {\n readBeamProjectileSwing(bs, result);\n }\n\n return result;\n}\n\n// ============================================================\n// ShockLanceProjectile ghost parser\n// ============================================================\n\nfunction shockLanceProjectileUnpackUpdate(\n bs: BitStream,\n isInitial: boolean,\n conn: ConnectionContext,\n): ShockLanceProjectileGhostData {\n // Parent: ShockLanceProjectile → Projectile → GameBase\n const result: ShockLanceProjectileGhostData = readGameBaseUpdate(\n bs,\n isInitial,\n conn,\n );\n\n // Target (always written)\n if (bs.readFlag()) {\n result.targetObject = readObjectRef11(bs); // writeRangedU32(0, 1024)\n }\n\n // Initial update\n if (bs.readFlag()) {\n result.start = bs.readPoint3F();\n result.end = bs.readPoint3F();\n result.hitObject = bs.readFlag();\n if (bs.readFlag()) {\n ({ sourceObject: result.sourceObject, sourceSlot: result.sourceSlot } =\n readSourceObjectSlot(bs));\n }\n }\n\n return result;\n}\n\n// ============================================================\n// WheeledVehicle ghost parser\n// ============================================================\n\n/**\n * In standard Tribes 2, the only WheeledVehicleData is the MPB/Jericho\n * (vehicle_land_mpbase.dts: Ground0-5 + Spring0-5), so the wheel section\n * is always 6 entries. Wildcat and Beowulf are HoverVehicleData, NOT\n * WheeledVehicleData. The engine computes the count at runtime from the\n * shape's ground#/spring# node pairs; deriving it here from state\n * accumulated in earlier packets (e.g. the create's dataBlockId) would\n * desync parsers seeded mid-stream, which never parse the create.\n */\nconst WheeledVehicleWheelCount = 6;\n\nfunction wheeledVehicleUnpackUpdate(\n bs: BitStream,\n isInitial: boolean,\n conn: ConnectionContext,\n): WheeledVehicleGhostData {\n const result: WheeledVehicleGhostData = vehicleUnpackUpdate(\n bs,\n isInitial,\n conn,\n );\n\n // Always read braking/wheels. Binary (FUN_00615a70) checks\n // param_1[0x2097]==in_ECX (GameConnection.mControlObject == this vehicle)\n // but in demo recordings mControlObject is always the Player, never\n // a vehicle, so this condition is always false.\n {\n result.braking = bs.readFlag();\n\n if (bs.readFlag()) {\n const wheels: { avel: number; dy: number; dx: number }[] = [];\n for (let i = 0; i < WheeledVehicleWheelCount; i++) {\n wheels.push({\n avel: bs.readF32(),\n dy: bs.readF32(),\n dx: bs.readF32(),\n });\n }\n result.wheels = wheels;\n }\n }\n\n return result;\n}\n\n// ============================================================\n// Trigger ghost parser\n// ============================================================\n\nfunction triggerUnpackUpdate(\n bs: BitStream,\n _isInitial: boolean,\n _conn: ConnectionContext,\n): TriggerGhostData {\n // Trigger::unpackUpdate (0x0061bab0):\n // Parent chain reads 0 bits (confirmed via r2ghidra — the parent call at\n // 0x005e2840 chains to 0x00436e00 which is empty).\n // Then reads 4 raw bytes (U32 tickPeriodMS, stored at this+0x44).\n // The V12 source has a full polyhedron (transform, points, planes, edges)\n // but the Tribes 2 build 25034 binary strips all of that.\n return { tickPeriodMS: bs.readU32() };\n}\n\n// ============================================================\n// PhysicalZone ghost parser (SceneObject subclass)\n// ============================================================\n\nfunction physicalZoneUnpackUpdate(\n bs: BitStream,\n _isInitial: boolean,\n _conn: ConnectionContext,\n): PhysicalZoneGhostData {\n const result: PhysicalZoneGhostData = {};\n\n if (bs.readFlag()) {\n // Initial update — raw MatrixF (16×F32) + Point3F scale\n result.transform = bs.readMatrixF();\n result.scale = bs.readPoint3F();\n // Polyhedron points\n const numPoints = bs.readU32();\n if (numPoints > Math.floor(bs.getRemainingBits() / 96)) {\n throw new Error(`Invalid physicalZone point count: ${numPoints}`);\n }\n const points: { x: number; y: number; z: number }[] = [];\n for (let i = 0; i < numPoints; i++) {\n points.push(bs.readPoint3F());\n }\n result.points = points;\n\n // Polyhedron planes\n const numPlanes = bs.readU32();\n if (numPlanes > Math.floor(bs.getRemainingBits() / 128)) {\n throw new Error(`Invalid physicalZone plane count: ${numPlanes}`);\n }\n const planes: { x: number; y: number; z: number; d: number }[] = [];\n for (let i = 0; i < numPlanes; i++) {\n planes.push({\n x: bs.readF32(),\n y: bs.readF32(),\n z: bs.readF32(),\n d: bs.readF32(),\n });\n }\n result.planes = planes;\n\n // Polyhedron edges\n const numEdges = bs.readU32();\n if (numEdges > Math.floor(bs.getRemainingBits() / 128)) {\n throw new Error(`Invalid physicalZone edge count: ${numEdges}`);\n }\n const edges: {\n face0: number;\n face1: number;\n vertex0: number;\n vertex1: number;\n }[] = [];\n for (let i = 0; i < numEdges; i++) {\n edges.push({\n face0: bs.readU32(),\n face1: bs.readU32(),\n vertex0: bs.readU32(),\n vertex1: bs.readU32(),\n });\n }\n result.edges = edges;\n\n result.velocityMod = bs.readF32();\n result.gravityMod = bs.readF32();\n result.appliedForce = bs.readPoint3F();\n result.active = bs.readFlag();\n } else {\n // Non-initial update: just active flag\n result.active = bs.readFlag();\n }\n\n return result;\n}\n\n// ============================================================\n// AudioEmitter ghost parser (SceneObject subclass)\n// ============================================================\n\nfunction audioEmitterUnpackUpdate(\n bs: BitStream,\n _isInitial: boolean,\n _conn: ConnectionContext,\n): AudioEmitterGhostData {\n const result: AudioEmitterGhostData = {};\n\n // Initial update flag\n result.initialUpdate = bs.readFlag();\n\n // Transform\n if (bs.readFlag()) {\n result.transform = bs.readAffineTransform();\n }\n\n // Profile\n if (bs.readFlag()) {\n if (bs.readFlag()) {\n result.audioProfileId = readObjectRef11(bs);\n }\n }\n\n // Description\n if (bs.readFlag()) {\n if (bs.readFlag()) {\n result.audioDescriptionId = readObjectRef11(bs);\n }\n }\n\n // Filename\n if (bs.readFlag()) {\n result.filename = bs.readString();\n }\n\n // UseProfileDescription\n if (bs.readFlag()) {\n result.useProfileDescription = bs.readFlag();\n }\n\n // Volume\n if (bs.readFlag()) {\n result.volume = bs.readF32();\n }\n\n // IsLooping\n if (bs.readFlag()) {\n result.isLooping = bs.readFlag();\n }\n\n // Is3D\n if (bs.readFlag()) {\n result.is3D = bs.readFlag();\n }\n\n // MinDistance\n if (bs.readFlag()) {\n result.minDistance = bs.readF32();\n }\n\n // MaxDistance\n if (bs.readFlag()) {\n result.maxDistance = bs.readF32();\n }\n\n // ConeInsideAngle (S32 in engine — field type 1)\n if (bs.readFlag()) {\n result.coneInsideAngle = bs.readS32();\n }\n\n // ConeOutsideAngle (S32 in engine — field type 1)\n if (bs.readFlag()) {\n result.coneOutsideAngle = bs.readS32();\n }\n\n // ConeOutsideVolume\n if (bs.readFlag()) {\n result.coneOutsideVolume = bs.readF32();\n }\n\n // ConeVector\n if (bs.readFlag()) {\n result.coneVector = bs.readPoint3F();\n }\n\n // LoopCount (S32 in engine — field type 1)\n if (bs.readFlag()) {\n result.loopCount = bs.readS32();\n }\n\n // MinLoopGap (S32 in engine — field type 1, milliseconds)\n if (bs.readFlag()) {\n result.minLoopGap = bs.readS32();\n }\n\n // MaxLoopGap (S32 in engine — field type 1, milliseconds)\n if (bs.readFlag()) {\n result.maxLoopGap = bs.readS32();\n }\n\n // AudioType (S32/enum in engine — field type 9, written as 4 raw bytes)\n if (bs.readFlag()) {\n result.audioType = bs.readS32();\n }\n\n // OutsideAmbient\n if (bs.readFlag()) {\n result.outsideAmbient = bs.readFlag();\n }\n\n return result;\n}\n\n// ============================================================\n// StationFXPersonal ghost parser (GameBase subclass)\n// ============================================================\n\nfunction stationFXPersonalUnpackUpdate(\n bs: BitStream,\n isInitial: boolean,\n conn: ConnectionContext,\n): StationFXPersonalGhostData {\n const result: StationFXPersonalGhostData = readGameBaseUpdate(\n bs,\n isInitial,\n conn,\n );\n\n if (bs.readFlag()) {\n // InitialUpdateMask\n if (bs.readFlag()) {\n result.stationObject = readObjectRef11(bs); // writeRangedU32(0, 1024)\n }\n }\n\n return result;\n}\n\n// ============================================================\n// AIObjective ghost parser (AIObjective::unpackUpdate @ FUN_0047dae0)\n// ============================================================\n\nfunction aiObjectiveUnpackUpdate(\n bs: BitStream,\n isInitial: boolean,\n conn: ConnectionContext,\n): AIObjectiveGhostData {\n // AIObjective::unpackUpdate calls FUN_0066a8b0 (ShapeBase-derived),\n // then reads one additional flag.\n const result: AIObjectiveGhostData = readShapeBaseUpdate(bs, isInitial, conn);\n\n if (bs.readFlag()) {\n result.transform = bs.readAffineTransform();\n result.scale = bs.readPoint3F();\n }\n\n result.unknownFlag = bs.readFlag();\n return result;\n}\n\n// ============================================================\n// Register all ghost parsers into the registry\n// ============================================================\n\nexport function registerGhostParsers(registry: ClassRegistry): void {\n registry.catalogGhost({\n name: \"AIObjective\",\n unpackUpdate: aiObjectiveUnpackUpdate,\n });\n\n registry.catalogGhost({\n name: \"BeaconObject\",\n unpackUpdate: beaconObjectUnpackUpdate,\n });\n\n registry.catalogGhost({\n name: \"BombProjectile\",\n unpackUpdate: bombProjectileUnpackUpdate,\n });\n\n registry.catalogGhost({\n name: \"Player\",\n unpackUpdate: playerUnpackUpdate,\n readPacketData: playerReadPacketData,\n });\n\n registry.catalogGhost({\n name: \"Debris\",\n unpackUpdate: debrisUnpackUpdate,\n });\n\n registry.catalogGhost({\n name: \"GameBase\",\n unpackUpdate: readGameBaseUpdate,\n });\n\n registry.catalogGhost({\n name: \"ShapeBase\",\n unpackUpdate: readShapeBaseUpdate,\n readPacketData: shapeBaseReadPacketData,\n });\n\n registry.catalogGhost({\n name: \"Vehicle\",\n unpackUpdate: vehicleUnpackUpdate,\n readPacketData: vehicleReadPacketData,\n });\n\n registry.catalogGhost({\n name: \"FlyingVehicle\",\n unpackUpdate: flyingVehicleUnpackUpdate,\n readPacketData: vehicleReadPacketData,\n });\n\n registry.catalogGhost({\n name: \"HoverVehicle\",\n unpackUpdate: hoverVehicleUnpackUpdate,\n readPacketData: vehicleReadPacketData,\n });\n\n registry.catalogGhost({\n name: \"Item\",\n unpackUpdate: itemUnpackUpdate,\n });\n\n registry.catalogGhost({\n name: \"Marker\",\n unpackUpdate: markerUnpackUpdate,\n });\n\n registry.catalogGhost({\n name: \"MissionMarker\",\n unpackUpdate: missionMarkerUnpackUpdate,\n });\n\n registry.catalogGhost({\n name: \"StaticShape\",\n unpackUpdate: staticShapeUnpackUpdate,\n });\n\n registry.catalogGhost({\n name: \"Projectile\",\n unpackUpdate: projectileUnpackUpdate,\n });\n\n registry.catalogGhost({\n name: \"ScopeAlwaysShape\",\n unpackUpdate: scopeAlwaysShapeUnpackUpdate,\n });\n\n registry.catalogGhost({\n name: \"GrenadeProjectile\",\n unpackUpdate: grenadeUnpackUpdate,\n });\n\n registry.catalogGhost({\n name: \"SimpleNetObject\",\n unpackUpdate: simpleNetObjectUnpackUpdate,\n });\n\n registry.catalogGhost({\n name: \"SeekerProjectile\",\n unpackUpdate: seekerUnpackUpdate,\n });\n\n registry.catalogGhost({\n name: \"Turret\",\n unpackUpdate: turretUnpackUpdate,\n readPacketData: turretReadPacketData,\n });\n\n registry.catalogGhost({\n name: \"InteriorInstance\",\n unpackUpdate: interiorUnpackUpdate,\n });\n\n registry.catalogGhost({\n name: \"Camera\",\n unpackUpdate: cameraUnpackUpdate,\n readPacketData: cameraReadPacketData,\n });\n\n registry.catalogGhost({\n name: \"LinearProjectile\",\n unpackUpdate: linearProjectileUnpackUpdate,\n });\n\n registry.catalogGhost({\n name: \"ELFProjectile\",\n unpackUpdate: elfProjectileUnpackUpdate,\n });\n\n registry.catalogGhost({\n name: \"RepairProjectile\",\n unpackUpdate: repairProjectileUnpackUpdate,\n });\n\n registry.catalogGhost({\n name: \"TargetProjectile\",\n unpackUpdate: targetProjectileUnpackUpdate,\n });\n\n // TracerProjectile resolves through LinearProjectile vtables in the retail binary.\n registry.catalogGhost({\n name: \"TracerProjectile\",\n unpackUpdate: linearProjectileUnpackUpdate,\n });\n\n registry.catalogGhost({\n name: \"WayPoint\",\n unpackUpdate: wayPointUnpackUpdate,\n });\n\n registry.catalogGhost({\n name: \"SpawnSphere\",\n unpackUpdate: spawnSphereUnpackUpdate,\n });\n\n registry.catalogGhost({\n name: \"ForceFieldBare\",\n unpackUpdate: forceFieldBareUnpackUpdate,\n });\n\n registry.catalogGhost({\n name: \"TSStatic\",\n unpackUpdate: tsStaticUnpackUpdate,\n });\n\n registry.catalogGhost({\n name: \"TerrainBlock\",\n unpackUpdate: terrainBlockUnpackUpdate,\n });\n\n registry.catalogGhost({\n name: \"Sun\",\n unpackUpdate: sunUnpackUpdate,\n });\n\n registry.catalogGhost({\n name: \"Sky\",\n unpackUpdate: skyUnpackUpdate,\n });\n\n registry.catalogGhost({\n name: \"Lightning\",\n unpackUpdate: lightningUnpackUpdate,\n });\n\n registry.catalogGhost({\n name: \"WaterBlock\",\n unpackUpdate: waterBlockUnpackUpdate,\n });\n\n registry.catalogGhost({\n name: \"MissionArea\",\n unpackUpdate: missionAreaUnpackUpdate,\n });\n\n registry.catalogGhost({\n name: \"Splash\",\n unpackUpdate: splashUnpackUpdate,\n });\n\n registry.catalogGhost({\n name: \"Shockwave\",\n unpackUpdate: shockwaveUnpackUpdate,\n });\n\n registry.catalogGhost({\n name: \"FireballAtmosphere\",\n unpackUpdate: fireballAtmosphereUnpackUpdate,\n });\n\n registry.catalogGhost({\n name: \"VehicleBlocker\",\n unpackUpdate: vehicleBlockerUnpackUpdate,\n });\n\n registry.catalogGhost({\n name: \"ParticleEmissionDummy\",\n unpackUpdate: particleEmissionDummyUnpackUpdate,\n });\n\n registry.catalogGhost({\n name: \"Precipitation\",\n unpackUpdate: precipitationUnpackUpdate,\n });\n\n // Projectile aliases — same wire format as GrenadeProjectile\n registry.catalogGhost({\n name: \"EnergyProjectile\",\n unpackUpdate: grenadeUnpackUpdate,\n });\n\n registry.catalogGhost({\n name: \"FlareProjectile\",\n unpackUpdate: grenadeUnpackUpdate,\n });\n\n registry.catalogGhost({\n name: \"LinearFlareProjectile\",\n unpackUpdate: linearProjectileUnpackUpdate,\n });\n\n registry.catalogGhost({\n name: \"SniperProjectile\",\n unpackUpdate: sniperProjectileUnpackUpdate,\n });\n\n registry.catalogGhost({\n name: \"ShockLanceProjectile\",\n unpackUpdate: shockLanceProjectileUnpackUpdate,\n });\n\n registry.catalogGhost({\n name: \"WheeledVehicle\",\n unpackUpdate: wheeledVehicleUnpackUpdate,\n readPacketData: wheeledVehicleReadPacketData,\n });\n\n registry.catalogGhost({\n name: \"Trigger\",\n unpackUpdate: triggerUnpackUpdate,\n });\n\n registry.catalogGhost({\n name: \"PhysicalZone\",\n unpackUpdate: physicalZoneUnpackUpdate,\n });\n\n registry.catalogGhost({\n name: \"AudioEmitter\",\n unpackUpdate: audioEmitterUnpackUpdate,\n });\n\n registry.catalogGhost({\n name: \"StationFXPersonal\",\n unpackUpdate: stationFXPersonalUnpackUpdate,\n });\n\n // StationFXVehicle has identical wire format to StationFXPersonal\n registry.catalogGhost({\n name: \"StationFXVehicle\",\n unpackUpdate: stationFXPersonalUnpackUpdate,\n });\n\n applyInheritedReadPacketData(registry);\n}\n\n/**\n * Ghost classes that inherit readPacketData rather than overriding it, from\n * the build 25034 vtables (slot +0x108) cross-checked against the V12\n * class hierarchy. The engine dispatches virtually, so a StaticShape used\n * as the control object reads ShapeBase's two floats and a Trigger reads\n * nothing. Classes absent from both lists are not GameBase-derived and\n * have no readPacketData at all.\n */\nconst SHAPEBASE_READ_PACKET_DATA_HEIRS = [\n \"AIObjective\",\n \"BeaconObject\",\n \"Item\",\n \"MissionMarker\",\n \"ScopeAlwaysShape\",\n \"SpawnSphere\",\n \"StaticShape\",\n \"WayPoint\",\n];\nconst GAMEBASE_READ_PACKET_DATA_HEIRS = [\n \"BombProjectile\",\n \"Debris\",\n \"ELFProjectile\",\n \"EnergyProjectile\",\n \"FireballAtmosphere\",\n \"FlareProjectile\",\n \"ForceFieldBare\",\n \"GameBase\",\n \"GrenadeProjectile\",\n \"Lightning\",\n \"LinearFlareProjectile\",\n \"LinearProjectile\",\n \"ParticleEmissionDummy\",\n \"Precipitation\",\n \"Projectile\",\n \"RepairProjectile\",\n \"SeekerProjectile\",\n \"ShockLanceProjectile\",\n \"Shockwave\",\n \"SniperProjectile\",\n \"Splash\",\n \"StationFXPersonal\",\n \"StationFXVehicle\",\n \"TargetProjectile\",\n \"TracerProjectile\",\n \"Trigger\",\n];\n\nfunction applyInheritedReadPacketData(registry: ClassRegistry): void {\n const catalog = registry.getGhostCatalog();\n for (const name of SHAPEBASE_READ_PACKET_DATA_HEIRS) {\n const entry = catalog.get(name);\n if (entry && !entry.readPacketData) {\n entry.readPacketData = shapeBaseReadPacketData;\n }\n }\n for (const name of GAMEBASE_READ_PACKET_DATA_HEIRS) {\n const entry = catalog.get(name);\n if (entry && !entry.readPacketData) {\n entry.readPacketData = gameBaseReadPacketData;\n }\n }\n}\n"]}