private static Handcard BigGroupDecision(Playfield p, FightState fightState)
        {
            var aoe   = p.enemyMinions.Where(n => n.card.aoeAir || n.card.aoeGround);
            var tanks = p.ownMinions.Where(n => Classification.IsMobsTankCurrentHP(n));

            // ToDo: Improve condition
            switch (fightState)
            {
            case FightState.UAPTL1:
            case FightState.UAKTL1:
            case FightState.APTL1:
            case FightState.DPTL1:
                if (aoe.Any(n => n.Line == 1) || !tanks.Any(n => n.Line == 1))
                {
                    return(null);
                }
                break;

            case FightState.UAKTL2:
            case FightState.UAPTL2:
            case FightState.APTL2:
            case FightState.DPTL2:
                if (aoe.Any(n => n.Line == 2) || !tanks.Any(n => n.Line == 2))
                {
                    return(null);
                }
                break;

            case FightState.AKT:
            case FightState.DKT:
                if (aoe.Any(n => n.Line == 1) || !tanks.Any(n => n.Line == 1) ||
                    aoe.Any(n => n.Line == 2) || !tanks.Any(n => n.Line == 2))
                {
                    return(null);
                }
                break;

            default:
                break;
            }
            return(Classification.GetOwnHandCards(p, boardObjType.MOB, SpecificCardType.MobsBigGroup).FirstOrDefault());
        }
Exemple #2
0
        private static Handcard AOEDecision(Playfield p)
        {
            Handcard aoeGround = null, aoeAir = null;

            var objGround = Helper.EnemyCharacterWithTheMostEnemiesAround(p, out int biggestEnemieGroupCount, transportType.GROUND);

            if (biggestEnemieGroupCount > 3)
            {
                aoeGround = Classification.GetOwnHandCards(p, boardObjType.MOB, SpecificCardType.MobsAOEGround).FirstOrDefault();
            }

            var objAir = Helper.EnemyCharacterWithTheMostEnemiesAround(p, out biggestEnemieGroupCount, transportType.AIR);

            if (biggestEnemieGroupCount > 3)
            {
                aoeAir = Classification.GetOwnHandCards(p, boardObjType.MOB, SpecificCardType.MobsAOEAll).FirstOrDefault();
            }

            return(aoeAir ?? aoeGround);
        }
Exemple #3
0
        public static bool DeployBuildingDecision(Playfield p, out Handcard buildingCard, FightState currentSituation)
        {
            buildingCard = null;
            var condition = false;

            var hcMana     = Classification.GetOwnHandCards(p, boardObjType.BUILDING, SpecificCardType.BuildingsMana).FirstOrDefault();
            var hcDefense  = Classification.GetOwnHandCards(p, boardObjType.BUILDING, SpecificCardType.BuildingsDefense).FirstOrDefault();
            var hcAttack   = Classification.GetOwnHandCards(p, boardObjType.BUILDING, SpecificCardType.BuildingsAttack).FirstOrDefault();
            var hcSpawning = Classification.GetOwnHandCards(p, boardObjType.BUILDING, SpecificCardType.BuildingsSpawning).FirstOrDefault();


            // Just for Defense
            if ((int)currentSituation < 3)
            {
                return(false);
            }

            if (hcMana != null)
            {
                condition = true;
            }
            if (hcSpawning != null)
            {
                condition = true;
            }
            if (hcDefense != null)
            {
                condition = true;
            }

            // ToDo: Attack condition

            // ToDo: Underattack condition

            return(condition);
        }
Exemple #4
0
        private static VectorAI PrincessTowerCharacterDeploymentCorrection(VectorAI position, Playfield p, Handcard hc)
        {
            if (hc?.card == null || position == null)
            {
                return(null);
            }

            //Logger.Debug("PT Characer Position Correction: Name und Typ {0} " + cardToDeploy.Name, (cardToDeploy as CardCharacter).Type);
            if (hc.card.type == boardObjType.MOB)
            {
                if (hc.card.MaxHP >= Setting.MinHealthAsTank)
                {
                    return(p.getDeployPosition(position, deployDirectionRelative.Up, 100));
                }

                // ToDo: Maybe if there is already a tank, place it behind him

                //if(Classification.GetMoreSpecificCardType(hc, SpecificCardType.MobsAOE) == MoreSpecificMobCardType.AOEGround)
                //{
                //    return p.getDeployPosition(position, deployDirectionRelative.Up, 100);
                //}

                if (Classification.GetSpecificCardType(hc) == SpecificCardType.MobsRanger)
                {
                    return(p.getDeployPosition(position, deployDirectionRelative.Down, 2000));
                }

                return(p.getDeployPosition(position, deployDirectionRelative.Up, 100));
            }
            else
            {
                Logger.Debug("Tower Correction: No Correction!!!");
            }

            return(position);
        }
Exemple #5
0
        public static Handcard All(Playfield p, FightState currentSituation, out VectorAI choosedPosition)
        {
            // TODO: Use more current situation
            Logger.Debug("Path: Spell - All");
            Logger.Debug("FightState: " + currentSituation);

            Handcard damagingSpell = DamagingSpellDecision(p, out choosedPosition);

            if (damagingSpell != null)
            {
                return(damagingSpell);
            }

            Handcard aoeCard = AOEDecision(p);

            if (aoeCard != null)
            {
                return(aoeCard);
            }

            if (p.enemyMinions.Any(n => n.Transport == transportType.AIR))
            {
                Logger.Debug("AttackFlying Needed");
                Handcard atkFlying = Classification.GetOwnHandCards(p, boardObjType.MOB, SpecificCardType.MobsFlyingAttack).FirstOrDefault();
                if (atkFlying != null)
                {
                    return(atkFlying);
                }
            }

            if (DeployBuildingDecision(p, out Handcard buildingCard, currentSituation))
            {
                if (buildingCard != null)
                {
                    return(new Handcard(buildingCard.name, buildingCard.lvl));
                }
            }

            // ToDo: Don´t play a tank, if theres already one on this side
            if ((int)currentSituation < 3 || (int)currentSituation > 6) // Just not at Under Attack
            {
                var tank = Classification.GetOwnHandCards(p, boardObjType.MOB, SpecificCardType.MobsTank).OrderBy(n => n.card.MaxHP);
                var lt   = tank.LastOrDefault();
                if (lt != null && lt.manacost <= p.ownMana)
                {
                    return(lt);
                }
            }

            // ToDo: Decision for building attacker
            if ((int)currentSituation > 6 && (int)currentSituation < 10)
            {
                var buildingAtkCard = Classification.GetOwnHandCards(p, boardObjType.MOB, SpecificCardType.MobsBuildingAttacker).FirstOrDefault();
                if (buildingAtkCard != null && buildingAtkCard.manacost <= p.ownMana)
                {
                    return(buildingAtkCard);
                }
            }

            if ((int)currentSituation < 3)
            {
                var highestHP = Classification.GetOwnHandCards(p, boardObjType.MOB, SpecificCardType.All)
                                .Where(n => n.manacost - p.ownMana <= 0)
                                .OrderBy(n => n.card.MaxHP).LastOrDefault();

                return(highestHP);
            }

            var rangerCard = Classification.GetOwnHandCards(p, boardObjType.MOB, SpecificCardType.MobsRanger).FirstOrDefault();

            if (rangerCard != null && rangerCard.manacost <= p.ownMana)
            {
                return(rangerCard);
            }

            var damageDealerCard = Classification.GetOwnHandCards(p, boardObjType.MOB, SpecificCardType.MobsDamageDealer).FirstOrDefault();

            if (damageDealerCard != null && damageDealerCard.manacost <= p.ownMana)
            {
                return(damageDealerCard);
            }

            if ((int)currentSituation >= 3 && (int)currentSituation <= 6)
            {
                return(Classification.GetOwnHandCards(p, boardObjType.MOB, SpecificCardType.MobsNoTank).FirstOrDefault());
            }

            Logger.Debug("Wait - No card selected...");
            return(null);
        }
Exemple #6
0
        // TODO: Check this out
        public static Handcard DamagingSpellDecision(Playfield p, out VectorAI choosedPosition)
        {
            choosedPosition = null;

            var damagingSpellsSource =
                Classification.GetOwnHandCards(p, boardObjType.PROJECTILE, SpecificCardType.SpellsDamaging);
            var damagingSpells = damagingSpellsSource as Handcard[] ?? damagingSpellsSource.ToArray();
            var fds            = damagingSpells.FirstOrDefault();

            if (fds == null)
            {
                return(null);
            }


            #region Tower
            var ds5 = damagingSpells.FirstOrDefault(n => (n.card.towerDamage >= p.enemyKingsTower.HP));
            if (ds5 != null)
            {
                Logger.Debug("towerDamage: {td} ; kt.hp: {kthp}", ds5.card.towerDamage,
                             p.enemyKingsTower.HP);
                choosedPosition = p.enemyKingsTower.Position;
                return(ds5);
            }

            if (p.suddenDeath)
            {
                var ds3 = damagingSpells.FirstOrDefault(n => (n.card.towerDamage >= p.enemyPrincessTower1.HP));
                var ds4 = damagingSpells.FirstOrDefault(n => (n.card.towerDamage >= p.enemyPrincessTower2.HP));

                if (ds3 != null && p.enemyPrincessTower1.HP > 0)
                {
                    Logger.Debug("towerDamage: {td} ; pt1.hp: {pt1hp}", ds3.card.towerDamage,
                                 p.enemyPrincessTower1.HP);
                    choosedPosition = p.enemyPrincessTower1.Position;
                    return(ds3);
                }

                if (ds4 != null && p.enemyPrincessTower2.HP > 0)
                {
                    Logger.Debug("towerDamage: {td} ; pt1.hp: {pt1hp}", ds4.card.towerDamage,
                                 p.enemyPrincessTower2.HP);
                    choosedPosition = p.enemyPrincessTower2.Position;
                    return(ds4);
                }
            }
            #endregion

            var radiusOrderedDS = damagingSpells.OrderBy(n => n.card.DamageRadius).LastOrDefault();

            if (radiusOrderedDS == null)
            {
                return(null);
            }

            var Group = p.getGroup(false, 200, boPriority.byTotalNumber, radiusOrderedDS.card.DamageRadius);

            if (Group == null)
            {
                return(null);
            }

            var grpCount = Group.lowHPbo.Count() + Group.avgHPbo.Count() + Group.hiHPbo.Count();
            var hpSum    = Group.lowHPboHP + Group.hiHPboHP + Group.avgHPboHP;

            var ds1 = damagingSpells.FirstOrDefault(n => n.card.DamageRadius > 3 && grpCount > 4);

            if (ds1 != null)
            {
                Logger.Debug("Damaging-Spell-Decision: HP-Sum of group = " + hpSum);
                choosedPosition = p.getDeployPosition(Group.Position, deployDirectionRelative.Down, 1000);
                return(ds1);
            }

            var ds2 = damagingSpells.FirstOrDefault(n => n.card.DamageRadius <= 3 && grpCount > 1 && hpSum >= n.card.Atk * 2);

            if (ds2 != null)
            {
                Logger.Debug("Damaging-Spell-Decision: HP-Sum of group = " + hpSum);
                choosedPosition = p.getDeployPosition(Group.Position, deployDirectionRelative.Down, 1000);
                return(ds2);
            }

            return(null);
        }
Exemple #7
0
        private static Handcard AttackKingTowerWithSpell(Playfield p)
        {
            var spells = Classification.GetOwnHandCards(p, boardObjType.AOE, SpecificCardType.SpellsDamaging);

            return(spells?.FirstOrDefault());
        }