private static bool Confuse(PokemonProxy pm) { int count = pm.OnboardPokemon.GetCondition <int>(Cs.Confuse); if (count != 0) { if (--count > 0) { pm.ShowLogPm("Confuse"); pm.OnboardPokemon.SetCondition(Cs.Confuse, count); if (pm.Controller.OneNth(3)) { pm.ShowLogPm(Ls.ConfuseWork); var e = new GameEvents.ShowHp() { Pm = pm.Id }; pm.Controller.ReportBuilder.Add(e); pm.MoveHurt((pm.Pokemon.Lv * 2 / 5 + 2) * 40 * OnboardPokemon.Get5D(pm.OnboardPokemon.FiveD.Atk, pm.OnboardPokemon.Lv5D.Atk) / OnboardPokemon.Get5D(pm.OnboardPokemon.FiveD.Def, pm.OnboardPokemon.Lv5D.Def) / 50 + 2, true); e.Hp = pm.Hp; pm.CheckFaint(); //if (!pm.CheckFaint()) pm.Item.HpChanged(pm); //◇硝子玩偶◇ 22:21:00 你知道混乱打自己的时候不触发加HP的果子么 return(false); } } else { pm.OnboardPokemon.RemoveCondition(Cs.Confuse); pm.ShowLogPm("DeConfuse"); } } return(true); }
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); }