User:Thingy Person
Welcome to the Arcane Mystic assignment for quest and dialogue implementation, where you will implement the small settlement of Marlinsvik, situated on Skyrim's northwestern coast. Although the scope of the settlement has been kept small, it is still a beefy exercise, and by the time you're done, you will have familiarized yourself with a sizeable amount of Creation Kit elements that will be useful for a project and for your own mods.
The writing document folder for Marlinsvik can be found here:
And you can load this esp as your active file and build off of it. It contains level design for the village, although the houses are of course still unpopulated:
This document, originating from the Beyond Skyrim: Cyrodiil project, lists many of the required steps, although some of its contents go beyond the scope of this exercise. For the most part, you can rely on the instructions below.
The exercise can be divided into four parts, taking you across all of the essential steps in implementing a settlement:
- Basic setup of the NPCs and any data needed to make the settlement function
- Dialogue and scenes
- AI packages
- Quests
Setup
- Creation of the NPC records
- It is best to start with creating the Actor base records of the five NPCs (including the dog). Set them as "Unique", write their full name in "Name" and, if they have a surname, write only their first name in "Short name". EditorID should be of the format "<prefix>FirstnameLastname".
- Thankfully, you do not need to waste time recreating their faces, because the writer has supplied .npc files for them in the "Facedata" folder that you can import. Set the actor to any of the playable races so that the "Character Gen Parts" tab becomes visible. Under this tab, click the "Import" button and select the .npc file. This will take care of setting the correct race, sex, weight and face data.
- Wiske, being a child and thus not a playable race, does not have an .npc file, so you will have to improvise based on the written description.
- Gaubelin is described as an Elder, which is technically a separate race designed to look older than the playable races. The .npc file is for a Breton instead; after importing, you can try setting his race to an Elder, which preserves most elements, but arguably looks worse. You can decide how to go about this. Note that the Elder race does not distinguish between Nords and Bretons and doesn't confer racial bonuses.
- You will, however, need to configure the NPC's stats and inventory. Unique settlement NPCs tend to have static level, so don't use the "PC Level Mult" flag. A level between 5 and 10 seems appropriate for ordinary people; compare with NPCs from a similarly sized settlement like Shor's Stone for example. Combat-focused NPCs can be a bit more. You can use the "Auto calc stats" flag which will compute individual skills based on the level and their class. Set this class to something suitable rather than the default "EncDremoraMelee".
- For their inventory, pick an Outfit that seems suitable and ideally fits the written description. Sometimes, you may have to create a new Outfit, but this shouldn't be necessary here. It is generally good to add a "LootCitizenPockets..." leveled list to the inventory so that they have some randomized objects on them.
- For AI Data, make sure they at least help allies (i.e. close family) and possibly friends and allies.
- For Gaubelin, don't forget to give him spells. You have some leeway to be creative here.
- Once all NPCs have been created, set Relationships between them. Each pairing of NPCs that know each other should get a relationship if they are at least friends, or rivals.
- Pick an association type that best fits their relationship. For example, Jerome is not Wiske's father, but stands in for one, so arguably you could choose ParentChild. Family and lovers should get the "Ally" rank, others "Friend".
- The EditorID format is <prefix><Parentname><Childname>, where Parent is the "senior" NPC and Child the "junior" NPC. For association types that are essentially equal, the ordering is not important.
- Creation of Locations records
- A Location is an abstract piece of data that holds information which could potentially be used in radiant quests. Create a "<prefix>MarlinsvikLocation" location and give it suitable keywords describing what kind of location it is (you can look at the Shor's Stone location for reference). Make its parent the Haafingar location.
- Create Locations for each of the houses with the format "<prefix>Marlinsvik<Housename>". Since Gaubelin's shack has no interior, it doesn't need a Location. Set the Marlinsvik location from the previous step as the parent.
- Creation of Faction records
- Create a "<prefix>TownMarlinsvikFaction" faction and also a faction for each house with the format "<prefix>Marlinsvik<Housename>Faction". Again, Gaubelin doesn't need one.
- Apply the "Town" faction to each NPC and also apply the faction of the house that they reside in.
- Apply the relevant crime faction (i.e. CrimeFactionHaafingar) to every NPC and select it in the "Assigned crime faction" dropdown.
- Certain NPCs will need even more factions to enable all of their required functions, but we will do those in the next step.
- Creation of keys and lock lists
- Jerome and Caechabhu's houses will need to be locked at night or when they are out and about. Create a Key for each house with the format "<prefix>Marlinsvik<Housename>Key". You can duplicate a vanilla object so you don't have to manually specify a model and pickup sounds. Add an instance of the key to the inventory of the NPCs that live there... except for the dog.
- Next, create a FormList for each house with the format "<prefix>Marlinsvik<Housename>LockList". Fill this list with the Actor base records of the relevant NPCs.
- Apply it all to the cells
- Let's start with the exterior. Every cell that contains even a small part of the settlement should be marked as such. In the cell window, right click and "Edit" the cell. Set the Location to the <prefix>MarlinsvikLocation that you created. Also change the editorID to a convention like "<prefix>Marlinsvik01" if it isn't named that already. You can rename a cell by single clicking the name in the cell window.
- Load up a house interior. Set the Location to that house's location. Then in the Interior Data tab, set "Owner Faction" to the house faction you created, and "Lock List" to the respective lock list.
- Edit the door. Give it a Lock that is tied to the key you created; the lock level can be Novice for commoners such as these. Also set the owner faction to the house faction. It is crucial for the inside reference of the door to be owned in this way for trespassing to work properly.
- Place the NPCs near the beds where they sleep. Set the faction of the bed to that NPC so that nobody else will sleep there. Edit the NPC's ref and name it "<prefix><NPCname>REF" (this makes it show up in-game with the "help" console command, making it easy to teleport to the NPC if needed). Then, under the "Persistence location" tab, set the dropdown to the <prefix>MarlinsvikLocation. This controls when the NPC is persistent, i.e. having its pathing calculated by the game even if not in the currently loaded area. Choosing this as the persist location means the NPC is processed if any part of Marlinsvik's exterior or interior is currently loaded. In your .esp, all references are persistent at all times anyway, but when an .esp gets merged into an .esm file like in a project, that is no longer a case. If NPCs for some reason aren't coming out of their houses even though they should, this is often why. Also, the "Unique actor" fill method in quest aliases has been found to fail sometimes if the NPC ref doesn't have a persist location.
- In the exterior, set the ownership of any somewhat valuable item to the <prefix>TownMarlinsvikFaction so that it can't be taken without it being considered stealing. You can use the Batch Assignment tool to save some time.
- For the interiors, the cell's owning faction takes care of this automatically. Since Gaubelin's shack has no interior, you will have to assign his posessions to him manually.
Dialogue and scenes
- You will have a single start game enabled quest called <prefix>DialogueMarlinsvik that holds all the regular, non-quest related dialogue for this settlement.
- Greetings and Farewells go under the Misc tab. Create a topic of subtype "Hello"; this will contain all the greetings for 'all' the NPCs in a single stack of Infos. Same with the Farewells, which go in the subtybe "Goodbye".
- In Skyrim, unique NPC greetings usually just get a reset timer, typically of 0.5 hours. This means they are heard in sequence until they have all had a turn and the NPC drops down to generic lines ("Yes?", "Need something?" and so on) until half an in-game hour has passed and the lines reset. That said, writers often do not write greetings and farewells with a specific order in mind, so giving them the Random flag is an option. If you do this, be sure to set Random End on the NPC's last line in the stack, or generic lines will be interspersed with the unqiue ones.
- Implement standard dialogue in the Player Dialogue tab (or Dialogue Views if you prefer). There is no standard EditorID naming scheme used consistently in the base game, but try to stick something sensible like "<prefix><Questname><NPCname><branchname><Topicindex>".
- Refer to the list of Condition Functions for any non-standard implementation notes that the writer has asked for.
- Sadly, there is no button or condition in the CK for "unlocking" dialogue branches, so this will have to be scripted. If a dialogue line locks (or unlocks) another dialogue branch, make a quest stage for it, and add a note saying e.g. "Locks PARENTS in Wiske's dialogue" as either a fragment script or a journal entry (since this quest won't show up in the journal anyway). Then have the line set that stage, and for the dialogue that gets locked (or unlocked), use the GetStageDone condition. This means it'll work even if the stages are not set in a numerically ascending order.
- Occasionally, a writer may specify that dialogue should be locked or unlocked when it is not actually needed to script quest stages to do so. You always have the capacity to decide what the most elegant way to implement a given piece of dialogue is.
- Gaubelin has an "Initial dialogue" section that is a little bit different. The conversation begins with him, not with a player dialogue option. This needs to be implemented as a Blocking Branch. A vanilla example of this is Idolaf Battle-Born's dialogue.
- The "Alias=Player" text will work even without making a quest alias for the player; see Text Replacement.
- One of Gaubelin's greetings is specified to be valid only while the initial dialogue tree has not been gone through. However, by default, the first line from the blocking branch will be used as the greeting, even if the player is just walking past without initiating dialogue, leaving the custom greeting with no opportunity to be heard. This is why you have to put the IsInDialogueWithPlayer condition on the blocking branch dialogue.
- Caechabhu is a merchant, so refer to the Creating a Merchant tutorial. Her dialogue doc specifies a "What have you got for sale?" topic, but you do not need to add this, since the "JobMerchantFaction" takes care of it. Since Caechabhu is a fletcher, you additionally need to give her the "JobFletcherFaction" so she has the fletcher-specific dialogue lines. Also use the fletcher buy/sell list on her services faction.
- Similarly, Gaubelin's "I'd like training in Alchemy" topic is also handled entirely by factions, but don't give him the factions just yet, since his services are a quest reward.
- Projects will have their own generic dialogue lines and will thus have custom "Job" factions that you will need to use.
- Greetings and Farewells go under the Misc tab. Create a topic of subtype "Hello"; this will contain all the greetings for 'all' the NPCs in a single stack of Infos. Same with the Farewells, which go in the subtybe "Goodbye".
- Scenes are done differently (see also Bethesda Tutorial Scenes). Here, there are only three, although usually there are more.
- The first scene is a major establisher. This is a scene that starts the game enabled and is manually choreographed. The NPCs will take up positions (determined by packages pointing to XMarkerHeadings that you need to place) and wait day and night for the player to come by and hear their dialogue, giving the first impression of the themes of the settlement. There will usually be an initial scene phase before dialogue that only finishes when the player enters a trigger volume around the markers, so that dialogue doesn't start until the player is reasonably within earshot.
- In dialogue actions, set a headtrack target pointing to whoever the NPC is talking to. It is also often a good idea to put empty dialogue actions for the other NPCs to make them headtrack whoever is talking.
- For Nabuco's bark, you can use a vanilla Shared Info (using the "Share response data from info" dropdown) that will give you a standard dog bark with no visible subtitle. Such infos can be found in the quest CreatureDialogueDog.
- You should put this scene in its own quest, and stop the quest when the scene is done (the "Stop quest on end" flag on the scene can be used for this). The reason for this is that the quest aliases needed for the scene make the NPCs persistent as long as the quest is running. Although, again, all references in an esp file will be persistent at all times.
- The other two scenes are random conversations. We will let the game engine trigger these for us whenever two NPCs get within talking range of each other. The trigger mechanism is the Story Manager (see also the Bethesda Tutorial Story Manager). Each of these scenes will be in its own quest. The steps for setting it up are as follows. Take any vanilla dialogue scene quest to compare with if needed.
- Make the quest and set the Event dropdown to "Actor Dialogue Event".
- Create four aliases: two that are filled with Event Data: Actor 1 and 2 respectively, and both have conditions: GetIsID <The first NPC> OR GetIsID <The second NPC>. This is to ascertain that the story manager is giving you the correct two NPCs for this scene as its event data. You must flag these aliases "Allow reuse". Then you also need two more aliases for the NPCs and give them the "unique actor" fill type. These are the aliases you will actually use in the scene. This is because, although you have made sure that the two NPCs in the event data are the right ones, you don't know in advance which is which.
- Create the scene and implement the writing. Mark the scene "Begin on quest start" and "Stop quest on end".
- In the Actor Dialogue story manager event node, rather than putting the scene somewhere inside the pre-existing network of branches, make a new branch node for your mod (marked "Shares event" in order to play nice) in the top level, and inside, a new quest node. Inside this quest node, you will put the two quests for the two random conversations in this assignment.
- The second random conversation is a 3x3 scene. This is an in-house invention where each dialogue phase will feature one random line out of three possibilities. Implementing this is easy: in a given dialogue action, have the dialogue topic contain three TopicInfos that are flagged "Random".
- The first scene is a major establisher. This is a scene that starts the game enabled and is manually choreographed. The NPCs will take up positions (determined by packages pointing to XMarkerHeadings that you need to place) and wait day and night for the player to come by and hear their dialogue, giving the first impression of the themes of the settlement. There will usually be an initial scene phase before dialogue that only finishes when the player enters a trigger volume around the markers, so that dialogue doesn't start until the player is reasonably within earshot.