#60 PART 2: the RE-EXPORT -- dark code 90KB -> 41KB, coverage 87.3% -> 93.5%

Installed JDK 21 + Ghidra 12.1.2 (no admin, %LOCALAPPDATA%\bt411-tools beside
DXSDK/cmake; runner uses 8.3 SHORT paths because Ghidra's .bat expands
%JAVA_HOME% unquoted and the profile has a space).

New tooling: reference/ghidra_scripts/ExportGaps.java -- ExportAll's exact
output contract PLUS a gap-fill pass (force disassembly + createFunction at
E8 call targets outside functions, data->code pointers at a plausible
prologue, and the census's discovered starts; iterated to a fixpoint,
logged to gapfill_report.tsv).  tools/ghidra_reexport.sh (headless runner,
'reprocess' mode) and tools/gapdiff.py (score two censused exports);
gapcensus.py now censuses any export dir.

Results: 6267 -> 6472 functions (+205 created in 2 rounds: 195 census
starts, 6 call targets, 4 data pointers; 56.1KB newly covered), ZERO
decompile failures.  Dark real code 90.4 -> 40.8 KB (54.8% recovered);
game-side dark 53.1 -> 21.1 KB; regions 428 -> 321.  EVERY historically
dark function now has pseudocode -- including @0x4c05c4 VehicleDead, the
absence that opened this issue.

VALIDATION: the new pseudocode confirms this week's hand reconstruction of
the crouch field-for-field (mapPosture/duckState/squatCapable/myomerEff/
novice gate/SetLegAnimation/ForceUpdate/stability alarm) -- and exposed one
branch the raw pass missed: AIRBORNE AUTO-RISE (mode 3|4 && legState 1 ->
forced squ), now implemented in mech4.cpp and re-benched un-regressed.

PROMOTION: the re-export is canonical reference/decomp/; the previous export
is preserved at reference/decomp/archive_2025export/ so old
`part_0NN.c:LINE` citations still resolve (addresses are stable across both;
line/shard membership is NOT -- cite @ADDR).

New lead recorded: @0x4c0904 is the MASTER BTPlayer Performance (team
resolution, EndMission console post, score heartbeat) -- our @0x4c083c
PlayerSimulation attribution needs a re-check.  KB: source-completeness,
gotcha #20 (the rule is cheap now -- look it up), CLAUDE.md router/layout.
Log: phases/phase-04-gap-census.md.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Joe DiPrima
2026-08-06 11:11:26 -05:00
co-authored by Claude Fable 5
parent e69c0d7aa8
commit f44be87ab2
52 changed files with 239808 additions and 39954 deletions
+55 -83
View File
@@ -49,6 +49,24 @@ void __cdecl __GetExceptDLLinfo(undefined4 *param_1)
/* @00401074 file=? name=FUN_00401074 */
int FUN_00401074(void)
{
char *pcVar1;
int iVar2;
pcVar1 = (char *)FUN_004dee74(s_HEAPSIZE_004e0373);
if (pcVar1 == (char *)0x0) {
return 0x600000;
}
iVar2 = FUN_004dd1e0(pcVar1);
return iVar2;
}
/* @0040109c file=? name=FUN_0040109c */
undefined4 __cdecl FUN_0040109c(int param_1,undefined4 param_2)
@@ -9601,6 +9619,43 @@ float * __cdecl FUN_0040a4d8(float *param_1,float *param_2,float *param_3,float
/* @0040a67c file=? name=FUN_0040a67c */
void __cdecl FUN_0040a67c(int *param_1,float *param_2)
{
float fVar1;
float fVar2;
float fVar3;
float fVar4;
int *piVar5;
byte bVar6;
byte bVar7;
byte bVar8;
byte bVar9;
bVar9 = 0x3e;
fVar1 = param_2[3];
bVar8 = 0x2c;
fVar2 = param_2[2];
bVar7 = 0x2c;
fVar3 = param_2[1];
bVar6 = 0x2c;
fVar4 = *param_2;
piVar5 = FUN_004db92c(param_1,0x3c);
piVar5 = FUN_004db634(piVar5,(float10)fVar4);
piVar5 = FUN_004db92c(piVar5,bVar6);
piVar5 = FUN_004db634(piVar5,(float10)fVar3);
piVar5 = FUN_004db92c(piVar5,bVar7);
piVar5 = FUN_004db634(piVar5,(float10)fVar2);
piVar5 = FUN_004db92c(piVar5,bVar8);
piVar5 = FUN_004db634(piVar5,(float10)fVar1);
FUN_004db92c(piVar5,bVar9);
return;
}
/* @0040a738 file=? name=FUN_0040a738 */
undefined4 FUN_0040a738(void)
@@ -9897,86 +9952,3 @@ float * __cdecl FUN_0040ac6c(float *param_1,float *param_2)
/* @0040ad2c file=? name=FUN_0040ad2c */
float * __cdecl FUN_0040ad2c(float *param_1,float *param_2)
{
float local_1c;
float local_18;
float local_14;
float local_10;
float local_c;
float local_8;
FUN_00408328(&local_c,param_2 + 1);
FUN_00408328(&local_14,param_2);
FUN_00408328(&local_1c,param_2 + 2);
*param_1 = local_c * local_14 * local_1c + local_10 * local_18;
param_1[4] = local_8 * local_1c;
param_1[8] = local_c * local_10 * local_1c - local_14 * local_18;
param_1[1] = local_c * local_14 * local_18 - local_10 * local_1c;
param_1[5] = local_8 * local_18;
param_1[9] = local_c * local_10 * local_18 + local_14 * local_1c;
param_1[2] = local_8 * local_14;
param_1[6] = -local_c;
param_1[10] = local_8 * local_10;
return param_1;
}
/* @0040adec file=? name=FUN_0040adec */
/* WARNING: Globals starting with '_' overlap smaller symbols at the same address */
float * __cdecl FUN_0040adec(float *param_1,float *param_2)
{
float fVar1;
float fVar2;
float fVar3;
float fVar4;
float fVar5;
float fVar6;
float fVar7;
float fVar8;
float fVar9;
float fVar10;
float fVar11;
float fVar12;
float fVar13;
float fVar14;
float fVar15;
float fVar16;
fVar1 = *param_2;
fVar2 = param_2[1];
fVar3 = param_2[1];
fVar4 = param_2[2];
fVar5 = param_2[2];
fVar6 = *param_2;
fVar7 = param_2[3];
fVar8 = *param_2;
fVar9 = param_2[3];
fVar10 = param_2[1];
fVar11 = param_2[3];
fVar12 = param_2[2];
fVar13 = param_2[3] * param_2[3];
fVar14 = *param_2 * *param_2;
fVar15 = param_2[1] * param_2[1];
fVar16 = param_2[2] * param_2[2];
*param_1 = ((fVar13 + fVar14) - fVar15) - fVar16;
param_1[1] = (fVar1 * fVar2 - fVar11 * fVar12) * _DAT_0040aedc;
param_1[2] = (fVar5 * fVar6 + fVar9 * fVar10) * _DAT_0040aedc;
param_1[4] = (fVar11 * fVar12 + fVar1 * fVar2) * _DAT_0040aedc;
param_1[5] = ((fVar13 - fVar14) + fVar15) - fVar16;
param_1[6] = (fVar3 * fVar4 - fVar7 * fVar8) * _DAT_0040aedc;
param_1[8] = (fVar5 * fVar6 - fVar9 * fVar10) * _DAT_0040aedc;
param_1[9] = (fVar3 * fVar4 + fVar7 * fVar8) * _DAT_0040aedc;
param_1[10] = ((fVar13 - fVar14) - fVar15) + fVar16;
return param_1;
}
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff