FANDOM


include_questing

What it does

This include file makes designing quests easier.


Notes

When you want to remember a certain point in the quest, you have to set a variable to a certain value so that you can check it later (by using SetlocalInt, GetLocalInt, ...). If you want to set the journal to an entry that corresponds to the state of the quest, you have to do it manually (AddJournalQuestEntry(...)). Giving out questxp has to be done by getting the xp associated by the quest and then giving it out. I've made a number of functions that can be used to set the state of a quest along with the journal entry. When you complete a quest, you can choose the journal entry to be used and the xp associated with the quest will be handed out. I've also made a number of functions to check the state of a quest (assigned, unassigned, completed or a specific state). Before you can use these functions, you must use a certain naming convention for quests and journal categories. A quest is identified with his quest_id (a string like "undead") while the corresponding journal category must have the name JOURNAL_ + quest_id. This is nothing fancy, but it'll make the life of a designer a bit easier.

I've added a lot of comment in the beginning of the file to explain this in more detail.

To use this file, put the following line at the top of your script: #include "include_questing" (if you save this include file as include_questing).


Important

this include file uses the nw_i0_tool include file. When you use my include file and want to use nw_i0_tool as well, you don't need to add the line #include "nw_i0_tool" to use the functions from that file. If you do put that line in your script, the compiler will give a warning.

Send comment, questions and suggestions to wim_haeck@hotmail.com or send me a message on the bioware forums (username: thadeus).

I have a module which uses this system. If you want to take a look at it, send me a message.


The file itself

//::///////////////////////////////////////////////
//:: thadeus' Questing And Journal Setting Functions
//:: INCLUDE_QUESTING
//:://////////////////////////////////////////////
/*
    This include file contains all functions to set the state of a quest and the
    appropriate journal entry.
*/
//:://////////////////////////////////////////////
//:: Created By: Wim "thadeus" Haeck
//:: Created On: July 25, 2002
//:: Send comment or suggestions to wim_haeck@hotmail.com or send me a message
//:: on the bioware forums (username: thadeus).
//:://////////////////////////////////////////////
//:://////////////////////////////////////////////
// GENERAL COMMENT - READ THIS BEFORE USING
//:://////////////////////////////////////////////
/*
    As a general convention the quest state equals the number of the entry of
    the journal. This way, setting the next state in the quest can be used to
    automaticaly set the journal to the right level.
    The following quest states are defined:
        0 = an unassigned quest
        1,...,999 = a quest that has been assigned and has advanced to a higher
                    state, I suppose no quest will have more than 999 journal
                    entries.
        1000 = a completed quest
    The quest state is always the number of the journal entry, the only
    exception is the journal entry of the finished quest (which can be any
    number you wish).
    Examples of quest states:
    1. a linear quest, eg: main quest NWN chapter 1
            0 = not assigned
            1 = just assigned "find 4 creatures"
            2 = found 1 creature
            3 = found 2 creatures
            4 = found 3 creatures
            5 = found 4 creatures - this is the final entry
    2. quest with multiple ways of completing a state, eg: get in prison
       (peninsula district)
            0 = not assigned
            1 = just assigned "get in prison"
            2 = get key  (set if you speak to the right person)
            3 = got key (won't happen if state 2 isn't set)
            4 = got in prison with key
            5 = got in prison through tunnel, have key but did not use it
            6 = got in prison through tunnel, didn't even know about a key
            7 = killed intellect devourer
    Every quest must have a unique identifier called the QUEST_ID, this is a
    string which will be used to generate the names of various variables in
    which information will be stored. The tag of every quest in the journal
    should always be of the form "JOURNAL_" + QUEST_ID.
    When you pay attention to this, all of the underlying functions should
    function normally.
    There is no checking whatsoever if the object oPlayer is a PC, the user must
    make sure that this object is a PC. This is important since this object will
    be used to set the journal entry.
*/
#include "nw_i0_tool"
// IMPORTANT: this include file uses the nw_i0_tool include file. When you
// use my include file and want to use nw_i0_tool as well, you don't need 
// to add the line #include "nw_i0_tool" to use the functions from that
// file. If you do put that line in your script, the compiler will give
// a warning.
//:://////////////////////////////////////////////
// DEFINING A FEW IMPORTANT CONSTANTS
//:://////////////////////////////////////////////
int QUEST_UNASSIGNED = 0;
    // an unassigned quest
int QUEST_COMPLETED = 1000;
    // a completed quest
//:://////////////////////////////////////////////
// FUNCTIONS
//:://////////////////////////////////////////////
int GetQuestState(string QUEST_ID);
    // Returns the current quest state
int GetQuestAssigned(string QUEST_ID);
    // Returns TRUE if the quest has been assigned and not completed
    // Returns FALSE if the quest has been completed or not assigned at all
int GetQuestUnassigned(string QUEST_ID);
    // Returns TRUE if the quest has not been assigned
    // Returns FALSE if the quest has been assigned or completed
int GetQuestCompleted(string QUEST_ID);
    // Returns TRUE if the quest has been completed
void GiveQuestXP(object oPlayer, string QUEST_ID);
    // Gives the players the XP associated with the quest
void SetQuestState(object oPlayer, int QUEST_STATE, string QUEST_ID);
    // Sets the quest to the required state
void SetQuestNextState(object oPlayer, string QUEST_ID);
    // Sets the quest to the next state (the state is incremented by one)
void SetQuestCompleted(object oPlayer, int JOURNAL_NUMBER, string QUEST_ID);
    // Sets the quest to completed and the journal to the final entry with
    // number JOURNAL_ID
// See the comment within each function for more details
//:://////////////////////////////////////////////
// FUNCTION IMPLEMENTATION
//:://////////////////////////////////////////////
int GetQuestState(string QUEST_ID)
/*
    QUEST_ID = the ID of the quest
    Returns the current quest state of the quest given by QUEST_ID.
    This function can be used to check the quest state so that certain events
    are fired (eg. an ambush like the assassins in chapter 1) or to allow a
    certain dialogue line in a conversation file.
*/
{
    string QUEST_STRING = "QUEST_" + QUEST_ID;
        // the name of the variable in which the quest state will be stored
    return (GetLocalInt(GetModule(),QUEST_STRING));
        // return the value stored in the variable with name QUEST_STRING
}
int GetQuestAssigned(string QUEST_ID)
/*
    QUEST_ID = the ID of the quest
    Returns TRUE if the quest has been assigned and not completed.
    Returns FALSE if the quest has been completed or not assigned at all.
*/
{
    int CURRENT_STATE = GetQuestState(QUEST_ID);
        // Retrieve the current state of the quest
    if ((CURRENT_STATE == QUEST_UNASSIGNED) || (CURRENT_STATE == QUEST_COMPLETED))
        // if the quest is unassigned or completed, return FALSE
    {
        return FALSE;
    }
    return TRUE;
}
int GetQuestUnassigned(string QUEST_ID)
/*
    QUEST_ID = the ID of the quest
    Returns TRUE if the quest is not assigned
    Returns FALSE if the quest has been assigned or completed
*/
{
    int CURRENT_STATE = GetQuestState(QUEST_ID);
        // Retrieve the current state of the quest
    if (CURRENT_STATE != QUEST_UNASSIGNED)
        // if the quest is not unassigned (this is assigned or completed),
        //return FALSE
    {
        return FALSE;
    }
    return TRUE;
}
int GetQuestCompleted(string QUEST_ID)
/*
    QUEST_ID = the ID of the quest
    Returns TRUE if the quest has been completed
    Returns FALSE if the quest has not been completed
*/
{
    int CURRENT_STATE = GetQuestState(QUEST_ID);
        // Retrieve the current state of the quest
    if (CURRENT_STATE != QUEST_COMPLETED)
        // if the quest is not completed, return FALSE
    {
        return FALSE;
    }
    return TRUE;
}
void GiveQuestXP(object oPlayer, string QUEST_ID)
/*
    oPlayer = this must be a PC
    QUEST_ID = the ID of the quest
    Gives the players the XP associated with the quest.
*/
{
    string JOURNAL_STRING = "JOURNAL_" + QUEST_ID;
        // Name of the journal category in which the journal entries of the
        // quest are stored
    int QUEST_XP = GetJournalQuestExperience(JOURNAL_STRING);
        // Get the XP
    RewardPartyXP(QUEST_XP,oPlayer,TRUE);
        // Give the XP
}
void SetQuestState(object oPlayer, int QUEST_STATE, string QUEST_ID)
/*
    oPlayer = this must be a PC
    QUEST_STATE = the quest state you want to set
    QUEST_ID = the ID of the quest
    This function sets the quest state of the quest given by QUEST_ID to the
    state given by QUEST_STATE. The journal is set then to the QUEST_STATE.
    If the current state is the one to be set, if the state to be set is lower
    than the current state or if the quest has been completed, nothing will
    happen.
    BEWARE: NO BACKSETTING IS POSSIBLE, design quests so that no quest must be
    set to a lower state.
    This function can be used to set the state to a particular value when
    multiple ways of reaching a goal are possible.
*/
{
    string QUEST_STRING = "QUEST_" + QUEST_ID;
        // the name of the variable in which the quest state will be stored
    string JOURNAL_STRING = "JOURNAL_" + QUEST_ID;
        // Name of the journal category in which the journal entries of the
        // quest are stored
    int CURRENT_QUEST_STATE = GetQuestState(QUEST_ID);
        // retrieve the current quest state
    if (!(GetQuestCompleted(QUEST_ID)) && !(CURRENT_QUEST_STATE >= QUEST_STATE))
        // the quest may not be completed and the current quest state may not be
        // greater or equal the one to be set
    {
        SetLocalInt(GetModule(),QUEST_STRING,QUEST_STATE);
            // Setting the new state
        AddJournalQuestEntry(JOURNAL_STRING,QUEST_STATE,oPlayer);
            // Adjusting the journal accordingly
    }
}
void SetQuestNextState(object oPlayer, string QUEST_ID)
/*
    oPlayer = this must be a PC
    QUEST_ID = the ID of the quest
    This function sets the quest state of the quest given by QUEST_ID to the
    next state. The journal is set to the next entry. When the quest has been
    completed, nothing happens.
    This is a function that can be used for a entirely linear quest, still: care
    must be taken when using this function since it is possible for a certain
    (repeating) event to increase the state multiple times! I recommend using
    the SetQuestState function.
*/
{
    string QUEST_STRING = "QUEST_" + QUEST_ID;
        // the name of the variable in which the quest state will be stored
    string JOURNAL_STRING = "JOURNAL_" + QUEST_ID;
        // Name of the journal category in which the journal entries of the
        // quest are stored
    if (!(GetQuestCompleted(QUEST_ID)))
    // the quest may not be completed
    {
        int QUEST_STATE = GetLocalInt(GetModule(),QUEST_STRING);
            // Retrieving current quest state
        QUEST_STATE++;
            // Increment the quest state
        SetLocalInt(GetModule(),QUEST_STRING,QUEST_STATE);
            // Setting the new state
        AddJournalQuestEntry(JOURNAL_STRING,QUEST_STATE,oPlayer);
            // Adjusting the journal accordingly
    }
}
void SetQuestCompleted(object oPlayer, int JOURNAL_NUMBER, string QUEST_ID)
/*
    oPlayer = this must be a PC
    JOURNAL_ID = the entry the journal must be set to when the quest is
                 completed
    QUEST_ID = the ID of the quest
    This function sets the quest state of the quest given by QUEST_ID to
    completed. The journal is set to the entry with number JOURNAL_NUMBER. The
    players will receive the XP reward of the quest. When the quest has already
    been completed, nothing happens. Make sure the entry is a finishing entry so
    that it will be put in the completed quests.
    This function can be used to set multiple endings of a quest.
*/
{
    string QUEST_STRING = "QUEST_" + QUEST_ID;
        // the name of the variable in which the quest state will be stored
    string JOURNAL_STRING = "JOURNAL_" + QUEST_ID;
        // Name of the journal category in which the journal entries of the
        // quest are stored
    if (!(GetQuestCompleted(QUEST_ID)))
        // if the quest is not completed
    {
        SetLocalInt(GetModule(),QUEST_STRING,QUEST_COMPLETED);
            // Setting the quest to completed
        AddJournalQuestEntry(JOURNAL_STRING,JOURNAL_NUMBER,oPlayer);
            // Adjusting the journal accordingly
        GiveQuestXP(oPlayer,QUEST_ID);
            // Give players XP of the quest
    }
}

Ad blocker interference detected!


Wikia is a free-to-use site that makes money from advertising. We have a modified experience for viewers using ad blockers

Wikia is not accessible if you’ve made further modifications. Remove the custom ad blocker rule(s) and the page will load as expected.