예제 #1
0
        public void StartQuest(QuestInstance quest)
        {
            ServiceLocator.QuestService.GetQuestStatus(quest).HasStarted = true;
            ServiceLocator.EconomyService.Gold -= quest.Cost.ModifiedValue;

            GetQuestStatus(quest).OnQuestExpired -= OnQuestExpired;
        }
예제 #2
0
        public void CompleteQuest(QuestInstance quest)
        {
            QuestStatus status     = GetQuestStatus(quest);
            bool        successful = status.HasCompletedSuccesfully();

            foreach (HeroInstance hero in status.AssignedHeroes.Values)
            {
                HeroStates targetHeroState = HeroStates.IDLE;
                if (successful)
                {
                    hero.Experience += quest.TotalExperience;
                }
                else
                {
                    if (MathUtilities.RollRandom(status.RiskInjuryRate))
                    {
                        targetHeroState = HeroStates.WOUNDED;
                    }
                    else if (MathUtilities.RollRandom(status.RiskInjuryRate))
                    {
                        targetHeroState = HeroStates.DEAD;
                    }
                }
                hero.HeroState = targetHeroState;
            }

            if (successful)
            {
                ServiceLocator.EconomyService.Gold += quest.GoldReward;
            }
            RemoveQuest(quest);
        }
예제 #3
0
 public FactionInstance GetQuestFaction(QuestInstance quest)
 {
     if (m_FactionTable.ContainsKey(quest))
     {
         return(m_FactionTable[quest]);
     }
     return(null);
 }
예제 #4
0
 public QuestStatus GetQuestStatus(QuestInstance quest)
 {
     if (m_QuestStatuses.ContainsKey(quest))
     {
         return(m_QuestStatuses[quest]);
     }
     return(null);
 }
예제 #5
0
    public void CheckQuests()
    {
        if (gameWon)
        {
            return;
        }

        foreach (Transform t in quests)
        {
            QuestInstance qI = t.GetComponent <QuestInstance>();
            if (qI.completed)
            {
                return;
            }
            switch (qI.quest.res)
            {
            case Resource.Money:
                if (money >= qI.quest.amount)
                {
                    qI.quest.completed = true;
                    qI.Complete();
                }
                break;

            case Resource.Notoriety:
                if (notor >= qI.quest.amount)
                {
                    qI.quest.completed = true;
                    qI.Complete();
                }
                break;

            case Resource.Cultists:
                if (numOfCultists >= qI.quest.amount)
                {
                    qI.quest.completed = true;
                    qI.Complete();
                }
                break;

            case Resource.Time:
                if (timeSurvived >= qI.quest.amount)
                {
                    qI.quest.completed = true;
                    qI.Complete();
                }
                break;

            default:
                break;
            }
        }
        if (quests[0].GetComponent <QuestInstance>().completed&& quests[1].GetComponent <QuestInstance>().completed&& quests[2].GetComponent <QuestInstance>().completed)
        {
            OpenWinMenu();
        }
    }
예제 #6
0
        public void RemoveQuest(QuestInstance quest)
        {
            m_QuestStatuses[quest].OnStatusUpdate -= QuestStatusUpdateWrapper;

            m_FactionTable.Remove(quest);
            m_QuestStatuses.Remove(quest);

            OnQuestsUpdate(quest, QuestUpdateAction.REMOVED);
        }
예제 #7
0
파일: Quest.cs 프로젝트: SagaFav/server-1
 public ModelQuest()
 {
     Secondaryobjectives = new List <ModelQuestSecondaryobjectives>();
     Secondaryrewards    = new List <ModelQuestSecondaryrewards>();
     Timereffects        = new List <ModelQuestTimereffects>();
     Playersettings      = new List <ModelQuestPlayersettings>();
     Diplomacysettings   = new List <ModelQuestDiplomacysettings>();
     Instance            = new QuestInstance();
 }
예제 #8
0
        private void OnQuestSubmitted()
        {
            QuestInstance quest = m_ActiveQuest.QuestInstance;

            Destroy(m_QuestInterfaceTargets[m_ActiveQuest].gameObject);
            m_QuestInterfaceTargets.Remove(m_ActiveQuest);
            m_ActiveQuest.TargetTransform = questSubmittedPosition;
            m_ActiveQuest = null;
        }
예제 #9
0
        public void RegisterQuest(QuestInstance quest, FactionInstance faction)
        {
            m_FactionTable[quest]  = faction;
            m_QuestStatuses[quest] = new QuestStatus(quest);

            m_QuestStatuses[quest].OnQuestExpired += OnQuestExpired;
            m_QuestStatuses[quest].OnStatusUpdate += QuestStatusUpdateWrapper;

            OnQuestsUpdate(quest, QuestUpdateAction.ADDED);
            OnQuestStatusUpdate(m_QuestStatuses[quest].AssignedHeroes, m_QuestStatuses[quest]);
        }
예제 #10
0
        private void QuestUpdated(QuestInstance quest, QuestUpdateAction action)
        {
            switch (action)
            {
            case QuestUpdateAction.ADDED:
                AddQuestInterface(quest);
                break;

            case QuestUpdateAction.REMOVED:
                RemoveQuestInterface(quest);
                break;
            }
        }
예제 #11
0
 private List <QuestInstance> UpdateQuestTimeLimits(List <QuestInstance> list, int dayLimit)
 {
     for (int i = list.Count - 1; i >= 0; i--)
     {
         QuestInstance quest = list[i];
         quest.DaysLeftOnPost--;
         if (quest.DaysLeftOnPost <= dayLimit)
         {
             list.Remove(quest);
         }
     }
     return(list);
 }
예제 #12
0
        private void NextDayStep()
        {
            if (m_QuestsToAssign.Count != 0)
            {
                QuestInstance nextQuest = m_QuestsToAssign[m_QuestsToAssign.Count - 1];
                m_QuestsToAssign.Remove(nextQuest);

                QuestDetailsWindow.Instance.OpenWindow(nextQuest, QuestDetailsWindowMode.HERO_SELECT);
                m_CurrentDayStep++;
                return;
            }

            while (m_ActiveQuestsToUpdate.Count != 0)
            {
                QuestInstance activeQuest = m_ActiveQuestsToUpdate[m_ActiveQuestsToUpdate.Count - 1];
                activeQuest.DaysLeftOnQuest--;

                m_ActiveQuestsToUpdate.Remove(activeQuest);

                if (activeQuest.DaysLeftOnQuest <= 0)
                {
                    QuestDetailsWindow.Instance.OpenWindow(activeQuest, QuestDetailsWindowMode.COMPLETED);
                    activeQuest.CompleteQuest(QuestManager.ActiveQuests[activeQuest]);
                    m_CurrentDayStep++;
                    return;
                }
            }

            if (m_CurrentDayStep == 0)
            {
                nothingToReportUI.SetActive(true);
                TimeUtilities.ExecuteAfterDelay(() => {
                    nothingToReportUI.SetActive(false);
                    NextDayStep();
                }, 2.5f, this);
                m_CurrentDayStep++;
                return;
            }

            CurrentDay++;

            OnNextDay();

            QuestManager.PostedQuests = UpdateQuestTimeLimits(QuestManager.PostedQuests, 0);
            QuestManager.Requests     = UpdateQuestTimeLimits(QuestManager.Requests, 0);
            InventoryManager.Gold    -= 4;

            StartCoroutine(SunRotateRoutine(true));
            NightFadeUI.Instance.Disable(() => { });
            QuestDetailsWindow.Instance.OnWindowClose -= NextDayStep;
        }
예제 #13
0
    public virtual QuestInstance newInstance()
    {
        QuestInstance qi = new QuestInstance();

        qi.quest      = this;
        qi.objectives = new List <QuestObjectiveEvaluator>();

        QuestObjective[] objectives = this.gameObject.GetComponents <QuestObjective>();

        if (objectives != null)
        {
            for (int i = 0; i < objectives.Length; i++)
            {
                qi.objectives.Add(objectives[i].getEvaluator());
            }
        }

        return(qi);
    }
예제 #14
0
        private void OnQuestEventTimerComplete()
        {
            m_QuestEventTimeTracker.OnTimerCompleted -= OnQuestEventTimerComplete;

            QuestEventData eventData  = m_QuestEventDataList[m_CurrentQuestEventData];
            bool           spawnQuest = UnityEngine.Random.Range(0, 101) < eventData.chance;

            if (spawnQuest)
            {
                for (int i = 0; i < eventData.questCount; i++)
                {
                    QuestInstance   quest   = QuestGenerator.GenerateQuest(1, m_QuestMakeupRandom.GetRandomValue());
                    FactionInstance faction = ServiceLocator.AllegianceService.Factions.GetRandom();
                    ServiceLocator.QuestService.RegisterQuest(quest, faction);
                }
                m_CurrentQuestEventData = -1;
            }

            StartNextQuestEvent();
        }
예제 #15
0
        /// <summary>
        /// Get quest instance from quest.
        /// </summary>
        /// <param name="q">The quest.</param>
        /// <returns>Quest instance.</returns>
        public static QuestInstance GetQuestInstance(Quest q)
        {
            QuestInstance ObjInstance = new QuestInstance()
            {
                Id           = q.Id,
                Status       = "assigned",
                Scale        = q.Questbasescale,
                Timer        = q.Timer,
                Giveregion   = q.GiveRegion,
                Returnregion = q.ReturnRegion,
                Active       = ((q.Questtype == QuestTypes.CapitolCity) || (q.Questtype == QuestTypes.Global)) ? "true" : "false",
                Objective    = new ModelQuestinstanceObjective()
                {
                    Id = q.Objectives.Id, Type = "And", MustFailAll = q.Objectives.Mustfailall, Objective = QuestHelper.ConvertQuestObjectiveValues(q.Objectives.Values)
                },
                Secondaryobjectives = QuestHelper.ConvertQuestSecondaryobjectivesValues(q)
            };

            return(ObjInstance);
        }
예제 #16
0
        public void ApplyQuestChain(QuestInstance chain)
        {
            m_QuestInstance = chain;

            if (QuestManager.PostedQuests.Contains(m_QuestInstance))
            {
                m_QuestMode = QuestDetailsWindowMode.POSTED_REVIEW;
            }
            else if (QuestManager.Requests.Contains(m_QuestInstance))
            {
                m_QuestMode = QuestDetailsWindowMode.SETUP;
            }
            else
            {
                m_QuestMode = QuestDetailsWindowMode.ACTIVE_REVIEW;
            }

            m_QuestInstance.OnDaysLeftUpdate += UpdateText;

            UpdateText();
        }
예제 #17
0
        private void RemoveQuestInterface(QuestInstance quest)
        {
            QuestInterface questInterfaceToRemove = null;

            foreach (QuestInterface questInterface in m_QuestInterfaceTargets.Keys)
            {
                if (questInterface.QuestInstance == quest)
                {
                    questInterfaceToRemove = questInterface;
                    break;
                }
            }

            if (questInterfaceToRemove == null)
            {
                return;
            }

            Destroy(questInterfaceToRemove.gameObject);
            Destroy(m_QuestInterfaceTargets[questInterfaceToRemove].gameObject);
            m_QuestInterfaceTargets.Remove(questInterfaceToRemove);
        }
예제 #18
0
        private void AddQuestInterface(QuestInstance quest)
        {
            QuestListEntry newEntry     = Instantiate(questListEntryPrefab, questListParent);
            QuestInterface newInterface = Instantiate(questInterfacePrefab, questInstancesParent);

            m_QuestInterfaceTargets[newInterface] = newEntry;

            newInterface.QuestInstance = quest;
            newInterface.SetInteractable(false);

            newEntry.GetComponent <RectTransform>().rect.Set(selectedQuestPosition.rect.x, selectedQuestPosition.rect.y, selectedQuestPosition.rect.width, selectedQuestPosition.rect.height);

            newEntry.OnButtonClick.AddListener(() => {
                if (m_ActiveQuest == newInterface)
                {
                    return;
                }
                SetQuestState(newInterface, QuestInterfaceStates.ACTIVE);
            });

            newEntry.OnHoverStart += () => {
                if (m_ActiveQuest == newInterface)
                {
                    return;
                }
                SetQuestState(newInterface, QuestInterfaceStates.HOVER);
            };

            newEntry.OnHoverEnd += () => {
                if (m_ActiveQuest == newInterface)
                {
                    return;
                }
                SetQuestState(newInterface, QuestInterfaceStates.DEFAULT);
            };

            SetQuestState(newInterface, QuestInterfaceStates.DEFAULT);
        }
예제 #19
0
        public static void InitializeServices(GameSetupData data)
        {
            //Factions and heroes
            for (int i = 0; i < data.factionCount; i++)
            {
                FactionInstance faction = FactionGenerator.GenerateFaction();
                foreach (HeroType heroType in Enum.GetValues(typeof(HeroType)))
                {
                    HeroInstance hero = HeroGenerator.GenerateHero(1, heroType);
                    ServiceLocator.AllegianceService.SetHeroAllegiance(hero, faction);
                }

                /*for (int h = 0; h < Random.Range(data.heroesPerFactionMin, data.heroesPerFactionMax + 1); h++) {
                 *      HeroInstance hero = HeroGenerator.GenerateHero(1);
                 *      ServiceLocator.AllegianceService.SetHeroAllegiance(hero, faction);
                 * }*/

                for (int q = 0; q < data.startQuests; q++)
                {
                    QuestInstance quest = QuestGenerator.GenerateQuest(1, QuestMakeupType.SOLO);
                    ServiceLocator.QuestService.RegisterQuest(quest, faction);
                }
            }
        }
예제 #20
0
    public virtual QuestInstance newInstance()
    {
        if (!metaQuestDummy)
        {
            metaQuestDummy = new GameObject("metaQuestDummy");
            DontDestroyOnLoad(metaQuestDummy);
        }

        //strip the dummy gameobject from the components
        MonoBehaviour[] components = metaQuestDummy.GetComponents <MonoBehaviour>();
        foreach (MonoBehaviour bhvr in components)
        {
            Destroy(bhvr);
        }

        //create a new quest instance
        QuestInstance qi = new QuestInstance();

        //copy the data
        qi.quest                = metaQuestDummy.AddComponent <Quest>();
        qi.quest.audioQuest     = _music;
        qi.quest.title          = _title;
        qi.quest.town           = _town;
        qi.quest.background     = _background;
        qi.quest.baseCoinsAward = _award;
        qi.quest.startDialog    = metaQuestDummy.AddComponent <Dialog>();

        //create the dialog
        Dialog dialog = qi.quest.startDialog;

        foreach (DialogMessage dm in messages)
        {
            DialogMessage msg = new DialogMessage();

            msg.CopyFrom(dm);

            dialog.messages.Add(msg);
        }

        //add the accept side quest window and the quest title cinematic event
        metaQuestDummy.AddComponent <ShowAcceptSideQuestWindow>();
        metaQuestDummy.AddComponent <ShowQuestTitle>();

        //create new quest objectives evaluator
        qi.objectives = new List <QuestObjectiveEvaluator>();

        MetaKillQuest[] mkq = GetComponents <MetaKillQuest>();

        List <KillQuest> mandatoryKillQuests = new List <KillQuest>();
        List <KillQuest> optionalKillQuests  = new List <KillQuest>();

        if (mkq != null)
        {
            foreach (MetaKillQuest mk in mkq)
            {
                if (mk._mandatory)
                {
                    mandatoryKillQuests.Add(mk as KillQuest);
                }
                else
                {
                    optionalKillQuests.Add(mk as KillQuest);
                }
            }

            foreach (KillQuest kq in mandatoryKillQuests)
            {
                qi.objectives.Add(kq.getEvaluator());
            }

            if (_maxKillQuests >= 0)
            {
                if (mandatoryKillQuests.Count < _maxKillQuests)
                {
                    //random sort
                    optionalKillQuests.Sort(delegate(KillQuest kq1, KillQuest kq2)
                    {
                        return((Random.Range(0, 2) == 0)?-1:1);                     //shuffle
                    });

                    int numKillQuestsToAdd = _maxKillQuests - mandatoryKillQuests.Count;

                    for (int i = 0; i < numKillQuestsToAdd; i++)
                    {
                        qi.objectives.Add(optionalKillQuests[i].getEvaluator());
                    }
                }
            }
            else
            {
                foreach (KillQuest kq in optionalKillQuests)
                {
                    qi.objectives.Add(kq.getEvaluator());
                }
            }
        }

        LootQuest[] lqs = GetComponents <LootQuest>();
        if (lqs != null)
        {
            foreach (LootQuest lq in lqs)
            {
                qi.objectives.Add(lq.getEvaluator());
            }
        }

        RescueQuest[] rqs = GetComponents <RescueQuest>();
        if (rqs != null && rqs.Length > 0)
        {
            int index = Random.Range(0, rqs.Length);
            Debug.Log(index);
            qi.objectives.Add(rqs[index].getEvaluator());
        }

        return(qi);
    }
예제 #21
0
        public void OpenWindow(QuestInstance quest, QuestDetailsWindowMode mode)
        {
            WindowMode = mode;
            if (quest == CurrentQuest)
            {
                gameObject.SetActive(!gameObject.activeSelf);
            }
            else
            {
                gameObject.SetActive(true);
            }
            CurrentQuest = quest;
            Reset();

            switch (mode)
            {
            case QuestDetailsWindowMode.SETUP:
                closeButton.gameObject.SetActive(true);
                skipButton.gameObject.SetActive(false);
                cancelButton.gameObject.SetActive(false);
                acceptButton.gameObject.SetActive(false);
                completeButton.gameObject.SetActive(false);
                postButton.gameObject.SetActive(true);

                RefreshItemRewardDropdown();
                SetNoHero();
                CheckPostButtonStatus();
                break;

            case QuestDetailsWindowMode.HERO_SELECT:
                closeButton.gameObject.SetActive(false);
                skipButton.gameObject.SetActive(true);
                cancelButton.gameObject.SetActive(true);
                acceptButton.gameObject.SetActive(true);
                completeButton.gameObject.SetActive(false);
                postButton.gameObject.SetActive(false);
                break;

            case QuestDetailsWindowMode.POSTED_REVIEW:
                closeButton.gameObject.SetActive(true);
                skipButton.gameObject.SetActive(false);
                cancelButton.gameObject.SetActive(true);
                acceptButton.gameObject.SetActive(false);
                completeButton.gameObject.SetActive(false);
                postButton.gameObject.SetActive(false);

                SetNoHero();
                break;

            case QuestDetailsWindowMode.ACTIVE_REVIEW:
                closeButton.gameObject.SetActive(true);
                skipButton.gameObject.SetActive(false);
                cancelButton.gameObject.SetActive(true);
                acceptButton.gameObject.SetActive(false);
                completeButton.gameObject.SetActive(false);
                postButton.gameObject.SetActive(false);

                FindActiveHero();
                break;

            case QuestDetailsWindowMode.COMPLETED:
                closeButton.gameObject.SetActive(false);
                skipButton.gameObject.SetActive(false);
                cancelButton.gameObject.SetActive(false);
                acceptButton.gameObject.SetActive(false);
                completeButton.gameObject.SetActive(true);
                postButton.gameObject.SetActive(false);

                FindActiveHero();
                break;
            }

            questTitle.text     = "<b><u>" + CurrentQuest.QuestSource.RequestTitle + "</u>\n<size=18>" + CurrentQuest.QuestTypeDisplay + " - </b><i>" + CurrentQuest.DurationInDays + " Day" + (CurrentQuest.DurationInDays > 1 ? "s" : "") + " duration</i></size>";
            difficultyText.text = "" + CurrentQuest.DifficultyLevel;

            handlerGoldReward.text = CurrentQuest.HandlerGoldRewardEstimate;

            handlerItemRewardParent.SetActive(CurrentQuest.HandlerItemReward != null);
            handlerRewardItemInstance.SetItem(CurrentQuest.HandlerItemReward != null ? CurrentQuest.HandlerItemReward.Item : (GameItem)null);

            handlerAdditionalRewardParent.SetActive(CurrentQuest.AdditionalReward != null);
            handlerAdditionalReward.text = CurrentQuest.AdditionalReward != null ? CurrentQuest.AdditionalReward.DisplayValue : "-";

            foreach (QuestDetailsHero heroSection in m_HeroSections)
            {
                heroSection.Reload();
            }
        }