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

XFEEDToolBox

【WinUI】XFE精英危险工具箱

公开
关注 0 Fork 0 Star 0
UTF-8
"""Copy actual original diffuse/RGB/Y textures and atlas selection, no synthetic pixels."""
from pathlib import Path
import gzip,hashlib,json,struct

source=Path('artifacts/galaxy-query-research/power-outer-sources/material')
metadata=json.loads((source/'original-materials.json').read_text())
body=(source/(metadata['resource']+'.stream0')).read_bytes()
if hashlib.sha256(body).hexdigest()!=metadata['frozenSha256']:raise ValueError('Original material source changed')
names=[('diffuseAtlas','massivestars.pmilkywaydiffusetexture'),('milkyWayColour','milkyway.vgalaxysourcecolortexture'),
       ('milkyWayHeightColour','milkyway.vgalaxysourcecolorytexture'),('dustHeightColour','massivestars.vgalaxysourcecolorytexture')]
payload=bytearray();textures=[]
for name,original in names:
    texture=next(t for t in metadata['textures'] if t['name']==original)
    if texture['sourceFormat']!=95 or texture['array']!=1 or texture['depth']!=1:raise ValueError('Original BC1 map texture changed')
    data=body[texture['gpuOffset']:texture['gpuOffset']+texture['gpuBytes']]
    offset=len(payload);payload.extend(data)
    textures.append(dict(name=name,originalName=original,width=texture['width'],height=texture['height'],mips=texture['mipLayout'],
        payloadOffset=offset,payloadBytes=len(data),sha256=hashlib.sha256(data).hexdigest(),format='BC1_UNorm',sourceFormat=95))

# Same frozen render configuration consumed by 3A22BC0/3A21BC0.  This small
# independent prefix reader does not execute the other appearance extractor.
folder=Path('artifacts/galaxy-query-research/palette-resources');key='86ec03fba621526059fc6812faca6f10adcb63cb'
f=(folder/(key+'.fres')).read_bytes();b=(folder/(key+'.indexed1')).read_bytes()
if hashlib.sha256(b).hexdigest()!='5135b3d55e5239b3d11f79a76adeda954eb78be5101b6a516fd25df257affa77':raise ValueError('Original render config changed')
np=struct.unpack_from('<I',f,0x34)[0];nb=struct.unpack_from('<I',f,0x38)[0]-struct.unpack_from('<I',f,0x40)[0];nr=struct.unpack_from('<I',f,0x20)[0]
c=0;n=0
while n<np:kind,count=struct.unpack_from('<HH',b,c);c+=4;n+=count
pools=[struct.unpack_from('<8I',b,c+i*32) for i in range(np)];c+=np*32
buffers=[struct.unpack_from('<IIHHIQQ',b,c+i*32) for i in range(nb)];c+=nb*32+sum(row[3] for row in buffers)*8+nr*16
refs={}
while c+16<=len(b):
    p,o,q,v=struct.unpack_from('<4I',b,c)
    if p>=np or q>=np or o>=pools[p][2] or v>=pools[q][2]:break
    refs[p,o]=(q,v);c+=16
if b[c:c+16]!=bytes.fromhex('0000000000000000ffbf7f3f08040201'):raise ValueError('Original config delimiter changed')
start=c+16
def at(ptr):return start+pools[ptr[0]][3]+ptr[1]
config=(295,14000);atlas=refs[config[0],config[1]+0x80]
if atlas!=(622,12672) or struct.unpack_from('<Q',b,at(config)+0x88)[0]!=15:raise ValueError('Original cloud atlas changed')
columns,rows=b[at(config)+0xc0:at(config)+0xc2]
tiles=[struct.unpack_from('<H',b,at(atlas)+i*2)[0] for i in range(15)]
if (columns,rows)!=(3,5) or any((t>>8)>=columns or (t&255)>=rows for t in tiles):raise ValueError('Original tile coordinates invalid')
runtime_material_vectors={hex(field):list(struct.unpack_from('<4f',b,at(refs[config[0],config[1]+field]))) for field in (0x90,0x98)}
out=Path('XFEEDToolBox.Core/Rendering');compressed=gzip.compress(payload,compresslevel=9,mtime=0)
(out/'original-milky-way.bc1.gz').write_bytes(compressed)
result=dict(sourceResource=metadata['resource'],sourceArchiveSha256=metadata['sourceArchiveSha256'],sourceFrozenSha256=metadata['frozenSha256'],
    payloadBytes=len(payload),payloadSha256=hashlib.sha256(payload).hexdigest(),textures=textures,atlasColumns=columns,atlasRows=rows,atlasTiles=tiles,
    configurationSource=key,configurationFrozenSha256=hashlib.sha256(b).hexdigest(),unassignedRuntimeMaterialVectors=runtime_material_vectors,
    materials=[m for m in metadata['materials'] if m['shaderClass'] in ('DistantMilkyWay','DistantMilkyWayDust')],
    gameProcessAccess=False,gameCalls=0,networkRequests=0,fullOriginalBackgroundRestored=False)
(out/'original-milky-way.json').write_text(json.dumps(result,indent=2)+'\n',encoding='utf-8')
print(json.dumps(dict(textures=len(textures),payloadBytes=len(payload),compressedBytes=len(compressed),payloadSha256=result['payloadSha256'])))