private static void AttackedUpItem(DefContext def, BattleType type, StatType stat) { if (def.AtkContext.Type == type) { ITs.ChangeLv5D(def.Defender, stat, 1); } }
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); } } }
private static void Up1Berry(PokemonProxy pm, StatType stat) { if (ATs.Gluttony(pm)) { ITs.ChangeLv5D(pm, stat, 1); } }
private static void AttackedUpItem(DefContext def, MoveCategory cat, StatType stat) { if (def.AtkContext.Move.Move.Category == cat) { ITs.ChangeLv5D(def.Defender, stat, 1); } }
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); } } }
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); } }
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); } }
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); } }
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); } } }
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); }
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; } }
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); } }
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); }
/// <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); }
//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(); } }
//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"); } } }
//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); }
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); }
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; } }