diff --git a/context/open-questions.md b/context/open-questions.md index 9ad3de0..5f38315 100644 --- a/context/open-questions.md +++ b/context/open-questions.md @@ -131,8 +131,9 @@ authentic path scoped. the binary's; full binary attr-table dump in the task #5 scan) + an input feed. Keyboard now pushes press/release edges into the buttonGroups (SPACE→Trigger, '2'→ThumbLow, '3'/CTRL→ ThumbHigh; BT_AUTOFIRE pulses the Trigger); the gBT*Trigger bypasses + pulse hack are retired. - VERIFIED 2-node: full kill through the authentic chain (12 hits vs ~36 pre-groups = the - 4-weapon trigger volley + crit cascade). **Remaining (the config-mode session):** handlers + VERIFIED 2-node at the BINDING level (⚠ honest correction, task #8: those kills still flowed + through the retired mech4 bring-up block -- the emitter DISCHARGE chain was latched shut by + the NaN edge bug below until 2026-07-11; the full weapon-fire chain is now verified solo). **Remaining (the config-mode session):** handlers id 9/10 (@4b9550/@4b95b8 — corrected: they were mislabeled as Myomers fns), the L4 mapper Enter/ExitConfiguration completion (StartMappableButtonsConfigure + mode 0x8000), the ConfigMapGauge unguard — the pod's in-cockpit REGROUPING UI (pilot heat-management choice); @@ -144,6 +145,26 @@ authentic path scoped. into the LIVE JointedMover (must be reconciled with the gait cutover first). - **SeekVoltageGraph** — 4 Seek* attrs unpublished (a cluster-child, not config-called; non-blocking). +- **✅ DAMAGE ECONOMY — AUTHENTIC (task #8, 2026-07-11) [T1/T2].** The whole economy closes: + `_DAT_004bafbc` is an x87 float80 = **1e-7** (the port's kDamageScale=1.0 was the mystery) -- + it cancels the ctor's ×1e7 energy bookkeeping, so **damagePortion = authored DamageAmount × + (charge/seekV[rec])²** (port: the closed form at fire time; the bring-up charge cycle keeps + the degenerate EC=1 electrical model). Authored values (BTL4.RES type-0x11, +0x19C; scanner + scratchpad/scan_weapsub.py): madcat AC=25/LRM15 salvo=50/ERLL=6/ERSL=2; bhk1 PPC=12/SRM6=35/ + ERML=3.5. Zone model already byte-exact (Δlevel = amount/armorPoints, legs ×0.5; armor dump + in the task #8 synthesis) → the pod's 4-8-hit heavy-weapon pacing. The weapon-side + SendDamageMessage (@004b9728) is LIVE from Emitter::FireWeapon (damageData filled incl. + **damageForce = target−muzzle → the gyro's directional hit-bounce feed**); the mech4 + bring-up damage block + flat kShotDamage are retired to diag hooks. **ROOT-CAUSE find: the + CheckFireEdge NaN latch** -- TriggerState carries ControlsButton INTS (release −65 = a + negative NaN); the binary's x87 unordered-compare treated it as "released" but an + IEEE-correct float compare latched the detector shut after the first release (why the + emitters never discharged in-game until now); fixed with bit-pattern sign compares + (@004b9608). Residues [T3]: heat stays on the bring-up scale (authentic = heatCost×1e7 + energy units, the missile path already feeds it -- the HEAT-CALIBRATION audit); + LODReuseHysteresis corrected 0.82→0.33 (a double); the MP beam-kill live-verify awaits a + clear-sightline spawn (mechanism identical to solo; force-dmg cross-pod cycles verified). + ## Locomotion / combat polish (non-gating) - Authentic per-mech TURN-RATE constant (currently a bring-up constant rate). - Body-callback gimp handlers (states 16-19, targets 0x70b2/0x7161 undecoded → fall back to stand); diff --git a/engine/MUNGA/CONTROLS.cpp b/engine/MUNGA/CONTROLS.cpp index 36dea01..52859a9 100644 --- a/engine/MUNGA/CONTROLS.cpp +++ b/engine/MUNGA/CONTROLS.cpp @@ -123,17 +123,30 @@ void ControlsInstance *controls_instance; + int walked = 0, matched = 0; // BT diag (task #8) while ((controls_instance=i.ReadAndNext()) != NULL) { //------------------------------------------------ // Process only if at least one mode bit matches //------------------------------------------------ Check(controls_instance); + ++walked; if (controls_instance->modeMask & mode_mask) { + ++matched; controls_instance->Update(data_source); } } + // BT diag (task #8): trace the fire-button delivery counts. + if (getenv("BT_FIRE_LOG")) + { + static int s_gwalk = 0; + if ((++s_gwalk % 40) == 1) + DEBUG_STREAM << "[group-upd] grp=" << (void *)this + << " walked=" << walked << " matched=" << matched + << " mode=0x" << std::hex << (int)mode_mask << std::dec + << std::endl; + } Check_Fpu(); } diff --git a/game/reconstructed/btl4app.cpp b/game/reconstructed/btl4app.cpp index 4cf3cf9..88efd1a 100644 --- a/game/reconstructed/btl4app.cpp +++ b/game/reconstructed/btl4app.cpp @@ -630,12 +630,20 @@ BTL4Application::SharedData if (resource_description != NULL) { resource_description->Lock(); // FUN_00406cd0 + DEBUG_STREAM << "[ctrlmap] installing '" << primary_mapping_name + << "' table: " << *(int *)resource_description->resourceAddress + << " mappings on entity " << (void *)viewing_entity << std::endl; controls->CreateStreamedMappings( // FUN_0047703c viewing_entity, (int*)resource_description->resourceAddress ); resource_description->Unlock(); } + else + { + DEBUG_STREAM << "[ctrlmap] NO '" << primary_mapping_name + << "' sub-table for this mech" << std::endl; + } } } diff --git a/game/reconstructed/emitter.cpp b/game/reconstructed/emitter.cpp index 3cc7b98..9b43843 100644 --- a/game/reconstructed/emitter.cpp +++ b/game/reconstructed/emitter.cpp @@ -85,7 +85,14 @@ extern BTDriveInput gBTDrive; //############################################################################# // Reconstruction support: artifact constants, globals and helper stand-ins. // -static const Scalar kDamageScale = 1.0f; // _DAT_004bafbc firing-physics scale (best-effort) +static const Scalar kDamageScale = 1.0e-7f; // _DAT_004bafbc -- an x87 80-bit constant + // (bytes bc427ae5d594bfd6e73f @0x4bafbc) + // = 1e-7 EXACTLY: it cancels the ctor's + // energyTotal x1e7, so at recommended + // charge damagePortion == the AUTHORED + // DamageAmount verbatim (task #8; the old + // 1.0f "best-effort" was the whole + // damage-economy mystery) static const Vector3D DAT_004e0fa4(0.0f, 0.0f, 0.0f); // zero vector static char DAT_00522524[4] = { 0 }; // default colour tag static int PTR_LAB_00511e6c, DAT_00511e70, DAT_00511e74; // beam-keepalive message template @@ -178,9 +185,27 @@ void // E = 1/2 * currentLevel^2 * energyCoefficient Scalar energy = 0.5f * currentLevel * currentLevel * energyCoefficient; // _DAT_004bafb8 - damagePortion = damageFraction * energy; // 0x44c - heatPortion = energy - damagePortion; // 0x450 - damagePortion = kDamageScale * damagePortion; // firing-physics scale (best-effort) + + // THE AUTHENTIC PER-SHOT DAMAGE (task #8) -- the closed form of the + // binary's energy algebra (@004bb120 ctor x @004bace8 fire): + // damagePortion = dF x (0.5 V^2 EC) x 1e-7 + // = authored DamageAmount x (charge / seekV[rec])^2 + // (kDamageScale = _DAT_004bafbc = 1e-7 EXACTLY cancels the ctor's x1e7; + // derived here from the STORED damageFraction/energyTotal so the authored + // base never degrades, and the bring-up charge cycle -- calibrated to the + // degenerate EC=1 electrical model -- stays untouched. At full charge: + // the authored value verbatim; madcat ERLLaser=6, bhk1 PPC=12.) + { + Scalar vRec = seekVoltage[seekVoltageRecommendedIndex]; + Scalar chargeRatio = (vRec > 0.0f) ? (currentLevel / vRec) : 1.0f; + damagePortion = (damageFraction * energyTotal * kDamageScale) + * chargeRatio * chargeRatio; // 0x44c + } + // Heat stays on the bring-up scale until the heat-calibration audit [T3]: + // the authentic heatPortion is heatCostToFire x 1e7 energy units (the + // missile path already feeds that scale raw); switching the emitters too + // is the heat audit's call, not the damage economy's. + heatPortion = energy - damageFraction * energy; // 0x450 // dump the heat portion into our INHERITED thermal accumulator if heatable/online. // E5: pendingHeat (HeatSink @0x1C8) is the field the heat sim absorbs each frame @@ -223,10 +248,20 @@ void if (dist <= effectiveRange) // this+0x328 { - // The binary writes the impact point/delta/energy into the inherited Damage - // damageData (0x3C8/0x3B0/0x3AC); the recon's beamHitPoint/beamImpact/ - // beamImpactScalar copies were dead (no readers) -> removed. Register the pip. - DrawWeaponPip(aimTransform); // FUN_004b9728 + // THE AUTHENTIC DAMAGE SUBMISSION (task #8; binary @004bace8:7758-7764): + // fill the inherited Damage record -- amount = this shot's + // damagePortion (== authored DamageAmount at full charge), + // damageForce = target - muzzle (ALSO the gyro's directional + // hit-bounce source, retiring its random fallback), impactPoint = + // the target point -- then submit through SendDamageMessage + // (@004b9728) into the owner's SubsystemMessageManager. + damageData.damageAmount = damagePortion; // @0x3AC + damageData.damageForce.Subtract(targetPoint, muzzlePoint); // @0x3B0 + damageData.impactPoint = targetPoint; // @0x3C8 + damageData.burstCount = 1; + Entity *submitTarget = (owner != 0) + ? *(Entity **)((char *)owner + 0x388) : 0; // mech target slot + SendDamageMessage(submitTarget); // FUN_004b9728 } // stash the beam endpoint for replication (world hit point) + the beam's @@ -275,6 +310,21 @@ void // per-type keyboard split are retired -- weapons sharing a button now fire // TOGETHER (the pod's authored groups: e.g. madcat Trigger = 4 weapons). Logical fireEdge = CheckFireEdge(); // @004b9608 + // task #8 diag: the discharge-chain probe (button->TriggerState->edge->FSM) + if (getenv("BT_FIRE_LOG")) + { + static int s_fp = 0; + if ((++s_fp % 97) == 0 || fireEdge) // 97 prime: rotates through all weapons + DEBUG_STREAM << "[fire-probe] " << GetName() + << " owner=" << (void *)owner + << " trigState=" << (float)fireImpulse + << " edge=" << (int)fireEdge + << " alarm=" << (int)weaponAlarm.GetState() + << " level=" << (float)currentLevel + << " tgt=" << (void *)((owner != 0) + ? *(Entity **)((char *)owner + 0x388) : 0) + << std::endl; + } targetWithinRange = UpdateTargeting(); // @004b9bdc -> this+0x34c // hard failure: powered-off, faulted, or the OWNING MECH destroyed (@004baa88 @@ -791,6 +841,10 @@ Emitter::Emitter( (void)energyRampTime; } + // (task #8 note: energyCoefficient deliberately stays on the bring-up + // electrical model -- the charge cycle is calibrated to it; the AUTHENTIC + // damage algebra is applied as a closed form at fire time instead.) + // damageFraction = damageAmount / (damageAmount + heatCostToFire) damageFraction = damageData.damageAmount / (damageData.damageAmount + heatCostToFire); // 0x444 diff --git a/game/reconstructed/mech4.cpp b/game/reconstructed/mech4.cpp index 648204b..62d79eb 100644 --- a/game/reconstructed/mech4.cpp +++ b/game/reconstructed/mech4.cpp @@ -672,6 +672,13 @@ extern void BTPostKillScore(Entity *victim, Scalar damage); // KILL (+ MP death #define MECH_TARGET_ENTITY(m) (*(Entity **)((char *)(m) + 0x388)) #define MECH_TARGET_SUBIDX(m) (*(int *)((char *)(m) + 0x38c)) +// task #8 bridge: the weapon-side damage submission (mechweap.cpp) reads the +// owner's designated-zone slot; the raw target-slot block lives in this TU. +int BTMechTargetZone(void *mech) +{ + return MECH_TARGET_SUBIDX(mech); +} + // Bring-up body-animation player (file scope so OnBodyAnimFinished can re-arm it). // The engine AnimationInstance walks the mech's joint subsystem from a baked .ani // clip in btl4.res; we advance it each moving frame so the legs CYCLE. @@ -3042,7 +3049,19 @@ void s_prevBtn[b] = want[b]; ControlsButton v = (ControlsButton)(want[b] ? (buttons[b] + 1) : -(buttons[b] + 1)); - cm->buttonGroup[buttons[b]].Update(&v, modeMask); + cm->buttonGroup[buttons[b]].ForceUpdate(&v, modeMask); // diag: bypass the prev-diff gate + if (getenv("BT_FIRE_LOG")) + { + static int s_pushN = 0; + if ((++s_pushN % 60) == 1) + DEBUG_STREAM << "[push] btn=0x" << std::hex + << buttons[b] << std::dec << " v=" << (int)v + << " mode=0x" << std::hex << (int)modeMask + << std::dec << " #" << s_pushN + << " thisMech=" << (void *)this + << " viewpoint=" << (void *)application->GetViewpointEntity() + << std::endl; + } } } } @@ -3170,52 +3189,22 @@ void // routes it to Mech__DamageZone::TakeDamage. Dispatch on a // REPLICANT is rerouted by Entity::Dispatch to the owning // master over the wire -- the cross-pod damage path. - if (((Mech *)victim)->damageZoneCount > 0) + // DAMAGE DELIVERY MOVED (task #8): the AUTHENTIC submitter is + // each firing weapon's own SendDamageMessage (@004b9728, called + // from Emitter::FireWeapon with the authored per-shot + // damagePortion + damageForce + impact) into the + // SubsystemMessageManager. This block keeps only the + // presentation roles: the boresight pick feeds the target + // slots the weapons read (mech+0x388/0x37C/0x38C), the [fire] + // beam-entry explosion visual above, and the shot log. The + // flat kShotDamage build + shooter-side score moved with the + // submission (mechweap.cpp). + if (getenv("BT_FIRE_LOG") && ((Mech *)victim)->damageZoneCount > 0) { - Damage dmg; - dmg.damageType = Damage::ExplosiveDamageType; - dmg.damageAmount = kShotDamage; - dmg.burstCount = 1; - dmg.impactPoint = impact; - - Entity::TakeDamageMessage take_damage( - Entity::TakeDamageMessageID, - sizeof(Entity::TakeDamageMessage), - GetEntityID(), // inflicting = this (shooter) - -1, // UNAIMED -> receiver's cylinder resolves - dmg); - // AUTHENTIC DELIVERY (task #7 tail): submit through the - // SubsystemMessageManager -- per-frame consolidation into - // ONE TakeDamageStream (id 0x13) dispatched at the victim, - // whose T0 handler re-splits it (ENTITY.cpp:817). - // Replicant victims reroute cross-pod as before. [T3: - // the inflicting subsystemID is not threaded through this - // bring-up fire block -- the authentic submitter is the - // weapon's own SendDamageMessage @004b9728, pending the - // damage-economy reconciliation (authored 0.25-scale - // amounts vs the bring-up kShotDamage=12); until then the - // messmgr's weapon-explosion bundling stays dormant.] - if (messageManager != 0) - ((SubsystemMessageManager *)messageManager) - ->AddDamageMessage(victim, &take_damage); - else - victim->Dispatch(&take_damage); - - // SCORE the damage (skip once the victim is dead). - if (!((Mech *)victim)->IsMechDestroyed()) - BTPostDamageScore(victim, kShotDamage); - - int zone = take_damage.damageZone; - if (zone >= 0 && zone < ((Mech *)victim)->damageZoneCount) - { - Scalar s = ((Mech *)victim)->Zone(zone)->damageLevel; - DEBUG_STREAM << "[damage] " << (void*)victim << " zone " << zone - << "/" << ((Mech *)victim)->damageZoneCount - << " structure=" << s - << (((Mech *)victim)->GetInstance() == ReplicantInstance - ? " (REPLICANT -> cross-pod)" : "") - << "\n" << std::flush; - } + DEBUG_STREAM << "[damage] beam hit " << (void*)victim + << (((Mech *)victim)->GetInstance() == ReplicantInstance + ? " (REPLICANT -> cross-pod via the weapon submit)" : "") + << "\n" << std::flush; } // DEATH effects fire at the VICTIM's own death transition // (UpdateDeathState, task #42) -- MP-correct: the master runs it. diff --git a/game/reconstructed/mechdmg.cpp b/game/reconstructed/mechdmg.cpp index 7fae94e..ddeb120 100644 --- a/game/reconstructed/mechdmg.cpp +++ b/game/reconstructed/mechdmg.cpp @@ -143,7 +143,10 @@ static const Scalar CriticalDamageMax = 1.0f; // _DAT_0049ce4c // Probability of re-using the previous child zone inside the reuse window. // (Ghidra read the operand at @0049c514; exact value not cleanly recoverable // from the pseudo-C -- it behaves as a high "stay on the same spot" bias.) -static const Scalar LODReuseHysteresis = 0.82f; // _DAT_0049c514 (TODO: verify) +static const Scalar LODReuseHysteresis = 0.33f; // _DAT_0049c514 -- a DOUBLE in the + // binary (bytes 1f85eb51b81ed53f = + // 0.33); the old 0.82 was a misread + // (task #8 audit) //########################################################################### diff --git a/game/reconstructed/mechweap.cpp b/game/reconstructed/mechweap.cpp index 7298ecc..4ad7f90 100644 --- a/game/reconstructed/mechweap.cpp +++ b/game/reconstructed/mechweap.cpp @@ -58,6 +58,7 @@ // #include +#include // SubsystemMessageManager (task #8 damage submission) #pragma hdrstop #if !defined(MECHWEAP_HPP) @@ -376,13 +377,25 @@ Logical // @004b9608 -- rising-edge detector on fireImpulse (threshold _DAT_004b9648 == 0.0f). // Returns True the frame fireImpulse becomes positive while the previous sample // was non-positive, then stores the current sample for next time. -// TODO: confirm exact role (discharge vs. recharge-ready edge). +// +// ⚠ BIT-PATTERN COMPARE (task #8 root-cause): TriggerState carries the raw +// ControlsButton INT bit-copied by the streamed direct mapping (+(button+1) +// press / -(button+1) release) -- the release value (e.g. -65 = 0xFFFFFFBF) +// reads as a NEGATIVE NaN in float terms. The binary's x87 compare (FNSTSW/ +// SAHF + JBE: unordered sets CF|ZF => branch TAKEN) effectively treated the +// NaN as "released", so its edge re-armed; an IEEE-correct float compare +// makes NaN<=0 FALSE and the detector LATCHES SHUT after the first release +// (observed live: one startup edge, then never again). Compare the BIT +// PATTERNS as signed ints instead -- sign-correct for the button ints AND +// for genuine float values (0.0f = 0x0, positives > 0, negatives/NaNs < 0), +// reproducing the binary's effective behavior exactly. // Logical MechWeapon::CheckFireEdge() { - Logical edge = - (fireImpulse > 0.0f && previousFireImpulse <= 0.0f) ? True : False; + int current = *(int *)&fireImpulse; + int previous = *(int *)&previousFireImpulse; + Logical edge = (current > 0 && previous <= 0) ? True : False; previousFireImpulse = fireImpulse; return edge; } @@ -465,23 +478,57 @@ void // routing through AddDamageMessage. This body stays dormant meanwhile. // void - MechWeapon::DrawWeaponPip(const LinearMatrix &transform) + MechWeapon::SendDamageMessage(Entity *target) { - // @004b9728 -- register the targeting "pip" with the owning Mech's cockpit - // HUD manager. Skipped for non-pip weapons (pipSegment == -1). The HUD - // element record {priority 100, kind 0x12, enabled, team colour, pipPosition, - // pipExtendedRange, transform, pipSegment} is submitted to the cockpit HUD. // - // CROSS-FAMILY (hud): the cockpit HUD manager AddElement entry point lives in - // the HUD module; the submission is wired there. We retain the gating and - // transform reference here. - if (useConfiguredPip) // this+0x3E0 (weapon draws a configured pip) + // @004b9728 -- package this weapon's just-fired damageData as an + // Entity::TakeDamageMessage and submit it to the owning mech's + // SubsystemMessageManager for per-frame consolidation (AddDamageMessage + // @0049b6d8) -- the authentic beam damage delivery (task #8; the caller + // Emitter::FireWeapon fills damageAmount/damageForce/impactPoint first). + // + // Binary gate (part_013.c:6746): a Mech victim with NO designated zone + // (owner+0x38C == -1) is SKIPPED. The port PASSES -1 through [T3 + // divergence]: our Mech::TakeDamageMessageHandler cylinder-resolves the + // unaimed zone (STEP 6), preserving the verified aiming model. + // + Mech *mech = (Mech *)GetEntity(); // weapon+0xD0 + if (mech == 0 || target == 0) { - (void)transform; - (void)pipPosition; - (void)pipExtendedRange; - (void)pipColor; - // owningHud->AddElement( ...pip record... ); // FUN_0049b6d8(entity+0x434, ..) + return; + } + + extern int BTMechTargetZone(void *mech); // mech+0x38C (mech4 TU) + int zone = BTMechTargetZone(mech); + + Entity::TakeDamageMessage message( + Entity::TakeDamageMessageID, + sizeof(Entity::TakeDamageMessage), + mech->GetEntityID(), // inflicting = owner (+0x184) + zone, // designated zone (or -1 -> cylinder) + damageData, // the 12-dword Damage @0x3A8 + subsystemID); // inflictingSubsystemID (+0xD8) -- + // lights up the messmgr's per-weapon + // explosion bundling (weapon+0x3E4) + SubsystemMessageManager *manager = + (SubsystemMessageManager *)mech->GetMessageManager(); // mech+0x434 + if (manager != 0) + { + manager->AddDamageMessage(target, &message); // FUN_0049b6d8 + } + else + { + target->Dispatch(&message); // no manager: direct (bring-up) + } + + // PORT bookkeeping (score lived in the retired mech4 fire block): credit + // the delivered amount to the shooter-side score exactly as before. + extern void BTPostDamageScore(Entity *victim, Scalar damage); + extern Logical BTIsRegisteredMech(Entity *e); + if (BTIsRegisteredMech(target) + && !((Mech *)target)->IsMechDestroyed()) + { + BTPostDamageScore(target, damageData.damageAmount); } } diff --git a/game/reconstructed/mechweap.hpp b/game/reconstructed/mechweap.hpp index 1bfe3bb..c7eef4b 100644 --- a/game/reconstructed/mechweap.hpp +++ b/game/reconstructed/mechweap.hpp @@ -285,7 +285,9 @@ class CockpitHud; // @004b9728 -- register the targeting "pip" / fire marker with the // owning Mech's cockpit HUD manager. void - DrawWeaponPip(const LinearMatrix &transform); + SendDamageMessage(Entity *target); // @004b9728 (ex "DrawWeaponPip" -- the + // weapon-fire damage submission into the + // owner's SubsystemMessageManager, task #8) //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // Construction and Destruction diff --git a/scratchpad/dis_434ctx.py b/scratchpad/dis_434ctx.py new file mode 100644 index 0000000..dddc439 --- /dev/null +++ b/scratchpad/dis_434ctx.py @@ -0,0 +1,15 @@ +import capstone, struct, sys +sys.stdout.reconfigure(encoding="utf-8", errors="replace") +data=open(r"C:/git/bt411/content/BTL4OPT.EXE","rb").read() +CODE_VA=0x401000; CODE_RA=0xE00 +md=capstone.Cs(capstone.CS_ARCH_X86, capstone.CS_MODE_32) +def dump(start,end): + code=data[CODE_RA+(start-CODE_VA):CODE_RA+(end-CODE_VA)] + for ins in md.disasm(code,start): + print(f"{ins.address:08x}: {ins.mnemonic} {ins.op_str}") + print("---") +dump(0x4bac90,0x4bacf0) +dump(0x4bae80,0x4baef0) +dump(0x4a1d10,0x4a1d40) +dump(0x4a2290,0x4a22c0) +dump(0x4b9830,0x4b9870) diff --git a/scratchpad/dis_434ctx2.py b/scratchpad/dis_434ctx2.py new file mode 100644 index 0000000..2a8788b --- /dev/null +++ b/scratchpad/dis_434ctx2.py @@ -0,0 +1,13 @@ +import capstone, struct, sys +sys.stdout.reconfigure(encoding="utf-8", errors="replace") +data=open(r"C:/git/bt411/content/BTL4OPT.EXE","rb").read() +CODE_VA=0x401000; CODE_RA=0xE00 +md=capstone.Cs(capstone.CS_ARCH_X86, capstone.CS_MODE_32) +def dump(start,end,lo,hi): + code=data[CODE_RA+(start-CODE_VA):CODE_RA+(end-CODE_VA)] + for ins in md.disasm(code,start): + if lo <= ins.address <= hi: + print(f"{ins.address:08x}: {ins.mnemonic} {ins.op_str}") + print("---") +dump(0x4baa88,0x4bad10,0x4bac90,0x4bacf5) +dump(0x4bace8,0x4baf20,0x4bae70,0x4baef5) diff --git a/scratchpad/dis_434gap.py b/scratchpad/dis_434gap.py new file mode 100644 index 0000000..fdedf6c --- /dev/null +++ b/scratchpad/dis_434gap.py @@ -0,0 +1,12 @@ +import capstone, struct, sys +sys.stdout.reconfigure(encoding="utf-8", errors="replace") +data=open(r"C:/git/bt411/content/BTL4OPT.EXE","rb").read() +CODE_VA=0x401000; CODE_RA=0xE00 +md=capstone.Cs(capstone.CS_ARCH_X86, capstone.CS_MODE_32) +code=data[CODE_RA+(0x4baa88-CODE_VA):CODE_RA+(0x4bace8-CODE_VA)] +prev_ret=None +for ins in md.disasm(code,0x4baa88): + if ins.mnemonic=="ret": + print(f"ret at {ins.address:08x}") + if ins.mnemonic=="push" and ins.op_str=="ebp": + print(f"push ebp at {ins.address:08x}") diff --git a/scratchpad/dis_434gap2.py b/scratchpad/dis_434gap2.py new file mode 100644 index 0000000..ff07231 --- /dev/null +++ b/scratchpad/dis_434gap2.py @@ -0,0 +1,14 @@ +import capstone, sys +sys.stdout.reconfigure(encoding="utf-8", errors="replace") +data=open(r"C:/git/bt411/content/BTL4OPT.EXE","rb").read() +CODE_VA=0x401000; CODE_RA=0xE00 +md=capstone.Cs(capstone.CS_ARCH_X86, capstone.CS_MODE_32) +for start in (0x4bac04,0x4bac08,0x4bac0c,0x4bac10): + code=data[CODE_RA+(start-CODE_VA):CODE_RA+(start-CODE_VA)+48] + insns=list(md.disasm(code,start)) + if insns and insns[0].mnemonic=="push" and insns[0].op_str=="ebp": + print(f"FUNCTION START {start:08x}") + code=data[CODE_RA+(start-CODE_VA):CODE_RA+(0x4bace6-CODE_VA)] + for ins in md.disasm(code,start): + print(f"{ins.address:08x}: {ins.mnemonic} {ins.op_str}") + break diff --git a/scratchpad/dump_dzones.py b/scratchpad/dump_dzones.py new file mode 100644 index 0000000..e0cfd7a --- /dev/null +++ b/scratchpad/dump_dzones.py @@ -0,0 +1,70 @@ +import struct, sys +data = open(r'C:\git\bt411\content\BTL4.RES', 'rb').read() +labOnly, maxID = struct.unpack_from(' points = 1/scale + pts = ['%g' % (1.0/s if s else 0) for s in scales] + print('zone %2d %-24s armor(default)=%g scale=[%s] -> points=[%s]' % + (z, name, dap, ' '.join('%.6g' % s for s in scales), ' '.join(pts))) + print(' seg=%d vital=%d legs(L%d,R%d) descend=%d sibs=%d mats=%d crits=%s redirects=%s' % + (segidx, vital, lleg, rleg, descend, sibs, sklcount, + [(round(w,3), round(pc,3), si) for (w,pc,si) in crits], redirects)) + print('consumed %d of %d bytes' % (p, len(buf))) + +want = [n.lower() for n in (sys.argv[1:] or ['madcat','bhk1'])] +for (rid, rt, nm, roff, rlen) in DZ: + if any(w in nm.lower() for w in want): + parse_zone_stream(data[roff:roff+rlen], 'id=%d %s' % (rid, nm)) diff --git a/scratchpad/scan_434.py b/scratchpad/scan_434.py new file mode 100644 index 0000000..644ef83 --- /dev/null +++ b/scratchpad/scan_434.py @@ -0,0 +1,39 @@ +import capstone, struct, sys +sys.stdout.reconfigure(encoding="utf-8", errors="replace") +data = open(r"C:/git/bt411/content/BTL4OPT.EXE","rb").read() +CODE_VA=0x401000; CODE_RA=0xE00 +# scan whole CODE section but report region; disp32 0x434 pattern +pat = b"\x34\x04\x00\x00" +md = capstone.Cs(capstone.CS_ARCH_X86, capstone.CS_MODE_32); md.detail=False +# find CODE section size +pe = struct.unpack_from("= va+4 and i0.address+i0.size <= va+4+4: + hits.append((i0.address, f"{i0.mnemonic} {i0.op_str}", i0.size)) + break +seen=set() +for a,s,sz in sorted(hits): + if a in seen: continue + seen.add(a) + region = "MECH" if 0x49e000<=a<0x4c0000 else "" + print(f"{a:08x} {region:5s} {s}") diff --git a/scratchpad/scan_434b.py b/scratchpad/scan_434b.py new file mode 100644 index 0000000..88d20a4 --- /dev/null +++ b/scratchpad/scan_434b.py @@ -0,0 +1,31 @@ +import capstone, struct, sys +sys.stdout.reconfigure(encoding="utf-8", errors="replace") +data = open(r"C:/git/bt411/content/BTL4OPT.EXE","rb").read() +CODE_VA=0x401000; CODE_RA=0xE00 +pe = struct.unpack_from("= len(pad) - 2: + recs.append((i, name, cid, sz)) + i += 0x28 + continue + i += 1 + +print(f'total subsystem records: {len(recs)}') + +# group into chains (consecutive: next record at p+sz) +chains = [] +cur = [] +for k,(p,name,cid,sz) in enumerate(recs): + if cur and cur[-1][0] + cur[-1][3] == p: + cur.append(recs[k]) + else: + if cur: chains.append(cur) + cur = [recs[k]] +if cur: chains.append(cur) + +# mech-name strings for labeling +mechnames = [b'madcat', b'bhk', b'vulture', b'thor', b'blackhawk', b'blh', b'owens', b'strider', b'sunder', b'cauldron', b'avatar', b'mdc'] +low = data.lower() +namepos = [] +for m in mechnames: + j = 0 + while True: + j = low.find(m, j) + if j < 0: break + namepos.append((j, m.decode())) + j += 1 +namepos.sort() + +def nearest_label(p): + best = None + for pos, name in namepos: + if pos < p: best = (pos, name) + else: break + return best + +WEAP = {0xBC8:'Emitter', 0xBD4:'PPC', 0xBCD:'MechWeapon/Projectile', 0xBCE:'GaussRifle?', 0xBD0:'MissileLauncher'} + +for ci, ch in enumerate(chains): + lbl = nearest_label(ch[0][0]) + has_weap = any(c[2] in WEAP for c in ch) + print(f'--- chain {ci} @0x{ch[0][0]:x} n={len(ch)} nearest-name={lbl} roster={[c[1] for c in ch]}') + for (p,name,cid,sz) in ch: + if cid not in WEAP: continue + rr, wr = f32(p+0x190), f32(p+0x194) + dmg = f32(p+0x19C); dt = i32(p+0x1A0); heat = f32(p+0x1A4) + pip = i32(p+0x1A8); pc = (f32(p+0x1AC), f32(p+0x1B0), f32(p+0x1B4)); per = i32(p+0x1B8) + line = (f' {name:24s} cid=0x{cid:X}({WEAP[cid]}) sz=0x{sz:X} Recharge={rr:g} Range={wr:g} ' + f'Damage={dmg:g} Type={dt}({DMGTYPE.get(dt,"?")}) Heat={heat:g} Pip={pip} PipColor={pc} PipExt={per}') + if cid in (0xBC8, 0xBD4) and sz >= 0x1DC: + gl, dtm = f32(p+0x1BC), f32(p+0x1C0) + sv = [f32(p+0x1C4+4*k) for k in range(5)] + ri = i32(p+0x1D8) + line += f' | GraphicLen={gl:g} DischargeTime={dtm:g} SeekV={["%g"%v for v in sv]} RecIdx={ri}' + if cid in (0xBCD, 0xBD0) and sz >= 0x1D0: + ti, abi = i32(p+0x1BC), i32(p+0x1C0) + mtof, mvp, mjc = f32(p+0x1C4), f32(p+0x1C8), f32(p+0x1CC) + line += f' | TracerInt={ti} AmmoBin={abi} MinTOF={mtof:g} MinVolt%={mvp:g} MinJam={mjc:g}' + if cid == 0xBD0 and sz >= 0x1E0: + mc = i32(p+0x1D0); mv = (f32(p+0x1D4), f32(p+0x1D8), f32(p+0x1DC)) + line += f' | MissileCount={mc} MuzzleVel={mv}' + print(line) diff --git a/scratchpad/weapsub_out.txt b/scratchpad/weapsub_out.txt new file mode 100644 index 0000000..ac4a711 --- /dev/null +++ b/scratchpad/weapsub_out.txt @@ -0,0 +1,157 @@ +total subsystem records: 528 +--- chain 0 @0x2f741 n=28 nearest-name=(194317, 'madcat') roster=['HeatSink', 'Reservoir', 'Condenser1', 'Condenser2', 'Condenser3', 'Condenser4', 'Condenser5', 'Condenser6', 'GeneratorA', 'GeneratorB', 'GeneratorC', 'GeneratorD', 'Avionics', 'Myomers', 'Gyroscope', 'Torso', 'HUD', 'Searchlight', 'ThermalSight', 'AmmoBinAFC100', 'AFC100', 'ERLLaser', 'ERSLaser_1', 'ERSLaser_2', 'AmmoBinLRM15_1', 'LRM15_1', 'AmmoBinLRM15_2', 'LRM15_2'] + AFC100 cid=0xBCD(MechWeapon/Projectile) sz=0x1D0 Recharge=8 Range=400 Damage=25 Type=1(Ballistic) Heat=6.5e+07 Pip=1 PipColor=(1.0, 0.5, 0.0) PipExt=0 | TracerInt=1 AmmoBin=21 MinTOF=1e+06 MinVolt%=0.3 MinJam=0.05 + ERLLaser cid=0xBC8(Emitter) sz=0x1DC Recharge=4 Range=750 Damage=6 Type=3(Laser) Heat=8.5 Pip=1 PipColor=(1.0, 0.0, 0.0) PipExt=1 | GraphicLen=2000 DischargeTime=0.2 SeekV=['0.6', '0.7', '0.8', '0.99', '-1'] RecIdx=2 + ERSLaser_1 cid=0xBC8(Emitter) sz=0x1DC Recharge=1 Range=225 Damage=2 Type=3(Laser) Heat=1.5 Pip=1 PipColor=(1.0, 0.0, 0.0) PipExt=1 | GraphicLen=2000 DischargeTime=0.2 SeekV=['0.6', '0.7', '0.8', '0.99', '-1'] RecIdx=2 + ERSLaser_2 cid=0xBC8(Emitter) sz=0x1DC Recharge=1 Range=225 Damage=2 Type=3(Laser) Heat=1.5 Pip=2 PipColor=(1.0, 0.0, 0.0) PipExt=1 | GraphicLen=2000 DischargeTime=0.2 SeekV=['0.6', '0.7', '0.8', '0.99', '-1'] RecIdx=2 + LRM15_1 cid=0xBD0(MissileLauncher) sz=0x1E0 Recharge=6 Range=6000 Damage=50 Type=2(Explosive) Heat=6.5e+07 Pip=1 PipColor=(0.0, 1.0, 0.0) PipExt=1 | TracerInt=1 AmmoBin=26 MinTOF=0.5 MinVolt%=0.3 MinJam=0.05 | MissileCount=15 MuzzleVel=(0.0, 0.0, 30.0) + LRM15_2 cid=0xBD0(MissileLauncher) sz=0x1E0 Recharge=6 Range=6000 Damage=50 Type=2(Explosive) Heat=6.5e+07 Pip=2 PipColor=(0.0, 1.0, 0.0) PipExt=1 | TracerInt=1 AmmoBin=28 MinTOF=0.5 MinVolt%=0.3 MinJam=0.05 | MissileCount=15 MuzzleVel=(0.0, 0.0, 30.0) +--- chain 1 @0x5ae8b n=31 nearest-name=(341319, 'madcat') roster=['HeatSink', 'Reservoir', 'Condenser1', 'Condenser2', 'Condenser3', 'Condenser4', 'Condenser5', 'Condenser6', 'GeneratorA', 'GeneratorB', 'GeneratorC', 'GeneratorD', 'Avionics', 'Myomers', 'Gyroscope', 'Torso', 'HUD', 'Searchlight', 'ThermalSight', 'AmmoBinAFC25_1', 'AFC25_1', 'AmmoBinAFC25_2', 'AFC25_2', 'MLaser1', 'MLaser2', 'MLaser3', 'MLaser4', 'AmmoBinLRM10_1', 'LRM10_1', 'AmmoBinLRM10_2', 'LRM10_2'] + AFC25_1 cid=0xBCD(MechWeapon/Projectile) sz=0x1D0 Recharge=2 Range=900 Damage=7 Type=1(Ballistic) Heat=1.5e+06 Pip=1 PipColor=(1.0, 0.5, 0.0) PipExt=0 | TracerInt=1 AmmoBin=21 MinTOF=1e+06 MinVolt%=0.3 MinJam=0.05 + AFC25_2 cid=0xBCD(MechWeapon/Projectile) sz=0x1D0 Recharge=2 Range=900 Damage=7 Type=1(Ballistic) Heat=1.5e+06 Pip=2 PipColor=(1.0, 0.5, 0.0) PipExt=0 | TracerInt=1 AmmoBin=23 MinTOF=1e+06 MinVolt%=0.3 MinJam=0.05 + MLaser1 cid=0xBC8(Emitter) sz=0x1DC Recharge=2 Range=350 Damage=2.5 Type=3(Laser) Heat=2 Pip=1 PipColor=(1.0, 0.0, 0.0) PipExt=0 | GraphicLen=2000 DischargeTime=0.2 SeekV=['0.6', '0.7', '0.8', '0.99', '-1'] RecIdx=2 + MLaser2 cid=0xBC8(Emitter) sz=0x1DC Recharge=2 Range=350 Damage=2.5 Type=3(Laser) Heat=2 Pip=2 PipColor=(1.0, 0.0, 0.0) PipExt=0 | GraphicLen=2000 DischargeTime=0.2 SeekV=['0.6', '0.7', '0.8', '0.99', '-1'] RecIdx=2 + MLaser3 cid=0xBC8(Emitter) sz=0x1DC Recharge=2 Range=350 Damage=2.5 Type=3(Laser) Heat=2 Pip=3 PipColor=(1.0, 0.0, 0.0) PipExt=0 | GraphicLen=2000 DischargeTime=0.2 SeekV=['0.6', '0.7', '0.8', '0.99', '-1'] RecIdx=2 + MLaser4 cid=0xBC8(Emitter) sz=0x1DC Recharge=2 Range=350 Damage=2.5 Type=3(Laser) Heat=2 Pip=4 PipColor=(1.0, 0.0, 0.0) PipExt=0 | GraphicLen=2000 DischargeTime=0.2 SeekV=['0.6', '0.7', '0.8', '0.99', '-1'] RecIdx=2 + LRM10_1 cid=0xBD0(MissileLauncher) sz=0x1E0 Recharge=4 Range=6000 Damage=20 Type=2(Explosive) Heat=4.5e+07 Pip=1 PipColor=(0.0, 1.0, 0.0) PipExt=1 | TracerInt=1 AmmoBin=29 MinTOF=0.5 MinVolt%=0.3 MinJam=0.05 | MissileCount=10 MuzzleVel=(0.0, 0.0, 30.0) + LRM10_2 cid=0xBD0(MissileLauncher) sz=0x1E0 Recharge=4 Range=6000 Damage=20 Type=2(Explosive) Heat=4.5e+07 Pip=2 PipColor=(0.0, 1.0, 0.0) PipExt=1 | TracerInt=1 AmmoBin=31 MinTOF=0.5 MinVolt%=0.3 MinJam=0.05 | MissileCount=10 MuzzleVel=(0.0, 0.0, 30.0) +--- chain 2 @0x86d56 n=30 nearest-name=(393720, 'blh') roster=['HeatSink', 'Reservoir', 'Condenser1', 'Condenser2', 'Condenser3', 'Condenser4', 'Condenser5', 'Condenser6', 'GeneratorA', 'GeneratorB', 'GeneratorC', 'GeneratorD', 'Avionics', 'Myomers', 'Gyroscope', 'Torso', 'HUD', 'Searchlight', 'ThermalSight', 'ERPPC', 'AmmoBinAFC50', 'AFC50', 'ERMLaser_1', 'ERMLaser_2', 'AmmoBinLRM15', 'LRM15', 'AmmoBinSRM6_1', 'SRM6_1', 'AmmoBinSRM6_2', 'SRM6_2'] + ERPPC cid=0xBD4(PPC) sz=0x1DC Recharge=5 Range=950 Damage=16 Type=4(Energy) Heat=16 Pip=1 PipColor=(0.0, 0.0, 1.0) PipExt=0 | GraphicLen=2000 DischargeTime=0.2 SeekV=['0.6', '0.7', '0.8', '0.99', '-1'] RecIdx=2 + AFC50 cid=0xBCD(MechWeapon/Projectile) sz=0x1D0 Recharge=4 Range=750 Damage=13 Type=1(Ballistic) Heat=2e+07 Pip=1 PipColor=(1.0, 0.5, 0.0) PipExt=0 | TracerInt=1 AmmoBin=22 MinTOF=1e+06 MinVolt%=0.3 MinJam=0.05 + ERMLaser_1 cid=0xBC8(Emitter) sz=0x1DC Recharge=2 Range=500 Damage=3.5 Type=3(Laser) Heat=3.5 Pip=1 PipColor=(1.0, 0.0, 0.0) PipExt=1 | GraphicLen=2000 DischargeTime=0.2 SeekV=['0.6', '0.7', '0.8', '0.99', '-1'] RecIdx=2 + ERMLaser_2 cid=0xBC8(Emitter) sz=0x1DC Recharge=2 Range=500 Damage=3.5 Type=3(Laser) Heat=3.5 Pip=2 PipColor=(1.0, 0.0, 0.0) PipExt=1 | GraphicLen=2000 DischargeTime=0.2 SeekV=['0.6', '0.7', '0.8', '0.99', '-1'] RecIdx=2 + LRM15 cid=0xBD0(MissileLauncher) sz=0x1E0 Recharge=6 Range=6000 Damage=35 Type=2(Explosive) Heat=6.5e+07 Pip=1 PipColor=(0.0, 1.0, 0.0) PipExt=1 | TracerInt=1 AmmoBin=26 MinTOF=0.5 MinVolt%=0.3 MinJam=0.05 | MissileCount=15 MuzzleVel=(0.0, 5.0, 30.0) + SRM6_1 cid=0xBD0(MissileLauncher) sz=0x1E0 Recharge=3 Range=800 Damage=20 Type=2(Explosive) Heat=3e+07 Pip=1 PipColor=(0.6000000238418579, 0.4000000059604645, 0.0) PipExt=0 | TracerInt=1 AmmoBin=28 MinTOF=0.5 MinVolt%=0.3 MinJam=0.05 | MissileCount=4 MuzzleVel=(0.0, 0.0, 100.0) + SRM6_2 cid=0xBD0(MissileLauncher) sz=0x1E0 Recharge=3 Range=800 Damage=20 Type=2(Explosive) Heat=3e+07 Pip=2 PipColor=(0.6000000238418579, 0.4000000059604645, 0.0) PipExt=0 | TracerInt=1 AmmoBin=30 MinTOF=0.5 MinVolt%=0.3 MinJam=0.05 | MissileCount=4 MuzzleVel=(0.0, 0.0, 100.0) +--- chain 3 @0xb2525 n=29 nearest-name=(393720, 'blh') roster=['HeatSink', 'Reservoir', 'Condenser1', 'Condenser2', 'Condenser3', 'Condenser4', 'Condenser5', 'Condenser6', 'GeneratorA', 'GeneratorB', 'GeneratorC', 'GeneratorD', 'Avionics', 'Myomers', 'Gyroscope', 'Torso', 'HUD', 'Searchlight', 'ThermalSight', 'AmmoBinAFC50_1', 'AFC50_1', 'AmmoBinAFC50_2', 'AFC50_2', 'ERMLaser_1', 'ERMLaser_2', 'ERSLaser_1', 'ERSLaser_2', 'AmmoBinSRM4', 'SRM4'] + AFC50_1 cid=0xBCD(MechWeapon/Projectile) sz=0x1D0 Recharge=4 Range=750 Damage=13 Type=1(Ballistic) Heat=2e+07 Pip=1 PipColor=(1.0, 0.5, 0.0) PipExt=0 | TracerInt=1 AmmoBin=21 MinTOF=1e+06 MinVolt%=0.3 MinJam=0.05 + AFC50_2 cid=0xBCD(MechWeapon/Projectile) sz=0x1D0 Recharge=4 Range=750 Damage=13 Type=1(Ballistic) Heat=2e+07 Pip=2 PipColor=(1.0, 0.5, 0.0) PipExt=0 | TracerInt=1 AmmoBin=23 MinTOF=1e+06 MinVolt%=0.3 MinJam=0.05 + ERMLaser_1 cid=0xBC8(Emitter) sz=0x1DC Recharge=2 Range=500 Damage=3.5 Type=3(Laser) Heat=3.5 Pip=1 PipColor=(1.0, 0.0, 0.0) PipExt=1 | GraphicLen=2000 DischargeTime=0.2 SeekV=['0.6', '0.7', '0.8', '0.99', '-1'] RecIdx=2 + ERMLaser_2 cid=0xBC8(Emitter) sz=0x1DC Recharge=2 Range=500 Damage=3.5 Type=3(Laser) Heat=3.5 Pip=2 PipColor=(1.0, 0.0, 0.0) PipExt=1 | GraphicLen=2000 DischargeTime=0.2 SeekV=['0.6', '0.7', '0.8', '0.99', '-1'] RecIdx=2 + ERSLaser_1 cid=0xBC8(Emitter) sz=0x1DC Recharge=1 Range=225 Damage=2 Type=3(Laser) Heat=1.5 Pip=1 PipColor=(1.0, 0.0, 0.0) PipExt=1 | GraphicLen=2000 DischargeTime=0.2 SeekV=['0.6', '0.7', '0.8', '0.99', '-1'] RecIdx=2 + ERSLaser_2 cid=0xBC8(Emitter) sz=0x1DC Recharge=1 Range=225 Damage=2 Type=3(Laser) Heat=1.5 Pip=2 PipColor=(1.0, 0.0, 0.0) PipExt=1 | GraphicLen=2000 DischargeTime=0.2 SeekV=['0.6', '0.7', '0.8', '0.99', '-1'] RecIdx=2 + SRM4 cid=0xBD0(MissileLauncher) sz=0x1E0 Recharge=3 Range=800 Damage=35 Type=2(Explosive) Heat=3e+07 Pip=1 PipColor=(0.6000000238418579, 0.4000000059604645, 0.0) PipExt=0 | TracerInt=1 AmmoBin=29 MinTOF=0.5 MinVolt%=0.3 MinJam=0.05 | MissileCount=4 MuzzleVel=(0.0, 0.0, 100.0) +--- chain 4 @0xd0d9a n=29 nearest-name=(393720, 'blh') roster=['HeatSink', 'Reservoir', 'Condenser1', 'Condenser2', 'Condenser3', 'Condenser4', 'Condenser5', 'Condenser6', 'GeneratorA', 'GeneratorB', 'GeneratorC', 'GeneratorD', 'Avionics', 'Myomers', 'Gyroscope', 'Torso', 'HUD', 'Searchlight', 'ThermalSight', 'PPC_1', 'PPC_2', 'LLaser_1', 'LLaser_2', 'MLaser_1', 'MLaser_2', 'SLaser_1', 'SLaser_2', 'AmmoBinSRM4', 'SRM4'] + PPC_1 cid=0xBD4(PPC) sz=0x1DC Recharge=5 Range=900 Damage=12 Type=4(Energy) Heat=11 Pip=1 PipColor=(0.0, 0.0, 1.0) PipExt=0 | GraphicLen=2000 DischargeTime=0.2 SeekV=['0.6', '0.7', '0.8', '0.99', '-1'] RecIdx=2 + PPC_2 cid=0xBD4(PPC) sz=0x1DC Recharge=5 Range=900 Damage=12 Type=4(Energy) Heat=11 Pip=2 PipColor=(0.0, 0.0, 1.0) PipExt=0 | GraphicLen=2000 DischargeTime=0.2 SeekV=['0.6', '0.7', '0.8', '0.99', '-1'] RecIdx=2 + LLaser_1 cid=0xBC8(Emitter) sz=0x1DC Recharge=4 Range=600 Damage=5 Type=3(Laser) Heat=6 Pip=1 PipColor=(1.0, 0.0, 0.0) PipExt=0 | GraphicLen=2000 DischargeTime=0.2 SeekV=['0.6', '0.7', '0.8', '0.99', '-1'] RecIdx=2 + LLaser_2 cid=0xBC8(Emitter) sz=0x1DC Recharge=4 Range=600 Damage=5 Type=3(Laser) Heat=6 Pip=2 PipColor=(1.0, 0.0, 0.0) PipExt=0 | GraphicLen=2000 DischargeTime=0.2 SeekV=['0.6', '0.7', '0.8', '0.99', '-1'] RecIdx=2 + MLaser_1 cid=0xBC8(Emitter) sz=0x1DC Recharge=2 Range=350 Damage=2.5 Type=3(Laser) Heat=2 Pip=1 PipColor=(1.0, 0.0, 0.0) PipExt=0 | GraphicLen=2000 DischargeTime=0.2 SeekV=['0.6', '0.7', '0.8', '0.99', '-1'] RecIdx=2 + MLaser_2 cid=0xBC8(Emitter) sz=0x1DC Recharge=2 Range=350 Damage=2.5 Type=3(Laser) Heat=2 Pip=2 PipColor=(1.0, 0.0, 0.0) PipExt=0 | GraphicLen=2000 DischargeTime=0.2 SeekV=['0.6', '0.7', '0.8', '0.99', '-1'] RecIdx=2 + SLaser_1 cid=0xBC8(Emitter) sz=0x1DC Recharge=1 Range=150 Damage=1.5 Type=3(Laser) Heat=0.75 Pip=1 PipColor=(1.0, 0.0, 0.0) PipExt=0 | GraphicLen=2000 DischargeTime=0.2 SeekV=['0.6', '0.7', '0.8', '0.99', '-1'] RecIdx=2 + SLaser_2 cid=0xBC8(Emitter) sz=0x1DC Recharge=1 Range=150 Damage=1.5 Type=3(Laser) Heat=0.75 Pip=2 PipColor=(1.0, 0.0, 0.0) PipExt=0 | GraphicLen=2000 DischargeTime=0.2 SeekV=['0.6', '0.7', '0.8', '0.99', '-1'] RecIdx=2 + SRM4 cid=0xBD0(MissileLauncher) sz=0x1E0 Recharge=3 Range=800 Damage=20 Type=2(Explosive) Heat=3e+07 Pip=1 PipColor=(0.6000000238418579, 0.4000000059604645, 0.0) PipExt=0 | TracerInt=1 AmmoBin=29 MinTOF=0.5 MinVolt%=0.3 MinJam=0.05 | MissileCount=4 MuzzleVel=(0.0, 0.0, 100.0) +--- chain 5 @0xefe32 n=31 nearest-name=(393720, 'blh') roster=['HeatSink', 'Reservoir', 'Condenser1', 'Condenser2', 'Condenser3', 'Condenser4', 'Condenser5', 'Condenser6', 'GeneratorA', 'GeneratorB', 'GeneratorC', 'GeneratorD', 'Avionics', 'Myomers', 'Gyroscope', 'Torso', 'HUD', 'Searchlight', 'ThermalSight', 'PPC', 'AmmoBinGAUSS', 'GAUSS', 'AmmoBinAFC25', 'AFC25', 'MLaser_1', 'MLaser_2', 'MLaser_3', 'SLaser_1', 'SLaser_2', 'AmmoBinSRM4', 'SRM4'] + PPC cid=0xBD4(PPC) sz=0x1DC Recharge=5 Range=900 Damage=12 Type=4(Energy) Heat=11 Pip=1 PipColor=(0.0, 0.0, 1.0) PipExt=0 | GraphicLen=2000 DischargeTime=0.2 SeekV=['0.6', '0.7', '0.8', '0.99', '-1'] RecIdx=2 + GAUSS cid=0xBCD(MechWeapon/Projectile) sz=0x1D0 Recharge=8 Range=900 Damage=20 Type=1(Ballistic) Heat=1e+06 Pip=2 PipColor=(1.0, 1.0, 0.0) PipExt=0 | TracerInt=1 AmmoBin=22 MinTOF=1e+06 MinVolt%=0.3 MinJam=0.05 + AFC25 cid=0xBCD(MechWeapon/Projectile) sz=0x1D0 Recharge=2 Range=900 Damage=7 Type=1(Ballistic) Heat=1.5e+06 Pip=3 PipColor=(1.0, 0.5, 0.0) PipExt=0 | TracerInt=1 AmmoBin=24 MinTOF=1e+06 MinVolt%=0.3 MinJam=0.05 + MLaser_1 cid=0xBC8(Emitter) sz=0x1DC Recharge=2 Range=350 Damage=2.5 Type=3(Laser) Heat=2 Pip=1 PipColor=(1.0, 0.0, 0.0) PipExt=0 | GraphicLen=2000 DischargeTime=0.2 SeekV=['0.6', '0.7', '0.8', '0.99', '-1'] RecIdx=2 + MLaser_2 cid=0xBC8(Emitter) sz=0x1DC Recharge=2 Range=350 Damage=2.5 Type=3(Laser) Heat=2 Pip=2 PipColor=(1.0, 0.0, 0.0) PipExt=0 | GraphicLen=2000 DischargeTime=0.2 SeekV=['0.6', '0.7', '0.8', '0.99', '-1'] RecIdx=2 + MLaser_3 cid=0xBC8(Emitter) sz=0x1DC Recharge=2 Range=350 Damage=2.5 Type=3(Laser) Heat=2 Pip=3 PipColor=(1.0, 0.0, 0.0) PipExt=0 | GraphicLen=2000 DischargeTime=0.2 SeekV=['0.6', '0.7', '0.8', '0.99', '-1'] RecIdx=2 + SLaser_1 cid=0xBC8(Emitter) sz=0x1DC Recharge=1 Range=150 Damage=1.5 Type=3(Laser) Heat=0.75 Pip=1 PipColor=(1.0, 0.0, 0.0) PipExt=0 | GraphicLen=2000 DischargeTime=0.2 SeekV=['0.6', '0.7', '0.8', '0.99', '-1'] RecIdx=2 + SLaser_2 cid=0xBC8(Emitter) sz=0x1DC Recharge=1 Range=150 Damage=1.5 Type=3(Laser) Heat=0.75 Pip=2 PipColor=(1.0, 0.0, 0.0) PipExt=0 | GraphicLen=2000 DischargeTime=0.2 SeekV=['0.6', '0.7', '0.8', '0.99', '-1'] RecIdx=2 + SRM4 cid=0xBD0(MissileLauncher) sz=0x1E0 Recharge=2 Range=800 Damage=10 Type=2(Explosive) Heat=1.5e+07 Pip=1 PipColor=(0.6000000238418579, 0.4000000059604645, 0.0) PipExt=0 | TracerInt=1 AmmoBin=31 MinTOF=0.5 MinVolt%=0.3 MinJam=0.05 | MissileCount=2 MuzzleVel=(0.0, 0.0, 100.0) +--- chain 6 @0x10e2a5 n=27 nearest-name=(1106545, 'thor') roster=['HeatSink', 'Reservoir', 'Condenser1', 'Condenser2', 'Condenser3', 'Condenser4', 'Condenser5', 'Condenser6', 'GeneratorA', 'GeneratorB', 'GeneratorC', 'GeneratorD', 'Avionics', 'Myomers', 'Gyroscope', 'Torso', 'HUD', 'Searchlight', 'ThermalSight', 'ERPPC_1', 'ERPPC_2', 'LLaser', 'ERMLaser', 'ERSLaser_1', 'ERSLaser_2', 'AmmoBinLRM15', 'LRM15'] + ERPPC_1 cid=0xBD4(PPC) sz=0x1DC Recharge=5 Range=950 Damage=16 Type=4(Energy) Heat=16 Pip=1 PipColor=(0.0, 0.0, 1.0) PipExt=0 | GraphicLen=2000 DischargeTime=0.2 SeekV=['0.6', '0.7', '0.8', '0.99', '-1'] RecIdx=2 + ERPPC_2 cid=0xBD4(PPC) sz=0x1DC Recharge=5 Range=950 Damage=16 Type=4(Energy) Heat=16 Pip=2 PipColor=(0.0, 0.0, 1.0) PipExt=0 | GraphicLen=2000 DischargeTime=0.2 SeekV=['0.6', '0.7', '0.8', '0.99', '-1'] RecIdx=2 + LLaser cid=0xBC8(Emitter) sz=0x1DC Recharge=4 Range=600 Damage=5 Type=3(Laser) Heat=6 Pip=1 PipColor=(1.0, 0.0, 0.0) PipExt=0 | GraphicLen=2000 DischargeTime=0.2 SeekV=['0.6', '0.7', '0.8', '0.99', '-1'] RecIdx=2 + ERMLaser cid=0xBC8(Emitter) sz=0x1DC Recharge=2 Range=500 Damage=3.5 Type=3(Laser) Heat=3.5 Pip=1 PipColor=(1.0, 0.0, 0.0) PipExt=1 | GraphicLen=2000 DischargeTime=0.2 SeekV=['0.6', '0.7', '0.8', '0.99', '-1'] RecIdx=2 + ERSLaser_1 cid=0xBC8(Emitter) sz=0x1DC Recharge=1 Range=225 Damage=2 Type=3(Laser) Heat=1.5 Pip=1 PipColor=(1.0, 0.0, 0.0) PipExt=1 | GraphicLen=2000 DischargeTime=0.2 SeekV=['0.6', '0.7', '0.8', '0.99', '-1'] RecIdx=2 + ERSLaser_2 cid=0xBC8(Emitter) sz=0x1DC Recharge=1 Range=225 Damage=2 Type=3(Laser) Heat=1.5 Pip=2 PipColor=(1.0, 0.0, 0.0) PipExt=1 | GraphicLen=2000 DischargeTime=0.2 SeekV=['0.6', '0.7', '0.8', '0.99', '-1'] RecIdx=2 + LRM15 cid=0xBD0(MissileLauncher) sz=0x1E0 Recharge=6 Range=6000 Damage=50 Type=2(Explosive) Heat=6.5e+07 Pip=1 PipColor=(0.0, 1.0, 0.0) PipExt=1 | TracerInt=1 AmmoBin=27 MinTOF=0.5 MinVolt%=0.3 MinJam=0.05 | MissileCount=15 MuzzleVel=(0.0, 0.0, 30.0) +--- chain 7 @0x12d01f n=31 nearest-name=(1199851, 'thor') roster=['HeatSink', 'Reservoir', 'Condenser1', 'Condenser2', 'Condenser3', 'Condenser4', 'Condenser5', 'Condenser6', 'GeneratorA', 'GeneratorB', 'GeneratorC', 'GeneratorD', 'Avionics', 'Myomers', 'Gyroscope', 'Torso', 'HUD', 'Searchlight', 'ThermalSight', 'AmmoBinAFC25_1', 'AFC25_1', 'AmmoBinAFC25_2', 'AFC25_2', 'LLaser_1', 'LLaser_2', 'ERSLaser_1', 'ERSLaser_2', 'ERSLaser_3', 'ERSLaser_4', 'AmmoBinLRM10', 'LRM10'] + AFC25_1 cid=0xBCD(MechWeapon/Projectile) sz=0x1D0 Recharge=2 Range=900 Damage=7 Type=1(Ballistic) Heat=1.5e+06 Pip=1 PipColor=(1.0, 0.5, 0.0) PipExt=0 | TracerInt=1 AmmoBin=21 MinTOF=1e+06 MinVolt%=0.3 MinJam=0.05 + AFC25_2 cid=0xBCD(MechWeapon/Projectile) sz=0x1D0 Recharge=2 Range=900 Damage=7 Type=1(Ballistic) Heat=1.5e+06 Pip=2 PipColor=(1.0, 0.5, 0.0) PipExt=0 | TracerInt=1 AmmoBin=23 MinTOF=1e+06 MinVolt%=0.3 MinJam=0.05 + LLaser_1 cid=0xBC8(Emitter) sz=0x1DC Recharge=4 Range=600 Damage=5 Type=3(Laser) Heat=6 Pip=1 PipColor=(1.0, 0.0, 0.0) PipExt=0 | GraphicLen=2000 DischargeTime=0.2 SeekV=['0.6', '0.7', '0.8', '0.99', '-1'] RecIdx=2 + LLaser_2 cid=0xBC8(Emitter) sz=0x1DC Recharge=4 Range=600 Damage=5 Type=3(Laser) Heat=6 Pip=2 PipColor=(1.0, 0.0, 0.0) PipExt=0 | GraphicLen=2000 DischargeTime=0.2 SeekV=['0.6', '0.7', '0.8', '0.99', '-1'] RecIdx=2 + ERSLaser_1 cid=0xBC8(Emitter) sz=0x1DC Recharge=1 Range=225 Damage=2 Type=3(Laser) Heat=1.5 Pip=1 PipColor=(1.0, 0.0, 0.0) PipExt=1 | GraphicLen=2000 DischargeTime=0.2 SeekV=['0.6', '0.7', '0.8', '0.99', '-1'] RecIdx=2 + ERSLaser_2 cid=0xBC8(Emitter) sz=0x1DC Recharge=1 Range=225 Damage=2 Type=3(Laser) Heat=1.5 Pip=2 PipColor=(1.0, 0.0, 0.0) PipExt=1 | GraphicLen=2000 DischargeTime=0.2 SeekV=['0.6', '0.7', '0.8', '0.99', '-1'] RecIdx=2 + ERSLaser_3 cid=0xBC8(Emitter) sz=0x1DC Recharge=1 Range=225 Damage=2 Type=3(Laser) Heat=1.5 Pip=3 PipColor=(1.0, 0.0, 0.0) PipExt=1 | GraphicLen=2000 DischargeTime=0.2 SeekV=['0.6', '0.7', '0.8', '0.99', '-1'] RecIdx=2 + ERSLaser_4 cid=0xBC8(Emitter) sz=0x1DC Recharge=1 Range=225 Damage=2 Type=3(Laser) Heat=1.5 Pip=4 PipColor=(1.0, 0.0, 0.0) PipExt=1 | GraphicLen=2000 DischargeTime=0.2 SeekV=['0.6', '0.7', '0.8', '0.99', '-1'] RecIdx=2 + LRM10 cid=0xBD0(MissileLauncher) sz=0x1E0 Recharge=4 Range=6000 Damage=20 Type=2(Explosive) Heat=4.5e+07 Pip=1 PipColor=(0.0, 1.0, 0.0) PipExt=1 | TracerInt=1 AmmoBin=31 MinTOF=0.5 MinVolt%=0.3 MinJam=0.05 | MissileCount=10 MuzzleVel=(0.0, 0.0, 30.0) +--- chain 8 @0x14c7f9 n=32 nearest-name=(1361717, 'blh') roster=['HeatSink', 'Reservoir', 'Condenser1', 'Condenser2', 'Condenser3', 'Condenser4', 'Condenser5', 'Condenser6', 'GeneratorA', 'GeneratorB', 'GeneratorC', 'GeneratorD', 'Avionics', 'Myomers', 'Gyroscope', 'Torso', 'HUD', 'Searchlight', 'ThermalSight', 'Searchlight2', 'ERLLaser', 'ERMLaser_1', 'ERMLaser_2', 'ERMLaser_3', 'ERMLaser_4', 'ERMLaser_5', 'ERSLaser_1', 'ERSLaser_2', 'AmmoBinSRM6_1', 'SRM6_1', 'AmmoBinSRM6_2', 'SRM6_2'] + ERLLaser cid=0xBC8(Emitter) sz=0x1DC Recharge=4 Range=750 Damage=6 Type=3(Laser) Heat=8.5 Pip=1 PipColor=(1.0, 0.0, 0.0) PipExt=1 | GraphicLen=2000 DischargeTime=0.2 SeekV=['0.6', '0.7', '0.8', '0.99', '-1'] RecIdx=2 + ERMLaser_1 cid=0xBC8(Emitter) sz=0x1DC Recharge=2 Range=500 Damage=3.5 Type=3(Laser) Heat=3.5 Pip=1 PipColor=(1.0, 0.0, 0.0) PipExt=1 | GraphicLen=2000 DischargeTime=0.2 SeekV=['0.6', '0.7', '0.8', '0.99', '-1'] RecIdx=2 + ERMLaser_2 cid=0xBC8(Emitter) sz=0x1DC Recharge=2 Range=500 Damage=3.5 Type=3(Laser) Heat=3.5 Pip=1 PipColor=(1.0, 0.0, 0.0) PipExt=1 | GraphicLen=2000 DischargeTime=0.2 SeekV=['0.6', '0.7', '0.8', '0.99', '-1'] RecIdx=2 + ERMLaser_3 cid=0xBC8(Emitter) sz=0x1DC Recharge=2 Range=500 Damage=3.5 Type=3(Laser) Heat=3.5 Pip=2 PipColor=(1.0, 0.0, 0.0) PipExt=1 | GraphicLen=2000 DischargeTime=0.2 SeekV=['0.6', '0.7', '0.8', '0.99', '-1'] RecIdx=2 + ERMLaser_4 cid=0xBC8(Emitter) sz=0x1DC Recharge=2 Range=500 Damage=3.5 Type=3(Laser) Heat=3.5 Pip=2 PipColor=(1.0, 0.0, 0.0) PipExt=1 | GraphicLen=2000 DischargeTime=0.2 SeekV=['0.6', '0.7', '0.8', '0.99', '-1'] RecIdx=2 + ERMLaser_5 cid=0xBC8(Emitter) sz=0x1DC Recharge=2 Range=500 Damage=3.5 Type=3(Laser) Heat=3.5 Pip=3 PipColor=(1.0, 0.0, 0.0) PipExt=1 | GraphicLen=2000 DischargeTime=0.2 SeekV=['0.6', '0.7', '0.8', '0.99', '-1'] RecIdx=2 + ERSLaser_1 cid=0xBC8(Emitter) sz=0x1DC Recharge=1 Range=225 Damage=2 Type=3(Laser) Heat=1.5 Pip=1 PipColor=(1.0, 0.0, 0.0) PipExt=1 | GraphicLen=2000 DischargeTime=0.2 SeekV=['0.6', '0.7', '0.8', '0.99', '-1'] RecIdx=2 + ERSLaser_2 cid=0xBC8(Emitter) sz=0x1DC Recharge=1 Range=225 Damage=2 Type=3(Laser) Heat=1.5 Pip=2 PipColor=(1.0, 0.0, 0.0) PipExt=1 | GraphicLen=2000 DischargeTime=0.2 SeekV=['0.6', '0.7', '0.8', '0.99', '-1'] RecIdx=2 + SRM6_1 cid=0xBD0(MissileLauncher) sz=0x1E0 Recharge=5 Range=800 Damage=50 Type=2(Explosive) Heat=5e+07 Pip=1 PipColor=(0.6000000238418579, 0.4000000059604645, 0.0) PipExt=0 | TracerInt=1 AmmoBin=30 MinTOF=0.5 MinVolt%=0.3 MinJam=0.05 | MissileCount=6 MuzzleVel=(0.0, 0.0, 100.0) + SRM6_2 cid=0xBD0(MissileLauncher) sz=0x1E0 Recharge=5 Range=800 Damage=50 Type=2(Explosive) Heat=5e+07 Pip=2 PipColor=(0.6000000238418579, 0.4000000059604645, 0.0) PipExt=0 | TracerInt=1 AmmoBin=32 MinTOF=0.5 MinVolt%=0.3 MinJam=0.05 | MissileCount=6 MuzzleVel=(0.0, 0.0, 100.0) +--- chain 9 @0x173682 n=29 nearest-name=(1521230, 'bhk') roster=['HeatSink', 'Reservoir', 'Condenser1', 'Condenser2', 'Condenser3', 'Condenser4', 'Condenser5', 'Condenser6', 'GeneratorA', 'GeneratorB', 'GeneratorC', 'GeneratorD', 'Avionics', 'Myomers', 'Gyroscope', 'Torso', 'HUD', 'Searchlight', 'ThermalSight', 'Searchlight2', 'PPC_1', 'PPC_2', 'ERMLaser_1', 'ERMLaser_2', 'ERMLaser_3', 'AmmoBinSRM6_1', 'SRM6_1', 'AmmoBinSRM6_2', 'SRM6_2'] + PPC_1 cid=0xBD4(PPC) sz=0x1DC Recharge=5 Range=900 Damage=12 Type=4(Energy) Heat=11 Pip=1 PipColor=(0.0, 0.0, 1.0) PipExt=0 | GraphicLen=2000 DischargeTime=0.2 SeekV=['0.6', '0.7', '0.8', '0.99', '-1'] RecIdx=2 + PPC_2 cid=0xBD4(PPC) sz=0x1DC Recharge=5 Range=900 Damage=12 Type=4(Energy) Heat=11 Pip=2 PipColor=(0.0, 0.0, 1.0) PipExt=0 | GraphicLen=2000 DischargeTime=0.2 SeekV=['0.6', '0.7', '0.8', '0.99', '-1'] RecIdx=2 + ERMLaser_1 cid=0xBC8(Emitter) sz=0x1DC Recharge=2 Range=500 Damage=3.5 Type=3(Laser) Heat=3.5 Pip=1 PipColor=(1.0, 0.0, 0.0) PipExt=1 | GraphicLen=2000 DischargeTime=0.2 SeekV=['0.6', '0.7', '0.8', '0.99', '-1'] RecIdx=2 + ERMLaser_2 cid=0xBC8(Emitter) sz=0x1DC Recharge=2 Range=500 Damage=3.5 Type=3(Laser) Heat=3.5 Pip=1 PipColor=(1.0, 0.0, 0.0) PipExt=1 | GraphicLen=2000 DischargeTime=0.2 SeekV=['0.6', '0.7', '0.8', '0.99', '-1'] RecIdx=2 + ERMLaser_3 cid=0xBC8(Emitter) sz=0x1DC Recharge=2 Range=500 Damage=3.5 Type=3(Laser) Heat=3.5 Pip=2 PipColor=(1.0, 0.0, 0.0) PipExt=1 | GraphicLen=2000 DischargeTime=0.2 SeekV=['0.6', '0.7', '0.8', '0.99', '-1'] RecIdx=2 + SRM6_1 cid=0xBD0(MissileLauncher) sz=0x1E0 Recharge=5 Range=800 Damage=35 Type=2(Explosive) Heat=5e+07 Pip=1 PipColor=(0.6000000238418579, 0.4000000059604645, 0.0) PipExt=0 | TracerInt=1 AmmoBin=27 MinTOF=0.5 MinVolt%=0.3 MinJam=0.05 | MissileCount=6 MuzzleVel=(0.0, 0.0, 100.0) + SRM6_2 cid=0xBD0(MissileLauncher) sz=0x1E0 Recharge=5 Range=800 Damage=35 Type=2(Explosive) Heat=5e+07 Pip=2 PipColor=(0.6000000238418579, 0.4000000059604645, 0.0) PipExt=0 | TracerInt=1 AmmoBin=29 MinTOF=0.5 MinVolt%=0.3 MinJam=0.05 | MissileCount=6 MuzzleVel=(0.0, 0.0, 100.0) +--- chain 10 @0x19a1a4 n=29 nearest-name=(1679728, 'owens') roster=['HeatSink', 'Reservoir', 'Condenser1', 'Condenser2', 'Condenser3', 'Condenser4', 'Condenser5', 'Condenser6', 'GeneratorA', 'GeneratorB', 'GeneratorC', 'GeneratorD', 'Avionics', 'Myomers', 'Gyroscope', 'Torso', 'HUD', 'Searchlight', 'ThermalSight', 'ERMLaser_1', 'ERMLaser_2', 'ERSLaser_1', 'ERSLaser_2', 'ERSLaser_3', 'ERSLaser_4', 'AmmoBinSRM6_1', 'SRM6_1', 'AmmoBinSRM6_2', 'SRM6_2'] + ERMLaser_1 cid=0xBC8(Emitter) sz=0x1DC Recharge=2 Range=500 Damage=3.5 Type=3(Laser) Heat=3.5 Pip=1 PipColor=(1.0, 0.0, 0.0) PipExt=1 | GraphicLen=2000 DischargeTime=0.2 SeekV=['0.6', '0.7', '0.8', '0.99', '-1'] RecIdx=2 + ERMLaser_2 cid=0xBC8(Emitter) sz=0x1DC Recharge=2 Range=500 Damage=3.5 Type=3(Laser) Heat=3.5 Pip=2 PipColor=(1.0, 0.0, 0.0) PipExt=1 | GraphicLen=2000 DischargeTime=0.2 SeekV=['0.6', '0.7', '0.8', '0.99', '-1'] RecIdx=2 + ERSLaser_1 cid=0xBC8(Emitter) sz=0x1DC Recharge=1 Range=225 Damage=2 Type=3(Laser) Heat=1.5 Pip=1 PipColor=(1.0, 0.0, 0.0) PipExt=1 | GraphicLen=2000 DischargeTime=0.2 SeekV=['0.6', '0.7', '0.8', '0.99', '-1'] RecIdx=2 + ERSLaser_2 cid=0xBC8(Emitter) sz=0x1DC Recharge=1 Range=225 Damage=2 Type=3(Laser) Heat=1.5 Pip=2 PipColor=(1.0, 0.0, 0.0) PipExt=1 | GraphicLen=2000 DischargeTime=0.2 SeekV=['0.6', '0.7', '0.8', '0.99', '-1'] RecIdx=2 + ERSLaser_3 cid=0xBC8(Emitter) sz=0x1DC Recharge=1 Range=225 Damage=2 Type=3(Laser) Heat=1.5 Pip=3 PipColor=(1.0, 0.0, 0.0) PipExt=1 | GraphicLen=2000 DischargeTime=0.2 SeekV=['0.6', '0.7', '0.8', '0.99', '-1'] RecIdx=2 + ERSLaser_4 cid=0xBC8(Emitter) sz=0x1DC Recharge=1 Range=225 Damage=2 Type=3(Laser) Heat=1.5 Pip=4 PipColor=(1.0, 0.0, 0.0) PipExt=1 | GraphicLen=2000 DischargeTime=0.2 SeekV=['0.6', '0.7', '0.8', '0.99', '-1'] RecIdx=2 + SRM6_1 cid=0xBD0(MissileLauncher) sz=0x1E0 Recharge=5 Range=800 Damage=50 Type=2(Explosive) Heat=5e+07 Pip=1 PipColor=(0.6000000238418579, 0.4000000059604645, 0.0) PipExt=0 | TracerInt=1 AmmoBin=27 MinTOF=0.5 MinVolt%=0.3 MinJam=0.05 | MissileCount=6 MuzzleVel=(0.0, 0.0, 100.0) + SRM6_2 cid=0xBD0(MissileLauncher) sz=0x1E0 Recharge=5 Range=800 Damage=50 Type=2(Explosive) Heat=5e+07 Pip=2 PipColor=(0.6000000238418579, 0.4000000059604645, 0.0) PipExt=0 | TracerInt=1 AmmoBin=29 MinTOF=0.5 MinVolt%=0.3 MinJam=0.05 | MissileCount=6 MuzzleVel=(0.0, 0.0, 100.0) +--- chain 11 @0x1ba20d n=27 nearest-name=(1783489, 'owens') roster=['HeatSink', 'Reservoir', 'Condenser1', 'Condenser2', 'Condenser3', 'Condenser4', 'Condenser5', 'Condenser6', 'GeneratorA', 'GeneratorB', 'GeneratorC', 'GeneratorD', 'Avionics', 'Myomers', 'Gyroscope', 'Torso', 'HUD', 'Searchlight', 'ThermalSight', 'AmmoBinAFC25', 'AFC25', 'ERMLaser', 'ERSLaser', 'AmmoBinNRK5_1', 'NRK5_1', 'AmmoBinNRK5_2', 'NRK5_2'] + AFC25 cid=0xBCD(MechWeapon/Projectile) sz=0x1D0 Recharge=2 Range=900 Damage=7 Type=1(Ballistic) Heat=1.5e+06 Pip=1 PipColor=(1.0, 0.5, 0.0) PipExt=0 | TracerInt=1 AmmoBin=21 MinTOF=1e+06 MinVolt%=0.3 MinJam=0.05 + ERMLaser cid=0xBC8(Emitter) sz=0x1DC Recharge=2 Range=500 Damage=3.5 Type=3(Laser) Heat=3.5 Pip=1 PipColor=(1.0, 0.0, 0.0) PipExt=1 | GraphicLen=2000 DischargeTime=0.2 SeekV=['0.6', '0.7', '0.8', '0.99', '-1'] RecIdx=2 + ERSLaser cid=0xBC8(Emitter) sz=0x1DC Recharge=1 Range=225 Damage=2 Type=3(Laser) Heat=1.5 Pip=1 PipColor=(1.0, 0.0, 0.0) PipExt=1 | GraphicLen=2000 DischargeTime=0.2 SeekV=['0.6', '0.7', '0.8', '0.99', '-1'] RecIdx=2 + NRK5_1 cid=0xBD0(MissileLauncher) sz=0x1E0 Recharge=2.5 Range=6000 Damage=10 Type=2(Explosive) Heat=1.5e+07 Pip=1 PipColor=(0.0, 1.0, 0.0) PipExt=1 | TracerInt=1 AmmoBin=25 MinTOF=0.5 MinVolt%=0.3 MinJam=0.05 | MissileCount=5 MuzzleVel=(0.0, 5.0, 30.0) + NRK5_2 cid=0xBD0(MissileLauncher) sz=0x1E0 Recharge=2.5 Range=6000 Damage=10 Type=2(Explosive) Heat=1.5e+07 Pip=2 PipColor=(0.0, 1.0, 0.0) PipExt=1 | TracerInt=1 AmmoBin=27 MinTOF=0.5 MinVolt%=0.3 MinJam=0.05 | MissileCount=5 MuzzleVel=(0.0, 5.0, 30.0) +--- chain 12 @0x1da7f8 n=29 nearest-name=(1943492, 'vulture') roster=['HeatSink', 'Reservoir', 'Condenser1', 'Condenser2', 'Condenser3', 'Condenser4', 'Condenser5', 'Condenser6', 'GeneratorA', 'GeneratorB', 'GeneratorC', 'GeneratorD', 'Avionics', 'Myomers', 'Gyroscope', 'Torso', 'HUD', 'Searchlight', 'ThermalSight', 'LLaser_1', 'LLaser_2', 'ERSLaser_1', 'ERSLaser_2', 'ERMLaser_1', 'ERMLaser_2', 'AmmoBinLRM20_1', 'LRM20_1', 'AmmoBinLRM20_2', 'LRM20_2'] + LLaser_1 cid=0xBC8(Emitter) sz=0x1DC Recharge=4 Range=600 Damage=5 Type=3(Laser) Heat=6 Pip=1 PipColor=(1.0, 0.0, 0.0) PipExt=0 | GraphicLen=2000 DischargeTime=0.2 SeekV=['0.6', '0.7', '0.8', '0.99', '-1'] RecIdx=2 + LLaser_2 cid=0xBC8(Emitter) sz=0x1DC Recharge=4 Range=600 Damage=5 Type=3(Laser) Heat=6 Pip=2 PipColor=(1.0, 0.0, 0.0) PipExt=0 | GraphicLen=2000 DischargeTime=0.2 SeekV=['0.6', '0.7', '0.8', '0.99', '-1'] RecIdx=2 + ERSLaser_1 cid=0xBC8(Emitter) sz=0x1DC Recharge=1 Range=225 Damage=2 Type=3(Laser) Heat=1.5 Pip=1 PipColor=(1.0, 0.0, 0.0) PipExt=1 | GraphicLen=2000 DischargeTime=0.2 SeekV=['0.6', '0.7', '0.8', '0.99', '-1'] RecIdx=2 + ERSLaser_2 cid=0xBC8(Emitter) sz=0x1DC Recharge=1 Range=225 Damage=2 Type=3(Laser) Heat=1.5 Pip=2 PipColor=(1.0, 0.0, 0.0) PipExt=1 | GraphicLen=2000 DischargeTime=0.2 SeekV=['0.6', '0.7', '0.8', '0.99', '-1'] RecIdx=2 + ERMLaser_1 cid=0xBC8(Emitter) sz=0x1DC Recharge=2 Range=500 Damage=3.5 Type=3(Laser) Heat=3.5 Pip=1 PipColor=(1.0, 0.0, 0.0) PipExt=1 | GraphicLen=2000 DischargeTime=0.2 SeekV=['0.6', '0.7', '0.8', '0.99', '-1'] RecIdx=2 + ERMLaser_2 cid=0xBC8(Emitter) sz=0x1DC Recharge=2 Range=500 Damage=3.5 Type=3(Laser) Heat=3.5 Pip=2 PipColor=(1.0, 0.0, 0.0) PipExt=1 | GraphicLen=2000 DischargeTime=0.2 SeekV=['0.6', '0.7', '0.8', '0.99', '-1'] RecIdx=2 + LRM20_1 cid=0xBD0(MissileLauncher) sz=0x1E0 Recharge=9 Range=6000 Damage=65 Type=2(Explosive) Heat=9.5e+07 Pip=1 PipColor=(0.0, 1.0, 0.0) PipExt=1 | TracerInt=1 AmmoBin=27 MinTOF=0.5 MinVolt%=0.3 MinJam=0.05 | MissileCount=20 MuzzleVel=(0.0, 5.0, 30.0) + LRM20_2 cid=0xBD0(MissileLauncher) sz=0x1E0 Recharge=9 Range=6000 Damage=65 Type=2(Explosive) Heat=9.5e+07 Pip=2 PipColor=(0.0, 1.0, 0.0) PipExt=1 | TracerInt=1 AmmoBin=29 MinTOF=0.5 MinVolt%=0.3 MinJam=0.05 | MissileCount=20 MuzzleVel=(0.0, 5.0, 30.0) +--- chain 13 @0x206207 n=29 nearest-name=(2092273, 'vulture') roster=['HeatSink', 'Reservoir', 'Condenser1', 'Condenser2', 'Condenser3', 'Condenser4', 'Condenser5', 'Condenser6', 'GeneratorA', 'GeneratorB', 'GeneratorC', 'GeneratorD', 'Avionics', 'Myomers', 'Gyroscope', 'Torso', 'HUD', 'Searchlight', 'ThermalSight', 'PPC_1', 'PPC_2', 'ERSLaser_1', 'ERSLaser_2', 'ERSLaser_3', 'ERSLaser_4', 'AmmoBinLRM15_1', 'LRM15_1', 'AmmoBinLRM15_2', 'LRM15_2'] + PPC_1 cid=0xBD4(PPC) sz=0x1DC Recharge=5 Range=900 Damage=12 Type=4(Energy) Heat=11 Pip=1 PipColor=(0.0, 0.0, 1.0) PipExt=0 | GraphicLen=2000 DischargeTime=0.2 SeekV=['0.6', '0.7', '0.8', '0.99', '-1'] RecIdx=2 + PPC_2 cid=0xBD4(PPC) sz=0x1DC Recharge=5 Range=900 Damage=12 Type=4(Energy) Heat=11 Pip=2 PipColor=(0.0, 0.0, 1.0) PipExt=0 | GraphicLen=2000 DischargeTime=0.2 SeekV=['0.6', '0.7', '0.8', '0.99', '-1'] RecIdx=2 + ERSLaser_1 cid=0xBC8(Emitter) sz=0x1DC Recharge=1 Range=225 Damage=2 Type=3(Laser) Heat=1.5 Pip=1 PipColor=(1.0, 0.0, 0.0) PipExt=1 | GraphicLen=2000 DischargeTime=0.2 SeekV=['0.6', '0.7', '0.8', '0.99', '-1'] RecIdx=2 + ERSLaser_2 cid=0xBC8(Emitter) sz=0x1DC Recharge=1 Range=225 Damage=2 Type=3(Laser) Heat=1.5 Pip=2 PipColor=(1.0, 0.0, 0.0) PipExt=1 | GraphicLen=2000 DischargeTime=0.2 SeekV=['0.6', '0.7', '0.8', '0.99', '-1'] RecIdx=2 + ERSLaser_3 cid=0xBC8(Emitter) sz=0x1DC Recharge=1 Range=225 Damage=2 Type=3(Laser) Heat=1.5 Pip=3 PipColor=(1.0, 0.0, 0.0) PipExt=1 | GraphicLen=2000 DischargeTime=0.2 SeekV=['0.6', '0.7', '0.8', '0.99', '-1'] RecIdx=2 + ERSLaser_4 cid=0xBC8(Emitter) sz=0x1DC Recharge=1 Range=225 Damage=2 Type=3(Laser) Heat=1.5 Pip=4 PipColor=(1.0, 0.0, 0.0) PipExt=1 | GraphicLen=2000 DischargeTime=0.2 SeekV=['0.6', '0.7', '0.8', '0.99', '-1'] RecIdx=2 + LRM15_1 cid=0xBD0(MissileLauncher) sz=0x1E0 Recharge=6 Range=6000 Damage=35 Type=2(Explosive) Heat=6.5e+07 Pip=1 PipColor=(0.0, 1.0, 0.0) PipExt=1 | TracerInt=1 AmmoBin=27 MinTOF=0.5 MinVolt%=0.3 MinJam=0.05 | MissileCount=15 MuzzleVel=(0.0, 5.0, 30.0) + LRM15_2 cid=0xBD0(MissileLauncher) sz=0x1E0 Recharge=6 Range=6000 Damage=35 Type=2(Explosive) Heat=6.5e+07 Pip=2 PipColor=(0.0, 1.0, 0.0) PipExt=1 | TracerInt=1 AmmoBin=29 MinTOF=0.5 MinVolt%=0.3 MinJam=0.05 | MissileCount=15 MuzzleVel=(0.0, 5.0, 30.0) +--- chain 14 @0x232962 n=31 nearest-name=(2304302, 'avatar') roster=['HeatSink', 'Reservoir', 'Condenser1', 'Condenser2', 'Condenser3', 'Condenser4', 'Condenser5', 'Condenser6', 'GeneratorA', 'GeneratorB', 'GeneratorC', 'GeneratorD', 'Avionics', 'Myomers', 'Gyroscope', 'Torso', 'HUD', 'Searchlight', 'ThermalSight', 'AmmoBinAFC50', 'AFC50', 'ERLLaser_1', 'ERLLaser_2', 'ERMLaser_1', 'ERMLaser_2', 'ERMLaser_3', 'ERMLaser_4', 'AmmoBinLRM10_1', 'LRM10_1', 'AmmoBinLRM10_2', 'LRM10_2'] + AFC50 cid=0xBCD(MechWeapon/Projectile) sz=0x1D0 Recharge=4 Range=750 Damage=13 Type=1(Ballistic) Heat=2e+07 Pip=1 PipColor=(1.0, 0.5, 0.0) PipExt=0 | TracerInt=1 AmmoBin=21 MinTOF=1e+06 MinVolt%=0.3 MinJam=0.05 + ERLLaser_1 cid=0xBC8(Emitter) sz=0x1DC Recharge=4 Range=750 Damage=6 Type=3(Laser) Heat=8.5 Pip=2 PipColor=(1.0, 0.0, 0.0) PipExt=1 | GraphicLen=2000 DischargeTime=0.2 SeekV=['0.6', '0.7', '0.8', '0.99', '-1'] RecIdx=2 + ERLLaser_2 cid=0xBC8(Emitter) sz=0x1DC Recharge=4 Range=750 Damage=6 Type=3(Laser) Heat=8.5 Pip=3 PipColor=(1.0, 0.0, 0.0) PipExt=1 | GraphicLen=2000 DischargeTime=0.2 SeekV=['0.6', '0.7', '0.8', '0.99', '-1'] RecIdx=2 + ERMLaser_1 cid=0xBC8(Emitter) sz=0x1DC Recharge=2 Range=500 Damage=3.5 Type=3(Laser) Heat=3.5 Pip=1 PipColor=(1.0, 0.0, 0.0) PipExt=1 | GraphicLen=2000 DischargeTime=0.2 SeekV=['0.6', '0.7', '0.8', '0.99', '-1'] RecIdx=2 + ERMLaser_2 cid=0xBC8(Emitter) sz=0x1DC Recharge=2 Range=500 Damage=3.5 Type=3(Laser) Heat=3.5 Pip=2 PipColor=(1.0, 0.0, 0.0) PipExt=1 | GraphicLen=2000 DischargeTime=0.2 SeekV=['0.6', '0.7', '0.8', '0.99', '-1'] RecIdx=2 + ERMLaser_3 cid=0xBC8(Emitter) sz=0x1DC Recharge=2 Range=500 Damage=3.5 Type=3(Laser) Heat=3.5 Pip=3 PipColor=(1.0, 0.0, 0.0) PipExt=1 | GraphicLen=2000 DischargeTime=0.2 SeekV=['0.6', '0.7', '0.8', '0.99', '-1'] RecIdx=2 + ERMLaser_4 cid=0xBC8(Emitter) sz=0x1DC Recharge=2 Range=500 Damage=3.5 Type=3(Laser) Heat=3.5 Pip=4 PipColor=(1.0, 0.0, 0.0) PipExt=1 | GraphicLen=2000 DischargeTime=0.2 SeekV=['0.6', '0.7', '0.8', '0.99', '-1'] RecIdx=2 + LRM10_1 cid=0xBD0(MissileLauncher) sz=0x1E0 Recharge=4 Range=6000 Damage=35 Type=2(Explosive) Heat=4.5e+07 Pip=1 PipColor=(0.0, 1.0, 0.0) PipExt=1 | TracerInt=1 AmmoBin=29 MinTOF=0.5 MinVolt%=0.3 MinJam=0.05 | MissileCount=10 MuzzleVel=(0.0, 5.0, 30.0) + LRM10_2 cid=0xBD0(MissileLauncher) sz=0x1E0 Recharge=4 Range=6000 Damage=35 Type=2(Explosive) Heat=4.5e+07 Pip=2 PipColor=(0.0, 1.0, 0.0) PipExt=1 | TracerInt=1 AmmoBin=31 MinTOF=0.5 MinVolt%=0.3 MinJam=0.05 | MissileCount=10 MuzzleVel=(0.0, 5.0, 30.0) +--- chain 15 @0x25eb7a n=28 nearest-name=(2455601, 'avatar') roster=['HeatSink', 'Reservoir', 'Condenser1', 'Condenser2', 'Condenser3', 'Condenser4', 'Condenser5', 'Condenser6', 'GeneratorA', 'GeneratorB', 'GeneratorC', 'GeneratorD', 'Avionics', 'Myomers', 'Gyroscope', 'Torso', 'HUD', 'Searchlight', 'ThermalSight', 'AmmoBinAFC100', 'AFC100', 'PPC', 'ERMLaser_1', 'ERMLaser_2', 'AmmoBinLRM5', 'LRM5', 'AmmoBinSRM2', 'SRM2'] + AFC100 cid=0xBCD(MechWeapon/Projectile) sz=0x1D0 Recharge=8 Range=400 Damage=25 Type=1(Ballistic) Heat=6.5e+07 Pip=1 PipColor=(1.0, 0.5, 0.0) PipExt=0 | TracerInt=1 AmmoBin=21 MinTOF=1e+06 MinVolt%=0.3 MinJam=0.05 + PPC cid=0xBD4(PPC) sz=0x1DC Recharge=5 Range=900 Damage=12 Type=4(Energy) Heat=11 Pip=1 PipColor=(0.0, 0.0, 1.0) PipExt=0 | GraphicLen=2000 DischargeTime=0.2 SeekV=['0.6', '0.7', '0.8', '0.99', '-1'] RecIdx=2 + ERMLaser_1 cid=0xBC8(Emitter) sz=0x1DC Recharge=2 Range=500 Damage=3.5 Type=3(Laser) Heat=3.5 Pip=1 PipColor=(1.0, 0.0, 0.0) PipExt=1 | GraphicLen=2000 DischargeTime=0.2 SeekV=['0.6', '0.7', '0.8', '0.99', '-1'] RecIdx=2 + ERMLaser_2 cid=0xBC8(Emitter) sz=0x1DC Recharge=2 Range=500 Damage=3.5 Type=3(Laser) Heat=3.5 Pip=2 PipColor=(1.0, 0.0, 0.0) PipExt=1 | GraphicLen=2000 DischargeTime=0.2 SeekV=['0.6', '0.7', '0.8', '0.99', '-1'] RecIdx=2 + LRM5 cid=0xBD0(MissileLauncher) sz=0x1E0 Recharge=2.5 Range=6000 Damage=10 Type=2(Explosive) Heat=1.5e+07 Pip=1 PipColor=(0.0, 1.0, 0.0) PipExt=1 | TracerInt=1 AmmoBin=26 MinTOF=0.5 MinVolt%=0.3 MinJam=0.05 | MissileCount=5 MuzzleVel=(0.0, 5.0, 30.0) + SRM2 cid=0xBD0(MissileLauncher) sz=0x1E0 Recharge=2 Range=800 Damage=10 Type=2(Explosive) Heat=1.5e+07 Pip=1 PipColor=(0.6000000238418579, 0.4000000059604645, 0.0) PipExt=0 | TracerInt=1 AmmoBin=28 MinTOF=0.5 MinVolt%=0.3 MinJam=0.05 | MissileCount=2 MuzzleVel=(0.0, 0.0, 100.0) +--- chain 16 @0x28b7f7 n=31 nearest-name=(2668483, 'sunder') roster=['HeatSink', 'Reservoir', 'Condenser1', 'Condenser2', 'Condenser3', 'Condenser4', 'Condenser5', 'Condenser6', 'GeneratorA', 'GeneratorB', 'GeneratorC', 'GeneratorD', 'Avionics', 'Myomers', 'Gyroscope', 'Torso', 'HUD', 'Searchlight', 'ThermalSight', 'AmmoBinAFC25', 'AFC25', 'AmmoBinAFC100', 'AFC100', 'ERMLaser_1', 'ERMLaser_2', 'ERSLaser_1', 'ERSLaser_2', 'MLaser_1', 'MLaser_2', 'AmmoBinLRM10', 'LRM10'] + AFC25 cid=0xBCD(MechWeapon/Projectile) sz=0x1D0 Recharge=2 Range=900 Damage=7 Type=1(Ballistic) Heat=1.5e+06 Pip=1 PipColor=(1.0, 0.5, 0.0) PipExt=0 | TracerInt=1 AmmoBin=21 MinTOF=1e+06 MinVolt%=0.3 MinJam=0.05 + AFC100 cid=0xBCD(MechWeapon/Projectile) sz=0x1D0 Recharge=8 Range=400 Damage=25 Type=1(Ballistic) Heat=6.5e+07 Pip=1 PipColor=(1.0, 0.5, 0.0) PipExt=0 | TracerInt=1 AmmoBin=23 MinTOF=1e+06 MinVolt%=0.3 MinJam=0.05 + ERMLaser_1 cid=0xBC8(Emitter) sz=0x1DC Recharge=2 Range=500 Damage=3.5 Type=3(Laser) Heat=3.5 Pip=1 PipColor=(1.0, 0.0, 0.0) PipExt=1 | GraphicLen=2000 DischargeTime=0.2 SeekV=['0.6', '0.7', '0.8', '0.99', '-1'] RecIdx=2 + ERMLaser_2 cid=0xBC8(Emitter) sz=0x1DC Recharge=2 Range=500 Damage=3.5 Type=3(Laser) Heat=3.5 Pip=2 PipColor=(1.0, 0.0, 0.0) PipExt=1 | GraphicLen=2000 DischargeTime=0.2 SeekV=['0.6', '0.7', '0.8', '0.99', '-1'] RecIdx=2 + ERSLaser_1 cid=0xBC8(Emitter) sz=0x1DC Recharge=1 Range=225 Damage=2 Type=3(Laser) Heat=1.5 Pip=1 PipColor=(1.0, 0.0, 0.0) PipExt=1 | GraphicLen=2000 DischargeTime=0.2 SeekV=['0.6', '0.7', '0.8', '0.99', '-1'] RecIdx=2 + ERSLaser_2 cid=0xBC8(Emitter) sz=0x1DC Recharge=1 Range=225 Damage=2 Type=3(Laser) Heat=1.5 Pip=2 PipColor=(1.0, 0.0, 0.0) PipExt=1 | GraphicLen=2000 DischargeTime=0.2 SeekV=['0.6', '0.7', '0.8', '0.99', '-1'] RecIdx=2 + MLaser_1 cid=0xBC8(Emitter) sz=0x1DC Recharge=2 Range=350 Damage=2.5 Type=3(Laser) Heat=2 Pip=1 PipColor=(1.0, 0.0, 0.0) PipExt=0 | GraphicLen=2000 DischargeTime=0.2 SeekV=['0.6', '0.7', '0.8', '0.99', '-1'] RecIdx=2 + MLaser_2 cid=0xBC8(Emitter) sz=0x1DC Recharge=2 Range=350 Damage=2.5 Type=3(Laser) Heat=2 Pip=2 PipColor=(1.0, 0.0, 0.0) PipExt=0 | GraphicLen=2000 DischargeTime=0.2 SeekV=['0.6', '0.7', '0.8', '0.99', '-1'] RecIdx=2 + LRM10 cid=0xBD0(MissileLauncher) sz=0x1E0 Recharge=4 Range=6000 Damage=35 Type=2(Explosive) Heat=4.5e+07 Pip=1 PipColor=(0.0, 1.0, 0.0) PipExt=1 | TracerInt=1 AmmoBin=31 MinTOF=0.5 MinVolt%=0.3 MinJam=0.05 | MissileCount=10 MuzzleVel=(0.0, 5.0, 30.0) +--- chain 17 @0x2a9d65 n=27 nearest-name=(2764479, 'sunder') roster=['HeatSink', 'Reservoir', 'Condenser1', 'Condenser2', 'Condenser3', 'Condenser4', 'Condenser5', 'Condenser6', 'GeneratorA', 'GeneratorB', 'GeneratorC', 'GeneratorD', 'Avionics', 'Myomers', 'Gyroscope', 'Torso', 'HUD', 'Searchlight', 'ThermalSight', 'PPC_1', 'PPC_2', 'PPC_3', 'AmmoBinAFC25', 'AFC25', 'ERSLaser', 'AmmoBinLRM5', 'LRM5'] + PPC_1 cid=0xBD4(PPC) sz=0x1DC Recharge=5 Range=900 Damage=12 Type=4(Energy) Heat=11 Pip=1 PipColor=(0.0, 0.0, 1.0) PipExt=0 | GraphicLen=2000 DischargeTime=0.2 SeekV=['0.6', '0.7', '0.8', '0.99', '-1'] RecIdx=2 + PPC_2 cid=0xBD4(PPC) sz=0x1DC Recharge=5 Range=900 Damage=12 Type=4(Energy) Heat=11 Pip=2 PipColor=(0.0, 0.0, 1.0) PipExt=0 | GraphicLen=2000 DischargeTime=0.2 SeekV=['0.6', '0.7', '0.8', '0.99', '-1'] RecIdx=2 + PPC_3 cid=0xBD4(PPC) sz=0x1DC Recharge=5 Range=900 Damage=12 Type=4(Energy) Heat=11 Pip=3 PipColor=(0.0, 0.0, 1.0) PipExt=0 | GraphicLen=2000 DischargeTime=0.2 SeekV=['0.6', '0.7', '0.8', '0.99', '-1'] RecIdx=2 + AFC25 cid=0xBCD(MechWeapon/Projectile) sz=0x1D0 Recharge=2 Range=900 Damage=7 Type=1(Ballistic) Heat=1.5e+06 Pip=4 PipColor=(1.0, 0.5, 0.0) PipExt=0 | TracerInt=1 AmmoBin=24 MinTOF=1e+06 MinVolt%=0.3 MinJam=0.05 + ERSLaser cid=0xBC8(Emitter) sz=0x1DC Recharge=1 Range=225 Damage=2 Type=3(Laser) Heat=1.5 Pip=1 PipColor=(1.0, 0.0, 0.0) PipExt=1 | GraphicLen=2000 DischargeTime=0.2 SeekV=['0.6', '0.7', '0.8', '0.99', '-1'] RecIdx=2 + LRM5 cid=0xBD0(MissileLauncher) sz=0x1E0 Recharge=2.5 Range=6000 Damage=10 Type=2(Explosive) Heat=1.5e+07 Pip=1 PipColor=(0.0, 1.0, 0.0) PipExt=1 | TracerInt=1 AmmoBin=27 MinTOF=0.5 MinVolt%=0.3 MinJam=0.05 | MissileCount=5 MuzzleVel=(0.0, 5.0, 30.0)