Exemplo n.º 1
0
 private static void AttackedUpItem(DefContext def, BattleType type, StatType stat)
 {
     if (def.AtkContext.Type == type)
     {
         ITs.ChangeLv5D(def.Defender, stat, 1);
     }
 }
Exemplo n.º 2
0
 private static void StarfBerry(PokemonProxy pm)
 {
     if (ATs.Gluttony(pm))
     {
         var ss = new List <StatType>(5);
         if (pm.CanChangeLv7D(pm, StatType.Atk, 2, false) != 0)
         {
             ss.Add(StatType.Atk);
         }
         if (pm.CanChangeLv7D(pm, StatType.Def, 2, false) != 0)
         {
             ss.Add(StatType.Def);
         }
         if (pm.CanChangeLv7D(pm, StatType.SpAtk, 2, false) != 0)
         {
             ss.Add(StatType.SpAtk);
         }
         if (pm.CanChangeLv7D(pm, StatType.SpDef, 2, false) != 0)
         {
             ss.Add(StatType.SpDef);
         }
         if (pm.CanChangeLv7D(pm, StatType.Speed, 2, false) != 0)
         {
             ss.Add(StatType.Speed);
         }
         var n = ss.Count;
         if (n != 0)
         {
             ITs.ChangeLv5D(pm, ss[pm.Controller.GetRandomInt(0, n - 1)], 2);
         }
     }
 }
Exemplo n.º 3
0
 private static void Up1Berry(PokemonProxy pm, StatType stat)
 {
     if (ATs.Gluttony(pm))
     {
         ITs.ChangeLv5D(pm, stat, 1);
     }
 }
Exemplo n.º 4
0
 private static void AttackedUpItem(DefContext def, MoveCategory cat, StatType stat)
 {
     if (def.AtkContext.Move.Move.Category == cat)
     {
         ITs.ChangeLv5D(def.Defender, stat, 1);
     }
 }
Exemplo n.º 5
0
 private static void TastyBerry(PokemonProxy pm)
 {
     if (ATs.Gluttony(pm) && pm.CanHpRecover(false))
     {
         pm.HpRecoverByOneNth(2, false, Ls.ItemHpRecover, pm.Pokemon.Item, true);
         if (pm.Pokemon.Nature.DislikeTaste(ITs.GetTaste(pm.Pokemon.Item)))
         {
             pm.AddState(pm, AttachedState.Confuse, false);
         }
     }
 }
Exemplo n.º 6
0
 private static void EatDefenderBerry(DefContext def)
 {
     if (ITs.CanLostItem(def.Defender))
     {
         var i = def.Defender.Pokemon.Item;
         if (ITs.Berry(i))
         {
             def.SetCondition(Cs.EatenBerry, i);
         }
     }
 }
        private static void EatDefenderBerry(DefContext def)
        {
            var i = def.GetCondition <int>(Cs.EatenBerry);

            if (i != 0)
            {
                var aer = def.AtkContext.Attacker;
                def.AtkContext.Attacker.ShowLogPm("EatDefenderBerry", i);
                ITs.RaiseItemByMove(aer, i, aer);
            }
        }
Exemplo n.º 8
0
        private static void Thief(DefContext def)
        {
            var aer = def.AtkContext.Attacker;

            if (def.AtkContext.HasCondition(Cs.Thief) && ITs.CanLostItem(def.Defender))
            {
                var i = def.Defender.Pokemon.Item;
                def.Defender.RemoveItem();
                aer.SetItem(i); //先铁棘再果子
                aer.ShowLogPm("Thief", i, def.Defender.Id);
            }
        }
Exemplo n.º 9
0
        private static void Pickpocket(DefContext d)
        {
            var der = d.Defender;
            var aer = d.AtkContext.Attacker;

            if (der.Pokemon.Item == 0 && ITs.CanLostItem(aer))
            {
                var i = aer.Pokemon.Item;
                aer.RemoveItem();
                der.RaiseAbility();
                der.SetItem(i);
                der.ShowLogPm("Pickpocket", i);
            }
        }
Exemplo n.º 10
0
        private static void RemoveItem(DefContext def, bool sp, string log)
        {
            var der = def.Defender;

            if (ITs.CanLostItem(der))
            {
                var i = der.Pokemon.Item;
                if (!sp || ITs.Berry(i) || ITs.Gem(i))
                {
                    der.RemoveItem();
                    der.ShowLogPm(log, i, sp ? 0 : def.AtkContext.Attacker.Id);
                }
            }
        }
Exemplo n.º 11
0
        public static bool Hurt(DefContext def)
        {
            int hp = Generic(def);

            if (hp > 0)
            {
                Controller c = def.Defender.Controller;
                if (def.Damage > hp)
                {
                    def.Damage = hp;
                }
                hp -= def.Damage;
                def.Defender.ShowLogPm("HurtSubstitute");
                if (def.EffectRevise > 0)
                {
                    c.ReportBuilder.ShowLog("SuperHurt0");
                }
                else if (def.EffectRevise < 0)
                {
                    c.ReportBuilder.ShowLog("WeakHurt0");
                }
                if (def.IsCt)
                {
                    c.ReportBuilder.ShowLog("CT0");
                }
                if (def.Defender.ItemE(Is.AIR_BALLOON))
                {
                    ITs.AirBalloon(def);
                }
                if (hp == 0)
                {
                    Disappear(def.Defender);
                }
                else
                {
                    def.Defender.OnboardPokemon.SetCondition(Cs.Substitute, hp);
                }
                return(true);
            }
            return(false);
        }
Exemplo n.º 12
0
        public static void Execute(AtkContext atk)
        {
            var move = atk.Move;
            var def  = atk.Target;
            var der  = def.Defender;
            var aer  = atk.Attacker;

            bool ls = false, r = false, av = false, feint = false;

            switch (move.Id)
            {
            case Ms.BRICK_BREAK:     //280
            case Ms.Psychic_Fangs:
                if (der.Pokemon.TeamId != aer.Pokemon.TeamId)
                {
                    ls = der.Field.RemoveCondition(Cs.LightScreen);
                    r  = der.Field.RemoveCondition(Cs.Reflect);
                    av = der.Field.RemoveCondition(Cs.Aurora_Veil);
                }
                break;

            case Ms.FEINT:     //364
                feint = der.OnboardPokemon.RemoveCondition(Cs.Protect) | (der.Pokemon.TeamId != atk.Attacker.Pokemon.TeamId && (der.Field.RemoveCondition(Cs.QuickGuar) | der.Field.RemoveCondition(Cs.WideGuard)));
                break;
            }
            switch (move.Id)
            {
            case Ms.COUNTER:
                Counter(atk, Cs.PhysicalDamage, 0x2000);
                break;

            case Ms.MIRROR_COAT:
                Counter(atk, Cs.SpecialDamage, 0x2000);
                break;

            case Ms.METAL_BURST:
                Counter(atk, Cs.Damage, 0x1800);
                break;

            case Ms.SONIC_BOOM:     //49
                def.Damage = 20;
                break;

            case Ms.DRAGON_RAGE:     //82
                def.Damage = 40;
                break;

            case Ms.SEISMIC_TOSS:    //69
            case Ms.NIGHT_SHADE:     //101
                def.Damage = aer.Pokemon.Lv;
                break;

            case Ms.BIDE:     //117
                def.Damage = atk.GetCondition(Cs.Bide).Damage << 1;
                break;

            case Ms.PSYWAVE:     //149
                def.Damage = der.Controller.GetRandomInt(50, 150) * aer.Pokemon.Lv / 100;
                if (def.Damage == 0)
                {
                    def.Damage = 1;
                }
                break;

            case Ms.SUPER_FANG:     //162
            case Ms.Natures_Madness:
                def.Damage = der.Hp >> 1;
                if (def.Damage == 0)
                {
                    def.Damage = 1;
                }
                break;

            case Ms.Guardian_of_Alola:
                def.Damage = der.Hp * 3 / 4;
                if (def.Damage == 0)
                {
                    def.Damage = 1;
                }
                break;

            case Ms.ENDEAVOR:     //283
                def.Damage = der.Hp - aer.Hp;
                if (def.Damage < 0)
                {
                    def.Damage = 0;
                }
                break;

            case Ms.FINAL_GAMBIT:     //515
                def.Damage = atk.Attacker.Hp;
                break;

            default:
                if (move.Class != MoveClass.OHKO)
                {
                    ITs.CheckGem(atk);
                    foreach (DefContext d in atk.Targets)
                    {
                        CalculateDamage(d);
                    }
                }
                break;
            }
            switch (move.Id)
            {
            case Ms.FALSE_SWIPE:
            case Ms.HOLD_BACK:
                if (def.Damage >= def.Defender.Hp)
                {
                    def.Damage = def.Defender.Hp - 1;
                }
                break;

            case Ms.BEAT_UP:
            {        //无视属性相克修正,但依然会显示“没有什么效果”“效果拔群”的战报。
                BattleType a = def.AtkContext.Type;
                def.EffectRevise = a == BattleType.Ground && der.ItemE(Is.IRON_BALL) && der.OnboardPokemon.HasType(BattleType.Flying) ? 0 : a.EffectRevise(der.OnboardPokemon.Types);
            }
            break;

            case Ms.SELFDESTRUCT:  //120
            case Ms.EXPLOSION:     //153
            case Ms.FINAL_GAMBIT:  //515
                atk.Attacker.Faint();
                break;

            case Ms.BRICK_BREAK:     //280
            case Ms.Psychic_Fangs:
                if (ls)
                {
                    atk.Controller.ReportBuilder.ShowLog("DeLightScreen", der.Field.Team);
                }
                if (r)
                {
                    atk.Controller.ReportBuilder.ShowLog("DeReflect", der.Field.Team);
                }
                if (av)
                {
                    atk.Controller.ReportBuilder.ShowLog("DeAurora_Veil", der.Field.Team);
                }
                break;

            case Ms.FEINT:     //364
                if (feint)
                {
                    der.ShowLogPm("Feint");
                }
                break;
            }
            bool Zprotect = false;

            if (move.Zmove)
            {
                Zprotect = der.OnboardPokemon.RemoveCondition(Cs.Protect);
            }
            if (Zprotect)
            {
                def.Damage >>= 2;
                der.ShowLogPm("Zprotect");
            }
            if (atk.DefenderAbilityAvailable() && def.Defender.CanChangeForm(778, 1) && def.Damage > 0 && def.Defender.RaiseAbility(As.Disguise))
            {
                def.Defender.ChangeForm(1, true);
                def.Damage = 0;
            }
        }
Exemplo n.º 13
0
        public static void Execute(DefContext def)
        {
            var der      = def.Defender;
            var atk      = def.AtkContext;
            var aer      = atk.Attacker;
            var touch    = atk.touch;
            var realHurt = def.Damage != 0;

            if (touch && aer.AbilityE(As.POISON_TOUCH) && der.Controller.RandomHappen(30) && der.CanAddState(aer, AttachedState.PSN, false))
            {
                aer.RaiseAbility();
                der.AddState(aer, AttachedState.PSN, false);
            }
            if (der.AtkContext != null && der.AtkContext.HasCondition(Cs.Bide))
            {
                var o = der.AtkContext.GetCondition(Cs.Bide);
                o.By      = aer;
                o.Damage += def.Damage;
            }
            switch (der.OnboardPokemon.Ability) //此时破格不能无视
            {
            case As.ILLUSION:
                ATs.DeIllusion(def.Defender);
                break;

            case As.STATIC:
                if (touch)
                {
                    AddState(def, AttachedState.PAR);
                }
                break;

            case As.POISON_POINT:
                if (touch)
                {
                    AddState(def, AttachedState.PSN);
                }
                break;

            case As.FLAME_BODY:
                if (touch)
                {
                    AddState(def, AttachedState.BRN);
                }
                break;

            case As.CUTE_CHARM:
                if (touch)
                {
                    AddState(def, AttachedState.Attract);
                }
                break;

            case As.ROUGH_SKIN:
            case As.IRON_BARBS:
                if (touch)
                {
                    RoughSkin(def);
                }
                break;

            case As.EFFECT_SPORE:
                if (touch && realHurt)
                {
                    EffectSpore(def);
                }
                break;

            case As.ANGER_POINT:
                if (def.IsCt)
                {
                    der.ChangeLv7D(der, StatType.Atk, 12, false, true, "AngerPoint");
                }
                break;

            case As.AFTERMATH:
                if (touch && der.Hp == 0 && aer.CanEffectHurt && aer.Controller.Board.Pokemons.HasAbility(As.DAMP) == null)
                {
                    der.RaiseAbility();
                    aer.EffectHurtByOneNthImplement(4);
                }
                break;

            case As.Innards_Out:
                if (der.Hp == 0)
                {
                    der.RaiseAbility();
                    aer.EffectHurt(def.Damage);
                }
                break;

            case As.PICKPOCKET:
                if (touch)
                {
                    Pickpocket(def);
                }
                break;

            case As.CURSED_BODY:
                if (atk.Controller.RandomHappen(30) && aer.CanAddState(der, AttachedState.Disable, false))
                {
                    der.RaiseAbility();
                    aer.AddState(der, AttachedState.Disable, false);
                }
                break;

            case As.WEAK_ARMOR:
                if (atk.Move.Move.Category == MoveCategory.Physical)
                {
                    der.ChangeLv7D(der, false, true, 0, -1, 0, 0, 1);
                }
                break;

            case As.MUMMY:
                var aa = aer.Ability;
                if (touch && aa != As.MULTITYPE && aa != As.RKS_System && aa != As.Comatose && aa != As.MUMMY)
                {
                    der.RaiseAbility();
                    var fa = aer.OnboardPokemon.Ability;
                    aer.ChangeAbility(As.MUMMY);
                    aer.ShowLogPm(Ls.SetAbility, As.MUMMY);
                    aer.Controller.ReportBuilder.ShowLog(Ls.setAbility, fa);
                }
                break;

            case As.JUSTIFIED:
                if (atk.Type == BattleType.Dark)
                {
                    der.ChangeLv7D(der, StatType.Atk, 1, false, true);
                }
                break;

            case As.RATTLED:
                if (atk.Type == BattleType.Dark || atk.Type == BattleType.Ghost || atk.Type == BattleType.Bug)
                {
                    der.ChangeLv7D(der, StatType.Speed, 1, false, true);
                }
                break;

            case As.GOOEY:
                if (touch && aer.CanChangeLv7D(der, StatType.Speed, -1, false) != 0)
                {
                    der.RaiseAbility();
                    aer.ChangeLv7D(der, StatType.Speed, -1, false);
                }
                break;

            //gen7
            case As.Stamina:
                der.ChangeLv7D(der, StatType.Def, 1, false, true);
                break;

            case As.Tangling_Hair:
                if (touch)
                {
                    aer.ChangeLv7D(der, StatType.Speed, -1, false);
                }
                break;

            case As.Water_Compaction:
                if (atk.Type == BattleType.Water)
                {
                    der.ChangeLv7D(der, StatType.Def, 2, false, true);
                }
                break;

            case As.Berserk:
                if (der.Hp < der.Pokemon.MaxHp / 2 && der.Hp + atk.TotalDamage >= der.Pokemon.MaxHp / 2)
                {
                    der.ChangeLv7D(der, StatType.SpAtk, 1, false, true);
                }
                break;
            }

            var itm = def.Defender.Item;

            if (def.Defender.Pokemon.Item == Is.ROCKY_HELMET)
            {
                itm = Is.ROCKY_HELMET;
            }

            switch (itm)
            {
            case Is.STICKY_BARB: //65
                if (touch && aer.Pokemon.Item == 0 && der.Controller.RandomHappen(10))
                {
                    der.RemoveItem();
                    aer.SetItem(Is.STICKY_BARB);
                }
                break;

            case Is.ROCKY_HELMET: //104
                if (touch)
                {
                    aer.EffectHurtByOneNth(6, Ls.RockyHelmet, 0, 0);
                }
                break;

            case Is.AIR_BALLOON: //105
                ITs.AirBalloon(def);
                break;

            case Is.ABSORB_BULB: //109
                AttackedUpItem(def, BattleType.Water, StatType.SpAtk);
                break;

            case Is.CELL_BATTERY: //110
                AttackedUpItem(def, BattleType.Electric, StatType.Atk);
                break;

            case Is.ENIGMA_BERRY: //188
                if (def.EffectRevise > 0)
                {
                    der.HpRecoverByOneNth(4, false, Ls.ItemHpRecover, Is.ENIGMA_BERRY, true);
                }
                break;

            case Is.JABOCA_BERRY: //191
                ReHurtBerry(def, MoveCategory.Physical);
                break;

            case Is.ROWAP_BERRY: //192
                ReHurtBerry(def, MoveCategory.Special);
                break;

            case Is.LUMINOUS_MOSS:
                AttackedUpItem(def, BattleType.Water, StatType.SpDef);
                break;

            case Is.SNOWBALL:
                AttackedUpItem(def, BattleType.Ice, StatType.Atk);
                break;

            case Is.WEAKNESS_POLICY:
                if (def.EffectRevise > 0 && (der.CanChangeLv7D(der, StatType.Atk, 2, false) != 0 || der.CanChangeLv7D(der, StatType.SpAtk, 2, false) != 0))
                {
                    der.ShowLogPm("WeaknessPolicy");
                    der.ChangeLv7D(der, false, false, 2, 0, 2);
                    der.ConsumeItem();
                }
                break;

            case Is.KEE_BERRY:
                AttackedUpItem(def, MoveCategory.Physical, StatType.Def);
                break;

            case Is.MARANGA_BERRY:
                AttackedUpItem(def, MoveCategory.Special, StatType.SpDef);
                break;
            }
            if (der.OnboardPokemon.HasCondition(Cs.Rage))
            {
                der.ChangeLv7D(der, StatType.Atk, 1, false, false, "Rage");
            }
            if (aer.Pokemon.Item == 0 && ITs.CanLostItem(der) && aer.RaiseAbility(As.MAGICIAN))
            {
                var i = der.Pokemon.Item;
                aer.SetItem(i);
                der.RemoveItem();
                der.ShowLogPm("Magician", i);
            }
            if (der.OnboardPokemon.HasCondition(Cs.Beak_Blast) && atk.Move.NeedTouch)
            {
                aer.AddState(der, AttachedState.BRN, false);
            }
        }
Exemplo n.º 14
0
        private static bool PrepareOneTurn(AtkContext atk)
        {
            var aer = atk.Attacker;

            if (aer.Action == PokemonAction.MoveAttached)
            {
                var m = atk.Move.Id;
                switch (m)
                {
                case Ms.FLY:     //19
                case Ms.BOUNCE:  //340
                    aer.CoordY = CoordY.Air;
                    break;

                case Ms.DIG:     //91
                    aer.CoordY = CoordY.Underground;
                    break;

                case Ms.DIVE:     //291
                    aer.CoordY = CoordY.Water;
                    break;

                case Ms.SHADOW_FORCE:     //467
                case Ms.PHANTOM_FORCE:
                    aer.CoordY = CoordY.Another;
                    break;

                case Ms.SKY_DROP:
                    MoveE.FilterDefContext(atk);
                    if (atk.Target == null)
                    {
                        atk.FailAll(null);
                    }
                    else
                    {
                        aer.CoordY = CoordY.Air;
                        atk.Target.Defender.CoordY = CoordY.Air;
                        atk.Target.Defender.OnboardPokemon.SetCondition(Cs.SkyDrop);
                        aer.ShowLogPm(Ls.EnSkyDrop, atk.Target.Defender.Id);
                        atk.SetAttackerAction(PokemonAction.Moving);
                    }
                    return(true);
                }
                aer.ShowLogPm("Prepare" + m.ToString());
                if (m == Ms.SKULL_BASH)
                {
                    aer.ChangeLv7D(atk.Attacker, StatType.Def, 1, false);
                }
                atk.SetAttackerAction(PokemonAction.Moving);
                return(!((m == Ms.SOLAR_BEAM || m == Ms.Solar_Blade) && aer.Controller.Weather == Weather.IntenseSunlight || ITs.PowerHerb(aer)));
            }
            return(false);
        }
Exemplo n.º 15
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);
        }
Exemplo n.º 16
0
        //26.0 Uproar message
        //26.1 Speed Boost, Bad Dreams, Harvest, Moody
        //26.2 Toxic Orb activation, Flame Orb activation, Sticky Barb
        //26.3 pickup
        private static void Pokemon(Controller c)
        {
            foreach (var pm in c.OnboardPokemons.ToArray())
            {
                int ab = pm.Ability;
                if (pm.AtkContext != null && pm.AtkContext.Move.Id == Ms.UPROAR)
                {
                    if (pm.Action == PokemonAction.Moving)
                    {
                        pm.ShowLogPm("Uproar");
                    }
                    else if (pm.AtkContext.GetCondition(Cs.MultiTurn).Turn == 0)
                    {
                        pm.AtkContext.RemoveCondition(Cs.MultiTurn);
                        pm.ShowLogPm("DeUproar");
                    }
                }
                switch (ab)
                {
                case As.SPEED_BOOST:
                    if (pm.LastMoveTurn != 0)
                    {
                        pm.ChangeLv7D(pm, StatType.Speed, 1, false, true);
                    }
                    break;

                case As.BAD_DREAMS:
                {
                    bool first = true;
                    foreach (var target in c.Board[1 - pm.Pokemon.TeamId].Pokemons)
                    {
                        if (target.State == PokemonState.SLP)
                        {
                            if (first)
                            {
                                pm.RaiseAbility();
                                first = false;
                            }
                            target.EffectHurtByOneNth(8, Ls.BadDreams);
                        }
                    }
                }
                break;

                case As.HARVEST:
                    if (pm.Pokemon.Item == 0 && pm.Pokemon.UsedBerry != 0 && (c.Weather == Game.Weather.IntenseSunlight || c.RandomHappen(50)))
                    {
                        pm.RaiseAbility();
                        pm.SetItem(pm.Pokemon.UsedBerry);
                        pm.ShowLogPm("Harvest", pm.Pokemon.UsedBerry);
                        ITs.Attach(pm);
                    }
                    break;

                case As.MOODY:
                {
                    var up   = new List <StatType>(7);
                    var down = new List <StatType>(7);
                    foreach (var s in GameHelper.SEVEN_D)
                    {
                        if (pm.CanChangeLv7D(pm, s, 2, false) != 0)
                        {
                            up.Add(s);
                        }
                        if (pm.CanChangeLv7D(pm, s, -1, false) != 0)
                        {
                            down.Add(s);
                        }
                    }
                    if (up.Count != 0 && down.Count != 0)
                    {
                        pm.RaiseAbility();
                        if (up.Count != 0)
                        {
                            pm.ChangeLv7D(pm, up[c.GetRandomInt(0, up.Count - 1)], 2, false);
                        }
                        if (down.Count != 0)
                        {
                            pm.ChangeLv7D(pm, down[c.GetRandomInt(0, down.Count - 1)], -1, false);
                        }
                    }
                }
                break;
                }
                switch (pm.Item)
                {
                case Is.TOXIC_ORB:
                    pm.AddState(pm, AttachedState.PSN, false, 15, "ItemEnBadlyPSN", Is.TOXIC_ORB);
                    break;

                case Is.FLAME_ORB:
                    pm.AddState(pm, AttachedState.BRN, false, 0, "ItemEnBRN", Is.FLAME_ORB);
                    break;

                case Is.STICKY_BARB:
                    pm.EffectHurtByOneNth(8, Ls.ItemHurt, Is.STICKY_BARB);
                    break;
                }
                if (ab == As.PICKUP && pm.Pokemon.Item == 0)
                {
                    var items  = new List <int>();
                    var owners = new List <OnboardPokemon>();
                    foreach (var p in c.Board[1 - pm.Pokemon.TeamId].GetAdjacentPokemonsByOppositeX(pm.OnboardPokemon.X))
                    {
                        var i = p.OnboardPokemon.GetCondition <int>(Cs.UsedItem);
                        if (i != 0)
                        {
                            items.Add(i);
                            owners.Add(p.OnboardPokemon);
                        }
                    }
                    if (!items.Any())
                    {
                        foreach (var p in pm.Field.GetAdjacentPokemonsByX(pm.OnboardPokemon.X))
                        {
                            if (p != pm)
                            {
                                var i = p.OnboardPokemon.GetCondition <int>(Cs.UsedItem);
                                if (i != 0)
                                {
                                    items.Add(i);
                                    owners.Add(p.OnboardPokemon);
                                }
                            }
                        }
                    }
                    if (items.Any())
                    {
                        var i = c.GetRandomInt(0, items.Count - 1);
                        owners[i].RemoveCondition(Cs.UsedItem);
                        pm.RaiseAbility();
                        pm.SetItem(items[i]);
                        pm.ShowLogPm("Pickup", items[i]);
                        ITs.Attach(pm);
                    }
                }
                pm.CheckFaint();
            }
        }
Exemplo n.º 17
0
        //22.0 Gravity ends
        //23.0 Trick Room ends
        //24.0 Wonder Room ends
        //25.0 Magic Room ends
        private static void BoardCondition(Controller c)
        {
            var board = c.Board;
            int turn  = c.TurnNumber;

            if (board.GetCondition <int>(Cs.Gravity) == turn)
            {
                board.RemoveCondition(Cs.Gravity);
                c.ReportBuilder.ShowLog("DeGravity");
            }
            if (board.GetCondition <int>(Cs.TrickRoom) == turn)
            {
                board.RemoveCondition(Cs.TrickRoom);
                c.ReportBuilder.ShowLog("DeTrickRoom");
            }
            if (board.GetCondition <int>(Cs.WonderRoom) == turn)
            {
                foreach (var pm in c.OnboardPokemons)
                {
                    var stats = pm.OnboardPokemon.FiveD;
                    var d     = stats.Def;
                    stats.Def   = stats.SpDef;
                    stats.SpDef = d;
                }
                board.RemoveCondition(Cs.WonderRoom);
                c.ReportBuilder.ShowLog("DeWonderRoom");
            }
            if (board.GetCondition <int>(Cs.MagicRoom) == turn)
            {
                board.RemoveCondition(Cs.MagicRoom);
                c.ReportBuilder.ShowLog("DeMagicRoom");
                foreach (var pm in c.OnboardPokemons)
                {
                    ITs.Attach(pm);
                }
            }
            if (board.GetCondition <int>(Cs.WaterSport) == turn)
            {
                board.RemoveCondition(Cs.WaterSport);
                c.ReportBuilder.ShowLog("DeWaterSport");
            }
            if (board.GetCondition <int>(Cs.MudSport) == turn)
            {
                board.RemoveCondition(Cs.MudSport);
                c.ReportBuilder.ShowLog("DeMudSport");
            }
            var t = board.GetCondition <int>(Cs.GrassyTerrain);

            if (t == turn)
            {
                board.RemoveCondition(Cs.GrassyTerrain);
                c.ReportBuilder.ShowLog("DeGrassyTerrain");
            }
            else if (t == 0)
            {
                t = board.GetCondition <int>(Cs.ElectricTerrain);
                if (t == turn)
                {
                    board.RemoveCondition(Cs.ElectricTerrain);
                    c.ReportBuilder.ShowLog("DeElectricTerrain");
                }
                else if (t == 0 && board.GetCondition <int>(Cs.MistyTerrain) == turn)
                {
                    board.RemoveCondition(Cs.MistyTerrain);
                    c.ReportBuilder.ShowLog("DeMistyTerrain");
                }
                else if (t == 0 && board.GetCondition <int>(Cs.PsychicTerrain) == turn)
                {
                    board.RemoveCondition(Cs.PsychicTerrain);
                    c.ReportBuilder.ShowLog("DePsychicTerrain");
                }
            }
        }
Exemplo n.º 18
0
 //12.0 Taunt ends
 //13.0 Encore ends
 //14.0 Disable ends, Cursed Body ends
 //15.0 Magnet Rise ends
 //16.0 Telekinesis ends
 //17.0 Heal Block ends
 //18.0 Embargo ends
 //19.0 Yawn
 //20.0 Perish Song
 private static void PokemonCondition(Controller c)
 {
     foreach (var pm in c.OnboardPokemons)
     {
         int turn = pm.OnboardPokemon.GetCondition(Cs.Taunt, -1);
         if (turn == 0)
         {
             pm.OnboardPokemon.RemoveCondition(Cs.Taunt);
             pm.ShowLogPm("DeTaunt");
         }
     }
     foreach (var pm in c.OnboardPokemons)
     {
         var o = pm.OnboardPokemon.GetCondition(Cs.Encore);
         if (o != null && o.Turn == 0)
         {
             pm.OnboardPokemon.RemoveCondition(Cs.Encore);
             pm.ShowLogPm("DeEncore");
         }
     }
     foreach (var pm in c.OnboardPokemons)
     {
         var o = pm.OnboardPokemon.GetCondition(Cs.Disable);
         if (o != null && o.Turn == c.TurnNumber)
         {
             pm.OnboardPokemon.RemoveCondition(Cs.Disable);
             pm.ShowLogPm("DeDisable");
         }
     }
     foreach (var pm in c.OnboardPokemons)
     {
         if (pm.OnboardPokemon.GetCondition <int>(Cs.MagnetRise) == c.TurnNumber)
         {
             pm.OnboardPokemon.RemoveCondition(Cs.MagnetRise);
             pm.ShowLogPm("DeMagnetRise");
         }
     }
     foreach (var pm in c.OnboardPokemons)
     {
         if (pm.OnboardPokemon.GetCondition <int>(Cs.Telekinesis) == c.TurnNumber)
         {
             pm.OnboardPokemon.RemoveCondition(Cs.Telekinesis);
             pm.ShowLogPm("DeTelekinesis");
         }
     }
     foreach (var pm in c.OnboardPokemons)
     {
         var o = pm.OnboardPokemon.GetCondition(Cs.HealBlock);
         if (o != null && o.Turn == c.TurnNumber)
         {
             pm.OnboardPokemon.RemoveCondition(Cs.HealBlock);
             pm.ShowLogPm("DeHealBlock");
         }
     }
     foreach (var pm in c.OnboardPokemons)
     {
         var o = pm.OnboardPokemon.GetCondition(Cs.SoundBlock);
         if (o != null && o.Turn == c.TurnNumber)
         {
             pm.OnboardPokemon.RemoveCondition(Cs.SoundBlock);
             pm.ShowLogPm("DeSoundBlock");
         }
     }
     foreach (var pm in c.OnboardPokemons)
     {
         if (pm.OnboardPokemon.GetCondition <int>(Cs.Embargo) == c.TurnNumber)
         {
             pm.OnboardPokemon.RemoveCondition(Cs.Embargo);
             pm.ShowLogPm("DeEmbargo");
             ITs.Attach(pm);
         }
     }
     foreach (var pm in c.OnboardPokemons)
     {
         if (pm.OnboardPokemon.GetCondition <int>(Cs.Charge) == c.TurnNumber)
         {
             pm.OnboardPokemon.RemoveCondition(Cs.Charge);
         }
     }
     foreach (var pm in c.OnboardPokemons)
     {
         if (pm.OnboardPokemon.GetCondition <int>(Cs.Laser_Focus) == c.TurnNumber)
         {
             pm.OnboardPokemon.RemoveCondition(Cs.Laser_Focus);
         }
     }
     foreach (var pm in c.OnboardPokemons)
     {
         var o = pm.OnboardPokemon.GetCondition(Cs.Yawn);
         if (o != null && o.Turn == c.TurnNumber)
         {
             pm.AddState(o.By, AttachedState.SLP, false);
             pm.OnboardPokemon.RemoveCondition(Cs.Yawn);
         }
     }
     foreach (var pm in c.OnboardPokemons.ToArray())
     {
         int turn = pm.OnboardPokemon.GetCondition <int>(Cs.PerishSong, -1);
         if (turn != -1)
         {
             pm.ShowLogPm("PerishSong", turn);
             if (turn == 0)
             {
                 pm.Faint();
             }
             else
             {
                 pm.OnboardPokemon.SetCondition(Cs.PerishSong, turn - 1);
             }
         }
     }
 }
        public static Modifier Execute(DefContext def)
        {
            var der  = def.Defender;
            var atk  = def.AtkContext;
            var move = atk.Move;
            var aer  = atk.Attacker;

            //If the target's side is affected by Reflect, the move used was physical, the user's ability isn't Infiltrator and the critical hit flag isn't set.
            //The value of the modificator is 0xA8F if there is more than one Pokemon per side of the field and 0x800 otherwise.
            //Same as above with Light Screen and special moves.
            Modifier m = (Modifier)(!def.IsCt && (der.Pokemon.TeamId == aer.Pokemon.TeamId || !aer.AbilityE(As.INFILTRATOR)) &&
                                    (move.Move.Category == MoveCategory.Physical && der.Field.HasCondition(Cs.Reflect) || move.Move.Category == MoveCategory.Special && der.Field.HasCondition(Cs.LightScreen)) ?
                                    atk.MultiTargets ? 0xA8F : 0x800 : 0x1000);

            {
                //If the target's ability is Multiscale and the target is at full health.
                m *= (Modifier)(def.AbilityE(As.MULTISCALE) && der.Hp == der.Pokemon.MaxHp ? 0x800 : 0x1000);
                //If the user's ability is Tinted Lens and the move wasn't very effective.
                if (def.EffectRevise < 0 && aer.AbilityE(As.TINTED_LENS))
                {
                    m *= 0x2000;
                }
                //If one of the target's allies' ability is Friend Guard.
                foreach (PokemonProxy pm in der.Controller.GetOnboardPokemons(der.Pokemon.TeamId))
                {
                    if (pm != der && pm.AbilityE(As.FRIEND_GUARD))
                    {
                        m *= 0xC00;
                    }
                }
                //If user has ability Sniper and move was a critical hit.
                if (def.IsCt && aer.AbilityE(As.SNIPER))
                {
                    m *= 0x1800;
                }
                //If the target's ability is Solid Rock or Filter and the move was super effective.
                if (def.EffectRevise > 0 && (def.AbilityE(As.FILTER) || def.AbilityE(As.SOLID_ROCK)))
                {
                    m *= 0xC00;
                }
                if (atk.Hit == 2 && atk.HasCondition(Cs.ParentalBond))
                {
                    m *= 0x800;
                }
            }

            switch (aer.Item)
            {
            //If the user is holding an expert belt and the move was super effective.
            case Is.EXPERT_BELT:
                if (def.EffectRevise > 0)
                {
                    m *= 0x1333;
                }
                break;

            //If the user is holding a Life Orb.
            case Is.LIFE_ORB:
                m *= 0x14cc;
                break;

            //If the user is holding the item Metronome. If n is the number of time the current move was used successfully and successively, the value of the modifier is 0x1000+n*0x333 if n≤4 and 0x2000 otherwise.
            case Is.METRONOME:
                var c = aer.OnboardPokemon.GetCondition(Cs.LastMove);
                if (c != null && move == c.Move)
                {
                    if (c.Int < 5)
                    {
                        m *= (ushort)(0x1000 + c.Int * 0x333);
                    }
                    else
                    {
                        m *= 0x2000;
                    }
                }
                break;
            }

            //If the target is holding a damage lowering berry of the attack's type.
            {
                var item = der.Item;
                if (
                    item == Is.CHILAN_BERRY && atk.Type == BattleType.Normal ||
                    atk.Type == AntiBerry(item) && def.EffectRevise > 0
                    )
                {
                    def.SetCondition(Cs.Antiberry);
                    m *= 0x800;
                }
            }

            switch (move.Id)
            {
            case Ms.STOMP:       //23
            case Ms.DRAGON_RUSH:
            case Ms.STEAMROLLER: //537
            case Ms.PHANTOM_FORCE:
            case Ms.FLYING_PRESS:
                if (der.OnboardPokemon.HasCondition(Cs.Minimize))
                {
                    m *= 0x2000;
                }
                break;

            case Ms.SURF:
            case Ms.WHIRLPOOL:
                if (der.CoordY == CoordY.Water)
                {
                    m *= 0x2000;
                }
                break;

            case Ms.EARTH_POWER: //89
            case Ms.MAGNITUDE:   //222
                if (der.CoordY == CoordY.Underground)
                {
                    m *= 0x2000;
                }
                break;

            case Ms.KNOCK_OFF:
                if (der.Pokemon.Item != 0 && !ITs.NeverLostItem(der.Pokemon))
                {
                    m *= 0x1800;
                }
                break;
            }

            return(m);
        }
Exemplo n.º 20
0
 private static void Counter(AtkContext atk, Cs condition, Modifier modifier)
 {
     ITs.CheckGem(atk);
     atk.Target.Damage = atk.Attacker.OnboardPokemon.GetCondition(condition).Damage;
     atk.Target.ModifyDamage(modifier);
 }
Exemplo n.º 21
0
        public static void Execute(DefContext def)
        {
            var der  = def.Defender;
            var atk  = def.AtkContext;
            var aer  = atk.Attacker;
            var move = atk.Move;

            switch (move.Id)
            {
            case Ms.TRI_ATTACK:     //161
                TriAttack(def);
                break;

            case Ms.THIEF:     //168
            case Ms.COVET:     //343
                Thief(def);
                break;

            case Ms.KNOCK_OFF:     //282
                RemoveItem(def, false, "KnockOff");
                break;

            case Ms.INCINERATE:     //510
                RemoveItem(def, true, "Incinerate");
                break;

            case Ms.SECRET_POWER:     //290
                SecretPower(def);
                break;

            case Ms.NATURAL_GIFT:     //363
                def.AtkContext.Attacker.ConsumeItem(false);
                break;

            case Ms.PLUCK:     //365
            case Ms.BUG_BITE:  //450
                EatDefenderBerry(def);
                break;

            case Ms.FLING:     //374
            {
                var i = aer.Pokemon.Item;
                aer.ConsumeItem(false);
                ITs.RaiseItemByMove(def.Defender, i, aer);
            }
            break;

            case Ms.SHADOW_FORCE:     //467
            case Ms.PHANTOM_FORCE:
            case Ms.HYPERSPACE_HOLE:
            case Ms.HYPERSPACE_FURY:
                if (def.Defender.OnboardPokemon.RemoveCondition(Cs.Protect))
                {
                    def.Defender.ShowLogPm("DeProtect");
                }
                break;

            case Ms.CLEAR_SMOG:     //499
                der.OnboardPokemon.SetLv7D(0, 0, 0, 0, 0, 0, 0);
                der.ShowLogPm("7DReset");
                break;

            case Ms.Core_Enforcer:
                if (der.LastMoveTurn == der.Controller.TurnNumber && !GameHelper.CantLoseAbility(der.Ability) && der.OnboardPokemon.AddCondition(Cs.GastroAcid))
                {
                    der.ShowLogPm("LoseAbility");
                }
                break;

            default:
                if (der.Hp > 0)
                {
                    if (move.Class == MoveClass.AttackWithTargetLv7DChange)
                    {
                        der.ChangeLv7D(def);
                    }
                    else if (move.Class == MoveClass.AttackWithState)
                    {
                        der.AddState(def);
                    }
                    if (!def.AbilityE(As.INNER_FOCUS) && (move.FlinchProbability != 0 && def.RandomHappen(move.FlinchProbability) || ATs.Stench(def) || ITs.CanAttackFlinch(def)))
                    {
                        der.OnboardPokemon.SetTurnCondition(Cs.Flinch);
                    }
                }
                break;
            }
            switch (move.Id)
            {
            case Ms.RELIC_SONG:
                if (aer.CanChangeForm(648))
                {
                    aer.ChangeForm(1 - aer.OnboardPokemon.Form.Index);
                }
                break;
            }
        }