예제 #1
0
    private void HandleQuestStatus()
    {
        switch (_currQuestActivity)
        {
        case QuestActivity.cannotDo:
            if (_currentQ)
            {
                _currentQ.AbandonQuestButtonClicked();
            }
            FindNewQuest();
            break;

        case QuestActivity.doingActivity:
            if (!_attachedNavMeshAgent.isStopped)
            {
                _attachedNavMeshAgent.isStopped = true;
            }

            if (!Target)
            {
                _currQuestActivity = QuestActivity.needNewTarget;
                _attachedNavMeshAgent.isStopped = false;
            }
            else
            {
                DoActivity();
            }
            break;

        case QuestActivity.needNewTarget:
            GetNewQuestTarget();
            break;

        case QuestActivity.onMyWay:
            TryStartActivity();
            break;

        case QuestActivity.gettingNewQuest:
            // if in range of the target
            if ((transform.position - _currQuestSource.transform.position).sqrMagnitude < 5.0f)
            {
                // get a quest

                GameObject qObj = _currQuestSource.GetRandomQuest();
                if (qObj)
                {
                    // and go do it
                    QuestParchment qParch = qObj.GetComponent <QuestParchment>();
                    if (qParch)
                    {
                        qParch.AcceptQuestNPC(GetComponent <QuestHolderNPC>());
                        FindNewQuest();
                    }
                }
            }

            break;
        }
    }
예제 #2
0
    private void QuestComplete()
    {
        if (_currentQ)
        {
            _currentQ.CompleteQuestButtonClicked();
            _currentQ.gameObject.transform.SetParent(null);
            _currentQ = null;
        }

        _currQuestActivity = QuestActivity.cannotDo;
    }
예제 #3
0
    private void DoActivity()
    {
        _currActivityInterval += Time.deltaTime;
        if (_currActivityInterval >= MaxActivityInterval)
        {
            _currActivityInterval -= MaxActivityInterval;

            Harvestable obj = Target.GetComponent <Harvestable>();
            if (obj)
            {
                obj.HandleNPCInteract(this);
            }
            if (!Target)
            {
                _currQuestActivity = QuestActivity.needNewTarget;
            }
        }
    }
예제 #4
0
 private void TryStartActivity()
 {
     if (Target)
     {
         if (Target.GetComponent <Harvestable>().IsNPCInRange(transform))
         {
             _currQuestActivity = QuestActivity.doingActivity;
         }
         else
         {
             SetTarget(Target.transform);
         }
     }
     else
     {
         GetNewQuestTarget();
     }
 }
예제 #5
0
    private void FindNewQuest()
    {
        QuestHolderNPC myQuests = GetComponent <QuestHolderNPC>();

        if (myQuests)
        {
            if (myQuests.QuestsHolder.transform.childCount != 0) // there are quests
            {
                for (int i = 0; i < myQuests.QuestsHolder.transform.childCount; ++i)
                {
                    Transform thisQuest = myQuests.QuestsHolder.transform.GetChild(i);
                    if (thisQuest.GetComponent <NPCQuestWrapper>().QuestObject)
                    {
                        if (thisQuest.GetComponent <NPCQuestWrapper>().QuestObject.GetComponent <Quest>().QuestType != Quest.Type.GatherGold)
                        {
                            StartQuest(myQuests.QuestsHolder.transform.GetChild(i).GetComponent <NPCQuestWrapper>().QuestObject.GetComponent <Quest>());
                            return;
                        }
                    }
                }
            }

            // there were no (valid) quests

            if (!_fullyAutonomousQuesting)
            {
                SetStatus(Status.ReturningHome);
                _currQuestActivity = QuestActivity.needNewTarget;
                _currentQ          = null;
                _attachedNavMeshAgent.isStopped = false;
            }
            else
            {
                _villToGetQuestsFrom = Village.GetClosestVillageTo(transform.position);
                _currQuestSource     = _villToGetQuestsFrom.QuestBoard.GetComponent <QuestSource>();
                SetTarget(_currQuestSource.transform);
                _currQuestActivity = QuestActivity.gettingNewQuest;
            }
        }
    }
예제 #6
0
    private void GetNewQuestTarget()
    {
        GameObject newTarget;

        Inventory.ResourceType targetType = Inventory.ResourceType.Wood;

        // get target type for quest
        if (_currentQ)
        {
            switch (_currentQ.QuestType)
            {
            case Quest.Type.GatherWood:
                targetType = Inventory.ResourceType.Wood;
                break;

            case Quest.Type.GatherStone:
                targetType = Inventory.ResourceType.Stone;
                break;

            case Quest.Type.GatherFood:
                targetType = Inventory.ResourceType.Food;
                break;
            }
        }

        newTarget = InteractableManager.Instance.FindClosestHarvestableOfType(targetType, transform);
        if (newTarget)
        {
            Target = newTarget;
            SetTarget(newTarget.transform);
            _currQuestActivity = QuestActivity.onMyWay;
        }
        else
        {
            _currQuestActivity = QuestActivity.cannotDo;
        }
    }