// i hate this function - markus public static TalentTreeStageState GetTalentOptionStageState(Character character, string subTreeIdentifier, int index, List <string> selectedTalents) { if (character?.Info?.Job.Prefab is null) { return(TalentTreeStageState.Invalid); } if (!JobTalentTrees.TryGetValue(character.Info.Job.Prefab.Identifier, out TalentTree talentTree)) { return(TalentTreeStageState.Invalid); } TalentSubTree subTree = talentTree.TalentSubTrees.FirstOrDefault(tst => tst.Identifier == subTreeIdentifier); if (subTree == null) { return(TalentTreeStageState.Invalid); } TalentOption targetTalentOption = subTree.TalentOptionStages[index]; if (targetTalentOption.Talents.Any(t => character.HasTalent(t.Identifier))) { return(TalentTreeStageState.Unlocked); } if (targetTalentOption.Talents.Any(t => selectedTalents.Contains(t.Identifier))) { return(TalentTreeStageState.Highlighted); } bool hasTalentInLastTier = true; bool isLastTalentPurchased = true; int lastindex = index - 1; if (lastindex >= 0) { TalentOption lastLatentOption = subTree.TalentOptionStages[lastindex]; hasTalentInLastTier = lastLatentOption.Talents.Any(HasTalent); isLastTalentPurchased = lastLatentOption.Talents.Any(t => character.HasTalent(t.Identifier)); } if (!hasTalentInLastTier) { return(TalentTreeStageState.Locked); } bool hasPointsForNewTalent = character.Info.GetTotalTalentPoints() - selectedTalents.Count > 0; if (hasPointsForNewTalent) { return(isLastTalentPurchased ? TalentTreeStageState.Highlighted : TalentTreeStageState.Available); } return(TalentTreeStageState.Locked); bool HasTalent(TalentPrefab t) { return(selectedTalents.Contains(t.Identifier)); } }