private void ReadPlayerInfo(BinaryFileReader reader) { for (int i = 0; i < GameConstants.PLAYER_LIMIT_T; i++) { PlayerInfo playerInfo = new PlayerInfo(); Console.WriteLine("Reading Player [" + i.ToString() + "]"); playerInfo.CanHumanPlay = reader.ReadBool(); playerInfo.CanComputerPlay = reader.ReadBool(); Console.WriteLine("canHumanPlay: " + playerInfo.CanHumanPlay); Console.WriteLine("canComputerPlay: " + playerInfo.CanComputerPlay); if (!playerInfo.CanHumanPlay && !playerInfo.CanComputerPlay) { switch (mapObject.Header.Version) { case EMapFormat.SOD: case EMapFormat.WOG: reader.Skip(13); break; case EMapFormat.AB: reader.Skip(12); break; case EMapFormat.ROE: reader.Skip(6); break; } continue; } playerInfo.AiTactic = (EAiTactic)reader.ReadUInt8(); Console.WriteLine("aiTactic:" + playerInfo.AiTactic); if (mapObject.Header.Version == EMapFormat.SOD || mapObject.Header.Version == EMapFormat.WOG) { playerInfo.P7 = reader.ReadUInt8(); } else { playerInfo.P7 = -1; } Console.WriteLine("p7:" + playerInfo.P7); // Reading the Factions for Player playerInfo.AllowedFactions = new List <int>(); int allowedFactionsMask = reader.ReadUInt8(); Console.WriteLine("allowedFactionsMask:" + allowedFactionsMask); int totalFactionCount = GameConstants.F_NUMBER; if (mapObject.Header.Version != EMapFormat.ROE) { allowedFactionsMask += reader.ReadUInt8() << 8; } else { totalFactionCount--; //exclude conflux for ROE } for (int fact = 0; fact < totalFactionCount; ++fact) { if ((allowedFactionsMask & (1 << fact)) > 0) { playerInfo.AllowedFactions.Add(fact); } } playerInfo.IsFactionRandom = reader.ReadBool(); playerInfo.HasMainTown = reader.ReadBool(); Console.WriteLine("isFactionRandom:" + playerInfo.IsFactionRandom); Console.WriteLine("hasMainTown:" + playerInfo.HasMainTown); if (playerInfo.HasMainTown) { /// Added in new version, not tested yet if (mapObject.Header.Version != EMapFormat.ROE) { playerInfo.GenerateHeroAtMainTown = reader.ReadBool(); playerInfo.GenerateHero = reader.ReadBool(); } else { playerInfo.GenerateHeroAtMainTown = true; playerInfo.GenerateHero = false; } var townPosition = reader.ReadPosition(); Console.WriteLine(string.Format("Main Town Position: {0}, {1}, {2}", townPosition.PosX, townPosition.PosY, townPosition.PosZ)); playerInfo.MainTownPosition = townPosition; } playerInfo.HasRandomHero = reader.ReadBool(); Console.WriteLine("hasRandomHero:" + playerInfo.HasRandomHero); playerInfo.MainCustomHeroId = reader.ReadUInt8(); Console.WriteLine("mainCustomHeroId:" + playerInfo.MainCustomHeroId); if (playerInfo.MainCustomHeroId != 0xff) { playerInfo.MainCustomHeroPortrait = reader.ReadUInt8(); if (playerInfo.MainCustomHeroPortrait == 0xff) { playerInfo.MainCustomHeroPortrait = -1; } playerInfo.MainCustomHeroName = reader.ReadString(); Console.WriteLine("mainCustomHeroPortrait:" + playerInfo.MainCustomHeroPortrait); Console.WriteLine("heroName:" + playerInfo.MainCustomHeroName); } else { playerInfo.MainCustomHeroId = -1; } if (mapObject.Header.Version != EMapFormat.ROE) { playerInfo.PowerPlaceHolders = reader.ReadUInt8(); int heroCount = reader.ReadUInt8(); reader.Skip(3); playerInfo.HeroIds = new List <HeroIdentifier>(); for (int pp = 0; pp < heroCount; ++pp) { HeroIdentifier heroId = new HeroIdentifier(); heroId.Id = reader.ReadUInt8(); heroId.Name = reader.ReadString(); playerInfo.HeroIds.Add(heroId); } } } }
private void ReadVictoryLossConditions(BinaryFileReader reader) { //// mapObject.Header.TrigggeredEvents = new List<TrigggeredEvent>(); var vicCondition = (EVictoryConditionType)reader.ReadUInt8(); if (vicCondition == EVictoryConditionType.WINSTANDARD) { // create normal condition } else { bool allowNormalVictory = reader.ReadBool(); bool appliesToAI = reader.ReadBool(); if (allowNormalVictory) { int playersOnMap = 2; if (playersOnMap == 1) { //// logGlobal->warn("Map %s has only one player but allows normal victory?", mapHeader->name); allowNormalVictory = false; // makes sense? Not much. Works as H3? Yes! } } switch (vicCondition) { case EVictoryConditionType.ARTIFACT: { int objectType = reader.ReadUInt8(); break; } case EVictoryConditionType.GATHERTROOP: { int objectType = reader.ReadUInt8(); uint value = reader.ReadUInt32(); break; } case EVictoryConditionType.GATHERRESOURCE: { int objectType = reader.ReadUInt8(); uint value = reader.ReadUInt32(); break; } case EVictoryConditionType.BUILDCITY: { var pos = reader.ReadPosition(); int objectType = reader.ReadUInt8(); int objectType2 = reader.ReadUInt8(); break; } case EVictoryConditionType.BUILDGRAIL: { var pos = reader.ReadPosition(); break; } case EVictoryConditionType.BEATHERO: { var pos = reader.ReadPosition(); break; } case EVictoryConditionType.CAPTURECITY: { var pos = reader.ReadPosition(); break; } case EVictoryConditionType.BEATMONSTER: { var pos = reader.ReadPosition(); break; } case EVictoryConditionType.TAKEDWELLINGS: { break; } case EVictoryConditionType.TAKEMINES: { break; } case EVictoryConditionType.TRANSPORTITEM: { uint value = reader.ReadUInt32(); var pos = reader.ReadPosition(); break; } default: break; } } ELossConditionType loseCondition = (ELossConditionType)reader.ReadUInt8(); Console.WriteLine("Lose Condition:" + loseCondition); if (loseCondition != ELossConditionType.LOSSSTANDARD) { switch (loseCondition) { case ELossConditionType.LOSSCASTLE: { var pos = reader.ReadPosition(); break; } case ELossConditionType.LOSSHERO: { var pos = reader.ReadPosition(); break; } case ELossConditionType.TIMEEXPIRES: { int val = reader.ReadUInt16(); break; } default: break; } } }