Ah, God of War.... How long it has been.
I have returned to this game, somewhat older, but wiser in the ways of the byte.
I have decided that these WADs shall surrender themselves fully to my will and divulge their precious secrets to me.
God of War 1. PS2.
Handler initialization for chunks:
Code:
RegisterIFFChunkFunc(0x18,IFFProcessDynaString);
RegisterIFFChunkFunc(0x1e,IFFProcessClientParm);
RegisterIFFChunkFunc(0x28,IFFProcessGroupStart);
RegisterIFFChunkFunc(0x32,IFFProcessGroupEnd);
RegisterIFFChunkFunc(0x3c,IFFActivate);
RegisterIFFChunkFunc(0x46,IFFPushContext);
RegisterIFFChunkFunc(0x50,IFFPopContext);
RegisterIFFChunkFunc(0x29a,IFFPushContext);
RegisterIFFChunkFunc(0x309,IFFPopContext);
RegisterIFFChunkFunc(0x6e,IFFProcessDataBlock);
RegisterIFFChunkFunc(0x6f,IFFProcessDataBlockWLength);
RegisterIFFChunkFunc(0x70,IFFProcessDataBlockAlign16);
RegisterIFFChunkFunc(0x71,FUN_0017eb40);
RegisterIFFChunkFunc(0x72,FUN_0017ead0);
RegisterIFFChunkFunc(0x378,IFFPushHeapWrapper);
RegisterIFFChunkFunc(0x3E7,IFFPopHeapWrapper);
RegisterIFFChunkFunc(0xC8,FUN_0014c258);
First chunk of data from R_PERM.WAD
Code:
78030000 08000000 5741445F 525F5065
726D0000 00000000 00000000 00000000
FFFFFFFF FFFFFFFF 00000000 00000000
28000000 00000000 47726F75 70537461
72740000 00000000 00000000 00000000
1E000000 38000000 5741445F 525F5065
726D0000 00000000 00000000 00000000
1B000080 00000000 00000000 00000000
00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000
FFFFFFFF FFFFFFFF 00000000 00000000
Each chunk header is 0x20 long.
0x0 is the chunk identifier that says which handler its passed to.
0x4 is the size of the data belonging to the chunk after the header. Pad to next 0x10 if not multiple of 0x10.
0x8 is the name of the chunk.
First bytes of first chunk are 0x378, it calls IFFPushHeapWrapper. 8 bytes data, pad to 0x10, + 0x20 header size, we're at 0x30.
First bytes of second chunk are 0x28, it calls IFFProcessGroupStart. 0 bytes data, 0x20 header size, we're at 0x50.
First bytes are 0x1E, it calls IFFProcessClientParm. Yada, yada.
See that 0x1B in the data under the 0x1E?
That's a whole new section of handlers.
Code:
BasicServer("Master_Server",0,5,100,100,0x7fff);
MultiServer("WadServer",5,0x1b,0x80,0x80,0x7f0f,0,0);
BasicServer("ProServer",5,10,0,0,0x7fff);
MultiServer("GOServer",5,1,0x200,0x200,0x5f00,0x80,0x80);
MultiServer("AnimServer",5,3,0x80,0x80,0x7100,0x100,0x100);
MultiServer("BhvrServer",5,0x17,0x80,0x80,0x7002,0x82,0x82);
BasicServer("EvtServer",5,0x15,0,0,0x7001);
MultiServer("CollisionServer",5,0x11,0x80,0x80,0x6200,200,200);
MultiServer("ScriptServer",5,4,0x80,0x80,0x6000,0x400,0x400);
MultiServer("CameraServer",5,9,0x80,0x80,0x5e00,0x40,0x40);
MultiServer("WaypointServer",5,0x14,0x80,0x80,0x5e00,0x40,0x40);
MultiServer("EffectsServer",5,0x1e,0x80,0x80,0x5e00,0x200,0x200);
MultiServer("LightServer",5,6,100,100,0x5d00,0x80,0x80);
MultiServer("MatServer",5,8,0x200,0x200,0x5c00,0x200,0x200);
MultiServer("TextureServer",5,7,0x80,0x80,0x5b00,0x200,0x200);
MultiServer("GfxClutServer",5,0xc,0x80,0x80,0x5a00,0x200,0x200);
MultiServer("EmitterServer",5,0x1a,0x80,0x80,0x5902,1000,1000);
MultiServer("SoundServer",5,0x18,0x80,0x80,0x5901,1000,1000);
MultiServer("renMasterSvr",5,0xd,100,100,0x5900,0x8000,0x4b000);
MultiServer("renModelServer",0xd,0xf,0x80,0x80,0x1000,500,500);
MultiServer("renParticleSvr",0xd,0x13,0x80,0x80,0x1000,1000,1000);
MultiServer("renFlashServer",0xd,0x21,0x80,0x80,0x1000,500,500);
MultiServer("renLineServer",0xd,0x23,0x80,0x80,0x1000,500,500);
MultiServer("renShadowServer",0xd,0x27,0x80,0x80,0x1000,0x40,0x40);
MultiServer("renEEPrimSvr",0xd,0x1c,0x80,0x80,0x1000,500,500);
BasicServer("renPrimMaster",5,2,0x80,0x80,0x5700);
BasicServer("renSTriStripSvr",2,0x1d,0x80,0x80,0x3000);
BasicServer("renTriStripSvr",2,0xe,0x80,0x80,0x2000);
BasicServer("renPtclPrimSvr",2,0x20,0x80,0x80,0x1000);
BasicServer("renLStripSvr",2,0x24,0x80,0x80,0x800);
BasicServer("renFlashPrimSvr",2,0x22,0x80,0x80,0x500);
BasicServer("EpiServer",5,0xb,0,0,0);
EngineServerContext("GFXX",0xc);
EngineServerContext("TXRX",7);
EngineServerContext("MATX",8);
EngineServerContext("SNDX",0x18);
EngineServerContext("LGTX",6);
EngineServerContext("FLPX",0x21);
EngineServerContext("LINE",0x23);
Master_Server sets itself up under server 0 as server 5.
WadServer sets itself up under server 5 as server 0x1b.
And that's enough pointless data dump here.
I'll update with more progress as I decode what it does with the WADs.