Exemplo n.º 1
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);
        }