RAINBOW ISLANDS

par davidnurdin · Remakes
pas encore noté
▶ Jouer Sources Éditer GitHub
games/rainbow-island / tools / extract / island.py · commit d529485
import sys, structdef unpack(src, size=0x2500):    out=bytearray(); i=0    while len(out)<size:        c=src[i]; out.append(c); i+=1        same=1        while len(out)<size:            a=src[i]            if a!=c: break            out.append(a); i+=1; same+=1            if same==3:                n=src[i]; i+=1                out.extend([c]*(n-1)); break        else: break        if same==3: continue    return bytes(out[:size])def unpack2(src,size=0x2500):    # literal port of #7135    out=bytearray(); i=0    while True:        a=src[i]; c=a; out.append(a); i+=1        if len(out)>=size: return bytes(out)        while True:            b=2; restart=False            while b:                a=src[i]                if a!=c:                    out.append(a); c=a; i+=1                    if len(out)>=size: return bytes(out)                    restart=True; break                out.append(a); i+=1                if len(out)>=size: return bytes(out)                b-=1            if restart: continue            n=src[i]; i+=1; n-=1            if n:                for _ in range(n):                    out.append(c)                    if len(out)>=size: return bytes(out)            breakdef blocks(u):    lens=struct.unpack('<8H',u[:16])    tiles=u[0x10:0x210]; pal=u[0x210:0x250]; b=u[0x250]    p=0x251; bl=[]    for n in lens[:6]:        bl.append(u[p:p+n]); p+=n    return dict(header=lens,gfx512=tiles,data64=pal,byte=b,blocks=bl,rest=u[p:])if __name__=='__main__':    src=open(sys.argv[1],'rb').read()    u=unpack2(src)    ref=open(sys.argv[2],'rb').read()[0x7300:0x7300+0x2500] if len(sys.argv)>2 else None    if ref: print('match', u==ref)    b=blocks(u)    print([hex(x) for x in b['header']], hex(b['byte']), [len(x) for x in b['blocks']], len(b['rest']))