protected override void ReadMembers(SR1_Reader reader, SR1_Structure parent) { name.SetReadMax(true).Read(reader, this, "name"); intronum.Read(reader, this, "intronum"); UniqueID.Read(reader, this, "UniqueID"); link.Read(reader, this, "link", SR1_File.Version.Feb04, SR1_File.Version.Feb16); rotation.Read(reader, this, "rotation"); position.Read(reader, this, "position"); maxRad.Read(reader, this, "maxRad"); maxRadSq.Read(reader, this, "maxRadSq"); flags.Read(reader, this, "flags"); data.Read(reader, this, "data"); instance.Read(reader, this, "instance"); multiSpline.Read(reader, this, "multiSpline"); dsignal.Read(reader, this, "dsignal"); specturalLightGroup.Read(reader, this, "specturalLightGroup"); meshColor.Read(reader, this, "meshColor"); spectralPosition.Read(reader, this, "spectralPosition"); spad.Read(reader, this, "spad"); if (!reader.File._IntroNames.Contains(name.ToString())) { reader.File._IntroNames.Add(name.ToString()); } int uniqueID = UniqueID.Value; if (!reader.File._IntroIDs.Contains(uniqueID)) { reader.File._IntroIDs.Add(uniqueID); } }
protected override void ReadReferences(SR1_Reader reader, SR1_Structure parent) { worldNameString.SetPadding(4).ReadFromPointer(reader, worldName); Name = worldNameString.ToString(); new SR1_StructureSeries <MultiSignal>((int)(SignalListEnd.Offset - SignalListStart.Offset)).ReadFromPointer(reader, SignalListStart); SR1_Structure terrainStruct = new Terrain().ReadFromPointer(reader, terrain); lightListStruct0.ReadFromPointer(reader, lightList); if (reader.File._Version < SR1_File.Version.May12 && lightListStruct0.End != 0 && lightListStruct0.End != depthQPTable.Offset) { if (Name == "push6") { push6Padding.ReadOrphan(reader, lightListStruct0.End); } else { // Got lucky with depthQPTable always being there. Could use a better solution. lightListStruct1.SetSkipAmbient(true); lightListStruct1.ReadOrphan(reader, lightListStruct0.End); } } new VMObjectList(numVMObjects.Value).ReadFromPointer(reader, vmobjectList); if (reader.File._Version <= SR1_File.Version.May12) { new SR1_StructureArray <SpotLight>(numSpotLights.Value).ReadFromPointer(reader, spotLightList); } new LightList().ReadFromPointer(reader, spectrallightList); if (reader.File._Version < SR1_File.Version.May12) { // depthQPTable is length 3464 discovered in function LIGHT_CalcDQPTable /*int iVar6 = -((int)(fogFar.Value * fogNear.Value) / (int)(fogFar.Value - fogNear.Value)); * if (0x9ffe < iVar6) * { * iVar6 = 0x9ffe; * } * if (iVar6 < -0x9ffe) * { * iVar6 = -0x9ffe; * } * int iVar8 = (int)((uint)fogFar.Value << 0xc) / (int)((uint)fogFar.Value - (uint)fogNear.Value); * int iVar9 = (iVar6 * -0x1000) / iVar8; * int iVar10 = (iVar6 * 0x1000) / (0x1000 - iVar8); * int iVar11 = 0x3620; * int iVar12 = iVar11 / 4;*/ new SR1_PrimativeArray <short>(3464).ReadFromPointer(reader, depthQPTable); } new SR1_StructureArray <CameraKey>(numCameras.Value).ReadFromPointer(reader, cameraList); new SR1_StructureArray <VGroup>(numVGroups.Value).ReadFromPointer(reader, vGroupList); new SR1_StructureArray <Intro>(numIntros.Value).ReadFromPointer(reader, introList); SR1_Structure objectNameListStruct = new ObjectNameList().ReadFromPointer(reader, objectNameList); new SR1_StructureArray <PlanMkr>(NumberOfPlanMarkers.Value).SetPadding(4).ReadFromPointer(reader, PlanMarkerList); new SR1_StructureArray <SFXMkr>(NumberOfSFXMarkers.Value).ReadFromPointer(reader, SFXMarkerList); if (reader.File._Version >= SR1_File.Version.Jun01) { new SR1_String(4).SetPadding(4).ReadFromPointer(reader, dynamicMusicName); } else if (reader.File._Version < SR1_File.Version.May12 && dynamicMusicName.Offset != 0 && dynamicMusicName.Offset < cpad3.End) { uint adjustLength = cpad3.End - dynamicMusicName.Offset; new SR1_String(12 - (int)adjustLength).SetPadding(4).ReadOrphan(reader, cpad3.End); } else { new SR1_String(12).SetPadding(4).ReadFromPointer(reader, dynamicMusicName); } new LightGroup().ReadFromPointer(reader, razielLightGroup); new LightGroup().ReadFromPointer(reader, razielSpectralLightGroup); if (PuzzleInstances.Offset != 0) { reader.BaseStream.Position = PuzzleInstances.Offset; EventPointers tempEventPointers = new EventPointers(); tempEventPointers.ReadTemp(reader); uint firstEvent = uint.MaxValue; foreach (SR1_PointerBase eventInstance in tempEventPointers.eventInstances) { if (eventInstance.Offset != 0 && eventInstance.Offset < firstEvent) { firstEvent = eventInstance.Offset; } } if (firstEvent != 0 && firstEvent != uint.MaxValue) { reader.BaseStream.Position = firstEvent; events = new Events(tempEventPointers.numPuzzles.Value); events.Read(reader, null, ""); reader.Events = events; } } if (terrainStruct.End != 0) { foreach (SR1_Pointer <SFXFileData> pointer in reader.SFXDictionary.Values) { SR1_Structure sfxFileDataList = new SFXFileDataList().ReadFromPointer(reader, pointer); if (!reader.File._Structures.ContainsKey(sfxFileDataList.End)) { reader.BaseStream.Position = sfxFileDataList.End; new SR1_PrimativeArray <byte>((int)(terrainStruct.Start - sfxFileDataList.End)).Read(reader, null, ""); } break; } } // 8 mystery bytes after events. Mirror? if (events != null && !reader.File._Structures.ContainsKey(events.End)) { reader.BaseStream.Position = events.End; new Mirror().Read(reader, null, ""); } reader.BaseStream.Position = objectNameListStruct.Start - 1; while (!reader.File._Structures.ContainsKey((uint)reader.BaseStream.Position)) { reader.BaseStream.Position--; } if (!reader.File._Structures.ContainsKey(reader.File._Structures[(uint)reader.BaseStream.Position].End)) { reader.BaseStream.Position = reader.File._Structures[(uint)reader.BaseStream.Position].End; int length = (int)objectNameListStruct.Start - (int)reader.BaseStream.Position; new SR1_PrimativeArray <byte>(length).Read(reader, null, ""); } }
protected override void ReadReferences(SR1_Reader reader, SR1_Structure parent) { nameString.SetPadding(4).ReadFromPointer(reader, name); scriptString.SetPadding(4).ReadFromPointer(reader, script); Name = scriptString.ToString(); bool useFlameGSHack = false; if (reader.File._Version == SR1_File.Version.Feb16 && Name == "flamegs_") { new SR1_String(12).SetPadding(4).ReadOrphan(reader, 0x44); useFlameGSHack = true; } SR1_Structure modelListStruct = new SR1_PointerArray <Model>(System.Math.Max(1, (int)numModels.Value), true).ReadFromPointer(reader, modelList); SR1_Structure animListStruct = new SR1_PointerArray <G2AnimKeylist_Type>(numAnims.Value, false).ReadFromPointer(reader, animList); SR1_Structure effectListStruct = new SR1_StructureArray <ObjectEffect>(numberOfEffects.Value).ReadFromPointer(reader, effectList); SR1_Structure soundDataStruct = new SFXFileData().SetPadding(4).ReadFromPointer(reader, soundData); SR1_Structure relocListStruct = new RelocateList().ReadFromPointer(reader, relocList); SR1_Structure relocModuleStruct = (Name == "cinemax_") ? new CinemaFnTableT().ReadFromPointer(reader, relocModule) : (Name == "mcardx__") ? new MCardMTableT().ReadFromPointer(reader, relocModule) : new MonsterFunctionTable().ReadFromPointer(reader, relocModule); PhysObProperties physObBase = null; PhysObPropertiesBase physOb = null; MonsterAttributes monAttributes = null; if (data.Offset != 0) { if (Name == "pshblkb_" || Name == "urn_____") { new PhysObGenericProperties(0).ReadFromPointer(reader, data); } else if ((oflags2.Value & 0x00040000) != 0 || Name == "catdora_" || Name == "walbosc_" || Name == "flamesk_" || Name == "flamesl_") { // new PhysObProperties().ReadFromPointer(reader, data); reader.BaseStream.Position = (long)data.Offset; physObBase = new PhysObProperties(); physObBase.ReadTemp(reader); reader.BaseStream.Position = (long)data.Offset; physOb = (PhysObPropertiesBase)physObBase.CreateReplacementObject(); physOb.ReadFromPointer(reader, data); reader.PhysObProperties = physOb; } else if ((oflags2.Value & 0x00080000) != 0) { //_MonsterAttributes // monsterAttributes->magic number: -0x531fff9b // MONTABLE_SetupTablePointer whatAmI monAttributes = new MonsterAttributes(); monAttributes.ReadFromPointer(reader, data); if (Name == "aluka___") { new AlukaTuneData().ReadFromPointer(reader, monAttributes.tunData); } else if (Name == "alukabss") { new AlukaBssTuneData().ReadFromPointer(reader, monAttributes.tunData); } else if (Name == "hunter__") { new HunterTuneData().ReadFromPointer(reader, monAttributes.tunData); } else if (Name == "kain____") { KainTuneData kainData = new KainTuneData(); kainData.SetPadding(soundData.Offset != 0 ? 0 : 4); kainData.ReadFromPointer(reader, monAttributes.tunData); } else if (Name == "roninbss") { new RoninBssTuneData().ReadFromPointer(reader, monAttributes.tunData); } else if (Name == "skinbos_") { new SkinBosTuneData().ReadFromPointer(reader, monAttributes.tunData); } else if (Name == "walboss_") { new WalBosTuneData().ReadFromPointer(reader, monAttributes.tunData); } else if (Name == "walbosb_") { new WalBosBTuneData().ReadFromPointer(reader, monAttributes.tunData); } else if (Name == "wallcr__") { new WallcrData().ReadFromPointer(reader, monAttributes.tunData); } else if (Name == "vwraith_") { new VWraithTuneData().ReadFromPointer(reader, monAttributes.tunData); } else if (Name == "priests_") { new PriestsTuneData().ReadFromPointer(reader, monAttributes.tunData); } } else if (Name == "raziel__") { new RazielData().ReadFromPointer(reader, data); } else if (Name == "sreavr__") { new ReaverTuneData().ReadFromPointer(reader, data); } else if (Name == "glphicon") { new GlyphTuneData().ReadFromPointer(reader, data); } else if (Name == "monster_") { new MonsterAttributes().ReadFromPointer(reader, data); } else if (Name == "particle") { // GenericFXObject? // See FX_RelocateGeneric? new GenericFXObject().ReadFromPointer(reader, data); } else if (Name == "litshaft") { new LitShaftProperties().ReadFromPointer(reader, data); } else if (Name == "waterfx_") { new WaterFXProperties().ReadFromPointer(reader, data); } else if ((oflags2.Value & 0x00040000) == 0) { new GenericTune().ReadFromPointer(reader, data); } } if (numAnims.Value > 0) { SR1_StructureArray <G2AnimKeylist_Type> keyLists = new SR1_StructureArray <G2AnimKeylist_Type>(numAnims.Value); if (reader.File._Version >= SR1_File.Version.Feb16 && reader.File._Version < SR1_File.Version.May12 && Name == "wrshp___") { ((G2AnimKeylist_Type)keyLists[14]).OverridePadLength(8); } if (reader.File._Version >= SR1_File.Version.May12 && reader.File._Version < SR1_File.Version.Jun01 && Name == "wrshp___") { ((G2AnimKeylist_Type)keyLists[15]).OverridePadLength(8); } else if (reader.File._Version >= SR1_File.Version.Jun01 && reader.File._Version < SR1_File.Version.Next && Name == "wrshp___") { ((G2AnimKeylist_Type)keyLists[13]).OverridePadLength(8); } keyLists.ReadFromPointer(reader, ((SR1_PointerArray <G2AnimKeylist_Type>)animListStruct)[0]); AnimKeyListStart = keyLists.Start; bool readUnusedAnimFX = false; if (reader.File._Version >= SR1_File.Version.May12 && reader.File._Version < SR1_File.Version.Jul14 && (Name == "hunter__" || Name == "wrshp___" || Name == "vlgra___" || Name == "vlgrb___" || Name == "vlgrc___")) { readUnusedAnimFX = true; } else if (reader.File._Version == SR1_File.Version.Feb16) { readUnusedAnimFX = true; } if (readUnusedAnimFX) { reader.BaseStream.Position = keyLists.Start - 1; while (!reader.File._Structures.ContainsKey((uint)reader.BaseStream.Position)) { reader.BaseStream.Position--; } reader.BaseStream.Position = reader.File._Structures[(uint)reader.BaseStream.Position].End; uint length = keyLists.Start - (uint)reader.BaseStream.Position; if (length > 0) { new SR1_StructureSeries <G2AnimFXList>((int)length).SetPadding(4).Read(reader, null, ""); } } else if (reader.AnimFXDictionary.Count > 0) { // Superceeded by code above? int numEffects = reader.AnimFXDictionary.Count; if (reader.Object.Name == "wrshp___") { if (reader.File._Version >= SR1_File.Version.Jul14) { numEffects = 11; } else if (reader.File._Version >= SR1_File.Version.Jun18) { numEffects = 28; } } SR1_StructureArray <G2AnimFXList> fxLists = new SR1_StructureArray <G2AnimFXList>(numEffects); fxLists.SetPadding(4).ReadFromPointer(reader, reader.AnimFXDictionary.Values[0]); } } uint padAdress = End; if (nameString.End > padAdress) { padAdress = nameString.End; } if (scriptString.End > padAdress) { padAdress = scriptString.End; } if (modelListStruct.End > padAdress) { padAdress = modelListStruct.End; } if (animListStruct.End > padAdress) { padAdress = animListStruct.End; } if (effectListStruct.End > padAdress) { padAdress = effectListStruct.End; } // 8 mystery bytes after effectList. THIS APPEARS TO BE A PHYSOBLIGHT. REMOVE THIS? if (physObBase != null && !reader.File._Structures.ContainsKey(padAdress)) { reader.BaseStream.Position = padAdress; new SR1_PrimativeArray <byte>(useFlameGSHack ? 4 : 8).Read(reader, null, ""); } }