void REFRRecord::REFRData::Write(FileWriter &writer) { WRITE(EDID); WRITE(NAME); WRITE(XTEL); WRITE(XLOC); Ownership.Write(writer); WRITE(XESP); WRITE(XTRG); XSED.Write(writer); WRITE(XLOD); WRITE(XCHG); WRITE(XHLT); XPCI.Write(writer); WRITE(XLCM); WRITE(XRTM); WRITE(XACT); WRITE(XCNT); Marker.Write(writer); if(IsOpenByDefault()) WRITEEMPTY(ONAM); WRITE(XSCL); WRITE(XSOL); WRITE(DATA); }
int32_t REFRRecord::WriteRecord(FileWriter &writer) { WRITE(EDID); WRITE(NAME); WRITE(XEZN); WRITE(XRGD); WRITE(XRGB); Patrol.Write(writer); WRITE(XLCM); Ownership.Write(writer); WRITE(XCNT); WRITE(XRDS); WRITE(XHLP); WRITE(XRAD); WRITE(XCHG); WRITE(XDCR); WRITE(XLKR); WRITE(XCLP); WRITE(RCLR); ActivateParents.Write(writer); WRITE(XATO); WRITE(XESP); WRITE(XEMI); WRITE(XMBR); WRITE(XPRM); WRITE(XTRI); WRITE(XMBO); WRITE(XTEL); MapData.Write(writer); AudioData.Write(writer); WRITE(XSRF); WRITE(XSRD); WRITE(XTRG); WRITE(XRDO); WRITE(XLOC); Ammo.Write(writer); WRITE(XPWR); WRITE(XLTW); WRITE(XACT); WRITE(XNDP); WRITE(XPOD); WRITE(XPTL); WRITE(XSED); Room.Write(writer); WRITE(XOCP); WRITE(XORD); WRITE(XLOD); if(IsOpenByDefault()) WRITEEMPTY(ONAM); if(XIBS.IsLoaded()) WRITEEMPTY(XIBS); if(XMBP.IsLoaded()) WRITEEMPTY(XMBP); WRITE(XSCL); WRITE(DATA); return -1; }
REFRRecord::REFRRecord(REFRRecord *srcRecord): Record() { if(srcRecord == NULL) return; flags = srcRecord->flags; formID = srcRecord->formID; flagsUnk = srcRecord->flagsUnk; recData = srcRecord->recData; if(!srcRecord->IsChanged()) return; if(srcRecord->Data.IsLoaded()) { Data.Load(); Data->EDID = srcRecord->Data->EDID; Data->NAME = srcRecord->Data->NAME; Data->XTEL = srcRecord->Data->XTEL; Data->XLOC = srcRecord->Data->XLOC; Data->Ownership = srcRecord->Data->Ownership; Data->XESP = srcRecord->Data->XESP; Data->XTRG = srcRecord->Data->XTRG; Data->XSED = srcRecord->Data->XSED; Data->XLOD = srcRecord->Data->XLOD; Data->XCHG = srcRecord->Data->XCHG; Data->XHLT = srcRecord->Data->XHLT; Data->XPCI = srcRecord->Data->XPCI; Data->XLCM = srcRecord->Data->XLCM; Data->XRTM = srcRecord->Data->XRTM; Data->XACT = srcRecord->Data->XACT; Data->XCNT = srcRecord->Data->XCNT; Data->Marker = srcRecord->Data->Marker; if(srcRecord->IsOpenByDefault())//bool ONAM; //Open by Default, empty marker, written whenever fOpenByDefault is true IsOpenByDefault(true); Data->XSCL = srcRecord->Data->XSCL; Data->XSOL = srcRecord->Data->XSOL; Data->DATA = srcRecord->Data->DATA; } }
SINT32 REFRRecord::ParseRecord(unsigned char *buffer, unsigned char *end_buffer, bool CompressedOnDisk) { UINT32 subType = 0; UINT32 subSize = 0; UINT32 lastChunk = 0; Data.Load(); while(buffer < end_buffer){ subType = *(UINT32 *)buffer; buffer += 4; switch(subType) { case REV32(XXXX): buffer += 2; subSize = *(UINT32 *)buffer; buffer += 4; subType = *(UINT32 *)buffer; buffer += 6; break; default: subSize = *(UINT16 *)buffer; buffer += 2; break; } switch(subType) { case REV32(EDID): Data->EDID.Read(buffer, subSize, CompressedOnDisk); break; case REV32(NAME): Data->NAME.Read(buffer, subSize); break; case REV32(XTEL): Data->XTEL.Read(buffer, subSize); break; case REV32(XLOC): switch(subSize) { case 12: //unused2 is absent, so shift the values read into it Data->XLOC.Read(buffer, subSize); Data->XLOC->flags = Data->XLOC->unused2[0]; Data->XLOC->unused3[0] = Data->XLOC->unused2[1]; Data->XLOC->unused3[1] = Data->XLOC->unused2[2]; Data->XLOC->unused3[2] = Data->XLOC->unused2[3]; memset(&Data->XLOC->unused2[0], 0x00, sizeof(Data->XLOC->unused2)); break; default: Data->XLOC.Read(buffer, subSize); break; } break; case REV32(XOWN): Data->Ownership.Load(); Data->Ownership->XOWN.Read(buffer, subSize); break; case REV32(XRNK): Data->Ownership.Load(); Data->Ownership->XRNK.Read(buffer, subSize); break; case REV32(XGLB): Data->Ownership.Load(); Data->Ownership->XGLB.Read(buffer, subSize); break; case REV32(XESP): Data->XESP.Read(buffer, subSize); break; case REV32(XTRG): Data->XTRG.Read(buffer, subSize); break; case REV32(XSED): switch(subSize) { case 1: //if it's a single byte then it's an offset into the list of seed values in the TREE record Data->XSED.Load(); Data->XSED->isOffset = true; //XSED.size = 1; Data->XSED->offset = *(UINT8 *)buffer; buffer++; break; case 4: //if it's 4 byte it's the seed value directly Data->XSED.Load(); Data->XSED->isOffset = false; //XSED.size = 4; Data->XSED->seed = *(UINT32 *)buffer; buffer += 4; break; default: printer(" REFR: %08X - Unknown XSED size = %u\n", formID, subSize); printer(" CurPos = %04x\n\n", buffer - 6); buffer += subSize; break; } break; case REV32(XLOD): Data->XLOD.Read(buffer, subSize); break; case REV32(XCHG): Data->XCHG.Read(buffer, subSize); break; case REV32(XHLT): Data->XHLT.Read(buffer, subSize); break; case REV32(XPCI): Data->XPCI.Load(); Data->XPCI->XPCI.Read(buffer, subSize); lastChunk = REV32(XPCI); break; case REV32(FULL): switch(lastChunk) { case REV32(XPCI): Data->XPCI.Load(); Data->XPCI->FULL.Read(buffer, subSize, CompressedOnDisk); break; case REV32(XMRK): Data->Marker->FULL.Read(buffer, subSize, CompressedOnDisk); break; default: printer(" REFR: %08X - Unexpected FULL chunk\n", formID); printer(" Size = %i\n", subSize); printer(" CurPos = %04x\n\n", buffer - 6); buffer += subSize; break; } break; case REV32(XLCM): Data->XLCM.Read(buffer, subSize); break; case REV32(XRTM): Data->XRTM.Read(buffer, subSize); break; case REV32(XACT): Data->XACT.Read(buffer, subSize); break; case REV32(XCNT): Data->XCNT.Read(buffer, subSize); break; case REV32(XMRK): Data->Marker.Load(); buffer += subSize; lastChunk = REV32(XMRK); break; case REV32(FNAM): Data->Marker.Load(); Data->Marker->FNAM.Read(buffer, subSize); break; case REV32(TNAM): Data->Marker.Load(); Data->Marker->TNAM.Read(buffer, subSize); break; case REV32(ONAM): IsOpenByDefault(true); buffer += subSize; break; case REV32(XSCL): Data->XSCL.Read(buffer, subSize); break; case REV32(XSOL): Data->XSOL.Read(buffer, subSize); break; case REV32(DATA): Data->DATA.Read(buffer, subSize); break; default: //printer("FileName = %s\n", FileName); printer(" REFR: %08X - Unknown subType = %04x\n", formID, subType); CBASH_CHUNK_DEBUG printer(" Size = %i\n", subSize); printer(" CurPos = %04x\n\n", buffer - 6); buffer = end_buffer; break; } }; return 0; }
REFRRecord::REFRRecord(REFRRecord *srcRecord): FNVRecord() { if(srcRecord == NULL) return; flags = srcRecord->flags; formID = srcRecord->formID; flagsUnk = srcRecord->flagsUnk; formVersion = srcRecord->formVersion; versionControl2[0] = srcRecord->versionControl2[0]; versionControl2[1] = srcRecord->versionControl2[1]; recData = srcRecord->recData; if(!srcRecord->IsChanged()) return; EDID = srcRecord->EDID; NAME = srcRecord->NAME; XEZN = srcRecord->XEZN; XRGD = srcRecord->XRGD; XRGB = srcRecord->XRGB; Patrol = srcRecord->Patrol; XLCM = srcRecord->XLCM; Ownership = srcRecord->Ownership; XCNT = srcRecord->XCNT; XRDS = srcRecord->XRDS; XHLP = srcRecord->XHLP; XRAD = srcRecord->XRAD; XCHG = srcRecord->XCHG; XDCR = srcRecord->XDCR; XLKR = srcRecord->XLKR; XCLP = srcRecord->XCLP; RCLR = srcRecord->RCLR; ActivateParents = srcRecord->ActivateParents; XATO = srcRecord->XATO; XESP = srcRecord->XESP; XEMI = srcRecord->XEMI; XMBR = srcRecord->XMBR; XPRM = srcRecord->XPRM; XTRI = srcRecord->XTRI; XMBO = srcRecord->XMBO; XTEL = srcRecord->XTEL; MapData = srcRecord->MapData; AudioData = srcRecord->AudioData; XSRF = srcRecord->XSRF; XSRD = srcRecord->XSRD; XTRG = srcRecord->XTRG; XRDO = srcRecord->XRDO; XLOC = srcRecord->XLOC; Ammo = srcRecord->Ammo; XPWR = srcRecord->XPWR; XLTW = srcRecord->XLTW; XACT = srcRecord->XACT; XNDP = srcRecord->XNDP; XPOD = srcRecord->XPOD; XPTL = srcRecord->XPTL; XSED = srcRecord->XSED; Room = srcRecord->Room; XOCP = srcRecord->XOCP; XORD = srcRecord->XORD; XLOD = srcRecord->XLOD; XIBS = srcRecord->XIBS; XSCL = srcRecord->XSCL; DATA = srcRecord->DATA; if(srcRecord->IsOpenByDefault())//bool ONAM; //Open by Default, empty marker, written whenever fOpenByDefault is true IsOpenByDefault(true); return; }
int32_t REFRRecord::ParseRecord(unsigned char *buffer, unsigned char *end_buffer, bool CompressedOnDisk) { uint32_t subType = 0; uint32_t subSize = 0; uint32_t lastChunk = 0; while(buffer < end_buffer){ subType = *(uint32_t *)buffer; buffer += 4; switch(subType) { case REV32(XXXX): buffer += 2; subSize = *(uint32_t *)buffer; buffer += 4; subType = *(uint32_t *)buffer; buffer += 6; break; default: subSize = *(uint16_t *)buffer; buffer += 2; break; } switch(subType) { case REV32(EDID): EDID.Read(buffer, subSize, CompressedOnDisk); break; case REV32(NAME): NAME.Read(buffer, subSize); break; case REV32(XEZN): XEZN.Read(buffer, subSize); break; case REV32(XRGD): XRGD.Read(buffer, subSize, CompressedOnDisk); break; case REV32(XRGB): XRGB.Read(buffer, subSize, CompressedOnDisk); break; case REV32(XPRD): Patrol.Load(); Patrol->XPRD.Read(buffer, subSize); break; case REV32(XPPA): //XPPA, Patrol Script Marker (Empty) lastChunk = REV32(XPPA); break; case REV32(INAM): Patrol.Load(); Patrol->INAM.Read(buffer, subSize); break; case REV32(SCHR): Patrol.Load(); Patrol->SCHR.Read(buffer, subSize); break; case REV32(SCDA): Patrol.Load(); Patrol->SCDA.Read(buffer, subSize, CompressedOnDisk); break; case REV32(SCTX): Patrol.Load(); Patrol->SCTX.Read(buffer, subSize, CompressedOnDisk); break; case REV32(SLSD): Patrol.Load(); Patrol->VARS.value.push_back(new GENVARS); Patrol->VARS.value.back()->SLSD.Read(buffer, subSize); break; case REV32(SCVR): Patrol.Load(); if(Patrol->VARS.value.size() == 0) Patrol->VARS.value.push_back(new GENVARS); Patrol->VARS.value.back()->SCVR.Read(buffer, subSize, CompressedOnDisk); break; case REV32(SCRO): Patrol.Load(); Patrol->SCR_.Read(buffer, subSize); Patrol->SCR_.value.back()->isSCRO = true; break; case REV32(SCRV): Patrol.Load(); Patrol->SCR_.Read(buffer, subSize); Patrol->SCR_.value.back()->isSCRO = false; break; case REV32(TNAM): switch(lastChunk) { case REV32(XPPA): Patrol.Load(); Patrol->TNAM.Read(buffer, subSize); break; case REV32(XMRK): MapData.Load(); MapData->TNAM.Read(buffer, subSize); break; default: printer(" REFR: %08X - Unexpected TNAM chunk\n", formID); printer(" Size = %i\n", subSize); printer(" CurPos = %04x\n\n", buffer - 6); buffer += subSize; break; } break; case REV32(XLCM): XLCM.Read(buffer, subSize); break; case REV32(XOWN): Ownership.Load(); Ownership->XOWN.Read(buffer, subSize); break; case REV32(XRNK): Ownership.Load(); Ownership->XRNK.Read(buffer, subSize); break; case REV32(XCNT): XCNT.Read(buffer, subSize); break; case REV32(XRDS): XRDS.Read(buffer, subSize); break; case REV32(XHLP): XHLP.Read(buffer, subSize); break; case REV32(XRAD): XRAD.Read(buffer, subSize); break; case REV32(XCHG): XCHG.Read(buffer, subSize); break; case REV32(XDCR): XDCR.Read(buffer, subSize); break; case REV32(XLKR): XLKR.Read(buffer, subSize); break; case REV32(XCLP): XCLP.Read(buffer, subSize); break; case REV32(RCLR): RCLR.Read(buffer, subSize, CompressedOnDisk); break; case REV32(XAPD): ActivateParents.Load(); ActivateParents->XAPD.Read(buffer, subSize); break; case REV32(XAPR): ActivateParents.Load(); ActivateParents->XAPR.Read(buffer, subSize); break; case REV32(XATO): XATO.Read(buffer, subSize, CompressedOnDisk); break; case REV32(XESP): XESP.Read(buffer, subSize); break; case REV32(XEMI): XEMI.Read(buffer, subSize); break; case REV32(XMBR): XMBR.Read(buffer, subSize); break; case REV32(XPRM): XPRM.Read(buffer, subSize); break; case REV32(XTRI): XTRI.Read(buffer, subSize); break; case REV32(XMBO): XMBO.Read(buffer, subSize); break; case REV32(XTEL): XTEL.Read(buffer, subSize); break; case REV32(FNAM): MapData.Load(); MapData->FNAM.Read(buffer, subSize); break; case REV32(WMI1): MapData.Load(); MapData->WMI1.Read(buffer, subSize); break; case REV32(XMRK): lastChunk = REV32(XMRK); break; case REV32(MMRK): lastChunk = REV32(MMRK); break; case REV32(FULL): switch(lastChunk) { case REV32(XMRK): MapData.Load(); MapData->FULL.Read(buffer, subSize, CompressedOnDisk); break; case REV32(MMRK): AudioData.Load(); AudioData->FULL.Read(buffer, subSize, CompressedOnDisk); break; default: printer(" REFR: %08X - Unexpected FULL chunk\n", formID); printer(" Size = %i\n", subSize); printer(" CurPos = %04x\n\n", buffer - 6); buffer += subSize; break; } break; case REV32(CNAM): AudioData.Load(); AudioData->CNAM.Read(buffer, subSize); break; case REV32(BNAM): AudioData.Load(); AudioData->BNAM.Read(buffer, subSize, CompressedOnDisk); break; case REV32(MNAM): AudioData.Load(); AudioData->MNAM.Read(buffer, subSize); break; case REV32(NNAM): AudioData.Load(); AudioData->NNAM.Read(buffer, subSize); break; case REV32(XSRF): XSRF.Read(buffer, subSize, CompressedOnDisk); break; case REV32(XSRD): XSRD.Read(buffer, subSize, CompressedOnDisk); break; case REV32(XTRG): XTRG.Read(buffer, subSize); break; case REV32(XRDO): XRDO.Read(buffer, subSize); break; case REV32(XLOC): XLOC.Read(buffer, subSize); break; case REV32(XAMT): Ammo.Load(); Ammo->XAMT.Read(buffer, subSize); break; case REV32(XAMC): Ammo.Load(); Ammo->XAMC.Read(buffer, subSize); break; case REV32(XPWR): XPWR.Read(buffer, subSize); break; case REV32(XLTW): XLTW.Read(buffer, subSize); break; case REV32(XACT): XACT.Read(buffer, subSize); break; case REV32(XNDP): XNDP.Read(buffer, subSize); break; case REV32(XPOD): XPOD.Read(buffer, subSize); break; case REV32(XPTL): XPTL.Read(buffer, subSize); break; case REV32(XSED): XSED.Read(buffer, subSize); break; case REV32(XRMR): Room.Load(); Room->XRMR.Read(buffer, subSize); break; case REV32(XLRM): Room.Load(); Room->XLRM.Read(buffer, subSize); break; case REV32(XOCP): XOCP.Read(buffer, subSize); break; case REV32(XORD): XORD.Read(buffer, subSize); break; case REV32(XLOD): XLOD.Read(buffer, subSize); break; case REV32(XIBS): //XIBS.Read(buffer, subSize); XIBS.value = 1; break; case REV32(XMBP): //XMBP.Read(buffer, subSize); XMBP.Load(); break; case REV32(XSCL): XSCL.Read(buffer, subSize); break; case REV32(ONAM): IsOpenByDefault(true); buffer += subSize; break; case REV32(DATA): DATA.Read(buffer, subSize); break; default: //printer("FileName = %s\n", FileName); printer(" REFR: %08X - Unknown subType = %04x\n", formID, subType); CBASH_CHUNK_DEBUG printer(" Size = %i\n", subSize); printer(" CurPos = %04x\n\n", buffer - 6); buffer = end_buffer; break; } }; return 0; }