Skyrim Quest Making Tutorial
Written by Giskard
Skyrim Quest Making Tutorial
Introduction
Skyrim's quest making system is a lot different from Oblivions and even Fallout 3's because of the new scripting language. If the Creation kit had all the useless buggy stuff removed, learning the new language would not be too had. But the old obsolete commands are still in there, as are the buggy new commands and the wiki that attempts to explain how to use it is out right wrong in many places or forgets vital information in most other places. Making it practically impossible to learn how to make safe quest mods by following it. I know I tried for several months before giving up and learning this my self the hard way.
What follows will, I hope be a simple explanation for a very overly complicated quest building system. I will talk you around the bugs, I will point you at the pages where you need to look for specific information and given you an overview of the simplest and safest ways to make quests, and yes I will point you at the right wiki pages so you can learn to look things up your self, which is a requirement for all quest makers because we have to know a little bit about everything to make quests.
Chapter 1A: Creating an basic quest
I will now walk you through the process of making a basic empty quest in the Skyrim Creation Kit. Go to the Object Window in the Creation it and find the Quest menu, its under Character for some odd reason. Select Quest open it up so you can see the quests already included with the game in the right hand side of the window.
Right click and select New in the right hand window to make a new quest, once done, go to the ID tab and enter an ID name for your quest. The ID is the name the computer uses to refer to your quest, the QUEST NAME is the name the player sees in the game. So for ID have a name like myquest without spaces or attempts at proper gramma because this is for the computer not the player, and for the Quest Name, have a name like "My Quest" with spaces and proper gramma because this is for us humans to read.
Now give the quest a priority of 30, 20 is also good.
In the creation kit, I believe this determines where in the quest list the quest is displayed, 30 is near the top, 20 is in the middle.
You also need to go to TYPE and use the pull down menu to select what type of quest it is, you can choose from several options but the ones you should stick too at first are MAIN QUEST, SIDE QUEST and Miscellaneous.
Main Quest makes your quests name look bigger and puts it in the main quest window when the player hits the J Key.
Side Quest makes the name smaller but still puts it in the main quest window where the player hits the J key.
Miscellaneous puts the quest in the Miscellaneous list, so its not visible in the main quest list window until the player clicks on Miscellaneous to view all the Miscellaneous quests available.
You must now click on OK on the quest window to close it and then reopen it for all the other quest window functions to appear, so do that now and then reopen your quest by double clicking on it from the Object Windows Quest list.
Now we have to add script to our basic quest, so go to the last tab and click on script. Once the Script window is open, click on "ADD", then on [New Script], then on OK. You will notice Extends part of the window that appears is already filled in and says QUEST, where as the NAME part says Script, you need to change the Name part. I recommend copying your quests ID and adding the word script to the end. So if your quest ID was myquest, the script would be called myquestscript.
And that's it, you have a basic quest, it does absolutely nothing but this is the process you must follow when making any new quest before you can add anything else too it.
Chapter 1B: Objectives
Most quests need objectives and these objectives can be enabled and disabled via a script later in this tutorial in Chapter 3D: Making your own Functions. To make an objectives now, just go to the quest window and click on Quest Objectives. Right click and select new, then select the new object that appears and edit the index box to give the quest a number, 10 is a nice number for the first Objective. Now in the box next to the word Display, type the objective text that the player will see.
For example "Talk to Bob"
If you want the quest arrows to work, you also need aliases set up for Bob and assigned to the objectives you just created.
Click on the Quest Aliases Tab and right click and select new reference alias. The first thing you will notice is the Reference Alias window is far too big for most peoples monitors. So you cannot see what is at the bottom of the window. Personally I think there are aliens down there but not having seen the bottom of this window, I really cannot prove it. Dangling cheese just above the bottom of the monitor did produce some squeaking sounds so it might have been mice down there, or my computer fans starting to go.
Either way, it is a complete mystery what is at the bottom of this stupidly large window because my 23inch monitor is not big enough to see it.
In the reference alias window there is alias box to type a name into, if your objective is "Talk to Bob" and you want the quest arrow to point to him, enter a suitable name here such as bobalias and then where it says specific reference, tick the box and then select Bob in the game world. This assigns the bob in the game to the alias you just created.
Now click in the alias inventory box near the bottom if you cannot see the ok button either, and just hit return, this will close the window.
Now return to the Quest Objectives tab and select the "Talk to Bob" objective then in the box marked Target Ref, right click and select new. Then with the NO TARGET line selected, go to the Quest Target Data part where it says Target Alias NONE and find your Bobalias listed.
From now on, when ever the "Talk to Bob" objective is showing, the quest arrow will point to bob.
Now you just need to learn how turn objectives on and off, which we cover later on.
Chapter 2A: Adding Quest Dialogue
I'll now walk you around several editor bugs as we add dialogue to your quest mod.
In the quest you made in Chapter 1, go to the player dialogue tab. Ignore the Dialogue Views, its buggy as hell, stick to the Player Dialogue tab, that works. In the player dialogue window you have Branches and Topics. Many people have problems here because they do not know how this part works if your not using the Dialogue view tab. So I'll tell you.
You need 1 branch every time your dialogue switches to another NPC. That branch can have as many topics as you like, providing its the same NPC talking.
For example:
NPC A talks to NPC B and NPC B replies to NPC A who then says YES and the quest ends.
We need 3 Branches for that.
One for NPC As first topics.
One for NPC Bs reply to NPC A.
One for NPCs YES reply to NPC B.
If your going to have an NPC take money from the player or give money to the player, always do it in the last topic before you switch to a new branch to stop the player pressing escape and quitting the dialog, then re-asking the same question to get more money. Say Once is an option in the topics window that will stop that but it usually breaks quests too. So do not use Say Once unless the info is literally "say once" type of info, typically unimportant stuff.
Right click in the Branches area and select new, the branch will be named after your quest name, but you will find the name gets pretty long, so get in to the habit of shortening it. So MyQuest01 may become MQ01 for example. When have done this, go to topics and select new and make a new topic, again shorten the name to MQ01Topic01. Always add a 01 to the end, when you make a second topic for this branch, add a 02 to end and when you do the third, add a 03 to the end. This helps organise your topics and allows you to see the order they go in.
Another thing to remember is the first topic that gets displayed is the one listed under Branch Data, so always make sure the Starting Topic is set correctly.
If your going to ask a question with a yes or no answer, try adding A or B to the end of the number so you get mquest02a myquest02b as replies. It should help you stay organised.
Now you have a topic, the window to its right will be empty and the box next to the word TOPIC will probably be empty too. Edit that to say something else like "Tell me about your self". Those words will then appear in the game as a dialog option. If you forget to change it, you will see ... instead where the dialog should have been.
In the big white area under the word topic, right click and select NEW whilst your new topic is selected. This adds the topic your about to create to the topic title you just wrote. A new response window will appear, just close it, its actually too soon to be typing in dialog text. We want the next window anyway.
Chapter 2B: Working in the Topic Info Window
Now your looking at the Topic Info window. Probably the most important window for all quest makers. So lets have a little tour.
Topic TEXT is the topics primary title.
Prompt is an override title this one topic can be given, thus allowing you to change the title here if you wish.
Responses is where you right click and select new, this brings up the New Response window again allowing you to type in your dialogue but do not do it just yet.
You can experiment with the tick boxes but basically Say Once is the part I spoke about above, so do not use this for vital quests. Goodbye is good for quitting out of dialog and ending a chat with the player. I use this on the last line of my dialog to force an end to the conversation. The rest do other others that you can learn when your more experienced.
On the right there is a Link to window. This is where you right click and select add link in order to link the current topic to the next topic. In this way you can choose which topic will be displayed next. In the case of a yes and no reply, you add 2 topics as the next reply and let the player choose between them. They in turn would link to other topics, probably different topics to give different results. You can only link to topics within the same branch. Once you change branches, the branches own starting topic setting determines the next topic to be displayed.
Chapter 2C: Topic Info Window Conditions
Welcome to another bug fest, in the past the conditions where used to control everything, but now half the conditions you can choose from are obsolete and others do not work. Trying to guess why your new quest does not work when your learning can be a pain when you do not know the conditions are mostly foobarred now, so stick to a few you know work until you become more confident at making quest mods.
Here are some good conditions that do work.
GetStage
Typically it looks like this when set up, this is example showing stage 10. Use it to hide dialog when the quests stage is NOT at the stage indicated. This is a very important way to reveal and hide dialog based on quest stages.
S Getstage Quest:myquest == 10 AND
That says if my quest equals 10, this dialog option will appear to the player.
GetQuestcomplete
Typically I use this to turn off all a quests lines of dialogue once a quest is finished, otherwise some may remain visible. I also use this to enable or disable lines based on whether other quests have been completed or not.
Typically it looks like this.
S GetQuestComplete Quest:Myquest == 1
The 1 meaning YES, a 0 meaning NO. So the above example means myquest is finished, so display this line but the line below means my quest is not finished so display this line.
S GetQuestComplete Quest:Myquest == 0
GetIsID
This is a very important one because it tells us who should speak this line, we use it to literally name the speaking actor. Typically it looks like this.
S GetIsID Actor:Myactorsname == 1
Again the 1 means YES, and that line says, if the actor is myactorsname, then let him speak this line.
Some conditions for factions also work, so you can assign dialog via factions too.
Chapter 2D: Using Stages to control dialog.
In the quest window there is a Quest Stage tab, this is mostly obselete now but given how many bugs are in the editor, stages remain a good way to enable or disable dialogue in a reliable way. To do so you use this tab, just right click under index and add a bunch of stages from 0 upwards. You can add more later. No need to do anything else.
Then when you want a line of dialog to appear at stage 20 you would add a condition to the topic like this.
S Getstage Quest:myquest == 20 AND
At the end of the topic in the begin or end boxes mentioned below you would call to a function to change the stage again as explained later in this tutorial. Effectively disabling this topic so it does not appear again and enabling the next topic. This prevents all the topics from appearing at once. Which happens sometimes regardless of the link to options.
Chapter 2E: Scripts Beginning and End Boxes
Below the buggy conditions is the new way to handle things and it requires a new way of thinking too. So I'll give you an quick overview here. You cannot just type in commands anymore nor can you reply on conditions anymore. Even the current quest does not know whats in its own script unless you tell it. So the first thing you have to learn is how to access stuff in a script since its functions in a script that do the bulk of the work for quests in Skyrim and not conditions or begin or end boxes. All the begin or end boxes are for now is to call functions and do basic tasks. Thats about it.
An example of how to call a real quest scripts function from the same quests begin or end boxes, can be seen below.
(GetOwningQuest() as tegtelmq02script).cleanupquest()
If Iwas to spell it out for you based on what your actually looking at.
(GetOwningQuest() as My Quest Scripts name).A Function in my script()
That line calls the function and runs anything inside the function, thats how you do things in Skyrim, its very different from how things worked in Oblivion or Fallout.
Skyrim also uses objectives and you can manipulate them from the Begin or End boxes like this.
These next 3 commands are used to display objective 10, mark it complete or mark the whole quest as complete from a begin or end box.
GetOwningQuest().SetObjectiveDisplayed(10)
GetOwningQuest().SetObjectiveCompleted(10)
GetOwningQuest().CompleteQuest()
From a function in your quest script, those same commands would be used like this.
Function myfunction()
SetObjectiveDisplayed(10)
SetObjectiveCompleted(10)
CompleteQuest()
Endfunction
And executed like this from the begin or end box.
(GetOwningQuest() as tegtelmq02script).myfunction()
The Topic info window needs to be told it is the current quest these commands apply too, which is why the begin and end boxes need GetOwningQuest() first, but the script does not. So you drop the GetOwningQuest() part. I told you they made it more complicated than it needed to be, now you are starting to see why, it gets worse trust me.
To change stages in a quest, you use this command from the Begin or end boxes.
GetOwningQuest().SetCurrentStageID(10)
To change stages from a function in a script, you use this.
Function myfunction()
SetCurrentStageID(10)
Endfunction
Then execute it like this from a begin and end box.
(GetOwningQuest() as tegtelmq02script).myfunction()
Just as an example, I make a cleanup function to clear away any mess my quests leave behind once complete and it looks like this
Function cleanup()
endfunction
I call it from the Begin or end boxes like this.
(GetOwningQuest() as myquestscriptname).cleanup()
Some good things to put in my cleanup function is any stage changes or objective changes, for example, here is a real cleanup function from one of my own quests.
Function cleanup()
SetCurrentStageID(60)
tegtelollyactor.Disable()
SetObjectiveCompleted(50)
chest1.Disable()
chest2.Disable()
chest3.Disable()
endfunction
What your looking at is the clean up function changing the stage to stage 60, then disabling an actor called tegtelollyactor before marking objective 60 complete and disabling 3 chests. Standard clean up stuff basically. This stops me leaving the sort of mess behind that Bethesda often leave when their quests are completed.
That is of course a quick overview of how to use the begin and end boxes safely, we will go in to it in more depth later.
Chapter 2F: Recording some lines of Dialog
Wait until I tell you to record something before doing so, this is important!
Go the Topic Info Window and right click in responses and select new to open new response window, in the response text box type in what you want to say. Then go down to emotion and change it from neutral and enter a number between 0 and 99 for the emotion value. I have not seen emotion doing a whole lot in Skyrim so it may be obselete now or just broken, probably the latter.
At the bottom under the part that says Select Sound, you will see a white box, if your conditions have GetIsID set, or a faction, that NPC or every member of that faction that speaks this line will appear and X.. and W.. and Lip will get Y under them if you have an Xwma file or a Wave or a Lipsync file generated. You get the wave and lipsync by recording your voice line and clicking save. To convert them to XWMA you need a third party script to help.
I have one you can use on this website, it is in the Wave to XWM Guide but ignore it for now, you do that last anyway.
If every NPC in the game seems to be listed in the white box, it means you have not set GetIsID yet so lets do that now BEFORE we record any lines. After you type in the line you want to speak and set the emotion, OK the window and go back to the Topic Info window.
Right click in conditions, a window called Condition Item will appear, it defaults to GetIsID which is handy because we want that now. Where it says Invalid, click on it and where it says ObjectID, scroll and find an NPC you want to speak your line. It will tell you next to ObjectID if its an actor or something else, make sure its an Actor. Preferably one you created for your quest. Now make sure "comparison" says == and the value = 1.0000 (1 and 1.0 and 1.0000 all mean 1).
That's it, you just told the quest who should speak that line, now the game knows which folder to store the line in once its recorded. Had you skipped this part, it would have placed your recording in every single voicetype folder the game supports. Literally dozens of copies of the same line for all NPCs would have been made, not good.
Now go back to Responses and double click on your line and record it, be sure to preview it to make sure it sounds okay, then click save and finally okay to close the window. You have just added a line to your NPC.
To find the line, go to your Skyrim/data/sound/voice folder and look for a folder named after your mod. If you open the folder named after your mod, you will see the folders named after the voicetype you assigned to your NPC. All dialogue spoken by an NPC with that voice type will be stored in that folder. If you have several NPCs with several voice types and record lines for each of them. Then you will have several voicetype folders in here.
It is now that you would use that Wave to XWM Guide to change your large waves in to small XWM files for release.
Chapter 3A: The big scary Script.
If your making quests for Skyrim your best using the script to do most of the work and not the Topics info begin and end boxes because they are a pain and error prone. Its better to use these boxes for simples things or to call script functions from.
Functions called from scripts are the best way to work in Skyrim, so Chapter 3 will focus on teaching you the basics of that. That means you have to learn how to call functions from your quest script. This is scripting 101 for Skyrim and is 100x more complicated that it was under Oblivion, so do not say I did not warn you.
As I have already explained a basic function from a script that does nothing will look like this.
Function mybasicfunction()
;this one does nothing because there is nothing in it.
endfunction
In a full script called myquestscript, it would look like this.
Scriptname myquestscript extends Quest
Function mybasicfunction()
;this one does nothing because there is nothing in it.
endfunction
You would call mybasicfunction() from myquestscript we need to add a line like this to the topic info windows begin and end box, then put what ever stuff you wanted the function to do, inside the function it self. This is by far the most reliable way to do things in quests for Skyrim and like I keep saying it is complicated and a very steep learning curve but powerful once you learn it.
It offers a very tight control over things if you get it right, much better than the old system.
This is the exact line needed to run the above function in the above script.
(GetOwningQuest() as myquestscript).mybasicfunction()
I wrote a full tutorial on how to do this on this website, the tutorial is called Skyrim Papyrus Scripts, but also check out Skyrim Papyrus Tutorial: How to use OnUpdate and Skyrim Papyrus Tutorial: Functions Explained for detailed info on this. There are advanced ways to call scripts and functions from other quest that those tutorials cover that this one does not.
Chapter 3B: How to use real items in scripts.
Yes folks, even finding the commands your allowed to use is tricky in Skyrim, they made it so complicated you need a tutorial just to find your way around the wiki. But here is the basics.
As a rule anything you want to name or use in a script has to be added as a property to the script first. A property is those things you see when you go to script tab of your quest, select your script and click properties. Each type can be a different type of item and have a different default script controlling it and you have to know which is which and tell the editor what it is because the editor is stupid.
This is where it gets complicated very fast.
A good tip here when trying to find out what sort of property an item should be is to look at where the item is in the Object window of the creation kit. E.g. is it under books, under Weapons, Soul Gems or what ever ? If it is, that is the type of Property you need to use to add it as in your script before you can use it.
You do this by going to the script tab and selecting your script, then selecting properties and finally selecting add property and where it says type, scrolling up or down until you find the type of item you want to add to your script so it can use it, then give it name. Finally you okay it, select the property you just added and select edit and find the real item in the list and assign it to the property you just created, if the type matches, you will not get any errors. In this way, what ever name you gave it, points at the real item in the script.
This way, you can refer to the real item using a shorter property name.
So if the real item was called "myfantasticsword" but you called the property name mysword and pointed it at "myfantasticsword", from then on the script would only expect you to refer to "myfantasticsword" simple as "mysword" every time its mentioned in your script. But here is a cool tip for you. If you entered "myfantasticsword" as the name of the property, the property would autodetect that is the name of the real sword and automatically assign the real sword to the property for you. Allowing you to skip the finding the real sword part.
Anything you do from the properties window is automatically written to your script, so if you make a mistake, you have to right click on your script and select edit source and manually remove the line it added and save the script again. You will be told if there is an error when you try this.
Chapter 3C: How to find out what commands work with which item.
The properties you just learned about tells the game what an item is, the game needs to know this because it needs to know what default script works with that item. The default script may be a weapon script for weapons so by assigning your weapon as type weapon in properties, you have told the game which script to use.
Why is it important that the script match the item correctly ?
Because that default property script holds all the commands that will work on an it, if you get it wrong, like trying to tell an explosion to go for a swim, common sense should tell you its not going to work because explosions cannot do backstroke. But if the script assigned is correct, the commands that would work with explosions will be listed in it and the game will know explosions "Explode".
That is just an example btw but you get the idea.
A list of item scripts full to the brim with exciting functions and commands for you to use in your scripts can be found on the wiki page below. Just be warned, the wiki is wrong in many places and givens examples that do not work as described in many cases. Also finding this page is not easy so book mark it. The wiki is a hidious mess and very hard to navigate. If the link below breaks, seach the wiki for Script Objects instead.
Before we move on, lets look at one or two objects and what commands they support that we can use. Lets start with the Actor Script, this covers all the commands/functions that work on NPCs or as Skyrim calls them Actors. Scrolling down the list on the Actor Script page of the wiki we can see the lots of commands available, including but not limited too.
AddToFaction(Faction akFaction)
Dismount()
Kill(Actor akKiller)
So when you want to see what commands/functions will work on something, you look at the objects script and browse the commands/functions list. Also in some cases you need to name the objects script before the command can be used. So for actor functions named above, you would type them like this.
Actor.AddToFaction(Faction akFaction)
Actor.Dismount()
Actor.Kill(Actor akKiller)
The game script holds the player commands, so we refer to the player as Game.GetPlayer() in papyrus rather than just player as we did back in the Oblivion days. The default script name for the item is what goes before the function or command. So here is another reason to learning which default script assigns to which object in the game.
A hidiously complicated system and a very hard one to learn for that reason, but stick with it.
Chapter 3D: Making your own Functions.
Now you know how to find out what commands work with what types of objects and how to add objects so you can use them in a script, and how to call a function from a topics begin or end boxes, lets look at some function examples.
All of these examples will use the same function name and script name, so the line below can be used to call them all from the topics begin and end boxes if you have a script called myquestscript and use function name called Function1(). If you changed those names, you must change the names in the line below too if you want to use these functions in your own quests.
(GetOwningQuest() as myquestscript).Function1()
Example functions.
You added a property of type weapon and give it the name myitem, then you point the property myitem to a glass battleaxe in the properties of the script. If you did that, this function would give the player 1 glass battle axe every time you called the function from your topic or anywhere else for that matter.
Function Function1()
Game.GetPlayer().AddItem( myitem, 1)
endfunction
And this would take the glass battleaxe away.
Function Function1()
Game.GetPlayer().Removeitem( myitem, 1)
endfunction
If you wanted to use the exact same script to add 1 gold to the player instead of a glass battleaxe, just use the properties to point myitem at gold001 as a miscitem (because gold001 is type miscitem) and the above examples would give the player 1 gold instead. By changing the 1 to 500, you can give the player 500 gold. Changing it again to a soul gem or a book or what ever, changes what the player receives when he clicks on the topic. You just change the property to do it.
If you wanted to enable or disable objectives, that's even easier. This example would mark objective 1 complete and show objective 2 as the next objective for the player to do. No properties need to be set up for this.
Function Function1()
SetObjectiveDisplayed(2)
SetObjectiveCompleted(1)
endfunction
Changing the stage of a quest can be done this way. This would change the stage to 10.
Function Function1()
SetCurrentStageID(10)
endfunction
Marking a quest complete, would be done this way.
Function Function1()
CompleteQuest()
endfunction
You can look up the commands available to you in each objects scripts and make far more interesting functions than these, but these will get you started.
Chapter 4: Final Words
The way to view Skyrim quest making is as a script heavy system where as the older Fallout and Oblivion systems still where GUI heavy or Window based quest making systems heavily reliant on the Topic info window. The older commands where more high level (SMART) commands but more limited, where as Skyrims commands are more low level (STUPID) but very flexible. So it takes more work to learn how to make quests and scripts in skyrim but you have more power at your finger tips once you do learn how it works.


