Beispiel #1
0
        public override void Update(IDice dice, Unit unit)
        {
            foreach (var person in unit.Persons)
            {
                if (person.IsDefeated)
                {
                    continue;
                }

                if (Progress >= Value)
                {
                    break;
                }

                if (dice.TestHit(person))
                {
                    var availableTargetMobs = Mobs.Where(x => x.HP > 0).ToArray();
                    if (!availableTargetMobs.Any())
                    {
                        continue;
                    }

                    var targetMobIndex = dice.RollTarget(availableTargetMobs);
                    var targetMob      = availableTargetMobs[targetMobIndex];

                    var dmg       = dice.RollDmg(person.Damage);
                    var normalDmg = Math.Min(targetMob.HP, dmg);
                    targetMob.HP -= normalDmg;
                    Progress     += normalDmg;
                }
            }

            if (Progress >= Value)
            {
                Resolve();
                return;
            }

            var availableMobs = Mobs.Where(x => x.HP > 0).ToArray();

            foreach (var mob in availableMobs)
            {
                if (mob.HP <= 0)
                {
                    continue;
                }

                if (dice.TestHit(mob))
                {
                    var availableTargetPersons = unit.Persons.Where(x => !x.IsDefeated).ToArray();
                    if (!availableTargetPersons.Any())
                    {
                        continue;
                    }

                    var targetPersonIndex = dice.RollTarget(availableTargetPersons);
                    var targetPerson      = availableTargetPersons[targetPersonIndex];

                    var dmg       = dice.RollDmg(mob.Damage);
                    var normalDmg = Math.Min(targetPerson.HP, dmg);
                    targetPerson.HP -= normalDmg;
                }
            }

            var availablePersons = unit.Persons.Where(x => !x.IsDefeated).ToArray();

            if (!availablePersons.Any())
            {
                Reject();
            }
        }