Пример #1
0
        public void Update(GameStateAnalyser.Report p_gameStateReport)
        {
            //check if timer btn is availavle and off, and turn it on (foce enemy to move within 150sec)
            if (p_gameStateReport.isTimerBtnAvailable)
            {
                p_gameStateReport.timerBtn.Click();
            }

            //AI logic
            if (p_gameStateReport.isInBattle)
            {
                Action __doSwitchPokemon = () =>
                {
                    _interface.Log("choosing_new_pokemon");
                    var __availableTeamMembers = p_gameStateReport.availableTeamMembersBtns;

                    if ((new Random().Next(100) > 20))
                    {
                        GameStateAnalyser.PokemonTypeEffectivenessType __currentType = GameStateAnalyser.PokemonTypeEffectivenessType.NO_EFFECT;
                        var __currentBtn   = __availableTeamMembers[0];
                        var __enemyPokemon = p_gameStateReport.currentEnemyPokemon;

                        foreach (var teamMemberBtn in __availableTeamMembers)
                        {
                            var __pokemon = teamMemberBtn.pokemonData;
                            var __result  = GameStateAnalyser.SimulateCombatResult(__pokemon, __enemyPokemon);
                            if (__result == GameStateAnalyser.PokemonTypeEffectivenessType.NO_EFFECT)
                            {
                                continue;
                            }

                            if (__result == GameStateAnalyser.PokemonTypeEffectivenessType.NOT_VERY_EFFECTIVE)
                            {
                                if (__currentType == GameStateAnalyser.PokemonTypeEffectivenessType.NO_EFFECT)
                                {
                                    __currentType = __result;
                                    __currentBtn  = teamMemberBtn;
                                }
                                continue;
                            }

                            if (__result == GameStateAnalyser.PokemonTypeEffectivenessType.NORMAL_EFFECTIVENESS)
                            {
                                if (__currentType == GameStateAnalyser.PokemonTypeEffectivenessType.NOT_VERY_EFFECTIVE ||
                                    __currentType == GameStateAnalyser.PokemonTypeEffectivenessType.NO_EFFECT)
                                {
                                    __currentType = __result;
                                    __currentBtn  = teamMemberBtn;
                                }
                                continue;
                            }

                            if (__result == GameStateAnalyser.PokemonTypeEffectivenessType.SUPER_EFFECTIVE)
                            {
                                __currentType = __result;
                                __currentBtn  = teamMemberBtn;
                            }
                        }

                        __currentBtn.Click();
                    }
                    else
                    {
                        __availableTeamMembers[(new Random().Next(__availableTeamMembers.Count))].Click();
                    }
                    _interface.Log("new_pokemon_choosed");
                };

                if (p_gameStateReport.isGameOver)
                {
                    _interface.Log("end_of_game_detected");
                    p_gameStateReport.closeGameBtn.Click();
                    _interface.Log("game_window_closed");
                }
                else if (p_gameStateReport.isSkillsMenuAvailable)
                {
                    _interface.Log("choosing_skill");
                    var __availableSkills = p_gameStateReport.availableSkillsBtns;

                    bool __hasSuperEffectiveAttack = false;
                    GameStateAnalyser.SkillButton __superEffectAttack = null;
                    int __superEffectAttackBasePower = 0;
                    foreach (var skillBtn in __availableSkills)
                    {
                        if (GameStateAnalyser.SimulateCombatResult(
                                skillBtn.pokemonType,
                                p_gameStateReport.currentEnemyPokemon.pokemonTypeMain,
                                p_gameStateReport.currentEnemyPokemon.pokemonTypeSub) == GameStateAnalyser.PokemonTypeEffectivenessType.SUPER_EFFECTIVE)
                        {
                            __hasSuperEffectiveAttack = true;
                            if (__superEffectAttackBasePower < skillBtn.basePower)
                            {
                                __superEffectAttack          = skillBtn;
                                __superEffectAttackBasePower = skillBtn.basePower;
                            }
                        }
                    }

                    if (__hasSuperEffectiveAttack && __superEffectAttack != null)
                    {
                        _interface.Log("choosing_super_effective_skill");
                        __superEffectAttack.Click();
                    }
                    else
                    {
                        Action __doChooseRandomSkill = () =>
                        {
                            _interface.Log("choosing_random_skill");
                            var __randomBtn = __availableSkills[(new System.Random()).Next(__availableSkills.Count)];
                            __randomBtn.Click();
                        };

                        Action __doChooseStrongesAttack = () =>
                        {
                            _interface.Log("enemy_has_low_helth");
                            _interface.Log("choosing_strongest_attack");

                            int __skillsPower = 0;
                            var __skill       = __availableSkills[0];

                            foreach (var skill in __availableSkills)
                            {
                                if (skill.basePower > __skillsPower)
                                {
                                    __skillsPower = skill.basePower;
                                    __skill       = skill;
                                }
                            }
                            __skill.Click();
                        };

                        Action __doUseSkill = () =>
                        {
                            if (p_gameStateReport.currentMyPokemonHP <= 50 || p_gameStateReport.currentEnemyPokemonHP <= 20)
                            {
                                __doChooseStrongesAttack();
                            }
                            else
                            {
                                __doChooseRandomSkill();
                            }
                        };

                        if (p_gameStateReport.isTeamMenuAvailable && p_gameStateReport.currentEnemyPokemonHP > 20)
                        {
                            var __enemyPokemon = p_gameStateReport.currentEnemyPokemon;
                            var __myPokemon    = p_gameStateReport.currentMyPokemon;

                            var __defenseSimulationResult = GameStateAnalyser.SimulateCombatResult(__enemyPokemon, __myPokemon);

                            bool __isEnemySuperEffectiveAgainstMe = __defenseSimulationResult == GameStateAnalyser.PokemonTypeEffectivenessType.SUPER_EFFECTIVE;
                            bool __isMeSuperEffectiveAgainstEnemy = __defenseSimulationResult == GameStateAnalyser.PokemonTypeEffectivenessType.NO_EFFECT;

                            if (__isMeSuperEffectiveAgainstEnemy || __isEnemySuperEffectiveAgainstMe == false || (_lastEnemyToMeSwitch == __enemyPokemon.pokemonName))
                            {
                                __doUseSkill();
                            }
                            else
                            {
                                _lastEnemyToMeSwitch = __enemyPokemon.pokemonName;
                                __doSwitchPokemon();
                            }
                        }
                        else
                        {
                            __doUseSkill();
                        }
                    }
                }
                else if (p_gameStateReport.isTeamMenuAvailable)
                {
                    if (p_gameStateReport.currentEnemyPokemon != null)
                    {
                        _lastEnemyToMeSwitch = p_gameStateReport.currentEnemyPokemon.pokemonName;
                    }
                    __doSwitchPokemon();
                }
            }
            else
            {
                if (p_gameStateReport.isBeingChallenged)
                {
                    _interface.Log("accepting_challenge");
                    p_gameStateReport.acceptChallengeBtn.Click();
                }
            }
        }
Пример #2
0
 public void Awake()
 {
     //initialize class members
     _gameAnalyser = new GameStateAnalyser();
     _bot          = new Bot();
 }