public ViewModelQuestRequirement(
            IQuestRequirement requirement,
            // can be null when the quest is completed
            [CanBeNull] QuestRequirementState requirementState)
        {
            this.requirement      = requirement;
            this.requirementState = requirementState;

            this.requirementState?.ClientSubscribe(
                _ => _.IsSatisfied,
                isSatisfiedNow =>
            {
                this.NotifyPropertyChanged(nameof(this.IsSatisfied));
                if (isSatisfiedNow)
                {
                    Api.Client.Audio.PlayOneShot(new SoundResource("UI/Quests/QuestRequirementSatisfied.ogg"));
                }
            },
                this);

            if (requirement is IQuestRequirementWithCount questRequirementWithCount)
            {
                this.CountRequired = questRequirementWithCount.RequiredCount;

                if (requirementState != null)
                {
                    // requirement state can be null if the quest is already completed
                    this.requirementStateWithCount = (QuestRequirementStateWithCount)requirementState;
                    this.requirementStateWithCount.ClientSubscribe(
                        _ => _.CountCurrent,
                        _ => this.NotifyPropertyChanged(nameof(this.CountCurrent)),
                        this);
                }
            }
        }
        public bool SharedHasCompletedRequirement(IQuestRequirement requirement)
        {
            var quest = requirement.Quest;

            Api.Assert(quest != null, "Requirement must have an associated quest");

            var questEntry = this.SharedFindQuestEntry(quest, out var isUnlocked);

            if (questEntry == null ||
                !isUnlocked)
            {
                // no such entry
                return(false);
            }

            if (questEntry.IsCompleted ||
                questEntry.AreAllRequirementsSatisfied)
            {
                // all requirements are/were satisfied
                return(true);
            }

            // find a state for this requirement and check whether it's satisfied
            var indexOfRequirement = -1;
            var requirements       = quest.Requirements;

            if (requirements == null)
            {
                return(false);
            }

            for (var index = 0; index < requirements.Count; index++)
            {
                var r = requirements[index];
                if (r != requirement)
                {
                    continue;
                }

                indexOfRequirement = index;
                break;
            }

            Api.Assert(indexOfRequirement >= 0, "Requirement not exist in quest");
            var requirementState = questEntry.RequirementStates[indexOfRequirement];

            return(requirementState.IsSatisfied);
        }
Beispiel #3
0
        public ViewModelQuestRequirement(
            IQuestRequirement requirement,
            // can be null when the quest is completed
            [CanBeNull] QuestRequirementState requirementState)
        {
            this.requirement      = requirement;
            this.requirementState = requirementState;

            this.requirementState?.ClientSubscribe(
                _ => _.IsSatisfied,
                isSatisfiedNow =>
            {
                this.NotifyPropertyChanged(nameof(this.IsSatisfied));
                if (!isSatisfiedNow)
                {
                    return;
                }

                // play requirement satisfied sound (not more often than once per frame)
                if (lastRequirementSatisfiedFrame != Client.CurrentGame.ServerFrameNumber)
                {
                    lastRequirementSatisfiedFrame = Client.CurrentGame.ServerFrameNumber;
                    Api.Client.Audio.PlayOneShot(SoundResourceQuestRequirementSatisfied, volume: 0.5f);
                }
            },
                this);

            if (requirement is IQuestRequirementWithCount questRequirementWithCount)
            {
                this.CountRequired = questRequirementWithCount.RequiredCount;

                if (requirementState != null)
                {
                    // requirement state can be null if the quest is already completed
                    this.requirementStateWithCount = (QuestRequirementStateWithCount)requirementState;
                    this.requirementStateWithCount.ClientSubscribe(
                        _ => _.CountCurrent,
                        _ => this.NotifyPropertyChanged(nameof(this.CountCurrent)),
                        this);
                }
            }
        }