private HREngine.API.Actions.ActionBase UpdateBattleState()
        {
            HREngine.API.Actions.ActionBase result = NextFixedAction;

            if (result != null)
            {
                NextFixedAction = null;
                return(result);
            }
            HRPlayer ownPlayer   = HRPlayer.GetLocalPlayer();
            HRPlayer enemyPlayer = HRPlayer.GetEnemyPlayer();

            ownPlayerController = ownPlayer.GetControllerId();//ownPlayer.GetHero().GetControllerId()

            // create hero + minion data
            getHerostuff();
            getMinions();
            getHandcards();

            // send ai the data:
            Hrtprozis.Instance.setOwnPlayer(ownPlayerController);
            Handmanager.Instance.setOwnPlayer(ownPlayerController);
            Hrtprozis.Instance.updateOwnHero(this.ownHeroWeapon, this.heroWeaponAttack, this.heroWeaponDurability, this.heroImmuneToDamageWhileAttacking, this.heroAtk, this.heroHp, this.heroDefence, this.heroname, this.ownheroisread, this.ownheroAlreadyAttacked, this.herofrozen, this.heroAbility, this.ownAbilityisReady);
            Hrtprozis.Instance.updateEnemyHero(this.enemyHeroWeapon, this.enemyWeaponAttack, this.enemyWeaponDurability, this.enemyAtk, this.enemyHp, this.enemyDefence, this.enemyHeroname, this.enemyfrozen);
            Hrtprozis.Instance.updateMinions(this.ownMinions, this.enemyMinions);
            Handmanager.Instance.setHandcards(this.handCards, this.anzcards, this.enemyAnzCards);

            // print data
            Hrtprozis.Instance.printHero();
            Hrtprozis.Instance.printOwnMinions();
            Hrtprozis.Instance.printEnemyMinions();

            Handmanager.Instance.printcards();

            // Next cards to push...
            //result = PlayCardsToField();

            return(null);
        }
Exemple #2
0
        protected virtual HREngine.API.Actions.ActionBase UpdateBattleState()
        {
            HREngine.API.Actions.ActionBase result = NextFixedAction;

            if (result != null)
            {
                NextFixedAction = null;
                return(result);
            }

            // If a previous action was not handled successful the Bot remains
            // in target mode.
            // Target here with 'LastTarget'. If the specified Target is null
            // the bot automatically selects the best target based on a rule
            // or enemy condition.
            if (HRBattle.IsInTargetMode())
            {
                HRLog.Write("Targeting...");
                HREntity TargetEntity = PlayCardAction.LastTarget;
                if (TargetEntity == null)
                {
                    HRCardManager.GetTargetForCard(PlayCardAction.LastPlayedCard);
                    if (TargetEntity == null)
                    {
                        TargetEntity = GetNextAttackToAttack();
                    }
                }
                return(new TargetAction(TargetEntity));
            }

            var localPlayerState = new PlayerState(HRPlayer.GetLocalPlayer());
            var enemyPlayerState = new PlayerState(HRPlayer.GetEnemyPlayer());

            // Fix: Druid: doesn't attack (and even other)
            // https://github.com/Hearthcrawler/HREngine/issues/40
            if (!localPlayerState.Player.HasWeapon() &&
                localPlayerState.Player.GetHero().CanAttack() &&
                localPlayerState.Player.GetHero().GetATK() > 0 &&
                HRBattle.CanUseCard(localPlayerState.Player.GetHero()))
            {
                return(new AttackAction(
                           localPlayerState.Player.GetHero(), GetNextAttackToAttack()));
            }

            if (!enemyPlayerState.Player.HasATauntMinion())
            {
                if (enemyPlayerState.Player.GetHero().CanBeAttacked())
                {
                    var current = PlayerState.GetPossibleAttack(
                        localPlayerState.Player, enemyPlayerState.Health);

                    if (current.Attack >= enemyPlayerState.Health)
                    {
                        if (current.Cards.Count > 0)
                        {
                            return(new AttackAction(current.Cards[0], enemyPlayerState.Player.GetHero()));
                        }
                    }
                }
            }

            if (IsDefaultHealingEnabled())
            {
                if (localPlayerState.Player.GetHero().GetClass() == HRClass.PRIEST)
                {
                    if (localPlayerState.Player.GetHeroPower().GetCost() <= localPlayerState.Mana)
                    {
                        if (localPlayerState.Health <= 17)
                        {
                            if (HRBattle.CanUseCard(localPlayerState.Player.GetHeroPower()))
                            {
                                return(new PlayCardAction(
                                           localPlayerState.Player.GetHeroPower().GetCard(),
                                           HRPlayer.GetLocalPlayer().GetHero()));
                            }
                        }
                        else
                        {
                            // FIX: Heal minions if possible
                            // https://github.com/Hearthcrawler/HREngine/issues/27
                            foreach (var item in localPlayerState.ReadyMinions)
                            {
                                if (item.GetRemainingHP() < item.GetHealth())
                                {
                                    // Heal damaged minions...
                                    if (HRBattle.CanUseCard(localPlayerState.Player.GetHeroPower()))
                                    {
                                        return(new PlayCardAction(
                                                   localPlayerState.Player.GetHeroPower().GetCard(),
                                                   HRPlayer.GetLocalPlayer().GetHero()));
                                    }
                                }
                            }
                        }
                    }
                }
            }

            // Next cards to push...
            if (HRPlayer.GetLocalPlayer().GetNumFriendlyMinionsInPlay() < 7)
            {
                result = PlayCardsToField();
                if (result != null)
                {
                    return(result);
                }
                else
                {
                    // There are no cards to play..
                    if (localPlayerState.Player.GetHero().GetClass() == HRClass.WARLOCK)
                    {
                        // Can we use our hero power?
                        // Warlock should not suicide.
                        // FIX: https://github.com/Hearthcrawler/HREngine/issues/30
                        if (localPlayerState.Health >= 10)
                        {
                            // At least 3 mana left if we draw a card, okay?
                            if (localPlayerState.Player.GetHeroPower().GetCost() + 3 <= localPlayerState.Mana)
                            {
                                if (HRBattle.CanUseCard(localPlayerState.Player.GetHeroPower()))
                                {
                                    return(new PlayCardAction(localPlayerState.Player.GetHeroPower().GetCard()));
                                }
                            }
                        }
                    }
                }
            }

            // Priority: Always attack taunt minions first.
            if (enemyPlayerState.TauntMinions.Count > 0)
            {
                result = AttackTauntMinions(enemyPlayerState);
                if (result != null)
                {
                    return(result);
                }
            }

            // Bot does not attack when there is stealthed taunts
            // Fix: https://github.com/Hearthcrawler/HREngine/issues/60
            // If AttackTauntMinions() cannot attack because of stealthed - the action is null
            // and the bot should continue with default attack routine.
            //
            // Attack other minions or hero...
            result = Attack();
            if (result != null)
            {
                return(result);
            }

            // Use Hero Power that make sense at last...
            if (localPlayerState.Player.GetHeroPower().GetCost() <= localPlayerState.Mana)
            {
                switch (localPlayerState.Player.GetHero().GetClass())
                {
                case HRClass.DRUID:
                case HRClass.WARRIOR:
                case HRClass.MAGE:
                case HRClass.PALADIN:
                case HRClass.HUNTER:
                case HRClass.SHAMAN:
                case HRClass.ROGUE:
                {
                    if (HRBattle.CanUseCard(localPlayerState.Player.GetHeroPower()))
                    {
                        return(new PlayCardAction(localPlayerState.Player.GetHeroPower().GetCard()));
                    }
                }
                break;

                default:
                    break;
                }
            }

            return(null);
        }