diff --git a/CBash.suo b/CBash.suo index a37a336..d7d0f0e 100644 Binary files a/CBash.suo and b/CBash.suo differ diff --git a/CBash/CBash.cpp b/CBash/CBash.cpp index f2e9472..5a068d8 100644 --- a/CBash/CBash.cpp +++ b/CBash/CBash.cpp @@ -97,7 +97,7 @@ ModFile *ValidateModName(Collection *curCollection, STRING const ModName) STRING const &CompName = NonGhostName ? NonGhostName : ModName; //ModFiles will never contain null pointers for(UINT32 x = 0; x < curCollection->ModFiles.size();++x) - if(_stricmp(CompName, curCollection->ModFiles[x]->reader.getModName()) == 0) + if(icmps(CompName, curCollection->ModFiles[x]->reader.getModName()) == 0) { delete []NonGhostName; return curCollection->ModFiles[x]; @@ -122,7 +122,7 @@ ModFile *ValidateLoadOrderIndex(Collection *curCollection, STRING const ModName) STRING const &CompName = NonGhostName ? NonGhostName : ModName; //ModFiles will never contain null pointers for(UINT32 x = 0; x < curCollection->LoadOrder255.size();++x) - if(_stricmp(CompName, curCollection->LoadOrder255[x]->reader.getModName()) == 0) + if(icmps(CompName, curCollection->LoadOrder255[x]->reader.getModName()) == 0) { delete []NonGhostName; return curCollection->LoadOrder255[x]; @@ -314,7 +314,7 @@ Collection * CreateCollection(STRING const ModsPath, const UINT32 CollectionType try { - //ValidatePointer(ModsPath); + ValidatePointer(ModsPath); for(UINT32 p = 0; p < Collections.size(); ++p) { if(Collections[p] == NULL) @@ -513,7 +513,7 @@ SINT32 AddMod(Collection *CollectionID, STRING const ModName, const UINT32 ModFl try { //ValidatePointer(CollectionID); - //ValidatePointer(ModName); + ValidatePointer(ModName); return CollectionID->AddMod(ModName, flags); } catch(std::exception &ex) @@ -967,7 +967,7 @@ STRING GetLongIDName(Collection *CollectionID, ModFile *ModID, const UINT8 ModIn // { // ModFile *curModFile = ValidateModID(ValidateCollectionID(CollectionID), ModID); // for(UINT16 x = 0; x < curModFile->TES4.MAST.size(); ++x) -// if(_stricmp(curModFile->TES4.MAST[x].value, ModName) == 0) +// if(icmps(curModFile->TES4.MAST[x].value, ModName) == 0) // return curModFile->FormIDHandler.ExpandTable[(UINT8)x] << 24; // printf("GetShortIDIndex: Error\n %s not found in %s's master list!\n", ModName, curModFile->reader.getModName()); // return -1; diff --git a/CBash/CBash.vcproj b/CBash/CBash.vcproj index 8d0d29e..aacb495 100644 --- a/CBash/CBash.vcproj +++ b/CBash/CBash.vcproj @@ -1261,6 +1261,37 @@ /> + + + + + + + + + + + @@ -1486,6 +1517,10 @@ /> + + @@ -1517,6 +1552,37 @@ /> + + + + + + + + + + + @@ -1548,6 +1614,10 @@ /> + + @@ -2437,6 +2507,37 @@ RelativePath=".\FalloutNewVegas\Records\TXSTRecord.cpp" > + + + + + + + + + + + @@ -2658,6 +2759,37 @@ /> + + + + + + + + + + + @@ -2914,6 +3046,10 @@ /> + + @@ -2976,6 +3112,37 @@ /> + + + + + + + + + + + @@ -3007,6 +3174,10 @@ /> + + @@ -4005,6 +4176,37 @@ RelativePath=".\FalloutNewVegas\Records\API\TXSTRecordAPI.cpp" > + + + + + + + + + + + diff --git a/CBash/Collection.cpp b/CBash/Collection.cpp index 7719b87..167a668 100644 --- a/CBash/Collection.cpp +++ b/CBash/Collection.cpp @@ -137,7 +137,7 @@ SINT32 Collection::AddMod(STRING const &_FileName, ModFlags &flags, bool IsPrelo bool Collection::IsModAdded(STRING const &ModName) { for(UINT32 p = 0;p < ModFiles.size();p++) - if(_stricmp(ModName, ModFiles[p]->reader.getModName()) == 0) + if(icmps(ModName, ModFiles[p]->reader.getModName()) == 0) return true; return false; } @@ -932,7 +932,7 @@ SINT32 Collection::SetRecordIDs(ModFile *&curModFile, Record *&RecordID, FORMID { if(EditorID == NULL) bChangingEditorID = true; - else if(strcmp(RecordEditorID, EditorID) != 0) + else if(cmps(RecordEditorID, EditorID) != 0) bChangingEditorID = true; } diff --git a/CBash/Common.cpp b/CBash/Common.cpp index 4212f79..d8f6560 100644 --- a/CBash/Common.cpp +++ b/CBash/Common.cpp @@ -56,16 +56,38 @@ const STRING Ex_INVALIDRECORDINDEX::__CLR_OR_THIS_CALL what() const return "Invalid RecordID or RecordEditorID. Record not found."; } +int icmps(const STRING lhs, const STRING rhs) + { + if(lhs == rhs) + return 0; + if(lhs == NULL) + return -1; + if(rhs == NULL) + return 1; + return _stricmp(lhs, rhs); + } + +int cmps(const STRING lhs, const STRING rhs) + { + if(lhs == rhs) + return 0; + if(lhs == NULL) + return -1; + if(rhs == NULL) + return 1; + return strcmp(lhs, rhs); + } + bool sameStr::operator()( const STRING s1, const STRING s2 ) const { - return _stricmp( s1, s2 ) < 0; + return icmps(s1, s2) < 0; } STRING DeGhostModName(STRING const ModName) { STRING NonGhostName = NULL; UINT32 NameLength = strlen(ModName) + 1; - if(_stricmp(".ghost",ModName + NameLength - 7) == 0) + if(icmps(".ghost",ModName + NameLength - 7) == 0) { NonGhostName = new char[NameLength]; strcpy_s(NonGhostName, NameLength, ModName); @@ -543,7 +565,7 @@ void FormIDHandlerClass::UpdateFormIDLookup() { for(UINT16 y = 0; y < CollapsedIndex; ++y) { - if(_stricmp(LoadOrder255[(UINT8)x], MAST[(UINT8)y].value) == 0) + if(icmps(LoadOrder255[(UINT8)x], MAST[(UINT8)y].value) == 0) { sortedMAST.push_back(MAST[(UINT8)y]); break; @@ -561,7 +583,7 @@ void FormIDHandlerClass::UpdateFormIDLookup() curMaster = MAST[(UINT8)p].value; //printf("master %s\n", curMaster); for(UINT32 y = 0; y < numMods; ++y) - if(_stricmp(LoadOrder255[(UINT8)y], curMaster) == 0) + if(icmps(LoadOrder255[(UINT8)y], curMaster) == 0) { CollapseTable[(UINT8)y] = (UINT8)p; //printf("%02X == %02X\n", (UINT8)y, (UINT8)p); @@ -605,7 +627,7 @@ void FormIDHandlerClass::CreateFormIDLookup(const UINT8 expandedIndex) { curMaster = MAST[(UINT8)p].value; for(UINT32 y = 0; y < numMods; ++y) - if(_stricmp(LoadOrder255[(UINT8)y], curMaster) == 0) + if(icmps(LoadOrder255[(UINT8)y], curMaster) == 0) { ExpandTable[(UINT8)p] = (UINT8)y; CollapseTable[(UINT8)y] = (UINT8)p; @@ -869,26 +891,12 @@ void StringRecord::Copy(STRING FieldValue) bool StringRecord::equals(const StringRecord &other) const { - if(!IsLoaded()) - { - if(!other.IsLoaded()) - return true; - } - else if(other.IsLoaded() && (strcmp(value, other.value) == 0)) - return true; - return false; + return cmps(value, other.value) == 0; } bool StringRecord::equalsi(const StringRecord &other) const { - if(!IsLoaded()) - { - if(!other.IsLoaded()) - return true; - } - else if(other.IsLoaded() && (_stricmp(value, other.value) == 0)) - return true; - return false; + return icmps(value, other.value) == 0; } StringRecord& StringRecord::operator = (const StringRecord &rhs) @@ -1055,7 +1063,7 @@ bool UnorderedPackedStrings::equals(const UnorderedPackedStrings &other) const if(value.size() == other.value.size()) { for(UINT32 x = 0; x < value.size(); ++x) - if(strcmp(value[x], other.value[x]) != 0) + if(cmps(value[x], other.value[x]) != 0) return false; return true; } @@ -1069,7 +1077,7 @@ bool UnorderedPackedStrings::equalsi(const UnorderedPackedStrings &other) const if(value.size() == other.value.size()) { for(UINT32 x = 0; x < value.size(); ++x) - if(_stricmp(value[x], other.value[x]) != 0) + if(icmps(value[x], other.value[x]) != 0) return false; return true; } diff --git a/CBash/Common.h b/CBash/Common.h index 8593b58..4dbea7c 100644 --- a/CBash/Common.h +++ b/CBash/Common.h @@ -190,6 +190,10 @@ class Ex_INVALIDRECORDINDEX : public std::exception const char * __CLR_OR_THIS_CALL what() const; }; +//wrappers for _stricmp and strcmp that handle NULL args +int icmps(const STRING lhs, const STRING rhs); +int cmps(const STRING lhs, const STRING rhs); + class ModFile; class Record; class StringRecord; @@ -1560,7 +1564,10 @@ struct ReqSubRecord !(test == REV32(DATA) && (test2 == REV32(NAM1) || test2 == REV32(NAM2) || test2 == REV32(VNAM) || test2 == REV32(PROJ)) && subSize == 68 && sizeof(T) == 84) && !(test == REV32(DATA) && (test2 == REV32(CTDA) || test2 == REV32(INDX) || test2 == REV32(QOBJ)) && subSize == 2 && sizeof(T) == 8) && !(test == REV32(DATA) && (test2 == REV32(IDLE) || test2 == REV32(GRUP)) && subSize == 6 && sizeof(T) == 8) && - !(test == REV32(PKDT) && subSize == 8 && sizeof(T) == 12) + !(test == REV32(PKDT) && subSize == 8 && sizeof(T) == 12) && + !(test == REV32(DATA) && subSize == 184 && sizeof(T) == 196) && + !(test == REV32(DNAM) && subSize == 184 && sizeof(T) == 196) && + !(test == REV32(DATA) && (test2 == REV32(EFSH) || test2 == REV32(GRUP)) && sizeof(T) == 308) //multiple possible subSizes ) { printf("ReqSubRecord: Info - Unable to fully parse chunk (%c%c%c%c). Size " diff --git a/CBash/FalloutNewVegas/FNVFile.cpp b/CBash/FalloutNewVegas/FNVFile.cpp index e9b689b..1a90a97 100644 --- a/CBash/FalloutNewVegas/FNVFile.cpp +++ b/CBash/FalloutNewVegas/FNVFile.cpp @@ -572,34 +572,34 @@ SINT32 FNVFile::Load(RecordOp &indexer, std::vector &Expanders break; case eIgANIO: case REV32(ANIO): - //reader.read(&ANIO.stamp, 4); - //reader.read(&ANIO.unknown, 4); - //ANIO.Skim(reader, GRUPSize, processor, indexer); - //break; + reader.read(&ANIO.stamp, 4); + reader.read(&ANIO.unknown, 4); + ANIO.Skim(reader, GRUPSize, processor, indexer); + break; case eIgWATR: case REV32(WATR): - //reader.read(&WATR.stamp, 4); - //reader.read(&WATR.unknown, 4); - //WATR.Skim(reader, GRUPSize, processor, indexer); - //break; + reader.read(&WATR.stamp, 4); + reader.read(&WATR.unknown, 4); + WATR.Skim(reader, GRUPSize, processor, indexer); + break; case eIgEFSH: case REV32(EFSH): - //reader.read(&EFSH.stamp, 4); - //reader.read(&EFSH.unknown, 4); - //EFSH.Skim(reader, GRUPSize, processor, indexer); - //break; + reader.read(&EFSH.stamp, 4); + reader.read(&EFSH.unknown, 4); + EFSH.Skim(reader, GRUPSize, processor, indexer); + break; //case eIgEXPL: //Same as normal case REV32(EXPL): - //reader.read(&EXPL.stamp, 4); - //reader.read(&EXPL.unknown, 4); - //EXPL.Skim(reader, GRUPSize, processor, indexer); - //break; + reader.read(&EXPL.stamp, 4); + reader.read(&EXPL.unknown, 4); + EXPL.Skim(reader, GRUPSize, processor, indexer); + break; case eIgDEBR: case REV32(DEBR): - //reader.read(&DEBR.stamp, 4); - //reader.read(&DEBR.unknown, 4); - //DEBR.Skim(reader, GRUPSize, processor, indexer); - //break; + reader.read(&DEBR.stamp, 4); + reader.read(&DEBR.unknown, 4); + DEBR.Skim(reader, GRUPSize, processor, indexer); + break; case eIgIMGS: case REV32(IMGS): //reader.read(&IMGS.stamp, 4); @@ -996,15 +996,15 @@ UINT32 FNVFile::GetNumRecords(const UINT32 &RecordType) case REV32(LSCR): return (UINT32)LSCR.Records.size(); case REV32(ANIO): - //return (UINT32)ANIO.Records.size(); + return (UINT32)ANIO.Records.size(); case REV32(WATR): - //return (UINT32)WATR.Records.size(); + return (UINT32)WATR.Records.size(); case REV32(EFSH): - //return (UINT32)EFSH.Records.size(); + return (UINT32)EFSH.Records.size(); case REV32(EXPL): - //return (UINT32)EXPL.Records.size(); + return (UINT32)EXPL.Records.size(); case REV32(DEBR): - //return (UINT32)DEBR.Records.size(); + return (UINT32)DEBR.Records.size(); case REV32(IMGS): //return (UINT32)IMGS.Records.size(); case REV32(IMAD): @@ -1506,25 +1506,25 @@ Record * FNVFile::CreateRecord(const UINT32 &RecordType, STRING const &RecordEdi newRecord = LSCR.Records.back(); break; case REV32(ANIO): - //ANIO.Records.push_back(new FNV::ANIORecord((FNV::ANIORecord *)SourceRecord)); - //newRecord = ANIO.Records.back(); - //break; + ANIO.Records.push_back(new FNV::ANIORecord((FNV::ANIORecord *)SourceRecord)); + newRecord = ANIO.Records.back(); + break; case REV32(WATR): - //WATR.Records.push_back(new FNV::WATRRecord((FNV::WATRRecord *)SourceRecord)); - //newRecord = WATR.Records.back(); - //break; + WATR.Records.push_back(new FNV::WATRRecord((FNV::WATRRecord *)SourceRecord)); + newRecord = WATR.Records.back(); + break; case REV32(EFSH): - //EFSH.Records.push_back(new FNV::EFSHRecord((FNV::EFSHRecord *)SourceRecord)); - //newRecord = EFSH.Records.back(); - //break; + EFSH.Records.push_back(new FNV::EFSHRecord((FNV::EFSHRecord *)SourceRecord)); + newRecord = EFSH.Records.back(); + break; case REV32(EXPL): - //EXPL.Records.push_back(new FNV::EXPLRecord((FNV::EXPLRecord *)SourceRecord)); - //newRecord = EXPL.Records.back(); - //break; + EXPL.Records.push_back(new FNV::EXPLRecord((FNV::EXPLRecord *)SourceRecord)); + newRecord = EXPL.Records.back(); + break; case REV32(DEBR): - //DEBR.Records.push_back(new FNV::DEBRRecord((FNV::DEBRRecord *)SourceRecord)); - //newRecord = DEBR.Records.back(); - //break; + DEBR.Records.push_back(new FNV::DEBRRecord((FNV::DEBRRecord *)SourceRecord)); + newRecord = DEBR.Records.back(); + break; case REV32(IMGS): //IMGS.Records.push_back(new FNV::IMGSRecord((FNV::IMGSRecord *)SourceRecord)); //newRecord = IMGS.Records.back(); @@ -1763,11 +1763,11 @@ SINT32 FNVFile::CleanMasters(std::vector &Expanders) if(PACK.VisitRecords(NULL, checker, false)) continue; if(CSTY.VisitRecords(NULL, checker, false)) continue; if(LSCR.VisitRecords(NULL, checker, false)) continue; - //if(ANIO.VisitRecords(NULL, checker, false)) continue; - //if(WATR.VisitRecords(NULL, checker, false)) continue; - //if(EFSH.VisitRecords(NULL, checker, false)) continue; - //if(EXPL.VisitRecords(NULL, checker, false)) continue; - //if(DEBR.VisitRecords(NULL, checker, false)) continue; + if(ANIO.VisitRecords(NULL, checker, false)) continue; + if(WATR.VisitRecords(NULL, checker, false)) continue; + if(EFSH.VisitRecords(NULL, checker, false)) continue; + if(EXPL.VisitRecords(NULL, checker, false)) continue; + if(DEBR.VisitRecords(NULL, checker, false)) continue; //if(IMGS.VisitRecords(NULL, checker, false)) continue; //if(IMAD.VisitRecords(NULL, checker, false)) continue; //if(FLST.VisitRecords(NULL, checker, false)) continue; @@ -1901,11 +1901,11 @@ SINT32 FNVFile::Save(STRING const &SaveName, std::vector &Expa formCount += PACK.WriteGRUP(REV32(PACK), writer, Expanders, expander, collapser, bMastersChanged, CloseMod); formCount += CSTY.WriteGRUP(REV32(CSTY), writer, Expanders, expander, collapser, bMastersChanged, CloseMod); formCount += LSCR.WriteGRUP(REV32(LSCR), writer, Expanders, expander, collapser, bMastersChanged, CloseMod); - //formCount += ANIO.WriteGRUP(REV32(ANIO), writer, Expanders, expander, collapser, bMastersChanged, CloseMod); - //formCount += WATR.WriteGRUP(REV32(WATR), writer, Expanders, expander, collapser, bMastersChanged, CloseMod); - //formCount += EFSH.WriteGRUP(REV32(EFSH), writer, Expanders, expander, collapser, bMastersChanged, CloseMod); - //formCount += EXPL.WriteGRUP(REV32(EXPL), writer, Expanders, expander, collapser, bMastersChanged, CloseMod); - //formCount += DEBR.WriteGRUP(REV32(DEBR), writer, Expanders, expander, collapser, bMastersChanged, CloseMod); + formCount += ANIO.WriteGRUP(REV32(ANIO), writer, Expanders, expander, collapser, bMastersChanged, CloseMod); + formCount += WATR.WriteGRUP(REV32(WATR), writer, Expanders, expander, collapser, bMastersChanged, CloseMod); + formCount += EFSH.WriteGRUP(REV32(EFSH), writer, Expanders, expander, collapser, bMastersChanged, CloseMod); + formCount += EXPL.WriteGRUP(REV32(EXPL), writer, Expanders, expander, collapser, bMastersChanged, CloseMod); + formCount += DEBR.WriteGRUP(REV32(DEBR), writer, Expanders, expander, collapser, bMastersChanged, CloseMod); //formCount += IMGS.WriteGRUP(REV32(IMGS), writer, Expanders, expander, collapser, bMastersChanged, CloseMod); //formCount += IMAD.WriteGRUP(REV32(IMAD), writer, Expanders, expander, collapser, bMastersChanged, CloseMod); //formCount += FLST.WriteGRUP(REV32(FLST), writer, Expanders, expander, collapser, bMastersChanged, CloseMod); @@ -2024,11 +2024,11 @@ void FNVFile::VisitAllRecords(RecordOp &op) PACK.VisitRecords(NULL, op, true); CSTY.VisitRecords(NULL, op, true); LSCR.VisitRecords(NULL, op, true); - //ANIO.VisitRecords(NULL, op, true); - //WATR.VisitRecords(NULL, op, true); - //EFSH.VisitRecords(NULL, op, true); - //EXPL.VisitRecords(NULL, op, true); - //DEBR.VisitRecords(NULL, op, true); + ANIO.VisitRecords(NULL, op, true); + WATR.VisitRecords(NULL, op, true); + EFSH.VisitRecords(NULL, op, true); + EXPL.VisitRecords(NULL, op, true); + DEBR.VisitRecords(NULL, op, true); //IMGS.VisitRecords(NULL, op, true); //IMAD.VisitRecords(NULL, op, true); //FLST.VisitRecords(NULL, op, true); @@ -2265,20 +2265,20 @@ void FNVFile::VisitRecords(const UINT32 &TopRecordType, const UINT32 &RecordType LSCR.VisitRecords(RecordType, op, DeepVisit); break; case REV32(ANIO): - //ANIO.VisitRecords(RecordType, op, DeepVisit); - //break; + ANIO.VisitRecords(RecordType, op, DeepVisit); + break; case REV32(WATR): - //WATR.VisitRecords(RecordType, op, DeepVisit); - //break; + WATR.VisitRecords(RecordType, op, DeepVisit); + break; case REV32(EFSH): - //EFSH.VisitRecords(RecordType, op, DeepVisit); - //break; + EFSH.VisitRecords(RecordType, op, DeepVisit); + break; case REV32(EXPL): - //EXPL.VisitRecords(RecordType, op, DeepVisit); - //break; + EXPL.VisitRecords(RecordType, op, DeepVisit); + break; case REV32(DEBR): - //DEBR.VisitRecords(RecordType, op, DeepVisit); - //break; + DEBR.VisitRecords(RecordType, op, DeepVisit); + break; case REV32(IMGS): //IMGS.VisitRecords(RecordType, op, DeepVisit); //break; diff --git a/CBash/FalloutNewVegas/FNVFile.h b/CBash/FalloutNewVegas/FNVFile.h index e9c5dd1..237a638 100644 --- a/CBash/FalloutNewVegas/FNVFile.h +++ b/CBash/FalloutNewVegas/FNVFile.h @@ -84,11 +84,11 @@ GPL License and Copyright Notice ============================================ #include "Records/PACKRecord.h" #include "Records/CSTYRecord.h" #include "Records/LSCRRecord.h" -//#include "Records/ANIORecord.h" -//#include "Records/WATRRecord.h" -//#include "Records/EFSHRecord.h" -//#include "Records/EXPLRecord.h" -//#include "Records/DEBRRecord.h" +#include "Records/ANIORecord.h" +#include "Records/WATRRecord.h" +#include "Records/EFSHRecord.h" +#include "Records/EXPLRecord.h" +#include "Records/DEBRRecord.h" //#include "Records/IMGSRecord.h" //#include "Records/IMADRecord.h" //#include "Records/FLSTRecord.h" @@ -189,11 +189,11 @@ class FNVFile : public ModFile FNVGRUPRecords PACK; FNVGRUPRecords CSTY; FNVGRUPRecords LSCR; - //FNVGRUPRecords ANIO; - //FNVGRUPRecords WATR; - //FNVGRUPRecords EFSH; - //FNVGRUPRecords EXPL; - //FNVGRUPRecords DEBR; + FNVGRUPRecords ANIO; + FNVGRUPRecords WATR; + FNVGRUPRecords EFSH; + FNVGRUPRecords EXPL; + FNVGRUPRecords DEBR; //FNVGRUPRecords IMGS; //FNVGRUPRecords IMAD; //FNVGRUPRecords FLST; diff --git a/CBash/FalloutNewVegas/Records/ANIORecord.cpp b/CBash/FalloutNewVegas/Records/ANIORecord.cpp index a295594..b982630 100644 --- a/CBash/FalloutNewVegas/Records/ANIORecord.cpp +++ b/CBash/FalloutNewVegas/Records/ANIORecord.cpp @@ -51,9 +51,7 @@ ANIORecord::ANIORecord(ANIORecord *srcRecord): } EDID = srcRecord->EDID; - MODL = srcRecord->MODL; - DATA = srcRecord->DATA; return; } @@ -73,8 +71,7 @@ bool ANIORecord::VisitFormIDs(FormIDOp &op) for(UINT32 x = 0; x < MODL->Textures.MODS.size(); x++) op.Accept(MODL->Textures.MODS[x]->texture); } - if(DATA.IsLoaded()) - op.Accept(DATA->value); + op.Accept(DATA.value); return op.Stop(); } @@ -153,6 +150,7 @@ SINT32 ANIORecord::Unload() { IsChanged(false); IsLoaded(false); + EDID.Unload(); MODL.Unload(); DATA.Unload(); @@ -162,19 +160,16 @@ SINT32 ANIORecord::Unload() SINT32 ANIORecord::WriteRecord(FileWriter &writer) { WRITE(EDID); - MODL.Write(writer); - WRITE(DATA); - return -1; } bool ANIORecord::operator ==(const ANIORecord &other) const { - return (EDID.equalsi(other.EDID) && - MODL == other.MODL && - DATA == other.DATA); + return (DATA == other.DATA && + EDID.equalsi(other.EDID) && + MODL == other.MODL); } bool ANIORecord::operator !=(const ANIORecord &other) const diff --git a/CBash/FalloutNewVegas/Records/ANIORecord.h b/CBash/FalloutNewVegas/Records/ANIORecord.h index f7cc3c8..6645545 100644 --- a/CBash/FalloutNewVegas/Records/ANIORecord.h +++ b/CBash/FalloutNewVegas/Records/ANIORecord.h @@ -30,7 +30,7 @@ class ANIORecord : public FNVRecord //Animated Object public: StringRecord EDID; //Editor ID OptSubRecord MODL; //Model Filename - OptSimpleSubRecord DATA; //Animation + ReqSimpleSubRecord DATA; //Animation ANIORecord(unsigned char *_recData=NULL); ANIORecord(ANIORecord *srcRecord); diff --git a/CBash/FalloutNewVegas/Records/API/ANIORecordAPI.cpp b/CBash/FalloutNewVegas/Records/API/ANIORecordAPI.cpp index bf87ed5..daa78e8 100644 --- a/CBash/FalloutNewVegas/Records/API/ANIORecordAPI.cpp +++ b/CBash/FalloutNewVegas/Records/API/ANIORecordAPI.cpp @@ -75,12 +75,41 @@ UINT32 ANIORecord::GetFieldAttribute(FIELD_IDENTIFIERS, UINT32 WhichAttribute) return UNKNOWN_FIELD; } return UNKNOWN_FIELD; - case 10: //mods Alternate Textures - return ISTRING_FIELD; + case 10: //altTextures + if(!MODL.IsLoaded()) + return UNKNOWN_FIELD; + + if(ListFieldID == 0) //altTextures + { + switch(WhichAttribute) + { + case 0: //fieldType + return LIST_FIELD; + case 1: //fieldSize + return MODL->Textures.MODS.size(); + default: + return UNKNOWN_FIELD; + } + } + + if(ListIndex >= MODL->Textures.MODS.size()) + return UNKNOWN_FIELD; - case 13: //modelFlags - return UINT8_FIELD; - case 14: //data Animation + switch(ListFieldID) + { + case 1: //name + return STRING_FIELD; + case 2: //texture + return FORMID_FIELD; + case 3: //index + return SINT32_FIELD; + default: + return UNKNOWN_FIELD; + } + return UNKNOWN_FIELD; + case 11: //modelFlags + return UINT8_FLAG_FIELD; + case 12: //animation return FORMID_FIELD; default: return UNKNOWN_FIELD; @@ -113,16 +142,29 @@ void * ANIORecord::GetField(FIELD_IDENTIFIERS, void **FieldValues) case 9: //modt_p *FieldValues = MODL.IsLoaded() ? MODL->MODT.value : NULL; return NULL; - case 10: //mods Alternate Textures - return MODL.IsLoaded() ? MODL->MODS.value : NULL; - case 11: //mods Alternate Textures - return MODL.IsLoaded() ? &MODL->MODS->value11 : NULL; - case 12: //mods Alternate Textures - return MODL.IsLoaded() ? &MODL->MODS->value12 : NULL; - case 13: //modelFlags - return MODL.IsLoaded() ? &MODL->MODD->value13 : NULL; - case 14: //data Animation - return DATA.IsLoaded() ? &DATA->value14 : NULL; + case 10: //altTextures + if(!MODL.IsLoaded()) + return NULL; + + if(ListIndex >= MODL->Textures.MODS.size()) + return NULL; + + switch(ListFieldID) + { + case 1: //name + return MODL->Textures.MODS[ListIndex]->name; + case 2: //texture + return &MODL->Textures.MODS[ListIndex]->texture; + case 3: //index + return &MODL->Textures.MODS[ListIndex]->index; + default: + return NULL; + } + return NULL; + case 11: //modelFlags + return MODL.IsLoaded() ? &MODL->MODD.value : NULL; + case 12: //animation + return &DATA.value; default: return NULL; } @@ -168,28 +210,45 @@ bool ANIORecord::SetField(FIELD_IDENTIFIERS, void *FieldValue, UINT32 ArraySize) MODL.Load(); MODL->MODT.Copy((UINT8ARRAY)FieldValue, ArraySize); break; - case 10: //mods Alternate Textures - MODL.Load(); - MODL->MODS.Copy((STRING)FieldValue); - break; - case 11: //mods Alternate Textures + case 10: //altTextures MODL.Load(); - MODL->MODS.Load(); - MODL->MODS->value11 = *(FORMID *)FieldValue; - return true; - case 12: //mods Alternate Textures - MODL.Load(); - MODL->MODS.Load(); - MODL->MODS->value12 = *(SINT32 *)FieldValue; + if(ListFieldID == 0) //altTexturesSize + { + MODL->Textures.resize(ArraySize); + return false; + } + + if(ListIndex >= MODL->Textures.MODS.size()) + break; + + switch(ListFieldID) + { + case 1: //name + delete []MODL->Textures.MODS[ListIndex]->name; + MODL->Textures.MODS[ListIndex]->name = NULL; + if(FieldValue != NULL) + { + ArraySize = (UINT32)strlen((STRING)FieldValue) + 1; + MODL->Textures.MODS[ListIndex]->name = new char[ArraySize]; + strcpy_s(MODL->Textures.MODS[ListIndex]->name, ArraySize, (STRING)FieldValue); + } + break; + case 2: //texture + MODL->Textures.MODS[ListIndex]->texture = *(FORMID *)FieldValue; + return true; + case 3: //index + MODL->Textures.MODS[ListIndex]->index = *(SINT32 *)FieldValue; + break; + default: + break; + } break; - case 13: //modelFlags + case 11: //modelFlags MODL.Load(); - MODL->MODD.Load(); - MODL->MODD->value13 = *(UINT8 *)FieldValue; + MODL->SetFlagMask(*(UINT8 *)FieldValue); break; - case 14: //data Animation - DATA.Load(); - DATA->value14 = *(FORMID *)FieldValue; + case 12: //animation + DATA.value = *(FORMID *)FieldValue; return true; default: break; @@ -199,6 +258,7 @@ bool ANIORecord::SetField(FIELD_IDENTIFIERS, void *FieldValue, UINT32 ArraySize) void ANIORecord::DeleteField(FIELD_IDENTIFIERS) { + FNVMODS defaultMODS; switch(FieldID) { case 1: //flags1 @@ -229,23 +289,40 @@ void ANIORecord::DeleteField(FIELD_IDENTIFIERS) if(MODL.IsLoaded()) MODL->MODT.Unload(); return; - case 10: //mods Alternate Textures - if(MODL.IsLoaded()) - MODL->MODS.Unload(); - return; - case 11: //mods Alternate Textures - if(MODL.IsLoaded()) - MODL->MODS.Unload(); - return; - case 12: //mods Alternate Textures + case 10: //altTextures if(MODL.IsLoaded()) - MODL->MODS.Unload(); + { + if(ListFieldID == 0) //altTextures + { + MODL->Textures.Unload(); + return; + } + + if(ListIndex >= MODL->Textures.MODS.size()) + return; + + switch(ListFieldID) + { + case 1: //name + delete []MODL->Textures.MODS[ListIndex]->name; + MODL->Textures.MODS[ListIndex]->name = NULL; + return; + case 2: //texture + MODL->Textures.MODS[ListIndex]->texture = defaultMODS.texture; + return; + case 3: //index + MODL->Textures.MODS[ListIndex]->index = defaultMODS.index; + return; + default: + return; + } + } return; - case 13: //modelFlags + case 11: //modelFlags if(MODL.IsLoaded()) MODL->MODD.Unload(); return; - case 14: //data Animation + case 12: //animation DATA.Unload(); return; default: diff --git a/CBash/FalloutNewVegas/Records/API/CELLRecordAPI.cpp b/CBash/FalloutNewVegas/Records/API/CELLRecordAPI.cpp index 64726c9..5b52afd 100644 --- a/CBash/FalloutNewVegas/Records/API/CELLRecordAPI.cpp +++ b/CBash/FalloutNewVegas/Records/API/CELLRecordAPI.cpp @@ -728,6 +728,8 @@ bool CELLRecord::SetField(FIELD_IDENTIFIERS, void *FieldValue, UINT32 ArraySize) } break; case 32: //concSolid + if(FieldValue == NULL) + break; ArraySize = strlen((STRING)FieldValue); if(ArraySize > 29) break; @@ -736,6 +738,8 @@ bool CELLRecord::SetField(FIELD_IDENTIFIERS, void *FieldValue, UINT32 ArraySize) memcpy(&IMPF->concSolid[0], FieldValue, ArraySize); break; case 33: //concBroken + if(FieldValue == NULL) + break; ArraySize = strlen((STRING)FieldValue); if(ArraySize > 29) break; @@ -744,6 +748,8 @@ bool CELLRecord::SetField(FIELD_IDENTIFIERS, void *FieldValue, UINT32 ArraySize) memcpy(&IMPF->concBroken[0], FieldValue, ArraySize); break; case 34: //metalSolid + if(FieldValue == NULL) + break; ArraySize = strlen((STRING)FieldValue); if(ArraySize > 29) break; @@ -752,6 +758,8 @@ bool CELLRecord::SetField(FIELD_IDENTIFIERS, void *FieldValue, UINT32 ArraySize) memcpy(&IMPF->metalSolid[0], FieldValue, ArraySize); break; case 35: //metalHollow + if(FieldValue == NULL) + break; ArraySize = strlen((STRING)FieldValue); if(ArraySize > 29) break; @@ -760,6 +768,8 @@ bool CELLRecord::SetField(FIELD_IDENTIFIERS, void *FieldValue, UINT32 ArraySize) memcpy(&IMPF->metalHollow[0], FieldValue, ArraySize); break; case 36: //metalSheet + if(FieldValue == NULL) + break; ArraySize = strlen((STRING)FieldValue); if(ArraySize > 29) break; @@ -768,6 +778,8 @@ bool CELLRecord::SetField(FIELD_IDENTIFIERS, void *FieldValue, UINT32 ArraySize) memcpy(&IMPF->metalSheet[0], FieldValue, ArraySize); break; case 37: //wood + if(FieldValue == NULL) + break; ArraySize = strlen((STRING)FieldValue); if(ArraySize > 29) break; @@ -776,6 +788,8 @@ bool CELLRecord::SetField(FIELD_IDENTIFIERS, void *FieldValue, UINT32 ArraySize) memcpy(&IMPF->wood[0], FieldValue, ArraySize); break; case 38: //sand + if(FieldValue == NULL) + break; ArraySize = strlen((STRING)FieldValue); if(ArraySize > 29) break; @@ -784,6 +798,8 @@ bool CELLRecord::SetField(FIELD_IDENTIFIERS, void *FieldValue, UINT32 ArraySize) memcpy(&IMPF->sand[0], FieldValue, ArraySize); break; case 39: //dirt + if(FieldValue == NULL) + break; ArraySize = strlen((STRING)FieldValue); if(ArraySize > 29) break; @@ -792,6 +808,8 @@ bool CELLRecord::SetField(FIELD_IDENTIFIERS, void *FieldValue, UINT32 ArraySize) memcpy(&IMPF->dirt[0], FieldValue, ArraySize); break; case 40: //grass + if(FieldValue == NULL) + break; ArraySize = strlen((STRING)FieldValue); if(ArraySize > 29) break; @@ -800,6 +818,8 @@ bool CELLRecord::SetField(FIELD_IDENTIFIERS, void *FieldValue, UINT32 ArraySize) memcpy(&IMPF->grass[0], FieldValue, ArraySize); break; case 41: //water + if(FieldValue == NULL) + break; ArraySize = strlen((STRING)FieldValue); if(ArraySize > 29) break; diff --git a/CBash/FalloutNewVegas/Records/API/CREARecordAPI.cpp b/CBash/FalloutNewVegas/Records/API/CREARecordAPI.cpp index b7a3688..fb1ac67 100644 --- a/CBash/FalloutNewVegas/Records/API/CREARecordAPI.cpp +++ b/CBash/FalloutNewVegas/Records/API/CREARecordAPI.cpp @@ -923,9 +923,12 @@ bool CREARecord::SetField(FIELD_IDENTIFIERS, void *FieldValue, UINT32 ArraySize) NIFZ.resize(ArraySize); for(UINT32 x = 0; x < ArraySize; x++) { - UINT32 size = (UINT32)strlen(((STRINGARRAY)FieldValue)[x]) + 1; - NIFZ.value[x] = new char[size]; - strcpy_s(NIFZ.value[x], size, ((STRINGARRAY)FieldValue)[x]); + if(((STRINGARRAY)FieldValue)[x] != NULL) + { + UINT32 size = (UINT32)strlen(((STRINGARRAY)FieldValue)[x]) + 1; + NIFZ.value[x] = new char[size]; + strcpy_s(NIFZ.value[x], size, ((STRINGARRAY)FieldValue)[x]); + } } break; case 23: //nift_p @@ -1151,9 +1154,12 @@ bool CREARecord::SetField(FIELD_IDENTIFIERS, void *FieldValue, UINT32 ArraySize) KFFZ.resize(ArraySize); for(UINT32 x = 0; x < ArraySize; x++) { - UINT32 size = (UINT32)strlen(((STRINGARRAY)FieldValue)[x]) + 1; - KFFZ.value[x] = new char[size]; - strcpy_s(KFFZ.value[x], size, ((STRINGARRAY)FieldValue)[x]); + if(((STRINGARRAY)FieldValue)[x] != NULL) + { + UINT32 size = (UINT32)strlen(((STRINGARRAY)FieldValue)[x]) + 1; + KFFZ.value[x] = new char[size]; + strcpy_s(KFFZ.value[x], size, ((STRINGARRAY)FieldValue)[x]); + } } break; case 59: //creatureType diff --git a/CBash/FalloutNewVegas/Records/API/CSTYRecordAPI.cpp b/CBash/FalloutNewVegas/Records/API/CSTYRecordAPI.cpp index edc8beb..a7c2c83 100644 --- a/CBash/FalloutNewVegas/Records/API/CSTYRecordAPI.cpp +++ b/CBash/FalloutNewVegas/Records/API/CSTYRecordAPI.cpp @@ -678,7 +678,7 @@ bool CSTYRecord::SetField(FIELD_IDENTIFIERS, void *FieldValue, UINT32 ArraySize) case 67: //waitFireTimerMin CSSD.value.waitFireTimerMin = *(FLOAT32 *)FieldValue; break; - case 68: //waitFireTimerMax + case 68: //waitFireTimerMax CSSD.value.waitFireTimerMax = *(FLOAT32 *)FieldValue; break; case 69: //fireTimerMin @@ -936,7 +936,7 @@ void CSTYRecord::DeleteField(FIELD_IDENTIFIERS) case 67: //waitFireTimerMin CSSD.value.waitFireTimerMin =defaultCSSD.waitFireTimerMin; break; - case 68: //waitFireTimerMax + case 68: //waitFireTimerMax CSSD.value.waitFireTimerMax = defaultCSSD.waitFireTimerMax; break; case 69: //fireTimerMin diff --git a/CBash/FalloutNewVegas/Records/API/DEBRRecordAPI.cpp b/CBash/FalloutNewVegas/Records/API/DEBRRecordAPI.cpp index c9a2e6e..594859b 100644 --- a/CBash/FalloutNewVegas/Records/API/DEBRRecordAPI.cpp +++ b/CBash/FalloutNewVegas/Records/API/DEBRRecordAPI.cpp @@ -60,22 +60,47 @@ UINT32 DEBRRecord::GetFieldAttribute(FIELD_IDENTIFIERS, UINT32 WhichAttribute) return UNKNOWN_FIELD; } return UNKNOWN_FIELD; - case 7: //data DATA ,, Struct - return UINT8_FIELD; - case 8: //data DATA ,, Struct - return STRING_FIELD; - case 9: //data DATA ,, Struct - return UINT8_FIELD; - case 10: //modt_p - switch(WhichAttribute) + case 7: //models + if(ListFieldID == 0) //models { - case 0: //fieldType - return UINT8_ARRAY_FIELD; - case 1: //fieldSize - return MODL.IsLoaded() ? MODL->MODT.GetSize() : 0; + switch(WhichAttribute) + { + case 0: //fieldType + return LIST_FIELD; + case 1: //fieldSize + return (UINT32)Models.MODS.size(); + default: + return UNKNOWN_FIELD; + } + return UNKNOWN_FIELD; + } + + if(ListIndex >= Models.MODS.size()) + return UNKNOWN_FIELD; + + switch(ListFieldID) + { + case 1: //percentage + return UINT8_FIELD; + case 2: //modPath + return ISTRING_FIELD; + case 3: //flags + return UINT8_FLAG_FIELD; + case 4: //modt_p + switch(WhichAttribute) + { + case 0: //fieldType + return UINT8_ARRAY_FIELD; + case 1: //fieldSize + return Models.MODS[ListIndex]->MODT.GetSize(); + default: + return UNKNOWN_FIELD; + } + return UNKNOWN_FIELD; default: return UNKNOWN_FIELD; } + return UNKNOWN_FIELD; default: return UNKNOWN_FIELD; } @@ -100,14 +125,24 @@ void * DEBRRecord::GetField(FIELD_IDENTIFIERS, void **FieldValues) case 6: //versionControl2 *FieldValues = &versionControl2[0]; return NULL; - case 7: //data DATA ,, Struct - return DATA.IsLoaded() ? &DATA->value7 : NULL; - case 8: //data DATA ,, Struct - return DATA.value; - case 9: //data DATA ,, Struct - return DATA.IsLoaded() ? &DATA->value9 : NULL; - case 10: //modt_p - *FieldValues = MODT.value; + case 7: //models + if(ListIndex >= Models.MODS.size()) + return NULL; + + switch(ListFieldID) + { + case 1: //percentage + return &Models.MODS[ListIndex]->percentage; + case 2: //modPath + return Models.MODS[ListIndex]->modPath; + case 3: //flags + return &Models.MODS[ListIndex]->flags; + case 4: //modt_p + *FieldValues = Models.MODS[ListIndex]->MODT.value; + return NULL; + default: + return NULL; + } return NULL; default: return NULL; @@ -142,19 +177,40 @@ bool DEBRRecord::SetField(FIELD_IDENTIFIERS, void *FieldValue, UINT32 ArraySize) versionControl2[0] = ((UINT8ARRAY)FieldValue)[0]; versionControl2[1] = ((UINT8ARRAY)FieldValue)[1]; break; - case 7: //data DATA ,, Struct - DATA.Load(); - DATA->value7 = *(UINT8 *)FieldValue; - break; - case 8: //data DATA ,, Struct - DATA.Copy((STRING)FieldValue); - break; - case 9: //data DATA ,, Struct - DATA.Load(); - DATA->value9 = *(UINT8 *)FieldValue; - break; - case 10: //modt_p - MODT.Copy((UINT8ARRAY)FieldValue, ArraySize); + case 7: //models + if(ListFieldID == 0) //modelsSize + { + Models.resize(ArraySize); + return false; + } + + if(ListIndex >= Models.MODS.size()) + break; + + switch(ListFieldID) + { + case 1: //percentage + Models.MODS[ListIndex]->percentage = *(UINT8 *)FieldValue; + break; + case 2: //modPath + delete []Models.MODS[ListIndex]->modPath; + Models.MODS[ListIndex]->modPath = NULL; + if(FieldValue != NULL) + { + ArraySize = (UINT32)strlen((STRING)FieldValue) + 1; + Models.MODS[ListIndex]->modPath = new char[ArraySize]; + strcpy_s(Models.MODS[ListIndex]->modPath, ArraySize, (STRING)FieldValue); + } + break; + case 3: //flags + Models.MODS[ListIndex]->SetFlagMask(*(UINT8 *)FieldValue); + break; + case 4: //modt_p + Models.MODS[ListIndex]->MODT.Copy((UINT8ARRAY)FieldValue, ArraySize); + break; + default: + break; + } break; default: break; @@ -164,6 +220,7 @@ bool DEBRRecord::SetField(FIELD_IDENTIFIERS, void *FieldValue, UINT32 ArraySize) void DEBRRecord::DeleteField(FIELD_IDENTIFIERS) { + DEBRModel defaultModel; switch(FieldID) { case 1: //flags1 @@ -182,17 +239,34 @@ void DEBRRecord::DeleteField(FIELD_IDENTIFIERS) versionControl2[0] = 0; versionControl2[1] = 0; return; - case 7: //data DATA ,, Struct - DATA.Unload(); - return; - case 8: //data DATA ,, Struct - DATA.Unload(); - return; - case 9: //data DATA ,, Struct - DATA.Unload(); - return; - case 10: //modt_p - MODT.Unload(); + case 7: //models + if(ListFieldID == 0) //modelsSize + { + Models.Unload(); + return; + } + + if(ListIndex >= Models.MODS.size()) + return; + + switch(ListFieldID) + { + case 1: //percentage + Models.MODS[ListIndex]->percentage = defaultModel.percentage; + return; + case 2: //modPath + delete []Models.MODS[ListIndex]->modPath; + Models.MODS[ListIndex]->modPath = NULL; + return; + case 3: //flags + Models.MODS[ListIndex]->SetFlagMask(defaultModel.flags); + return; + case 4: //modt_p + Models.MODS[ListIndex]->MODT.Unload(); + return; + default: + return; + } return; default: return; diff --git a/CBash/FalloutNewVegas/Records/API/EFSHRecordAPI.cpp b/CBash/FalloutNewVegas/Records/API/EFSHRecordAPI.cpp index fcbc449..8fd3c25 100644 --- a/CBash/FalloutNewVegas/Records/API/EFSHRecordAPI.cpp +++ b/CBash/FalloutNewVegas/Records/API/EFSHRecordAPI.cpp @@ -60,15 +60,15 @@ UINT32 EFSHRecord::GetFieldAttribute(FIELD_IDENTIFIERS, UINT32 WhichAttribute) return UNKNOWN_FIELD; } return UNKNOWN_FIELD; - case 7: //icon Fill Texture + case 7: //fillPath return ISTRING_FIELD; - case 8: //ico2 Particle Shader Texture + case 8: //particlePath return ISTRING_FIELD; - case 9: //nam7 Holes Texture + case 9: //holesPath return ISTRING_FIELD; - case 10: //data DATA ,, Struct - return UINT8_FIELD; - case 11: //data_p DATA ,, Struct + case 10: //flags + return UINT8_FLAG_FIELD; + case 11: //unused1 switch(WhichAttribute) { case 0: //fieldType @@ -79,19 +79,19 @@ UINT32 EFSHRecord::GetFieldAttribute(FIELD_IDENTIFIERS, UINT32 WhichAttribute) return UNKNOWN_FIELD; } return UNKNOWN_FIELD; - case 12: //data DATA ,, Struct + case 12: //memSBlend return UINT32_FIELD; - case 13: //data DATA ,, Struct + case 13: //memBlendOp return UINT32_FIELD; - case 14: //data DATA ,, Struct + case 14: //memZFunc return UINT32_FIELD; - case 15: //data DATA ,, Struct + case 15: //fill.red return UINT8_FIELD; - case 16: //data DATA ,, Struct + case 16: //fill.green return UINT8_FIELD; - case 17: //data DATA ,, Struct + case 17: //fill.blue return UINT8_FIELD; - case 18: //data_p DATA ,, Struct + case 18: //unused2 switch(WhichAttribute) { case 0: //fieldType @@ -102,31 +102,31 @@ UINT32 EFSHRecord::GetFieldAttribute(FIELD_IDENTIFIERS, UINT32 WhichAttribute) return UNKNOWN_FIELD; } return UNKNOWN_FIELD; - case 19: //data DATA ,, Struct + case 19: //fillAIn return FLOAT32_FIELD; - case 20: //data DATA ,, Struct + case 20: //fillAFull return FLOAT32_FIELD; - case 21: //data DATA ,, Struct + case 21: //fillAOut return FLOAT32_FIELD; - case 22: //data DATA ,, Struct + case 22: //fillAPRatio return FLOAT32_FIELD; - case 23: //data DATA ,, Struct + case 23: //fillAAmp return FLOAT32_FIELD; - case 24: //data DATA ,, Struct + case 24: //fillAFreq return FLOAT32_FIELD; - case 25: //data DATA ,, Struct + case 25: //fillAnimSpdU return FLOAT32_FIELD; - case 26: //data DATA ,, Struct + case 26: //fillAnimSpdV return FLOAT32_FIELD; - case 27: //data DATA ,, Struct + case 27: //edgeEffOff return FLOAT32_FIELD; - case 28: //data DATA ,, Struct + case 28: //edgeEff.red return UINT8_FIELD; - case 29: //data DATA ,, Struct + case 29: //edgeEff.green return UINT8_FIELD; - case 30: //data DATA ,, Struct + case 30: //edgeEff.blue return UINT8_FIELD; - case 31: //data_p DATA ,, Struct + case 31: //unused3 switch(WhichAttribute) { case 0: //fieldType @@ -137,77 +137,77 @@ UINT32 EFSHRecord::GetFieldAttribute(FIELD_IDENTIFIERS, UINT32 WhichAttribute) return UNKNOWN_FIELD; } return UNKNOWN_FIELD; - case 32: //data DATA ,, Struct + case 32: //edgeEffAIn return FLOAT32_FIELD; - case 33: //data DATA ,, Struct + case 33: //edgeEffAFull return FLOAT32_FIELD; - case 34: //data DATA ,, Struct + case 34: //edgeEffAOut return FLOAT32_FIELD; - case 35: //data DATA ,, Struct + case 35: //edgeEffAPRatio return FLOAT32_FIELD; - case 36: //data DATA ,, Struct + case 36: //edgeEffAAmp return FLOAT32_FIELD; - case 37: //data DATA ,, Struct + case 37: //edgeEffAFreq return FLOAT32_FIELD; - case 38: //data DATA ,, Struct + case 38: //fillAFRatio return FLOAT32_FIELD; - case 39: //data DATA ,, Struct + case 39: //edgeEffAFRatio return FLOAT32_FIELD; - case 40: //data DATA ,, Struct + case 40: //memDBlend return UINT32_FIELD; - case 41: //data DATA ,, Struct + case 41: //partSBlend return UINT32_FIELD; - case 42: //data DATA ,, Struct + case 42: //partBlendOp return UINT32_FIELD; - case 43: //data DATA ,, Struct + case 43: //partZFunc return UINT32_FIELD; - case 44: //data DATA ,, Struct + case 44: //partDBlend return UINT32_FIELD; - case 45: //data DATA ,, Struct + case 45: //partBUp return FLOAT32_FIELD; - case 46: //data DATA ,, Struct + case 46: //partBFull return FLOAT32_FIELD; - case 47: //data DATA ,, Struct + case 47: //partBDown return FLOAT32_FIELD; - case 48: //data DATA ,, Struct + case 48: //partBFRatio return FLOAT32_FIELD; - case 49: //data DATA ,, Struct + case 49: //partBPRatio return FLOAT32_FIELD; - case 50: //data DATA ,, Struct + case 50: //partLTime return FLOAT32_FIELD; - case 51: //data DATA ,, Struct + case 51: //partLDelta return FLOAT32_FIELD; - case 52: //data DATA ,, Struct + case 52: //partNSpd return FLOAT32_FIELD; - case 53: //data DATA ,, Struct + case 53: //partNAcc return FLOAT32_FIELD; - case 54: //data DATA ,, Struct + case 54: //partVel1 return FLOAT32_FIELD; - case 55: //data DATA ,, Struct + case 55: //partVel2 return FLOAT32_FIELD; - case 56: //data DATA ,, Struct + case 56: //partVel3 return FLOAT32_FIELD; - case 57: //data DATA ,, Struct + case 57: //partAcc1 return FLOAT32_FIELD; - case 58: //data DATA ,, Struct + case 58: //partAcc2 return FLOAT32_FIELD; - case 59: //data DATA ,, Struct + case 59: //partAcc3 return FLOAT32_FIELD; - case 60: //data DATA ,, Struct + case 60: //partKey1 return FLOAT32_FIELD; - case 61: //data DATA ,, Struct + case 61: //partKey2 return FLOAT32_FIELD; - case 62: //data DATA ,, Struct + case 62: //partKey1Time return FLOAT32_FIELD; - case 63: //data DATA ,, Struct + case 63: //partKey2Time return FLOAT32_FIELD; - case 64: //data DATA ,, Struct + case 64: //key1.red return UINT8_FIELD; - case 65: //data DATA ,, Struct + case 65: //key1.green return UINT8_FIELD; - case 66: //data DATA ,, Struct + case 66: //key1.blue return UINT8_FIELD; - case 67: //data_p DATA ,, Struct + case 67: //unused4 switch(WhichAttribute) { case 0: //fieldType @@ -218,13 +218,13 @@ UINT32 EFSHRecord::GetFieldAttribute(FIELD_IDENTIFIERS, UINT32 WhichAttribute) return UNKNOWN_FIELD; } return UNKNOWN_FIELD; - case 68: //data DATA ,, Struct + case 68: //key2.red return UINT8_FIELD; - case 69: //data DATA ,, Struct + case 69: //key2.green return UINT8_FIELD; - case 70: //data DATA ,, Struct + case 70: //key2.blue return UINT8_FIELD; - case 71: //data_p DATA ,, Struct + case 71: //unused5 switch(WhichAttribute) { case 0: //fieldType @@ -235,13 +235,13 @@ UINT32 EFSHRecord::GetFieldAttribute(FIELD_IDENTIFIERS, UINT32 WhichAttribute) return UNKNOWN_FIELD; } return UNKNOWN_FIELD; - case 72: //data DATA ,, Struct + case 72: //key3.red return UINT8_FIELD; - case 73: //data DATA ,, Struct + case 73: //key3.green return UINT8_FIELD; - case 74: //data DATA ,, Struct + case 74: //key3.blue return UINT8_FIELD; - case 75: //data_p DATA ,, Struct + case 75: //unused6 switch(WhichAttribute) { case 0: //fieldType @@ -252,47 +252,47 @@ UINT32 EFSHRecord::GetFieldAttribute(FIELD_IDENTIFIERS, UINT32 WhichAttribute) return UNKNOWN_FIELD; } return UNKNOWN_FIELD; - case 76: //data DATA ,, Struct + case 76: //key1A return FLOAT32_FIELD; - case 77: //data DATA ,, Struct + case 77: //key2A return FLOAT32_FIELD; - case 78: //data DATA ,, Struct + case 78: //key3A return FLOAT32_FIELD; - case 79: //data DATA ,, Struct + case 79: //key1Time return FLOAT32_FIELD; - case 80: //data DATA ,, Struct + case 80: //key2Time return FLOAT32_FIELD; - case 81: //data DATA ,, Struct + case 81: //key3Time return FLOAT32_FIELD; - case 82: //data DATA ,, Struct + case 82: //partInitSpd return FLOAT32_FIELD; - case 83: //data DATA ,, Struct + case 83: //partInitRot return FLOAT32_FIELD; - case 84: //data DATA ,, Struct + case 84: //partInitRotDelta return FLOAT32_FIELD; - case 85: //data DATA ,, Struct + case 85: //partRotSpd return FLOAT32_FIELD; - case 86: //data DATA ,, Struct + case 86: //partRotDelta return FLOAT32_FIELD; - case 87: //data DATA ,, Struct + case 87: //addon return FORMID_FIELD; - case 88: //data DATA ,, Struct + case 88: //holesSTime return FLOAT32_FIELD; - case 89: //data DATA ,, Struct + case 89: //holesETime return FLOAT32_FIELD; - case 90: //data DATA ,, Struct + case 90: //holesSValue return FLOAT32_FIELD; - case 91: //data DATA ,, Struct + case 91: //holesEValue return FLOAT32_FIELD; - case 92: //data DATA ,, Struct + case 92: //edgeWidth return FLOAT32_FIELD; - case 93: //data DATA ,, Struct + case 93: //edge.red return UINT8_FIELD; - case 94: //data DATA ,, Struct + case 94: //edge.green return UINT8_FIELD; - case 95: //data DATA ,, Struct + case 95: //edge.blue return UINT8_FIELD; - case 96: //data_p DATA ,, Struct + case 96: //unused7 switch(WhichAttribute) { case 0: //fieldType @@ -303,23 +303,23 @@ UINT32 EFSHRecord::GetFieldAttribute(FIELD_IDENTIFIERS, UINT32 WhichAttribute) return UNKNOWN_FIELD; } return UNKNOWN_FIELD; - case 97: //data DATA ,, Struct + case 97: //explWindSpd return FLOAT32_FIELD; - case 98: //data DATA ,, Struct + case 98: //textCountU return UINT32_FIELD; - case 99: //data DATA ,, Struct + case 99: //textCountV return UINT32_FIELD; - case 100: //data DATA ,, Struct + case 100: //addonFITime return FLOAT32_FIELD; - case 101: //data DATA ,, Struct + case 101: //addonFOTime return FLOAT32_FIELD; - case 102: //data DATA ,, Struct + case 102: //addonScaleStart return FLOAT32_FIELD; - case 103: //data DATA ,, Struct + case 103: //addonScaleEnd return FLOAT32_FIELD; - case 104: //data DATA ,, Struct + case 104: //addonScaleInTime return FLOAT32_FIELD; - case 105: //data DATA ,, Struct + case 105: //addonScaleOutTime return FLOAT32_FIELD; default: return UNKNOWN_FIELD; @@ -345,211 +345,211 @@ void * EFSHRecord::GetField(FIELD_IDENTIFIERS, void **FieldValues) case 6: //versionControl2 *FieldValues = &versionControl2[0]; return NULL; - case 7: //icon Fill Texture + case 7: //fillPath return ICON.value; - case 8: //ico2 Particle Shader Texture + case 8: //particlePath return ICO2.value; - case 9: //nam7 Holes Texture + case 9: //holesPath return NAM7.value; - case 10: //data DATA ,, Struct - return DATA.IsLoaded() ? &DATA->value10 : NULL; - case 11: //data_p DATA ,, Struct - *FieldValues = DATA.IsLoaded() ? &DATA->value11[0] : NULL; + case 10: //flags + return &DATA.value.flags; + case 11: //unused1 + *FieldValues = &DATA.value.unused1[0]; return NULL; - case 12: //data DATA ,, Struct - return DATA.IsLoaded() ? &DATA->value12 : NULL; - case 13: //data DATA ,, Struct - return DATA.IsLoaded() ? &DATA->value13 : NULL; - case 14: //data DATA ,, Struct - return DATA.IsLoaded() ? &DATA->value14 : NULL; - case 15: //data DATA ,, Struct - return DATA.IsLoaded() ? &DATA->value15 : NULL; - case 16: //data DATA ,, Struct - return DATA.IsLoaded() ? &DATA->value16 : NULL; - case 17: //data DATA ,, Struct - return DATA.IsLoaded() ? &DATA->value17 : NULL; - case 18: //data_p DATA ,, Struct - *FieldValues = DATA.IsLoaded() ? &DATA->value18[0] : NULL; + case 12: //memSBlend + return &DATA.value.memSBlend; + case 13: //memBlendOp + return &DATA.value.memBlendOp; + case 14: //memZFunc + return &DATA.value.memZFunc; + case 15: //fill.red + return &DATA.value.fill.red; + case 16: //fill.green + return &DATA.value.fill.green; + case 17: //fill.blue + return &DATA.value.fill.blue; + case 18: //unused2 + *FieldValues = &DATA.value.fill.unused1; return NULL; - case 19: //data DATA ,, Struct - return DATA.IsLoaded() ? &DATA->value19 : NULL; - case 20: //data DATA ,, Struct - return DATA.IsLoaded() ? &DATA->value20 : NULL; - case 21: //data DATA ,, Struct - return DATA.IsLoaded() ? &DATA->value21 : NULL; - case 22: //data DATA ,, Struct - return DATA.IsLoaded() ? &DATA->value22 : NULL; - case 23: //data DATA ,, Struct - return DATA.IsLoaded() ? &DATA->value23 : NULL; - case 24: //data DATA ,, Struct - return DATA.IsLoaded() ? &DATA->value24 : NULL; - case 25: //data DATA ,, Struct - return DATA.IsLoaded() ? &DATA->value25 : NULL; - case 26: //data DATA ,, Struct - return DATA.IsLoaded() ? &DATA->value26 : NULL; - case 27: //data DATA ,, Struct - return DATA.IsLoaded() ? &DATA->value27 : NULL; - case 28: //data DATA ,, Struct - return DATA.IsLoaded() ? &DATA->value28 : NULL; - case 29: //data DATA ,, Struct - return DATA.IsLoaded() ? &DATA->value29 : NULL; - case 30: //data DATA ,, Struct - return DATA.IsLoaded() ? &DATA->value30 : NULL; - case 31: //data_p DATA ,, Struct - *FieldValues = DATA.IsLoaded() ? &DATA->value31[0] : NULL; + case 19: //fillAIn + return &DATA.value.fillAIn; + case 20: //fillAFull + return &DATA.value.fillAFull; + case 21: //fillAOut + return &DATA.value.fillAOut; + case 22: //fillAPRatio + return &DATA.value.fillAPRatio; + case 23: //fillAAmp + return &DATA.value.fillAAmp; + case 24: //fillAFreq + return &DATA.value.fillAFreq; + case 25: //fillAnimSpdU + return &DATA.value.fillAnimSpdU; + case 26: //fillAnimSpdV + return &DATA.value.fillAnimSpdV; + case 27: //edgeEffOff + return &DATA.value.edgeEffOff; + case 28: //edgeEff.red + return &DATA.value.edgeEff.red; + case 29: //edgeEff.green + return &DATA.value.edgeEff.green; + case 30: //edgeEff.blue + return &DATA.value.edgeEff.blue; + case 31: //unused3 + *FieldValues = &DATA.value.edgeEff.unused1; return NULL; - case 32: //data DATA ,, Struct - return DATA.IsLoaded() ? &DATA->value32 : NULL; - case 33: //data DATA ,, Struct - return DATA.IsLoaded() ? &DATA->value33 : NULL; - case 34: //data DATA ,, Struct - return DATA.IsLoaded() ? &DATA->value34 : NULL; - case 35: //data DATA ,, Struct - return DATA.IsLoaded() ? &DATA->value35 : NULL; - case 36: //data DATA ,, Struct - return DATA.IsLoaded() ? &DATA->value36 : NULL; - case 37: //data DATA ,, Struct - return DATA.IsLoaded() ? &DATA->value37 : NULL; - case 38: //data DATA ,, Struct - return DATA.IsLoaded() ? &DATA->value38 : NULL; - case 39: //data DATA ,, Struct - return DATA.IsLoaded() ? &DATA->value39 : NULL; - case 40: //data DATA ,, Struct - return DATA.IsLoaded() ? &DATA->value40 : NULL; - case 41: //data DATA ,, Struct - return DATA.IsLoaded() ? &DATA->value41 : NULL; - case 42: //data DATA ,, Struct - return DATA.IsLoaded() ? &DATA->value42 : NULL; - case 43: //data DATA ,, Struct - return DATA.IsLoaded() ? &DATA->value43 : NULL; - case 44: //data DATA ,, Struct - return DATA.IsLoaded() ? &DATA->value44 : NULL; - case 45: //data DATA ,, Struct - return DATA.IsLoaded() ? &DATA->value45 : NULL; - case 46: //data DATA ,, Struct - return DATA.IsLoaded() ? &DATA->value46 : NULL; - case 47: //data DATA ,, Struct - return DATA.IsLoaded() ? &DATA->value47 : NULL; - case 48: //data DATA ,, Struct - return DATA.IsLoaded() ? &DATA->value48 : NULL; - case 49: //data DATA ,, Struct - return DATA.IsLoaded() ? &DATA->value49 : NULL; - case 50: //data DATA ,, Struct - return DATA.IsLoaded() ? &DATA->value50 : NULL; - case 51: //data DATA ,, Struct - return DATA.IsLoaded() ? &DATA->value51 : NULL; - case 52: //data DATA ,, Struct - return DATA.IsLoaded() ? &DATA->value52 : NULL; - case 53: //data DATA ,, Struct - return DATA.IsLoaded() ? &DATA->value53 : NULL; - case 54: //data DATA ,, Struct - return DATA.IsLoaded() ? &DATA->value54 : NULL; - case 55: //data DATA ,, Struct - return DATA.IsLoaded() ? &DATA->value55 : NULL; - case 56: //data DATA ,, Struct - return DATA.IsLoaded() ? &DATA->value56 : NULL; - case 57: //data DATA ,, Struct - return DATA.IsLoaded() ? &DATA->value57 : NULL; - case 58: //data DATA ,, Struct - return DATA.IsLoaded() ? &DATA->value58 : NULL; - case 59: //data DATA ,, Struct - return DATA.IsLoaded() ? &DATA->value59 : NULL; - case 60: //data DATA ,, Struct - return DATA.IsLoaded() ? &DATA->value60 : NULL; - case 61: //data DATA ,, Struct - return DATA.IsLoaded() ? &DATA->value61 : NULL; - case 62: //data DATA ,, Struct - return DATA.IsLoaded() ? &DATA->value62 : NULL; - case 63: //data DATA ,, Struct - return DATA.IsLoaded() ? &DATA->value63 : NULL; - case 64: //data DATA ,, Struct - return DATA.IsLoaded() ? &DATA->value64 : NULL; - case 65: //data DATA ,, Struct - return DATA.IsLoaded() ? &DATA->value65 : NULL; - case 66: //data DATA ,, Struct - return DATA.IsLoaded() ? &DATA->value66 : NULL; - case 67: //data_p DATA ,, Struct - *FieldValues = DATA.IsLoaded() ? &DATA->value67[0] : NULL; + case 32: //edgeEffAIn + return &DATA.value.edgeEffAIn; + case 33: //edgeEffAFull + return &DATA.value.edgeEffAFull; + case 34: //edgeEffAOut + return &DATA.value.edgeEffAOut; + case 35: //edgeEffAPRatio + return &DATA.value.edgeEffAPRatio; + case 36: //edgeEffAAmp + return &DATA.value.edgeEffAAmp; + case 37: //edgeEffAFreq + return &DATA.value.edgeEffAFreq; + case 38: //fillAFRatio + return &DATA.value.fillAFRatio; + case 39: //edgeEffAFRatio + return &DATA.value.edgeEffAFRatio; + case 40: //memDBlend + return &DATA.value.memDBlend; + case 41: //partSBlend + return &DATA.value.partSBlend; + case 42: //partBlendOp + return &DATA.value.partBlendOp; + case 43: //partZFunc + return &DATA.value.partZFunc; + case 44: //partDBlend + return &DATA.value.partDBlend; + case 45: //partBUp + return &DATA.value.partBUp; + case 46: //partBFull + return &DATA.value.partBFull; + case 47: //partBDown + return &DATA.value.partBDown; + case 48: //partBFRatio + return &DATA.value.partBFRatio; + case 49: //partBPRatio + return &DATA.value.partBPRatio; + case 50: //partLTime + return &DATA.value.partLTime; + case 51: //partLDelta + return &DATA.value.partLDelta; + case 52: //partNSpd + return &DATA.value.partNSpd; + case 53: //partNAcc + return &DATA.value.partNAcc; + case 54: //partVel1 + return &DATA.value.partVel1; + case 55: //partVel2 + return &DATA.value.partVel2; + case 56: //partVel3 + return &DATA.value.partVel3; + case 57: //partAcc1 + return &DATA.value.partAcc1; + case 58: //partAcc2 + return &DATA.value.partAcc2; + case 59: //partAcc3 + return &DATA.value.partAcc3; + case 60: //partKey1 + return &DATA.value.partKey1; + case 61: //partKey2 + return &DATA.value.partKey2; + case 62: //partKey1Time + return &DATA.value.partKey1Time; + case 63: //partKey2Time + return &DATA.value.partKey2Time; + case 64: //key1.red + return &DATA.value.key1.red; + case 65: //key1.green + return &DATA.value.key1.green; + case 66: //key1.blue + return &DATA.value.key1.blue; + case 67: //unused4 + *FieldValues = &DATA.value.key1.unused1; return NULL; - case 68: //data DATA ,, Struct - return DATA.IsLoaded() ? &DATA->value68 : NULL; - case 69: //data DATA ,, Struct - return DATA.IsLoaded() ? &DATA->value69 : NULL; - case 70: //data DATA ,, Struct - return DATA.IsLoaded() ? &DATA->value70 : NULL; - case 71: //data_p DATA ,, Struct - *FieldValues = DATA.IsLoaded() ? &DATA->value71[0] : NULL; + case 68: //key2.red + return &DATA.value.key2.red; + case 69: //key2.green + return &DATA.value.key2.green; + case 70: //key2.blue + return &DATA.value.key2.blue; + case 71: //unused5 + *FieldValues = &DATA.value.key2.unused1; return NULL; - case 72: //data DATA ,, Struct - return DATA.IsLoaded() ? &DATA->value72 : NULL; - case 73: //data DATA ,, Struct - return DATA.IsLoaded() ? &DATA->value73 : NULL; - case 74: //data DATA ,, Struct - return DATA.IsLoaded() ? &DATA->value74 : NULL; - case 75: //data_p DATA ,, Struct - *FieldValues = DATA.IsLoaded() ? &DATA->value75[0] : NULL; + case 72: //key3.red + return &DATA.value.key3.red; + case 73: //key3.green + return &DATA.value.key3.green; + case 74: //key3.blue + return &DATA.value.key3.blue; + case 75: //unused6 + *FieldValues = &DATA.value.key3.unused1; return NULL; - case 76: //data DATA ,, Struct - return DATA.IsLoaded() ? &DATA->value76 : NULL; - case 77: //data DATA ,, Struct - return DATA.IsLoaded() ? &DATA->value77 : NULL; - case 78: //data DATA ,, Struct - return DATA.IsLoaded() ? &DATA->value78 : NULL; - case 79: //data DATA ,, Struct - return DATA.IsLoaded() ? &DATA->value79 : NULL; - case 80: //data DATA ,, Struct - return DATA.IsLoaded() ? &DATA->value80 : NULL; - case 81: //data DATA ,, Struct - return DATA.IsLoaded() ? &DATA->value81 : NULL; - case 82: //data DATA ,, Struct - return DATA.IsLoaded() ? &DATA->value82 : NULL; - case 83: //data DATA ,, Struct - return DATA.IsLoaded() ? &DATA->value83 : NULL; - case 84: //data DATA ,, Struct - return DATA.IsLoaded() ? &DATA->value84 : NULL; - case 85: //data DATA ,, Struct - return DATA.IsLoaded() ? &DATA->value85 : NULL; - case 86: //data DATA ,, Struct - return DATA.IsLoaded() ? &DATA->value86 : NULL; - case 87: //data DATA ,, Struct - return DATA.IsLoaded() ? &DATA->value87 : NULL; - case 88: //data DATA ,, Struct - return DATA.IsLoaded() ? &DATA->value88 : NULL; - case 89: //data DATA ,, Struct - return DATA.IsLoaded() ? &DATA->value89 : NULL; - case 90: //data DATA ,, Struct - return DATA.IsLoaded() ? &DATA->value90 : NULL; - case 91: //data DATA ,, Struct - return DATA.IsLoaded() ? &DATA->value91 : NULL; - case 92: //data DATA ,, Struct - return DATA.IsLoaded() ? &DATA->value92 : NULL; - case 93: //data DATA ,, Struct - return DATA.IsLoaded() ? &DATA->value93 : NULL; - case 94: //data DATA ,, Struct - return DATA.IsLoaded() ? &DATA->value94 : NULL; - case 95: //data DATA ,, Struct - return DATA.IsLoaded() ? &DATA->value95 : NULL; - case 96: //data_p DATA ,, Struct - *FieldValues = DATA.IsLoaded() ? &DATA->value96[0] : NULL; + case 76: //key1A + return &DATA.value.key1A; + case 77: //key2A + return &DATA.value.key2A; + case 78: //key3A + return &DATA.value.key3A; + case 79: //key1Time + return &DATA.value.key1Time; + case 80: //key2Time + return &DATA.value.key2Time; + case 81: //key3Time + return &DATA.value.key3Time; + case 82: //partInitSpd + return &DATA.value.partInitSpd; + case 83: //partInitRot + return &DATA.value.partInitRot; + case 84: //partInitRotDelta + return &DATA.value.partInitRotDelta; + case 85: //partRotSpd + return &DATA.value.partRotSpd; + case 86: //partRotDelta + return &DATA.value.partRotDelta; + case 87: //addon + return &DATA.value.addon; + case 88: //holesSTime + return &DATA.value.holesSTime; + case 89: //holesETime + return &DATA.value.holesETime; + case 90: //holesSValue + return &DATA.value.holesSValue; + case 91: //holesEValue + return &DATA.value.holesEValue; + case 92: //edgeWidth + return &DATA.value.edgeWidth; + case 93: //edge.red + return &DATA.value.edge.red; + case 94: //edge.green + return &DATA.value.edge.green; + case 95: //edge.blue + return &DATA.value.edge.blue; + case 96: //unused7 + *FieldValues = &DATA.value.edge.unused1; return NULL; - case 97: //data DATA ,, Struct - return DATA.IsLoaded() ? &DATA->value97 : NULL; - case 98: //data DATA ,, Struct - return DATA.IsLoaded() ? &DATA->value98 : NULL; - case 99: //data DATA ,, Struct - return DATA.IsLoaded() ? &DATA->value99 : NULL; - case 100: //data DATA ,, Struct - return DATA.IsLoaded() ? &DATA->value100 : NULL; - case 101: //data DATA ,, Struct - return DATA.IsLoaded() ? &DATA->value101 : NULL; - case 102: //data DATA ,, Struct - return DATA.IsLoaded() ? &DATA->value102 : NULL; - case 103: //data DATA ,, Struct - return DATA.IsLoaded() ? &DATA->value103 : NULL; - case 104: //data DATA ,, Struct - return DATA.IsLoaded() ? &DATA->value104 : NULL; - case 105: //data DATA ,, Struct - return DATA.IsLoaded() ? &DATA->value105 : NULL; + case 97: //explWindSpd + return &DATA.value.explWindSpd; + case 98: //textCountU + return &DATA.value.textCountU; + case 99: //textCountV + return &DATA.value.textCountV; + case 100: //addonFITime + return &DATA.value.addonFITime; + case 101: //addonFOTime + return &DATA.value.addonFOTime; + case 102: //addonScaleStart + return &DATA.value.addonScaleStart; + case 103: //addonScaleEnd + return &DATA.value.addonScaleEnd; + case 104: //addonScaleInTime + return &DATA.value.addonScaleInTime; + case 105: //addonScaleOutTime + return &DATA.value.addonScaleOutTime; default: return NULL; } @@ -583,414 +583,318 @@ bool EFSHRecord::SetField(FIELD_IDENTIFIERS, void *FieldValue, UINT32 ArraySize) versionControl2[0] = ((UINT8ARRAY)FieldValue)[0]; versionControl2[1] = ((UINT8ARRAY)FieldValue)[1]; break; - case 7: //icon Fill Texture + case 7: //fillPath ICON.Copy((STRING)FieldValue); break; - case 8: //ico2 Particle Shader Texture + case 8: //particlePath ICO2.Copy((STRING)FieldValue); break; - case 9: //nam7 Holes Texture + case 9: //holesPath NAM7.Copy((STRING)FieldValue); break; - case 10: //data DATA ,, Struct - DATA.Load(); - DATA->value10 = *(UINT8 *)FieldValue; + case 10: //flags + SetFlagMask(*(UINT8 *)FieldValue); break; - case 11: //data_p DATA ,, Struct + case 11: //unused1 if(ArraySize != 3) break; - DATA.Load(); - DATA->value11[0] = ((UINT8ARRAY)FieldValue)[0]; - DATA->value11[1] = ((UINT8ARRAY)FieldValue)[1]; - DATA->value11[2] = ((UINT8ARRAY)FieldValue)[2]; + DATA.value.unused1[0] = ((UINT8ARRAY)FieldValue)[0]; + DATA.value.unused1[1] = ((UINT8ARRAY)FieldValue)[1]; + DATA.value.unused1[2] = ((UINT8ARRAY)FieldValue)[2]; break; - case 12: //data DATA ,, Struct - DATA.Load(); - DATA->value12 = *(UINT32 *)FieldValue; + case 12: //memSBlend + DATA.value.memSBlend = *(UINT32 *)FieldValue; break; - case 13: //data DATA ,, Struct - DATA.Load(); - DATA->value13 = *(UINT32 *)FieldValue; + case 13: //memBlendOp + DATA.value.memBlendOp = *(UINT32 *)FieldValue; break; - case 14: //data DATA ,, Struct - DATA.Load(); - DATA->value14 = *(UINT32 *)FieldValue; + case 14: //memZFunc + DATA.value.memZFunc = *(UINT32 *)FieldValue; break; - case 15: //data DATA ,, Struct - DATA.Load(); - DATA->value15 = *(UINT8 *)FieldValue; + case 15: //fill.red + DATA.value.fill.red = *(UINT8 *)FieldValue; break; - case 16: //data DATA ,, Struct - DATA.Load(); - DATA->value16 = *(UINT8 *)FieldValue; + case 16: //fill.green + DATA.value.fill.green = *(UINT8 *)FieldValue; break; - case 17: //data DATA ,, Struct - DATA.Load(); - DATA->value17 = *(UINT8 *)FieldValue; + case 17: //fill.blue + DATA.value.fill.blue = *(UINT8 *)FieldValue; break; - case 18: //data_p DATA ,, Struct + case 18: //unused2 if(ArraySize != 1) break; - DATA.Load(); - DATA->value18[0] = ((UINT8ARRAY)FieldValue)[0]; + DATA.value.fill.unused1 = ((UINT8ARRAY)FieldValue)[0]; break; - case 19: //data DATA ,, Struct - DATA.Load(); - DATA->value19 = *(FLOAT32 *)FieldValue; + case 19: //fillAIn + DATA.value.fillAIn = *(FLOAT32 *)FieldValue; break; - case 20: //data DATA ,, Struct - DATA.Load(); - DATA->value20 = *(FLOAT32 *)FieldValue; + case 20: //fillAFull + DATA.value.fillAFull = *(FLOAT32 *)FieldValue; break; - case 21: //data DATA ,, Struct - DATA.Load(); - DATA->value21 = *(FLOAT32 *)FieldValue; + case 21: //fillAOut + DATA.value.fillAOut = *(FLOAT32 *)FieldValue; break; - case 22: //data DATA ,, Struct - DATA.Load(); - DATA->value22 = *(FLOAT32 *)FieldValue; + case 22: //fillAPRatio + DATA.value.fillAPRatio = *(FLOAT32 *)FieldValue; break; - case 23: //data DATA ,, Struct - DATA.Load(); - DATA->value23 = *(FLOAT32 *)FieldValue; + case 23: //fillAAmp + DATA.value.fillAAmp = *(FLOAT32 *)FieldValue; break; - case 24: //data DATA ,, Struct - DATA.Load(); - DATA->value24 = *(FLOAT32 *)FieldValue; + case 24: //fillAFreq + DATA.value.fillAFreq = *(FLOAT32 *)FieldValue; break; - case 25: //data DATA ,, Struct - DATA.Load(); - DATA->value25 = *(FLOAT32 *)FieldValue; + case 25: //fillAnimSpdU + DATA.value.fillAnimSpdU = *(FLOAT32 *)FieldValue; break; - case 26: //data DATA ,, Struct - DATA.Load(); - DATA->value26 = *(FLOAT32 *)FieldValue; + case 26: //fillAnimSpdV + DATA.value.fillAnimSpdV = *(FLOAT32 *)FieldValue; break; - case 27: //data DATA ,, Struct - DATA.Load(); - DATA->value27 = *(FLOAT32 *)FieldValue; + case 27: //edgeEffOff + DATA.value.edgeEffOff = *(FLOAT32 *)FieldValue; break; - case 28: //data DATA ,, Struct - DATA.Load(); - DATA->value28 = *(UINT8 *)FieldValue; + case 28: //edgeEff.red + DATA.value.edgeEff.red = *(UINT8 *)FieldValue; break; - case 29: //data DATA ,, Struct - DATA.Load(); - DATA->value29 = *(UINT8 *)FieldValue; + case 29: //edgeEff.green + DATA.value.edgeEff.green = *(UINT8 *)FieldValue; break; - case 30: //data DATA ,, Struct - DATA.Load(); - DATA->value30 = *(UINT8 *)FieldValue; + case 30: //edgeEff.blue + DATA.value.edgeEff.blue = *(UINT8 *)FieldValue; break; - case 31: //data_p DATA ,, Struct + case 31: //unused3 if(ArraySize != 1) break; - DATA.Load(); - DATA->value31[0] = ((UINT8ARRAY)FieldValue)[0]; + DATA.value.edgeEff.unused1 = ((UINT8ARRAY)FieldValue)[0]; break; - case 32: //data DATA ,, Struct - DATA.Load(); - DATA->value32 = *(FLOAT32 *)FieldValue; + case 32: //edgeEffAIn + DATA.value.edgeEffAIn = *(FLOAT32 *)FieldValue; break; - case 33: //data DATA ,, Struct - DATA.Load(); - DATA->value33 = *(FLOAT32 *)FieldValue; + case 33: //edgeEffAFull + DATA.value.edgeEffAFull = *(FLOAT32 *)FieldValue; break; - case 34: //data DATA ,, Struct - DATA.Load(); - DATA->value34 = *(FLOAT32 *)FieldValue; + case 34: //edgeEffAOut + DATA.value.edgeEffAOut = *(FLOAT32 *)FieldValue; break; - case 35: //data DATA ,, Struct - DATA.Load(); - DATA->value35 = *(FLOAT32 *)FieldValue; + case 35: //edgeEffAPRatio + DATA.value.edgeEffAPRatio = *(FLOAT32 *)FieldValue; break; - case 36: //data DATA ,, Struct - DATA.Load(); - DATA->value36 = *(FLOAT32 *)FieldValue; + case 36: //edgeEffAAmp + DATA.value.edgeEffAAmp = *(FLOAT32 *)FieldValue; break; - case 37: //data DATA ,, Struct - DATA.Load(); - DATA->value37 = *(FLOAT32 *)FieldValue; + case 37: //edgeEffAFreq + DATA.value.edgeEffAFreq = *(FLOAT32 *)FieldValue; break; - case 38: //data DATA ,, Struct - DATA.Load(); - DATA->value38 = *(FLOAT32 *)FieldValue; + case 38: //fillAFRatio + DATA.value.fillAFRatio = *(FLOAT32 *)FieldValue; break; - case 39: //data DATA ,, Struct - DATA.Load(); - DATA->value39 = *(FLOAT32 *)FieldValue; + case 39: //edgeEffAFRatio + DATA.value.edgeEffAFRatio = *(FLOAT32 *)FieldValue; break; - case 40: //data DATA ,, Struct - DATA.Load(); - DATA->value40 = *(UINT32 *)FieldValue; + case 40: //memDBlend + DATA.value.memDBlend = *(UINT32 *)FieldValue; break; - case 41: //data DATA ,, Struct - DATA.Load(); - DATA->value41 = *(UINT32 *)FieldValue; + case 41: //partSBlend + DATA.value.partSBlend = *(UINT32 *)FieldValue; break; - case 42: //data DATA ,, Struct - DATA.Load(); - DATA->value42 = *(UINT32 *)FieldValue; + case 42: //partBlendOp + DATA.value.partBlendOp = *(UINT32 *)FieldValue; break; - case 43: //data DATA ,, Struct - DATA.Load(); - DATA->value43 = *(UINT32 *)FieldValue; + case 43: //partZFunc + DATA.value.partZFunc = *(UINT32 *)FieldValue; break; - case 44: //data DATA ,, Struct - DATA.Load(); - DATA->value44 = *(UINT32 *)FieldValue; + case 44: //partDBlend + DATA.value.partDBlend = *(UINT32 *)FieldValue; break; - case 45: //data DATA ,, Struct - DATA.Load(); - DATA->value45 = *(FLOAT32 *)FieldValue; + case 45: //partBUp + DATA.value.partBUp = *(FLOAT32 *)FieldValue; break; - case 46: //data DATA ,, Struct - DATA.Load(); - DATA->value46 = *(FLOAT32 *)FieldValue; + case 46: //partBFull + DATA.value.partBFull = *(FLOAT32 *)FieldValue; break; - case 47: //data DATA ,, Struct - DATA.Load(); - DATA->value47 = *(FLOAT32 *)FieldValue; + case 47: //partBDown + DATA.value.partBDown = *(FLOAT32 *)FieldValue; break; - case 48: //data DATA ,, Struct - DATA.Load(); - DATA->value48 = *(FLOAT32 *)FieldValue; + case 48: //partBFRatio + DATA.value.partBFRatio = *(FLOAT32 *)FieldValue; break; - case 49: //data DATA ,, Struct - DATA.Load(); - DATA->value49 = *(FLOAT32 *)FieldValue; + case 49: //partBPRatio + DATA.value.partBPRatio = *(FLOAT32 *)FieldValue; break; - case 50: //data DATA ,, Struct - DATA.Load(); - DATA->value50 = *(FLOAT32 *)FieldValue; + case 50: //partLTime + DATA.value.partLTime = *(FLOAT32 *)FieldValue; break; - case 51: //data DATA ,, Struct - DATA.Load(); - DATA->value51 = *(FLOAT32 *)FieldValue; + case 51: //partLDelta + DATA.value.partLDelta = *(FLOAT32 *)FieldValue; break; - case 52: //data DATA ,, Struct - DATA.Load(); - DATA->value52 = *(FLOAT32 *)FieldValue; + case 52: //partNSpd + DATA.value.partNSpd = *(FLOAT32 *)FieldValue; break; - case 53: //data DATA ,, Struct - DATA.Load(); - DATA->value53 = *(FLOAT32 *)FieldValue; + case 53: //partNAcc + DATA.value.partNAcc = *(FLOAT32 *)FieldValue; break; - case 54: //data DATA ,, Struct - DATA.Load(); - DATA->value54 = *(FLOAT32 *)FieldValue; + case 54: //partVel1 + DATA.value.partVel1 = *(FLOAT32 *)FieldValue; break; - case 55: //data DATA ,, Struct - DATA.Load(); - DATA->value55 = *(FLOAT32 *)FieldValue; + case 55: //partVel2 + DATA.value.partVel2 = *(FLOAT32 *)FieldValue; break; - case 56: //data DATA ,, Struct - DATA.Load(); - DATA->value56 = *(FLOAT32 *)FieldValue; + case 56: //partVel3 + DATA.value.partVel3 = *(FLOAT32 *)FieldValue; break; - case 57: //data DATA ,, Struct - DATA.Load(); - DATA->value57 = *(FLOAT32 *)FieldValue; + case 57: //partAcc1 + DATA.value.partAcc1 = *(FLOAT32 *)FieldValue; break; - case 58: //data DATA ,, Struct - DATA.Load(); - DATA->value58 = *(FLOAT32 *)FieldValue; + case 58: //partAcc2 + DATA.value.partAcc2 = *(FLOAT32 *)FieldValue; break; - case 59: //data DATA ,, Struct - DATA.Load(); - DATA->value59 = *(FLOAT32 *)FieldValue; + case 59: //partAcc3 + DATA.value.partAcc3 = *(FLOAT32 *)FieldValue; break; - case 60: //data DATA ,, Struct - DATA.Load(); - DATA->value60 = *(FLOAT32 *)FieldValue; + case 60: //partKey1 + DATA.value.partKey1 = *(FLOAT32 *)FieldValue; break; - case 61: //data DATA ,, Struct - DATA.Load(); - DATA->value61 = *(FLOAT32 *)FieldValue; + case 61: //partKey2 + DATA.value.partKey2 = *(FLOAT32 *)FieldValue; break; - case 62: //data DATA ,, Struct - DATA.Load(); - DATA->value62 = *(FLOAT32 *)FieldValue; + case 62: //partKey1Time + DATA.value.partKey1Time = *(FLOAT32 *)FieldValue; break; - case 63: //data DATA ,, Struct - DATA.Load(); - DATA->value63 = *(FLOAT32 *)FieldValue; + case 63: //partKey2Time + DATA.value.partKey2Time = *(FLOAT32 *)FieldValue; break; - case 64: //data DATA ,, Struct - DATA.Load(); - DATA->value64 = *(UINT8 *)FieldValue; + case 64: //key1.red + DATA.value.key1.red = *(UINT8 *)FieldValue; break; - case 65: //data DATA ,, Struct - DATA.Load(); - DATA->value65 = *(UINT8 *)FieldValue; + case 65: //key1.green + DATA.value.key1.green = *(UINT8 *)FieldValue; break; - case 66: //data DATA ,, Struct - DATA.Load(); - DATA->value66 = *(UINT8 *)FieldValue; + case 66: //key1.blue + DATA.value.key1.blue = *(UINT8 *)FieldValue; break; - case 67: //data_p DATA ,, Struct + case 67: //unused4 if(ArraySize != 1) break; - DATA.Load(); - DATA->value67[0] = ((UINT8ARRAY)FieldValue)[0]; + DATA.value.key1.unused1 = ((UINT8ARRAY)FieldValue)[0]; break; - case 68: //data DATA ,, Struct - DATA.Load(); - DATA->value68 = *(UINT8 *)FieldValue; + case 68: //key2.red + DATA.value.key2.red = *(UINT8 *)FieldValue; break; - case 69: //data DATA ,, Struct - DATA.Load(); - DATA->value69 = *(UINT8 *)FieldValue; + case 69: //key2.green + DATA.value.key2.green = *(UINT8 *)FieldValue; break; - case 70: //data DATA ,, Struct - DATA.Load(); - DATA->value70 = *(UINT8 *)FieldValue; + case 70: //key2.blue + DATA.value.key2.blue = *(UINT8 *)FieldValue; break; - case 71: //data_p DATA ,, Struct + case 71: //unused5 if(ArraySize != 1) break; - DATA.Load(); - DATA->value71[0] = ((UINT8ARRAY)FieldValue)[0]; + DATA.value.key2.unused1 = ((UINT8ARRAY)FieldValue)[0]; break; - case 72: //data DATA ,, Struct - DATA.Load(); - DATA->value72 = *(UINT8 *)FieldValue; + case 72: //key3.red + DATA.value.key3.red = *(UINT8 *)FieldValue; break; - case 73: //data DATA ,, Struct - DATA.Load(); - DATA->value73 = *(UINT8 *)FieldValue; + case 73: //key3.green + DATA.value.key3.green = *(UINT8 *)FieldValue; break; - case 74: //data DATA ,, Struct - DATA.Load(); - DATA->value74 = *(UINT8 *)FieldValue; + case 74: //key3.blue + DATA.value.key3.blue = *(UINT8 *)FieldValue; break; - case 75: //data_p DATA ,, Struct + case 75: //unused6 if(ArraySize != 1) break; - DATA.Load(); - DATA->value75[0] = ((UINT8ARRAY)FieldValue)[0]; + DATA.value.key3.unused1 = ((UINT8ARRAY)FieldValue)[0]; break; - case 76: //data DATA ,, Struct - DATA.Load(); - DATA->value76 = *(FLOAT32 *)FieldValue; + case 76: //key1A + DATA.value.key1A = *(FLOAT32 *)FieldValue; break; - case 77: //data DATA ,, Struct - DATA.Load(); - DATA->value77 = *(FLOAT32 *)FieldValue; + case 77: //key2A + DATA.value.key2A = *(FLOAT32 *)FieldValue; break; - case 78: //data DATA ,, Struct - DATA.Load(); - DATA->value78 = *(FLOAT32 *)FieldValue; + case 78: //key3A + DATA.value.key3A = *(FLOAT32 *)FieldValue; break; - case 79: //data DATA ,, Struct - DATA.Load(); - DATA->value79 = *(FLOAT32 *)FieldValue; + case 79: //key1Time + DATA.value.key1Time = *(FLOAT32 *)FieldValue; break; - case 80: //data DATA ,, Struct - DATA.Load(); - DATA->value80 = *(FLOAT32 *)FieldValue; + case 80: //key2Time + DATA.value.key2Time = *(FLOAT32 *)FieldValue; break; - case 81: //data DATA ,, Struct - DATA.Load(); - DATA->value81 = *(FLOAT32 *)FieldValue; + case 81: //key3Time + DATA.value.key3Time = *(FLOAT32 *)FieldValue; break; - case 82: //data DATA ,, Struct - DATA.Load(); - DATA->value82 = *(FLOAT32 *)FieldValue; + case 82: //partInitSpd + DATA.value.partInitSpd = *(FLOAT32 *)FieldValue; break; - case 83: //data DATA ,, Struct - DATA.Load(); - DATA->value83 = *(FLOAT32 *)FieldValue; + case 83: //partInitRot + DATA.value.partInitRot = *(FLOAT32 *)FieldValue; break; - case 84: //data DATA ,, Struct - DATA.Load(); - DATA->value84 = *(FLOAT32 *)FieldValue; + case 84: //partInitRotDelta + DATA.value.partInitRotDelta = *(FLOAT32 *)FieldValue; break; - case 85: //data DATA ,, Struct - DATA.Load(); - DATA->value85 = *(FLOAT32 *)FieldValue; + case 85: //partRotSpd + DATA.value.partRotSpd = *(FLOAT32 *)FieldValue; break; - case 86: //data DATA ,, Struct - DATA.Load(); - DATA->value86 = *(FLOAT32 *)FieldValue; + case 86: //partRotDelta + DATA.value.partRotDelta = *(FLOAT32 *)FieldValue; break; - case 87: //data DATA ,, Struct - DATA.Load(); - DATA->value87 = *(FORMID *)FieldValue; + case 87: //addon + DATA.value.addon = *(FORMID *)FieldValue; return true; - case 88: //data DATA ,, Struct - DATA.Load(); - DATA->value88 = *(FLOAT32 *)FieldValue; + case 88: //holesSTime + DATA.value.holesSTime = *(FLOAT32 *)FieldValue; break; - case 89: //data DATA ,, Struct - DATA.Load(); - DATA->value89 = *(FLOAT32 *)FieldValue; + case 89: //holesETime + DATA.value.holesETime = *(FLOAT32 *)FieldValue; break; - case 90: //data DATA ,, Struct - DATA.Load(); - DATA->value90 = *(FLOAT32 *)FieldValue; + case 90: //holesSValue + DATA.value.holesSValue = *(FLOAT32 *)FieldValue; break; - case 91: //data DATA ,, Struct - DATA.Load(); - DATA->value91 = *(FLOAT32 *)FieldValue; + case 91: //holesEValue + DATA.value.holesEValue = *(FLOAT32 *)FieldValue; break; - case 92: //data DATA ,, Struct - DATA.Load(); - DATA->value92 = *(FLOAT32 *)FieldValue; + case 92: //edgeWidth + DATA.value.edgeWidth = *(FLOAT32 *)FieldValue; break; - case 93: //data DATA ,, Struct - DATA.Load(); - DATA->value93 = *(UINT8 *)FieldValue; + case 93: //edge.red + DATA.value.edge.red = *(UINT8 *)FieldValue; break; - case 94: //data DATA ,, Struct - DATA.Load(); - DATA->value94 = *(UINT8 *)FieldValue; + case 94: //edge.green + DATA.value.edge.green = *(UINT8 *)FieldValue; break; - case 95: //data DATA ,, Struct - DATA.Load(); - DATA->value95 = *(UINT8 *)FieldValue; + case 95: //edge.blue + DATA.value.edge.blue = *(UINT8 *)FieldValue; break; - case 96: //data_p DATA ,, Struct + case 96: //unused7 if(ArraySize != 1) break; - DATA.Load(); - DATA->value96[0] = ((UINT8ARRAY)FieldValue)[0]; + DATA.value.edge.unused1 = ((UINT8ARRAY)FieldValue)[0]; break; - case 97: //data DATA ,, Struct - DATA.Load(); - DATA->value97 = *(FLOAT32 *)FieldValue; + case 97: //explWindSpd + DATA.value.explWindSpd = *(FLOAT32 *)FieldValue; break; - case 98: //data DATA ,, Struct - DATA.Load(); - DATA->value98 = *(UINT32 *)FieldValue; + case 98: //textCountU + DATA.value.textCountU = *(UINT32 *)FieldValue; break; - case 99: //data DATA ,, Struct - DATA.Load(); - DATA->value99 = *(UINT32 *)FieldValue; + case 99: //textCountV + DATA.value.textCountV = *(UINT32 *)FieldValue; break; - case 100: //data DATA ,, Struct - DATA.Load(); - DATA->value100 = *(FLOAT32 *)FieldValue; + case 100: //addonFITime + DATA.value.addonFITime = *(FLOAT32 *)FieldValue; break; - case 101: //data DATA ,, Struct - DATA.Load(); - DATA->value101 = *(FLOAT32 *)FieldValue; + case 101: //addonFOTime + DATA.value.addonFOTime = *(FLOAT32 *)FieldValue; break; - case 102: //data DATA ,, Struct - DATA.Load(); - DATA->value102 = *(FLOAT32 *)FieldValue; + case 102: //addonScaleStart + DATA.value.addonScaleStart = *(FLOAT32 *)FieldValue; break; - case 103: //data DATA ,, Struct - DATA.Load(); - DATA->value103 = *(FLOAT32 *)FieldValue; + case 103: //addonScaleEnd + DATA.value.addonScaleEnd = *(FLOAT32 *)FieldValue; break; - case 104: //data DATA ,, Struct - DATA.Load(); - DATA->value104 = *(FLOAT32 *)FieldValue; + case 104: //addonScaleInTime + DATA.value.addonScaleInTime = *(FLOAT32 *)FieldValue; break; - case 105: //data DATA ,, Struct - DATA.Load(); - DATA->value105 = *(FLOAT32 *)FieldValue; + case 105: //addonScaleOutTime + DATA.value.addonScaleOutTime = *(FLOAT32 *)FieldValue; break; default: break; @@ -1000,6 +904,7 @@ bool EFSHRecord::SetField(FIELD_IDENTIFIERS, void *FieldValue, UINT32 ArraySize) void EFSHRecord::DeleteField(FIELD_IDENTIFIERS) { + EFSHDATA defaultDATA; switch(FieldID) { case 1: //flags1 @@ -1018,302 +923,304 @@ void EFSHRecord::DeleteField(FIELD_IDENTIFIERS) versionControl2[0] = 0; versionControl2[1] = 0; return; - case 7: //icon Fill Texture + case 7: //fillPath ICON.Unload(); return; - case 8: //ico2 Particle Shader Texture + case 8: //particlePath ICO2.Unload(); return; - case 9: //nam7 Holes Texture + case 9: //holesPath NAM7.Unload(); return; - case 10: //data DATA ,, Struct - DATA.Unload(); + case 10: //flags + SetFlagMask(defaultDATA.flags); return; - case 11: //data_p DATA ,, Struct - DATA.Unload(); + case 11: //unused1 + DATA.value.unused1[0] = defaultDATA.unused1[0]; + DATA.value.unused1[1] = defaultDATA.unused1[1]; + DATA.value.unused1[2] = defaultDATA.unused1[2]; return; - case 12: //data DATA ,, Struct - DATA.Unload(); + case 12: //memSBlend + DATA.value.memSBlend = defaultDATA.memSBlend; return; - case 13: //data DATA ,, Struct - DATA.Unload(); + case 13: //memBlendOp + DATA.value.memBlendOp = defaultDATA.memBlendOp; return; - case 14: //data DATA ,, Struct - DATA.Unload(); + case 14: //memZFunc + DATA.value.memZFunc = defaultDATA.memZFunc; return; - case 15: //data DATA ,, Struct - DATA.Unload(); + case 15: //fill.red + DATA.value.fill.red = defaultDATA.fill.red; return; - case 16: //data DATA ,, Struct - DATA.Unload(); + case 16: //fill.green + DATA.value.fill.green = defaultDATA.fill.green; return; - case 17: //data DATA ,, Struct - DATA.Unload(); + case 17: //fill.blue + DATA.value.fill.blue = defaultDATA.fill.blue; return; - case 18: //data_p DATA ,, Struct - DATA.Unload(); + case 18: //unused2 + DATA.value.fill.unused1 = defaultDATA.fill.unused1; return; - case 19: //data DATA ,, Struct - DATA.Unload(); + case 19: //fillAIn + DATA.value.fillAIn = defaultDATA.fillAIn; return; - case 20: //data DATA ,, Struct - DATA.Unload(); + case 20: //fillAFull + DATA.value.fillAFull = defaultDATA.fillAFull; return; - case 21: //data DATA ,, Struct - DATA.Unload(); + case 21: //fillAOut + DATA.value.fillAOut = defaultDATA.fillAOut; return; - case 22: //data DATA ,, Struct - DATA.Unload(); + case 22: //fillAPRatio + DATA.value.fillAPRatio = defaultDATA.fillAPRatio; return; - case 23: //data DATA ,, Struct - DATA.Unload(); + case 23: //fillAAmp + DATA.value.fillAAmp = defaultDATA.fillAAmp; return; - case 24: //data DATA ,, Struct - DATA.Unload(); + case 24: //fillAFreq + DATA.value.fillAFreq = defaultDATA.fillAFreq; return; - case 25: //data DATA ,, Struct - DATA.Unload(); + case 25: //fillAnimSpdU + DATA.value.fillAnimSpdU = defaultDATA.fillAnimSpdU; return; - case 26: //data DATA ,, Struct - DATA.Unload(); + case 26: //fillAnimSpdV + DATA.value.fillAnimSpdV = defaultDATA.fillAnimSpdV; return; - case 27: //data DATA ,, Struct - DATA.Unload(); + case 27: //edgeEffOff + DATA.value.edgeEffOff = defaultDATA.edgeEffOff; return; - case 28: //data DATA ,, Struct - DATA.Unload(); + case 28: //edgeEff.red + DATA.value.edgeEff.red = defaultDATA.edgeEff.red; return; - case 29: //data DATA ,, Struct - DATA.Unload(); + case 29: //edgeEff.green + DATA.value.edgeEff.green = defaultDATA.edgeEff.green; return; - case 30: //data DATA ,, Struct - DATA.Unload(); + case 30: //edgeEff.blue + DATA.value.edgeEff.blue = defaultDATA.edgeEff.blue; return; - case 31: //data_p DATA ,, Struct - DATA.Unload(); + case 31: //unused3 + DATA.value.edgeEff.unused1 = defaultDATA.edgeEff.unused1; return; - case 32: //data DATA ,, Struct - DATA.Unload(); + case 32: //edgeEffAIn + DATA.value.edgeEffAIn = defaultDATA.edgeEffAIn; return; - case 33: //data DATA ,, Struct - DATA.Unload(); + case 33: //edgeEffAFull + DATA.value.edgeEffAFull = defaultDATA.edgeEffAFull; return; - case 34: //data DATA ,, Struct - DATA.Unload(); + case 34: //edgeEffAOut + DATA.value.edgeEffAOut = defaultDATA.edgeEffAOut; return; - case 35: //data DATA ,, Struct - DATA.Unload(); + case 35: //edgeEffAPRatio + DATA.value.edgeEffAPRatio = defaultDATA.edgeEffAPRatio; return; - case 36: //data DATA ,, Struct - DATA.Unload(); + case 36: //edgeEffAAmp + DATA.value.edgeEffAAmp = defaultDATA.edgeEffAAmp; return; - case 37: //data DATA ,, Struct - DATA.Unload(); + case 37: //edgeEffAFreq + DATA.value.edgeEffAFreq = defaultDATA.edgeEffAFreq; return; - case 38: //data DATA ,, Struct - DATA.Unload(); + case 38: //fillAFRatio + DATA.value.fillAFRatio = defaultDATA.fillAFRatio; return; - case 39: //data DATA ,, Struct - DATA.Unload(); + case 39: //edgeEffAFRatio + DATA.value.edgeEffAFRatio = defaultDATA.edgeEffAFRatio; return; - case 40: //data DATA ,, Struct - DATA.Unload(); + case 40: //memDBlend + DATA.value.memDBlend = defaultDATA.memDBlend; return; - case 41: //data DATA ,, Struct - DATA.Unload(); + case 41: //partSBlend + DATA.value.partSBlend = defaultDATA.partSBlend; return; - case 42: //data DATA ,, Struct - DATA.Unload(); + case 42: //partBlendOp + DATA.value.partBlendOp = defaultDATA.partBlendOp; return; - case 43: //data DATA ,, Struct - DATA.Unload(); + case 43: //partZFunc + DATA.value.partZFunc = defaultDATA.partZFunc; return; - case 44: //data DATA ,, Struct - DATA.Unload(); + case 44: //partDBlend + DATA.value.partDBlend = defaultDATA.partDBlend; return; - case 45: //data DATA ,, Struct - DATA.Unload(); + case 45: //partBUp + DATA.value.partBUp = defaultDATA.partBUp; return; - case 46: //data DATA ,, Struct - DATA.Unload(); + case 46: //partBFull + DATA.value.partBFull = defaultDATA.partBFull; return; - case 47: //data DATA ,, Struct - DATA.Unload(); + case 47: //partBDown + DATA.value.partBDown = defaultDATA.partBDown; return; - case 48: //data DATA ,, Struct - DATA.Unload(); + case 48: //partBFRatio + DATA.value.partBFRatio = defaultDATA.partBFRatio; return; - case 49: //data DATA ,, Struct - DATA.Unload(); + case 49: //partBPRatio + DATA.value.partBPRatio = defaultDATA.partBPRatio; return; - case 50: //data DATA ,, Struct - DATA.Unload(); + case 50: //partLTime + DATA.value.partLTime = defaultDATA.partLTime; return; - case 51: //data DATA ,, Struct - DATA.Unload(); + case 51: //partLDelta + DATA.value.partLDelta = defaultDATA.partLDelta; return; - case 52: //data DATA ,, Struct - DATA.Unload(); + case 52: //partNSpd + DATA.value.partNSpd = defaultDATA.partNSpd; return; - case 53: //data DATA ,, Struct - DATA.Unload(); + case 53: //partNAcc + DATA.value.partNAcc = defaultDATA.partNAcc; return; - case 54: //data DATA ,, Struct - DATA.Unload(); + case 54: //partVel1 + DATA.value.partVel1 = defaultDATA.partVel1; return; - case 55: //data DATA ,, Struct - DATA.Unload(); + case 55: //partVel2 + DATA.value.partVel2 = defaultDATA.partVel2; return; - case 56: //data DATA ,, Struct - DATA.Unload(); + case 56: //partVel3 + DATA.value.partVel3 = defaultDATA.partVel3; return; - case 57: //data DATA ,, Struct - DATA.Unload(); + case 57: //partAcc1 + DATA.value.partAcc1 = defaultDATA.partAcc1; return; - case 58: //data DATA ,, Struct - DATA.Unload(); + case 58: //partAcc2 + DATA.value.partAcc2 = defaultDATA.partAcc2; return; - case 59: //data DATA ,, Struct - DATA.Unload(); + case 59: //partAcc3 + DATA.value.partAcc3 = defaultDATA.partAcc3; return; - case 60: //data DATA ,, Struct - DATA.Unload(); + case 60: //partKey1 + DATA.value.partKey1 = defaultDATA.partKey1; return; - case 61: //data DATA ,, Struct - DATA.Unload(); + case 61: //partKey2 + DATA.value.partKey2 = defaultDATA.partKey2; return; - case 62: //data DATA ,, Struct - DATA.Unload(); + case 62: //partKey1Time + DATA.value.partKey1Time = defaultDATA.partKey1Time; return; - case 63: //data DATA ,, Struct - DATA.Unload(); + case 63: //partKey2Time + DATA.value.partKey2Time = defaultDATA.partKey2Time; return; - case 64: //data DATA ,, Struct - DATA.Unload(); + case 64: //key1.red + DATA.value.key1.red = defaultDATA.key1.red; return; - case 65: //data DATA ,, Struct - DATA.Unload(); + case 65: //key1.green + DATA.value.key1.green = defaultDATA.key1.green; return; - case 66: //data DATA ,, Struct - DATA.Unload(); + case 66: //key1.blue + DATA.value.key1.blue = defaultDATA.key1.blue; return; - case 67: //data_p DATA ,, Struct - DATA.Unload(); + case 67: //unused4 + DATA.value.key1.unused1 = defaultDATA.key1.unused1; return; - case 68: //data DATA ,, Struct - DATA.Unload(); + case 68: //key2.red + DATA.value.key2.red = defaultDATA.key2.red; return; - case 69: //data DATA ,, Struct - DATA.Unload(); + case 69: //key2.green + DATA.value.key2.green = defaultDATA.key2.green; return; - case 70: //data DATA ,, Struct - DATA.Unload(); + case 70: //key2.blue + DATA.value.key2.blue = defaultDATA.key2.blue; return; - case 71: //data_p DATA ,, Struct - DATA.Unload(); + case 71: //unused5 + DATA.value.key2.unused1 = defaultDATA.key2.unused1; return; - case 72: //data DATA ,, Struct - DATA.Unload(); + case 72: //key3.red + DATA.value.key3.red = defaultDATA.key3.red; return; - case 73: //data DATA ,, Struct - DATA.Unload(); + case 73: //key3.green + DATA.value.key3.green = defaultDATA.key3.green; return; - case 74: //data DATA ,, Struct - DATA.Unload(); + case 74: //key3.blue + DATA.value.key3.blue = defaultDATA.key3.blue; return; - case 75: //data_p DATA ,, Struct - DATA.Unload(); + case 75: //unused6 + DATA.value.key3.unused1 = defaultDATA.key3.unused1; return; - case 76: //data DATA ,, Struct - DATA.Unload(); + case 76: //key1A + DATA.value.key1A = defaultDATA.key1A; return; - case 77: //data DATA ,, Struct - DATA.Unload(); + case 77: //key2A + DATA.value.key2A = defaultDATA.key2A; return; - case 78: //data DATA ,, Struct - DATA.Unload(); + case 78: //key3A + DATA.value.key3A = defaultDATA.key3A; return; - case 79: //data DATA ,, Struct - DATA.Unload(); + case 79: //key1Time + DATA.value.key1Time = defaultDATA.key1Time; return; - case 80: //data DATA ,, Struct - DATA.Unload(); + case 80: //key2Time + DATA.value.key2Time = defaultDATA.key2Time; return; - case 81: //data DATA ,, Struct - DATA.Unload(); + case 81: //key3Time + DATA.value.key3Time = defaultDATA.key3Time; return; - case 82: //data DATA ,, Struct - DATA.Unload(); + case 82: //partInitSpd + DATA.value.partInitSpd = defaultDATA.partInitSpd; return; - case 83: //data DATA ,, Struct - DATA.Unload(); + case 83: //partInitRot + DATA.value.partInitRot = defaultDATA.partInitRot; return; - case 84: //data DATA ,, Struct - DATA.Unload(); + case 84: //partInitRotDelta + DATA.value.partInitRotDelta = defaultDATA.partInitRotDelta; return; - case 85: //data DATA ,, Struct - DATA.Unload(); + case 85: //partRotSpd + DATA.value.partRotSpd = defaultDATA.partRotSpd; return; - case 86: //data DATA ,, Struct - DATA.Unload(); + case 86: //partRotDelta + DATA.value.partRotDelta = defaultDATA.partRotDelta; return; - case 87: //data DATA ,, Struct - DATA.Unload(); + case 87: //addon + DATA.value.addon = defaultDATA.addon; return; - case 88: //data DATA ,, Struct - DATA.Unload(); + case 88: //holesSTime + DATA.value.holesSTime = defaultDATA.holesSTime; return; - case 89: //data DATA ,, Struct - DATA.Unload(); + case 89: //holesETime + DATA.value.holesETime = defaultDATA.holesETime; return; - case 90: //data DATA ,, Struct - DATA.Unload(); + case 90: //holesSValue + DATA.value.holesSValue = defaultDATA.holesSValue; return; - case 91: //data DATA ,, Struct - DATA.Unload(); + case 91: //holesEValue + DATA.value.holesEValue = defaultDATA.holesEValue; return; - case 92: //data DATA ,, Struct - DATA.Unload(); + case 92: //edgeWidth + DATA.value.edgeWidth = defaultDATA.edgeWidth; return; - case 93: //data DATA ,, Struct - DATA.Unload(); + case 93: //edge.red + DATA.value.edge.red = defaultDATA.edge.red; return; - case 94: //data DATA ,, Struct - DATA.Unload(); + case 94: //edge.green + DATA.value.edge.green = defaultDATA.edge.green; return; - case 95: //data DATA ,, Struct - DATA.Unload(); + case 95: //edge.blue + DATA.value.edge.blue = defaultDATA.edge.blue; return; - case 96: //data_p DATA ,, Struct - DATA.Unload(); + case 96: //unused7 + DATA.value.edge.unused1 = defaultDATA.edge.unused1; return; - case 97: //data DATA ,, Struct - DATA.Unload(); + case 97: //explWindSpd + DATA.value.explWindSpd = defaultDATA.explWindSpd; return; - case 98: //data DATA ,, Struct - DATA.Unload(); + case 98: //textCountU + DATA.value.textCountU = defaultDATA.textCountU; return; - case 99: //data DATA ,, Struct - DATA.Unload(); + case 99: //textCountV + DATA.value.textCountV = defaultDATA.textCountV; return; - case 100: //data DATA ,, Struct - DATA.Unload(); + case 100: //addonFITime + DATA.value.addonFITime = defaultDATA.addonFITime; return; - case 101: //data DATA ,, Struct - DATA.Unload(); + case 101: //addonFOTime + DATA.value.addonFOTime = defaultDATA.addonFOTime; return; - case 102: //data DATA ,, Struct - DATA.Unload(); + case 102: //addonScaleStart + DATA.value.addonScaleStart = defaultDATA.addonScaleStart; return; - case 103: //data DATA ,, Struct - DATA.Unload(); + case 103: //addonScaleEnd + DATA.value.addonScaleEnd = defaultDATA.addonScaleEnd; return; - case 104: //data DATA ,, Struct - DATA.Unload(); + case 104: //addonScaleInTime + DATA.value.addonScaleInTime = defaultDATA.addonScaleInTime; return; - case 105: //data DATA ,, Struct - DATA.Unload(); + case 105: //addonScaleOutTime + DATA.value.addonScaleOutTime = defaultDATA.addonScaleOutTime; return; default: return; diff --git a/CBash/FalloutNewVegas/Records/API/EXPLRecordAPI.cpp b/CBash/FalloutNewVegas/Records/API/EXPLRecordAPI.cpp index 7a9a2af..25598a7 100644 --- a/CBash/FalloutNewVegas/Records/API/EXPLRecordAPI.cpp +++ b/CBash/FalloutNewVegas/Records/API/EXPLRecordAPI.cpp @@ -60,19 +60,25 @@ UINT32 EXPLRecord::GetFieldAttribute(FIELD_IDENTIFIERS, UINT32 WhichAttribute) return UNKNOWN_FIELD; } return UNKNOWN_FIELD; - case 7: //boundX + case 7: //boundX1 return SINT16_FIELD; - case 8: //boundY + case 8: //boundY1 return SINT16_FIELD; - case 9: //boundZ + case 9: //boundZ1 return SINT16_FIELD; - case 10: //full + case 10: //boundX2 + return SINT16_FIELD; + case 11: //boundY2 + return SINT16_FIELD; + case 12: //boundZ2 + return SINT16_FIELD; + case 13: //full return STRING_FIELD; - case 11: //modPath + case 14: //modPath return ISTRING_FIELD; - case 12: //modb + case 15: //modb return FLOAT32_FIELD; - case 13: //modt_p + case 16: //modt_p switch(WhichAttribute) { case 0: //fieldType @@ -83,7 +89,7 @@ UINT32 EXPLRecord::GetFieldAttribute(FIELD_IDENTIFIERS, UINT32 WhichAttribute) return UNKNOWN_FIELD; } return UNKNOWN_FIELD; - case 14: //altTextures + case 17: //altTextures if(!MODL.IsLoaded()) return UNKNOWN_FIELD; @@ -94,13 +100,13 @@ UINT32 EXPLRecord::GetFieldAttribute(FIELD_IDENTIFIERS, UINT32 WhichAttribute) case 0: //fieldType return LIST_FIELD; case 1: //fieldSize - return MODL->Textures.size(); + return MODL->Textures.MODS.size(); default: return UNKNOWN_FIELD; } } - if(ListIndex >= MODL->Textures.size()) + if(ListIndex >= MODL->Textures.MODS.size()) return UNKNOWN_FIELD; switch(ListFieldID) @@ -114,40 +120,40 @@ UINT32 EXPLRecord::GetFieldAttribute(FIELD_IDENTIFIERS, UINT32 WhichAttribute) default: return UNKNOWN_FIELD; } - - case 17: //modelFlags - return UINT8_FIELD; - case 18: //effect + return UNKNOWN_FIELD; + case 18: //modelFlags + return UINT8_FLAG_FIELD; + case 19: //effect return FORMID_FIELD; - case 19: //mnam Image Space Modifier + case 20: //imageSpace return FORMID_FIELD; - case 20: //data DATA ,, Struct + case 21: //force return FLOAT32_FIELD; - case 21: //data DATA ,, Struct + case 22: //damage return FLOAT32_FIELD; - case 22: //data DATA ,, Struct + case 23: //radius return FLOAT32_FIELD; - case 23: //data DATA ,, Struct + case 24: //light return FORMID_FIELD; - case 24: //data DATA ,, Struct + case 25: //sound1 return FORMID_FIELD; - case 25: //data DATA ,, Struct - return UINT32_FIELD; - case 26: //data DATA ,, Struct + case 26: //flags + return UINT32_FLAG_FIELD; + case 27: //ISRadius return FLOAT32_FIELD; - case 27: //data DATA ,, Struct + case 28: //impactDataSet return FORMID_FIELD; - case 28: //data DATA ,, Struct + case 29: //sound2 return FORMID_FIELD; - case 29: //data DATA ,, Struct + case 30: //radLevel return FLOAT32_FIELD; - case 30: //data DATA ,, Struct + case 31: //radTime return FLOAT32_FIELD; - case 31: //data DATA ,, Struct + case 32: //radRadius return FLOAT32_FIELD; - case 32: //data DATA ,, Struct + case 33: //soundLevel return UINT32_FIELD; - case 33: //inam Placed Impact Object + case 34: //impact return FORMID_FIELD; default: return UNKNOWN_FIELD; @@ -173,61 +179,80 @@ void * EXPLRecord::GetField(FIELD_IDENTIFIERS, void **FieldValues) case 6: //versionControl2 *FieldValues = &versionControl2[0]; return NULL; - case 7: //boundX - return OBND.IsLoaded() ? &OBND->x : NULL; - case 8: //boundY - return OBND.IsLoaded() ? &OBND->y : NULL; - case 9: //boundZ - return OBND.IsLoaded() ? &OBND->z : NULL; - case 10: //full + case 7: //boundX1 + return &OBND.value.x1; + case 8: //boundY1 + return &OBND.value.y1; + case 9: //boundZ1 + return &OBND.value.z1; + case 10: //boundX2 + return &OBND.value.x2; + case 11: //boundY2 + return &OBND.value.y2; + case 12: //boundZ2 + return &OBND.value.z2; + case 13: //full return FULL.value; - case 11: //modPath + case 14: //modPath return MODL.IsLoaded() ? MODL->MODL.value : NULL; - case 12: //modb + case 15: //modb return MODL.IsLoaded() ? &MODL->MODB.value : NULL; - case 13: //modt_p + case 16: //modt_p *FieldValues = MODL.IsLoaded() ? MODL->MODT.value : NULL; return NULL; - case 14: //mods Alternate Textures - return MODL.IsLoaded() ? MODL->MODS.value : NULL; - case 15: //mods Alternate Textures - return MODL.IsLoaded() ? &MODL->MODS->value15 : NULL; - case 16: //mods Alternate Textures - return MODL.IsLoaded() ? &MODL->MODS->value16 : NULL; - case 17: //modelFlags - return MODL.IsLoaded() ? &MODL->MODD->value17 : NULL; - case 18: //effect - return EITM.IsLoaded() ? &EITM->value18 : NULL; - case 19: //mnam Image Space Modifier - return MNAM.IsLoaded() ? &MNAM->value19 : NULL; - case 20: //data DATA ,, Struct - return DATA.IsLoaded() ? &DATA->value20 : NULL; - case 21: //data DATA ,, Struct - return DATA.IsLoaded() ? &DATA->value21 : NULL; - case 22: //data DATA ,, Struct - return DATA.IsLoaded() ? &DATA->value22 : NULL; - case 23: //data DATA ,, Struct - return DATA.IsLoaded() ? &DATA->value23 : NULL; - case 24: //data DATA ,, Struct - return DATA.IsLoaded() ? &DATA->value24 : NULL; - case 25: //data DATA ,, Struct - return DATA.IsLoaded() ? &DATA->value25 : NULL; - case 26: //data DATA ,, Struct - return DATA.IsLoaded() ? &DATA->value26 : NULL; - case 27: //data DATA ,, Struct - return DATA.IsLoaded() ? &DATA->value27 : NULL; - case 28: //data DATA ,, Struct - return DATA.IsLoaded() ? &DATA->value28 : NULL; - case 29: //data DATA ,, Struct - return DATA.IsLoaded() ? &DATA->value29 : NULL; - case 30: //data DATA ,, Struct - return DATA.IsLoaded() ? &DATA->value30 : NULL; - case 31: //data DATA ,, Struct - return DATA.IsLoaded() ? &DATA->value31 : NULL; - case 32: //data DATA ,, Struct - return DATA.IsLoaded() ? &DATA->value32 : NULL; - case 33: //inam Placed Impact Object - return INAM.IsLoaded() ? &INAM->value33 : NULL; + case 17: //altTextures + if(!MODL.IsLoaded()) + return NULL; + + if(ListIndex >= MODL->Textures.MODS.size()) + return NULL; + + switch(ListFieldID) + { + case 1: //name + return MODL->Textures.MODS[ListIndex]->name; + case 2: //texture + return &MODL->Textures.MODS[ListIndex]->texture; + case 3: //index + return &MODL->Textures.MODS[ListIndex]->index; + default: + return NULL; + } + return NULL; + case 18: //modelFlags + return MODL.IsLoaded() ? &MODL->MODD.value : NULL; + case 19: //effect + return &EITM.value; + case 20: //imageSpace + return &MNAM.value; + case 21: //force + return &DATA.value.force; + case 22: //damage + return &DATA.value.damage; + case 23: //radius + return &DATA.value.radius; + case 24: //light + return &DATA.value.light; + case 25: //sound1 + return &DATA.value.sound1; + case 26: //flags + return &DATA.value.flags; + case 27: //ISRadius + return &DATA.value.ISRadius; + case 28: //impactDataSet + return &DATA.value.impactDataSet; + case 29: //sound2 + return &DATA.value.sound2; + case 30: //radLevel + return &DATA.value.radLevel; + case 31: //radTime + return &DATA.value.radTime; + case 32: //radRadius + return &DATA.value.radRadius; + case 33: //soundLevel + return &DATA.value.soundLevel; + case 34: //impact + return &INAM.value; default: return NULL; } @@ -261,115 +286,123 @@ bool EXPLRecord::SetField(FIELD_IDENTIFIERS, void *FieldValue, UINT32 ArraySize) versionControl2[0] = ((UINT8ARRAY)FieldValue)[0]; versionControl2[1] = ((UINT8ARRAY)FieldValue)[1]; break; - case 7: //boundX - OBND.Load(); - OBND->x = *(SINT16 *)FieldValue; + case 7: //boundX1 + OBND.value.x1 = *(SINT16 *)FieldValue; + break; + case 8: //boundY1 + OBND.value.y1 = *(SINT16 *)FieldValue; + break; + case 9: //boundZ1 + OBND.value.z1 = *(SINT16 *)FieldValue; + break; + case 10: //boundX2 + OBND.value.x2 = *(SINT16 *)FieldValue; break; - case 8: //boundY - OBND.Load(); - OBND->y = *(SINT16 *)FieldValue; + case 11: //boundY2 + OBND.value.y2 = *(SINT16 *)FieldValue; break; - case 9: //boundZ - OBND.Load(); - OBND->z = *(SINT16 *)FieldValue; + case 12: //boundZ2 + OBND.value.z2 = *(SINT16 *)FieldValue; break; - case 10: //full + case 13: //full FULL.Copy((STRING)FieldValue); break; - case 11: //modPath + case 14: //modPath MODL.Load(); MODL->MODL.Copy((STRING)FieldValue); break; - case 12: //modb + case 15: //modb MODL.Load(); MODL->MODB.value = *(FLOAT32 *)FieldValue; break; - case 13: //modt_p + case 16: //modt_p MODL.Load(); MODL->MODT.Copy((UINT8ARRAY)FieldValue, ArraySize); break; - case 14: //mods Alternate Textures + case 17: //altTextures MODL.Load(); - MODL->MODS.Copy((STRING)FieldValue); - break; - case 15: //mods Alternate Textures - MODL.Load(); - MODL->MODS.Load(); - MODL->MODS->value15 = *(FORMID *)FieldValue; - return true; - case 16: //mods Alternate Textures - MODL.Load(); - MODL->MODS.Load(); - MODL->MODS->value16 = *(SINT32 *)FieldValue; + if(ListFieldID == 0) //altTexturesSize + { + MODL->Textures.resize(ArraySize); + return false; + } + + if(ListIndex >= MODL->Textures.MODS.size()) + break; + + switch(ListFieldID) + { + case 1: //name + delete []MODL->Textures.MODS[ListIndex]->name; + MODL->Textures.MODS[ListIndex]->name = NULL; + if(FieldValue != NULL) + { + ArraySize = (UINT32)strlen((STRING)FieldValue) + 1; + MODL->Textures.MODS[ListIndex]->name = new char[ArraySize]; + strcpy_s(MODL->Textures.MODS[ListIndex]->name, ArraySize, (STRING)FieldValue); + } + break; + case 2: //texture + MODL->Textures.MODS[ListIndex]->texture = *(FORMID *)FieldValue; + return true; + case 3: //index + MODL->Textures.MODS[ListIndex]->index = *(SINT32 *)FieldValue; + break; + default: + break; + } break; - case 17: //modelFlags + case 18: //modelFlags MODL.Load(); - MODL->MODD.Load(); - MODL->MODD->value17 = *(UINT8 *)FieldValue; + MODL->SetFlagMask(*(UINT8 *)FieldValue); break; - case 18: //effect - EITM.Load(); - EITM->value18 = *(FORMID *)FieldValue; + case 19: //effect + EITM.value = *(FORMID *)FieldValue; return true; - case 19: //mnam Image Space Modifier - MNAM.Load(); - MNAM->value19 = *(FORMID *)FieldValue; + case 20: //imageSpace + MNAM.value = *(FORMID *)FieldValue; return true; - case 20: //data DATA ,, Struct - DATA.Load(); - DATA->value20 = *(FLOAT32 *)FieldValue; + case 21: //force + DATA.value.force = *(FLOAT32 *)FieldValue; break; - case 21: //data DATA ,, Struct - DATA.Load(); - DATA->value21 = *(FLOAT32 *)FieldValue; + case 22: //damage + DATA.value.damage = *(FLOAT32 *)FieldValue; break; - case 22: //data DATA ,, Struct - DATA.Load(); - DATA->value22 = *(FLOAT32 *)FieldValue; + case 23: //radius + DATA.value.radius = *(FLOAT32 *)FieldValue; break; - case 23: //data DATA ,, Struct - DATA.Load(); - DATA->value23 = *(FORMID *)FieldValue; + case 24: //light + DATA.value.light = *(FORMID *)FieldValue; return true; - case 24: //data DATA ,, Struct - DATA.Load(); - DATA->value24 = *(FORMID *)FieldValue; + case 25: //sound1 + DATA.value.sound1 = *(FORMID *)FieldValue; return true; - case 25: //data DATA ,, Struct - DATA.Load(); - DATA->value25 = *(UINT32 *)FieldValue; + case 26: //flags + SetFlagMask(*(UINT32 *)FieldValue); break; - case 26: //data DATA ,, Struct - DATA.Load(); - DATA->value26 = *(FLOAT32 *)FieldValue; + case 27: //ISRadius + DATA.value.ISRadius = *(FLOAT32 *)FieldValue; break; - case 27: //data DATA ,, Struct - DATA.Load(); - DATA->value27 = *(FORMID *)FieldValue; + case 28: //impactDataSet + DATA.value.impactDataSet = *(FORMID *)FieldValue; return true; - case 28: //data DATA ,, Struct - DATA.Load(); - DATA->value28 = *(FORMID *)FieldValue; + case 29: //sound2 + DATA.value.sound2 = *(FORMID *)FieldValue; return true; - case 29: //data DATA ,, Struct - DATA.Load(); - DATA->value29 = *(FLOAT32 *)FieldValue; + case 30: //radLevel + DATA.value.radLevel = *(FLOAT32 *)FieldValue; break; - case 30: //data DATA ,, Struct - DATA.Load(); - DATA->value30 = *(FLOAT32 *)FieldValue; + case 31: //radTime + DATA.value.radTime = *(FLOAT32 *)FieldValue; break; - case 31: //data DATA ,, Struct - DATA.Load(); - DATA->value31 = *(FLOAT32 *)FieldValue; + case 32: //radRadius + DATA.value.radRadius = *(FLOAT32 *)FieldValue; break; - case 32: //data DATA ,, Struct - DATA.Load(); - DATA->value32 = *(UINT32 *)FieldValue; + case 33: //soundLevel + DATA.value.soundLevel = *(UINT32 *)FieldValue; break; - case 33: //inam Placed Impact Object - INAM.Load(); - INAM->value33 = *(FORMID *)FieldValue; + case 34: //impact + INAM.value = *(FORMID *)FieldValue; return true; default: break; @@ -379,6 +412,9 @@ bool EXPLRecord::SetField(FIELD_IDENTIFIERS, void *FieldValue, UINT32 ArraySize) void EXPLRecord::DeleteField(FIELD_IDENTIFIERS) { + GENOBND defaultOBND; + FNVMODS defaultMODS; + EXPLDATA defaultDATA; switch(FieldID) { case 1: //flags1 @@ -397,95 +433,118 @@ void EXPLRecord::DeleteField(FIELD_IDENTIFIERS) versionControl2[0] = 0; versionControl2[1] = 0; return; - case 7: //boundX - if(OBND.IsLoaded()) - OBND->x = defaultOBND.x; + case 7: //boundX1 + OBND.value.x1 = defaultOBND.x1; + return; + case 8: //boundY1 + OBND.value.y1 = defaultOBND.y1; + return; + case 9: //boundZ1 + OBND.value.z1 = defaultOBND.z1; + return; + case 10: //boundX2 + OBND.value.x2 = defaultOBND.x2; return; - case 8: //boundY - if(OBND.IsLoaded()) - OBND->y = defaultOBND.y; + case 11: //boundY2 + OBND.value.y2 = defaultOBND.y2; return; - case 9: //boundZ - if(OBND.IsLoaded()) - OBND->z = defaultOBND.z; + case 12: //boundZ2 + OBND.value.z2 = defaultOBND.z2; return; - case 10: //full + case 13: //full FULL.Unload(); return; - case 11: //modPath + case 14: //modPath if(MODL.IsLoaded()) MODL->MODL.Unload(); return; - case 12: //modb + case 15: //modb if(MODL.IsLoaded()) MODL->MODB.Unload(); return; - case 13: //modt_p + case 16: //modt_p if(MODL.IsLoaded()) MODL->MODT.Unload(); return; - case 14: //mods Alternate Textures + case 17: //altTextures if(MODL.IsLoaded()) - MODL->MODS.Unload(); - return; - case 15: //mods Alternate Textures - if(MODL.IsLoaded()) - MODL->MODS.Unload(); - return; - case 16: //mods Alternate Textures - if(MODL.IsLoaded()) - MODL->MODS.Unload(); + { + if(ListFieldID == 0) //altTextures + { + MODL->Textures.Unload(); + return; + } + + if(ListIndex >= MODL->Textures.MODS.size()) + return; + + switch(ListFieldID) + { + case 1: //name + delete []MODL->Textures.MODS[ListIndex]->name; + MODL->Textures.MODS[ListIndex]->name = NULL; + return; + case 2: //texture + MODL->Textures.MODS[ListIndex]->texture = defaultMODS.texture; + return; + case 3: //index + MODL->Textures.MODS[ListIndex]->index = defaultMODS.index; + return; + default: + return; + } + } return; - case 17: //modelFlags + case 18: //modelFlags if(MODL.IsLoaded()) MODL->MODD.Unload(); return; - case 18: //effect + case 19: //effect EITM.Unload(); return; - case 19: //mnam Image Space Modifier + case 20: //imageSpace MNAM.Unload(); return; - case 20: //data DATA ,, Struct - DATA.Unload(); + case 21: //force + DATA.value.force = defaultDATA.force; return; - case 21: //data DATA ,, Struct - DATA.Unload(); + case 22: //damage + DATA.value.damage = defaultDATA.damage; return; - case 22: //data DATA ,, Struct - DATA.Unload(); + case 23: //radius + DATA.value.radius = defaultDATA.radius; return; - case 23: //data DATA ,, Struct - DATA.Unload(); + case 24: //light + DATA.value.light = defaultDATA.light; return; - case 24: //data DATA ,, Struct - DATA.Unload(); + case 25: //sound1 + DATA.value.sound1 = defaultDATA.sound1; return; - case 25: //data DATA ,, Struct - DATA.Unload(); + case 26: //flags + SetFlagMask(defaultDATA.flags); return; - case 26: //data DATA ,, Struct - DATA.Unload(); + case 27: //ISRadius + DATA.value.ISRadius = defaultDATA.ISRadius; return; - case 27: //data DATA ,, Struct - DATA.Unload(); + case 28: //impactDataSet + DATA.value.impactDataSet = defaultDATA.impactDataSet; return; - case 28: //data DATA ,, Struct - DATA.Unload(); + case 29: //sound2 + DATA.value.sound2 = defaultDATA.sound2; return; - case 29: //data DATA ,, Struct - DATA.Unload(); + case 30: //radLevel + DATA.value.radLevel = defaultDATA.radLevel; return; - case 30: //data DATA ,, Struct - DATA.Unload(); + case 31: //radTime + DATA.value.radTime = defaultDATA.radTime; return; - case 31: //data DATA ,, Struct - DATA.Unload(); + case 32: //radRadius + DATA.value.radRadius = defaultDATA.radRadius; return; - case 32: //data DATA ,, Struct - DATA.Unload(); + case 33: //soundLevel + DATA.value.soundLevel = defaultDATA.soundLevel; return; - case 33: //inam Placed Impact Object + case 34: //impact INAM.Unload(); return; default: diff --git a/CBash/FalloutNewVegas/Records/API/GMSTRecordAPI.cpp b/CBash/FalloutNewVegas/Records/API/GMSTRecordAPI.cpp index aaf72b7..4f72629 100644 --- a/CBash/FalloutNewVegas/Records/API/GMSTRecordAPI.cpp +++ b/CBash/FalloutNewVegas/Records/API/GMSTRecordAPI.cpp @@ -154,10 +154,13 @@ bool GMSTRecord::SetField(FIELD_IDENTIFIERS, void *FieldValue, UINT32 ArraySize) switch(DATA.format) { case 's': - delete []DATA.s; - ArraySize = (UINT32)strlen((STRING)FieldValue) + 1; - DATA.s = new char[ArraySize]; - strcpy_s(DATA.s, ArraySize, (STRING)FieldValue); + if(FieldValue != NULL) + { + delete []DATA.s; + ArraySize = (UINT32)strlen((STRING)FieldValue) + 1; + DATA.s = new char[ArraySize]; + strcpy_s(DATA.s, ArraySize, (STRING)FieldValue); + } break; case 'i': DATA.i = *(SINT32 *)FieldValue; @@ -203,14 +206,13 @@ void GMSTRecord::DeleteField(FIELD_IDENTIFIERS) { case 's': delete []DATA.s; + DATA.s = defaultDATA.s; if(defaultDATA.s != NULL) { ArraySize = (UINT32)strlen(defaultDATA.s) + 1; DATA.s = new char[ArraySize]; strcpy_s(DATA.s, ArraySize, defaultDATA.s); } - else - DATA.s = defaultDATA.s; return; case 'i': DATA.i = defaultDATA.i; diff --git a/CBash/FalloutNewVegas/Records/API/QUSTRecordAPI.cpp b/CBash/FalloutNewVegas/Records/API/QUSTRecordAPI.cpp index f50546b..f8c687c 100644 --- a/CBash/FalloutNewVegas/Records/API/QUSTRecordAPI.cpp +++ b/CBash/FalloutNewVegas/Records/API/QUSTRecordAPI.cpp @@ -275,10 +275,10 @@ UINT32 QUSTRecord::GetFieldAttribute(FIELD_IDENTIFIERS, UINT32 WhichAttribute) } return UNKNOWN_FIELD; } - + if(ListX3Index >= Stages.value[ListIndex]->Entries.value[ListX2Index]->CTDA.value.size()) return UNKNOWN_FIELD; - + switch(ListX3FieldID) { case 1: //operType @@ -363,7 +363,7 @@ UINT32 QUSTRecord::GetFieldAttribute(FIELD_IDENTIFIERS, UINT32 WhichAttribute) default: return UNKNOWN_FIELD; } - + } return UNKNOWN_FIELD; default: @@ -442,10 +442,10 @@ UINT32 QUSTRecord::GetFieldAttribute(FIELD_IDENTIFIERS, UINT32 WhichAttribute) return UNKNOWN_FIELD; } } - + if(ListX3Index >= Stages.value[ListIndex]->Entries.value[ListX2Index]->VARS.value.size()) return UNKNOWN_FIELD; - + switch(ListX3FieldID) { case 1: //index @@ -492,10 +492,10 @@ UINT32 QUSTRecord::GetFieldAttribute(FIELD_IDENTIFIERS, UINT32 WhichAttribute) } return UNKNOWN_FIELD; } - + if(ListX3Index >= Stages.value[ListIndex]->Entries.value[ListX2Index]->SCR_.value.size()) return UNKNOWN_FIELD; - + switch(ListX3FieldID) { case 1: //reference @@ -596,10 +596,10 @@ UINT32 QUSTRecord::GetFieldAttribute(FIELD_IDENTIFIERS, UINT32 WhichAttribute) } return UNKNOWN_FIELD; } - + if(ListX3Index >= Objectives.value[ListIndex]->Targets.value[ListX2Index]->CTDA.value.size()) return UNKNOWN_FIELD; - + switch(ListX3FieldID) { case 1: //operType @@ -684,7 +684,7 @@ UINT32 QUSTRecord::GetFieldAttribute(FIELD_IDENTIFIERS, UINT32 WhichAttribute) default: return UNKNOWN_FIELD; } - + } return UNKNOWN_FIELD; default: @@ -809,7 +809,7 @@ void * QUSTRecord::GetField(FIELD_IDENTIFIERS, void **FieldValues) case 2: //conditions if(ListX2Index >= Stages.value[ListIndex]->Entries.value[ListX2Index]->CTDA.value.size()) return NULL; - + switch(ListFieldID) { case 1: //operType @@ -856,7 +856,7 @@ void * QUSTRecord::GetField(FIELD_IDENTIFIERS, void **FieldValues) case 12: //vars if(ListX3Index >= Stages.value[ListIndex]->Entries.value[ListX2Index]->VARS.value.size()) return NULL; - + switch(ListX3FieldID) { case 1: //index @@ -915,7 +915,7 @@ void * QUSTRecord::GetField(FIELD_IDENTIFIERS, void **FieldValues) case 4: //conditions if(ListX3Index >= Objectives.value[ListIndex]->Targets.value[ListX2Index]->CTDA.value.size()) return NULL; - + switch(ListX3FieldID) { case 1: //operType @@ -1087,10 +1087,10 @@ bool QUSTRecord::SetField(FIELD_IDENTIFIERS, void *FieldValue, UINT32 ArraySize) Stages.value[ListIndex]->Entries.value[ListX2Index]->CTDA.resize(ArraySize); return false; } - + if(ListX3Index >= Stages.value[ListIndex]->Entries.value[ListX2Index]->CTDA.value.size()) break; - + switch(ListX3FieldID) { case 1: //operType @@ -1163,10 +1163,10 @@ bool QUSTRecord::SetField(FIELD_IDENTIFIERS, void *FieldValue, UINT32 ArraySize) Stages.value[ListIndex]->Entries.value[ListX2Index]->VARS.resize(ArraySize); return false; } - + if(ListX3Index >= Stages.value[ListIndex]->Entries.value[ListX2Index]->VARS.value.size()) break; - + switch(ListX3FieldID) { case 1: //index @@ -1215,10 +1215,10 @@ bool QUSTRecord::SetField(FIELD_IDENTIFIERS, void *FieldValue, UINT32 ArraySize) Stages.value[ListIndex]->Entries.value[ListX2Index]->SCR_.resize(ArraySize); return false; } - + if(ListX3Index >= Stages.value[ListIndex]->Entries.value[ListX2Index]->SCR_.value.size()) break; - + switch(ListX3FieldID) { case 1: //reference @@ -1287,10 +1287,10 @@ bool QUSTRecord::SetField(FIELD_IDENTIFIERS, void *FieldValue, UINT32 ArraySize) Objectives.value[ListIndex]->Targets.value[ListX2Index]->CTDA.resize(ArraySize); return false; } - + if(ListX3Index >= Objectives.value[ListIndex]->Targets.value[ListX2Index]->CTDA.value.size()) break; - + switch(ListX3FieldID) { case 1: //operType @@ -1468,10 +1468,10 @@ void QUSTRecord::DeleteField(FIELD_IDENTIFIERS) Stages.value[ListIndex]->Entries.value[ListX2Index]->CTDA.Unload(); return; } - + if(ListX3Index >= Stages.value[ListIndex]->Entries.value[ListX2Index]->CTDA.value.size()) return; - + switch(ListX3FieldID) { case 1: //operType @@ -1540,10 +1540,10 @@ void QUSTRecord::DeleteField(FIELD_IDENTIFIERS) Stages.value[ListIndex]->Entries.value[ListX2Index]->VARS.Unload(); return; } - + if(ListX3Index >= Stages.value[ListIndex]->Entries.value[ListX2Index]->VARS.value.size()) return; - + switch(ListX3FieldID) { case 1: //index @@ -1588,10 +1588,10 @@ void QUSTRecord::DeleteField(FIELD_IDENTIFIERS) Stages.value[ListIndex]->Entries.value[ListX2Index]->SCR_.Unload(); return; } - + if(ListX3Index >= Stages.value[ListIndex]->Entries.value[ListX2Index]->SCR_.value.size()) return; - + switch(ListX3FieldID) { case 1: //reference @@ -1660,10 +1660,10 @@ void QUSTRecord::DeleteField(FIELD_IDENTIFIERS) Objectives.value[ListIndex]->Targets.value[ListX2Index]->CTDA.Unload(); return; } - + if(ListX3Index >= Objectives.value[ListIndex]->Targets.value[ListX2Index]->CTDA.value.size()) return; - + switch(ListX3FieldID) { case 1: //operType diff --git a/CBash/FalloutNewVegas/Records/API/WATRRecordAPI.cpp b/CBash/FalloutNewVegas/Records/API/WATRRecordAPI.cpp index a3ea8ec..8efe9fa 100644 --- a/CBash/FalloutNewVegas/Records/API/WATRRecordAPI.cpp +++ b/CBash/FalloutNewVegas/Records/API/WATRRecordAPI.cpp @@ -62,35 +62,35 @@ UINT32 WATRRecord::GetFieldAttribute(FIELD_IDENTIFIERS, UINT32 WhichAttribute) return UNKNOWN_FIELD; case 7: //full return STRING_FIELD; - case 8: //nnam Noise Map + case 8: //noisePath return ISTRING_FIELD; - case 9: //anam Opacity + case 9: //opacity return UINT8_FIELD; - case 10: //fnam Flags + case 10: //flags return UINT8_FIELD; - case 11: //mnam Material ID + case 11: //material return ISTRING_FIELD; - case 12: //snam Sound + case 12: //sound return FORMID_FIELD; - case 13: //xnam Actor Effect + case 13: //effect return FORMID_FIELD; - case 14: //data Damage + case 14: //damage return UINT16_FIELD; - case 15: //dnam DNAM ,, Struct + case 15: //unknown1 return FLOAT32_FIELD; - case 16: //dnam DNAM ,, Struct + case 16: //unknown2 return FLOAT32_FIELD; - case 17: //dnam DNAM ,, Struct + case 17: //unknown3 return FLOAT32_FIELD; - case 18: //dnam DNAM ,, Struct + case 18: //unknown4 return FLOAT32_FIELD; - case 19: //dnam DNAM ,, Struct + case 19: //sunPower return FLOAT32_FIELD; - case 20: //dnam DNAM ,, Struct + case 20: //reflectAmt return FLOAT32_FIELD; - case 21: //dnam DNAM ,, Struct + case 21: //fresnelAmt return FLOAT32_FIELD; - case 22: //dnam_p DNAM ,, Struct + case 22: //unused1 switch(WhichAttribute) { case 0: //fieldType @@ -101,17 +101,17 @@ UINT32 WATRRecord::GetFieldAttribute(FIELD_IDENTIFIERS, UINT32 WhichAttribute) return UNKNOWN_FIELD; } return UNKNOWN_FIELD; - case 23: //dnam DNAM ,, Struct + case 23: //fogNear return FLOAT32_FIELD; - case 24: //dnam DNAM ,, Struct + case 24: //fogFar return FLOAT32_FIELD; - case 25: //dnam DNAM ,, Struct + case 25: //shallow.red return UINT8_FIELD; - case 26: //dnam DNAM ,, Struct + case 26: //shallow.green return UINT8_FIELD; - case 27: //dnam DNAM ,, Struct + case 27: //shallow.blue return UINT8_FIELD; - case 28: //dnam_p DNAM ,, Struct + case 28: //unused2 switch(WhichAttribute) { case 0: //fieldType @@ -122,13 +122,13 @@ UINT32 WATRRecord::GetFieldAttribute(FIELD_IDENTIFIERS, UINT32 WhichAttribute) return UNKNOWN_FIELD; } return UNKNOWN_FIELD; - case 29: //dnam DNAM ,, Struct + case 29: //deep.red return UINT8_FIELD; - case 30: //dnam DNAM ,, Struct + case 30: //deep.green return UINT8_FIELD; - case 31: //dnam DNAM ,, Struct + case 31: //deep.blue return UINT8_FIELD; - case 32: //dnam_p DNAM ,, Struct + case 32: //unused3 switch(WhichAttribute) { case 0: //fieldType @@ -139,13 +139,13 @@ UINT32 WATRRecord::GetFieldAttribute(FIELD_IDENTIFIERS, UINT32 WhichAttribute) return UNKNOWN_FIELD; } return UNKNOWN_FIELD; - case 33: //dnam DNAM ,, Struct + case 33: //refl.red return UINT8_FIELD; - case 34: //dnam DNAM ,, Struct + case 34: //refl.green return UINT8_FIELD; - case 35: //dnam DNAM ,, Struct + case 35: //refl.blue return UINT8_FIELD; - case 36: //dnam_p DNAM ,, Struct + case 36: //unused4 switch(WhichAttribute) { case 0: //fieldType @@ -156,7 +156,7 @@ UINT32 WATRRecord::GetFieldAttribute(FIELD_IDENTIFIERS, UINT32 WhichAttribute) return UNKNOWN_FIELD; } return UNKNOWN_FIELD; - case 37: //dnam_p DNAM ,, Struct + case 37: //unused5 switch(WhichAttribute) { case 0: //fieldType @@ -167,81 +167,81 @@ UINT32 WATRRecord::GetFieldAttribute(FIELD_IDENTIFIERS, UINT32 WhichAttribute) return UNKNOWN_FIELD; } return UNKNOWN_FIELD; - case 38: //dnam DNAM ,, Struct + case 38: //rainForce return FLOAT32_FIELD; - case 39: //dnam DNAM ,, Struct + case 39: //rainVelocity return FLOAT32_FIELD; - case 40: //dnam DNAM ,, Struct + case 40: //rainFalloff return FLOAT32_FIELD; - case 41: //dnam DNAM ,, Struct + case 41: //rainDampner return FLOAT32_FIELD; - case 42: //dnam DNAM ,, Struct + case 42: //dispSize return FLOAT32_FIELD; - case 43: //dnam DNAM ,, Struct + case 43: //dispForce return FLOAT32_FIELD; - case 44: //dnam DNAM ,, Struct + case 44: //dispVelocity return FLOAT32_FIELD; - case 45: //dnam DNAM ,, Struct + case 45: //dispFalloff return FLOAT32_FIELD; - case 46: //dnam DNAM ,, Struct + case 46: //dispDampner return FLOAT32_FIELD; - case 47: //dnam DNAM ,, Struct + case 47: //rainSize return FLOAT32_FIELD; - case 48: //dnam DNAM ,, Struct + case 48: //normalsNoiseScale return FLOAT32_FIELD; - case 49: //dnam DNAM ,, Struct + case 49: //noise1Direction return FLOAT32_FIELD; - case 50: //dnam DNAM ,, Struct + case 50: //noise2Direction return FLOAT32_FIELD; - case 51: //dnam DNAM ,, Struct + case 51: //noise3Direction return FLOAT32_FIELD; - case 52: //dnam DNAM ,, Struct + case 52: //noise1Speed return FLOAT32_FIELD; - case 53: //dnam DNAM ,, Struct + case 53: //noise2Speed return FLOAT32_FIELD; - case 54: //dnam DNAM ,, Struct + case 54: //noise3Speed return FLOAT32_FIELD; - case 55: //dnam DNAM ,, Struct + case 55: //normalsFalloffStart return FLOAT32_FIELD; - case 56: //dnam DNAM ,, Struct + case 56: //normalsFalloffEnd return FLOAT32_FIELD; - case 57: //dnam DNAM ,, Struct + case 57: //fogAmt return FLOAT32_FIELD; - case 58: //dnam DNAM ,, Struct + case 58: //normalsUVScale return FLOAT32_FIELD; - case 59: //dnam DNAM ,, Struct + case 59: //underFogAmt return FLOAT32_FIELD; - case 60: //dnam DNAM ,, Struct + case 60: //underFogNear return FLOAT32_FIELD; - case 61: //dnam DNAM ,, Struct + case 61: //underFogFar return FLOAT32_FIELD; - case 62: //dnam DNAM ,, Struct + case 62: //distAmt return FLOAT32_FIELD; - case 63: //dnam DNAM ,, Struct + case 63: //shininess return FLOAT32_FIELD; - case 64: //dnam DNAM ,, Struct + case 64: //hdrMult return FLOAT32_FIELD; - case 65: //dnam DNAM ,, Struct + case 65: //lightRadius return FLOAT32_FIELD; - case 66: //dnam DNAM ,, Struct + case 66: //lightBright return FLOAT32_FIELD; - case 67: //dnam DNAM ,, Struct + case 67: //noise1UVScale return FLOAT32_FIELD; - case 68: //dnam DNAM ,, Struct + case 68: //noise2UVScale return FLOAT32_FIELD; - case 69: //dnam DNAM ,, Struct + case 69: //noise3UVScale return FLOAT32_FIELD; - case 70: //dnam DNAM ,, Struct + case 70: //noise1AmpScale return FLOAT32_FIELD; - case 71: //dnam DNAM ,, Struct + case 71: //noise2AmpScale return FLOAT32_FIELD; - case 72: //dnam DNAM ,, Struct + case 72: //noise3AmpScale return FLOAT32_FIELD; - case 73: //gnam GNAM ,, Struct + case 73: //dayWater return FORMID_FIELD; - case 74: //gnam GNAM ,, Struct + case 74: //nightWater return FORMID_FIELD; - case 75: //gnam GNAM ,, Struct + case 75: //underWater return FORMID_FIELD; default: return UNKNOWN_FIELD; @@ -269,147 +269,147 @@ void * WATRRecord::GetField(FIELD_IDENTIFIERS, void **FieldValues) return NULL; case 7: //full return FULL.value; - case 8: //nnam Noise Map + case 8: //noisePath return NNAM.value; - case 9: //anam Opacity - return ANAM.IsLoaded() ? &ANAM->value9 : NULL; - case 10: //fnam Flags - return FNAM.IsLoaded() ? &FNAM->value10 : NULL; - case 11: //mnam Material ID + case 9: //opacity + return &ANAM.value; + case 10: //flags + return &FNAM.value; + case 11: //material return MNAM.value; - case 12: //snam Sound - return SNAM.IsLoaded() ? &SNAM->value12 : NULL; - case 13: //xnam Actor Effect - return XNAM.IsLoaded() ? &XNAM->value13 : NULL; - case 14: //data Damage - return DATA.IsLoaded() ? &DATA->value14 : NULL; - case 15: //dnam DNAM ,, Struct - return DNAM.IsLoaded() ? &DNAM->value15 : NULL; - case 16: //dnam DNAM ,, Struct - return DNAM.IsLoaded() ? &DNAM->value16 : NULL; - case 17: //dnam DNAM ,, Struct - return DNAM.IsLoaded() ? &DNAM->value17 : NULL; - case 18: //dnam DNAM ,, Struct - return DNAM.IsLoaded() ? &DNAM->value18 : NULL; - case 19: //dnam DNAM ,, Struct - return DNAM.IsLoaded() ? &DNAM->value19 : NULL; - case 20: //dnam DNAM ,, Struct - return DNAM.IsLoaded() ? &DNAM->value20 : NULL; - case 21: //dnam DNAM ,, Struct - return DNAM.IsLoaded() ? &DNAM->value21 : NULL; - case 22: //dnam_p DNAM ,, Struct - *FieldValues = DNAM.IsLoaded() ? &DNAM->value22[0] : NULL; + case 12: //sound + return &SNAM.value; + case 13: //effect + return &XNAM.value; + case 14: //damage + return &DATA.value; + case 15: //unknown1 + return &DNAM.value.unknown1; + case 16: //unknown2 + return &DNAM.value.unknown2; + case 17: //unknown3 + return &DNAM.value.unknown3; + case 18: //unknown4 + return &DNAM.value.unknown4; + case 19: //sunPower + return &DNAM.value.sunPower; + case 20: //reflectAmt + return &DNAM.value.reflectAmt; + case 21: //fresnelAmt + return &DNAM.value.fresnelAmt; + case 22: //unused1 + *FieldValues = &DNAM.value.unused1[0]; return NULL; - case 23: //dnam DNAM ,, Struct - return DNAM.IsLoaded() ? &DNAM->value23 : NULL; - case 24: //dnam DNAM ,, Struct - return DNAM.IsLoaded() ? &DNAM->value24 : NULL; - case 25: //dnam DNAM ,, Struct - return DNAM.IsLoaded() ? &DNAM->value25 : NULL; - case 26: //dnam DNAM ,, Struct - return DNAM.IsLoaded() ? &DNAM->value26 : NULL; - case 27: //dnam DNAM ,, Struct - return DNAM.IsLoaded() ? &DNAM->value27 : NULL; - case 28: //dnam_p DNAM ,, Struct - *FieldValues = DNAM.IsLoaded() ? &DNAM->value28[0] : NULL; + case 23: //fogNear + return &DNAM.value.fogNear; + case 24: //fogFar + return &DNAM.value.fogFar; + case 25: //shallow.red + return &DNAM.value.shallow.red; + case 26: //shallow.green + return &DNAM.value.shallow.green; + case 27: //shallow.blue + return &DNAM.value.shallow.blue; + case 28: //unused2 + *FieldValues = &DNAM.value.shallow.unused1; return NULL; - case 29: //dnam DNAM ,, Struct - return DNAM.IsLoaded() ? &DNAM->value29 : NULL; - case 30: //dnam DNAM ,, Struct - return DNAM.IsLoaded() ? &DNAM->value30 : NULL; - case 31: //dnam DNAM ,, Struct - return DNAM.IsLoaded() ? &DNAM->value31 : NULL; - case 32: //dnam_p DNAM ,, Struct - *FieldValues = DNAM.IsLoaded() ? &DNAM->value32[0] : NULL; + case 29: //deep.red + return &DNAM.value.deep.red; + case 30: //deep.green + return &DNAM.value.deep.green; + case 31: //deep.blue + return &DNAM.value.deep.blue; + case 32: //unused3 + *FieldValues = &DNAM.value.deep.unused1; return NULL; - case 33: //dnam DNAM ,, Struct - return DNAM.IsLoaded() ? &DNAM->value33 : NULL; - case 34: //dnam DNAM ,, Struct - return DNAM.IsLoaded() ? &DNAM->value34 : NULL; - case 35: //dnam DNAM ,, Struct - return DNAM.IsLoaded() ? &DNAM->value35 : NULL; - case 36: //dnam_p DNAM ,, Struct - *FieldValues = DNAM.IsLoaded() ? &DNAM->value36[0] : NULL; + case 33: //refl.red + return &DNAM.value.refl.red; + case 34: //refl.green + return &DNAM.value.refl.green; + case 35: //refl.blue + return &DNAM.value.refl.blue; + case 36: //unused4 + *FieldValues = &DNAM.value.refl.unused1; return NULL; - case 37: //dnam_p DNAM ,, Struct - *FieldValues = DNAM.IsLoaded() ? &DNAM->value37[0] : NULL; + case 37: //unused5 + *FieldValues = &DNAM.value.unused2[0]; return NULL; - case 38: //dnam DNAM ,, Struct - return DNAM.IsLoaded() ? &DNAM->value38 : NULL; - case 39: //dnam DNAM ,, Struct - return DNAM.IsLoaded() ? &DNAM->value39 : NULL; - case 40: //dnam DNAM ,, Struct - return DNAM.IsLoaded() ? &DNAM->value40 : NULL; - case 41: //dnam DNAM ,, Struct - return DNAM.IsLoaded() ? &DNAM->value41 : NULL; - case 42: //dnam DNAM ,, Struct - return DNAM.IsLoaded() ? &DNAM->value42 : NULL; - case 43: //dnam DNAM ,, Struct - return DNAM.IsLoaded() ? &DNAM->value43 : NULL; - case 44: //dnam DNAM ,, Struct - return DNAM.IsLoaded() ? &DNAM->value44 : NULL; - case 45: //dnam DNAM ,, Struct - return DNAM.IsLoaded() ? &DNAM->value45 : NULL; - case 46: //dnam DNAM ,, Struct - return DNAM.IsLoaded() ? &DNAM->value46 : NULL; - case 47: //dnam DNAM ,, Struct - return DNAM.IsLoaded() ? &DNAM->value47 : NULL; - case 48: //dnam DNAM ,, Struct - return DNAM.IsLoaded() ? &DNAM->value48 : NULL; - case 49: //dnam DNAM ,, Struct - return DNAM.IsLoaded() ? &DNAM->value49 : NULL; - case 50: //dnam DNAM ,, Struct - return DNAM.IsLoaded() ? &DNAM->value50 : NULL; - case 51: //dnam DNAM ,, Struct - return DNAM.IsLoaded() ? &DNAM->value51 : NULL; - case 52: //dnam DNAM ,, Struct - return DNAM.IsLoaded() ? &DNAM->value52 : NULL; - case 53: //dnam DNAM ,, Struct - return DNAM.IsLoaded() ? &DNAM->value53 : NULL; - case 54: //dnam DNAM ,, Struct - return DNAM.IsLoaded() ? &DNAM->value54 : NULL; - case 55: //dnam DNAM ,, Struct - return DNAM.IsLoaded() ? &DNAM->value55 : NULL; - case 56: //dnam DNAM ,, Struct - return DNAM.IsLoaded() ? &DNAM->value56 : NULL; - case 57: //dnam DNAM ,, Struct - return DNAM.IsLoaded() ? &DNAM->value57 : NULL; - case 58: //dnam DNAM ,, Struct - return DNAM.IsLoaded() ? &DNAM->value58 : NULL; - case 59: //dnam DNAM ,, Struct - return DNAM.IsLoaded() ? &DNAM->value59 : NULL; - case 60: //dnam DNAM ,, Struct - return DNAM.IsLoaded() ? &DNAM->value60 : NULL; - case 61: //dnam DNAM ,, Struct - return DNAM.IsLoaded() ? &DNAM->value61 : NULL; - case 62: //dnam DNAM ,, Struct - return DNAM.IsLoaded() ? &DNAM->value62 : NULL; - case 63: //dnam DNAM ,, Struct - return DNAM.IsLoaded() ? &DNAM->value63 : NULL; - case 64: //dnam DNAM ,, Struct - return DNAM.IsLoaded() ? &DNAM->value64 : NULL; - case 65: //dnam DNAM ,, Struct - return DNAM.IsLoaded() ? &DNAM->value65 : NULL; - case 66: //dnam DNAM ,, Struct - return DNAM.IsLoaded() ? &DNAM->value66 : NULL; - case 67: //dnam DNAM ,, Struct - return DNAM.IsLoaded() ? &DNAM->value67 : NULL; - case 68: //dnam DNAM ,, Struct - return DNAM.IsLoaded() ? &DNAM->value68 : NULL; - case 69: //dnam DNAM ,, Struct - return DNAM.IsLoaded() ? &DNAM->value69 : NULL; - case 70: //dnam DNAM ,, Struct - return DNAM.IsLoaded() ? &DNAM->value70 : NULL; - case 71: //dnam DNAM ,, Struct - return DNAM.IsLoaded() ? &DNAM->value71 : NULL; - case 72: //dnam DNAM ,, Struct - return DNAM.IsLoaded() ? &DNAM->value72 : NULL; - case 73: //gnam GNAM ,, Struct - return GNAM.IsLoaded() ? &GNAM->value73 : NULL; - case 74: //gnam GNAM ,, Struct - return GNAM.IsLoaded() ? &GNAM->value74 : NULL; - case 75: //gnam GNAM ,, Struct - return GNAM.IsLoaded() ? &GNAM->value75 : NULL; + case 38: //rainForce + return &DNAM.value.rainForce; + case 39: //rainVelocity + return &DNAM.value.rainVelocity; + case 40: //rainFalloff + return &DNAM.value.rainFalloff; + case 41: //rainDampner + return &DNAM.value.rainDampner; + case 42: //dispSize + return &DNAM.value.dispSize; + case 43: //dispForce + return &DNAM.value.dispForce; + case 44: //dispVelocity + return &DNAM.value.dispVelocity; + case 45: //dispFalloff + return &DNAM.value.dispFalloff; + case 46: //dispDampner + return &DNAM.value.dispDampner; + case 47: //rainSize + return &DNAM.value.rainSize; + case 48: //normalsNoiseScale + return &DNAM.value.normalsNoiseScale; + case 49: //noise1Direction + return &DNAM.value.noise1Direction; + case 50: //noise2Direction + return &DNAM.value.noise2Direction; + case 51: //noise3Direction + return &DNAM.value.noise3Direction; + case 52: //noise1Speed + return &DNAM.value.noise1Speed; + case 53: //noise2Speed + return &DNAM.value.noise2Speed; + case 54: //noise3Speed + return &DNAM.value.noise3Speed; + case 55: //normalsFalloffStart + return &DNAM.value.normalsFalloffStart; + case 56: //normalsFalloffEnd + return &DNAM.value.normalsFalloffEnd; + case 57: //fogAmt + return &DNAM.value.fogAmt; + case 58: //normalsUVScale + return &DNAM.value.normalsUVScale; + case 59: //underFogAmt + return &DNAM.value.underFogAmt; + case 60: //underFogNear + return &DNAM.value.underFogNear; + case 61: //underFogFar + return &DNAM.value.underFogFar; + case 62: //distAmt + return &DNAM.value.distAmt; + case 63: //shininess + return &DNAM.value.shininess; + case 64: //hdrMult + return &DNAM.value.hdrMult; + case 65: //lightRadius + return &DNAM.value.lightRadius; + case 66: //lightBright + return &DNAM.value.lightBright; + case 67: //noise1UVScale + return &DNAM.value.noise1UVScale; + case 68: //noise2UVScale + return &DNAM.value.noise2UVScale; + case 69: //noise3UVScale + return &DNAM.value.noise3UVScale; + case 70: //noise1AmpScale + return &DNAM.value.noise1AmpScale; + case 71: //noise2AmpScale + return &DNAM.value.noise2AmpScale; + case 72: //noise3AmpScale + return &DNAM.value.noise3AmpScale; + case 73: //dayWater + return &GNAM.value.dayWater; + case 74: //nightWater + return &GNAM.value.nightWater; + case 75: //underWater + return &GNAM.value.underWater; default: return NULL; } @@ -446,291 +446,225 @@ bool WATRRecord::SetField(FIELD_IDENTIFIERS, void *FieldValue, UINT32 ArraySize) case 7: //full FULL.Copy((STRING)FieldValue); break; - case 8: //nnam Noise Map + case 8: //noisePath NNAM.Copy((STRING)FieldValue); break; - case 9: //anam Opacity - ANAM.Load(); - ANAM->value9 = *(UINT8 *)FieldValue; + case 9: //opacity + ANAM.value = *(UINT8 *)FieldValue; break; - case 10: //fnam Flags - FNAM.Load(); - FNAM->value10 = *(UINT8 *)FieldValue; + case 10: //flags + FNAM.value = *(UINT8 *)FieldValue; break; - case 11: //mnam Material ID + case 11: //material MNAM.Copy((STRING)FieldValue); break; - case 12: //snam Sound - SNAM.Load(); - SNAM->value12 = *(FORMID *)FieldValue; + case 12: //sound + SNAM.value = *(FORMID *)FieldValue; return true; - case 13: //xnam Actor Effect - XNAM.Load(); - XNAM->value13 = *(FORMID *)FieldValue; + case 13: //effect + XNAM.value = *(FORMID *)FieldValue; return true; - case 14: //data Damage - DATA.Load(); - DATA->value14 = *(UINT16 *)FieldValue; + case 14: //damage + DATA.value = *(UINT16 *)FieldValue; break; - case 15: //dnam DNAM ,, Struct - DNAM.Load(); - DNAM->value15 = *(FLOAT32 *)FieldValue; + case 15: //unknown1 + DNAM.value.unknown1 = *(FLOAT32 *)FieldValue; break; - case 16: //dnam DNAM ,, Struct - DNAM.Load(); - DNAM->value16 = *(FLOAT32 *)FieldValue; + case 16: //unknown2 + DNAM.value.unknown2 = *(FLOAT32 *)FieldValue; break; - case 17: //dnam DNAM ,, Struct - DNAM.Load(); - DNAM->value17 = *(FLOAT32 *)FieldValue; + case 17: //unknown3 + DNAM.value.unknown3 = *(FLOAT32 *)FieldValue; break; - case 18: //dnam DNAM ,, Struct - DNAM.Load(); - DNAM->value18 = *(FLOAT32 *)FieldValue; + case 18: //unknown4 + DNAM.value.unknown4 = *(FLOAT32 *)FieldValue; break; - case 19: //dnam DNAM ,, Struct - DNAM.Load(); - DNAM->value19 = *(FLOAT32 *)FieldValue; + case 19: //sunPower + DNAM.value.sunPower = *(FLOAT32 *)FieldValue; break; - case 20: //dnam DNAM ,, Struct - DNAM.Load(); - DNAM->value20 = *(FLOAT32 *)FieldValue; + case 20: //reflectAmt + DNAM.value.reflectAmt = *(FLOAT32 *)FieldValue; break; - case 21: //dnam DNAM ,, Struct - DNAM.Load(); - DNAM->value21 = *(FLOAT32 *)FieldValue; + case 21: //fresnelAmt + DNAM.value.fresnelAmt = *(FLOAT32 *)FieldValue; break; - case 22: //dnam_p DNAM ,, Struct + case 22: //unused1 if(ArraySize != 4) break; - DNAM.Load(); - DNAM->value22[0] = ((UINT8ARRAY)FieldValue)[0]; - DNAM->value22[1] = ((UINT8ARRAY)FieldValue)[1]; - DNAM->value22[2] = ((UINT8ARRAY)FieldValue)[2]; - DNAM->value22[3] = ((UINT8ARRAY)FieldValue)[3]; + DNAM.value.unused1[0] = ((UINT8ARRAY)FieldValue)[0]; + DNAM.value.unused1[1] = ((UINT8ARRAY)FieldValue)[1]; + DNAM.value.unused1[2] = ((UINT8ARRAY)FieldValue)[2]; + DNAM.value.unused1[3] = ((UINT8ARRAY)FieldValue)[3]; break; - case 23: //dnam DNAM ,, Struct - DNAM.Load(); - DNAM->value23 = *(FLOAT32 *)FieldValue; + case 23: //fogNear + DNAM.value.fogNear = *(FLOAT32 *)FieldValue; break; - case 24: //dnam DNAM ,, Struct - DNAM.Load(); - DNAM->value24 = *(FLOAT32 *)FieldValue; + case 24: //fogFar + DNAM.value.fogFar = *(FLOAT32 *)FieldValue; break; - case 25: //dnam DNAM ,, Struct - DNAM.Load(); - DNAM->value25 = *(UINT8 *)FieldValue; + case 25: //shallow.red + DNAM.value.shallow.red = *(UINT8 *)FieldValue; break; - case 26: //dnam DNAM ,, Struct - DNAM.Load(); - DNAM->value26 = *(UINT8 *)FieldValue; + case 26: //shallow.green + DNAM.value.shallow.green = *(UINT8 *)FieldValue; break; - case 27: //dnam DNAM ,, Struct - DNAM.Load(); - DNAM->value27 = *(UINT8 *)FieldValue; + case 27: //shallow.blue + DNAM.value.shallow.blue = *(UINT8 *)FieldValue; break; - case 28: //dnam_p DNAM ,, Struct + case 28: //unused2 if(ArraySize != 1) break; - DNAM.Load(); - DNAM->value28[0] = ((UINT8ARRAY)FieldValue)[0]; + DNAM.value.shallow.unused1 = ((UINT8ARRAY)FieldValue)[0]; break; - case 29: //dnam DNAM ,, Struct - DNAM.Load(); - DNAM->value29 = *(UINT8 *)FieldValue; + case 29: //deep.red + DNAM.value.deep.red = *(UINT8 *)FieldValue; break; - case 30: //dnam DNAM ,, Struct - DNAM.Load(); - DNAM->value30 = *(UINT8 *)FieldValue; + case 30: //deep.green + DNAM.value.deep.green = *(UINT8 *)FieldValue; break; - case 31: //dnam DNAM ,, Struct - DNAM.Load(); - DNAM->value31 = *(UINT8 *)FieldValue; + case 31: //deep.blue + DNAM.value.deep.blue = *(UINT8 *)FieldValue; break; - case 32: //dnam_p DNAM ,, Struct + case 32: //unused3 if(ArraySize != 1) break; - DNAM.Load(); - DNAM->value32[0] = ((UINT8ARRAY)FieldValue)[0]; + DNAM.value.deep.unused1 = ((UINT8ARRAY)FieldValue)[0]; break; - case 33: //dnam DNAM ,, Struct - DNAM.Load(); - DNAM->value33 = *(UINT8 *)FieldValue; + case 33: //refl.red + DNAM.value.refl.red = *(UINT8 *)FieldValue; break; - case 34: //dnam DNAM ,, Struct - DNAM.Load(); - DNAM->value34 = *(UINT8 *)FieldValue; + case 34: //refl.green + DNAM.value.refl.green = *(UINT8 *)FieldValue; break; - case 35: //dnam DNAM ,, Struct - DNAM.Load(); - DNAM->value35 = *(UINT8 *)FieldValue; + case 35: //refl.blue + DNAM.value.refl.blue = *(UINT8 *)FieldValue; break; - case 36: //dnam_p DNAM ,, Struct + case 36: //unused4 if(ArraySize != 1) break; - DNAM.Load(); - DNAM->value36[0] = ((UINT8ARRAY)FieldValue)[0]; + DNAM.value.refl.unused1 = ((UINT8ARRAY)FieldValue)[0]; break; - case 37: //dnam_p DNAM ,, Struct + case 37: //unused5 if(ArraySize != 4) break; - DNAM.Load(); - DNAM->value37[0] = ((UINT8ARRAY)FieldValue)[0]; - DNAM->value37[1] = ((UINT8ARRAY)FieldValue)[1]; - DNAM->value37[2] = ((UINT8ARRAY)FieldValue)[2]; - DNAM->value37[3] = ((UINT8ARRAY)FieldValue)[3]; + DNAM.value.unused2[0] = ((UINT8ARRAY)FieldValue)[0]; + DNAM.value.unused2[1] = ((UINT8ARRAY)FieldValue)[1]; + DNAM.value.unused2[2] = ((UINT8ARRAY)FieldValue)[2]; + DNAM.value.unused2[3] = ((UINT8ARRAY)FieldValue)[3]; break; - case 38: //dnam DNAM ,, Struct - DNAM.Load(); - DNAM->value38 = *(FLOAT32 *)FieldValue; + case 38: //rainForce + DNAM.value.rainForce = *(FLOAT32 *)FieldValue; break; - case 39: //dnam DNAM ,, Struct - DNAM.Load(); - DNAM->value39 = *(FLOAT32 *)FieldValue; + case 39: //rainVelocity + DNAM.value.rainVelocity = *(FLOAT32 *)FieldValue; break; - case 40: //dnam DNAM ,, Struct - DNAM.Load(); - DNAM->value40 = *(FLOAT32 *)FieldValue; + case 40: //rainFalloff + DNAM.value.rainFalloff = *(FLOAT32 *)FieldValue; break; - case 41: //dnam DNAM ,, Struct - DNAM.Load(); - DNAM->value41 = *(FLOAT32 *)FieldValue; + case 41: //rainDampner + DNAM.value.rainDampner = *(FLOAT32 *)FieldValue; break; - case 42: //dnam DNAM ,, Struct - DNAM.Load(); - DNAM->value42 = *(FLOAT32 *)FieldValue; + case 42: //dispSize + DNAM.value.dispSize = *(FLOAT32 *)FieldValue; break; - case 43: //dnam DNAM ,, Struct - DNAM.Load(); - DNAM->value43 = *(FLOAT32 *)FieldValue; + case 43: //dispForce + DNAM.value.dispForce = *(FLOAT32 *)FieldValue; break; - case 44: //dnam DNAM ,, Struct - DNAM.Load(); - DNAM->value44 = *(FLOAT32 *)FieldValue; + case 44: //dispVelocity + DNAM.value.dispVelocity = *(FLOAT32 *)FieldValue; break; - case 45: //dnam DNAM ,, Struct - DNAM.Load(); - DNAM->value45 = *(FLOAT32 *)FieldValue; + case 45: //dispFalloff + DNAM.value.dispFalloff = *(FLOAT32 *)FieldValue; break; - case 46: //dnam DNAM ,, Struct - DNAM.Load(); - DNAM->value46 = *(FLOAT32 *)FieldValue; + case 46: //dispDampner + DNAM.value.dispDampner = *(FLOAT32 *)FieldValue; break; - case 47: //dnam DNAM ,, Struct - DNAM.Load(); - DNAM->value47 = *(FLOAT32 *)FieldValue; + case 47: //rainSize + DNAM.value.rainSize = *(FLOAT32 *)FieldValue; break; - case 48: //dnam DNAM ,, Struct - DNAM.Load(); - DNAM->value48 = *(FLOAT32 *)FieldValue; - break; - case 49: //dnam DNAM ,, Struct - DNAM.Load(); - DNAM->value49 = *(FLOAT32 *)FieldValue; - break; - case 50: //dnam DNAM ,, Struct - DNAM.Load(); - DNAM->value50 = *(FLOAT32 *)FieldValue; - break; - case 51: //dnam DNAM ,, Struct - DNAM.Load(); - DNAM->value51 = *(FLOAT32 *)FieldValue; - break; - case 52: //dnam DNAM ,, Struct - DNAM.Load(); - DNAM->value52 = *(FLOAT32 *)FieldValue; - break; - case 53: //dnam DNAM ,, Struct - DNAM.Load(); - DNAM->value53 = *(FLOAT32 *)FieldValue; - break; - case 54: //dnam DNAM ,, Struct - DNAM.Load(); - DNAM->value54 = *(FLOAT32 *)FieldValue; - break; - case 55: //dnam DNAM ,, Struct - DNAM.Load(); - DNAM->value55 = *(FLOAT32 *)FieldValue; - break; - case 56: //dnam DNAM ,, Struct - DNAM.Load(); - DNAM->value56 = *(FLOAT32 *)FieldValue; - break; - case 57: //dnam DNAM ,, Struct - DNAM.Load(); - DNAM->value57 = *(FLOAT32 *)FieldValue; - break; - case 58: //dnam DNAM ,, Struct - DNAM.Load(); - DNAM->value58 = *(FLOAT32 *)FieldValue; - break; - case 59: //dnam DNAM ,, Struct - DNAM.Load(); - DNAM->value59 = *(FLOAT32 *)FieldValue; - break; - case 60: //dnam DNAM ,, Struct - DNAM.Load(); - DNAM->value60 = *(FLOAT32 *)FieldValue; - break; - case 61: //dnam DNAM ,, Struct - DNAM.Load(); - DNAM->value61 = *(FLOAT32 *)FieldValue; - break; - case 62: //dnam DNAM ,, Struct - DNAM.Load(); - DNAM->value62 = *(FLOAT32 *)FieldValue; + case 48: //normalsNoiseScale + DNAM.value.normalsNoiseScale = *(FLOAT32 *)FieldValue; break; - case 63: //dnam DNAM ,, Struct - DNAM.Load(); - DNAM->value63 = *(FLOAT32 *)FieldValue; + case 49: //noise1Direction + DNAM.value.noise1Direction = *(FLOAT32 *)FieldValue; break; - case 64: //dnam DNAM ,, Struct - DNAM.Load(); - DNAM->value64 = *(FLOAT32 *)FieldValue; + case 50: //noise2Direction + DNAM.value.noise2Direction = *(FLOAT32 *)FieldValue; break; - case 65: //dnam DNAM ,, Struct - DNAM.Load(); - DNAM->value65 = *(FLOAT32 *)FieldValue; + case 51: //noise3Direction + DNAM.value.noise3Direction = *(FLOAT32 *)FieldValue; break; - case 66: //dnam DNAM ,, Struct - DNAM.Load(); - DNAM->value66 = *(FLOAT32 *)FieldValue; + case 52: //noise1Speed + DNAM.value.noise1Speed = *(FLOAT32 *)FieldValue; break; - case 67: //dnam DNAM ,, Struct - DNAM.Load(); - DNAM->value67 = *(FLOAT32 *)FieldValue; + case 53: //noise2Speed + DNAM.value.noise2Speed = *(FLOAT32 *)FieldValue; break; - case 68: //dnam DNAM ,, Struct - DNAM.Load(); - DNAM->value68 = *(FLOAT32 *)FieldValue; + case 54: //noise3Speed + DNAM.value.noise3Speed = *(FLOAT32 *)FieldValue; break; - case 69: //dnam DNAM ,, Struct - DNAM.Load(); - DNAM->value69 = *(FLOAT32 *)FieldValue; + case 55: //normalsFalloffStart + DNAM.value.normalsFalloffStart = *(FLOAT32 *)FieldValue; break; - case 70: //dnam DNAM ,, Struct - DNAM.Load(); - DNAM->value70 = *(FLOAT32 *)FieldValue; + case 56: //normalsFalloffEnd + DNAM.value.normalsFalloffEnd = *(FLOAT32 *)FieldValue; break; - case 71: //dnam DNAM ,, Struct - DNAM.Load(); - DNAM->value71 = *(FLOAT32 *)FieldValue; + case 57: //fogAmt + DNAM.value.fogAmt = *(FLOAT32 *)FieldValue; break; - case 72: //dnam DNAM ,, Struct - DNAM.Load(); - DNAM->value72 = *(FLOAT32 *)FieldValue; + case 58: //normalsUVScale + DNAM.value.normalsUVScale = *(FLOAT32 *)FieldValue; break; - case 73: //gnam GNAM ,, Struct - GNAM.Load(); - GNAM->value73 = *(FORMID *)FieldValue; + case 59: //underFogAmt + DNAM.value.underFogAmt = *(FLOAT32 *)FieldValue; + break; + case 60: //underFogNear + DNAM.value.underFogNear = *(FLOAT32 *)FieldValue; + break; + case 61: //underFogFar + DNAM.value.underFogFar = *(FLOAT32 *)FieldValue; + break; + case 62: //distAmt + DNAM.value.distAmt = *(FLOAT32 *)FieldValue; + break; + case 63: //shininess + DNAM.value.shininess = *(FLOAT32 *)FieldValue; + break; + case 64: //hdrMult + DNAM.value.hdrMult = *(FLOAT32 *)FieldValue; + break; + case 65: //lightRadius + DNAM.value.lightRadius = *(FLOAT32 *)FieldValue; + break; + case 66: //lightBright + DNAM.value.lightBright = *(FLOAT32 *)FieldValue; + break; + case 67: //noise1UVScale + DNAM.value.noise1UVScale = *(FLOAT32 *)FieldValue; + break; + case 68: //noise2UVScale + DNAM.value.noise2UVScale = *(FLOAT32 *)FieldValue; + break; + case 69: //noise3UVScale + DNAM.value.noise3UVScale = *(FLOAT32 *)FieldValue; + break; + case 70: //noise1AmpScale + DNAM.value.noise1AmpScale = *(FLOAT32 *)FieldValue; + break; + case 71: //noise2AmpScale + DNAM.value.noise2AmpScale = *(FLOAT32 *)FieldValue; + break; + case 72: //noise3AmpScale + DNAM.value.noise3AmpScale = *(FLOAT32 *)FieldValue; + break; + case 73: //dayWater + GNAM.value.dayWater = *(FORMID *)FieldValue; return true; - case 74: //gnam GNAM ,, Struct - GNAM.Load(); - GNAM->value74 = *(FORMID *)FieldValue; + case 74: //nightWater + GNAM.value.nightWater = *(FORMID *)FieldValue; return true; - case 75: //gnam GNAM ,, Struct - GNAM.Load(); - GNAM->value75 = *(FORMID *)FieldValue; + case 75: //underWater + GNAM.value.underWater = *(FORMID *)FieldValue; return true; default: break; @@ -740,6 +674,8 @@ bool WATRRecord::SetField(FIELD_IDENTIFIERS, void *FieldValue, UINT32 ArraySize) void WATRRecord::DeleteField(FIELD_IDENTIFIERS) { + WATRDNAM defaultDNAM; + WATRGNAM defaultGNAM; switch(FieldID) { case 1: //flags1 @@ -761,209 +697,215 @@ void WATRRecord::DeleteField(FIELD_IDENTIFIERS) case 7: //full FULL.Unload(); return; - case 8: //nnam Noise Map + case 8: //noisePath NNAM.Unload(); return; - case 9: //anam Opacity + case 9: //opacity ANAM.Unload(); return; - case 10: //fnam Flags + case 10: //flags FNAM.Unload(); return; - case 11: //mnam Material ID + case 11: //material MNAM.Unload(); return; - case 12: //snam Sound + case 12: //sound SNAM.Unload(); return; - case 13: //xnam Actor Effect + case 13: //effect XNAM.Unload(); return; - case 14: //data Damage + case 14: //damage DATA.Unload(); return; - case 15: //dnam DNAM ,, Struct - DNAM.Unload(); + case 15: //unknown1 + DNAM.value.unknown1 = defaultDNAM.unknown1; return; - case 16: //dnam DNAM ,, Struct - DNAM.Unload(); + case 16: //unknown2 + DNAM.value.unknown2 = defaultDNAM.unknown2; return; - case 17: //dnam DNAM ,, Struct - DNAM.Unload(); + case 17: //unknown3 + DNAM.value.unknown3 = defaultDNAM.unknown3; return; - case 18: //dnam DNAM ,, Struct - DNAM.Unload(); + case 18: //unknown4 + DNAM.value.unknown4 = defaultDNAM.unknown4; return; - case 19: //dnam DNAM ,, Struct - DNAM.Unload(); + case 19: //sunPower + DNAM.value.sunPower = defaultDNAM.sunPower; return; - case 20: //dnam DNAM ,, Struct - DNAM.Unload(); + case 20: //reflectAmt + DNAM.value.reflectAmt = defaultDNAM.reflectAmt; return; - case 21: //dnam DNAM ,, Struct - DNAM.Unload(); + case 21: //fresnelAmt + DNAM.value.fresnelAmt = defaultDNAM.fresnelAmt; return; - case 22: //dnam_p DNAM ,, Struct - DNAM.Unload(); + case 22: //unused1 + DNAM.value.unused1[0] = defaultDNAM.unused1[0]; + DNAM.value.unused1[1] = defaultDNAM.unused1[1]; + DNAM.value.unused1[2] = defaultDNAM.unused1[2]; + DNAM.value.unused1[3] = defaultDNAM.unused1[3]; return; - case 23: //dnam DNAM ,, Struct - DNAM.Unload(); + case 23: //fogNear + DNAM.value.fogNear = defaultDNAM.fogNear; return; - case 24: //dnam DNAM ,, Struct - DNAM.Unload(); + case 24: //fogFar + DNAM.value.fogFar = defaultDNAM.fogFar; return; - case 25: //dnam DNAM ,, Struct - DNAM.Unload(); + case 25: //shallow.red + DNAM.value.shallow.red = defaultDNAM.shallow.red; return; - case 26: //dnam DNAM ,, Struct - DNAM.Unload(); + case 26: //shallow.green + DNAM.value.shallow.green = defaultDNAM.shallow.green; return; - case 27: //dnam DNAM ,, Struct - DNAM.Unload(); + case 27: //shallow.blue + DNAM.value.shallow.blue = defaultDNAM.shallow.blue; return; - case 28: //dnam_p DNAM ,, Struct - DNAM.Unload(); + case 28: //unused2 + DNAM.value.shallow.unused1 = defaultDNAM.shallow.unused1; return; - case 29: //dnam DNAM ,, Struct - DNAM.Unload(); + case 29: //deep.red + DNAM.value.deep.red = defaultDNAM.deep.red; return; - case 30: //dnam DNAM ,, Struct - DNAM.Unload(); + case 30: //deep.green + DNAM.value.deep.green = defaultDNAM.deep.green; return; - case 31: //dnam DNAM ,, Struct - DNAM.Unload(); + case 31: //deep.blue + DNAM.value.deep.blue = defaultDNAM.deep.blue; return; - case 32: //dnam_p DNAM ,, Struct - DNAM.Unload(); + case 32: //unused3 + DNAM.value.deep.unused1 = defaultDNAM.deep.unused1; return; - case 33: //dnam DNAM ,, Struct - DNAM.Unload(); + case 33: //refl.red + DNAM.value.refl.red = defaultDNAM.refl.red; return; - case 34: //dnam DNAM ,, Struct - DNAM.Unload(); + case 34: //refl.green + DNAM.value.refl.green = defaultDNAM.refl.green; return; - case 35: //dnam DNAM ,, Struct - DNAM.Unload(); + case 35: //refl.blue + DNAM.value.refl.blue = defaultDNAM.refl.blue; return; - case 36: //dnam_p DNAM ,, Struct - DNAM.Unload(); + case 36: //unused4 + DNAM.value.refl.unused1 = defaultDNAM.refl.unused1; return; - case 37: //dnam_p DNAM ,, Struct - DNAM.Unload(); + case 37: //unused5 + DNAM.value.unused2[0] = defaultDNAM.unused2[0]; + DNAM.value.unused2[1] = defaultDNAM.unused2[1]; + DNAM.value.unused2[2] = defaultDNAM.unused2[2]; + DNAM.value.unused2[3] = defaultDNAM.unused2[3]; return; - case 38: //dnam DNAM ,, Struct - DNAM.Unload(); + case 38: //rainForce + DNAM.value.rainForce = defaultDNAM.rainForce; return; - case 39: //dnam DNAM ,, Struct - DNAM.Unload(); + case 39: //rainVelocity + DNAM.value.rainVelocity = defaultDNAM.rainVelocity; return; - case 40: //dnam DNAM ,, Struct - DNAM.Unload(); + case 40: //rainFalloff + DNAM.value.rainFalloff = defaultDNAM.rainFalloff; return; - case 41: //dnam DNAM ,, Struct - DNAM.Unload(); + case 41: //rainDampner + DNAM.value.rainDampner = defaultDNAM.rainDampner; return; - case 42: //dnam DNAM ,, Struct - DNAM.Unload(); + case 42: //dispSize + DNAM.value.dispSize = defaultDNAM.dispSize; return; - case 43: //dnam DNAM ,, Struct - DNAM.Unload(); + case 43: //dispForce + DNAM.value.dispForce = defaultDNAM.dispForce; return; - case 44: //dnam DNAM ,, Struct - DNAM.Unload(); + case 44: //dispVelocity + DNAM.value.dispVelocity = defaultDNAM.dispVelocity; return; - case 45: //dnam DNAM ,, Struct - DNAM.Unload(); + case 45: //dispFalloff + DNAM.value.dispFalloff = defaultDNAM.dispFalloff; return; - case 46: //dnam DNAM ,, Struct - DNAM.Unload(); + case 46: //dispDampner + DNAM.value.dispDampner = defaultDNAM.dispDampner; return; - case 47: //dnam DNAM ,, Struct - DNAM.Unload(); + case 47: //rainSize + DNAM.value.rainSize = defaultDNAM.rainSize; return; - case 48: //dnam DNAM ,, Struct - DNAM.Unload(); + case 48: //normalsNoiseScale + DNAM.value.normalsNoiseScale = defaultDNAM.normalsNoiseScale; return; - case 49: //dnam DNAM ,, Struct - DNAM.Unload(); + case 49: //noise1Direction + DNAM.value.noise1Direction = defaultDNAM.noise1Direction; return; - case 50: //dnam DNAM ,, Struct - DNAM.Unload(); + case 50: //noise2Direction + DNAM.value.noise2Direction = defaultDNAM.noise2Direction; return; - case 51: //dnam DNAM ,, Struct - DNAM.Unload(); + case 51: //noise3Direction + DNAM.value.noise3Direction = defaultDNAM.noise3Direction; return; - case 52: //dnam DNAM ,, Struct - DNAM.Unload(); + case 52: //noise1Speed + DNAM.value.noise1Speed = defaultDNAM.noise1Speed; return; - case 53: //dnam DNAM ,, Struct - DNAM.Unload(); + case 53: //noise2Speed + DNAM.value.noise2Speed = defaultDNAM.noise2Speed; return; - case 54: //dnam DNAM ,, Struct - DNAM.Unload(); + case 54: //noise3Speed + DNAM.value.noise3Speed = defaultDNAM.noise3Speed; return; - case 55: //dnam DNAM ,, Struct - DNAM.Unload(); + case 55: //normalsFalloffStart + DNAM.value.normalsFalloffStart = defaultDNAM.normalsFalloffStart; return; - case 56: //dnam DNAM ,, Struct - DNAM.Unload(); + case 56: //normalsFalloffEnd + DNAM.value.normalsFalloffEnd = defaultDNAM.normalsFalloffEnd; return; - case 57: //dnam DNAM ,, Struct - DNAM.Unload(); + case 57: //fogAmt + DNAM.value.fogAmt = defaultDNAM.fogAmt; return; - case 58: //dnam DNAM ,, Struct - DNAM.Unload(); + case 58: //normalsUVScale + DNAM.value.normalsUVScale = defaultDNAM.normalsUVScale; return; - case 59: //dnam DNAM ,, Struct - DNAM.Unload(); + case 59: //underFogAmt + DNAM.value.underFogAmt = defaultDNAM.underFogAmt; return; - case 60: //dnam DNAM ,, Struct - DNAM.Unload(); + case 60: //underFogNear + DNAM.value.underFogNear = defaultDNAM.underFogNear; return; - case 61: //dnam DNAM ,, Struct - DNAM.Unload(); + case 61: //underFogFar + DNAM.value.underFogFar = defaultDNAM.underFogFar; return; - case 62: //dnam DNAM ,, Struct - DNAM.Unload(); + case 62: //distAmt + DNAM.value.distAmt = defaultDNAM.distAmt; return; - case 63: //dnam DNAM ,, Struct - DNAM.Unload(); + case 63: //shininess + DNAM.value.shininess = defaultDNAM.shininess; return; - case 64: //dnam DNAM ,, Struct - DNAM.Unload(); + case 64: //hdrMult + DNAM.value.hdrMult = defaultDNAM.hdrMult; return; - case 65: //dnam DNAM ,, Struct - DNAM.Unload(); + case 65: //lightRadius + DNAM.value.lightRadius = defaultDNAM.lightRadius; return; - case 66: //dnam DNAM ,, Struct - DNAM.Unload(); + case 66: //lightBright + DNAM.value.lightBright = defaultDNAM.lightBright; return; - case 67: //dnam DNAM ,, Struct - DNAM.Unload(); + case 67: //noise1UVScale + DNAM.value.noise1UVScale = defaultDNAM.noise1UVScale; return; - case 68: //dnam DNAM ,, Struct - DNAM.Unload(); + case 68: //noise2UVScale + DNAM.value.noise2UVScale = defaultDNAM.noise2UVScale; return; - case 69: //dnam DNAM ,, Struct - DNAM.Unload(); + case 69: //noise3UVScale + DNAM.value.noise3UVScale = defaultDNAM.noise3UVScale; return; - case 70: //dnam DNAM ,, Struct - DNAM.Unload(); + case 70: //noise1AmpScale + DNAM.value.noise1AmpScale = defaultDNAM.noise1AmpScale; return; - case 71: //dnam DNAM ,, Struct - DNAM.Unload(); + case 71: //noise2AmpScale + DNAM.value.noise2AmpScale = defaultDNAM.noise2AmpScale; return; - case 72: //dnam DNAM ,, Struct - DNAM.Unload(); + case 72: //noise3AmpScale + DNAM.value.noise3AmpScale = defaultDNAM.noise3AmpScale; return; - case 73: //gnam GNAM ,, Struct - GNAM.Unload(); + case 73: //dayWater + GNAM.value.dayWater = defaultGNAM.dayWater; return; - case 74: //gnam GNAM ,, Struct - GNAM.Unload(); + case 74: //nightWater + GNAM.value.nightWater = defaultGNAM.nightWater; return; - case 75: //gnam GNAM ,, Struct - GNAM.Unload(); + case 75: //underWater + GNAM.value.underWater = defaultGNAM.underWater; return; default: return; diff --git a/CBash/FalloutNewVegas/Records/API/WRLDRecordAPI.cpp b/CBash/FalloutNewVegas/Records/API/WRLDRecordAPI.cpp index 98031f3..ee60c00 100644 --- a/CBash/FalloutNewVegas/Records/API/WRLDRecordAPI.cpp +++ b/CBash/FalloutNewVegas/Records/API/WRLDRecordAPI.cpp @@ -478,6 +478,8 @@ bool WRLDRecord::SetField(FIELD_IDENTIFIERS, void *FieldValue, UINT32 ArraySize) } break; case 38: //concSolid + if(FieldValue == NULL) + break; ArraySize = strlen((STRING)FieldValue); if(ArraySize > 29) break; @@ -486,6 +488,8 @@ bool WRLDRecord::SetField(FIELD_IDENTIFIERS, void *FieldValue, UINT32 ArraySize) memcpy(&IMPF->concSolid[0], FieldValue, ArraySize); break; case 39: //concBroken + if(FieldValue == NULL) + break; ArraySize = strlen((STRING)FieldValue); if(ArraySize > 29) break; @@ -494,6 +498,8 @@ bool WRLDRecord::SetField(FIELD_IDENTIFIERS, void *FieldValue, UINT32 ArraySize) memcpy(&IMPF->concBroken[0], FieldValue, ArraySize); break; case 40: //metalSolid + if(FieldValue == NULL) + break; ArraySize = strlen((STRING)FieldValue); if(ArraySize > 29) break; @@ -502,6 +508,8 @@ bool WRLDRecord::SetField(FIELD_IDENTIFIERS, void *FieldValue, UINT32 ArraySize) memcpy(&IMPF->metalSolid[0], FieldValue, ArraySize); break; case 41: //metalHollow + if(FieldValue == NULL) + break; ArraySize = strlen((STRING)FieldValue); if(ArraySize > 29) break; @@ -510,6 +518,8 @@ bool WRLDRecord::SetField(FIELD_IDENTIFIERS, void *FieldValue, UINT32 ArraySize) memcpy(&IMPF->metalHollow[0], FieldValue, ArraySize); break; case 42: //metalSheet + if(FieldValue == NULL) + break; ArraySize = strlen((STRING)FieldValue); if(ArraySize > 29) break; @@ -518,6 +528,8 @@ bool WRLDRecord::SetField(FIELD_IDENTIFIERS, void *FieldValue, UINT32 ArraySize) memcpy(&IMPF->metalSheet[0], FieldValue, ArraySize); break; case 43: //wood + if(FieldValue == NULL) + break; ArraySize = strlen((STRING)FieldValue); if(ArraySize > 29) break; @@ -526,6 +538,8 @@ bool WRLDRecord::SetField(FIELD_IDENTIFIERS, void *FieldValue, UINT32 ArraySize) memcpy(&IMPF->wood[0], FieldValue, ArraySize); break; case 44: //sand + if(FieldValue == NULL) + break; ArraySize = strlen((STRING)FieldValue); if(ArraySize > 29) break; @@ -534,6 +548,8 @@ bool WRLDRecord::SetField(FIELD_IDENTIFIERS, void *FieldValue, UINT32 ArraySize) memcpy(&IMPF->sand[0], FieldValue, ArraySize); break; case 45: //dirt + if(FieldValue == NULL) + break; ArraySize = strlen((STRING)FieldValue); if(ArraySize > 29) break; @@ -542,6 +558,8 @@ bool WRLDRecord::SetField(FIELD_IDENTIFIERS, void *FieldValue, UINT32 ArraySize) memcpy(&IMPF->dirt[0], FieldValue, ArraySize); break; case 46: //grass + if(FieldValue == NULL) + break; ArraySize = strlen((STRING)FieldValue); if(ArraySize > 29) break; @@ -550,6 +568,8 @@ bool WRLDRecord::SetField(FIELD_IDENTIFIERS, void *FieldValue, UINT32 ArraySize) memcpy(&IMPF->grass[0], FieldValue, ArraySize); break; case 47: //water + if(FieldValue == NULL) + break; ArraySize = strlen((STRING)FieldValue); if(ArraySize > 29) break; diff --git a/CBash/FalloutNewVegas/Records/CELLRecord.cpp b/CBash/FalloutNewVegas/Records/CELLRecord.cpp index f368edd..ed0d4c4 100644 --- a/CBash/FalloutNewVegas/Records/CELLRecord.cpp +++ b/CBash/FalloutNewVegas/Records/CELLRecord.cpp @@ -702,7 +702,7 @@ SINT32 CELLRecord::WriteRecord(FileWriter &writer) WRITE(DATA); WRITE(XCLC); WRITE(XCLL); - WRITE(IMPS); + WRITE(IMPS); WRITE(IMPF); if(LNAM.value != 0 || LTMP.value != 0) { diff --git a/CBash/FalloutNewVegas/Records/CSTYRecord.h b/CBash/FalloutNewVegas/Records/CSTYRecord.h index 23cf4d7..94ce6da 100644 --- a/CBash/FalloutNewVegas/Records/CSTYRecord.h +++ b/CBash/FalloutNewVegas/Records/CSTYRecord.h @@ -68,7 +68,7 @@ class CSTYRecord : public FNVRecord //Combat Style struct CSTYCSSD // Simple { FLOAT32 coverRadius, coverChance, waitTimerMin, waitTimerMax, - waitFireTimerMin, waitFireTimerMax, fireTimerMin, + waitFireTimerMin, waitFireTimerMax, fireTimerMin, fireTimerMax, rangedRangeMultMin; UINT8 unused1[4]; UINT32 weaponRestrictions; @@ -96,8 +96,8 @@ class CSTYRecord : public FNVRecord //Combat Style enum restrictionTypes { - eNone = 0, - eMeleeOnly = 1, + eNone = 0, + eMeleeOnly = 1, eRangedOnly = 2 }; diff --git a/CBash/FalloutNewVegas/Records/DEBRRecord.cpp b/CBash/FalloutNewVegas/Records/DEBRRecord.cpp index 0e8ac48..a7db465 100644 --- a/CBash/FalloutNewVegas/Records/DEBRRecord.cpp +++ b/CBash/FalloutNewVegas/Records/DEBRRecord.cpp @@ -24,28 +24,198 @@ GPL License and Copyright Notice ============================================ namespace FNV { +DEBRRecord::DEBRModel::DEBRModel(): + percentage(0), + modPath(NULL), + flags(0) + { + // + } + +DEBRRecord::DEBRModel::~DEBRModel() + { + delete []modPath; + } + bool DEBRRecord::DEBRModel::IsHasCollisionData() { - if(!Dummy.IsLoaded()) return false; - return (Dummy->flags & fIsHasCollisionData) != 0; + return (flags & fIsHasCollisionData) != 0; } void DEBRRecord::DEBRModel::IsHasCollisionData(bool value) { - if(!Dummy.IsLoaded()) return; - Dummy->flags = value ? (Dummy->flags | fIsHasCollisionData) : (Dummy->flags & ~fIsHasCollisionData); + flags = value ? (flags | fIsHasCollisionData) : (flags & ~fIsHasCollisionData); } bool DEBRRecord::DEBRModel::IsFlagMask(UINT8 Mask, bool Exact) { - if(!Dummy.IsLoaded()) return false; - return Exact ? ((Dummy->flags & Mask) == Mask) : ((Dummy->flags & Mask) != 0); + return Exact ? ((flags & Mask) == Mask) : ((flags & Mask) != 0); } void DEBRRecord::DEBRModel::SetFlagMask(UINT8 Mask) { - Dummy.Load(); - Dummy->flags = Mask; + flags = Mask; + } + +bool DEBRRecord::DEBRModel::Read(unsigned char *buffer, UINT32 subSize, UINT32 &curPos) + { + if(subSize < 3) + { + printf("DEBRModel: Warning - Unable to parse chunk (%c%c%c%c). Size " + "of chunk (%u) is less than the minimum size of the subrecord (%u). " + "The chunk has been skipped.\n", + (buffer + curPos)[-6], (buffer + curPos)[-5], (buffer + curPos)[-4], (buffer + curPos)[-3], + subSize, 3); + curPos += subSize; + return false; + } + memcpy(&percentage, buffer + curPos, 1); + curPos += 1; + + UINT32 size = (UINT32)strlen((STRING)(buffer + curPos)) + 1; + modPath = new char[size]; + strcpy_s(modPath, size, (STRING)(buffer + curPos)); + curPos += size; + + memcpy(&flags, buffer + curPos, 1); + curPos += 1; + + size += 2; + if(size != subSize) + { + printf("DEBRModel: Warning - Unable to parse chunk (%c%c%c%c). Size " + "of chunk (%u) is not equal to the parsed size (%u). " + "The loaded fields are likely corrupt.\n", + (buffer + curPos)[-6], (buffer + curPos)[-5], (buffer + curPos)[-4], (buffer + curPos)[-3], + subSize, size); + } + return true; + } + +void DEBRRecord::DEBRModel::Write(FileWriter &writer) + { + UINT32 size = 3; //null terminator, percentage, and flags + if(modPath != NULL) + { + size += (UINT32)strlen(modPath); + writer.record_write_subheader(REV32(DATA), size); + writer.record_write(&percentage, 1); + writer.record_write(modPath, size - 2); + writer.record_write(&flags, 1); + } + else + { + writer.record_write_subheader(REV32(DATA), size); + writer.record_write(&percentage, 1); + size = 0; + writer.record_write(&size, 1); //single null terminator + writer.record_write(&flags, 1); + } + WRITE(MODT); + } + +bool DEBRRecord::DEBRModel::operator ==(const DEBRModel &other) const + { + return (flags == other.flags && + percentage == other.percentage && + (icmps(modPath, other.modPath) == 0) && + MODT == other.MODT); + } + +bool DEBRRecord::DEBRModel::operator !=(const DEBRModel &other) const + { + return !(*this == other); + } + +DEBRRecord::DEBRModels::DEBRModels() + { + // + } + +DEBRRecord::DEBRModels::~DEBRModels() + { + Unload(); + } + +bool DEBRRecord::DEBRModels::IsLoaded() const + { + return (MODS.size() != 0); + } + +void DEBRRecord::DEBRModels::Load() + { + // + } + +void DEBRRecord::DEBRModels::Unload() + { + for(UINT32 x = 0; x < MODS.size(); ++x) + delete MODS[x]; + MODS.clear(); + } + +void DEBRRecord::DEBRModels::resize(UINT32 newSize) + { + //Shrink + UINT32 size = MODS.size(); + for(; size > newSize;) + delete MODS[--size]; + MODS.resize(newSize); + //Grow + for(; size < newSize;) + MODS[size++] = new DEBRModel; + } + +void DEBRRecord::DEBRModels::Write(FileWriter &writer) + { + for(UINT32 p = 0; p < MODS.size(); p++) + MODS[p]->Write(writer); + } + +DEBRRecord::DEBRModels& DEBRRecord::DEBRModels::operator = (const DEBRModels &rhs) + { + if(this != &rhs) + { + Unload(); + if(rhs.MODS.size() != 0) + { + MODS.resize(rhs.MODS.size()); + UINT32 pathSize = 0; + for(UINT32 p = 0; p < rhs.MODS.size(); p++) + { + MODS[p] = new DEBRModel; + MODS[p]->percentage = rhs.MODS[p]->percentage; + + if(rhs.MODS[p]->modPath != NULL) + { + pathSize = (UINT32)strlen(rhs.MODS[p]->modPath) + 1; + MODS[p]->modPath = new char[pathSize]; + strcpy_s(MODS[p]->modPath, pathSize, rhs.MODS[p]->modPath); + } + MODS[p]->flags = rhs.MODS[p]->flags; + } + } + } + return *this; + } + +bool DEBRRecord::DEBRModels::operator ==(const DEBRModels &other) const + { + if(MODS.size() == other.MODS.size()) + { + //Not sure if record order matters on debris models, so equality testing is a guess + //Fix-up later + for(UINT32 x = 0; x < MODS.size(); ++x) + if(*MODS[x] != *other.MODS[x]) + return false; + return true; + } + return false; + } + +bool DEBRRecord::DEBRModels::operator !=(const DEBRModels &other) const + { + return !(*this == other); } DEBRRecord::DEBRRecord(unsigned char *_recData): @@ -75,8 +245,7 @@ DEBRRecord::DEBRRecord(DEBRRecord *srcRecord): } EDID = srcRecord->EDID; - DATA = srcRecord->DATA; - MODT = srcRecord->MODT; + Models = srcRecord->Models; return; } @@ -85,15 +254,6 @@ DEBRRecord::~DEBRRecord() // } -bool DEBRRecord::VisitFormIDs(FormIDOp &op) - { - if(!IsLoaded()) - return false; - - - return op.Stop(); - } - UINT32 DEBRRecord::GetType() { return REV32(DEBR); @@ -130,10 +290,13 @@ SINT32 DEBRRecord::ParseRecord(unsigned char *buffer, const UINT32 &recSize) EDID.Read(buffer, subSize, curPos); break; case REV32(DATA): - DATA.Read(buffer, subSize, curPos); + Models.MODS.push_back(new DEBRModel); + Models.MODS.back()->Read(buffer, subSize, curPos); break; case REV32(MODT): - MODT.Read(buffer, subSize, curPos); + if(Models.MODS.size() == 0) + Models.MODS.push_back(new DEBRModel); + Models.MODS.back()->MODT.Read(buffer, subSize, curPos); break; default: //printf("FileName = %s\n", FileName); @@ -152,25 +315,21 @@ SINT32 DEBRRecord::Unload() IsChanged(false); IsLoaded(false); EDID.Unload(); - DATA.Unload(); - MODT.Unload(); + Models.Unload(); return 1; } SINT32 DEBRRecord::WriteRecord(FileWriter &writer) { WRITE(EDID); - WRITE(DATA); - WRITE(MODT); - + Models.Write(writer); return -1; } bool DEBRRecord::operator ==(const DEBRRecord &other) const { return (EDID.equalsi(other.EDID) && - DATA == other.DATA && - MODT == other.MODT); + Models == other.Models); } bool DEBRRecord::operator !=(const DEBRRecord &other) const diff --git a/CBash/FalloutNewVegas/Records/DEBRRecord.h b/CBash/FalloutNewVegas/Records/DEBRRecord.h index 658533b..ef395d7 100644 --- a/CBash/FalloutNewVegas/Records/DEBRRecord.h +++ b/CBash/FalloutNewVegas/Records/DEBRRecord.h @@ -28,27 +28,20 @@ namespace FNV class DEBRRecord : public FNVRecord //Debris { private: - struct DEBRDATA + struct DEBRModel { UINT8 percentage; - STRING MODL; + STRING modPath; UINT8 flags; - DEBRDATA(); - ~DEBRDATA(); + RawRecord MODT; - bool operator ==(const DEBRDATA &other) const; - bool operator !=(const DEBRDATA &other) const; - }; - - struct DEBRModel // Model - { - ReqSubRecord DATA; // Data - RawRecord MODT; //Texture Files Hashes + DEBRModel(); + ~DEBRModel(); enum flagsFlags { - fIsHasCollisionData = 0x00000001 + fIsHasCollisionData = 0x01 }; bool IsHasCollisionData(); @@ -56,20 +49,41 @@ class DEBRRecord : public FNVRecord //Debris bool IsFlagMask(UINT8 Mask, bool Exact=false); void SetFlagMask(UINT8 Mask); + bool Read(unsigned char *buffer, UINT32 subSize, UINT32 &curPos); + void Write(FileWriter &writer); + bool operator ==(const DEBRModel &other) const; bool operator !=(const DEBRModel &other) const; }; + struct DEBRModels + { + std::vector MODS; + + DEBRModels(); + ~DEBRModels(); + + bool IsLoaded() const; + void Load(); + void Unload(); + + void resize(UINT32 newSize); + + void Write(FileWriter &writer); + + DEBRModels& operator = (const DEBRModels &rhs); + bool operator ==(const DEBRModels &other) const; + bool operator !=(const DEBRModels &other) const; + }; + public: StringRecord EDID; //Editor ID - std::vector Models; //Models + DEBRModels Models; //Models DEBRRecord(unsigned char *_recData=NULL); DEBRRecord(DEBRRecord *srcRecord); ~DEBRRecord(); - bool VisitFormIDs(FormIDOp &op); - UINT32 GetFieldAttribute(DEFAULTED_FIELD_IDENTIFIERS, UINT32 WhichAttribute=0); void * GetField(DEFAULTED_FIELD_IDENTIFIERS, void **FieldValues=NULL); bool SetField(DEFAULTED_FIELD_IDENTIFIERS, void *FieldValue=NULL, UINT32 ArraySize=0); diff --git a/CBash/FalloutNewVegas/Records/DIALRecord.cpp b/CBash/FalloutNewVegas/Records/DIALRecord.cpp index b3225ef..b2e7033 100644 --- a/CBash/FalloutNewVegas/Records/DIALRecord.cpp +++ b/CBash/FalloutNewVegas/Records/DIALRecord.cpp @@ -441,7 +441,7 @@ SINT32 DIALRecord::Unload() { IsChanged(false); IsLoaded(false); - + EDID.Unload(); QSTI.Unload(); QSTR.Unload(); diff --git a/CBash/FalloutNewVegas/Records/EFSHRecord.cpp b/CBash/FalloutNewVegas/Records/EFSHRecord.cpp index 7761819..c50cd5a 100644 --- a/CBash/FalloutNewVegas/Records/EFSHRecord.cpp +++ b/CBash/FalloutNewVegas/Records/EFSHRecord.cpp @@ -24,6 +24,173 @@ GPL License and Copyright Notice ============================================ namespace FNV { +EFSHRecord::EFSHDATA::EFSHDATA(): + flags(0), + memSBlend(0), + memBlendOp(0), + memZFunc(0), + fillAIn(0.0f), + fillAFull(0.0f), + fillAOut(0.0f), + fillAPRatio(0.0f), + fillAAmp(0.0f), + fillAFreq(0.0f), + fillAnimSpdU(0.0f), + fillAnimSpdV(0.0f), + edgeEffOff(0.0f), + edgeEffAIn(0.0f), + edgeEffAFull(0.0f), + edgeEffAOut(0.0f), + edgeEffAPRatio(0.0f), + edgeEffAAmp(0.0f), + edgeEffAFreq(0.0f), + fillAFRatio(0.0f), + edgeEffAFRatio(0.0f), + memDBlend(0), + partSBlend(0), + partBlendOp(0), + partZFunc(0), + partDBlend(0), + partBUp(0.0f), + partBFull(0.0f), + partBDown(0.0f), + partBFRatio(0.0f), + partBPRatio(0.0f), + partLTime(0.0f), + partLDelta(0.0f), + partNSpd(0.0f), + partNAcc(0.0f), + partVel1(0.0f), + partVel2(0.0f), + partVel3(0.0f), + partAcc1(0.0f), + partAcc2(0.0f), + partAcc3(0.0f), + partKey1(0.0f), + partKey2(0.0f), + partKey1Time(0.0f), + partKey2Time(0.0f), + key1A(0.0f), + key2A(0.0f), + key3A(0.0f), + key1Time(0.0f), + key2Time(0.0f), + key3Time(0.0f), + partInitSpd(0.0f), + partInitRot(0.0f), + partInitRotDelta(0.0f), + partRotSpd(0.0f), + partRotDelta(0.0f), + addon(0), + holesSTime(0.0f), + holesETime(0.0f), + holesSValue(0.0f), + holesEValue(0.0f), + edgeWidth(0.0f), + explWindSpd(0.0f), + textCountU(0), + textCountV(0), + addonFITime(0.0f), + addonFOTime(0.0f), + addonScaleStart(0.0f), + addonScaleEnd(0.0f), + addonScaleInTime(0.0f), + addonScaleOutTime(0.0f) + { + memset(&unused1[0], 0x00, sizeof(unused1)); + } + +EFSHRecord::EFSHDATA::~EFSHDATA() + { + // + } + +bool EFSHRecord::EFSHDATA::operator ==(const EFSHDATA &other) const + { + return (flags == other.flags && + memSBlend == other.memSBlend && + memBlendOp == other.memBlendOp && + memZFunc == other.memZFunc && + memDBlend == other.memDBlend && + partSBlend == other.partSBlend && + partBlendOp == other.partBlendOp && + partZFunc == other.partZFunc && + partDBlend == other.partDBlend && + addon == other.addon && + fill == other.fill && + edgeEff == other.edgeEff && + key1 == other.key1 && + key2 == other.key2 && + key3 == other.key3 && + edge == other.edge && + textCountU == other.textCountU && + textCountV == other.textCountV && + AlmostEqual(fillAIn,other.fillAIn,2) && + AlmostEqual(fillAFull,other.fillAFull,2) && + AlmostEqual(fillAOut,other.fillAOut,2) && + AlmostEqual(fillAPRatio,other.fillAPRatio,2) && + AlmostEqual(fillAAmp,other.fillAAmp,2) && + AlmostEqual(fillAFreq,other.fillAFreq,2) && + AlmostEqual(fillAnimSpdU,other.fillAnimSpdU,2) && + AlmostEqual(fillAnimSpdV,other.fillAnimSpdV,2) && + AlmostEqual(edgeEffOff,other.edgeEffOff,2) && + AlmostEqual(edgeEffAIn,other.edgeEffAIn,2) && + AlmostEqual(edgeEffAFull,other.edgeEffAFull,2) && + AlmostEqual(edgeEffAOut,other.edgeEffAOut,2) && + AlmostEqual(edgeEffAPRatio,other.edgeEffAPRatio,2) && + AlmostEqual(edgeEffAAmp,other.edgeEffAAmp,2) && + AlmostEqual(edgeEffAFreq,other.edgeEffAFreq,2) && + AlmostEqual(fillAFRatio,other.fillAFRatio,2) && + AlmostEqual(edgeEffAFRatio,other.edgeEffAFRatio,2) && + AlmostEqual(partBUp,other.partBUp,2) && + AlmostEqual(partBFull,other.partBFull,2) && + AlmostEqual(partBDown,other.partBDown,2) && + AlmostEqual(partBFRatio,other.partBFRatio,2) && + AlmostEqual(partBPRatio,other.partBPRatio,2) && + AlmostEqual(partLTime,other.partLTime,2) && + AlmostEqual(partLDelta,other.partLDelta,2) && + AlmostEqual(partNSpd,other.partNSpd,2) && + AlmostEqual(partNAcc,other.partNAcc,2) && + AlmostEqual(partVel1,other.partVel1,2) && + AlmostEqual(partVel2,other.partVel2,2) && + AlmostEqual(partVel3,other.partVel3,2) && + AlmostEqual(partAcc1,other.partAcc1,2) && + AlmostEqual(partAcc2,other.partAcc2,2) && + AlmostEqual(partAcc3,other.partAcc3,2) && + AlmostEqual(partKey1,other.partKey1,2) && + AlmostEqual(partKey2,other.partKey2,2) && + AlmostEqual(partKey1Time,other.partKey1Time,2) && + AlmostEqual(partKey2Time,other.partKey2Time,2) && + AlmostEqual(key1A,other.key1A,2) && + AlmostEqual(key2A,other.key2A,2) && + AlmostEqual(key3A,other.key3A,2) && + AlmostEqual(key1Time,other.key1Time,2) && + AlmostEqual(key2Time,other.key2Time,2) && + AlmostEqual(key3Time,other.key3Time,2) && + AlmostEqual(partInitSpd,other.partInitSpd,2) && + AlmostEqual(partInitRot,other.partInitRot,2) && + AlmostEqual(partInitRotDelta,other.partInitRotDelta,2) && + AlmostEqual(partRotSpd,other.partRotSpd,2) && + AlmostEqual(partRotDelta,other.partRotDelta,2) && + AlmostEqual(holesSTime,other.holesSTime,2) && + AlmostEqual(holesETime,other.holesETime,2) && + AlmostEqual(holesSValue,other.holesSValue,2) && + AlmostEqual(holesEValue,other.holesEValue,2) && + AlmostEqual(edgeWidth,other.edgeWidth,2) && + AlmostEqual(explWindSpd,other.explWindSpd,2) && + AlmostEqual(addonFITime,other.addonFITime,2) && + AlmostEqual(addonFOTime,other.addonFOTime,2) && + AlmostEqual(addonScaleStart,other.addonScaleStart,2) && + AlmostEqual(addonScaleEnd,other.addonScaleEnd,2) && + AlmostEqual(addonScaleInTime,other.addonScaleInTime,2) && + AlmostEqual(addonScaleOutTime,other.addonScaleOutTime,2)); + } + +bool EFSHRecord::EFSHDATA::operator !=(const EFSHDATA &other) const + { + return !(*this == other); + } + EFSHRecord::EFSHRecord(unsigned char *_recData): FNVRecord(_recData) { @@ -68,14 +235,11 @@ bool EFSHRecord::VisitFormIDs(FormIDOp &op) if(!IsLoaded()) return false; - //if(DATA.IsLoaded()) //FILL IN MANUALLY - // op.Accept(DATA->value); + op.Accept(DATA.value.addon); return op.Stop(); } - - bool EFSHRecord::IsNoMemShader() { return (DATA.value.flags & fIsNoMemShader) != 0; @@ -229,6 +393,7 @@ SINT32 EFSHRecord::Unload() { IsChanged(false); IsLoaded(false); + EDID.Unload(); ICON.Unload(); ICO2.Unload(); @@ -244,17 +409,16 @@ SINT32 EFSHRecord::WriteRecord(FileWriter &writer) WRITE(ICO2); WRITE(NAM7); WRITE(DATA); - return -1; } bool EFSHRecord::operator ==(const EFSHRecord &other) const { - return (EDID.equalsi(other.EDID) && + return (DATA == other.DATA && + EDID.equalsi(other.EDID) && ICON.equalsi(other.ICON) && ICO2.equalsi(other.ICO2) && - NAM7.equalsi(other.NAM7) && - DATA == other.DATA); + NAM7.equalsi(other.NAM7)); } bool EFSHRecord::operator !=(const EFSHRecord &other) const diff --git a/CBash/FalloutNewVegas/Records/EFSHRecord.h b/CBash/FalloutNewVegas/Records/EFSHRecord.h index 571bbb9..a349578 100644 --- a/CBash/FalloutNewVegas/Records/EFSHRecord.h +++ b/CBash/FalloutNewVegas/Records/EFSHRecord.h @@ -76,7 +76,7 @@ class EFSHRecord : public FNVRecord //Effect Shader StringRecord ICON; //Fill Texture StringRecord ICO2; //Particle Shader Texture StringRecord NAM7; //Holes Texture - OptSubRecord DATA; //DATA ,, Struct + ReqSubRecord DATA; //Data EFSHRecord(unsigned char *_recData=NULL); EFSHRecord(EFSHRecord *srcRecord); diff --git a/CBash/FalloutNewVegas/Records/EXPLRecord.cpp b/CBash/FalloutNewVegas/Records/EXPLRecord.cpp index e0be48c..ba0d271 100644 --- a/CBash/FalloutNewVegas/Records/EXPLRecord.cpp +++ b/CBash/FalloutNewVegas/Records/EXPLRecord.cpp @@ -24,6 +24,51 @@ GPL License and Copyright Notice ============================================ namespace FNV { +EXPLRecord::EXPLDATA::EXPLDATA(): + force(0.0f), + damage(0.0f), + radius(0.0f), + light(0), + sound1(0), + flags(0), + ISRadius(0.0f), + impactDataSet(0), + sound2(0), + radLevel(0.0f), + radTime(0.0f), + radRadius(0.0f), + soundLevel(0) + { + // + } + +EXPLRecord::EXPLDATA::~EXPLDATA() + { + // + } + +bool EXPLRecord::EXPLDATA::operator ==(const EXPLDATA &other) const + { + return (light == other.light && + sound1 == other.sound1 && + flags == other.flags && + impactDataSet == other.impactDataSet && + sound2 == other.sound2 && + soundLevel == other.soundLevel && + AlmostEqual(force,other.force,2) && + AlmostEqual(damage,other.damage,2) && + AlmostEqual(radius,other.radius,2) && + AlmostEqual(ISRadius,other.ISRadius,2) && + AlmostEqual(radLevel,other.radLevel,2) && + AlmostEqual(radTime,other.radTime,2) && + AlmostEqual(radRadius,other.radRadius,2)); + } + +bool EXPLRecord::EXPLDATA::operator !=(const EXPLDATA &other) const + { + return !(*this == other); + } + EXPLRecord::EXPLRecord(unsigned char *_recData): FNVRecord(_recData) { @@ -53,9 +98,7 @@ EXPLRecord::EXPLRecord(EXPLRecord *srcRecord): EDID = srcRecord->EDID; OBND = srcRecord->OBND; FULL = srcRecord->FULL; - MODL = srcRecord->MODL; - EITM = srcRecord->EITM; MNAM = srcRecord->MNAM; DATA = srcRecord->DATA; @@ -79,159 +122,137 @@ bool EXPLRecord::VisitFormIDs(FormIDOp &op) op.Accept(MODL->Textures.MODS[x]->texture); } if(EITM.IsLoaded()) - op.Accept(EITM->value); + op.Accept(EITM.value); if(MNAM.IsLoaded()) - op.Accept(MNAM->value); - //if(DATA.IsLoaded()) //FILL IN MANUALLY - // op.Accept(DATA->value); + op.Accept(MNAM.value); + op.Accept(DATA.value.light); + op.Accept(DATA.value.sound1); + op.Accept(DATA.value.impactDataSet); + op.Accept(DATA.value.sound2); if(INAM.IsLoaded()) - op.Accept(INAM->value); + op.Accept(INAM.value); return op.Stop(); } bool EXPLRecord::IsUnknown1() { - if(!Dummy.IsLoaded()) return false; - return (Dummy->flags & fIsUnknown1) != 0; + return (DATA.value.flags & fIsUnknown1) != 0; } void EXPLRecord::IsUnknown1(bool value) { - if(!Dummy.IsLoaded()) return; - Dummy->flags = value ? (Dummy->flags | fIsUnknown1) : (Dummy->flags & ~fIsUnknown1); + DATA.value.flags = value ? (DATA.value.flags | fIsUnknown1) : (DATA.value.flags & ~fIsUnknown1); } bool EXPLRecord::IsAlwaysUsesWorldOrientation() { - if(!Dummy.IsLoaded()) return false; - return (Dummy->flags & fIsAlwaysUsesWorldOrientation) != 0; + return (DATA.value.flags & fIsAlwaysUsesWorldOrientation) != 0; } void EXPLRecord::IsAlwaysUsesWorldOrientation(bool value) { - if(!Dummy.IsLoaded()) return; - Dummy->flags = value ? (Dummy->flags | fIsAlwaysUsesWorldOrientation) : (Dummy->flags & ~fIsAlwaysUsesWorldOrientation); + DATA.value.flags = value ? (DATA.value.flags | fIsAlwaysUsesWorldOrientation) : (DATA.value.flags & ~fIsAlwaysUsesWorldOrientation); } bool EXPLRecord::IsAlwaysKnockDown() { - if(!Dummy.IsLoaded()) return false; - return (Dummy->flags & fIsAlwaysKnockDown) != 0; + return (DATA.value.flags & fIsAlwaysKnockDown) != 0; } void EXPLRecord::IsAlwaysKnockDown(bool value) { - if(!Dummy.IsLoaded()) return; - Dummy->flags = value ? (Dummy->flags | fIsAlwaysKnockDown) : (Dummy->flags & ~fIsAlwaysKnockDown); + DATA.value.flags = value ? (DATA.value.flags | fIsAlwaysKnockDown) : (DATA.value.flags & ~fIsAlwaysKnockDown); } bool EXPLRecord::IsFormulaKnockDown() { - if(!Dummy.IsLoaded()) return false; - return (Dummy->flags & fIsFormulaKnockDown) != 0; + return (DATA.value.flags & fIsFormulaKnockDown) != 0; } void EXPLRecord::IsFormulaKnockDown(bool value) { - if(!Dummy.IsLoaded()) return; - Dummy->flags = value ? (Dummy->flags | fIsFormulaKnockDown) : (Dummy->flags & ~fIsFormulaKnockDown); + DATA.value.flags = value ? (DATA.value.flags | fIsFormulaKnockDown) : (DATA.value.flags & ~fIsFormulaKnockDown); } bool EXPLRecord::IsIgnoreLOS() { - if(!Dummy.IsLoaded()) return false; - return (Dummy->flags & fIsIgnoreLOS) != 0; + return (DATA.value.flags & fIsIgnoreLOS) != 0; } void EXPLRecord::IsIgnoreLOS(bool value) { - if(!Dummy.IsLoaded()) return; - Dummy->flags = value ? (Dummy->flags | fIsIgnoreLOS) : (Dummy->flags & ~fIsIgnoreLOS); + DATA.value.flags = value ? (DATA.value.flags | fIsIgnoreLOS) : (DATA.value.flags & ~fIsIgnoreLOS); } bool EXPLRecord::IsPushExplosionSourceRefOnly() { - if(!Dummy.IsLoaded()) return false; - return (Dummy->flags & fIsPushExplosionSourceRefOnly) != 0; + return (DATA.value.flags & fIsPushExplosionSourceRefOnly) != 0; } void EXPLRecord::IsPushExplosionSourceRefOnly(bool value) { - if(!Dummy.IsLoaded()) return; - Dummy->flags = value ? (Dummy->flags | fIsPushExplosionSourceRefOnly) : (Dummy->flags & ~fIsPushExplosionSourceRefOnly); + DATA.value.flags = value ? (DATA.value.flags | fIsPushExplosionSourceRefOnly) : (DATA.value.flags & ~fIsPushExplosionSourceRefOnly); } bool EXPLRecord::IsIgnoreImageSpaceSwap() { - if(!Dummy.IsLoaded()) return false; - return (Dummy->flags & fIsIgnoreImageSpaceSwap) != 0; + return (DATA.value.flags & fIsIgnoreImageSpaceSwap) != 0; } void EXPLRecord::IsIgnoreImageSpaceSwap(bool value) { - if(!Dummy.IsLoaded()) return; - Dummy->flags = value ? (Dummy->flags | fIsIgnoreImageSpaceSwap) : (Dummy->flags & ~fIsIgnoreImageSpaceSwap); + DATA.value.flags = value ? (DATA.value.flags | fIsIgnoreImageSpaceSwap) : (DATA.value.flags & ~fIsIgnoreImageSpaceSwap); } bool EXPLRecord::IsFlagMask(UINT32 Mask, bool Exact) { - if(!Dummy.IsLoaded()) return false; - return Exact ? ((Dummy->flags & Mask) == Mask) : ((Dummy->flags & Mask) != 0); + return Exact ? ((DATA.value.flags & Mask) == Mask) : ((DATA.value.flags & Mask) != 0); } void EXPLRecord::SetFlagMask(UINT32 Mask) { - Dummy.Load(); - Dummy->flags = Mask; + DATA.value.flags = Mask; } bool EXPLRecord::IsLoud() { - if(!Dummy.IsLoaded()) return false; - return (Dummy->type == eLoud); + return DATA.value.soundLevel == eLoud; } void EXPLRecord::IsLoud(bool value) { - if(!Dummy.IsLoaded()) return; - Dummy->flags = value ? eLoud : eDummyDefault; + DATA.value.soundLevel = value ? eLoud : eNormal; } bool EXPLRecord::IsNormal() { - if(!Dummy.IsLoaded()) return false; - return (Dummy->type == eNormal); + return DATA.value.soundLevel == eNormal; } void EXPLRecord::IsNormal(bool value) { - if(!Dummy.IsLoaded()) return; - Dummy->flags = value ? eNormal : eDummyDefault; + DATA.value.soundLevel = value ? eNormal : eLoud; } bool EXPLRecord::IsSilent() { - if(!Dummy.IsLoaded()) return false; - return (Dummy->type == eSilent); + return DATA.value.soundLevel == eSilent; } void EXPLRecord::IsSilent(bool value) { - if(!Dummy.IsLoaded()) return; - Dummy->flags = value ? eSilent : eDummyDefault; + DATA.value.soundLevel = value ? eSilent : eLoud; } bool EXPLRecord::IsSoundLevelType(UINT8 Type) { - if(!Dummy.IsLoaded()) return false; - return Dummy->type == Type; + return DATA.value.soundLevel == Type; } void EXPLRecord::SetSoundLevelType(UINT8 Type) { - Dummy.Load(); - Dummy->flags = Mask; + DATA.value.soundLevel = Type; } UINT32 EXPLRecord::GetType() @@ -323,6 +344,7 @@ SINT32 EXPLRecord::Unload() { IsChanged(false); IsLoaded(false); + EDID.Unload(); OBND.Unload(); FULL.Unload(); @@ -339,27 +361,24 @@ SINT32 EXPLRecord::WriteRecord(FileWriter &writer) WRITE(EDID); WRITE(OBND); WRITE(FULL); - MODL.Write(writer); - WRITE(EITM); WRITE(MNAM); WRITE(DATA); WRITE(INAM); - return -1; } bool EXPLRecord::operator ==(const EXPLRecord &other) const { - return (EDID.equalsi(other.EDID) && - OBND == other.OBND && - FULL.equals(other.FULL) && - MODL == other.MODL && + return (OBND == other.OBND && EITM == other.EITM && MNAM == other.MNAM && DATA == other.DATA && - INAM == other.INAM); + INAM == other.INAM && + MODL == other.MODL && + EDID.equalsi(other.EDID) && + FULL.equals(other.FULL)); } bool EXPLRecord::operator !=(const EXPLRecord &other) const diff --git a/CBash/FalloutNewVegas/Records/EXPLRecord.h b/CBash/FalloutNewVegas/Records/EXPLRecord.h index 307e2b6..7832dcd 100644 --- a/CBash/FalloutNewVegas/Records/EXPLRecord.h +++ b/CBash/FalloutNewVegas/Records/EXPLRecord.h @@ -70,7 +70,7 @@ class EXPLRecord : public FNVRecord //Explosion OptSubRecord MODL; //Model OptSimpleSubRecord EITM; //Object Effect OptSimpleSubRecord MNAM; //Image Space Modifier - OptSubRecord DATA; //Data + ReqSubRecord DATA; //Data OptSimpleSubRecord INAM; //Placed Impact Object EXPLRecord(unsigned char *_recData=NULL); diff --git a/CBash/FalloutNewVegas/Records/GMSTRecord.cpp b/CBash/FalloutNewVegas/Records/GMSTRecord.cpp index 0e34ddc..5972b8e 100644 --- a/CBash/FalloutNewVegas/Records/GMSTRecord.cpp +++ b/CBash/FalloutNewVegas/Records/GMSTRecord.cpp @@ -66,7 +66,7 @@ bool GMSTRecord::GMSTDATA::operator ==(const GMSTDATA &other) const switch(format) { case 's': - return strcmp(s, other.s) == 0; + return cmps(s, other.s) == 0; case 'i': return i == other.i; case 'f': diff --git a/CBash/FalloutNewVegas/Records/IDLERecord.h b/CBash/FalloutNewVegas/Records/IDLERecord.h index 140720b..4b259f4 100644 --- a/CBash/FalloutNewVegas/Records/IDLERecord.h +++ b/CBash/FalloutNewVegas/Records/IDLERecord.h @@ -44,13 +44,13 @@ class IDLERecord : public FNVRecord //Idle Animation enum groupType { - eIdle = 0, - eMovement = 1, + eIdle = 0, + eMovement = 1, eLeftArm = 2, eLeftHand = 3, - eWeapon = 4, - eWeaponUp = 5, - eWeaponDown = 6, + eWeapon = 4, + eWeaponUp = 5, + eWeaponDown = 6, eSpecialIdle = 7, eWholeBody = 20, eUpperBody = 21 @@ -58,7 +58,7 @@ class IDLERecord : public FNVRecord //Idle Animation enum groupFlag { - fIsUnknown1 = 0x40, + fIsUnknown1 = 0x40, fIsNotReturnFile = 0x80 }; diff --git a/CBash/FalloutNewVegas/Records/INFORecord.cpp b/CBash/FalloutNewVegas/Records/INFORecord.cpp index 18bacc6..e951717 100644 --- a/CBash/FalloutNewVegas/Records/INFORecord.cpp +++ b/CBash/FalloutNewVegas/Records/INFORecord.cpp @@ -476,7 +476,7 @@ bool INFORecord::IsTopic() } void INFORecord::IsTopic(bool value) - { + { DATA.value.dialType = value ? eTopic : eConversation; } @@ -895,7 +895,7 @@ SINT32 INFORecord::ParseRecord(unsigned char *buffer, const UINT32 &recSize) break; } break; - case REV32(SLSD): + case REV32(SLSD): switch(lastChunk) { case REV32(NONE): diff --git a/CBash/FalloutNewVegas/Records/LANDRecord.h b/CBash/FalloutNewVegas/Records/LANDRecord.h index bff59f9..7fdbc27 100644 --- a/CBash/FalloutNewVegas/Records/LANDRecord.h +++ b/CBash/FalloutNewVegas/Records/LANDRecord.h @@ -113,7 +113,7 @@ class LANDRecord : public FNVRecord //Landscape struct LANDLAYERS { ReqSubRecord ATXT; - UnorderedPackedArray VTXT; //Actually ordered... + UnorderedPackedArray VTXT; //Actually ordered... //Record order doesn't matter on opacities, so equality testing isn't easy //Instead, they're keyed by position (VTXT.value.position) //The proper solution would be to see if the opacity at each position matches diff --git a/CBash/FalloutNewVegas/Records/PACKRecord.h b/CBash/FalloutNewVegas/Records/PACKRecord.h index 12b2cd3..e5399ef 100644 --- a/CBash/FalloutNewVegas/Records/PACKRecord.h +++ b/CBash/FalloutNewVegas/Records/PACKRecord.h @@ -118,60 +118,60 @@ class PACKRecord : public FNVRecord //Package enum flagsFlags { - fIsOffersServices = 0x00000001, - fIsMustReachLocation = 0x00000002, - fIsMustComplete = 0x00000004, - fIsLockAtStart = 0x00000008, - fIsLockAtEnd = 0x00000010, - fIsLockAtLocation = 0x00000020, - fIsUnlockAtStart = 0x00000040, - fIsUnlockAtEnd = 0x00000080, - fIsUnlockAtLocation = 0x00000100, - fIsContinueIfPcNear = 0x00000200, - fIsOncePerDay = 0x00000400, - fIsSkipFallout = 0x00001000, - fIsAlwaysRun = 0x00002000, - fIsAlwaysSneak = 0x00020000, - fIsAllowSwimming = 0x00040000, - fIsAllowFalls = 0x00080000, + fIsOffersServices = 0x00000001, + fIsMustReachLocation = 0x00000002, + fIsMustComplete = 0x00000004, + fIsLockAtStart = 0x00000008, + fIsLockAtEnd = 0x00000010, + fIsLockAtLocation = 0x00000020, + fIsUnlockAtStart = 0x00000040, + fIsUnlockAtEnd = 0x00000080, + fIsUnlockAtLocation = 0x00000100, + fIsContinueIfPcNear = 0x00000200, + fIsOncePerDay = 0x00000400, + fIsSkipFallout = 0x00001000, + fIsAlwaysRun = 0x00002000, + fIsAlwaysSneak = 0x00020000, + fIsAllowSwimming = 0x00040000, + fIsAllowFalls = 0x00080000, fIsHeadTrackingOff = 0x00100000, - fIsUnequipWeapons = 0x00200000, - fIsDefensiveCombat = 0x00400000, + fIsUnequipWeapons = 0x00200000, + fIsDefensiveCombat = 0x00400000, fIsWeaponDrawn = 0x00800000, - fIsNoIdleAnims = 0x01000000, - fIsPretendInCombat = 0x02000000, - fIsContinueDuringCombat = 0x04000000, - fIsNoCombatAlert = 0x08000000, - fIsNoWarnAttackBehavior = 0x10000000 + fIsNoIdleAnims = 0x01000000, + fIsPretendInCombat = 0x02000000, + fIsContinueDuringCombat = 0x04000000, + fIsNoCombatAlert = 0x08000000, + fIsNoWarnAttackBehavior = 0x10000000 }; enum behaviorFlags { - fIsHellosToPlayer = 0x00000001, - fIsRandomConversations = 0x00000002, - fIsObserveCombatBehavior = 0x00000004, - fIsUnknown4 = 0x00000008, + fIsHellosToPlayer = 0x00000001, + fIsRandomConversations = 0x00000002, + fIsObserveCombatBehavior = 0x00000004, + fIsUnknown4 = 0x00000008, fIsReactionToPlayerActions = 0x00000010, - fIsFriendlyFireComments = 0x00000020, - fIsAggroRadiusBehavior = 0x00000040, - fIsAllowIdleChatter = 0x00000080, - fIsAvoidRadiation = 0x00000100 + fIsFriendlyFireComments = 0x00000020, + fIsAggroRadiusBehavior = 0x00000040, + fIsAllowIdleChatter = 0x00000080, + fIsAvoidRadiation = 0x00000100 }; enum specificFlags { - fIsHide = 0x00000001, //Ambush only - fIsNoEating = 0x00000001, - fIsNoSleeping = 0x00000002, - fIsSitDown = 0x00000002, //Use Item At only - fIsNoConversation = 0x00000004, + fIsHide = 0x00000001, //Ambush only + fIsNoEating = 0x00000001, + fIsNoSleeping = 0x00000002, + fIsSitDown = 0x00000002, //Use Item At only + fIsNoConversation = 0x00000004, fIsRemainNearReference = 0x00000004, //Guard only - fIsNoIdleMarkers = 0x00000008, - fIsNoFurniture = 0x00000010, - fIsNoWandering = 0x00000020, - fIsAllowBuying = 0x00000100, - fIsAllowKilling = 0x00000200, - fIsAllowStealing = 0x00000400 + fIsNoIdleMarkers = 0x00000008, + fIsNoFurniture = 0x00000010, + fIsNoWandering = 0x00000020, + fIsAllowBuying = 0x00000100, + fIsAllowKilling = 0x00000200, + fIsAllowStealing = 0x00000400 }; enum aiTypeType @@ -187,11 +187,11 @@ class PACKRecord : public FNVRecord //Package eAIUseItemAt = 8, eAIAmbush = 9, eAIFleeNotCombat = 10, - eAISandbox = 12, - eAIPatrol = 13, - eAIGuard = 14, - eAIDialogue = 15, - eAIUseWeapon = 16 + eAISandbox = 12, + eAIPatrol = 13, + eAIGuard = 14, + eAIDialogue = 15, + eAIUseWeapon = 16 }; enum locTypeType @@ -208,25 +208,25 @@ class PACKRecord : public FNVRecord //Package enum schedDayType { - eAnyDay = -1, - eSunday = 0, - eMonday = 1, - eTuesday = 2, + eAnyDay = -1, + eSunday = 0, + eMonday = 1, + eTuesday = 2, eWednesday = 3, - eThursday = 4, - eFriday = 5, - eSaturday = 6, - eWeekdays = 7, - eWeekends = 8, - eMWF = 9, - eTTh = 10 + eThursday = 4, + eFriday = 5, + eSaturday = 6, + eWeekdays = 7, + eWeekends = 8, + eMWF = 9, + eTTh = 10 }; enum targetTypeType { - eTargetReference = 0, - eTargetObjectID = 1, - eTargetObjectType = 2, + eTargetReference = 0, + eTargetObjectID = 1, + eTargetObjectType = 2, eTargetLinkedReference = 3 }; @@ -239,7 +239,7 @@ class PACKRecord : public FNVRecord //Package enum pkptTypes { eNotRepeatable = 0, - eRepeatable = 1 + eRepeatable = 1 }; enum weaponFlags @@ -252,14 +252,14 @@ class PACKRecord : public FNVRecord //Package enum weaponRateTypes { - eAutoFire = 0, + eAutoFire = 0, eVolleyFire = 1 }; enum weaponFireTypes { eNumberOfBursts = 0, - eRepeatFire = 1 + eRepeatFire = 1 }; enum dialogueFlags @@ -271,7 +271,7 @@ class PACKRecord : public FNVRecord //Package enum dialogueTypes { eConversation = 0, - eSayTo = 1 + eSayTo = 1 }; enum schrFlags diff --git a/CBash/FalloutNewVegas/Records/QUSTRecord.cpp b/CBash/FalloutNewVegas/Records/QUSTRecord.cpp index 964d24c..5622c0e 100644 --- a/CBash/FalloutNewVegas/Records/QUSTRecord.cpp +++ b/CBash/FalloutNewVegas/Records/QUSTRecord.cpp @@ -155,7 +155,7 @@ void QUSTRecord::QUSTEntry::Write(FileWriter &writer) SCR_.Write(writer, true); WRITE(NAM0); } - + bool QUSTRecord::QUSTEntry::operator ==(const QUSTEntry &other) const { return (QSDT == other.QSDT && @@ -173,7 +173,7 @@ bool QUSTRecord::QUSTEntry::operator !=(const QUSTEntry &other) const { return !(*this == other); } - + void QUSTRecord::QUSTStage::Write(FileWriter &writer) { WRITE(INDX); @@ -233,13 +233,13 @@ void QUSTRecord::QUSTTarget::SetFlagMask(UINT8 Mask) { QSTA.value.flags = Mask; } - + void QUSTRecord::QUSTTarget::Write(FileWriter &writer) { WRITE(QSTA); CTDA.Write(REV32(CTDA), writer, true); } - + bool QUSTRecord::QUSTTarget::operator ==(const QUSTTarget &other) const { return (QSTA == other.QSTA && @@ -250,7 +250,7 @@ bool QUSTRecord::QUSTTarget::operator !=(const QUSTTarget &other) const { return !(*this == other); } - + void QUSTRecord::QUSTObjective::Write(FileWriter &writer) { WRITE(QOBJ); diff --git a/CBash/FalloutNewVegas/Records/QUSTRecord.h b/CBash/FalloutNewVegas/Records/QUSTRecord.h index cd4ad0b..f367a39 100644 --- a/CBash/FalloutNewVegas/Records/QUSTRecord.h +++ b/CBash/FalloutNewVegas/Records/QUSTRecord.h @@ -158,7 +158,7 @@ class QUSTRecord : public FNVRecord //Quest fIsStartEnabled = 0x00000001, fIsRepeatedTopics = 0x00000004, fIsRepeatedStages = 0x00000008, - fIsUnknown = 0x00000010 + fIsUnknown = 0x00000010 }; public: diff --git a/CBash/FalloutNewVegas/Records/WATRRecord.cpp b/CBash/FalloutNewVegas/Records/WATRRecord.cpp index a5e6310..947670e 100644 --- a/CBash/FalloutNewVegas/Records/WATRRecord.cpp +++ b/CBash/FalloutNewVegas/Records/WATRRecord.cpp @@ -24,6 +24,148 @@ GPL License and Copyright Notice ============================================ namespace FNV { +WATRRecord::WATRDNAM::WATRDNAM(): + unknown1(0.0f), + unknown2(0.0f), + unknown3(0.0f), + unknown4(0.0f), + sunPower(50.0f), + reflectAmt(0.50f), + fresnelAmt(0.020f), + fogNear(0.0f), + fogFar(0.0f), + rainForce(0.40f), + rainVelocity(0.60f), + rainFalloff(0.9850f), + rainDampner(10.0f), + dispSize(0.010f), + dispForce(0.10f), + dispVelocity(0.60f), + dispFalloff(0.9850f), + dispDampner(2.0f), + rainSize(0.050f), + normalsNoiseScale(1.0f), + noise1Direction(1.0f), + noise2Direction(1.0f), + noise3Direction(1.0f), + noise1Speed(1.0f), + noise2Speed(1.0f), + noise3Speed(1.0f), + normalsFalloffStart(0.0f), + normalsFalloffEnd(0.0f), + fogAmt(1.0f), + normalsUVScale(500.0f), + underFogAmt(1.0f), + underFogNear(0.0f), + underFogFar(1000.0f), + distAmt(250.0f), + shininess(100.0f), + hdrMult(1.0f), + lightRadius(10000.0f), + lightBright(1.0f), + noise1UVScale(100.0f), + noise2UVScale(100.0f), + noise3UVScale(100.0f), + noise1AmpScale(0.0f), + noise2AmpScale(0.0f), + noise3AmpScale(0.0f) + { + shallow.green = 128; + shallow.blue = 128; + deep.blue = 25; + refl.red = 255; + refl.green = 255; + refl.blue = 255; + memset(&unused1[0], 0x00, sizeof(unused1)); + memset(&unused2[0], 0x00, sizeof(unused2)); + } + +WATRRecord::WATRDNAM::~WATRDNAM() + { + // + } + +bool WATRRecord::WATRDNAM::operator ==(const WATRDNAM &other) const + { + return (shallow == other.shallow && + deep == other.deep && + refl == other.refl && + AlmostEqual(unknown1,other.unknown1,2) && + AlmostEqual(unknown2,other.unknown2,2) && + AlmostEqual(unknown3,other.unknown3,2) && + AlmostEqual(unknown4,other.unknown4,2) && + AlmostEqual(sunPower,other.sunPower,2) && + AlmostEqual(reflectAmt,other.reflectAmt,2) && + AlmostEqual(fresnelAmt,other.fresnelAmt,2) && + AlmostEqual(fogNear,other.fogNear,2) && + AlmostEqual(fogFar,other.fogFar,2) && + AlmostEqual(rainForce,other.rainForce,2) && + AlmostEqual(rainVelocity,other.rainVelocity,2) && + AlmostEqual(rainFalloff,other.rainFalloff,2) && + AlmostEqual(rainDampner,other.rainDampner,2) && + AlmostEqual(dispSize,other.dispSize,2) && + AlmostEqual(dispForce,other.dispForce,2) && + AlmostEqual(dispVelocity,other.dispVelocity,2) && + AlmostEqual(dispFalloff,other.dispFalloff,2) && + AlmostEqual(dispDampner,other.dispDampner,2) && + AlmostEqual(rainSize,other.rainSize,2) && + AlmostEqual(normalsNoiseScale,other.normalsNoiseScale,2) && + AlmostEqual(noise1Direction,other.noise1Direction,2) && + AlmostEqual(noise2Direction,other.noise2Direction,2) && + AlmostEqual(noise3Direction,other.noise3Direction,2) && + AlmostEqual(noise1Speed,other.noise1Speed,2) && + AlmostEqual(noise2Speed,other.noise2Speed,2) && + AlmostEqual(noise3Speed,other.noise3Speed,2) && + AlmostEqual(normalsFalloffStart,other.normalsFalloffStart,2) && + AlmostEqual(normalsFalloffEnd,other.normalsFalloffEnd,2) && + AlmostEqual(fogAmt,other.fogAmt,2) && + AlmostEqual(normalsUVScale,other.normalsUVScale,2) && + AlmostEqual(underFogAmt,other.underFogAmt,2) && + AlmostEqual(underFogNear,other.underFogNear,2) && + AlmostEqual(underFogFar,other.underFogFar,2) && + AlmostEqual(distAmt,other.distAmt,2) && + AlmostEqual(shininess,other.shininess,2) && + AlmostEqual(hdrMult,other.hdrMult,2) && + AlmostEqual(lightRadius,other.lightRadius,2) && + AlmostEqual(lightBright,other.lightBright,2) && + AlmostEqual(noise1UVScale,other.noise1UVScale,2) && + AlmostEqual(noise2UVScale,other.noise2UVScale,2) && + AlmostEqual(noise3UVScale,other.noise3UVScale,2) && + AlmostEqual(noise1AmpScale,other.noise1AmpScale,2) && + AlmostEqual(noise2AmpScale,other.noise2AmpScale,2) && + AlmostEqual(noise3AmpScale,other.noise3AmpScale,2)); + } + +bool WATRRecord::WATRDNAM::operator !=(const WATRDNAM &other) const + { + return !(*this == other); + } + +WATRRecord::WATRGNAM::WATRGNAM(): + dayWater(0), + nightWater(0), + underWater(0) + { + // + } + +WATRRecord::WATRGNAM::~WATRGNAM() + { + // + } + +bool WATRRecord::WATRGNAM::operator ==(const WATRGNAM &other) const + { + return (dayWater == other.dayWater && + nightWater == other.nightWater && + underWater == other.underWater); + } + +bool WATRRecord::WATRGNAM::operator !=(const WATRGNAM &other) const + { + return !(*this == other); + } + WATRRecord::WATRRecord(unsigned char *_recData): FNVRecord(_recData) { @@ -75,53 +217,54 @@ bool WATRRecord::VisitFormIDs(FormIDOp &op) return false; if(SNAM.IsLoaded()) - op.Accept(SNAM->value); + op.Accept(SNAM.value); if(XNAM.IsLoaded()) - op.Accept(XNAM->value); - //if(GNAM.IsLoaded()) //FILL IN MANUALLY - // op.Accept(GNAM->value); + op.Accept(XNAM.value); + op.Accept(GNAM.value.dayWater); + op.Accept(GNAM.value.nightWater); + op.Accept(GNAM.value.underWater); return op.Stop(); } bool WATRRecord::IsCausesDmg() { - return (FNAM.value.value & fIsCausesDamage) != 0; + return (FNAM.value & fIsCausesDamage) != 0; } void WATRRecord::IsCausesDmg(bool value) { - FNAM.value.value = value ? (FNAM.value.value | fIsCausesDamage) : (FNAM.value.value & ~fIsCausesDamage); + FNAM.value = value ? (FNAM.value | fIsCausesDamage) : (FNAM.value & ~fIsCausesDamage); } bool WATRRecord::IsCausesDamage() { - return (FNAM.value.value & fIsCausesDamage) != 0; + return (FNAM.value & fIsCausesDamage) != 0; } void WATRRecord::IsCausesDamage(bool value) { - FNAM.value.value = value ? (FNAM.value.value | fIsCausesDamage) : (FNAM.value.value & ~fIsCausesDamage); + FNAM.value = value ? (FNAM.value | fIsCausesDamage) : (FNAM.value & ~fIsCausesDamage); } bool WATRRecord::IsReflective() { - return (FNAM.value.value & fIsReflective) != 0; + return (FNAM.value & fIsReflective) != 0; } void WATRRecord::IsReflective(bool value) { - FNAM.value.value = value ? (FNAM.value.value | fIsReflective) : (FNAM.value.value & ~fIsReflective); + FNAM.value = value ? (FNAM.value | fIsReflective) : (FNAM.value & ~fIsReflective); } bool WATRRecord::IsFlagMask(UINT8 Mask, bool Exact) { - return Exact ? ((FNAM.value.value & Mask) == Mask) : ((FNAM.value.value & Mask) != 0); + return Exact ? ((FNAM.value & Mask) == Mask) : ((FNAM.value & Mask) != 0); } void WATRRecord::SetFlagMask(UINT8 Mask) { - FNAM.value.value = Mask; + FNAM.value = Mask; } UINT32 WATRRecord::GetType() @@ -181,7 +324,25 @@ SINT32 WATRRecord::ParseRecord(unsigned char *buffer, const UINT32 &recSize) XNAM.Read(buffer, subSize, curPos); break; case REV32(DATA): - DATA.Read(buffer, subSize, curPos); + switch(subSize) + { + case sizeof(DATA.value): + DATA.Read(buffer, subSize, curPos); + break; + case 186: + //last field of older DATA format is damage, and rest are congruent with DNAM + //last three fields of DNAM will be at their default value + DNAM.Read(buffer, subSize - 2, curPos); + DATA.Read(buffer, 2, curPos); + break; + default: + printf(" WATR: %08X - Unexpected DATA size\n", formID); + CBASH_CHUNK_DEBUG + printf(" Size = %i\n", subSize); + printf(" CurPos = %04x\n\n", curPos - 6); + curPos += subSize; + break; + } break; case REV32(DNAM): DNAM.Read(buffer, subSize, curPos); @@ -192,6 +353,7 @@ SINT32 WATRRecord::ParseRecord(unsigned char *buffer, const UINT32 &recSize) default: //printf("FileName = %s\n", FileName); printf(" WATR: %08X - Unknown subType = %04x\n", formID, subType); + CBASH_CHUNK_DEBUG printf(" Size = %i\n", subSize); printf(" CurPos = %04x\n\n", curPos - 6); curPos = recSize; @@ -205,6 +367,7 @@ SINT32 WATRRecord::Unload() { IsChanged(false); IsLoaded(false); + EDID.Unload(); FULL.Unload(); NNAM.Unload(); @@ -223,32 +386,31 @@ SINT32 WATRRecord::WriteRecord(FileWriter &writer) { WRITE(EDID); WRITE(FULL); - WRITE(NNAM); + WRITEREQ(NNAM); WRITE(ANAM); WRITE(FNAM); - WRITE(MNAM); + WRITEREQ(MNAM); WRITE(SNAM); WRITE(XNAM); WRITE(DATA); WRITE(DNAM); WRITE(GNAM); - return -1; } bool WATRRecord::operator ==(const WATRRecord &other) const { - return (EDID.equalsi(other.EDID) && - FULL.equals(other.FULL) && - NNAM.equalsi(other.NNAM) && - ANAM == other.ANAM && + return (ANAM == other.ANAM && FNAM == other.FNAM && - MNAM.equalsi(other.MNAM) && SNAM == other.SNAM && XNAM == other.XNAM && - DATA == other.DATA && DNAM == other.DNAM && - GNAM == other.GNAM); + GNAM == other.GNAM && + DATA == other.DATA && + EDID.equalsi(other.EDID) && + FULL.equals(other.FULL) && + NNAM.equalsi(other.NNAM) && + MNAM.equalsi(other.MNAM)); } bool WATRRecord::operator !=(const WATRRecord &other) const diff --git a/CBash/FalloutNewVegas/Records/WATRRecord.h b/CBash/FalloutNewVegas/Records/WATRRecord.h index 6197def..7538577 100644 --- a/CBash/FalloutNewVegas/Records/WATRRecord.h +++ b/CBash/FalloutNewVegas/Records/WATRRecord.h @@ -28,17 +28,6 @@ namespace FNV class WATRRecord : public FNVRecord //Water { private: - struct WATRANAM - { - UINT8 opacity; - - WATRANAM(); - ~WATRANAM(); - - bool operator ==(const WATRANAM &other) const; - bool operator !=(const WATRANAM &other) const; - }; - struct WATRDNAM { FLOAT32 unknown1, unknown2, unknown3, unknown4, @@ -51,23 +40,22 @@ class WATRRecord : public FNVRecord //Water UINT8 unused2[4]; FLOAT32 rainForce, rainVelocity, rainFalloff, rainDampner, dispSize, dispForce, dispVelocity, dispFalloff, - dispDampner, rainSize, noiseScale, noise1Direction, + dispDampner, rainSize, normalsNoiseScale, noise1Direction, noise2Direction, noise3Direction, noise1Speed, - noise2Speed, noise3Speed, noiseFalloffStart, - noiseFalloffEnd, underFogAmt, uvScale, underFogAmt, + noise2Speed, noise3Speed, normalsFalloffStart, + normalsFalloffEnd, fogAmt, normalsUVScale, underFogAmt, underFogNear, underFogFar, distAmt, shininess, hdrMult, lightRadius, lightBright, noise1UVScale, noise2UVScale, noise3UVScale; - //Missing in old format (DATA, not DNAM) + //Below aren't on older DATA, and also a few DNAM FLOAT32 noise1AmpScale, noise2AmpScale, noise3AmpScale; - UINT16 damage; - WATRDATA(); - ~WATRDATA(); + WATRDNAM(); + ~WATRDNAM(); - bool operator ==(const WATRDATA &other) const; - bool operator !=(const WATRDATA &other) const; + bool operator ==(const WATRDNAM &other) const; + bool operator !=(const WATRDNAM &other) const; }; struct WATRGNAM @@ -83,21 +71,21 @@ class WATRRecord : public FNVRecord //Water enum flagsFlags { - fIsCausesDamage = 0x00000001, - fIsReflective = 0x00000002 + fIsCausesDamage = 0x01, + fIsReflective = 0x02 }; public: StringRecord EDID; //Editor ID StringRecord FULL; //Name StringRecord NNAM; //Noise Map - OptSubRecord ANAM; //Opacity - OptSimpleSubRecord FNAM; //Flags + ReqSimpleSubRecord ANAM; // opacity + ReqSimpleSubRecord FNAM; //Flags StringRecord MNAM; //Material ID OptSimpleSubRecord SNAM; //Sound OptSimpleSubRecord XNAM; //Actor Effect - OptSimpleSubRecord DATA; //Damage - OptSubRecord DNAM; //Visual Data (May be listed as DATA in old format, auto upgrade to DNAM on read) - OptSubRecord GNAM; //Related Waters (Unused) + ReqSimpleSubRecord DATA; //Damage (May be 186 size struct (older format)) + ReqSubRecord DNAM; //Visual Data (May be listed as DATA an old format, auto upgrade to DNAM on read) + ReqSubRecord GNAM; //Related Waters (Unused) WATRRecord(unsigned char *_recData=NULL); WATRRecord(WATRRecord *srcRecord); diff --git a/CBash/FalloutNewVegas/Records/WRLDRecord.cpp b/CBash/FalloutNewVegas/Records/WRLDRecord.cpp index 21e8b93..0ca2dfb 100644 --- a/CBash/FalloutNewVegas/Records/WRLDRecord.cpp +++ b/CBash/FalloutNewVegas/Records/WRLDRecord.cpp @@ -104,9 +104,9 @@ bool WRLDRecord::VisitSubRecords(const UINT32 &RecordType, RecordOp &op) // } // } - if(RecordType == NULL || + if(RecordType == NULL || RecordType != REV32(CELL) || - RecordType != REV32(ACHR) || + RecordType != REV32(ACHR) || RecordType != REV32(ACRE) || RecordType != REV32(REFR) || RecordType != REV32(PGRE) || diff --git a/CBash/GRUPRecord.h b/CBash/GRUPRecord.h index 9793726..f073b56 100644 --- a/CBash/GRUPRecord.h +++ b/CBash/GRUPRecord.h @@ -3614,7 +3614,7 @@ class FNVGRUPRecords Temporary.push_back(curCell->NAVM[y]); if(CloseMod) curCell->NAVM.clear(); - + numChildren = (UINT32)VWD.size() + (UINT32)Temporary.size(); if(numChildren) { diff --git a/CBash/GenericChunks.cpp b/CBash/GenericChunks.cpp index 0553c37..9ee561f 100644 --- a/CBash/GenericChunks.cpp +++ b/CBash/GenericChunks.cpp @@ -2249,7 +2249,7 @@ bool FNVMODS::operator ==(const FNVMODS &other) const { return (texture == other.texture && index == other.index && - _stricmp(name, other.name) == 0); + icmps(name, other.name) == 0); } bool FNVMODS::operator !=(const FNVMODS &other) const @@ -4144,16 +4144,16 @@ GENIMPF::~GENIMPF() bool GENIMPF::operator ==(const GENIMPF &other) const { - return (strcmp(&concSolid[0], &other.concSolid[0]) == 0 && - strcmp(&concBroken[0], &other.concBroken[0]) == 0 && - strcmp(&metalSolid[0], &other.metalSolid[0]) == 0 && - strcmp(&metalHollow[0], &other.metalHollow[0]) == 0 && - strcmp(&metalSheet[0], &other.metalSheet[0]) == 0 && - strcmp(&wood[0], &other.wood[0]) == 0 && - strcmp(&sand[0], &other.sand[0]) == 0 && - strcmp(&dirt[0], &other.dirt[0]) == 0 && - strcmp(&grass[0], &other.grass[0]) == 0 && - strcmp(&water[0], &other.water[0]) == 0); + return (cmps(&concSolid[0], &other.concSolid[0]) == 0 && + cmps(&concBroken[0], &other.concBroken[0]) == 0 && + cmps(&metalSolid[0], &other.metalSolid[0]) == 0 && + cmps(&metalHollow[0], &other.metalHollow[0]) == 0 && + cmps(&metalSheet[0], &other.metalSheet[0]) == 0 && + cmps(&wood[0], &other.wood[0]) == 0 && + cmps(&sand[0], &other.sand[0]) == 0 && + cmps(&dirt[0], &other.dirt[0]) == 0 && + cmps(&grass[0], &other.grass[0]) == 0 && + cmps(&water[0], &other.water[0]) == 0); } bool GENIMPF::operator !=(const GENIMPF &other) const diff --git a/CBash/ModFile.cpp b/CBash/ModFile.cpp index 94fb3fd..32cba75 100644 --- a/CBash/ModFile.cpp +++ b/CBash/ModFile.cpp @@ -38,7 +38,7 @@ ModFile::ModFile(STRING FileName, STRING ModName, const UINT32 _flags): Flags.IsIgnoreExisting = true; TES4.IsLoaded(true); STRING const _Name = reader.getModName(); - TES4.IsESM(_stricmp(".esm",_Name + strlen(_Name) - 4) == 0); + TES4.IsESM(icmps(".esm",_Name + strlen(_Name) - 4) == 0); } } diff --git a/CBash/Oblivion/Records/API/GMSTRecordAPI.cpp b/CBash/Oblivion/Records/API/GMSTRecordAPI.cpp index 25baa74..c99b514 100644 --- a/CBash/Oblivion/Records/API/GMSTRecordAPI.cpp +++ b/CBash/Oblivion/Records/API/GMSTRecordAPI.cpp @@ -113,10 +113,13 @@ bool GMSTRecord::SetField(FIELD_IDENTIFIERS, void *FieldValue, UINT32 ArraySize) switch(DATA.format) { case 's': - delete []DATA.s; - ArraySize = (UINT32)strlen((STRING)FieldValue) + 1; - DATA.s = new char[ArraySize]; - strcpy_s(DATA.s, ArraySize, (STRING)FieldValue); + if(FieldValue != NULL) + { + delete []DATA.s; + ArraySize = (UINT32)strlen((STRING)FieldValue) + 1; + DATA.s = new char[ArraySize]; + strcpy_s(DATA.s, ArraySize, (STRING)FieldValue); + } break; case 'i': DATA.i = *(SINT32 *)FieldValue; @@ -155,14 +158,13 @@ void GMSTRecord::DeleteField(FIELD_IDENTIFIERS) { case 's': delete []DATA.s; + DATA.s = defaultDATA.s; if(defaultDATA.s != NULL) { ArraySize = (UINT32)strlen(defaultDATA.s) + 1; DATA.s = new char[ArraySize]; strcpy_s(DATA.s, ArraySize, defaultDATA.s); } - else - DATA.s = defaultDATA.s; return; case 'i': DATA.i = defaultDATA.i; diff --git a/CBash/Oblivion/Records/CREARecord.cpp b/CBash/Oblivion/Records/CREARecord.cpp index bcb9ad5..c87ce1d 100644 --- a/CBash/Oblivion/Records/CREARecord.cpp +++ b/CBash/Oblivion/Records/CREARecord.cpp @@ -1004,8 +1004,8 @@ SINT32 CREARecord::ParseRecord(unsigned char *buffer, const UINT32 &recSize) SPLO.push_back(curFormID); break; case REV32(NIFZ): - for(subSize += curPos;curPos < (subSize - 1);curPos += (UINT32)strlen((char*)&buffer[curPos]) + 1) - NIFZ.push_back(StringRecord((char*)&buffer[curPos])); + for(subSize += curPos;curPos < (subSize - 1);curPos += (UINT32)strlen((STRING)&buffer[curPos]) + 1) + NIFZ.push_back(StringRecord((STRING)&buffer[curPos])); curPos++; break; case REV32(NIFT): @@ -1044,8 +1044,8 @@ SINT32 CREARecord::ParseRecord(unsigned char *buffer, const UINT32 &recSize) PKID.push_back(curFormID); break; case REV32(KFFZ): - for(subSize += curPos;curPos < (subSize - 1);curPos += (UINT32)strlen((char*)&buffer[curPos]) + 1) - KFFZ.push_back(StringRecord((char*)&buffer[curPos])); + for(subSize += curPos;curPos < (subSize - 1);curPos += (UINT32)strlen((STRING)&buffer[curPos]) + 1) + KFFZ.push_back(StringRecord((STRING)&buffer[curPos])); curPos++; break; case REV32(DATA): diff --git a/CBash/Oblivion/Records/GMSTRecord.cpp b/CBash/Oblivion/Records/GMSTRecord.cpp index 748e21e..e9849c2 100644 --- a/CBash/Oblivion/Records/GMSTRecord.cpp +++ b/CBash/Oblivion/Records/GMSTRecord.cpp @@ -64,7 +64,7 @@ bool GMSTRecord::GMSTDATA::operator ==(const GMSTDATA &other) const switch(format) { case 's': - return strcmp(s, other.s) == 0; + return cmps(s, other.s) == 0; case 'i': return i == other.i; case 'f': @@ -114,9 +114,12 @@ GMSTRecord::GMSTRecord(GMSTRecord *srcRecord): DATA.i = srcRecord->DATA.i; break; case 's': - vSize = (UINT32)strlen(srcRecord->DATA.s) + 1; - DATA.s = new char [vSize]; - strcpy_s(DATA.s, vSize, srcRecord->DATA.s); + if(srcRecord->DATA.s != NULL) + { + vSize = (UINT32)strlen(srcRecord->DATA.s) + 1; + DATA.s = new char [vSize]; + strcpy_s(DATA.s, vSize, srcRecord->DATA.s); + } break; default: break; diff --git a/CBash/Oblivion/Records/NPC_Record.cpp b/CBash/Oblivion/Records/NPC_Record.cpp index ab89552..e13afd6 100644 --- a/CBash/Oblivion/Records/NPC_Record.cpp +++ b/CBash/Oblivion/Records/NPC_Record.cpp @@ -615,8 +615,8 @@ SINT32 NPC_Record::ParseRecord(unsigned char *buffer, const UINT32 &recSize) PKID.push_back(curFormID); break; case REV32(KFFZ): - for(subSize += curPos;curPos < (subSize - 1);curPos += (UINT32)strlen((char*)&buffer[curPos]) + 1) - KFFZ.push_back(StringRecord((char*)&buffer[curPos])); + for(subSize += curPos;curPos < (subSize - 1);curPos += (UINT32)strlen((STRING)&buffer[curPos]) + 1) + KFFZ.push_back(StringRecord((STRING)&buffer[curPos])); curPos++; break; case REV32(CNAM): diff --git a/release/CBash.dll b/release/CBash.dll index 28c214e..5b52ba0 100644 Binary files a/release/CBash.dll and b/release/CBash.dll differ diff --git a/release/FNVTest.py b/release/FNVTest.py index 8744d75..2e387be 100644 --- a/release/FNVTest.py +++ b/release/FNVTest.py @@ -101,83 +101,83 @@ def TestRegressions(): Current.load() newMod = Current.LookupModFile("TestRegressions.esp") - assertTES4(Current, newMod) - assertGMST(Current, newMod) - assertTXST(Current, newMod) - assertMICN(Current, newMod) - assertGLOB(Current, newMod) - assertCLAS(Current, newMod) - assertFACT(Current, newMod) - assertHDPT(Current, newMod) - assertHAIR(Current, newMod) - assertEYES(Current, newMod) - assertRACE(Current, newMod) - assertSOUN(Current, newMod) - assertASPC(Current, newMod) - assertMGEF(Current, newMod) - assertSCPT(Current, newMod) - assertLTEX(Current, newMod) - assertENCH(Current, newMod) - assertSPEL(Current, newMod) - assertACTI(Current, newMod) - assertTACT(Current, newMod) - assertTERM(Current, newMod) - assertARMO(Current, newMod) - assertBOOK(Current, newMod) - assertCONT(Current, newMod) - assertDOOR(Current, newMod) - assertINGR(Current, newMod) - assertLIGH(Current, newMod) - assertMISC(Current, newMod) - assertSTAT(Current, newMod) - assertSCOL(Current, newMod) - assertMSTT(Current, newMod) - assertPWAT(Current, newMod) - assertGRAS(Current, newMod) -## newMod.save() - assertTREE(Current, newMod) - assertFURN(Current, newMod) - assertWEAP(Current, newMod) - assertAMMO(Current, newMod) - assertNPC_(Current, newMod) - assertCREA(Current, newMod) - assertLVLC(Current, newMod) - assertLVLN(Current, newMod) - assertKEYM(Current, newMod) - assertALCH(Current, newMod) - assertIDLM(Current, newMod) - assertNOTE(Current, newMod) - assertCOBJ(Current, newMod) - assertPROJ(Current, newMod) - assertLVLI(Current, newMod) - assertWTHR(Current, newMod) - assertCLMT(Current, newMod) - assertREGN(Current, newMod) - assertNAVI(Current, newMod) - assertCELL(Current, newMod) - assertACHR(Current, newMod) - assertACRE(Current, newMod) - assertREFR(Current, newMod) - assertPGRE(Current, newMod) - assertPMIS(Current, newMod) - assertPBEA(Current, newMod) - assertPFLA(Current, newMod) - assertPCBE(Current, newMod) - assertNAVM(Current, newMod) - assertWRLD(Current, newMod) - assertLAND(Current, newMod) - assertDIAL(Current, newMod) - assertINFO(Current, newMod) - assertQUST(Current, newMod) - assertIDLE(Current, newMod) - assertPACK(Current, newMod) - assertCSTY(Current, newMod) - assertLSCR(Current, newMod) - ## assertANIO(Current, newMod) - ## assertWATR(Current, newMod) - ## assertEFSH(Current, newMod) - ## assertEXPL(Current, newMod) - ## assertDEBR(Current, newMod) + ## assertTES4(Current, newMod) + ## assertGMST(Current, newMod) + ## assertTXST(Current, newMod) + ## assertMICN(Current, newMod) + ## assertGLOB(Current, newMod) + ## assertCLAS(Current, newMod) + ## assertFACT(Current, newMod) + ## assertHDPT(Current, newMod) + ## assertHAIR(Current, newMod) + ## assertEYES(Current, newMod) + ## assertRACE(Current, newMod) + ## assertSOUN(Current, newMod) + ## assertASPC(Current, newMod) + ## assertMGEF(Current, newMod) + ## assertSCPT(Current, newMod) + ## assertLTEX(Current, newMod) + ## assertENCH(Current, newMod) + ## assertSPEL(Current, newMod) + ## assertACTI(Current, newMod) + ## assertTACT(Current, newMod) + ## assertTERM(Current, newMod) + ## assertARMO(Current, newMod) + ## assertBOOK(Current, newMod) + ## assertCONT(Current, newMod) + ## assertDOOR(Current, newMod) + ## assertINGR(Current, newMod) + ## assertLIGH(Current, newMod) + ## assertMISC(Current, newMod) + ## assertSTAT(Current, newMod) + ## assertSCOL(Current, newMod) + ## assertMSTT(Current, newMod) + ## assertPWAT(Current, newMod) + ## assertGRAS(Current, newMod) + #### newMod.save() + #### assertTREE(Current, newMod) + #### assertFURN(Current, newMod) + #### assertWEAP(Current, newMod) + #### assertAMMO(Current, newMod) + #### assertNPC_(Current, newMod) + #### assertCREA(Current, newMod) + #### assertLVLC(Current, newMod) + #### assertLVLN(Current, newMod) + #### assertKEYM(Current, newMod) + #### assertALCH(Current, newMod) + #### assertIDLM(Current, newMod) + #### assertNOTE(Current, newMod) + #### assertCOBJ(Current, newMod) + #### assertPROJ(Current, newMod) + #### assertLVLI(Current, newMod) + #### assertWTHR(Current, newMod) + #### assertCLMT(Current, newMod) + #### assertREGN(Current, newMod) + #### assertNAVI(Current, newMod) + #### assertCELL(Current, newMod) + #### assertACHR(Current, newMod) + #### assertACRE(Current, newMod) + #### assertREFR(Current, newMod) + #### assertPGRE(Current, newMod) + #### assertPMIS(Current, newMod) + #### assertPBEA(Current, newMod) + #### assertPFLA(Current, newMod) + #### assertPCBE(Current, newMod) + #### assertNAVM(Current, newMod) + #### assertWRLD(Current, newMod) + #### assertLAND(Current, newMod) + #### assertDIAL(Current, newMod) + #### assertINFO(Current, newMod) + #### assertQUST(Current, newMod) + #### assertIDLE(Current, newMod) + #### assertPACK(Current, newMod) + #### assertCSTY(Current, newMod) + #### assertLSCR(Current, newMod) + assertANIO(Current, newMod) + assertWATR(Current, newMod) + assertEFSH(Current, newMod) + assertEXPL(Current, newMod) + assertDEBR(Current, newMod) ## assertIMGS(Current, newMod) ## assertIMAD(Current, newMod) ## assertFLST(Current, newMod) @@ -12319,40 +12319,250 @@ def TestReadWrite(): ## wrldCell.DeleteRecord() ## record.DeleteRecord() ## - for record in Current.LoadOrderMods[0].DIAL: - trgRecOver = record.CopyAsOverride(newMod) - trgRecNew = record.CopyAsNew(newMod) - for objRef in record.INFO: - objRef.CopyAsOverride(trgRecOver) - objRef.CopyAsNew(trgRecNew) - objRef.DeleteRecord() - record.DeleteRecord() +## for record in Current.LoadOrderMods[0].DIAL: +## trgRecOver = record.CopyAsOverride(newMod) +## trgRecNew = record.CopyAsNew(newMod) +## for objRef in record.INFO: +## objRef.CopyAsOverride(trgRecOver) +## objRef.CopyAsNew(trgRecNew) +## objRef.DeleteRecord() +## record.DeleteRecord() +## +## for record in Current.LoadOrderMods[0].QUST: +## trgRecOver = record.CopyAsOverride(newMod) +## trgRecNew = record.CopyAsNew(newMod) +## record.DeleteRecord() +## +## for record in Current.LoadOrderMods[0].IDLE: +## trgRecOver = record.CopyAsOverride(newMod) +## trgRecNew = record.CopyAsNew(newMod) +## record.DeleteRecord() +## +## for record in Current.LoadOrderMods[0].PACK: +## trgRecOver = record.CopyAsOverride(newMod) +## trgRecNew = record.CopyAsNew(newMod) +## record.DeleteRecord() +## +## for record in Current.LoadOrderMods[0].CSTY: +## trgRecOver = record.CopyAsOverride(newMod) +## trgRecNew = record.CopyAsNew(newMod) +## record.DeleteRecord() +## +## for record in Current.LoadOrderMods[0].LSCR: +## trgRecOver = record.CopyAsOverride(newMod) +## trgRecNew = record.CopyAsNew(newMod) +## record.DeleteRecord() - for record in Current.LoadOrderMods[0].QUST: + for record in Current.LoadOrderMods[0].ANIO: trgRecOver = record.CopyAsOverride(newMod) trgRecNew = record.CopyAsNew(newMod) record.DeleteRecord() - for record in Current.LoadOrderMods[0].IDLE: + for record in Current.LoadOrderMods[0].WATR: trgRecOver = record.CopyAsOverride(newMod) trgRecNew = record.CopyAsNew(newMod) record.DeleteRecord() - for record in Current.LoadOrderMods[0].PACK: + for record in Current.LoadOrderMods[0].EFSH: trgRecOver = record.CopyAsOverride(newMod) trgRecNew = record.CopyAsNew(newMod) record.DeleteRecord() - for record in Current.LoadOrderMods[0].CSTY: + for record in Current.LoadOrderMods[0].EXPL: trgRecOver = record.CopyAsOverride(newMod) trgRecNew = record.CopyAsNew(newMod) record.DeleteRecord() - for record in Current.LoadOrderMods[0].LSCR: + for record in Current.LoadOrderMods[0].DEBR: trgRecOver = record.CopyAsOverride(newMod) trgRecNew = record.CopyAsNew(newMod) record.DeleteRecord() +## for record in Current.LoadOrderMods[0].IMGS: +## trgRecOver = record.CopyAsOverride(newMod) +## trgRecNew = record.CopyAsNew(newMod) +## record.DeleteRecord() +## +## for record in Current.LoadOrderMods[0].IMAD: +## trgRecOver = record.CopyAsOverride(newMod) +## trgRecNew = record.CopyAsNew(newMod) +## record.DeleteRecord() +## +## for record in Current.LoadOrderMods[0].FLST: +## trgRecOver = record.CopyAsOverride(newMod) +## trgRecNew = record.CopyAsNew(newMod) +## record.DeleteRecord() +## +## for record in Current.LoadOrderMods[0].PERK: +## trgRecOver = record.CopyAsOverride(newMod) +## trgRecNew = record.CopyAsNew(newMod) +## record.DeleteRecord() +## +## for record in Current.LoadOrderMods[0].BPTD: +## trgRecOver = record.CopyAsOverride(newMod) +## trgRecNew = record.CopyAsNew(newMod) +## record.DeleteRecord() +## +## for record in Current.LoadOrderMods[0].ADDN: +## trgRecOver = record.CopyAsOverride(newMod) +## trgRecNew = record.CopyAsNew(newMod) +## record.DeleteRecord() +## +## for record in Current.LoadOrderMods[0].AVIF: +## trgRecOver = record.CopyAsOverride(newMod) +## trgRecNew = record.CopyAsNew(newMod) +## record.DeleteRecord() +## +## for record in Current.LoadOrderMods[0].RADS: +## trgRecOver = record.CopyAsOverride(newMod) +## trgRecNew = record.CopyAsNew(newMod) +## record.DeleteRecord() +## +## for record in Current.LoadOrderMods[0].CAMS: +## trgRecOver = record.CopyAsOverride(newMod) +## trgRecNew = record.CopyAsNew(newMod) +## record.DeleteRecord() +## +## for record in Current.LoadOrderMods[0].CPTH: +## trgRecOver = record.CopyAsOverride(newMod) +## trgRecNew = record.CopyAsNew(newMod) +## record.DeleteRecord() +## +## for record in Current.LoadOrderMods[0].VTYP: +## trgRecOver = record.CopyAsOverride(newMod) +## trgRecNew = record.CopyAsNew(newMod) +## record.DeleteRecord() +## +## for record in Current.LoadOrderMods[0].IPCT: +## trgRecOver = record.CopyAsOverride(newMod) +## trgRecNew = record.CopyAsNew(newMod) +## record.DeleteRecord() +## +## for record in Current.LoadOrderMods[0].IPDS: +## trgRecOver = record.CopyAsOverride(newMod) +## trgRecNew = record.CopyAsNew(newMod) +## record.DeleteRecord() +## +## for record in Current.LoadOrderMods[0].ARMA: +## trgRecOver = record.CopyAsOverride(newMod) +## trgRecNew = record.CopyAsNew(newMod) +## record.DeleteRecord() +## +## for record in Current.LoadOrderMods[0].ECZN: +## trgRecOver = record.CopyAsOverride(newMod) +## trgRecNew = record.CopyAsNew(newMod) +## record.DeleteRecord() +## +## for record in Current.LoadOrderMods[0].MESG: +## trgRecOver = record.CopyAsOverride(newMod) +## trgRecNew = record.CopyAsNew(newMod) +## record.DeleteRecord() +## +## for record in Current.LoadOrderMods[0].RGDL: +## trgRecOver = record.CopyAsOverride(newMod) +## trgRecNew = record.CopyAsNew(newMod) +## record.DeleteRecord() +## +## for record in Current.LoadOrderMods[0].DOBJ: +## trgRecOver = record.CopyAsOverride(newMod) +## trgRecNew = record.CopyAsNew(newMod) +## record.DeleteRecord() +## +## for record in Current.LoadOrderMods[0].LGTM: +## trgRecOver = record.CopyAsOverride(newMod) +## trgRecNew = record.CopyAsNew(newMod) +## record.DeleteRecord() +## +## for record in Current.LoadOrderMods[0].MUSC: +## trgRecOver = record.CopyAsOverride(newMod) +## trgRecNew = record.CopyAsNew(newMod) +## record.DeleteRecord() +## +## for record in Current.LoadOrderMods[0].IMOD: +## trgRecOver = record.CopyAsOverride(newMod) +## trgRecNew = record.CopyAsNew(newMod) +## record.DeleteRecord() +## +## for record in Current.LoadOrderMods[0].REPU: +## trgRecOver = record.CopyAsOverride(newMod) +## trgRecNew = record.CopyAsNew(newMod) +## record.DeleteRecord() +## +## for record in Current.LoadOrderMods[0].RCPE: +## trgRecOver = record.CopyAsOverride(newMod) +## trgRecNew = record.CopyAsNew(newMod) +## record.DeleteRecord() +## +## for record in Current.LoadOrderMods[0].RCCT: +## trgRecOver = record.CopyAsOverride(newMod) +## trgRecNew = record.CopyAsNew(newMod) +## record.DeleteRecord() +## +## for record in Current.LoadOrderMods[0].CHIP: +## trgRecOver = record.CopyAsOverride(newMod) +## trgRecNew = record.CopyAsNew(newMod) +## record.DeleteRecord() +## +## for record in Current.LoadOrderMods[0].CSNO: +## trgRecOver = record.CopyAsOverride(newMod) +## trgRecNew = record.CopyAsNew(newMod) +## record.DeleteRecord() +## +## for record in Current.LoadOrderMods[0].LSCT: +## trgRecOver = record.CopyAsOverride(newMod) +## trgRecNew = record.CopyAsNew(newMod) +## record.DeleteRecord() +## +## for record in Current.LoadOrderMods[0].MSET: +## trgRecOver = record.CopyAsOverride(newMod) +## trgRecNew = record.CopyAsNew(newMod) +## record.DeleteRecord() +## +## for record in Current.LoadOrderMods[0].ALOC: +## trgRecOver = record.CopyAsOverride(newMod) +## trgRecNew = record.CopyAsNew(newMod) +## record.DeleteRecord() +## +## for record in Current.LoadOrderMods[0].CHAL: +## trgRecOver = record.CopyAsOverride(newMod) +## trgRecNew = record.CopyAsNew(newMod) +## record.DeleteRecord() +## +## for record in Current.LoadOrderMods[0].AMEF: +## trgRecOver = record.CopyAsOverride(newMod) +## trgRecNew = record.CopyAsNew(newMod) +## record.DeleteRecord() +## +## for record in Current.LoadOrderMods[0].CCRD: +## trgRecOver = record.CopyAsOverride(newMod) +## trgRecNew = record.CopyAsNew(newMod) +## record.DeleteRecord() +## +## for record in Current.LoadOrderMods[0].CMNY: +## trgRecOver = record.CopyAsOverride(newMod) +## trgRecNew = record.CopyAsNew(newMod) +## record.DeleteRecord() +## +## for record in Current.LoadOrderMods[0].CDCK: +## trgRecOver = record.CopyAsOverride(newMod) +## trgRecNew = record.CopyAsNew(newMod) +## record.DeleteRecord() +## +## for record in Current.LoadOrderMods[0].DEHY: +## trgRecOver = record.CopyAsOverride(newMod) +## trgRecNew = record.CopyAsNew(newMod) +## record.DeleteRecord() +## +## for record in Current.LoadOrderMods[0].HUNG: +## trgRecOver = record.CopyAsOverride(newMod) +## trgRecNew = record.CopyAsNew(newMod) +## record.DeleteRecord() +## +## for record in Current.LoadOrderMods[0].SLPD: +## trgRecOver = record.CopyAsOverride(newMod) +## trgRecNew = record.CopyAsNew(newMod) +## record.DeleteRecord() + print "TestReadWrite:Save Test - TestRW.esp" ## phonenumber = raw_input(">") @@ -12411,5 +12621,5 @@ def TestReadWrite(): ##del Current ##phonenumber = raw_input("!") -##TestRegressions() -TestReadWrite() \ No newline at end of file +TestRegressions() +##TestReadWrite() diff --git a/release/cint-template.py b/release/cint-template.py index 897866c..7b6c32a 100644 --- a/release/cint-template.py +++ b/release/cint-template.py @@ -8236,28 +8236,341 @@ class Location(ListComponent): class FnvANIORecord(FnvBaseRecord): _Type = 'ANIO' - - exportattrs = copyattrs = FnvBaseRecord.baseattrs + [] + ISTRING_MACRO(modPath, 7) + FLOAT32_MACRO(modb, 8) + UINT8_ARRAY_MACRO(modt_p, 9) + + LIST_MACRO(altTextures, 10, FNVAltTexture) + UINT8_FLAG_MACRO(modelFlags, 11) + FORMID_MACRO(animation, 12) + copyattrs = FnvBaseRecord.baseattrs + ['modPath', 'modb', 'modt_p', + 'altTextures_list', + 'modelFlags', 'animation'] + exportattrs = FnvBaseRecord.baseattrs + ['modPath', 'modb', + 'altTextures_list', + 'modelFlags', 'animation']# 'modt_p', class FnvWATRRecord(FnvBaseRecord): _Type = 'WATR' - - exportattrs = copyattrs = FnvBaseRecord.baseattrs + [] + STRING_MACRO(full, 7) + ISTRING_MACRO(noisePath, 8) + UINT8_MACRO(opacity, 9) + UINT8_MACRO(flags, 10) + ISTRING_MACRO(material, 11) + FORMID_MACRO(sound, 12) + FORMID_MACRO(effect, 13) + UINT16_MACRO(damage, 14) + FLOAT32_MACRO(unknown1, 15) + FLOAT32_MACRO(unknown2, 16) + FLOAT32_MACRO(unknown3, 17) + FLOAT32_MACRO(unknown4, 18) + FLOAT32_MACRO(sunPower, 19) + FLOAT32_MACRO(reflectAmt, 20) + FLOAT32_MACRO(fresnelAmt, 21) + UINT8_ARRAY_MACRO(unused1, 22, 4) + FLOAT32_MACRO(fogNear, 23) + FLOAT32_MACRO(fogFar, 24) + UINT8_MACRO(shallowRed, 25) + UINT8_MACRO(shallowGreen, 26) + UINT8_MACRO(shallowBlue, 27) + UINT8_ARRAY_MACRO(unused2, 28, 1) + UINT8_MACRO(deepRed, 29) + UINT8_MACRO(deepGreen, 30) + UINT8_MACRO(deepBlue, 31) + UINT8_ARRAY_MACRO(unused3, 32, 1) + UINT8_MACRO(reflRed, 33) + UINT8_MACRO(reflGreen, 34) + UINT8_MACRO(reflBlue, 35) + UINT8_ARRAY_MACRO(unused4, 36, 1) + UINT8_ARRAY_MACRO(unused5, 37, 4) + FLOAT32_MACRO(rainForce, 38) + FLOAT32_MACRO(rainVelocity, 39) + FLOAT32_MACRO(rainFalloff, 40) + FLOAT32_MACRO(rainDampner, 41) + FLOAT32_MACRO(dispSize, 42) + FLOAT32_MACRO(dispForce, 43) + FLOAT32_MACRO(dispVelocity, 44) + FLOAT32_MACRO(dispFalloff, 45) + FLOAT32_MACRO(dispDampner, 46) + FLOAT32_MACRO(rainSize, 47) + FLOAT32_MACRO(normalsNoiseScale, 48) + FLOAT32_MACRO(noise1Direction, 49) + FLOAT32_MACRO(noise2Direction, 50) + FLOAT32_MACRO(noise3Direction, 51) + FLOAT32_MACRO(noise1Speed, 52) + FLOAT32_MACRO(noise2Speed, 53) + FLOAT32_MACRO(noise3Speed, 54) + FLOAT32_MACRO(normalsFalloffStart, 55) + FLOAT32_MACRO(normalsFalloffEnd, 56) + FLOAT32_MACRO(fogAmt, 57) + FLOAT32_MACRO(normalsUVScale, 58) + FLOAT32_MACRO(underFogAmt, 59) + FLOAT32_MACRO(underFogNear, 60) + FLOAT32_MACRO(underFogFar, 61) + FLOAT32_MACRO(distAmt, 62) + FLOAT32_MACRO(shininess, 63) + FLOAT32_MACRO(hdrMult, 64) + FLOAT32_MACRO(lightRadius, 65) + FLOAT32_MACRO(lightBright, 66) + FLOAT32_MACRO(noise1UVScale, 67) + FLOAT32_MACRO(noise2UVScale, 68) + FLOAT32_MACRO(noise3UVScale, 69) + FLOAT32_MACRO(noise1AmpScale, 70) + FLOAT32_MACRO(noise2AmpScale, 71) + FLOAT32_MACRO(noise3AmpScale, 72) + FORMID_MACRO(dayWater, 73) + FORMID_MACRO(nightWater, 74) + FORMID_MACRO(underWater, 75) + BasicFlagMACRO(IsCausesDamage, flags, 0x01) + BasicFlagMACRO(IsReflective, flags, 0x02) + exportattrs = copyattrs = FnvBaseRecord.baseattrs + ['full', 'noisePath', 'opacity', 'flags', + 'material', 'sound', 'effect', 'damage', + 'unknown1', 'unknown2', 'unknown3', 'unknown4', + 'sunPower', 'reflectAmt', 'fresnelAmt', + 'fogNear', 'fogFar', + 'shallowRed', 'shallowGreen', 'shallowBlue', + 'deepRed', 'deepGreen', 'deepBlue', + 'reflRed', 'reflGreen', 'reflBlue', + 'rainForce', 'rainVelocity', 'rainFalloff', + 'rainDampner', 'dispSize', 'dispForce', + 'dispVelocity', 'dispFalloff', 'dispDampner', + 'rainSize', 'normalsNoiseScale', + 'noise1Direction', 'noise2Direction', 'noise3Direction', + 'noise1Speed', 'noise2Speed', 'noise3Speed', + 'normalsFalloffStart', 'normalsFalloffEnd', + 'fogAmt', 'normalsUVScale', 'underFogAmt', 'underFogNear', + 'underFogFar', 'distAmt', 'shininess', 'hdrMult', + 'lightRadius', 'lightBright', + 'noise1UVScale', 'noise2UVScale', 'noise3UVScale', + 'noise1AmpScale', 'noise2AmpScale', 'noise3AmpScale', + 'dayWater', 'nightWater', 'underWater'] class FnvEFSHRecord(FnvBaseRecord): _Type = 'EFSH' - - exportattrs = copyattrs = FnvBaseRecord.baseattrs + [] + ISTRING_MACRO(fillPath, 7) + ISTRING_MACRO(particlePath, 8) + ISTRING_MACRO(holesPath, 9) + UINT8_FLAG_MACRO(flags, 10) + UINT8_ARRAY_MACRO(unused1, 11, 3) + UINT32_MACRO(memSBlend, 12) + UINT32_MACRO(memBlendOp, 13) + UINT32_MACRO(memZFunc, 14) + UINT8_MACRO(fillRed, 15) + UINT8_MACRO(fillGreen, 16) + UINT8_MACRO(fillBlue, 17) + UINT8_ARRAY_MACRO(unused2, 18, 1) + FLOAT32_MACRO(fillAIn, 19) + FLOAT32_MACRO(fillAFull, 20) + FLOAT32_MACRO(fillAOut, 21) + FLOAT32_MACRO(fillAPRatio, 22) + FLOAT32_MACRO(fillAAmp, 23) + FLOAT32_MACRO(fillAFreq, 24) + FLOAT32_MACRO(fillAnimSpdU, 25) + FLOAT32_MACRO(fillAnimSpdV, 26) + FLOAT32_MACRO(edgeEffOff, 27) + UINT8_MACRO(edgeEffRed, 28) + UINT8_MACRO(edgeEffGreen, 29) + UINT8_MACRO(edgeEffBlue, 30) + UINT8_ARRAY_MACRO(unused3, 31, 1) + FLOAT32_MACRO(edgeEffAIn, 32) + FLOAT32_MACRO(edgeEffAFull, 33) + FLOAT32_MACRO(edgeEffAOut, 34) + FLOAT32_MACRO(edgeEffAPRatio, 35) + FLOAT32_MACRO(edgeEffAAmp, 36) + FLOAT32_MACRO(edgeEffAFreq, 37) + FLOAT32_MACRO(fillAFRatio, 38) + FLOAT32_MACRO(edgeEffAFRatio, 39) + UINT32_MACRO(memDBlend, 40) + UINT32_MACRO(partSBlend, 41) + UINT32_MACRO(partBlendOp, 42) + UINT32_MACRO(partZFunc, 43) + UINT32_MACRO(partDBlend, 44) + FLOAT32_MACRO(partBUp, 45) + FLOAT32_MACRO(partBFull, 46) + FLOAT32_MACRO(partBDown, 47) + FLOAT32_MACRO(partBFRatio, 48) + FLOAT32_MACRO(partBPRatio, 49) + FLOAT32_MACRO(partLTime, 50) + FLOAT32_MACRO(partLDelta, 51) + FLOAT32_MACRO(partNSpd, 52) + FLOAT32_MACRO(partNAcc, 53) + FLOAT32_MACRO(partVel1, 54) + FLOAT32_MACRO(partVel2, 55) + FLOAT32_MACRO(partVel3, 56) + FLOAT32_MACRO(partAcc1, 57) + FLOAT32_MACRO(partAcc2, 58) + FLOAT32_MACRO(partAcc3, 59) + FLOAT32_MACRO(partKey1, 60) + FLOAT32_MACRO(partKey2, 61) + FLOAT32_MACRO(partKey1Time, 62) + FLOAT32_MACRO(partKey2Time, 63) + UINT8_MACRO(key1Red, 64) + UINT8_MACRO(key1Green, 65) + UINT8_MACRO(key1Blue, 66) + UINT8_ARRAY_MACRO(unused4, 67, 1) + UINT8_MACRO(key2Red, 68) + UINT8_MACRO(key2Green, 69) + UINT8_MACRO(key2Blue, 70) + UINT8_ARRAY_MACRO(unused5, 71, 1) + UINT8_MACRO(key3Red, 72) + UINT8_MACRO(key3Green, 73) + UINT8_MACRO(key3Blue, 74) + UINT8_ARRAY_MACRO(unused6, 75, 1) + FLOAT32_MACRO(key1A, 76) + FLOAT32_MACRO(key2A, 77) + FLOAT32_MACRO(key3A, 78) + FLOAT32_MACRO(key1Time, 79) + FLOAT32_MACRO(key2Time, 80) + FLOAT32_MACRO(key3Time, 81) + FLOAT32_MACRO(partInitSpd, 82) + FLOAT32_MACRO(partInitRot, 83) + FLOAT32_MACRO(partInitRotDelta, 84) + FLOAT32_MACRO(partRotSpd, 85) + FLOAT32_MACRO(partRotDelta, 86) + FORMID_MACRO(addon, 87) + FLOAT32_MACRO(holesSTime, 88) + FLOAT32_MACRO(holesETime, 89) + FLOAT32_MACRO(holesSValue, 90) + FLOAT32_MACRO(holesEValue, 91) + FLOAT32_MACRO(edgeWidth, 92) + UINT8_MACRO(edgeRed, 93) + UINT8_MACRO(edgeGreen, 94) + UINT8_MACRO(edgeBlue, 95) + UINT8_ARRAY_MACRO(unused7, 96, 1) + FLOAT32_MACRO(explWindSpd, 97) + UINT32_MACRO(textCountU, 98) + UINT32_MACRO(textCountV, 99) + FLOAT32_MACRO(addonFITime, 100) + FLOAT32_MACRO(addonFOTime, 101) + FLOAT32_MACRO(addonScaleStart, 102) + FLOAT32_MACRO(addonScaleEnd, 103) + FLOAT32_MACRO(addonScaleInTime, 104) + FLOAT32_MACRO(addonScaleOutTime, 105) + + BasicFlagMACRO(IsNoMemShader, flags, 0x00000001) + BasicFlagMACRO(IsNoPartShader, flags, 0x00000008) + BasicFlagMACRO(IsEdgeInverse, flags, 0x00000010) + BasicFlagMACRO(IsMemSkinOnly, flags, 0x00000020) + exportattrs = copyattrs = FnvBaseRecord.baseattrs + ['fillPath', 'particlePath', 'holesPath', + 'flags', 'memSBlend', 'memBlendOp', + 'memZFunc', + 'fillRed', 'fillGreen', 'fillBlue', + 'fillAIn', 'fillAFull', 'fillAOut', + 'fillAPRatio', 'fillAAmp', 'fillAFreq', + 'fillAnimSpdU', 'fillAnimSpdV', + 'edgeEffOff', + 'edgeEffRed', 'edgeEffGreen', 'edgeEffBlue', + 'edgeEffAIn', 'edgeEffAFull', 'edgeEffAOut', + 'edgeEffAPRatio', 'edgeEffAAmp', + 'edgeEffAFreq', 'fillAFRatio', + 'edgeEffAFRatio', 'memDBlend', 'partSBlend', + 'partBlendOp', 'partZFunc', 'partDBlend', + 'partBUp', 'partBFull', 'partBDown', + 'partBFRatio', 'partBPRatio', 'partLTime', + 'partLDelta', 'partNSpd', 'partNAcc', + 'partVel1', 'partVel2', 'partVel3', + 'partAcc1', 'partAcc2', 'partAcc3', + 'partKey1', 'partKey2', + 'partKey1Time', 'partKey2Time', + 'key1Red', 'key1Green', 'key1Blue', + 'key2Red', 'key2Green', 'key2Blue', + 'key3Red', 'key3Green', 'key3Blue', + 'key1A', 'key2A', 'key3A', + 'key1Time', 'key2Time', 'key3Time', + 'partInitSpd', 'partInitRot', + 'partInitRotDelta', 'partRotSpd', + 'partRotDelta', 'addon', 'holesSTime', + 'holesETime', 'holesSValue', 'holesEValue', + 'edgeWidth', + 'edgeRed', 'edgeGreen', 'edgeBlue', + 'explWindSpd', 'textCountU', 'textCountV', + 'addonFITime', 'addonFOTime', + 'addonScaleStart', 'addonScaleEnd', + 'addonScaleInTime', 'addonScaleOutTime'] class FnvEXPLRecord(FnvBaseRecord): _Type = 'EXPL' - - exportattrs = copyattrs = FnvBaseRecord.baseattrs + [] + SINT16_MACRO(boundX1, 7) + SINT16_MACRO(boundY1, 8) + SINT16_MACRO(boundZ1, 9) + SINT16_MACRO(boundX2, 10) + SINT16_MACRO(boundY2, 11) + SINT16_MACRO(boundZ2, 12) + STRING_MACRO(full, 13) + ISTRING_MACRO(modPath, 14) + FLOAT32_MACRO(modb, 15) + UINT8_ARRAY_MACRO(modt_p, 16) + + LIST_MACRO(altTextures, 17, FNVAltTexture) + UINT8_FLAG_MACRO(modelFlags, 18) + FORMID_MACRO(effect, 19) + FORMID_MACRO(imageSpace, 20) + FLOAT32_MACRO(force, 21) + FLOAT32_MACRO(damage, 22) + FLOAT32_MACRO(radius, 23) + FORMID_MACRO(light, 24) + FORMID_MACRO(sound1, 25) + UINT32_FLAG_MACRO(flags, 26) + FLOAT32_MACRO(ISRadius, 27) + FORMID_MACRO(impactDataSet, 28) + FORMID_MACRO(sound2, 29) + FLOAT32_MACRO(radLevel, 30) + FLOAT32_MACRO(radTime, 31) + FLOAT32_MACRO(radRadius, 32) + UINT32_MACRO(soundLevel, 33) + FORMID_MACRO(impact, 34) + + BasicFlagMACRO(IsUnknown1, flags, 0x00000001) + BasicFlagMACRO(IsAlwaysUsesWorldOrientation, flags, 0x00000002) + BasicFlagMACRO(IsAlwaysKnockDown, flags, 0x00000004) + BasicFlagMACRO(IsFormulaKnockDown, flags, 0x00000008) + BasicFlagMACRO(IsIgnoreLOS, flags, 0x00000010) + BasicFlagMACRO(IsPushExplosionSourceRefOnly, flags, 0x00000020) + BasicFlagMACRO(IsIgnoreImageSpaceSwap, flags, 0x00000040) + + BasicFlagMACRO(IsHead, modelFlags, 0x01) + BasicFlagMACRO(IsTorso, modelFlags, 0x02) + BasicFlagMACRO(IsRightHand, modelFlags, 0x04) + BasicFlagMACRO(IsLeftHand, modelFlags, 0x08) + + BasicTypeMACRO(IsLoud, soundLevel, 0, IsNormal) + BasicTypeMACRO(IsNormal, soundLevel, 1, IsLoud) + BasicTypeMACRO(IsSilent, soundLevel, 2, IsLoud) + copyattrs = FnvBaseRecord.baseattrs + ['boundX1', 'boundY1', 'boundZ1', + 'boundX2', 'boundY2', 'boundZ2', + 'full', 'modPath', 'modb', 'modt_p', + 'altTextures_list', 'modelFlags', + 'effect', 'imageSpace', 'force', + 'damage', 'radius', 'light', + 'sound1', 'flags', 'ISRadius', + 'impactDataSet', 'sound2', + 'radLevel', 'radTime', + 'radRadius', 'soundLevel', 'impact'] + exportattrs = FnvBaseRecord.baseattrs + ['boundX1', 'boundY1', 'boundZ1', + 'boundX2', 'boundY2', 'boundZ2', + 'full', 'modPath', 'modb', + 'altTextures_list', 'modelFlags', + 'effect', 'imageSpace', 'force', + 'damage', 'radius', 'light', + 'sound1', 'flags', 'ISRadius', + 'impactDataSet', 'sound2', + 'radLevel', 'radTime', + 'radRadius', 'soundLevel', 'impact']# 'modt_p', class FnvDEBRRecord(FnvBaseRecord): _Type = 'DEBR' - - exportattrs = copyattrs = FnvBaseRecord.baseattrs + [] + class DebrisModel(ListComponent): + UINT8_LISTMACRO(percentage, 1) + ISTRING_LISTMACRO(modPath, 2) + UINT8_FLAG_LISTMACRO(flags, 3) + UINT8_ARRAY_LISTMACRO(modt_p, 4) + + BasicFlagMACRO(IsHasCollisionData, flags, 0x01) + copyattrs = ['percentage', 'modPath', 'flags', 'modt_p'] + exportattrs = ['percentage', 'modPath', 'flags']#, 'modt_p' + + LIST_MACRO(models, 7, self.DebrisModel) + exportattrs = copyattrs = FnvBaseRecord.baseattrs + ['models_list'] class FnvIMGSRecord(FnvBaseRecord): _Type = 'IMGS' diff --git a/release/cint.py b/release/cint.py index 366afce..2a4ef3c 100644 --- a/release/cint.py +++ b/release/cint.py @@ -9241,28 +9241,359 @@ def create_location(self): class FnvANIORecord(FnvBaseRecord): _Type = 'ANIO' + modPath = CBashISTRING(7) + modb = CBashFLOAT32(8) + modt_p = CBashUINT8ARRAY(9) + + def create_altTexture(self): + length = CBash.GetFieldAttribute(self._CollectionID, self._ModID, self._RecordID, 10, 0, 0, 0, 0, 0, 0, 1) + CBash.SetField(self._CollectionID, self._ModID, self._RecordID, 10, 0, 0, 0, 0, 0, 0, 0, c_ulong(length + 1)) + return FNVAltTexture(self._CollectionID, self._ModID, self._RecordID, 10, length) + altTextures = CBashLIST(10, FNVAltTexture) + altTextures_list = CBashLIST(10, FNVAltTexture, True) - exportattrs = copyattrs = FnvBaseRecord.baseattrs + [] + modelFlags = CBashGeneric(11, c_ubyte) + animation = CBashFORMID(12) + copyattrs = FnvBaseRecord.baseattrs + ['modPath', 'modb', 'modt_p', + 'altTextures_list', + 'modelFlags', 'animation'] + exportattrs = FnvBaseRecord.baseattrs + ['modPath', 'modb', + 'altTextures_list', + 'modelFlags', 'animation']# 'modt_p', class FnvWATRRecord(FnvBaseRecord): _Type = 'WATR' - - exportattrs = copyattrs = FnvBaseRecord.baseattrs + [] + full = CBashSTRING(7) + noisePath = CBashISTRING(8) + opacity = CBashGeneric(9, c_ubyte) + flags = CBashGeneric(10, c_ubyte) + material = CBashISTRING(11) + sound = CBashFORMID(12) + effect = CBashFORMID(13) + damage = CBashGeneric(14, c_ushort) + unknown1 = CBashFLOAT32(15) + unknown2 = CBashFLOAT32(16) + unknown3 = CBashFLOAT32(17) + unknown4 = CBashFLOAT32(18) + sunPower = CBashFLOAT32(19) + reflectAmt = CBashFLOAT32(20) + fresnelAmt = CBashFLOAT32(21) + unused1 = CBashUINT8ARRAY(22, 4) + fogNear = CBashFLOAT32(23) + fogFar = CBashFLOAT32(24) + shallowRed = CBashGeneric(25, c_ubyte) + shallowGreen = CBashGeneric(26, c_ubyte) + shallowBlue = CBashGeneric(27, c_ubyte) + unused2 = CBashUINT8ARRAY(28, 1) + deepRed = CBashGeneric(29, c_ubyte) + deepGreen = CBashGeneric(30, c_ubyte) + deepBlue = CBashGeneric(31, c_ubyte) + unused3 = CBashUINT8ARRAY(32, 1) + reflRed = CBashGeneric(33, c_ubyte) + reflGreen = CBashGeneric(34, c_ubyte) + reflBlue = CBashGeneric(35, c_ubyte) + unused4 = CBashUINT8ARRAY(36, 1) + unused5 = CBashUINT8ARRAY(37, 4) + rainForce = CBashFLOAT32(38) + rainVelocity = CBashFLOAT32(39) + rainFalloff = CBashFLOAT32(40) + rainDampner = CBashFLOAT32(41) + dispSize = CBashFLOAT32(42) + dispForce = CBashFLOAT32(43) + dispVelocity = CBashFLOAT32(44) + dispFalloff = CBashFLOAT32(45) + dispDampner = CBashFLOAT32(46) + rainSize = CBashFLOAT32(47) + normalsNoiseScale = CBashFLOAT32(48) + noise1Direction = CBashFLOAT32(49) + noise2Direction = CBashFLOAT32(50) + noise3Direction = CBashFLOAT32(51) + noise1Speed = CBashFLOAT32(52) + noise2Speed = CBashFLOAT32(53) + noise3Speed = CBashFLOAT32(54) + normalsFalloffStart = CBashFLOAT32(55) + normalsFalloffEnd = CBashFLOAT32(56) + fogAmt = CBashFLOAT32(57) + normalsUVScale = CBashFLOAT32(58) + underFogAmt = CBashFLOAT32(59) + underFogNear = CBashFLOAT32(60) + underFogFar = CBashFLOAT32(61) + distAmt = CBashFLOAT32(62) + shininess = CBashFLOAT32(63) + hdrMult = CBashFLOAT32(64) + lightRadius = CBashFLOAT32(65) + lightBright = CBashFLOAT32(66) + noise1UVScale = CBashFLOAT32(67) + noise2UVScale = CBashFLOAT32(68) + noise3UVScale = CBashFLOAT32(69) + noise1AmpScale = CBashFLOAT32(70) + noise2AmpScale = CBashFLOAT32(71) + noise3AmpScale = CBashFLOAT32(72) + dayWater = CBashFORMID(73) + nightWater = CBashFORMID(74) + underWater = CBashFORMID(75) + IsCausesDamage = CBashBasicFlag('flags', 0x01) + IsReflective = CBashBasicFlag('flags', 0x02) + exportattrs = copyattrs = FnvBaseRecord.baseattrs + ['full', 'noisePath', 'opacity', 'flags', + 'material', 'sound', 'effect', 'damage', + 'unknown1', 'unknown2', 'unknown3', 'unknown4', + 'sunPower', 'reflectAmt', 'fresnelAmt', + 'fogNear', 'fogFar', + 'shallowRed', 'shallowGreen', 'shallowBlue', + 'deepRed', 'deepGreen', 'deepBlue', + 'reflRed', 'reflGreen', 'reflBlue', + 'rainForce', 'rainVelocity', 'rainFalloff', + 'rainDampner', 'dispSize', 'dispForce', + 'dispVelocity', 'dispFalloff', 'dispDampner', + 'rainSize', 'normalsNoiseScale', + 'noise1Direction', 'noise2Direction', 'noise3Direction', + 'noise1Speed', 'noise2Speed', 'noise3Speed', + 'normalsFalloffStart', 'normalsFalloffEnd', + 'fogAmt', 'normalsUVScale', 'underFogAmt', 'underFogNear', + 'underFogFar', 'distAmt', 'shininess', 'hdrMult', + 'lightRadius', 'lightBright', + 'noise1UVScale', 'noise2UVScale', 'noise3UVScale', + 'noise1AmpScale', 'noise2AmpScale', 'noise3AmpScale', + 'dayWater', 'nightWater', 'underWater'] class FnvEFSHRecord(FnvBaseRecord): _Type = 'EFSH' - - exportattrs = copyattrs = FnvBaseRecord.baseattrs + [] + fillPath = CBashISTRING(7) + particlePath = CBashISTRING(8) + holesPath = CBashISTRING(9) + flags = CBashGeneric(10, c_ubyte) + unused1 = CBashUINT8ARRAY(11, 3) + memSBlend = CBashGeneric(12, c_ulong) + memBlendOp = CBashGeneric(13, c_ulong) + memZFunc = CBashGeneric(14, c_ulong) + fillRed = CBashGeneric(15, c_ubyte) + fillGreen = CBashGeneric(16, c_ubyte) + fillBlue = CBashGeneric(17, c_ubyte) + unused2 = CBashUINT8ARRAY(18, 1) + fillAIn = CBashFLOAT32(19) + fillAFull = CBashFLOAT32(20) + fillAOut = CBashFLOAT32(21) + fillAPRatio = CBashFLOAT32(22) + fillAAmp = CBashFLOAT32(23) + fillAFreq = CBashFLOAT32(24) + fillAnimSpdU = CBashFLOAT32(25) + fillAnimSpdV = CBashFLOAT32(26) + edgeEffOff = CBashFLOAT32(27) + edgeEffRed = CBashGeneric(28, c_ubyte) + edgeEffGreen = CBashGeneric(29, c_ubyte) + edgeEffBlue = CBashGeneric(30, c_ubyte) + unused3 = CBashUINT8ARRAY(31, 1) + edgeEffAIn = CBashFLOAT32(32) + edgeEffAFull = CBashFLOAT32(33) + edgeEffAOut = CBashFLOAT32(34) + edgeEffAPRatio = CBashFLOAT32(35) + edgeEffAAmp = CBashFLOAT32(36) + edgeEffAFreq = CBashFLOAT32(37) + fillAFRatio = CBashFLOAT32(38) + edgeEffAFRatio = CBashFLOAT32(39) + memDBlend = CBashGeneric(40, c_ulong) + partSBlend = CBashGeneric(41, c_ulong) + partBlendOp = CBashGeneric(42, c_ulong) + partZFunc = CBashGeneric(43, c_ulong) + partDBlend = CBashGeneric(44, c_ulong) + partBUp = CBashFLOAT32(45) + partBFull = CBashFLOAT32(46) + partBDown = CBashFLOAT32(47) + partBFRatio = CBashFLOAT32(48) + partBPRatio = CBashFLOAT32(49) + partLTime = CBashFLOAT32(50) + partLDelta = CBashFLOAT32(51) + partNSpd = CBashFLOAT32(52) + partNAcc = CBashFLOAT32(53) + partVel1 = CBashFLOAT32(54) + partVel2 = CBashFLOAT32(55) + partVel3 = CBashFLOAT32(56) + partAcc1 = CBashFLOAT32(57) + partAcc2 = CBashFLOAT32(58) + partAcc3 = CBashFLOAT32(59) + partKey1 = CBashFLOAT32(60) + partKey2 = CBashFLOAT32(61) + partKey1Time = CBashFLOAT32(62) + partKey2Time = CBashFLOAT32(63) + key1Red = CBashGeneric(64, c_ubyte) + key1Green = CBashGeneric(65, c_ubyte) + key1Blue = CBashGeneric(66, c_ubyte) + unused4 = CBashUINT8ARRAY(67, 1) + key2Red = CBashGeneric(68, c_ubyte) + key2Green = CBashGeneric(69, c_ubyte) + key2Blue = CBashGeneric(70, c_ubyte) + unused5 = CBashUINT8ARRAY(71, 1) + key3Red = CBashGeneric(72, c_ubyte) + key3Green = CBashGeneric(73, c_ubyte) + key3Blue = CBashGeneric(74, c_ubyte) + unused6 = CBashUINT8ARRAY(75, 1) + key1A = CBashFLOAT32(76) + key2A = CBashFLOAT32(77) + key3A = CBashFLOAT32(78) + key1Time = CBashFLOAT32(79) + key2Time = CBashFLOAT32(80) + key3Time = CBashFLOAT32(81) + partInitSpd = CBashFLOAT32(82) + partInitRot = CBashFLOAT32(83) + partInitRotDelta = CBashFLOAT32(84) + partRotSpd = CBashFLOAT32(85) + partRotDelta = CBashFLOAT32(86) + addon = CBashFORMID(87) + holesSTime = CBashFLOAT32(88) + holesETime = CBashFLOAT32(89) + holesSValue = CBashFLOAT32(90) + holesEValue = CBashFLOAT32(91) + edgeWidth = CBashFLOAT32(92) + edgeRed = CBashGeneric(93, c_ubyte) + edgeGreen = CBashGeneric(94, c_ubyte) + edgeBlue = CBashGeneric(95, c_ubyte) + unused7 = CBashUINT8ARRAY(96, 1) + explWindSpd = CBashFLOAT32(97) + textCountU = CBashGeneric(98, c_ulong) + textCountV = CBashGeneric(99, c_ulong) + addonFITime = CBashFLOAT32(100) + addonFOTime = CBashFLOAT32(101) + addonScaleStart = CBashFLOAT32(102) + addonScaleEnd = CBashFLOAT32(103) + addonScaleInTime = CBashFLOAT32(104) + addonScaleOutTime = CBashFLOAT32(105) + + IsNoMemShader = CBashBasicFlag('flags', 0x00000001) + IsNoPartShader = CBashBasicFlag('flags', 0x00000008) + IsEdgeInverse = CBashBasicFlag('flags', 0x00000010) + IsMemSkinOnly = CBashBasicFlag('flags', 0x00000020) + exportattrs = copyattrs = FnvBaseRecord.baseattrs + ['fillPath', 'particlePath', 'holesPath', + 'flags', 'memSBlend', 'memBlendOp', + 'memZFunc', + 'fillRed', 'fillGreen', 'fillBlue', + 'fillAIn', 'fillAFull', 'fillAOut', + 'fillAPRatio', 'fillAAmp', 'fillAFreq', + 'fillAnimSpdU', 'fillAnimSpdV', + 'edgeEffOff', + 'edgeEffRed', 'edgeEffGreen', 'edgeEffBlue', + 'edgeEffAIn', 'edgeEffAFull', 'edgeEffAOut', + 'edgeEffAPRatio', 'edgeEffAAmp', + 'edgeEffAFreq', 'fillAFRatio', + 'edgeEffAFRatio', 'memDBlend', 'partSBlend', + 'partBlendOp', 'partZFunc', 'partDBlend', + 'partBUp', 'partBFull', 'partBDown', + 'partBFRatio', 'partBPRatio', 'partLTime', + 'partLDelta', 'partNSpd', 'partNAcc', + 'partVel1', 'partVel2', 'partVel3', + 'partAcc1', 'partAcc2', 'partAcc3', + 'partKey1', 'partKey2', + 'partKey1Time', 'partKey2Time', + 'key1Red', 'key1Green', 'key1Blue', + 'key2Red', 'key2Green', 'key2Blue', + 'key3Red', 'key3Green', 'key3Blue', + 'key1A', 'key2A', 'key3A', + 'key1Time', 'key2Time', 'key3Time', + 'partInitSpd', 'partInitRot', + 'partInitRotDelta', 'partRotSpd', + 'partRotDelta', 'addon', 'holesSTime', + 'holesETime', 'holesSValue', 'holesEValue', + 'edgeWidth', + 'edgeRed', 'edgeGreen', 'edgeBlue', + 'explWindSpd', 'textCountU', 'textCountV', + 'addonFITime', 'addonFOTime', + 'addonScaleStart', 'addonScaleEnd', + 'addonScaleInTime', 'addonScaleOutTime'] class FnvEXPLRecord(FnvBaseRecord): _Type = 'EXPL' + boundX1 = CBashGeneric(7, c_short) + boundY1 = CBashGeneric(8, c_short) + boundZ1 = CBashGeneric(9, c_short) + boundX2 = CBashGeneric(10, c_short) + boundY2 = CBashGeneric(11, c_short) + boundZ2 = CBashGeneric(12, c_short) + full = CBashSTRING(13) + modPath = CBashISTRING(14) + modb = CBashFLOAT32(15) + modt_p = CBashUINT8ARRAY(16) + + def create_altTexture(self): + length = CBash.GetFieldAttribute(self._CollectionID, self._ModID, self._RecordID, 17, 0, 0, 0, 0, 0, 0, 1) + CBash.SetField(self._CollectionID, self._ModID, self._RecordID, 17, 0, 0, 0, 0, 0, 0, 0, c_ulong(length + 1)) + return FNVAltTexture(self._CollectionID, self._ModID, self._RecordID, 17, length) + altTextures = CBashLIST(17, FNVAltTexture) + altTextures_list = CBashLIST(17, FNVAltTexture, True) - exportattrs = copyattrs = FnvBaseRecord.baseattrs + [] + modelFlags = CBashGeneric(18, c_ubyte) + effect = CBashFORMID(19) + imageSpace = CBashFORMID(20) + force = CBashFLOAT32(21) + damage = CBashFLOAT32(22) + radius = CBashFLOAT32(23) + light = CBashFORMID(24) + sound1 = CBashFORMID(25) + flags = CBashGeneric(26, c_ulong) + ISRadius = CBashFLOAT32(27) + impactDataSet = CBashFORMID(28) + sound2 = CBashFORMID(29) + radLevel = CBashFLOAT32(30) + radTime = CBashFLOAT32(31) + radRadius = CBashFLOAT32(32) + soundLevel = CBashGeneric(33, c_ulong) + impact = CBashFORMID(34) + + IsUnknown1 = CBashBasicFlag('flags', 0x00000001) + IsAlwaysUsesWorldOrientation = CBashBasicFlag('flags', 0x00000002) + IsAlwaysKnockDown = CBashBasicFlag('flags', 0x00000004) + IsFormulaKnockDown = CBashBasicFlag('flags', 0x00000008) + IsIgnoreLOS = CBashBasicFlag('flags', 0x00000010) + IsPushExplosionSourceRefOnly = CBashBasicFlag('flags', 0x00000020) + IsIgnoreImageSpaceSwap = CBashBasicFlag('flags', 0x00000040) + + IsHead = CBashBasicFlag('modelFlags', 0x01) + IsTorso = CBashBasicFlag('modelFlags', 0x02) + IsRightHand = CBashBasicFlag('modelFlags', 0x04) + IsLeftHand = CBashBasicFlag('modelFlags', 0x08) + + IsLoud = CBashBasicType('soundLevel', 0, 'IsNormal') + IsNormal = CBashBasicType('soundLevel', 1, 'IsLoud') + IsSilent = CBashBasicType('soundLevel', 2, 'IsLoud') + copyattrs = FnvBaseRecord.baseattrs + ['boundX1', 'boundY1', 'boundZ1', + 'boundX2', 'boundY2', 'boundZ2', + 'full', 'modPath', 'modb', 'modt_p', + 'altTextures_list', 'modelFlags', + 'effect', 'imageSpace', 'force', + 'damage', 'radius', 'light', + 'sound1', 'flags', 'ISRadius', + 'impactDataSet', 'sound2', + 'radLevel', 'radTime', + 'radRadius', 'soundLevel', 'impact'] + exportattrs = FnvBaseRecord.baseattrs + ['boundX1', 'boundY1', 'boundZ1', + 'boundX2', 'boundY2', 'boundZ2', + 'full', 'modPath', 'modb', + 'altTextures_list', 'modelFlags', + 'effect', 'imageSpace', 'force', + 'damage', 'radius', 'light', + 'sound1', 'flags', 'ISRadius', + 'impactDataSet', 'sound2', + 'radLevel', 'radTime', + 'radRadius', 'soundLevel', 'impact']# 'modt_p', class FnvDEBRRecord(FnvBaseRecord): _Type = 'DEBR' + class DebrisModel(ListComponent): + percentage = CBashGeneric_LIST(1, c_ubyte) + modPath = CBashISTRING_LIST(2) + flags = CBashGeneric_LIST(3, c_ubyte) + modt_p = CBashUINT8ARRAY_LIST(4) + + IsHasCollisionData = CBashBasicFlag('flags', 0x01) + copyattrs = ['percentage', 'modPath', 'flags', 'modt_p'] + exportattrs = ['percentage', 'modPath', 'flags']#, 'modt_p' + + def create_model(self): + length = CBash.GetFieldAttribute(self._CollectionID, self._ModID, self._RecordID, 7, 0, 0, 0, 0, 0, 0, 1) + CBash.SetField(self._CollectionID, self._ModID, self._RecordID, 7, 0, 0, 0, 0, 0, 0, 0, c_ulong(length + 1)) + return self.DebrisModel(self._CollectionID, self._ModID, self._RecordID, 7, length) + models = CBashLIST(7, DebrisModel) + models_list = CBashLIST(7, DebrisModel, True) - exportattrs = copyattrs = FnvBaseRecord.baseattrs + [] + exportattrs = copyattrs = FnvBaseRecord.baseattrs + ['models_list'] class FnvIMGSRecord(FnvBaseRecord): _Type = 'IMGS'