/// <summary>
        /// 随从进场位置
        /// </summary>
        /// <param name="game"></param>
        /// <returns></returns>
        private int GetMinionPos(BattleFieldInfo battleInfo)
        {
            var frm = new PutMinion(battleInfo);

            frm.ShowDialog();
            return(frm.MinionPos);
        }
        public void CorrectlyGeneratesBattlefield_ShadeGroupingAndBellTerrainConfiguration()
        {
            const int fighterLevel = 1;
            FighterGroupingConfiguration groupingConfig = new ShadeGroupingConfiguration(3, fighterLevel);

            BellType[] bellTypes = { BellType.Copper, BellType.Silver };
            TerrainInteractablesConfiguration terrainConfiguration = new BellTerrainConfiguration(bellTypes);

            BattlefieldConfiguration config = new BattlefieldConfiguration(groupingConfig, terrainConfiguration);

            BattleFieldInfo returnedBattleFieldInfo = _factory.GetBattleFieldSetUp(config);

            List <IFighter> fighters = returnedBattleFieldInfo.EnemyTeam.Fighters;

            Assert.AreEqual(3, fighters.Count);
            Assert.True(fighters.TrueForAll(f => f is Shade), "the returned fighters should be Shades!");
            Assert.True(fighters.TrueForAll(f => f.Level == fighterLevel), $"the returned fighters should all be level {fighterLevel}!");

            List <TerrainInteractable> terrainInteractables = returnedBattleFieldInfo.TerrainInteractables.ToList();

            Assert.AreEqual(2, terrainInteractables.Count);
            Assert.True(terrainInteractables.TrueForAll(b => b is Bell));

            List <Bell> bells = terrainInteractables.OfType <Bell>().ToList();

            for (var i = 0; i < bellTypes.Length; ++i)
            {
                Assert.AreEqual(bellTypes[i], bells[i].BellType);
            }
        }
        public BattleFieldInfo GetBattleFieldInfo(SubRegion region, int round)
        {
            BattleFieldInfo generatedBattleFieldInfo = null;

            if (round < region.NumberRegularBattles)
            {
                BattlefieldConfiguration battlefieldConfig =
                    region.ScriptedBattlefieldConfigurations.FirstOrDefault(script => script.BattleIndex == round)?
                    .BattlefieldConfig;

                if (battlefieldConfig == null)
                {
                    Team generatedTeam = _teamFactory.GetTeam(region);
                    generatedBattleFieldInfo = new BattleFieldInfo(generatedTeam, new List <TerrainInteractable>());
                }
                else
                {
                    generatedBattleFieldInfo = _battlefieldFactory.GetBattleFieldSetUp(battlefieldConfig);
                }
            }
            else
            {
                generatedBattleFieldInfo = _battlefieldFactory.GetBattleFieldSetUp(region.BossConfiguration);
            }

            return(generatedBattleFieldInfo);
        }
        public void CorrectlyGeneratesEmptyListOfTerrainInteractables_FromNullInput()
        {
            TeamConfiguration        teamInfo          = new TeamConfiguration(new EnemyConfiguration(FighterType.Goblin, 1), new EnemyConfiguration(FighterType.Fairy, 1));
            BattlefieldConfiguration battlefieldConfig = new BattlefieldConfiguration(teamInfo);

            BattleFieldInfo returnedBattleFieldInfo = _factory.GetBattleFieldSetUp(battlefieldConfig);

            Assert.NotNull(returnedBattleFieldInfo.TerrainInteractables);
            Assert.AreEqual(0, returnedBattleFieldInfo.TerrainInteractables.ToList().Count);
        }
        private BattleEndStatus BattleThroughSubRegion(SubRegion subRegion, BattleManager manager, Team playerTeam)
        {
            bool            continuer       = true;
            BattleEndStatus battleEndStatus = BattleEndStatus.None;

            int numberRegularBattles = subRegion.NumberRegularBattles;

            for (var i = 0; i <= numberRegularBattles && continuer; ++i)
            {
                //var enemyTeam = GetEnemies(subRegion, i);
                BattleFieldInfo battlefiendInfo = GetBattleFieldInfo(subRegion, i);

                BattleManagerBattleConfiguration config = GetBattleConfiguration(subRegion, i);

                if (i == numberRegularBattles)
                {
                    PrintBossIntro(subRegion.AreaId);
                }

                battleEndStatus = manager.Battle(playerTeam, battlefiendInfo.EnemyTeam, battlefiendInfo.TerrainInteractables.ToList(), config);

                if (battleEndStatus != BattleEndStatus.Victory)
                {
                    continuer = false;
                }
                else
                {
                    foreach (IFighter player in playerTeam.Fighters)
                    {
                        if (!player.IsAlive())
                        {
                            player.Revive(1);
                        }
                        player.Heal(player.MaxHealth);
                        player.RestoreMana(player.MaxMana);
                    }

                    _output.WriteLine("HP and Mana fully restored!");
                    _input.WaitAndClear(_output);
                }
            }

            return(battleEndStatus);
        }
        public void CorrectlyGeneratesBattlefield_TeamConfiguration_NoTerrainConfiguration()
        {
            TeamConfiguration        teamInfo          = new TeamConfiguration(new EnemyConfiguration(FighterType.Goblin, 1), new EnemyConfiguration(FighterType.Fairy, 1));
            BattlefieldConfiguration battlefieldConfig = new BattlefieldConfiguration(teamInfo);

            BattleFieldInfo returnedBattleFieldInfo = _factory.GetBattleFieldSetUp(battlefieldConfig);

            List <IFighter> fighters = returnedBattleFieldInfo.EnemyTeam.Fighters;

            Assert.AreEqual(2, fighters.Count);

            IFighter firstFighter = fighters[0];

            Assert.True(firstFighter is Goblin, $"first fighter should be a Goblin but was {firstFighter.GetType()}");
            Assert.True(firstFighter.Level == 1, "first fighter should be level 1");

            IFighter secondFighter = fighters[1];

            Assert.True(secondFighter is Fairy, $"second fighter should be a fairy but was {secondFighter.GetType()}");
            Assert.True(secondFighter.Level == 1, "second fighter should be level 1");
        }
 public PutMinion(BattleFieldInfo _playerInfo)
 {
     InitializeComponent();
     playerInfo = _playerInfo;
 }