Combat: THE AUTHENTIC DAMAGE ECONOMY -- authored per-weapon amounts through the real fire chain (task #8)

Three root causes, all fixed:
1. kDamageScale was 1.0 -- _DAT_004bafbc is an x87 float80 = 1e-7, cancelling
   the ctor's x1e7: damagePortion = authored DamageAmount x (charge/seekV)^2
   (closed form at fire time; madcat AC=25/LRM=50/ERLL=6, bhk1 PPC=12/SRM=35).
   The observed "0.25" was the degenerate EC=1 fallback, never authored data.
2. CheckFireEdge NaN latch: TriggerState carries ControlsButton INTS; the
   release value (-65) is a negative NaN.  The binary's x87 unordered compare
   read it as "released"; IEEE-correct float compares latched the edge
   detector shut after the first release -- the reason the emitter discharge
   chain NEVER fired in-game.  Fixed with bit-pattern sign compares.
3. The weapon-side submission LIVE: Emitter::FireWeapon fills damageData
   (amount + damageForce=target-muzzle [the gyro directional-bounce feed] +
   impact) -> MechWeapon::SendDamageMessage (@004b9728 real body) ->
   messmgr consolidation with per-weapon records + explosion bundling.
   The mech4 bring-up damage block + flat kShotDamage retired to diag hooks.
Bonus: LODReuseHysteresis 0.82 -> 0.33 (double misread).  Zone model
verified byte-exact (no change).  Solo end-to-end: 5-record volleys (2 PPC
+ 3 ERML with authored amounts), per-weapon zone granularity, explosions,
kill.  Heat stays bring-up scale pending the heat-calibration audit [T3].

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
arcattack
2026-07-11 15:32:24 -05:00
co-authored by Claude Fable 5
parent 77190c93e5
commit fd055281a8
17 changed files with 654 additions and 75 deletions
+23 -2
View File
@@ -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 = targetmuzzle → 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);
+13
View File
@@ -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();
}
+8
View File
@@ -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;
}
}
}
+62 -8
View File
@@ -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
+35 -46
View File
@@ -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.
+4 -1
View File
@@ -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)
//###########################################################################
+64 -17
View File
@@ -58,6 +58,7 @@
//
#include <bt.hpp>
#include <messmgr.hpp> // 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);
}
}
+3 -1
View File
@@ -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
+15
View File
@@ -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)
+13
View File
@@ -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)
+12
View File
@@ -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}")
+14
View File
@@ -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
+70
View File
@@ -0,0 +1,70 @@
import struct, sys
data = open(r'C:\git\bt411\content\BTL4.RES', 'rb').read()
labOnly, maxID = struct.unpack_from('<ii', data, 4)
offs = struct.unpack_from('<%dI' % maxID, data, 12)
# ResourcePhysicalFormat: id i32, type i32, name[32], prio i32, flags i32, offset i32, length i32
recs = []
for o in offs:
if o == 0: continue
rid, rt = struct.unpack_from('<ii', data, o)
nm = data[o+8:o+40].split(b'\0')[0].decode('ascii','replace')
prio, flags, roff, rlen = struct.unpack_from('<iiII', data, o+40)
recs.append((rid, rt, nm, roff, rlen))
DZ = [r for r in recs if r[1] == 20]
print('type-0x14 DamageZoneStream resources:')
for r in DZ:
print(' id=%d name=%r off=0x%x len=%d' % (r[0], r[2], r[3], r[4]))
def parse_zone_stream(buf, tag):
p = 0
def i32():
nonlocal p
v = struct.unpack_from('<i', buf, p)[0]; p += 4; return v
def f32():
nonlocal p
v = struct.unpack_from('<f', buf, p)[0]; p += 4; return v
def cstr():
nonlocal p
n = i32()
s = buf[p:p+n].decode('ascii','replace'); p += n + 1
return s
count = i32()
print('\n===== %s: zoneCount=%d streamLen=%d =====' % (tag, count, len(buf)))
for z in range(count):
name = cstr()
sites = []
for j in range(5):
c = i32()
sites.append([i32() for _ in range(c)])
dap = f32()
scales = [f32() for _ in range(5)]
sklcount = i32()
mats = []
for s in range(sklcount):
styp = i32()
mc = i32()
names = [cstr() for _ in range(mc)]
mats.append((styp, names))
descend = i32(); sibs = i32(); segidx = i32()
lleg = i32(); rleg = i32(); vital = i32(); ncrit = i32()
crits = []
for c in range(ncrit):
w = f32(); pct = f32(); sidx = i32()
crits.append((w, pct, sidx))
nred = i32()
redirects = [i32() for _ in range(nred)]
# implied per-type armor points: scale = 1/points -> 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))
+39
View File
@@ -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("<I", data, 0x3c)[0]
nsec = struct.unpack_from("<H", data, pe+6)[0]
opt=pe+24; szopt=struct.unpack_from("<H",data,pe+20)[0]; sec0=opt+szopt
for i in range(nsec):
off=sec0+i*40
name=data[off:off+8].rstrip(b"\0").decode()
vsz,va,rsz,ra=struct.unpack_from("<IIII",data,off+8)
if name=="CODE": code_rsz=rsz
start=0
hits=[]
while True:
idx = data.find(pat, start)
if idx<0: break
start=idx+1
if not (CODE_RA <= idx < CODE_RA+code_rsz): continue
va = CODE_VA + (idx - CODE_RA)
# try disassembling from a few candidate starts before the disp
for back in range(2,9):
chunk = data[idx-back: idx-back+16]
insns = list(md.disasm(chunk, va-back))
if insns:
i0 = insns[0]
if "0x434" in i0.op_str and i0.address+i0.size >= 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}")
+31
View File
@@ -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("<I", data, 0x3c)[0]
nsec = struct.unpack_from("<H", data, pe+6)[0]
opt=pe+24; szopt=struct.unpack_from("<H",data,pe+20)[0]; sec0=opt+szopt
for i in range(nsec):
off=sec0+i*40
name=data[off:off+8].rstrip(b"\0").decode()
vsz,va,rsz,ra=struct.unpack_from("<IIII",data,off+8)
if name=="CODE": code_rsz=rsz
pat=b"\x34\x04\x00\x00"
md=capstone.Cs(capstone.CS_ARCH_X86, capstone.CS_MODE_32)
start=0; matched={0x4a1d2d,0x4a22ad,0x4b984b,0x4bacc7,0x4baeb4}
while True:
idx=data.find(pat,start)
if idx<0: break
start=idx+1
if not (CODE_RA<=idx<CODE_RA+code_rsz): continue
va=CODE_VA+(idx-CODE_RA)
ok=False
for back in range(2,9):
for ins in md.disasm(data[idx-back:idx-back+16], va-back):
if "0x434" in ins.op_str and va+4 <= ins.address+ins.size <= va+8:
ok=True; break
if ok: break
if not ok:
# show raw bytes context for manual inspection
print(f"UNMATCHED at va {va:08x}: {data[idx-8:idx+8].hex()}")
print("done")
+91
View File
@@ -0,0 +1,91 @@
import struct
data = open(r'C:/git/bt411/content/BTL4.RES','rb').read()
n = len(data)
def cstr(off, maxlen=32):
s = data[off:off+maxlen].split(b'\0')[0]
try: return s.decode('ascii')
except: return None
def f32(off): return struct.unpack_from('<f', data, off)[0]
def i32(off): return struct.unpack_from('<i', data, off)[0]
DMGTYPE = {0:'Collision',1:'Ballistic',2:'Explosive',3:'Laser',4:'Energy'}
# find ALL subsystem records: printable name @+0, classID @+0x20 in 0xBB0..0xBE0, size @+0x24 plausible
recs = []
i = 0
while i < n - 0x28:
cid = struct.unpack_from('<I', data, i+0x20)[0]
if 0xBB0 <= cid <= 0xBE5:
sz = struct.unpack_from('<I', data, i+0x24)[0]
if 0xE0 <= sz <= 0x300:
name = cstr(i)
if name and 2 <= len(name) <= 31 and all(32 < ord(c) < 127 for c in name):
# name buffer should be null-padded to 32
pad = data[i+len(name):i+0x20]
if pad.count(0) >= 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)
+157
View File
@@ -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)