Beispiel #1
0
        /// <summary>
        /// 퀘스트 진행도를 갱신한다.(Accum) 의미없는 키는 자동으로 무시된다.
        /// (코드 수정시 CheckQuest_Set()함수도 동일하게 수정할 것. 바꿀부분은 복붙하면 빨간줄 그어짐
        /// </summary>
        public void CheckQuest_Accum(string requestKey, int acc)
        {
            bool isDirty = false;


            // 플레이어가 받고 있는 퀘스트 중에
            for (int i = 0; i < UserData.quests.Count; i++)
            {
                // 키에 맞는 퀘스트 정보를 불러온다.
                var questInfo = QuestDatabase.GetInfo(UserData.quests[i].key);

                // 퀘스트에 맞는 요구키가 있는지 찾는다.
                for (int j = 0; j < questInfo.requestKey.Length; j++)
                {
                    // 요구키와 동일한 키가 있다면 퀘스트 진행도 업데이트
                    if (questInfo.requestKey[j] == requestKey)
                    {
                        isDirty = true;
                        UserData.quests[i].progress[j] += acc;
                        this.onProgressChanged?.Invoke(UserData.quests[i].key);

                        KLog.Log(string.Format("<color=red>{0} Check Quest</color>", requestKey));
                    }
                }
            }

            // 데이터가 갱신되었으면 업데이트
            if (isDirty)
            {
                UserData.UpdateData();
            }
        }
Beispiel #2
0
        public void Init(string key)
        {
            this.questInfo = QuestDatabase.GetInfo(key);

            this.titleText.text = questInfo.title;

            // 퀵뷰 한번 갱신
            this.deltaTime = 100;
            Update();
        }
Beispiel #3
0
        /// <summary>
        /// NPC로부터 선택할 수 있는 선택지를 만든다.
        /// </summary>
        private SelectionData[] CalcSelectionList()
        {
            List <SelectionData> data = new List <SelectionData>();

            int remainViewQuestCount = this.useStore ? 2 : 3; // Count가 0이되면 더이상 퀘스트창에 나타나지 않는다.

            // 받을 수 있는 퀘스트 체크
            for (int i = 0; i < this._quest.Length; i++)
            {
                // 보여줄 수 있는 최대 슬롯초과하면 무시
                if (remainViewQuestCount <= 0)
                {
                    break;
                }

                string key       = this._quest[i].questKey;
                var    questInfo = QuestDatabase.GetInfo(key);

                // 이미 진행중인 퀘스트
                if (QuestManager.inst.HasQuest(key))
                {
                    data.Add(new SelectionData(SelectionType.Quest, key, questInfo.title));
                    remainViewQuestCount--;
                }
                else
                {
                    // 이미 클리어 된 퀘스트
                    if (QuestManager.inst.IsClearQuest(key))
                    {
                        continue;
                    }

                    // 받을 수 있는 퀘스트인지 체크
                    if (QuestManager.inst.IsAcceptQuest(key))
                    {
                        data.Add(new SelectionData(SelectionType.Quest, key, questInfo.title));
                        remainViewQuestCount--;
                    }
                }
            }

            if (this.useStore)
            {
                data.Add(new SelectionData(SelectionType.Store, null, "상점"));
            }

            data.Add(new SelectionData(SelectionType.Chat, null, "잡담"));

            return(data.ToArray());
        }
Beispiel #4
0
        /// <summary>
        /// 현재 키에 맞는 진행도를 반환한다. 없으면 -1을 반환한다.
        /// </summary>
        public int GetProgress(string questKey, string requestKey)
        {
            // 플레이어가 받고 있는 퀘스트 중에
            for (int i = 0; i < UserData.quests.Count; i++)
            {
                // 키에 맞는 퀘스트 정보를 불러온다.
                var questInfo = QuestDatabase.GetInfo(UserData.quests[i].key);

                // 퀘스트에 맞는 요구키가 있는지 찾는다.
                for (int j = 0; j < questInfo.requestKey.Length; j++)
                {
                    // 요구키와 동일한 키가 있다면 진행도 반환
                    if (questInfo.requestKey[j] == requestKey)
                    {
                        return(UserData.quests[i].progress[j]);
                    }
                }
            }

            return(-1);
        }
Beispiel #5
0
        /// <summary>
        /// 퀘스트 조건을 모두 달성했는지 확인함.
        /// </summary>
        public bool IsFinishProgress(string questKey)
        {
            // 퀘스트 정보를 가져온다
            QuestInfo info = QuestDatabase.GetInfo(questKey);

            // 퀘스트 진행도를 가져온다
            QuestProgressInfo progress = null;

            for (int i = 0; i < UserData.quests.Count; i++)
            {
                if (questKey == UserData.quests[i].key)
                {
                    progress = UserData.quests[i];
                    break;
                }
            }

            if (progress == null)
            {
                KLog.LogError("유효하지 않은 퀘스트키. " + questKey);
                return(false);
            }



            // 퀘스트 조건을 모두 체크해서 진행도를 채웠는지 확인
            for (int i = 0; i < info.request.Length; i++)
            {
                // 여러 조건중 하나라도 만족하지 못하면 클리어 불가능
                if (info.request[i] > progress.progress[i])
                {
                    return(false);
                }
            }

            // 모든 조건을 만족함
            return(true);
        }
Beispiel #6
0
 /// <summary>
 /// 퀘스트를 추가한다.
 /// </summary>
 public void AddQuest(string questKey)
 {
     UserData.quests.Add(new QuestProgressInfo(questKey, new int[QuestDatabase.GetInfo(questKey).ifText.Length]));
     KLog.Log(string.Format("<color=red>{0} Add Quest</color>", questKey));
 }
Beispiel #7
0
 /// <summary>
 /// 퀘스트를 받을 수 있는지
 /// </summary>
 /// <returns></returns>
 public bool IsAcceptQuest(string questKey)
 {
     //선행 조건 키를 받아와 언락을 시도함
     return(UnlockManager.IsUnlock(QuestDatabase.GetInfo(questKey).preKey));
 }
Beispiel #8
0
        /// <summary>
        /// 퀘스트를 클리어한다. 진행도 상관없이 클리어 하기 때문에
        /// 반드시 퀘스트 클리어 가능한지 여부를 확인할 것.
        /// </summary>
        /// <param name="questKey"></param>
        public void ClearQuest(string questKey)
        {
            // 현재 퀘스트 정보
            var currQuestInfo = QuestDatabase.GetInfo(questKey);

            // 아이템을 회수해야 하는경우 여기서 회수한다
            for (int i = 0; i < currQuestInfo.requestKey.Length; i++)
            {
                string chKey = currQuestInfo.requestKey[i];

                // 수집퀘스트키는 아이템을 회수
                if (chKey.Contains(QuestCheckKey.QuestKey_Collect_))
                {
                    UserManager.AccumItem(chKey.Substring(QuestCheckKey.QuestKey_Collect_.Length), -currQuestInfo.request[i]);
                }
            }

            // 관련 키를 언락한다.
            for (int i = 0; i < currQuestInfo.unlockKey.Length; i++)
            {
                UnlockManager.UnlockKey(currQuestInfo.unlockKey[i]);
            }

            // 퀘스트 보상을 준다
            for (int i = 0; i < currQuestInfo.rewardKey.Length; i++)
            {
                if (currQuestInfo.rewardKey[i] == "Coin")
                {
                    UserManager.AccumCoin(currQuestInfo.reward[i]);
                    StageMaster.current.playerController.hud.ViewEventText(string.Format("코인 획득 ({0})", currQuestInfo.reward[i]));
                }
                else
                {
                    UserManager.AccumItem(currQuestInfo.rewardKey[i], currQuestInfo.reward[i]);
                    StageMaster.current.playerController.hud.ViewEventText(string.Format("{0} 획득 ({1})", ItemDatabase.GetItemInfo(currQuestInfo.rewardKey[i]).itemName, currQuestInfo.reward[i]));
                }
            }

            // 퀘스트를 비운다.
            for (int i = 0; i < UserData.quests.Count; i++)
            {
                if (UserData.quests[i].key == questKey)
                {
                    UserData.quests.RemoveAt(i);
                }
            }

            // 퀘스트 클리어됨
            UserData.clearedQuest.Add(questKey);

            // 퀵뷰에 데이터가 남아있으면 삭제
            if (HasQuickView(questKey))
            {
                RemoveQuickView(questKey);
            }

            // 데이터 최종 적용
            UserData.UpdateData();

            this.onQuestClear?.Invoke(questKey);
            KLog.Log(string.Format("<color=red>{0} Clear Quest</color>", questKey));
        }