KAZIK/tools/tests/export_scratch_probe.py
Игорь Федосеев ca62db53e9 feat: implement native billiards, scratch tickets, first-person dice, and city wake scene
- Billiards: add native Russian Pyramid & American Eight-Ball pool with physics prediction, controls, and regression tests
- Scratch Tickets: add dedicated counter, mat presentation, elliptical coin scraping, 4 ticket types, and payout effects
- First-Person Dice: add native dice scene, hand anchor frames, throwing animation, and table perspective
- City Wake & Weather: add arrival cutscene, alley geometry, weather/rain effects, and lighter/rocker animation
- World Dressing: add hall paintings, furniture packs, hall lighting, and scene regression tests
- Build & Tooling: update build.bat for modern MSVC toolchain, update launcher hash, and refresh shipping binaries
2026-10-16 12:37:40 +03:00

45 lines
1.6 KiB
Python

"""Expose selected data labels in a COPY of the tested COFF for a render probe.
No instructions, relocations or game executable are rewritten. Native scene
procedures stay byte-identical to the action-tested game; only COFF visibility
changes so a small ASM entry point can set deterministic scene inputs.
"""
from pathlib import Path
import struct
from check_card_exit_build import Coff
ROOT = Path(__file__).resolve().parents[2]
NAMES = {
"bankroll","rngSeed3D","engineMode","scrState3D","scrPriceIndex3D",
"scrHeld3D","scrPointerValid3D","scrPointerX3D","scrPointerY3D",
"animationClock3D","deltaTime3D","playerX","playerY","playerAngle","scrTableArt3D","interactTargetId",
"scrType3D","scrZoom3D","scrCounts3D","scrCatalog3D",
"scrDealMs3D",
}
def main():
source = ROOT / "build/actions/actions-test.obj"
coff = Coff(source)
original = coff.data
data = bytearray(original)
offset = struct.unpack_from("<I",data,8)[0]
found = set()
changed = set()
for index,name in coff.symbols.items():
if name not in NAMES:
continue
at = offset+18*index+16
assert data[at] in (2,3), name
found.add(name)
if data[at] != 2:
changed.add(at)
data[at] = 2
assert found == NAMES, NAMES-found
assert {i for i,(a,b) in enumerate(zip(original,data)) if a != b} == changed
(ROOT / "build/scratch/native-probe-base.obj").write_bytes(data)
print(f"Copied tested COFF with {len(NAMES)} visible probe-state labels; code/relocations untouched")
if __name__ == "__main__":
main()