Exemplo n.º 1
0
        public BangData ReadAll(BangGameTarget target, BangGameType type)
        {
            BangData data = new BangData();

            data.Header = BangDataHeader.Load(chunkReader, target, type);

            ReadBody(data);

            return(data);
        }
Exemplo n.º 2
0
        public void ReadBody(BangData dataToWrite)
        {
            // Note: AGame_func_1 (Age III)


            // Unknown params - START
            bool isScenario = dataToWrite.Header.GameType == BangGameType.Scenario;
            bool unkA7      = false;
            // Unknown params - END



            var fileVersion = dataToWrite.Header.FileVersion;

            if (fileVersion >= 41)
            {
                // maybe game generation 0 = AoM, 1 = AGE III, 2 = AOEO?
                // or it could be DLC --> AGE III, AGE III War Chiefs, AGE III Asians
                dataToWrite.GameType = chunkReader.ReadEnum <BangGameRequirements>();
            }

            if (fileVersion > BangDataHeader.MaxFileVersion)
            {
                throw new InvalidOperationException($"File version {fileVersion} is bigger than the max file version {BangDataHeader.MaxFileVersion}");
            }

            if (fileVersion >= 31)
            {
                dataToWrite.SavedModeType   = chunkReader.ReadEnum <BangModeType>();
                dataToWrite.ShouldInitWorld = chunkReader.ReadBoolean();
            }

            if (fileVersion >= 34 && dataToWrite.Header.IsMultiplayerSave)
            {
                chunkReader.ReadExpectedTag(0x504D);
                // TODO: Skip rest
                // TODO: Read MP Settings data

                return;
            }
            else if (fileVersion < 34)
            {
                // TODO: Read old data?
                // TODO: --> same as [fileVersion >= 34]
            }



            if (fileVersion >= 33)
            {
                if (fileVersion >= 34)
                {
                    if (isScenario)
                    {
                        dataToWrite.NumPlayers = chunkReader.ReadInt32();

                        // Fade settings (see setGameFadeIn)
                        dataToWrite.FadeInOut    = chunkReader.ReadBoolean();
                        dataToWrite.FadeColor    = BangColor.Read(chunkReader);
                        dataToWrite.FadeDuration = chunkReader.ReadInt32();
                        dataToWrite.FadeDelay    = chunkReader.ReadInt32();
                    }
                    else
                    {
                        dataToWrite.FadeInOut = false;
                    }
                }

                // Home City Related
                bool unkBGameByte2744 = false;
                if (fileVersion < 43 || isScenario != true)
                {
                    unkBGameByte2744 = true;
                }
                else
                {
                    // Home city related
                    dataToWrite.HomeCityManager = BangHomeCityManager.Load(chunkReader);
                }

                // Campaign Related
                if (fileVersion >= 35)
                {
                    dataToWrite.CampaignIndex = chunkReader.ReadInt32();
                    int unkSubIndex = chunkReader.ReadInt32();
                }
            }

            if (!unkA7)
            {
                dataToWrite.PositionVersion   = chunkReader.ReadInt32IfTagged(0x5650); // Unknown? Default 0?
                dataToWrite.ColorVersion      = chunkReader.ReadInt32IfTagged(0x5656); // Unknown? Default 0?
                dataToWrite.CostVersion       = chunkReader.ReadInt32IfTagged(0x5643); // Unknown? Default 1?
                dataToWrite.BitArrayVersion   = chunkReader.ReadInt32IfTagged(0x4142); // Unknown? Default 0?
                dataToWrite.ConvexHullVersion = chunkReader.ReadInt32IfTagged(0x4843); // Unknown? Default 0?

                // Game specific load - START
                chunkReader.ReadExpectedTag(0x3352);
                var    unkVal   = chunkReader.ReadInt32();
                var    arrayLen = chunkReader.ReadInt32();
                string format   = chunkReader.ReadASCIIString(arrayLen);
                var    readByte = chunkReader.ReadBoolean(); // TODO: Must be compared with unkA5
                // Game specific load - END

                // Selection manager - START
                chunkReader.ReadExpectedTag(0x4D53);
                dataToWrite.CurrentSelectionMode = chunkReader.ReadInt32();
                if (dataToWrite.CurrentSelectionMode != 0)
                {
                    var numTypedIds = chunkReader.ReadInt32();
                    for (int i = 0; i < numTypedIds; i++)
                    {
                        int valX = chunkReader.ReadInt32();
                        int valY = chunkReader.ReadInt32();
                        // throw new NotImplementedException("Missing typed ids impl for selection mode");
                    }
                }
                else
                {
                    throw new NotImplementedException("Missing impl for extended tags");
                }

                if (dataToWrite.CurrentSelectionMode == 0)
                {
                    throw new NotImplementedException("Missing impl");
                }

                if (dataToWrite.CurrentSelectionMode == 1)
                {
                    throw new NotImplementedException("Missing impl");
                }

                if (dataToWrite.CurrentSelectionMode == 2)
                {
                    throw new NotImplementedException("Missing impl");
                }

                if (dataToWrite.CurrentSelectionMode == 3)
                {
                    throw new InvalidOperationException("Invalid?");
                }

                if (dataToWrite.CurrentSelectionMode == 4)
                {
                    throw new NotImplementedException("Missing impl");
                }

                if (dataToWrite.CurrentSelectionMode == 5)
                {
                    var num = chunkReader.ReadInt32();
                    for (int i = 0; i < num; i++)
                    {
                        var numInner = chunkReader.ReadInt32();
                        for (int j = 0; j < numInner; j++)
                        {
                            var tmpVal = chunkReader.ReadInt32();
                        }
                    }
                }
                // Selection manager - END

                // Proto - START
                if (!isScenario)
                {
                    throw new NotImplementedException("Embedded proto data is not implemented");
                }
                // Proto - END

                // TechTree - START
                if (!isScenario)
                {
                    throw new NotImplementedException("Embedded tech tree data is not implemented");
                }
                // TechTree - END

                // Quest Manager - START
                if (fileVersion >= 44)
                {
                    if (dataToWrite.Header.GameTarget == BangGameTarget.AgeOfEmpiresOnline)
                    {
                        chunkReader.ReadExpectedTag(0x4D51);
                        var questManagerUnkVal = chunkReader.ReadInt32();
                        if (isScenario && questManagerUnkVal >= 2)
                        {
                            var numElems = chunkReader.ReadInt32();

                            for (int i = 0; i < numElems; i++)
                            {
                                BangQuestArea newArea = new BangQuestArea();
                                newArea.Name = chunkReader.ReadString();

                                chunkReader.ReadExpectedTag(0x5451);
                                int unkQuestSubVal = chunkReader.ReadInt32();

                                int unkQuestSubCount = chunkReader.ReadInt32();
                                for (int j = 0; j < unkQuestSubCount; j++)
                                {
                                    BangPoint newPoint;
                                    newPoint.X = chunkReader.ReadInt32();
                                    newPoint.Y = chunkReader.ReadInt32();

                                    newArea.Points.Add(newPoint);
                                }

                                dataToWrite.QuestAreas.Add(newArea);
                            }
                        }
                    }
                }
                // Quest Manager - END


                // Trigger Manager - START
                chunkReader.ReadExpectedTag(0x5254);
                dataToWrite.TriggerManagerVersion = chunkReader.ReadInt32();

                var unkTriggerManagerDword0 = chunkReader.ReadInt32();
                if (dataToWrite.TriggerManagerVersion > 4)
                {
                    dataToWrite.TriggerNewID = chunkReader.ReadInt32();

                    if (dataToWrite.TriggerManagerVersion > 6)
                    {
                        chunkReader.ReadInt32(); // Unknown DWORD8?
                    }

                    int numOfTriggers = chunkReader.ReadInt32();
                    for (int i = 0; i < numOfTriggers; i++)
                    {
                        // Trigger - START
                        BangTrigger trigger = new BangTrigger();

                        trigger.Version = chunkReader.ReadInt32();
                        if (trigger.Version != 0)
                        {
                            trigger.ID = chunkReader.ReadInt32();
                            if (trigger.Version > 1)
                            {
                                trigger.GroupID = chunkReader.ReadInt32();
                            }
                            if (trigger.Version > 2)
                            {
                                trigger.Priority = chunkReader.ReadInt32();
                            }

                            trigger.Name = chunkReader.ReadASCIIString();
                            if (trigger.Version <= 2)
                            {
                                var name2 = chunkReader.ReadASCIIString();
                                var name3 = chunkReader.ReadASCIIString();
                            }

                            trigger.Unk2C         = chunkReader.ReadInt32();
                            trigger.Loop          = chunkReader.ReadBoolean();
                            trigger.IsActive      = chunkReader.ReadBoolean();
                            trigger.RunImmediatly = chunkReader.ReadBoolean();

                            if (trigger.Version >= 6)
                            {
                                trigger.Not = chunkReader.ReadBoolean();
                                trigger.Or  = chunkReader.ReadBoolean();
                            }

                            var numConditions = chunkReader.ReadInt32();
                            for (int j = 0; j < numConditions; j++)
                            {
                                trigger.Conditions.Add(ReadNextTriggerType());
                            }

                            var numEffects = chunkReader.ReadInt32();
                            for (int j = 0; j < numEffects; j++)
                            {
                                trigger.Effects.Add(ReadNextTriggerType());
                            }
                        }

                        dataToWrite.Triggers.Add(trigger);
                        // Trigger - END
                    }

                    if (dataToWrite.TriggerManagerVersion > 5)
                    {
                        // Groups
                        int numGroups = chunkReader.ReadInt32();
                        for (int i = 0; i < numGroups; i++)
                        {
                            BangTriggerGroup newGroup = new BangTriggerGroup();

                            int unkTrigGroupVal = chunkReader.ReadInt32();
                            if (unkTrigGroupVal != 0)
                            {
                                int unkTrigGroupDWord0 = chunkReader.ReadInt32(); // ID / Index ?

                                newGroup.Name = chunkReader.ReadASCIIString();
                                int numTriggerIDs = chunkReader.ReadInt32();
                                for (int j = 0; j < numTriggerIDs; j++)
                                {
                                    newGroup.TriggerIDs.Add(chunkReader.ReadInt32());
                                }
                            }

                            dataToWrite.TriggerGroups.Add(newGroup);
                        }
                    }
                }
                // Trigger Manager - END

                // World - START
                dataToWrite.World = ReadWorld(isScenario);
                // World - END
            }
        }
Exemplo n.º 3
0
 private static void ProcessStream(BinaryReader reader, BangGameTarget target, BangGameType type)
 {
     BangScenarioReader scReader = new BangScenarioReader(new BangChunkReader <BangDataHeader>(reader));
     BangData           data     = scReader.ReadAll(target, type);
 }