PT

Zombi Ubisoft (1986) PHP

por espritm · Remakes
ainda sem nota
▶ Jogar 💬 Avaliações 1 Código-fonte 🕘 Versões Editar GitHub
games/zombi-ubisoft-1986-php / tools / extract / sources / probe-quest-gates.py · commit 8af5764
"""Isolate original freezer/arrival and top-landing unlock conditions, without patching phase/fuel flags."""from pathlib import Pathfrom importlib.machinery import SourceFileLoaderimport json,sysrunner=SourceFileLoader('rules','/workspace/analysis/rule-runner.py').load_module()from cpc import Dumproot=Path('/workspace');case=sys.argv[1];world=json.loads((root/'analysis/extracted/world.json').read_text())rooms={r['id']:r for r in world['rooms']+world['vehicle_interiors']}unlock=case.startswith('unlock');key=int(case[-1]) if unlock else 0e=runner.Experiment('quest-'+case,63 if unlock else 11,position_start=True)def press(name):    e.events += [f'{e.frame}:{name}+',f'{e.frame+24}:{name}-'];e.frame+=220e.key=pressif unlock:    e.pokes += ['8500:7498=00'] # room 63 enemy count    if key:e.pokes += ['11000:66c7=31']    e.mark('initial');e.select(4);e.key('copy');e.cell(0,0);e.key('copy')    for _ in range(3):e.key('up')    e.key('copy');e.mark('top-locked')    e.select(8);e.key('copy');e.key('f');e.key('copy');e.mark('opened')    e.select(15);e.key('copy');e.key('copy');e.mark('entered')else:    target=Dump(root/'analysis/runs/direction-3/dump-08900.bin').mem[0x6621]    count=target-(2 if case=='short' else 1)    e.pokes += [f'11000:6620={count:02x}','11000:66c3=35']    for room in (64,65,66):e.pokes += [f'11000:{0x6876+(room-1)*50+9:04x}={0 if case=="unparked" and room==66 else 77:02x}']    e.mark('initial');e.select(2);e.key('copy');e.key('copy');e.mark('deposited',700)    if case=='ready':        p=int(rooms[78]['map_address'],16)        e.pokes += [f'{e.frame}:66ab={p&255:02x}',f'{e.frame}:66ac={p>>8:02x}',f'{e.frame}:7786=00']        e.select(10);e.key('copy');e.key('copy');e.mark('fuel-truck',500)run=runner.subprocess.runrunner.subprocess.run=lambda cmd,**kwargs:run(cmd+['-b','9d98','-b-after','11200'],**kwargs)e.run(watch='6713')out=root/f'analysis/runs/{e.name}';states=[]for frame,label in e.marks:    d=Dump(out/f'dump-{frame:05d}.bin')    states.append({'label':label,'frozen':d.mem[0x6620],'target':d.mem[0x6621],'phase':d.mem[0x6713],        'rooms':{str(r):list(d.mem[0x6876+(r-1)*50:0x6876+r*50]) for r in (11,19,21,22,23,59,63,64,65,66,77,78)},        'fuel':[d.mem[0x6710],d.mem[0x6711]],'used':d.mem[0x66d2]})(out/'quest-states.json').write_text(json.dumps(states,indent=2))if case=='ready':    candidates=[]    for path in out.glob('bp9d98-*.bin'):        d=Dump(path);p=int.from_bytes(d.mem[0x6617:0x6619],'little')        if p==0x7780 and d.mem[p+9]==78:candidates.append((int(path.stem.split('-')[-1]),d))    assert candidates    max(candidates,key=lambda v:v[0])[1].screen().crop((8,48,168,128)).save(root/'analysis/extracted/raiders-background.png')