Difference between revisions of "User:Thingy Person"

The Beyond Skyrim Wiki — Hosted by UESP
Jump to: navigation, search
(Setup)
Line 48: Line 48:
 
** 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 [https://ck.uesp.net/wiki/Batch_Assignment Batch Assignment] tool to save some time.
 
** 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 [https://ck.uesp.net/wiki/Batch_Assignment 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.
 
*** 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 [https://ck.uesp.net/wiki/Condition_Functions 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 [https://ck.uesp.net/wiki/GetStageDone GetStageDone] condition. This means it'll work even if the stages are not set in a numerically ascending order.

Revision as of 15:17, 19 November 2024

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.