public bool HandleStatusEffect(ActiveMonster current, Move move, ActiveMonster opponent, StatusEffect eff, bool hitOpponent) { if (eff.Type != MoveEffectType.Status) { return(false); } bool ret = false; if (Rng.Next(0, 256) < eff.Chance) { ActiveMonster[] mons = new ActiveMonster[] { current, opponent }; for (int i = 0; i < mons.Length; i++) { if (mons[i] == null) { continue; } Who who = i == 0 ? Who.Self : Who.Foe; if (eff.Who == Who.Foe && who == Who.Foe && opponent.SubstituteHP > 0) { if (move.Category == ElementCategory.Status) { messageBuffer.AppendLine(string.Format("It didn't affect {0}{1}.", mons[i].Trainer.MonNamePrefix, mons[i].Monster.Name)); } continue; } if (mons[i] != null && (eff.Who == who || eff.Who == Who.Both) && (i == 0 || hitOpponent)) { if (eff.Status == StatusCondition.Faint) { mons[i].Monster.CurrentHP = 0; ret = true; } else if (eff.Status == StatusCondition.Confusion) { if (mons[i].IsConfused) { messageBuffer.AppendLine(string.Format("{0}{1} is already confused!", mons[i].Trainer.MonNamePrefix, mons[i].Monster.Name)); } else { messageBuffer.AppendLine(string.Format(eff.Message ?? "{0}{1} became confused!", mons[i].Trainer.MonNamePrefix, mons[i].Monster.Name)); mons[i].ConfusedCount = Rng.Next(2, 6); ret = true; } } else if (eff.Status == StatusCondition.Flinch) { mons[i].Flinched = true; ret = true; } else if ((eff.Force || mons[i].Monster.Status == StatusCondition.None) && !mons[i].Species.IsImmuneToStatus(eff.Status)) { string message = eff.Message; if (mons[i].Monster.Status != StatusCondition.None && eff.Force && !string.IsNullOrEmpty(eff.ForceMessage)) { message = eff.ForceMessage; } mons[i].Monster.Status = eff.Status; ret = true; switch (eff.Status) { case StatusCondition.Paralysis: messageBuffer.AppendLine(string.Format(message ?? "{0}{1} was paralyzed!", mons[i].Trainer.MonNamePrefix, mons[i].Monster.Name)); mons[i].EffectiveStats.Speed = (int)(((decimal)mons[i].EffectiveStats.Speed) * 0.25m); break; case StatusCondition.Sleep: messageBuffer.AppendLine(string.Format(message ?? "{0}{1} fell asleep!", mons[i].Trainer.MonNamePrefix, mons[i].Monster.Name)); mons[i].Monster.SleepCounter = eff.TurnLimit > 0 ? eff.TurnLimit : Rng.Next(1, 8); break; case StatusCondition.Burn: messageBuffer.AppendLine(string.Format(message ?? "{0}{1} was burned!", mons[i].Trainer.MonNamePrefix, mons[i].Monster.Name)); mons[i].EffectiveStats.Attack = (int)(((decimal)mons[i].EffectiveStats.Attack) * 0.5m); break; case StatusCondition.BadlyPoisoned: messageBuffer.AppendLine(string.Format(message ?? "{0}{1} was badly poisoned!", mons[i].Trainer.MonNamePrefix, mons[i].Monster.Name)); break; case StatusCondition.Freeze: messageBuffer.AppendLine(string.Format(message ?? "{0}{1} was frozen!", mons[i].Trainer.MonNamePrefix, mons[i].Monster.Name)); break; default: messageBuffer.AppendLine(string.Format(message ?? "{0}{1} was {2}ed!", mons[i].Trainer.MonNamePrefix, mons[i].Monster.Name, eff.Status.ToString().ToLower())); break; } } else if (move.Category == ElementCategory.Status) { messageBuffer.AppendLine(string.Format("It didn't affect {0}{1}.", mons[i].Trainer.MonNamePrefix, mons[i].Monster.Name)); } } } } return(ret); }
public void GenerateMoves(Generator generator) { for (int i = 0; i < Moves.Length; i++) { Moves[i] = null; } Learnset[] learnset = Species.Learnset.Where(l => l.LearnBy == LearnBy.Level).OrderBy(l => l.Condition).ToArray(); for (int i = 0; i < learnset.Length; i++) { if (Level < learnset[i].Condition) { break; } if (!Moves.Contains(learnset[i].Move)) { if (Moves.Any(m => m == null)) { for (int j = 0; j < Moves.Length; j++) { if (Moves[j] == null) { Moves[j] = learnset[i].Move; break; } } } else { Moves[0] = Moves[1]; Moves[1] = Moves[2]; Moves[2] = Moves[3]; Moves[3] = learnset[i].Move; } } } if (generator == Generator.SimulatePlayer) { if (Moves.Count(m => m != null) < 4 || (Species.Evolutions.Count > 0 ? Rng.Next(0, 100) < 30 : Rng.Next(0, 100) < 60)) { Move[] machineMoves = Species.Learnset.Where(l => (l.LearnBy == LearnBy.TM || l.LearnBy == LearnBy.HM) && !Moves.Contains(l.Move)).Select(l => l.Move).ToArray(); Move[] sameType = machineMoves.Where(m => m.Type == Species.Type1 || m.Type == Species.Type2).ToArray(); Move[] differntType = machineMoves.Where(m => m.Type != Species.Type1 && m.Type != Species.Type2).ToArray(); Move[] pickFrom = sameType.Length == 0 ? differntType : differntType.Length == 0 ? sameType : Rng.Next(0, 100) < 60 ? sameType : differntType; if (pickFrom.Length > 0) { Move newMove = pickFrom[Rng.Next(0, pickFrom.Length)]; int indexToReplace = Moves.Count(m => m != null); if (indexToReplace < 4) { Moves[indexToReplace] = newMove; } else { Moves[Rng.Next(0, 4)] = newMove; } } } } }
public bool HandleStatEffect(ActiveMonster current, ActiveMonster opponent, StatEffect eff, bool hitOpponent, bool showFailMessage = true) { bool ret = false; if (Rng.Next(0, 256) < eff.Chance) { ActiveMonster[] mons = new ActiveMonster[] { current, opponent }; for (int i = 0; i < mons.Length; i++) { if (mons[i] == null) { continue; } Who who = i == 0 ? Who.Self : Who.Foe; if (eff.Who == Who.Foe && who == Who.Foe && opponent.SubstituteHP > 0) { if (showFailMessage) { messageBuffer.AppendLine("But, it failed!"); } continue; } if (mons[i] != null && (eff.Who == who || eff.Who == Who.Both) && (i == 0 || hitOpponent)) { if (i == 1 && mons[i].ProtectStages) { if (showFailMessage) { messageBuffer.AppendLine("But, it failed!"); } } else if (eff.Temporary) { mons[i].EffectiveStats[eff.Stat] = (int)(((decimal)mons[i].EffectiveStats[eff.Stat]) * eff.Multiplier); } else if (eff.Condition == "defense-only") { bool worked = false; if (eff.Stat == StatType.Defense && mons[i].DefenseMultiplier == 1) { mons[i].DefenseMultiplier = (int)eff.Multiplier; worked = true; } else if (eff.Stat == StatType.Special && mons[i].SpecialDefenseMultiplier == 1) { mons[i].SpecialDefenseMultiplier = (int)eff.Multiplier; worked = true; } else { messageBuffer.AppendLine("But, it failed!"); } if (worked && !string.IsNullOrWhiteSpace(eff.Message)) { messageBuffer.AppendLine(string.Format(eff.Message, mons[i].Trainer.MonNamePrefix, mons[i].Monster.Name)); } if (worked) { ret = true; } } else { if ((eff.Change > 0 && mons[i].StatStages[eff.Stat] >= 6) || (eff.Change < 0 && mons[i].StatStages[eff.Stat] <= -6)) { if (showFailMessage) { messageBuffer.AppendLine("Nothing happened!"); } } else { if (!string.IsNullOrWhiteSpace(eff.Message)) { messageBuffer.AppendLine(string.Format(eff.Message, mons[i].Trainer.MonNamePrefix, mons[i].Monster.Name)); } if (eff.Stat == StatType.CritRatio) { mons[i].EffectiveStats.CritRatio = eff.Constant; } else { mons[i].StatStages[eff.Stat] += eff.Change; if (mons[i].StatStages[eff.Stat] > 6) { mons[i].StatStages[eff.Stat] = 6; } else if (mons[i].StatStages[eff.Stat] < -6) { mons[i].StatStages[eff.Stat] = -6; } messageBuffer.AppendLine(string.Format("{0}{1}'s {2} {3}{4}!", mons[i].Trainer.MonNamePrefix, mons[i].Monster.Name, eff.Stat.ToString().ToUpper(), eff.Change > 1 ? "greatly " : eff.Change < -1 ? "sharply " : "", eff.Change > 0 ? "rose" : "fell")); mons[i].Recalc(eff.Stat); } ret = true; } } } } } return(ret); }