private static void SleepTalk(AtkContext atk)
        {
            var aer   = atk.Attacker;
            var moves = new List <MoveTypeE>();

            foreach (var m in aer.Moves)
            {
                if (!(m.MoveE.PrepareOneTurn || SLEEPTALK_BLOCK.Contains(m.MoveE.Id)))
                {
                    moves.Add(m.MoveE);
                }
            }
            var n = moves.Count;

            if (n == 0)
            {
                atk.FailAll();
            }
            else
            {
                atk.StartExecute(moves[aer.Controller.GetRandomInt(0, moves.Count - 1)]);
            }
        }
        private static void Assist(AtkContext atk)
        {
            var aer   = atk.Attacker;
            var moves = new List <MoveTypeE>();

            foreach (var pm in aer.Field.Pokemons)
            {
                if (pm != aer && pm.Pokemon.Owner == aer.Pokemon.Owner)
                {
                    foreach (var m in pm.Moves)
                    {
                        if (!ASSIST_BLOCK.Contains(m.MoveE.Id))
                        {
                            moves.Add(m.MoveE);
                        }
                    }
                }
            }
            for (int i = aer.Controller.GameSettings.Mode.OnboardPokemonsPerPlayer(); i < aer.Pokemon.Owner.Pokemons.Count(); ++i)
            {
                foreach (var m in aer.Pokemon.Owner.GetPokemon(i).Moves)
                {
                    if (!ASSIST_BLOCK.Contains(m.MoveE.Id))
                    {
                        moves.Add(m.MoveE);
                    }
                }
            }
            if (moves.Count == 0)
            {
                atk.FailAll();
            }
            else
            {
                atk.StartExecute(moves[aer.Controller.GetRandomInt(0, moves.Count - 1)]);
            }
        }
示例#3
0
        private static void Assist(AtkContext atk)
        {
            var aer   = atk.Attacker;
            var moves = new List <MoveTypeE>();

            foreach (var pm in aer.Pokemon.Owner.Pokemons)
            {
                foreach (var m in pm.Pokemon.Moves)
                {
                    if (pm != aer && !(ASSIST_BLOCK.Contains(m.Type.Id)))
                    {
                        moves.Add(MoveTypeE.Get(m.Type));
                    }
                }
            }
            if (moves.Count == 0)
            {
                atk.FailAll();
            }
            else
            {
                atk.StartExecute(moves[aer.Controller.GetRandomInt(0, moves.Count - 1)]);
            }
        }
示例#4
0
        private static void Generic(AtkContext atk)
        {
            var move = atk.Move;
            var aer  = atk.Attacker;

            if (move.PrepareOneTurn && PrepareOneTurn(atk))
            {
                return;
            }

            if (aer.Controller.GameSettings.Mode.XBound() != 1 && (move.Id == Ms.WATER_PLEDGE || move.Id == Ms.FIRE_PLEDGE || move.Id == Ms.GRASS_PLEDGE))
            {
                if (aer.Field.AddTurnCondition(Cs.Plege, move.Id))
                {
                    foreach (var pm in aer.Controller.ActingPokemons)
                    {
                        if (pm.Pokemon.TeamId == aer.Pokemon.TeamId && pm.SelectedMove != null &&
                            pm.SelectedMove.MoveE.Id != move.Id && (pm.SelectedMove.MoveE.Id == Ms.WATER_PLEDGE || pm.SelectedMove.MoveE.Id == Ms.FIRE_PLEDGE || pm.SelectedMove.MoveE.Id == Ms.GRASS_PLEDGE) &&
                            pm.CanMove)
                        {
                            aer.ShowLogPm(Ls.Pledge, pm.Id);
                            aer.Controller.Board.SetTurnCondition(Cs.NextActingPokemon, pm);
                            return;
                        }
                    }
                }
            }

            if (move.Snatchable)
            {
                foreach (var pm in atk.Controller.OnboardPokemons)
                {
                    if (pm.OnboardPokemon.HasCondition(Cs.Snatch))
                    {
                        pm.OnboardPokemon.RemoveCondition(Cs.Snatch);
                        pm.ShowLogPm("Snatch", aer.Id);
                        var s = new AtkContext(pm)
                        {
                            Move = move
                        };
                        InitAtkContext.Execute(s);
                        MoveE.BuildDefContext(s, null);
                        if (MoveNotFail.Execute(s))
                        {
                            MoveAct.Execute(s);
                        }
                        else
                        {
                            s.FailAll();
                        }
                        atk.SetAttackerAction(PokemonAction.Done);
                        return;
                    }
                }
            }

            if (move.MagicCoat && atk.Targets == null && !atk.HasCondition(Cs.IgnoreMagicCoat))
            {
                foreach (var p in aer.Controller.GetOnboardPokemons(1 - aer.Pokemon.TeamId))
                {
                    if (STs.MagicCoat(atk, p))
                    {
                        atk.SetCondition(Cs.MagicCoat, new List <PokemonProxy>()
                        {
                            p
                        });
                        atk.FailAll(null);
                        MoveE.MagicCoat(atk);
                        return;
                    }
                }
            }

            CalculateType.Execute(atk);

            if (atk.Type == BattleType.Fire && aer.OnboardPokemon.HasCondition(Cs.Powder))
            {
                aer.EffectHurtByOneNth(4, Ls.Powder);
                atk.FailAll(null);
                return;
            }
            if (atk.Move.Move.Category != MoveCategory.Status)
            {
                if (atk.Type == BattleType.Fire && aer.Controller.Board.GetCondition <int>(Cs.SpWeather) == As.PRIMORDIAL_SEA)
                {
                    atk.FailAll(Ls.HeavyRain);
                    return;
                }
                if (atk.Type == BattleType.Water && aer.Controller.Board.GetCondition <int>(Cs.SpWeather) == As.DESOLATE_LAND)
                {
                    atk.FailAll(Ls.HarshSunlight);
                    return;
                }
            }
            if (aer.AbilityE(As.PROTEAN) && aer.OnboardPokemon.SetTypes(atk.Type))
            {
                aer.RaiseAbility();
                aer.ShowLogPm("TypeChange", (int)atk.Type);
            }

            MoveE.FilterDefContext(atk);
            if (atk.Targets != null && atk.Target == null)
            {
                atk.FailAll(null);
            }
            else
            {
                MoveAct.Execute(atk);
                MoveE.MoveEnding(atk);
            }

            if (move.MagicCoat && atk.Targets != null)
            {
                MoveE.MagicCoat(atk);
            }
        }
示例#5
0
        /// <summary>
        /// contains battle log
        /// </summary>
        /// <param name="atk"></param>
        /// <returns></returns>
        public static bool Execute(AtkContext atk)
        {
            var aer = atk.Attacker;

            if (atk.Targets == null || atk.Target != null)
            {
                switch (atk.Move.Id)
                {
                case Ms.SKETCH:     //166
                case Ms.TELEPORT:
                case Ms.HAPPY_HOUR:
                    break;

                case Ms.SELFDESTRUCT:     //120
                case Ms.EXPLOSION:
                    if (aer.Controller.Board.Pokemons.RaiseAbility(As.DAMP) != null)
                    {
                        atk.FailAll("FailSp", atk.Attacker.Id, atk.Move.Id);
                        return(false);
                    }
                    return(true);

                case Ms.REST:     //156
                    if (aer.Hp == aer.Pokemon.MaxHp)
                    {
                        atk.FailAll("FullHp", aer.Id);
                        return(false);
                    }
                    if (!PTs.CanAddXXX(aer, aer, true, AttachedState.SLP, true))
                    {
                        atk.FailAll(null);
                        return(false);
                    }
                    return(true);

                case Ms.SNORE:     //173
                case Ms.SLEEP_TALK:
                    if (aer.State == PokemonState.SLP)
                    {
                        return(true);
                    }
                    break;

                case Ms.FAKE_OUT:     //252
                case Ms.MAT_BLOCK:
                    foreach (var m in aer.Moves)
                    {
                        if (m.HasUsed)
                        {
                            goto FAIL;
                        }
                    }
                    return(true);

                case Ms.STOCKPILE:     //254
                    if (aer.OnboardPokemon.GetCondition <int>(Cs.Stockpile) != 3)
                    {
                        return(true);
                    }
                    break;

                case Ms.SPIT_UP:     //255
                case Ms.SWALLOW:
                    if (aer.OnboardPokemon.HasCondition(Cs.Stockpile))
                    {
                        return(true);
                    }
                    break;

                case Ms.NATURAL_GIFT:     //363
                    if (ITs.CanLostItem(aer) && ITs.CanUseItem(aer) && ITs.Berry(aer.Pokemon.Item))
                    {
                        return(true);
                    }
                    break;

                case Ms.FLING:     //374
                    if (ITs.CanLostItem(aer) && ITs.CanUseItem(aer) && MoveBasePower.FlingPower(aer.Pokemon.Item) != 0)
                    {
                        return(true);
                    }
                    break;

                case Ms.ME_FIRST:     //382
                case Ms.SUCKER_PUNCH: //389
                {
                    var der = atk.Target.Defender;
                    var dm  = der.SelectedMove;
                    if (!(der.LastMoveTurn == der.Controller.TurnNumber || dm == null || dm.Move.Type.Category == MoveCategory.Status))
                    {
                        return(true);
                    }
                }
                break;

                case Ms.LAST_RESORT:     //387
                    foreach (var m in aer.Moves)
                    {
                        if (!m.HasUsed && m.MoveE.Id != Ms.LAST_RESORT)
                        {
                            goto FAIL;
                        }
                    }
                    return(true);

                case Ms.ALLY_SWITCH:
                    if (aer.Controller.GameSettings.Mode == GameMode.Double || aer.Controller.GameSettings.Mode == GameMode.Triple && aer.OnboardPokemon.X != 1)
                    {
                        return(true);
                    }
                    break;

                case Ms.BESTOW:     //516
                    if (aer.Pokemon.Item == 0 || ITs.NeverLostItem(aer.Pokemon))
                    {
                        return(true);
                    }
                    break;

                case Ms.BELCH:     //562
                    if (aer.OnboardPokemon.HasCondition(Cs.Belch))
                    {
                        return(true);
                    }
                    break;

                case Ms.HYPERSPACE_FURY:
                    if (aer.Pokemon.Form.Species.Number == Ps.HOOPA)
                    {
                        return(true);
                    }
                    break;

                default:
                    if (!atk.Move.HardToUseContinuously || ContinuousUse(atk))
                    {
                        return(true);
                    }
                    break;
                }
            }
FAIL:
            atk.FailAll();
            return(false);
        }