Difference between revisions of "A beginner's guide, lesson 6 - Quest Dialogue"

no edit summary
imported>Pyrocow2
(→‎Using the GREETING topic: Editing English, script logic)
Tag: Manual revert
 
(14 intermediate revisions by 2 users not shown)
Line 1: Line 1:
{{Featured}}
{{Featured}}
{{ABGContents}}


'''TES IV: Oblivion Modding for Beginners
==Preamble==
 
'''B. Scripts, Quests and NPCs<br />
:'''Lesson Six: Quest Focus; Dialogue
 
'''Preamble


This is the Sixth in a proposed series of Tutorial Lessons aimed at teaching how to mod TES IV: Oblivion aimed at beginners. It will build up into a complete modding course. Don't worry, there are no exams (though, there is some homework). This version was written for use on the forum. The RTF version contains additional material that was left out due to formatting limitations.
This is the Sixth in a proposed series of Tutorial Lessons aimed at teaching how to mod TES IV: Oblivion aimed at beginners. It will build up into a complete modding course. Don't worry, there are no exams (though, there is some homework). This version was written for use on the forum. The RTF version contains additional material that was left out due to formatting limitations.


'''Files
===Files===


I have uploaded some files in a .zip which will be used to accompany the next few tutorials.  
I have uploaded some files in a .zip which will be used to accompany the next few tutorials.  
Line 27: Line 23:




'''Using this Tutorial
===Using this Tutorial===


I suggest that you modify the CS configuration file to allow you to open multiple copies at the same time. (See [[A_beginner's_guide,_lesson_3_-_The_external_world#Introduction|Introduction to Lesson 3]])
I suggest that you modify the CS configuration file to allow you to open multiple copies at the same time. (See [[A_beginner's_guide,_lesson_3_-_The_external_world#Introduction|Introduction to Lesson 3]])
Line 577: Line 573:
It expects to find for each dialogue response files, which we have not created. One is an MP3 which contains the sound files, and the others are lip synch files used to animate the actor's face as we carry out the dialogue. The text is supposed to appear on screen for the duration of these files.  
It expects to find for each dialogue response files, which we have not created. One is an MP3 which contains the sound files, and the others are lip synch files used to animate the actor's face as we carry out the dialogue. The text is supposed to appear on screen for the duration of these files.  
Since we don't have them yet, the text runs very quickly. In later tutorials we will look at polishing this mod to include these files. For now, these are cosmetic problems. It's irritating not to see the text for any length of time, but it can't be helped until we add those MP3's.  
Since we don't have them yet, the text runs very quickly. In later tutorials we will look at polishing this mod to include these files. For now, these are cosmetic problems. It's irritating not to see the text for any length of time, but it can't be helped until we add those MP3's.  
It doesn't stop the quest running. You can repeatedly play the on-screen text by selecting the topic message for you until you get the message
It doesn't stop the quest running. You can repeatedly play the on-screen text by selecting the topic message for you until you get the message. (Alternatively, you could install a mod like [http://www.tesnexus.com/downloads/file.php?id=16622 Universal Silent Voice].)


The second problem deals with the script as it currently stands and may not be so obvious to a non-scripter. A quest script runs every 5 seconds. That means that every 5 seconds this script tries to add the topic BGMMessage4u to the players topic list. I don't honestly know what the effect of repeatedly adding a topic to the player's list is, but I suspect that extra requests to add the topic are simply ignored.  
The second problem deals with the script as it currently stands and may not be so obvious to a non-scripter. A quest script runs every 5 seconds. That means that every 5 seconds this script tries to add the topic BGMMessage4u to the players topic list. I don't honestly know what the effect of repeatedly adding a topic to the player's list is, but I suspect that extra requests to add the topic are simply ignored.  
Line 897: Line 893:


{| class="wikitable" border="1" cellpadding="5"
{| class="wikitable" border="1" cellpadding="5"
!colspan=2| '''BGVilanusVilla'''
!colspan=2| '''BGMVilanusVilla'''
|-
|-
!  TOPIC TEXT
!  TOPIC TEXT
Line 924: Line 920:


{| class="wikitable" border="1" cellpadding="5"
{| class="wikitable" border="1" cellpadding="5"
!colspan=2| '''BGVilanusVilla'''
!colspan=2| '''BGMVilanusVilla'''
|-
|-
!  TOPIC TEXT
!  TOPIC TEXT
Line 1,009: Line 1,005:


These might take the form
These might take the form
 
<pre>
Response 1: Long Explanation
Response 1: Long Explanation
Response 2: Short Explanation
Response 2: Short Explanation
Line 1,018: Line 1,014:
Response 1: ‘Ah you've found the widget my friend'
Response 1: ‘Ah you've found the widget my friend'
Response 2: ‘You must find the widget my friend'
Response 2: ‘You must find the widget my friend'
</pre>
Let's try this
Add a new variable called MetVilla to the top of the Quest Script (under the quest data tab). We should declare any variables used by the quest in the Quest-type script.
<pre>
SCN BGM001QuestScript
Short DoOnce1
Short MetVilla
Begin GameMode


Let's try this
If (DoOnce1 == 0)
AddTopic BGMMessage4U
Set DoOnce1 to 1
EndIf


Add a new variable called MetVilla to the top of the Quest Script (under the quest data tab). We need to declare any variables used in results scripts in the quest script . Think of the results scripts as children of the parent quest script. We declare the child-variables in the parent script.
End
</pre>


This is automatically set at zero. We can use the response result box to bump this up to one after speech with this bit of script.
This variable will be automatically set to zero. We can use the response result box to bump this up to one after the speech with a bit of script. Add this in after "AddTopic BGWill".


   Set BGM001.MetVilla to 1
   Set BGM001.MetVilla to 1


Don't forget to click the compile button.
Don't forget to click the compile button!


Summarising the first response
Summarising the first response:
{| class="wikitable" border="1" cellpadding="5"
{| class="wikitable" border="1" cellpadding="5"
!colspan=2| '''GREETING'''
|-
|-
!  TOPIC
!  TOPIC TEXT
|  GREETING
|  GREETING
|-
|-
!  RESPONSE
!  RESPONSE
|   
|   
* Hello, my name is Vilanus Villa and I've been looking for you. I'm afraid I have some bad news.
* "Hello, my name is Vilanus Villa and I've been looking for you. I'm afraid I have some bad news."
* Your uncle has passed away peacefully in his sleep.
* "Your uncle has passed away peacefully in his sleep."
* I have been asked to look after his last will and testament.
* "I have been asked to look after his last will and testament."
|-
|-
!  CONDITIONS
!  CONDITIONS
| GetStage BGM001==10<br>
|
GetIsID BGVilanusVilla==1<br>
*GetStage 'BGM001' <= 10
'''GetQuestVariable BGM001.MetVilla == 0'''<br>
*GetIsID 'BGVilanusVilla' == 1
*'''GetQuestVariable 'BGM001.MetVilla' == 0'''
|-
|-
!  ADD TOPICS
!  ADD TOPICS
| BGWill
| ''No add topic''
|-
|-
!  RESULT SCRIPT
!  RESULT SCRIPT
|  Set BGM001.MetVilla to 1
|
AddTopic BGWill
  Set BGM001.MetVilla to 1
|}  
|}  
We can then add this alternative response info to the GREETING topic
 
 
We can then add this alternative response info to the GREETING topic:
 
{| class="wikitable" border="1" cellpadding="5"
{| class="wikitable" border="1" cellpadding="5"
!colspan=2| '''GREETING'''
|-
|-
!  TOPIC
!  TOPIC TEXT
|  GREETING
|  GREETING
|-
|-
!  RESPONSE
!  RESPONSE
|  Whenever you want to talk about your uncle's will, let me know
"Whenever you want to talk about your uncle's will, let me know."
|-
|-
!  CONDITIONS
!  CONDITIONS
| GetStage BGM001==10<br>
|
GetIsID BGVilanusVilla==1<br>
*GetStage 'BGM001' <= 10
'''GetQuestVariable BGM001.MetVilla == 1'''<br>
*GetIsID 'BGVilanusVilla' == 1
*'''GetQuestVariable 'BGM001.MetVilla' == 1'''
|-
|-
!  ADD TOPICS
!  ADD TOPICS
|  ''No script''
|  ''No add topic''
|-
|-
!  RESULT SCRIPT
!  RESULT SCRIPT
|  ''No add topic''
|  ''No script''
|}  
|}  
The first time we greet him he gives the longer speech, the second time a shorter one.
The first time we greet him he gives the longer speech, the second time a shorter one.


We can now add another multi-line response info to the BGWill topic added by the first response.  
We can now add response info to the ''BGWill'' topic.


Try this one yourself using this summary to guide you.  
Try this one yourself using this summary to guide you.  
Don't forget the quest bump script.  
Don't forget the quest bump script.  
You will need to add a new topic called BGHubart.
You will need to add a new topic called ''BGHubart''.
{| class="wikitable" border="1" cellpadding="5"
{| class="wikitable" border="1" cellpadding="5"
!colspan=2| '''BGWill'''
|-
|-
!  TOPIC
!  TOPIC TEXT
BGWill
"My uncle's will"
|-
|-
!  RESPONSE
!  RESPONSE
|   
|   
* Apparently your uncle has some property here in Cyradiil. I am not sure where though.
* "Apparently your uncle had some property here in Cyrodiil. I'm not sure where, though."
* I was expecting a courier to deliver the details but he has not shown up.
* "I was expecting a courier to deliver the details, but she hasn't shown up."
* Captain Hubart of the Chorrol Guard has written to explain the courier did not make it to his Chorrol rendezvous.
* "Captain Hubart of the Chorrol Guard notified me that the courier never made it to her stop in Chorrol."
* You will have to go to Chorrol to check with him what is going on. Here is a copy of his letter.
* "You will have to visit him in Chorrol to find out more about what's going on. Here's the letter he sent me."
|-
|-
!  CONDITIONS
!  CONDITIONS
| GetStage BGM001==10<br>
|
GetIsID BGVilanusVilla==1
*GetStage 'BGM001' <= 10
*GetIsID 'BGVilanusVilla' == 1
|-
|-
!  ADD TOPICS
!  ADD TOPICS
| BGHubart
|
*BGHubart
*BGMVilanusVilla (In case the player talked to Vilanus before using the "Message for you" topic)
|-
|-
!  RESULT SCRIPT
!  RESULT SCRIPT
|  SetStage BGM001 20
|
  SetStage BGM001 20
|}  
|}  
Again we have a stage bump, this time to Stage 20
Add to the Quest Stage a journal update


:''I have been told that I may have inherited some property, but the courier carrying the details has gone missing. I will need to go to Chorrol and speak to a Captain Hubart of the Chorrol guard to get more details
Again we have a stage bump, this time to stage 20.
In the Quest Stages tab, add a journal entry for stage 20.
 
''I've been told that I may have inherited some property from my late uncle, but the courier carrying the details has gone missing. I will need to go to Chorrol and speak to a Captain Hubart of the Chorrol Guard to get more information.''


We will also add a Quest Stage Result Script.
We will also add a Quest Stage Result Script.
Line 1,110: Line 1,138:
But first we need to create a prop letter, so we can refer to it in the script.
But first we need to create a prop letter, so we can refer to it in the script.


Again we can create a ‘new' item, but it means trying to add artwork to the game, and unless we want the letter or scroll to look completely unique, and have some talent in that direction, it is a chore we don't need to do.
Again we can create a new item from scratch, but it means trying to add artwork to the game. Unless we want the letter or scroll to look completely unique, and have some talent in that direction, it is a chore we don't need to do.


Instead select any letter from the object/items/books list in the object window, change its ID to something meaningful like ‘BGHubartLetter'  
Instead, select any letter from the Items->Book list in the object window, change its ID to something meaningful like ''BGHubartLetter''.


The text on the right hand side indicates the content of the letter. We can edit this. I will look at the precise details and syntax needed to produce text in  another lesson.  
The text on the right hand side indicates the content of the letter. We can edit this. I will look at the precise details and syntax needed to produce text in  another lesson. It uses standard HTML tags.  
It uses standard HTML instructions.  
For now, the key command is <nowiki><br></nowiki>, which produces a 'line break' or 'new line'. The font face can be left alone.
For now the key command is <nowiki><br></nowiki> which produces a line break, or new line. Leave the font face alone.


'''BGHubartLetter'''
'''BGHubartLetter'''
Line 1,124: Line 1,151:
<br>
<br>
<br>
<br>
I regret to inform you that the White Horse courier Janus Jakobs, who you asked me to meet, has not arrived for her expected rendezvous. I know you where expecting some important documents to arrive.<br>
I regret to inform you that the White Horse courier Janus Jakobs, who you asked me to meet, has not arrived for her expected rendezvous. I know you were expecting some important documents to arrive.<br>
<br>
<br>
I don't have enough man power to launch a search. Perhaps you can find someone willing to assist in finding Jakobs.
I don't have enough man power to launch a search; perhaps you could find someone willing to assist me in finding Jakobs?
<br>
<br>
<br>
<br>
I look forward to hearing from you old friend.
I look forward to hearing from you, old friend.
<br>
<br>
<br>
<br>
Line 1,136: Line 1,163:
Captain Hubart
Captain Hubart
</nowiki></pre>
</nowiki></pre>
Save the letter as a new form.
Save the letter, AND MAKE SURE YOU CLICK 'YES' TO CREATE A NEW FORM.
Of course you are free to use your own text instead.
 
Now, type this in the results script box for stage 20:


Now type this in the results script box for Stage 20 and compile it using the button below.
  Player.AddItem "BGHubartLetter" 1


  Player.additem "BGHubartLetter" 1
Then click the "Compile Result" button.


We can also add a new response info to the topic called BGHubart, to direct the player to Chorrol
We can also add a new response info to the topic called ''BGHubart'', to direct the player to Chorrol:
{| class="wikitable" border="1" cellpadding="5"
{| class="wikitable" border="1" cellpadding="5"
!colspan=2| '''BGHubart'''
|-
|-
!  TOPIC
!  TOPIC TEXT
BGHubart (Captain Hubart)
|  Captain Hubart
|-
|-
!  RESPONSE
!  RESPONSE
|  You’ll find him in Chorrol
"You’ll find him in Chorrol."
|-
|-
!  CONDITIONS
!  CONDITIONS
| GetStage BGM001==20<br>
|
GetIsID BGVilanusVilla==1
*GetStage 'BGM001' == 20
*GetIsID 'BGVilanusVilla' == 1
|-
|-
!  ADD TOPICS
!  ADD TOPICS
Line 1,165: Line 1,195:
Try this for yourself. You can always refer to the PLAYTEST version if you get stuck.  
Try this for yourself. You can always refer to the PLAYTEST version if you get stuck.  


We have completed phase one, now we move to Chorrol.
We have completed phase one. You should stop to test everything out before moving on. Just test a few conditions to make sure that everything is working, and that you haven't made any small mistakes.


==Chorrol Phase==
==Chorrol Phase==


Objectives: - In this phase of the quest we want to use a new NPC called Hubart to direct the player to solve a mystery. He will direct the player to a cottage, where they will discover a mysterious medallion and the dead body of the courier. Hubart will then be able to help us move on to Aleswell and the next phase.
In this phase of the quest we want to use a new NPC called Captain Hubart to direct the player to solve a mystery. He will direct the player to a cottage, where they will discover a mysterious medallion and the dead body of the courier. Hubart will then be able to help us move on to Aleswell and the next phase.
 
We need


For this phase, we will need to create:
*NPC Captain Hubart
*NPC Captain Hubart
*NPC Dead Courier
*NPC Dead Courier
Line 1,180: Line 1,209:
*A cottage to house courier.
*A cottage to house courier.


Again we need to add the NPC first so we can reference him in conditions.
Again, we need to add the NPC first so we can reference him in conditions.


We can again use a new NPC object, but it really saves a lot of time and effort if we simply change the name and ID of an existing Chorrol Guard, I used ChorrolGuardPatrolNight01. Give him a ID to suit like BGCptHubart (Captain Hubart).
As always, we could use a new NPC object, but it really saves a lot of time and effort if we simply change the name and ID of an existing one. This time we can just copy a Chorrol Guard NPC, such as ''ChorrolGuardPatrolNight01''. Change the ID to ''BGCptHubart'', and save it as a new form.
Again strip out his AI, but we can leave his inventory as is, since the Chorrol guards' inventory already contains all we will need. We can also leave the factions alone as they work fine. I placed Hubart outside the Fire and Steel. (Hint a fast way to get to an exterior cell is to select the Fire and Steel interior, and the click on the teleport marker by the door)
Strip out the AI, but leave his inventory as is, since the Chorrol guard's inventory already contains all we need. We can also leave the factions alone. I placed Hubart outside the Fire and Steel shop in Chorrol (worldspace ''ChorrolWorld'').<br />
This is only his starting position. We can add AI's later to move the character about.
''Hint: a fast way to get to an exterior cell is to select the interior cell, and then click on the teleport marker by the door.''<br />
This is only his starting position. We can add AI packages later to move the character about.


We have to set up a new responses to the BGHubart topic.
We have to set up a new response to the ''BGHubart'' topic.


We could add a new topic but it is always a good idea to try to limit how many new topics we add, this reduces the ‘footprint' of the mod, and helps avoid possible conflicts with other mods.
We could add a new topic but it is always a good idea to try to limit how many new topics we add. This reduces the ‘footprint' of the mod, and helps avoid possible conflicts with other mods.


We want to set up a response that when any Chorrol based NPCs are questioned they will direct the PC toward the likely location of the good captain. Add conditions to limit, race to human, saving all that MP3 work, and the location to the Chorrol dummy cell. We can also limit the ‘timescale' to the current quest stage. Try this yourself. You can always refer to the play test version if you get stuck.
We want to set up a response so that when any Chorrol based NPCs are questioned they will direct the PC toward the likely location of the captain. Add conditions to limit the race to human again (saving all that MP3 work), and the location to the ''Chorrol'' dummy cell (thereby including all cells within Chorrol). We can also limit the ‘timescale' to the current quest stage (20). Try this yourself. You can always refer to the PLAYTEST version if you get stuck.


{| class="wikitable" border="1" cellpadding="5"
{| class="wikitable" border="1" cellpadding="5"
!colspan=2| '''BGHubart'''
|-
|-
!  TOPIC
!  TOPIC TEXT
BGHubart (Captain Hubart)
"Captain Hubart"
|-
|-
!  RESPONSE
!  RESPONSE
Ah yes I know him. He is usually on duty near the Fire and Steel
"He's usually on duty near the Fire and Steel."
|-
|-
!  CONDITIONS
!  CONDITIONS
| GetInRace Argonian == 0 etc.<br>
|
GetInCell ‘Chorrol’ == 1<br>
*GetIsRace 'Argonian' == 0, etc.
GetInFaction ‘ChorrolFaction’ == 1<br>
*GetInCell 'Chorrol' == 1
GetIsID BGCptHubart == 0<br>
*GetInFaction 'ChorrolFaction' == 1
GetStage BGM001>= 20
*GetIsID 'BGCptHubart' == 0
*GetStage 'BGM001' >= 20
|-
|-
!  ADD TOPICS
!  ADD TOPICS
Line 1,218: Line 1,250:
The first can be attached to Vilanus Villa topic, to reduce the ‘footprint'.
The first can be attached to Vilanus Villa topic, to reduce the ‘footprint'.


We can limit this using suitable conditions to Hubart only and using the current stage. ADD a TOPIC called BGCourier (Couriers)
First, add a TOPIC called ''BGCourier''.


{| class="wikitable" border="1" cellpadding="5"
{| class="wikitable" border="1" cellpadding="5"
!colspan=2| '''BGMVilanusVilla'''
|-
|-
!  TOPIC
!  TOPIC TEXT
BGVilanusVilla
"Missing courier"
|-
|-
!  RESPONSE
!  RESPONSE
|  Vilanus has sent you to investigate the courier’s disappearance.
"Vilanus has sent you to investigate the courier's disappearance?"
|-
|-
!  CONDITIONS
!  CONDITIONS
| GetIsID BGCptHubart == 1<br>
|
GetStage BGM001== 20
*GetIsID 'BGCptHubart' == 1
*GetStage 'BGM001' == 20
|-
|-
!  ADD TOPICS
!  ADD TOPICS
|  BGCourier
|   
*BGCourier
|-
|-
!  RESULT SCRIPT
!  RESULT SCRIPT
Line 1,239: Line 1,274:
|}  
|}  


Again try this and then refer to the Play test version if you are stuck.
Stop to test this out, and then refer to the PLAYTEST version if you are stuck.


Before we go any further we need to set the scene at the cottage.
Before we go any farther, we need to set the scene at the cottage.


==Locating the Cottage==
==Locating the Cottage==
Line 1,253: Line 1,288:
We want to set the internal scene in readiness for the PC's arrival. I have used a copy of the White Stallion Lodge as a base. We want to customise this. Again we can work on this in more detail when we polish the quest prior to release.
We want to set the internal scene in readiness for the PC's arrival. I have used a copy of the White Stallion Lodge as a base. We want to customise this. Again we can work on this in more detail when we polish the quest prior to release.


We want to remove some of the clutter. We also want to give the impression a fight has taken place. Tips some chairs and tables over (Y=90). Remember this set will be locked at the start and you will only use it for a short time, so don't go overboard. We also want to place some props. We need an amulet to trigger the next phase. Why an amulet. It's small enough that you have to look for It., without being so small that it becomes hard to find. Again use an existing item of jewellery as a base and edit it. I called it BGEmbossedAmulet. Set this as a Quest Item. This means the character can not drop or sell this item once he has picked it up.
We want to remove some of the clutter. We also want to give the impression a fight has taken place. Tips some chairs and tables over (Y=90). Remember this set will be locked at the start and you will only use it for a short time, so don't go overboard. We also want to place some props. We need an amulet to trigger the next phase. Why an amulet? It's small enough that you have to look for it, but not so small that it becomes hard to find. Copy an existing item of jewelry from Items->Clothing->Amulet as a base and edit it. Change the ID to ''BGEmbossedAmulet''. Check off the ''Quest Item'' box. The player can not drop or sell quest items.


We also want to create a custom letter with this text called BGPartialLetter. Set the letter as a quest item. We will refer to it in some scripts.
We also want to create a custom letter called ''BGPartialLetter''. Set the letter as a quest item. We will refer to it in some scripts.
<pre><nowiki>
<pre><nowiki>
<br>
<br>
Line 1,262: Line 1,297:
<br>
<br>
<br>
<br>
The client wishes his only living heir in Cyrodiil, to inherit his house, I have enclosed
The client wishes his only living heir in Cyrodiil to inherit his house. I have enclosed the deed and key. The location of the house is registered at the Imperial City Land Offices...<br>
the deed and key. the location is registerd at the Imperial City land offices ..<br>
<br>
<br>
<br>
<br>
Line 1,271: Line 1,305:
<br>
<br>
</nowiki></pre>
</nowiki></pre>
Of course this would look really cool if we could create a custom ‘ripped' scroll. But that is beyond the scope of these tutorials.
Of course it would look really cool if we could create a custom texture for a torn scroll, but that is beyond the scope of this tutorial.


Finally we want the body of the unfortunate courier.
Finally we need to place the body of the unfortunate courier.


Bodies are NPCs who just happen to be dead. You will need to create an NPC, don't bother too much about detail on this one as they are dead. I used the Courier1 npc as abase.
Bodies are NPCs who just happen to be dead. You will need to create another NPC. Use ''Courier1'' as the base.


Place this character in to the render window, Edit her ID, and position in a suitable place. I put her in a side room so you don't see her straight away. . I also left a nice blood trail to lead you to her. Initially she will be standing up.
Place this character in the render window, set its ID to ''BGDeadCourierRef'', and position the corpse in a suitable place. I put her in a side room so you don't see her right away. I also left a nice blood trail to lead you to her. Initially, the NPC will be standing up.


First edit the NPCs health to read zero (0).
Next click ''Edit Base'' to open the NPC window. Change the NPC's ID to ''BGDeadCourier''. Edit the NPC's health to read zero (0). (To access this stat, uncheck the ''PC Level Offset'' and ''Auto calc stats'' boxes.)


To access her ability you will have to ensure that the PC offset flag is unchecked. Setting her health to 0 kills her.
Now, the awkward thing is the fact that she is just standing there. She will stay standing in the game unless we make her fall first. To get her to fall, click on the WORLD menu and select ''Run Havok Sim'' (with the bouncing red ball). Down she goes.
 
Now the awkward thing is the fact that she is just standing there. She will stay standing in the game unless we make her fall first. To get her to fall, click on the WORLD menu and select run havoc sim, now click this.
 
Down she goes.


We can now drag her about to get the position right.
We can now drag her about to get the position right.


We have to now add the letter to the dead courier's inventory.
I also placed a sword which pointed directly at the amulet.


I also placed a sword which pointed directly at the amulet.
Next, we have to add the letter to the dead courier's inventory. Open the NPC window for ''BGDeadCourier'' and click on the ''Inventory'' tab. Then drag ''BGPartialLetter'' from the objects window over into the inventory list. You will be warned that the letter is a quest item. Just click OK.


Another useful technique is to create an NPC called something like BGDummyPlayer. Use any base you like. We will not place this NPC in the render window. Don't bother to edit anything other than the reference ID.
Another useful technique is to create an NPC called something like ''BGDummyPlayer''. We will not place this NPC in the world, so don't bother to edit anything other than the object ID.


We can now set the ownership of the door and cell (lesson 3) to BGDummyPlayer. This means that all items in the cottage will display the red hand, with the exception of the embossed amulet. This is a handy way to set ownership without having to create detailed NPCs. We can use BGDummyPlayer to set the ownership of all the doors and sets we want to prohibit our player from entering.
We can now set the ownership of the door and cell ([[A_beginner's_guide,_lesson_3_-_The_external_world#Matching_Interiors|Lesson 3]]) to ''BGDummyPlayer''. This means that all items in the cottage will display the red hand, with the exception of the embossed amulet. This is a handy way to set ownership without having to create detailed NPCs. We can use ''BGDummyPlayer'' to set the ownership of all the doors and sets we want to prohibit our player from entering.


Create a key called BGCourierKey. Again select an existing key and change the editor id. Edit the cottage door to set its lock status to ‘needs a key' and use this as the key.
Now create a key called ''BGCourierKey''. Select an existing key and change the editor ID. Also check the ''Quest Item'' box. Edit the cottage door to set its lock status to "Needs a key", and use our new object as the key.


We need to add two other items to the cottage.
We need to add two other items to the cottage.


We need to add an [[XMarker]] to the interior and the exterior a [[map marker]].
We need to add an [[XMarker]] to the interior, and a [[map marker]] to the exterior.


We will find these under the Static Objects.
We will find these under the Static Objects.


Drop an xmarker or an [[XMarkerHeading]] object inside the cottage and give it a reference name like BgCourierLodgeXMarker.
Drop an XMarker or an [[XMarkerHeading]] object inside the cottage and give it a reference name like ''BGCourierLodgeXMarker''.


Now select a MapMarker and drop it just outside the cottage door, in the exterior cell.
Now select a MapMarker and drop it just outside the cottage door, in the exterior cell. It looks a bit like a door teleport marker, but it's pink rather than yellow.
It looks a bit like a door teleport marker but is pink rather than yellow.


Edit its details to give it a reference name like BGMCCottageMapMarker
Edit its details to give it a reference name like ''BGCourierLodgeMapMarker''.


Open up the MapMarker Data tab, check the marker data tick box and select settlement.
Open up the MapMarker Data tab, check the marker data tick box and select settlement.
Theses flags control what type of icon appears on the players map.
Theses flags control what type of icon appears on the players map.


Finally in the name box call it Courier Cottage.
Finally in the name box call it Courier Cottage. This is the name that will appear on the map.
Again this is the name that will appear on the map.


We need to add a bit of script to enable it. First we need to add a bit more conversation.
We need to add a bit of script to enable it. First we need to add a bit more conversation.


Add the following multi-line response and set conditions to limit it to Hubart and the current stage. First add stage 30 in the stage tab.
Add stage 30 in the stage tab, and create a topic named ''BGCluesFound'' (which we won't be editing just yet).
 
Then create the following topic.


{| class="wikitable" border="1" cellpadding="5"
!colspan=2| '''BGCourier'''
|-
!  TOPIC TEXT
|  Courier
|-
!  RESPONSE
* "She's usually very reliable, but she failed to turn up for our usual meeting."
* "She sometimes stays in a small cottage just west of here. I'll mark it on your map."
* "Here's a key to get you in. Let me know what you find out."
|-
!  CONDITIONS
|
*GetIsId 'BGCptHubart' == 1
*'''GetStage 'BGM001' == 20'''
|-
!  ADD TOPICS
|
*BGCluesFound
|-
!  RESULT SCRIPT
|
SetStage BGM001 30
|}


Add one more response to this topic in case the player tries to talk to Hubart again after they've been given the key to the cottage, but before they've found it.
{| class="wikitable" border="1" cellpadding="5"
{| class="wikitable" border="1" cellpadding="5"
!colspan=2| '''BGCourier'''
|-
|-
!  TOPIC
!  TOPIC TEXT
BGCourier (Courier?)
|  Courier
|-
|-
!  RESPONSE
!  RESPONSE
|   
|   
* She is usually very reliable. But she failed to turn up for our usual meeting.
"Did you check out the cottage?"
* She sometimes stays in a small cottage just west of here. I'll mark it on your map.
* Here is a key to get you in. Let me know what you find out.
|-
|-
!  CONDITIONS
!  CONDITIONS
| GetIsId BGCptHubart == 1<br>
|
GetStage BGM001>= 20
*GetIsId 'BGCptHubart' == 1
*'''GetStage 'BGM001' == 30'''
|-
|-
!  ADD TOPICS
!  ADD TOPICS
| BGCluesFound
| ''No add topic''
|-
|-
!  RESULT SCRIPT
!  RESULT SCRIPT
| SetStage BGM001 30
| ''No script''
|}  
|}  


Now in the stage tab for stage 30, add this to the journal:


''Hubart told me that the courier sometimes stays in a small cottage just west of Chorrol. He marked its location on my map and gave me a key to the door. I should go check it out.''


Now in the stage tab for stage 30
And add this to the stage result script:
 
Remember we will need to add quest targets later in the build process.
 
Add this to the journal
 
''I have been given the location of a cottage where I may find some information concerning the missing courier. I should go to the cottage now I have the key to get in.''
 
And add this to the stage result script


  Player.additem "BGCourierKey" 1
Player.AddItem "BGCourierKey" 1
  ShowMap BGMCCottageMapMarker
ShowMap BGCourierLodgeMapMarker


This activates the map marker and gives the player the key to the cottage.
This gives the player the key to the cottage and activates the map marker.


The Syntax for the [[ShowMap]] Function is
The syntax for the [[ShowMap]] Function is


ShowMap MapMarkerID, enableFastTravel (optional)
ShowMap MapMarkerID, enableFastTravel (optional)


The MapMarker ID is the reference id for the map marker.
The MapMarker ID is the reference id for the map marker.
The enableFastTravel is an optional parameter which takes the value 1 if you want to be able to fast travel immediately.
The enableFastTravel is an optional parameter which takes the value 1 if you want to be able to fast travel immediately to that location.


If omitted then you can not fast travel until you have found the location.
If enableFastTravel is not given (or set to 0) then you can not fast travel to that location until you've found it once.


Remember we have still to add all those quest targets, and will use the xmarkerheading as a reference for this.
We still need to add all the quest targets, and we'll use the XMarkerHeading for that.


Up till now we have been able to use NPCs to control progression, however now we need to begin to script to do the next bit of progression.
Up 'til now we have been using dialogue to control progression, but now we need to begin using scripts more continue.
And that seems like a good place to take a break.


In [[A beginner's guide, lesson 7 - Using Scripts in Quests|Lesson 7]] we will complete the quest and focus on SCRIPTING.
In [[A beginner's guide, lesson 7 - Using Scripts in Quests|Lesson 7]] we will complete the quest and focus on SCRIPTING.


[[Category:A beginner's guide]]
[[Category:A beginner's guide]]
Anonymous user