diff --git a/CBash.suo b/CBash.suo index 2c7094e..a35790e 100644 Binary files a/CBash.suo and b/CBash.suo differ diff --git a/CBash/CBash.vcproj b/CBash/CBash.vcproj index d36b3e0..e1d8b0f 100644 --- a/CBash/CBash.vcproj +++ b/CBash/CBash.vcproj @@ -1294,6 +1294,37 @@ /> + + + + + + + + + + + @@ -1981,6 +2012,37 @@ /> + + + + + + + + + + + @@ -2183,6 +2245,37 @@ /> + + + + + + + + + + + + + + + + + + + + + + @@ -3064,6 +3188,37 @@ /> + + + + + + + + + + + @@ -3266,6 +3421,37 @@ /> + + + + + + + + + + + diff --git a/CBash/Common.h b/CBash/Common.h index 9c6d04f..3149cf9 100644 --- a/CBash/Common.h +++ b/CBash/Common.h @@ -2095,6 +2095,13 @@ struct UnorderedPackedArray if(value.size()) writer.record_write_subrecord(_Type, &value[0], (UINT32)value.size() * sizeof(T)); } + void ReqWrite(UINT32 _Type, FileWriter &writer) + { + if(value.size()) + writer.record_write_subrecord(_Type, &value[0], (UINT32)value.size() * sizeof(T)); + else + writer.record_write_subheader(_Type, 0); + } UnorderedPackedArray& operator = (const UnorderedPackedArray &rhs) { diff --git a/CBash/FalloutNewVegas/FNVFile.cpp b/CBash/FalloutNewVegas/FNVFile.cpp index 67e002d..6562565 100644 --- a/CBash/FalloutNewVegas/FNVFile.cpp +++ b/CBash/FalloutNewVegas/FNVFile.cpp @@ -500,22 +500,22 @@ SINT32 FNVFile::Load(RecordOp &indexer, std::vector &Expanders break; //case eIgWTHR: //Same as normal case 'RHTW': - //reader.read(&WTHR.stamp, 4); - //reader.read(&WTHR.unknown, 4); - //WTHR.Skim(reader, GRUPSize, processor, indexer); - //break; + reader.read(&WTHR.stamp, 4); + reader.read(&WTHR.unknown, 4); + WTHR.Skim(reader, GRUPSize, processor, indexer); + break; case eIgCLMT: case 'TMLC': - //reader.read(&CLMT.stamp, 4); - //reader.read(&CLMT.unknown, 4); - //CLMT.Skim(reader, GRUPSize, processor, indexer); - //break; + reader.read(&CLMT.stamp, 4); + reader.read(&CLMT.unknown, 4); + CLMT.Skim(reader, GRUPSize, processor, indexer); + break; case eIgREGN: case 'NGER': - //reader.read(®N.stamp, 4); - //reader.read(®N.unknown, 4); - //REGN.Skim(reader, GRUPSize, processor, indexer); - //break; + reader.read(®N.stamp, 4); + reader.read(®N.unknown, 4); + REGN.Skim(reader, GRUPSize, processor, indexer); + break; case eIgNAVI: case 'IVAN': //reader.read(&NAVI.stamp, 4); @@ -949,11 +949,11 @@ UINT32 FNVFile::GetNumRecords(const UINT32 &RecordType) case 'ILVL': return (UINT32)LVLI.Records.size(); case 'RHTW': - //return (UINT32)WTHR.Records.size(); + return (UINT32)WTHR.Records.size(); case 'TMLC': - //return (UINT32)CLMT.Records.size(); + return (UINT32)CLMT.Records.size(); case 'NGER': - //return (UINT32)REGN.Records.size(); + return (UINT32)REGN.Records.size(); case 'IVAN': //return (UINT32)NAVI.Records.size(); case 'LLEC': @@ -1278,17 +1278,17 @@ Record * FNVFile::CreateRecord(const UINT32 &RecordType, STRING const &RecordEdi newRecord = LVLI.Records.back(); break; case 'RHTW': - //WTHR.Records.push_back(new FNV::WTHRRecord((FNV::WTHRRecord *)SourceRecord)); - //newRecord = WTHR.Records.back(); - //break; + WTHR.Records.push_back(new FNV::WTHRRecord((FNV::WTHRRecord *)SourceRecord)); + newRecord = WTHR.Records.back(); + break; case 'TMLC': - //CLMT.Records.push_back(new FNV::CLMTRecord((FNV::CLMTRecord *)SourceRecord)); - //newRecord = CLMT.Records.back(); - //break; + CLMT.Records.push_back(new FNV::CLMTRecord((FNV::CLMTRecord *)SourceRecord)); + newRecord = CLMT.Records.back(); + break; case 'NGER': - //REGN.Records.push_back(new FNV::REGNRecord((FNV::REGNRecord *)SourceRecord)); - //newRecord = REGN.Records.back(); - //break; + REGN.Records.push_back(new FNV::REGNRecord((FNV::REGNRecord *)SourceRecord)); + newRecord = REGN.Records.back(); + break; case 'IVAN': //NAVI.Records.push_back(new FNV::NAVIRecord((FNV::NAVIRecord *)SourceRecord)); //newRecord = NAVI.Records.back(); @@ -1571,9 +1571,9 @@ SINT32 FNVFile::CleanMasters(std::vector &Expanders) if(COBJ.VisitRecords(NULL, checker, false)) continue; if(PROJ.VisitRecords(NULL, checker, false)) continue; if(LVLI.VisitRecords(NULL, checker, false)) continue; - //if(WTHR.VisitRecords(NULL, checker, false)) continue; - //if(CLMT.VisitRecords(NULL, checker, false)) continue; - //if(REGN.VisitRecords(NULL, checker, false)) continue; + if(WTHR.VisitRecords(NULL, checker, false)) continue; + if(CLMT.VisitRecords(NULL, checker, false)) continue; + if(REGN.VisitRecords(NULL, checker, false)) continue; //if(NAVI.VisitRecords(NULL, checker, false)) continue; //if(CELL.VisitRecords(NULL, checker, false)) continue; //if(WRLD.VisitRecords(NULL, checker, false)) continue; @@ -1709,9 +1709,9 @@ SINT32 FNVFile::Save(STRING const &SaveName, std::vector &Expa formCount += COBJ.WriteGRUP('JBOC', writer, Expanders, expander, collapser, bMastersChanged, CloseMod); formCount += PROJ.WriteGRUP('JORP', writer, Expanders, expander, collapser, bMastersChanged, CloseMod); formCount += LVLI.WriteGRUP('ILVL', writer, Expanders, expander, collapser, bMastersChanged, CloseMod); - //formCount += WTHR.WriteGRUP('RHTW', writer, Expanders, expander, collapser, bMastersChanged, CloseMod); - //formCount += CLMT.WriteGRUP('TMLC', writer, Expanders, expander, collapser, bMastersChanged, CloseMod); - //formCount += REGN.WriteGRUP('NGER', writer, Expanders, expander, collapser, bMastersChanged, CloseMod); + formCount += WTHR.WriteGRUP('RHTW', writer, Expanders, expander, collapser, bMastersChanged, CloseMod); + formCount += CLMT.WriteGRUP('TMLC', writer, Expanders, expander, collapser, bMastersChanged, CloseMod); + formCount += REGN.WriteGRUP('NGER', writer, Expanders, expander, collapser, bMastersChanged, CloseMod); //formCount += NAVI.WriteGRUP('IVAN', writer, Expanders, expander, collapser, bMastersChanged, CloseMod); //formCount += CELL.WriteGRUP('LLEC', writer, Expanders, expander, collapser, bMastersChanged, CloseMod); //formCount += WRLD.WriteGRUP('DLRW', writer, Expanders, expander, collapser, bMastersChanged, CloseMod); @@ -1832,9 +1832,9 @@ void FNVFile::VisitAllRecords(RecordOp &op) COBJ.VisitRecords(NULL, op, true); PROJ.VisitRecords(NULL, op, true); LVLI.VisitRecords(NULL, op, true); - //WTHR.VisitRecords(NULL, op, true); - //CLMT.VisitRecords(NULL, op, true); - //REGN.VisitRecords(NULL, op, true); + WTHR.VisitRecords(NULL, op, true); + CLMT.VisitRecords(NULL, op, true); + REGN.VisitRecords(NULL, op, true); //NAVI.VisitRecords(NULL, op, true); //CELL.VisitRecords(NULL, op, true); //WRLD.VisitRecords(NULL, op, true); @@ -2049,14 +2049,14 @@ void FNVFile::VisitRecords(const UINT32 &TopRecordType, const UINT32 &RecordType LVLI.VisitRecords(RecordType, op, DeepVisit); break; case 'RHTW': - //WTHR.VisitRecords(RecordType, op, DeepVisit); - //break; + WTHR.VisitRecords(RecordType, op, DeepVisit); + break; case 'TMLC': - //CLMT.VisitRecords(RecordType, op, DeepVisit); - //break; + CLMT.VisitRecords(RecordType, op, DeepVisit); + break; case 'NGER': - //REGN.VisitRecords(RecordType, op, DeepVisit); - //break; + REGN.VisitRecords(RecordType, op, DeepVisit); + break; case 'IVAN': //NAVI.VisitRecords(RecordType, op, DeepVisit); //break; diff --git a/CBash/FalloutNewVegas/FNVFile.h b/CBash/FalloutNewVegas/FNVFile.h index 24d0686..6c0bcce 100644 --- a/CBash/FalloutNewVegas/FNVFile.h +++ b/CBash/FalloutNewVegas/FNVFile.h @@ -72,9 +72,9 @@ GPL License and Copyright Notice ============================================ #include "Records/COBJRecord.h" #include "Records/PROJRecord.h" #include "Records/LVLIRecord.h" -//#include "Records/WTHRRecord.h" -//#include "Records/CLMTRecord.h" -//#include "Records/REGNRecord.h" +#include "Records/WTHRRecord.h" +#include "Records/CLMTRecord.h" +#include "Records/REGNRecord.h" //#include "Records/NAVIRecord.h" //#include "Records/CELLRecord.h" //#include "Records/WRLDRecord.h" @@ -177,9 +177,9 @@ class FNVFile : public ModFile FNVGRUPRecords COBJ; FNVGRUPRecords PROJ; FNVGRUPRecords LVLI; - //FNVGRUPRecords WTHR; - //FNVGRUPRecords CLMT; - //FNVGRUPRecords REGN; + FNVGRUPRecords WTHR; + FNVGRUPRecords CLMT; + FNVGRUPRecords REGN; //FNVGRUPRecords NAVI; //FNVGRUPRecords CELL; //FNVGRUPRecords WRLD; diff --git a/CBash/FalloutNewVegas/Records/API/CLMTRecordAPI.cpp b/CBash/FalloutNewVegas/Records/API/CLMTRecordAPI.cpp index d026a5d..01f7b11 100644 --- a/CBash/FalloutNewVegas/Records/API/CLMTRecordAPI.cpp +++ b/CBash/FalloutNewVegas/Records/API/CLMTRecordAPI.cpp @@ -60,21 +60,44 @@ UINT32 CLMTRecord::GetFieldAttribute(FIELD_IDENTIFIERS, UINT32 WhichAttribute) return UNKNOWN_FIELD; } return UNKNOWN_FIELD; - case 7: //wlst Weather Types ,, Array - return FORMID_FIELD; - case 8: //wlst Weather Types ,, Array - return SINT32_FIELD; - case 9: //wlst Weather Types ,, Array - return FORMID_FIELD; - case 10: //fnam Sun Texture + case 7: //weathers + if(ListFieldID == 0) //weathers + { + switch(WhichAttribute) + { + case 0: //fieldType + return LIST_FIELD; + case 1: //fieldSize + return (UINT32)Weathers.value.size(); + default: + return UNKNOWN_FIELD; + } + } + + if(ListIndex >= Weathers.value.size()) + return UNKNOWN_FIELD; + + switch(ListFieldID) + { + case 1: //weather + return FORMID_FIELD; + case 2: //chance + return SINT32_FIELD; + case 3: //globalId + return FORMID_FIELD; + default: + return UNKNOWN_FIELD; + } + return UNKNOWN_FIELD; + case 8: //sunPath return ISTRING_FIELD; - case 11: //gnam Sun Glare Texture + case 9: //glarePath return ISTRING_FIELD; - case 12: //modPath + case 10: //modPath return ISTRING_FIELD; - case 13: //modb + case 11: //modb return FLOAT32_FIELD; - case 14: //modt_p + case 12: //modt_p switch(WhichAttribute) { case 0: //fieldType @@ -85,7 +108,7 @@ UINT32 CLMTRecord::GetFieldAttribute(FIELD_IDENTIFIERS, UINT32 WhichAttribute) return UNKNOWN_FIELD; } return UNKNOWN_FIELD; - case 15: //altTextures + case 13: //altTextures if(!MODL.IsLoaded()) return UNKNOWN_FIELD; @@ -96,13 +119,13 @@ UINT32 CLMTRecord::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) @@ -116,20 +139,20 @@ UINT32 CLMTRecord::GetFieldAttribute(FIELD_IDENTIFIERS, UINT32 WhichAttribute) default: return UNKNOWN_FIELD; } - - case 18: //modelFlags - return UINT8_FIELD; - case 19: //tnam TNAM ,, Struct + return UNKNOWN_FIELD; + case 14: //modelFlags + return UINT8_FLAG_FIELD; + case 15: //riseBegin return UINT8_FIELD; - case 20: //tnam TNAM ,, Struct + case 16: //riseEnd return UINT8_FIELD; - case 21: //tnam TNAM ,, Struct + case 17: //setBegin return UINT8_FIELD; - case 22: //tnam TNAM ,, Struct + case 18: //setEnd return UINT8_FIELD; - case 23: //tnam TNAM ,, Struct + case 19: //volatility return UINT8_FIELD; - case 24: //tnam TNAM ,, Struct + case 20: //phaseLength return UINT8_FIELD; default: return UNKNOWN_FIELD; @@ -155,43 +178,66 @@ void * CLMTRecord::GetField(FIELD_IDENTIFIERS, void **FieldValues) case 6: //versionControl2 *FieldValues = &versionControl2[0]; return NULL; - case 7: //wlst Weather Types ,, Array - return WLST.IsLoaded() ? &WLST->value7 : NULL; - case 8: //wlst Weather Types ,, Array - return WLST.IsLoaded() ? &WLST->value8 : NULL; - case 9: //wlst Weather Types ,, Array - return WLST.IsLoaded() ? &WLST->value9 : NULL; - case 10: //fnam Sun Texture + case 7: //weathers + if(ListIndex >= Weathers.value.size()) + return NULL; + + switch(ListFieldID) + { + case 1: //weather + return &Weathers.value[ListIndex].weather; + case 2: //chance + return &Weathers.value[ListIndex].chance; + case 3: //globalId + return &Weathers.value[ListIndex].globalId; + default: + return NULL; + } + return NULL; + case 8: //sunPath return FNAM.value; - case 11: //gnam Sun Glare Texture + case 9: //glarePath return GNAM.value; - case 12: //modPath + case 10: //modPath return MODL.IsLoaded() ? MODL->MODL.value : NULL; - case 13: //modb + case 11: //modb return MODL.IsLoaded() ? &MODL->MODB.value : NULL; - case 14: //modt_p + case 12: //modt_p *FieldValues = MODL.IsLoaded() ? MODL->MODT.value : NULL; return NULL; - case 15: //mods Alternate Textures - return MODL.IsLoaded() ? MODL->MODS.value : NULL; - case 16: //mods Alternate Textures - return MODL.IsLoaded() ? &MODL->MODS->value16 : NULL; - case 17: //mods Alternate Textures - return MODL.IsLoaded() ? &MODL->MODS->value17 : NULL; - case 18: //modelFlags - return MODL.IsLoaded() ? &MODL->MODD->value18 : NULL; - case 19: //tnam TNAM ,, Struct - return TNAM.IsLoaded() ? &TNAM->value19 : NULL; - case 20: //tnam TNAM ,, Struct - return TNAM.IsLoaded() ? &TNAM->value20 : NULL; - case 21: //tnam TNAM ,, Struct - return TNAM.IsLoaded() ? &TNAM->value21 : NULL; - case 22: //tnam TNAM ,, Struct - return TNAM.IsLoaded() ? &TNAM->value22 : NULL; - case 23: //tnam TNAM ,, Struct - return TNAM.IsLoaded() ? &TNAM->value23 : NULL; - case 24: //tnam TNAM ,, Struct - return TNAM.IsLoaded() ? &TNAM->value24 : NULL; + case 13: //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 14: //modelFlags + return MODL.IsLoaded() ? &MODL->MODD.value : NULL; + case 15: //riseBegin + return &TNAM.value.riseBegin; + case 16: //riseEnd + return &TNAM.value.riseEnd; + case 17: //setBegin + return &TNAM.value.setBegin; + case 18: //setEnd + return &TNAM.value.setEnd; + case 19: //volatility + return &TNAM.value.volatility; + case 20: //phaseLength + return &TNAM.value.phaseLength; default: return NULL; } @@ -225,78 +271,103 @@ bool CLMTRecord::SetField(FIELD_IDENTIFIERS, void *FieldValue, UINT32 ArraySize) versionControl2[0] = ((UINT8ARRAY)FieldValue)[0]; versionControl2[1] = ((UINT8ARRAY)FieldValue)[1]; break; - case 7: //wlst Weather Types ,, Array - WLST.Load(); - WLST->value7 = *(FORMID *)FieldValue; - return true; - case 8: //wlst Weather Types ,, Array - WLST.Load(); - WLST->value8 = *(SINT32 *)FieldValue; + case 7: //weathers + if(ListFieldID == 0) //weathersSize + { + Weathers.resize(ArraySize); + return false; + } + + if(ListIndex >= Weathers.value.size()) + break; + + switch(ListFieldID) + { + case 1: //weather + Weathers.value[ListIndex].weather = *(FORMID *)FieldValue; + return true; + case 2: //chance + Weathers.value[ListIndex].chance = *(SINT32 *)FieldValue; + break; + case 3: //globalId + Weathers.value[ListIndex].globalId = *(FORMID *)FieldValue; + return true; + default: + break; + } break; - case 9: //wlst Weather Types ,, Array - WLST.Load(); - WLST->value9 = *(FORMID *)FieldValue; - return true; - case 10: //fnam Sun Texture + case 8: //sunPath FNAM.Copy((STRING)FieldValue); break; - case 11: //gnam Sun Glare Texture + case 9: //glarePath GNAM.Copy((STRING)FieldValue); break; - case 12: //modPath + case 10: //modPath MODL.Load(); MODL->MODL.Copy((STRING)FieldValue); break; - case 13: //modb + case 11: //modb MODL.Load(); MODL->MODB.value = *(FLOAT32 *)FieldValue; break; - case 14: //modt_p + case 12: //modt_p MODL.Load(); MODL->MODT.Copy((UINT8ARRAY)FieldValue, ArraySize); break; - case 15: //mods Alternate Textures - MODL.Load(); - MODL->MODS.Copy((STRING)FieldValue); - break; - case 16: //mods Alternate Textures + case 13: //altTextures MODL.Load(); - MODL->MODS.Load(); - MODL->MODS->value16 = *(FORMID *)FieldValue; - return true; - case 17: //mods Alternate Textures - MODL.Load(); - MODL->MODS.Load(); - MODL->MODS->value17 = *(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 18: //modelFlags + case 14: //modelFlags MODL.Load(); - MODL->MODD.Load(); - MODL->MODD->value18 = *(UINT8 *)FieldValue; + MODL->SetFlagMask(*(UINT8 *)FieldValue); break; - case 19: //tnam TNAM ,, Struct - TNAM.Load(); - TNAM->value19 = *(UINT8 *)FieldValue; + case 15: //riseBegin + TNAM.value.riseBegin = *(UINT8 *)FieldValue; break; - case 20: //tnam TNAM ,, Struct - TNAM.Load(); - TNAM->value20 = *(UINT8 *)FieldValue; + case 16: //riseEnd + TNAM.value.riseEnd = *(UINT8 *)FieldValue; break; - case 21: //tnam TNAM ,, Struct - TNAM.Load(); - TNAM->value21 = *(UINT8 *)FieldValue; + case 17: //setBegin + TNAM.value.setBegin = *(UINT8 *)FieldValue; break; - case 22: //tnam TNAM ,, Struct - TNAM.Load(); - TNAM->value22 = *(UINT8 *)FieldValue; + case 18: //setEnd + TNAM.value.setEnd = *(UINT8 *)FieldValue; break; - case 23: //tnam TNAM ,, Struct - TNAM.Load(); - TNAM->value23 = *(UINT8 *)FieldValue; + case 19: //volatility + TNAM.value.volatility = *(UINT8 *)FieldValue; break; - case 24: //tnam TNAM ,, Struct - TNAM.Load(); - TNAM->value24 = *(UINT8 *)FieldValue; + case 20: //phaseLength + TNAM.value.phaseLength = *(UINT8 *)FieldValue; break; default: break; @@ -306,6 +377,10 @@ bool CLMTRecord::SetField(FIELD_IDENTIFIERS, void *FieldValue, UINT32 ArraySize) void CLMTRecord::DeleteField(FIELD_IDENTIFIERS) { + CLMTTNAM defaultTNAM; + CLMTWLST defaultWLST; + FNVMODS defaultMODS; + switch(FieldID) { case 1: //flags1 @@ -324,69 +399,103 @@ void CLMTRecord::DeleteField(FIELD_IDENTIFIERS) versionControl2[0] = 0; versionControl2[1] = 0; return; - case 7: //wlst Weather Types ,, Array - WLST.Unload(); - return; - case 8: //wlst Weather Types ,, Array - WLST.Unload(); - return; - case 9: //wlst Weather Types ,, Array - WLST.Unload(); + case 7: //weathers + if(ListFieldID == 0) //weathers + { + Weathers.Unload(); + return; + } + + if(ListIndex >= Weathers.value.size()) + return; + + switch(ListFieldID) + { + case 1: //weather + Weathers.value[ListIndex].weather = defaultWLST.weather; + return; + case 2: //chance + Weathers.value[ListIndex].chance = defaultWLST.chance; + return; + case 3: //globalId + Weathers.value[ListIndex].globalId = defaultWLST.globalId; + return; + default: + return; + } return; - case 10: //fnam Sun Texture + case 8: //sunPath FNAM.Unload(); return; - case 11: //gnam Sun Glare Texture + case 9: //glarePath GNAM.Unload(); return; - case 12: //modPath + case 10: //modPath if(MODL.IsLoaded()) MODL->MODL.Unload(); return; - case 13: //modb + case 11: //modb if(MODL.IsLoaded()) MODL->MODB.Unload(); return; - case 14: //modt_p + case 12: //modt_p if(MODL.IsLoaded()) MODL->MODT.Unload(); return; - case 15: //mods Alternate Textures - if(MODL.IsLoaded()) - MODL->MODS.Unload(); - return; - case 16: //mods Alternate Textures + case 13: //altTextures if(MODL.IsLoaded()) - MODL->MODS.Unload(); - return; - case 17: //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 18: //modelFlags + case 14: //modelFlags if(MODL.IsLoaded()) MODL->MODD.Unload(); return; - case 19: //tnam TNAM ,, Struct - TNAM.Unload(); + case 15: //riseBegin + TNAM.value.riseBegin = defaultTNAM.riseBegin; return; - case 20: //tnam TNAM ,, Struct - TNAM.Unload(); + case 16: //riseEnd + TNAM.value.riseEnd = defaultTNAM.riseEnd; return; - case 21: //tnam TNAM ,, Struct - TNAM.Unload(); + case 17: //setBegin + TNAM.value.setBegin = defaultTNAM.setBegin; return; - case 22: //tnam TNAM ,, Struct - TNAM.Unload(); + case 18: //setEnd + TNAM.value.setEnd = defaultTNAM.setEnd; return; - case 23: //tnam TNAM ,, Struct - TNAM.Unload(); + case 19: //volatility + TNAM.value.volatility = defaultTNAM.volatility; return; - case 24: //tnam TNAM ,, Struct - TNAM.Unload(); + case 20: //phaseLength + TNAM.value.phaseLength = defaultTNAM.phaseLength; return; default: return; } + return; } } \ No newline at end of file diff --git a/CBash/FalloutNewVegas/Records/API/REGNRecordAPI.cpp b/CBash/FalloutNewVegas/Records/API/REGNRecordAPI.cpp index e10e42e..67ca630 100644 --- a/CBash/FalloutNewVegas/Records/API/REGNRecordAPI.cpp +++ b/CBash/FalloutNewVegas/Records/API/REGNRecordAPI.cpp @@ -64,13 +64,13 @@ UINT32 REGNRecord::GetFieldAttribute(FIELD_IDENTIFIERS, UINT32 WhichAttribute) return ISTRING_FIELD; case 8: //smallIconPath return ISTRING_FIELD; - case 9: //rclr RCLR ,, Struct + case 9: //mapRed return UINT8_FIELD; - case 10: //rclr RCLR ,, Struct + case 10: //mapGreen return UINT8_FIELD; - case 11: //rclr RCLR ,, Struct + case 11: //mapBlue return UINT8_FIELD; - case 12: //rclr_p RCLR ,, Struct + case 12: //unused1 switch(WhichAttribute) { case 0: //fieldType @@ -81,144 +81,313 @@ UINT32 REGNRecord::GetFieldAttribute(FIELD_IDENTIFIERS, UINT32 WhichAttribute) return UNKNOWN_FIELD; } return UNKNOWN_FIELD; - case 13: //wnam Worldspace + case 13: //worldspace return FORMID_FIELD; - case 14: //rpli Edge Fall-off - return UINT32_FIELD; - case 15: //rpld RPLD ,, Struct - return FLOAT32_FIELD; - case 16: //rpld RPLD ,, Struct - return FLOAT32_FIELD; - case 17: //rdat RDAT ,, Struct - return UINT32_FIELD; - case 18: //rdat RDAT ,, Struct - return UINT8_FIELD; - case 19: //rdat RDAT ,, Struct - return UINT8_FIELD; - case 20: //rdat_p RDAT ,, Struct - switch(WhichAttribute) + case 14: //areas + if(ListFieldID == 0) //areas { - case 0: //fieldType - return UINT8_ARRAY_FIELD; - case 1: //fieldSize - return 0; - default: - return UNKNOWN_FIELD; + switch(WhichAttribute) + { + case 0: //fieldType + return LIST_FIELD; + case 1: //fieldSize + return (UINT32)Areas.value.size(); + default: + return UNKNOWN_FIELD; + } } - return UNKNOWN_FIELD; - case 21: //rdot RDOT ,, Struct - return FORMID_FIELD; - case 22: //rdot RDOT ,, Struct - return UINT16_FIELD; - case 23: //rdot_p RDOT ,, Struct - switch(WhichAttribute) + + if(ListIndex >= Areas.value.size()) + return UNKNOWN_FIELD; + + switch(ListFieldID) { - case 0: //fieldType - return UINT8_ARRAY_FIELD; - case 1: //fieldSize - return 2; + case 1: //edgeFalloff + return FORMID_FIELD; + case 2: //points + if(ListX2FieldID == 0) //points + { + switch(WhichAttribute) + { + case 0: //fieldType + return LIST_FIELD; + case 1: //fieldSize + return (UINT32)Areas.value[ListIndex]->RPLD.value.size(); + default: + return UNKNOWN_FIELD; + } + } + + if(ListX2Index >= Areas.value[ListIndex]->RPLD.value.size()) + return UNKNOWN_FIELD; + + switch(ListX2FieldID) + { + case 1: //posX + return FLOAT32_FIELD; + case 2: //posY + return FLOAT32_FIELD; + default: + return UNKNOWN_FIELD; + } default: return UNKNOWN_FIELD; } return UNKNOWN_FIELD; - case 24: //rdot RDOT ,, Struct - return FLOAT32_FIELD; - case 25: //rdot RDOT ,, Struct - return UINT8_FIELD; - case 26: //rdot RDOT ,, Struct - return UINT8_FIELD; - case 27: //rdot RDOT ,, Struct - return UINT8_FIELD; - case 28: //rdot RDOT ,, Struct - return UINT8_FIELD; - case 29: //rdot RDOT ,, Struct - return UINT16_FIELD; - case 30: //rdot RDOT ,, Struct - return UINT16_FIELD; - case 31: //rdot_p RDOT ,, Struct - switch(WhichAttribute) + case 15: //entries + if(ListFieldID == 0) //entries { - case 0: //fieldType - return UINT8_ARRAY_FIELD; - case 1: //fieldSize - return 4; - default: - return UNKNOWN_FIELD; + switch(WhichAttribute) + { + case 0: //fieldType + return LIST_FIELD; + case 1: //fieldSize + return (UINT32)Entries.value.size(); + default: + return UNKNOWN_FIELD; + } } - return UNKNOWN_FIELD; - case 32: //rdot RDOT ,, Struct - return FLOAT32_FIELD; - case 33: //rdot RDOT ,, Struct - return FLOAT32_FIELD; - case 34: //rdot RDOT ,, Struct - return FLOAT32_FIELD; - case 35: //rdot RDOT ,, Struct - return FLOAT32_FIELD; - case 36: //rdot RDOT ,, Struct - return UINT16_FIELD; - case 37: //rdot RDOT ,, Struct - return UINT16_FIELD; - case 38: //rdot RDOT ,, Struct - return UINT16_FIELD; - case 39: //rdot_p RDOT ,, Struct - switch(WhichAttribute) + + if(ListIndex >= Entries.value.size()) + return UNKNOWN_FIELD; + + switch(ListFieldID) { - case 0: //fieldType - return UINT8_ARRAY_FIELD; - case 1: //fieldSize - return 2; - default: + case 1: //entryType + return UINT32_TYPE_FIELD; + case 2: //flags + return UINT8_FLAG_FIELD; + case 3: //priority + return UINT8_FIELD; + case 4: //unused1 + switch(WhichAttribute) + { + case 0: //fieldType + return UINT8_ARRAY_FIELD; + case 1: //fieldSize + return 2; + default: + return UNKNOWN_FIELD; + } + case 5: //objects + if(ListX2FieldID == 0) //points + { + switch(WhichAttribute) + { + case 0: //fieldType + return LIST_FIELD; + case 1: //fieldSize + return (UINT32)Entries.value[ListIndex]->RDOT.value.size(); + default: + return UNKNOWN_FIELD; + } + } + + if(ListX2Index >= Entries.value[ListIndex]->RDOT.value.size()) + return UNKNOWN_FIELD; + + switch(ListX2FieldID) + { + case 1: //objectId + return FORMID_FIELD; + case 2: //parentIndex + return UINT16_FIELD; + case 3: //unused1 + switch(WhichAttribute) + { + case 0: //fieldType + return UINT8_ARRAY_FIELD; + case 1: //fieldSize + return 2; + default: + return UNKNOWN_FIELD; + } + case 4: //density + return FLOAT32_FIELD; + case 5: //clustering + return UINT8_FIELD; + case 6: //minSlope + return UINT8_FIELD; + case 7: //maxSlope + return UINT8_FIELD; + case 8: //flags + return UINT8_FLAG_FIELD; + case 9: //radiusWRTParent + return UINT16_FIELD; + case 10: //radius + return UINT16_FIELD; + case 11: //unk1 + switch(WhichAttribute) + { + case 0: //fieldType + return UINT8_ARRAY_FIELD; + case 1: //fieldSize + return 4; + default: + return UNKNOWN_FIELD; + } + case 12: //maxHeight + return FLOAT32_FIELD; + case 13: //sink + return FLOAT32_FIELD; + case 14: //sinkVar + return FLOAT32_FIELD; + case 15: //sizeVar + return FLOAT32_FIELD; + case 16: //angleVarX + return UINT16_FIELD; + case 17: //angleVarY + return UINT16_FIELD; + case 18: //angleVarZ + return UINT16_FIELD; + case 19: //unused2 + switch(WhichAttribute) + { + case 0: //fieldType + return UINT8_ARRAY_FIELD; + case 1: //fieldSize + return 2; + default: + return UNKNOWN_FIELD; + } + case 20: //unk2 + switch(WhichAttribute) + { + case 0: //fieldType + return UINT8_ARRAY_FIELD; + case 1: //fieldSize + return 4; + default: + return UNKNOWN_FIELD; + } + default: + return UNKNOWN_FIELD; + } + case 6: //mapName + return STRING_FIELD; + case 7: //iconPath + return ISTRING_FIELD; + case 8: //grasses + if(ListX2FieldID == 0) //grasses + { + switch(WhichAttribute) + { + case 0: //fieldType + return LIST_FIELD; + case 1: //fieldSize + return (UINT32)Entries.value[ListIndex]->RDGS.value.size(); + default: + return UNKNOWN_FIELD; + } + } + + if(ListX2Index >= Entries.value[ListIndex]->RDGS.value.size()) + return UNKNOWN_FIELD; + + switch(ListX2FieldID) + { + case 1: //grass + return FORMID_FIELD; + case 2: //unk1 + switch(WhichAttribute) + { + case 0: //fieldType + return UINT8_ARRAY_FIELD; + case 1: //fieldSize + return 4; + default: + return UNKNOWN_FIELD; + } + default: + return UNKNOWN_FIELD; + } + case 9: //musicType + return UINT32_TYPE_FIELD; + case 10: //music + return FORMID_FIELD; + case 11: //incidentalMedia + return FORMID_FIELD; + case 12: //battleMedias + switch(WhichAttribute) + { + case 0: //fieldType + return FORMID_ARRAY_FIELD; + case 1: //fieldSize + return Entries.value[ListIndex]->RDSB.value.size(); + default: + return UNKNOWN_FIELD; + } return UNKNOWN_FIELD; - } - return UNKNOWN_FIELD; - case 40: //rdot_p RDOT ,, Struct - switch(WhichAttribute) - { - case 0: //fieldType - return UINT8_ARRAY_FIELD; - case 1: //fieldSize - return 4; - default: + case 13: //sounds + if(ListX2FieldID == 0) //sounds + { + switch(WhichAttribute) + { + case 0: //fieldType + return LIST_FIELD; + case 1: //fieldSize + return (UINT32)Entries.value[ListIndex]->RDSD.value.size(); + default: + return UNKNOWN_FIELD; + } + } + + if(ListX2Index >= Entries.value[ListIndex]->RDSD.value.size()) + return UNKNOWN_FIELD; + + switch(ListX2FieldID) + { + case 1: //sound + return FORMID_FIELD; + case 2: //flags + return UINT32_FLAG_FIELD; + case 3: //chance + return UINT32_FIELD; + default: + return UNKNOWN_FIELD; + } + case 14: //weathers + if(ListX2FieldID == 0) //weathers + { + switch(WhichAttribute) + { + case 0: //fieldType + return LIST_FIELD; + case 1: //fieldSize + return (UINT32)Entries.value[ListIndex]->RDWT.value.size(); + default: + return UNKNOWN_FIELD; + } + } + + if(ListX2Index >= Entries.value[ListIndex]->RDWT.value.size()) + return UNKNOWN_FIELD; + + switch(ListX2FieldID) + { + case 1: //weather + return FORMID_FIELD; + case 2: //chance + return UINT32_FIELD; + case 3: //globalId + return FORMID_FIELD; + default: + return UNKNOWN_FIELD; + } + case 15: //imposters + switch(WhichAttribute) + { + case 0: //fieldType + return FORMID_ARRAY_FIELD; + case 1: //fieldSize + return Entries.value[ListIndex]->RDID.value.size(); + default: + return UNKNOWN_FIELD; + } return UNKNOWN_FIELD; - } - return UNKNOWN_FIELD; - case 41: //rdmp Map Name - return ISTRING_FIELD; - case 42: //rdgs RDGS ,, Struct - return FORMID_FIELD; - case 43: //rdgs_p RDGS ,, Struct - switch(WhichAttribute) - { - case 0: //fieldType - return UINT8_ARRAY_FIELD; - case 1: //fieldSize - return 4; default: return UNKNOWN_FIELD; } - return UNKNOWN_FIELD; - case 44: //rdmd Music Type - return UINT32_FIELD; - case 45: //rdmo Music - return FORMID_FIELD; - case 46: //rdsi Incidental MediaSet - return FORMID_FIELD; - case 47: //rdsb Battle MediaSet - return FORMID_FIELD; - case 48: //rdsd RDSD ,, Struct - return FORMID_FIELD; - case 49: //rdsd RDSD ,, Struct - return UINT32_FIELD; - case 50: //rdsd RDSD ,, Struct - return UINT32_FIELD; - case 51: //rdwt RDWT ,, Struct - return FORMID_FIELD; - case 52: //rdwt RDWT ,, Struct - return UINT32_FIELD; - case 53: //rdwt RDWT ,, Struct - return FORMID_FIELD; - case 54: //rdid Imposters - return UNPARSED_FIELD; default: return UNKNOWN_FIELD; } @@ -247,105 +416,179 @@ void * REGNRecord::GetField(FIELD_IDENTIFIERS, void **FieldValues) return ICON.value; case 8: //smallIconPath return MICO.value; - case 9: //rclr RCLR ,, Struct - return RCLR.IsLoaded() ? &RCLR->value9 : NULL; - case 10: //rclr RCLR ,, Struct - return RCLR.IsLoaded() ? &RCLR->value10 : NULL; - case 11: //rclr RCLR ,, Struct - return RCLR.IsLoaded() ? &RCLR->value11 : NULL; - case 12: //rclr_p RCLR ,, Struct - *FieldValues = RCLR.IsLoaded() ? &RCLR->value12[0] : NULL; - return NULL; - case 13: //wnam Worldspace - return WNAM.IsLoaded() ? &WNAM->value13 : NULL; - case 14: //rpli Edge Fall-off - return RPLI.IsLoaded() ? &RPLI->value14 : NULL; - case 15: //rpld RPLD ,, Struct - return RPLD.IsLoaded() ? &RPLD->value15 : NULL; - case 16: //rpld RPLD ,, Struct - return RPLD.IsLoaded() ? &RPLD->value16 : NULL; - case 17: //rdat RDAT ,, Struct - return RDAT.IsLoaded() ? &RDAT->value17 : NULL; - case 18: //rdat RDAT ,, Struct - return RDAT.IsLoaded() ? &RDAT->value18 : NULL; - case 19: //rdat RDAT ,, Struct - return RDAT.IsLoaded() ? &RDAT->value19 : NULL; - case 20: //rdat_p RDAT ,, Struct - *FieldValues = RDAT.IsLoaded() ? &RDAT->value20[0] : NULL; + case 9: //mapRed + return &RCLR.value.red; + case 10: //mapGreen + return &RCLR.value.green; + case 11: //mapBlue + return &RCLR.value.blue; + case 12: //unused1 + *FieldValues = &RCLR.value.unused1; return NULL; - case 21: //rdot RDOT ,, Struct - return RDOT.IsLoaded() ? &RDOT->value21 : NULL; - case 22: //rdot RDOT ,, Struct - return RDOT.IsLoaded() ? &RDOT->value22 : NULL; - case 23: //rdot_p RDOT ,, Struct - *FieldValues = RDOT.IsLoaded() ? &RDOT->value23[0] : NULL; - return NULL; - case 24: //rdot RDOT ,, Struct - return RDOT.IsLoaded() ? &RDOT->value24 : NULL; - case 25: //rdot RDOT ,, Struct - return RDOT.IsLoaded() ? &RDOT->value25 : NULL; - case 26: //rdot RDOT ,, Struct - return RDOT.IsLoaded() ? &RDOT->value26 : NULL; - case 27: //rdot RDOT ,, Struct - return RDOT.IsLoaded() ? &RDOT->value27 : NULL; - case 28: //rdot RDOT ,, Struct - return RDOT.IsLoaded() ? &RDOT->value28 : NULL; - case 29: //rdot RDOT ,, Struct - return RDOT.IsLoaded() ? &RDOT->value29 : NULL; - case 30: //rdot RDOT ,, Struct - return RDOT.IsLoaded() ? &RDOT->value30 : NULL; - case 31: //rdot_p RDOT ,, Struct - *FieldValues = RDOT.IsLoaded() ? &RDOT->value31[0] : NULL; - return NULL; - case 32: //rdot RDOT ,, Struct - return RDOT.IsLoaded() ? &RDOT->value32 : NULL; - case 33: //rdot RDOT ,, Struct - return RDOT.IsLoaded() ? &RDOT->value33 : NULL; - case 34: //rdot RDOT ,, Struct - return RDOT.IsLoaded() ? &RDOT->value34 : NULL; - case 35: //rdot RDOT ,, Struct - return RDOT.IsLoaded() ? &RDOT->value35 : NULL; - case 36: //rdot RDOT ,, Struct - return RDOT.IsLoaded() ? &RDOT->value36 : NULL; - case 37: //rdot RDOT ,, Struct - return RDOT.IsLoaded() ? &RDOT->value37 : NULL; - case 38: //rdot RDOT ,, Struct - return RDOT.IsLoaded() ? &RDOT->value38 : NULL; - case 39: //rdot_p RDOT ,, Struct - *FieldValues = RDOT.IsLoaded() ? &RDOT->value39[0] : NULL; - return NULL; - case 40: //rdot_p RDOT ,, Struct - *FieldValues = RDOT.IsLoaded() ? &RDOT->value40[0] : NULL; + case 13: //worldspace + return WNAM.IsLoaded() ? &WNAM.value : NULL; + case 14: //areas + if(ListIndex >= Areas.value.size()) + return NULL; + + switch(ListFieldID) + { + case 1: //edgeFalloff + return &Areas.value[ListIndex]->RPLI.value; + case 2: //points + if(ListX2Index >= Areas.value[ListIndex]->RPLD.value.size()) + return NULL; + + switch(ListX2FieldID) + { + case 1: //posX + return &Areas.value[ListIndex]->RPLD.value[ListX2Index].posX; + case 2: //posY + return &Areas.value[ListIndex]->RPLD.value[ListX2Index].posY; + default: + return NULL; + } + return NULL; + default: + return NULL; + } return NULL; - case 41: //rdmp Map Name - return RDMP.value; - case 42: //rdgs RDGS ,, Struct - return RDGS.IsLoaded() ? &RDGS->value42 : NULL; - case 43: //rdgs_p RDGS ,, Struct - *FieldValues = RDGS.IsLoaded() ? &RDGS->value43[0] : NULL; + case 15: //entries + if(ListIndex >= Entries.value.size()) + return NULL; + + switch(ListFieldID) + { + case 1: //entryType + return &Entries.value[ListIndex]->RDAT.value.entryType; + case 2: //flags + return &Entries.value[ListIndex]->RDAT.value.flags; + case 3: //priority + return &Entries.value[ListIndex]->RDAT.value.priority; + case 4: //unused1 + *FieldValues = &Entries.value[ListIndex]->RDAT.value.unused1[0]; + return NULL; + case 5: //objects + if(ListX2Index >= Entries.value[ListIndex]->RDOT.value.size()) + return NULL; + + switch(ListX2FieldID) + { + case 1: //objectId + return &Entries.value[ListIndex]->RDOT.value[ListX2Index].objectId; + case 2: //parentIndex + return &Entries.value[ListIndex]->RDOT.value[ListX2Index].parentIndex; + case 3: //unused1 + *FieldValues = &Entries.value[ListIndex]->RDOT.value[ListX2Index].unused1[0]; + return NULL; + case 4: //density + return &Entries.value[ListIndex]->RDOT.value[ListX2Index].density; + case 5: //clustering + return &Entries.value[ListIndex]->RDOT.value[ListX2Index].clustering; + case 6: //minSlope + return &Entries.value[ListIndex]->RDOT.value[ListX2Index].minSlope; + case 7: //maxSlope + return &Entries.value[ListIndex]->RDOT.value[ListX2Index].maxSlope; + case 8: //flags + return &Entries.value[ListIndex]->RDOT.value[ListX2Index].flags; + case 9: //radiusWRTParent + return &Entries.value[ListIndex]->RDOT.value[ListX2Index].radiusWRTParent; + case 10: //radius + return &Entries.value[ListIndex]->RDOT.value[ListX2Index].radius; + case 11: //unk1 + *FieldValues = &Entries.value[ListIndex]->RDOT.value[ListX2Index].unk1[0]; + return NULL; + case 12: //maxHeight + return &Entries.value[ListIndex]->RDOT.value[ListX2Index].maxHeight; + case 13: //sink + return &Entries.value[ListIndex]->RDOT.value[ListX2Index].sink; + case 14: //sinkVar + return &Entries.value[ListIndex]->RDOT.value[ListX2Index].sinkVar; + case 15: //sizeVar + return &Entries.value[ListIndex]->RDOT.value[ListX2Index].sizeVar; + case 16: //angleVarX + return &Entries.value[ListIndex]->RDOT.value[ListX2Index].angleVarX; + case 17: //angleVarY + return &Entries.value[ListIndex]->RDOT.value[ListX2Index].angleVarY; + case 18: //angleVarZ + return &Entries.value[ListIndex]->RDOT.value[ListX2Index].angleVarZ; + case 19: //unused2 + *FieldValues = &Entries.value[ListIndex]->RDOT.value[ListX2Index].unused2[0]; + return NULL; + case 20: //unk2 + *FieldValues = &Entries.value[ListIndex]->RDOT.value[ListX2Index].unk2[0]; + return NULL; + default: + return NULL; + } + return NULL; + case 6: //mapName + return Entries.value[ListIndex]->RDMP.value; + case 7: //iconPath + return Entries.value[ListIndex]->ICON.value; + case 8: //grasses + if(ListX2Index >= Entries.value[ListIndex]->RDGS.value.size()) + return NULL; + + switch(ListX2FieldID) + { + case 1: //grass + return &Entries.value[ListIndex]->RDGS.value[ListX2Index].grass; + case 2: //unk1 + *FieldValues = &Entries.value[ListIndex]->RDGS.value[ListX2Index].unk1[0]; + return NULL; + default: + return NULL; + } + return NULL; + case 9: //musicType + return Entries.value[ListIndex]->RDMD.value; + case 10: //music + return &Entries.value[ListIndex]->RDMO.value; + case 11: //incidentalMedia + return &Entries.value[ListIndex]->RDSI.value; + case 12: //battleMedias + *FieldValues = Entries.value[ListIndex]->RDSB.IsLoaded() ? &Entries.value[ListIndex]->RDSB.value[0] : NULL; + return NULL; + case 13: //sounds + if(ListX2Index >= Entries.value[ListIndex]->RDSD.value.size()) + return NULL; + + switch(ListX2FieldID) + { + case 1: //sound + return &Entries.value[ListIndex]->RDSD.value[ListX2Index].sound; + case 2: //flags + return &Entries.value[ListIndex]->RDSD.value[ListX2Index].flags; + case 3: //chance + return &Entries.value[ListIndex]->RDSD.value[ListX2Index].chance; + default: + return NULL; + } + return NULL; + case 14: //weathers + if(ListX2Index >= Entries.value[ListIndex]->RDWT.value.size()) + return NULL; + + switch(ListX2FieldID) + { + case 1: //weather + return &Entries.value[ListIndex]->RDWT.value[ListX2Index].weather; + case 2: //chance + return &Entries.value[ListIndex]->RDWT.value[ListX2Index].chance; + case 3: //globalId + return &Entries.value[ListIndex]->RDWT.value[ListX2Index].globalId; + default: + return NULL; + } + return NULL; + case 15: //imposters + *FieldValues = Entries.value[ListIndex]->RDID.IsLoaded() ? &Entries.value[ListIndex]->RDID.value[0] : NULL; + return NULL; + default: + return NULL; + } return NULL; - case 44: //rdmd Music Type - return RDMD.IsLoaded() ? &RDMD->value44 : NULL; - case 45: //rdmo Music - return RDMO.IsLoaded() ? &RDMO->value45 : NULL; - case 46: //rdsi Incidental MediaSet - return RDSI.IsLoaded() ? &RDSI->value46 : NULL; - case 47: //rdsb Battle MediaSet - return RDSB.IsLoaded() ? &RDSB->value47 : NULL; - case 48: //rdsd RDSD ,, Struct - return RDSD.IsLoaded() ? &RDSD->value48 : NULL; - case 49: //rdsd RDSD ,, Struct - return RDSD.IsLoaded() ? &RDSD->value49 : NULL; - case 50: //rdsd RDSD ,, Struct - return RDSD.IsLoaded() ? &RDSD->value50 : NULL; - case 51: //rdwt RDWT ,, Struct - return RDWT.IsLoaded() ? &RDWT->value51 : NULL; - case 52: //rdwt RDWT ,, Struct - return RDWT.IsLoaded() ? &RDWT->value52 : NULL; - case 53: //rdwt RDWT ,, Struct - return RDWT.IsLoaded() ? &RDWT->value53 : NULL; - case 54: //rdid Imposters - return UNPARSEDGET_FIELD54; default: return NULL; } @@ -385,211 +628,290 @@ bool REGNRecord::SetField(FIELD_IDENTIFIERS, void *FieldValue, UINT32 ArraySize) case 8: //smallIconPath MICO.Copy((STRING)FieldValue); break; - case 9: //rclr RCLR ,, Struct - RCLR.Load(); - RCLR->value9 = *(UINT8 *)FieldValue; + case 9: //mapRed + RCLR.value.red = *(UINT8 *)FieldValue; break; - case 10: //rclr RCLR ,, Struct - RCLR.Load(); - RCLR->value10 = *(UINT8 *)FieldValue; + case 10: //mapGreen + RCLR.value.green = *(UINT8 *)FieldValue; break; - case 11: //rclr RCLR ,, Struct - RCLR.Load(); - RCLR->value11 = *(UINT8 *)FieldValue; + case 11: //mapBlue + RCLR.value.blue = *(UINT8 *)FieldValue; break; - case 12: //rclr_p RCLR ,, Struct + case 12: //unused1 if(ArraySize != 1) break; - RCLR.Load(); - RCLR->value12[0] = ((UINT8ARRAY)FieldValue)[0]; + RCLR.value.unused1 = ((UINT8ARRAY)FieldValue)[0]; break; - case 13: //wnam Worldspace + case 13: //worldspace WNAM.Load(); - WNAM->value13 = *(FORMID *)FieldValue; + WNAM.value = *(FORMID *)FieldValue; return true; - case 14: //rpli Edge Fall-off - RPLI.Load(); - RPLI->value14 = *(UINT32 *)FieldValue; - break; - case 15: //rpld RPLD ,, Struct - RPLD.Load(); - RPLD->value15 = *(FLOAT32 *)FieldValue; - break; - case 16: //rpld RPLD ,, Struct - RPLD.Load(); - RPLD->value16 = *(FLOAT32 *)FieldValue; - break; - case 17: //rdat RDAT ,, Struct - RDAT.Load(); - RDAT->value17 = *(UINT32 *)FieldValue; - break; - case 18: //rdat RDAT ,, Struct - RDAT.Load(); - RDAT->value18 = *(UINT8 *)FieldValue; - break; - case 19: //rdat RDAT ,, Struct - RDAT.Load(); - RDAT->value19 = *(UINT8 *)FieldValue; - break; - case 20: //rdat_p RDAT ,, Struct - if(ArraySize != 0) - break; - RDAT.Load(); - break; - case 21: //rdot RDOT ,, Struct - RDOT.Load(); - RDOT->value21 = *(FORMID *)FieldValue; - return true; - case 22: //rdot RDOT ,, Struct - RDOT.Load(); - RDOT->value22 = *(UINT16 *)FieldValue; - break; - case 23: //rdot_p RDOT ,, Struct - if(ArraySize != 2) - break; - RDOT.Load(); - RDOT->value23[0] = ((UINT8ARRAY)FieldValue)[0]; - RDOT->value23[1] = ((UINT8ARRAY)FieldValue)[1]; - break; - case 24: //rdot RDOT ,, Struct - RDOT.Load(); - RDOT->value24 = *(FLOAT32 *)FieldValue; - break; - case 25: //rdot RDOT ,, Struct - RDOT.Load(); - RDOT->value25 = *(UINT8 *)FieldValue; - break; - case 26: //rdot RDOT ,, Struct - RDOT.Load(); - RDOT->value26 = *(UINT8 *)FieldValue; - break; - case 27: //rdot RDOT ,, Struct - RDOT.Load(); - RDOT->value27 = *(UINT8 *)FieldValue; - break; - case 28: //rdot RDOT ,, Struct - RDOT.Load(); - RDOT->value28 = *(UINT8 *)FieldValue; - break; - case 29: //rdot RDOT ,, Struct - RDOT.Load(); - RDOT->value29 = *(UINT16 *)FieldValue; - break; - case 30: //rdot RDOT ,, Struct - RDOT.Load(); - RDOT->value30 = *(UINT16 *)FieldValue; - break; - case 31: //rdot_p RDOT ,, Struct - if(ArraySize != 4) - break; - RDOT.Load(); - RDOT->value31[0] = ((UINT8ARRAY)FieldValue)[0]; - RDOT->value31[1] = ((UINT8ARRAY)FieldValue)[1]; - RDOT->value31[2] = ((UINT8ARRAY)FieldValue)[2]; - RDOT->value31[3] = ((UINT8ARRAY)FieldValue)[3]; - break; - case 32: //rdot RDOT ,, Struct - RDOT.Load(); - RDOT->value32 = *(FLOAT32 *)FieldValue; - break; - case 33: //rdot RDOT ,, Struct - RDOT.Load(); - RDOT->value33 = *(FLOAT32 *)FieldValue; - break; - case 34: //rdot RDOT ,, Struct - RDOT.Load(); - RDOT->value34 = *(FLOAT32 *)FieldValue; - break; - case 35: //rdot RDOT ,, Struct - RDOT.Load(); - RDOT->value35 = *(FLOAT32 *)FieldValue; - break; - case 36: //rdot RDOT ,, Struct - RDOT.Load(); - RDOT->value36 = *(UINT16 *)FieldValue; - break; - case 37: //rdot RDOT ,, Struct - RDOT.Load(); - RDOT->value37 = *(UINT16 *)FieldValue; - break; - case 38: //rdot RDOT ,, Struct - RDOT.Load(); - RDOT->value38 = *(UINT16 *)FieldValue; - break; - case 39: //rdot_p RDOT ,, Struct - if(ArraySize != 2) - break; - RDOT.Load(); - RDOT->value39[0] = ((UINT8ARRAY)FieldValue)[0]; - RDOT->value39[1] = ((UINT8ARRAY)FieldValue)[1]; - break; - case 40: //rdot_p RDOT ,, Struct - if(ArraySize != 4) + case 14: //areas + if(ListFieldID == 0) //areasSize + { + Areas.resize(ArraySize); + return false; + } + + if(ListIndex >= Areas.value.size()) break; - RDOT.Load(); - RDOT->value40[0] = ((UINT8ARRAY)FieldValue)[0]; - RDOT->value40[1] = ((UINT8ARRAY)FieldValue)[1]; - RDOT->value40[2] = ((UINT8ARRAY)FieldValue)[2]; - RDOT->value40[3] = ((UINT8ARRAY)FieldValue)[3]; - break; - case 41: //rdmp Map Name - RDMP.Copy((STRING)FieldValue); + + switch(ListFieldID) + { + case 1: //edgeFalloff + Areas.value[ListIndex]->RPLI.value = *(UINT32 *)FieldValue; + break; + case 2: //points + if(ListX2FieldID == 0) //pointsSize + { + Areas.value[ListIndex]->RPLD.resize(ArraySize); + return false; + } + + if(ListX2Index >= Areas.value[ListIndex]->RPLD.value.size()) + break; + + switch(ListX2FieldID) + { + case 1: //posX + Areas.value[ListIndex]->RPLD.value[ListX2Index].posX = *(FLOAT32 *)FieldValue; + break; + case 2: //posY + Areas.value[ListIndex]->RPLD.value[ListX2Index].posY = *(FLOAT32 *)FieldValue; + break; + default: + break; + } + break; + default: + break; + } break; - case 42: //rdgs RDGS ,, Struct - RDGS.Load(); - RDGS->value42 = *(FORMID *)FieldValue; - return true; - case 43: //rdgs_p RDGS ,, Struct - if(ArraySize != 4) + case 15: //entries + if(ListFieldID == 0) //areasSize + { + Entries.resize(ArraySize); + return false; + } + + if(ListIndex >= Entries.value.size()) break; - RDGS.Load(); - RDGS->value43[0] = ((UINT8ARRAY)FieldValue)[0]; - RDGS->value43[1] = ((UINT8ARRAY)FieldValue)[1]; - RDGS->value43[2] = ((UINT8ARRAY)FieldValue)[2]; - RDGS->value43[3] = ((UINT8ARRAY)FieldValue)[3]; - break; - case 44: //rdmd Music Type - RDMD.Load(); - RDMD->value44 = *(UINT32 *)FieldValue; - break; - case 45: //rdmo Music - RDMO.Load(); - RDMO->value45 = *(FORMID *)FieldValue; - return true; - case 46: //rdsi Incidental MediaSet - RDSI.Load(); - RDSI->value46 = *(FORMID *)FieldValue; - return true; - case 47: //rdsb Battle MediaSet - RDSB.Load(); - RDSB->value47 = *(FORMID *)FieldValue; - return true; - case 48: //rdsd RDSD ,, Struct - RDSD.Load(); - RDSD->value48 = *(FORMID *)FieldValue; - return true; - case 49: //rdsd RDSD ,, Struct - RDSD.Load(); - RDSD->value49 = *(UINT32 *)FieldValue; - break; - case 50: //rdsd RDSD ,, Struct - RDSD.Load(); - RDSD->value50 = *(UINT32 *)FieldValue; - break; - case 51: //rdwt RDWT ,, Struct - RDWT.Load(); - RDWT->value51 = *(FORMID *)FieldValue; - return true; - case 52: //rdwt RDWT ,, Struct - RDWT.Load(); - RDWT->value52 = *(UINT32 *)FieldValue; + + switch(ListFieldID) + { + case 1: //entryType + Entries.value[ListIndex]->SetType(*(UINT32 *)FieldValue); + return true; + case 2: //flags + Entries.value[ListIndex]->SetFlagMask(*(UINT8 *)FieldValue); + break; + case 3: //priority + Entries.value[ListIndex]->RDAT.value.priority = *(UINT8 *)FieldValue; + break; + case 4: //unused1 + if(ArraySize != 2) + break; + Entries.value[ListIndex]->RDAT.value.unused1[0] = ((UINT8ARRAY)FieldValue)[0]; + Entries.value[ListIndex]->RDAT.value.unused1[1] = ((UINT8ARRAY)FieldValue)[1]; + break; + case 5: //objects + if(ListX2FieldID == 0) //objectsSize + { + Entries.value[ListIndex]->RDOT.resize(ArraySize); + return false; + } + + if(ListX2Index >= Entries.value[ListIndex]->RDOT.value.size()) + break; + + switch(ListX2FieldID) + { + case 1: //objectId + Entries.value[ListIndex]->RDOT.value[ListX2Index].objectId = *(FORMID *)FieldValue; + return true; + case 2: //parentIndex + Entries.value[ListIndex]->RDOT.value[ListX2Index].parentIndex = *(UINT16 *)FieldValue; + break; + case 3: //unused1 + if(ArraySize != 2) + break; + Entries.value[ListIndex]->RDOT.value[ListX2Index].unused1[0] = ((UINT8ARRAY)FieldValue)[0]; + Entries.value[ListIndex]->RDOT.value[ListX2Index].unused1[1] = ((UINT8ARRAY)FieldValue)[1]; + break; + case 4: //density + Entries.value[ListIndex]->RDOT.value[ListX2Index].density = *(FLOAT32 *)FieldValue; + break; + case 5: //clustering + Entries.value[ListIndex]->RDOT.value[ListX2Index].clustering = *(UINT8 *)FieldValue; + break; + case 6: //minSlope + Entries.value[ListIndex]->RDOT.value[ListX2Index].minSlope = *(UINT8 *)FieldValue; + break; + case 7: //maxSlope + Entries.value[ListIndex]->RDOT.value[ListX2Index].maxSlope = *(UINT8 *)FieldValue; + break; + case 8: //flags + Entries.value[ListIndex]->RDOT.value[ListX2Index].SetFlagMask(*(UINT8 *)FieldValue); + break; + case 9: //radiusWRTParent + Entries.value[ListIndex]->RDOT.value[ListX2Index].radiusWRTParent = *(UINT16 *)FieldValue; + break; + case 10: //radius + Entries.value[ListIndex]->RDOT.value[ListX2Index].radius = *(UINT16 *)FieldValue; + break; + case 11: //unk1 + if(ArraySize != 4) + break; + Entries.value[ListIndex]->RDOT.value[ListX2Index].unk1[0] = ((UINT8ARRAY)FieldValue)[0]; + Entries.value[ListIndex]->RDOT.value[ListX2Index].unk1[1] = ((UINT8ARRAY)FieldValue)[1]; + Entries.value[ListIndex]->RDOT.value[ListX2Index].unk1[2] = ((UINT8ARRAY)FieldValue)[2]; + Entries.value[ListIndex]->RDOT.value[ListX2Index].unk1[3] = ((UINT8ARRAY)FieldValue)[3]; + break; + case 12: //maxHeight + Entries.value[ListIndex]->RDOT.value[ListX2Index].maxHeight = *(FLOAT32 *)FieldValue; + break; + case 13: //sink + Entries.value[ListIndex]->RDOT.value[ListX2Index].sink = *(FLOAT32 *)FieldValue; + break; + case 14: //sinkVar + Entries.value[ListIndex]->RDOT.value[ListX2Index].sinkVar = *(FLOAT32 *)FieldValue; + break; + case 15: //sizeVar + Entries.value[ListIndex]->RDOT.value[ListX2Index].sizeVar = *(FLOAT32 *)FieldValue; + break; + case 16: //angleVarX + Entries.value[ListIndex]->RDOT.value[ListX2Index].angleVarX = *(UINT16 *)FieldValue; + break; + case 17: //angleVarY + Entries.value[ListIndex]->RDOT.value[ListX2Index].angleVarY = *(UINT16 *)FieldValue; + break; + case 18: //angleVarZ + Entries.value[ListIndex]->RDOT.value[ListX2Index].angleVarZ = *(UINT16 *)FieldValue; + break; + case 19: //unused2 + if(ArraySize != 2) + break; + Entries.value[ListIndex]->RDOT.value[ListX2Index].unused2[0] = ((UINT8ARRAY)FieldValue)[0]; + Entries.value[ListIndex]->RDOT.value[ListX2Index].unused2[1] = ((UINT8ARRAY)FieldValue)[1]; + break; + case 20: //unk2 + if(ArraySize != 4) + break; + Entries.value[ListIndex]->RDOT.value[ListX2Index].unk2[0] = ((UINT8ARRAY)FieldValue)[0]; + Entries.value[ListIndex]->RDOT.value[ListX2Index].unk2[1] = ((UINT8ARRAY)FieldValue)[1]; + Entries.value[ListIndex]->RDOT.value[ListX2Index].unk2[2] = ((UINT8ARRAY)FieldValue)[2]; + Entries.value[ListIndex]->RDOT.value[ListX2Index].unk2[3] = ((UINT8ARRAY)FieldValue)[3]; + break; + default: + break; + } + break; + case 6: //mapName + Entries.value[ListIndex]->RDMP.Copy((STRING)FieldValue); + break; + case 7: //iconPath + Entries.value[ListIndex]->ICON.Copy((STRING)FieldValue); + break; + case 8: //grasses + if(ListX2FieldID == 0) //grassesSize + { + Entries.value[ListIndex]->RDGS.resize(ArraySize); + return false; + } + + if(ListX2Index >= Entries.value[ListIndex]->RDGS.value.size()) + break; + + switch(ListX2FieldID) + { + case 1: //grass + Entries.value[ListIndex]->RDGS.value[ListX2Index].grass = *(FORMID *)FieldValue; + return true; + case 2: //unk1 + if(ArraySize != 4) + break; + Entries.value[ListIndex]->RDGS.value[ListX2Index].unk1[0] = ((UINT8ARRAY)FieldValue)[0]; + Entries.value[ListIndex]->RDGS.value[ListX2Index].unk1[1] = ((UINT8ARRAY)FieldValue)[1]; + Entries.value[ListIndex]->RDGS.value[ListX2Index].unk1[2] = ((UINT8ARRAY)FieldValue)[2]; + Entries.value[ListIndex]->RDGS.value[ListX2Index].unk1[3] = ((UINT8ARRAY)FieldValue)[3]; + break; + default: + break; + } + break; + case 9: //musicType + Entries.value[ListIndex]->SetMusicType(*(UINT32 *)FieldValue); + break; + case 10: //music + Entries.value[ListIndex]->RDMO.value = *(FORMID *)FieldValue; + return true; + case 11: //incidentalMedia + Entries.value[ListIndex]->RDSI.value = *(FORMID *)FieldValue; + return true; + case 12: //battleMedias + Entries.value[ListIndex]->RDSB.value.resize(ArraySize); + for(UINT32 x = 0; x < ArraySize; x++) + Entries.value[ListIndex]->RDSB.value[x] = ((FORMIDARRAY)FieldValue)[x]; + return true; + case 13: //sounds + if(ListX2FieldID == 0) //soundsSize + { + Entries.value[ListIndex]->RDSD.resize(ArraySize); + return false; + } + + if(ListX2Index >= Entries.value[ListIndex]->RDSD.value.size()) + break; + + switch(ListX2FieldID) + { + case 1: //sound + Entries.value[ListIndex]->RDSD.value[ListX2Index].sound = *(FORMID *)FieldValue; + return true; + case 2: //flags + Entries.value[ListIndex]->RDSD.value[ListX2Index].SetFlagMask(*(UINT32 *)FieldValue); + break; + case 3: //chance + Entries.value[ListIndex]->RDSD.value[ListX2Index].chance = *(UINT32 *)FieldValue; + break; + default: + break; + } + break; + case 14: //weathers + if(ListX2FieldID == 0) //weathersSize + { + Entries.value[ListIndex]->RDWT.resize(ArraySize); + return false; + } + + if(ListX2Index >= Entries.value[ListIndex]->RDWT.value.size()) + break; + + switch(ListX2FieldID) + { + case 1: //weather + Entries.value[ListIndex]->RDWT.value[ListX2Index].weather = *(FORMID *)FieldValue; + return true; + case 2: //chance + Entries.value[ListIndex]->RDWT.value[ListX2Index].chance = *(UINT32 *)FieldValue; + break; + case 3: //globalId + Entries.value[ListIndex]->RDWT.value[ListX2Index].globalId = *(FORMID *)FieldValue; + return true; + default: + break; + } + break; + case 15: //imposters + Entries.value[ListIndex]->RDID.value.resize(ArraySize); + for(UINT32 x = 0; x < ArraySize; x++) + Entries.value[ListIndex]->RDID.value[x] = ((FORMIDARRAY)FieldValue)[x]; + return true; + default: + break; + } break; - case 53: //rdwt RDWT ,, Struct - RDWT.Load(); - RDWT->value53 = *(FORMID *)FieldValue; - return true; - case 54: //rdid Imposters - return UNPARSEDGET_FIELD54; default: break; } @@ -598,6 +920,16 @@ bool REGNRecord::SetField(FIELD_IDENTIFIERS, void *FieldValue, UINT32 ArraySize) void REGNRecord::DeleteField(FIELD_IDENTIFIERS) { + GENCLR defaultCLR; + + REGNRDAT defaultRDAT; + + REGNRPLD defaultRPLD; + REGNRDOT defaultRDOT; + REGNRDGS defaultRDGS; + REGNRDSD defaultRDSD; + REGNRDWT defaultRDWT; + switch(FieldID) { case 1: //flags1 @@ -622,145 +954,274 @@ void REGNRecord::DeleteField(FIELD_IDENTIFIERS) case 8: //smallIconPath MICO.Unload(); return; - case 9: //rclr RCLR ,, Struct - RCLR.Unload(); + case 9: //mapRed + RCLR.value.red = defaultCLR.red; return; - case 10: //rclr RCLR ,, Struct - RCLR.Unload(); + case 10: //mapGreen + RCLR.value.green = defaultCLR.green; return; - case 11: //rclr RCLR ,, Struct - RCLR.Unload(); + case 11: //mapBlue + RCLR.value.blue = defaultCLR.blue; return; - case 12: //rclr_p RCLR ,, Struct - RCLR.Unload(); + case 12: //unused1 + RCLR.value.unused1 = defaultCLR.unused1; return; - case 13: //wnam Worldspace + case 13: //worldspace WNAM.Unload(); return; - case 14: //rpli Edge Fall-off - RPLI.Unload(); - return; - case 15: //rpld RPLD ,, Struct - RPLD.Unload(); - return; - case 16: //rpld RPLD ,, Struct - RPLD.Unload(); - return; - case 17: //rdat RDAT ,, Struct - RDAT.Unload(); - return; - case 18: //rdat RDAT ,, Struct - RDAT.Unload(); - return; - case 19: //rdat RDAT ,, Struct - RDAT.Unload(); - return; - case 20: //rdat_p RDAT ,, Struct - RDAT.Unload(); - return; - case 21: //rdot RDOT ,, Struct - RDOT.Unload(); - return; - case 22: //rdot RDOT ,, Struct - RDOT.Unload(); - return; - case 23: //rdot_p RDOT ,, Struct - RDOT.Unload(); - return; - case 24: //rdot RDOT ,, Struct - RDOT.Unload(); - return; - case 25: //rdot RDOT ,, Struct - RDOT.Unload(); - return; - case 26: //rdot RDOT ,, Struct - RDOT.Unload(); - return; - case 27: //rdot RDOT ,, Struct - RDOT.Unload(); - return; - case 28: //rdot RDOT ,, Struct - RDOT.Unload(); - return; - case 29: //rdot RDOT ,, Struct - RDOT.Unload(); - return; - case 30: //rdot RDOT ,, Struct - RDOT.Unload(); - return; - case 31: //rdot_p RDOT ,, Struct - RDOT.Unload(); - return; - case 32: //rdot RDOT ,, Struct - RDOT.Unload(); - return; - case 33: //rdot RDOT ,, Struct - RDOT.Unload(); - return; - case 34: //rdot RDOT ,, Struct - RDOT.Unload(); - return; - case 35: //rdot RDOT ,, Struct - RDOT.Unload(); - return; - case 36: //rdot RDOT ,, Struct - RDOT.Unload(); - return; - case 37: //rdot RDOT ,, Struct - RDOT.Unload(); - return; - case 38: //rdot RDOT ,, Struct - RDOT.Unload(); - return; - case 39: //rdot_p RDOT ,, Struct - RDOT.Unload(); - return; - case 40: //rdot_p RDOT ,, Struct - RDOT.Unload(); - return; - case 41: //rdmp Map Name - RDMP.Unload(); - return; - case 42: //rdgs RDGS ,, Struct - RDGS.Unload(); - return; - case 43: //rdgs_p RDGS ,, Struct - RDGS.Unload(); - return; - case 44: //rdmd Music Type - RDMD.Unload(); - return; - case 45: //rdmo Music - RDMO.Unload(); - return; - case 46: //rdsi Incidental MediaSet - RDSI.Unload(); - return; - case 47: //rdsb Battle MediaSet - RDSB.Unload(); - return; - case 48: //rdsd RDSD ,, Struct - RDSD.Unload(); - return; - case 49: //rdsd RDSD ,, Struct - RDSD.Unload(); - return; - case 50: //rdsd RDSD ,, Struct - RDSD.Unload(); - return; - case 51: //rdwt RDWT ,, Struct - RDWT.Unload(); - return; - case 52: //rdwt RDWT ,, Struct - RDWT.Unload(); + case 14: //areas + if(ListFieldID == 0) //areas + { + Areas.Unload(); + return; + } + + if(ListIndex >= Areas.value.size()) + return; + + switch(ListFieldID) + { + case 1: //edgeFalloff + Areas.value[ListIndex]->RPLI.Unload(); + return; + case 2: //points + if(ListX2FieldID == 0) //points + { + Areas.value[ListIndex]->RPLD.Unload(); + return; + } + + if(ListX2Index >= Areas.value[ListIndex]->RPLD.value.size()) + return; + + switch(ListX2FieldID) + { + case 1: //posX + Areas.value[ListIndex]->RPLD.value[ListX2Index].posX = defaultRPLD.posX; + return; + case 2: //posY + Areas.value[ListIndex]->RPLD.value[ListX2Index].posY = defaultRPLD.posY; + return; + default: + return; + } + return; + default: + return; + } return; - case 53: //rdwt RDWT ,, Struct - RDWT.Unload(); + case 15: //entries + if(ListFieldID == 0) //entries + { + Entries.Unload(); + return; + } + + if(ListIndex >= Entries.value.size()) + return; + + switch(ListFieldID) + { + case 1: //entryType + Entries.value[ListIndex]->RDAT.value.entryType = defaultRDAT.entryType; + return; + case 2: //flags + Entries.value[ListIndex]->RDAT.value.flags = defaultRDAT.flags; + return; + case 3: //priority + Entries.value[ListIndex]->RDAT.value.priority = defaultRDAT.priority; + return; + case 4: //unused1 + Entries.value[ListIndex]->RDAT.value.unused1[0] = defaultRDAT.unused1[0]; + Entries.value[ListIndex]->RDAT.value.unused1[1] = defaultRDAT.unused1[1]; + return; + case 5: //objects + if(ListX2FieldID == 0) //objects + { + Entries.value[ListIndex]->RDOT.Unload(); + return; + } + + if(ListX2Index >= Entries.value[ListIndex]->RDOT.value.size()) + return; + + switch(ListX2FieldID) + { + case 1: //objectId + Entries.value[ListIndex]->RDOT.value[ListX2Index].objectId = defaultRDOT.objectId; + return; + case 2: //parentIndex + Entries.value[ListIndex]->RDOT.value[ListX2Index].parentIndex = defaultRDOT.parentIndex; + return; + case 3: //unused1 + Entries.value[ListIndex]->RDOT.value[ListX2Index].unused1[0] = defaultRDOT.unused1[0]; + Entries.value[ListIndex]->RDOT.value[ListX2Index].unused1[1] = defaultRDOT.unused1[1]; + return; + case 4: //density + Entries.value[ListIndex]->RDOT.value[ListX2Index].density = defaultRDOT.density; + return; + case 5: //clustering + Entries.value[ListIndex]->RDOT.value[ListX2Index].clustering = defaultRDOT.clustering; + return; + case 6: //minSlope + Entries.value[ListIndex]->RDOT.value[ListX2Index].minSlope = defaultRDOT.minSlope; + return; + case 7: //maxSlope + Entries.value[ListIndex]->RDOT.value[ListX2Index].maxSlope = defaultRDOT.maxSlope; + return; + case 8: //flags + Entries.value[ListIndex]->RDOT.value[ListX2Index].flags = defaultRDOT.flags; + return; + case 9: //radiusWRTParent + Entries.value[ListIndex]->RDOT.value[ListX2Index].radiusWRTParent = defaultRDOT.radiusWRTParent; + return; + case 10: //radius + Entries.value[ListIndex]->RDOT.value[ListX2Index].radius = defaultRDOT.radius; + return; + case 11: //unk1 + Entries.value[ListIndex]->RDOT.value[ListX2Index].unk1[0] = defaultRDOT.unk1[0]; + Entries.value[ListIndex]->RDOT.value[ListX2Index].unk1[1] = defaultRDOT.unk1[1]; + Entries.value[ListIndex]->RDOT.value[ListX2Index].unk1[2] = defaultRDOT.unk1[2]; + Entries.value[ListIndex]->RDOT.value[ListX2Index].unk1[3] = defaultRDOT.unk1[3]; + return; + case 12: //maxHeight + Entries.value[ListIndex]->RDOT.value[ListX2Index].maxHeight = defaultRDOT.maxHeight; + return; + case 13: //sink + Entries.value[ListIndex]->RDOT.value[ListX2Index].sink = defaultRDOT.sink; + return; + case 14: //sinkVar + Entries.value[ListIndex]->RDOT.value[ListX2Index].sinkVar = defaultRDOT.sinkVar; + return; + case 15: //sizeVar + Entries.value[ListIndex]->RDOT.value[ListX2Index].sizeVar = defaultRDOT.sizeVar; + return; + case 16: //angleVarX + Entries.value[ListIndex]->RDOT.value[ListX2Index].angleVarX = defaultRDOT.angleVarX; + return; + case 17: //angleVarY + Entries.value[ListIndex]->RDOT.value[ListX2Index].angleVarY = defaultRDOT.angleVarY; + return; + case 18: //angleVarZ + Entries.value[ListIndex]->RDOT.value[ListX2Index].angleVarZ = defaultRDOT.angleVarZ; + return; + case 19: //unused2 + Entries.value[ListIndex]->RDOT.value[ListX2Index].unused2[0] = defaultRDOT.unused2[0]; + Entries.value[ListIndex]->RDOT.value[ListX2Index].unused2[1] = defaultRDOT.unused2[1]; + return; + case 20: //unk2 + Entries.value[ListIndex]->RDOT.value[ListX2Index].unk2[0] = defaultRDOT.unk2[0]; + Entries.value[ListIndex]->RDOT.value[ListX2Index].unk2[1] = defaultRDOT.unk2[1]; + Entries.value[ListIndex]->RDOT.value[ListX2Index].unk2[2] = defaultRDOT.unk2[2]; + Entries.value[ListIndex]->RDOT.value[ListX2Index].unk2[3] = defaultRDOT.unk2[3]; + return; + default: + return; + } + return; + case 6: //mapName + Entries.value[ListIndex]->RDMP.Unload(); + return; + case 7: //iconPath + Entries.value[ListIndex]->ICON.Unload(); + return; + case 8: //grasses + if(ListX2FieldID == 0) //grasses + { + Entries.value[ListIndex]->RDGS.Unload(); + return; + } + + if(ListX2Index >= Entries.value[ListIndex]->RDGS.value.size()) + return; + + switch(ListX2FieldID) + { + case 1: //grass + Entries.value[ListIndex]->RDGS.value[ListX2Index].grass = defaultRDGS.grass; + return; + case 2: //unk1 + Entries.value[ListIndex]->RDGS.value[ListX2Index].unk1[0] = defaultRDGS.unk1[0]; + Entries.value[ListIndex]->RDGS.value[ListX2Index].unk1[1] = defaultRDGS.unk1[1]; + Entries.value[ListIndex]->RDGS.value[ListX2Index].unk1[2] = defaultRDGS.unk1[2]; + Entries.value[ListIndex]->RDGS.value[ListX2Index].unk1[3] = defaultRDGS.unk1[3]; + return; + default: + return; + } + return; + case 9: //musicType + Entries.value[ListIndex]->RDMD.Unload(); + return; + case 10: //music + Entries.value[ListIndex]->RDMO.Unload(); + return; + case 11: //incidentalMedia + Entries.value[ListIndex]->RDSI.Unload(); + return; + case 12: //battleMedias + Entries.value[ListIndex]->RDSB.Unload(); + return; + case 13: //sounds + if(ListX2FieldID == 0) //sounds + { + Entries.value[ListIndex]->RDSD.Unload(); + return; + } + + if(ListX2Index >= Entries.value[ListIndex]->RDSD.value.size()) + return; + + switch(ListX2FieldID) + { + case 1: //sound + Entries.value[ListIndex]->RDSD.value[ListX2Index].sound = defaultRDSD.sound; + return; + case 2: //flags + Entries.value[ListIndex]->RDSD.value[ListX2Index].flags = defaultRDSD.flags; + return; + case 3: //chance + Entries.value[ListIndex]->RDSD.value[ListX2Index].chance = defaultRDSD.chance; + return; + default: + return; + } + return; + case 14: //weathers + if(ListX2FieldID == 0) //weathers + { + Entries.value[ListIndex]->RDWT.Unload(); + return; + } + + if(ListX2Index >= Entries.value[ListIndex]->RDWT.value.size()) + return; + + switch(ListX2FieldID) + { + case 1: //weather + Entries.value[ListIndex]->RDWT.value[ListX2Index].weather = defaultRDWT.weather; + return; + case 2: //chance + Entries.value[ListIndex]->RDWT.value[ListX2Index].chance = defaultRDWT.chance; + return; + case 3: //globalId + Entries.value[ListIndex]->RDWT.value[ListX2Index].globalId = defaultRDWT.globalId; + return; + default: + return; + } + return; + case 15: //imposters + Entries.value[ListIndex]->RDWT.Unload(); + return; + default: + return; + } return; - case 54: //rdid Imposters - return UNPARSEDDEL_FIELD54; default: return; } + return; } } \ No newline at end of file diff --git a/CBash/FalloutNewVegas/Records/API/WTHRRecordAPI.cpp b/CBash/FalloutNewVegas/Records/API/WTHRRecordAPI.cpp index b419ef0..8c8315d 100644 --- a/CBash/FalloutNewVegas/Records/API/WTHRRecordAPI.cpp +++ b/CBash/FalloutNewVegas/Records/API/WTHRRecordAPI.cpp @@ -60,25 +60,25 @@ UINT32 WTHRRecord::GetFieldAttribute(FIELD_IDENTIFIERS, UINT32 WhichAttribute) return UNKNOWN_FIELD; } return UNKNOWN_FIELD; - case 7: //0iad Sunrise Image Space Modifier + case 7: //sunriseImageSpace return FORMID_FIELD; - case 8: //1iad Day Image Space Modifier + case 8: //dayImageSpace return FORMID_FIELD; - case 9: //2iad Sunset Image Space Modifier + case 9: //sunsetImageSpace return FORMID_FIELD; - case 10: //3iad Night Image Space Modifier + case 10: //nightImageSpace return FORMID_FIELD; - case 11: //4iad Unknown + case 11: //unknown1ImageSpace return FORMID_FIELD; - case 12: //5iad Unknown + case 12: //unknown2ImageSpace return FORMID_FIELD; - case 13: //dnam Cloud Textures - Layer 0 + case 13: //cloudLayer0Path return ISTRING_FIELD; - case 14: //cnam Cloud Textures - Layer 1 + case 14: //cloudLayer1Path return ISTRING_FIELD; - case 15: //anam Cloud Textures - Layer 2 + case 15: //cloudLayer2Path return ISTRING_FIELD; - case 16: //bnam Cloud Textures - Layer 3 + case 16: //cloudLayer3Path return ISTRING_FIELD; case 17: //modPath return ISTRING_FIELD; @@ -106,13 +106,13 @@ UINT32 WTHRRecord::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) @@ -126,40 +126,54 @@ UINT32 WTHRRecord::GetFieldAttribute(FIELD_IDENTIFIERS, UINT32 WhichAttribute) default: return UNKNOWN_FIELD; } - - case 23: //modelFlags + return UNKNOWN_FIELD; + case 21: //modelFlags + return UINT8_FLAG_FIELD; + case 22: //unknown1 + return UINT32_FIELD; + case 23: //layer0Speed + return UINT8_FIELD; + case 24: //layer1Speed return UINT8_FIELD; - case 24: //lnam_p Unknown + case 25: //layer2Speed + return UINT8_FIELD; + case 26: //layer3Speed + return UINT8_FIELD; + case 27: //pnam_p switch(WhichAttribute) { case 0: //fieldType return UINT8_ARRAY_FIELD; case 1: //fieldSize - return 4; + return PNAM.GetSize(); default: return UNKNOWN_FIELD; } return UNKNOWN_FIELD; - case 25: //onam Cloud Speed - return UNPARSED_FIELD; - case 26: //pnam_p Unused + case 28: //upperSky.rise.red + return UINT8_FIELD; + case 29: //upperSky.rise.green + return UINT8_FIELD; + case 30: //upperSky.rise.blue + return UINT8_FIELD; + case 31: //upperSky.rise.unused1 switch(WhichAttribute) { case 0: //fieldType return UINT8_ARRAY_FIELD; case 1: //fieldSize - return PNAM.GetSize(); + return 1; default: return UNKNOWN_FIELD; } return UNKNOWN_FIELD; - case 27: //nam0 NAM0 ,, Struct + case 32: //upperSky.day.red return UINT8_FIELD; - case 28: //nam0 NAM0 ,, Struct + case 33: //upperSky.day.green return UINT8_FIELD; - case 29: //nam0 NAM0 ,, Struct + case 34: //upperSky.day.blue return UINT8_FIELD; - case 30: //nam0_p NAM0 ,, Struct + case 35: //upperSky.day.unused1 switch(WhichAttribute) { case 0: //fieldType @@ -170,720 +184,2825 @@ UINT32 WTHRRecord::GetFieldAttribute(FIELD_IDENTIFIERS, UINT32 WhichAttribute) return UNKNOWN_FIELD; } return UNKNOWN_FIELD; - case 31: //fnam FNAM ,, Struct - return FLOAT32_FIELD; - case 32: //fnam FNAM ,, Struct - return FLOAT32_FIELD; - case 33: //fnam FNAM ,, Struct - return FLOAT32_FIELD; - case 34: //fnam FNAM ,, Struct - return FLOAT32_FIELD; - case 35: //fnam FNAM ,, Struct - return FLOAT32_FIELD; - case 36: //fnam FNAM ,, Struct - return FLOAT32_FIELD; - case 37: //inam_p Unused + case 36: //upperSky.set.red + return UINT8_FIELD; + case 37: //upperSky.set.green + return UINT8_FIELD; + case 38: //upperSky.set.blue + return UINT8_FIELD; + case 39: //upperSky.set.unused1 switch(WhichAttribute) { case 0: //fieldType return UINT8_ARRAY_FIELD; case 1: //fieldSize - return 304; + return 1; default: return UNKNOWN_FIELD; } return UNKNOWN_FIELD; - case 38: //data DATA ,, Struct + case 40: //upperSky.night.red return UINT8_FIELD; - case 39: //data DATA ,, Struct + case 41: //upperSky.night.green return UINT8_FIELD; - case 40: //data DATA ,, Struct + case 42: //upperSky.night.blue return UINT8_FIELD; - case 41: //data DATA ,, Struct + case 43: //upperSky.night.unused1 + switch(WhichAttribute) + { + case 0: //fieldType + return UINT8_ARRAY_FIELD; + case 1: //fieldSize + return 1; + default: + return UNKNOWN_FIELD; + } + return UNKNOWN_FIELD; + case 44: //upperSky.noon.red return UINT8_FIELD; - case 42: //data DATA ,, Struct + case 45: //upperSky.noon.green return UINT8_FIELD; - case 43: //data DATA ,, Struct + case 46: //upperSky.noon.blue return UINT8_FIELD; - case 44: //data DATA ,, Struct + case 47: //upperSky.noon.unused1 + switch(WhichAttribute) + { + case 0: //fieldType + return UINT8_ARRAY_FIELD; + case 1: //fieldSize + return 1; + default: + return UNKNOWN_FIELD; + } + return UNKNOWN_FIELD; + case 48: //upperSky.midnight.red return UINT8_FIELD; - case 45: //data DATA ,, Struct + case 49: //upperSky.midnight.green return UINT8_FIELD; - case 46: //data DATA ,, Struct + case 50: //upperSky.midnight.blue return UINT8_FIELD; - case 47: //data DATA ,, Struct + case 51: //upperSky.midnight.unused1 + switch(WhichAttribute) + { + case 0: //fieldType + return UINT8_ARRAY_FIELD; + case 1: //fieldSize + return 1; + default: + return UNKNOWN_FIELD; + } + return UNKNOWN_FIELD; + case 52: //fog.rise.red return UINT8_FIELD; - case 48: //data DATA ,, Struct + case 53: //fog.rise.green return UINT8_FIELD; - case 49: //data DATA ,, Struct + case 54: //fog.rise.blue return UINT8_FIELD; - case 50: //data DATA ,, Struct + case 55: //fog.rise.unused1 + switch(WhichAttribute) + { + case 0: //fieldType + return UINT8_ARRAY_FIELD; + case 1: //fieldSize + return 1; + default: + return UNKNOWN_FIELD; + } + return UNKNOWN_FIELD; + case 56: //fog.day.red return UINT8_FIELD; - case 51: //data DATA ,, Struct + case 57: //fog.day.green return UINT8_FIELD; - case 52: //data DATA ,, Struct + case 58: //fog.day.blue return UINT8_FIELD; - case 53: //snam SNAM ,, Struct - return FORMID_FIELD; - case 54: //snam SNAM ,, Struct - return UINT32_FIELD; - default: + case 59: //fog.day.unused1 + switch(WhichAttribute) + { + case 0: //fieldType + return UINT8_ARRAY_FIELD; + case 1: //fieldSize + return 1; + default: + return UNKNOWN_FIELD; + } + return UNKNOWN_FIELD; + case 60: //fog.set.red + return UINT8_FIELD; + case 61: //fog.set.green + return UINT8_FIELD; + case 62: //fog.set.blue + return UINT8_FIELD; + case 63: //fog.set.unused1 + switch(WhichAttribute) + { + case 0: //fieldType + return UINT8_ARRAY_FIELD; + case 1: //fieldSize + return 1; + default: + return UNKNOWN_FIELD; + } + return UNKNOWN_FIELD; + case 64: //fog.night.red + return UINT8_FIELD; + case 65: //fog.night.green + return UINT8_FIELD; + case 66: //fog.night.blue + return UINT8_FIELD; + case 67: //fog.night.unused1 + switch(WhichAttribute) + { + case 0: //fieldType + return UINT8_ARRAY_FIELD; + case 1: //fieldSize + return 1; + default: + return UNKNOWN_FIELD; + } + return UNKNOWN_FIELD; + case 68: //fog.noon.red + return UINT8_FIELD; + case 69: //fog.noon.green + return UINT8_FIELD; + case 70: //fog.noon.blue + return UINT8_FIELD; + case 71: //fog.noon.unused1 + switch(WhichAttribute) + { + case 0: //fieldType + return UINT8_ARRAY_FIELD; + case 1: //fieldSize + return 1; + default: + return UNKNOWN_FIELD; + } + return UNKNOWN_FIELD; + case 72: //fog.midnight.red + return UINT8_FIELD; + case 73: //fog.midnight.green + return UINT8_FIELD; + case 74: //fog.midnight.blue + return UINT8_FIELD; + case 75: //fog.midnight.unused1 + switch(WhichAttribute) + { + case 0: //fieldType + return UINT8_ARRAY_FIELD; + case 1: //fieldSize + return 1; + default: + return UNKNOWN_FIELD; + } + return UNKNOWN_FIELD; + case 76: //lowerClouds.rise.red + return UINT8_FIELD; + case 77: //lowerClouds.rise.green + return UINT8_FIELD; + case 78: //lowerClouds.rise.blue + return UINT8_FIELD; + case 79: //lowerClouds.rise.unused1 + switch(WhichAttribute) + { + case 0: //fieldType + return UINT8_ARRAY_FIELD; + case 1: //fieldSize + return 1; + default: + return UNKNOWN_FIELD; + } + return UNKNOWN_FIELD; + case 80: //lowerClouds.day.red + return UINT8_FIELD; + case 81: //lowerClouds.day.green + return UINT8_FIELD; + case 82: //lowerClouds.day.blue + return UINT8_FIELD; + case 83: //lowerClouds.day.unused1 + switch(WhichAttribute) + { + case 0: //fieldType + return UINT8_ARRAY_FIELD; + case 1: //fieldSize + return 1; + default: + return UNKNOWN_FIELD; + } + return UNKNOWN_FIELD; + case 84: //lowerClouds.set.red + return UINT8_FIELD; + case 85: //lowerClouds.set.green + return UINT8_FIELD; + case 86: //lowerClouds.set.blue + return UINT8_FIELD; + case 87: //lowerClouds.set.unused1 + switch(WhichAttribute) + { + case 0: //fieldType + return UINT8_ARRAY_FIELD; + case 1: //fieldSize + return 1; + default: + return UNKNOWN_FIELD; + } + return UNKNOWN_FIELD; + case 88: //lowerClouds.night.red + return UINT8_FIELD; + case 89: //lowerClouds.night.green + return UINT8_FIELD; + case 90: //lowerClouds.night.blue + return UINT8_FIELD; + case 91: //lowerClouds.night.unused1 + switch(WhichAttribute) + { + case 0: //fieldType + return UINT8_ARRAY_FIELD; + case 1: //fieldSize + return 1; + default: + return UNKNOWN_FIELD; + } + return UNKNOWN_FIELD; + case 92: //lowerClouds.noon.red + return UINT8_FIELD; + case 93: //lowerClouds.noon.green + return UINT8_FIELD; + case 94: //lowerClouds.noon.blue + return UINT8_FIELD; + case 95: //lowerClouds.noon.unused1 + switch(WhichAttribute) + { + case 0: //fieldType + return UINT8_ARRAY_FIELD; + case 1: //fieldSize + return 1; + default: + return UNKNOWN_FIELD; + } return UNKNOWN_FIELD; - } - return UNKNOWN_FIELD; - } - -void * WTHRRecord::GetField(FIELD_IDENTIFIERS, void **FieldValues) - { - switch(FieldID) - { - case 1: //flags1 - return &flags; - case 2: //fid - return &formID; - case 3: //versionControl1 - *FieldValues = &flagsUnk; - return NULL; - case 4: //eid - return EDID.value; - case 5: //formVersion - return &formVersion; - case 6: //versionControl2 - *FieldValues = &versionControl2[0]; - return NULL; - case 7: //0iad Sunrise Image Space Modifier - return 0IAD.IsLoaded() ? &0IAD->value7 : NULL; - case 8: //1iad Day Image Space Modifier - return 1IAD.IsLoaded() ? &1IAD->value8 : NULL; - case 9: //2iad Sunset Image Space Modifier - return 2IAD.IsLoaded() ? &2IAD->value9 : NULL; - case 10: //3iad Night Image Space Modifier - return 3IAD.IsLoaded() ? &3IAD->value10 : NULL; - case 11: //4iad Unknown - return 4IAD.IsLoaded() ? &4IAD->value11 : NULL; - case 12: //5iad Unknown - return 5IAD.IsLoaded() ? &5IAD->value12 : NULL; - case 13: //dnam Cloud Textures - Layer 0 - return DNAM.value; - case 14: //cnam Cloud Textures - Layer 1 - return CNAM.value; - case 15: //anam Cloud Textures - Layer 2 - return ANAM.value; - case 16: //bnam Cloud Textures - Layer 3 - return BNAM.value; - case 17: //modPath - return MODL.IsLoaded() ? MODL->MODL.value : NULL; - case 18: //modb - return MODL.IsLoaded() ? &MODL->MODB.value : NULL; - case 19: //modt_p - *FieldValues = MODL.IsLoaded() ? MODL->MODT.value : NULL; - return NULL; - case 20: //mods Alternate Textures - return MODL.IsLoaded() ? MODL->MODS.value : NULL; - case 21: //mods Alternate Textures - return MODL.IsLoaded() ? &MODL->MODS->value21 : NULL; - case 22: //mods Alternate Textures - return MODL.IsLoaded() ? &MODL->MODS->value22 : NULL; - case 23: //modelFlags - return MODL.IsLoaded() ? &MODL->MODD->value23 : NULL; - case 24: //lnam_p Unknown - *FieldValues = LNAM.IsLoaded() ? &LNAM->value24[0] : NULL; - return NULL; - case 25: //onam Cloud Speed - return UNPARSEDGET_FIELD25; - case 26: //pnam_p Unused - *FieldValues = PNAM.value; - return NULL; - case 27: //nam0 NAM0 ,, Struct - return NAM0.IsLoaded() ? &NAM0->value27 : NULL; - case 28: //nam0 NAM0 ,, Struct - return NAM0.IsLoaded() ? &NAM0->value28 : NULL; - case 29: //nam0 NAM0 ,, Struct - return NAM0.IsLoaded() ? &NAM0->value29 : NULL; - case 30: //nam0_p NAM0 ,, Struct - *FieldValues = NAM0.IsLoaded() ? &NAM0->value30[0] : NULL; - return NULL; - case 31: //fnam FNAM ,, Struct - return FNAM.IsLoaded() ? &FNAM->value31 : NULL; - case 32: //fnam FNAM ,, Struct - return FNAM.IsLoaded() ? &FNAM->value32 : NULL; - case 33: //fnam FNAM ,, Struct - return FNAM.IsLoaded() ? &FNAM->value33 : NULL; - case 34: //fnam FNAM ,, Struct - return FNAM.IsLoaded() ? &FNAM->value34 : NULL; - case 35: //fnam FNAM ,, Struct - return FNAM.IsLoaded() ? &FNAM->value35 : NULL; - case 36: //fnam FNAM ,, Struct - return FNAM.IsLoaded() ? &FNAM->value36 : NULL; - case 37: //inam_p Unused - *FieldValues = INAM.IsLoaded() ? &INAM->value37[0] : NULL; - return 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: //snam SNAM ,, Struct - return SNAM.IsLoaded() ? &SNAM->value53 : NULL; - case 54: //snam SNAM ,, Struct - return SNAM.IsLoaded() ? &SNAM->value54 : NULL; - default: - return NULL; - } - return NULL; - } -bool WTHRRecord::SetField(FIELD_IDENTIFIERS, void *FieldValue, UINT32 ArraySize) - { - switch(FieldID) - { - case 1: //flags1 - SetHeaderFlagMask(*(UINT32 *)FieldValue); - break; - case 3: //versionControl1 - if(ArraySize != 4) - break; - ((UINT8ARRAY)&flagsUnk)[0] = ((UINT8ARRAY)FieldValue)[0]; - ((UINT8ARRAY)&flagsUnk)[1] = ((UINT8ARRAY)FieldValue)[1]; - ((UINT8ARRAY)&flagsUnk)[2] = ((UINT8ARRAY)FieldValue)[2]; - ((UINT8ARRAY)&flagsUnk)[3] = ((UINT8ARRAY)FieldValue)[3]; - break; - case 4: //eid - EDID.Copy((STRING)FieldValue); - break; - case 5: //formVersion - formVersion = *(UINT16 *)FieldValue; - break; - case 6: //versionControl2 - if(ArraySize != 2) - break; + case 96: //lowerClouds.midnight.red + return UINT8_FIELD; + case 97: //lowerClouds.midnight.green + return UINT8_FIELD; + case 98: //lowerClouds.midnight.blue + return UINT8_FIELD; + case 99: //lowerClouds.midnight.unused1 + switch(WhichAttribute) + { + case 0: //fieldType + return UINT8_ARRAY_FIELD; + case 1: //fieldSize + return 1; + default: + return UNKNOWN_FIELD; + } + return UNKNOWN_FIELD; + case 100: //ambient.rise.red + return UINT8_FIELD; + case 101: //ambient.rise.green + return UINT8_FIELD; + case 102: //ambient.rise.blue + return UINT8_FIELD; + case 103: //ambient.rise.unused1 + switch(WhichAttribute) + { + case 0: //fieldType + return UINT8_ARRAY_FIELD; + case 1: //fieldSize + return 1; + default: + return UNKNOWN_FIELD; + } + return UNKNOWN_FIELD; + case 104: //ambient.day.red + return UINT8_FIELD; + case 105: //ambient.day.green + return UINT8_FIELD; + case 106: //ambient.day.blue + return UINT8_FIELD; + case 107: //ambient.day.unused1 + switch(WhichAttribute) + { + case 0: //fieldType + return UINT8_ARRAY_FIELD; + case 1: //fieldSize + return 1; + default: + return UNKNOWN_FIELD; + } + return UNKNOWN_FIELD; + case 108: //ambient.set.red + return UINT8_FIELD; + case 109: //ambient.set.green + return UINT8_FIELD; + case 110: //ambient.set.blue + return UINT8_FIELD; + case 111: //ambient.set.unused1 + switch(WhichAttribute) + { + case 0: //fieldType + return UINT8_ARRAY_FIELD; + case 1: //fieldSize + return 1; + default: + return UNKNOWN_FIELD; + } + return UNKNOWN_FIELD; + case 112: //ambient.night.red + return UINT8_FIELD; + case 113: //ambient.night.green + return UINT8_FIELD; + case 114: //ambient.night.blue + return UINT8_FIELD; + case 115: //ambient.night.unused1 + switch(WhichAttribute) + { + case 0: //fieldType + return UINT8_ARRAY_FIELD; + case 1: //fieldSize + return 1; + default: + return UNKNOWN_FIELD; + } + return UNKNOWN_FIELD; + case 116: //ambient.noon.red + return UINT8_FIELD; + case 117: //ambient.noon.green + return UINT8_FIELD; + case 118: //ambient.noon.blue + return UINT8_FIELD; + case 119: //ambient.noon.unused1 + switch(WhichAttribute) + { + case 0: //fieldType + return UINT8_ARRAY_FIELD; + case 1: //fieldSize + return 1; + default: + return UNKNOWN_FIELD; + } + return UNKNOWN_FIELD; + + case 120: //ambient.midnight.red + return UINT8_FIELD; + case 121: //ambient.midnight.green + return UINT8_FIELD; + case 122: //ambient.midnight.blue + return UINT8_FIELD; + case 123: //ambient.midnight.unused1 + switch(WhichAttribute) + { + case 0: //fieldType + return UINT8_ARRAY_FIELD; + case 1: //fieldSize + return 1; + default: + return UNKNOWN_FIELD; + } + return UNKNOWN_FIELD; + case 124: //sunlight.rise.red + return UINT8_FIELD; + case 125: //sunlight.rise.green + return UINT8_FIELD; + case 126: //sunlight.rise.blue + return UINT8_FIELD; + case 127: //sunlight.rise.unused1 + switch(WhichAttribute) + { + case 0: //fieldType + return UINT8_ARRAY_FIELD; + case 1: //fieldSize + return 1; + default: + return UNKNOWN_FIELD; + } + return UNKNOWN_FIELD; + case 128: //sunlight.day.red + return UINT8_FIELD; + case 129: //sunlight.day.green + return UINT8_FIELD; + case 130: //sunlight.day.blue + return UINT8_FIELD; + case 131: //sunlight.day.unused1 + switch(WhichAttribute) + { + case 0: //fieldType + return UINT8_ARRAY_FIELD; + case 1: //fieldSize + return 1; + default: + return UNKNOWN_FIELD; + } + return UNKNOWN_FIELD; + case 132: //sunlight.set.red + return UINT8_FIELD; + case 133: //sunlight.set.green + return UINT8_FIELD; + case 134: //sunlight.set.blue + return UINT8_FIELD; + case 135: //sunlight.set.unused1 + switch(WhichAttribute) + { + case 0: //fieldType + return UINT8_ARRAY_FIELD; + case 1: //fieldSize + return 1; + default: + return UNKNOWN_FIELD; + } + return UNKNOWN_FIELD; + case 136: //sunlight.night.red + return UINT8_FIELD; + case 137: //sunlight.night.green + return UINT8_FIELD; + case 138: //sunlight.night.blue + return UINT8_FIELD; + case 139: //sunlight.night.unused1 + switch(WhichAttribute) + { + case 0: //fieldType + return UINT8_ARRAY_FIELD; + case 1: //fieldSize + return 1; + default: + return UNKNOWN_FIELD; + } + return UNKNOWN_FIELD; + case 140: //sunlight.noon.red + return UINT8_FIELD; + case 141: //sunlight.noon.green + return UINT8_FIELD; + case 142: //sunlight.noon.blue + return UINT8_FIELD; + case 143: //sunlight.noon.unused1 + switch(WhichAttribute) + { + case 0: //fieldType + return UINT8_ARRAY_FIELD; + case 1: //fieldSize + return 1; + default: + return UNKNOWN_FIELD; + } + return UNKNOWN_FIELD; + + case 144: //sunlight.midnight.red + return UINT8_FIELD; + case 145: //sunlight.midnight.green + return UINT8_FIELD; + case 146: //sunlight.midnight.blue + return UINT8_FIELD; + case 147: //sunlight.midnight.unused1 + switch(WhichAttribute) + { + case 0: //fieldType + return UINT8_ARRAY_FIELD; + case 1: //fieldSize + return 1; + default: + return UNKNOWN_FIELD; + } + return UNKNOWN_FIELD; + case 148: //sun.rise.red + return UINT8_FIELD; + case 149: //sun.rise.green + return UINT8_FIELD; + case 150: //sun.rise.blue + return UINT8_FIELD; + case 151: //sun.rise.unused1 + switch(WhichAttribute) + { + case 0: //fieldType + return UINT8_ARRAY_FIELD; + case 1: //fieldSize + return 1; + default: + return UNKNOWN_FIELD; + } + return UNKNOWN_FIELD; + case 152: //sun.day.red + return UINT8_FIELD; + case 153: //sun.day.green + return UINT8_FIELD; + case 154: //sun.day.blue + return UINT8_FIELD; + case 155: //sun.day.unused1 + switch(WhichAttribute) + { + case 0: //fieldType + return UINT8_ARRAY_FIELD; + case 1: //fieldSize + return 1; + default: + return UNKNOWN_FIELD; + } + return UNKNOWN_FIELD; + case 156: //sun.set.red + return UINT8_FIELD; + case 157: //sun.set.green + return UINT8_FIELD; + case 158: //sun.set.blue + return UINT8_FIELD; + case 159: //sun.set.unused1 + switch(WhichAttribute) + { + case 0: //fieldType + return UINT8_ARRAY_FIELD; + case 1: //fieldSize + return 1; + default: + return UNKNOWN_FIELD; + } + return UNKNOWN_FIELD; + case 160: //sun.night.red + return UINT8_FIELD; + case 161: //sun.night.green + return UINT8_FIELD; + case 162: //sun.night.blue + return UINT8_FIELD; + case 163: //sun.night.unused1 + switch(WhichAttribute) + { + case 0: //fieldType + return UINT8_ARRAY_FIELD; + case 1: //fieldSize + return 1; + default: + return UNKNOWN_FIELD; + } + return UNKNOWN_FIELD; + case 164: //sun.noon.red + return UINT8_FIELD; + case 165: //sun.noon.green + return UINT8_FIELD; + case 166: //sun.noon.blue + return UINT8_FIELD; + case 167: //sun.noon.unused1 + switch(WhichAttribute) + { + case 0: //fieldType + return UINT8_ARRAY_FIELD; + case 1: //fieldSize + return 1; + default: + return UNKNOWN_FIELD; + } + return UNKNOWN_FIELD; + + case 168: //sun.midnight.red + return UINT8_FIELD; + case 169: //sun.midnight.green + return UINT8_FIELD; + case 170: //sun.midnight.blue + return UINT8_FIELD; + case 171: //sun.midnight.unused1 + switch(WhichAttribute) + { + case 0: //fieldType + return UINT8_ARRAY_FIELD; + case 1: //fieldSize + return 1; + default: + return UNKNOWN_FIELD; + } + return UNKNOWN_FIELD; + case 172: //stars.rise.red + return UINT8_FIELD; + case 173: //stars.rise.green + return UINT8_FIELD; + case 174: //stars.rise.blue + return UINT8_FIELD; + case 175: //stars.rise.unused1 + switch(WhichAttribute) + { + case 0: //fieldType + return UINT8_ARRAY_FIELD; + case 1: //fieldSize + return 1; + default: + return UNKNOWN_FIELD; + } + return UNKNOWN_FIELD; + case 176: //stars.day.red + return UINT8_FIELD; + case 177: //stars.day.green + return UINT8_FIELD; + case 178: //stars.day.blue + return UINT8_FIELD; + case 179: //stars.day.unused1 + switch(WhichAttribute) + { + case 0: //fieldType + return UINT8_ARRAY_FIELD; + case 1: //fieldSize + return 1; + default: + return UNKNOWN_FIELD; + } + return UNKNOWN_FIELD; + case 180: //stars.set.red + return UINT8_FIELD; + case 181: //stars.set.green + return UINT8_FIELD; + case 182: //stars.set.blue + return UINT8_FIELD; + case 183: //stars.set.unused1 + switch(WhichAttribute) + { + case 0: //fieldType + return UINT8_ARRAY_FIELD; + case 1: //fieldSize + return 1; + default: + return UNKNOWN_FIELD; + } + return UNKNOWN_FIELD; + case 184: //stars.night.red + return UINT8_FIELD; + case 185: //stars.night.green + return UINT8_FIELD; + case 186: //stars.night.blue + return UINT8_FIELD; + case 187: //stars.night.unused1 + switch(WhichAttribute) + { + case 0: //fieldType + return UINT8_ARRAY_FIELD; + case 1: //fieldSize + return 1; + default: + return UNKNOWN_FIELD; + } + return UNKNOWN_FIELD; + case 188: //stars.noon.red + return UINT8_FIELD; + case 189: //stars.noon.green + return UINT8_FIELD; + case 190: //stars.noon.blue + return UINT8_FIELD; + case 191: //stars.noon.unused1 + switch(WhichAttribute) + { + case 0: //fieldType + return UINT8_ARRAY_FIELD; + case 1: //fieldSize + return 1; + default: + return UNKNOWN_FIELD; + } + return UNKNOWN_FIELD; + + case 192: //stars.midnight.red + return UINT8_FIELD; + case 193: //stars.midnight.green + return UINT8_FIELD; + case 194: //stars.midnight.blue + return UINT8_FIELD; + case 195: //stars.midnight.unused1 + switch(WhichAttribute) + { + case 0: //fieldType + return UINT8_ARRAY_FIELD; + case 1: //fieldSize + return 1; + default: + return UNKNOWN_FIELD; + } + return UNKNOWN_FIELD; + case 196: //lowerSky.rise.red + return UINT8_FIELD; + case 197: //lowerSky.rise.green + return UINT8_FIELD; + case 198: //lowerSky.rise.blue + return UINT8_FIELD; + case 199: //lowerSky.rise.unused1 + switch(WhichAttribute) + { + case 0: //fieldType + return UINT8_ARRAY_FIELD; + case 1: //fieldSize + return 1; + default: + return UNKNOWN_FIELD; + } + return UNKNOWN_FIELD; + case 200: //lowerSky.day.red + return UINT8_FIELD; + case 201: //lowerSky.day.green + return UINT8_FIELD; + case 202: //lowerSky.day.blue + return UINT8_FIELD; + case 203: //lowerSky.day.unused1 + switch(WhichAttribute) + { + case 0: //fieldType + return UINT8_ARRAY_FIELD; + case 1: //fieldSize + return 1; + default: + return UNKNOWN_FIELD; + } + return UNKNOWN_FIELD; + case 204: //lowerSky.set.red + return UINT8_FIELD; + case 205: //lowerSky.set.green + return UINT8_FIELD; + case 206: //lowerSky.set.blue + return UINT8_FIELD; + case 207: //lowerSky.set.unused1 + switch(WhichAttribute) + { + case 0: //fieldType + return UINT8_ARRAY_FIELD; + case 1: //fieldSize + return 1; + default: + return UNKNOWN_FIELD; + } + return UNKNOWN_FIELD; + case 208: //lowerSky.night.red + return UINT8_FIELD; + case 209: //lowerSky.night.green + return UINT8_FIELD; + case 210: //lowerSky.night.blue + return UINT8_FIELD; + case 211: //lowerSky.night.unused1 + switch(WhichAttribute) + { + case 0: //fieldType + return UINT8_ARRAY_FIELD; + case 1: //fieldSize + return 1; + default: + return UNKNOWN_FIELD; + } + return UNKNOWN_FIELD; + case 212: //lowerSky.noon.red + return UINT8_FIELD; + case 213: //lowerSky.noon.green + return UINT8_FIELD; + case 214: //lowerSky.noon.blue + return UINT8_FIELD; + case 215: //lowerSky.noon.unused1 + switch(WhichAttribute) + { + case 0: //fieldType + return UINT8_ARRAY_FIELD; + case 1: //fieldSize + return 1; + default: + return UNKNOWN_FIELD; + } + return UNKNOWN_FIELD; + + case 216: //lowerSky.midnight.red + return UINT8_FIELD; + case 217: //lowerSky.midnight.green + return UINT8_FIELD; + case 218: //lowerSky.midnight.blue + return UINT8_FIELD; + case 219: //lowerSky.midnight.unused1 + switch(WhichAttribute) + { + case 0: //fieldType + return UINT8_ARRAY_FIELD; + case 1: //fieldSize + return 1; + default: + return UNKNOWN_FIELD; + } + return UNKNOWN_FIELD; + case 220: //horizon.rise.red + return UINT8_FIELD; + case 221: //horizon.rise.green + return UINT8_FIELD; + case 222: //horizon.rise.blue + return UINT8_FIELD; + case 223: //horizon.rise.unused1 + switch(WhichAttribute) + { + case 0: //fieldType + return UINT8_ARRAY_FIELD; + case 1: //fieldSize + return 1; + default: + return UNKNOWN_FIELD; + } + return UNKNOWN_FIELD; + case 224: //horizon.day.red + return UINT8_FIELD; + case 225: //horizon.day.green + return UINT8_FIELD; + case 226: //horizon.day.blue + return UINT8_FIELD; + case 227: //horizon.day.unused1 + switch(WhichAttribute) + { + case 0: //fieldType + return UINT8_ARRAY_FIELD; + case 1: //fieldSize + return 1; + default: + return UNKNOWN_FIELD; + } + return UNKNOWN_FIELD; + case 228: //horizon.set.red + return UINT8_FIELD; + case 229: //horizon.set.green + return UINT8_FIELD; + case 230: //horizon.set.blue + return UINT8_FIELD; + case 231: //horizon.set.unused1 + switch(WhichAttribute) + { + case 0: //fieldType + return UINT8_ARRAY_FIELD; + case 1: //fieldSize + return 1; + default: + return UNKNOWN_FIELD; + } + return UNKNOWN_FIELD; + case 232: //horizon.night.red + return UINT8_FIELD; + case 233: //horizon.night.green + return UINT8_FIELD; + case 234: //horizon.night.blue + return UINT8_FIELD; + case 235: //horizon.night.unused1 + switch(WhichAttribute) + { + case 0: //fieldType + return UINT8_ARRAY_FIELD; + case 1: //fieldSize + return 1; + default: + return UNKNOWN_FIELD; + } + return UNKNOWN_FIELD; + case 236: //horizon.noon.red + return UINT8_FIELD; + case 237: //horizon.noon.green + return UINT8_FIELD; + case 238: //horizon.noon.blue + return UINT8_FIELD; + case 239: //horizon.noon.unused1 + switch(WhichAttribute) + { + case 0: //fieldType + return UINT8_ARRAY_FIELD; + case 1: //fieldSize + return 1; + default: + return UNKNOWN_FIELD; + } + return UNKNOWN_FIELD; + + case 240: //horizon.midnight.red + return UINT8_FIELD; + case 241: //horizon.midnight.green + return UINT8_FIELD; + case 242: //horizon.midnight.blue + return UINT8_FIELD; + case 243: //horizon.midnight.unused1 + switch(WhichAttribute) + { + case 0: //fieldType + return UINT8_ARRAY_FIELD; + case 1: //fieldSize + return 1; + default: + return UNKNOWN_FIELD; + } + return UNKNOWN_FIELD; + case 244: //upperClouds.rise.red + return UINT8_FIELD; + case 245: //upperClouds.rise.green + return UINT8_FIELD; + case 246: //upperClouds.rise.blue + return UINT8_FIELD; + case 247: //upperClouds.rise.unused1 + switch(WhichAttribute) + { + case 0: //fieldType + return UINT8_ARRAY_FIELD; + case 1: //fieldSize + return 1; + default: + return UNKNOWN_FIELD; + } + return UNKNOWN_FIELD; + case 248: //upperClouds.day.red + return UINT8_FIELD; + case 249: //upperClouds.day.green + return UINT8_FIELD; + case 250: //upperClouds.day.blue + return UINT8_FIELD; + case 251: //upperClouds.day.unused1 + switch(WhichAttribute) + { + case 0: //fieldType + return UINT8_ARRAY_FIELD; + case 1: //fieldSize + return 1; + default: + return UNKNOWN_FIELD; + } + return UNKNOWN_FIELD; + case 252: //upperClouds.set.red + return UINT8_FIELD; + case 253: //upperClouds.set.green + return UINT8_FIELD; + case 254: //upperClouds.set.blue + return UINT8_FIELD; + case 255: //upperClouds.set.unused1 + switch(WhichAttribute) + { + case 0: //fieldType + return UINT8_ARRAY_FIELD; + case 1: //fieldSize + return 1; + default: + return UNKNOWN_FIELD; + } + return UNKNOWN_FIELD; + case 256: //upperClouds.night.red + return UINT8_FIELD; + case 257: //upperClouds.night.green + return UINT8_FIELD; + case 258: //upperClouds.night.blue + return UINT8_FIELD; + case 259: //upperClouds.night.unused1 + switch(WhichAttribute) + { + case 0: //fieldType + return UINT8_ARRAY_FIELD; + case 1: //fieldSize + return 1; + default: + return UNKNOWN_FIELD; + } + return UNKNOWN_FIELD; + case 260: //upperClouds.noon.red + return UINT8_FIELD; + case 261: //upperClouds.noon.green + return UINT8_FIELD; + case 262: //upperClouds.noon.blue + return UINT8_FIELD; + case 263: //upperClouds.noon.unused1 + switch(WhichAttribute) + { + case 0: //fieldType + return UINT8_ARRAY_FIELD; + case 1: //fieldSize + return 1; + default: + return UNKNOWN_FIELD; + } + return UNKNOWN_FIELD; + case 264: //upperClouds.midnight.red + return UINT8_FIELD; + case 265: //upperClouds.midnight.green + return UINT8_FIELD; + case 266: //upperClouds.midnight.blue + return UINT8_FIELD; + case 267: //upperClouds.midnight.unused1 + switch(WhichAttribute) + { + case 0: //fieldType + return UINT8_ARRAY_FIELD; + case 1: //fieldSize + return 1; + default: + return UNKNOWN_FIELD; + } + return UNKNOWN_FIELD; + case 268: //fogDayNear + return FLOAT32_FIELD; + case 269: //fogDayFar + return FLOAT32_FIELD; + case 270: //fogNightNear + return FLOAT32_FIELD; + case 271: //fogNightFar + return FLOAT32_FIELD; + case 272: //fogDayPower + return FLOAT32_FIELD; + case 273: //fogNightPower + return FLOAT32_FIELD; + case 274: //inam_p + switch(WhichAttribute) + { + case 0: //fieldType + return UINT8_ARRAY_FIELD; + case 1: //fieldSize + return INAM.GetSize(); + default: + return UNKNOWN_FIELD; + } + return UNKNOWN_FIELD; + case 275: //windSpeed + return UINT8_FIELD; + case 276: //lowerCloudSpeed + return UINT8_FIELD; + case 277: //upperCloudSpeed + return UINT8_FIELD; + case 278: //transDelta + return UINT8_FIELD; + case 279: //sunGlare + return UINT8_FIELD; + case 280: //sunDamage + return UINT8_FIELD; + case 281: //rainFadeIn + return UINT8_FIELD; + case 282: //rainFadeOut + return UINT8_FIELD; + case 283: //boltFadeIn + return UINT8_FIELD; + case 284: //boltFadeOut + return UINT8_FIELD; + case 285: //boltFrequency + return UINT8_FIELD; + case 286: //weatherType + return UINT8_TYPE_FIELD; + case 287: //boltRed + return UINT8_FIELD; + case 288: //boltGreen + return UINT8_FIELD; + case 289: //boltBlue + return UINT8_FIELD; + case 290: //sounds + if(ListFieldID == 0) //sounds + { + switch(WhichAttribute) + { + case 0: //fieldType + return LIST_FIELD; + case 1: //fieldSize + return (UINT32)Sounds.value.size(); + default: + return UNKNOWN_FIELD; + } + return UNKNOWN_FIELD; + } + + if(ListIndex >= Sounds.value.size()) + return UNKNOWN_FIELD; + + switch(ListFieldID) + { + case 1: //sound + return FORMID_FIELD; + case 2: //type + return UINT32_TYPE_FIELD; + default: + return UNKNOWN_FIELD; + } + return UNKNOWN_FIELD; + default: + return UNKNOWN_FIELD; + } + return UNKNOWN_FIELD; + } + +void * WTHRRecord::GetField(FIELD_IDENTIFIERS, void **FieldValues) + { + switch(FieldID) + { + case 1: //flags1 + return &flags; + case 2: //fid + return &formID; + case 3: //versionControl1 + *FieldValues = &flagsUnk; + return NULL; + case 4: //eid + return EDID.value; + case 5: //formVersion + return &formVersion; + case 6: //versionControl2 + *FieldValues = &versionControl2[0]; + return NULL; + case 7: //sunriseImageSpace + return &_0IAD.value; + case 8: //dayImageSpace + return &_1IAD.value; + case 9: //sunsetImageSpace + return &_2IAD.value; + case 10: //nightImageSpace + return &_3IAD.value; + case 11: //unknown1ImageSpace + return &_4IAD.value; + case 12: //unknown2ImageSpace + return &_5IAD.value; + case 13: //cloudLayer0Path + return DNAM.value; + case 14: //cloudLayer1Path + return CNAM.value; + case 15: //cloudLayer2Path + return ANAM.value; + case 16: //cloudLayer3Path + return BNAM.value; + case 17: //modPath + return MODL.IsLoaded() ? MODL->MODL.value : NULL; + case 18: //modb + return MODL.IsLoaded() ? &MODL->MODB.value : NULL; + case 19: //modt_p + *FieldValues = MODL.IsLoaded() ? MODL->MODT.value : NULL; + return NULL; + case 20: //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 21: //modelFlags + return MODL.IsLoaded() ? &MODL->MODD.value : NULL; + case 22: //unknown1 + return &LNAM.value; + case 23: //layer0Speed + return ONAM.IsLoaded() ? &ONAM->layer0Speed : NULL; + case 24: //layer1Speed + return ONAM.IsLoaded() ? &ONAM->layer1Speed : NULL; + case 25: //layer2Speed + return ONAM.IsLoaded() ? &ONAM->layer2Speed : NULL; + case 26: //layer3Speed + return ONAM.IsLoaded() ? &ONAM->layer3Speed : NULL; + case 27: //pnam_p + *FieldValues = PNAM.value; + return NULL; + case 28: //upperSky.rise.red + return &NAM0.value.upperSky.rise.red; + case 29: //upperSky.rise.green + return &NAM0.value.upperSky.rise.green; + case 30: //upperSky.rise.blue + return &NAM0.value.upperSky.rise.blue; + case 31: //upperSky.rise.unused1 + *FieldValues = &NAM0.value.upperSky.rise.unused1; + return NULL; + case 32: //upperSky.day.red + return &NAM0.value.upperSky.day.red; + case 33: //upperSky.day.green + return &NAM0.value.upperSky.day.green; + case 34: //upperSky.day.blue + return &NAM0.value.upperSky.day.blue; + case 35: //upperSky.day.unused1 + *FieldValues = &NAM0.value.upperSky.day.unused1; + return NULL; + case 36: //upperSky.set.red + return &NAM0.value.upperSky.set.red; + case 37: //upperSky.set.green + return &NAM0.value.upperSky.set.green; + case 38: //upperSky.set.blue + return &NAM0.value.upperSky.set.blue; + case 39: //upperSky.set.unused1 + *FieldValues = &NAM0.value.upperSky.set.unused1; + return NULL; + case 40: //upperSky.night.red + return &NAM0.value.upperSky.night.red; + case 41: //upperSky.night.green + return &NAM0.value.upperSky.night.green; + case 42: //upperSky.night.blue + return &NAM0.value.upperSky.night.blue; + case 43: //upperSky.night.unused1 + *FieldValues = &NAM0.value.upperSky.night.unused1; + return NULL; + case 44: //upperSky.noon.red + return &NAM0.value.upperSky.noon.red; + case 45: //upperSky.noon.green + return &NAM0.value.upperSky.noon.green; + case 46: //upperSky.noon.blue + return &NAM0.value.upperSky.noon.blue; + case 47: //upperSky.noon.unused1 + *FieldValues = &NAM0.value.upperSky.noon.unused1; + return NULL; + case 48: //upperSky.midnight.red + return &NAM0.value.upperSky.midnight.red; + case 49: //upperSky.midnight.green + return &NAM0.value.upperSky.midnight.green; + case 50: //upperSky.midnight.blue + return &NAM0.value.upperSky.midnight.blue; + case 51: //upperSky.midnight.unused1 + *FieldValues = &NAM0.value.upperSky.midnight.unused1; + return NULL; + case 52: //fog.rise.red + return &NAM0.value.fog.rise.red; + case 53: //fog.rise.green + return &NAM0.value.fog.rise.green; + case 54: //fog.rise.blue + return &NAM0.value.fog.rise.blue; + case 55: //fog.rise.unused1 + *FieldValues = &NAM0.value.fog.rise.unused1; + return NULL; + case 56: //fog.day.red + return &NAM0.value.fog.day.red; + case 57: //fog.day.green + return &NAM0.value.fog.day.green; + case 58: //fog.day.blue + return &NAM0.value.fog.day.blue; + case 59: //fog.day.unused1 + *FieldValues = &NAM0.value.fog.day.unused1; + return NULL; + case 60: //fog.set.red + return &NAM0.value.fog.set.red; + case 61: //fog.set.green + return &NAM0.value.fog.set.green; + case 62: //fog.set.blue + return &NAM0.value.fog.set.blue; + case 63: //fog.set.unused1 + *FieldValues = &NAM0.value.fog.set.unused1; + return NULL; + case 64: //fog.night.red + return &NAM0.value.fog.night.red; + case 65: //fog.night.green + return &NAM0.value.fog.night.green; + case 66: //fog.night.blue + return &NAM0.value.fog.night.blue; + case 67: //fog.night.unused1 + *FieldValues = &NAM0.value.fog.night.unused1; + return NULL; + case 68: //fog.noon.red + return &NAM0.value.fog.noon.red; + case 69: //fog.noon.green + return &NAM0.value.fog.noon.green; + case 70: //fog.noon.blue + return &NAM0.value.fog.noon.blue; + case 71: //fog.noon.unused1 + *FieldValues = &NAM0.value.fog.noon.unused1; + return NULL; + case 72: //fog.midnight.red + return &NAM0.value.fog.midnight.red; + case 73: //fog.midnight.green + return &NAM0.value.fog.midnight.green; + case 74: //fog.midnight.blue + return &NAM0.value.fog.midnight.blue; + case 75: //fog.midnight.unused1 + *FieldValues = &NAM0.value.fog.midnight.unused1; + return NULL; + case 76: //lowerClouds.rise.red + return &NAM0.value.lowerClouds.rise.red; + case 77: //lowerClouds.rise.green + return &NAM0.value.lowerClouds.rise.green; + case 78: //lowerClouds.rise.blue + return &NAM0.value.lowerClouds.rise.blue; + case 79: //lowerClouds.rise.unused1 + *FieldValues = &NAM0.value.lowerClouds.rise.unused1; + return NULL; + case 80: //lowerClouds.day.red + return &NAM0.value.lowerClouds.day.red; + case 81: //lowerClouds.day.green + return &NAM0.value.lowerClouds.day.green; + case 82: //lowerClouds.day.blue + return &NAM0.value.lowerClouds.day.blue; + case 83: //lowerClouds.day.unused1 + *FieldValues = &NAM0.value.lowerClouds.day.unused1; + return NULL; + case 84: //lowerClouds.set.red + return &NAM0.value.lowerClouds.set.red; + case 85: //lowerClouds.set.green + return &NAM0.value.lowerClouds.set.green; + case 86: //lowerClouds.set.blue + return &NAM0.value.lowerClouds.set.blue; + case 87: //lowerClouds.set.unused1 + *FieldValues = &NAM0.value.lowerClouds.set.unused1; + return NULL; + case 88: //lowerClouds.night.red + return &NAM0.value.lowerClouds.night.red; + case 89: //lowerClouds.night.green + return &NAM0.value.lowerClouds.night.green; + case 90: //lowerClouds.night.blue + return &NAM0.value.lowerClouds.night.blue; + case 91: //lowerClouds.night.unused1 + *FieldValues = &NAM0.value.lowerClouds.night.unused1; + return NULL; + case 92: //lowerClouds.noon.red + return &NAM0.value.lowerClouds.noon.red; + case 93: //lowerClouds.noon.green + return &NAM0.value.lowerClouds.noon.green; + case 94: //lowerClouds.noon.blue + return &NAM0.value.lowerClouds.noon.blue; + case 95: //lowerClouds.noon.unused1 + *FieldValues = &NAM0.value.lowerClouds.noon.unused1; + return NULL; + case 96: //lowerClouds.midnight.red + return &NAM0.value.lowerClouds.midnight.red; + case 97: //lowerClouds.midnight.green + return &NAM0.value.lowerClouds.midnight.green; + case 98: //lowerClouds.midnight.blue + return &NAM0.value.lowerClouds.midnight.blue; + case 99: //lowerClouds.midnight.unused1 + *FieldValues = &NAM0.value.lowerClouds.midnight.unused1; + return NULL; + case 100: //ambient.rise.red + return &NAM0.value.ambient.rise.red; + case 101: //ambient.rise.green + return &NAM0.value.ambient.rise.green; + case 102: //ambient.rise.blue + return &NAM0.value.ambient.rise.blue; + case 103: //ambient.rise.unused1 + *FieldValues = &NAM0.value.ambient.rise.unused1; + return NULL; + case 104: //ambient.day.red + return &NAM0.value.ambient.day.red; + case 105: //ambient.day.green + return &NAM0.value.ambient.day.green; + case 106: //ambient.day.blue + return &NAM0.value.ambient.day.blue; + case 107: //ambient.day.unused1 + *FieldValues = &NAM0.value.ambient.day.unused1; + return NULL; + case 108: //ambient.set.red + return &NAM0.value.ambient.set.red; + case 109: //ambient.set.green + return &NAM0.value.ambient.set.green; + case 110: //ambient.set.blue + return &NAM0.value.ambient.set.blue; + case 111: //ambient.set.unused1 + *FieldValues = &NAM0.value.ambient.set.unused1; + return NULL; + case 112: //ambient.night.red + return &NAM0.value.ambient.night.red; + case 113: //ambient.night.green + return &NAM0.value.ambient.night.green; + case 114: //ambient.night.blue + return &NAM0.value.ambient.night.blue; + case 115: //ambient.night.unused1 + *FieldValues = &NAM0.value.ambient.night.unused1; + return NULL; + case 116: //ambient.noon.red + return &NAM0.value.ambient.noon.red; + case 117: //ambient.noon.green + return &NAM0.value.ambient.noon.green; + case 118: //ambient.noon.blue + return &NAM0.value.ambient.noon.blue; + case 119: //ambient.noon.unused1 + *FieldValues = &NAM0.value.ambient.noon.unused1; + return NULL; + case 120: //ambient.midnight.red + return &NAM0.value.ambient.midnight.red; + case 121: //ambient.midnight.green + return &NAM0.value.ambient.midnight.green; + case 122: //ambient.midnight.blue + return &NAM0.value.ambient.midnight.blue; + case 123: //ambient.midnight.unused1 + *FieldValues = &NAM0.value.ambient.midnight.unused1; + return NULL; + case 124: //sunlight.rise.red + return &NAM0.value.sunlight.rise.red; + case 125: //sunlight.rise.green + return &NAM0.value.sunlight.rise.green; + case 126: //sunlight.rise.blue + return &NAM0.value.sunlight.rise.blue; + case 127: //sunlight.rise.unused1 + *FieldValues = &NAM0.value.sunlight.rise.unused1; + return NULL; + case 128: //sunlight.day.red + return &NAM0.value.sunlight.day.red; + case 129: //sunlight.day.green + return &NAM0.value.sunlight.day.green; + case 130: //sunlight.day.blue + return &NAM0.value.sunlight.day.blue; + case 131: //sunlight.day.unused1 + *FieldValues = &NAM0.value.sunlight.day.unused1; + return NULL; + case 132: //sunlight.set.red + return &NAM0.value.sunlight.set.red; + case 133: //sunlight.set.green + return &NAM0.value.sunlight.set.green; + case 134: //sunlight.set.blue + return &NAM0.value.sunlight.set.blue; + case 135: //sunlight.set.unused1 + *FieldValues = &NAM0.value.sunlight.set.unused1; + return NULL; + case 136: //sunlight.night.red + return &NAM0.value.sunlight.night.red; + case 137: //sunlight.night.green + return &NAM0.value.sunlight.night.green; + case 138: //sunlight.night.blue + return &NAM0.value.sunlight.night.blue; + case 139: //sunlight.night.unused1 + *FieldValues = &NAM0.value.sunlight.night.unused1; + return NULL; + case 140: //sunlight.noon.red + return &NAM0.value.sunlight.noon.red; + case 141: //sunlight.noon.green + return &NAM0.value.sunlight.noon.green; + case 142: //sunlight.noon.blue + return &NAM0.value.sunlight.noon.blue; + case 143: //sunlight.noon.unused1 + *FieldValues = &NAM0.value.sunlight.noon.unused1; + return NULL; + case 144: //sunlight.midnight.red + return &NAM0.value.sunlight.midnight.red; + case 145: //sunlight.midnight.green + return &NAM0.value.sunlight.midnight.green; + case 146: //sunlight.midnight.blue + return &NAM0.value.sunlight.midnight.blue; + case 147: //sunlight.midnight.unused1 + *FieldValues = &NAM0.value.sunlight.midnight.unused1; + return NULL; + case 148: //sun.rise.red + return &NAM0.value.sun.rise.red; + case 149: //sun.rise.green + return &NAM0.value.sun.rise.green; + case 150: //sun.rise.blue + return &NAM0.value.sun.rise.blue; + case 151: //sun.rise.unused1 + *FieldValues = &NAM0.value.sun.rise.unused1; + return NULL; + case 152: //sun.day.red + return &NAM0.value.sun.day.red; + case 153: //sun.day.green + return &NAM0.value.sun.day.green; + case 154: //sun.day.blue + return &NAM0.value.sun.day.blue; + case 155: //sun.day.unused1 + *FieldValues = &NAM0.value.sun.day.unused1; + return NULL; + case 156: //sun.set.red + return &NAM0.value.sun.set.red; + case 157: //sun.set.green + return &NAM0.value.sun.set.green; + case 158: //sun.set.blue + return &NAM0.value.sun.set.blue; + case 159: //sun.set.unused1 + *FieldValues = &NAM0.value.sun.set.unused1; + return NULL; + case 160: //sun.night.red + return &NAM0.value.sun.night.red; + case 161: //sun.night.green + return &NAM0.value.sun.night.green; + case 162: //sun.night.blue + return &NAM0.value.sun.night.blue; + case 163: //sun.night.unused1 + *FieldValues = &NAM0.value.sun.night.unused1; + return NULL; + case 164: //sun.noon.red + return &NAM0.value.sun.noon.red; + case 165: //sun.noon.green + return &NAM0.value.sun.noon.green; + case 166: //sun.noon.blue + return &NAM0.value.sun.noon.blue; + case 167: //sun.noon.unused1 + *FieldValues = &NAM0.value.sun.noon.unused1; + return NULL; + case 168: //sun.midnight.red + return &NAM0.value.sun.midnight.red; + case 169: //sun.midnight.green + return &NAM0.value.sun.midnight.green; + case 170: //sun.midnight.blue + return &NAM0.value.sun.midnight.blue; + case 171: //sun.midnight.unused1 + *FieldValues = &NAM0.value.sun.midnight.unused1; + return NULL; + case 172: //stars.rise.red + return &NAM0.value.stars.rise.red; + case 173: //stars.rise.green + return &NAM0.value.stars.rise.green; + case 174: //stars.rise.blue + return &NAM0.value.stars.rise.blue; + case 175: //stars.rise.unused1 + *FieldValues = &NAM0.value.stars.rise.unused1; + return NULL; + case 176: //stars.day.red + return &NAM0.value.stars.day.red; + case 177: //stars.day.green + return &NAM0.value.stars.day.green; + case 178: //stars.day.blue + return &NAM0.value.stars.day.blue; + case 179: //stars.day.unused1 + *FieldValues = &NAM0.value.stars.day.unused1; + return NULL; + case 180: //stars.set.red + return &NAM0.value.stars.set.red; + case 181: //stars.set.green + return &NAM0.value.stars.set.green; + case 182: //stars.set.blue + return &NAM0.value.stars.set.blue; + case 183: //stars.set.unused1 + *FieldValues = &NAM0.value.stars.set.unused1; + return NULL; + case 184: //stars.night.red + return &NAM0.value.stars.night.red; + case 185: //stars.night.green + return &NAM0.value.stars.night.green; + case 186: //stars.night.blue + return &NAM0.value.stars.night.blue; + case 187: //stars.night.unused1 + *FieldValues = &NAM0.value.stars.night.unused1; + return NULL; + case 188: //stars.noon.red + return &NAM0.value.stars.noon.red; + case 189: //stars.noon.green + return &NAM0.value.stars.noon.green; + case 190: //stars.noon.blue + return &NAM0.value.stars.noon.blue; + case 191: //stars.noon.unused1 + *FieldValues = &NAM0.value.stars.noon.unused1; + return NULL; + case 192: //stars.midnight.red + return &NAM0.value.stars.midnight.red; + case 193: //stars.midnight.green + return &NAM0.value.stars.midnight.green; + case 194: //stars.midnight.blue + return &NAM0.value.stars.midnight.blue; + case 195: //stars.midnight.unused1 + *FieldValues = &NAM0.value.stars.midnight.unused1; + return NULL; + case 196: //lowerSky.rise.red + return &NAM0.value.lowerSky.rise.red; + case 197: //lowerSky.rise.green + return &NAM0.value.lowerSky.rise.green; + case 198: //lowerSky.rise.blue + return &NAM0.value.lowerSky.rise.blue; + case 199: //lowerSky.rise.unused1 + *FieldValues = &NAM0.value.lowerSky.rise.unused1; + return NULL; + case 200: //lowerSky.day.red + return &NAM0.value.lowerSky.day.red; + case 201: //lowerSky.day.green + return &NAM0.value.lowerSky.day.green; + case 202: //lowerSky.day.blue + return &NAM0.value.lowerSky.day.blue; + case 203: //lowerSky.day.unused1 + *FieldValues = &NAM0.value.lowerSky.day.unused1; + return NULL; + case 204: //lowerSky.set.red + return &NAM0.value.lowerSky.set.red; + case 205: //lowerSky.set.green + return &NAM0.value.lowerSky.set.green; + case 206: //lowerSky.set.blue + return &NAM0.value.lowerSky.set.blue; + case 207: //lowerSky.set.unused1 + *FieldValues = &NAM0.value.lowerSky.set.unused1; + return NULL; + case 208: //lowerSky.night.red + return &NAM0.value.lowerSky.night.red; + case 209: //lowerSky.night.green + return &NAM0.value.lowerSky.night.green; + case 210: //lowerSky.night.blue + return &NAM0.value.lowerSky.night.blue; + case 211: //lowerSky.night.unused1 + *FieldValues = &NAM0.value.lowerSky.night.unused1; + return NULL; + case 212: //lowerSky.noon.red + return &NAM0.value.lowerSky.noon.red; + case 213: //lowerSky.noon.green + return &NAM0.value.lowerSky.noon.green; + case 214: //lowerSky.noon.blue + return &NAM0.value.lowerSky.noon.blue; + case 215: //lowerSky.noon.unused1 + *FieldValues = &NAM0.value.lowerSky.noon.unused1; + return NULL; + case 216: //lowerSky.midnight.red + return &NAM0.value.lowerSky.midnight.red; + case 217: //lowerSky.midnight.green + return &NAM0.value.lowerSky.midnight.green; + case 218: //lowerSky.midnight.blue + return &NAM0.value.lowerSky.midnight.blue; + case 219: //lowerSky.midnight.unused1 + *FieldValues = &NAM0.value.lowerSky.midnight.unused1; + return NULL; + case 220: //horizon.rise.red + return &NAM0.value.horizon.rise.red; + case 221: //horizon.rise.green + return &NAM0.value.horizon.rise.green; + case 222: //horizon.rise.blue + return &NAM0.value.horizon.rise.blue; + case 223: //horizon.rise.unused1 + *FieldValues = &NAM0.value.horizon.rise.unused1; + return NULL; + case 224: //horizon.day.red + return &NAM0.value.horizon.day.red; + case 225: //horizon.day.green + return &NAM0.value.horizon.day.green; + case 226: //horizon.day.blue + return &NAM0.value.horizon.day.blue; + case 227: //horizon.day.unused1 + *FieldValues = &NAM0.value.horizon.day.unused1; + return NULL; + case 228: //horizon.set.red + return &NAM0.value.horizon.set.red; + case 229: //horizon.set.green + return &NAM0.value.horizon.set.green; + case 230: //horizon.set.blue + return &NAM0.value.horizon.set.blue; + case 231: //horizon.set.unused1 + *FieldValues = &NAM0.value.horizon.set.unused1; + return NULL; + case 232: //horizon.night.red + return &NAM0.value.horizon.night.red; + case 233: //horizon.night.green + return &NAM0.value.horizon.night.green; + case 234: //horizon.night.blue + return &NAM0.value.horizon.night.blue; + case 235: //horizon.night.unused1 + *FieldValues = &NAM0.value.horizon.night.unused1; + return NULL; + case 236: //horizon.noon.red + return &NAM0.value.horizon.noon.red; + case 237: //horizon.noon.green + return &NAM0.value.horizon.noon.green; + case 238: //horizon.noon.blue + return &NAM0.value.horizon.noon.blue; + case 239: //horizon.noon.unused1 + *FieldValues = &NAM0.value.horizon.noon.unused1; + return NULL; + case 240: //horizon.midnight.red + return &NAM0.value.horizon.midnight.red; + case 241: //horizon.midnight.green + return &NAM0.value.horizon.midnight.green; + case 242: //horizon.midnight.blue + return &NAM0.value.horizon.midnight.blue; + case 243: //horizon.midnight.unused1 + *FieldValues = &NAM0.value.horizon.midnight.unused1; + return NULL; + case 244: //upperClouds.rise.red + return &NAM0.value.upperClouds.rise.red; + case 245: //upperClouds.rise.green + return &NAM0.value.upperClouds.rise.green; + case 246: //upperClouds.rise.blue + return &NAM0.value.upperClouds.rise.blue; + case 247: //upperClouds.rise.unused1 + *FieldValues = &NAM0.value.upperClouds.rise.unused1; + return NULL; + case 248: //upperClouds.day.red + return &NAM0.value.upperClouds.day.red; + case 249: //upperClouds.day.green + return &NAM0.value.upperClouds.day.green; + case 250: //upperClouds.day.blue + return &NAM0.value.upperClouds.day.blue; + case 251: //upperClouds.day.unused1 + *FieldValues = &NAM0.value.upperClouds.day.unused1; + return NULL; + case 252: //upperClouds.set.red + return &NAM0.value.upperClouds.set.red; + case 253: //upperClouds.set.green + return &NAM0.value.upperClouds.set.green; + case 254: //upperClouds.set.blue + return &NAM0.value.upperClouds.set.blue; + case 255: //upperClouds.set.unused1 + *FieldValues = &NAM0.value.upperClouds.set.unused1; + return NULL; + case 256: //upperClouds.night.red + return &NAM0.value.upperClouds.night.red; + case 257: //upperClouds.night.green + return &NAM0.value.upperClouds.night.green; + case 258: //upperClouds.night.blue + return &NAM0.value.upperClouds.night.blue; + case 259: //upperClouds.night.unused1 + *FieldValues = &NAM0.value.upperClouds.night.unused1; + return NULL; + case 260: //upperClouds.noon.red + return &NAM0.value.upperClouds.noon.red; + case 261: //upperClouds.noon.green + return &NAM0.value.upperClouds.noon.green; + case 262: //upperClouds.noon.blue + return &NAM0.value.upperClouds.noon.blue; + case 263: //upperClouds.noon.unused1 + *FieldValues = &NAM0.value.upperClouds.noon.unused1; + return NULL; + case 264: //upperClouds.midnight.red + return &NAM0.value.upperClouds.midnight.red; + case 265: //upperClouds.midnight.green + return &NAM0.value.upperClouds.midnight.green; + case 266: //upperClouds.midnight.blue + return &NAM0.value.upperClouds.midnight.blue; + case 267: //upperClouds.midnight.unused1 + *FieldValues = &NAM0.value.upperClouds.midnight.unused1; + return NULL; + case 268: //fogDayNear + return &FNAM.value.fogDayNear; + case 269: //fogDayFar + return &FNAM.value.fogDayFar; + case 270: //fogNightNear + return &FNAM.value.fogNightNear; + case 271: //fogNightFar + return &FNAM.value.fogNightFar; + case 272: //fogDayPower + return &FNAM.value.fogDayPower; + case 273: //fogNightPower + return &FNAM.value.fogNightPower; + case 274: //inam_p + *FieldValues = INAM.value; + return NULL; + case 275: //windSpeed + return &DATA.value.windSpeed; + case 276: //lowerCloudSpeed + return &DATA.value.lowerCloudSpeed; + case 277: //upperCloudSpeed + return &DATA.value.upperCloudSpeed; + case 278: //transDelta + return &DATA.value.transDelta; + case 279: //sunGlare + return &DATA.value.sunGlare; + case 280: //sunDamage + return &DATA.value.sunDamage; + case 281: //rainFadeIn + return &DATA.value.rainFadeIn; + case 282: //rainFadeOut + return &DATA.value.rainFadeOut; + case 283: //boltFadeIn + return &DATA.value.boltFadeIn; + case 284: //boltFadeOut + return &DATA.value.boltFadeOut; + case 285: //boltFrequency + return &DATA.value.boltFrequency; + case 286: //weatherType + return &DATA.value.weatherType; + case 287: //boltRed + return &DATA.value.boltRed; + case 288: //boltGreen + return &DATA.value.boltGreen; + case 289: //boltBlue + return &DATA.value.boltBlue; + case 290: //sounds + if(ListIndex >= Sounds.value.size()) + return NULL; + + switch(ListFieldID) + { + case 1: //sound + return &Sounds.value[ListIndex]->sound; + case 2: //type + return &Sounds.value[ListIndex]->type; + default: + return NULL; + } + return NULL; + default: + return NULL; + } + return NULL; + } + +bool WTHRRecord::SetField(FIELD_IDENTIFIERS, void *FieldValue, UINT32 ArraySize) + { + switch(FieldID) + { + case 1: //flags1 + SetHeaderFlagMask(*(UINT32 *)FieldValue); + break; + case 3: //versionControl1 + if(ArraySize != 4) + break; + ((UINT8ARRAY)&flagsUnk)[0] = ((UINT8ARRAY)FieldValue)[0]; + ((UINT8ARRAY)&flagsUnk)[1] = ((UINT8ARRAY)FieldValue)[1]; + ((UINT8ARRAY)&flagsUnk)[2] = ((UINT8ARRAY)FieldValue)[2]; + ((UINT8ARRAY)&flagsUnk)[3] = ((UINT8ARRAY)FieldValue)[3]; + break; + case 4: //eid + EDID.Copy((STRING)FieldValue); + break; + case 5: //formVersion + formVersion = *(UINT16 *)FieldValue; + break; + case 6: //versionControl2 + if(ArraySize != 2) + break; versionControl2[0] = ((UINT8ARRAY)FieldValue)[0]; versionControl2[1] = ((UINT8ARRAY)FieldValue)[1]; break; - case 7: //0iad Sunrise Image Space Modifier - 0IAD.Load(); - 0IAD->value7 = *(FORMID *)FieldValue; - return true; - case 8: //1iad Day Image Space Modifier - 1IAD.Load(); - 1IAD->value8 = *(FORMID *)FieldValue; - return true; - case 9: //2iad Sunset Image Space Modifier - 2IAD.Load(); - 2IAD->value9 = *(FORMID *)FieldValue; - return true; - case 10: //3iad Night Image Space Modifier - 3IAD.Load(); - 3IAD->value10 = *(FORMID *)FieldValue; - return true; - case 11: //4iad Unknown - 4IAD.Load(); - 4IAD->value11 = *(FORMID *)FieldValue; - return true; - case 12: //5iad Unknown - 5IAD.Load(); - 5IAD->value12 = *(FORMID *)FieldValue; - return true; - case 13: //dnam Cloud Textures - Layer 0 - DNAM.Copy((STRING)FieldValue); + case 7: //sunriseImageSpace + _0IAD.value = *(FORMID *)FieldValue; + return true; + case 8: //dayImageSpace + _1IAD.value = *(FORMID *)FieldValue; + return true; + case 9: //sunsetImageSpace + _2IAD.value = *(FORMID *)FieldValue; + return true; + case 10: //nightImageSpace + _3IAD.value = *(FORMID *)FieldValue; + return true; + case 11: //unknown1ImageSpace + _4IAD.value = *(FORMID *)FieldValue; + return true; + case 12: //unknown2ImageSpace + _5IAD.value = *(FORMID *)FieldValue; + return true; + case 13: //cloudLayer0Path + DNAM.Copy((STRING)FieldValue); + break; + case 14: //cloudLayer1Path + CNAM.Copy((STRING)FieldValue); + break; + case 15: //cloudLayer2Path + ANAM.Copy((STRING)FieldValue); + break; + case 16: //cloudLayer3Path + BNAM.Copy((STRING)FieldValue); + break; + case 17: //modPath + MODL.Load(); + MODL->MODL.Copy((STRING)FieldValue); + break; + case 18: //modb + MODL.Load(); + MODL->MODB.value = *(FLOAT32 *)FieldValue; + break; + case 19: //modt_p + MODL.Load(); + MODL->MODT.Copy((UINT8ARRAY)FieldValue, ArraySize); + break; + case 20: //altTextures + MODL.Load(); + 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 21: //modelFlags + MODL.Load(); + MODL->SetFlagMask(*(UINT8 *)FieldValue); + break; + case 22: //unknown1 + LNAM.value = *(UINT32 *)FieldValue; + break; + case 23: //layer0Speed + ONAM.Load(); + ONAM->layer0Speed = *(UINT8 *)FieldValue; + break; + case 24: //layer1Speed + ONAM.Load(); + ONAM->layer1Speed = *(UINT8 *)FieldValue; + break; + case 25: //layer2Speed + ONAM.Load(); + ONAM->layer2Speed = *(UINT8 *)FieldValue; + break; + case 26: //layer3Speed + ONAM.Load(); + ONAM->layer3Speed = *(UINT8 *)FieldValue; + break; + case 27: //PNAM + PNAM.Copy((UINT8ARRAY)FieldValue, ArraySize); + break; + case 28: //upperSky.rise.red + NAM0.value.upperSky.rise.red = *(UINT8 *)FieldValue; + break; + case 29: //upperSky.rise.green + NAM0.value.upperSky.rise.green = *(UINT8 *)FieldValue; + break; + case 30: //upperSky.rise.blue + NAM0.value.upperSky.rise.blue = *(UINT8 *)FieldValue; + break; + case 31: //upperSky.rise.unused1 + if(ArraySize != 1) + break; + NAM0.value.upperSky.rise.unused1 = ((UINT8ARRAY)FieldValue)[0]; + break; + case 32: //upperSky.day.red + NAM0.value.upperSky.day.red = *(UINT8 *)FieldValue; + break; + case 33: //upperSky.day.green + NAM0.value.upperSky.day.green = *(UINT8 *)FieldValue; + break; + case 34: //upperSky.day.blue + NAM0.value.upperSky.day.blue = *(UINT8 *)FieldValue; + break; + case 35: //upperSky.day.unused1 + if(ArraySize != 1) + break; + NAM0.value.upperSky.day.unused1 = ((UINT8ARRAY)FieldValue)[0]; + break; + case 36: //upperSky.set.red + NAM0.value.upperSky.set.red = *(UINT8 *)FieldValue; + break; + case 37: //upperSky.set.green + NAM0.value.upperSky.set.green = *(UINT8 *)FieldValue; + break; + case 38: //upperSky.set.blue + NAM0.value.upperSky.set.blue = *(UINT8 *)FieldValue; + break; + case 39: //upperSky.set.unused1 + if(ArraySize != 1) + break; + NAM0.value.upperSky.set.unused1 = ((UINT8ARRAY)FieldValue)[0]; + break; + case 40: //upperSky.night.red + NAM0.value.upperSky.night.red = *(UINT8 *)FieldValue; + break; + case 41: //upperSky.night.green + NAM0.value.upperSky.night.green = *(UINT8 *)FieldValue; + break; + case 42: //upperSky.night.blue + NAM0.value.upperSky.night.blue = *(UINT8 *)FieldValue; + break; + case 43: //upperSky.night.unused1 + if(ArraySize != 1) + break; + NAM0.value.upperSky.night.unused1 = ((UINT8ARRAY)FieldValue)[0]; + break; + case 44: //upperSky.noon.red + NAM0.value.upperSky.noon.red = *(UINT8 *)FieldValue; + break; + case 45: //upperSky.noon.green + NAM0.value.upperSky.noon.green = *(UINT8 *)FieldValue; + break; + case 46: //upperSky.noon.blue + NAM0.value.upperSky.noon.blue = *(UINT8 *)FieldValue; + break; + case 47: //upperSky.noon.unused1 + if(ArraySize != 1) + break; + NAM0.value.upperSky.noon.unused1 = ((UINT8ARRAY)FieldValue)[0]; + break; + case 48: //upperSky.midnight.red + NAM0.value.upperSky.midnight.red = *(UINT8 *)FieldValue; + break; + case 49: //upperSky.midnight.green + NAM0.value.upperSky.midnight.green = *(UINT8 *)FieldValue; + break; + case 50: //upperSky.midnight.blue + NAM0.value.upperSky.midnight.blue = *(UINT8 *)FieldValue; + break; + case 51: //upperSky.midnight.unused1 + if(ArraySize != 1) + break; + NAM0.value.upperSky.midnight.unused1 = ((UINT8ARRAY)FieldValue)[0]; + break; + case 52: //fog.rise.red + NAM0.value.fog.rise.red = *(UINT8 *)FieldValue; + break; + case 53: //fog.rise.green + NAM0.value.fog.rise.green = *(UINT8 *)FieldValue; + break; + case 54: //fog.rise.blue + NAM0.value.fog.rise.blue = *(UINT8 *)FieldValue; + break; + case 55: //fog.rise.unused1 + if(ArraySize != 1) + break; + NAM0.value.fog.rise.unused1 = ((UINT8ARRAY)FieldValue)[0]; + break; + case 56: //fog.day.red + NAM0.value.fog.day.red = *(UINT8 *)FieldValue; + break; + case 57: //fog.day.green + NAM0.value.fog.day.green = *(UINT8 *)FieldValue; + break; + case 58: //fog.day.blue + NAM0.value.fog.day.blue = *(UINT8 *)FieldValue; + break; + case 59: //fog.day.unused1 + if(ArraySize != 1) + break; + NAM0.value.fog.day.unused1 = ((UINT8ARRAY)FieldValue)[0]; + break; + case 60: //fog.set.red + NAM0.value.fog.set.red = *(UINT8 *)FieldValue; + break; + case 61: //fog.set.green + NAM0.value.fog.set.green = *(UINT8 *)FieldValue; + break; + case 62: //fog.set.blue + NAM0.value.fog.set.blue = *(UINT8 *)FieldValue; + break; + case 63: //fog.set.unused1 + if(ArraySize != 1) + break; + NAM0.value.fog.set.unused1 = ((UINT8ARRAY)FieldValue)[0]; + break; + case 64: //fog.night.red + NAM0.value.fog.night.red = *(UINT8 *)FieldValue; + break; + case 65: //fog.night.green + NAM0.value.fog.night.green = *(UINT8 *)FieldValue; + break; + case 66: //fog.night.blue + NAM0.value.fog.night.blue = *(UINT8 *)FieldValue; + break; + case 67: //fog.night.unused1 + if(ArraySize != 1) + break; + NAM0.value.fog.night.unused1 = ((UINT8ARRAY)FieldValue)[0]; + break; + case 68: //fog.noon.red + NAM0.value.fog.noon.red = *(UINT8 *)FieldValue; + break; + case 69: //fog.noon.green + NAM0.value.fog.noon.green = *(UINT8 *)FieldValue; + break; + case 70: //fog.noon.blue + NAM0.value.fog.noon.blue = *(UINT8 *)FieldValue; + break; + case 71: //fog.noon.unused1 + if(ArraySize != 1) + break; + NAM0.value.fog.noon.unused1 = ((UINT8ARRAY)FieldValue)[0]; + break; + case 72: //fog.midnight.red + NAM0.value.fog.midnight.red = *(UINT8 *)FieldValue; + break; + case 73: //fog.midnight.green + NAM0.value.fog.midnight.green = *(UINT8 *)FieldValue; + break; + case 74: //fog.midnight.blue + NAM0.value.fog.midnight.blue = *(UINT8 *)FieldValue; + break; + case 75: //fog.midnight.unused1 + if(ArraySize != 1) + break; + NAM0.value.fog.midnight.unused1 = ((UINT8ARRAY)FieldValue)[0]; + break; + case 76: //lowerClouds.rise.red + NAM0.value.lowerClouds.rise.red = *(UINT8 *)FieldValue; + break; + case 77: //lowerClouds.rise.green + NAM0.value.lowerClouds.rise.green = *(UINT8 *)FieldValue; + break; + case 78: //lowerClouds.rise.blue + NAM0.value.lowerClouds.rise.blue = *(UINT8 *)FieldValue; + break; + case 79: //lowerClouds.rise.unused1 + if(ArraySize != 1) + break; + NAM0.value.lowerClouds.rise.unused1 = ((UINT8ARRAY)FieldValue)[0]; + break; + case 80: //lowerClouds.day.red + NAM0.value.lowerClouds.day.red = *(UINT8 *)FieldValue; + break; + case 81: //lowerClouds.day.green + NAM0.value.lowerClouds.day.green = *(UINT8 *)FieldValue; + break; + case 82: //lowerClouds.day.blue + NAM0.value.lowerClouds.day.blue = *(UINT8 *)FieldValue; + break; + case 83: //lowerClouds.day.unused1 + if(ArraySize != 1) + break; + NAM0.value.lowerClouds.day.unused1 = ((UINT8ARRAY)FieldValue)[0]; + break; + case 84: //lowerClouds.set.red + NAM0.value.lowerClouds.set.red = *(UINT8 *)FieldValue; + break; + case 85: //lowerClouds.set.green + NAM0.value.lowerClouds.set.green = *(UINT8 *)FieldValue; + break; + case 86: //lowerClouds.set.blue + NAM0.value.lowerClouds.set.blue = *(UINT8 *)FieldValue; + break; + case 87: //lowerClouds.set.unused1 + if(ArraySize != 1) + break; + NAM0.value.lowerClouds.set.unused1 = ((UINT8ARRAY)FieldValue)[0]; + break; + case 88: //lowerClouds.night.red + NAM0.value.lowerClouds.night.red = *(UINT8 *)FieldValue; + break; + case 89: //lowerClouds.night.green + NAM0.value.lowerClouds.night.green = *(UINT8 *)FieldValue; + break; + case 90: //lowerClouds.night.blue + NAM0.value.lowerClouds.night.blue = *(UINT8 *)FieldValue; + break; + case 91: //lowerClouds.night.unused1 + if(ArraySize != 1) + break; + NAM0.value.lowerClouds.night.unused1 = ((UINT8ARRAY)FieldValue)[0]; + break; + case 92: //lowerClouds.noon.red + NAM0.value.lowerClouds.noon.red = *(UINT8 *)FieldValue; + break; + case 93: //lowerClouds.noon.green + NAM0.value.lowerClouds.noon.green = *(UINT8 *)FieldValue; + break; + case 94: //lowerClouds.noon.blue + NAM0.value.lowerClouds.noon.blue = *(UINT8 *)FieldValue; + break; + case 95: //lowerClouds.noon.unused1 + if(ArraySize != 1) + break; + NAM0.value.lowerClouds.noon.unused1 = ((UINT8ARRAY)FieldValue)[0]; + break; + case 96: //lowerClouds.midnight.red + NAM0.value.lowerClouds.midnight.red = *(UINT8 *)FieldValue; + break; + case 97: //lowerClouds.midnight.green + NAM0.value.lowerClouds.midnight.green = *(UINT8 *)FieldValue; + break; + case 98: //lowerClouds.midnight.blue + NAM0.value.lowerClouds.midnight.blue = *(UINT8 *)FieldValue; + break; + case 99: //lowerClouds.midnight.unused1 + if(ArraySize != 1) + break; + NAM0.value.lowerClouds.midnight.unused1 = ((UINT8ARRAY)FieldValue)[0]; + break; + case 100: //ambient.rise.red + NAM0.value.ambient.rise.red = *(UINT8 *)FieldValue; + break; + case 101: //ambient.rise.green + NAM0.value.ambient.rise.green = *(UINT8 *)FieldValue; + break; + case 102: //ambient.rise.blue + NAM0.value.ambient.rise.blue = *(UINT8 *)FieldValue; + break; + case 103: //ambient.rise.unused1 + if(ArraySize != 1) + break; + NAM0.value.ambient.rise.unused1 = ((UINT8ARRAY)FieldValue)[0]; + break; + case 104: //ambient.day.red + NAM0.value.ambient.day.red = *(UINT8 *)FieldValue; + break; + case 105: //ambient.day.green + NAM0.value.ambient.day.green = *(UINT8 *)FieldValue; + break; + case 106: //ambient.day.blue + NAM0.value.ambient.day.blue = *(UINT8 *)FieldValue; + break; + case 107: //ambient.day.unused1 + if(ArraySize != 1) + break; + NAM0.value.ambient.day.unused1 = ((UINT8ARRAY)FieldValue)[0]; + break; + case 108: //ambient.set.red + NAM0.value.ambient.set.red = *(UINT8 *)FieldValue; + break; + case 109: //ambient.set.green + NAM0.value.ambient.set.green = *(UINT8 *)FieldValue; + break; + case 110: //ambient.set.blue + NAM0.value.ambient.set.blue = *(UINT8 *)FieldValue; + break; + case 111: //ambient.set.unused1 + if(ArraySize != 1) + break; + NAM0.value.ambient.set.unused1 = ((UINT8ARRAY)FieldValue)[0]; + break; + case 112: //ambient.night.red + NAM0.value.ambient.night.red = *(UINT8 *)FieldValue; + break; + case 113: //ambient.night.green + NAM0.value.ambient.night.green = *(UINT8 *)FieldValue; + break; + case 114: //ambient.night.blue + NAM0.value.ambient.night.blue = *(UINT8 *)FieldValue; + break; + case 115: //ambient.night.unused1 + if(ArraySize != 1) + break; + NAM0.value.ambient.night.unused1 = ((UINT8ARRAY)FieldValue)[0]; + break; + case 116: //ambient.noon.red + NAM0.value.ambient.noon.red = *(UINT8 *)FieldValue; + break; + case 117: //ambient.noon.green + NAM0.value.ambient.noon.green = *(UINT8 *)FieldValue; + break; + case 118: //ambient.noon.blue + NAM0.value.ambient.noon.blue = *(UINT8 *)FieldValue; + break; + case 119: //ambient.noon.unused1 + if(ArraySize != 1) + break; + NAM0.value.ambient.noon.unused1 = ((UINT8ARRAY)FieldValue)[0]; + break; + case 120: //ambient.midnight.red + NAM0.value.ambient.midnight.red = *(UINT8 *)FieldValue; + break; + case 121: //ambient.midnight.green + NAM0.value.ambient.midnight.green = *(UINT8 *)FieldValue; + break; + case 122: //ambient.midnight.blue + NAM0.value.ambient.midnight.blue = *(UINT8 *)FieldValue; + break; + case 123: //ambient.midnight.unused1 + if(ArraySize != 1) + break; + NAM0.value.ambient.midnight.unused1 = ((UINT8ARRAY)FieldValue)[0]; + break; + case 124: //sunlight.rise.red + NAM0.value.sunlight.rise.red = *(UINT8 *)FieldValue; + break; + case 125: //sunlight.rise.green + NAM0.value.sunlight.rise.green = *(UINT8 *)FieldValue; + break; + case 126: //sunlight.rise.blue + NAM0.value.sunlight.rise.blue = *(UINT8 *)FieldValue; + break; + case 127: //sunlight.rise.unused1 + if(ArraySize != 1) + break; + NAM0.value.sunlight.rise.unused1 = ((UINT8ARRAY)FieldValue)[0]; + break; + case 128: //sunlight.day.red + NAM0.value.sunlight.day.red = *(UINT8 *)FieldValue; + break; + case 129: //sunlight.day.green + NAM0.value.sunlight.day.green = *(UINT8 *)FieldValue; + break; + case 130: //sunlight.day.blue + NAM0.value.sunlight.day.blue = *(UINT8 *)FieldValue; + break; + case 131: //sunlight.day.unused1 + if(ArraySize != 1) + break; + NAM0.value.sunlight.day.unused1 = ((UINT8ARRAY)FieldValue)[0]; + break; + case 132: //sunlight.set.red + NAM0.value.sunlight.set.red = *(UINT8 *)FieldValue; + break; + case 133: //sunlight.set.green + NAM0.value.sunlight.set.green = *(UINT8 *)FieldValue; + break; + case 134: //sunlight.set.blue + NAM0.value.sunlight.set.blue = *(UINT8 *)FieldValue; + break; + case 135: //sunlight.set.unused1 + if(ArraySize != 1) + break; + NAM0.value.sunlight.set.unused1 = ((UINT8ARRAY)FieldValue)[0]; + break; + case 136: //sunlight.night.red + NAM0.value.sunlight.night.red = *(UINT8 *)FieldValue; + break; + case 137: //sunlight.night.green + NAM0.value.sunlight.night.green = *(UINT8 *)FieldValue; + break; + case 138: //sunlight.night.blue + NAM0.value.sunlight.night.blue = *(UINT8 *)FieldValue; + break; + case 139: //sunlight.night.unused1 + if(ArraySize != 1) + break; + NAM0.value.sunlight.night.unused1 = ((UINT8ARRAY)FieldValue)[0]; + break; + case 140: //sunlight.noon.red + NAM0.value.sunlight.noon.red = *(UINT8 *)FieldValue; + break; + case 141: //sunlight.noon.green + NAM0.value.sunlight.noon.green = *(UINT8 *)FieldValue; + break; + case 142: //sunlight.noon.blue + NAM0.value.sunlight.noon.blue = *(UINT8 *)FieldValue; + break; + case 143: //sunlight.noon.unused1 + if(ArraySize != 1) + break; + NAM0.value.sunlight.noon.unused1 = ((UINT8ARRAY)FieldValue)[0]; + break; + case 144: //sunlight.midnight.red + NAM0.value.sunlight.midnight.red = *(UINT8 *)FieldValue; + break; + case 145: //sunlight.midnight.green + NAM0.value.sunlight.midnight.green = *(UINT8 *)FieldValue; + break; + case 146: //sunlight.midnight.blue + NAM0.value.sunlight.midnight.blue = *(UINT8 *)FieldValue; + break; + case 147: //sunlight.midnight.unused1 + if(ArraySize != 1) + break; + NAM0.value.sunlight.midnight.unused1 = ((UINT8ARRAY)FieldValue)[0]; + break; + case 148: //sun.rise.red + NAM0.value.sun.rise.red = *(UINT8 *)FieldValue; + break; + case 149: //sun.rise.green + NAM0.value.sun.rise.green = *(UINT8 *)FieldValue; + break; + case 150: //sun.rise.blue + NAM0.value.sun.rise.blue = *(UINT8 *)FieldValue; + break; + case 151: //sun.rise.unused1 + if(ArraySize != 1) + break; + NAM0.value.sun.rise.unused1 = ((UINT8ARRAY)FieldValue)[0]; + break; + case 152: //sun.day.red + NAM0.value.sun.day.red = *(UINT8 *)FieldValue; + break; + case 153: //sun.day.green + NAM0.value.sun.day.green = *(UINT8 *)FieldValue; + break; + case 154: //sun.day.blue + NAM0.value.sun.day.blue = *(UINT8 *)FieldValue; + break; + case 155: //sun.day.unused1 + if(ArraySize != 1) + break; + NAM0.value.sun.day.unused1 = ((UINT8ARRAY)FieldValue)[0]; + break; + case 156: //sun.set.red + NAM0.value.sun.set.red = *(UINT8 *)FieldValue; + break; + case 157: //sun.set.green + NAM0.value.sun.set.green = *(UINT8 *)FieldValue; + break; + case 158: //sun.set.blue + NAM0.value.sun.set.blue = *(UINT8 *)FieldValue; + break; + case 159: //sun.set.unused1 + if(ArraySize != 1) + break; + NAM0.value.sun.set.unused1 = ((UINT8ARRAY)FieldValue)[0]; + break; + case 160: //sun.night.red + NAM0.value.sun.night.red = *(UINT8 *)FieldValue; + break; + case 161: //sun.night.green + NAM0.value.sun.night.green = *(UINT8 *)FieldValue; + break; + case 162: //sun.night.blue + NAM0.value.sun.night.blue = *(UINT8 *)FieldValue; + break; + case 163: //sun.night.unused1 + if(ArraySize != 1) + break; + NAM0.value.sun.night.unused1 = ((UINT8ARRAY)FieldValue)[0]; + break; + case 164: //sun.noon.red + NAM0.value.sun.noon.red = *(UINT8 *)FieldValue; + break; + case 165: //sun.noon.green + NAM0.value.sun.noon.green = *(UINT8 *)FieldValue; + break; + case 166: //sun.noon.blue + NAM0.value.sun.noon.blue = *(UINT8 *)FieldValue; + break; + case 167: //sun.noon.unused1 + if(ArraySize != 1) + break; + NAM0.value.sun.noon.unused1 = ((UINT8ARRAY)FieldValue)[0]; + break; + case 168: //sun.midnight.red + NAM0.value.sun.midnight.red = *(UINT8 *)FieldValue; break; - case 14: //cnam Cloud Textures - Layer 1 - CNAM.Copy((STRING)FieldValue); + case 169: //sun.midnight.green + NAM0.value.sun.midnight.green = *(UINT8 *)FieldValue; break; - case 15: //anam Cloud Textures - Layer 2 - ANAM.Copy((STRING)FieldValue); + case 170: //sun.midnight.blue + NAM0.value.sun.midnight.blue = *(UINT8 *)FieldValue; break; - case 16: //bnam Cloud Textures - Layer 3 - BNAM.Copy((STRING)FieldValue); + case 171: //sun.midnight.unused1 + if(ArraySize != 1) + break; + NAM0.value.sun.midnight.unused1 = ((UINT8ARRAY)FieldValue)[0]; break; - case 17: //modPath - MODL.Load(); - MODL->MODL.Copy((STRING)FieldValue); + case 172: //stars.rise.red + NAM0.value.stars.rise.red = *(UINT8 *)FieldValue; break; - case 18: //modb - MODL.Load(); - MODL->MODB.value = *(FLOAT32 *)FieldValue; + case 173: //stars.rise.green + NAM0.value.stars.rise.green = *(UINT8 *)FieldValue; break; - case 19: //modt_p - MODL.Load(); - MODL->MODT.Copy((UINT8ARRAY)FieldValue, ArraySize); + case 174: //stars.rise.blue + NAM0.value.stars.rise.blue = *(UINT8 *)FieldValue; break; - case 20: //mods Alternate Textures - MODL.Load(); - MODL->MODS.Copy((STRING)FieldValue); + case 175: //stars.rise.unused1 + if(ArraySize != 1) + break; + NAM0.value.stars.rise.unused1 = ((UINT8ARRAY)FieldValue)[0]; break; - case 21: //mods Alternate Textures - MODL.Load(); - MODL->MODS.Load(); - MODL->MODS->value21 = *(FORMID *)FieldValue; - return true; - case 22: //mods Alternate Textures - MODL.Load(); - MODL->MODS.Load(); - MODL->MODS->value22 = *(SINT32 *)FieldValue; + case 176: //stars.day.red + NAM0.value.stars.day.red = *(UINT8 *)FieldValue; break; - case 23: //modelFlags - MODL.Load(); - MODL->MODD.Load(); - MODL->MODD->value23 = *(UINT8 *)FieldValue; + case 177: //stars.day.green + NAM0.value.stars.day.green = *(UINT8 *)FieldValue; break; - case 24: //lnam_p Unknown - if(ArraySize != 4) + case 178: //stars.day.blue + NAM0.value.stars.day.blue = *(UINT8 *)FieldValue; + break; + case 179: //stars.day.unused1 + if(ArraySize != 1) break; - LNAM.Load(); - LNAM->value24[0] = ((UINT8ARRAY)FieldValue)[0]; - LNAM->value24[1] = ((UINT8ARRAY)FieldValue)[1]; - LNAM->value24[2] = ((UINT8ARRAY)FieldValue)[2]; - LNAM->value24[3] = ((UINT8ARRAY)FieldValue)[3]; + NAM0.value.stars.day.unused1 = ((UINT8ARRAY)FieldValue)[0]; break; - case 25: //onam Cloud Speed - return UNPARSEDGET_FIELD25; - case 26: //pnam_p Unused - PNAM.Copy((UINT8ARRAY)FieldValue, ArraySize); + case 180: //stars.set.red + NAM0.value.stars.set.red = *(UINT8 *)FieldValue; + break; + case 181: //stars.set.green + NAM0.value.stars.set.green = *(UINT8 *)FieldValue; + break; + case 182: //stars.set.blue + NAM0.value.stars.set.blue = *(UINT8 *)FieldValue; + break; + case 183: //stars.set.unused1 + if(ArraySize != 1) + break; + NAM0.value.stars.set.unused1 = ((UINT8ARRAY)FieldValue)[0]; break; - case 27: //nam0 NAM0 ,, Struct - NAM0.Load(); - NAM0->value27 = *(UINT8 *)FieldValue; + case 184: //stars.night.red + NAM0.value.stars.night.red = *(UINT8 *)FieldValue; break; - case 28: //nam0 NAM0 ,, Struct - NAM0.Load(); - NAM0->value28 = *(UINT8 *)FieldValue; + case 185: //stars.night.green + NAM0.value.stars.night.green = *(UINT8 *)FieldValue; break; - case 29: //nam0 NAM0 ,, Struct - NAM0.Load(); - NAM0->value29 = *(UINT8 *)FieldValue; + case 186: //stars.night.blue + NAM0.value.stars.night.blue = *(UINT8 *)FieldValue; break; - case 30: //nam0_p NAM0 ,, Struct + case 187: //stars.night.unused1 if(ArraySize != 1) break; - NAM0.Load(); - NAM0->value30[0] = ((UINT8ARRAY)FieldValue)[0]; - break; - case 31: //fnam FNAM ,, Struct - FNAM.Load(); - FNAM->value31 = *(FLOAT32 *)FieldValue; - break; - case 32: //fnam FNAM ,, Struct - FNAM.Load(); - FNAM->value32 = *(FLOAT32 *)FieldValue; - break; - case 33: //fnam FNAM ,, Struct - FNAM.Load(); - FNAM->value33 = *(FLOAT32 *)FieldValue; - break; - case 34: //fnam FNAM ,, Struct - FNAM.Load(); - FNAM->value34 = *(FLOAT32 *)FieldValue; - break; - case 35: //fnam FNAM ,, Struct - FNAM.Load(); - FNAM->value35 = *(FLOAT32 *)FieldValue; - break; - case 36: //fnam FNAM ,, Struct - FNAM.Load(); - FNAM->value36 = *(FLOAT32 *)FieldValue; - break; - case 37: //inam_p Unused - if(ArraySize != 304) - break; - INAM.Load(); - INAM->value37[0] = ((UINT8ARRAY)FieldValue)[0]; - INAM->value37[1] = ((UINT8ARRAY)FieldValue)[1]; - INAM->value37[2] = ((UINT8ARRAY)FieldValue)[2]; - INAM->value37[3] = ((UINT8ARRAY)FieldValue)[3]; - INAM->value37[4] = ((UINT8ARRAY)FieldValue)[4]; - INAM->value37[5] = ((UINT8ARRAY)FieldValue)[5]; - INAM->value37[6] = ((UINT8ARRAY)FieldValue)[6]; - INAM->value37[7] = ((UINT8ARRAY)FieldValue)[7]; - INAM->value37[8] = ((UINT8ARRAY)FieldValue)[8]; - INAM->value37[9] = ((UINT8ARRAY)FieldValue)[9]; - INAM->value37[10] = ((UINT8ARRAY)FieldValue)[10]; - INAM->value37[11] = ((UINT8ARRAY)FieldValue)[11]; - INAM->value37[12] = ((UINT8ARRAY)FieldValue)[12]; - INAM->value37[13] = ((UINT8ARRAY)FieldValue)[13]; - INAM->value37[14] = ((UINT8ARRAY)FieldValue)[14]; - INAM->value37[15] = ((UINT8ARRAY)FieldValue)[15]; - INAM->value37[16] = ((UINT8ARRAY)FieldValue)[16]; - INAM->value37[17] = ((UINT8ARRAY)FieldValue)[17]; - INAM->value37[18] = ((UINT8ARRAY)FieldValue)[18]; - INAM->value37[19] = ((UINT8ARRAY)FieldValue)[19]; - INAM->value37[20] = ((UINT8ARRAY)FieldValue)[20]; - INAM->value37[21] = ((UINT8ARRAY)FieldValue)[21]; - INAM->value37[22] = ((UINT8ARRAY)FieldValue)[22]; - INAM->value37[23] = ((UINT8ARRAY)FieldValue)[23]; - INAM->value37[24] = ((UINT8ARRAY)FieldValue)[24]; - INAM->value37[25] = ((UINT8ARRAY)FieldValue)[25]; - INAM->value37[26] = ((UINT8ARRAY)FieldValue)[26]; - INAM->value37[27] = ((UINT8ARRAY)FieldValue)[27]; - INAM->value37[28] = ((UINT8ARRAY)FieldValue)[28]; - INAM->value37[29] = ((UINT8ARRAY)FieldValue)[29]; - INAM->value37[30] = ((UINT8ARRAY)FieldValue)[30]; - INAM->value37[31] = ((UINT8ARRAY)FieldValue)[31]; - INAM->value37[32] = ((UINT8ARRAY)FieldValue)[32]; - INAM->value37[33] = ((UINT8ARRAY)FieldValue)[33]; - INAM->value37[34] = ((UINT8ARRAY)FieldValue)[34]; - INAM->value37[35] = ((UINT8ARRAY)FieldValue)[35]; - INAM->value37[36] = ((UINT8ARRAY)FieldValue)[36]; - INAM->value37[37] = ((UINT8ARRAY)FieldValue)[37]; - INAM->value37[38] = ((UINT8ARRAY)FieldValue)[38]; - INAM->value37[39] = ((UINT8ARRAY)FieldValue)[39]; - INAM->value37[40] = ((UINT8ARRAY)FieldValue)[40]; - INAM->value37[41] = ((UINT8ARRAY)FieldValue)[41]; - INAM->value37[42] = ((UINT8ARRAY)FieldValue)[42]; - INAM->value37[43] = ((UINT8ARRAY)FieldValue)[43]; - INAM->value37[44] = ((UINT8ARRAY)FieldValue)[44]; - INAM->value37[45] = ((UINT8ARRAY)FieldValue)[45]; - INAM->value37[46] = ((UINT8ARRAY)FieldValue)[46]; - INAM->value37[47] = ((UINT8ARRAY)FieldValue)[47]; - INAM->value37[48] = ((UINT8ARRAY)FieldValue)[48]; - INAM->value37[49] = ((UINT8ARRAY)FieldValue)[49]; - INAM->value37[50] = ((UINT8ARRAY)FieldValue)[50]; - INAM->value37[51] = ((UINT8ARRAY)FieldValue)[51]; - INAM->value37[52] = ((UINT8ARRAY)FieldValue)[52]; - INAM->value37[53] = ((UINT8ARRAY)FieldValue)[53]; - INAM->value37[54] = ((UINT8ARRAY)FieldValue)[54]; - INAM->value37[55] = ((UINT8ARRAY)FieldValue)[55]; - INAM->value37[56] = ((UINT8ARRAY)FieldValue)[56]; - INAM->value37[57] = ((UINT8ARRAY)FieldValue)[57]; - INAM->value37[58] = ((UINT8ARRAY)FieldValue)[58]; - INAM->value37[59] = ((UINT8ARRAY)FieldValue)[59]; - INAM->value37[60] = ((UINT8ARRAY)FieldValue)[60]; - INAM->value37[61] = ((UINT8ARRAY)FieldValue)[61]; - INAM->value37[62] = ((UINT8ARRAY)FieldValue)[62]; - INAM->value37[63] = ((UINT8ARRAY)FieldValue)[63]; - INAM->value37[64] = ((UINT8ARRAY)FieldValue)[64]; - INAM->value37[65] = ((UINT8ARRAY)FieldValue)[65]; - INAM->value37[66] = ((UINT8ARRAY)FieldValue)[66]; - INAM->value37[67] = ((UINT8ARRAY)FieldValue)[67]; - INAM->value37[68] = ((UINT8ARRAY)FieldValue)[68]; - INAM->value37[69] = ((UINT8ARRAY)FieldValue)[69]; - INAM->value37[70] = ((UINT8ARRAY)FieldValue)[70]; - INAM->value37[71] = ((UINT8ARRAY)FieldValue)[71]; - INAM->value37[72] = ((UINT8ARRAY)FieldValue)[72]; - INAM->value37[73] = ((UINT8ARRAY)FieldValue)[73]; - INAM->value37[74] = ((UINT8ARRAY)FieldValue)[74]; - INAM->value37[75] = ((UINT8ARRAY)FieldValue)[75]; - INAM->value37[76] = ((UINT8ARRAY)FieldValue)[76]; - INAM->value37[77] = ((UINT8ARRAY)FieldValue)[77]; - INAM->value37[78] = ((UINT8ARRAY)FieldValue)[78]; - INAM->value37[79] = ((UINT8ARRAY)FieldValue)[79]; - INAM->value37[80] = ((UINT8ARRAY)FieldValue)[80]; - INAM->value37[81] = ((UINT8ARRAY)FieldValue)[81]; - INAM->value37[82] = ((UINT8ARRAY)FieldValue)[82]; - INAM->value37[83] = ((UINT8ARRAY)FieldValue)[83]; - INAM->value37[84] = ((UINT8ARRAY)FieldValue)[84]; - INAM->value37[85] = ((UINT8ARRAY)FieldValue)[85]; - INAM->value37[86] = ((UINT8ARRAY)FieldValue)[86]; - INAM->value37[87] = ((UINT8ARRAY)FieldValue)[87]; - INAM->value37[88] = ((UINT8ARRAY)FieldValue)[88]; - INAM->value37[89] = ((UINT8ARRAY)FieldValue)[89]; - INAM->value37[90] = ((UINT8ARRAY)FieldValue)[90]; - INAM->value37[91] = ((UINT8ARRAY)FieldValue)[91]; - INAM->value37[92] = ((UINT8ARRAY)FieldValue)[92]; - INAM->value37[93] = ((UINT8ARRAY)FieldValue)[93]; - INAM->value37[94] = ((UINT8ARRAY)FieldValue)[94]; - INAM->value37[95] = ((UINT8ARRAY)FieldValue)[95]; - INAM->value37[96] = ((UINT8ARRAY)FieldValue)[96]; - INAM->value37[97] = ((UINT8ARRAY)FieldValue)[97]; - INAM->value37[98] = ((UINT8ARRAY)FieldValue)[98]; - INAM->value37[99] = ((UINT8ARRAY)FieldValue)[99]; - INAM->value37[100] = ((UINT8ARRAY)FieldValue)[100]; - INAM->value37[101] = ((UINT8ARRAY)FieldValue)[101]; - INAM->value37[102] = ((UINT8ARRAY)FieldValue)[102]; - INAM->value37[103] = ((UINT8ARRAY)FieldValue)[103]; - INAM->value37[104] = ((UINT8ARRAY)FieldValue)[104]; - INAM->value37[105] = ((UINT8ARRAY)FieldValue)[105]; - INAM->value37[106] = ((UINT8ARRAY)FieldValue)[106]; - INAM->value37[107] = ((UINT8ARRAY)FieldValue)[107]; - INAM->value37[108] = ((UINT8ARRAY)FieldValue)[108]; - INAM->value37[109] = ((UINT8ARRAY)FieldValue)[109]; - INAM->value37[110] = ((UINT8ARRAY)FieldValue)[110]; - INAM->value37[111] = ((UINT8ARRAY)FieldValue)[111]; - INAM->value37[112] = ((UINT8ARRAY)FieldValue)[112]; - INAM->value37[113] = ((UINT8ARRAY)FieldValue)[113]; - INAM->value37[114] = ((UINT8ARRAY)FieldValue)[114]; - INAM->value37[115] = ((UINT8ARRAY)FieldValue)[115]; - INAM->value37[116] = ((UINT8ARRAY)FieldValue)[116]; - INAM->value37[117] = ((UINT8ARRAY)FieldValue)[117]; - INAM->value37[118] = ((UINT8ARRAY)FieldValue)[118]; - INAM->value37[119] = ((UINT8ARRAY)FieldValue)[119]; - INAM->value37[120] = ((UINT8ARRAY)FieldValue)[120]; - INAM->value37[121] = ((UINT8ARRAY)FieldValue)[121]; - INAM->value37[122] = ((UINT8ARRAY)FieldValue)[122]; - INAM->value37[123] = ((UINT8ARRAY)FieldValue)[123]; - INAM->value37[124] = ((UINT8ARRAY)FieldValue)[124]; - INAM->value37[125] = ((UINT8ARRAY)FieldValue)[125]; - INAM->value37[126] = ((UINT8ARRAY)FieldValue)[126]; - INAM->value37[127] = ((UINT8ARRAY)FieldValue)[127]; - INAM->value37[128] = ((UINT8ARRAY)FieldValue)[128]; - INAM->value37[129] = ((UINT8ARRAY)FieldValue)[129]; - INAM->value37[130] = ((UINT8ARRAY)FieldValue)[130]; - INAM->value37[131] = ((UINT8ARRAY)FieldValue)[131]; - INAM->value37[132] = ((UINT8ARRAY)FieldValue)[132]; - INAM->value37[133] = ((UINT8ARRAY)FieldValue)[133]; - INAM->value37[134] = ((UINT8ARRAY)FieldValue)[134]; - INAM->value37[135] = ((UINT8ARRAY)FieldValue)[135]; - INAM->value37[136] = ((UINT8ARRAY)FieldValue)[136]; - INAM->value37[137] = ((UINT8ARRAY)FieldValue)[137]; - INAM->value37[138] = ((UINT8ARRAY)FieldValue)[138]; - INAM->value37[139] = ((UINT8ARRAY)FieldValue)[139]; - INAM->value37[140] = ((UINT8ARRAY)FieldValue)[140]; - INAM->value37[141] = ((UINT8ARRAY)FieldValue)[141]; - INAM->value37[142] = ((UINT8ARRAY)FieldValue)[142]; - INAM->value37[143] = ((UINT8ARRAY)FieldValue)[143]; - INAM->value37[144] = ((UINT8ARRAY)FieldValue)[144]; - INAM->value37[145] = ((UINT8ARRAY)FieldValue)[145]; - INAM->value37[146] = ((UINT8ARRAY)FieldValue)[146]; - INAM->value37[147] = ((UINT8ARRAY)FieldValue)[147]; - INAM->value37[148] = ((UINT8ARRAY)FieldValue)[148]; - INAM->value37[149] = ((UINT8ARRAY)FieldValue)[149]; - INAM->value37[150] = ((UINT8ARRAY)FieldValue)[150]; - INAM->value37[151] = ((UINT8ARRAY)FieldValue)[151]; - INAM->value37[152] = ((UINT8ARRAY)FieldValue)[152]; - INAM->value37[153] = ((UINT8ARRAY)FieldValue)[153]; - INAM->value37[154] = ((UINT8ARRAY)FieldValue)[154]; - INAM->value37[155] = ((UINT8ARRAY)FieldValue)[155]; - INAM->value37[156] = ((UINT8ARRAY)FieldValue)[156]; - INAM->value37[157] = ((UINT8ARRAY)FieldValue)[157]; - INAM->value37[158] = ((UINT8ARRAY)FieldValue)[158]; - INAM->value37[159] = ((UINT8ARRAY)FieldValue)[159]; - INAM->value37[160] = ((UINT8ARRAY)FieldValue)[160]; - INAM->value37[161] = ((UINT8ARRAY)FieldValue)[161]; - INAM->value37[162] = ((UINT8ARRAY)FieldValue)[162]; - INAM->value37[163] = ((UINT8ARRAY)FieldValue)[163]; - INAM->value37[164] = ((UINT8ARRAY)FieldValue)[164]; - INAM->value37[165] = ((UINT8ARRAY)FieldValue)[165]; - INAM->value37[166] = ((UINT8ARRAY)FieldValue)[166]; - INAM->value37[167] = ((UINT8ARRAY)FieldValue)[167]; - INAM->value37[168] = ((UINT8ARRAY)FieldValue)[168]; - INAM->value37[169] = ((UINT8ARRAY)FieldValue)[169]; - INAM->value37[170] = ((UINT8ARRAY)FieldValue)[170]; - INAM->value37[171] = ((UINT8ARRAY)FieldValue)[171]; - INAM->value37[172] = ((UINT8ARRAY)FieldValue)[172]; - INAM->value37[173] = ((UINT8ARRAY)FieldValue)[173]; - INAM->value37[174] = ((UINT8ARRAY)FieldValue)[174]; - INAM->value37[175] = ((UINT8ARRAY)FieldValue)[175]; - INAM->value37[176] = ((UINT8ARRAY)FieldValue)[176]; - INAM->value37[177] = ((UINT8ARRAY)FieldValue)[177]; - INAM->value37[178] = ((UINT8ARRAY)FieldValue)[178]; - INAM->value37[179] = ((UINT8ARRAY)FieldValue)[179]; - INAM->value37[180] = ((UINT8ARRAY)FieldValue)[180]; - INAM->value37[181] = ((UINT8ARRAY)FieldValue)[181]; - INAM->value37[182] = ((UINT8ARRAY)FieldValue)[182]; - INAM->value37[183] = ((UINT8ARRAY)FieldValue)[183]; - INAM->value37[184] = ((UINT8ARRAY)FieldValue)[184]; - INAM->value37[185] = ((UINT8ARRAY)FieldValue)[185]; - INAM->value37[186] = ((UINT8ARRAY)FieldValue)[186]; - INAM->value37[187] = ((UINT8ARRAY)FieldValue)[187]; - INAM->value37[188] = ((UINT8ARRAY)FieldValue)[188]; - INAM->value37[189] = ((UINT8ARRAY)FieldValue)[189]; - INAM->value37[190] = ((UINT8ARRAY)FieldValue)[190]; - INAM->value37[191] = ((UINT8ARRAY)FieldValue)[191]; - INAM->value37[192] = ((UINT8ARRAY)FieldValue)[192]; - INAM->value37[193] = ((UINT8ARRAY)FieldValue)[193]; - INAM->value37[194] = ((UINT8ARRAY)FieldValue)[194]; - INAM->value37[195] = ((UINT8ARRAY)FieldValue)[195]; - INAM->value37[196] = ((UINT8ARRAY)FieldValue)[196]; - INAM->value37[197] = ((UINT8ARRAY)FieldValue)[197]; - INAM->value37[198] = ((UINT8ARRAY)FieldValue)[198]; - INAM->value37[199] = ((UINT8ARRAY)FieldValue)[199]; - INAM->value37[200] = ((UINT8ARRAY)FieldValue)[200]; - INAM->value37[201] = ((UINT8ARRAY)FieldValue)[201]; - INAM->value37[202] = ((UINT8ARRAY)FieldValue)[202]; - INAM->value37[203] = ((UINT8ARRAY)FieldValue)[203]; - INAM->value37[204] = ((UINT8ARRAY)FieldValue)[204]; - INAM->value37[205] = ((UINT8ARRAY)FieldValue)[205]; - INAM->value37[206] = ((UINT8ARRAY)FieldValue)[206]; - INAM->value37[207] = ((UINT8ARRAY)FieldValue)[207]; - INAM->value37[208] = ((UINT8ARRAY)FieldValue)[208]; - INAM->value37[209] = ((UINT8ARRAY)FieldValue)[209]; - INAM->value37[210] = ((UINT8ARRAY)FieldValue)[210]; - INAM->value37[211] = ((UINT8ARRAY)FieldValue)[211]; - INAM->value37[212] = ((UINT8ARRAY)FieldValue)[212]; - INAM->value37[213] = ((UINT8ARRAY)FieldValue)[213]; - INAM->value37[214] = ((UINT8ARRAY)FieldValue)[214]; - INAM->value37[215] = ((UINT8ARRAY)FieldValue)[215]; - INAM->value37[216] = ((UINT8ARRAY)FieldValue)[216]; - INAM->value37[217] = ((UINT8ARRAY)FieldValue)[217]; - INAM->value37[218] = ((UINT8ARRAY)FieldValue)[218]; - INAM->value37[219] = ((UINT8ARRAY)FieldValue)[219]; - INAM->value37[220] = ((UINT8ARRAY)FieldValue)[220]; - INAM->value37[221] = ((UINT8ARRAY)FieldValue)[221]; - INAM->value37[222] = ((UINT8ARRAY)FieldValue)[222]; - INAM->value37[223] = ((UINT8ARRAY)FieldValue)[223]; - INAM->value37[224] = ((UINT8ARRAY)FieldValue)[224]; - INAM->value37[225] = ((UINT8ARRAY)FieldValue)[225]; - INAM->value37[226] = ((UINT8ARRAY)FieldValue)[226]; - INAM->value37[227] = ((UINT8ARRAY)FieldValue)[227]; - INAM->value37[228] = ((UINT8ARRAY)FieldValue)[228]; - INAM->value37[229] = ((UINT8ARRAY)FieldValue)[229]; - INAM->value37[230] = ((UINT8ARRAY)FieldValue)[230]; - INAM->value37[231] = ((UINT8ARRAY)FieldValue)[231]; - INAM->value37[232] = ((UINT8ARRAY)FieldValue)[232]; - INAM->value37[233] = ((UINT8ARRAY)FieldValue)[233]; - INAM->value37[234] = ((UINT8ARRAY)FieldValue)[234]; - INAM->value37[235] = ((UINT8ARRAY)FieldValue)[235]; - INAM->value37[236] = ((UINT8ARRAY)FieldValue)[236]; - INAM->value37[237] = ((UINT8ARRAY)FieldValue)[237]; - INAM->value37[238] = ((UINT8ARRAY)FieldValue)[238]; - INAM->value37[239] = ((UINT8ARRAY)FieldValue)[239]; - INAM->value37[240] = ((UINT8ARRAY)FieldValue)[240]; - INAM->value37[241] = ((UINT8ARRAY)FieldValue)[241]; - INAM->value37[242] = ((UINT8ARRAY)FieldValue)[242]; - INAM->value37[243] = ((UINT8ARRAY)FieldValue)[243]; - INAM->value37[244] = ((UINT8ARRAY)FieldValue)[244]; - INAM->value37[245] = ((UINT8ARRAY)FieldValue)[245]; - INAM->value37[246] = ((UINT8ARRAY)FieldValue)[246]; - INAM->value37[247] = ((UINT8ARRAY)FieldValue)[247]; - INAM->value37[248] = ((UINT8ARRAY)FieldValue)[248]; - INAM->value37[249] = ((UINT8ARRAY)FieldValue)[249]; - INAM->value37[250] = ((UINT8ARRAY)FieldValue)[250]; - INAM->value37[251] = ((UINT8ARRAY)FieldValue)[251]; - INAM->value37[252] = ((UINT8ARRAY)FieldValue)[252]; - INAM->value37[253] = ((UINT8ARRAY)FieldValue)[253]; - INAM->value37[254] = ((UINT8ARRAY)FieldValue)[254]; - INAM->value37[255] = ((UINT8ARRAY)FieldValue)[255]; - INAM->value37[256] = ((UINT8ARRAY)FieldValue)[256]; - INAM->value37[257] = ((UINT8ARRAY)FieldValue)[257]; - INAM->value37[258] = ((UINT8ARRAY)FieldValue)[258]; - INAM->value37[259] = ((UINT8ARRAY)FieldValue)[259]; - INAM->value37[260] = ((UINT8ARRAY)FieldValue)[260]; - INAM->value37[261] = ((UINT8ARRAY)FieldValue)[261]; - INAM->value37[262] = ((UINT8ARRAY)FieldValue)[262]; - INAM->value37[263] = ((UINT8ARRAY)FieldValue)[263]; - INAM->value37[264] = ((UINT8ARRAY)FieldValue)[264]; - INAM->value37[265] = ((UINT8ARRAY)FieldValue)[265]; - INAM->value37[266] = ((UINT8ARRAY)FieldValue)[266]; - INAM->value37[267] = ((UINT8ARRAY)FieldValue)[267]; - INAM->value37[268] = ((UINT8ARRAY)FieldValue)[268]; - INAM->value37[269] = ((UINT8ARRAY)FieldValue)[269]; - INAM->value37[270] = ((UINT8ARRAY)FieldValue)[270]; - INAM->value37[271] = ((UINT8ARRAY)FieldValue)[271]; - INAM->value37[272] = ((UINT8ARRAY)FieldValue)[272]; - INAM->value37[273] = ((UINT8ARRAY)FieldValue)[273]; - INAM->value37[274] = ((UINT8ARRAY)FieldValue)[274]; - INAM->value37[275] = ((UINT8ARRAY)FieldValue)[275]; - INAM->value37[276] = ((UINT8ARRAY)FieldValue)[276]; - INAM->value37[277] = ((UINT8ARRAY)FieldValue)[277]; - INAM->value37[278] = ((UINT8ARRAY)FieldValue)[278]; - INAM->value37[279] = ((UINT8ARRAY)FieldValue)[279]; - INAM->value37[280] = ((UINT8ARRAY)FieldValue)[280]; - INAM->value37[281] = ((UINT8ARRAY)FieldValue)[281]; - INAM->value37[282] = ((UINT8ARRAY)FieldValue)[282]; - INAM->value37[283] = ((UINT8ARRAY)FieldValue)[283]; - INAM->value37[284] = ((UINT8ARRAY)FieldValue)[284]; - INAM->value37[285] = ((UINT8ARRAY)FieldValue)[285]; - INAM->value37[286] = ((UINT8ARRAY)FieldValue)[286]; - INAM->value37[287] = ((UINT8ARRAY)FieldValue)[287]; - INAM->value37[288] = ((UINT8ARRAY)FieldValue)[288]; - INAM->value37[289] = ((UINT8ARRAY)FieldValue)[289]; - INAM->value37[290] = ((UINT8ARRAY)FieldValue)[290]; - INAM->value37[291] = ((UINT8ARRAY)FieldValue)[291]; - INAM->value37[292] = ((UINT8ARRAY)FieldValue)[292]; - INAM->value37[293] = ((UINT8ARRAY)FieldValue)[293]; - INAM->value37[294] = ((UINT8ARRAY)FieldValue)[294]; - INAM->value37[295] = ((UINT8ARRAY)FieldValue)[295]; - INAM->value37[296] = ((UINT8ARRAY)FieldValue)[296]; - INAM->value37[297] = ((UINT8ARRAY)FieldValue)[297]; - INAM->value37[298] = ((UINT8ARRAY)FieldValue)[298]; - INAM->value37[299] = ((UINT8ARRAY)FieldValue)[299]; - INAM->value37[300] = ((UINT8ARRAY)FieldValue)[300]; - INAM->value37[301] = ((UINT8ARRAY)FieldValue)[301]; - INAM->value37[302] = ((UINT8ARRAY)FieldValue)[302]; - INAM->value37[303] = ((UINT8ARRAY)FieldValue)[303]; - break; - case 38: //data DATA ,, Struct - DATA.Load(); - DATA->value38 = *(UINT8 *)FieldValue; - break; - case 39: //data DATA ,, Struct - DATA.Load(); - DATA->value39 = *(UINT8 *)FieldValue; - break; - case 40: //data DATA ,, Struct - DATA.Load(); - DATA->value40 = *(UINT8 *)FieldValue; - break; - case 41: //data DATA ,, Struct - DATA.Load(); - DATA->value41 = *(UINT8 *)FieldValue; - break; - case 42: //data DATA ,, Struct - DATA.Load(); - DATA->value42 = *(UINT8 *)FieldValue; - break; - case 43: //data DATA ,, Struct - DATA.Load(); - DATA->value43 = *(UINT8 *)FieldValue; - break; - case 44: //data DATA ,, Struct - DATA.Load(); - DATA->value44 = *(UINT8 *)FieldValue; - break; - case 45: //data DATA ,, Struct - DATA.Load(); - DATA->value45 = *(UINT8 *)FieldValue; - break; - case 46: //data DATA ,, Struct - DATA.Load(); - DATA->value46 = *(UINT8 *)FieldValue; - break; - case 47: //data DATA ,, Struct - DATA.Load(); - DATA->value47 = *(UINT8 *)FieldValue; - break; - case 48: //data DATA ,, Struct - DATA.Load(); - DATA->value48 = *(UINT8 *)FieldValue; - break; - case 49: //data DATA ,, Struct - DATA.Load(); - DATA->value49 = *(UINT8 *)FieldValue; - break; - case 50: //data DATA ,, Struct - DATA.Load(); - DATA->value50 = *(UINT8 *)FieldValue; - break; - case 51: //data DATA ,, Struct - DATA.Load(); - DATA->value51 = *(UINT8 *)FieldValue; - break; - case 52: //data DATA ,, Struct - DATA.Load(); - DATA->value52 = *(UINT8 *)FieldValue; - break; - case 53: //snam SNAM ,, Struct - SNAM.Load(); - SNAM->value53 = *(FORMID *)FieldValue; - return true; - case 54: //snam SNAM ,, Struct - SNAM.Load(); - SNAM->value54 = *(UINT32 *)FieldValue; + NAM0.value.stars.night.unused1 = ((UINT8ARRAY)FieldValue)[0]; + break; + case 188: //stars.noon.red + NAM0.value.stars.noon.red = *(UINT8 *)FieldValue; + break; + case 189: //stars.noon.green + NAM0.value.stars.noon.green = *(UINT8 *)FieldValue; + break; + case 190: //stars.noon.blue + NAM0.value.stars.noon.blue = *(UINT8 *)FieldValue; + break; + case 191: //stars.noon.unused1 + if(ArraySize != 1) + break; + NAM0.value.stars.noon.unused1 = ((UINT8ARRAY)FieldValue)[0]; + break; + case 192: //stars.midnight.red + NAM0.value.stars.midnight.red = *(UINT8 *)FieldValue; + break; + case 193: //stars.midnight.green + NAM0.value.stars.midnight.green = *(UINT8 *)FieldValue; + break; + case 194: //stars.midnight.blue + NAM0.value.stars.midnight.blue = *(UINT8 *)FieldValue; + break; + case 195: //stars.midnight.unused1 + if(ArraySize != 1) + break; + NAM0.value.stars.midnight.unused1 = ((UINT8ARRAY)FieldValue)[0]; + break; + case 196: //lowerSky.rise.red + NAM0.value.lowerSky.rise.red = *(UINT8 *)FieldValue; + break; + case 197: //lowerSky.rise.green + NAM0.value.lowerSky.rise.green = *(UINT8 *)FieldValue; + break; + case 198: //lowerSky.rise.blue + NAM0.value.lowerSky.rise.blue = *(UINT8 *)FieldValue; + break; + case 199: //lowerSky.rise.unused1 + if(ArraySize != 1) + break; + NAM0.value.lowerSky.rise.unused1 = ((UINT8ARRAY)FieldValue)[0]; + break; + case 200: //lowerSky.day.red + NAM0.value.lowerSky.day.red = *(UINT8 *)FieldValue; + break; + case 201: //lowerSky.day.green + NAM0.value.lowerSky.day.green = *(UINT8 *)FieldValue; + break; + case 202: //lowerSky.day.blue + NAM0.value.lowerSky.day.blue = *(UINT8 *)FieldValue; + break; + case 203: //lowerSky.day.unused1 + if(ArraySize != 1) + break; + NAM0.value.lowerSky.day.unused1 = ((UINT8ARRAY)FieldValue)[0]; + break; + case 204: //lowerSky.set.red + NAM0.value.lowerSky.set.red = *(UINT8 *)FieldValue; + break; + case 205: //lowerSky.set.green + NAM0.value.lowerSky.set.green = *(UINT8 *)FieldValue; + break; + case 206: //lowerSky.set.blue + NAM0.value.lowerSky.set.blue = *(UINT8 *)FieldValue; + break; + case 207: //lowerSky.set.unused1 + if(ArraySize != 1) + break; + NAM0.value.lowerSky.set.unused1 = ((UINT8ARRAY)FieldValue)[0]; + break; + case 208: //lowerSky.night.red + NAM0.value.lowerSky.night.red = *(UINT8 *)FieldValue; + break; + case 209: //lowerSky.night.green + NAM0.value.lowerSky.night.green = *(UINT8 *)FieldValue; + break; + case 210: //lowerSky.night.blue + NAM0.value.lowerSky.night.blue = *(UINT8 *)FieldValue; + break; + case 211: //lowerSky.night.unused1 + if(ArraySize != 1) + break; + NAM0.value.lowerSky.night.unused1 = ((UINT8ARRAY)FieldValue)[0]; + break; + case 212: //lowerSky.noon.red + NAM0.value.lowerSky.noon.red = *(UINT8 *)FieldValue; + break; + case 213: //lowerSky.noon.green + NAM0.value.lowerSky.noon.green = *(UINT8 *)FieldValue; + break; + case 214: //lowerSky.noon.blue + NAM0.value.lowerSky.noon.blue = *(UINT8 *)FieldValue; + break; + case 215: //lowerSky.noon.unused1 + if(ArraySize != 1) + break; + NAM0.value.lowerSky.noon.unused1 = ((UINT8ARRAY)FieldValue)[0]; + break; + case 216: //lowerSky.midnight.red + NAM0.value.lowerSky.midnight.red = *(UINT8 *)FieldValue; + break; + case 217: //lowerSky.midnight.green + NAM0.value.lowerSky.midnight.green = *(UINT8 *)FieldValue; + break; + case 218: //lowerSky.midnight.blue + NAM0.value.lowerSky.midnight.blue = *(UINT8 *)FieldValue; + break; + case 219: //lowerSky.midnight.unused1 + if(ArraySize != 1) + break; + NAM0.value.lowerSky.midnight.unused1 = ((UINT8ARRAY)FieldValue)[0]; + break; + case 220: //horizon.rise.red + NAM0.value.horizon.rise.red = *(UINT8 *)FieldValue; + break; + case 221: //horizon.rise.green + NAM0.value.horizon.rise.green = *(UINT8 *)FieldValue; + break; + case 222: //horizon.rise.blue + NAM0.value.horizon.rise.blue = *(UINT8 *)FieldValue; + break; + case 223: //horizon.rise.unused1 + if(ArraySize != 1) + break; + NAM0.value.horizon.rise.unused1 = ((UINT8ARRAY)FieldValue)[0]; + break; + case 224: //horizon.day.red + NAM0.value.horizon.day.red = *(UINT8 *)FieldValue; + break; + case 225: //horizon.day.green + NAM0.value.horizon.day.green = *(UINT8 *)FieldValue; + break; + case 226: //horizon.day.blue + NAM0.value.horizon.day.blue = *(UINT8 *)FieldValue; + break; + case 227: //horizon.day.unused1 + if(ArraySize != 1) + break; + NAM0.value.horizon.day.unused1 = ((UINT8ARRAY)FieldValue)[0]; + break; + case 228: //horizon.set.red + NAM0.value.horizon.set.red = *(UINT8 *)FieldValue; + break; + case 229: //horizon.set.green + NAM0.value.horizon.set.green = *(UINT8 *)FieldValue; + break; + case 230: //horizon.set.blue + NAM0.value.horizon.set.blue = *(UINT8 *)FieldValue; + break; + case 231: //horizon.set.unused1 + if(ArraySize != 1) + break; + NAM0.value.horizon.set.unused1 = ((UINT8ARRAY)FieldValue)[0]; + break; + case 232: //horizon.night.red + NAM0.value.horizon.night.red = *(UINT8 *)FieldValue; + break; + case 233: //horizon.night.green + NAM0.value.horizon.night.green = *(UINT8 *)FieldValue; + break; + case 234: //horizon.night.blue + NAM0.value.horizon.night.blue = *(UINT8 *)FieldValue; + break; + case 235: //horizon.night.unused1 + if(ArraySize != 1) + break; + NAM0.value.horizon.night.unused1 = ((UINT8ARRAY)FieldValue)[0]; + break; + case 236: //horizon.noon.red + NAM0.value.horizon.noon.red = *(UINT8 *)FieldValue; + break; + case 237: //horizon.noon.green + NAM0.value.horizon.noon.green = *(UINT8 *)FieldValue; + break; + case 238: //horizon.noon.blue + NAM0.value.horizon.noon.blue = *(UINT8 *)FieldValue; + break; + case 239: //horizon.noon.unused1 + if(ArraySize != 1) + break; + NAM0.value.horizon.noon.unused1 = ((UINT8ARRAY)FieldValue)[0]; + break; + case 240: //horizon.midnight.red + NAM0.value.horizon.midnight.red = *(UINT8 *)FieldValue; + break; + case 241: //horizon.midnight.green + NAM0.value.horizon.midnight.green = *(UINT8 *)FieldValue; + break; + case 242: //horizon.midnight.blue + NAM0.value.horizon.midnight.blue = *(UINT8 *)FieldValue; + break; + case 243: //horizon.midnight.unused1 + if(ArraySize != 1) + break; + NAM0.value.horizon.midnight.unused1 = ((UINT8ARRAY)FieldValue)[0]; + break; + case 244: //upperClouds.rise.red + NAM0.value.upperClouds.rise.red = *(UINT8 *)FieldValue; + break; + case 245: //upperClouds.rise.green + NAM0.value.upperClouds.rise.green = *(UINT8 *)FieldValue; + break; + case 246: //upperClouds.rise.blue + NAM0.value.upperClouds.rise.blue = *(UINT8 *)FieldValue; + break; + case 247: //upperClouds.rise.unused1 + if(ArraySize != 1) + break; + NAM0.value.upperClouds.rise.unused1 = ((UINT8ARRAY)FieldValue)[0]; + break; + case 248: //upperClouds.day.red + NAM0.value.upperClouds.day.red = *(UINT8 *)FieldValue; + break; + case 249: //upperClouds.day.green + NAM0.value.upperClouds.day.green = *(UINT8 *)FieldValue; + break; + case 250: //upperClouds.day.blue + NAM0.value.upperClouds.day.blue = *(UINT8 *)FieldValue; + break; + case 251: //upperClouds.day.unused1 + if(ArraySize != 1) + break; + NAM0.value.upperClouds.day.unused1 = ((UINT8ARRAY)FieldValue)[0]; + break; + case 252: //upperClouds.set.red + NAM0.value.upperClouds.set.red = *(UINT8 *)FieldValue; + break; + case 253: //upperClouds.set.green + NAM0.value.upperClouds.set.green = *(UINT8 *)FieldValue; + break; + case 254: //upperClouds.set.blue + NAM0.value.upperClouds.set.blue = *(UINT8 *)FieldValue; + break; + case 255: //upperClouds.set.unused1 + if(ArraySize != 1) + break; + NAM0.value.upperClouds.set.unused1 = ((UINT8ARRAY)FieldValue)[0]; + break; + case 256: //upperClouds.night.red + NAM0.value.upperClouds.night.red = *(UINT8 *)FieldValue; + break; + case 257: //upperClouds.night.green + NAM0.value.upperClouds.night.green = *(UINT8 *)FieldValue; + break; + case 258: //upperClouds.night.blue + NAM0.value.upperClouds.night.blue = *(UINT8 *)FieldValue; + break; + case 259: //upperClouds.night.unused1 + if(ArraySize != 1) + break; + NAM0.value.upperClouds.night.unused1 = ((UINT8ARRAY)FieldValue)[0]; + break; + case 260: //upperClouds.noon.red + NAM0.value.upperClouds.noon.red = *(UINT8 *)FieldValue; + break; + case 261: //upperClouds.noon.green + NAM0.value.upperClouds.noon.green = *(UINT8 *)FieldValue; + break; + case 262: //upperClouds.noon.blue + NAM0.value.upperClouds.noon.blue = *(UINT8 *)FieldValue; + break; + case 263: //upperClouds.noon.unused1 + if(ArraySize != 1) + break; + NAM0.value.upperClouds.noon.unused1 = ((UINT8ARRAY)FieldValue)[0]; + break; + case 264: //upperClouds.midnight.red + NAM0.value.upperClouds.midnight.red = *(UINT8 *)FieldValue; + break; + case 265: //upperClouds.midnight.green + NAM0.value.upperClouds.midnight.green = *(UINT8 *)FieldValue; + break; + case 266: //upperClouds.midnight.blue + NAM0.value.upperClouds.midnight.blue = *(UINT8 *)FieldValue; + break; + case 267: //upperClouds.midnight.unused1 + if(ArraySize != 1) + break; + NAM0.value.upperClouds.midnight.unused1 = ((UINT8ARRAY)FieldValue)[0]; + break; + case 268: //fogDayNear + FNAM.value.fogDayNear = *(FLOAT32 *)FieldValue; + break; + case 269: //fogDayFar + FNAM.value.fogDayFar = *(FLOAT32 *)FieldValue; + break; + case 270: //fogNightNear + FNAM.value.fogNightNear = *(FLOAT32 *)FieldValue; + break; + case 271: //fogNightFar + FNAM.value.fogNightFar = *(FLOAT32 *)FieldValue; + break; + case 272: //fogDayPower + FNAM.value.fogDayPower = *(FLOAT32 *)FieldValue; + break; + case 273: //fogNightPower + FNAM.value.fogNightPower = *(FLOAT32 *)FieldValue; + break; + case 274: //INAM + INAM.Copy((UINT8ARRAY)FieldValue, ArraySize); + break; + case 275: //windSpeed + DATA.value.windSpeed = *(UINT8 *)FieldValue; + break; + case 276: //lowerCloudSpeed + DATA.value.lowerCloudSpeed = *(UINT8 *)FieldValue; + break; + case 277: //upperCloudSpeed + DATA.value.upperCloudSpeed = *(UINT8 *)FieldValue; + break; + case 278: //transDelta + DATA.value.transDelta = *(UINT8 *)FieldValue; + break; + case 279: //sunGlare + DATA.value.sunGlare = *(UINT8 *)FieldValue; + break; + case 280: //sunDamage + DATA.value.sunDamage = *(UINT8 *)FieldValue; + break; + case 281: //rainFadeIn + DATA.value.rainFadeIn = *(UINT8 *)FieldValue; + break; + case 282: //rainFadeOut + DATA.value.rainFadeOut = *(UINT8 *)FieldValue; + break; + case 283: //boltFadeIn + DATA.value.boltFadeIn = *(UINT8 *)FieldValue; + break; + case 284: //boltFadeOut + DATA.value.boltFadeOut = *(UINT8 *)FieldValue; + break; + case 285: //boltFrequency + DATA.value.boltFrequency = *(UINT8 *)FieldValue; + break; + case 286: //weatherType + DATA.value.weatherType = *(UINT8 *)FieldValue; + break; + case 287: //boltRed + DATA.value.boltRed = *(UINT8 *)FieldValue; + break; + case 288: //boltGreen + DATA.value.boltGreen = *(UINT8 *)FieldValue; + break; + case 289: //boltBlue + DATA.value.boltBlue = *(UINT8 *)FieldValue; + break; + case 290: //sounds + if(ListFieldID == 0) //soundsSize + { + Sounds.resize(ArraySize); + return false; + } + + if(ListIndex >= Sounds.value.size()) + break; + + switch(ListFieldID) + { + case 1: //sound + Sounds.value[ListIndex]->sound = *(FORMID *)FieldValue; + return true; + case 2: //type + Sounds.value[ListIndex]->SetType(*(UINT32 *)FieldValue); + break; + default: + break; + } break; default: break; @@ -893,173 +3012,965 @@ bool WTHRRecord::SetField(FIELD_IDENTIFIERS, void *FieldValue, UINT32 ArraySize) void WTHRRecord::DeleteField(FIELD_IDENTIFIERS) { + GENCLR defaultCLR; + WTHRFNAM defaultFNAM; + WTHRDATA defaultDATA; + WTHRColors defaultColors; + WTHRSNAM defaultSNAM; + FNVMODS defaultMODS; + WTHRONAM defaultONAM; switch(FieldID) { case 1: //flags1 SetHeaderFlagMask(0); return; - case 3: //versionControl1 - flagsUnk = 0; + case 3: //versionControl1 + flagsUnk = 0; + return; + case 4: //eid + EDID.Unload(); + return; + case 5: //formVersion + formVersion = 0; + return; + case 6: //versionControl2 + versionControl2[0] = 0; + versionControl2[1] = 0; + return; + case 7: //sunriseImageSpace + _0IAD.Unload(); + return; + case 8: //dayImageSpace + _1IAD.Unload(); + return; + case 9: //sunsetImageSpace + _2IAD.Unload(); + return; + case 10: //nightImageSpace + _3IAD.Unload(); + return; + case 11: //unknown1ImageSpace + _4IAD.Unload(); + return; + case 12: //unknown2ImageSpace + _5IAD.Unload(); + return; + case 13: //cloudLayer0Path + DNAM.Unload(); + return; + case 14: //cloudLayer1Path + CNAM.Unload(); + return; + case 15: //cloudLayer2Path + ANAM.Unload(); + return; + case 16: //cloudLayer3Path + BNAM.Unload(); + return; + case 17: //modPath + if(MODL.IsLoaded()) + MODL->MODL.Unload(); + return; + case 18: //modb + if(MODL.IsLoaded()) + MODL->MODB.Unload(); + return; + case 19: //modt_p + if(MODL.IsLoaded()) + MODL->MODT.Unload(); + return; + case 20: //altTextures + if(MODL.IsLoaded()) + { + 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 21: //modelFlags + if(MODL.IsLoaded()) + MODL->MODD.Unload(); + return; + case 22: //unknown1 + LNAM.Unload(); + return; + case 23: //layer0Speed + if(ONAM.IsLoaded()) + ONAM->layer0Speed = defaultONAM.layer0Speed; + return; + case 24: //layer1Speed + if(ONAM.IsLoaded()) + ONAM->layer1Speed = defaultONAM.layer1Speed; + return; + case 25: //layer2Speed + if(ONAM.IsLoaded()) + ONAM->layer2Speed = defaultONAM.layer2Speed; + return; + case 26: //layer3Speed + if(ONAM.IsLoaded()) + ONAM->layer3Speed = defaultONAM.layer3Speed; + return; + case 27: //PNAM + PNAM.Unload(); + return; + case 28: //upperSky.rise.red + NAM0.value.upperSky.rise.red = defaultCLR.red; + return; + case 29: //upperSky.rise.green + NAM0.value.upperSky.rise.green = defaultCLR.green; + return; + case 30: //upperSky.rise.blue + NAM0.value.upperSky.rise.blue = defaultCLR.blue; + return; + case 31: //upperSky.rise.unused1 + NAM0.value.upperSky.rise.unused1 = defaultCLR.unused1; return; - case 4: //eid - EDID.Unload(); + case 32: //upperSky.day.red + NAM0.value.upperSky.day.red = defaultCLR.red; return; - case 5: //formVersion - formVersion = 0; + case 33: //upperSky.day.green + NAM0.value.upperSky.day.green = defaultCLR.green; return; - case 6: //versionControl2 - versionControl2[0] = 0; - versionControl2[1] = 0; + case 34: //upperSky.day.blue + NAM0.value.upperSky.day.blue = defaultCLR.blue; return; - case 7: //0iad Sunrise Image Space Modifier - 0IAD.Unload(); + case 35: //upperSky.day.unused1 + NAM0.value.upperSky.day.unused1 = defaultCLR.unused1; return; - case 8: //1iad Day Image Space Modifier - 1IAD.Unload(); + case 36: //upperSky.set.red + NAM0.value.upperSky.set.red = defaultCLR.red; return; - case 9: //2iad Sunset Image Space Modifier - 2IAD.Unload(); + case 37: //upperSky.set.green + NAM0.value.upperSky.set.green = defaultCLR.green; return; - case 10: //3iad Night Image Space Modifier - 3IAD.Unload(); + case 38: //upperSky.set.blue + NAM0.value.upperSky.set.blue = defaultCLR.blue; return; - case 11: //4iad Unknown - 4IAD.Unload(); + case 39: //upperSky.set.unused1 + NAM0.value.upperSky.set.unused1 = defaultCLR.unused1; return; - case 12: //5iad Unknown - 5IAD.Unload(); + case 40: //upperSky.night.red + NAM0.value.upperSky.night.red = defaultCLR.red; return; - case 13: //dnam Cloud Textures - Layer 0 - DNAM.Unload(); + case 41: //upperSky.night.green + NAM0.value.upperSky.night.green = defaultCLR.green; return; - case 14: //cnam Cloud Textures - Layer 1 - CNAM.Unload(); + case 42: //upperSky.night.blue + NAM0.value.upperSky.night.blue = defaultCLR.blue; return; - case 15: //anam Cloud Textures - Layer 2 - ANAM.Unload(); + case 43: //upperSky.night.unused1 + NAM0.value.upperSky.night.unused1 = defaultCLR.unused1; return; - case 16: //bnam Cloud Textures - Layer 3 - BNAM.Unload(); + case 44: //upperSky.noon.red + NAM0.value.upperSky.noon.red = defaultCLR.red; return; - case 17: //modPath - if(MODL.IsLoaded()) - MODL->MODL.Unload(); + case 45: //upperSky.noon.green + NAM0.value.upperSky.noon.green = defaultCLR.green; return; - case 18: //modb - if(MODL.IsLoaded()) - MODL->MODB.Unload(); + case 46: //upperSky.noon.blue + NAM0.value.upperSky.noon.blue = defaultCLR.blue; return; - case 19: //modt_p - if(MODL.IsLoaded()) - MODL->MODT.Unload(); + case 47: //upperSky.noon.unused1 + NAM0.value.upperSky.noon.unused1 = defaultCLR.unused1; return; - case 20: //mods Alternate Textures - if(MODL.IsLoaded()) - MODL->MODS.Unload(); + case 48: //upperSky.midnight.red + NAM0.value.upperSky.midnight.red = defaultCLR.red; return; - case 21: //mods Alternate Textures - if(MODL.IsLoaded()) - MODL->MODS.Unload(); + case 49: //upperSky.midnight.green + NAM0.value.upperSky.midnight.green = defaultCLR.green; return; - case 22: //mods Alternate Textures - if(MODL.IsLoaded()) - MODL->MODS.Unload(); + case 50: //upperSky.midnight.blue + NAM0.value.upperSky.midnight.blue = defaultCLR.blue; return; - case 23: //modelFlags - if(MODL.IsLoaded()) - MODL->MODD.Unload(); + case 51: //upperSky.midnight.unused1 + NAM0.value.upperSky.midnight.unused1 = defaultCLR.unused1; return; - case 24: //lnam_p Unknown - LNAM.Unload(); + case 52: //fog.rise.red + NAM0.value.fog.rise.red = defaultCLR.red; return; - case 25: //onam Cloud Speed - return UNPARSEDDEL_FIELD25; - case 26: //pnam_p Unused - PNAM.Unload(); + case 53: //fog.rise.green + NAM0.value.fog.rise.green = defaultCLR.green; + return; + case 54: //fog.rise.blue + NAM0.value.fog.rise.blue = defaultCLR.blue; + return; + case 55: //fog.rise.unused1 + NAM0.value.fog.rise.unused1 = defaultCLR.unused1; + return; + case 56: //fog.day.red + NAM0.value.fog.day.red = defaultCLR.red; + return; + case 57: //fog.day.green + NAM0.value.fog.day.green = defaultCLR.green; + return; + case 58: //fog.day.blue + NAM0.value.fog.day.blue = defaultCLR.blue; + return; + case 59: //fog.day.unused1 + NAM0.value.fog.day.unused1 = defaultCLR.unused1; + return; + case 60: //fog.set.red + NAM0.value.fog.set.red = defaultCLR.red; + return; + case 61: //fog.set.green + NAM0.value.fog.set.green = defaultCLR.green; + return; + case 62: //fog.set.blue + NAM0.value.fog.set.blue = defaultCLR.blue; + return; + case 63: //fog.set.unused1 + NAM0.value.fog.set.unused1 = defaultCLR.unused1; + return; + case 64: //fog.night.red + NAM0.value.fog.night.red = defaultCLR.red; + return; + case 65: //fog.night.green + NAM0.value.fog.night.green = defaultCLR.green; + return; + case 66: //fog.night.blue + NAM0.value.fog.night.blue = defaultCLR.blue; + return; + case 67: //fog.night.unused1 + NAM0.value.fog.night.unused1 = defaultCLR.unused1; + return; + case 68: //fog.noon.red + NAM0.value.fog.noon.red = defaultCLR.red; + return; + case 69: //fog.noon.green + NAM0.value.fog.noon.green = defaultCLR.green; + return; + case 70: //fog.noon.blue + NAM0.value.fog.noon.blue = defaultCLR.blue; + return; + case 71: //fog.noon.unused1 + NAM0.value.fog.noon.unused1 = defaultCLR.unused1; + return; + case 72: //fog.midnight.red + NAM0.value.fog.midnight.red = defaultCLR.red; + return; + case 73: //fog.midnight.green + NAM0.value.fog.midnight.green = defaultCLR.green; + return; + case 74: //fog.midnight.blue + NAM0.value.fog.midnight.blue = defaultCLR.blue; + return; + case 75: //fog.midnight.unused1 + NAM0.value.fog.midnight.unused1 = defaultCLR.unused1; + return; + case 76: //lowerClouds.rise.red + NAM0.value.lowerClouds.rise.red = defaultCLR.red; + return; + case 77: //lowerClouds.rise.green + NAM0.value.lowerClouds.rise.green = defaultCLR.green; + return; + case 78: //lowerClouds.rise.blue + NAM0.value.lowerClouds.rise.blue = defaultCLR.blue; + return; + case 79: //lowerClouds.rise.unused1 + NAM0.value.lowerClouds.rise.unused1 = defaultCLR.unused1; + return; + case 80: //lowerClouds.day.red + NAM0.value.lowerClouds.day.red = defaultCLR.red; + return; + case 81: //lowerClouds.day.green + NAM0.value.lowerClouds.day.green = defaultCLR.green; + return; + case 82: //lowerClouds.day.blue + NAM0.value.lowerClouds.day.blue = defaultCLR.blue; + return; + case 83: //lowerClouds.day.unused1 + NAM0.value.lowerClouds.day.unused1 = defaultCLR.unused1; + return; + case 84: //lowerClouds.set.red + NAM0.value.lowerClouds.set.red = defaultCLR.red; + return; + case 85: //lowerClouds.set.green + NAM0.value.lowerClouds.set.green = defaultCLR.green; + return; + case 86: //lowerClouds.set.blue + NAM0.value.lowerClouds.set.blue = defaultCLR.blue; + return; + case 87: //lowerClouds.set.unused1 + NAM0.value.lowerClouds.set.unused1 = defaultCLR.unused1; + return; + case 88: //lowerClouds.night.red + NAM0.value.lowerClouds.night.red = defaultCLR.red; + return; + case 89: //lowerClouds.night.green + NAM0.value.lowerClouds.night.green = defaultCLR.green; + return; + case 90: //lowerClouds.night.blue + NAM0.value.lowerClouds.night.blue = defaultCLR.blue; + return; + case 91: //lowerClouds.night.unused1 + NAM0.value.lowerClouds.night.unused1 = defaultCLR.unused1; + return; + case 92: //lowerClouds.noon.red + NAM0.value.lowerClouds.noon.red = defaultCLR.red; + return; + case 93: //lowerClouds.noon.green + NAM0.value.lowerClouds.noon.green = defaultCLR.green; + return; + case 94: //lowerClouds.noon.blue + NAM0.value.lowerClouds.noon.blue = defaultCLR.blue; + return; + case 95: //lowerClouds.noon.unused1 + NAM0.value.lowerClouds.noon.unused1 = defaultCLR.unused1; + return; + case 96: //lowerClouds.midnight.red + NAM0.value.lowerClouds.midnight.red = defaultCLR.red; + return; + case 97: //lowerClouds.midnight.green + NAM0.value.lowerClouds.midnight.green = defaultCLR.green; + return; + case 98: //lowerClouds.midnight.blue + NAM0.value.lowerClouds.midnight.blue = defaultCLR.blue; + return; + case 99: //lowerClouds.midnight.unused1 + NAM0.value.lowerClouds.midnight.unused1 = defaultCLR.unused1; + return; + case 100: //ambient.rise.red + NAM0.value.ambient.rise.red = defaultCLR.red; + return; + case 101: //ambient.rise.green + NAM0.value.ambient.rise.green = defaultCLR.green; + return; + case 102: //ambient.rise.blue + NAM0.value.ambient.rise.blue = defaultCLR.blue; + return; + case 103: //ambient.rise.unused1 + NAM0.value.ambient.rise.unused1 = defaultCLR.unused1; + return; + case 104: //ambient.day.red + NAM0.value.ambient.day.red = defaultCLR.red; + return; + case 105: //ambient.day.green + NAM0.value.ambient.day.green = defaultCLR.green; + return; + case 106: //ambient.day.blue + NAM0.value.ambient.day.blue = defaultCLR.blue; + return; + case 107: //ambient.day.unused1 + NAM0.value.ambient.day.unused1 = defaultCLR.unused1; + return; + case 108: //ambient.set.red + NAM0.value.ambient.set.red = defaultCLR.red; + return; + case 109: //ambient.set.green + NAM0.value.ambient.set.green = defaultCLR.green; + return; + case 110: //ambient.set.blue + NAM0.value.ambient.set.blue = defaultCLR.blue; + return; + case 111: //ambient.set.unused1 + NAM0.value.ambient.set.unused1 = defaultCLR.unused1; + return; + case 112: //ambient.night.red + NAM0.value.ambient.night.red = defaultCLR.red; + return; + case 113: //ambient.night.green + NAM0.value.ambient.night.green = defaultCLR.green; + return; + case 114: //ambient.night.blue + NAM0.value.ambient.night.blue = defaultCLR.blue; + return; + case 115: //ambient.night.unused1 + NAM0.value.ambient.night.unused1 = defaultCLR.unused1; + return; + case 116: //ambient.noon.red + NAM0.value.ambient.noon.red = defaultCLR.red; + return; + case 117: //ambient.noon.green + NAM0.value.ambient.noon.green = defaultCLR.green; + return; + case 118: //ambient.noon.blue + NAM0.value.ambient.noon.blue = defaultCLR.blue; + return; + case 119: //ambient.noon.unused1 + NAM0.value.ambient.noon.unused1 = defaultCLR.unused1; + return; + case 120: //ambient.midnight.red + NAM0.value.ambient.midnight.red = defaultCLR.red; + return; + case 121: //ambient.midnight.green + NAM0.value.ambient.midnight.green = defaultCLR.green; + return; + case 122: //ambient.midnight.blue + NAM0.value.ambient.midnight.blue = defaultCLR.blue; + return; + case 123: //ambient.midnight.unused1 + NAM0.value.ambient.midnight.unused1 = defaultCLR.unused1; + return; + case 124: //sunlight.rise.red + NAM0.value.sunlight.rise.red = defaultCLR.red; + return; + case 125: //sunlight.rise.green + NAM0.value.sunlight.rise.green = defaultCLR.green; + return; + case 126: //sunlight.rise.blue + NAM0.value.sunlight.rise.blue = defaultCLR.blue; + return; + case 127: //sunlight.rise.unused1 + NAM0.value.sunlight.rise.unused1 = defaultCLR.unused1; + return; + case 128: //sunlight.day.red + NAM0.value.sunlight.day.red = defaultCLR.red; + return; + case 129: //sunlight.day.green + NAM0.value.sunlight.day.green = defaultCLR.green; + return; + case 130: //sunlight.day.blue + NAM0.value.sunlight.day.blue = defaultCLR.blue; + return; + case 131: //sunlight.day.unused1 + NAM0.value.sunlight.day.unused1 = defaultCLR.unused1; + return; + case 132: //sunlight.set.red + NAM0.value.sunlight.set.red = defaultCLR.red; + return; + case 133: //sunlight.set.green + NAM0.value.sunlight.set.green = defaultCLR.green; + return; + case 134: //sunlight.set.blue + NAM0.value.sunlight.set.blue = defaultCLR.blue; + return; + case 135: //sunlight.set.unused1 + NAM0.value.sunlight.set.unused1 = defaultCLR.unused1; + return; + case 136: //sunlight.night.red + NAM0.value.sunlight.night.red = defaultCLR.red; + return; + case 137: //sunlight.night.green + NAM0.value.sunlight.night.green = defaultCLR.green; + return; + case 138: //sunlight.night.blue + NAM0.value.sunlight.night.blue = defaultCLR.blue; + return; + case 139: //sunlight.night.unused1 + NAM0.value.sunlight.night.unused1 = defaultCLR.unused1; + return; + case 140: //sunlight.noon.red + NAM0.value.sunlight.noon.red = defaultCLR.red; + return; + case 141: //sunlight.noon.green + NAM0.value.sunlight.noon.green = defaultCLR.green; + return; + case 142: //sunlight.noon.blue + NAM0.value.sunlight.noon.blue = defaultCLR.blue; + return; + case 143: //sunlight.noon.unused1 + NAM0.value.sunlight.noon.unused1 = defaultCLR.unused1; + return; + case 144: //sunlight.midnight.red + NAM0.value.sunlight.midnight.red = defaultCLR.red; + return; + case 145: //sunlight.midnight.green + NAM0.value.sunlight.midnight.green = defaultCLR.green; + return; + case 146: //sunlight.midnight.blue + NAM0.value.sunlight.midnight.blue = defaultCLR.blue; + return; + case 147: //sunlight.midnight.unused1 + NAM0.value.sunlight.midnight.unused1 = defaultCLR.unused1; + return; + case 148: //sun.rise.red + NAM0.value.sun.rise.red = defaultCLR.red; + return; + case 149: //sun.rise.green + NAM0.value.sun.rise.green = defaultCLR.green; + return; + case 150: //sun.rise.blue + NAM0.value.sun.rise.blue = defaultCLR.blue; + return; + case 151: //sun.rise.unused1 + NAM0.value.sun.rise.unused1 = defaultCLR.unused1; + return; + case 152: //sun.day.red + NAM0.value.sun.day.red = defaultCLR.red; return; - case 27: //nam0 NAM0 ,, Struct - NAM0.Unload(); + case 153: //sun.day.green + NAM0.value.sun.day.green = defaultCLR.green; return; - case 28: //nam0 NAM0 ,, Struct - NAM0.Unload(); + case 154: //sun.day.blue + NAM0.value.sun.day.blue = defaultCLR.blue; return; - case 29: //nam0 NAM0 ,, Struct - NAM0.Unload(); + case 155: //sun.day.unused1 + NAM0.value.sun.day.unused1 = defaultCLR.unused1; return; - case 30: //nam0_p NAM0 ,, Struct - NAM0.Unload(); + case 156: //sun.set.red + NAM0.value.sun.set.red = defaultCLR.red; return; - case 31: //fnam FNAM ,, Struct - FNAM.Unload(); + case 157: //sun.set.green + NAM0.value.sun.set.green = defaultCLR.green; return; - case 32: //fnam FNAM ,, Struct - FNAM.Unload(); + case 158: //sun.set.blue + NAM0.value.sun.set.blue = defaultCLR.blue; return; - case 33: //fnam FNAM ,, Struct - FNAM.Unload(); + case 159: //sun.set.unused1 + NAM0.value.sun.set.unused1 = defaultCLR.unused1; return; - case 34: //fnam FNAM ,, Struct - FNAM.Unload(); + case 160: //sun.night.red + NAM0.value.sun.night.red = defaultCLR.red; return; - case 35: //fnam FNAM ,, Struct - FNAM.Unload(); + case 161: //sun.night.green + NAM0.value.sun.night.green = defaultCLR.green; return; - case 36: //fnam FNAM ,, Struct - FNAM.Unload(); + case 162: //sun.night.blue + NAM0.value.sun.night.blue = defaultCLR.blue; return; - case 37: //inam_p Unused + case 163: //sun.night.unused1 + NAM0.value.sun.night.unused1 = defaultCLR.unused1; + return; + case 164: //sun.noon.red + NAM0.value.sun.noon.red = defaultCLR.red; + return; + case 165: //sun.noon.green + NAM0.value.sun.noon.green = defaultCLR.green; + return; + case 166: //sun.noon.blue + NAM0.value.sun.noon.blue = defaultCLR.blue; + return; + case 167: //sun.noon.unused1 + NAM0.value.sun.noon.unused1 = defaultCLR.unused1; + return; + case 168: //sun.midnight.red + NAM0.value.sun.midnight.red = defaultCLR.red; + return; + case 169: //sun.midnight.green + NAM0.value.sun.midnight.green = defaultCLR.green; + return; + case 170: //sun.midnight.blue + NAM0.value.sun.midnight.blue = defaultCLR.blue; + return; + case 171: //sun.midnight.unused1 + NAM0.value.sun.midnight.unused1 = defaultCLR.unused1; + return; + case 172: //stars.rise.red + NAM0.value.stars.rise.red = defaultCLR.red; + return; + case 173: //stars.rise.green + NAM0.value.stars.rise.green = defaultCLR.green; + return; + case 174: //stars.rise.blue + NAM0.value.stars.rise.blue = defaultCLR.blue; + return; + case 175: //stars.rise.unused1 + NAM0.value.stars.rise.unused1 = defaultCLR.unused1; + return; + case 176: //stars.day.red + NAM0.value.stars.day.red = defaultCLR.red; + return; + case 177: //stars.day.green + NAM0.value.stars.day.green = defaultCLR.green; + return; + case 178: //stars.day.blue + NAM0.value.stars.day.blue = defaultCLR.blue; + return; + case 179: //stars.day.unused1 + NAM0.value.stars.day.unused1 = defaultCLR.unused1; + return; + case 180: //stars.set.red + NAM0.value.stars.set.red = defaultCLR.red; + return; + case 181: //stars.set.green + NAM0.value.stars.set.green = defaultCLR.green; + return; + case 182: //stars.set.blue + NAM0.value.stars.set.blue = defaultCLR.blue; + return; + case 183: //stars.set.unused1 + NAM0.value.stars.set.unused1 = defaultCLR.unused1; + return; + case 184: //stars.night.red + NAM0.value.stars.night.red = defaultCLR.red; + return; + case 185: //stars.night.green + NAM0.value.stars.night.green = defaultCLR.green; + return; + case 186: //stars.night.blue + NAM0.value.stars.night.blue = defaultCLR.blue; + return; + case 187: //stars.night.unused1 + NAM0.value.stars.night.unused1 = defaultCLR.unused1; + return; + case 188: //stars.noon.red + NAM0.value.stars.noon.red = defaultCLR.red; + return; + case 189: //stars.noon.green + NAM0.value.stars.noon.green = defaultCLR.green; + return; + case 190: //stars.noon.blue + NAM0.value.stars.noon.blue = defaultCLR.blue; + return; + case 191: //stars.noon.unused1 + NAM0.value.stars.noon.unused1 = defaultCLR.unused1; + return; + case 192: //stars.midnight.red + NAM0.value.stars.midnight.red = defaultCLR.red; + return; + case 193: //stars.midnight.green + NAM0.value.stars.midnight.green = defaultCLR.green; + return; + case 194: //stars.midnight.blue + NAM0.value.stars.midnight.blue = defaultCLR.blue; + return; + case 195: //stars.midnight.unused1 + NAM0.value.stars.midnight.unused1 = defaultCLR.unused1; + return; + case 196: //lowerSky.rise.red + NAM0.value.lowerSky.rise.red = defaultCLR.red; + return; + case 197: //lowerSky.rise.green + NAM0.value.lowerSky.rise.green = defaultCLR.green; + return; + case 198: //lowerSky.rise.blue + NAM0.value.lowerSky.rise.blue = defaultCLR.blue; + return; + case 199: //lowerSky.rise.unused1 + NAM0.value.lowerSky.rise.unused1 = defaultCLR.unused1; + return; + case 200: //lowerSky.day.red + NAM0.value.lowerSky.day.red = defaultCLR.red; + return; + case 201: //lowerSky.day.green + NAM0.value.lowerSky.day.green = defaultCLR.green; + return; + case 202: //lowerSky.day.blue + NAM0.value.lowerSky.day.blue = defaultCLR.blue; + return; + case 203: //lowerSky.day.unused1 + NAM0.value.lowerSky.day.unused1 = defaultCLR.unused1; + return; + case 204: //lowerSky.set.red + NAM0.value.lowerSky.set.red = defaultCLR.red; + return; + case 205: //lowerSky.set.green + NAM0.value.lowerSky.set.green = defaultCLR.green; + return; + case 206: //lowerSky.set.blue + NAM0.value.lowerSky.set.blue = defaultCLR.blue; + return; + case 207: //lowerSky.set.unused1 + NAM0.value.lowerSky.set.unused1 = defaultCLR.unused1; + return; + case 208: //lowerSky.night.red + NAM0.value.lowerSky.night.red = defaultCLR.red; + return; + case 209: //lowerSky.night.green + NAM0.value.lowerSky.night.green = defaultCLR.green; + return; + case 210: //lowerSky.night.blue + NAM0.value.lowerSky.night.blue = defaultCLR.blue; + return; + case 211: //lowerSky.night.unused1 + NAM0.value.lowerSky.night.unused1 = defaultCLR.unused1; + return; + case 212: //lowerSky.noon.red + NAM0.value.lowerSky.noon.red = defaultCLR.red; + return; + case 213: //lowerSky.noon.green + NAM0.value.lowerSky.noon.green = defaultCLR.green; + return; + case 214: //lowerSky.noon.blue + NAM0.value.lowerSky.noon.blue = defaultCLR.blue; + return; + case 215: //lowerSky.noon.unused1 + NAM0.value.lowerSky.noon.unused1 = defaultCLR.unused1; + return; + case 216: //lowerSky.midnight.red + NAM0.value.lowerSky.midnight.red = defaultCLR.red; + return; + case 217: //lowerSky.midnight.green + NAM0.value.lowerSky.midnight.green = defaultCLR.green; + return; + case 218: //lowerSky.midnight.blue + NAM0.value.lowerSky.midnight.blue = defaultCLR.blue; + return; + case 219: //lowerSky.midnight.unused1 + NAM0.value.lowerSky.midnight.unused1 = defaultCLR.unused1; + return; + case 220: //horizon.rise.red + NAM0.value.horizon.rise.red = defaultCLR.red; + return; + case 221: //horizon.rise.green + NAM0.value.horizon.rise.green = defaultCLR.green; + return; + case 222: //horizon.rise.blue + NAM0.value.horizon.rise.blue = defaultCLR.blue; + return; + case 223: //horizon.rise.unused1 + NAM0.value.horizon.rise.unused1 = defaultCLR.unused1; + return; + case 224: //horizon.day.red + NAM0.value.horizon.day.red = defaultCLR.red; + return; + case 225: //horizon.day.green + NAM0.value.horizon.day.green = defaultCLR.green; + return; + case 226: //horizon.day.blue + NAM0.value.horizon.day.blue = defaultCLR.blue; + return; + case 227: //horizon.day.unused1 + NAM0.value.horizon.day.unused1 = defaultCLR.unused1; + return; + case 228: //horizon.set.red + NAM0.value.horizon.set.red = defaultCLR.red; + return; + case 229: //horizon.set.green + NAM0.value.horizon.set.green = defaultCLR.green; + return; + case 230: //horizon.set.blue + NAM0.value.horizon.set.blue = defaultCLR.blue; + return; + case 231: //horizon.set.unused1 + NAM0.value.horizon.set.unused1 = defaultCLR.unused1; + return; + case 232: //horizon.night.red + NAM0.value.horizon.night.red = defaultCLR.red; + return; + case 233: //horizon.night.green + NAM0.value.horizon.night.green = defaultCLR.green; + return; + case 234: //horizon.night.blue + NAM0.value.horizon.night.blue = defaultCLR.blue; + return; + case 235: //horizon.night.unused1 + NAM0.value.horizon.night.unused1 = defaultCLR.unused1; + return; + case 236: //horizon.noon.red + NAM0.value.horizon.noon.red = defaultCLR.red; + return; + case 237: //horizon.noon.green + NAM0.value.horizon.noon.green = defaultCLR.green; + return; + case 238: //horizon.noon.blue + NAM0.value.horizon.noon.blue = defaultCLR.blue; + return; + case 239: //horizon.noon.unused1 + NAM0.value.horizon.noon.unused1 = defaultCLR.unused1; + return; + case 240: //horizon.midnight.red + NAM0.value.horizon.midnight.red = defaultCLR.red; + return; + case 241: //horizon.midnight.green + NAM0.value.horizon.midnight.green = defaultCLR.green; + return; + case 242: //horizon.midnight.blue + NAM0.value.horizon.midnight.blue = defaultCLR.blue; + return; + case 243: //horizon.midnight.unused1 + NAM0.value.horizon.midnight.unused1 = defaultCLR.unused1; + return; + case 244: //upperClouds.rise.red + NAM0.value.upperClouds.rise.red = defaultCLR.red; + return; + case 245: //upperClouds.rise.green + NAM0.value.upperClouds.rise.green = defaultCLR.green; + return; + case 246: //upperClouds.rise.blue + NAM0.value.upperClouds.rise.blue = defaultCLR.blue; + return; + case 247: //upperClouds.rise.unused1 + NAM0.value.upperClouds.rise.unused1 = defaultCLR.unused1; + return; + case 248: //upperClouds.day.red + NAM0.value.upperClouds.day.red = defaultCLR.red; + return; + case 249: //upperClouds.day.green + NAM0.value.upperClouds.day.green = defaultCLR.green; + return; + case 250: //upperClouds.day.blue + NAM0.value.upperClouds.day.blue = defaultCLR.blue; + return; + case 251: //upperClouds.day.unused1 + NAM0.value.upperClouds.day.unused1 = defaultCLR.unused1; + return; + case 252: //upperClouds.set.red + NAM0.value.upperClouds.set.red = defaultCLR.red; + return; + case 253: //upperClouds.set.green + NAM0.value.upperClouds.set.green = defaultCLR.green; + return; + case 254: //upperClouds.set.blue + NAM0.value.upperClouds.set.blue = defaultCLR.blue; + return; + case 255: //upperClouds.set.unused1 + NAM0.value.upperClouds.set.unused1 = defaultCLR.unused1; + return; + case 256: //upperClouds.night.red + NAM0.value.upperClouds.night.red = defaultCLR.red; + return; + case 257: //upperClouds.night.green + NAM0.value.upperClouds.night.green = defaultCLR.green; + return; + case 258: //upperClouds.night.blue + NAM0.value.upperClouds.night.blue = defaultCLR.blue; + return; + case 259: //upperClouds.night.unused1 + NAM0.value.upperClouds.night.unused1 = defaultCLR.unused1; + return; + case 260: //upperClouds.noon.red + NAM0.value.upperClouds.noon.red = defaultCLR.red; + return; + case 261: //upperClouds.noon.green + NAM0.value.upperClouds.noon.green = defaultCLR.green; + return; + case 262: //upperClouds.noon.blue + NAM0.value.upperClouds.noon.blue = defaultCLR.blue; + return; + case 263: //upperClouds.noon.unused1 + NAM0.value.upperClouds.noon.unused1 = defaultCLR.unused1; + return; + case 264: //upperClouds.midnight.red + NAM0.value.upperClouds.midnight.red = defaultCLR.red; + return; + case 265: //upperClouds.midnight.green + NAM0.value.upperClouds.midnight.green = defaultCLR.green; + return; + case 266: //upperClouds.midnight.blue + NAM0.value.upperClouds.midnight.blue = defaultCLR.blue; + return; + case 267: //upperClouds.midnight.unused1 + NAM0.value.upperClouds.midnight.unused1 = defaultCLR.unused1; + return; + case 268: //fogDayNear + FNAM.value.fogDayNear = defaultFNAM.fogDayNear; + return; + case 269: //fogDayFar + FNAM.value.fogDayFar = defaultFNAM.fogDayFar; + return; + case 270: //fogNightNear + FNAM.value.fogNightNear = defaultFNAM.fogNightNear; + return; + case 271: //fogNightFar + FNAM.value.fogNightFar = defaultFNAM.fogNightFar; + return; + case 272: //fogDayPower + FNAM.value.fogDayPower = defaultFNAM.fogDayPower; + return; + case 273: //fogNightPower + FNAM.value.fogNightPower = defaultFNAM.fogNightPower; + return; + case 274: //INAM INAM.Unload(); return; - case 38: //data DATA ,, Struct - DATA.Unload(); + case 275: //windSpeed + DATA.value.windSpeed = defaultDATA.windSpeed; + return; + case 276: //lowerCloudSpeed + DATA.value.lowerCloudSpeed = defaultDATA.lowerCloudSpeed; return; - case 39: //data DATA ,, Struct - DATA.Unload(); + case 277: //upperCloudSpeed + DATA.value.upperCloudSpeed = defaultDATA.upperCloudSpeed; return; - case 40: //data DATA ,, Struct - DATA.Unload(); + case 278: //transDelta + DATA.value.transDelta = defaultDATA.transDelta; return; - case 41: //data DATA ,, Struct - DATA.Unload(); + case 279: //sunGlare + DATA.value.sunGlare = defaultDATA.sunGlare; return; - case 42: //data DATA ,, Struct - DATA.Unload(); + case 280: //sunDamage + DATA.value.sunDamage = defaultDATA.sunDamage; return; - case 43: //data DATA ,, Struct - DATA.Unload(); + case 281: //rainFadeIn + DATA.value.rainFadeIn = defaultDATA.rainFadeIn; return; - case 44: //data DATA ,, Struct - DATA.Unload(); + case 282: //rainFadeOut + DATA.value.rainFadeOut = defaultDATA.rainFadeOut; + return; + case 283: //boltFadeIn + DATA.value.boltFadeIn = defaultDATA.boltFadeIn; + return; + case 284: //boltFadeOut + DATA.value.boltFadeOut = defaultDATA.boltFadeOut; + return; + case 285: //boltFrequency + DATA.value.boltFrequency = defaultDATA.boltFrequency; + return; + case 286: //weatherType + DATA.value.weatherType = defaultDATA.weatherType; + return; + case 287: //boltRed + DATA.value.boltRed = defaultDATA.boltRed; + return; + case 288: //boltGreen + DATA.value.boltGreen = defaultDATA.boltGreen; + return; + case 289: //boltBlue + DATA.value.boltBlue = defaultDATA.boltBlue; + return; + case 290: //sounds + if(ListFieldID == 0) //sounds + { + Sounds.Unload(); + return; + } + + if(ListIndex >= Sounds.value.size()) + return; + + switch(ListFieldID) + { + case 1: //sound + Sounds.value[ListIndex]->sound = defaultSNAM.sound; + return; + case 2: //type + Sounds.value[ListIndex]->type = defaultSNAM.type; + return; + default: + return; + } return; - case 45: //data DATA ,, Struct - DATA.Unload(); + case 291: //convenience deleter + NAM0.value.upperSky = defaultColors; return; - case 46: //data DATA ,, Struct - DATA.Unload(); + case 292: //convenience deleter + NAM0.value.fog = defaultColors; return; - case 47: //data DATA ,, Struct - DATA.Unload(); + case 293: //convenience deleter + NAM0.value.lowerClouds = defaultColors; return; - case 48: //data DATA ,, Struct - DATA.Unload(); + case 294: //convenience deleter + NAM0.value.ambient = defaultColors; return; - case 49: //data DATA ,, Struct - DATA.Unload(); + case 295: //convenience deleter + NAM0.value.sunlight = defaultColors; return; - case 50: //data DATA ,, Struct - DATA.Unload(); + case 296: //convenience deleter + NAM0.value.sun = defaultColors; return; - case 51: //data DATA ,, Struct - DATA.Unload(); + case 297: //convenience deleter + NAM0.value.stars = defaultColors; return; - case 52: //data DATA ,, Struct - DATA.Unload(); + case 298: //convenience deleter + NAM0.value.lowerSky = defaultColors; return; - case 53: //snam SNAM ,, Struct - SNAM.Unload(); + case 299: //convenience deleter + NAM0.value.horizon = defaultColors; return; - case 54: //snam SNAM ,, Struct - SNAM.Unload(); + case 300: //convenience deleter + NAM0.value.upperClouds = defaultColors; return; default: return; diff --git a/CBash/FalloutNewVegas/Records/CLMTRecord.cpp b/CBash/FalloutNewVegas/Records/CLMTRecord.cpp index 4cc4215..e40076e 100644 --- a/CBash/FalloutNewVegas/Records/CLMTRecord.cpp +++ b/CBash/FalloutNewVegas/Records/CLMTRecord.cpp @@ -24,6 +24,62 @@ GPL License and Copyright Notice ============================================ namespace FNV { +CLMTRecord::CLMTWLST::CLMTWLST(): + weather(0), + chance(0), + globalId(0) + { + // + } + +CLMTRecord::CLMTWLST::~CLMTWLST() + { + // + } + +bool CLMTRecord::CLMTWLST::operator ==(const CLMTWLST &other) const + { + return (weather == other.weather && + chance == other.chance && + globalId == other.globalId); + } + +bool CLMTRecord::CLMTWLST::operator !=(const CLMTWLST &other) const + { + return !(*this == other); + } + +CLMTRecord::CLMTTNAM::CLMTTNAM(): + riseBegin(0), + riseEnd(0), + setBegin(0), + setEnd(0), + volatility(0), + phaseLength(0) + { + // + } + +CLMTRecord::CLMTTNAM::~CLMTTNAM() + { + // + } + +bool CLMTRecord::CLMTTNAM::operator ==(const CLMTTNAM &other) const + { + return (riseBegin == other.riseBegin && + riseEnd == other.riseEnd && + setBegin == other.setBegin && + setEnd == other.setEnd && + volatility == other.volatility && + phaseLength == other.phaseLength); + } + +bool CLMTRecord::CLMTTNAM::operator !=(const CLMTTNAM &other) const + { + return !(*this == other); + } + CLMTRecord::CLMTRecord(unsigned char *_recData): FNVRecord(_recData) { @@ -51,12 +107,10 @@ CLMTRecord::CLMTRecord(CLMTRecord *srcRecord): } EDID = srcRecord->EDID; - WLST = srcRecord->WLST; + Weathers = srcRecord->Weathers; FNAM = srcRecord->FNAM; GNAM = srcRecord->GNAM; - MODL = srcRecord->MODL; - TNAM = srcRecord->TNAM; return; } @@ -71,17 +125,23 @@ bool CLMTRecord::VisitFormIDs(FormIDOp &op) if(!IsLoaded()) return false; - //if(WLST.IsLoaded()) //FILL IN MANUALLY - // op.Accept(WLST->value); - if(MODL.IsLoaded() && MODL->MODS.IsLoaded()) - op.Accept(MODL->MODS->value); + for(UINT32 x = 0; x < Weathers.value.size(); x++) + { + op.Accept(Weathers.value[x].weather); + op.Accept(Weathers.value[x].globalId); + } + if(MODL.IsLoaded()) + { + for(UINT32 x = 0; x < MODL->Textures.MODS.size(); x++) + op.Accept(MODL->Textures.MODS[x]->texture); + } return op.Stop(); } UINT32 CLMTRecord::GetType() { - return 'TMLC'; + return REV32(CLMT); } STRING CLMTRecord::GetStrType() @@ -111,39 +171,39 @@ SINT32 CLMTRecord::ParseRecord(unsigned char *buffer, const UINT32 &recSize) } switch(subType) { - case 'DIDE': + case REV32(EDID): EDID.Read(buffer, subSize, curPos); break; - case 'TSLW': - WLST.Read(buffer, subSize, curPos); + case REV32(WLST): + Weathers.Read(buffer, subSize, curPos); break; - case 'MANF': + case REV32(FNAM): FNAM.Read(buffer, subSize, curPos); break; - case 'MANG': + case REV32(GNAM): GNAM.Read(buffer, subSize, curPos); break; - case 'LDOM': + case REV32(MODL): MODL.Load(); MODL->MODL.Read(buffer, subSize, curPos); break; - case 'BDOM': + case REV32(MODB): MODL.Load(); MODL->MODB.Read(buffer, subSize, curPos); break; - case 'TDOM': + case REV32(MODT): MODL.Load(); MODL->MODT.Read(buffer, subSize, curPos); break; - case 'SDOM': + case REV32(MODS): MODL.Load(); MODL->Textures.Read(buffer, subSize, curPos); break; - case 'DDOM': + case REV32(MODD): MODL.Load(); MODL->MODD.Read(buffer, subSize, curPos); break; - case 'MANT': + case REV32(TNAM): TNAM.Read(buffer, subSize, curPos); break; default: @@ -163,7 +223,7 @@ SINT32 CLMTRecord::Unload() IsChanged(false); IsLoaded(false); EDID.Unload(); - WLST.Unload(); + Weathers.Unload(); FNAM.Unload(); GNAM.Unload(); MODL.Unload(); @@ -174,25 +234,22 @@ SINT32 CLMTRecord::Unload() SINT32 CLMTRecord::WriteRecord(FileWriter &writer) { WRITE(EDID); - WRITE(WLST); + WRITEAS(Weathers, WLST); WRITE(FNAM); WRITE(GNAM); - MODL.Write(writer); - WRITE(TNAM); - return -1; } bool CLMTRecord::operator ==(const CLMTRecord &other) const { - return (EDID.equalsi(other.EDID) && - WLST == other.WLST && + return (TNAM == other.TNAM && + EDID.equalsi(other.EDID) && FNAM.equalsi(other.FNAM) && GNAM.equalsi(other.GNAM) && - MODL == other.MODL && - TNAM == other.TNAM); + Weathers == other.Weathers && + MODL == other.MODL); } bool CLMTRecord::operator !=(const CLMTRecord &other) const diff --git a/CBash/FalloutNewVegas/Records/CLMTRecord.h b/CBash/FalloutNewVegas/Records/CLMTRecord.h index d261139..d9674e3 100644 --- a/CBash/FalloutNewVegas/Records/CLMTRecord.h +++ b/CBash/FalloutNewVegas/Records/CLMTRecord.h @@ -30,9 +30,9 @@ class CLMTRecord : public FNVRecord //Climate private: struct CLMTWLST { - UINT32 weather; + FORMID weather; SINT32 chance; - FORMID global; + FORMID globalId; CLMTWLST(); ~CLMTWLST(); @@ -53,7 +53,7 @@ class CLMTRecord : public FNVRecord //Climate }; public: StringRecord EDID; //Editor ID - std::vector Weathers; //Weather Types + UnorderedPackedArray Weathers; //Weather Types StringRecord FNAM; //Sun Texture StringRecord GNAM; //Sun Glare Texture OptSubRecord MODL; //Model diff --git a/CBash/FalloutNewVegas/Records/REGNRecord.cpp b/CBash/FalloutNewVegas/Records/REGNRecord.cpp index 9f4b998..f319f06 100644 --- a/CBash/FalloutNewVegas/Records/REGNRecord.cpp +++ b/CBash/FalloutNewVegas/Records/REGNRecord.cpp @@ -21,9 +21,571 @@ GPL License and Copyright Notice ============================================ */ #include "..\..\Common.h" #include "REGNRecord.h" +#include namespace FNV { +REGNRecord::REGNRPLD::REGNRPLD(): + posX(0.0f), + posY(0.0f) + { + // + } + +REGNRecord::REGNRPLD::~REGNRPLD() + { + // + } + +bool REGNRecord::REGNRPLD::operator ==(const REGNRPLD &other) const + { + return (AlmostEqual(posX,other.posX,2) && + AlmostEqual(posY,other.posY,2)); + } + +bool REGNRecord::REGNRPLD::operator !=(const REGNRPLD &other) const + { + return !(*this == other); + } + +void REGNRecord::REGNArea::Write(FileWriter &writer) + { + WRITE(RPLI); + WRITE(RPLD); + } + +bool REGNRecord::REGNArea::operator ==(const REGNArea &other) const + { + return (RPLI == other.RPLI && + RPLD == other.RPLD); + } + +bool REGNRecord::REGNArea::operator !=(const REGNArea &other) const + { + return !(*this == other); + } + +REGNRecord::REGNRDWT::REGNRDWT(): + weather(0), + chance(0), + globalId(0) + { + // + } + +REGNRecord::REGNRDWT::~REGNRDWT() + { + // + } + +bool REGNRecord::REGNRDWT::operator ==(const REGNRDWT &other) const + { + return (weather == other.weather && + chance == other.chance && + globalId == other.globalId); + } + +bool REGNRecord::REGNRDWT::operator !=(const REGNRDWT &other) const + { + return !(*this == other); + } + +REGNRecord::REGNRDSD::REGNRDSD(): + sound(0), + flags(0), + chance(0) + { + // + } + +REGNRecord::REGNRDSD::~REGNRDSD() + { + // + } + +bool REGNRecord::REGNRDSD::IsPleasant() + { + return (flags & fIsPleasant) != 0; + } + +void REGNRecord::REGNRDSD::IsPleasant(bool value) + { + flags = value ? (flags | fIsPleasant) : (flags & ~fIsPleasant); + } + +bool REGNRecord::REGNRDSD::IsCloudy() + { + return (flags & fIsCloudy) != 0; + } + +void REGNRecord::REGNRDSD::IsCloudy(bool value) + { + flags = value ? (flags | fIsCloudy) : (flags & ~fIsCloudy); + } + +bool REGNRecord::REGNRDSD::IsRainy() + { + return (flags & fIsRainy) != 0; + } + +void REGNRecord::REGNRDSD::IsRainy(bool value) + { + flags = value ? (flags | fIsRainy) : (flags & ~fIsRainy); + } + +bool REGNRecord::REGNRDSD::IsSnowy() + { + return (flags & fIsSnowy) != 0; + } + +void REGNRecord::REGNRDSD::IsSnowy(bool value) + { + flags = value ? (flags | fIsSnowy) : (flags & ~fIsSnowy); + } + +bool REGNRecord::REGNRDSD::IsFlagMask(UINT32 Mask, bool Exact) + { + return Exact ? ((flags & Mask) == Mask) : ((flags & Mask) != 0); + } + +void REGNRecord::REGNRDSD::SetFlagMask(UINT32 Mask) + { + flags = Mask; + } + +bool REGNRecord::REGNRDSD::operator ==(const REGNRDSD &other) const + { + return (sound == other.sound && + flags == other.flags && + flags == other.flags); + } + +bool REGNRecord::REGNRDSD::operator !=(const REGNRDSD &other) const + { + return !(*this == other); + } + +REGNRecord::REGNRDGS::REGNRDGS(): + grass(0) + { + memset(&unk1[0], 0x00, sizeof(unk1)); + } + +REGNRecord::REGNRDGS::~REGNRDGS() + { + // + } + +bool REGNRecord::REGNRDGS::operator ==(const REGNRDGS &other) const + { + return (grass == other.grass); + } + +bool REGNRecord::REGNRDGS::operator !=(const REGNRDGS &other) const + { + return !(*this == other); + } + +REGNRecord::REGNRDOT::REGNRDOT(): + objectId(0), + parentIndex(0), + density(0.0f), + clustering(0), + minSlope(0), + maxSlope(0), + flags(0), + radiusWRTParent(0), + radius(0), + maxHeight(0.0f), + sink(0.0f), + sinkVar(0.0f), + sizeVar(0.0f), + angleVarX(0), + angleVarY(0), + angleVarZ(0) + { + memset(&unused1[0], 0x00, sizeof(unused1)); + memset(&unk1[0], 0x00, sizeof(unk1)); + memset(&unused2[0], 0x00, sizeof(unused2)); + memset(&unk2[0], 0x00, sizeof(unk2)); + } + +REGNRecord::REGNRDOT::~REGNRDOT() + { + // + } + +bool REGNRecord::REGNRDOT::IsConformToSlope() + { + return (flags & fIsConformToSlope) != 0; + } + +void REGNRecord::REGNRDOT::IsConformToSlope(bool value) + { + flags = value ? (flags | fIsConformToSlope) : (flags & ~fIsConformToSlope); + } + +bool REGNRecord::REGNRDOT::IsPaintVertices() + { + return (flags & fIsPaintVertices) != 0; + } + +void REGNRecord::REGNRDOT::IsPaintVertices(bool value) + { + flags = value ? (flags | fIsPaintVertices) : (flags & ~fIsPaintVertices); + } + +bool REGNRecord::REGNRDOT::IsSizeVariance() + { + return (flags & fIsSizeVariance) != 0; + } + +void REGNRecord::REGNRDOT::IsSizeVariance(bool value) + { + flags = value ? (flags | fIsSizeVariance) : (flags & ~fIsSizeVariance); + } + +bool REGNRecord::REGNRDOT::IsXVariance() + { + return (flags & fIsXVariance) != 0; + } + +void REGNRecord::REGNRDOT::IsXVariance(bool value) + { + flags = value ? (flags | fIsXVariance) : (flags & ~fIsXVariance); + } + +bool REGNRecord::REGNRDOT::IsYVariance() + { + return (flags & fIsYVariance) != 0; + } + +void REGNRecord::REGNRDOT::IsYVariance(bool value) + { + flags = value ? (flags | fIsYVariance) : (flags & ~fIsYVariance); + } + +bool REGNRecord::REGNRDOT::IsZVariance() + { + return (flags & fIsZVariance) != 0; + } + +void REGNRecord::REGNRDOT::IsZVariance(bool value) + { + flags = value ? (flags | fIsZVariance) : (flags & ~fIsZVariance); + } + +bool REGNRecord::REGNRDOT::IsTree() + { + return (flags & fIsTree) != 0; + } + +void REGNRecord::REGNRDOT::IsTree(bool value) + { + flags = value ? (flags | fIsTree) : (flags & ~fIsTree); + } + +bool REGNRecord::REGNRDOT::IsHugeRock() + { + return (flags & fIsHugeRock) != 0; + } + +void REGNRecord::REGNRDOT::IsHugeRock(bool value) + { + flags = value ? (flags | fIsHugeRock) : (flags & ~fIsHugeRock); + } + +bool REGNRecord::REGNRDOT::IsFlagMask(UINT8 Mask, bool Exact) + { + return Exact ? ((flags & Mask) == Mask) : ((flags & Mask) != 0); + } + +void REGNRecord::REGNRDOT::SetFlagMask(UINT8 Mask) + { + flags = Mask; + } + +bool REGNRecord::REGNRDOT::operator ==(const REGNRDOT &other) const + { + return (objectId == other.objectId && + parentIndex == other.parentIndex && + clustering == other.clustering && + minSlope == other.minSlope && + maxSlope == other.maxSlope && + flags == other.flags && + radiusWRTParent == other.radiusWRTParent && + radius == other.radius && + angleVarX == other.angleVarX && + angleVarY == other.angleVarY && + angleVarZ == other.angleVarZ && + AlmostEqual(density,other.density,2) && + AlmostEqual(maxHeight,other.maxHeight,2) && + AlmostEqual(sink,other.sink,2) && + AlmostEqual(sinkVar,other.sinkVar,2) && + AlmostEqual(sizeVar,other.sizeVar,2)); + } + +bool REGNRecord::REGNRDOT::operator !=(const REGNRDOT &other) const + { + return !(*this == other); + } + +REGNRecord::REGNRDAT::REGNRDAT(): + entryType(0), + flags(0), + priority(0) + { + memset(&unused1[0], 0x00, sizeof(unused1)); + } + +REGNRecord::REGNRDAT::~REGNRDAT() + { + // + } + +bool REGNRecord::REGNRDAT::operator ==(const REGNRDAT &other) const + { + return (entryType == other.entryType && + flags == other.flags && + priority == other.priority); + } + +bool REGNRecord::REGNRDAT::operator !=(const REGNRDAT &other) const + { + return !(*this == other); + } + +bool REGNRecord::REGNEntry::IsOverride() + { + return (RDAT.value.flags & fIsOverride) != 0; + } + +void REGNRecord::REGNEntry::IsOverride(bool value) + { + RDAT.value.flags = value ? (RDAT.value.flags | fIsOverride) : (RDAT.value.flags & ~fIsOverride); + } + +bool REGNRecord::REGNEntry::IsFlagMask(UINT8 Mask, bool Exact) + { + return Exact ? ((RDAT.value.flags & Mask) == Mask) : ((RDAT.value.flags & Mask) != 0); + } + +void REGNRecord::REGNEntry::SetFlagMask(UINT8 Mask) + { + RDAT.value.flags = Mask; + } + +bool REGNRecord::REGNEntry::IsObject() + { + return (RDAT.value.entryType == eObject); + } + +void REGNRecord::REGNEntry::IsObject(bool value) + { + if(value) + RDAT.value.entryType = eObject; + else if(IsObject()) + RDAT.value.entryType = eWeather; + } + +bool REGNRecord::REGNEntry::IsWeather() + { + return (RDAT.value.entryType == eWeather); + } + +void REGNRecord::REGNEntry::IsWeather(bool value) + { + if(value) + RDAT.value.entryType = eWeather; + else if(IsWeather()) + RDAT.value.entryType = eObject; + } + +bool REGNRecord::REGNEntry::IsMap() + { + return (RDAT.value.entryType == eMap); + } + +void REGNRecord::REGNEntry::IsMap(bool value) + { + if(value) + RDAT.value.entryType = eMap; + else if(IsMap()) + RDAT.value.entryType = eObject; + } + +bool REGNRecord::REGNEntry::IsLand() + { + return (RDAT.value.entryType == eLand); + } + +void REGNRecord::REGNEntry::IsLand(bool value) + { + if(value) + RDAT.value.entryType = eLand; + else if(IsLand()) + RDAT.value.entryType = eObject; + } + +bool REGNRecord::REGNEntry::IsGrass() + { + return (RDAT.value.entryType == eGrass); + } + +void REGNRecord::REGNEntry::IsGrass(bool value) + { + if(value) + RDAT.value.entryType = eGrass; + else if(IsGrass()) + RDAT.value.entryType = eObject; + } + +bool REGNRecord::REGNEntry::IsSound() + { + return (RDAT.value.entryType == eSound); + } + +void REGNRecord::REGNEntry::IsSound(bool value) + { + if(value) + RDAT.value.entryType = eSound; + else if(IsSound()) + RDAT.value.entryType = eObject; + } + +bool REGNRecord::REGNEntry::IsImposter() + { + return (RDAT.value.entryType == eImposter); + } + +void REGNRecord::REGNEntry::IsImposter(bool value) + { + if(value) + RDAT.value.entryType = eImposter; + else if(IsImposter()) + RDAT.value.entryType = eObject; + } + +bool REGNRecord::REGNEntry::IsType(UINT32 Type) + { + return (RDAT.value.entryType == Type); + } + +void REGNRecord::REGNEntry::SetType(UINT32 Type) + { + RDAT.value.entryType = Type; + } + +bool REGNRecord::REGNEntry::IsDefaultMusic() + { + return RDMD.IsLoaded() ? (*RDMD.value == eDefault) : false; + } + +void REGNRecord::REGNEntry::IsDefaultMusic(bool value) + { + RDMD.Load(); + if(value) + *RDMD.value = eDefault; + else if(IsDefaultMusic()) + *RDMD.value = ePublic; + } + +bool REGNRecord::REGNEntry::IsPublicMusic() + { + return RDMD.IsLoaded() ? (*RDMD.value == ePublic) : false; + } + +void REGNRecord::REGNEntry::IsPublicMusic(bool value) + { + RDMD.Load(); + if(value) + *RDMD.value = ePublic; + else if(IsPublicMusic()) + *RDMD.value = eDefault; + } + +bool REGNRecord::REGNEntry::IsDungeonMusic() + { + return RDMD.IsLoaded() ? (*RDMD.value == eDungeon) : false; + } + +void REGNRecord::REGNEntry::IsDungeonMusic(bool value) + { + RDMD.Load(); + if(value) + *RDMD.value = eDungeon; + else if(IsDungeonMusic()) + *RDMD.value = eDefault; + } + +bool REGNRecord::REGNEntry::IsMusicType(UINT32 Type) + { + return RDMD.IsLoaded() ? (*RDMD.value == Type) : false; + } + +void REGNRecord::REGNEntry::SetMusicType(UINT32 Type) + { + RDMD.Load(); + *RDMD.value = Type; + } + +void REGNRecord::REGNEntry::Write(FileWriter &writer) + { + WRITE(RDAT); + switch(RDAT.value.entryType) + { + case eObject: + WRITEREQ(RDOT); + break; + case eWeather: + WRITE(RDWT); + break; + case eMap: + WRITE(RDMP); + break; + case eLand: + WRITE(ICON); + break; + case eGrass: + WRITE(RDGS); + break; + case eSound: + WRITE(RDMD); + WRITE(RDMO); + WRITE(RDSI); + WRITE(RDSB); + WRITEREQ(RDSD); + break; + case eImposter: + WRITE(RDID); + break; + default: + //printf("!!!%08X: Unknown REGN Entry type: %i, Index:%i!!!\n", formID, RDAT.value.entryType, p); + break; + } + } + +bool REGNRecord::REGNEntry::operator ==(const REGNEntry &other) const + { + return (RDAT == other.RDAT && + RDMD == other.RDMD && + RDMO == other.RDMO && + RDSI == other.RDSI && + RDMP.equals(other.RDMP) && + ICON.equalsi(other.ICON) && + RDSB == other.RDSB && + RDID == other.RDID && + RDSD == other.RDSD && + RDGS == other.RDGS && + RDWT == other.RDWT && + RDOT == other.RDOT); + } + +bool REGNRecord::REGNEntry::operator !=(const REGNEntry &other) const + { + return !(*this == other); + } + REGNRecord::REGNRecord(unsigned char *_recData): FNVRecord(_recData) { @@ -55,19 +617,8 @@ REGNRecord::REGNRecord(REGNRecord *srcRecord): MICO = srcRecord->MICO; RCLR = srcRecord->RCLR; WNAM = srcRecord->WNAM; - RPLI = srcRecord->RPLI; - RPLD = srcRecord->RPLD; - RDAT = srcRecord->RDAT; - RDOT = srcRecord->RDOT; - RDMP = srcRecord->RDMP; - RDGS = srcRecord->RDGS; - RDMD = srcRecord->RDMD; - RDMO = srcRecord->RDMO; - RDSI = srcRecord->RDSI; - RDSB = srcRecord->RDSB; - RDSD = srcRecord->RDSD; - RDWT = srcRecord->RDWT; - RDID = srcRecord->RDID; + Areas = srcRecord->Areas; + Entries = srcRecord->Entries; return; } @@ -82,32 +633,39 @@ bool REGNRecord::VisitFormIDs(FormIDOp &op) return false; if(WNAM.IsLoaded()) - op.Accept(WNAM->value); - //if(RDOT.IsLoaded()) //FILL IN MANUALLY - // op.Accept(RDOT->value); - //if(RDGS.IsLoaded()) //FILL IN MANUALLY - // op.Accept(RDGS->value); - if(RDMO.IsLoaded()) - op.Accept(RDMO->value); - if(RDSI.IsLoaded()) - op.Accept(RDSI->value); - if(RDSB.IsLoaded()) - op.Accept(RDSB->value); - //if(RDSD.IsLoaded()) //FILL IN MANUALLY - // op.Accept(RDSD->value); - //if(RDWT.IsLoaded()) //FILL IN MANUALLY - // op.Accept(RDWT->value); - //if(RDID.IsLoaded()) //FILL IN MANUALLY - // op.Accept(RDID->value); + op.Accept(WNAM.value); + for(UINT32 x = 0; x < Entries.value.size(); x++) + { + for(UINT32 y = 0; y < Entries.value[x]->RDOT.value.size(); y++) + op.Accept(Entries.value[x]->RDOT.value[y].objectId); + for(UINT32 y = 0; y < Entries.value[x]->RDGS.value.size(); y++) + op.Accept(Entries.value[x]->RDGS.value[y].grass); + for(UINT32 y = 0; y < Entries.value[x]->RDSD.value.size(); y++) + op.Accept(Entries.value[x]->RDSD.value[y].sound); + for(UINT32 y = 0; y < Entries.value[x]->RDWT.value.size(); y++) + { + op.Accept(Entries.value[x]->RDWT.value[y].weather); + op.Accept(Entries.value[x]->RDWT.value[y].globalId); + } + if(Entries.value[x]->RDMO.IsLoaded()) + op.Accept(Entries.value[x]->RDMO.value); + if(Entries.value[x]->RDSI.IsLoaded()) + op.Accept(Entries.value[x]->RDSI.value); + for(UINT32 y = 0; y < Entries.value[x]->RDSB.value.size(); y++) + op.Accept(Entries.value[x]->RDSB.value[y]); + for(UINT32 y = 0; y < Entries.value[x]->RDID.value.size(); y++) + op.Accept(Entries.value[x]->RDID.value[y]); + } return op.Stop(); } UINT32 REGNRecord::GetType() { - return 'NGER'; + return REV32(REGN); } + STRING REGNRecord::GetStrType() { return "REGN"; @@ -135,59 +693,86 @@ SINT32 REGNRecord::ParseRecord(unsigned char *buffer, const UINT32 &recSize) } switch(subType) { - case 'DIDE': + case REV32(EDID): EDID.Read(buffer, subSize, curPos); break; - case 'NOCI': - ICON.Read(buffer, subSize, curPos); + case REV32(ICON): + if(Entries.value.size() != 0 && Entries.value.back()->IsLand()) + Entries.value.back()->ICON.Read(buffer, subSize, curPos); + else + ICON.Read(buffer, subSize, curPos); break; - case 'OCIM': + case REV32(MICO): MICO.Read(buffer, subSize, curPos); break; - case 'RLCR': + case REV32(RCLR): RCLR.Read(buffer, subSize, curPos); break; - case 'MANW': + case REV32(WNAM): WNAM.Read(buffer, subSize, curPos); break; - case 'ILPR': - RPLI.Read(buffer, subSize, curPos); + case REV32(RPLI): + Areas.value.push_back(new REGNArea); + Areas.value.back()->RPLI.Read(buffer, subSize, curPos); break; - case 'DLPR': - RPLD.Read(buffer, subSize, curPos); + case REV32(RPLD): + if(Areas.value.size() == 0) + Areas.value.push_back(new REGNArea); + Areas.value.back()->RPLD.Read(buffer, subSize, curPos); break; - case 'TADR': - RDAT.Read(buffer, subSize, curPos); + case REV32(RDAT): + Entries.value.push_back(new REGNEntry); + Entries.value.back()->RDAT.Read(buffer, subSize, curPos); break; - case 'TODR': - RDOT.Read(buffer, subSize, curPos); + case REV32(RDOT): + if(Entries.value.size() == 0) + Entries.value.push_back(new REGNEntry); + Entries.value.back()->RDOT.Read(buffer, subSize, curPos); break; - case 'PMDR': - RDMP.Read(buffer, subSize, curPos); + case REV32(RDMP): + if(Entries.value.size() == 0) + Entries.value.push_back(new REGNEntry); + Entries.value.back()->RDMP.Read(buffer, subSize, curPos); break; - case 'SGDR': - RDGS.Read(buffer, subSize, curPos); + case REV32(RDGS): + if(Entries.value.size() == 0) + Entries.value.push_back(new REGNEntry); + Entries.value.back()->RDGS.Read(buffer, subSize, curPos); break; - case 'DMDR': - RDMD.Read(buffer, subSize, curPos); + case REV32(RDMD): + if(Entries.value.size() == 0) + Entries.value.push_back(new REGNEntry); + Entries.value.back()->RDMD.Read(buffer, subSize, curPos); break; - case 'OMDR': - RDMO.Read(buffer, subSize, curPos); + case REV32(RDMO): + if(Entries.value.size() == 0) + Entries.value.push_back(new REGNEntry); + Entries.value.back()->RDMO.Read(buffer, subSize, curPos); break; - case 'ISDR': - RDSI.Read(buffer, subSize, curPos); + case REV32(RDSI): + if(Entries.value.size() == 0) + Entries.value.push_back(new REGNEntry); + Entries.value.back()->RDSI.Read(buffer, subSize, curPos); break; - case 'BSDR': - RDSB.Read(buffer, subSize, curPos); + case REV32(RDSB): + if(Entries.value.size() == 0) + Entries.value.push_back(new REGNEntry); + Entries.value.back()->RDSB.Read(buffer, subSize, curPos); break; - case 'DSDR': - RDSD.Read(buffer, subSize, curPos); + case REV32(RDSD): + if(Entries.value.size() == 0) + Entries.value.push_back(new REGNEntry); + Entries.value.back()->RDSD.Read(buffer, subSize, curPos); break; - case 'TWDR': - RDWT.Read(buffer, subSize, curPos); + case REV32(RDWT): + if(Entries.value.size() == 0) + Entries.value.push_back(new REGNEntry); + Entries.value.back()->RDWT.Read(buffer, subSize, curPos); break; - case 'DIDR': - RDID.Read(buffer, subSize, curPos); + case REV32(RDID): + if(Entries.value.size() == 0) + Entries.value.push_back(new REGNEntry); + Entries.value.back()->RDID.Read(buffer, subSize, curPos); break; default: //printf("FileName = %s\n", FileName); @@ -210,19 +795,8 @@ SINT32 REGNRecord::Unload() MICO.Unload(); RCLR.Unload(); WNAM.Unload(); - RPLI.Unload(); - RPLD.Unload(); - RDAT.Unload(); - RDOT.Unload(); - RDMP.Unload(); - RDGS.Unload(); - RDMD.Unload(); - RDMO.Unload(); - RDSI.Unload(); - RDSB.Unload(); - RDSD.Unload(); - RDWT.Unload(); - RDID.Unload(); + Areas.Unload(); + Entries.Unload(); return 1; } @@ -233,43 +807,22 @@ SINT32 REGNRecord::WriteRecord(FileWriter &writer) WRITE(MICO); WRITE(RCLR); WRITE(WNAM); - WRITE(RPLI); - WRITE(RPLD); - WRITE(RDAT); - WRITE(RDOT); - WRITE(RDMP); - WRITE(RDGS); - WRITE(RDMD); - WRITE(RDMO); - WRITE(RDSI); - WRITE(RDSB); - WRITE(RDSD); - WRITE(RDWT); - WRITE(RDID); - + Areas.Write(writer); + Entries.Write(writer); return -1; } bool REGNRecord::operator ==(const REGNRecord &other) const { - return (EDID.equalsi(other.EDID) && + return (RCLR == other.RCLR && + WNAM == other.WNAM && + EDID.equalsi(other.EDID) && ICON.equalsi(other.ICON) && MICO.equalsi(other.MICO) && - RCLR == other.RCLR && - WNAM == other.WNAM && - RPLI == other.RPLI && - RPLD == other.RPLD && - RDAT == other.RDAT && - RDOT == other.RDOT && - RDMP.equalsi(other.RDMP) && - RDGS == other.RDGS && - RDMD == other.RDMD && - RDMO == other.RDMO && - RDSI == other.RDSI && - RDSB == other.RDSB && - RDSD == other.RDSD && - RDWT == other.RDWT && - RDID == other.RDID); + Areas == other.Areas && + Entries == other.Entries); + + return false; } bool REGNRecord::operator !=(const REGNRecord &other) const diff --git a/CBash/FalloutNewVegas/Records/REGNRecord.h b/CBash/FalloutNewVegas/Records/REGNRecord.h index f65bdeb..d1a57e7 100644 --- a/CBash/FalloutNewVegas/Records/REGNRecord.h +++ b/CBash/FalloutNewVegas/Records/REGNRecord.h @@ -42,7 +42,9 @@ class REGNRecord : public FNVRecord //Region struct REGNArea { ReqSimpleSubRecord RPLI; // Edge Fall-off - std::vector RPLD; // Region Point List Data + UnorderedPackedArray RPLD; // Region Point List Data + + void Write(FileWriter &writer); bool operator ==(const REGNArea &other) const; bool operator !=(const REGNArea &other) const; @@ -52,7 +54,7 @@ class REGNRecord : public FNVRecord //Region { FORMID weather; UINT32 chance; - FORMID globalVar; + FORMID globalId; REGNRDWT(); ~REGNRDWT(); @@ -170,16 +172,17 @@ class REGNRecord : public FNVRecord //Region struct REGNEntry // Region Data Entry { ReqSubRecord RDAT; // Data Header - std::vector RDOT; // Objects + UnorderedPackedArray RDOT; // Objects StringRecord RDMP; //Map Name - std::vector RDGS; // Grasses + StringRecord ICON; //Unknown + UnorderedPackedArray RDGS; // Grasses SemiOptSimpleSubRecord RDMD; // Music Type OptSimpleSubRecord RDMO; //Music OptSimpleSubRecord RDSI; //Incidental MediaSet - std::vector RDSB; //Battle MediaSets - std::vector RDSD; // Sounds - std::vector RDWT; // Weather Types - std::vector RDID; //Imposters + UnorderedSparseArray RDSB; //Battle MediaSets + UnorderedPackedArray RDSD; // Sounds + UnorderedPackedArray RDWT; // Weather Types + UnorderedPackedArray RDID; //Imposters enum RDATFlags { @@ -235,30 +238,20 @@ class REGNRecord : public FNVRecord //Region bool IsMusicType(UINT32 Type); void SetMusicType(UINT32 Type); + void Write(FileWriter &writer); + bool operator ==(const REGNEntry &other) const; bool operator !=(const REGNEntry &other) const; }; - enum eREGNType - { - eREGNObjects = 2, - eREGNWeathers = 3, - eREGNMap = 4, - eREGNIcon = 5, - eREGNGrasses = 6, - eREGNSounds = 7 - }; - - public: - public: StringRecord EDID; //Editor ID StringRecord ICON; //Large Icon Filename StringRecord MICO; //Small Icon Filename - OptSubRecord RCLR; //Map Color + ReqSubRecord RCLR; //Map Color OptSimpleSubRecord WNAM; //Worldspace - std::vector Areas; // Areas - std::vector Entries; // Region Data Entries + UnorderedSparseArray Areas; // Areas + UnorderedSparseArray Entries; // Region Data Entries REGNRecord(unsigned char *_recData=NULL); REGNRecord(REGNRecord *srcRecord); diff --git a/CBash/FalloutNewVegas/Records/WTHRRecord.cpp b/CBash/FalloutNewVegas/Records/WTHRRecord.cpp index 01a6d51..ab5145c 100644 --- a/CBash/FalloutNewVegas/Records/WTHRRecord.cpp +++ b/CBash/FalloutNewVegas/Records/WTHRRecord.cpp @@ -24,6 +24,245 @@ GPL License and Copyright Notice ============================================ namespace FNV { +WTHRRecord::WTHRONAM::WTHRONAM(): + layer0Speed(0), + layer1Speed(0), + layer2Speed(0), + layer3Speed(0) + { + // + } + +WTHRRecord::WTHRONAM::~WTHRONAM() + { + // + } + +bool WTHRRecord::WTHRONAM::operator ==(const WTHRONAM &other) const + { + return (layer0Speed == other.layer0Speed && + layer1Speed == other.layer1Speed && + layer2Speed == other.layer2Speed && + layer3Speed == other.layer3Speed); + } + +bool WTHRRecord::WTHRONAM::operator !=(const WTHRONAM &other) const + { + return !(*this == other); + } + + +bool WTHRRecord::WTHRColors::operator ==(const WTHRColors &other) const + { + return (rise == other.rise && + day == other.day && + set == other.set && + night == other.night && + noon == other.noon && + midnight == other.midnight); + } + +bool WTHRRecord::WTHRColors::operator !=(const WTHRColors &other) const + { + return !(*this == other); + } + +bool WTHRRecord::WTHRNAM0::operator ==(const WTHRNAM0 &other) const + { + return (upperSky == other.upperSky && + fog == other.fog && + lowerClouds == other.lowerClouds && + ambient == other.ambient && + sunlight == other.sunlight && + sun == other.sun && + stars == other.stars && + lowerSky == other.lowerSky && + horizon == other.horizon && + upperClouds == other.upperClouds); + } + +bool WTHRRecord::WTHRNAM0::operator !=(const WTHRNAM0 &other) const + { + return !(*this == other); + } + +WTHRRecord::WTHRFNAM::WTHRFNAM(): + fogDayNear(0.0f), + fogDayFar(0.0f), + fogNightNear(0.0f), + fogNightFar(0.0f), + fogDayPower(0.0f), + fogNightPower(0.0f) + { + // + } + +WTHRRecord::WTHRFNAM::~WTHRFNAM() + { + // + } + +bool WTHRRecord::WTHRFNAM::operator ==(const WTHRFNAM &other) const + { + return (AlmostEqual(fogDayNear,other.fogDayNear,2) && + AlmostEqual(fogDayFar,other.fogDayFar,2) && + AlmostEqual(fogNightNear,other.fogNightNear,2) && + AlmostEqual(fogNightFar,other.fogNightFar,2) && + AlmostEqual(fogDayPower,other.fogDayPower,2) && + AlmostEqual(fogNightPower,other.fogNightPower,2)); + } + +bool WTHRRecord::WTHRFNAM::operator !=(const WTHRFNAM &other) const + { + return !(*this == other); + } + +WTHRRecord::WTHRDATA::WTHRDATA(): + windSpeed(0), + lowerCloudSpeed(0), + upperCloudSpeed(0), + transDelta(0), + sunGlare(0), + sunDamage(0), + rainFadeIn(0), + rainFadeOut(0), + boltFadeIn(0), + boltFadeOut(0), + boltFrequency(0), + weatherType(0), + boltRed(0), + boltGreen(0), + boltBlue(0) + { + // + } + +WTHRRecord::WTHRDATA::~WTHRDATA() + { + // + } + +bool WTHRRecord::WTHRDATA::operator ==(const WTHRDATA &other) const + { + return (windSpeed == other.windSpeed && + lowerCloudSpeed == other.lowerCloudSpeed && + upperCloudSpeed == other.upperCloudSpeed && + transDelta == other.transDelta && + sunGlare == other.sunGlare && + sunDamage == other.sunDamage && + rainFadeIn == other.rainFadeIn && + rainFadeOut == other.rainFadeOut && + boltFadeIn == other.boltFadeIn && + boltFadeOut == other.boltFadeOut && + boltFrequency == other.boltFrequency && + weatherType == other.weatherType && + boltRed == other.boltRed && + boltGreen == other.boltGreen && + boltBlue == other.boltBlue); + } + +bool WTHRRecord::WTHRDATA::operator !=(const WTHRDATA &other) const + { + return !(*this == other); + } + +WTHRRecord::WTHRSNAM::WTHRSNAM(): + sound(0), + type(0) + { + // + } + +WTHRRecord::WTHRSNAM::~WTHRSNAM() + { + // + } + +bool WTHRRecord::WTHRSNAM::IsDefault() + { + return (type == eDefault); + } + +void WTHRRecord::WTHRSNAM::IsDefault(bool value) + { + if(value) + type = eDefault; + else if(IsDefault()) + type = ePrecip; + } + +bool WTHRRecord::WTHRSNAM::IsPrecip() + { + return (type == ePrecip); + } + +void WTHRRecord::WTHRSNAM::IsPrecip(bool value) + { + if(value) + type = ePrecip; + else if(IsPrecip()) + type = eDefault; + } + +bool WTHRRecord::WTHRSNAM::IsPrecipitation() + { + return (type == ePrecip); + } + +void WTHRRecord::WTHRSNAM::IsPrecipitation(bool value) + { + if(value) + type = ePrecip; + else if(IsPrecipitation()) + type = eDefault; + } + +bool WTHRRecord::WTHRSNAM::IsWind() + { + return (type == eWind); + } + +void WTHRRecord::WTHRSNAM::IsWind(bool value) + { + if(value) + type = eWind; + else if(IsWind()) + type = eDefault; + } + +bool WTHRRecord::WTHRSNAM::IsThunder() + { + return (type == eThunder); + } + +void WTHRRecord::WTHRSNAM::IsThunder(bool value) + { + if(value) + type = eThunder; + else if(IsThunder()) + type = eDefault; + } + +bool WTHRRecord::WTHRSNAM::IsType(UINT32 Type) + { + return (type == Type); + } + +void WTHRRecord::WTHRSNAM::SetType(UINT32 Type) + { + type = Type; + } + +bool WTHRRecord::WTHRSNAM::operator ==(const WTHRSNAM &other) const + { + return (sound == other.sound && + type == other.type); + } +bool WTHRRecord::WTHRSNAM::operator !=(const WTHRSNAM &other) const + { + return !(*this == other); + } + WTHRRecord::WTHRRecord(unsigned char *_recData): FNVRecord(_recData) { @@ -51,19 +290,17 @@ WTHRRecord::WTHRRecord(WTHRRecord *srcRecord): } EDID = srcRecord->EDID; - 0IAD = srcRecord->0IAD; - 1IAD = srcRecord->1IAD; - 2IAD = srcRecord->2IAD; - 3IAD = srcRecord->3IAD; - 4IAD = srcRecord->4IAD; - 5IAD = srcRecord->5IAD; + _0IAD = srcRecord->_0IAD; + _1IAD = srcRecord->_1IAD; + _2IAD = srcRecord->_2IAD; + _3IAD = srcRecord->_3IAD; + _4IAD = srcRecord->_4IAD; + _5IAD = srcRecord->_5IAD; DNAM = srcRecord->DNAM; CNAM = srcRecord->CNAM; ANAM = srcRecord->ANAM; BNAM = srcRecord->BNAM; - MODL = srcRecord->MODL; - LNAM = srcRecord->LNAM; ONAM = srcRecord->ONAM; PNAM = srcRecord->PNAM; @@ -71,7 +308,7 @@ WTHRRecord::WTHRRecord(WTHRRecord *srcRecord): FNAM = srcRecord->FNAM; INAM = srcRecord->INAM; DATA = srcRecord->DATA; - SNAM = srcRecord->SNAM; + Sounds = srcRecord->Sounds; return; } @@ -85,22 +322,25 @@ bool WTHRRecord::VisitFormIDs(FormIDOp &op) if(!IsLoaded()) return false; - if(0IAD.IsLoaded()) - op.Accept(0IAD->value); - if(1IAD.IsLoaded()) - op.Accept(1IAD->value); - if(2IAD.IsLoaded()) - op.Accept(2IAD->value); - if(3IAD.IsLoaded()) - op.Accept(3IAD->value); - if(4IAD.IsLoaded()) - op.Accept(4IAD->value); - if(5IAD.IsLoaded()) - op.Accept(5IAD->value); - if(MODL.IsLoaded() && MODL->MODS.IsLoaded()) - op.Accept(MODL->MODS->value); - //if(SNAM.IsLoaded()) //FILL IN MANUALLY - // op.Accept(SNAM->value); + if(_0IAD.IsLoaded()) + op.Accept(_0IAD.value); + if(_1IAD.IsLoaded()) + op.Accept(_1IAD.value); + if(_2IAD.IsLoaded()) + op.Accept(_2IAD.value); + if(_3IAD.IsLoaded()) + op.Accept(_3IAD.value); + if(_4IAD.IsLoaded()) + op.Accept(_4IAD.value); + if(_5IAD.IsLoaded()) + op.Accept(_5IAD.value); + if(MODL.IsLoaded()) + { + for(UINT32 x = 0; x < MODL->Textures.MODS.size(); x++) + op.Accept(MODL->Textures.MODS[x]->texture); + } + for(UINT32 x = 0; x < Sounds.value.size(); x++) + op.Accept(Sounds.value[x]->sound); return op.Stop(); } @@ -262,7 +502,7 @@ void WTHRRecord::SetFlagMask(UINT8 Mask) UINT32 WTHRRecord::GetType() { - return 'RHTW'; + return REV32(WTHR); } STRING WTHRRecord::GetStrType() @@ -292,82 +532,85 @@ SINT32 WTHRRecord::ParseRecord(unsigned char *buffer, const UINT32 &recSize) } switch(subType) { - case 'DIDE': + case REV32(EDID): EDID.Read(buffer, subSize, curPos); break; - case 'DAI0': - 0IAD.Read(buffer, subSize, curPos); + case REV32(_IAD) & 0xFFFFFF00 | 0x00: + //Unlike all other sigs, IAD's use 0x00, 0x01, etc instead of the character 0, 1, etc + //So this oddity has to be compensated for + //The above nonsense gets optimized away, so there's no runtime cost + _0IAD.Read(buffer, subSize, curPos); break; - case 'DAI1': - 1IAD.Read(buffer, subSize, curPos); + case REV32(_IAD) & 0xFFFFFF00 | 0x01: + _1IAD.Read(buffer, subSize, curPos); break; - case 'DAI2': - 2IAD.Read(buffer, subSize, curPos); + case REV32(_IAD) & 0xFFFFFF00 | 0x02: + _2IAD.Read(buffer, subSize, curPos); break; - case 'DAI3': - 3IAD.Read(buffer, subSize, curPos); + case REV32(_IAD) & 0xFFFFFF00 | 0x03: + _3IAD.Read(buffer, subSize, curPos); break; - case 'DAI4': - 4IAD.Read(buffer, subSize, curPos); + case REV32(_IAD) & 0xFFFFFF00 | 0x04: + _4IAD.Read(buffer, subSize, curPos); break; - case 'DAI5': - 5IAD.Read(buffer, subSize, curPos); + case REV32(_IAD) & 0xFFFFFF00 | 0x05: + _5IAD.Read(buffer, subSize, curPos); break; - case 'MAND': + case REV32(DNAM): DNAM.Read(buffer, subSize, curPos); break; - case 'MANC': + case REV32(CNAM): CNAM.Read(buffer, subSize, curPos); break; - case 'MANA': + case REV32(ANAM): ANAM.Read(buffer, subSize, curPos); break; - case 'MANB': + case REV32(BNAM): BNAM.Read(buffer, subSize, curPos); break; - case 'LDOM': + case REV32(MODL): MODL.Load(); MODL->MODL.Read(buffer, subSize, curPos); break; - case 'BDOM': + case REV32(MODB): MODL.Load(); MODL->MODB.Read(buffer, subSize, curPos); break; - case 'TDOM': + case REV32(MODT): MODL.Load(); MODL->MODT.Read(buffer, subSize, curPos); break; - case 'SDOM': + case REV32(MODS): MODL.Load(); MODL->Textures.Read(buffer, subSize, curPos); break; - case 'DDOM': + case REV32(MODD): MODL.Load(); MODL->MODD.Read(buffer, subSize, curPos); break; - case 'MANL': + case REV32(LNAM): LNAM.Read(buffer, subSize, curPos); break; - case 'MANO': + case REV32(ONAM): ONAM.Read(buffer, subSize, curPos); break; - case 'MANP': + case REV32(PNAM): PNAM.Read(buffer, subSize, curPos); break; - case '0MAN': + case REV32(NAM0): NAM0.Read(buffer, subSize, curPos); break; - case 'MANF': + case REV32(FNAM): FNAM.Read(buffer, subSize, curPos); break; - case 'MANI': + case REV32(INAM): INAM.Read(buffer, subSize, curPos); break; - case 'ATAD': + case REV32(DATA): DATA.Read(buffer, subSize, curPos); break; - case 'MANS': - SNAM.Read(buffer, subSize, curPos); + case REV32(SNAM): + Sounds.Read(buffer, subSize, curPos); break; default: //printf("FileName = %s\n", FileName); @@ -386,12 +629,12 @@ SINT32 WTHRRecord::Unload() IsChanged(false); IsLoaded(false); EDID.Unload(); - 0IAD.Unload(); - 1IAD.Unload(); - 2IAD.Unload(); - 3IAD.Unload(); - 4IAD.Unload(); - 5IAD.Unload(); + _0IAD.Unload(); + _1IAD.Unload(); + _2IAD.Unload(); + _3IAD.Unload(); + _4IAD.Unload(); + _5IAD.Unload(); DNAM.Unload(); CNAM.Unload(); ANAM.Unload(); @@ -404,26 +647,24 @@ SINT32 WTHRRecord::Unload() FNAM.Unload(); INAM.Unload(); DATA.Unload(); - SNAM.Unload(); + Sounds.Unload(); return 1; } SINT32 WTHRRecord::WriteRecord(FileWriter &writer) { WRITE(EDID); - WRITE(0IAD); - WRITE(1IAD); - WRITE(2IAD); - WRITE(3IAD); - WRITE(4IAD); - WRITE(5IAD); + _0IAD.Write(REV32(_IAD) & 0xFFFFFF00 | 0x00, writer); + _1IAD.Write(REV32(_IAD) & 0xFFFFFF00 | 0x01, writer); + _2IAD.Write(REV32(_IAD) & 0xFFFFFF00 | 0x02, writer); + _3IAD.Write(REV32(_IAD) & 0xFFFFFF00 | 0x03, writer); + _4IAD.Write(REV32(_IAD) & 0xFFFFFF00 | 0x04, writer); + _5IAD.Write(REV32(_IAD) & 0xFFFFFF00 | 0x05, writer); WRITE(DNAM); WRITE(CNAM); WRITE(ANAM); WRITE(BNAM); - MODL.Write(writer); - WRITE(LNAM); WRITE(ONAM); WRITE(PNAM); @@ -431,33 +672,32 @@ SINT32 WTHRRecord::WriteRecord(FileWriter &writer) WRITE(FNAM); WRITE(INAM); WRITE(DATA); - WRITE(SNAM); - + WRITEAS(Sounds, SNAM); return -1; } bool WTHRRecord::operator ==(const WTHRRecord &other) const { - return (EDID.equalsi(other.EDID) && - 0IAD == other.0IAD && - 1IAD == other.1IAD && - 2IAD == other.2IAD && - 3IAD == other.3IAD && - 4IAD == other.4IAD && - 5IAD == other.5IAD && - DNAM.equalsi(other.DNAM) && - CNAM.equalsi(other.CNAM) && - ANAM.equalsi(other.ANAM) && - BNAM.equalsi(other.BNAM) && + return (_0IAD == other._0IAD && + _1IAD == other._1IAD && + _2IAD == other._2IAD && + _3IAD == other._3IAD && + _4IAD == other._4IAD && + _5IAD == other._5IAD && MODL == other.MODL && LNAM == other.LNAM && ONAM == other.ONAM && - PNAM == other.PNAM && NAM0 == other.NAM0 && - FNAM == other.FNAM && - INAM == other.INAM && DATA == other.DATA && - SNAM == other.SNAM); + INAM == other.INAM && + PNAM == other.PNAM && + EDID.equalsi(other.EDID) && + DNAM.equalsi(other.DNAM) && + CNAM.equalsi(other.CNAM) && + ANAM.equalsi(other.ANAM) && + BNAM.equalsi(other.BNAM) && + FNAM == other.FNAM && + Sounds == other.Sounds); } bool WTHRRecord::operator !=(const WTHRRecord &other) const diff --git a/CBash/FalloutNewVegas/Records/WTHRRecord.h b/CBash/FalloutNewVegas/Records/WTHRRecord.h index 619bf4b..8a23f14 100644 --- a/CBash/FalloutNewVegas/Records/WTHRRecord.h +++ b/CBash/FalloutNewVegas/Records/WTHRRecord.h @@ -141,25 +141,25 @@ class WTHRRecord : public FNVRecord //Weather public: StringRecord EDID; //Editor ID - OptSimpleSubRecord 0IAD; //Sunrise Image Space Modifier - OptSimpleSubRecord 1IAD; //Day Image Space Modifier - OptSimpleSubRecord 2IAD; //Sunset Image Space Modifier - OptSimpleSubRecord 3IAD; //Night Image Space Modifier - OptSimpleSubRecord 4IAD; //Unknown - OptSimpleSubRecord 5IAD; //Unknown + OptSimpleSubRecord _0IAD; //Sunrise Image Space Modifier + OptSimpleSubRecord _1IAD; //Day Image Space Modifier + OptSimpleSubRecord _2IAD; //Sunset Image Space Modifier + OptSimpleSubRecord _3IAD; //Night Image Space Modifier + OptSimpleSubRecord _4IAD; //Unknown + OptSimpleSubRecord _5IAD; //Unknown StringRecord DNAM; //Cloud Textures - Layer 0 StringRecord CNAM; //Cloud Textures - Layer 1 StringRecord ANAM; //Cloud Textures - Layer 2 StringRecord BNAM; //Cloud Textures - Layer 3 OptSubRecord MODL; //Model - RawRecord LNAM; //Unknown + ReqSimpleSubRecord LNAM; //Unknown OptSubRecord ONAM; //Cloud Speeds RawRecord PNAM; //Unused ReqSubRecord NAM0; //Colors by Types/Times - OptSubRecord FNAM; //Fog Distance + ReqSubRecord FNAM; //Fog Distance RawRecord INAM; //Unused - OptSubRecord DATA; //Data - std::vector *> Sounds; // Sounds + ReqSubRecord DATA; //Data + UnorderedSparseArray Sounds; // Sounds WTHRRecord(unsigned char *_recData=NULL); WTHRRecord(WTHRRecord *srcRecord); diff --git a/CBash/Oblivion/Records/API/WTHRRecordAPI.cpp b/CBash/Oblivion/Records/API/WTHRRecordAPI.cpp index 143c533..2c42653 100644 --- a/CBash/Oblivion/Records/API/WTHRRecordAPI.cpp +++ b/CBash/Oblivion/Records/API/WTHRRecordAPI.cpp @@ -2550,7 +2550,6 @@ void WTHRRecord::DeleteField(FIELD_IDENTIFIERS) case 169: //upperClouds.night.unused1 NAM0.value.upperClouds.night.unused1 = defaultCLR.unused1; return; - case 170: //fogDayNear FNAM.value.fogDayNear = defaultFNAM.fogDayNear; return; @@ -2563,7 +2562,6 @@ void WTHRRecord::DeleteField(FIELD_IDENTIFIERS) case 173: //fogNightFar FNAM.value.fogNightFar = defaultFNAM.fogNightFar; return; - case 174: //eyeAdaptSpeed HNAM.value.eyeAdaptSpeed = defaultHNAM.eyeAdaptSpeed; return; @@ -2606,7 +2604,6 @@ void WTHRRecord::DeleteField(FIELD_IDENTIFIERS) case 187: //treeDimmer HNAM.value.treeDimmer = defaultHNAM.treeDimmer; return; - case 188: //windSpeed DATA.value.windSpeed = defaultDATA.windSpeed; return; diff --git a/release/CBash.dll b/release/CBash.dll index c946677..1f90695 100644 Binary files a/release/CBash.dll and b/release/CBash.dll differ diff --git a/release/FNVTest.py b/release/FNVTest.py index 97535a1..b5647b4 100644 --- a/release/FNVTest.py +++ b/release/FNVTest.py @@ -145,14 +145,14 @@ def TestRegressions(): #### assertKEYM(Current, newMod) #### assertALCH(Current, newMod) #### newMod.save() - assertIDLM(Current, newMod) - assertNOTE(Current, newMod) - assertCOBJ(Current, newMod) - assertPROJ(Current, newMod) - assertLVLI(Current, newMod) - ## assertWTHR(Current, newMod) - ## assertCLMT(Current, newMod) - ## assertREGN(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) ## assertWRLD(Current, newMod) diff --git a/release/cint-template.py b/release/cint-template.py index 7b3777f..dd2ee84 100644 --- a/release/cint-template.py +++ b/release/cint-template.py @@ -5428,18 +5428,330 @@ class Entry(ListComponent): class FnvWTHRRecord(FnvBaseRecord): _Type = 'WTHR' + class WTHRColor(BaseComponent): + UINT8_GROUPEDMACRO(riseRed, 0) + UINT8_GROUPEDMACRO(riseGreen, 1) + UINT8_GROUPEDMACRO(riseBlue, 2) + UINT8_ARRAY_GROUPEDMACRO(unused1, 3, 1) + UINT8_GROUPEDMACRO(dayRed, 4) + UINT8_GROUPEDMACRO(dayGreen, 5) + UINT8_GROUPEDMACRO(dayBlue, 6) + UINT8_ARRAY_GROUPEDMACRO(unused2, 7, 1) + UINT8_GROUPEDMACRO(setRed, 8) + UINT8_GROUPEDMACRO(setGreen, 9) + UINT8_GROUPEDMACRO(setBlue, 10) + UINT8_ARRAY_GROUPEDMACRO(unused3, 11, 1) + UINT8_GROUPEDMACRO(nightRed, 12) + UINT8_GROUPEDMACRO(nightGreen, 13) + UINT8_GROUPEDMACRO(nightBlue, 14) + UINT8_ARRAY_GROUPEDMACRO(unused4, 15, 1) + + UINT8_GROUPEDMACRO(noonRed, 16) + UINT8_GROUPEDMACRO(noonGreen, 17) + UINT8_GROUPEDMACRO(noonBlue, 18) + UINT8_ARRAY_GROUPEDMACRO(unused5, 19, 1) + + UINT8_GROUPEDMACRO(midnightRed, 20) + UINT8_GROUPEDMACRO(midnightGreen, 21) + UINT8_GROUPEDMACRO(midnightBlue, 22) + UINT8_ARRAY_GROUPEDMACRO(unused6, 23, 1) + exportattrs = copyattrs = ['riseRed', 'riseGreen', 'riseBlue', + 'dayRed', 'dayGreen', 'dayBlue', + 'setRed', 'setGreen', 'setBlue', + 'nightRed', 'nightGreen', 'nightBlue', + 'noonRed', 'noonGreen', 'noonBlue', + 'midnightRed', 'midnightGreen', 'midnightBlue'] - exportattrs = copyattrs = FnvBaseRecord.baseattrs + [] + class Sound(ListComponent): + FORMID_LISTMACRO(sound, 1) + UINT32_TYPE_LISTMACRO(type, 2) + BasicTypeMACRO(IsDefault, type, 0, IsPrecip) + BasicTypeMACRO(IsPrecipitation, type, 1, IsDefault) + BasicAliasMACRO(IsPrecip, IsPrecipitation) + BasicTypeMACRO(IsWind, type, 2, IsDefault) + BasicTypeMACRO(IsThunder, type, 3, IsDefault) + exportattrs = copyattrs = ['sound', 'type'] + + FORMID_MACRO(sunriseImageSpace, 7) + FORMID_MACRO(dayImageSpace, 8) + FORMID_MACRO(sunsetImageSpace, 9) + FORMID_MACRO(nightImageSpace, 10) + FORMID_MACRO(unknown1ImageSpace, 11) + FORMID_MACRO(unknown2ImageSpace, 12) + ISTRING_MACRO(cloudLayer0Path, 13) + ISTRING_MACRO(cloudLayer1Path, 14) + ISTRING_MACRO(cloudLayer2Path, 15) + ISTRING_MACRO(cloudLayer3Path, 16) + ISTRING_MACRO(modPath, 17) + FLOAT32_MACRO(modb, 18) + UINT8_ARRAY_MACRO(modt_p, 19) + + LIST_MACRO(altTextures, 20, FNVAltTexture) + UINT8_FLAG_MACRO(modelFlags, 21) + UINT32_MACRO(unknown1, 22) + UINT8_MACRO(layer0Speed, 23) + UINT8_MACRO(layer1Speed, 24) + UINT8_MACRO(layer2Speed, 25) + UINT8_MACRO(layer3Speed, 26) + UINT8_ARRAY_MACRO(pnam_p, 27) + GroupedValuesMACRO(upperSky, 28, WTHRColor) + GroupedValuesMACRO(fog, 52, WTHRColor) + GroupedValuesMACRO(lowerClouds, 76, WTHRColor) + GroupedValuesMACRO(ambient, 100, WTHRColor) + GroupedValuesMACRO(sunlight, 124, WTHRColor) + GroupedValuesMACRO(sun, 148, WTHRColor) + GroupedValuesMACRO(stars, 172, WTHRColor) + GroupedValuesMACRO(lowerSky, 196, WTHRColor) + GroupedValuesMACRO(horizon, 220, WTHRColor) + GroupedValuesMACRO(upperClouds, 244, WTHRColor) + FLOAT32_MACRO(fogDayNear, 268) + FLOAT32_MACRO(fogDayFar, 269) + FLOAT32_MACRO(fogNightNear, 270) + FLOAT32_MACRO(fogNightFar, 271) + FLOAT32_MACRO(fogDayPower, 272) + FLOAT32_MACRO(fogNightPower, 273) + UINT8_ARRAY_MACRO(inam_p, 274) + UINT8_MACRO(windSpeed, 275) + UINT8_MACRO(lowerCloudSpeed, 276) + UINT8_MACRO(upperCloudSpeed, 277) + UINT8_MACRO(transDelta, 278) + UINT8_MACRO(sunGlare, 279) + UINT8_MACRO(sunDamage, 280) + UINT8_MACRO(rainFadeIn, 281) + UINT8_MACRO(rainFadeOut, 282) + UINT8_MACRO(boltFadeIn, 283) + UINT8_MACRO(boltFadeOut, 284) + UINT8_MACRO(boltFrequency, 285) + UINT8_TYPE_MACRO(weatherType, 286) + UINT8_MACRO(boltRed, 287) + UINT8_MACRO(boltGreen, 288) + UINT8_MACRO(boltBlue, 289) + + LIST_MACRO(sounds, 290, self.Sound) + ##actually flags, but all are exclusive(except unknowns)...so like a Type + ##Manual hackery will make the CS think it is multiple types. It isn't known how the game would react. + MaskedTypeMACRO(IsNone, weatherType, 0x0F, 0x00, IsPleasant) + MaskedTypeMACRO(IsPleasant, weatherType, 0x0F, 0x01, IsNone) + MaskedTypeMACRO(IsCloudy, weatherType, 0x0F, 0x02, IsNone) + MaskedTypeMACRO(IsRainy, weatherType, 0x0F, 0x04, IsNone) + MaskedTypeMACRO(IsSnow, weatherType, 0x0F, 0x08, IsNone) + BasicFlagMACRO(IsUnk1, weatherType, 0x40) + BasicFlagMACRO(IsUnk2, weatherType, 0x80) + copyattrs = FnvBaseRecord.baseattrs + ['sunriseImageSpace', 'dayImageSpace', + 'sunsetImageSpace', 'nightImageSpace', + 'unknown1ImageSpace', 'unknown2ImageSpace', + 'cloudLayer0Path', 'cloudLayer1Path', + 'cloudLayer2Path', 'cloudLayer3Path', + 'modPath', 'modb', 'modt_p', + 'altTextures_list', 'modelFlags', + 'unknown1', 'layer0Speed', 'layer1Speed', + 'layer2Speed', 'layer3Speed', 'pnam_p', + 'upperSky_list', 'fog_list', + 'lowerClouds_list', 'ambient_list', + 'sunlight_list', 'sun_list', 'stars_list', + 'lowerSky_list', 'horizon_list', + 'upperClouds_list', 'fogDayNear', + 'fogDayFar', 'fogNightNear', + 'fogNightFar', 'fogDayPower', + 'fogNightPower', 'inam_p', 'windSpeed', + 'lowerCloudSpeed', 'upperCloudSpeed', + 'transDelta', 'sunGlare', 'sunDamage', + 'rainFadeIn', 'rainFadeOut', + 'boltFadeIn', 'boltFadeOut', + 'boltFrequency', 'weatherType', + 'boltRed', 'boltGreen', 'boltBlue', + 'sounds_list'] + exportattrs = FnvBaseRecord.baseattrs + ['sunriseImageSpace', 'dayImageSpace', + 'sunsetImageSpace', 'nightImageSpace', + 'unknown1ImageSpace', 'unknown2ImageSpace', + 'cloudLayer0Path', 'cloudLayer1Path', + 'cloudLayer2Path', 'cloudLayer3Path', + 'modPath', 'modb', + 'altTextures_list', 'modelFlags', + 'unknown1', 'layer0Speed', 'layer1Speed', + 'layer2Speed', 'layer3Speed', + 'upperSky_list', 'fog_list', + 'lowerClouds_list', 'ambient_list', + 'sunlight_list', 'sun_list', 'stars_list', + 'lowerSky_list', 'horizon_list', + 'upperClouds_list', 'fogDayNear', + 'fogDayFar', 'fogNightNear', + 'fogNightFar', 'fogDayPower', + 'fogNightPower', 'windSpeed', + 'lowerCloudSpeed', 'upperCloudSpeed', + 'transDelta', 'sunGlare', 'sunDamage', + 'rainFadeIn', 'rainFadeOut', + 'boltFadeIn', 'boltFadeOut', + 'boltFrequency', 'weatherType', + 'boltRed', 'boltGreen', 'boltBlue', + 'sounds_list']# 'modt_p', 'pnam_p', 'inam_p', class FnvCLMTRecord(FnvBaseRecord): _Type = 'CLMT' + class Weather(ListComponent): + FORMID_LISTMACRO(weather, 1) + SINT32_LISTMACRO(chance, 2) + FORMID_LISTMACRO(globalId, 3) + copyattrs = ['weather', 'chance', 'globalId'] + + LIST_MACRO(weathers, 7, self.Weather) + ISTRING_MACRO(sunPath, 8) + ISTRING_MACRO(glarePath, 9) + ISTRING_MACRO(modPath, 10) + FLOAT32_MACRO(modb, 11) + UINT8_ARRAY_MACRO(modt_p, 12) + + LIST_MACRO(altTextures, 13, FNVAltTexture) + UINT8_FLAG_MACRO(modelFlags, 14) + UINT8_MACRO(riseBegin, 15) + UINT8_MACRO(riseEnd, 16) + UINT8_MACRO(setBegin, 17) + UINT8_MACRO(setEnd, 18) + UINT8_MACRO(volatility, 19) + UINT8_MACRO(phaseLength, 20) - exportattrs = copyattrs = FnvBaseRecord.baseattrs + [] + BasicFlagMACRO(IsHead, modelFlags, 0x01) + BasicFlagMACRO(IsTorso, modelFlags, 0x02) + BasicFlagMACRO(IsRightHand, modelFlags, 0x04) + BasicFlagMACRO(IsLeftHand, modelFlags, 0x08) + copyattrs = FnvBaseRecord.baseattrs + ['weathers_list', 'sunPath', + 'glarePath', 'modPath', + 'modb', 'modt_p', + 'altTextures_list', + 'modelFlags', 'riseBegin', + 'riseEnd', 'setBegin', + 'setEnd', 'volatility', + 'phaseLength'] + exportattrs = FnvBaseRecord.baseattrs + ['weathers_list', 'sunPath', + 'glarePath', 'modPath', + 'modb', + 'altTextures_list', + 'modelFlags', 'riseBegin', + 'riseEnd', 'setBegin', + 'setEnd', 'volatility', + 'phaseLength']# 'modt_p', class FnvREGNRecord(FnvBaseRecord): _Type = 'REGN' + class Area(ListComponent): + class Point(ListX2Component): + FLOAT32_LISTX2MACRO(posX, 1) + FLOAT32_LISTX2MACRO(posY, 2) + exportattrs = copyattrs = ['posX', 'posY'] - exportattrs = copyattrs = FnvBaseRecord.baseattrs + [] + FORMID_LISTMACRO(edgeFalloff, 1) + + LIST_LISTMACRO(points, 2, self.Point) + exportattrs = copyattrs = ['edgeFalloff', 'points_list'] + + class Entry(ListComponent): + class Object(ListX2Component): + FORMID_LISTX2MACRO(objectId, 1) + UINT16_LISTX2MACRO(parentIndex, 2) + UINT8_ARRAY_LISTX2MACRO(unused1, 3, 2) + FLOAT32_LISTX2MACRO(density, 4) + UINT8_LISTX2MACRO(clustering, 5) + UINT8_LISTX2MACRO(minSlope, 6) + UINT8_LISTX2MACRO(maxSlope, 7) + UINT8_FLAG_LISTX2MACRO(flags, 8) + UINT16_LISTX2MACRO(radiusWRTParent, 9) + UINT16_LISTX2MACRO(radius, 10) + UINT8_ARRAY_LISTX2MACRO(unk1, 11, 4) + FLOAT32_LISTX2MACRO(maxHeight, 12) + FLOAT32_LISTX2MACRO(sink, 13) + FLOAT32_LISTX2MACRO(sinkVar, 14) + FLOAT32_LISTX2MACRO(sizeVar, 15) + UINT16_LISTX2MACRO(angleVarX, 16) + UINT16_LISTX2MACRO(angleVarY, 17) + UINT16_LISTX2MACRO(angleVarZ, 18) + UINT8_ARRAY_LISTX2MACRO(unused2, 19, 1) + UINT8_ARRAY_LISTX2MACRO(unk2, 20, 4) + BasicFlagMACRO(IsConformToSlope, flags, 0x00000001) + BasicFlagMACRO(IsPaintVertices, flags, 0x00000002) + BasicFlagMACRO(IsSizeVariance, flags, 0x00000004) + BasicFlagMACRO(IsXVariance, flags, 0x00000008) + BasicFlagMACRO(IsYVariance, flags, 0x00000010) + BasicFlagMACRO(IsZVariance, flags, 0x00000020) + BasicFlagMACRO(IsTree, flags, 0x00000040) + BasicFlagMACRO(IsHugeRock, flags, 0x00000080) + exportattrs = copyattrs = ['objectId', 'parentIndex', 'density', 'clustering', + 'minSlope', 'maxSlope', 'flags', 'radiusWRTParent', + 'radius', 'unk1', 'maxHeight', 'sink', 'sinkVar', + 'sizeVar', 'angleVarX', 'angleVarY', 'angleVarZ', + 'unk2'] + + class Grass(ListX2Component): + FORMID_LISTX2MACRO(grass, 1) + UINT8_ARRAY_LISTX2MACRO(unk1, 2, 4) + exportattrs = copyattrs = ['grass', 'unk1'] + + class Sound(ListX2Component): + FORMID_LISTX2MACRO(sound, 1) + UINT32_FLAG_LISTX2MACRO(flags, 2) + UINT32_LISTX2MACRO(chance, 3) + BasicFlagMACRO(IsPleasant, flags, 0x00000001) + BasicFlagMACRO(IsCloudy, flags, 0x00000002) + BasicFlagMACRO(IsRainy, flags, 0x00000004) + BasicFlagMACRO(IsSnowy, flags, 0x00000008) + exportattrs = copyattrs = ['sound', 'flags', 'chance'] + + class Weather(ListX2Component): + FORMID_LISTX2MACRO(weather, 1) + UINT32_LISTX2MACRO(chance, 2) + FORMID_LISTX2MACRO(globalId, 1) + exportattrs = copyattrs = ['weather', 'chance', 'globalId'] + + UINT32_TYPE_LISTMACRO(entryType, 1) + UINT8_FLAG_LISTMACRO(flags, 2) + UINT8_LISTMACRO(priority, 3) + UINT8_ARRAY_LISTMACRO(unused1, 4, 4) + + LIST_LISTMACRO(objects, 5, self.Object) + STRING_LISTMACRO(mapName, 6) + STRING_LISTMACRO(iconPath, 7) + + LIST_LISTMACRO(grasses, 8, self.Grass) + UINT32_TYPE_LISTMACRO(musicType, 9) + FORMID_LISTMACRO(music, 10) + FORMID_LISTMACRO(incidentalMedia, 11) + FORMID_ARRAY_LISTMACRO(battleMedias, 12) + + LIST_LISTMACRO(sounds, 13, self.Sound) + + LIST_LISTMACRO(weathers, 14, self.Weather) + FORMID_ARRAY_LISTMACRO(imposters, 15) + + BasicFlagMACRO(IsOverride, flags, 0x00000001) + + BasicTypeMACRO(IsObject, entryType, 2, IsWeather) + BasicTypeMACRO(IsWeather, entryType, 3, IsObject) + BasicTypeMACRO(IsMap, entryType, 4, IsObject) + BasicTypeMACRO(IsLand, entryType, 5, IsObject) + BasicTypeMACRO(IsGrass, entryType, 6, IsObject) + BasicTypeMACRO(IsSound, entryType, 7, IsObject) + BasicTypeMACRO(IsImposter, entryType, 8, IsObject) + BasicTypeMACRO(IsDefault, musicType, 0, IsPublic) + BasicTypeMACRO(IsPublic, musicType, 1, IsDefault) + BasicTypeMACRO(IsDungeon, musicType, 2, IsDefault) + exportattrs = copyattrs = ['entryType', 'flags', 'priority', 'objects_list', + 'mapName', 'iconPath', 'grasses_list', 'musicType', + 'music', 'incidentalMedia', 'battleMedias', + 'sounds_list', 'weathers_list', 'imposters'] + + ISTRING_MACRO(iconPath, 7) + ISTRING_MACRO(smallIconPath, 8) + UINT8_MACRO(mapRed, 9) + UINT8_MACRO(mapGreen, 10) + UINT8_MACRO(mapBlue, 11) + UINT8_ARRAY_MACRO(unused1, 12, 1) + FORMID_MACRO(worldspace, 13) + + LIST_MACRO(areas, 14, self.Area) + LIST_MACRO(entries, 15, self.Entry) + exportattrs = copyattrs = FnvBaseRecord.baseattrs + ['iconPath', 'smallIconPath', + 'mapRed', 'mapGreen', 'mapBlue', + 'worldspace', 'areas_list', + 'entries_list'] class FnvNAVIRecord(FnvBaseRecord): _Type = 'NAVI' diff --git a/release/cint.py b/release/cint.py index 5fc3de7..4774e43 100644 --- a/release/cint.py +++ b/release/cint.py @@ -5885,18 +5885,416 @@ def create_altTexture(self): class FnvWTHRRecord(FnvBaseRecord): _Type = 'WTHR' + class WTHRColor(BaseComponent): + riseRed = CBashGeneric_GROUP(0, c_ubyte) + riseGreen = CBashGeneric_GROUP(1, c_ubyte) + riseBlue = CBashGeneric_GROUP(2, c_ubyte) + unused1 = CBashUINT8ARRAY_GROUP(3, 1) + dayRed = CBashGeneric_GROUP(4, c_ubyte) + dayGreen = CBashGeneric_GROUP(5, c_ubyte) + dayBlue = CBashGeneric_GROUP(6, c_ubyte) + unused2 = CBashUINT8ARRAY_GROUP(7, 1) + setRed = CBashGeneric_GROUP(8, c_ubyte) + setGreen = CBashGeneric_GROUP(9, c_ubyte) + setBlue = CBashGeneric_GROUP(10, c_ubyte) + unused3 = CBashUINT8ARRAY_GROUP(11, 1) + nightRed = CBashGeneric_GROUP(12, c_ubyte) + nightGreen = CBashGeneric_GROUP(13, c_ubyte) + nightBlue = CBashGeneric_GROUP(14, c_ubyte) + unused4 = CBashUINT8ARRAY_GROUP(15, 1) + + noonRed = CBashGeneric_GROUP(16, c_ubyte) + noonGreen = CBashGeneric_GROUP(17, c_ubyte) + noonBlue = CBashGeneric_GROUP(18, c_ubyte) + unused5 = CBashUINT8ARRAY_GROUP(19, 1) + + midnightRed = CBashGeneric_GROUP(20, c_ubyte) + midnightGreen = CBashGeneric_GROUP(21, c_ubyte) + midnightBlue = CBashGeneric_GROUP(22, c_ubyte) + unused6 = CBashUINT8ARRAY_GROUP(23, 1) + exportattrs = copyattrs = ['riseRed', 'riseGreen', 'riseBlue', + 'dayRed', 'dayGreen', 'dayBlue', + 'setRed', 'setGreen', 'setBlue', + 'nightRed', 'nightGreen', 'nightBlue', + 'noonRed', 'noonGreen', 'noonBlue', + 'midnightRed', 'midnightGreen', 'midnightBlue'] - exportattrs = copyattrs = FnvBaseRecord.baseattrs + [] + class Sound(ListComponent): + sound = CBashFORMID_LIST(1) + type = CBashGeneric_LIST(2, c_ulong) + IsDefault = CBashBasicType('type', 0, 'IsPrecip') + IsPrecipitation = CBashBasicType('type', 1, 'IsDefault') + IsPrecip = CBashAlias('IsPrecipitation') + IsWind = CBashBasicType('type', 2, 'IsDefault') + IsThunder = CBashBasicType('type', 3, 'IsDefault') + exportattrs = copyattrs = ['sound', 'type'] + + sunriseImageSpace = CBashFORMID(7) + dayImageSpace = CBashFORMID(8) + sunsetImageSpace = CBashFORMID(9) + nightImageSpace = CBashFORMID(10) + unknown1ImageSpace = CBashFORMID(11) + unknown2ImageSpace = CBashFORMID(12) + cloudLayer0Path = CBashISTRING(13) + cloudLayer1Path = CBashISTRING(14) + cloudLayer2Path = CBashISTRING(15) + cloudLayer3Path = CBashISTRING(16) + modPath = CBashISTRING(17) + modb = CBashFLOAT32(18) + modt_p = CBashUINT8ARRAY(19) + + def create_altTexture(self): + length = CBash.GetFieldAttribute(self._CollectionID, self._ModID, self._RecordID, 20, 0, 0, 0, 0, 0, 0, 1) + CBash.SetField(self._CollectionID, self._ModID, self._RecordID, 20, 0, 0, 0, 0, 0, 0, 0, c_ulong(length + 1)) + return FNVAltTexture(self._CollectionID, self._ModID, self._RecordID, 20, length) + altTextures = CBashLIST(20, FNVAltTexture) + altTextures_list = CBashLIST(20, FNVAltTexture, True) + + modelFlags = CBashGeneric(21, c_ubyte) + unknown1 = CBashGeneric(22, c_ulong) + layer0Speed = CBashGeneric(23, c_ubyte) + layer1Speed = CBashGeneric(24, c_ubyte) + layer2Speed = CBashGeneric(25, c_ubyte) + layer3Speed = CBashGeneric(26, c_ubyte) + pnam_p = CBashUINT8ARRAY(27) + upperSky = CBashGrouped(28, WTHRColor) + upperSky_list = CBashGrouped(28, WTHRColor, True) + + fog = CBashGrouped(52, WTHRColor) + fog_list = CBashGrouped(52, WTHRColor, True) + + lowerClouds = CBashGrouped(76, WTHRColor) + lowerClouds_list = CBashGrouped(76, WTHRColor, True) + + ambient = CBashGrouped(100, WTHRColor) + ambient_list = CBashGrouped(100, WTHRColor, True) + + sunlight = CBashGrouped(124, WTHRColor) + sunlight_list = CBashGrouped(124, WTHRColor, True) + + sun = CBashGrouped(148, WTHRColor) + sun_list = CBashGrouped(148, WTHRColor, True) + + stars = CBashGrouped(172, WTHRColor) + stars_list = CBashGrouped(172, WTHRColor, True) + + lowerSky = CBashGrouped(196, WTHRColor) + lowerSky_list = CBashGrouped(196, WTHRColor, True) + + horizon = CBashGrouped(220, WTHRColor) + horizon_list = CBashGrouped(220, WTHRColor, True) + + upperClouds = CBashGrouped(244, WTHRColor) + upperClouds_list = CBashGrouped(244, WTHRColor, True) + + fogDayNear = CBashFLOAT32(268) + fogDayFar = CBashFLOAT32(269) + fogNightNear = CBashFLOAT32(270) + fogNightFar = CBashFLOAT32(271) + fogDayPower = CBashFLOAT32(272) + fogNightPower = CBashFLOAT32(273) + inam_p = CBashUINT8ARRAY(274) + windSpeed = CBashGeneric(275, c_ubyte) + lowerCloudSpeed = CBashGeneric(276, c_ubyte) + upperCloudSpeed = CBashGeneric(277, c_ubyte) + transDelta = CBashGeneric(278, c_ubyte) + sunGlare = CBashGeneric(279, c_ubyte) + sunDamage = CBashGeneric(280, c_ubyte) + rainFadeIn = CBashGeneric(281, c_ubyte) + rainFadeOut = CBashGeneric(282, c_ubyte) + boltFadeIn = CBashGeneric(283, c_ubyte) + boltFadeOut = CBashGeneric(284, c_ubyte) + boltFrequency = CBashGeneric(285, c_ubyte) + weatherType = CBashGeneric(286, c_ubyte) + boltRed = CBashGeneric(287, c_ubyte) + boltGreen = CBashGeneric(288, c_ubyte) + boltBlue = CBashGeneric(289, c_ubyte) + + def create_sound(self): + length = CBash.GetFieldAttribute(self._CollectionID, self._ModID, self._RecordID, 290, 0, 0, 0, 0, 0, 0, 1) + CBash.SetField(self._CollectionID, self._ModID, self._RecordID, 290, 0, 0, 0, 0, 0, 0, 0, c_ulong(length + 1)) + return self.Sound(self._CollectionID, self._ModID, self._RecordID, 290, length) + sounds = CBashLIST(290, Sound) + sounds_list = CBashLIST(290, Sound, True) + + ##actually flags, but all are exclusive(except unknowns)...so like a Type + ##Manual hackery will make the CS think it is multiple types. It isn't known how the game would react. + IsNone = CBashMaskedType('weatherType', 0x0F, 0x00, 'IsPleasant') + IsPleasant = CBashMaskedType('weatherType', 0x0F, 0x01, 'IsNone') + IsCloudy = CBashMaskedType('weatherType', 0x0F, 0x02, 'IsNone') + IsRainy = CBashMaskedType('weatherType', 0x0F, 0x04, 'IsNone') + IsSnow = CBashMaskedType('weatherType', 0x0F, 0x08, 'IsNone') + IsUnk1 = CBashBasicFlag('weatherType', 0x40) + IsUnk2 = CBashBasicFlag('weatherType', 0x80) + copyattrs = FnvBaseRecord.baseattrs + ['sunriseImageSpace', 'dayImageSpace', + 'sunsetImageSpace', 'nightImageSpace', + 'unknown1ImageSpace', 'unknown2ImageSpace', + 'cloudLayer0Path', 'cloudLayer1Path', + 'cloudLayer2Path', 'cloudLayer3Path', + 'modPath', 'modb', 'modt_p', + 'altTextures_list', 'modelFlags', + 'unknown1', 'layer0Speed', 'layer1Speed', + 'layer2Speed', 'layer3Speed', 'pnam_p', + 'upperSky_list', 'fog_list', + 'lowerClouds_list', 'ambient_list', + 'sunlight_list', 'sun_list', 'stars_list', + 'lowerSky_list', 'horizon_list', + 'upperClouds_list', 'fogDayNear', + 'fogDayFar', 'fogNightNear', + 'fogNightFar', 'fogDayPower', + 'fogNightPower', 'inam_p', 'windSpeed', + 'lowerCloudSpeed', 'upperCloudSpeed', + 'transDelta', 'sunGlare', 'sunDamage', + 'rainFadeIn', 'rainFadeOut', + 'boltFadeIn', 'boltFadeOut', + 'boltFrequency', 'weatherType', + 'boltRed', 'boltGreen', 'boltBlue', + 'sounds_list'] + exportattrs = FnvBaseRecord.baseattrs + ['sunriseImageSpace', 'dayImageSpace', + 'sunsetImageSpace', 'nightImageSpace', + 'unknown1ImageSpace', 'unknown2ImageSpace', + 'cloudLayer0Path', 'cloudLayer1Path', + 'cloudLayer2Path', 'cloudLayer3Path', + 'modPath', 'modb', + 'altTextures_list', 'modelFlags', + 'unknown1', 'layer0Speed', 'layer1Speed', + 'layer2Speed', 'layer3Speed', + 'upperSky_list', 'fog_list', + 'lowerClouds_list', 'ambient_list', + 'sunlight_list', 'sun_list', 'stars_list', + 'lowerSky_list', 'horizon_list', + 'upperClouds_list', 'fogDayNear', + 'fogDayFar', 'fogNightNear', + 'fogNightFar', 'fogDayPower', + 'fogNightPower', 'windSpeed', + 'lowerCloudSpeed', 'upperCloudSpeed', + 'transDelta', 'sunGlare', 'sunDamage', + 'rainFadeIn', 'rainFadeOut', + 'boltFadeIn', 'boltFadeOut', + 'boltFrequency', 'weatherType', + 'boltRed', 'boltGreen', 'boltBlue', + 'sounds_list']# 'modt_p', 'pnam_p', 'inam_p', class FnvCLMTRecord(FnvBaseRecord): _Type = 'CLMT' + class Weather(ListComponent): + weather = CBashFORMID_LIST(1) + chance = CBashGeneric_LIST(2, c_long) + globalId = CBashFORMID_LIST(3) + copyattrs = ['weather', 'chance', 'globalId'] - exportattrs = copyattrs = FnvBaseRecord.baseattrs + [] + def create_weather(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.Weather(self._CollectionID, self._ModID, self._RecordID, 7, length) + weathers = CBashLIST(7, Weather) + weathers_list = CBashLIST(7, Weather, True) + + sunPath = CBashISTRING(8) + glarePath = CBashISTRING(9) + modPath = CBashISTRING(10) + modb = CBashFLOAT32(11) + modt_p = CBashUINT8ARRAY(12) + + def create_altTexture(self): + length = CBash.GetFieldAttribute(self._CollectionID, self._ModID, self._RecordID, 13, 0, 0, 0, 0, 0, 0, 1) + CBash.SetField(self._CollectionID, self._ModID, self._RecordID, 13, 0, 0, 0, 0, 0, 0, 0, c_ulong(length + 1)) + return FNVAltTexture(self._CollectionID, self._ModID, self._RecordID, 13, length) + altTextures = CBashLIST(13, FNVAltTexture) + altTextures_list = CBashLIST(13, FNVAltTexture, True) + + modelFlags = CBashGeneric(14, c_ubyte) + riseBegin = CBashGeneric(15, c_ubyte) + riseEnd = CBashGeneric(16, c_ubyte) + setBegin = CBashGeneric(17, c_ubyte) + setEnd = CBashGeneric(18, c_ubyte) + volatility = CBashGeneric(19, c_ubyte) + phaseLength = CBashGeneric(20, c_ubyte) + + IsHead = CBashBasicFlag('modelFlags', 0x01) + IsTorso = CBashBasicFlag('modelFlags', 0x02) + IsRightHand = CBashBasicFlag('modelFlags', 0x04) + IsLeftHand = CBashBasicFlag('modelFlags', 0x08) + copyattrs = FnvBaseRecord.baseattrs + ['weathers_list', 'sunPath', + 'glarePath', 'modPath', + 'modb', 'modt_p', + 'altTextures_list', + 'modelFlags', 'riseBegin', + 'riseEnd', 'setBegin', + 'setEnd', 'volatility', + 'phaseLength'] + exportattrs = FnvBaseRecord.baseattrs + ['weathers_list', 'sunPath', + 'glarePath', 'modPath', + 'modb', + 'altTextures_list', + 'modelFlags', 'riseBegin', + 'riseEnd', 'setBegin', + 'setEnd', 'volatility', + 'phaseLength']# 'modt_p', class FnvREGNRecord(FnvBaseRecord): _Type = 'REGN' + class Area(ListComponent): + class Point(ListX2Component): + posX = CBashFLOAT32_LISTX2(1) + posY = CBashFLOAT32_LISTX2(2) + exportattrs = copyattrs = ['posX', 'posY'] - exportattrs = copyattrs = FnvBaseRecord.baseattrs + [] + edgeFalloff = CBashFORMID_LIST(1) + + def create_point(self): + length = CBash.GetFieldAttribute(self._CollectionID, self._ModID, self._RecordID, self._FieldID, self._ListIndex, 2, 0, 0, 0, 0, 1) + CBash.SetField(self._CollectionID, self._ModID, self._RecordID, self._FieldID, self._ListIndex, 2, 0, 0, 0, 0, 0, c_ulong(length + 1)) + return self.Point(self._CollectionID, self._ModID, self._RecordID, self._FieldID, self._ListIndex, 2, length) + points = CBashLIST_LIST(2, Point) + points_list = CBashLIST_LIST(2, Point, True) + + exportattrs = copyattrs = ['edgeFalloff', 'points_list'] + + class Entry(ListComponent): + class Object(ListX2Component): + objectId = CBashFORMID_LISTX2(1) + parentIndex = CBashGeneric_LISTX2(2, c_ushort) + unused1 = CBashUINT8ARRAY_LISTX2(3, 2) + density = CBashFLOAT32_LISTX2(4) + clustering = CBashGeneric_LISTX2(5, c_ubyte) + minSlope = CBashGeneric_LISTX2(6, c_ubyte) + maxSlope = CBashGeneric_LISTX2(7, c_ubyte) + flags = CBashGeneric_LISTX2(8, c_ubyte) + radiusWRTParent = CBashGeneric_LISTX2(9, c_ushort) + radius = CBashGeneric_LISTX2(10, c_ushort) + unk1 = CBashUINT8ARRAY_LISTX2(11, 4) + maxHeight = CBashFLOAT32_LISTX2(12) + sink = CBashFLOAT32_LISTX2(13) + sinkVar = CBashFLOAT32_LISTX2(14) + sizeVar = CBashFLOAT32_LISTX2(15) + angleVarX = CBashGeneric_LISTX2(16, c_ushort) + angleVarY = CBashGeneric_LISTX2(17, c_ushort) + angleVarZ = CBashGeneric_LISTX2(18, c_ushort) + unused2 = CBashUINT8ARRAY_LISTX2(19, 1) + unk2 = CBashUINT8ARRAY_LISTX2(20, 4) + IsConformToSlope = CBashBasicFlag('flags', 0x00000001) + IsPaintVertices = CBashBasicFlag('flags', 0x00000002) + IsSizeVariance = CBashBasicFlag('flags', 0x00000004) + IsXVariance = CBashBasicFlag('flags', 0x00000008) + IsYVariance = CBashBasicFlag('flags', 0x00000010) + IsZVariance = CBashBasicFlag('flags', 0x00000020) + IsTree = CBashBasicFlag('flags', 0x00000040) + IsHugeRock = CBashBasicFlag('flags', 0x00000080) + exportattrs = copyattrs = ['objectId', 'parentIndex', 'density', 'clustering', + 'minSlope', 'maxSlope', 'flags', 'radiusWRTParent', + 'radius', 'unk1', 'maxHeight', 'sink', 'sinkVar', + 'sizeVar', 'angleVarX', 'angleVarY', 'angleVarZ', + 'unk2'] + + class Grass(ListX2Component): + grass = CBashFORMID_LISTX2(1) + unk1 = CBashUINT8ARRAY_LISTX2(2, 4) + exportattrs = copyattrs = ['grass', 'unk1'] + + class Sound(ListX2Component): + sound = CBashFORMID_LISTX2(1) + flags = CBashGeneric_LISTX2(2, c_ulong) + chance = CBashGeneric_LISTX2(3, c_ulong) + IsPleasant = CBashBasicFlag('flags', 0x00000001) + IsCloudy = CBashBasicFlag('flags', 0x00000002) + IsRainy = CBashBasicFlag('flags', 0x00000004) + IsSnowy = CBashBasicFlag('flags', 0x00000008) + exportattrs = copyattrs = ['sound', 'flags', 'chance'] + + class Weather(ListX2Component): + weather = CBashFORMID_LISTX2(1) + chance = CBashGeneric_LISTX2(2, c_ulong) + globalId = CBashFORMID_LISTX2(1) + exportattrs = copyattrs = ['weather', 'chance', 'globalId'] + + entryType = CBashGeneric_LIST(1, c_ulong) + flags = CBashGeneric_LIST(2, c_ubyte) + priority = CBashGeneric_LIST(3, c_ubyte) + unused1 = CBashUINT8ARRAY_LIST(4, 4) + + def create_object(self): + length = CBash.GetFieldAttribute(self._CollectionID, self._ModID, self._RecordID, self._FieldID, self._ListIndex, 5, 0, 0, 0, 0, 1) + CBash.SetField(self._CollectionID, self._ModID, self._RecordID, self._FieldID, self._ListIndex, 5, 0, 0, 0, 0, 0, c_ulong(length + 1)) + return self.Object(self._CollectionID, self._ModID, self._RecordID, self._FieldID, self._ListIndex, 5, length) + objects = CBashLIST_LIST(5, Object) + objects_list = CBashLIST_LIST(5, Object, True) + + mapName = CBashSTRING_LIST(6) + iconPath = CBashSTRING_LIST(7) + + def create_grass(self): + length = CBash.GetFieldAttribute(self._CollectionID, self._ModID, self._RecordID, self._FieldID, self._ListIndex, 8, 0, 0, 0, 0, 1) + CBash.SetField(self._CollectionID, self._ModID, self._RecordID, self._FieldID, self._ListIndex, 8, 0, 0, 0, 0, 0, c_ulong(length + 1)) + return self.Grass(self._CollectionID, self._ModID, self._RecordID, self._FieldID, self._ListIndex, 8, length) + grasses = CBashLIST_LIST(8, Grass) + grasses_list = CBashLIST_LIST(8, Grass, True) + + musicType = CBashGeneric_LIST(9, c_ulong) + music = CBashFORMID_LIST(10) + incidentalMedia = CBashFORMID_LIST(11) + battleMedias = CBashFORMIDARRAY_LIST(12) + + def create_sound(self): + length = CBash.GetFieldAttribute(self._CollectionID, self._ModID, self._RecordID, self._FieldID, self._ListIndex, 13, 0, 0, 0, 0, 1) + CBash.SetField(self._CollectionID, self._ModID, self._RecordID, self._FieldID, self._ListIndex, 13, 0, 0, 0, 0, 0, c_ulong(length + 1)) + return self.Sound(self._CollectionID, self._ModID, self._RecordID, self._FieldID, self._ListIndex, 13, length) + sounds = CBashLIST_LIST(13, Sound) + sounds_list = CBashLIST_LIST(13, Sound, True) + + + def create_weather(self): + length = CBash.GetFieldAttribute(self._CollectionID, self._ModID, self._RecordID, self._FieldID, self._ListIndex, 14, 0, 0, 0, 0, 1) + CBash.SetField(self._CollectionID, self._ModID, self._RecordID, self._FieldID, self._ListIndex, 14, 0, 0, 0, 0, 0, c_ulong(length + 1)) + return self.Weather(self._CollectionID, self._ModID, self._RecordID, self._FieldID, self._ListIndex, 14, length) + weathers = CBashLIST_LIST(14, Weather) + weathers_list = CBashLIST_LIST(14, Weather, True) + + imposters = CBashFORMIDARRAY_LIST(15) + + IsOverride = CBashBasicFlag('flags', 0x00000001) + + IsObject = CBashBasicType('entryType', 2, 'IsWeather') + IsWeather = CBashBasicType('entryType', 3, 'IsObject') + IsMap = CBashBasicType('entryType', 4, 'IsObject') + IsLand = CBashBasicType('entryType', 5, 'IsObject') + IsGrass = CBashBasicType('entryType', 6, 'IsObject') + IsSound = CBashBasicType('entryType', 7, 'IsObject') + IsImposter = CBashBasicType('entryType', 8, 'IsObject') + IsDefault = CBashBasicType('musicType', 0, 'IsPublic') + IsPublic = CBashBasicType('musicType', 1, 'IsDefault') + IsDungeon = CBashBasicType('musicType', 2, 'IsDefault') + exportattrs = copyattrs = ['entryType', 'flags', 'priority', 'objects_list', + 'mapName', 'iconPath', 'grasses_list', 'musicType', + 'music', 'incidentalMedia', 'battleMedias', + 'sounds_list', 'weathers_list', 'imposters'] + + iconPath = CBashISTRING(7) + smallIconPath = CBashISTRING(8) + mapRed = CBashGeneric(9, c_ubyte) + mapGreen = CBashGeneric(10, c_ubyte) + mapBlue = CBashGeneric(11, c_ubyte) + unused1 = CBashUINT8ARRAY(12, 1) + worldspace = CBashFORMID(13) + + def create_area(self): + length = CBash.GetFieldAttribute(self._CollectionID, self._ModID, self._RecordID, 14, 0, 0, 0, 0, 0, 0, 1) + CBash.SetField(self._CollectionID, self._ModID, self._RecordID, 14, 0, 0, 0, 0, 0, 0, 0, c_ulong(length + 1)) + return self.Area(self._CollectionID, self._ModID, self._RecordID, 14, length) + areas = CBashLIST(14, Area) + areas_list = CBashLIST(14, Area, True) + + def create_entry(self): + length = CBash.GetFieldAttribute(self._CollectionID, self._ModID, self._RecordID, 15, 0, 0, 0, 0, 0, 0, 1) + CBash.SetField(self._CollectionID, self._ModID, self._RecordID, 15, 0, 0, 0, 0, 0, 0, 0, c_ulong(length + 1)) + return self.Entry(self._CollectionID, self._ModID, self._RecordID, 15, length) + entries = CBashLIST(15, Entry) + entries_list = CBashLIST(15, Entry, True) + + exportattrs = copyattrs = FnvBaseRecord.baseattrs + ['iconPath', 'smallIconPath', + 'mapRed', 'mapGreen', 'mapBlue', + 'worldspace', 'areas_list', + 'entries_list'] class FnvNAVIRecord(FnvBaseRecord): _Type = 'NAVI'