public BangData ReadAll(BangGameTarget target, BangGameType type) { BangData data = new BangData(); data.Header = BangDataHeader.Load(chunkReader, target, type); ReadBody(data); return(data); }
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 } }
private static void ProcessStream(BinaryReader reader, BangGameTarget target, BangGameType type) { BangScenarioReader scReader = new BangScenarioReader(new BangChunkReader <BangDataHeader>(reader)); BangData data = scReader.ReadAll(target, type); }