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