Files
BT411/reference/decomp/bt_mech2.cpp.c
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

1119 lines
36 KiB
C

// Recovered decompilation of functions attributed to bt/mech2.cpp
// (from BTL4OPT.EXE via embedded assert paths). Pseudocode — reconstruct against the header.
/* ---- @ 004a5028 ---- */
/* WARNING: Globals starting with '_' overlap smaller symbols at the same address */
float10 __cdecl FUN_004a5028(int param_1,float param_2)
{
undefined4 uVar1;
int iVar2;
int iVar3;
float fVar4;
float10 fVar5;
float local_8;
iVar2 = **(int **)(param_1 + 0x128);
iVar3 = *(int *)(param_1 + 0x40);
if (*(int *)(param_1 + 0x650) == 0) {
if (iVar3 == 5) {
FUN_004a7fc4(param_1,0x1c);
*(undefined4 *)(param_1 + 0x650) = 1;
}
else if (iVar3 == 6) {
FUN_004a7fc4(param_1,0x1d);
*(undefined4 *)(param_1 + 0x650) = 1;
}
else if (iVar3 == 7) {
FUN_004a7fc4(param_1,0x1e);
*(undefined4 *)(param_1 + 0x650) = 1;
}
else if (iVar3 == 8) {
FUN_004a7fc4(param_1,0x1f);
*(undefined4 *)(param_1 + 0x650) = 1;
}
}
iVar3 = *(int *)(param_1 + 0x3b0);
if ((*(float *)(param_1 + 0x348) <= _DAT_004a5674) &&
((((iVar3 == 6 || (iVar3 == 7)) || (iVar3 == 8)) || (iVar3 == 9)))) {
FUN_0041bbd8(param_1 + 0x39c,0);
*(undefined4 *)(param_1 + 0x654) = 1;
}
switch(*(undefined4 *)(param_1 + 0x3b0)) {
case 0:
if (*(float *)(param_1 + 0x530) < *(float *)(iVar2 + 0x128)) {
FUN_004a7fc4(param_1,5);
}
else {
local_8 = 0.0;
if (_DAT_004a5674 <= *(float *)(iVar2 + 0x128)) break;
FUN_004a7fc4(param_1,0x10);
}
case 2:
case 3:
case 5:
case 8:
case 9:
case 10:
case 0xb:
case 0xe:
case 0xf:
case 0x10:
case 0x11:
case 0x14:
case 0x15:
case 0x1c:
case 0x1d:
case 0x1e:
case 0x1f:
case 0x20:
switchD_004a510d_caseD_2:
if (*(int *)(param_1 + 0x3b0) == 0) {
FUN_0040385c(s_Standing_Not_Supported_0050d7cd,s_d__tesla_bt_bt_MECH2_CPP_0050d7e4,0xd3);
}
fVar5 = FUN_0042790c(param_1 + 0x65c,
param_2 * *(float *)(param_1 + 0x5a8) * *(float *)(param_1 + 0x5ac),1);
local_8 = (float)fVar5;
*(float *)(param_1 + 0x348) = local_8 / param_2;
break;
case 1:
local_8 = 0.0;
break;
case 4:
if (*(float *)(param_1 + 0x530) < *(float *)(iVar2 + 0x128)) {
FUN_0041bbd8(param_1 + 0x39c,0);
FUN_004a4c54(param_1,8);
break;
}
local_8 = 0.0;
if (*(float *)(iVar2 + 0x128) < _DAT_004a5674) {
FUN_0041bbd8(param_1 + 0x39c,0);
FUN_004a4c54(param_1,8);
break;
}
goto switchD_004a510d_caseD_2;
case 6:
case 7:
if (*(float *)(iVar2 + 0x128) <= *(float *)(param_1 + 0x348)) {
if (*(float *)(iVar2 + 0x128) < *(float *)(param_1 + 0x348)) {
*(float *)(param_1 + 0x348) =
*(float *)(param_1 + 0x348) - *(float *)(param_1 + 0x344) * param_2;
if (*(float *)(iVar2 + 0x128) <= *(float *)(param_1 + 0x348)) {
uVar1 = *(undefined4 *)(param_1 + 0x348);
}
else {
uVar1 = *(undefined4 *)(iVar2 + 0x128);
}
*(undefined4 *)(param_1 + 0x348) = uVar1;
if (*(float *)(param_1 + 0x530) <= *(float *)(param_1 + 0x348)) {
uVar1 = *(undefined4 *)(param_1 + 0x348);
}
else {
uVar1 = *(undefined4 *)(param_1 + 0x530);
}
*(undefined4 *)(param_1 + 0x348) = uVar1;
}
}
else {
*(float *)(param_1 + 0x348) =
*(float *)(param_1 + 0x344) * param_2 + *(float *)(param_1 + 0x348);
if (*(float *)(param_1 + 0x348) <= *(float *)(iVar2 + 0x128)) {
uVar1 = *(undefined4 *)(param_1 + 0x348);
}
else {
uVar1 = *(undefined4 *)(iVar2 + 0x128);
}
*(undefined4 *)(param_1 + 0x348) = uVar1;
if (*(float *)(param_1 + 0x348) <= *(float *)(param_1 + 0x534)) {
uVar1 = *(undefined4 *)(param_1 + 0x348);
}
else {
uVar1 = *(undefined4 *)(param_1 + 0x534);
}
*(undefined4 *)(param_1 + 0x348) = uVar1;
}
fVar5 = FUN_0042790c(param_1 + 0x65c,
param_2 * (*(float *)(param_1 + 0x348) / *(float *)(param_1 + 0x534)) *
*(float *)(param_1 + 0x5a8),1);
local_8 = (float)fVar5;
break;
case 0xc:
case 0xd:
if (*(float *)(iVar2 + 0x128) <= *(float *)(param_1 + 0x348)) {
if (*(float *)(iVar2 + 0x128) < *(float *)(param_1 + 0x348)) {
*(float *)(param_1 + 0x348) =
*(float *)(param_1 + 0x348) - *(float *)(param_1 + 0x344) * param_2;
if (*(float *)(iVar2 + 0x128) <= *(float *)(param_1 + 0x348)) {
uVar1 = *(undefined4 *)(param_1 + 0x348);
}
else {
uVar1 = *(undefined4 *)(iVar2 + 0x128);
}
*(undefined4 *)(param_1 + 0x348) = uVar1;
if (*(float *)(param_1 + 0x538) <= *(float *)(param_1 + 0x348)) {
uVar1 = *(undefined4 *)(param_1 + 0x348);
}
else {
uVar1 = *(undefined4 *)(param_1 + 0x538);
}
*(undefined4 *)(param_1 + 0x348) = uVar1;
}
}
else {
*(float *)(param_1 + 0x348) =
*(float *)(param_1 + 0x344) * param_2 + *(float *)(param_1 + 0x348);
if (*(float *)(param_1 + 0x348) <= *(float *)(iVar2 + 0x128)) {
uVar1 = *(undefined4 *)(param_1 + 0x348);
}
else {
uVar1 = *(undefined4 *)(iVar2 + 0x128);
}
*(undefined4 *)(param_1 + 0x348) = uVar1;
if (*(float *)(param_1 + 0x348) <= *(float *)(param_1 + 0x7a0)) {
uVar1 = *(undefined4 *)(param_1 + 0x348);
}
else {
uVar1 = *(undefined4 *)(param_1 + 0x7a0);
}
*(undefined4 *)(param_1 + 0x348) = uVar1;
}
fVar5 = FUN_0042790c(param_1 + 0x65c,
param_2 * (*(float *)(param_1 + 0x348) / *(float *)(param_1 + 0x34c)) *
*(float *)(param_1 + 0x5a8),1);
local_8 = (float)fVar5;
break;
case 0x12:
case 0x13:
if (*(float *)(iVar2 + 0x128) <= *(float *)(param_1 + 0x348)) {
if (*(float *)(iVar2 + 0x128) < *(float *)(param_1 + 0x348)) {
*(float *)(param_1 + 0x348) =
*(float *)(param_1 + 0x348) - *(float *)(param_1 + 0x5b0) * param_2;
if (*(float *)(iVar2 + 0x128) <= *(float *)(param_1 + 0x348)) {
uVar1 = *(undefined4 *)(param_1 + 0x348);
}
else {
uVar1 = *(undefined4 *)(iVar2 + 0x128);
}
*(undefined4 *)(param_1 + 0x348) = uVar1;
if (*(float *)(param_1 + 0x350) <= *(float *)(param_1 + 0x348)) {
uVar1 = *(undefined4 *)(param_1 + 0x348);
}
else {
uVar1 = *(undefined4 *)(param_1 + 0x350);
}
*(undefined4 *)(param_1 + 0x348) = uVar1;
}
}
else {
*(float *)(param_1 + 0x348) =
*(float *)(param_1 + 0x5b0) * param_2 + *(float *)(param_1 + 0x348);
if (*(float *)(param_1 + 0x348) <= *(float *)(iVar2 + 0x128)) {
uVar1 = *(undefined4 *)(param_1 + 0x348);
}
else {
uVar1 = *(undefined4 *)(iVar2 + 0x128);
}
*(undefined4 *)(param_1 + 0x348) = uVar1;
if (*(float *)(param_1 + 0x348) <= *(float *)(param_1 + 0x52c)) {
uVar1 = *(undefined4 *)(param_1 + 0x348);
}
else {
uVar1 = *(undefined4 *)(param_1 + 0x52c);
}
*(undefined4 *)(param_1 + 0x348) = uVar1;
}
fVar4 = *(float *)(param_1 + 0x348) / *(float *)(param_1 + 0x350);
if (fVar4 <= _DAT_004a5674) {
fVar4 = -fVar4;
}
fVar5 = FUN_0042790c(param_1 + 0x65c,fVar4 * param_2 * *(float *)(param_1 + 0x5a8),1);
local_8 = (float)fVar5;
break;
case 0x16:
case 0x17:
case 0x18:
case 0x19:
case 0x1a:
case 0x1b:
FUN_00408440((undefined4 *)(param_1 + 0x598),&DAT_004e0f74);
*(undefined4 *)(param_1 + 0x5a4) = 0;
*(undefined4 *)(param_1 + 0x654) = 0;
*(undefined4 *)(param_1 + 0x650) = 0;
FUN_0041bbd8(param_1 + 0x39c,0);
FUN_004283b8(param_1 + 0x65c,1);
break;
default:
FUN_004dbb24(&DAT_00524e20,s_StandingAnimation_0050cfe8 + *(int *)(param_1 + 0x3b0) * 0x3c,
(char *)0x0);
FUN_004d9c38(&DAT_00524e20);
FUN_0040385c(s_Unsupported_mech_animation__0050d7fd,s_d__tesla_bt_bt_MECH2_CPP_0050d81a,0x13b);
}
return (float10)local_8;
}
/* ---- @ 004a5678 ---- */
/* WARNING: Globals starting with '_' overlap smaller symbols at the same address */
float10 __cdecl FUN_004a5678(int param_1,float param_2,int param_3)
{
undefined4 uVar1;
int iVar2;
float fVar3;
float10 fVar4;
float local_8;
iVar2 = *(int *)(param_1 + 0x40);
if (*(int *)(param_1 + 0x650) == 0) {
if (iVar2 == 5) {
FUN_004a800c(param_1,0x1c);
*(undefined4 *)(param_1 + 0x650) = 1;
}
else if (iVar2 == 6) {
FUN_004a800c(param_1,0x1d);
*(undefined4 *)(param_1 + 0x650) = 1;
}
else if (iVar2 == 7) {
FUN_004a800c(param_1,0x1e);
*(undefined4 *)(param_1 + 0x650) = 1;
}
else if (iVar2 == 8) {
FUN_004a800c(param_1,0x1f);
*(undefined4 *)(param_1 + 0x650) = 1;
}
}
switch(*(undefined4 *)(param_1 + 0x728)) {
case 0:
local_8 = 0.0;
if (*(float *)(param_1 + 0x530) < *(float *)(param_1 + 0x6b4)) {
FUN_004a800c(param_1,5);
}
else {
if (_DAT_004a5bf4 <= *(float *)(param_1 + 0x6b4)) break;
FUN_004a800c(param_1,0x10);
}
case 2:
case 3:
case 4:
case 5:
case 8:
case 9:
case 10:
case 0xb:
case 0xe:
case 0xf:
case 0x10:
case 0x11:
case 0x14:
case 0x15:
case 0x1c:
case 0x1d:
case 0x1e:
case 0x1f:
case 0x20:
fVar4 = FUN_0042790c(param_1 + 0x6bc,
param_2 * *(float *)(param_1 + 0x5a8) * *(float *)(param_1 + 0x5ac),param_3
);
local_8 = (float)fVar4;
*(float *)(param_1 + 0x6b8) = local_8 / param_2;
break;
case 1:
local_8 = 0.0;
break;
case 6:
case 7:
if (*(float *)(param_1 + 0x6b4) <= *(float *)(param_1 + 0x6b8)) {
if (*(float *)(param_1 + 0x6b4) < *(float *)(param_1 + 0x6b8)) {
*(float *)(param_1 + 0x6b8) =
*(float *)(param_1 + 0x6b8) - *(float *)(param_1 + 0x344) * param_2;
if (*(float *)(param_1 + 0x6b4) <= *(float *)(param_1 + 0x6b8)) {
uVar1 = *(undefined4 *)(param_1 + 0x6b8);
}
else {
uVar1 = *(undefined4 *)(param_1 + 0x6b4);
}
*(undefined4 *)(param_1 + 0x6b8) = uVar1;
if (*(float *)(param_1 + 0x530) <= *(float *)(param_1 + 0x6b8)) {
uVar1 = *(undefined4 *)(param_1 + 0x6b8);
}
else {
uVar1 = *(undefined4 *)(param_1 + 0x530);
}
*(undefined4 *)(param_1 + 0x6b8) = uVar1;
}
}
else {
*(float *)(param_1 + 0x6b8) =
*(float *)(param_1 + 0x344) * param_2 + *(float *)(param_1 + 0x6b8);
if (*(float *)(param_1 + 0x6b8) <= *(float *)(param_1 + 0x6b4)) {
uVar1 = *(undefined4 *)(param_1 + 0x6b8);
}
else {
uVar1 = *(undefined4 *)(param_1 + 0x6b4);
}
*(undefined4 *)(param_1 + 0x6b8) = uVar1;
if (*(float *)(param_1 + 0x6b8) <= *(float *)(param_1 + 0x534)) {
uVar1 = *(undefined4 *)(param_1 + 0x6b8);
}
else {
uVar1 = *(undefined4 *)(param_1 + 0x534);
}
*(undefined4 *)(param_1 + 0x6b8) = uVar1;
}
fVar4 = FUN_0042790c(param_1 + 0x6bc,
param_2 * (*(float *)(param_1 + 0x6b8) / *(float *)(param_1 + 0x534)) *
*(float *)(param_1 + 0x5a8),param_3);
local_8 = (float)fVar4;
break;
case 0xc:
case 0xd:
if (*(float *)(param_1 + 0x6b4) <= *(float *)(param_1 + 0x6b8)) {
if (*(float *)(param_1 + 0x6b4) < *(float *)(param_1 + 0x6b8)) {
*(float *)(param_1 + 0x6b8) =
*(float *)(param_1 + 0x6b8) - *(float *)(param_1 + 0x344) * param_2;
if (*(float *)(param_1 + 0x6b4) <= *(float *)(param_1 + 0x6b8)) {
uVar1 = *(undefined4 *)(param_1 + 0x6b8);
}
else {
uVar1 = *(undefined4 *)(param_1 + 0x6b4);
}
*(undefined4 *)(param_1 + 0x6b8) = uVar1;
if (*(float *)(param_1 + 0x538) <= *(float *)(param_1 + 0x6b8)) {
uVar1 = *(undefined4 *)(param_1 + 0x6b8);
}
else {
uVar1 = *(undefined4 *)(param_1 + 0x538);
}
*(undefined4 *)(param_1 + 0x6b8) = uVar1;
}
}
else {
*(float *)(param_1 + 0x6b8) =
*(float *)(param_1 + 0x344) * param_2 + *(float *)(param_1 + 0x6b8);
if (*(float *)(param_1 + 0x6b8) <= *(float *)(param_1 + 0x6b4)) {
uVar1 = *(undefined4 *)(param_1 + 0x6b8);
}
else {
uVar1 = *(undefined4 *)(param_1 + 0x6b4);
}
*(undefined4 *)(param_1 + 0x6b8) = uVar1;
if (*(float *)(param_1 + 0x6b8) <= *(float *)(param_1 + 0x7a0)) {
uVar1 = *(undefined4 *)(param_1 + 0x6b8);
}
else {
uVar1 = *(undefined4 *)(param_1 + 0x7a0);
}
*(undefined4 *)(param_1 + 0x6b8) = uVar1;
}
fVar4 = FUN_0042790c(param_1 + 0x6bc,
param_2 * (*(float *)(param_1 + 0x6b8) / *(float *)(param_1 + 0x34c)) *
*(float *)(param_1 + 0x5a8),param_3);
local_8 = (float)fVar4;
break;
case 0x12:
case 0x13:
if (*(float *)(param_1 + 0x6b4) <= *(float *)(param_1 + 0x6b8)) {
if (*(float *)(param_1 + 0x6b4) < *(float *)(param_1 + 0x6b8)) {
*(float *)(param_1 + 0x6b8) =
*(float *)(param_1 + 0x6b8) - *(float *)(param_1 + 0x5b0) * param_2;
if (*(float *)(param_1 + 0x6b4) <= *(float *)(param_1 + 0x6b8)) {
uVar1 = *(undefined4 *)(param_1 + 0x6b8);
}
else {
uVar1 = *(undefined4 *)(param_1 + 0x6b4);
}
*(undefined4 *)(param_1 + 0x6b8) = uVar1;
if (*(float *)(param_1 + 0x350) <= *(float *)(param_1 + 0x6b8)) {
uVar1 = *(undefined4 *)(param_1 + 0x6b8);
}
else {
uVar1 = *(undefined4 *)(param_1 + 0x350);
}
*(undefined4 *)(param_1 + 0x6b8) = uVar1;
}
}
else {
*(float *)(param_1 + 0x6b8) =
*(float *)(param_1 + 0x5b0) * param_2 + *(float *)(param_1 + 0x6b8);
if (*(float *)(param_1 + 0x6b8) <= *(float *)(param_1 + 0x6b4)) {
uVar1 = *(undefined4 *)(param_1 + 0x6b8);
}
else {
uVar1 = *(undefined4 *)(param_1 + 0x6b4);
}
*(undefined4 *)(param_1 + 0x6b8) = uVar1;
if (*(float *)(param_1 + 0x6b8) <= *(float *)(param_1 + 0x52c)) {
uVar1 = *(undefined4 *)(param_1 + 0x6b8);
}
else {
uVar1 = *(undefined4 *)(param_1 + 0x52c);
}
*(undefined4 *)(param_1 + 0x6b8) = uVar1;
}
fVar3 = *(float *)(param_1 + 0x6b8) / *(float *)(param_1 + 0x350);
if (fVar3 <= _DAT_004a5bf4) {
fVar3 = -fVar3;
}
fVar4 = FUN_0042790c(param_1 + 0x6bc,fVar3 * param_2 * *(float *)(param_1 + 0x5a8),param_3);
local_8 = (float)fVar4;
break;
case 0x16:
case 0x17:
case 0x18:
case 0x19:
case 0x1a:
case 0x1b:
FUN_00408440((undefined4 *)(param_1 + 0x598),&DAT_004e0f74);
*(undefined4 *)(param_1 + 0x5a4) = 0;
*(undefined4 *)(param_1 + 0x658) = 0;
*(undefined4 *)(param_1 + 0x650) = 0;
FUN_0041bbd8(param_1 + 0x714,0);
FUN_004283b8(param_1 + 0x6bc,param_3);
break;
default:
FUN_004dbb24(&DAT_00524e20,s_StandingAnimation_0050cfe8 + *(int *)(param_1 + 0x728) * 0x3c,
(char *)0x0);
FUN_004d9c38(&DAT_00524e20);
FUN_0040385c(s_Unsupported_mech_animation__0050d833,s_d__tesla_bt_bt_MECH2_CPP_0050d850,0x206);
}
return (float10)local_8;
}
/* ---- @ 004a5bf8 ---- */
/* WARNING: Globals starting with '_' overlap smaller symbols at the same address */
float10 __cdecl FUN_004a5bf8(int param_1,float param_2,int param_3)
{
undefined4 uVar1;
int iVar2;
float fVar3;
float10 fVar4;
float local_c;
float local_8;
iVar2 = *(int *)(param_1 + 0x728);
if (((iVar2 - 6U < 2) || (iVar2 - 0xcU < 2)) || (iVar2 - 0x12U < 2)) {
if (*(int *)(param_1 + 0x40) == 3) {
if (*(float *)(param_1 + 0x6b4) <= *(float *)(param_1 + 0x53c)) {
uVar1 = *(undefined4 *)(param_1 + 0x6b4);
}
else {
uVar1 = *(undefined4 *)(param_1 + 0x53c);
}
*(undefined4 *)(param_1 + 0x6b4) = uVar1;
}
else {
if (*(float *)(param_1 + 0x6b4) <= *(float *)(param_1 + 0x540)) {
uVar1 = *(undefined4 *)(param_1 + 0x6b4);
}
else {
uVar1 = *(undefined4 *)(param_1 + 0x540);
}
*(undefined4 *)(param_1 + 0x6b4) = uVar1;
}
fVar3 = _DAT_004a6340;
if (_DAT_004a6340 <= *(float *)(param_1 + 0x6b4)) {
fVar3 = *(float *)(param_1 + 0x6b4);
}
*(float *)(param_1 + 0x6b4) = fVar3;
}
switch(*(undefined4 *)(param_1 + 0x728)) {
case 0:
if (*(float *)(param_1 + 0x6b4) <= *(float *)(param_1 + 0x530)) {
local_8 = 0.0;
break;
}
FUN_004a800c(param_1,5);
case 2:
case 3:
case 4:
case 5:
case 8:
case 9:
case 10:
case 0xb:
case 0xe:
case 0xf:
case 0x10:
case 0x11:
case 0x14:
case 0x15:
case 0x16:
case 0x17:
case 0x1a:
case 0x1b:
case 0x20:
fVar4 = FUN_0042790c(param_1 + 0x6bc,
param_2 * *(float *)(param_1 + 0x5a8) * *(float *)(param_1 + 0x5ac),param_3
);
local_8 = (float)fVar4;
*(float *)(param_1 + 0x6b8) = local_8 / param_2;
break;
case 1:
local_8 = 0.0;
break;
case 6:
case 7:
if (*(float *)(param_1 + 0x6b4) <= *(float *)(param_1 + 0x6b8)) {
if (*(float *)(param_1 + 0x6b4) < *(float *)(param_1 + 0x6b8)) {
*(float *)(param_1 + 0x6b8) =
*(float *)(param_1 + 0x6b8) - *(float *)(param_1 + 0x344) * param_2;
if (*(float *)(param_1 + 0x6b4) <= *(float *)(param_1 + 0x6b8)) {
uVar1 = *(undefined4 *)(param_1 + 0x6b8);
}
else {
uVar1 = *(undefined4 *)(param_1 + 0x6b4);
}
*(undefined4 *)(param_1 + 0x6b8) = uVar1;
if (*(float *)(param_1 + 0x530) <= *(float *)(param_1 + 0x6b8)) {
uVar1 = *(undefined4 *)(param_1 + 0x6b8);
}
else {
uVar1 = *(undefined4 *)(param_1 + 0x530);
}
*(undefined4 *)(param_1 + 0x6b8) = uVar1;
}
}
else {
*(float *)(param_1 + 0x6b8) =
*(float *)(param_1 + 0x344) * param_2 + *(float *)(param_1 + 0x6b8);
if (*(float *)(param_1 + 0x6b8) <= *(float *)(param_1 + 0x6b4)) {
uVar1 = *(undefined4 *)(param_1 + 0x6b8);
}
else {
uVar1 = *(undefined4 *)(param_1 + 0x6b4);
}
*(undefined4 *)(param_1 + 0x6b8) = uVar1;
if (*(float *)(param_1 + 0x6b8) <= *(float *)(param_1 + 0x534)) {
uVar1 = *(undefined4 *)(param_1 + 0x6b8);
}
else {
uVar1 = *(undefined4 *)(param_1 + 0x534);
}
*(undefined4 *)(param_1 + 0x6b8) = uVar1;
}
fVar4 = FUN_0042790c(param_1 + 0x6bc,
param_2 * (*(float *)(param_1 + 0x6b8) / *(float *)(param_1 + 0x534)) *
*(float *)(param_1 + 0x5a8),param_3);
local_8 = (float)fVar4;
break;
case 0xc:
case 0xd:
if (*(float *)(param_1 + 0x6b4) <= *(float *)(param_1 + 0x6b8)) {
if (*(float *)(param_1 + 0x6b4) < *(float *)(param_1 + 0x6b8)) {
*(float *)(param_1 + 0x6b8) =
*(float *)(param_1 + 0x6b8) - *(float *)(param_1 + 0x344) * param_2;
if (*(float *)(param_1 + 0x6b4) <= *(float *)(param_1 + 0x6b8)) {
uVar1 = *(undefined4 *)(param_1 + 0x6b8);
}
else {
uVar1 = *(undefined4 *)(param_1 + 0x6b4);
}
*(undefined4 *)(param_1 + 0x6b8) = uVar1;
if (*(float *)(param_1 + 0x538) <= *(float *)(param_1 + 0x6b8)) {
uVar1 = *(undefined4 *)(param_1 + 0x6b8);
}
else {
uVar1 = *(undefined4 *)(param_1 + 0x538);
}
*(undefined4 *)(param_1 + 0x6b8) = uVar1;
}
}
else {
*(float *)(param_1 + 0x6b8) =
*(float *)(param_1 + 0x344) * param_2 + *(float *)(param_1 + 0x6b8);
if (*(float *)(param_1 + 0x6b8) <= *(float *)(param_1 + 0x6b4)) {
uVar1 = *(undefined4 *)(param_1 + 0x6b8);
}
else {
uVar1 = *(undefined4 *)(param_1 + 0x6b4);
}
*(undefined4 *)(param_1 + 0x6b8) = uVar1;
if (*(float *)(param_1 + 0x6b8) <= *(float *)(param_1 + 0x7a0)) {
uVar1 = *(undefined4 *)(param_1 + 0x6b8);
}
else {
uVar1 = *(undefined4 *)(param_1 + 0x7a0);
}
*(undefined4 *)(param_1 + 0x6b8) = uVar1;
}
fVar4 = FUN_0042790c(param_1 + 0x6bc,
param_2 * (*(float *)(param_1 + 0x6b8) / *(float *)(param_1 + 0x34c)) *
*(float *)(param_1 + 0x5a8),param_3);
local_8 = (float)fVar4;
break;
case 0x12:
case 0x13:
if (*(float *)(param_1 + 0x6b4) <= *(float *)(param_1 + 0x6b8)) {
if (*(float *)(param_1 + 0x6b4) < *(float *)(param_1 + 0x6b8)) {
*(float *)(param_1 + 0x6b8) =
*(float *)(param_1 + 0x6b8) - *(float *)(param_1 + 0x5b0) * param_2;
if (*(float *)(param_1 + 0x6b4) <= *(float *)(param_1 + 0x6b8)) {
uVar1 = *(undefined4 *)(param_1 + 0x6b8);
}
else {
uVar1 = *(undefined4 *)(param_1 + 0x6b4);
}
*(undefined4 *)(param_1 + 0x6b8) = uVar1;
if (*(float *)(param_1 + 0x350) <= *(float *)(param_1 + 0x6b8)) {
uVar1 = *(undefined4 *)(param_1 + 0x6b8);
}
else {
uVar1 = *(undefined4 *)(param_1 + 0x350);
}
*(undefined4 *)(param_1 + 0x6b8) = uVar1;
}
}
else {
*(float *)(param_1 + 0x6b8) =
*(float *)(param_1 + 0x5b0) * param_2 + *(float *)(param_1 + 0x6b8);
if (*(float *)(param_1 + 0x6b8) <= *(float *)(param_1 + 0x6b4)) {
uVar1 = *(undefined4 *)(param_1 + 0x6b8);
}
else {
uVar1 = *(undefined4 *)(param_1 + 0x6b4);
}
*(undefined4 *)(param_1 + 0x6b8) = uVar1;
if (*(float *)(param_1 + 0x6b8) <= *(float *)(param_1 + 0x52c)) {
uVar1 = *(undefined4 *)(param_1 + 0x6b8);
}
else {
uVar1 = *(undefined4 *)(param_1 + 0x52c);
}
*(undefined4 *)(param_1 + 0x6b8) = uVar1;
}
fVar3 = *(float *)(param_1 + 0x6b8) / *(float *)(param_1 + 0x350);
if (fVar3 <= _DAT_004a6340) {
fVar3 = -fVar3;
}
fVar4 = FUN_0042790c(param_1 + 0x6bc,fVar3 * param_2 * *(float *)(param_1 + 0x5a8),param_3);
local_8 = (float)fVar4;
break;
case 0x18:
case 0x19:
if (*(int *)(param_1 + 0x40) == 3) {
if (*(float *)(param_1 + 0x6b4) <= *(float *)(param_1 + 0x6b8)) {
if (*(float *)(param_1 + 0x6b4) < *(float *)(param_1 + 0x6b8)) {
*(float *)(param_1 + 0x6b8) =
*(float *)(param_1 + 0x6b8) - *(float *)(param_1 + 0x344) * param_2;
if (*(float *)(param_1 + 0x6b4) <= *(float *)(param_1 + 0x6b8)) {
uVar1 = *(undefined4 *)(param_1 + 0x6b8);
}
else {
uVar1 = *(undefined4 *)(param_1 + 0x6b4);
}
*(undefined4 *)(param_1 + 0x6b8) = uVar1;
if (*(float *)(param_1 + 0x53c) <= *(float *)(param_1 + 0x6b8)) {
uVar1 = *(undefined4 *)(param_1 + 0x6b8);
}
else {
uVar1 = *(undefined4 *)(param_1 + 0x53c);
}
*(undefined4 *)(param_1 + 0x6b8) = uVar1;
}
}
else {
*(float *)(param_1 + 0x6b8) =
*(float *)(param_1 + 0x344) * param_2 + *(float *)(param_1 + 0x6b8);
if (*(float *)(param_1 + 0x6b8) <= *(float *)(param_1 + 0x6b4)) {
uVar1 = *(undefined4 *)(param_1 + 0x6b8);
}
else {
uVar1 = *(undefined4 *)(param_1 + 0x6b4);
}
*(undefined4 *)(param_1 + 0x6b8) = uVar1;
if (*(float *)(param_1 + 0x6b8) <= *(float *)(param_1 + 0x544)) {
uVar1 = *(undefined4 *)(param_1 + 0x6b8);
}
else {
uVar1 = *(undefined4 *)(param_1 + 0x544);
}
*(undefined4 *)(param_1 + 0x6b8) = uVar1;
}
local_c = *(float *)(param_1 + 0x6b8) / *(float *)(param_1 + 0x544);
}
else {
if (*(float *)(param_1 + 0x6b4) <= *(float *)(param_1 + 0x6b8)) {
if (*(float *)(param_1 + 0x6b4) < *(float *)(param_1 + 0x6b8)) {
*(float *)(param_1 + 0x6b8) =
*(float *)(param_1 + 0x6b8) - *(float *)(param_1 + 0x344) * param_2;
if (*(float *)(param_1 + 0x6b4) <= *(float *)(param_1 + 0x6b8)) {
uVar1 = *(undefined4 *)(param_1 + 0x6b8);
}
else {
uVar1 = *(undefined4 *)(param_1 + 0x6b4);
}
*(undefined4 *)(param_1 + 0x6b8) = uVar1;
if (*(float *)(param_1 + 0x540) <= *(float *)(param_1 + 0x6b8)) {
uVar1 = *(undefined4 *)(param_1 + 0x6b8);
}
else {
uVar1 = *(undefined4 *)(param_1 + 0x540);
}
*(undefined4 *)(param_1 + 0x6b8) = uVar1;
}
}
else {
*(float *)(param_1 + 0x6b8) =
*(float *)(param_1 + 0x344) * param_2 + *(float *)(param_1 + 0x6b8);
if (*(float *)(param_1 + 0x6b8) <= *(float *)(param_1 + 0x6b4)) {
uVar1 = *(undefined4 *)(param_1 + 0x6b8);
}
else {
uVar1 = *(undefined4 *)(param_1 + 0x6b4);
}
*(undefined4 *)(param_1 + 0x6b8) = uVar1;
if (*(float *)(param_1 + 0x6b8) <= *(float *)(param_1 + 0x548)) {
uVar1 = *(undefined4 *)(param_1 + 0x6b8);
}
else {
uVar1 = *(undefined4 *)(param_1 + 0x548);
}
*(undefined4 *)(param_1 + 0x6b8) = uVar1;
}
local_c = *(float *)(param_1 + 0x6b8) / *(float *)(param_1 + 0x548);
}
fVar4 = FUN_0042790c(param_1 + 0x6bc,param_2 * local_c * *(float *)(param_1 + 0x5a8),param_3);
local_8 = (float)fVar4;
break;
default:
FUN_004dbb24(&DAT_00524e20,s_StandingAnimation_0050cfe8 + *(int *)(param_1 + 0x728) * 0x3c,
(char *)0x0);
FUN_004d9c38(&DAT_00524e20);
FUN_0040385c(s_Unsupported_mech_animation__0050d869,s_d__tesla_bt_bt_MECH2_CPP_0050d886,0x2e8);
}
return (float10)local_8;
}
/* ---- @ 004a71f4 ---- */
/* WARNING: Globals starting with '_' overlap smaller symbols at the same address */
float10 __cdecl FUN_004a71f4(int param_1,float param_2)
{
undefined4 uVar1;
int iVar2;
int iVar3;
int iVar4;
float fVar5;
float10 fVar6;
float local_c;
float local_8;
iVar2 = *(int *)(param_1 + 0x40);
iVar3 = **(int **)(param_1 + 0x128);
iVar4 = *(int *)(param_1 + 0x3b0);
if (((iVar4 - 6U < 2) || (iVar4 - 0xcU < 2)) || (iVar4 - 0x12U < 2)) {
if (iVar2 == 3) {
if (*(float *)(iVar3 + 0x128) <= *(float *)(param_1 + 0x53c)) {
uVar1 = *(undefined4 *)(iVar3 + 0x128);
}
else {
uVar1 = *(undefined4 *)(param_1 + 0x53c);
}
*(undefined4 *)(iVar3 + 0x128) = uVar1;
}
else {
if (*(float *)(iVar3 + 0x128) <= *(float *)(param_1 + 0x540)) {
uVar1 = *(undefined4 *)(iVar3 + 0x128);
}
else {
uVar1 = *(undefined4 *)(param_1 + 0x540);
}
*(undefined4 *)(iVar3 + 0x128) = uVar1;
}
fVar5 = _DAT_004a796c;
if (_DAT_004a796c <= *(float *)(iVar3 + 0x128)) {
fVar5 = *(float *)(iVar3 + 0x128);
}
*(float *)(iVar3 + 0x128) = fVar5;
}
switch(*(undefined4 *)(param_1 + 0x3b0)) {
case 0:
if (*(float *)(iVar3 + 0x128) <= *(float *)(param_1 + 0x530)) {
local_8 = 0.0;
break;
}
FUN_004a7fc4(param_1,5);
case 2:
case 3:
case 5:
case 8:
case 9:
case 10:
case 0xb:
case 0xe:
case 0xf:
case 0x10:
case 0x11:
case 0x14:
case 0x15:
case 0x16:
case 0x17:
case 0x1a:
case 0x1b:
case 0x20:
switchD_004a72b4_caseD_2:
fVar6 = FUN_0042790c(param_1 + 0x65c,
param_2 * *(float *)(param_1 + 0x5a8) * *(float *)(param_1 + 0x5ac),1);
local_8 = (float)fVar6;
*(float *)(param_1 + 0x348) = local_8 / param_2;
break;
case 1:
local_8 = 0.0;
break;
case 4:
if (*(float *)(param_1 + 0x530) < *(float *)(iVar3 + 0x128)) {
FUN_0041bbd8(param_1 + 0x39c,0);
FUN_004a4c54(param_1,8);
break;
}
goto switchD_004a72b4_caseD_2;
case 6:
case 7:
if (*(float *)(iVar3 + 0x128) <= *(float *)(param_1 + 0x348)) {
if (*(float *)(iVar3 + 0x128) < *(float *)(param_1 + 0x348)) {
*(float *)(param_1 + 0x348) =
*(float *)(param_1 + 0x348) - *(float *)(param_1 + 0x344) * param_2;
if (*(float *)(iVar3 + 0x128) <= *(float *)(param_1 + 0x348)) {
uVar1 = *(undefined4 *)(param_1 + 0x348);
}
else {
uVar1 = *(undefined4 *)(iVar3 + 0x128);
}
*(undefined4 *)(param_1 + 0x348) = uVar1;
if (*(float *)(param_1 + 0x530) <= *(float *)(param_1 + 0x348)) {
uVar1 = *(undefined4 *)(param_1 + 0x348);
}
else {
uVar1 = *(undefined4 *)(param_1 + 0x530);
}
*(undefined4 *)(param_1 + 0x348) = uVar1;
}
}
else {
*(float *)(param_1 + 0x348) =
*(float *)(param_1 + 0x344) * param_2 + *(float *)(param_1 + 0x348);
if (*(float *)(param_1 + 0x348) <= *(float *)(iVar3 + 0x128)) {
uVar1 = *(undefined4 *)(param_1 + 0x348);
}
else {
uVar1 = *(undefined4 *)(iVar3 + 0x128);
}
*(undefined4 *)(param_1 + 0x348) = uVar1;
if (*(float *)(param_1 + 0x348) <= *(float *)(param_1 + 0x534)) {
uVar1 = *(undefined4 *)(param_1 + 0x348);
}
else {
uVar1 = *(undefined4 *)(param_1 + 0x534);
}
*(undefined4 *)(param_1 + 0x348) = uVar1;
}
fVar6 = FUN_0042790c(param_1 + 0x65c,
param_2 * (*(float *)(param_1 + 0x348) / *(float *)(param_1 + 0x534)) *
*(float *)(param_1 + 0x5a8),1);
local_8 = (float)fVar6;
break;
case 0xc:
case 0xd:
if (*(float *)(iVar3 + 0x128) <= *(float *)(param_1 + 0x348)) {
if (*(float *)(iVar3 + 0x128) < *(float *)(param_1 + 0x348)) {
*(float *)(param_1 + 0x348) =
*(float *)(param_1 + 0x348) - *(float *)(param_1 + 0x344) * param_2;
if (*(float *)(iVar3 + 0x128) <= *(float *)(param_1 + 0x348)) {
uVar1 = *(undefined4 *)(param_1 + 0x348);
}
else {
uVar1 = *(undefined4 *)(iVar3 + 0x128);
}
*(undefined4 *)(param_1 + 0x348) = uVar1;
if (*(float *)(param_1 + 0x538) <= *(float *)(param_1 + 0x348)) {
uVar1 = *(undefined4 *)(param_1 + 0x348);
}
else {
uVar1 = *(undefined4 *)(param_1 + 0x538);
}
*(undefined4 *)(param_1 + 0x348) = uVar1;
}
}
else {
*(float *)(param_1 + 0x348) =
*(float *)(param_1 + 0x344) * param_2 + *(float *)(param_1 + 0x348);
if (*(float *)(param_1 + 0x348) <= *(float *)(iVar3 + 0x128)) {
uVar1 = *(undefined4 *)(param_1 + 0x348);
}
else {
uVar1 = *(undefined4 *)(iVar3 + 0x128);
}
*(undefined4 *)(param_1 + 0x348) = uVar1;
if (*(float *)(param_1 + 0x348) <= *(float *)(param_1 + 0x7a0)) {
uVar1 = *(undefined4 *)(param_1 + 0x348);
}
else {
uVar1 = *(undefined4 *)(param_1 + 0x7a0);
}
*(undefined4 *)(param_1 + 0x348) = uVar1;
}
fVar6 = FUN_0042790c(param_1 + 0x65c,
param_2 * (*(float *)(param_1 + 0x348) / *(float *)(param_1 + 0x34c)) *
*(float *)(param_1 + 0x5a8),1);
local_8 = (float)fVar6;
break;
case 0x12:
case 0x13:
if (*(float *)(iVar3 + 0x128) <= *(float *)(param_1 + 0x348)) {
if (*(float *)(iVar3 + 0x128) < *(float *)(param_1 + 0x348)) {
*(float *)(param_1 + 0x348) =
*(float *)(param_1 + 0x348) - *(float *)(param_1 + 0x5b0) * param_2;
if (*(float *)(iVar3 + 0x128) <= *(float *)(param_1 + 0x348)) {
uVar1 = *(undefined4 *)(param_1 + 0x348);
}
else {
uVar1 = *(undefined4 *)(iVar3 + 0x128);
}
*(undefined4 *)(param_1 + 0x348) = uVar1;
if (*(float *)(param_1 + 0x350) <= *(float *)(param_1 + 0x348)) {
uVar1 = *(undefined4 *)(param_1 + 0x348);
}
else {
uVar1 = *(undefined4 *)(param_1 + 0x350);
}
*(undefined4 *)(param_1 + 0x348) = uVar1;
}
}
else {
*(float *)(param_1 + 0x348) =
*(float *)(param_1 + 0x5b0) * param_2 + *(float *)(param_1 + 0x348);
if (*(float *)(param_1 + 0x348) <= *(float *)(iVar3 + 0x128)) {
uVar1 = *(undefined4 *)(param_1 + 0x348);
}
else {
uVar1 = *(undefined4 *)(iVar3 + 0x128);
}
*(undefined4 *)(param_1 + 0x348) = uVar1;
if (*(float *)(param_1 + 0x348) <= *(float *)(param_1 + 0x52c)) {
uVar1 = *(undefined4 *)(param_1 + 0x348);
}
else {
uVar1 = *(undefined4 *)(param_1 + 0x52c);
}
*(undefined4 *)(param_1 + 0x348) = uVar1;
}
fVar5 = *(float *)(param_1 + 0x348) / *(float *)(param_1 + 0x350);
if (fVar5 <= _DAT_004a796c) {
fVar5 = -fVar5;
}
fVar6 = FUN_0042790c(param_1 + 0x65c,fVar5 * param_2 * *(float *)(param_1 + 0x5a8),1);
local_8 = (float)fVar6;
break;
case 0x18:
case 0x19:
if (iVar2 == 3) {
if (*(float *)(iVar3 + 0x128) <= *(float *)(param_1 + 0x348)) {
if (*(float *)(iVar3 + 0x128) < *(float *)(param_1 + 0x348)) {
*(float *)(param_1 + 0x348) =
*(float *)(param_1 + 0x348) - *(float *)(param_1 + 0x344) * param_2;
if (*(float *)(iVar3 + 0x128) <= *(float *)(param_1 + 0x348)) {
uVar1 = *(undefined4 *)(param_1 + 0x348);
}
else {
uVar1 = *(undefined4 *)(iVar3 + 0x128);
}
*(undefined4 *)(param_1 + 0x348) = uVar1;
if (*(float *)(param_1 + 0x53c) <= *(float *)(param_1 + 0x348)) {
uVar1 = *(undefined4 *)(param_1 + 0x348);
}
else {
uVar1 = *(undefined4 *)(param_1 + 0x53c);
}
*(undefined4 *)(param_1 + 0x348) = uVar1;
}
}
else {
*(float *)(param_1 + 0x348) =
*(float *)(param_1 + 0x344) * param_2 + *(float *)(param_1 + 0x348);
if (*(float *)(param_1 + 0x348) <= *(float *)(iVar3 + 0x128)) {
uVar1 = *(undefined4 *)(param_1 + 0x348);
}
else {
uVar1 = *(undefined4 *)(iVar3 + 0x128);
}
*(undefined4 *)(param_1 + 0x348) = uVar1;
if (*(float *)(param_1 + 0x348) <= *(float *)(param_1 + 0x544)) {
uVar1 = *(undefined4 *)(param_1 + 0x348);
}
else {
uVar1 = *(undefined4 *)(param_1 + 0x544);
}
*(undefined4 *)(param_1 + 0x348) = uVar1;
}
local_c = *(float *)(param_1 + 0x348) / *(float *)(param_1 + 0x544);
}
else {
if (*(float *)(iVar3 + 0x128) <= *(float *)(param_1 + 0x348)) {
if (*(float *)(iVar3 + 0x128) < *(float *)(param_1 + 0x348)) {
*(float *)(param_1 + 0x348) =
*(float *)(param_1 + 0x348) - *(float *)(param_1 + 0x344) * param_2;
if (*(float *)(iVar3 + 0x128) <= *(float *)(param_1 + 0x348)) {
uVar1 = *(undefined4 *)(param_1 + 0x348);
}
else {
uVar1 = *(undefined4 *)(iVar3 + 0x128);
}
*(undefined4 *)(param_1 + 0x348) = uVar1;
if (*(float *)(param_1 + 0x540) <= *(float *)(param_1 + 0x348)) {
uVar1 = *(undefined4 *)(param_1 + 0x348);
}
else {
uVar1 = *(undefined4 *)(param_1 + 0x540);
}
*(undefined4 *)(param_1 + 0x348) = uVar1;
}
}
else {
*(float *)(param_1 + 0x348) =
*(float *)(param_1 + 0x344) * param_2 + *(float *)(param_1 + 0x348);
if (*(float *)(param_1 + 0x348) <= *(float *)(iVar3 + 0x128)) {
uVar1 = *(undefined4 *)(param_1 + 0x348);
}
else {
uVar1 = *(undefined4 *)(iVar3 + 0x128);
}
*(undefined4 *)(param_1 + 0x348) = uVar1;
if (*(float *)(param_1 + 0x348) <= *(float *)(param_1 + 0x548)) {
uVar1 = *(undefined4 *)(param_1 + 0x348);
}
else {
uVar1 = *(undefined4 *)(param_1 + 0x548);
}
*(undefined4 *)(param_1 + 0x348) = uVar1;
}
local_c = *(float *)(param_1 + 0x348) / *(float *)(param_1 + 0x548);
}
fVar6 = FUN_0042790c(param_1 + 0x65c,param_2 * local_c * *(float *)(param_1 + 0x5a8),1);
local_8 = (float)fVar6;
break;
default:
FUN_004dbb24(&DAT_00524e20,s_StandingAnimation_0050cfe8 + *(int *)(param_1 + 0x3b0) * 0x3c,
(char *)0x0);
FUN_004d9c38(&DAT_00524e20);
FUN_0040385c(s_Unsupported_mech_animation__0050d89f,s_d__tesla_bt_bt_MECH2_CPP_0050d8bc,0x672);
}
return (float10)local_8;
}