Zombi Ubisoft (1986) PHP

par espritm · Remakes
pas encore noté
▶ Jouer 💬 Avis 1 Sources 🕘 Versions Éditer GitHub
games/zombi-ubisoft-1986-php / tools / extract / sources / capture-rooms.py · commit 5c56e28
"""Controlled original renders, not claims that rooms were reached in normal play.Change only the room ID at the known starting map cell, then ask the original'scharacter-selection action to refresh it. Original loader, drawing and objects run."""from pathlib import Pathimport subprocess, sys, jsonfrom PIL import Imageroot=Path('/workspace')sys.path.insert(0,str(root/'dsk2jumphp/tools'))from cpc import Dumplit='--lit' in sys.argvids=[int(v) for v in sys.argv[1:] if v!='--lit'] or list(range(1,91))for room in ids:    if not 1<=room<=90:        raise ValueError(room)    out=root/f'analysis/runs/room-capture-{"lit-" if lit else ""}{room:02d}'    out.mkdir(parents=True,exist_ok=True)    events=['8200:return+','8220:return-','8300:enter+','8320:enter-']    for f in range(8600,9500,100):        events += [f'{f}:right+',f'{f+8}:right-']    events += ['9700:copy+','9708:copy-','10000:copy+','10008:copy-']    args=[str(root/'dsk2jumphp/emulator/cpc'),str(root/'Zombi__FRENCH__Side_A.dsk'),        str(out),'11500','-rom',str(root/'ROM CPC 6128 OS + BASIC et AMSDOS/CPC6128.ROM'),        '-urom','7:'+str(root/'ROM CPC 6128 OS + BASIC et AMSDOS/amsdos.rom'),        '-type','150:RUN3WO*BI\\n','-swap','8100:'+str(root/'Zombi__FRENCH__Side_B.dsk'),        '-F',f'8500:6862={room:02x}','-k',','.join(events),'-s','11499','-d','11499', '-b', '9d98', '-b-after','10000']    if lit:        args += ['-F','8500:6712=01']    subprocess.run(args,check=True)    d=Dump(out/'dump-11499.bin')    actual=int.from_bytes(d.mem[0x6617:0x6619],'little')    expected=0x6876+(room-1)*50    if actual!=expected:        raise RuntimeError(f'Room {room}: pointer {actual:x}, expected {expected:x}')    img=d.screen()    img.save(out/'screen.png')    assets=root/f'analysis/extracted/rooms{"-lit" if lit else ""}';assets.mkdir(parents=True,exist_ok=True)    img.crop((8,48,168,128)).save(assets/f'room-{room:02d}.png')    candidates=[]    for p in out.glob('bp9d98-*.bin'):        before=Dump(p)        if int.from_bytes(before.mem[0x6617:0x6619],'little') == expected:            candidates.append((int(p.stem.split('-')[-1]),before))    if not candidates:        crop=img.crop((8,48,168,128))        if crop.getextrema()!=((0,0),(0,0),(0,0)):            raise RuntimeError(f'Room {room}: no pre-object render captured')        crop.save(assets/f'background-{room:02d}.png')    else:        before=max(candidates,key=lambda v:v[0])[1]        before.screen().crop((8,48,168,128)).save(assets/f'background-{room:02d}.png')    print(json.dumps({'controlled_room':room,'record_pointer':hex(actual),'capture':str(assets/f'room-{room:02d}.png')}),flush=True)