Beispiel #1
0
        // 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));
            }
        }