예제 #1
0
        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);
        }
예제 #2
0
        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;
                        }
                    }
                }
            }
        }
예제 #3
0
        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);
        }