예제 #1
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);
        }
예제 #2
0
        private static void CalculateDamage(DefContext def)
        {
            var atk  = def.AtkContext;
            var aer  = atk.Attacker;
            var c    = aer.Controller;
            var move = atk.Move;

            Ct(def);

            def.Damage = aer.Pokemon.Lv * 2 / 5 + 2;
            {
                MoveBasePower.Execute(def);
                def.Damage *= def.BasePower * PowerModifier.Execute(def);
            }
            {
                int a;
                {
                    OnboardPokemon p;
                    if (move.Id == Ms.FOUL_PLAY)
                    {
                        p = def.Defender.OnboardPokemon;
                    }
                    else
                    {
                        p = atk.Attacker.OnboardPokemon;
                    }
                    StatType st = move.Move.Category == MoveCategory.Physical ? StatType.Atk : StatType.SpAtk;
                    a = p.FiveD.GetStat(st);
                    if (!def.AbilityE(As.UNAWARE))
                    {
                        int atkLv = p.Lv5D.GetStat(st);
                        if (!(def.IsCt && atkLv < 0))
                        {
                            a = OnboardPokemon.Get5D(a, atkLv);
                        }
                    }
                }
                a          *= AModifier.Hustle(atk);
                def.Damage *= a * AModifier.Execute(def);
            }
            {
                StatType st = move.Move.Category == MoveCategory.Physical || move.UsePhysicalDef ? StatType.Def : StatType.SpDef;
                int      d  = def.Defender.OnboardPokemon.FiveD.GetStat(st);
                int      defLv;
                if (aer.AbilityE(As.UNAWARE) || move.IgnoreDefenderLv7D)
                {
                    defLv = 0;
                }
                else
                {
                    defLv = def.Defender.OnboardPokemon.Lv5D.GetStat(st);
                    if (!(def.IsCt && defLv > 0))
                    {
                        d = OnboardPokemon.Get5D(d, defLv);
                    }
                }
                d          *= DModifier.Sandstorm(def);
                def.Damage /= d * DModifier.Execute(def);
            }
            def.Damage /= 50;
            def.Damage += 2;
            //1.Apply the multi-target modifier
            if (atk.MultiTargets)
            {
                def.ModifyDamage(0xC00);
            }
            //2.Apply the weather modifier
            {
                Weather    w    = c.Weather;
                BattleType type = atk.Type;
                if (w == Weather.IntenseSunlight)
                {
                    if (type == BattleType.Water)
                    {
                        def.ModifyDamage(0x800);
                    }
                    else if (type == BattleType.Fire)
                    {
                        def.ModifyDamage(0x1800);
                    }
                }
                else if (w == Weather.Rain)
                {
                    if (type == BattleType.Water)
                    {
                        def.ModifyDamage(0x1800);
                    }
                    else if (type == BattleType.Fire)
                    {
                        def.ModifyDamage(0x800);
                    }
                }
            }
            //3.In case of a critical hit, double the value
            if (def.IsCt)
            {
                def.ModifyDamage(0x1800);
            }
            //4.Alter with a random factor
            def.Damage *= aer.Controller.GetRandomInt(85, 100);
            def.Damage /= 100;
            //5.Apply STAB modifier
            if (atk.Attacker.OnboardPokemon.HasType(atk.Type))
            {
                def.ModifyDamage((Modifier)(atk.Attacker.AbilityE(As.ADAPTABILITY) ? 0x2000 : 0x1800));
            }
            //6.Alter with type effectiveness
            CalculateEffectRevise(def);
            if (def.EffectRevise > 0)
            {
                if (atk.Type.EffectRevise(BattleType.Flying) > 0 && def.Defender.OnboardPokemon.HasType(BattleType.Flying) && aer.Controller.Board.GetCondition <int>(Cs.SpWeather) == As.DELTA_STREAM)
                {
                    c.ReportBuilder.ShowLog(Ls.MysteriousAirCurrent);
                    def.ModifyDamage(0x800);
                }
                def.Damage <<= def.EffectRevise;
            }
            else if (def.EffectRevise < 0)
            {
                def.Damage >>= -def.EffectRevise;
            }
            //7.Alter with user's burn
            if (move.Move.Category == MoveCategory.Physical && aer.State == PokemonState.BRN && !aer.AbilityE(As.GUTS) && move.Id != Ms.FACADE)
            {
                def.Damage >>= 1;
            }
            //8.Make sure damage is at least 1
            if (def.Damage < 1)
            {
                def.Damage = 1;
            }
            //9.Apply the final modifier
            def.Damage *= DamageModifier.Execute(def);
        }