Esempio n. 1
0
    private bool CheckFeasible(int questId)
    {
        var quest = QuestData.GetQuestData(questId);

        if (QuestDataSet.Contains(quest))
        {
            return(false);                              // 진행중이면 false
        }
        if (FeasibleQuestDataSet.Contains(quest))
        {
            return(false);                                      // 이미 진행 가능한 퀘스트 목록에 포함돼어 있으면 false;
        }
        if (quest.repeat)
        {
            ;              // 반복 퀘스트가 아닐경우 클리어 된 퀘스트 목록에 있으면 false. daily quest는 매일 클리어 목록에서 제거
        }
        else if (ClearedQuestDataSet.ContainsKey(questId))
        {
            return(false);
        }

        foreach (var preQuest in quest.precededQuest) // 선행퀘스트가 완료되지 않았으면 false
        {
            if (ClearedQuestDataSet.ContainsKey(preQuest))
            {
                continue;
            }
            return(false);
        }
        FeasibleQuestDataSet.Add(quest);
        return(true);
    }
Esempio n. 2
0
    public void QuestClear(int questId)
    {
        var questData = QuestData.GetQuestData(questId);

        if (!QuestDataSet.Contains(questData))
        {
            return;
        }
        QuestDataSet.Remove(questData);
        if (!ClearedQuestDataSet.ContainsKey(questData.KEY))
        {
            ClearedQuestDataSet.Add(questData.KEY, questData);
        }

        // TODO send questClear information to server

        foreach (var nextQuest in questData.nextQuest)
        {
            CheckFeasible(nextQuest);
            if (questData.type == (int)QuestType.Main)
            {
                QuestStart(nextQuest);
            }
        }

        // TODO 클리어 이벤트 (대화등)

        QuestReward(questData.questReward);
    }
Esempio n. 3
0
    public void QuestFail(int questId) // 퀘스트 포기, 우편물 분실 등, main 퀘스트는 실패 없음.
    {
        var questData = QuestData.GetQuestData(questId);

        if (!QuestDataSet.Contains(questData))
        {
            return;
        }
        QuestDataSet.Remove(questData);
        CheckFeasible(questId);
    }
Esempio n. 4
0
    public void QuestStart(int questId)
    {
        var quest = QuestData.GetQuestData(questId);

        // if (quest.needLevel > MogoWorld.thePlayer.level) return; // 레벨 제한 확인 check player level
        if (!FeasibleQuestDataSet.Contains(quest))
        {
            return;                                        // 시작 가능한 퀘스트 목록에 포함되어 있는지 확인
        }
        FeasibleQuestDataSet.Remove(quest);
        QuestDataSet.Add(quest);

        // TODO send quest start information to server

        // TODO 시작 이벤트, 효과 등등, 배달 임무일 경우 아이템 획득
    }
Esempio n. 5
0
    // daily quest는 서버에서 처리한다.
    /// <summary>
    /// 서버에서 받아온 정보로 시스템을 초기화 한다.
    /// </summary>
    /// <param name="baseQuestNumList">선행 퀘스트가 없는 퀘스트 목록</param>
    /// <param name="clearedQuestNumList">플레이어가 완수한 퀘스트 목록</param>
    /// <param name="inProgressQuestNumList">플레이어가 진행중인 퀘스트 목록</param>
    /// <param name="questProgress">플레이어가 진행중인 퀘스트들의 진행도</param>
    public void InitQuestInfo(List <int> baseQuestNumList, List <int> clearedQuestNumList, List <int> inProgressQuestNumList, List <List <int> > questProgress)
    {
        for (int i = 0; i < inProgressQuestNumList.Count(); i++)
        {
            var questNum = inProgressQuestNumList[i];
            var quest    = QuestData.GetQuestData(questNum);
            QuestDataSet.Add(quest);
            quest.QuestProgress = questProgress[i];
        }

        foreach (var questNum in clearedQuestNumList)
        {
            var quest = QuestData.GetQuestData(questNum);
            ClearedQuestDataSet.Add(quest.KEY, quest);
        }

        foreach (var questSet in ClearedQuestDataSet)
        {
            var quest = questSet.Value;
            if (FeasibleQuestDataSet.Contains(quest))
            {
                FeasibleQuestDataSet.Remove(quest);
            }
            foreach (var nextQuest in quest.nextQuest)
            {
                CheckFeasible(nextQuest);
            }
        }

        foreach (var questNum in baseQuestNumList)
        {
#if QUEST_DEBUG
            Debug.Log($" Quest base init {questNum}");
#endif
            CheckFeasible(questNum);
            QuestStart(questNum); // <-- for test 퀘스트 시작 테스트용 코드 TODO Delete
        }
    }
Esempio n. 6
0
    /// <summary>
    /// 퀘스트 자동진행
    /// </summary>
    /// <param name="questId"></param>
    public void QuestProgressing(int questId)
    {
        var quest = QuestData.GetQuestData(questId);

        var eventId = quest.eventId;

        var     targetList         = quest.questTarget;
        var     progressList       = quest.QuestProgress;
        var     targetSceneNumList = quest.sceneNumber;
        int     currentTarget;
        int     targetSceneNum = MogoWorld.thePlayer.sceneId;
        Vector3 targetVector;

        switch (eventId)
        {
        case 1:     // 대화 (대화완료 = 1, 대화미완료 = 0)
            for (var i = 0; i < progressList.Count; i++)
            {
                if (progressList[i] == quest.questCondition[i])
                {
                    continue;
                }
                currentTarget  = targetList[i];
                targetSceneNum = targetSceneNumList[i];
                break;
            }

            changeScene(targetSceneNum);

            // TODO currentTarget 추적
            break;

        case 2:      // 배달 (배달완료 = 1, 배달미완료 = 0)
            for (var i = 0; i < progressList.Count; i++)
            {
                if (progressList[i] == quest.questCondition[i])
                {
                    continue;
                }
                currentTarget  = targetList[2 * i + 1];    // targetList {대상, 물건, 대상 ,물건}
                targetSceneNum = targetSceneNumList[i];    // {대상위치, 대상위치}
                break;
            }

            changeScene(targetSceneNum);

            // TODO currentTarget에게 배달
            break;

        case 3:      // 사냥 (사냥한 수)
            for (var i = 0; i < progressList.Count; i++)
            {
                if (progressList[i] == quest.questCondition[i])
                {
                    continue;
                }
                currentTarget  = targetList[i];
                targetSceneNum = targetSceneNumList[i];
                break;
            }

            changeScene(targetSceneNum);

            //TODO currentTarget 사냥
            break;

        case 4:      // 조달 (소지한 물품의 수)
            for (var i = 0; i < progressList.Count; i++)
            {
                if (progressList[i] == quest.questCondition[i])
                {
                    continue;
                }
                currentTarget  = targetList[i];
                targetSceneNum = targetSceneNumList[i];
                break;
            }

            changeScene(targetSceneNum);

            // TODO currentTarget 조달
            break;

        case 5:      // 정찰 (정찰완료 = 1, 정찰 미완료 = 0) // 오픈 월드 이전에는 일단 스테이지 클리어 기준으로
            for (var i = 0; i < progressList.Count; i++)
            {
                if (progressList[i] == quest.questCondition[i])
                {
                    continue;
                }
                targetVector   = quest.TargetVector[i];
                targetSceneNum = targetSceneNumList[i];
                break;
            }

            changeScene(targetSceneNum);

            // TODO targetVector 정찰
            break;

        case 6:      // 호위 (호위 목표가 목표지점에 도달하면 = 1) // 오픈 월드 이전에는 호위 스테이지 클리어를 기준으로
            for (var i = 0; i < progressList.Count; i++)
            {
                if (progressList[i] == quest.questCondition[i])
                {
                    continue;
                }
                targetVector   = quest.TargetVector[i];
                targetSceneNum = targetSceneNumList[i];
                break;
            }
            var escortTarget = targetList[0];

            changeScene(targetSceneNum);

            // TODO targetVector 향해 이동
            break;

        case 7:      // 파괴 (파괴한 목표의 수) // object.OnDeath()?
            for (var i = 0; i < progressList.Count; i++)
            {
                if (progressList[i] == quest.questCondition[i])
                {
                    continue;
                }
                currentTarget  = targetList[i];
                targetSceneNum = targetSceneNumList[i];
                break;
            }

            changeScene(targetSceneNum);

            // TODO currentTarget 파괴
            break;

        case 8:      // 특정 아이템 사용 (소모품 아이템 사용 횟수)
            for (var i = 0; i < progressList.Count; i++)
            {
                if (progressList[i] == quest.questCondition[i])
                {
                    continue;
                }
                currentTarget = targetList[i];
                break;
            }

            // TODO currentTarget 사용
            break;

        case 9:      // 특정 지역에 아이템 사용 (특정 지역에서 아이템을 사용한 횟수)
            for (var i = 0; i < progressList.Count; i++)
            {
                if (progressList[i] == quest.questCondition[i])
                {
                    continue;
                }
                targetVector   = quest.TargetVector[i];
                currentTarget  = targetList[i];
                targetSceneNum = targetSceneNumList[i];
                break;
            }

            changeScene(targetSceneNum);

            // TODO targetVector로 이동후 currentTarget 사용
            break;

        case 10:      // 특정 대상에게 아이템 사용 (특정 대상에게 아이템을 사용한 횟수)
            int itemNum;
            for (var i = 0; i < progressList.Count; i++)
            {
                if (progressList[i] == quest.questCondition[i])
                {
                    continue;
                }
                currentTarget  = targetList[2 * i];    // {대상, 아이템, 대상, 아이템}
                itemNum        = targetList[2 * i + 1];
                targetSceneNum = targetSceneNumList[i];
                break;
            }

            changeScene(targetSceneNum);

            // TODO currentTarget에게 이동후 itemNum 사용
            break;

        case 11:      // 특정한 장비를 착용하고 사냥 (특정 장비를 착용하고 목표물을 사냥한 횟수)
            for (var i = 0; i < progressList.Count; i++)
            {
                if (progressList[i] == quest.questCondition[i])
                {
                    continue;
                }
                currentTarget  = targetList[i + 1];    // {장비, 대상, 대상}
                targetSceneNum = targetSceneNumList[i];
                break;
            }

            changeScene(targetSceneNum);

            // TODO currentTarget을 착용하고 사냥
            break;

        case 12:      // 특정 대상에게 특정 스킬 사용 (특정 대상에게 스킬을 사용한 횟수)
            int skillNum;
            for (var i = 0; i < progressList.Count; i++)
            {
                if (progressList[i] == quest.questCondition[i])
                {
                    continue;
                }
                currentTarget  = targetList[2 * i];    // {대상, 스킬, 대상, 스킬}
                skillNum       = targetList[2 * i + 1];
                targetSceneNum = targetSceneNumList[i];
                break;
            }

            changeScene(targetSceneNum);

            // TODO currentTarget에게 이동후 skillNum 사용
            break;
        }
    }