Vuldrick Quest manager - Whut?

Okay I have been trying out the mod, comparing it to the simple -go kill goblin and give me his head- quest but I am having trouble understanding the system. So if anyone is willing to lend a hand here? I been spending like almost 2 days trying to figure it out and I am sure it is straight forward but it is just not landing for me T_T

The VG system uses a number of variables to make it work. It’s rather simple once you get the hang of it. Let’s take your “Kill the Goblin” Quest. First thing you should do is create the Quest/Journal entry in the Journal Editor. Give the Quest it’s own unique tag. You’ll see the place in the Journal editor where this will be found. You may also give it a name. For instance, “Troublesome Goblin” with the tag, DQ_Goblin, should do the trick. Next you may add entries. Entry 1 can be, “You met with Farmer Maggot and he said a goblin has been into his mushrooms. He’d pay a king’s ransom in pumpkins if you made this problem go away.” Entry 2 can be, “You rid Farmer Maggot of his goblin problem and he gave you several pumpkin pies for your trouble.”

Journal part done.

Next, go to your Quest Giver. This can be Farmer Maggot. In his properties go to “Variables”. Create a string variable called “Quest” (left hand column) with the string of your quest tag, “DC_Goblin”. Create a second string with the name of QuestItemList with the tag of “Goblin_Head”. You can then create your reward parameters. Create an integer variable called “XP” and then place whatever XP award you want. Let’s say 100. Then create one called GP and place 500 in that section (these are both integer variables).

Next create your goblin and give him a head (or any item you want with the tag “Goblin_Head” (don’t use quotes, I’m just using them to set it apart here). Then place or spawn your goblin however you like.

Finally, give Farmer Maggot a dialogue. His first dialogue tree should be normal. But when the PC gets to the part where he accepts Maggot’s quest, place the script “vg_quest_advance” in the OnActions taken. (This is when it writes to the PC journal using the quest tag attached to Maggot)

Now, give Maggot another dialogue tree within that same convo. I tend to place mine above the normal one. This convo can be anything along the lines of, “Did you get rid of the Goblin yet?” Place “vg_quest_1” in the Text Appear When for Maggot. That way this tree will only appear for those who are in phase 1 of the quest.

To answer his question, “Did you get rid of that goblin yet?” you can put whatever options you want. However, the first option should be the affirmative because the PC did kill the goblin and has the goblin’s head. In the Text Appear When, place the script “vg_has_item” (I believe this is it, or something like it). In the Actions Taken of the same line you may place “vg_take_advance” (this script both takes the quest item and advance the PC to the next phase of the quest). In a subsequent dialogue line of Maggot you may place the “vg_quest_reward” in the Actions Taken. This will give the PC the gold and/or xp listed in Maggot’s variable list.

And then as clean up, create one more dialogue tree for maggot. This should go above the vg_quest_1 tree. The may be something like, “Thanks, again, , for helping me with that goblin thing.” Place “vg_quest_2” in the Text Appears When for Maggot’s first line here. And that’s it.

There’s a lot you can do with this system (I ended up augmenting it on my module so it has a bit more functionality and robustness to account for parties, persistence, etc). Once you get the hang of it you can use the various skill checks and other aspects which are more robust than default vanilla. Below is a sample picture of a typical variable list for a Quest-giver. Also, anybody who you think is related to the quest, or who has info pertaining it, should also be given a string variable for that quest.

1 Like

Thanks! Yeah I got stuck at the part where it checks for the goblin head.
So i missed a variable, so thanks for that!!:heart:

Since it is means for a PW/multiplayer world there is the desire to make it persistent. So am curious if it actually makes it me persistent as the demo does not show any persistence and that is something i really wanted :joy:

Actually, I’m pretty sure it does. Search for the include called, “pqj_inc” in your script directory. Follow the instructions within that script. It does support persistency. Just uses your simple database. I’m not sure what the limits are (Vuldricks himself was not sure) but I have in the neighborhood of 50+ quests on my module with some spanning up to 10 entries, and I haven’t hit a wall, so to speak.

Use the version with persistent journals if you like. You may find the vg_take_item and vg_quest_adv as separate scripts - possible DM_Wise made a script that does both - very wise indeed?
I’m also not sure about the item tagging conventions - I think Vuldrick has it set to be questItem<#>, so for the sample above, “DC_GoblinItem1”?

yeah I got the one with the persistent journals. Just having trouble getting the NPC ID the quest item. Reworking the entire quest to see if I did something wrong here now. As I only get to the part where the player is given the quest but the NPC does not check for the item. I tried both versions, on the demo and on here and it does not seem to be working…

Appears when script would be <vg_has_item>. Action script is <vg_take_item>.
Variables on NPC (at least in the version I use):
Quest (quest tag) for example lets use “Goblin”
ItemNum (1) or whatever number you are tagging it with

Item TAG would be GoblinItem1 - note that Item has a capital “i”.

Yeah I done all of that, that is what is confusing to me. It is not working for me T_T

Okay there is one issue I noticed…

I notice there is a open error quest from importing the system called TUTORQUEST… anyone know how to get rid of it??

EDIT:
For some reason when I test it it does not show persistence so my character must do the quest over again. Anyone know how to set it actually persistent?

That is bothersome - no idea what TUTORQUEST refers to… Which package are you installing UQS from? And do you have other versions of the includes maybe in place?

https://neverwintervault.org/project/nwn1/script/six-vuldricks-systems

I downloaded it from here

I am also a bit confused on how it actually makes it persistent tbh as I can redo the quest with the same character each time I reboot the module.

EDIT: I managed to make the quests now persistent! All I need to fix is the errorcode…

That’s is because it isn’t the persistent version. Try the link I posted earlier, which is the UQS with Persistent Journals. I remember when Tarot posted the 6 systems and I saw the persistent one wasn’t there, which is why I uploaded it afterwards.

  • Just read that you fixed the persistence. Still wonder what the TUTOR error is about…

Yeah I managed to fix that also. After I wrote down the post and send it I noticed there was a line still in it that brought over the line.

So here is another question, this works with variables. But am working on a bounty-board that has a several quests per level. So since this works with variables I wondered if I could use this system also with the board?

You can. The scripts focuses on GetLocalInt(oPC,“NW_JOURNAL_ENTRY”+sQuest); where sQuest is the tag of the Journal entries. You could write a script for the board that has spots for each of the quests you want to use and pull them from the script instead of the variables on the board (or whichever NPC is owner of the conversation). I actually am doing something similar in my current project.
sPlot1 = GetLocalInt(oPC,“NW_JOURNAL_ENTRY”+sQuest1);
sPlot2 = GetLocalInt(oPC,“NW_JOURNAL_ENTRY”+sQuest2)
etc.;

not entirely sure how to get that to work…Some help on that department would eb hot (since I am a SUPER NOVICE when it comes to scripting T_T)

my only thought on that would be to have the journal entry setup during conversation and make it persistent when the player hits the next quest stage.

Fair enough.
So will there only be one bounty at a time or a list of them to choose from?

Basically atm I have it set at 3 bounties per level

So there will be a check on what lvl the player is and based upon that it will reveal 3 bounties that corresponds to that lvl.

And when they are at the next level, there will be just the three new bounties - the unfinished ones go away?

yes, that is basically the intend of this script though not sure if it actually does that. XD

You can use the structure of the vg scripts to process it, but you would need to save copies of them as new scripts and change the names of the variables they direct to, so you could have three variables.
“Bounty1”
“Bounty2”
“Bounty3”
I can’t promise that this will compile - I just through it together to get my head around it…

//so in the occurs when of the top node of the conversation
//you would put something like this script to setup of the bounty giver
int StartingConditional()
{
    int iResult;
    object oMe = OBJECT_SELF;
    object oPC = GetPCSpeaker();
string sB1 = "quest1";//level 1 quests
string sB2 = "quest2";
string sB3 = "quest3";
string sB4 = "quest4";//level 2 quests
string sB5 = "quest5";
string sB6 = "quest6";
string sText1, sText2, sText3;
int nLvl = GetHitDice(oPC);
string sName = GetPCPlayerName(oPC);
int nLastLvl = GetLocalInt(oMe, sName);
if(nLvl == 1)
    {
    SetLocalString(oMe, "Bounty1", sB1);
    sText1 = "Text you want for quest one";//GetLocalString(oMe, sB1+"text");
    SetLocalString(oMe, "Bounty2", sB2);
    sText2 = "Text you want for quest 2";//GetLocalString(oMe, sB2+"text");
    SetLocalString(oMe, "Bounty3", sB3);
    sText3 = "Text you want for quest 3";//GetLocalString(oMe, sB3+"text");
    }
if(nLvl == 2)
    {
    SetLocalString(oMe, "Bounty1", sB4);
        sText1 = "Text you want for quest 4";//GetLocalString(oMe, sB4+"text");
    SetLocalString(oMe, "Bounty2", sB5);
        sText2 = "Text you want for quest 5";//GetLocalString(oMe, sB5+"text");
    SetLocalString(oMe, "Bounty3", sB6);
        sText3 = "Text you want for quest 6";//GetLocalString(oMe, sB6+"text");
    }
    SetCustomToken(10001, sText1);
    SetCustomToken(10002, sText2);
    SetCustomToken(10003, sText3);
    iResult = GetLocalInt(GetPCSpeaker(), "talkbefore");
    if(iResult!=0)
    return iResult;
    return FALSE;
}

Then you could use new versions of the vg_advance and vg_quest_1 scripts for each of the three bounties.

//so for the vg_quest_1 version (maybe rename it vg_bounty_1?)
int StartingConditional()
{
object oPC = GetPCSpeaker();
string szPlotID = GetLocalString(OBJECT_SELF,"Bounty1");
int iQuestStatus = GetLocalInt(oPC,"NW_JOURNAL_ENTRY"+szPlotID);
if (iQuestStatus == 1)
    {
    return TRUE;
    }
else return FALSE;
}

and for the vg_quest_advance (also maybe rename vg_bounty_advance)

#include "pqj_inc"
void main()
{
object oMod = GetModule();
object oPC = GetPCSpeaker();
string szPlotID = GetLocalString(OBJECT_SELF,"Bounty1");
int nQuestStatus = GetLocalInt(oPC,"NW_JOURNAL_ENTRY"+szPlotID);

AddPersistentJournalQuestEntry(szPlotID,nQuestStatus+1,oPC,TRUE,FALSE,FALSE);
SetLocalInt(oMod,"NW_JOURNAL_ENTRY"+szPlotID,nQuestStatus+1);
}

And do these for the other two nodes (Bounty2, Bounty3)
And finally the text in the Bounty nodes should just be

"Bounty number 1 is <CUSTM10001>.  Return to me when completed."
"Bounty number 2 is <CUSTM10002>.  Return to me when completed."
"Bounty number 3 is <CUSTM10003>.  Return to me when completed."

I hope that makes some sense