- Add playable ten-frame bowling against bot with two timing gates (direction/power) and fixed-step physics - Add lane match interaction, shaded ball surface, pin collisions, bonus balls, and live score sheet - Scale rooftop terrace visitor sprites to eye level according to the taller rooftop standing eye height - Resolve mode and interaction ID conflicts with Hell FPS (MODE_BOWLING=30, INTERACT_BOWL_PLAY=56) - Update launcher hash, installer package, and expansion regression test suites
35 lines
1.6 KiB
Python
35 lines
1.6 KiB
Python
"""Open the production native bowling scene without accessing player profiles."""
|
|
import hashlib
|
|
import subprocess
|
|
from pathlib import Path
|
|
from check_hall_expansion import ROOT, OUT, prepare
|
|
from check_artifacts import toolchain
|
|
|
|
|
|
def main():
|
|
def profile():
|
|
return {str(p): hashlib.sha256(p.read_bytes()).digest()
|
|
for p in (ROOT/'runtime').rglob('*') if p.is_file()}
|
|
prepare()
|
|
source = (OUT/'module.asm').read_text(encoding='cp1251')
|
|
source = source.replace('end ExpansionTestStart',
|
|
'include tools/tests/bowling_play_ui.inc\nend BowlingUiStart')
|
|
target = OUT/'bowling-ui'
|
|
target.with_suffix('.asm').write_text(source, encoding='cp1251')
|
|
ml,link = toolchain()
|
|
sdk = sorted(Path('C:/Program Files (x86)/Windows Kits/10/Lib').glob('*/um/x86'))[-1]
|
|
subprocess.run([str(ml),'/c','/coff','/Cp','/nologo','/I.',
|
|
f'/Fo{target}.obj',f'{target}.asm'],cwd=ROOT,check=True)
|
|
subprocess.run([str(link),'/nologo','/SUBSYSTEM:WINDOWS','/ENTRY:BowlingUiStart@0',
|
|
f'/LIBPATH:{sdk}',f'/OUT:{target}.exe',f'{target}.obj',
|
|
str(OUT/'helpers.obj'),'kernel32.lib','user32.lib','gdi32.lib',
|
|
'winmm.lib','ws2_32.lib'],cwd=ROOT,check=True)
|
|
before = profile()
|
|
result = subprocess.run([str(target.with_suffix('.exe'))],cwd=ROOT,timeout=900)
|
|
assert result.returncode == 0,result.returncode
|
|
assert profile() == before,'Interactive bowling changed the player profile'
|
|
print('PASS: interactive native bowling closed without changing the player profile')
|
|
|
|
|
|
if __name__ == '__main__':
|
|
main()
|