Beispiel #1
0
        protected void Deactivate(BaseQuestObject obj)
        {
            QuestObjectState state = GetState(obj);

            if (state.Locked || state.Active == QuestObjectState.ActivationState.Inactive)
            {
                return;
            }
            state.Active = QuestObjectState.ActivationState.Inactive;
            GameDebugger.Log(LogLevel.Debug, "QS: {0} '0x{1:X16}' deactivated", obj.GetType().Name, obj.Id);

            if (m_ActivelyChecked.ContainsKey(obj.Id))
            {
                GameDebugger.Log(LogLevel.Debug, "QS: Removing {0} '0x{1:X16}' from the list of actively checked objects", obj.GetType().Name, obj.Id);
                m_ActivelyChecked.Remove(obj.Id);
            }

            if (obj is Quest)
            {
                GameDebugger.Log(LogLevel.Debug, "QS: event: OnQuestDeactivated");
                if (OnQuestDeactivated != null)
                {
                    OnQuestDeactivated.Invoke(new QuestDeactivatedEventArgs((Quest)obj));
                }
                if (state.Completion != QuestObjectState.CompletionState.Incomplete)
                {
                    state.Completion = QuestObjectState.CompletionState.Incomplete;
                    // NOTE: This most probably will never happen since quests are locked right after getting complete,
                    // but might need to invoke OnQuestIncomplete event in case this happens after all.
                }
            }
            else if (obj is QuestObjective)
            {
                GameDebugger.Log(LogLevel.Debug, "QS: event: OnQuestObjectiveDeactivated");
                if (OnQuestObjectiveDeactivated != null)
                {
                    OnQuestObjectiveDeactivated.Invoke(new QuestObjectiveDeactivatedEventArgs((QuestObjective)obj));
                }
                if (state.Completion != QuestObjectState.CompletionState.Incomplete)
                {
                    state.Completion = QuestObjectState.CompletionState.Incomplete;
                    GameDebugger.Log(LogLevel.Debug, "QS: event: OnQuestObjectiveIncomplete");
                    if (OnQuestObjectiveIncomplete != null)
                    {
                        OnQuestObjectiveIncomplete.Invoke(new QuestObjectiveIncompleteEventArgs((QuestObjective)obj));
                    }
                }
            }

            foreach (QuestPin pin in obj.Outputs)
            {
                Deactivate(pin);
            }
        }
Beispiel #2
0
        public void QuestObjectiveIncomplete(QuestObjective objective)
        {
            QuestObjectState state = GetState(objective);

            if (state.Locked || state.Completion == QuestObjectState.CompletionState.Incomplete)
            {
                return;
            }
            state.Completion = QuestObjectState.CompletionState.Incomplete;

            GameDebugger.Log(LogLevel.Debug, "QS: event: OnQuestObjectiveIncomplete");
            if (OnQuestObjectiveIncomplete != null)
            {
                OnQuestObjectiveIncomplete.Invoke(new QuestObjectiveIncompleteEventArgs(objective));
            }

            Deactivate((QuestPin)objective.Outputs[state.CompletionOutput]);
        }
Beispiel #3
0
        public void Tick()
        {
            QuestObjectState state;
            bool             result;

            var values = m_ActivelyChecked.Values;

            IQuestSystemObject[] objects = new IQuestSystemObject[values.Count];
            values.CopyTo(objects, 0);

            GameDebugger.Log(LogLevel.Debug, "QS: TICK");
            foreach (IQuestSystemObject obj in objects)
            {
                state = GetState(obj);
                if (state.Locked)
                {
                    GameDebugger.Log(LogLevel.Warning, "QS: {0} '0x{1:X16}' is in the list of actively checked objects while being locked", obj.GetType().Name, obj.Id);
                    m_ActivelyChecked.Remove(obj.Id);
                    continue;
                }
                GameDebugger.Log(LogLevel.Debug, "QS: Checking {0} '0x{1:X16}'", obj.GetType().Name, obj.Id);
                if (obj is QuestPin)
                {
                    QuestPin pin = (QuestPin)obj;
                    result = CheckCondition(pin, true);
                    if (result && state.Active == QuestObjectState.ActivationState.PartiallyActive)
                    {
                        state.Active = QuestObjectState.ActivationState.Active;
                        GameDebugger.Log(LogLevel.Debug, "QS: Switched {0} '0x{1:X16}' from partially activated to activated", obj.GetType().Name, obj.Id);
                        if (pin.Node is Quest)
                        {
                            Activate((BaseQuestObject)pin.Node);
                        }
                        else
                        {
                            CheckInputsOnActivation((BaseQuestObject)pin.Node);
                        }
                        foreach (QuestConnection connection in pin.Connections)
                        {
                            if (connection.Source == pin)
                            {
                                Activate(connection);
                            }
                        }
                    }
                    else if (!result && state.Active == QuestObjectState.ActivationState.Active)
                    {
                        state.Active = QuestObjectState.ActivationState.PartiallyActive;
                        GameDebugger.Log(LogLevel.Debug, "QS: Switched {0} '0x{1:X16}' from activated to partially activated", obj.GetType().Name, obj.Id);
                        Deactivate((BaseQuestObject)pin.Node);
                        foreach (QuestConnection connection in pin.Connections)
                        {
                            if (connection.Source == pin)
                            {
                                Deactivate(connection);
                            }
                        }
                    }
                }
                else if (obj is QuestCondition)
                {
                    // every tick depending on it's script execution result it switches active either output[0] or output[1] active
                    QuestCondition condition = (QuestCondition)obj;
                    result = CheckCondition(condition, true);
                    if (result)
                    {
                        if (state.CompletionOutput != 0 || state.Completion == QuestObjectState.CompletionState.Incomplete)
                        {
                            if (state.Completion != QuestObjectState.CompletionState.Incomplete)
                            {
                                Deactivate((QuestPin)condition.Outputs[1]);
                                GameDebugger.Log(LogLevel.Debug, "QS: Switching {0} '0x{1:X16}' output from FALSE to TRUE", obj.GetType().Name, obj.Id);
                            }
                            else
                            {
                                GameDebugger.Log(LogLevel.Debug, "QS: Setting {0} '0x{1:X16}' output to TRUE", obj.GetType().Name, obj.Id);
                            }
                            Activate((QuestPin)condition.Outputs[0]);
                            state.CompletionOutput = 0;
                        }
                    }
                    else
                    {
                        if (state.CompletionOutput != 1 || state.Completion == QuestObjectState.CompletionState.Incomplete)
                        {
                            if (state.Completion != QuestObjectState.CompletionState.Incomplete)
                            {
                                Deactivate((QuestPin)condition.Outputs[0]);
                                GameDebugger.Log(LogLevel.Debug, "QS: Switching {0} '0x{1:X16}' output from TRUE to FALSE", obj.GetType().Name, obj.Id);
                            }
                            else
                            {
                                GameDebugger.Log(LogLevel.Debug, "QS: Setting {0} '0x{1:X16}' output to FALSE", obj.GetType().Name, obj.Id);
                            }
                            Activate((QuestPin)condition.Outputs[1]);
                            state.CompletionOutput = 1;
                        }
                    }
                    state.Completion = QuestObjectState.CompletionState.Successful;
                }
                else if (obj is QuestObjective)
                {
                    // every tick rechecks all conditions on output pins
                    QuestObjective objective = (QuestObjective)obj;
                    int            pinIndex  = 0;
                    foreach (QuestPin pin in objective.Outputs)
                    {
                        if (pin.Script == null)
                        {
                            pinIndex++;
                            continue;
                        }
                        result = CheckCondition(pin, false);
                        if (result)
                        {
                            Activate(pin);                     // this will also deactivate previously active pin
                            break;                             // Just in case when there is more than one output that passes the check. We don't want lots of unneeded events, right?
                        }
                        if (pinIndex == state.CompletionOutput && state.Completion != QuestObjectState.CompletionState.Incomplete)
                        {
                            state.Completion = QuestObjectState.CompletionState.Incomplete;
                            GameDebugger.Log(LogLevel.Debug, "QS: event: OnQuestObjectiveIncomplete");
                            if (OnQuestObjectiveIncomplete != null)
                            {
                                OnQuestObjectiveIncomplete.Invoke(new QuestObjectiveIncompleteEventArgs(objective));
                            }
                        }
                        Deactivate(pin);
                        pinIndex++;
                    }
                }
                else
                {
                    GameDebugger.Log(LogLevel.Warning, "QS: {0} '0x{1:X16}' is not supposed to be in the list of actively checked objects", obj.GetType().Name, obj.Id);
                }
            }
        }