Difference between revisions of "Arcane University:Implementation Scribe Assignment"
(→Scripting and Conditions) |
|||
(10 intermediate revisions by the same user not shown) | |||
Line 1: | Line 1: | ||
{{Trail|Implementation}} | {{Trail|Implementation}} | ||
− | This assignment is for arcane students who have had their first introduction to quest implementation using Bethesda's "Bendu Olo" [https:// | + | This assignment is for arcane students who have had their first introduction to quest implementation using Bethesda's "Bendu Olo" [https://ck.uesp.net/wiki/Bethesda_Tutorial_Planning_the_Quest Quest Design Fundamentals] and [https://ck.uesp.net/wiki/Bethesda_Tutorial_Packages Intermediate Quest Design] tutorial series. In order to attain the rank of Arcane Scribe, you will implement another quest with a similar level of complexity, but this time, it will be presented to you in the format used by the writers at the Arcane University and some partnered projects. This will get you used to taking pieces of writing and translating them into the systems of implementation that the game will understand. |
The assignment quest is titled "Put a Ring on It" and can be found here: [https://docs.google.com/document/d/1JA6l9VQkIrqodMi09kHiGgT2OhnU6kw0XOx5tKjs8Ro/edit] | The assignment quest is titled "Put a Ring on It" and can be found here: [https://docs.google.com/document/d/1JA6l9VQkIrqodMi09kHiGgT2OhnU6kw0XOx5tKjs8Ro/edit] | ||
Line 12: | Line 12: | ||
* As one of the first things you'll do, create all the aliases you think you'll need (it is not necessary to use the prefix in alias names). That means the NPCs (preferably with the "Unique Actor" fill type), any quest items (with the "create reference to item" fill type if possible), any containers (chests etc.) if applicable. Location aliases won't be useful yet in this quest. | * As one of the first things you'll do, create all the aliases you think you'll need (it is not necessary to use the prefix in alias names). That means the NPCs (preferably with the "Unique Actor" fill type), any quest items (with the "create reference to item" fill type if possible), any containers (chests etc.) if applicable. Location aliases won't be useful yet in this quest. | ||
* Like you did in the Bendu Olo tutorial, create the quest stages that you think you'll need. You will have more or less the same structure as in that quest. Take care to have a stage for when the player refuses the quest. | * Like you did in the Bendu Olo tutorial, create the quest stages that you think you'll need. You will have more or less the same structure as in that quest. Take care to have a stage for when the player refuses the quest. | ||
+ | * Install [https://www.nexusmods.com/skyrimspecialedition/mods/15109 Fuz Ro D'oh] if you haven't already (requires SKSE). This will make sure that your dialogue lines will have lip movements and will be displayed for a normal amount of time, making testing easier. | ||
+ | |||
===Dialogue=== | ===Dialogue=== | ||
* If you see [orange text between square brackets], these are directions for the voice actors, and you must paste them into the "script notes" field in the [https://ck.uesp.net/wiki/Topic_Info#The_Response_Form Response Form] when implementing the line. You can leave the square brackets out. | * If you see [orange text between square brackets], these are directions for the voice actors, and you must paste them into the "script notes" field in the [https://ck.uesp.net/wiki/Topic_Info#The_Response_Form Response Form] when implementing the line. You can leave the square brackets out. | ||
Line 19: | Line 21: | ||
===Scripting and Conditions=== | ===Scripting and Conditions=== | ||
− | * Try to put as much of the scripting as possible through the stage fragment scripts. Try to have only SetStage() commands in dialogue fragments and do the rest in the stages. This makes the quest easier to understand for another implementer, or for yourself if you haven't worked on it for a while. Add properties to the stage fragment script as needed, but if you need to do something to NPCs or items that are contained in aliases, use the alias properties that the Creation Kit automatically added, by doing Alias_''Name''.GetReference(). | + | * Try to put as much of the scripting as possible through the stage fragment scripts. Try to have only SetStage() commands in dialogue fragments and do the rest in the stages. This makes the quest easier to understand for another implementer, or for yourself if you haven't worked on it for a while. Add properties to the stage fragment script as needed, but if you need to do something to NPCs or items that are contained in aliases, use the alias properties that the Creation Kit automatically added, by doing Alias_''Name''.GetReference(). See [[AU:Scripting Best Practices|Scripting Best Practices]] for more tips. |
− | * Generally avoid using Game.GetPlayer(). It won't matter too much here but it may become a bad habit and when it is used in a piece of code that is executed repeatedly, the peformance overhead may become noticeable. Either use an Actor property (calling it "PlayerRef" will make it auto-fill) or put the player in an alias using | + | * Generally avoid using Game.GetPlayer(). It won't matter too much here but it may become a bad habit and when it is used in a piece of code that is executed repeatedly, the peformance overhead may become noticeable. Either use an Actor property (calling it "PlayerRef" will make it auto-fill) or put the player in an alias (using "specific reference" fill type, cell "(any)", reference "PlayerRef"), and then use the automatic Alias_ property. |
* Don't know how to check whether the player has talked to Jarl Siddgeir? Check the [https://ck.uesp.net/wiki/Condition_Functions Condition Functions] page on the CK wiki for a list of conditions to use on the dialogue, and search for possible terms that could be in the condition function you need! Hint: try "talk"... | * Don't know how to check whether the player has talked to Jarl Siddgeir? Check the [https://ck.uesp.net/wiki/Condition_Functions Condition Functions] page on the CK wiki for a list of conditions to use on the dialogue, and search for possible terms that could be in the condition function you need! Hint: try "talk"... | ||
− | * How to check if Siddgeir is still the Jarl? This would require digging into vanilla content to see how things are implemented there, and figuring out a simple and foolproof way of doing this check. If you're on a project and need to account for content in that project, your implementation lead might be able to give you pointers. In this case, we'll just tell you: make an alias for Siddgeir in your quest, then on the relevant piece of dialogue, use the condition [https://ck.uesp.net/wiki/ | + | * How to check if Siddgeir is still the Jarl? This would require digging into vanilla content to see how things are implemented there, and figuring out a simple and foolproof way of doing this check. If you're on a project and need to account for content in that project, your implementation lead might be able to give you pointers. In this case, we'll just tell you: make an alias for Siddgeir in your quest, then on the relevant piece of dialogue, use the condition [https://ck.uesp.net/wiki/GetFactionRank GetFactionRank], use JobJarlFaction as the parameter, check if the result is higher than -1, and instead of running on subject, run it on "Quest Alias" and specify your Siddgeir alias. |
+ | * Speaking of factions, isn't it annoying how Ruta will get up and applaud the bard for his performance? That might not be desirable AI behavior for her. In vanilla, the developers sometimes implement factions to disable certain kinds of radiant behaviors on specific NPCs. Search for "bard" in the faction category of the object window; which faction do you think you would put on Ruta to stop her audience behavior? | ||
===Final Words=== | ===Final Words=== | ||
* For the post-quest reward by courier, here are some pointers: [https://ck.uesp.net/wiki/RegisterForSingleUpdateGameTime_-_Form RegisterForSingleUpdateGameTime], and [https://ck.uesp.net/wiki/Using_the_Vanilla_Courier Using the Vanilla Courier]. You'll need to manually create a script for your quest, alongside the fragment script; see the [https://ck.uesp.net/wiki/Bethesda_Tutorial_Papyrus_Hello_World Bethesda Scripting Tutorial] for guidance on how to manually create a script. This new script will contain the OnUpdateGameTime event and run the code that spawns the courier. If this is too much right now, then just leave this part unimplemented and consider it extra credit. | * For the post-quest reward by courier, here are some pointers: [https://ck.uesp.net/wiki/RegisterForSingleUpdateGameTime_-_Form RegisterForSingleUpdateGameTime], and [https://ck.uesp.net/wiki/Using_the_Vanilla_Courier Using the Vanilla Courier]. You'll need to manually create a script for your quest, alongside the fragment script; see the [https://ck.uesp.net/wiki/Bethesda_Tutorial_Papyrus_Hello_World Bethesda Scripting Tutorial] for guidance on how to manually create a script. This new script will contain the OnUpdateGameTime event and run the code that spawns the courier. If this is too much right now, then just leave this part unimplemented and consider it extra credit. | ||
− | * When testing, remember to COC from main menu every time to avoid interference from your previous testing session, as many aspects of the quest are baked into a saved game immediately. | + | * When testing, remember to COC from main menu every time to avoid interference from your previous testing session, as many aspects of the quest are baked into a saved game immediately. See [[AU:Implementation Troubleshooting Reference|Implementation Troubleshooting Reference]] for more tips. |
− | + | * When you're done and everything works on your end, clean your plugin of any unnecessary or unintentional edits using xEdit. See the [[AU:XEdit Tutorial|XEdit Tutorial]] and [https://www.youtube.com/watch?v=xtKh6UhK5RQ&t=7865 this AU lecture] for an introduction. Do not use QuickAutoClean, you will have to get used to cleaning manually. | |
− | * When you're done and everything works on your end, clean your plugin of any unnecessary or unintentional edits using xEdit. [ | ||
* Gather up your .esp and your scripts (both .pex and .psc in the appropriate folder structure), combine everything into a .zip and post it for us to see. Recording a gameplay video would also be of great help if you are comfortable doing that. | * Gather up your .esp and your scripts (both .pex and .psc in the appropriate folder structure), combine everything into a .zip and post it for us to see. Recording a gameplay video would also be of great help if you are comfortable doing that. |
Latest revision as of 03:34, 26 October 2024
This assignment is for arcane students who have had their first introduction to quest implementation using Bethesda's "Bendu Olo" Quest Design Fundamentals and Intermediate Quest Design tutorial series. In order to attain the rank of Arcane Scribe, you will implement another quest with a similar level of complexity, but this time, it will be presented to you in the format used by the writers at the Arcane University and some partnered projects. This will get you used to taking pieces of writing and translating them into the systems of implementation that the game will understand.
The assignment quest is titled "Put a Ring on It" and can be found here: [1]
In the Bendu Olo tutorial, you started out implementing things the "wrong" way, i.e. without aliases, for pedagogical reasons. Then in Chapter 6, you retroactively added them in. In this assignment, you'll be doing things the optimal way from the beginning, using aliases, ensuring that your quest is properly encapsulated, meaning there are as few loose parts as possible that are used by your quest but aren't contained in it.
This document will not give step-by-step instructions in order to let you work through the quest on your own, figuring things out as you go (but do ask questions if you're stuck!), though we provide some general pointers that will help.
Getting Started[edit]
- Pick a prefix of three or four letters that you will include in the EditorID of any form that is part of this quest (one possibility: "AUS", for Arcane University Scribe). In the Creation Kit preferences, go to the Papyrus tab and set this prefix as the prefix for fragment scripts.
- As one of the first things you'll do, create all the aliases you think you'll need (it is not necessary to use the prefix in alias names). That means the NPCs (preferably with the "Unique Actor" fill type), any quest items (with the "create reference to item" fill type if possible), any containers (chests etc.) if applicable. Location aliases won't be useful yet in this quest.
- Like you did in the Bendu Olo tutorial, create the quest stages that you think you'll need. You will have more or less the same structure as in that quest. Take care to have a stage for when the player refuses the quest.
- Install Fuz Ro D'oh if you haven't already (requires SKSE). This will make sure that your dialogue lines will have lip movements and will be displayed for a normal amount of time, making testing easier.
Dialogue[edit]
- If you see [orange text between square brackets], these are directions for the voice actors, and you must paste them into the "script notes" field in the Response Form when implementing the line. You can leave the square brackets out.
- If you see [purple text between square brackets], these are implementation directions for you. A note like [Go to STORY] means that the dialogue continues normally to the section marked [STORY], and is merely broken up in the document for formatting reasons. [back to options] means that you must link to the same topics that were shown in the previous dialogue. In this particular quest, the writers have sometimes specified an idle animation (such as IdleTableDrinkEnter) for the NPC to perform on a given line, which you can likewise specify in the response form.
- The quest provides several lines for Ruta to mutter to herself. This sounds like it corresponds with a dialogue type called "idle" dialogue, and needs to be implemented in the Misc Tab in a topic with the subtype "Idle". Gavril's combat barks need to be in the Combat Tab in a topic with subtype "Taunt". Note that, since the NPCs are in aliases, you can now use the GetIsAliasRef condition on their dialogue as an alternative to GetIsID.
- When the player first talks to Ruta, they won't have the opportunity to select a dialogue option, and instead, Ruta will speak a line immediately. This will therefore have to be a Blocking Branch. A ForceGreet would work too but is worse for gameplay as it would force the player into a conversation for no reason, and the quest document doesn't call for this.
Scripting and Conditions[edit]
- Try to put as much of the scripting as possible through the stage fragment scripts. Try to have only SetStage() commands in dialogue fragments and do the rest in the stages. This makes the quest easier to understand for another implementer, or for yourself if you haven't worked on it for a while. Add properties to the stage fragment script as needed, but if you need to do something to NPCs or items that are contained in aliases, use the alias properties that the Creation Kit automatically added, by doing Alias_Name.GetReference(). See Scripting Best Practices for more tips.
- Generally avoid using Game.GetPlayer(). It won't matter too much here but it may become a bad habit and when it is used in a piece of code that is executed repeatedly, the peformance overhead may become noticeable. Either use an Actor property (calling it "PlayerRef" will make it auto-fill) or put the player in an alias (using "specific reference" fill type, cell "(any)", reference "PlayerRef"), and then use the automatic Alias_ property.
- Don't know how to check whether the player has talked to Jarl Siddgeir? Check the Condition Functions page on the CK wiki for a list of conditions to use on the dialogue, and search for possible terms that could be in the condition function you need! Hint: try "talk"...
- How to check if Siddgeir is still the Jarl? This would require digging into vanilla content to see how things are implemented there, and figuring out a simple and foolproof way of doing this check. If you're on a project and need to account for content in that project, your implementation lead might be able to give you pointers. In this case, we'll just tell you: make an alias for Siddgeir in your quest, then on the relevant piece of dialogue, use the condition GetFactionRank, use JobJarlFaction as the parameter, check if the result is higher than -1, and instead of running on subject, run it on "Quest Alias" and specify your Siddgeir alias.
- Speaking of factions, isn't it annoying how Ruta will get up and applaud the bard for his performance? That might not be desirable AI behavior for her. In vanilla, the developers sometimes implement factions to disable certain kinds of radiant behaviors on specific NPCs. Search for "bard" in the faction category of the object window; which faction do you think you would put on Ruta to stop her audience behavior?
Final Words[edit]
- For the post-quest reward by courier, here are some pointers: RegisterForSingleUpdateGameTime, and Using the Vanilla Courier. You'll need to manually create a script for your quest, alongside the fragment script; see the Bethesda Scripting Tutorial for guidance on how to manually create a script. This new script will contain the OnUpdateGameTime event and run the code that spawns the courier. If this is too much right now, then just leave this part unimplemented and consider it extra credit.
- When testing, remember to COC from main menu every time to avoid interference from your previous testing session, as many aspects of the quest are baked into a saved game immediately. See Implementation Troubleshooting Reference for more tips.
- When you're done and everything works on your end, clean your plugin of any unnecessary or unintentional edits using xEdit. See the XEdit Tutorial and this AU lecture for an introduction. Do not use QuickAutoClean, you will have to get used to cleaning manually.
- Gather up your .esp and your scripts (both .pex and .psc in the appropriate folder structure), combine everything into a .zip and post it for us to see. Recording a gameplay video would also be of great help if you are comfortable doing that.