public bool SelectSkill(FormationUnit performer, MonsterBrainDecision decision)
    {
        if (IsRestricted(performer))
        {
            return(false);
        }

        var monster         = (Monster)performer.Character;
        var availableSkills = monster.Data.CombatSkills.FindAll(skill => IsValidSkill(performer, skill));

        if (availableSkills.Count > 0)
        {
            decision.Decision           = BrainDecisionType.Perform;
            decision.SelectedSkill      = availableSkills[RandomSolver.Next(availableSkills.Count)];
            decision.TargetInfo.Targets = BattleSolver.GetSkillAvailableTargets(performer, decision.SelectedSkill);
            decision.TargetInfo.Targets.RemoveAll(target => !IsValidTarget(target));
            decision.TargetInfo.Type = decision.SelectedSkill.TargetRanks.SkillTargetType;

            if (decision.TargetInfo.Targets.Count == 0)
            {
                return(false);
            }

            var availableTargetDesires = monster.Brain.TargetDesireSet.FindAll(IsValidTargetDesire);
            while (availableTargetDesires.Count > 0)
            {
                TargetSelectionDesire desire = RandomSolver.ChooseByRandom(availableTargetDesires);
                if (desire.SelectTarget(performer, decision))
                {
                    return(true);
                }

                availableTargetDesires.Remove(desire);
            }
            return(false);
        }
        return(false);
    }
示例#2
0
    public static MonsterBrainDecision UseMonsterBrain(FormationUnit performer, string combatSkillOverride = null)
    {
        if (performer.Character.IsMonster)
        {
            var monster = performer.Character as Monster;

            if (string.IsNullOrEmpty(combatSkillOverride))
            {
                var skillDesires         = new List <SkillSelectionDesire>(monster.Brain.SkillDesireSet);
                var monsterBrainDecision = new MonsterBrainDecision(BrainDecisionType.Pass);

                while (skillDesires.Count != 0)
                {
                    SkillSelectionDesire desire = RandomSolver.ChooseByRandom(skillDesires);
                    if (desire != null && desire.SelectSkill(performer, monsterBrainDecision))
                    {
                        var cooldown = monster.Brain.SkillCooldowns.Find(cd => cd.SkillId == monsterBrainDecision.SelectedSkill.Id);
                        if (cooldown != null)
                        {
                            performer.CombatInfo.SkillCooldowns.Add(cooldown.Copy());
                        }
                        RaidSceneManager.BattleGround.LastSkillUsed = monsterBrainDecision.SelectedSkill.Id;
                        return(monsterBrainDecision);
                    }
                    else
                    {
                        skillDesires.Remove(desire);
                    }
                }
                return(new MonsterBrainDecision(BrainDecisionType.Pass));
            }
            else
            {
                var availableSkill = monster.Data.CombatSkills.Find(skill => skill.Id == combatSkillOverride);

                if (availableSkill != null && IsSkillUsable(performer, availableSkill))
                {
                    var monsterBrainDecision = new MonsterBrainDecision(BrainDecisionType.Pass);
                    monsterBrainDecision.Decision           = BrainDecisionType.Perform;
                    monsterBrainDecision.SelectedSkill      = availableSkill;
                    monsterBrainDecision.TargetInfo.Targets = GetSkillAvailableTargets(performer, monsterBrainDecision.SelectedSkill);
                    monsterBrainDecision.TargetInfo.Type    = monsterBrainDecision.SelectedSkill.TargetRanks.IsSelfTarget ?
                                                              SkillTargetType.Self : monsterBrainDecision.SelectedSkill.TargetRanks.IsSelfFormation ?
                                                              SkillTargetType.Party : SkillTargetType.Enemy;

                    var availableTargetDesires = new List <TargetSelectionDesire>(monster.Brain.TargetDesireSet);

                    while (availableTargetDesires.Count > 0)
                    {
                        TargetSelectionDesire desire = RandomSolver.ChooseByRandom(availableTargetDesires);
                        if (desire.SelectTarget(performer, monsterBrainDecision))
                        {
                            return(monsterBrainDecision);
                        }
                        else
                        {
                            availableTargetDesires.Remove(desire);
                        }
                    }
                    return(new MonsterBrainDecision(BrainDecisionType.Pass));
                }
                return(new MonsterBrainDecision(BrainDecisionType.Pass));
            }
        }
        else
        {
            var hero = performer.Character as Hero;

            var availableSkills = hero.Mode == null ? new List <CombatSkill>(hero.CurrentCombatSkills).FindAll(skill =>
                                                                                                               skill != null && IsSkillUsable(performer, skill)) : new List <CombatSkill>(hero.CurrentCombatSkills).FindAll(skill =>
                                                                                                                                                                                                                            skill.ValidModes.Contains(hero.CurrentMode.Id) && IsSkillUsable(performer, skill));

            if (availableSkills.Count != 0)
            {
                var monsterBrainDecision = new MonsterBrainDecision(BrainDecisionType.Pass);
                monsterBrainDecision.Decision           = BrainDecisionType.Perform;
                monsterBrainDecision.SelectedSkill      = availableSkills[RandomSolver.Next(availableSkills.Count)];
                monsterBrainDecision.TargetInfo.Targets = GetSkillAvailableTargets(performer, monsterBrainDecision.SelectedSkill);
                monsterBrainDecision.TargetInfo.Type    = monsterBrainDecision.SelectedSkill.TargetRanks.IsSelfTarget ?
                                                          SkillTargetType.Self : monsterBrainDecision.SelectedSkill.TargetRanks.IsSelfFormation ?
                                                          SkillTargetType.Party : SkillTargetType.Enemy;

                var availableTargets = new List <FormationUnit>(monsterBrainDecision.TargetInfo.Targets);
                if (availableTargets.Count > 0)
                {
                    monsterBrainDecision.TargetInfo.Targets.Clear();

                    if (monsterBrainDecision.SelectedSkill.TargetRanks.IsMultitarget)
                    {
                        monsterBrainDecision.TargetInfo.Targets.AddRange(availableTargets);
                        return(monsterBrainDecision);
                    }
                    else
                    {
                        int index = RandomSolver.Next(availableTargets.Count);
                        monsterBrainDecision.TargetInfo.Targets.Add(availableTargets[index]);
                        availableTargets.RemoveAt(index);
                        return(monsterBrainDecision);
                    }
                }
                return(new MonsterBrainDecision(BrainDecisionType.Pass));
            }
            return(new MonsterBrainDecision(BrainDecisionType.Pass));
        }
    }
示例#3
0
 protected override bool IsValidTargetDesire(TargetSelectionDesire desire)
 {
     return(desire.Type == TargetDesireType.Marked);
 }
 protected virtual bool IsValidTargetDesire(TargetSelectionDesire desire)
 {
     return(true);
 }
示例#5
0
 protected override bool IsValidTargetDesire(TargetSelectionDesire desire)
 {
     return(desire.Type == TargetDesireType.FillEmptyCaptor);
 }