Files
BT412/reference/decomp/bt_mech.cpp.c
T
arcattackandClaude Opus 4.8 7b7d465e5e Initial commit: bt411 -- standalone Windows BattleTech (Tesla 4.10 port)
Clean, self-contained extraction of the BattleTech-specific work from the
reverse-engineering workspace -- engine + game + content + build, with nothing
from Red Planet or the raw archive dumps. Builds green (Win32) and runs the
single-player drive->animate->target->fire->damage->destroy loop out of the box.

Layout:
  engine/   MUNGA + MUNGA_L4 shared 2007 engine, carrying our BT render/loader
            work (bgfload/L4D3D/L4VIDEO: BSL bit-slice decode, LOD/ground/shadow
            models) + image codec; the minimal rp/ headers the audio HAL needs
  game/     reconstructed BT logic + surviving-original BT source + fwd shims
            + WinMain launcher
  content/  full runtime tree (BTL4.RES, VIDEO/, GAUGE/, AUDIO/, eggs, BTDPL.INI)
  docs/     format specs + reconstruction ledgers
  reference/ raw Ghidra pseudocode (recon source-of-truth) + decomp exporter
  tools/    MP console emulator + map/resource scanners

One top-level CMake builds munga_engine lib + bt410_l4 game lib + btl4.exe.
All paths relativized (186 fwd shims + ~437 CMake abs paths -> repo-relative);
DXSDK is the one external, overridable via -DDXSDK. Verified: builds to a
byte-identical 2.27MB exe and runs combat (TARGET DESTROYED, 0 crashes) against
the bundled content.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-05 21:03:40 -05:00

772 lines
24 KiB
C

// Recovered decompilation of functions attributed to bt/mech.cpp
// (from BTL4OPT.EXE via embedded assert paths). Pseudocode — reconstruct against the header.
/* ---- @ 004a1674 ---- */
/* WARNING: Globals starting with '_' overlap smaller symbols at the same address */
int * __cdecl FUN_004a1674(int *param_1,int param_2,undefined4 param_3)
{
int *piVar1;
char cVar2;
int iVar3;
undefined4 uVar4;
int *piVar5;
int iVar6;
uint *puVar7;
int iVar8;
undefined4 *puVar9;
uint uVar10;
uint uVar11;
char *pcVar12;
char *pcVar13;
int local_1f8 [6];
int local_1e0 [6];
int local_1c8 [6];
char local_1b0 [32];
int local_190 [3];
int local_184 [7];
undefined4 local_168 [2];
int *local_160;
int *local_158;
int local_154;
int *local_150;
int *local_14c;
int *local_148;
int *local_144;
int *local_140;
int *local_13c;
undefined4 *local_138;
undefined4 *local_134;
int local_130;
uint *local_12c;
int local_128;
int local_124;
undefined4 local_120;
uint *local_11c;
char *local_118;
int local_114;
undefined4 local_110;
int local_10c;
float *local_108;
float local_104;
float local_100;
float *local_fc;
float local_f8;
float local_f4;
float local_f0;
float local_ec;
float local_e8;
float local_e4;
float local_e0;
float local_dc;
float local_d8;
float local_d4;
float local_d0;
float local_cc;
float local_c8;
float local_c4;
float local_c0;
float local_bc;
float local_b8;
int *local_b4;
undefined4 *local_b0;
int local_ac;
undefined4 *local_a8;
undefined4 *local_a4;
int *local_a0;
int *local_9c;
int *local_98;
int *local_94;
int *local_90;
int *local_8c;
int *local_88;
int *local_84;
int *local_80;
int *local_7c;
int *local_78;
int *local_74;
int *local_70;
int *local_6c;
int *local_68;
int *local_64;
int *local_60;
int *local_5c;
int local_58;
int local_54;
int local_50;
int local_4c;
int local_48;
int *local_44;
float *local_40;
int *local_3c;
int *local_38;
int *local_34;
int *local_30;
int *local_2c;
int *local_28;
int *local_24;
undefined4 *local_20;
undefined4 *local_1c;
undefined4 *local_18;
int *local_14;
int *local_10;
int *local_c;
int *local_8;
FUN_00424e38(param_1,param_2,param_3);
*param_1 = (int)&PTR_FUN_0050cfa8;
local_8 = param_1 + 0xd8;
FUN_00435a7c(param_1 + 0xdb);
FUN_0041b9ec(param_1 + 0xe7,0x21);
param_1[0xff] = 0;
param_1[0x100] = DAT_005209d0;
param_1[0x104] = 0;
FUN_004a4d60(param_1 + 0x106,0);
FUN_00420ea4(param_1 + 0x10f,param_1 + 0x61);
FUN_0041b9ec(param_1 + 0x114,3);
param_1[0x12a] = 0;
param_1[299] = 0;
param_1[300] = 0x3f800000;
FUN_0041b9ec(param_1 + 0x131,2);
local_c = param_1 + 0x163;
local_10 = param_1 + 0x166;
FUN_00427768(param_1 + 0x197,(int)param_1);
FUN_00427768(param_1 + 0x1af,(int)param_1);
FUN_0041b9ec(param_1 + 0x1c5,0x21);
param_1[0x1e8] = 0;
param_1[0x1e9] = 0;
param_1[0x1ea] = 0;
FUN_004a4dab(param_1 + 0x1eb,0);
FUN_004a4df6(param_1 + 0x1ef,0);
FUN_004a4e41(param_1 + 499,0);
FUN_0043ad4f((uint *)(param_1 + 0x1f8),0xf,0);
FUN_0043ad4f((uint *)(param_1 + 0x1fb),0xf,0);
FUN_0043ad4f((uint *)(param_1 + 0x1fe),0xf,0);
FUN_0043ad4f((uint *)(param_1 + 0x201),0xf,0);
FUN_0043ad4f((uint *)(param_1 + 0x204),0xf,0);
local_14 = param_1 + 0x20e;
local_18 = (undefined4 *)FUN_00402298(0x10);
if (local_18 == (undefined4 *)0x0) {
iVar3 = 0;
}
else {
iVar3 = FUN_004023f4(local_18);
}
param_1[0x211] = iVar3;
piVar1 = (int *)(param_1[0x211] + 0xc);
*piVar1 = *piVar1 + 1;
local_1c = (undefined4 *)FUN_00402298(0x10);
if (local_1c == (undefined4 *)0x0) {
iVar3 = 0;
}
else {
iVar3 = FUN_004023f4(local_1c);
}
param_1[0x212] = iVar3;
piVar1 = (int *)(param_1[0x212] + 0xc);
*piVar1 = *piVar1 + 1;
local_20 = (undefined4 *)FUN_00402298(0x10);
if (local_20 == (undefined4 *)0x0) {
iVar3 = 0;
}
else {
iVar3 = FUN_004023f4(local_20);
}
param_1[0x213] = iVar3;
piVar1 = (int *)(param_1[0x213] + 0xc);
*piVar1 = *piVar1 + 1;
param_1[10] = param_1[10] | 0x10;
param_1[0x14a] = 0;
param_1[0x10e] = 0;
param_1[0x16d] = 0;
param_1[0xca] = 0;
param_1[0xcb] = 0;
param_1[0xcc] = 0;
param_1[0xcd] = 0;
param_1[0xce] = 0;
param_1[0xcf] = 0;
param_1[0x153] = 0;
param_1[0x154] = 0;
param_1[0x155] = 0;
param_1[0x156] = 0;
param_1[0x157] = 0;
param_1[0x158] = 0;
param_1[0xd0] = 0;
local_24 = (int *)FUN_00414b60();
local_28 = param_1 + 0x1de;
*local_28 = *local_24;
param_1[0xd2] = 0;
param_1[0x1ae] = 0;
param_1[0x1ad] = 0;
FUN_0040a938(param_1 + 0x98,param_1 + 0x40);
FUN_0040a938(param_1 + 0x4b,param_1 + 0x40);
local_2c = param_1 + 0x40;
local_30 = param_1 + 0x163;
FUN_00408440(local_30,local_2c);
FUN_0040a7f4(param_1 + 0x71,(undefined4 *)&DAT_004e0fd4);
FUN_0040a7f4(param_1 + 0xa6,(undefined4 *)&DAT_004e0fd4);
FUN_0040a7f4(param_1 + 0xb2,(undefined4 *)&DAT_004e0fd4);
FUN_0040a7f4(param_1 + 0x77,(undefined4 *)&DAT_004e0fd4);
local_34 = param_1 + 0x7d;
FUN_00408440(local_34,&DAT_004e0f74);
local_38 = param_1 + 0x80;
FUN_00408440(local_38,&DAT_004e0f74);
local_3c = param_1 + 0x40;
local_40 = (float *)(param_1 + 0x34);
FUN_0040ab44(local_40,local_3c);
local_44 = param_1 + 0x166;
FUN_00408440(local_44,&DAT_004e0f74);
param_1[0x169] = 0;
param_1[0xe6] = 0;
param_1[0x1df] = 0;
param_1[0xfe] = 0;
param_1[0xfc] = 0;
param_1[0x105] = 0;
FUN_00408e90(param_1 + 0xd8,&DAT_004e0f8c);
param_1[0x160] = 0;
param_1[0x15f] = 0;
param_1[0x194] = 0;
param_1[0x207] = 0;
param_1[0x208] = 0;
param_1[0x20a] = 0;
FUN_0040a7f4(param_1 + 0x20b,(undefined4 *)&DAT_004e0fd4);
param_1[0x1e7] = 0;
param_1[0x1dd] = 0;
param_1[0x209] = 0;
param_1[0xd5] = 0;
param_1[0xd6] = 0;
param_1[0xd7] = 0;
param_1[0x12d] = 0;
param_1[0x129] = 2;
param_1[0x1e0] = param_1[0x119];
FUN_0041bbd8((int)(param_1 + 0x131),1);
FUN_0041bbd8((int)(param_1 + 0x131),param_1[0x136]);
local_50 = param_1[0xbb];
param_1[0x146] = *(int *)(local_50 + 0xc);
param_1[0x147] = (int)((float)_DAT_004a2d38 * (float)param_1[0x146]);
param_1[0x16a] = 0x3f800000;
param_1[0x16b] = 0x3f800000;
local_54 = param_1[0x65];
local_4c = local_50;
local_48 = FUN_00433ed4(*(int *)(DAT_004efc94 + 0x30) + 0x14);
param_1[0x94] = *(int *)(local_48 + 0x34) + 0x2c;
if ((param_1[10] & 0xcU) == 4) {
param_1[7] = (int)PTR_LAB_0050c0e8;
param_1[8] = DAT_0050c0ec;
param_1[9] = DAT_0050c0f0;
}
else {
param_1[7] = (int)PTR_LAB_0050c0f4;
param_1[8] = DAT_0050c0f8;
param_1[9] = DAT_0050c0fc;
}
param_1[0x101] = 0x447a0000;
param_1[0x102] = 0;
param_1[0x103] = (int)(param_1 + 0x43);
local_58 = FUN_00407064(*(int *)(DAT_004efc94 + 0x68),param_1[0x6f],0x11);
iVar3 = *(int *)(local_58 + 4);
*(int *)(local_58 + 4) = *(int *)(local_58 + 4) + 1;
if (iVar3 == 0) {
FUN_00406cd0(local_58);
}
FUN_004030dc(local_168,*(undefined4 *)(local_58 + 0x3c),*(undefined4 *)(local_58 + 0x40),0);
param_1[0x49] = *local_160 + 2;
local_160 = local_160 + 1;
iVar3 = FUN_004022b0(param_1[0x49] << 2);
param_1[0x4a] = iVar3;
*(undefined4 *)param_1[0x4a] = 0;
uVar4 = FUN_00417ab4((int)(param_1 + 199));
*(undefined4 *)(param_1[0x4a] + 4) = uVar4;
param_1[0x12e] = (int)((*(float *)(param_1[0xba] + 4) - *(float *)param_1[0xba]) * _DAT_004a2d40);
*(float *)(param_1[0xbb] + 8) = (float)param_1[0x12e] + *(float *)(param_1[0xbb] + 8);
param_1[0x112] = 0;
param_1[0x10d] = 0;
for (iVar3 = 2; piVar1 = local_160, iVar3 < param_1[0x49]; iVar3 = iVar3 + 1) {
*(undefined4 *)(param_1[0x4a] + iVar3 * 4) = 0;
if (((*(byte *)(local_160 + 0xb) & 4) == 0) || ((param_1[10] & 0xcU) != 4)) {
switch(local_160[8]) {
case 0xbbd:
local_64 = (int *)FUN_00402298(0x230);
if (local_64 == (int *)0x0) {
piVar5 = (int *)0x0;
}
else {
piVar5 = FUN_004ae568(local_64,(int)param_1,iVar3,(char *)piVar1);
}
*(int **)(param_1[0x4a] + iVar3 * 4) = piVar5;
break;
case 0xbbe:
local_5c = (int *)FUN_00402298(0x1e4);
if (local_5c == (int *)0x0) {
piVar5 = (int *)0x0;
}
else {
piVar5 = FUN_004ae8d0(local_5c,(int)param_1,iVar3,(char *)piVar1);
}
*(int **)(param_1[0x4a] + iVar3 * 4) = piVar5;
param_1[0x1f7] = *(int *)(param_1[0x4a] + iVar3 * 4);
break;
default:
FUN_0040385c(s_Unknown_subsystem_resource_>clas_0050c411,s_d__tesla_bt_bt_MECH_CPP_0050c436,
0x936);
break;
case 0xbc0:
local_60 = (int *)FUN_00402298(0x230);
if (local_60 == (int *)0x0) {
piVar5 = (int *)0x0;
}
else {
piVar5 = FUN_004af408(local_60,(int)param_1,iVar3,(char *)piVar1,&DAT_0050e640);
}
*(int **)(param_1[0x4a] + iVar3 * 4) = piVar5;
break;
case 0xbc1:
local_70 = (int *)FUN_00402298(0x250);
if (local_70 == (int *)0x0) {
piVar5 = (int *)0x0;
}
else {
piVar5 = FUN_004b225c(local_70,(int)param_1,iVar3,(char *)piVar1);
}
*(int **)(param_1[0x4a] + iVar3 * 4) = piVar5;
break;
case 0xbc2:
local_68 = (int *)FUN_00402298(0x31c);
if (local_68 == (int *)0x0) {
piVar5 = (int *)0x0;
}
else {
piVar5 = FUN_004b0f74(local_68,(int)param_1,iVar3,(char *)piVar1,&DAT_0050f4ac,0,0);
}
*(int **)(param_1[0x4a] + iVar3 * 4) = piVar5;
break;
case 0xbc3:
local_80 = (int *)FUN_00402298(0x328);
if (local_80 == (int *)0x0) {
piVar5 = (int *)0x0;
}
else {
piVar5 = FUN_004b1d18(local_80,(int)param_1,iVar3,(char *)piVar1);
}
*(int **)(param_1[0x4a] + iVar3 * 4) = piVar5;
break;
case 0xbc4:
local_84 = (int *)FUN_00402298(0x3d0);
if (local_84 == (int *)0x0) {
piVar5 = (int *)0x0;
}
else {
piVar5 = FUN_004b3778(local_84,(int)param_1,iVar3,(char *)piVar1);
}
*(int **)(param_1[0x4a] + iVar3 * 4) = piVar5;
param_1[0x14a] = *(int *)(param_1[0x4a] + iVar3 * 4);
break;
case 0xbc5:
local_88 = (int *)FUN_00402298(0x280);
if (local_88 == (int *)0x0) {
piVar5 = (int *)0x0;
}
else {
piVar5 = FUN_004b6b0c(local_88,(int)param_1,iVar3,(char *)piVar1);
}
*(int **)(param_1[0x4a] + iVar3 * 4) = piVar5;
param_1[0x10e] = *(int *)(param_1[0x4a] + iVar3 * 4);
break;
case 0xbc6:
local_6c = (int *)FUN_00402298(0x358);
if (local_6c == (int *)0x0) {
piVar5 = (int *)0x0;
}
else {
piVar5 = FUN_004b8fec(local_6c,(int)param_1,iVar3,(char *)piVar1);
}
*(int **)(param_1[0x4a] + iVar3 * 4) = piVar5;
break;
case 0xbc8:
local_8c = (int *)FUN_00402298(0x478);
if (local_8c == (int *)0x0) {
piVar5 = (int *)0x0;
}
else {
piVar5 = FUN_004bb120(local_8c,(int)param_1,iVar3,(char *)piVar1,&DAT_00511d78);
}
*(int **)(param_1[0x4a] + iVar3 * 4) = piVar5;
param_1[0x112] = param_1[0x112] + 1;
break;
case 0xbcb:
local_a0 = (int *)FUN_00402298(0x22c);
if (local_a0 == (int *)0x0) {
piVar5 = (int *)0x0;
}
else {
piVar5 = FUN_004bd5c4(local_a0,(int)param_1,iVar3,(char *)piVar1);
}
*(int **)(param_1[0x4a] + iVar3 * 4) = piVar5;
break;
case 0xbcd:
local_94 = (int *)FUN_00402298(0x448);
if (local_94 == (int *)0x0) {
piVar5 = (int *)0x0;
}
else {
piVar5 = FUN_004bc3fc(local_94,(int)param_1,iVar3,(char *)piVar1,&DAT_00512198);
}
*(int **)(param_1[0x4a] + iVar3 * 4) = piVar5;
param_1[0x112] = param_1[0x112] + 1;
break;
case 0xbce:
local_9c = (int *)FUN_00402298(0x484);
if (local_9c == (int *)0x0) {
piVar5 = (int *)0x0;
}
else {
piVar5 = FUN_004bdcb4(local_9c,(int)param_1,iVar3,(char *)piVar1,&DAT_005128a8);
}
*(int **)(param_1[0x4a] + iVar3 * 4) = piVar5;
param_1[0x112] = param_1[0x112] + 1;
break;
case 0xbd0:
local_98 = (int *)FUN_00402298(0x44c);
if (local_98 == (int *)0x0) {
piVar5 = (int *)0x0;
}
else {
piVar5 = FUN_004bcff0(local_98,(int)param_1,iVar3,(char *)piVar1,&DAT_00512478);
}
*(int **)(param_1[0x4a] + iVar3 * 4) = piVar5;
param_1[0x112] = param_1[0x112] + 1;
break;
case 0xbd3:
local_a4 = (undefined4 *)FUN_00402298(0x130);
if (local_a4 == (undefined4 *)0x0) {
puVar9 = (undefined4 *)0x0;
}
else {
puVar9 = FUN_0049bca4(local_a4,param_1,iVar3,(char *)piVar1,&DAT_0050b6bc);
}
*(undefined4 **)(param_1[0x4a] + iVar3 * 4) = puVar9;
param_1[0x10d] = *(int *)(param_1[0x4a] + iVar3 * 4);
break;
case 0xbd4:
local_90 = (int *)FUN_00402298(0x478);
if (local_90 == (int *)0x0) {
piVar5 = (int *)0x0;
}
else {
piVar5 = FUN_004bb888(local_90,(int)param_1,iVar3,(char *)piVar1,&DAT_005120c4);
}
*(int **)(param_1[0x4a] + iVar3 * 4) = piVar5;
param_1[0x112] = param_1[0x112] + 1;
break;
case 0xbd6:
local_74 = (int *)FUN_00402298(0x2a4);
if (local_74 == (int *)0x0) {
piVar5 = (int *)0x0;
}
else {
piVar5 = FUN_004b7f94(local_74,(int)param_1,iVar3,(char *)piVar1);
}
*(int **)(param_1[0x4a] + iVar3 * 4) = piVar5;
param_1[0x16d] = *(int *)(param_1[0x4a] + iVar3 * 4);
break;
case 0xbd8:
local_78 = (int *)FUN_00402298(0x238);
if (local_78 == (int *)0x0) {
piVar5 = (int *)0x0;
}
else {
piVar5 = FUN_004b84dc(local_78,(int)param_1,iVar3,(char *)piVar1);
}
*(int **)(param_1[0x4a] + iVar3 * 4) = piVar5;
break;
case 0xbdc:
local_a8 = (undefined4 *)FUN_00402298(0x104);
if (local_a8 == (undefined4 *)0x0) {
puVar9 = (undefined4 *)0x0;
}
else {
puVar9 = FUN_004ad228(local_a8,(int)param_1,iVar3,(char *)piVar1,&DAT_0050e270);
}
*(undefined4 **)(param_1[0x4a] + iVar3 * 4) = puVar9;
break;
case 0xbde:
local_7c = (int *)FUN_00402298(0x234);
if (local_7c == (int *)0x0) {
piVar5 = (int *)0x0;
}
else {
piVar5 = FUN_004b8718(local_7c,(int)param_1,iVar3,(char *)piVar1);
}
*(int **)(param_1[0x4a] + iVar3 * 4) = piVar5;
}
}
local_160 = (int *)((int)local_160 + piVar1[9]);
}
param_1[0x112] = 2;
if ((param_1[0x10e] != 0) && (param_1[0x14a] != 0)) {
local_ac = param_1[0x10e] + 0x1d8;
*(int *)(param_1[0x14a] + 600) = local_ac;
}
for (iVar3 = 2; iVar3 < param_1[0x49]; iVar3 = iVar3 + 1) {
piVar1 = *(int **)(param_1[0x4a] + iVar3 * 4);
if ((piVar1 != (int *)0x0) && (iVar8 = FUN_0041a1a4(*(int *)piVar1[3],0x50e604), iVar8 != 0)) {
(**(code **)(*piVar1 + 0x38))(piVar1);
}
}
for (iVar3 = 2; iVar3 < param_1[0x49]; iVar3 = iVar3 + 1) {
iVar8 = *(int *)(param_1[0x4a] + iVar3 * 4);
if ((iVar8 != 0) && (iVar6 = FUN_0041a1a4(**(int **)(iVar8 + 0xc),0x51155c), iVar6 != 0)) {
(**(code **)(param_1[0x1eb] + 4))(param_1 + 0x1eb,iVar8);
}
}
for (iVar3 = 2; iVar3 < param_1[0x49]; iVar3 = iVar3 + 1) {
iVar8 = *(int *)(param_1[0x4a] + iVar3 * 4);
if ((iVar8 != 0) && (iVar6 = FUN_0041a1a4(**(int **)(iVar8 + 0xc),0x511830), iVar6 != 0)) {
(**(code **)(param_1[0x1ef] + 4))(param_1 + 0x1ef,iVar8);
param_1[0x104] = param_1[0x104] | *(uint *)(iVar8 + 0x334);
}
}
for (iVar3 = 2; iVar3 < param_1[0x49]; iVar3 = iVar3 + 1) {
iVar8 = *(int *)(param_1[0x4a] + iVar3 * 4);
if ((iVar8 != 0) && (iVar6 = FUN_0041a1a4(**(int **)(iVar8 + 0xc),0x50e4fc), iVar6 != 0)) {
(**(code **)(param_1[499] + 4))(param_1 + 499,iVar8);
}
}
*(int *)(local_58 + 4) = *(int *)(local_58 + 4) + -1;
local_58 = FUN_00407064(*(int *)(DAT_004efc94 + 0x68),param_1[0x6f],0xf);
iVar3 = *(int *)(local_58 + 4);
*(int *)(local_58 + 4) = *(int *)(local_58 + 4) + 1;
if (iVar3 == 0) {
FUN_00406cd0(local_58);
}
iVar3 = *(int *)(local_58 + 0x3c);
local_b4 = param_1 + 0x68;
local_b0 = (undefined4 *)(iVar3 + 0xa8);
param_1[0x130] = *(int *)(iVar3 + 0x74);
FUN_00408440(local_b4,local_b0);
param_1[0x148] = *(int *)(iVar3 + 0x78);
param_1[0x149] = *(int *)(iVar3 + 0x7c);
param_1[0x195] = 0;
param_1[0x196] = 0;
param_1[0xfd] = 0;
FUN_0041bbd8((int)(param_1 + 0xe7),0);
FUN_0041bbd8((int)(param_1 + 0x1c5),0);
param_1[0xd1] = *(int *)(iVar3 + 0x44);
param_1[0x16c] = param_1[0xd1];
param_1[0x16e] = param_1[0xd1];
param_1[0x16f] = *(int *)(iVar3 + 0x48);
param_1[0x170] = *(int *)(iVar3 + 0x4c);
param_1[0x12f] = *(int *)(iVar3 + 0x70);
param_1[0x1e1] = *(int *)(iVar3 + 0x80);
param_1[0x1e2] = *(int *)(iVar3 + 0x84);
param_1[0x1e3] = *(int *)(iVar3 + 0x88);
param_1[0x1e4] = *(int *)(iVar3 + 0x8c);
param_1[0x1e5] = *(int *)(iVar3 + 0x90);
param_1[0x1e6] = *(int *)(iVar3 + 0x94);
local_d0 = *(float *)(iVar3 + 0x50);
local_bc = local_d0 * _DAT_004a2d44;
param_1[0x159] = (int)local_bc;
local_d8 = *(float *)(iVar3 + 0x54);
local_b8 = local_d8 * _DAT_004a2d44;
param_1[0x15a] = (int)local_b8;
local_e0 = *(float *)(iVar3 + 0x58);
local_c0 = local_e0 * _DAT_004a2d44;
param_1[0x15b] = (int)local_c0;
local_e8 = *(float *)(iVar3 + 0x5c);
local_c4 = local_e8 * _DAT_004a2d44;
param_1[0x15c] = (int)local_c4;
local_f0 = *(float *)(iVar3 + 0xa0);
local_c8 = local_f0 * _DAT_004a2d44;
param_1[0x1dc] = (int)local_c8;
param_1[0x1db] = *(int *)(iVar3 + 0x9c);
param_1[0x1da] = *(int *)(iVar3 + 0x98);
param_1[0x10c] = *(int *)(iVar3 + 0xa4);
local_fc = (float *)(param_1 + 0x15d);
local_f8 = *(float *)(iVar3 + 0x60);
*local_fc = local_f8 * _DAT_004a2d44;
local_104 = *(float *)(iVar3 + 100);
local_108 = (float *)(param_1 + 0x15e);
*local_108 = local_104 * _DAT_004a2d44;
local_100 = local_104;
local_f4 = local_f8;
local_ec = local_f0;
local_e4 = local_e8;
local_dc = local_e0;
local_d4 = local_d8;
local_cc = local_d0;
local_10c = FUN_00417ab4((int)(param_1 + 199));
local_118 = (char *)(iVar3 + 0xb4);
local_11c = (uint *)FUN_00402298(0x10);
if (local_11c == (uint *)0x0) {
puVar7 = (uint *)0x0;
}
else {
puVar7 = FUN_00402460(local_11c,local_118);
}
puVar7[3] = puVar7[3] + 1;
local_114 = FUN_00424b60((int)param_1,(int *)puVar7);
local_120 = *(undefined4 *)(local_114 + 0xc0);
local_110 = local_120;
FUN_0041d3b3(local_184,local_10c + 0xe4);
iVar8 = (**(code **)(local_184[0] + 0x34))(local_184,local_120);
FUN_0041d3d2(local_184,2);
param_1[0x10b] = iVar8;
local_124 = FUN_004dee74(s_L4VIEWEXT_0050c44e);
if (local_124 == 0) {
if ((param_1[10] & 0xcU) == 4) {
FUN_004a80d4((int)param_1,iVar3);
}
else {
FUN_004a86c8((int)param_1,iVar3);
}
}
else {
param_1[0x15f] = 1;
FUN_004a80d4((int)param_1,iVar3);
}
FUN_004a4f9e(local_190,(int)(param_1 + 0x1eb));
while (iVar8 = (**(code **)(local_190[0] + 0x28))(local_190), iVar8 != 0) {
FUN_004b8ef0(iVar8);
param_1[0x1e9] = 1;
}
FUN_004283b8((int)(param_1 + 0x197),1);
local_12c = (uint *)FUN_00402298(0x10);
if (local_12c == (uint *)0x0) {
puVar7 = (uint *)0x0;
}
else {
puVar7 = FUN_00402460(local_12c,s_jointlocal_0050c458);
}
puVar7[3] = puVar7[3] + 1;
local_128 = FUN_00424b60((int)param_1,(int *)puVar7);
param_1[0x172] = *(int *)(local_128 + 0xc0);
param_1[0xe5] = 0;
param_1[0xdd] = 1;
param_1[0xde] = 1;
param_1[0xdb] = *(int *)(iVar3 + 0x68);
param_1[0xdc] = *(int *)(iVar3 + 0x6c);
*(int *)(local_58 + 4) = *(int *)(local_58 + 4) + -1;
local_130 = FUN_00407064(*(int *)(DAT_004efc94 + 0x68),param_1[0x6f],0x14);
iVar3 = *(int *)(local_130 + 4);
*(int *)(local_130 + 4) = *(int *)(local_130 + 4) + 1;
if (iVar3 == 0) {
FUN_00406cd0(local_130);
}
uVar10 = 0xffffffff;
pcVar12 = (char *)(local_130 + 0xc);
do {
pcVar13 = pcVar12;
if (uVar10 == 0) break;
uVar10 = uVar10 - 1;
pcVar13 = pcVar12 + 1;
cVar2 = *pcVar12;
pcVar12 = pcVar13;
} while (cVar2 != '\0');
uVar10 = ~uVar10;
pcVar12 = pcVar13 + -uVar10;
pcVar13 = local_1b0;
for (uVar11 = uVar10 >> 2; uVar11 != 0; uVar11 = uVar11 - 1) {
*(undefined4 *)pcVar13 = *(undefined4 *)pcVar12;
pcVar12 = pcVar12 + 4;
pcVar13 = pcVar13 + 4;
}
for (uVar10 = uVar10 & 3; uVar10 != 0; uVar10 = uVar10 - 1) {
*pcVar13 = *pcVar12;
pcVar12 = pcVar12 + 1;
pcVar13 = pcVar13 + 1;
}
FUN_004032dc(local_1c8,*(undefined4 *)(local_130 + 0x3c),*(undefined4 *)(local_130 + 0x40),0);
(**(code **)(local_1c8[0] + 0x14))(local_1c8,4);
for (iVar3 = 0; iVar3 < param_1[0x47]; iVar3 = iVar3 + 1) {
puVar9 = (undefined4 *)FUN_00402298(0x1b8);
if (puVar9 == (undefined4 *)0x0) {
puVar9 = (undefined4 *)0x0;
}
else {
puVar9 = FUN_0049ce50(puVar9,(int)param_1,iVar3,local_1c8);
}
*(undefined4 **)(param_1[0x48] + iVar3 * 4) = puVar9;
}
for (iVar3 = 0; iVar3 < param_1[0x47]; iVar3 = iVar3 + 1) {
FUN_0049d1d0(*(int *)(param_1[0x48] + iVar3 * 4));
}
*(int *)(local_130 + 4) = *(int *)(local_130 + 4) + -1;
iVar3 = FUN_00407064(*(int *)(DAT_004efc94 + 0x68),param_1[0x6f],0x1e);
param_1[0x214] = 0;
if (iVar3 != 0) {
iVar8 = *(int *)(iVar3 + 4);
*(int *)(iVar3 + 4) = *(int *)(iVar3 + 4) + 1;
if (iVar8 == 0) {
FUN_00406cd0(iVar3);
}
FUN_004032dc(local_1e0,*(undefined4 *)(iVar3 + 0x3c),*(undefined4 *)(iVar3 + 0x40),0);
for (iVar8 = 0; iVar8 < param_1[0x47]; iVar8 = iVar8 + 1) {
FUN_0041e4a8(*(int *)(param_1[0x48] + iVar8 * 4),local_1e0);
}
local_134 = (undefined4 *)FUN_00402298(0x18);
if (local_134 == (undefined4 *)0x0) {
puVar9 = (undefined4 *)0x0;
}
else {
puVar9 = FUN_0042a984(local_134,(int)param_1);
}
param_1[0x214] = (int)puVar9;
*(int *)(iVar3 + 4) = *(int *)(iVar3 + 4) + -1;
FUN_00403310(local_1e0,2);
}
iVar8 = FUN_00406ff8(*(int *)(DAT_004efc94 + 0x68),local_1b0,0x1d,-1);
iVar3 = *(int *)(iVar8 + 4);
*(int *)(iVar8 + 4) = *(int *)(iVar8 + 4) + 1;
if (iVar3 == 0) {
FUN_00406cd0(iVar8);
}
FUN_004032dc(local_1f8,*(undefined4 *)(iVar8 + 0x3c),*(undefined4 *)(iVar8 + 0x40),0);
local_138 = (undefined4 *)FUN_00402298(0x2c);
if (local_138 == (undefined4 *)0x0) {
puVar9 = (undefined4 *)0x0;
}
else {
puVar9 = FUN_0049ea48(local_138,(int)param_1,local_1f8);
}
param_1[0x111] = (int)puVar9;
*(int *)(iVar8 + 4) = *(int *)(iVar8 + 4) + -1;
FUN_00402a98((int *)&local_13c,param_1 + 0x211,(char *)(param_2 + 0x7c));
local_140 = local_13c;
piVar1 = local_13c + 3;
*piVar1 = *piVar1 + -1;
if (*piVar1 == 0) {
FUN_004024d8(local_13c,3);
}
FUN_00402a98((int *)&local_144,param_1 + 0x212,(char *)(param_2 + 0x90));
local_148 = local_144;
piVar1 = local_144 + 3;
*piVar1 = *piVar1 + -1;
if (*piVar1 == 0) {
FUN_004024d8(local_144,3);
}
FUN_00402a98((int *)&local_14c,param_1 + 0x213,(char *)(param_2 + 0xa4));
local_150 = local_14c;
piVar1 = local_14c + 3;
*piVar1 = *piVar1 + -1;
if (*piVar1 == 0) {
FUN_004024d8(local_14c,3);
}
local_154 = *(int *)(DAT_004efc94 + 0x24);
puVar9 = (undefined4 *)FUN_00403ad0(local_154 + 0x18,s_Mechs_0050c463);
if (puVar9 == (undefined4 *)0x0) {
puVar9 = FUN_004212b0(local_154,s_Mechs_0050c469);
}
local_158 = param_1;
(**(code **)(puVar9[4] + 4))(puVar9 + 4,param_1);
FUN_0049f788((int)param_1);
FUN_00403310(local_1f8,2);
FUN_00403310(local_1c8,2);
FUN_004a4ffb(local_190,2);
return param_1;
}