Пример #1
0
        protected override void ReadMembers(SR1_Reader reader, SR1_Structure parent)
        {
            numPuzzles.Read(reader, this, "numPuzzles");

            eventInstances = new SR1_PointerArray <Event>(numPuzzles.Value, false);
            eventInstances.Read(reader, this, "eventInstances");
        }
Пример #2
0
        protected override void ReadMembers(SR1_Reader reader, SR1_Structure parent)
        {
            Properties.Read(reader, this, "Properties");
            totalProjectiles.Read(reader, this, "totalProjectiles");

            data = new SR1_PointerArray <PhysObProjectileData>(totalProjectiles.Value + 1, false);
            data.Read(reader, this, "data");
        }
Пример #3
0
        protected override void ReadMembers(SR1_Reader reader, SR1_Structure parent)
        {
            keyListPointers = new SR1_PointerArray <G2AnimKeylist_Type>(_NumAnims, false);
            keyListPointers.Read(reader, this, "keyListPointers");

            SR1_StructureArray <G2AnimKeylist_Type> keyLists = new SR1_StructureArray <G2AnimKeylist_Type>(_NumAnims);

            keyLists.ReadFromPointer(reader, keyListPointers[0]);

            SR1_StructureArray <G2AnimFXList> fxLists = new SR1_StructureArray <G2AnimFXList>(reader.AnimFXDictionary.Count);

            fxLists.SetPadding(4).ReadFromPointer(reader, reader.AnimFXDictionary.Values[0]);
        }
Пример #4
0
 protected override void ReadMembers(SR1_Reader reader, SR1_Structure parent)
 {
     numAniTextures.Read(reader, this, "numAniTextures");
     aniTexInfo = new SR1_PointerArray <DrMoveAniTexDestInfo>(numAniTextures.Value, true);
     aniTexInfo.Read(reader, this, "aniTexInfo");
 }
        protected override void ReadReferences(SR1_Reader reader, SR1_Structure parent)
        {
            SR1_Structure temp = null;

            temp = new SR1_PrimativeArray <sbyte>(numAuxAnims.Value).ReadFromPointer(reader, auxAnimList);

            // Unknown byte plus padding. Always 0xD1
            if (temp.End != 0x00000000 && !reader.File._Structures.ContainsKey(temp.End))
            {
                reader.BaseStream.Position = temp.End;
                new SR1_Primative <byte>().SetPadding(4).Read(reader, null, "");
            }

            temp = new SR1_PrimativeArray <sbyte>(numAmbientAnims.Value).ReadFromPointer(reader, ambientAnimList);

            // Unknown byte plus padding. Always 0xD1
            if (temp.End != 0x00000000 && !reader.File._Structures.ContainsKey(temp.End))
            {
                reader.BaseStream.Position = temp.End;
                new SR1_Primative <byte>().SetPadding(4).Read(reader, null, "");
            }

            temp = new SR1_PointerArray <MonsterSubAttributes>(numSubAttributes.Value, true, 4).ReadFromPointer(reader, subAttributesList);

            // Unknown byte plus padding. Always 0xD1
            if (temp.End != 0x00000000 && !reader.File._Structures.ContainsKey(temp.End))
            {
                reader.BaseStream.Position = temp.End;
                new SR1_Primative <byte>().SetPadding(4).Read(reader, null, "");
            }

            temp = new SR1_PointerArray <MonsterCombatAttributes>(numCombatAttributes.Value, true).ReadFromPointer(reader, combatAttributesList);

            // Unknown byte plus padding. Always 0xD1
            if (temp.End != 0x00000000 && !reader.File._Structures.ContainsKey(temp.End))
            {
                reader.BaseStream.Position = temp.End;
                new SR1_Primative <byte>().SetPadding(4).Read(reader, null, "");
            }

            new SR1_StructureArray <MonsterAttackAttributes>(numAttackAttributes.Value).ReadFromPointer(reader, attackAttributesList);
            new SR1_StructureArray <MonsterMissile>(numMissiles.Value).ReadFromPointer(reader, missileList);
            new SR1_StructureArray <MonsterAnim>(numAnims.Value).ReadFromPointer(reader, animList);
            new SR1_StructureArray <MonsterIdle>(numIdles.Value).ReadFromPointer(reader, idleList);

            int realNumBehaviors = (numBehaviors.Value > 0) ? (numBehaviors.Value - 1) : 0;

            if (reader.File._Version >= SR1_File.Version.Feb16)
            {
                if (reader.Object.Name == "wrshp___")
                {
                    realNumBehaviors -= 1;
                }
                else if (reader.Object.Name == "soul____")
                {
                    realNumBehaviors = 1;
                }
            }
            new SR1_StructureArray <MonsterBehavior>(realNumBehaviors).ReadFromPointer(reader, behaviorList);

            new SR1_StructureArray <FXSplinter>(numShatters.Value).ReadFromPointer(reader, shatterList);
        }
Пример #6
0
        protected override void ReadMembers(SR1_Reader reader, SR1_Structure parent)
        {
            eventNumber.Read(reader, this, "eventNumber");
            numInstances.Read(reader, this, "numInstances");
            numActions.Read(reader, this, "numActions");
            processingPuppetShow.Read(reader, this, "processingPuppetShow");
            eventVariables.Read(reader, this, "eventVariables");
            instanceList.Read(reader, this, "instanceList");
            conditionalList.Read(reader, this, "conditionalList");
            actionList.Read(reader, this, "actionList");

            if (instanceList.Offset != 0 && numInstances.Value > 0)
            {
                instancePointers = new SR1_PointerArray <EventBasicObject>(numInstances.Value, false);
                instancePointers.Read(reader, this, "instancePonters");
            }

            int tempNumConditions = 0;
            int tempNumActions    = 0;

            if (numActions.Value > 0)
            {
                if (conditionalList.Offset != 0)
                {
                    conditionalPointers = new SR1_PointerArray <ScriptPCode>(numActions.Value, false);
                    conditionalPointers.Read(reader, this, "conditionalPointers");
                    foreach (SR1_PointerBase pointer in conditionalPointers)
                    {
                        if (pointer.Offset != 0)
                        {
                            tempNumConditions++;
                        }
                    }
                }

                if (actionList.Offset != 0)
                {
                    actionPointers = new SR1_PointerArray <ScriptPCode>(numActions.Value, false);
                    actionPointers.Read(reader, this, "actionPointers");
                    foreach (SR1_PointerBase pointer in actionPointers)
                    {
                        if (pointer.Offset != 0)
                        {
                            tempNumActions++;
                        }
                    }
                }
            }

            if (instanceList.Offset != 0 && numInstances.Value > 0)
            {
                instances = new SR1_StructureArray <EventBasicObject>(numInstances.Value);
                instances.Read(reader, this, "instances");
            }

            if (tempNumConditions > 0)
            {
                conditionals = new SR1_StructureArray <ScriptPCode>(tempNumConditions);
                conditionals.Read(reader, this, "conditionals");
            }

            if (tempNumActions > 0)
            {
                actions = new SR1_StructureArray <ScriptPCode>(tempNumActions);
                actions.Read(reader, this, "actions");
            }
        }
Пример #7
0
        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, "");
            }
        }