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); }
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)); } }
protected override bool IsValidTargetDesire(TargetSelectionDesire desire) { return(desire.Type == TargetDesireType.Marked); }
protected virtual bool IsValidTargetDesire(TargetSelectionDesire desire) { return(true); }
protected override bool IsValidTargetDesire(TargetSelectionDesire desire) { return(desire.Type == TargetDesireType.FillEmptyCaptor); }