コード例 #1
0
        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);
                    }
                }
            }
        }
コード例 #2
0
        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;
                }
            }
        }