XFE Git
XFE Studio Git
Git 首页 全局搜索
XFE 主站 文档 NuGet

XFEEDToolBox

【WinUI】XFE精英危险工具箱

公开
关注 0 Fork 0 Star 0
UTF-8
"""Trace original commodity labels and UID references in the already decoded local frozen data."""
import contextlib,hashlib,io,json,runpy,struct
from pathlib import Path

# Reuse the validated pool decoder. Its sole write is the deterministic numeric
# original-appearance.json derived artifact; no original game file is changed.
with contextlib.redirect_stdout(io.StringIO()):
    state=runpy.run_path('research/Extract-OriginalGalaxyAppearance.py')
b=state['b'];pools=state['pools'];data_start=state['data_start'];references=state['references'];at=state['at']
def pointers(offset):
    return [(index,offset-data_start-pool['offset']) for index,pool in enumerate(pools) if data_start+pool['offset']<=offset<data_start+pool['offset']+pool['size']]
def incoming(pointer):
    result=[]
    for source,target in references.items():
        if target!=pointer:continue
        start=max(0,source[1]-24);length=min(96,pools[source[0]]['size']-start)
        result.append(dict(source=source,neighbourBytes=b[at((source[0],start)):at((source[0],start))+length].hex(),neighbourOffset=start,nearbyReferences=[dict(field=key[1],target=value) for key,value in references.items() if key[0]==source[0] and start<=key[1]<start+length]))
    return result
labels=[]
for name in ('Metals','Minerals','Foods','ConsumerItems','Other','Aluminium','Gold','Scrap'):
    needle=name.encode()+b'\0';offset=0
    while (offset:=b.find(needle,offset))>=0:
        if offset>=data_start:
            labels.append(dict(name=name,fileOffset=hex(offset),pointers=[dict(pointer=pointer,incoming=incoming(pointer)) for pointer in pointers(offset)]))
        offset+=len(needle)
uid_rows=[];offset=data_start;needle=struct.pack('<I',671333304)
while (offset:=b.find(needle,offset))>=0:
    uid_rows.append(dict(fileOffset=hex(offset),pointers=[dict(pointer=pointer,incoming=incoming(pointer)) for pointer in pointers(offset)]));offset+=4
result=dict(frozenSha256=hashlib.sha256(b).hexdigest(),labels=labels,savedUidMatches=uid_rows)
result['candidateTables']=[dict(pointer=pointer,incoming=incoming(pointer)) for pointer in ((348,8080),(165,11008))]
result['nearbyRoots']=[row for row in state['roots'] if row[2] in (423,295,286,396)]
result['appearanceIncoming']=[dict(pointer=pointer,incoming=incoming(pointer)) for pointer in ((295,14000),(286,6144))]
result['resourceParentReferences']=[dict(source=source,target=target,incoming=incoming(source)) for source,target in references.items() if target[0]==396 and 2000<=target[1]<=2256]
result['categoryRows']=[dict(name=state['string'](references[348,8080+index*16]),value=struct.unpack_from('<I',b,at((348,8080+index*16))+8)[0]) for index in range(13)]
result['commodityRows']=[dict(name=state['string'](references[165,11008+index*16]),category=struct.unpack_from('<I',b,at((165,11008+index*16))+8)[0]) for index in range(123)]
result['commodityConfigurationStrings']=[dict(field=hex(field),value=state['string'](references[423,14672+field])) for field in (0xa0,0xa8,0xb0)]
output=Path('artifacts/galaxy-query-research/commodity-tree/frozen-label-references.json');output.write_text(json.dumps(result,indent=2),encoding='utf-8')
print(json.dumps(result,indent=2))