Esempio n. 1
0
        /// <summary>
        /// check canwithdraw first, null log to show nothing
        /// </summary>
        /// <param name="pm"></param>
        /// <param name="ability"></param>
        /// <param name="log"></param>
        /// <param name="arg1"></param>
        /// <returns></returns>
        public static bool ForceSwitchImplement(PokemonProxy pm, bool ability)
        {
            if (ability && pm.RaiseAbility(As.SUCTION_CUPS))
            {
                pm.ShowLogPm("SuctionCups");
                return(false);
            }
            if (pm.OnboardPokemon.HasCondition(Cs.Ingrain))
            {
                pm.ShowLogPm("IngrainCantMove");
                return(false);
            }
            var c        = pm.Controller;
            var sendouts = new List <int>();
            {
                var pms = pm.Pokemon.Owner.Pokemons.ToArray();
                for (int i = pm.Controller.GameSettings.Mode.OnboardPokemonsPerPlayer(); i < pms.Length; ++i)
                {
                    if (c.CanSendOut(pms[i]))
                    {
                        sendouts.Add(i);
                    }
                }
            }
            var tile = pm.Tile;

            ITs.Attach(pm);
            c.Withdraw(pm, Ls.forceWithdraw, 0, false);
            tile.WillSendOutPokemonIndex = sendouts[c.GetRandomInt(0, sendouts.Count - 1)];
            c.SendOut(tile, true, "ForceSendOut");
            return(true);
        }
Esempio n. 2
0
 internal void Debut()
 {
     if (Action == PokemonAction.Debuting)
     {
         Tile.Debut();
         if (!(OnboardPokemon.HasCondition(Cs.Substitute) || AbilityE(As.OVERCOAT)))
         {
             EHTs.Debut(this);
         }
         if (!PTs.CheckFaint(this))
         {
             if (ItemE(Is.BLUE_ORB) && PTs.CanChangeForm(this, Ps.KYOGRE, 1) || ItemE(Is.RED_ORB) && PTs.CanChangeForm(this, Ps.GROUNDON, 1))
             {
                 PTs.ChangeForm(this, 1, true, Ls.Primal);
             }
             if (OnboardPokemon.Ability != As.FLOWER_GIFT && OnboardPokemon.Ability != As.FORECAST)
             {
                 AbilityAttach.Execute(this);
             }
             if (!ITs.AirBalloon(this))
             {
                 ITs.Attach(this);
             }
         }
         Action = PokemonAction.Done;
     }
 }
Esempio n. 3
0
 public static bool ChangeLv7D(this PokemonProxy pm, PokemonProxy by, bool showFail, bool ability, int a, int d = 0, int sa = 0, int sd = 0, int s = 0, int ac = 0, int e = 0)
 {
     a  = CanChangeLv7D(pm, by, StatType.Atk, a, false);
     d  = CanChangeLv7D(pm, by, StatType.Def, d, false);
     sa = CanChangeLv7D(pm, by, StatType.SpAtk, sa, false);
     sd = CanChangeLv7D(pm, by, StatType.SpDef, sd, false);
     s  = CanChangeLv7D(pm, by, StatType.Speed, s, false);
     ac = CanChangeLv7D(pm, by, StatType.Accuracy, ac, false);
     e  = CanChangeLv7D(pm, by, StatType.Evasion, e, false);
     if (a != 0 || d != 0 || sa != 0 || sd != 0 || s != 0 || ac != 0 || e != 0)
     {
         if (ability)
         {
             ATs.RaiseAbility(pm);
         }
         ChangeLv7DImplement(pm, by, StatType.Atk, a, null);
         ChangeLv7DImplement(pm, by, StatType.SpAtk, sa, null);
         ChangeLv7DImplement(pm, by, StatType.Def, d, null);
         ChangeLv7DImplement(pm, by, StatType.SpDef, sd, null);
         ChangeLv7DImplement(pm, by, StatType.Speed, s, null);
         ChangeLv7DImplement(pm, by, StatType.Accuracy, ac, null);
         ChangeLv7DImplement(pm, by, StatType.Evasion, e, null);
         ITs.WhiteHerb(pm);
         return(true);
     }
     return(false);
 }
Esempio n. 4
0
        private void Mega()
        {
            var m = false;

            foreach (var p in ActingPokemons)
            {
                p.BeforeMegaSpeed = p.Speed;
            }
            foreach (var p in ActingPokemons)
            {
                if (p.Action == PokemonAction.MoveAttached && p.SelectMega)
                {
                    if (p.Pokemon.Item == 0)
                    {
                        p.ShowLogPm(Ls.MegaPre384);
                    }
                    else
                    {
                        p.ShowLogPm("MegaPre", p.Pokemon.Item);
                    }
                    p.Pokemon.Mega = true;
                    p.ChangeForm(ITs.MegaForm(p.Pokemon.Item), true, "Mega");
                    p.CalculatePriority();
                    p.BeforeMegaSpeed = p.Speed; //mega速度刷新只对自己有效 雨天下mega轻快会变快,正常天气mega降雨不会使轻快队友变快
                    m = true;
                }
            }
            if (m)
            {
                ReportBuilder.AddHorizontalLine();
                ActingPokemons.Sort(MegaComparer);
            }
        }
Esempio n. 5
0
        private void Mega()
        {
            var m = false;

            foreach (var p in ActingPokemons)
            {
                if (p.Action == PokemonAction.MoveAttached && p.SelectMega)
                {
                    if (p.Pokemon.Item == 0)
                    {
                        p.ShowLogPm(Ls.MegaPre384);
                    }
                    else
                    {
                        p.ShowLogPm("MegaPre", p.Pokemon.Item);
                    }
                    p.Pokemon.Mega = true;
                    p.ChangeForm(ITs.MegaForm(p.Pokemon.Item), true, "Mega");
                    m = true;
                }
            }
            if (m)
            {
                ReportBuilder.AddHorizontalLine();
            }
        }
        public static void MoveEnding(AtkContext atk)
        {
            var aer = atk.Attacker;

            if (atk.Move.Id == Ms.SPIT_UP || atk.Move.Id == Ms.SWALLOW)
            {
                int i = aer.OnboardPokemon.GetCondition <int>(Cs.Stockpile);
                aer.ChangeLv7D(atk.Attacker, false, false, 0, -i, 0, -i);
                aer.OnboardPokemon.RemoveCondition(Cs.Stockpile);
                aer.ShowLogPm("DeStockpile");
            }

            MagicCoat(atk);

            atk.SetAttackerAction(atk.Move.StiffOneTurn ? PokemonAction.Stiff : PokemonAction.Done);
            if (atk.Targets != null)
            {
                foreach (var d in atk.Targets)
                {
                    ITs.Attach(d.Defender);
                    ATs.RecoverAfterMoldBreaker(d.Defender);
                }
            }
            ITs.Attach(atk.Attacker); //先树果汁后PP果

            var c = aer.Controller;
            {
                var o = atk.GetCondition(Cs.MultiTurn);
                if (o != null)
                {
                    o.Turn--;
                    if (o.Turn != 0)
                    {
                        atk.SetAttackerAction(PokemonAction.Moving);
                    }
                    else if (o.Bool)
                    {
                        aer.AddState(aer, AttachedState.Confuse, false, 0, "EnConfuse2");
                    }
                }
            }
            {
                var o = atk.GetCondition <Tile>(Cs.EjectButton);
                if (o != null)
                {
                    c.PauseForSendOutInput(o);
                    return;
                }
            }
            {
                var tile = aer.Tile;
                if (atk.Move.Switch && tile != null)
                {
                    c.Withdraw(aer, "SelfWithdraw", 0, true);
                    c.PauseForSendOutInput(tile);
                }
            }
        }
Esempio n. 7
0
 internal void Execute()
 {
     if (ITs.ChoiceItem(Owner.Item))
     {
         Owner.OnboardPokemon.AddCondition(Cs.ChoiceItem, MoveE);
     }
     Owner.ShowLogPm("UseMove", MoveE.Id);
     Owner.BuildAtkContext(this);
     Owner.AtkContext.StartExecute(MoveE, Owner.SelectedTarget, null);
     HasUsed = true;
 }
Esempio n. 8
0
 public static void ConsumeItem(this PokemonProxy pm, bool cheekPouch = true)
 {
     pm.OnboardPokemon.SetTurnCondition(Cs.UsedItem, pm.Pokemon.Item);
     pm.Pokemon.UsedItem = pm.Pokemon.Item;
     if (ITs.Berry(pm.Pokemon.Item))
     {
         pm.OnboardPokemon.SetCondition(Cs.Belch);
         pm.Pokemon.UsedBerry = pm.Pokemon.Item;
         if (CanHpRecover(pm) && ATs.RaiseAbility(pm, As.CHEEK_POUCH))
         {
             HpRecoverByOneNth(pm, 3);
         }
     }
     RemoveItem(pm);
 }
Esempio n. 9
0
 /// <summary>
 /// null log to show default log
 /// </summary>
 /// <param name="by"></param>
 /// <param name="stat"></param>
 /// <param name="change"></param>
 /// <param name="showFail"></param>
 /// <param name="log"></param>
 /// <returns></returns>
 public static bool ChangeLv7D(this PokemonProxy pm, PokemonProxy by, StatType stat, int change, bool showFail, bool ability = false, string log = null)
 {
     change = CanChangeLv7D(pm, by, stat, change, showFail);
     if (change != 0)
     {
         if (ability)
         {
             ATs.RaiseAbility(pm);
         }
         ChangeLv7DImplement(pm, by, stat, change, log);
         ITs.WhiteHerb(pm);
         return(true);
     }
     return(false);
 }
Esempio n. 10
0
        internal bool CheckNeedInput()
        {
            if (Action == PokemonAction.Done || State == PokemonState.SLP && Action == PokemonAction.Moving && AtkContext.Move.SkipSleepMTA)
            {
                {
                    var o = OnboardPokemon.GetCondition(Cs.Encore);
                    if (o != null)
                    {
                        foreach (var m in Moves)
                        {
                            if (m.MoveE == o.Move)
                            {
                                if (m.PP == 0)
                                {
                                    break;
                                }
                                else
                                {
                                    goto DONE1;
                                }
                            }
                        }
                        OnboardPokemon.RemoveCondition(Cs.Encore);
                    }
                }
DONE1:
                if (ITs.ChoiceItem(Item))
                {
                    var o = OnboardPokemon.GetCondition <MoveTypeE>(Cs.ChoiceItem);
                    if (o != null)
                    {
                        foreach (var m in Moves)
                        {
                            if (m.MoveE == o)
                            {
                                goto DONE2;
                            }
                        }
                        OnboardPokemon.RemoveCondition(Cs.ChoiceItem);
                    }
                }
DONE2:
                Action = PokemonAction.WaitingForInput;
                return(true);
            }
            return(false);
        }
Esempio n. 11
0
 internal void Execute()
 {
     if (ITs.ChoiceItem(Owner.Item))
     {
         Owner.OnboardPokemon.AddCondition(Cs.ChoiceItem, MoveE);
     }
     if (Owner.SelectZmove)
     {
         Owner.ShowLogPm("Zmove");
     }
     Owner.ShowLogPm("UseMove", MoveE.Id);
     if (Owner.SelectZmove && MoveE.Move.Category == MoveCategory.Status)
     {
         StatusZmove(Owner, MoveE);
     }
     Owner.BuildAtkContext(this);
     Owner.AtkContext.StartExecute(MoveE, Owner.SelectedTarget, null);
     HasUsed = true;
 }
Esempio n. 12
0
        public static bool ChangeLv7D(this PokemonProxy pm, PokemonProxy by, MoveTypeE move)
        {
            bool r = false;
            var  c = move.Lv7DChanges;

            if (c != null)
            {
                bool showFail = move.Move.Category == MoveCategory.Status;
                if (c.Type1 == StatType.All)
                {
                    r = ChangeLv7D(pm, by, showFail, false, c.Change1, c.Change1, c.Change1, c.Change1, c.Change1);
                }
                else
                {
                    var ac = CanChangeLv7D(pm, by, c.Type1, c.Change1, showFail);
                    if (ac != 0)
                    {
                        ChangeLv7DImplement(pm, by, c.Type1, ac, null);
                        r = true;
                    }
                    ac = CanChangeLv7D(pm, by, c.Type2, c.Change2, showFail);
                    if (ac != 0)
                    {
                        ChangeLv7DImplement(pm, by, c.Type2, ac, null);
                        r = true;
                    }
                    ac = CanChangeLv7D(pm, by, c.Type3, c.Change3, showFail);
                    if (ac != 0)
                    {
                        ChangeLv7DImplement(pm, by, c.Type3, ac, null);
                        r = true;
                    }
                    if (r)
                    {
                        ITs.WhiteHerb(pm);
                    }
                }
            }
            return(r);
        }
Esempio n. 13
0
        public static void Withdrawn(PokemonProxy pm, int ability)
        {
            switch (ability)
            {
            case As.REGENERATOR:
                if (pm.Hp != 0)
                {
                    pm.Pokemon.Hp += pm.Pokemon.MaxHp / 3;
                }
                break;

            case As.NATURAL_CURE:
                if (pm.Hp != 0)
                {
                    pm.Pokemon.State = PokemonState.Normal;
                }
                break;

            case As.UNNERVE:
                foreach (var p in pm.Controller.GetOnboardPokemons(1 - pm.Pokemon.TeamId))
                {
                    ITs.Attach(p);
                }
                break;

            case As.PRIMORDIAL_SEA:
                DeSpWeather(pm, ability, Ls.DeHeavyRain);
                break;

            case As.DESOLATE_LAND:
                DeSpWeather(pm, ability, Ls.DeHarshSunlight);
                break;

            case As.DELTA_STREAM:
                DeSpWeather(pm, ability, Ls.DeMysteriousAirCurrent);
                break;
            }
        }
Esempio n. 14
0
        internal void Move()
        {
            if (SelectZmove)
            {
                Pokemon.Zmove = true;
            }
            STs.FocusPunch(Controller);
            LastMoveTurn = Controller.TurnNumber;
            STs.WillAct(this);
            switch (Action)
            {
            case PokemonAction.Stiff:
                PTs.ShowLogPm(this, "Stiff");
                Action = PokemonAction.Done;
                break;

            case PokemonAction.Moving:
                if (AtkContext.Move.Id == Ms.SKY_DROP)
                {
                    CoordY = CoordY.Plate;
                    if (AtkContext.Target.Defender.AliveOnboard)
                    {
                        AtkContext.Target.Defender.CoordY = CoordY.Plate;
                        AtkContext.Target.Defender.OnboardPokemon.RemoveCondition(Cs.SkyDrop);
                    }
                    else
                    {
                        AtkContext.SetTargets(Enumerable.Empty <DefContext>());
                    }
                }
                if (CanExecute())
                {
                    if (AtkContext.Move.Id != Ms.BIDE)
                    {
                        PTs.ShowLogPm(this, "UseMove", AtkContext.Move.Id);
                    }
                    AtkContext.ContinueExecute(SelectedTarget);
                }
                else
                {
                    Action = PokemonAction.Done;
                }
                break;

            case PokemonAction.MoveAttached:
            {
                var o = OnboardPokemon.GetCondition(Cs.Encore);
                if (o != null)
                {
                    foreach (var m in Moves)
                    {
                        if (m.MoveE == o.Move)
                        {
                            SelectedMove = m;
                        }
                    }
                }
            }
                ATs.StanceChange(this);
                if (SelectZmove && SelectedMove.MoveE.Move.Category == MoveCategory.Status)
                {
                    switch (GameHelper.ZStatus(SelectedMove.MoveE.Move.Id))
                    {
                    case 0:
                        break;

                    case 1:
                        this.ChangeLv7D(this, StatType.Atk, 1, false);
                        break;

                    case 2:
                        this.ChangeLv7D(this, StatType.Atk, 2, false);
                        break;

                    case 3:
                        this.ChangeLv7D(this, StatType.Atk, 3, false);
                        break;

                    case 4:
                        this.ChangeLv7D(this, StatType.Def, 1, false);
                        break;

                    case 5:
                        this.ChangeLv7D(this, StatType.SpAtk, 1, false);
                        break;

                    case 6:
                        this.ChangeLv7D(this, StatType.SpAtk, 2, false);
                        break;

                    case 7:
                        this.ChangeLv7D(this, StatType.SpDef, 1, false);
                        break;

                    case 8:
                        this.ChangeLv7D(this, StatType.SpDef, 2, false);
                        break;

                    case 9:
                        this.ChangeLv7D(this, StatType.Speed, 1, false);
                        break;

                    case 10:
                        this.ChangeLv7D(this, StatType.Speed, 2, false);
                        break;

                    case 11:
                        this.ChangeLv7D(this, StatType.Accuracy, 1, false);
                        break;

                    case 12:
                        this.ChangeLv7D(this, StatType.Evasion, 1, false);
                        break;

                    case 13:
                        this.ChangeLv7D(this, false, false, 1, 1, 1, 1, 1, 0, 0);
                        break;

                    case 14:
                        if (OnboardPokemon.AddCondition(Cs.FocusEnergy))
                        {
                            this.ShowLogPm("En" + Cs.FocusEnergy);
                        }
                        break;

                    case 15:
                        ITs.Reset7D(this);
                        break;

                    case 16:
                        this.HpRecover(Pokemon.MaxHp);
                        break;

                    case 17:
                        if (Pokemon.Owner.PmsAlive > Controller.GameSettings.Mode.OnboardPokemonsPerPlayer())
                        {
                            Tile.SetTurnCondition(Cs.Zheal);
                        }
                        break;

                    case 18:
                        OnboardPokemon.AddTurnCondition(Cs.FollowMe, SelectedMove.MoveE.Move.Id);
                        this.ShowLogPm(Ls.EnFollowMe);
                        break;

                    default:
                        break;
                    }
                    if (SelectedMove.MoveE.Move.Id == Ms.CURSE)
                    {
                        if (OnboardPokemon.HasType(BattleType.Ghost))
                        {
                            this.HpRecover(Pokemon.MaxHp);
                        }
                        else
                        {
                            this.ChangeLv7D(this, StatType.Atk, 1, false);
                        }
                    }
                }
                if (CanExecute() && SelectedMove.CanExecute())
                {
                    _atkContext = null;
                    SelectedMove.Execute();
                    var o = OnboardPokemon.GetCondition(Cs.LastMove);
                    if (o == null)
                    {
                        o      = new Condition();
                        o.Move = AtkContext.Move;
                        OnboardPokemon.SetCondition(Cs.LastMove, o);
                    }
                    else if (o.Move != AtkContext.Move)
                    {
                        o.Move = AtkContext.Move;
                        o.Int  = 0;
                    }
                    if (AtkContext.Fail)
                    {
                        o.Int = 0;
                    }
                    else
                    {
                        o.Int++;
                    }
                    Controller.Board.SetCondition(Cs.LastMove, o);
                }
                else
                {
                    OnboardPokemon.RemoveCondition(Cs.LastMove);
                    Action = PokemonAction.Done;
                }
                if (AtkContext != null && AtkContext.Move.Dance && AtkContext.Attacker.LastMoveTurn == Controller.TurnNumber)
                {
                    foreach (var p in Controller.Board.Pokemons)
                    {
                        if (p != null && p.AbilityE(As.Dancer) && p != AtkContext.Attacker)
                        {
                            p.RaiseAbility();
                            AtkContext dance = new AtkContext(p);
                            dance.StartExecute(AtkContext.Move, null, "UseMove", false);
                        }
                    }
                }
                break;
            } //switch(Action)
        }
Esempio n. 15
0
        private static void AddStateImplement(this PokemonProxy pm, PokemonProxy by, AttachedState state, int turn, string log, int arg1)
        {
            switch (state)
            {
            case AttachedState.BRN:
                pm.Pokemon.State = PokemonState.BRN;
                goto POKEMON_STATE;

            case AttachedState.FRZ:
                pm.Pokemon.State = PokemonState.FRZ;
                pm.ShowLogPm(log ?? "EnFRZ", arg1);
                if (pm.CanChangeForm(492, 0))
                {
                    pm.ChangeForm(0, true);
                }
                goto DONE;

            case AttachedState.PAR:
                pm.Pokemon.State = PokemonState.PAR;
                goto POKEMON_STATE;

            case AttachedState.PSN:
                if (turn == 0)
                {
                    pm.Pokemon.State = PokemonState.PSN;
                }
                else
                {
                    pm.Pokemon.State = PokemonState.BadlyPSN;
                    pm.OnboardPokemon.SetCondition(Cs.BadlyPSN, pm.Controller.TurnNumber);
                }
                goto POKEMON_STATE;

            case AttachedState.SLP:
                pm.Pokemon.State   = PokemonState.SLP;
                pm.Pokemon.SLPTurn = turn == 0 ? pm.Controller.GetRandomInt(2, 4) : turn;
                goto POKEMON_STATE;

            case AttachedState.Confuse:
                pm.OnboardPokemon.SetCondition(Cs.Confuse, turn == 0 ? pm.Controller.GetRandomInt(2, 5) : turn);
                pm.ShowLogPm(log ?? "Confuse");
                goto DONE;

            case AttachedState.Attract:
                pm.OnboardPokemon.SetCondition(Cs.Attract, by);
                pm.ShowLogPm(log ?? "EnAttract", arg1);
                ITs.DestinyKnot(pm, by);
                goto DONE;

            case AttachedState.Trap:
            {
                var move = by.AtkContext.Move;
                var c    = new Condition();
                c.By   = by;
                c.Turn = pm.Controller.TurnNumber + (turn == 0 ? pm.Controller.GetRandomInt(4, 5) : turn) - 1;
                c.Move = move;
                c.Bool = by.Item == Is.BINDING_BAND;
                pm.OnboardPokemon.SetCondition(Cs.Trap, c);
                pm.ShowLogPm("EnTrap" + move.Id.ToString(), by.Id);
            }
                goto DONE;

            case AttachedState.Nightmare:
                pm.OnboardPokemon.SetCondition(Cs.Nightmare);
                pm.ShowLogPm("EnNightmare");
                goto DONE;

            case AttachedState.Torment:
                pm.OnboardPokemon.SetCondition(Cs.Torment, by);
                pm.ShowLogPm("EnTorment");
                goto DONE;

            case AttachedState.Disable:
            {
                var c = new Condition();
                c.Move = pm.LastMove;
                c.Turn = pm.Controller.TurnNumber + 3;         //4 - 1
                pm.OnboardPokemon.SetCondition(Cs.Disable, c);
                pm.ShowLogPm("EnDisable", c.Move.Id);
            }
                goto DONE;

            case AttachedState.Yawn:
            {
                var o = new Condition();
                o.Turn = pm.Controller.TurnNumber + 1;
                o.By   = by;       //睡眠规则
                pm.OnboardPokemon.AddCondition(Cs.Yawn, o);
            }
                pm.ShowLogPm("EnYawn");
                goto DONE;

            case AttachedState.HealBlock:
            {
                var o = new Condition();
                o.Turn = pm.Controller.TurnNumber + 5;
                o.By   = by;
                pm.OnboardPokemon.SetCondition(Cs.HealBlock, o);
            }
                pm.ShowLogPm("EnHealBlock");
                goto DONE;

            case AttachedState.SoundBlock:
            {
                var o = new Condition();
                o.Turn = pm.Controller.TurnNumber + 2;
                o.By   = by;
                pm.OnboardPokemon.SetCondition(Cs.SoundBlock, o);
            }
                pm.ShowLogPm("EnSoundBlock");
                goto DONE;

            case AttachedState.CanAttack:
            {
                var o = new Condition();
                o.BattleType = by.AtkContext.Move.Id == Ms.MIRACLE_EYE ? BattleType.Dark : BattleType.Ghost;
                o.By         = by;
                pm.OnboardPokemon.SetCondition(Cs.CanAttack, o);
                pm.ShowLogPm("CanAttack");
            }
                goto DONE;

            case AttachedState.LeechSeed:
                pm.OnboardPokemon.SetCondition(Cs.LeechSeed, by.Tile);
                pm.ShowLogPm("EnLeechSeed");
                goto DONE;

            case AttachedState.Embargo:
                pm.OnboardPokemon.SetCondition(Cs.Embargo);
                pm.ShowLogPm("EnEmbargo");
                goto DONE;

            case AttachedState.PerishSong:
                pm.OnboardPokemon.SetCondition(Cs.PerishSong, 3);
                goto DONE;

            case AttachedState.Ingrain:
                pm.OnboardPokemon.SetCondition(Cs.Ingrain);
                pm.ShowLogPm("EnIngrain");
                goto DONE;

#if DEBUG
            default:
                System.Diagnostics.Debugger.Break();
                return;
#endif
            }
POKEMON_STATE:
            pm.ShowLogPm(log ?? "En" + state.ToString(), arg1);
            if (state != AttachedState.FRZ && state != AttachedState.SLP)
            {
                ATs.Synchronize(pm, by, state, turn);
            }
DONE:
            StateAdded.Execute(pm);
        }
Esempio n. 16
0
 /// <summary>
 /// CanSelect不代表技能一定能用,http://www.smogon.com/dp/articles/move_restrictions#disable
 /// </summary>
 /// <returns>key, null if no problem</returns>
 internal SelectMoveFail IfSelected()
 {
     if (MoveE.Id != Ms.STRUGGLE)
     {
         var op = Owner.OnboardPokemon;
         //专爱
         {
             var o = op.GetCondition <MoveTypeE>(Cs.ChoiceItem);
             if (o != null && o != MoveE && ITs.ChoiceItem(Owner.Item))
             {
                 return(new SelectMoveFail("ChoiceItem", o.Id));
             }
         }
         //寻衅
         if (op.HasCondition(Cs.Torment) && Owner.LastMove == MoveE)
         {
             return(new SelectMoveFail("Torment", Owner.AtkContext.MoveProxy.MoveE.Id));
         }
         //鼓掌
         {
             var o = op.GetCondition(Cs.Encore);
             if (o != null && o.Move != MoveE)
             {
                 return(new SelectMoveFail("Encore", Owner.AtkContext.MoveProxy.MoveE.Id));
             }
         }
         //封印
         foreach (var pm in Owner.Controller.Board[1 - Owner.Pokemon.TeamId].GetAdjacentPokemonsByOppositeX(Owner.OnboardPokemon.X))
         {
             if (pm.OnboardPokemon.HasCondition(Cs.Imprison))
             {
                 foreach (var m in pm.Moves)
                 {
                     if (m.MoveE == MoveE)
                     {
                         return(new SelectMoveFail("Imprison", MoveE.Id));
                     }
                 }
             }
         }
         //残废
         {
             var o = op.GetCondition(Cs.Disable);
             if (o != null && o.Move == MoveE)
             {
                 return(new SelectMoveFail("Disable", MoveE.Id));
             }
         }
         //重力
         if (MoveE.UnavailableWithGravity && Owner.Controller.Board.HasCondition(Cs.Gravity))
         {
             return(new SelectMoveFail("GravityCantUseMove", MoveE.Id));
         }
         //回复封印
         if (MoveE.Heal && op.HasCondition(Cs.HealBlock))
         {
             return(new SelectMoveFail("HealBlockCantUseMove", MoveE.Id));
         }
         //地狱突刺
         if (MoveE.Sound && op.HasCondition(Cs.SoundBlock))
         {
             return(new SelectMoveFail("SoundBlockCantUseMove", MoveE.Id));
         }
         //挑拨
         if (MoveE.Move.Category == MoveCategory.Status && op.HasCondition(Cs.Taunt))
         {
             return(new SelectMoveFail("Taunt", MoveE.Id));
         }
         //突击背心
         if (MoveE.Move.Category == MoveCategory.Status && Owner.ItemE(Is.ASSAULT_VEST))
         {
             return(new SelectMoveFail("AssaultVest", MoveE.Id));
         }
     }
     return(null);
 }