From 040d167da0e3668841b8d316711b99d71a338ede Mon Sep 17 00:00:00 2001 From: aap Date: Wed, 23 Dec 2015 23:23:46 +0100 Subject: [PATCH] worked on LCS world --- tools/rsltest/rsl.h | 110 ++++++++++++++++++++++++++++++++-- tools/rsltest/rsltest.cpp | 67 ++++++++++++++++++++- tools/rsltest/rsltest.vcxproj | 1 + 3 files changed, 171 insertions(+), 7 deletions(-) diff --git a/tools/rsltest/rsl.h b/tools/rsltest/rsl.h index f4d2590..8107799 100644 --- a/tools/rsltest/rsl.h +++ b/tools/rsltest/rsl.h @@ -1,5 +1,11 @@ +enum { + TEX_IDENT = 0x00746578, + MDL_IDENT = 0x006D646C, + WRLD_IDENT = 0x57524C44 +}; + struct RslStream { - uint32 ident; + uint32 ident; bool32 isMulti; uint32 fileSize; uint32 dataSize; @@ -263,10 +269,104 @@ struct RslPS2InstanceData { float32 bound[4]; // ? float32 uvScale[2]; int32 unk1; - uint8 *dmaPacket; + uint32 dmaPacket; uint16 numTriangles; int16 matID; - void *unk2; - void *unk3; - void *unk4; + int16 min[3]; // bounding box + int16 max[3]; }; + +struct RslStreamHeader { + uint32 ident; + uint32 unk; + uint32 fileEnd; // + uint32 dataEnd; // relative to beginning of header + uint32 reloc; // + uint32 relocSize; + uint32 root; // absolute + uint16 zero; + uint16 numAtomics; +}; + +struct RslWorldGeometry { + uint16 numMeshes; + uint16 size; + // array of numMeshes RslWorldMesh + // dma data +}; + +struct RslWorldMesh { + uint16 texID; // index into resource table + uint16 dmaSize; + uint16 uvScale[2]; // half precision float + uint16 unk1; + int16 min[3]; // bounding box + int16 max[3]; +}; + +struct Resource { + union { + RslRaster *raster; + RslWorldGeometry *geometry; + uint8 *raw; + }; + uint32 *dma; +}; + +struct OverlayResource { + int32 id; + union { + RslRaster *raster; + RslWorldGeometry *geometry; + uint8 *raw; + }; +}; + +struct Placement { + uint16 id; + uint16 resId; + int16 bound[4]; + int32 pad; + float matrix[16]; +}; + +struct Sector { + OverlayResource *resources; + uint16 numResources; + uint16 unk1; + Placement *sectionA; + Placement *sectionB; + Placement *sectionC; + Placement *sectionD; + Placement *sectionE; + Placement *sectionF; + Placement *sectionG; + Placement *sectionEnd; + uint16 unk2; + uint16 unk3; + uint32 unk4; +}; + +struct SectorEntry { + RslStreamHeader *sector; + uint32 num; +}; + +struct World { + Resource *resources; + SectorEntry sectors[47]; + uint32 numResources; + uint8 pad[0x180]; + + uint32 numX; + void *tabX; // size 0x4 + + uint32 numY; + void *tabY; // size 0x30 + + uint32 numZ; + void *tabZ; // size 0x6 + + uint32 numTextures; + RslStreamHeader *textures; // stream headers +}; \ No newline at end of file diff --git a/tools/rsltest/rsltest.cpp b/tools/rsltest/rsltest.cpp index 56983d2..8a9472d 100644 --- a/tools/rsltest/rsltest.cpp +++ b/tools/rsltest/rsltest.cpp @@ -99,7 +99,7 @@ main(int argc, char *argv[]) assert(sizeof(void*) == 4); if(argc < 2){ - printf("usage: %s [-u] in.dff\n", argv[0]); + printf("usage: %s in\n", argv[0]); return 0; } @@ -112,8 +112,71 @@ main(int argc, char *argv[]) stream.close(); rslstr->relocate(); + int largefile = rslstr->dataSize > 0x100000; + + World *world; RslClump *clump; - if(rslstr->numAtomics){ + Sector *sector; + if(rslstr->ident = WRLD_IDENT && largefile){ // hack + world = (World*)rslstr->data; + + int len = strlen(argv[1])+1; + char filename[1024]; + strncpy(filename, argv[1], len); + filename[len-3] = 'i'; + filename[len-2] = 'm'; + filename[len-1] = 'g'; + filename[len] = '\0'; + assert(stream.open(filename, "rb")); + filename[len-4] = '\\'; + filename[len-3] = '\0'; + + char name[1024]; + uint8 *data; + StreamFile outf; + RslStreamHeader *h; + int i = 0; + for(h = world->sectors->sector; h->ident == WRLD_IDENT; h++){ + sprintf(name, "world%04d.wrld", i++); + strcat(filename, name); + assert(outf.open(filename, "wb")); + data = new uint8[h->fileEnd]; + memcpy(data, h, 0x20); + stream.seek(h->root, 0); + stream.read(data+0x20, h->fileEnd-0x20); + outf.write(data, h->fileEnd); + outf.close(); + filename[len-3] = '\0'; + } + // radar textures + h = world->textures; + for(i = 0; i < world->numTextures; i++){ + sprintf(name, "txd%04d.chk", i); + strcat(filename, name); + assert(outf.open(filename, "wb")); + data = new uint8[h->fileEnd]; + memcpy(data, h, 0x20); + stream.seek(h->root, 0); + stream.read(data+0x20, h->fileEnd-0x20); + outf.write(data, h->fileEnd); + outf.close(); + filename[len-3] = '\0'; + h++; + } + stream.close(); + }else if(rslstr->ident = WRLD_IDENT){ // sector + sector = (Sector*)rslstr->data; + printf("resources\n"); + for(uint32 i = 0; i < sector->numResources; i++){ + OverlayResource *r = §or->resources[i]; + printf(" %d %p\n", r->id, r->raw); + } + printf("placement\n"); + Placement *p; + for(p = sector->sectionA; p < sector->sectionEnd; p++){ + printf(" %d, %d, %f %f %f\n", p->id &0x7FFF, p->resId, p->matrix[12], p->matrix[13], p->matrix[14]); + } + }else if(rslstr->ident = MDL_IDENT){ uint8 *p = *rslstr->hashTab; p -= 0x24; RslAtomic *a = (RslAtomic*)p; diff --git a/tools/rsltest/rsltest.vcxproj b/tools/rsltest/rsltest.vcxproj index 491654c..a001194 100644 --- a/tools/rsltest/rsltest.vcxproj +++ b/tools/rsltest/rsltest.vcxproj @@ -51,6 +51,7 @@ Level3 Disabled true + _CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) true