private static void Download(PokemonProxy pm)
        {
            var sa = pm.CanChangeLv7D(pm, StatType.SpAtk, 1, false) != 0;
            var a  = pm.CanChangeLv7D(pm, StatType.Atk, 1, false) != 0;

            if (sa || a)
            {
                var stats = new List <StatType>();
                foreach (var p in pm.Controller.Board[1 - pm.Pokemon.TeamId].GetAdjacentPokemonsByOppositeX(pm.OnboardPokemon.X))
                {
                    if (p.OnboardPokemon.FiveD.Def > p.OnboardPokemon.FiveD.SpDef)
                    {
                        if (sa)
                        {
                            stats.Add(StatType.SpAtk);
                        }
                    }
                    else if (a)
                    {
                        stats.Add(StatType.Atk);
                    }
                }
                var n = stats.Count;
                if (n != 0)
                {
                    pm.RaiseAbility();
                    pm.ChangeLv7D(pm, stats[pm.Controller.GetRandomInt(0, n - 1)], 1, false);
                }
            }
        }
 private static void CantAddState(PokemonProxy pm, PokemonState state)
 {
     if (pm.State == state)
     {
         pm.RaiseAbility();
         pm.DeAbnormalState();
     }
 }
 private static void WeatherObserver(PokemonProxy pm, int number, int form)
 {
     if (pm.CanChangeForm(number, form))
     {
         //pm.OnboardPokemon.SetCondition("ObserveWeather"); Sp.Abilities.AttachWeatherObserver
         pm.RaiseAbility();
         pm.ChangeForm(form);
     }
 }
        private static void Imposter(PokemonProxy pm)
        {
            var t = pm.Controller.Board[1 - pm.Pokemon.TeamId][pm.Controller.GameSettings.Mode.XBound() - pm.OnboardPokemon.X - 1].Pokemon;

            if (pm.CanTransform(t))
            {
                pm.RaiseAbility();
                pm.Transform(t);
            }
        }
Exemplo n.º 5
0
        public static bool IsGroundAffectable(PokemonProxy pm, bool abilityAvailable, bool raiseAbility)
        {
            var o = pm.OnboardPokemon;

            return
                ((o.HasCondition(Cs.SmackDown) || o.HasCondition(Cs.Ingrain) || pm.Controller.Board.HasCondition(Cs.Gravity)) || pm.ItemE(Is.IRON_BALL) ||
                 !(o.HasType(BattleType.Flying) ||
                   o.HasCondition(Cs.MagnetRise) || o.HasCondition(Cs.Telekinesis) ||
                   pm.ItemE(Is.AIR_BALLOON) ||
                   (abilityAvailable && (raiseAbility ? pm.RaiseAbility(As.LEVITATE) : pm.AbilityE(As.LEVITATE)))));
        }
Exemplo n.º 6
0
 private static bool Flinch(PokemonProxy pm)
 {
     if (pm.OnboardPokemon.HasCondition(Cs.Flinch))
     {
         pm.ShowLogPm("Flinch");
         if (pm.RaiseAbility(As.STEADFAST))
         {
             pm.ChangeLv7D(pm, StatType.Speed, 1, false);
         }
         return(false);
     }
     return(true);
 }
Exemplo n.º 7
0
 private static bool CantLvDown(PokemonProxy pm, PokemonProxy by, StatType stat, int change, bool showFail, StatType s0)
 {
     if (stat == s0)
     {
         if (showFail)
         {
             pm.RaiseAbility();
             pm.ShowLogPm("7DLock", (int)stat);
         }
         return(true);
     }
     return(false);
 }
Exemplo n.º 8
0
 private static bool Truant(PokemonProxy p)
 {
     if (p.AbilityE(As.TRUANT))
     {
         if (p.OnboardPokemon.GetCondition <int>(Cs.Truant) == p.Controller.TurnNumber)
         {
             p.RaiseAbility();
             p.ShowLogPm("Truant");
             return(false);
         }
         p.OnboardPokemon.SetCondition(Cs.Truant, p.Controller.TurnNumber + 1);
     }
     return(true);
 }
        private static void Forewarn(PokemonProxy pm)
        {
            var moves = new List <KeyValuePair <PokemonProxy, MoveTypeE> >();

            {
                int maxPower = 0;
                foreach (PokemonProxy p in pm.Controller.Board[1 - pm.Pokemon.TeamId].GetAdjacentPokemonsByOppositeX(pm.OnboardPokemon.X))
                {
                    foreach (MoveProxy m in p.Moves)
                    {
                        int power = m.MoveE.Move.Power;
                        if (power == 1)
                        {
                            if (m.MoveE.Class == MoveClass.OHKO)
                            {
                                power = 160;
                            }
                            else
                            {
                                var mid = m.MoveE.Id;
                                if (mid == 382)
                                {
                                    power = 0;             //先取
                                }
                                else if (mid == 68 || mid == 243 || mid == 368)
                                {
                                    power = 120;
                                }
                            }
                        }
                        if (power > maxPower)
                        {
                            moves.Clear();
                            maxPower = power;
                        }
                        if (power == maxPower)
                        {
                            moves.Add(new KeyValuePair <PokemonProxy, MoveTypeE>(p, m.MoveE));
                        }
                    }
                }
            }
            if (moves.Count != 0)
            {
                var pair = moves[pm.Controller.GetRandomInt(0, moves.Count - 1)];
                pm.RaiseAbility();
                pm.Controller.ReportBuilder.ShowLog("ReadMove", pair.Key.Id, pair.Value.Id);
            }
        }
 private static void Anticipation(PokemonProxy pm)
 {
     foreach (var p in pm.Controller.Board[1 - pm.Pokemon.TeamId].GetAdjacentPokemonsByOppositeX(pm.OnboardPokemon.X))
     {
         foreach (var m in p.Moves)
         {
             if (m.MoveE.Class == MoveClass.OHKO || m.MoveE.Move.Type.EffectRevise(pm.OnboardPokemon.Types) > 0)
             {
                 pm.RaiseAbility();
                 pm.ShowLogPm("Anticipation");
                 return;
             }
         }
     }
 }
        private static void SpWeather(PokemonProxy pm, Weather weather, string log)
        {
            var c = pm.Controller;

            if (c.Board.GetCondition <int>(Cs.SpWeather) != pm.OnboardPokemon.Ability)
            {
                pm.RaiseAbility();
                c.ReportBuilder.ShowLog(log);
                c.Board.SetCondition(Cs.SpWeather, pm.OnboardPokemon.Ability);
                var fw = c.Weather;
                if (c.Board.Weather != weather)
                {
                    c.Weather = weather;
                }
            }
        }
        private static void Trace(PokemonProxy pm)
        {
            var pms = new List <PokemonProxy>();

            foreach (var p in pm.Controller.Board[1 - pm.Pokemon.TeamId].GetAdjacentPokemonsByOppositeX(pm.OnboardPokemon.X))
            {
                if (ATs.Trace(p.OnboardPokemon.Ability))
                {
                    pms.Add(p);
                }
            }
            var n = pms.Count;

            if (n != 0)
            {
                pm.RaiseAbility();
                var target = pms[pm.Controller.GetRandomInt(0, n - 1)];
                pm.ChangeAbility(target.OnboardPokemon.Ability);
                pm.Controller.ReportBuilder.ShowLog("Trace", target.Id, target.OnboardPokemon.Ability);
            }
        }
        private static void Frisk(PokemonProxy pm)
        {
            var pms   = pm.Controller.GetOnboardPokemons(1 - pm.Pokemon.TeamId);
            var items = new List <int>();

            foreach (var p in pms)
            {
                if (p.Pokemon.Item != 0)
                {
                    items.Add(p.Pokemon.Item);
                }
            }
            if (items.Count == 0)
            {
                return;
            }
            int i = pm.Controller.GetRandomInt(0, items.Count - 1);

            pm.RaiseAbility();
            pm.ShowLogPm("Frisk", items[i]);
        }
Exemplo n.º 14
0
 public static bool Remaining1HP(PokemonProxy pm, bool ability)
 {
     if (pm.OnboardPokemon.HasCondition(Cs.Endure))
     {
         pm.ShowLogPm("Endure");
         return(true);
     }
     if (ability && pm.Hp == pm.Pokemon.MaxHp && pm.RaiseAbility(As.STURDY))
     {
         pm.ShowLogPm("Endure");
         return(true);
     }
     if (pm.ItemE(Is.FOCUS_BAND) && pm.Controller.OneNth(10) || pm.ItemE(Is.FOCUS_SASH) && pm.Hp == pm.Pokemon.MaxHp)
     {
         pm.ShowLogPm("FocusItem", pm.Pokemon.Item);
         if (pm.Pokemon.Item == Is.FOCUS_SASH)
         {
             pm.ConsumeItem();
         }
         return(true);
     }
     return(false);
 }
Exemplo n.º 15
0
        public static bool SetWeather(PokemonProxy pm, Weather weather, bool ability, bool showFail)
        {
            var c = pm.Controller;

            if (c.Board.Weather == weather)
            {
                if (showFail)
                {
                    c.ReportBuilder.ShowLog(Ls.Fail0);
                }
                return(false);
            }
            if (ability)
            {
                pm.RaiseAbility();
            }
            switch (c.Board.GetCondition <int>(Cs.SpWeather))
            {
            case As.PRIMORDIAL_SEA:
                c.ReportBuilder.ShowLog(Ls.HeavyRain2);
                return(false);

            case As.DESOLATE_LAND:
                c.ReportBuilder.ShowLog(Ls.HarshSunlight2);
                return(false);

            case As.DELTA_STREAM:
                c.ReportBuilder.ShowLog(Ls.MysteriousAirCurrent2);
                return(false);

            default:
                c.ReportBuilder.ShowLog(weather == Weather.IntenseSunlight ? Ls.EnIntenseSunlight : weather == Weather.Rain ? Ls.EnRain : weather == Weather.Hailstorm ? Ls.EnHailstorm : Ls.EnSandstorm);
                c.Weather = weather;
                c.Board.SetCondition(Cs.Weather, (c.TurnNumber == 0 ? 1 : c.TurnNumber) + (pm.ItemE(weather.Item()) ? 7 : 4));
                return(true);
            }
        }
Exemplo n.º 16
0
        private static void Terrain(PokemonProxy pm, Cs terrain)
        {
            var c = pm.Controller;
            var b = c.Board;
            int x = pm.Item == Is.Terrain_Extender ? 7 : 4;

            if (c.TurnNumber == 0)
            {
                x++;
            }
            if (b.AddCondition(terrain, c.TurnNumber + x))
            {
                if (!(terrain != Cs.GrassyTerrain && b.RemoveCondition(Cs.GrassyTerrain) || terrain != Cs.ElectricTerrain && b.RemoveCondition(Cs.ElectricTerrain)) && terrain != Cs.MistyTerrain)
                {
                    b.RemoveCondition(Cs.MistyTerrain);
                }
                if (terrain != Cs.PsychicTerrain)
                {
                    b.RemoveCondition(Cs.PsychicTerrain);
                }
                pm.RaiseAbility();
                c.ReportBuilder.ShowLog("En" + terrain);
            }
        }
Exemplo n.º 17
0
        public static int Execute(PokemonProxy pm, PokemonProxy by, StatType stat, int change, bool showFail)
        {
            var a = pm.Ability;

            if (change < 0 && by != pm)
            {
                if (pm.Field.HasCondition(Cs.Mist)) //根据百科非技能似乎不该发动,但排除了一下这样写肯定是对的
                {
                    if (showFail)
                    {
                        pm.ShowLogPm("Mist");
                    }
                    return(0);
                }
                if (by == null || pm.Pokemon.TeamId != by.Pokemon.TeamId)
                {
                    switch (a)
                    {
                    case As.CLEAR_BODY:
                    case As.WHITE_SMOKE:
                    case As.Full_Metal_Body:
                        if (showFail)
                        {
                            pm.RaiseAbility();
                            pm.ShowLogPm("7DLockAll");
                        }
                        return(0);

                    case As.KEEN_EYE:
                        if (CantLvDown(pm, by, stat, change, showFail, StatType.Accuracy))
                        {
                            return(0);
                        }
                        break;

                    case As.HYPER_CUTTER:
                        if (CantLvDown(pm, by, stat, change, showFail, StatType.Atk))
                        {
                            return(0);
                        }
                        break;

                    case As.BIG_PECKS:
                        if (CantLvDown(pm, by, stat, change, showFail, StatType.Def))
                        {
                            return(0);
                        }
                        break;
                    }
                }
                if (pm.OnboardPokemon.HasType(BattleType.Grass))
                {
                    foreach (var p in pm.Field.Pokemons)
                    {
                        if (p.AbilityE(As.FLOWER_VEIL))
                        {
                            if (showFail)
                            {
                                p.RaiseAbility();
                                pm.ShowLogPm("7DLock", (int)stat);
                            }
                            return(0);
                        }
                    }
                }
            }

            switch (a)
            {
            case As.SIMPLE: //86
                change <<= 1;
                break;

            case As.CONTRARY: //126
                change = 0 - change;
                break;
            }

            return(change);
        }
        public static void Execute(PokemonProxy pm)
        {
            switch (pm.Ability)
            {
            case As.DRIZZLE:     //2
                STs.SetWeather(pm, Weather.Rain, true, false);
                break;

            case As.DROUGHT:
                STs.SetWeather(pm, Weather.IntenseSunlight, true, false);
                break;

            case As.SAND_STREAM:
                STs.SetWeather(pm, Weather.Sandstorm, true, false);
                break;

            case As.SNOW_WARNING:
                STs.SetWeather(pm, Weather.Hailstorm, true, false);
                break;

            case As.PRIMORDIAL_SEA:
                SpWeather(pm, Weather.Rain, Ls.EnHeavyRain);
                break;

            case As.DESOLATE_LAND:
                SpWeather(pm, Weather.IntenseSunlight, Ls.EnHarshSunlight);
                break;

            case As.DELTA_STREAM:
                SpWeather(pm, Weather.Normal, Ls.EnMysteriousAirCurrent);
                break;

            case As.LIMBER:     //7
                CantAddState(pm, PokemonState.PAR);
                break;

            case As.INSOMNIA:     //15
            case As.VITAL_SPIRIT: //72
                CantAddState(pm, PokemonState.SLP);
                break;

            case As.MAGMA_ARMOR:     //40
                CantAddState(pm, PokemonState.FRZ);
                break;

            case As.WATER_VEIL:     //41
                CantAddState(pm, PokemonState.BRN);
                break;

            case As.OBLIVIOUS:     //12
                if (pm.OnboardPokemon.RemoveCondition(Cs.Attract))
                {
                    pm.RaiseAbility();
                    pm.ShowLogPm("DeAttract");
                }
                break;

            case As.IMMUNITY:     //17
                if (pm.State == PokemonState.PSN || pm.State == PokemonState.BadlyPSN)
                {
                    pm.RaiseAbility();
                    pm.DeAbnormalState();
                }
                break;

            case As.OWN_TEMPO:     //20
                if (pm.OnboardPokemon.RemoveCondition(Cs.Confuse))
                {
                    pm.RaiseAbility();
                    pm.ShowLogPm("DeConfuse");
                }
                break;

            case As.IMPOSTER:
                Imposter(pm);
                break;

            case As.FRISK:
                Frisk(pm);
                break;

            case As.FLOWER_GIFT:
                WeatherObserver(pm, 421, pm.Controller.Weather == Weather.IntenseSunlight ? 1 : 0);
                break;

            case As.FORECAST:
            {
                var form = (int)pm.Controller.Weather;
                WeatherObserver(pm, 351, form > 3 ? 0 : form);
            }
            break;

            case As.FOREWARN:
                Forewarn(pm);
                break;

            case As.FLASH_FIRE:
                pm.OnboardPokemon.RemoveCondition(Cs.FlashFire);
                break;

            case As.AIR_LOCK:     //总觉得多个天气锁的可能会有问题,未测
                pm.RaiseAbility();
                pm.Controller.ReportBuilder.ShowLog("AirLock");
                if (pm.Controller.Board.Weather != Weather.Normal)
                {
                    ATs.WeatherChanged(pm.Controller);
                }
                break;

            case As.INTIMIDATE:
                pm.RaiseAbility();
                foreach (var p in pm.Controller.Board[1 - pm.Pokemon.TeamId].GetAdjacentPokemonsByOppositeX(pm.OnboardPokemon.X))
                {
                    if (p.OnboardPokemon.HasCondition(Cs.Substitute))
                    {
                        p.ShowLogPm("NoEffect");
                    }
                    else
                    {
                        p.ChangeLv7D(pm, StatType.Atk, -1, true);
                    }
                }
                break;

            case As.TRACE:
                Trace(pm);
                break;

            case As.PRESSURE:
                SimpleAttachRaise(pm, "Pressure");
                break;

            case As.MOLD_BREAKER:
                SimpleAttachRaise(pm, "MoldBreaker");
                break;

            case As.TURBOBLAZE:
                SimpleAttachRaise(pm, "Turboblaze");
                break;

            case As.TERAVOLT:
                SimpleAttachRaise(pm, "Teravolt");
                break;

            case As.DOWNLOAD:
                Download(pm);
                break;

            case As.ANTICIPATION:
                Anticipation(pm);
                break;

            case As.SLOW_START:
                pm.OnboardPokemon.SetCondition(Cs.SlowStart, pm.Controller.TurnNumber + 5);
                pm.RaiseAbility();
                pm.ShowLogPm("EnSlowStart");
                break;
            }
        }
 private static void SimpleAttachRaise(PokemonProxy pm, string log)
 {
     pm.RaiseAbility();
     pm.ShowLogPm(log);
 }