docs(control): recover AniMesh config provenance

This commit is contained in:
2026-07-18 20:02:46 +04:00
parent 5052edbee9
commit 3553107514
2 changed files with 32 additions and 0 deletions
+11
View File
@@ -265,6 +265,17 @@ AniMesh/unit components, а не с одной глобальной настро
private objects и per-tick update slots пока не восстановлены; порядок private objects и per-tick update slots пока не восстановлены; порядок
создания не доказывает скорость, collision algorithm или AI semantics. создания не доказывает скорость, collision algorithm или AI semantics.
Headless Ghidra call-site decompile уточняет configuration provenance:
AniMesh передаёт в `LoadControlSystem` шесть 32-byte strings из одного
configuration block по offsets `+0x80`, `+0xa0`, `+0xc0`, `+0xe0`, `+0x100` и
`+0x120`, затем resource context и mode из owner `+0x6d8`. Returned Control
interface сразу получает пять virtual calls, связывающих его с owner slots
`+0x158`, `+0x160`, `+0x164`, `+0x168` и `+0x18c`; collision object затем
связывается с `+0x170`. Это достаточное основание хранить будущий Control
component как ordered raw-string/resource provenance, но не для присвоения
этим строкам смысловых имён до трассировки private update methods. Extractor:
`tools/ghidra/ExportAniMeshControlCaller.java`.
### Control system и physical model ### Control system и physical model
`LoadControlSystem` загружает настройки controller-а: ограничения скорости, `LoadControlSystem` загружает настройки controller-а: ограничения скорости,
@@ -0,0 +1,21 @@
// Emits the function containing the observed AniMesh Control-loader sequence.
import ghidra.app.decompiler.DecompInterface;
import ghidra.app.script.GhidraScript;
import ghidra.program.model.address.Address;
import ghidra.program.model.listing.Function;
public class ExportAniMeshControlCaller extends GhidraScript {
@Override
public void run() throws Exception {
Address address = currentProgram.getAddressFactory().getDefaultAddressSpace()
.getAddress(0x100032e7L);
Function function = currentProgram.getFunctionManager().getFunctionContaining(address);
println("===== AniMesh Control caller =====");
if (function == null) { println("missing"); return; }
println("entry=" + function.getEntryPoint());
DecompInterface decompiler = new DecompInterface();
decompiler.openProgram(currentProgram);
println(decompiler.decompileFunction(function, 60, monitor).getDecompiledFunction().getC());
decompiler.dispose();
}
}