Files
BT412/reference/decomp/heat_cluster.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

1405 lines
36 KiB
C

/* @004ac868 file=? name=FUN_004ac868 */
void __cdecl FUN_004ac868(int *param_1,byte param_2)
{
int *piVar1;
undefined4 *puVar2;
int *piVar3;
if (param_1 != (int *)0x0) {
*param_1 = (int)&PTR_FUN_0050e210;
puVar2 = (undefined4 *)param_1[0x38];
if (puVar2 != (undefined4 *)0x0) {
(**(code **)*puVar2)(puVar2,3);
}
piVar3 = (int *)param_1[0x3d];
piVar1 = piVar3 + 3;
*piVar1 = *piVar1 + -1;
if (*piVar1 == 0) {
FUN_004024d8(piVar3,3);
}
FUN_0041c648(param_1,0);
if ((param_2 & 1) != 0) {
FUN_004022d0(param_1);
}
}
return;
}
/* @004ac8c0 file=? name=FUN_004ac8c0 */
void __cdecl FUN_004ac8c0(int param_1)
{
int iVar1;
uint uVar2;
int *piVar3;
iVar1 = *(int *)(param_1 + 0x40);
if (iVar1 == 0) {
FUN_004dbb24(&DAT_00524e20,*(char **)(param_1 + 0xd4),(char *)0x0);
FUN_004dbb24(&DAT_00524e20,s___DefaultState_0050df99,(char *)0x0);
FUN_004d9c38(&DAT_00524e20);
return;
}
if (iVar1 != 1) {
if (iVar1 != 2) {
uVar2 = *(uint *)(param_1 + 0x40);
FUN_004dbb24(&DAT_00524e20,*(char **)(param_1 + 0xd4),(char *)0x0);
FUN_004dbb24(&DAT_00524e20,s___UnknownState______0050dfa9,(char *)0x0);
piVar3 = FUN_004db880(&DAT_00524e20,uVar2);
FUN_004d9c38(piVar3);
return;
}
FUN_004dbb24(&DAT_00524e20,*(char **)(param_1 + 0xd4),(char *)0x0);
FUN_004dbb24(&DAT_00524e20,s___Exploding_0050df8c,(char *)0x0);
FUN_004d9c38(&DAT_00524e20);
return;
}
FUN_004dbb24(&DAT_00524e20,*(char **)(param_1 + 0xd4),(char *)0x0);
FUN_004dbb24(&DAT_00524e20,s___Destroyed_0050df7f,(char *)0x0);
FUN_004d9c38(&DAT_00524e20);
return;
}
/* @004ac9c8 file=? name=FUN_004ac9c8 */
bool __cdecl FUN_004ac9c8(int param_1)
{
return *(int *)(*(int *)(*(int *)(param_1 + 0xd0) + 400) + 0x274) == 0;
}
/* @004ac9ec file=? name=FUN_004ac9ec */
/* WARNING: Globals starting with '_' overlap smaller symbols at the same address */
undefined4 __cdecl
FUN_004ac9ec(int param_1,char *param_2,char *param_3,char *param_4,int param_5,int param_6,
int param_7)
{
char *pcVar1;
char cVar2;
int iVar3;
undefined4 uVar4;
char *pcVar5;
uint uVar6;
uint uVar7;
char *pcVar8;
bool bVar9;
float local_20;
float local_1c;
char *local_18;
char *local_14;
char *local_10;
char *local_c;
int local_8;
iVar3 = FUN_0041c684(param_1,param_2,param_3,param_4,param_5,param_6);
if (iVar3 == 0) {
uVar4 = 0;
}
else {
param_4[0x24] = -0x1c;
param_4[0x25] = '\0';
param_4[0x26] = '\0';
param_4[0x27] = '\0';
param_4[0x20] = -0x45;
param_4[0x21] = '\v';
param_4[0x22] = '\0';
param_4[0x23] = '\0';
if (param_7 == 1) {
param_4[0xe0] = '\0';
param_4[0xe1] = '\0';
param_4[0xe2] = -0x80;
param_4[0xe3] = -0x41;
local_8 = 0;
pcVar5 = param_4 + 0x30;
do {
pcVar5[0] = '\0';
pcVar5[1] = '\0';
pcVar5[2] = -0x80;
pcVar5[3] = -0x41;
local_8 = local_8 + 1;
pcVar5 = pcVar5 + 4;
} while (local_8 < 5);
param_4[0x48] = -1;
param_4[0x49] = -1;
param_4[0x4a] = -1;
param_4[0x4b] = -1;
iVar3 = 0;
pcVar5 = param_4 + 0x4c;
do {
*pcVar5 = '\0';
iVar3 = iVar3 + 1;
pcVar5 = pcVar5 + 1;
} while (iVar3 < 0x80);
*(undefined4 *)(param_4 + 0x4c) = DAT_0050dfc0;
param_4[0x50] = DAT_0050dfc4;
local_c = param_4 + 0xcc;
FUN_00408440((undefined4 *)local_c,&DAT_004e0f80);
param_4[0x44] = '\0';
param_4[0x45] = '\0';
param_4[0x46] = -0x80;
param_4[0x47] = -0x41;
param_4[0xd8] = '\0';
param_4[0xd9] = '\0';
param_4[0xda] = '\0';
param_4[0xdb] = '\0';
param_4[0xdc] = '\0';
param_4[0xdd] = '\0';
param_4[0xde] = '\0';
param_4[0xdf] = '\0';
}
FUN_00404190(param_5,param_3,s_PrintSimulationState_0050dfc5,(undefined4 *)(param_4 + 0xd8));
FUN_00404118(param_5,param_3,s_CollisionCriticalHitWeight_0050dfda,(float *)(param_4 + 0xdc));
local_10 = s_Unspecified_0050dff5;
FUN_00404088(param_5,param_3,s_VideoObjectName_0050e001,&local_10);
pcVar8 = s_Unspecified_0050e011;
pcVar5 = local_10;
do {
bVar9 = *pcVar5 == *pcVar8;
if (!bVar9) break;
if (*pcVar5 == '\0') goto LAB_004acb51;
pcVar1 = pcVar5 + 1;
bVar9 = *pcVar1 == pcVar8[1];
if (!bVar9) break;
pcVar5 = pcVar5 + 2;
pcVar8 = pcVar8 + 2;
bVar9 = *pcVar1 == '\0';
} while (!bVar9);
if (!bVar9) {
uVar6 = 0xffffffff;
pcVar5 = local_10;
do {
pcVar8 = pcVar5;
if (uVar6 == 0) break;
uVar6 = uVar6 - 1;
pcVar8 = pcVar5 + 1;
cVar2 = *pcVar5;
pcVar5 = pcVar8;
} while (cVar2 != '\0');
uVar6 = ~uVar6;
pcVar5 = pcVar8 + -uVar6;
pcVar8 = param_4 + 0x4c;
for (uVar7 = uVar6 >> 2; uVar7 != 0; uVar7 = uVar7 - 1) {
*(undefined4 *)pcVar8 = *(undefined4 *)pcVar5;
pcVar5 = pcVar5 + 4;
pcVar8 = pcVar8 + 4;
}
for (uVar6 = uVar6 & 3; uVar6 != 0; uVar6 = uVar6 - 1) {
*pcVar8 = *pcVar5;
pcVar5 = pcVar5 + 1;
pcVar8 = pcVar8 + 1;
}
}
LAB_004acb51:
local_14 = s_Unspecified_0050e01d;
iVar3 = FUN_00404088(param_5,param_3,s_VitalSubsystem_0050e029,&local_14);
if ((iVar3 == 0) && (*(int *)(param_4 + 0x48) == -1)) {
FUN_004dbb24(&DAT_00524e20,param_3,(char *)0x0);
FUN_004dbb24(&DAT_00524e20,s_missing_VitalSubsystem__0050e038,(char *)0x0);
FUN_004d9c38(&DAT_00524e20);
uVar4 = 0;
}
else {
pcVar8 = s_Unspecified_0050e052;
pcVar5 = local_14;
do {
if (*pcVar5 != *pcVar8) goto LAB_004acbd7;
bVar9 = true;
if (*pcVar5 == '\0') break;
pcVar1 = pcVar5 + 1;
if (*pcVar1 != pcVar8[1]) goto LAB_004acbd7;
pcVar5 = pcVar5 + 2;
pcVar8 = pcVar8 + 2;
bVar9 = *pcVar1 == '\0';
} while (!bVar9);
if (!bVar9) {
LAB_004acbd7:
pcVar8 = &DAT_0050e05e;
pcVar5 = local_14;
do {
if (*pcVar5 != *pcVar8) goto LAB_004acc06;
bVar9 = true;
if (*pcVar5 == '\0') break;
pcVar1 = pcVar5 + 1;
if (*pcVar1 != pcVar8[1]) goto LAB_004acc06;
pcVar5 = pcVar5 + 2;
pcVar8 = pcVar8 + 2;
bVar9 = *pcVar1 == '\0';
} while (!bVar9);
if (bVar9) {
param_4[0x48] = '\x01';
param_4[0x49] = '\0';
param_4[0x4a] = '\0';
param_4[0x4b] = '\0';
}
else {
LAB_004acc06:
pcVar8 = s_False_0050e063;
pcVar5 = local_14;
do {
if (*pcVar5 != *pcVar8) goto LAB_004acc33;
bVar9 = true;
if (*pcVar5 == '\0') break;
pcVar1 = pcVar5 + 1;
if (*pcVar1 != pcVar8[1]) goto LAB_004acc33;
pcVar5 = pcVar5 + 2;
pcVar8 = pcVar8 + 2;
bVar9 = *pcVar1 == '\0';
} while (!bVar9);
if (!bVar9) {
LAB_004acc33:
FUN_004dbb24(&DAT_00524e20,param_3,(char *)0x0);
FUN_004dbb24(&DAT_00524e20,s___VitalSubsystem_must_be_True_or_0050e069,(char *)0x0);
FUN_004d9c38(&DAT_00524e20);
return 0;
}
param_4[0x48] = '\0';
param_4[0x49] = '\0';
param_4[0x4a] = '\0';
param_4[0x4b] = '\0';
}
}
iVar3 = FUN_00404088(param_5,param_3,s_SiteOffset_0050e092,&local_18);
if (iVar3 != 0) {
FUN_00408944(local_18,(float *)(param_4 + 0xcc));
}
iVar3 = FUN_00404118(param_5,param_3,s_WeaponDamagePoints_0050e09d,(float *)(param_4 + 0x44));
if ((iVar3 == 0) && (_DAT_004aceec == *(float *)(param_4 + 0x44))) {
FUN_004dbb24(&DAT_00524e20,param_3,(char *)0x0);
FUN_004dbb24(&DAT_00524e20,s_Must_have_a_WeaponDamagePoints_0050e0b0,(char *)0x0);
FUN_004d9c38(&DAT_00524e20);
uVar4 = 0;
}
else {
iVar3 = FUN_00404118(param_5,param_3,s_CriticalHitScoreBonus_0050e0d0,
(float *)(param_4 + 0xe0));
if ((iVar3 == 0) && (_DAT_004aceec == *(float *)(param_4 + 0xe0))) {
FUN_004dbb24(&DAT_00524e20,param_3,(char *)0x0);
FUN_004dbb24(&DAT_00524e20,s_Must_have_a_CriticalHitScoreBonu_0050e0e6,(char *)0x0);
FUN_004d9c38(&DAT_00524e20);
uVar4 = 0;
}
else {
local_1c = _DAT_004acef0 / *(float *)(param_4 + 0x44);
local_20 = -1.0;
iVar3 = FUN_00404118(param_5,param_3,s_CollisionDamagePoints_0050e109,&local_20);
if ((iVar3 == 0) && (*(float *)(param_4 + 0x30) == _DAT_004aceec)) {
*(float *)(param_4 + 0x30) = local_1c;
}
if (local_20 != _DAT_004aceec) {
*(float *)(param_4 + 0x30) = _DAT_004acef0 / local_20;
}
local_20 = -1.0;
iVar3 = FUN_00404118(param_5,param_3,s_BallisticDamagePoints_0050e11f,&local_20);
if ((iVar3 == 0) && (*(float *)(param_4 + 0x34) == _DAT_004aceec)) {
*(float *)(param_4 + 0x34) = local_1c;
}
if (local_20 != _DAT_004aceec) {
*(float *)(param_4 + 0x34) = _DAT_004acef0 / local_20;
}
local_20 = -1.0;
iVar3 = FUN_00404118(param_5,param_3,s_ExplosiveDamagePoints_0050e135,&local_20);
if ((iVar3 == 0) && (*(float *)(param_4 + 0x38) == _DAT_004aceec)) {
*(float *)(param_4 + 0x38) = local_1c;
}
if (local_20 != _DAT_004aceec) {
*(float *)(param_4 + 0x38) = _DAT_004acef0 / local_20;
}
local_20 = -1.0;
iVar3 = FUN_00404118(param_5,param_3,s_LaserDamagePoints_0050e14b,&local_20);
if ((iVar3 == 0) && (*(float *)(param_4 + 0x3c) == _DAT_004aceec)) {
*(float *)(param_4 + 0x3c) = local_1c;
}
if (local_20 != _DAT_004aceec) {
*(float *)(param_4 + 0x3c) = _DAT_004acef0 / local_20;
}
local_20 = -1.0;
iVar3 = FUN_00404118(param_5,param_3,s_EnergyDamagePoints_0050e15d,&local_20);
if ((iVar3 == 0) && (*(float *)(param_4 + 0x40) == _DAT_004aceec)) {
*(float *)(param_4 + 0x40) = local_1c;
}
if (local_20 != _DAT_004aceec) {
*(float *)(param_4 + 0x40) = _DAT_004acef0 / local_20;
}
uVar4 = 1;
}
}
}
}
return uVar4;
}
/* @004acfa9 file=? name=FUN_004acfa9 */
undefined4 * __cdecl FUN_004acfa9(undefined4 *param_1,int param_2,undefined4 param_3)
{
FUN_00415f30(param_1,param_2,param_3);
*param_1 = &PTR_FUN_0050e1c8;
return param_1;
}
/* @004acfcc file=? name=FUN_004acfcc */
undefined4 * __cdecl FUN_004acfcc(undefined4 *param_1,int param_2,undefined4 param_3)
{
FUN_00415f30(param_1,param_2,param_3);
*param_1 = &PTR_FUN_0050e1c8;
return param_1;
}
/* @004acfef file=? name=FUN_004acfef */
undefined4 * __cdecl FUN_004acfef(undefined4 *param_1,int param_2)
{
FUN_00415f60(param_1,param_2);
*param_1 = &PTR_FUN_0050e1c8;
return param_1;
}
/* @004ad00e file=? name=FUN_004ad00e */
void __cdecl FUN_004ad00e(int *param_1,byte param_2)
{
if (param_1 != (int *)0x0) {
*param_1 = (int)&PTR_FUN_0050e1c8;
FUN_00415f90(param_1,0);
if ((param_2 & 1) != 0) {
FUN_004022d0(param_1);
}
}
return;
}
/* @004ad03a file=? name=FUN_004ad03a */
undefined4 * __cdecl FUN_004ad03a(undefined4 *param_1,undefined4 param_2)
{
FUN_00417be0(param_1,param_2);
*param_1 = &PTR_FUN_0050e1c0;
return param_1;
}
/* @004ad059 file=? name=FUN_004ad059 */
void __cdecl FUN_004ad059(int *param_1,byte param_2)
{
if (param_1 != (int *)0x0) {
*param_1 = (int)&PTR_FUN_0050e1c0;
FUN_00417c0c(param_1,0);
if ((param_2 & 1) != 0) {
FUN_004022d0(param_1);
}
}
return;
}
/* @004ad085 file=? name=FUN_004ad085 */
undefined4 * __cdecl FUN_004ad085(undefined4 *param_1,int param_2)
{
FUN_00417d00(param_1,param_2);
*param_1 = &PTR_FUN_0050e170;
return param_1;
}
/* @004ad0a4 file=? name=FUN_004ad0a4 */
undefined4 * __cdecl FUN_004ad0a4(undefined4 *param_1,int param_2)
{
FUN_00417d00(param_1,param_2);
*param_1 = &PTR_FUN_0050e170;
return param_1;
}
/* @004ad0c3 file=? name=FUN_004ad0c3 */
undefined4 * __cdecl FUN_004ad0c3(undefined4 *param_1,int param_2)
{
FUN_00417d28(param_1,param_2);
*param_1 = &PTR_FUN_0050e170;
return param_1;
}
/* @004ad0e2 file=? name=FUN_004ad0e2 */
void __cdecl FUN_004ad0e2(int *param_1,byte param_2)
{
if (param_1 != (int *)0x0) {
*param_1 = (int)&PTR_FUN_0050e170;
FUN_00417d54(param_1,0);
if ((param_2 & 1) != 0) {
FUN_004022d0(param_1);
}
}
return;
}
/* @004ad10e file=? name=FUN_004ad10e */
void __cdecl FUN_004ad10e(int *param_1,undefined4 param_2)
{
(**(code **)(*param_1 + 0x28))(param_1,param_2);
return;
}
/* @004ad124 file=? name=FUN_004ad124 */
undefined4 * __cdecl FUN_004ad124(undefined4 *param_1,undefined4 param_2)
{
undefined4 *puVar1;
int iVar2;
FUN_00415e90(param_1,1);
*param_1 = &PTR_FUN_0050e3d0;
FUN_004de998(param_1 + 3,0x10,7,1,FUN_004ad619);
param_1[0x1f] = param_2;
iVar2 = 0;
puVar1 = param_1 + 3;
do {
*puVar1 = 0;
puVar1[2] = 0;
puVar1[1] = 0;
puVar1[3] = 0;
iVar2 = iVar2 + 1;
puVar1 = puVar1 + 4;
} while (iVar2 < 7);
return param_1;
}
/* @004ad180 file=? name=FUN_004ad180 */
void __cdecl FUN_004ad180(int *param_1,byte param_2)
{
if (param_1 != (int *)0x0) {
*param_1 = (int)&PTR_FUN_0050e3d0;
FUN_00415ed8(param_1,0);
if ((param_2 & 1) != 0) {
FUN_00402f98(0x50e248,param_1);
}
}
return;
}
/* @004ad1b8 file=? name=FUN_004ad1b8 */
void __cdecl FUN_004ad1b8(int *param_1,byte param_2)
{
void *this;
int local_10 [3];
if (param_1 != (int *)0x0) {
*param_1 = (int)&PTR_FUN_0050e3a0;
FUN_004ad68b(local_10,(int)(param_1 + 0x39));
FUN_00417858(this,local_10,1);
FUN_004ad6c9(local_10,2);
FUN_004ad640(param_1 + 0x39,2);
FUN_0041c648(param_1,0);
if ((param_2 & 1) != 0) {
FUN_004022d0(param_1);
}
}
return;
}
/* @004ad228 file=? name=FUN_004ad228 */
undefined4 * __cdecl
FUN_004ad228(undefined4 *param_1,int param_2,undefined4 param_3,char *param_4,undefined4 param_5)
{
int iVar1;
int iVar2;
undefined4 *puVar3;
int iVar4;
FUN_0041c52c(param_1,param_2,param_3,param_4,param_5);
*param_1 = &PTR_FUN_0050e3a0;
FUN_004ad621(param_1 + 0x39,0);
if ((*(uint *)(param_2 + 0x28) & 0xc) == 0) {
param_1[7] = PTR_FUN_0050e2b0;
param_1[8] = DAT_0050e2b4;
param_1[9] = DAT_0050e2b8;
param_1[0x40] = *(undefined4 *)(param_4 + 0x30);
param_1[0x3d] = *(undefined4 *)(param_4 + 0x34);
param_1[0x3e] = *(undefined4 *)(param_4 + 0x38);
param_1[0x3f] = *(undefined4 *)(param_4 + 0x3c);
for (iVar4 = *(int *)(param_2 + 0x124) + -2; -1 < iVar4; iVar4 = iVar4 + -1) {
iVar1 = *(int *)(*(int *)(param_2 + 0x128) + iVar4 * 4);
if (((iVar1 != 0) && (iVar2 = FUN_0041a1a4(**(int **)(iVar1 + 0xc),0x50de2c), iVar2 != 0)) &&
((*(byte *)(iVar1 + 0x28) & 8) != 0)) {
puVar3 = FUN_00402f74(0x50e248);
if (puVar3 == (undefined4 *)0x0) {
puVar3 = (undefined4 *)0x0;
}
else {
puVar3 = FUN_004ad124(puVar3,iVar1);
}
(**(code **)(param_1[0x39] + 4))(param_1 + 0x39,puVar3);
}
}
}
else {
param_1[10] = param_1[10] | 2;
}
return param_1;
}
/* @004ad33c file=? name=FUN_004ad33c */
void __cdecl FUN_004ad33c(int param_1)
{
int iVar1;
uint *puVar2;
uint uVar3;
uint local_64 [7];
uint local_48 [8];
int local_28 [3];
int *local_1c;
int *local_18;
int *local_14;
uint local_10;
int *local_c;
int local_8;
local_8 = *(int *)(DAT_004efc94 + 0x38);
FUN_004ad68b(local_28,param_1 + 0xe4);
while( true ) {
iVar1 = (**(code **)(local_28[0] + 0x28))(local_28);
if (iVar1 == 0) break;
local_c = *(int **)(iVar1 + 0x7c);
local_10 = (**(code **)(*local_c + 0x30))(local_c);
puVar2 = (uint *)(iVar1 + 0xc);
iVar1 = 0;
do {
uVar3 = local_10 & 1;
if (puVar2[1] != 0) {
if ((int)puVar2[3] < *(int *)(param_1 + 0x10)) {
puVar2[1] = 0;
}
else {
uVar3 = *puVar2;
}
}
if (uVar3 != *puVar2) {
if (uVar3 == 0) {
local_1c = *(int **)(param_1 + 0xd0);
FUN_004366b8(local_64,(int)local_1c,local_c,iVar1);
FUN_004364e4(local_8,local_1c,local_64);
}
else {
local_14 = local_c;
local_18 = *(int **)(param_1 + 0xd0);
FUN_00436688(local_48,(int)local_18,local_c,iVar1,*(undefined4 *)(param_1 + 0x100));
FUN_004364e4(local_8,local_18,local_48);
}
}
*puVar2 = uVar3;
iVar1 = iVar1 + 1;
local_10 = (int)local_10 >> 1;
puVar2 = puVar2 + 4;
} while (iVar1 < 7);
}
FUN_004ad6c9(local_28,2);
return;
}
/* @004ad470 file=? name=FUN_004ad470 */
void __cdecl FUN_004ad470(int param_1)
{
FUN_0041a1a4(**(int **)(param_1 + 0xc),0x50e280);
return;
}
/* @004ad48c file=? name=FUN_004ad48c */
undefined4 __cdecl
FUN_004ad48c(int param_1,char *param_2,char *param_3,char *param_4,int param_5,int param_6,
int param_7)
{
int iVar1;
undefined4 uVar2;
undefined4 *puVar3;
char *local_8;
iVar1 = FUN_0041c684(param_1,param_2,param_3,param_4,param_5,param_6);
if (iVar1 == 0) {
uVar2 = 0;
}
else {
param_4[0x24] = '@';
param_4[0x25] = '\0';
param_4[0x26] = '\0';
param_4[0x27] = '\0';
param_4[0x20] = -0x24;
param_4[0x21] = '\v';
param_4[0x22] = '\0';
param_4[0x23] = '\0';
param_4[0x30] = -1;
param_4[0x31] = -1;
param_4[0x32] = -1;
param_4[0x33] = -1;
param_4[0x34] = '\0';
param_4[0x35] = '\0';
param_4[0x36] = '\0';
param_4[0x37] = '\0';
param_4[0x38] = '\0';
param_4[0x39] = '\0';
param_4[0x3a] = '\0';
param_4[0x3b] = '\0';
param_4[0x3c] = '\0';
param_4[0x3d] = '\0';
param_4[0x3e] = '\0';
param_4[0x3f] = '\0';
if ((*(int *)(param_4 + 0x30) == -1) &&
(iVar1 = FUN_00404088(param_5,param_3,s_AlarmModel_0050e322,&local_8), iVar1 == 0)) {
return 1;
}
puVar3 = (undefined4 *)FUN_00406ff8(param_7,local_8,1,-1);
if (puVar3 == (undefined4 *)0x0) {
FUN_004dbb24(&DAT_00524e20,param_3,(char *)0x0);
FUN_004dbb24(&DAT_00524e20,s_couldn_t_locate_0050e32d,(char *)0x0);
FUN_004dbb24(&DAT_00524e20,local_8,(char *)0x0);
FUN_004dbb24(&DAT_00524e20,s__mod_0050e33f,(char *)0x0);
uVar2 = 0;
}
else {
uVar2 = 1;
*(undefined4 *)(param_4 + 0x30) = *puVar3;
}
}
return uVar2;
}
/* @004ad619 file=? name=FUN_004ad619 */
undefined4 __cdecl FUN_004ad619(undefined4 param_1)
{
return param_1;
}
/* @004ad621 file=? name=FUN_004ad621 */
undefined4 * __cdecl FUN_004ad621(undefined4 *param_1,undefined4 param_2)
{
FUN_00417be0(param_1,param_2);
*param_1 = &PTR_FUN_0050e398;
return param_1;
}
/* @004ad640 file=? name=FUN_004ad640 */
void __cdecl FUN_004ad640(int *param_1,byte param_2)
{
if (param_1 != (int *)0x0) {
*param_1 = (int)&PTR_FUN_0050e398;
FUN_00417c0c(param_1,0);
if ((param_2 & 1) != 0) {
FUN_004022d0(param_1);
}
}
return;
}
/* @004ad66c file=? name=FUN_004ad66c */
undefined4 * __cdecl FUN_004ad66c(undefined4 *param_1,int param_2)
{
FUN_00417d00(param_1,param_2);
*param_1 = &PTR_FUN_0050e348;
return param_1;
}
/* @004ad68b file=? name=FUN_004ad68b */
undefined4 * __cdecl FUN_004ad68b(undefined4 *param_1,int param_2)
{
FUN_00417d00(param_1,param_2);
*param_1 = &PTR_FUN_0050e348;
return param_1;
}
/* @004ad6aa file=? name=FUN_004ad6aa */
undefined4 * __cdecl FUN_004ad6aa(undefined4 *param_1,int param_2)
{
FUN_00417d28(param_1,param_2);
*param_1 = &PTR_FUN_0050e348;
return param_1;
}
/* @004ad6c9 file=? name=FUN_004ad6c9 */
void __cdecl FUN_004ad6c9(int *param_1,byte param_2)
{
if (param_1 != (int *)0x0) {
*param_1 = (int)&PTR_FUN_0050e348;
FUN_00417d54(param_1,0);
if ((param_2 & 1) != 0) {
FUN_004022d0(param_1);
}
}
return;
}
/* @004ad748 file=? name=FUN_004ad748 */
void __cdecl FUN_004ad748(int *param_1,undefined4 param_2)
{
FUN_004ac0bc(param_1,param_2);
return;
}
/* @004ad760 file=? name=FUN_004ad760 */
void __cdecl FUN_004ad760(int *param_1)
{
param_1[0x45] = param_1[0x4f];
param_1[0x56] = (int)((float)param_1[0x4f] * (float)param_1[0x55]);
param_1[0x4b] = param_1[0x4a];
param_1[0x4c] = 0;
param_1[0x4d] = 1;
param_1[0x57] = 0x3f800000;
FUN_004ad884((int)param_1);
FUN_004ad7f0((int)param_1);
param_1[0x4e] = 0;
FUN_004ac22c(param_1);
return;
}
/* @004ad7d4 file=? name=FUN_004ad7d4 */
undefined4 __cdecl FUN_004ad7d4(int param_1)
{
return *(undefined4 *)(*(int *)(*(int *)(param_1 + 0xd0) + 400) + 0x260);
}
/* @004ad7f0 file=? name=FUN_004ad7f0 */
/* WARNING: Globals starting with '_' overlap smaller symbols at the same address */
void __cdecl FUN_004ad7f0(int param_1)
{
float fVar1;
float fVar2;
float10 fVar3;
*(float *)(param_1 + 0x1cc) = *(float *)(param_1 + 0x114) * *(float *)(param_1 + 300);
fVar1 = (float)(_DAT_004ad870 * (float10)*(float *)(param_1 + 0x1cc));
fVar2 = _DAT_004ad87c;
if ((_DAT_004ad87c <= fVar1) && (fVar2 = fVar1, _DAT_004ad880 < fVar1)) {
fVar2 = _DAT_004ad880;
}
FUN_0043ade4((uint *)(param_1 + 0x144),fVar2);
fVar3 = FUN_0043ae0b((uint *)(param_1 + 0x144));
*(float *)(param_1 + 0x120) = (float)fVar3;
return;
}
/* @004ad884 file=? name=FUN_004ad884 */
void __cdecl FUN_004ad884(int param_1)
{
int iVar1;
iVar1 = 0;
do {
FUN_0043ade4((uint *)(param_1 + 0x144),0);
iVar1 = iVar1 + 1;
} while (iVar1 < 0xf);
return;
}
/* @004ad8ac file=? name=FUN_004ad8ac */
void __cdecl FUN_004ad8ac(int param_1,float param_2)
{
int iVar1;
float10 fVar2;
int iVar3;
iVar3 = param_1 + 0x164;
iVar1 = FUN_00417ab4(iVar3);
if ((iVar1 != 0) && (*(int *)(param_1 + 0x134) != 0)) {
fVar2 = FUN_004ad9ec((short)iVar3,param_1,iVar1,param_2);
*(float *)(iVar1 + 0x1c8) = (float)fVar2 + *(float *)(iVar1 + 0x1c8);
*(float *)(param_1 + 0x1c8) = -(float)fVar2 + *(float *)(param_1 + 0x1c8);
FUN_004ada94(param_1,param_2);
}
return;
}
/* @004ad924 file=? name=FUN_004ad924 */
void __cdecl FUN_004ad924(int *param_1,float param_2)
{
int iVar1;
iVar1 = FUN_004ad7d4((int)param_1);
if (iVar1 != 0) {
param_1[0x56] = (int)((float)param_1[0x72] + (float)param_1[0x56]);
param_1[0x45] = (int)((float)param_1[0x56] / (float)param_1[0x55]);
FUN_004ad7f0((int)param_1);
param_1[0x72] = 0;
FUN_004ad8ac((int)param_1,param_2);
}
iVar1 = FUN_004ad7d4((int)param_1);
if (iVar1 != 0) {
FUN_004adbf8(param_1,param_2);
}
if ((float)param_1[0x47] < (float)param_1[0x45]) {
FUN_0041bbd8((int)(param_1 + 0x5c),2);
return;
}
if ((float)param_1[0x46] < (float)param_1[0x45]) {
FUN_0041bbd8((int)(param_1 + 0x5c),1);
return;
}
FUN_0041bbd8((int)(param_1 + 0x5c),0);
return;
}
/* @004ad9ec file=? name=FUN_004ad9ec */
/* WARNING: Globals starting with '_' overlap smaller symbols at the same address */
float10 __thiscall FUN_004ad9ec(undefined2 param_1,int param_2,int param_3,float param_4)
{
float fVar1;
float fVar2;
float fVar3;
float fVar4;
float fVar5;
double dVar6;
float fVar7;
float fVar8;
float10 fVar9;
fVar7 = *(float *)(param_2 + 0x154) / *(float *)(param_2 + 0x160);
fVar8 = fVar7 + *(float *)(param_3 + 0x154);
fVar1 = *(float *)(param_2 + 0x114);
fVar2 = *(float *)(param_2 + 0x160);
fVar3 = *(float *)(param_3 + 0x158);
fVar4 = *(float *)(param_3 + 0x1c8);
fVar5 = *(float *)(param_2 + 0x158);
dVar6 = (double)((-param_4 *
*(float *)(param_2 + 0x140) *
(*(float *)(param_2 + 300) / *(float *)(param_2 + 0x128)) *
*(float *)(param_2 + 0x15c)) / fVar8);
fVar9 = (float10)FUN_004dca38(param_1,SUB84(dVar6,0),(uint)((ulonglong)dVar6 >> 0x20));
return (float10)(float)((float10)(fVar1 * fVar2 - (fVar3 + fVar4 + fVar5) / fVar8) *
(float10)fVar7 * ((float10)_DAT_004ada90 - fVar9));
}
/* @004ada94 file=? name=FUN_004ada94 */
/* WARNING: Globals starting with '_' overlap smaller symbols at the same address */
void __cdecl FUN_004ada94(int param_1,float param_2)
{
float fVar1;
float fVar2;
float fVar3;
float fVar4;
int iVar5;
float10 fVar6;
iVar5 = FUN_00417ab4(param_1 + 0x164);
if ((iVar5 != 0) &&
(fVar6 = FUN_004dcd00((double)(*(float *)(param_1 + 0x1cc) - *(float *)(iVar5 + 0x1cc))),
(float10)_DAT_004adbf4 < fVar6)) {
fVar1 = *(float *)(iVar5 + 0x1cc) / *(float *)(param_1 + 0x114) - *(float *)(param_1 + 300);
fVar2 = *(float *)(param_1 + 0x128) * param_2;
if (-fVar2 <= fVar1) {
if (fVar2 < fVar1) {
fVar1 = fVar2;
}
}
else {
fVar1 = -fVar2;
}
fVar2 = *(float *)(param_1 + 0x128) - *(float *)(param_1 + 300);
fVar3 = -*(float *)(param_1 + 300);
fVar4 = -(*(float *)(iVar5 + 0x128) - *(float *)(iVar5 + 300));
if ((fVar3 <= fVar1) && (fVar3 = fVar1, fVar2 < fVar1)) {
fVar3 = fVar2;
}
if ((fVar4 <= fVar3) && (fVar4 = fVar3, *(float *)(iVar5 + 300) < fVar3)) {
fVar4 = *(float *)(iVar5 + 300);
}
fVar4 = *(float *)(param_1 + 0x15c) * fVar4;
*(float *)(param_1 + 300) = fVar4 + *(float *)(param_1 + 300);
*(float *)(iVar5 + 300) = *(float *)(iVar5 + 300) - fVar4;
}
return;
}
/* @004adbf8 file=? name=FUN_004adbf8 */
/* WARNING: Globals starting with '_' overlap smaller symbols at the same address */
void __cdecl FUN_004adbf8(int *param_1,float param_2)
{
float fVar1;
float10 fVar2;
param_1[0x4c] = (int)(*(float *)(param_1[0x38] + 0x158) * (float)param_1[0x48]);
if ((float)param_1[0x4c] < _DAT_0050e3d8) {
param_1[0x4c] = 0;
}
fVar1 = (float)param_1[0x4c] * param_2;
if ((float)param_1[0x4b] < fVar1) {
fVar1 = (float)param_1[0x4b];
}
param_1[0x4b] = (int)((float)param_1[0x4b] - fVar1);
fVar2 = FUN_004dcd00((double)fVar1);
if ((float10)_DAT_004adcfc < fVar2) {
fVar2 = (float10)(**(code **)(*param_1 + 0x38))(param_1,fVar1);
param_1[0x4b] = (int)(float)(fVar2 + (float10)(float)param_1[0x4b]);
}
if ((param_1[0x4e] != 0) || ((float)param_1[0x4c] <= _DAT_0050e3d4)) {
if ((param_1[0x4e] == 1) && ((float)param_1[0x4c] < _DAT_0050e3d8)) {
param_1[0x4e] = 0;
}
}
else {
param_1[0x4e] = 1;
}
return;
}
/* @004add30 file=? name=FUN_004add30 */
uint __cdecl FUN_004add30(int param_1)
{
uint uVar1;
int iVar2;
uVar1 = FUN_004ac144(param_1);
if (*(int *)(param_1 + 0x184) != 0) {
uVar1 = uVar1 | 8;
}
if (*(int *)(param_1 + 0x138) != 0) {
iVar2 = FUN_004ad7d4(param_1);
if (iVar2 != 0) {
uVar1 = uVar1 | 4;
}
}
return uVar1;
}
/* @004add6c file=? name=FUN_004add6c */
undefined4 __cdecl FUN_004add6c(int *param_1,int param_2)
{
undefined4 uVar1;
if (param_2 == 1) {
*(undefined4 *)(param_1[0x38] + 0x158) = 0x3f000000;
return 1;
}
uVar1 = FUN_004ac1d4(param_1,param_2);
return uVar1;
}
/* @004adda0 file=bt/heat.cpp name=FUN_004adda0 */
int * __cdecl
FUN_004adda0(int *param_1,int param_2,undefined4 param_3,char *param_4,undefined4 param_5,
int param_6,int param_7)
{
int iVar1;
int local_8;
FUN_004ac644(param_1,param_2,param_3,param_4,param_5,param_6,param_7);
*param_1 = (int)&PTR_FUN_0050edc4;
param_1[0x45] = *(int *)(param_4 + 0xe4);
param_1[0x46] = *(int *)(param_4 + 0xe8);
param_1[0x47] = *(int *)(param_4 + 0xec);
param_1[0x48] = 0;
param_1[0x49] = 0x3f000000;
param_1[0x4a] = 0x3f800000;
param_1[0x4b] = param_1[0x4a];
param_1[0x4c] = 0;
param_1[0x4d] = 1;
param_1[0x4e] = 0;
param_1[0x4f] = param_1[0x45];
param_1[0x50] = *(int *)(param_4 + 0xf0);
FUN_0043ad4f((uint *)(param_1 + 0x51),0xf,0);
param_1[0x54] = 0x3ecccccd;
param_1[0x55] = *(int *)(param_4 + 0xf4);
param_1[0x56] = (int)((float)param_1[0x55] * (float)param_1[0x4f]);
param_1[0x57] = 0x3f800000;
param_1[0x58] = 0x3f800000;
FUN_004af9cf(param_1 + 0x59,0);
FUN_0041b9ec(param_1 + 0x5c,3);
param_1[0x72] = 0;
if (((*(uint *)(param_2 + 0x28) & 0xc) == 0) && ((*(uint *)(param_2 + 0x28) & 0x100) != 0)) {
param_1[7] = (int)PTR_FUN_0050e4e0;
param_1[8] = DAT_0050e4e4;
param_1[9] = DAT_0050e4e8;
}
param_1[0x71] = (int)param_4;
local_8 = 0;
iVar1 = FUN_0041a1a4(*(int *)param_1[3],0x50e590);
if (iVar1 == 0) {
if (*(int *)(param_4 + 0xf8) < *(int *)(param_2 + 0x124)) {
local_8 = *(int *)(*(int *)(param_2 + 0x128) + *(int *)(param_4 + 0xf8) * 4);
}
else {
FUN_0040385c(s_Bad_subsystem_resource_>heatSink_0050e7c9,s_d__tesla_bt_bt_HEAT_CPP_0050e804,
0x25f);
}
if (((*(uint *)(param_2 + 0x28) & 0xc) == 0) && ((*(uint *)(param_2 + 0x28) & 0x100) != 0)) {
if (local_8 == 0) {
FUN_0040385c(s_Master_heatable_subystem_is_miss_0050e81c,s_d__tesla_bt_bt_HEAT_CPP_0050e859,
0x26b);
}
else {
(**(code **)(param_1[0x59] + 4))(param_1 + 0x59,local_8);
}
}
else if (((*(uint *)(param_2 + 0x28) & 0xc) == 4) && (local_8 != 0)) {
(**(code **)(param_1[0x59] + 4))(param_1 + 0x59,local_8);
}
}
FUN_004ad7f0((int)param_1);
return param_1;
}
/* @004adfd4 file=? name=FUN_004adfd4 */
void __cdecl FUN_004adfd4(int *param_1,byte param_2)
{
if (param_1 != (int *)0x0) {
*param_1 = (int)&PTR_FUN_0050edc4;
FUN_0041baa4(param_1 + 0x5c,2);
FUN_004af9ee(param_1 + 0x59,2);
FUN_0043adb5(param_1 + 0x51,2);
FUN_004ac868(param_1,0);
if ((param_2 & 1) != 0) {
FUN_004022d0(param_1);
}
}
return;
}
/* @004ae034 file=? name=FUN_004ae034 */
void __cdecl FUN_004ae034(int param_1)
{
FUN_0041a1a4(**(int **)(param_1 + 0xc),0x50e3ec);
return;
}
/* @004ae050 file=? name=FUN_004ae050 */
void __cdecl FUN_004ae050(int param_1)
{
int iVar1;
FUN_004ac8c0(param_1);
iVar1 = *(int *)(param_1 + 0x184);
if (iVar1 == 0) {
FUN_004dbb24(&DAT_00524e20,*(char **)(param_1 + 0xd4),(char *)0x0);
FUN_004dbb24(&DAT_00524e20,s___NormalHeat_0050e893,(char *)0x0);
FUN_004d9c38(&DAT_00524e20);
}
else {
if (iVar1 == 1) {
FUN_004dbb24(&DAT_00524e20,*(char **)(param_1 + 0xd4),(char *)0x0);
FUN_004dbb24(&DAT_00524e20,s___DegradationHeat_0050e880,(char *)0x0);
FUN_004d9c38(&DAT_00524e20);
return;
}
if (iVar1 == 2) {
FUN_004dbb24(&DAT_00524e20,*(char **)(param_1 + 0xd4),(char *)0x0);
FUN_004dbb24(&DAT_00524e20,s___FailureHeat_0050e871,(char *)0x0);
FUN_004d9c38(&DAT_00524e20);
return;
}
}
FUN_004dbb24(&DAT_00524e20,*(char **)(param_1 + 0xd4),(char *)0x0);
FUN_004dbb24(&DAT_00524e20,s_Unknown_Heat_State__0050e8a1,(char *)0x0);
FUN_004d9c38(&DAT_00524e20);
return;
}
/* @004ae150 file=? name=FUN_004ae150 */
/* WARNING: Globals starting with '_' overlap smaller symbols at the same address */
undefined4 __cdecl
FUN_004ae150(int param_1,char *param_2,char *param_3,char *param_4,int param_5,int param_6,
int param_7)
{
char *pcVar1;
int iVar2;
undefined4 uVar3;
char *pcVar4;
char *pcVar5;
bool bVar6;
char *local_8;
iVar2 = FUN_004ac9ec(param_1,param_2,param_3,param_4,param_5,param_6,param_7);
if (iVar2 == 0) {
uVar3 = 0;
}
else {
param_4[0x24] = -4;
param_4[0x25] = '\0';
param_4[0x26] = '\0';
param_4[0x27] = '\0';
param_4[0x20] = -0x44;
param_4[0x21] = '\v';
param_4[0x22] = '\0';
param_4[0x23] = '\0';
if (param_7 == 1) {
param_4[0xe4] = '\0';
param_4[0xe5] = '\0';
param_4[0xe6] = -0x80;
param_4[0xe7] = -0x41;
param_4[0xe8] = '\0';
param_4[0xe9] = '\0';
param_4[0xea] = -0x80;
param_4[0xeb] = -0x41;
param_4[0xec] = '\0';
param_4[0xed] = '\0';
param_4[0xee] = -0x80;
param_4[0xef] = -0x41;
param_4[0xf0] = '\0';
param_4[0xf1] = '\0';
param_4[0xf2] = -0x80;
param_4[0xf3] = -0x41;
param_4[0xf4] = '\0';
param_4[0xf5] = '\0';
param_4[0xf6] = -0x80;
param_4[0xf7] = -0x41;
param_4[0xf8] = -1;
param_4[0xf9] = -1;
param_4[0xfa] = -1;
param_4[0xfb] = -1;
}
iVar2 = FUN_00404118(param_5,param_3,s_StartingTemperature_0050e8b6,(float *)(param_4 + 0xe4));
if ((iVar2 == 0) && (_DAT_004ae460 == *(float *)(param_4 + 0xe4))) {
FUN_004dbb24((int *)&DAT_00524e68,param_3,(char *)0x0);
FUN_004dbb24((int *)&DAT_00524e68,s_missing_StartingTemperature__0050e8ca,(char *)0x0);
uVar3 = 0;
}
else {
iVar2 = FUN_00404118(param_5,param_3,s_DegradationTemperature_0050e8e9,
(float *)(param_4 + 0xe8));
if ((iVar2 == 0) && (_DAT_004ae460 == *(float *)(param_4 + 0xe8))) {
FUN_004dbb24((int *)&DAT_00524e68,param_3,(char *)0x0);
FUN_004dbb24((int *)&DAT_00524e68,s_missing_DegradationTemperature__0050e900,(char *)0x0);
uVar3 = 0;
}
else {
iVar2 = FUN_00404118(param_5,param_3,s_FailureTemperature_0050e922,(float *)(param_4 + 0xec)
);
if ((iVar2 == 0) && (_DAT_004ae460 == *(float *)(param_4 + 0xec))) {
FUN_004dbb24((int *)&DAT_00524e68,param_3,(char *)0x0);
FUN_004dbb24((int *)&DAT_00524e68,s_missing_FailureTemperature__0050e935,(char *)0x0);
uVar3 = 0;
}
else {
iVar2 = FUN_00404118(param_5,param_3,s_ThermalConductance_0050e953,
(float *)(param_4 + 0xf0));
if ((iVar2 == 0) && (_DAT_004ae460 == *(float *)(param_4 + 0xf0))) {
FUN_004dbb24((int *)&DAT_00524e68,param_3,(char *)0x0);
FUN_004dbb24((int *)&DAT_00524e68,s_missing_ThermalConductance__0050e966,(char *)0x0);
uVar3 = 0;
}
else {
iVar2 = FUN_00404118(param_5,param_3,s_ThermalMass_0050e984,(float *)(param_4 + 0xf4));
if ((iVar2 == 0) && (_DAT_004ae460 == *(float *)(param_4 + 0xf4))) {
FUN_004dbb24((int *)&DAT_00524e68,param_3,(char *)0x0);
FUN_004dbb24((int *)&DAT_00524e68,s_missing_ThermalMass__0050e990,(char *)0x0);
uVar3 = 0;
}
else {
local_8 = s_Unspecified_0050e9a7;
iVar2 = FUN_00404088(param_5,param_3,s_HeatSink_0050e9b3,&local_8);
if ((iVar2 == 0) && (*(int *)(param_4 + 0xf8) == -1)) {
FUN_004dbb24((int *)&DAT_00524e68,param_3,(char *)0x0);
FUN_004dbb24((int *)&DAT_00524e68,s_missing_HeatSink__0050e9bc,(char *)0x0);
uVar3 = 0;
}
else {
pcVar5 = s_Unspecified_0050e9d0;
pcVar4 = local_8;
do {
bVar6 = *pcVar4 == *pcVar5;
if (!bVar6) break;
if (*pcVar4 == '\0') goto LAB_004ae418;
pcVar1 = pcVar4 + 1;
bVar6 = *pcVar1 == pcVar5[1];
if (!bVar6) break;
pcVar4 = pcVar4 + 2;
pcVar5 = pcVar5 + 2;
bVar6 = *pcVar1 == '\0';
} while (!bVar6);
if (!bVar6) {
iVar2 = FUN_004215b0(param_5,local_8);
*(int *)(param_4 + 0xf8) = iVar2;
}
LAB_004ae418:
if (*(int *)(param_4 + 0xf8) < 0) {
FUN_004dbb24((int *)&DAT_00524e68,param_3,(char *)0x0);
FUN_004dbb24((int *)&DAT_00524e68,s_has_an_invalid_heat_sink__0050e9dc,(char *)0x0
);
uVar3 = 0;
}
else {
*(int *)(param_4 + 0xf8) = *(int *)(param_4 + 0xf8) + 2;
uVar3 = 1;
}
}
}
}
}
}
}
}
return uVar3;
}