- 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
45 lines
1.6 KiB
Python
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()
|