Adding a Jail and enhancing Fallout's Crime System. Game: Fallout 3In the year 2017 a character I rolled, Janet Telia,
wound up going to jail. This was a real event, something which actually happened in her game. But this event was a one-time thing, quest-driven with one-time stages.
What if this were something which can happen at any time? Assuming the player-character commits a crime, of course, and is caught!
Fallout 3 does have a crime system, which is broken into Minor and Major crimes. Minor Crime includes stealing, trespassing, and pickpocketing. Major Crime includes assaults and murder. In the vanilla game, committing enough of either crime will cause a single NPC, or an entire faction of NPCs, to try killing our character at worst. If the NPC's AI Data is set to Unaggressive and Cowardly, this NPC will flee instead, but he or she will still record the PC's crime as Minor or Major. But this is all. Nobody will ever try to arrest us for random crimes.
My idea is similar to Elder Scrolls games. This idea will include the usual three choices: Go to Jail, Pay Caps, or Resist Arrest. But, there is a difference too: the way I'm going to describe this below, our player-character can only get arrested in Megaton. Maybe in the future I'll also add Rivet City. But no psychic guards shall roam the Capitol Wasteland, unless you want them to.
The main difference between the way crime works in Fallout (as opposed to any Elder Scrolls game except Arena) is Fallout's Crime Counts never go away, whereas in Elder Scrolls it is possible to get Crime Gold to 0. If your character is caught stealing from somebody in Elder Scrolls IV: Oblivion for instance, it is possible to pay some money or go to jail. This will clear any crimes, returning the game's crime count to zero.
In Fallout,
crime counts always remain. If your character is caught stealing in this game, and let's say MinorCrimeCount rises to 5.00, this is where the count shall stay forever. As far as I know, there is no way to get this count back to 0.00.
...And this creates some problems, of course. GetMinorCrimeCount and GetMajorCrimeCount exist, but there is no such thing as SetMinorCrimeCount or SetMajorCrimeCount, or anything equivalent with a different set of names. Because of this, the scripts for this jail idea get longer and longer, in an effort to make sure the officer keeps registering how much crime has been committed. The end result? Eventually the criminal essentially becomes 'banned' from Megaton. It has to happen this way, unless somebody out there figures how to script better than i can!
I don't know if the FOSE team has done anything here for resetting crime; my search of a
Fallout Script Extender site did not return any results for crime at all.
Good news is, any NPCs who have been angered by crimes (causing them to fight) eventually will mellow. Bethesda hardcoded Fallout 3 this way, probably because they had to so gamers could progress with some of the game's quests. After 72 hours, even the most fearsome NPC will regain his or her temper, and it's possible to reenter the cell in which this NPC can be found.
Basically, they forgive, but they never forget.
-----------------------------------------------------
MAKING THE JAIL1a). First step is to duplicate a cell, or create one from scratch. I am not very good at making cells from scratch, so instead I'll simply duplicate MegatonJerichosHouse. I like this cell because it is like a mobile home: everything is on one story. Easier to work with. Jericho's house is also separated conveniently into a larger immediate area + a smaller alcove which has a bed. The smaller area is going to be the actual prisoner's cell, while the larger area will include a bot who eventually will patrol around.
I found one small problem with duplicating Jericho's pad. In the Test character save I used, a second Jericho showed up in my game, despite the fact that I deleted Jericho from the duplicated cell. Once I realized this anomaly, I used the console to Mark For Delete the duplicated Jericho, once I was back in the game. This did not happen in any of my main characters game I've loaded so far, only the test character.
1b). Back to the GECK. In the Cell window's left panel, select the duplicated cell and press F2. Change the cell's name. I am calling it aaaMegatonJail.
1c). Right-click > Edit the duplicated cell. Click on the Interior Data tab and change its Name. I am calling it Megaton Jail. Also, change the Owner NPC scroll-bar from whomever is its current owner (if there is one) to NONE. If the cell is owned by a faction, set this to NONE. There is going to be an NPC who does own this place, but he or she has not been made yet. And it's better to use somebody new, rather than one of the vanilla NPCs already in the game.
Click Apply, click OK.
1d). Now comes the fun part. Time to remove whatever items you'd like. Or, you can keep any items you are unsure about, moving them out into the void.
Turns out, Jericho's place is not large enough. So I toggled Snap to Grid and Snap to Angle on. Then I selected a portion of its middle section, duplicated it, moved the area where the jail cell shall be (extending the cell's middle), and then moved the duplicated area into the initial area.
Here is what the jail looks like so far, with NavMesh turned on.
I did not mess with the area on the left side of the cell. This is where a robot is eventually going to patrol. Note the red stuff on the floor. This is
navmesh. Navmesh tells NPCs where they can walk, and where they cannot. Since the robot is never going to travel into the area where the prisoner stays (which is on the right side of the cell) it's not important that there's no navmesh there.
> If there is an owned bed already inside the cell, change its Ownership to Player.
> I also added a sink into the jail. Since I use Realistic Needs, my character will need to drink occasionally, and water is one thing which is always free in jails. But what about food? Don't worry. Food gets handled, too.
Time to deal with
NavMesh. Although I am not messing with navmesh in the cell I just duplicated, I left some instructions below for those who want (or need) to change this. Note that working with navmesh takes practice. And practice takes time. Those who don't need to mess with this can skip to step 1f.
1e). From the main toolbar, select NavMesh and then select Remove Cell NavMeshes, which is roughly halfway down the list.
New NavMesh must now be generated, and this gets complicated, but is very important. NavMesh is what allows NPCs to walk over specific areas, it is also supposed to keep them from walking into inanimate objects such as walls and rocks (though sometimes they still do this). If new NavMesh is not added, any NPCs who enter this cell, or are placed into it, won't be able to move.

Yes, this happened to me!
Describing how to add NavMesh requires some visual aids, so watch the video below, following the Anonymous Dev's instructions.
https://www.youtube.com/watch?v=RYJAj-63FR4Note that in most cases (esp. with duplicated cells), new navmesh is not 100% necessary, for those who wish to skip this step and save time.
Tip: Turn Snap to Grid and Snap to Angle back on, if these have been turned off for NavMeshing.
1f).
OBJECT windowNow to add the jail's cell door. This is going to be a sliding door, which can lock and unlock. In the Object window's left panel, select All, and then type Jail in the Filter slot. Find and select JailDoor01. Drag the jail's door into your cell. Obviously it's important to make sure this door will block the area where the prisoner will stay. Since one door was not enough to block the way out, I duplicated the first door, and moved the duplicated door over.
1g) Give the door a Reference ID. I named it aaaMegatonCellDoorRef. Copy this Reference ID and paste it onto a Notepad page. In fact, it helps to copy/paste any referenced names like this, since they will later get used in scripts.
Toggle Persistent Reference on. Click OK.
1h). Get JailDoor01 out of the filter and select Items > Key. Edit a key. Doesn't matter which one, but try to select keys which don't already have scripts attached.
Edit the jail door so that only this key will open it.
1i). In the CELL window, there are some choices. It is possible to put a door on an empty space of building, anywhere in Megaton, therefore, the prisoner is in Megaton when he/she gets out of jail. I decided to take this several steps further. Used the Render window and went out into the Wilderness, somewhat west of Vault 101. Then I went into the Object window > World Objects > Static, and dragged MegatonMisterBurkesHouse out into the wasteland.
Next I found MetalScrapDoor01 and dragged this door into the Render window. Connected this door to the cell's entrance door. The reason I made the jail way out yonder is because spending time in jail won't clear one's bounty (or crime count, as the GECK likes to call it) and I originally had problems with the main officer (who has not been made yet) still trying to arrest us after we get out of jail. Later on, I fixed this problem. But in roleplay terms, it just makes more sense that the player-character is temporarily removed from Megaton society. This is not 100% necessary, so those who wish to put the jail in Megaton itself, this is fine.
Here is what the final Megaton Jail looks like in my game. Again, the right side of the cell (roughly 2/5 of the space) is where the PC gets locked up.
1j). Make sure the interior of the jail is in the Render window. Go into the Object window > World Objects > Container and drag any non-scripted container into the Render window. I dragged LockerVault01Empty in there.
1k). Double left-click on the container, and choose the Edit Base button. Rename its ID and Name. I am calling it aaaEvidenceLocker and Evidence Locker. It helps to make sure this container is completely empty, for this is where the player's stuff will get stored after being locked up.
1l). Make sure Respawns is not toggled on. Click OK, and save as a New Form.
1m). Go into the Ownership tab and choose Player. Give the container a Reference Editor ID (aaaEvidenceLockerRef), and toggle Persistent Reference on (if it's not already toggled).
1n). Two more steps. Go into the Object window > WorldObjects > Static and drag an XMarkerHeading into the jail. Put it the area where the prisoner shall stay. Essentially, put this marker behind bars.

Give this XMarkerHeading a Reference ID. I named it
aaaMegatonJailPlayerXMarker. Copy / paste this onto a Notepad page.
1o). Drag a second XMarkerHeading into the jail, but this time do not put it behind bars. This second marker is where the PC will get teleported, assuming greater crime has been noted. Essentially, the PC gets temporarily banned from Megaton, and will need to stay out of town for 3 days! I named this second marker
aaaMegatonJailBookingMarker. Copy/paste this also, so it can be copy/pasted into scripts later.
Click OK. Save.
MAKING THE OFFICERSOne or two officers are needed. I am opting for two. The first one will perform initial arrests, and the second assists in beating down the criminal, if he or she resists arrest. First I'll make the arresting officer. This gal will handle all the dialog, and she's much more complex than the second officer.
OBJECT window > Actors > NPC 2a). Follow all the usual steps for making an NPC: choose Race, Voice Type, ID, and Name. Click OK. My officer will be a lady with the ID name of aaaMegatonOfficer. I toggled Respawns on, so that if one of my characters wants to try to pwn her (and succeeds somehow), another officer will eventually take her place. Essential can also be chosen, of course.
Traits tab2b). Change Class to SecurityOfficer. This arranges the officer's stats and attributes in a particular way, making him or her ready and capable for the job. Change Alignment from Neutral to Good.
Stats tab2c). I wanted to make a tough, but not impossible-to-beat officer. So I selected PC Level Mult and put 3.00 into the Level Mult slot. AutoCalc Stats can be used as well, to make the officer stay truest to the SecurityOfficer class.
Factions Tab2d). The officer gets added into the MegatonResidentFaction, causing her to become part of the citizenry, occasionally making small talk with other Megatonites. Also add him or her into the MegatonCrimeFaction. This will cause the officer to recognize Minor or Major crimes committed against residents of Megaton. Both of these factions are necessary for the arrest process to function.
AI Data tab2e). Set the scroll-bars like so. It's important to make somebody who remains peaceful by default, but will not back down from combat if the need arises.
Aggression: Aggressive
Confidence: Brave
Assistance: Helps Nobody
Responsibility: 90
Assistance is set to Helps Nobody, which normally means the NPC won't care if Friends and Allies are getting into trouble, but this is not a problem, because we're going to want the officer to focus on arresting the player only. Not getting into combat with him or her. This part (combat) gets handled later on by scripts, if Resist Arrest gets chosen.
AI Packages tabAI does not need to get specifically added to the officer. I have tried to add a DefaultSandbox package, but this messes everything up later on. Instead...go to the ....
Main toolbar > Character > Packages2f). Start a Find package. Give it an ID and copy this ID. Paste the ID onto a Notepad page, because it's going to be needed later on. I just named it aaaArrestPlayerPackage
2g). Specific Reference is toggled on by default. In the Ref scroll-bar, scroll down to PlayerRef.
2h). Toggle Allow Search on. 'Near editor location' can stay toggled, Type 1024 into the Radius slot. This is roughly 48 feet (14.6 meters) which is not nearly the total diameter of Megaton. Technically it is possible for a criminal to avoid the officer after being witnessed committing some crime, but in my game, this is always a dice-roll. I put the officer in the middle of Megaton, but since she sandboxes around a little bit, my character and I will never know exactly where she is, assuming we're trying to avoid her somehow.
2i).
Flags tab: Toggle
Always Run on. Toggle Fallout Behavior off.
2j). Make a second package, this time selecting Sandbox. Simply pull up DefaultSandboxEditorLocation1024, rename its ID, and Save as a New Form. Nothing else needs to be changed, although some may wish to mess around with the Flags tab. I am calling this package
aaaMegatonOfficerSandbox. Copy this script and paste it onto that same Notepad page.
Click OK, close the Packages window, and save.
2k). Put the officer somewhere into the world (I chose ground zero of MegatonPlaza, right next to the Brass Lantern and bomb). Give him or her a Reference ID. I am calling her aaaMegatonOfficerRef.
The rest of the officer's tabs can be changed around however you'd like. I added ArmorTenpennySecurity and HatPoliceAdult to give her an appropriate look. I also gave her WeapPoliceBaton, a 10 mm handgun, and some 10 mm rounds.
Optional: add the jail door's key into his or her Inventory. This can now be stolen by a really good thief! It is possible to break out of jail if one has the key. It is also possible to write the upcoming quest so that breaking out of jail will cause more problems for the PC. This gets complicated though, and what's about to follow (the quest) is complicated enough. Getting everything to
work right is complicated enough!
Click OK and save.
2l). Go back into the officer's NPC panel. Start a script like so...
scriptname aaaMegatonOfficerScript
short Status2l). Close and save. Click OK, closing all officer's panels. Save, and reopen the officer. Find that script in the scroll-bar, bla bla. Reopen it.
Here is what it's going to look like...
scriptname aaaMegatonOfficerScript
; Status 0 -- No or low crime committed. Megaton officers sandbox. Most “good” PCs will remain at Status 0 forever.
; Status 1 -- Triggers during first arrest process. PC has been caught with their first crime, Major or Minor.
short Status
Begin GameMode
;----------------------------
;The scripts below deal specifically with the arrest process.
If (Player.GetInWorldspace MegatonWorld == 1) && (Status == 0)
If (GetMinorCrimeCount >= 3) || (GetMajorCrimeCount >= 1)
Set Status to 1
EndIf
EndIf
If (Status == 1)
aaaMegatonOfficerRef.AddScriptPackage aaaArrestPlayerPackage
EndIf
;--------------------------------
;The scripts below cause the officers to sandbox in Megaton, if the PC has not committed any crime yet.
If (Status == 0)
aaaMegatonOfficerRef.AddScriptPackage aaaMegatonOfficerSandbox
EndIf
End> To summarize. The first two scripts, when Status gets set to 1, cause the main officer to arrest our toon IF our toon has committed a certain number of Minor or Major crimes. The third script is used to make sure the officer does NOT rush up to the PC if no crimes have been committed. She should not do this even without the script, but the Status 0 script confirms things.
> Status always starts at 0, assuming this is a new game without any criminal catches, or if one has a character who has never been caught doing any crimes, yet.
For those who add this Jail mod idea to your game. If the main officer comes rushing up once your character enters Megaton, you may
think there's an error here. But try toggling the console on, and then click on the arresting officer. Type GetMinorCrimeCount and press Enter. Do the same with GetMajorCrimeCount. Chances are, one or both of these will be high enough to cause the officer's behavior. And this is because your character has already committed some crime(s) in the past. Yes, this happened to me.

Like I said before, Fallout NPCs may forgive past crimes, but they never forget.
> Notice there is some leeway for minor crimes. The officer will do nothing if minor is below 3. This allows the PC to make a mistake. If trying to speak to an NPC for instance, but accidentally wind up stealing an owned object, the officer won't automatically come after the PC, assuming this happens just once. Stealing just one item can tally 1.00 or 2.00, so let's make 3.00 the official number of confrontation.
> Major crimes, on the other hand, will be regarded more quickly. If somebody slaps, slams, or shoots someone else, chances are they did so deliberately. Feel free to nudge either of these numbers to your liking.
> Major Crime works in a different manner than Minor Crime. If we are witnessed stealing our first item, Minor moves from 0.00 to 1.00 or 2.00. If we steal a second item and are witnessed, that number moves upward again. Major Crime is not as predictable. Sometimes it moves upward, and sometimes it does not. My test character assaulted and killed the Mercenary who stays in Craterside Supply for instance, causing Moira Brown to flee her shop. Major Crime jumped from 0.00 to 2.00. In an Elder Scrolls game, Crimegold would get much higher than this for a full-blown murder. Because of this, Major Crime's counts (in scripts below) is set up differently than the more-predictable Minor Crime.
A second NPC was killed by my Test guy, this time right in Megaton's central area. This time, Major Crime jumped from 2.00 to 6.00. I think the greater number resulted because there were more witnesses. ... So, it's hard to find an apt punishment which fits the major crime. Pwning that Mercenary resulted a Major of 2.00, which means somebody can get off lightly...200 caps paid, the way I've got this set up below, if nobody witnesses this pwning. This doesn't seem enough, right? But there's not much I can do about this; Beth hardcoded the way crime works in this game. Anyway, we'll get to all that later.
> Finally, note that there are rare times when the officer will have a different crime count than ordinary Megaton NPCs. ...Maybe clicking a Megaton Settler, and then checking for crimes with the console will yield a result of 0.00 or 2.00, whereas the officer will register 4.00. So always click on the arresting officer when trying to check for crime.
All of that is rather complicated, right?

Fortunately, the second officer is much simpler...
2m). Make a second NPC. This is going to be the officer who assists the main (arresting) officer, smacking our character around if Resist Arrest is chosen. In my game, this is a man with aaaComplianceOfficer as an ID.
2n). Toggle Respawns on, click OK, and reopen the officer.
The rest of those tabs can be arranged however you'd like, but make sure the second officer goes into the same MegatonResidentFaction and MegatonCrimeFaction as the arresting officer.
Place him or her into the same worldspace as the arresting officer and type a Reference ID. I called him aaaComplianceOfficerRef.
MAKING THE QUESTOBJECT window > Actor Data > Quest3a). Start a new quest (duh). ID is necessary, but Name is not. I am calling it aaaJailFallout3Quest.
Priority can be 90, just like it is in Elder Scrolls games when Legions try to arrest us. In theory, getting arrested takes precedence over everything, including the Main Quest, possibly.
3b). Start Game Enabled can stay on. Also, toggle Allow Repeated Conversation Topics on. Script Processing Delay can also be toggled.
3c). Start a script, like so...
scriptname aaaJailScript
short Arrest
short Timer1
short Timer2
short Timer3
short Timer4
short Timer5
short StartDay1
short StartDay2
short StartDay3
short StartDay4
short StartDay53d) Set the Script Type scroll-bar to Quest and close the editor window. Click OK, closing the Quest window. Reopen it, and find the quest in the scroll-bar. Click OK, and reopen.
Now we're going to add some more.
scriptname aaaJailScript
short Arrest
short Timer1
short Timer2
short Timer3
short Timer4
short Timer5
short StartDay1
short StartDay2
short StartDay3
short StartDay4
short StartDay5
Begin GameMode
;------------------------------------
;The script below deals with stopping combat against he PC, once the PC has paid for crimes.
;NPCs will sometimes try to fight the PC after crime has been committed. This script stops these fights.
If (Player.GetInWorldspace MegatonWorld == 1) && (aaaMegatonOfficerRef.Status != 8)
PlayerRef.StopCombatAlarmOnActor
EndIf
EndAs noted, the StopCombatOnActor script will cause any angry NPCs (who are trying to kill our PC after too many crimes committed) to STOP combat once the PC is in Megaton's plaza area, assuming the Officer's Status is not 8 (meaning the PC has not been banned from Megaton, yet). This will allow the officer to attempt arresting the PC without hassle. If this script is not used, and NPCs are actively trying to fight our character, this causes the officer to get confused, unable to deliver any dialog.
Note that this is OPTIONAL. For those who want to have NPCs fighting their characters in Megaton's plaza area at any time after crime, this script can be omitted. Again, the officer won't be able to do his/her job if this script is not present. 3e). Close and save the script. Click OK, closing the quest window. Save from the main toolbar. Reopen the quest. More is going to get added to this main script, but for now let's move on.
Topics Tab3f). Make a GREETING. This first greeting is going to be a generic sort which the officer says if the PC is not wanted for any crimes. "Lovely day, isn't it?" or whatever. Toggle Goodbye on. Conditions go like this...
GetMinorCrimeCount < 3.00 AND
GetMajorCrimeCount < 1.00 AND
GetIsID aaaMegatonOfficer == 1.00And that is all. Since Goodbye is toggled on, the officer will say this if we speak to her or him, without any dialog menus popping up, just like speaking to a Megaton Settler.
3g). Make a second GREETING. This one is much going to be much more interesting. The officer will say this one when first confronting the PC, during the arrest process. "STOP!!! You violated the law!"... Make some dialog which explains that pickpocketing, stealing, trespassing, assaults, and murder are all against the law. "You can pay me caps, go to jail, or resist arrest..."
Three conditions are needed...
GetMajorCrimeCount >= 1.00 OR
GetMinorCrimeCount>= 3.00 AND
GetScriptVariable aaaMegatonOfficerRef.Status == 1.00 OR
GetScriptVariable aaaMegatonOfficerRef.Status == 6.00
GetIsID aaaMegatonOfficer == 1.003h). In this greeting's Choices window, add three topics: aaaPayCaps, aaaGoToJail, and aaaResistArrest. Add these into the Editor ID window, as well.
3i). Let's start with the least threatening of those three choices: Pay Caps can go into the Topic Text slot. "You're being arrested for committing one or more crimes against the citizens and settlers of Megaton.... you really need to watch yourself...." and so on. Type some text explaining how much will need to be paid. In my game, lesser minor crimes start at 50 caps, while a full-on repeated assault or murder can rate as high as a thousand. I went into some detail, making sure the officer explained all the rules in her dialog.
Overall, I wound up with four scenarios: lesser Minor Crimes, greater Minor Crimes, lesser Major Crimes, and greater Major Crimes. If a character commits just one assault, or steals a couple items (and is caught) lesser Major or Minor crime gets registered. It is possible for a well-meaning character to simply pay for this one crime, never commit another one, and "lesser" crime where his or her crime counts shall stay.
If more crime gets committed, more than one or two incidents, this causes a greater scenario of Minor and/or Major crimes. Here we have somebody who is more of a dedicated criminal, so here is where their reputation shall stay: paying more money if caught, and going to jail for longer periods, as well.
Basically, lesser crime is only committed once. If the character continues to commit more crime, all subsequent arrests will be considered greater. Conditions: only one is needed, the same
GetIsID aaaMegatonOfficer == 1.00 as before.
3j). In the Add Topics window, add aaaPayCapsTopic2. Conversely, this can be added into the Choices window, along with aaaGoToJail and aaaResistArrest, for those who wish to retain maximum options.
3k). Add aaaPayCapsTopic2 into the Editor ID, and change Topic Text to "I am paying for my crimes. Here are your caps."
Dialog should be written in a way which warns the PC. If NPCs have started combat, they will have ceased due to that StopCombat script added into the main script IF the PC is in Megaton's plaza area. But they might resume fighting our character once the PC is back in some other cell. So her dialog goes:"If you have enough caps to pay for your crimes, you will be free to go, but it might be a good idea to get out of town for awhile. I'd recommend 3 days or more..."I have noted four scenarios for crime above. Overall, eight dialogs can be written for this topic; four for Minor Crime, and four for Major Crime. Let's start with Minor Crimes. Here are the four scenarios for lesser and greater Minor Crimes.
1). the PC has enough caps, and needs to clear less than 5.00 of minor crimes
2). the PC has enough caps and needs to clear 5.00 or more .. ." .. " .... "
3). the PC does not have 50 caps, for situation 1.
4). the PC does not have 100 caps, for situation 2.
Selections 1 and 2 require conditions as follows...
GetIsID aaaMegatonOfficer == 1.00 AND
GetMinorCrimeCount >= 2.00 AND
GetMinorCrimeCount < 5.00 AND
GetGold Reference: Player >= 50.00or
GetIsID aaaMegatonOfficer == 1.00 AND
GetMinorCrimeCount >= 5.00 AND
GetGold Reference: Player >= 100.003l). In the Result Script (Begin) box, type
Player.RemoveItem Caps001 50 or
Player.RemoveItem Caps001 100 respectively.
3m). In the Result Script (End) box for lesser Minor Crime type
Set aaaMegatonOfficerRef.Status to 2.
3n).In the Result Script (Begin) box for greater Minor Crime, add
Set aaaJailFallout3Quest.Arrest to 5 below the Remove Caps script.
3o). In the Result Script (End) box for greater Minor Crime, add
Player.MoveTo aaaJailBookingXMarkerHeading
If (aaaMegatonOfficerRef.Status == 1)
Set aaaMegatonOfficerRef.Status to 4
EndIF
3p). The final two situations, in which there aren't enough caps, can use the same GetIsIDs and GetMinorCrimeCounts, all of those can literally be CopyAll/pasted. But change GetGold to less than 50 caps, or less than 100 caps, depending on the amount of Minor Crimes allotted.
For either of these situations, add aaaGoToJail and aaaResistArrest into their Choice windows.
Click OK and save.
Steps 3i through 3p can be followed for Major Crime as well, making whatever changes you'd prefer. Obviously, paying caps for an assault or murder will be much more serious. In my game, committing one or two assaults (less than 5.00 of Major Crime) will require 200 caps of payment. Committing more than two assaults indicates that somebody was aggressive enough to try killing somebody, or seriously maiming him or her. The officer is going want a thousand caps to clear one's name.
This may sound harsh, but consider the fact that no NPC in Megaton is ever going to assault one of our characters. Only the Player (us) can commit crimes in Fallout 3. We are always the instigators. In TES IV: Oblivion, some NPCs could commit crimes and pay for them with their lives, Tilmo the Stablehand and City Swimmer are two perfect examples. Since food was not added into their inventories, they'd occasionally try to fill their bellies, which meant they'd steal whatever they could. Beth made sure to "fix" this for Fallout 3, which means NPCs can never commit true crimes in this latter game.
Note that pwning Mister Burke should be okay, since he is not part of any Megaton factions. I have not tested this personally though.
Conditions for the lesser Major Crime look like this...
GetIsID aaaMegatonOfficer == 1.00 AND
GetMajorCrimeCount >= 1.00 AND
GetMajorCrimeCount < 5.00 AND
GetGold Reference: Player >= 200Conditions for greater Major Crime ...
GetIsID aaaMegatonOfficer == 1.00 AND
GetMajorCrimeCount >= 5.00 AND
GetGold Reference: Player >= 1000And don't forget to add the appropriate amount of caps removed in the Result Script (Begin) box.
Add
Set aaaMegatonOfficerRef.Status to 2 into the Result Script (End) for lesser Major Crime.
Add
Set aaaJailFallout3Quest.Arrest to 5 in the Result Script (Begin) box for greater Major Crime.
Add ...
Player.MoveTo aaaJailBookingXMarkerHeading
If (aaaMegatonOfficerRef.Status == 1)
Set aaaMegatonOfficerRef.Status to 4
EndIF
...in the Result Script (End) box for greater Major Crime.
3q). Toggle Goodbye on for both. Click OK and save.
Unfortunately, the game does not separate assaults and murders into two separate categories; both of these are considered Major Crime. So at this writing, I do not know how to make murders much more serious (more time, more caps needed) from assaults. The game does include several functions which include Murder and Killer (such as IsKiller) but all of these require reference IDs on NPCs to work, instead of simply working globally. I'm not adding a reference to every NPC in Megaton, that's silly.
The answer for now is to set a higher level of Major Crime, which breaks down into lots of assaults or one (or more than one) murder, at least as far as dialog is concerned.
3u). Make a third GREETING for the officer. This will be the final one, which she says if spoken to, after an arrest process has been completed (caps paid, time spent in jail). In my game, she simply says "I've got my eye on you..."
3v).. Toggle Goodbye on. Conditions go like this...
GetIsID aaaMegatonOfficer == 1.00 AND
GetScriptVariable aaaMegatonOfficerRef.Status == 2.00 OR
GetScriptVariable aaaMegatonOfficerRef.Status == 5.00 OR
GetScriptVariable aaaMegatonOfficerRef.Status == 7.00RENDER window4a). Go into the jail's cell. In the Object window edit a note.
4b). Describe some rules about how crime works in Megaton, and what is expected of the prisoner upon release. Basically, this is a list of rules. Something which explains how long each sentence shall last, corresponding to what sort of crime has been processed. Anything which the character possessed before arrest has now been put into that Evidence Locker, so explain this in the note's text as well.
Since a robot is going to get added into the jail, add some text explaining that the robot is who we'll speak to for food, cigarettes, and also to get out of jail when the sentence is over. There will eventually be an actual game message which explains how to get out of jail, too. All of that is coming.
4c). Drag this note into the jail's cell, behind bars. Make sure the note has Player Ownership!
OBJECT window > Actor Data > Quest5a). Go into the Topics tab and find aaaGoToJail. This topic is somewhat simpler than paying caps, fortunately. Four Infos will need to be written up instead of eight. Each of these four Infos correspond to lesser or greater Minor Crime, or lesser / greater Major Crime.
Go To Jail can be added into the Topic Text slot.
The first Info is going to be used for Minor Crime less than 5. For most characters who aren't full criminals, but have made a slip-up, this is going to be the jail term for a first offense. "You've made some mistakes, it happens. Just make sure it doesn't happen again." In my game, the penalty for this is just one day. "I hereby sentence you to the term of one day..." the officer says.
GetIsId aaaMegatonOfficer == 1.00 AND
GetMinorCrimeCount >= 2.00 AND
GetMinorCrimeCount < 5.00Toggle Goodbye on.
5b). In the Result Script (Begin) type or paste
Set aaaFallout3Quest.Arrest to 1
aaaMegatonCellDoorRef.Lock 100
aaaMegatonCellDoorRef.SetOpenState 0.
5c). In the Result Script (End) box type
Player.RemoveAllItems aaaEvidenceLockerRef
Player.AddItem OutfitWasteland01 1
Player.MoveTo aaaMegatonJailPlayerXMarker
Set aaaMegatonOfficerRef.Status to 2All the PC's items are removed and stored into that locker. Any stolen items should have also been removed by this point, and erased entirely from the game, however, sometimes they might slip by the officer or any NPCs who initially witnessed any crime(s).
OutfitWasteland01 is what the PC wears while in jail. It is important to make sure RemoveAllItems comes before the player gets that jail outfit, otherwise the game will remove these clothes as well. 5d) Three more Infos can get added: one for Minor Crimes of 5.00 or more, one for Major Crimes of less than 5.00, and one for Major Crime of 5 or more. Technically, these greater major crimes can equate to attempted murder or actual murder. These three infos will tally three days, ten days, and one month in jail respectively.
5e). Let's start with Minor Crimes greater than 4.00. Dialog can be more menacing. Our toon has stolen or pickpocketed
multiple items, or trespassed for an extreme amount of time, ignoring somebody's warnings about this. So the officer isn't so nice. "You dirty thief. You mongrel of a trespasser. You have committed several minor crimes against the residents of Megaton. You are going to be incarcerated for three whole days.... "
GetIsID aaaMegatonOfficer == 1.00 AND
GetMinorCrimeCount >= 5.005f). Now,
Set aaaJailFallout3Quest.Arrest to 2 goes into the Result Script (Begin) box instead of aaaJailFallout3Quest.Arrest to 1. Make sure
aaaMegatonCellDoorRef.Lock 100 goes into this box, as well.
5g). Three of the four scripts which went into the lesser Minor Crime Result Script (End) box can simply be copy/pasted. Do not copy/paste the aaaMegatonOfficerRef.Status script.
5h). Follow the same process for Major Crime, making sure to change
Set aaaJailFallout3Quest.Arrest to 3 and
4 respectively, for lesser and greater. Everything else gets copy/pasted, but again, leave the officer's Status script out of greater Major Crime's (End) box.
Click OK and save. Now, to make the officers fight our character, if Resist Arrest is chosen.
Main toolbar > Character > Packages6a). Start a new package. I'm going to name its ID aaaResistArrestPackage.
6b). Change Package Type to Use Weapon.
6c). Toggle Any Object on, and find whichever weapon the officer shall use in the Object ID scroll-bar. I put WeapPoliceBaton in there. The weapon used in this bar MUST also be a weapon in the officer's inventory, otherwise the officer will simply try to use their fists. Note that if the officer has a second weapon (such as a gun) the officer may switch to this weapon type, especially if the first weapon is a melee piece, and some distance is involved.
6d). Toggle Target on, and find PlayerRef in the Ref scrollbar.
6e). In the Fire Count area there are two choices: Repeat Fire will cause the officer to keep using that weapon indefinitely, as long as the package is running. Number of blows will cause them to stop after X number of weapon swings, or rounds have been fired.
6f). Flags tab: toggle Always Run, and Weapon Drawn on. Enable Fallout Behaviour gets toggled completely off.
6g). Click OK. This package should
not be attached to the officer, it will (instead) be triggered through a script.
Reopen the Quest window.
7a). aaaResistArrest is the final topic, and it's the easiest of all; we only need one Info. Type some menacing dialog. Since a second officer is going to join beating down the PC, this dialog should include that information. "You want to resist? Fine. But now my deputy is going to assist!"
GetIsID aaaMegatonOfficer == 1.00 AND
GetMajorCrimeCount >= 1.00 OR
GetMinorCrimeCount >= 1.007b). In the Result Script (End) box type
Set aaaMegatonOfficerRef.Status to 37c). Toggle Goodbye on, Click OK. save.
Note:
If other Megaton NPCs have also begun to attack before the arrest, they will continue to do so, unless the main script gets modified to include Status 3 as well as Status 2! However, they generally will not follow us out into the Wasteland.I and an online friend have experimented with Resist Arrest quite a lot, going in and out of various cells and whatnot, just to see how far the officers will keep following our characters, continuing pursuit. Since NPCs don't follow the PC very well into different cells in this game, it is possible to run into (let's say) Moriarty's and get a breather, maybe use a Stimpack, assuming no other NPCs are attacking. It is also possible to leave this portion of the quest as-is. Yes, the officers have trouble following, but the problem is, eventually they WILL follow. And they'll follow
everywhere, including the wasteland.
This will get fixed later on via scripts. Or you can just leave it this way, for those who want to try to pwn the officers outside of society. If they happen to follow us outside of Megaton, and encounter some enemy. Let's say, a radscorp. They will focus then on fighting this radscorp instead of us. Eventually it'll be their doom, if this doesn't get fixed later on.
Another possibility is to make other referenced NPCs (such as Jericho and Lucas Simms) join in the fight while our toon resists arrest! I have not added this into my game, but for those who want to make a real hardcore option, this is possible too.
But first, here's how to get the officers to do their beat-down.
7d). Open up the main (arresting) officer's script. Some of this has already been written during a previous step. Gonna add a lot more now!
scriptname aaaMegatonOfficerScript
; Status 0 -- Not enough crime witnessed. Officers sandbox. Most “good” PCs remain Status 0 forever.
; Status 1 -- The PC has possibly been caught committing their first crime, Major or Minor.
; Status 2 -- Caps paid or jail chosen for 'lesser' Minor or Major crime. PC stays in Megaton if caps paid.
; Status 3 -- Resist Arrest chosen. 3-day timer starts, officers fight PC if Megaton's plaza entered.
; Status 4 -- Caps paid for 'greater' Minor or Major crime. PC teleported to "booking" area of jail.
; Officers will revert to Status 3 if PC re enters Megaton, while Status is 4.
; Status 5 -- Timer concludes after 3 days, causing officers to sandbox. 5 Can result from Status 3 or 4.
; Status 6 -- Next-to-last arrest process. Works in similar way as Status 1.
; Status 7 -- Last strike. If PC is arrested during 7, cannot reenter Megaton without getting attacked.
; Status 8 -- PC is 'banned' from Megaton. :-(
short Status
Begin GameMode
;------------------------------------------------------------
; Status 1 handles the first "lesser" arrest process
; if PC is caught committing at least two Minor, or one Major crime.
; PC remains in Megaton
If (Status == 0) && (Player.GetInWorldspace MegatonWorld == 1)
If (GetMinorCrimeCount >= 3) || (GetMajorCrimeCount >= 1)
Set Status to 1
EndIf
EndIf
If (Status == 1)
aaaMegatonOfficerRef.AddScriptPackage aaaArrestPlayerPackage
EndIf
;---------------------------------
; Status 2 causes the main officer to sandbox after arrest has taken place from Status 0 to 1.
; Triggers from lesser crime.
; PC remains in Megaton, unless he/she also went to jail.
If (Status == 2)
If (GetMinorCrimeCount < 5) || (GetMajorCrimeCount < 4)
aaaMegatonOfficerRef.AddScriptPackage aaaMegatonOfficerSandbox
EndIf
EndIf
;---------------------------------
; This script causes main officer to arrest PC a first time (potentially) for greater crime / Status 0.
; Or a second time (potentially) if lesser crime already been processed.
; PC is teleported outside of Megaton to the jail's 'booking' area, and must stay out of town 3 days.
If (Status <= 2) && (Player.GetInWorldspace MegatonWorld == 1)
If (GetMinorCrimeCount >= 5) || (GetMajorCrimeCount >= 4)
Set Status to 1
EndIf
EndIf
;---------------------------------------
; Status 3 makes both officers beat down the PC after Resist Arrest is chosen
; The quest's main script starts a timer which ends after 3 days.
; Officers will cease attacking after 3 days
; The officers will only fight if the PC enters Megaton's plaza area.
If (Status == 3) && (Player.GetInWorldspace MegatonWorld == 1)
aaaMegatonOfficerRef.AddScriptPackage aaaResistArrestPackage
aaaComplianceOfficerRef.AddScriptPackage aaaResistArrestPackage
Set aaaJailFallout3Quest.Arrest to 5
EndIf
;--------------------------------------------------
; Status 4 causes officers to attack if PC enters Megaton before main script timer has reset Arrest 5.
; Arrest == 5 and Status 4 trigger through dialog, from Resist Arrest and/or greater Pay Caps.
If (Status == 4) && (Player.GetInWorldspace MegatonWorld == 1)
Set Status to 3
EndIF
;--------------------------------------------------
; Status 5 is similar to Status 2. Both remain "neutral" if PC commits no more crimes.
; IF PC gets caught during 5, will be wanted for arrest two or three times by now.
If (Status == 5) && (Player.GetInWorldspace MegatonWorld == 1)
If (GetMinorCrimeCount < 7) || (GetMajorCrimeCount < 8)
aaaMegatonOfficerRef.AddScriptPackage aaaMegatonOfficerSandbox
aaaComplianceOfficerRef.AddScriptPackage aaaMegatonOfficerSandbox
EndIf
EndIf
If (Status == 5) && (Player.GetInWorldspace MegatonWorld == 1)
If (GetMinorCrimeCount >= 7) || (GetMajorCrimeCount >= 8)
Set Status to 6
EndIf
EndIf
;-------------------------------------------------------
; Status 6 is the next-to-last stage of arrest. Three or four strikes, by now.
; Works similar to Status 1.
If (Status == 6)
aaaMegatonOfficerRef.AddScriptPackage aaaArrestPlayerPackage
EndIf
;--------------------------------------------------
; Status 7 could mean final arrest, and last straw.
; If PC gets arrested during this phase, he or she is essentially BANNED from Megaton.
; Similar to Status 5
If (Status == 7) && (Player.GetInWorldspace MegatonWorld == 1)
If (GetMinorCrimeCount <=9) || (GetMajorCrimeCount <= 12)
aaaMegatonOfficerRef.AddScriptPackage aaaMegatonOfficerSandbox
aaaComplianceOfficerRef.AddScriptPackage aaaMegatonOfficerSandbox
EndIf
EndIf
If (Status == 7) && (Player.GetInWorldspace MegatonWorld == 1)
If (GetMinorCrimeCount > 10) || (GetMajorCrimeCount > 12)
Set Status to 8
EndIf
EndIf
;--------------------------------------------
; Status 8 means PC cannot enter town w/o being attacked
If (Status == 8) && (Player.GetInWorldspace MegatonWorld == 1)
aaaMegatonOfficerRef.AddScriptPackage aaaResistArrestPackage
aaaComplianceOfficerRef.AddScriptPackage aaaResistArrestPackage
LucasSimmsRef.AddScriptPackage aaaResistArrestPackage
EndIF
; ----------------------------------------------------------------------
;The scripts below deal with keeping the officer from running up like a maniac when not under arrest.
;Status is 0 by default, assuming the PC hasn’t got a Crime Count when the jail mod is activated.
If (Status == 0)
aaaMegatonOfficerRef.AddScriptPackage aaaMegatonOfficerSandbox
aaaComplianceOfficerRef.AddScriptPackage aaaMegatonOfficerSandbox
EndIf
End> Some may notice it is possible to 'break' the way these arrests progress from Status 0 to Status 8, especially with Minor Crime. If somebody is witnessed stealing something, and the witness, or witnesses, starts beating the crap out of our character, I am assuming our character will be like most thieves. Most thieves in this situation will be upset that they've been caught. They'll get the heck out of that cell.
However, it is possible for somebody to stay in that one cell and keep stealing stuff while being witnessed, causing Minor Crime to rise and rise and rise to the maximum level of 8. I am assuming most gamers aren't going to do this. This sort of criminal is going to be withstanding some sort of beating or shooting while he/she is stealing all these items.
IF somebody is going to take this route, so that the maximum level of crime is recorded right away, what'll happen is the officer will arrest the player-character once this character is done stealing, and walks back into MegatonWorld. The PC goes to jail or pays caps. Gets teleported out of town. Once the timer resets, and the PC reenters town, guess what? He / she will immediately be arrested again, since MinorCrimeCount is past where the scripts above can record. Maybe there will be a third and fourth arrest as well.
It is possible to fix this somehow, of course. Anything is possible with scripts. But I am not going to do this in my own game, because it's too much work, and I've already been working on this project for over 5 months! For me, the answer is simple. Any thief I roll won't want to stick around if he or she has been caught stealing.
MAKING THE JAILBOTOBJECT window > Actors > Creature > Robot > Protectron8a). Right-click > Edit CProtectron, and select an ID and Name. I am calling it aaaJailbot and Jail Bot. Get it?
8b). Toggle...
No low level processing off.
Respawn on.
Allow PC Dialogue on.
8c). Traits tab: All the scroll-bars have already been set, so leave these alone. Change Alignment to Good.
8d). Stats tab: The robot is set to Level 3 by default, so it's an easy one to beat, for those who wish to do so. Problem is, if it's been destroyed before the PC gets thrown in jail... I am setting it up so that this is a bad idea. Reason is, the jailbot is going to be the one who eventually unlocks the jail's cell door, through dialog. It will also dispense food, for those who use mods which require eating. So for those modders who wish to keep all of that intact, set the Jail Bot to Essential.
8e). Factions tab: Remove from RobotFaction and add into MegatonResidentFaction and MegatonCrimeFaction.
8f). AI Data tab: Unaggressive, Average, Helps Nobody, and Neutral are fine.
8g). AI Packages tab: Remove any AI packages. These are going to be added in a later tutorial.
Everything else (Inventory, etc.) can be kept as-is.
8h). Click OK, then drag the Jail Bot into the jail cell.
8i). Double left-click on the bot. Toggle Persistent Reference on. Click OK. Save.
FINISHING THE JAIL QUESTOBJECT window > Miscellaneous > Message 9a). Right-click > New into the Editor ID window. The MESG panel pops up.
9b). ID can be aaaMinorCrimeOneDay. This is going to be used for minor crime less than 5.00. Copy that ID so it can be pasted into the main script later.
9c). Title can be Go To Jail. And for Message Text I just typed "I have been thrown in jail for one day."
Toggle Message Box off.
9d). The Time Displayed slot has been set to 2 by default, meaning that the message gets shown for 2 seconds. This ain't enough for my sorry eyes, so I boosted this to 20, just so I have enough time to read each message.
Click OK. Three more MESGs can be made, corresponding obviously to minor crime more than 4.00, Major Crime less than 5.00, or attempted murder.
9e). A final MESG can be made to indicate the jail term has ended. ID in my game is aaaFreeFromJail. Follow steps 7b through 7c to make a "My jail term has now ended" message.
9f). Hmm, one more message. I made aaaCrimeClearedMessage, which is going to show if the criminal resists arrest, or is moved out of town after paying caps. This message says "Three days have passed. It may be safe for me to reenter Megaton by now."
OBJECT window > Actor Data > Quest > Quest Data10a). Reopen the main script. Here is what it'll look like in total.
scriptname aaaJailScript
short Arrest
short Timer1
short Timer2
short Timer3
short Timer4
short Timer5
short StartDay1
short StartDay2
short StartDay3
short StartDay4
short StartDay5
Begin GameMode
;------------------------------------
;Script below deals with stopping combat against PC, once PC has stepped into Megaton's plaza.
;NPCs will sometimes try to fight PC after crime has been committed. This script stops these fights.
If (Player.GetInWorldspace MegatonWorld == 1)
PlayerRef.StopCombatAlarmOnActor
EndIf
;------------------------------------------------------
;The script below deals with Minor Crimes of 4.00 or less
;This causes the PC to get locked in jail for 24 hours
; Officer's Status remains at 2.
If (Arrest == 1) && (Timer1 == 0)
Set Timer1 to 1
Set StartDay1 to GameDaysPassed
ShowMessage aaaMinorCrimeOneDay
EndIf
EndIf
If (Timer1 == 1)
If ((GameDaysPassed - StartDay1) >= 1)
Set Timer1 to 0
Set Arrest to 0
ShowMessage aaaFreeFromJail
EndIf
EndIf
;------------------------------------------------------
;The script below deals with Minor Crimes of 5.00 or more
;This causes the PC to get locked in jail for 3 days
If (Arrest == 2) && (Timer2 == 0)
Set Timer2 to 1
Set StartDay2 to GameDaysPassed
ShowMessage aaaMinorCrimeThreeDays
EndIf
EndIf
If (Timer2 == 1) && (aaaMegatonOfficerRef.Status == 1)
If ((GameDaysPassed - StartDay2) >= 3)
Set Timer2 to 0
Set Arrest to 0
Set aaaMegatonOfficerRef.Status to 5
ShowMessage aaaFreeFromJail
EndIf
EndIf
If (Timer2 == 1) && (aaaMegatonOfficerRef.Status == 6)
If ((GameDaysPassed - StartDay2) >= 3)
Set Timer2 to 0
Set Arrest to 0
Set aaaMegatonOfficerRef.Status to 7
ShowMessage aaaFreeFromJail
EndIf
EndIf
;------------------------------------------------------
;The script below deals with Major Crimes of 4.00 or less, namely assaults
;This causes the PC to get locked in jail for seven days.
; Officer's status remains at 2
If (Arrest == 3) && (Timer3 == 0)
Set Timer3 to 1
Set StartDay3 to GameDaysPassed
ShowMessage aaaMajorCrimeOneWeek
EndIf
EndIf
If (Timer3 == 1)
If ((GameDaysPassed - StartDay3) >= 7)
Set Timer3 to 0
Set Arrest to 0
ShowMessage aaaFreeFromJail
EndIf
EndIf
;------------------------------------------------------
;The script below deals with Major Crimes of 5.00 or more, namely excessive assaults and murders
;This causes the PC to get locked in jail for one month
If (Arrest == 4) && (Timer4 == 0)
Set Timer4 to 1
Set StartDay4 to GameDaysPassed
ShowMessage aaaMajorCrimeOneMonth
EndIf
EndIf
If (Timer4 == 1) && (aaaMegatonOfficerRef.Status == 1)
If ((GameDaysPassed - StartDay4) >= 29)
Set Timer4 to 0
Set Arrest to 0
Set aaaMegatonOfficerRef.Status to 5
ShowRaceMenu
ShowMessage aaaFreeFromJail
EndIf
EndIf
If (Timer4 == 1) && (aaaMegatonOfficerRef.Status == 6)
If ((GameDaysPassed - StartDay4) >= 29)
Set Timer4 to 0
Set Arrest to 0
Set aaaMegatonOfficerRef.Status to 7
ShowRaceMenu
ShowMessage aaaFreeFromJail
EndIf
EndIf
;-------------------------------
;The script below is what cancels the Officers' Resist Arrest AI, causing them to mellow.
;This allows us to reenter Megaton.
If (Arrest == 5) && (Timer5 == 0)
Set Timer5 to 1
Set StartDay5 to GameDaysPassed
EndIf
EndIf
If (Timer5 == 1) && (aaaMegatonOfficerRef.Status <= 4)
If ((GameDaysPassed - StartDay5) >= 3)
Set Timer5 to 0
Set Arrest to 0
Set aaaMegatonOfficerRef.Status to 5
ShowMessage aaaCrimeClearedMessage
EndIf
EndIf
If (Timer5 == 1) && (aaaMegatonOfficerRef.Status == 6)
If ((GameDaysPassed - StartDay5) >= 3)
Set Timer5 to 0
Set Arrest to 0
Set aaaMegatonOfficerRef.Status to 7
ShowMessage aaaCrimeClearedMessage
EndIf
EndIf
EndNote Arrest 4. When its timer concludes, ShowRaceMenu allows us to change our character's hairstyle / looks. After a month in jail, hair probably won't look the same.10b). Save, Click OK (closing the Quest window) and save.
The final touch is to give the Jail Bot some dialog and responsibilities. This bot will be in charge of feeding the PC, dispensing cigarettes, and finally, unlocking the jail. I am also going to give the Jail Bot a Patrol package. Patrols get described in the post directly below this one.
OBJECT window > Actor Data > Quest > Topics tabStart a new quest. This quest needs to be separate from the Jail quest already written. Keep in mind that the way I am writing this will make the PC stay in jail in REAL TIME.

This idea is hardcore, of course. Those who want to spend all their time at once can simply sleep in the bed over and over, or come up with a way to move time forward more quickly, somehow.
11a). Three GREETINGs are needed. First one will deal with dinner. The PC is going to have a choice of eating, not eating, or getting a pack of cigarettes. "You ... look ... starved. Want .... some .. grub?" goes the dialog.
11b). Toggle Say Once a Day on.
11c). Conditions are as follows...
GetCurrentTime > 17.000 AND
GetCurrentTime <= 22.000 AND
GetIsID aaaJailBot == 1.00Note that the Jail Bot will dispense food or ciggies even if the PC is not in jail. To fix this, add another short variable into the main script. Call it Incarceration. You'll then need to go through the rest of the main script, adding Set aaaJailFallout3Quest.Incarceration to 1 for each of the four timers. A GetQuestVariable can then be added to the topic for food & cigs. Make sure to turn this off once the PC gets out.
11d). In the Choices window, add aaaFoodYes, aaaFoodNo, and aaaSmokingTopic. Or any other topics desired.
11e). Let's start with aaaFoodYes. "Yes I am hungry" can go into the Topic Text slot. "We have an .... excellent. Selection of .... all kinds of grub," says the Jail Bot.
Toggle Say Once a Day and Goodbye on.
11f). The same conditions can be copy-pasted from the bot's initial GREETING.
11g). In the Result Script (End) box, type whatever is desired. I am adding. Player.AddItem JunkFood 1, Player.AddItem BrahminSteak 1, and Player.AddItem NukaCola 1.
11h). "No I am not hungry," can go into the Topic Text slot for aaaFoodNo. This is for roleplaying only, for those who have a toon who is on some sort of hunger strike.
Only the bot's GetIsID is needed here. Toggle Goodbye on. Toggle Say Once a Day on.
Renee
Jul 26 2020, 06:07 PM
Horse Rentals. Game: TES IV: OblivionThis is going to make a horse rentable in TES IV: Oblivion. Renting a horse (rather than buying one) is good for someone who hasn't go a lot of money available yet. Another advantage is: if the horse gets killed, at least the PC did not blow weeks or even months of earnings! In roleplay terms: maybe the character has also not become too attached to the poor horse in such a scenario.
So this idea is going to make it possible to rent a horse for one month, from a Chestnut Handy NPC who I'm something going to call Stable Master, or aaaStableMaster. After the horse is rented, it is essentially owned by the Player. After a month has passed, the horse will return to Chestnut Handy Stables, near the Imperial City. It will also no longer belong to the Player.
--------------------------------
OBJECT window > Actors > NPC1). Edit an NPC, doing all the usual steps, and place this NPC wherever. This is going to be the stable master who we rent the horse from. I am going to call this guy aaaStableMaster
I am placing my NPC (an orc) into the Chestnut Handy pen, where all the horses are kept. In fact, my original idea was so make this NPC sell horses, not rent them, since the vanilla game doesn't allow us to buy horses here (ahem). But buying horses is nothing new. I want to try something new.
Now to make the horse itself. Horses are to be found in two areas of the Construction Set's Object window: Creature > Creature or Creature > Horse.
--Do not edit anything from the Creature > Creature section. These cannot be ridden. These are (in fact) the wild horses which can sometimes be seen south of the Imperial City.
--Do not edit anything quest-related, or anything from the MyHorse area.
--Do not edit an ImpLegion horse.
Actors > Creature > Horse2a). Right-click > Edit a basic horse, such as HorsePaint. These are good to start with since they haven't got any scripts.
2b). Change ID and Name, I am calling it aaaPaintHorseRental and Paint Horse Rental.
Stats tab2c). By default, most horses are Level 1, and they are somewhat weak. A Bay has 250 health, for instance. This may seem quie a lot, but since it's possible for a person to acquire even more, I don't feel bad toggling PC Level Offset on. This horse is special. It can have hundreds more health. It'll last longer, if it happens to get into a fight!
2d). Toggle Respawn on (if it's not on). You can leave Can Corpse Check toggled on or off.
No Low Level Processing should be toggled OFF. If it's toggled on by default, you're in the wrong section; probably in the Creature > Creature > Horse section instead of Creature > Horse.
2e). Get rid of any AI packages.
By default, base horses have zero Aggression, 50 Confidence, 25 Energy Level, and 50 Responsibility.. They will never pick fights, but somehow they'll be able to know if our character is stealing. Weird. Change these around, if desired.
Factions tab By default, basic horses are part of the Prey faction, which has an interfaction relationship of -50 to the Creature Faction. Yikes. It's up to you if you'd like to place this horse into the HorsePC faction (which causes the horse to stay absolutely loyal to the Player, unless broadly attacked over and over) or play around with a customized faction. The reason this is important is by default, horses get attcked by a lot of Player enemies, which can get annoying. It might be prudent to try to change this.
I am going to experiment by not putting the horse into any faction at all. Because like I said, the vanilla game has an annoying habit of making enemies attack our horse
first, instead of attacking the PC. Maybe this has something to do with the HorsePC faction MyHorses are placed into.
2f). Click OK, saving as a New Form. Find an appropriate worldspace, and place the horse out into the world.
2g). Give the horse a Reference ID. I am calling it aaaPaintHorseRentalRef. Copy this ID and paste it onto a Notepad page so it can be pasted into scripts later.
2h). Click on the Ownership tab, and find the NPC stablehand in the NPC scroll-bar. If the horse is not rented, this NPC owns the horse, and it's considered stealing if it's not paid for. Click OK.
OBJECT window > WorldObjects > Static 3). Drag an XMarker out into the Render window. Give this X-marker a Reference ID. I am calling it aaaPaintHorseReturnXMarker. This marker is where the horse will return after its rental terms is over.
Again, copy this ID and paste it onto the same Notepad page, so it can be pasted into scripts later.
QUEST window4a). Start a new quest. This quest does not need a name, unless you want it to appear in the Quests section of the in-game menu for some reason. Otherwise, this quest does not require stages, and therefore does not need a Name.
4b). Change Priority to 30. This is the standard number for Bethesda's own Horse quest.
4c). Leave Start Game Enabled toggled on. Toggle Allow repeated conversation topics on as well.
4d). GetIsPlayableRace == 1.00 goes into the Quest Conditions winow.
4e). Start a script, and add these variables.
scriptname aaaHorseQuestScript
short Rent
short Timer
short StartDaySave that, click OK, and reopen the quest window. Find the script in the scroll-bar and click OK. Reopen the quest window.
Topics tab 5a). We're going to make a total of five GREETINGs. Each one has a different set of options and QuestVariables.
Greeing one is what starts the dialog. "Hi, my name is Bob. I rent horses here at Chestnut Handy Stables...." this NPC explains that he or she rents horses, rather than sells them (or eats them).
5b). In the Conditions window, make a GetISID for the NPC created ealier.
GetIsID NPC: aaaStableMaster == 1.00 AND
GetQuestVariable 'QuestName', Rent == 0.00
5c). In the Result Script box, type
Set QuestName.Rent to 15d). Right-click > AddTopic into the Add Topics window. Start a new topic called aaaHorseTopic. Add this into the Editor ID window, too.
----------------------------
Greeting Two: this gets spoken if dialog is started (the first GREETING is spoken), but for some reason the PC backs out of conversation.
The dialog spoken during Greeting two can be siomething simple. "Can I help you?" Conditions go like this...
GetIsID NPC: aaaStableMaster == 1.00 AND
GetQuestVariable 'QuestName', Rent == 1.00 Add the same aaaHorseTopic into the Add Topics window.
-------------------
Greeting Three: this is another interim greeting, spoken when the QuestVariable is at 2. Again, this gets spoken if the Player backs out of conversatio early, but then returns to the NPC.
GetIsID NPC: aaaStableMaster == 1.00 AND
GetQuestVariable 'QuestName', Rent == 2.00 Add the same aaaHorseTopic into the Add Topics window.
Set QuestName.Rent to 1 goes into the Result Script box.
---------------------
Greeting Four gets spoken after the player-character rents the horse, backs out of conversation, but for whatever reason returns to speak to the NPC stable master. "How is your horse? I hope everythin is satisfactory." and so on. By now, the PC temporarily owns the beast.
GetIsID NPC: aaaStableMaster == 1.00 AND
GetQuestVariable 'QuestName', Rent == 3.00 Add aaaHorseTopic into the Add Topics window. A Result Script is not needed.
-------------------
Greeting Five is used after the horse rental has ended, and the player retuns to the stablehand NPC to maybe try renting it again. "You have returned.... bla bla bla."
GetIsID NPC: aaaStableMaster == 1.00 AND
GetQuestVariable 'QuestName', Rent == 4.00 Result Script:
Set QuestName.Rent to 1Add aaaHorseTopic into the Add Topics window.
Click OK and save.
QUEST window > Topics tab6a). Select aaaHorseTopic (or whatever this first custom topic was called). Change the Topic Text name to something in plain English, if necessary.
6b). Two responses are going into the Info window.
In the first one, it is explained further to the PC that there is a horse (or horses) available for rent. "We have paints, bays, and chestnuts..." The NPC explains how much each selection will cost for that month. The stablehand also explains that after the month is over, the horse will return to its home stable. Write this response. Conditions go like this...
GetIsID NPC: aaaStableMaster == 1.00 AND
GetQuestVariable 'QuestName', Rent == 1.00 Result Script:
Set QuestName.Rent to 2.
6b). In the Choices window I'll start a Paint Horse topic choice and a No choice. Eventually there will be a Bay Horse Topic choice and a Chestnut Horse Topic choice. But for now, right-click > Add Topic. Since the first horse I'm adding is a paint, I'm calling the topic aaaPaintHorseTopic.
Add aaaBayPaintTopic (or whatever it's called) into the Editor ID window.
6c). Also add a "No" topic into the Chocies window. If you already have a No topic from other quests, this can get reused. If you do not have a No topic, create one, and make sure to add it into the Editor ID as well. Here are its conditions and Result Script.
GetIsID NPC: aaaStableMaster == 1.00 AND
GetQuestVariable 'QuestName', Rent <= 2.00 Result Script:
Set QuestName.Rent to 0
6d). Click OK and save.
7a). Go back into the Quest window and back into the initial Horse topic (which I called aaaHorseTopic). Start a second response. "You have already rented a horse from me, is there a problem?"
GetIsID NPC: aaaStableMaster == 1.00 AND
GetQuestVariable 'QuestName', Rent == 3.00There is no Result Script or Choices for this topic. After one horse has been rented, it is not possible to rent another; doing so would complicate things. So this topic is simply an empty 'filler' which follows the fourth GREETING.
7b). In the Editor ID window, go back to the first horse choice. I called this aaaPaintHorseTopic. Dialog can go like "Yes, I've got a fine paint available. Slow, but durable, and more highly maneuverable than a faster horse. Good for rugged terrain..."
GetIsID NPC: aaaStableMaster == 1.00 AND
GetQuestVariable 'QuestName', Rent == 2.00 7c). In the Choices window, add a "yes" choice (aaaYesPaint), and a "no" choice. The No choice can be the same No used before. Add aaaYesPaint into the Editor ID.
7d). Select aaaYesPaint in the Editor ID window. Topic Text can be changed to "Yes, I'd like to rent a paint horse." Two responses are going to be written here: one which the stablemaster will say if the PC has enough gold, and one which hte stablemaster will say if the PC does not have enough. Let's start with the first response.
7e). "Very good, that paint over there is now yours for the next thirty days..." says the stablehand. In my game, this guy will charge 120 gold for the month.
GetIsID NPC: aaaStableMaster == 1.00 AND
GetQuestVariable 'QuestName', Rent == 2.00 AND
GetGold ......... NONE.... >= 120Make sure to toggle Run on Targlet ON for that final GetGold condition.
Result Scripts:
aaaPaintHorseRentalRef.SetOwnership
Set QuestName.Rent to 3
Message "Paint Horse has been rented for one month", 30
Player.RemoveItem Gold001 120
Notice that the SetOwnership script does not refer to the Player. It took me awhile to figure out, if nobody is referenced, the referenced item will automatically go to the Player!

(You don't know how many error messages I sat through as I kept trying to include Player here. Grr....)
7f). But what happens if the PC does not have enough money? "No, I asked for 120 gold. And this is not enough..." goes the dialog. Toggle Goodbye on, so the quest's dialog gets forced back to the beginning (from the stablehand's point of view).
GetIsID NPC: aaaStableMaster == 1.00 AND
GetGold ......... NONE....< 120.00Again, toggle Run on Target ON for that GetGold condition.
Result Script:
Set QuestName.Rent to 07g). Click OK and save. All the dialog has been written, so phew.
QUEST window > Quest Data tab8a). Time to write yet another Timer script. I love these things. This has already been started with the three short variables.
scriptname aaaHorseQuestScript
short Rent
short Timer
short StartDay
Begin GameMode
If (Timer == 0)
If (aaaHorseQuest.Rent == 3)
Set Timer to 1
Set StartDay to GameDaysPassed
EndIf
EndIF
If (Timer == 1)
If ((GameDaysPassed - StartDay) >= 30)
aaaPaintHorseRentalRef.SetOwnership aaaStableMaster
aaaBayHorseRentalRef.SetOwnership aaaStableMaster
aaaChestnutHorseRentalRef.SetOwnership aaaStableMaster
Set QuestName.Rent to 4
Set Timer to 0
Message "My horse rental has expired.", 30
EndIf
EndIf
EndNote: I have assumed three horses have been made: a paint, a bay, a chestnut. If any of them haven't been added yet, make sure to put a semi-colon in front of those which aren't made (or aren't referenced) yet.
8b). Save that, click OK, and save from the main toolbar.
RENDER window9a). Make sure the X-marker created earlier is onscreen. It also helps to find the horse as well, and have both of these items onscreen. Double left-click on the horse, and click its AI button. Two packages are needed: one which causes the horse to return home after the rental has expired, and one which causes the horse to NOT return home, assuming it's been paid for.
9b). Let's start the go home package. Right-click > New into the AI Package List window. Name the ID something specific for that horse, such as aaaPaintHorseReturnHome. Click on the Package Type scroll-bar and find Travel.
9c). Toggle Must Reach Location and Defensive Combat on. You can also toggle Always Run on, which might allow the horse to make it back home without getting pwned.
9d). Click on the Conditions tab.
GetQuestVarible 'QuestName', Rent == 4.00 goes here.
9e). Click on the Location tab. Toggle Near Reference on, click Select Reference in Render Window, and double left-click on the X-marker. Click OK.
9f). Right-click > New into the AI Package List window again, and name its ID aaaHorseDismounted. Find Wander in the Package Type scroll-bar.
9g). Toggle Must Complete on. Defensive Combat can also be toggled on.
9h). Conditions tab:
GetQuestVariable 'QuestName', Rent == 3.00.
9i). Location tab: select Near Current Location and use a binary number (such as 512) for the Radius slot. This way, the horse will wander around a bit when dismounted, looking for grass to munch on, perhaps. It is also possible to simply choose 0 for Radius, if you really want to keep the horse from wandering into trouble.
Note that when dismounting the horse, this will cause any other rentable horses to also wander a bit in their stables, way back home! This is safe, as long as "home" is not located near an enemy lair.
9j). Click OK. Click Save. Click OK. And Save.
10a). Finally, we need a way to alert the game if the latest horse being rented gets pwned.

Open up the horse's Creature panel from the Object or Reference windows. Start a new script like so...
scriptname aaaPaintHorsepwnedScript
short Dead
short DoOnce
Begin GameMode
End10B). Save the script, close the script panel, bla bla bla...
Here is the rest of it... and this includes only the Paint horse, which means a different script will be needed for each horse. There is probably a way to write it so that only one script is needed for ALL horses. Problem is, the Construction Set doesn't recognize GetDead as a condition as well as the GECK and Creation Kit do, which makes finding a solution for all horses difficult...
scriptname aaaPaintHorsepwnedScript
short Dead
short DoOnce
Begin GameMode
If (aaaPaintHorseRental.GetDead == 1)
If (aaaHorseRentalQuest.Rent > 2)
Set aaaHorseRentalQuest.Rent to 0
Set aaaHorseRentalQuest.Timer1 to 0
Set aaaHorseRentalQuest.StartDay1 to 0
Set aaaPaintHorseRentalRef.Dead to 1
Set aaaPaintHorseRentalRef.DoONce to 1
Message "My current rented horse has been pwned!", 30
EndIf
EndIf
If (aaaPaintHorseRental.GetDead != 1) && (aaaPaintHorseRental.DoOnce == 1)
Set aaa.PaintHorseRental.Dead to 0
Set aaaPaintHorseRental.DoOnce to 0
EndIf
End10c). Save the script and close it. Click OK.
Now reopen the horse quest. Go into the Topics tab and find the first specific horse-type topic. In my game I've got aaaPaintHorseTopic.
10d). Add a condition:
GetScriptVariable Ref: 'aaaPaintHorseRentalRef,' Dead == 0.0010e). Add a second instance of dialog which includes the same conditions, but adds
GetScriptVariable Ref: 'aaaPaintHorseRentalRef,' Dead == 1.00, and dialog for this will obviously be "We haven't got a paint for rent..."
=-------------------------------------------
Renee
Nov 28 2020, 03:00 AM
I have found a really good Daggerfall tutorial which was originally written in Beth's forums by BOX MAAAN. I'm copy/pasting most of it, so if I ever get involved with Daggerfall again I'll have this guide ready.
------------------------------------
INSTALLATION:
This is the easy part. Just check out "DaggerfallSetup"; it's an installer that comes with a preconfigured DOSBox and a bunch of unofficial patches, so after everything is all installed all you have to do is double-click a shortcut and you're in the game. You can download Daggerfall from Bethesda's official website, but I'd strongly recommend just sticking with DaggerfallSetup. And don't worry, it's completely legal.
It also comes with a few extra goodies. Once you get into the game and make your first save, open the Eye of Argonia application in your Daggerfall installation folder and run it to patch your savegames to increase your view distance. Don't ever touch the detail slider on any of your saves, before or after running this patch, otherwise it won't work. And if your save ever gets screwed up in some way, try using Fixsave on it before giving up.
CONTROLS:
The first thing you want to do when you wake up in Privateers' Hold is customize the control scheme to something more to your liking. With a little tinkering, you can make Daggerfall's controls feel positively modern - which for me is a huge help in making the game enjoyable. I can't tell you what your ideal control scheme is, but�€�
�—�
Turn on mouse look. For the love of Arkay, turn on mouse look. Daggerfall was one of the earliest games to feature full mouse look, and don't you ever take it for granted.
�—�
Remap WASD so that it uses "Slide Left/Right" instead of "Turn Left/Right". Mouse is covering the camera, so for the most part you can forget about the Turn Left/Right mappings.
�—�
Since you're using mouse look, you'll need to use either "Activate Center Object" to interact with things (which works just like it does in modern Elder Scrolls games), or "activate cursor" to temporarily toggle off mouse look and bring up the cursor to click on whatever you want to interact with. I generally just use "Activate center object", but Daggerfall doesn't have a crosshair it can sometimes be tricky to activate those little switches and stuff - "activate cursor" comes in handy there.
�—�
You could also enable fullscreen to disable that bar at the bottom of the screen with all of your interact options and the wait/rest menu - it's not as useful if you're using mouse look, and in fullscreen your HUD will just be you health/magicka/fatigue bars and your compass, which looks nice.
�—�
"Float Up/Down" are used for when you're underwater, or under the effects of a levitation spell.
�—�
I've honestly never used the "steal/grab/info/talk" mode keys - generic activate seems to be pretty smart about what you're doing when you click on something, but maybe you'll need "Steal mode" to pickpocket people. Never knew if just crouching/sneaking let you pickpocket people like in the later games.
�—�
As it happens, "Sneak" doesn't put you in a stealth crouch like the later games, it just slows down your speed so you can tip-toe around, since faster movement means more noise. Similarly, your starting speed isn't as bad as in Morrowind so "run" feels like actual sprinting. And the fatigue drain from running isn't too bad, so feel free to run around a lot. I never had much use for "crouch" or "slide", but you will need crouch for a dreaded wall opening in Wayrest Castle.
�—�
You need to be moving when you jump if you want to jump in any direction other than straight up.
�—�
"Cast Spell" brings up your spell list. Double-click a spell (or hit Enter with that spell highlighted) to cast it: on-self effects (and Open, for some reason) will automatically cast, but on-touch and ranged spells are only loaded; you'll have to hit the "activate center object" key to fire. On-touch requires a valid target (so with an enemy within attacking range), on-target can be fired regardless. Recast spell loads whatever spell you last cast. "Abort spell" unloads any spell you've loaded but haven't cast, as well as refunds the magicka cost. "Use magic item" works like "Cast spell", but instead of opening the spellbook it opens a list of magic items in your inventory to load spells from.
�—�
"Rest" is how you wait to pass time. Resting restores your health/magicka/fatigue, loitering doesn't but it passes the time just the same. Loitering is for when you need to pass the time in a city until the shop/guild you want is open - don't rest inside a city, or you'll get arrested for vagrancy. You can't loiter for more than three hours at a time, because Daggerfall hates you. Just re-enter the menu every three hours.
�—�
"Transport" opens a menu where you can choose whether to walk, or mount your horse and/or cart. You need to buy a horse and cart at any general trader, and then when you do they'll exist in hammerspace until you mount them with this key - can't do it in interiors of course, and remember if you're riding on your horse or cart you won't be able to grind your Running/Jumping skills. If that's important to you. Also, if you own a ship, you can use this menu to basically teleport to it.
�—�
Think of "automap" as the local map from the modern games - a top-down look at the city or interior space you're hanging out in. The automap inside dungeons is super useful, and even more frustrating to actually use; but it's not hard to get used to. The travel map is the world map, and you'll use it to, yup, fast-travel. Which isn't optional, by the way. And don't misspell the whacky fantasy name of the location you're traveling to, the map isn't smart enough to guess what you were saying.
�—�
You can access your inventory menu from the character sheet, in case you need to be conservative with how many buttons you have (for instance, if you're trying to use a controller). Status tells you the time, date, and your current health. "Logbook" shows you any active quest notes, and your main quest progress. "Notebook" is for any dialog you save, but I honestly haven't really used it all that much.
�—�
Oh right, weapons. "Ready weapon" is just the draw/sheathe key. You can equip two one-handed weapons, and switch between them with "switch hand". "Swing weapon" is the part everyone gets confused on, but IMO once you know how to use it combat feels great. You don't attack by pressing "swing weapon", you hold down that key while you move the mouse to attack. So just think of it as "attack mode": with "swing weapon" held, you use your mouse to attack, and with it up, you use your mouse to look around normally. For reference: Mouse up is a thrust (lower damage, better accuracy), mouse down is a chop (higher damage, lower accuracy), diagonal attacks do slightly more damage with slightly less accuracy, and horizontal attacks are neutral. You can even just hold down the "swing weapon button" and draw circles with your mouse, and you'll get by in most cases.
CHARACTER CREATION:
My favorite feature in Daggerfall is the most open-ended, and most utterly broken, character creation in the entire series. If you pick a preset class via list or personality test, you'll have a fine experience; but in this guide I want to go into detail about how to get the most of the custom classmaker, with and without exploits. I'll also touch on the background questions that come after deciding your character class, which has some important parts to it.
Attributes: distribution is pretty straightforward, any points you add to an attribute must be subtracted from another. Attributes can't go higher than 75 or lower than 10 here. (Exploit: if you hit U in the classmaker screen, it resets the counter for attribute distribution to zero while keeping any changes you made. Useful for creating a god character, but this is indisputably cheating.) UESP does a fine job of describing each attribute, but a few notes:
�—�
Speed governs attack speed, not just movement speed. Since the combat is dice-roll based like Morrowind, it may be more beneficial to boost speed and your frequency of attacks than it is to boost damage with Strength.
�—�
I'd say the biggest dump stat would have to be Personality. It affects barter prices, but finding enough gold is hardly a problem. It also affects your ability to get information from people, which basically amounts to asking for directions. Which isn't difficult to do, at all.
Skills: Daggerfall has 35 skills, more than any other Elder Scrolls game, but it also has the highest number of useless skills in any Elder Scrolls game. You may have difficulty filling out your list of class skills with things you actually care about. A few notes:
�—�
Since combat is dice-roll based, your best bet is to pick one weapon skill and just stick with that. Of these, Long Blade is probably the best, but keep in mind that bladed weapons deal half damage to Skeleton Warriors (but not any other skeletal enemies, like Liches, I think). And there are no artifacts that use the Axe skill, if that's something you care about.
�—�
Lockpicking is a pretty crummy skill even if you're a thief-type character. It's automatically checked at any locked doors, and to my knowledge even if you raise it up it's not very reliable and doesn't work on any magically sealed doors. You can bash any door you could potentially lockpick, so just do that and have an Open spell handy for any magic locks.
�—�
Language skills are useless. Don't even bother. For reference, a language skill is checked when you approach an applicable enemy with your weapon down, and if the check is successful, all that happens is that particular enemy isn't hostile to you. And to be honest, I can count the number of Centaurs and Dragonlings I've seen in this game on one hand, so their language skills are even more useless.
�—�
It's worth checking UESP to see the schools of any spells you plan on casting. Daggerfall's spell schools are�€� bizarre, from the perspective of a modern Elder Scrolls player.
Difficulty dagger: this shows how much time it will take for your character to advance their skills. It goes up when you take an advantage or increase your HP gain, and goes down when you take a disadvantage or lower your HP gain. Your class isn't acceptable if the dagger is ever in the red.
Hit Points per level: the amount of HP you gain with each level up is anywhere between this number and half of this number. Plus your bonuses from Endurance. I've always liked playing tanky, so I generally pump this up, but it's your call how high you want to go. I wouldn't go extremely low, though.
Advantages and disadvantages: this is where you can really break the game.
�—�
Acute Hearing, Adrenaline Rush, and Athleticism aren't really worthwhile advantages.
�—�
"Bonus to Hit" is good, but I wouldn't suggest picking it for Animals. That may give you a small boost early on, but animals are generally the weakest creatures in this entire game. Likewise, this means animals are the best group to take the "Phobia" disadvantage for, since they're the least threatening option and all of the phobias are worth the same on the difficulty dagger.
�—�
Take "Expertise In" whatever weapon skill you chose for your class. This will increase your accuracy even further with that weapon type, which will remain useful for the majority of the game. Likewise, you can take "forbidden weapon type" for any weapon types you never, ever plan on using to get more mileage out of your difficulty dagger. Maybe don't forbid Short Blades, though.
�—�
Increased Magery is essential if you ever plan on casting more than just a few spells. By default, your max magicka is only half of your Intelligence, which is barely good enough for the weakest spells. Don't be afraid to go all the way to 3x INT in spell points. I strongly recommend you have at least enough magicka for basic spells.
�—�
Immunity, Resistance, Low Tolerance, and Critical Weakness are pretty self-explanatory, but a few things to clear up: "Magic" in this sense is an element alongside poison, fire, frost, or shock; it's not all-encompassing like it is in Oblivion or Skyrim. By glancing at the bestiary on UESP and looking at all of the enemy spells, it seems like the best element to take a weakness to is Frost - it's the least common element among higher level spellcasters, so you'll only ever need to worry about Ice Daedra after you level up a little. Most of the other elements are about equally common, although Poison seems to be the second least common after frost.
�—�
Also! Feel free to take a critical weakness to paralysis. All you need if you ever get paralyzed, is to cast Free Action. Which is one of the cheapest spells in the game, and easy for even non-mages to cast. Plus, if you start as a High Elf, your racial immunity to Paralysis completely overrides any class weakness to it you pick, for some free space on the difficulty dagger. That's kinda exploity, though, sooo...
�—�
Regenerate health, I think, isn't worth the chunk it takes out of your difficulty dagger. Damage health, similarly, I don't think is worth taking in any context. Worth mentioning that for the purposes of these effects, and any other advantage/disadvantage, "darkness" means not just night, but inside every dungeon. Which is where 90% of the game takes place, and where your choices here really matter.
�—�
Rapid Healing, on the other hand, might be a worthy timesaver. It increases how much HP you heal for each hour you rest, and since most quests have a time limit, this will give you some extra breathing room to rest up without running out the clock. It doesn't increase how quickly you recover fatigue or magicka from resting, though, so if those are tapped out it won't make a difference.
�—�
Spell absorption is weird. Your chance to absorb spells half your INT+WIL, but you can also absorb the magicka from your own area-of-effect spells if you get caught in the splash damage. And any magicka absorbed over your max directly damages your health. Magicka burn, it is called.
�—�
I don't recommend taking "Forbidden Armor Type: Plate" as that forbids you from everything but the first two tiers of armor. The classmaker makes it seem like leather, chain, and plate are Daggerfall's version of light, medium and heavy armors; but there aren't any armor skills, armor only factors into your defense and not things like movement or fatigue drain, and leather and chain are simply the two weakest tiers of armor. On the contrary, you could get away with forbidding yourself from using leather and/or chain, and never miss either after leveling up once or twice.
�—�
"Forbidden Shield Type", you can take or leave. Shields aren't actively used like in Oblivion or Skyrim, or even activated like a dice roll in Morrowind - they're just an extra armor slot you can throw on if you're not wielding two weapons, or a two-handed weapon.
Reputations: Optional, and just affects your rep with generic groups in the game. No huge game-changers here.
Background questions: One nifty feature about Daggerfall is that it will automatically generate your character's backstory depending on your class and how you answer some of these background questions. Most of this is just flavor, or for some marginal stat changes that you can find in the UESP, but two things to highlight:
�—�
One of the questions will ask you what you got as a gift from the Emperor. Choose the Ebony Dagger. Always. (and make sure you haven't forbidden your character from using Short Blades in the Classmaker) This means you'll start the game with one of the most powerful daggers in the game. Most other weapon types will start to outperform it as you upgrade to a higher tier, and you'll want to focus on whatever weapon type you picked as your class skill - but the Ebony Dagger will be a huge lifesaver if you ever encounter an enemy that's immune to your current weapon material. Ebony is capable of damaging anything - up until you find Mithril at later levels, there will be enemies your current weapon may not be able to damage. Especially if it's something like a Daedra spawned as part of a quest, instead of the typical level-scaled fare.
�—�
Exploit: If you take "Critical weakness to disease" as a disadvantage in the classmaker, and then take an additional weakness to disease, you'll gain complete immunity to diseases. And diseases in this game are mean. But you won't get immunity to vampirism or lycanthropy - those have a chance to transfer that isn't changed by disease resistance.
That's it for character creation. After picking your class and background, you'll be able to distribute some extra points among your skills and attributes. Fun fact: you can potentially start the game with one attribute as high as 99, if you raise it to 75 in the classmaker and keep rolling the dice for a satisfactory attribute spread. Another fun fact: You can change your character's name at any time by clicking on it in the character sheet.
I'd recommend reading a little about the leveling mechanics on UESP. Skills only advance when you rest. Every time you level up, you get 4-6 points to distribute among your attributes freely as well as a health boost determined by what you chose in class creation. You can save scum for each level-up to get the best results, but it's hard to track when your character will actually level up. And despite the save scumminess, I honestly prefer Daggerfall's leveling system to Morrowind and Oblivion's.

SPELLMAKING:
A really robust feature that I don't feel is sufficiently explained, or at least not sufficiently understood. Maybe it was obvious to everyone else but me, but the spellmaker is set up so that you can create custom spells that scale with your level. Which is awesome!
For duration and chance, look at it as [base value] plus [additional value] per [level]. Which means if I make an Open spell with 10 + 5 per level, that means I have an Open spell with a 15% success chance at level 1, that goes up by 5% with every level. Or a Water Breathing spell that gives 3 + 1 per every 2 levels, would be 3 rounds at level 1 and only 8 rounds at level 10.
And for reference, 1 "round" in Daggerfall's spellmaker is ten seconds long. So 6 rounds is a minute, 11 rounds is 110 seconds, etc.
For magnitude it's the same, but you can decide a randomized range for the base and leveled value. For example, a Fireball spell with 10-20 base damage plus 9-10 additional damage per level would do 19-30 damage at level 1, and 37-50 damage at level 3. You can see how cool this is, since you can make custom spells at the start of the game that will remain useful throughout the entire game.
You can gain access to spell merchants and the spellmaker by joining the Mages Guild. Some spells I'd recommend making as soon as you get out of Privateers' Hold, for ANY character type:
Teleport: This spell costs zero gold to make in the spellmaker because Daggerfall. But regardless of how you get it, this spell will be the biggest timesaver in the game for you. Dungeons in Daggerfall are long and labyrinthine - expect to spend hours in real-time, and days in game-time, crawling through a dungeon searching for your quest target. And once you find your quest target, you have to go back and find the dungeon entrance. Unless you prepared your teleportation spell! It's like both Mark & Recall in Morrowind - the first time you cast it, you have to set an anchor. The second time you cast it, you teleport back to that anchor. But always remember that you have to recast your anchor every time you teleport somewhere. Anchors are a one-time thing. So set an anchor at every dungeon entrance, or better yet, in front of every questgiver. Remember that quests have time limits on them, and a big chunk of that time limit is for fast-traveling to and from the location. You can shave off the return trip by teleporting back to the questgiver instead, which gives you enough time to go through the quest and rest all you want inside the dungeon without worrying about the time limit.
Levitate 1 plus 1 round every 20 levels. Basically, you'll really want a Levitation spell for exploration purposes, but you don't need it at an overlong duration; just keep recasting it if you need to maintain levitation for longer. I know climbing is a skill in Daggerfall, but Levitation is more robust and some main quest dungeons outright require you have it - they'll usually provide a little levitation buff for you by activating a random object, sure, but it's better to have your own source of levitation.
Water Breathing/Water Walking, each at 1 round plus 1 round per level. Putting both together is still an extremely cheap spell you can keep recasting as you explore deeper in water, and as you level up it'll last you longer. Worth noting that Water Walking isn't what it is in the later games where it lets you walk on the surface of water - in Daggerfall, it lets you move through water at a normal speed, which is very useful for underwater exploration. (stray thought: the underwater portions of Daggerfall's dungeons are terrifying)
Free Action, 1 round plus 1 round per level. Any time you get paralyzed by an enemy, just open your spellbook and cast this cheap spell. So easy a Nord Barbarian could do it.
Open, for when bashing down the doors isn't enough (basically whenever you find a magic lock). For this I'd recommend a low base chance and a high per-level chance, so that you have a solid chance as you level up. At 10% + 10% per level, you've got a 100% chance to open all doors at level 10.
For offensive and healing spells, if you choose to be a more dedicated spellcaster, I'd again suggest going with lower base values and higher per-level magnitudes. That will make cheap spells that slowly become fantastic as you level up and really need them.
Also worth mentioning that Shield works differently in Daggerfall, compared to the later games. In Daggerfall, Shield basically adds its magnitude as another layer of HP; you don't take any damage until your Shield either wears off or is broken from damage.
Important note: If you're going to be doing quests for the Mages Guild, there are occasionally some quests where you have to cast a specific spell. Custom spells won't do it. So make it a priority to buy the canned spells "Open" and "Sleep" if you're in the Mages Guild, even if your custom spells are better.
QUESTING:
The final part of this little guide. I don't have a whole lot to say here, just a few general gameplay tips.
1.
Congratulations, you've made your character and woken up in Privateers Hold. Before you start exploring, or even start messing with the controls, though�€� SAVE. Save right now, immediately as you start the game. Because if you get killed before making your first save, you'll have to go through character creation all over again. There are no autosaves in Daggerfall.
2.
Make multiple saves. Daggerfall only has six save slots, but NEVER use just one for a character. If you think Bethesda games are buggy now, just think about how bad they were 20 years ago. As a minimum, I generally save to one slot before starting every quest, and keep a separate slot (or two) for saving during the quest. That way if something goes FUBAR during the quest, I have a save from before I even started the quest. For random quests this will mean you won't get the same quest if you reload, but that's usually just fine.
3.
Don't ever reject a part of the main quest. Otherwise you'll never be able to complete it. Similarly, the only quest in the game with a time limit is the very first one, to speak to Lady Brisienna. Don't be late, because you can run out the clock on this quest and basically fail the entire main quest before you even start it.
4.
The amount of loot you collect going through a random quest will dwarf whatever quest rewards you're offered, so if it looks like you're going to fail a quest for some reason you really shouldn't sacrifice a great loot haul by reloading a save. Worst case scenario, you lose a little reputation with that faction that you'll just gain back by doing another quest.
5.
I'd say about 90% of this game is dungeon crawling. So have some good strategies for exploring dungeons - hug the right wall so you always know how to backtrack, start recognizing dungeon blocks (every dungeon in the game is built from a few dozen prefabricated dungeon sections that get procedurally put together in-game to form thousands of dungeons), and save often.
6.
Gold has weight, every 400 gold is 1kg in Daggerfall. Go to a bank and deposit your gold, or draw it up in a letter of credit - make sure to have some plain old gold on hand for staying at taverns, though.
7.
Read the manual, comes with the game installation in a docs subfolder. Not just because it contains useful story information, but because it's an honestly entertaining read.
8.Enjoy the game.
Renee
Jun 11 2021, 12:47 AM
Getting an Xbox controller to work on PC. Game: TES III: MorrowindFirst of all, for those who want an Xbox controller which behaves just like the controller on console, here is a
*LINK* >> It links to an Xpadder template, and was not created by me.
>>> The problem with this template is it does not include variable left joystick movement. It works digitally; we can only walk at one speed, or run at one speed.
That won't work for me.

And I've always wanted to change some of the buttons which were fixed on Xbox, anyway.
So, this tutorial is for those who want to set up their own controller mapping.
TES IV Oblivion hasn't got very good support for those who prefer using Xbox controllers on PC. Yes, we can toggle Use Joystick on in this game's settings menu, but getting true variable walking/running movement is not always guaranteed.

Morrowind also gives us the ability to Enable Joystick right in its Options > Controls menu, and oddly, variable movement works flawlessly in this game. But Morrowind also does a few things wrong, or at least .... odd. Using the left joystick for movement is flawless for instance, but using the right joystick for looking around does not work.

And there are a couple other odd things about how this game's controller usage got hardcoded by Bethesda. Some of you may already know of these odd things, which is why you're here.
So here is a guide on how I set up my Xbox 360 controller to work with Morrowind, on PC. Keep in mind, I use the Morrowind which came with the Anthology disc set. This is version MCP 2.4. Not sure if other versions, especially earlier versions, also have all the features found in 2.4.
1). First step is to procure
Xpadder. This is a small program which converts a controller's buttons, triggers, bumpers, and joysticks into mouse & keyboard inputs. It is easy to use, includes plenty of helpful walkthroughs, guides, forums, and costs a small, one-time fee. If you've never used this program before, go ahead and start with the site's walkthrough section to get your controller template working. This took me about a hour or two when I was new to PC gaming. It's sort of fun, magical even, to watch an Xbox controller come to life on PC as we set it up.
Joy to Keys and other such programs might also work, but I don't have any experience with these, and so this guide will focus on using Xpadder. Others out there can try using other programs, but I cannot guarantee they'll work.
Anyway, once the controller is working through Xpadder, move on to step 2. The rest of this guide shall describe how I like to set up my controller; others out there can try experimenting with what's below, to try to suit their ideals.
2). Start the game and go into Morrowind's Options > Controls menu. Toggle Enable Joystick on. Voila, Bethesda nailed it. We've got true variable walking / running movement, and can also strafe left and right with true variable speed. Beth's off to a surprisingly good start here, in this ancient game.
From here on however, things get downright bizarre.

Let's start with the Xbox's triggers.
-- With Morrowind, Bethesda did something really wonky with Xbox triggers:
they made it so that the left trigger makes us turn right, and the right trigger makes us turn left. 
The right joystick (which is what most of us would use to look around) is useless at this point; instead we're supposed to use triggers to look left and right!
Go ahead and try moving / looking around. What a mess, eh? How are we supposed to navigate the world like this?
3a). So let's start with the left and right triggers. Exit the game by pressing the Esc button > Exit. Now start Xpadder.
3b). Assign a keyboard key to each trigger. I just assigned the letter J and the letter M, left and right respectively. These two keys shall become my Journal and Menus in the game, see.
This is sort of a compromise, of course. Since Beth hardcoded the triggers to become the game's "look around" function,
that is exactly what those triggers will still do. I have searched and Googled, looking for a way to change this, but all I've found are other gamers out there, trying to change the same thing!
Good thing is, as long as I tap a trigger (rather than push it) I'll be able to pull up my Journal and Menus, with minimal character-spin. Since these two functions are brought up with one tap, this is why I prefer to map the triggers in this way. If I had mapped Jump to a trigger for instance, that would become awkward, as my character would now turn slightly left or right every time he or she jumped.
3c). Assign your controller's Start button with Esc on the keyboard. Now we can exit the game (as well as save, load, et cetera) without pressing Esc on the keyboard.
3d). I prefer my controller's A button to be what I use when I'm trying to Use something in the game (such as using a weapon, or casting a spell), but I also like the A button to select menu items. This equates to the left mouse button. So in Xpadder, select the A button and assign the left mouse button to it.
Final step with Xpadder is to get that right joystick to work, so it's
really important. We need to be able to look left and right, but also up and down, and all around.
3e). Right now the right joystick should be five blank buttons (when viewed through Xpadder) which are in the shape of a cross. Click on the "wrench" icon which is in the lower right of this cross.
3f). Select
Mouse - Normal at the top of the pop-up menu. Now select
Standard in the menu's lower portion. These are the two settings I like to use, and those who are reading this guide can try experimenting with other choices, such as W.S.A.D. or Arrows. But those settings I just used should guarantee right joystick movement corresponds to mouse (Look Around) movement in the game.
Click OK, closing the mouse menu.
3g). At the top of Xpadder, select the middle icon, which is in the shape of a square, save and name the Xpadder profile as it exists so far.
Now start the game, and make sure that right joystick allows us to look all around, just like it does in Oblivion, Skyrim, and every other game which allows controller support.
3h). OPTIONAL, for those who have problems with left joystick "creeping". In other words, we let go of the left joystick, but our character sometimes still 'creeps' (strafes) slowly left or right. Close the game and click on Xpadder's left joystick's wrench icon.
3i). On the right side of this menu is DeadZone. Use your mouse to drag the DeadZone pointer left or right. Notice the
red area which is in the center of the Status display. This area gets larger and smaller as we move the pointer right or left. Now move the left joystick around. This causes a dot to move around in the display as well. If the pointer remains in the
red area once the joystick is released, this is good. This means the game cannot read the joystick, and our character should no longer creep.
For those who have problems with strafe-creeping, you'll be wanting to drag the pointer somewhat to the right. I prefer about 40% to the right.
3j). Click OK, Save the profile, and get back into the game. Make sure your character no longer creeps.
The rest of your buttons can be set up while in the game, and I shall describe what I prefer. There are still a couple of wonky things to beware of, and I shall explain them.
4a). Press the Start button on your Xbox controller. This probably does two things: it opens up the menu which includes Return, New, Load (etc.) but it also opens up the game's quest journal. And I want to get rid of the "journal" part.
4b). You should be able to move the right joystick around to move the onscreen pointer around, or you can use the mouse to do so. Now select Options. Select Controls. The game's left joystick has already been set up as Enable Joystick, which is why Forward, Back, Left, and Right do not have corresponding keyboard inputs.
4c). Scroll down (scroll scroll scroll....) with the mouse wheel to Journal. Use the controller's A button (or left click with the mouse) on
Journal (it should turn red), and press the controller's left trigger. This will cause the current selection, which said Joy 6 I think, to go blank. Which is okay.
4d). Click OK, click Return, and close the Journal. Now try pressing the Start button again. The Save/Load menu should pop up, but the Journal should not. Try pressing the left trigger
lightly. This causes the Quest Journal to open.
... Now, some of you might not like this, and may wish to change the left trigger to Jump or Ready Weapon or whatever. Go ahead and experiment if you please.
... Also, if your game is like mine, Journal will glitch back on, every time the game is closed and restarted.

I don't know why this is. Every time I restart my game, I must also remember to reassign Journal to the left trigger, otherwise it also gets opened whenever I click on the Start button. Thankfully, Journal is the only button which glitches like this, at least for me.
5). The rest of those triggers, bumpers, buttons and joysticks can be set up however you'd like, but there are still a couple other things to watch for. The directional pad for instance. It is VERY sensitive.
Here is how I set up the rest of my controller...
Use = A button (Joy 0... left-click with the mouse on Use, select the controller's A button, and then use the mouse to right-click on Use. This can take a few tries.)
Activate = press left joystick (Joy 8)
Ready Weapon = Y button (Joy 3)
Ready Magic = B button (Joy 1)
Sneak = S, on the keyboard -- I've got my Xpadder profile so that if I press + hold the left joystick and press Y, this equals the letter S. This requires a second Xpadder template which activates whenever I press down on the left joystick. A bit complicated I know, but using the D-pad for sneak (as I originally had it) is too sensitive.
Run -- Not needed (the left joystick handles both walking and running). If Run has been automatically assigned a button, left-click on Run with the mouse. Now click on both mouse buttons: left-click and right-click, both at the same time. This should cause the area next to Run to be blank, unassigned to any button. And if that doesn't work, assign a key which is not used. For me this is the letter K.
Always Run -- Not used
Jump = X button (Joy 2)
Next Weapon = right bumper (Joy 5)
Previous Weapon -- Not used
Next Spell = left bumper (Joy 4)
Previous Spell -- Not used
Toggle POV = press right joystick (Joy 9)
Menu Mode = right trigger (the area next to Menu Mode will stay blank)
Journal = left trigger (the area next to Journal will stay blank)
Rest = Select button (Joy 6)
I personally have not figured out how to use all the Quick slots, Quick Save, or Quick Load, so from here I just click OK, click Return, and now I'm back in the game.
Always make sure your controller is ON when starting the game. If it is not on and the game is started, the game will revert some of those carefully-chosen settings back to pure Mouse + Keys, which can sometimes cause problems. Personally I always restart my game if this happens.
6). One final thing to add. Whenever we try to buy something, or pick up something from the ground, or from a container, and there is more than one thing to buy or pick up, the game will simply choose everything at once. So if we try to buy three arrows, but the merchant has 100 arrows, we'll wind up trying to buy all 100 of those arrows. This doesn't happen on Xbox.
On PC, this is because we need to press either Shift key (left or right, it doesn't matter) as we hover the cursor over multiple objects. So the Xpadder layout needs to be called up again. Choose any one of those buttons or bumpers, and make this correspond to either shift key. I used my controller's B button.
Back in the game, we'll need to HOLD the button just chosen as we buy or pick up multiple items. So I am holding my B button while hovering over multiple items, and then pressing the A button (Use) to select them. This causes a nifty scroll bar to pop up, and now I can select whatever number of items I choose.
The Shift key is also used when deleting spells. Again, put the cursor over the spell we wish to delete, hold your 'shift' button, and press Use. There will be a Yes No option to get rid of the spell.
-------------------------------------
TROUBLESHOOTING1). When in the opening menu, if n/a keep showing up under the Run function, assign an unused letter from the keyboard. I choose K, for instance.
---------------------------
2). If Rest says n/a, left-click on it, press Select button, now left-click on Rest 2x. It should say Joy 6
-----------------------------
3). If Use is blank, left-click on it, press A button, now left-click on it again.
If 2 and 3 keep failing (especially if n/a keeps alternating between Rest and Use) try alt-tabbing from the game. Change the A button on X-padder from mouse left-click to NONE.
Go back in the game. Reassign Rest and/or Use. Hopefully Rest should be Button 6 and Use Button 0. Make sure both of those work.
Alt-tab again, and reassign the A button to mouse left-click on X-padder.
-------------------------------
4). if it says n/a for any of the movement functions (Forward, Back, Left, or Right) left-click on whichever one it says and press the mouse wheel.
Renee
Dec 11 2022, 11:41 PM
Get a Job! Game: TES V: SkyrimI wanted to make one of my characters in this game get a job working for
Corpulus Vinius of the Winking Skeever in Solitude. The idea is going to be that my lady becomes a barmaid. She shows up looking for work, speaks briefly to Corpulus, who gives her a job. Once she's officially hired my barmaid then goes from patron to patron, asking if they'd like anything. Each patron either declines her service or accepts.
This does seem like a pretty useless idea for a mod, I'll admit. But I wanted to use this scenario to learn how variables work in the Creation Kit. Others out there might want to use some of these ideas for something more adventurous: maybe collecting pelts for a skinner, maybe collecting ores for a smith, and so on.
When I was involved more with TES 4: Oblivion, Sarah Phimm became a 'bar wench' as well,
toiling for Mog gra-Mogak in Skingrad. She would make food, give it to Mograk several times during her shift, and make a menial amount of money. I was able to make this happen after installing
Oblivion Jobs, but I also enhanced this mod with my own quest and dialog, so that Sarah could wait tables, making occasional tips (or not). Some customers were grateful, others were rude, and so on. All of this was easy to do. So easy, I didn't even bother writing a homemade tutorial for myself at the time, explaining how this was accomplished.
For Skyrim things are tougher, of course. I installed a jobs mod for Skyrim a few years back, but it required the USLEEP patch, which broke my game. CTDs between cells and worldspaces.

Obviously we can't have that. So it's time to make our own content.
Now, there are a myriad of ways this can be made to work. For instance, there could possibly be a barrel full of supplies. Every time somebody asks for, let's say, a beer, she'll go to that barrel and see if there's a beer there. If there is, she returns to the table and delivers the beer, and there'd obviously be dialog for this. If not, there'd be dialog for that.
We can also make it so Corpulus gives a bunch of alcohol right at the beginning of her shift. Every time a sale is made this causes a tally to count. Perhaps we can use GetItemCount for this scenario.
Finally, another way to do this is every time somebody wants a drink, she returns to Corpulus, who gives her one. Then she returns to the
alcoholic patron. -- That's the way I'm going to do this: one at a time. Also, I'm going to make this quest so that there's an end possibility of either quitting, or getting fired.
1). Open the Creation Kit and start a quest. Give it an ID (I'm going with aaaBarmaidJob), give it a name, make Priority 40.
I like 40 because what'll happen is the game will put some dialog up top, bumping the "service" dialog I'm about to write down a few notches. This makes many other topics available through that NPC seem more important. And isn't this true of real bars? People get drunk, then they want to tell us their whole life story.

Finally, the bartender needs to ask "Can I get you anything?"
Click OK (so other quest tabs open up). Save.
FYI: To figure out how to make something like this operate I found a quest in the Creation Kit called
FavorJobsBeggars. I wanted to study how this quest works because of its simplicity. Beggar asks for a coin, we give him/her a coin. For this, we get The Gift of Charity, short-lived magical effect which fortifies Persuasion. Simple enough, or so it would seem. Turns out, I had to come up with some other ways to make my idea work, which has zero similarity to that beggar quest.
OBJECT WINDOW > Character > Quest2). Reopen the quest. On the Quest Data page, choose Side Quests for the Type scroll-bar.
3). Start Game Enabled should be toggled on by default. But toggle Run Once off.
4a). Click on the Quest Stages Tab. Five stages are needed: I'm going with 0, 10, 50, 99, and 100.
Stage 0: Toggle Start Up Stage on. Right-click > New into the top Log Entry box so it says EMPTY.
Stage 10: Right-click > New into the Log Entry box and do nothing else. During this stage we're going to speak to the innkeeper, the shopkeeper, whomever. Dialog will be added, during which we'll ask if there are any jobs. And of course there are.
Stage 50: We're hired on the spot!
Right-click > new into Log Entry. In the lower Log Entry box type "I have found a job", or whatever.
Stage 99: Right-click > New, etc. Toggle Shut Down Stage and Fail Quest on. During this stage we can possibly get fired. In real life, we can get terminated for all sorts of reasons: insubordination, not showing up, showing up late, and so on. For the purposes of this tutorial, I'm keeping it simple. The only way we can get fired is if we don't sell any drinks at all. Of course, the possibility of losing our job is near-impossible for obvious reasons. I.e., IT'S A BAR!!!
> Type "I have not made enough money, so I have been let go from my job", or whatever.
> In the Papyrus Fragment box, type Stop()
Stage 100: In this case, we "beat" the quest by quitting.
Wouldn't that be nice. Right-click > New into the Log Entry box and type "I have quit my job........"
> Toggle Shut Down Stage and Complete Quest ON.
> In the Papyrus Fragment box, type Stop()
4b). Click OK and save.
Reopen the quest, and click on Dialogue Views or Player Dialog. I'm more comfortable with Dialogue Views so that's what I'm using for the rest of this lesson.
5a). Right-click > New into the vertical left window of the Dialog Views page and type an ID. I'm typing aaaJobQuestHiringBranch. Click OK.
5b). Highlight the ID just created and right-click > Create Branch into the large window on the right. Give this Branch a unique ID and click OK.
5c). Right-click > Edit Topic into the gray box within the yellow box. The Topic panel pops up. Give this topic an ID and type some Topic Text. I've got aaaJobQuestYoureHired for an ID. For Topic Text I've got "I'd like a job. Are you hiring right now?"
5d). Click OK twice, closing the Topic panel. Probably a good idea to also click OK on the Quest window as well, so we can save.
5e). Reopen the quest. The same page should open, so right-click > Edit Topic into the gray box, and right-click > New into the large Info window.
5f). Type the proprietor's Response Text. "Sure, we could use somebody here. Have you ever worked as an X before?" ... X being woodchopper, bar wench, hunter / gatherer, whatever.
5g). Here are the conditions I put into the Conditions tab.
GetStage Quest: aaaBarmaidJob < 10.00 AND
GetIsID Actor: 'CorpulusVinius' == 1.00
Right-click on either of these and choose Copy All Conditions.
5h). In the End: Papyrus Fragment box type
GetOwningQuest().SetStage(10)5i). Left-click on the Response text written a moment ago and click Record. Record your own voice, have someone else do it, or simply record silence. Once that's done, click Stop. Click Save. Toggle From WAV on, and click Generate Lip File.
5j). Click OK, closing the Response Text panel. Make sure Has LIP File and Force Subtitle are both toggled on (those who recorded actual voice might not need Force toggled on) and click OK.
That's the opening text. Now the PC's going to ask for a job.
6a). Return to steps 5c through 5f, except right-click > Add Topic into the yellow box, so some follow-up dialog can be made. For Topic Text I've got "I've never held a job before, is that okay?" since this answer follows the question asked during 5f.
The bartender's Response Text is "Sure I could use a second barmaid...Shift hours range from 11 in the morning until 6 at night, but you don't have to be here for all seven of those hours..."
Basically, the idea I've got is that my character will need to sell at least 1 bottle of ale to keep her job, and also get paid. She works anywhere
between 11:00 and 18:00, but can only get paid
after 18:00, because that's when the shift ends, and Corpulus has a dialog change. This is absolutely silly, of course. In real-life we'd need to show up near 11 AM, or else. But this is a game. So I'm trying not to be so strict. 🕥
6b). Right-click > Paste Conditions into the Conditions window, but change GetStage to 10. Altogether now I've got....
GetStage Quest: aaaBarmaidJob == 10.00 AND
GetIsID Actor: 'CorpulusVinius' == 1.00
6c). Type
GetOwningQuest().SetStage (50) into the End: Papyrus Fragment box, or simply copy it from the Topic Info panel created before. If you copy/paste, make sure to change the 10 to 50. Stage 50 is where the quest shall live as long as we're working at this job.
Click OK, closing the Topic Info panel.
6d). Left-click on the first topic's middle area, so that a hand icon shows onscren. Drag the hand over to the second topic. (Those who use Player Dialog will need to use the Link To window to link the first topic to the second.)
Click OK. There we go. Our character's got a job, thanks to that nifty speech process. Next, we're going to create our own variable. In the CS or GECK, many quest and script variables coincided with whichever quest or script the variable was associated with. For the Creation Kit (as usual) this is often done differently. We can literally declare a variable (actually, they're called global variables) which has nothing directly to do with any particular quest, or a script within that quest. Is this also how it's sometimes done in the old editors? Probably so, but I've never utilized variables in such a way in those older programs.
7a)..
OBJECT window > Miscellaneous > GlobalAll the game's global variables are listed in the larger Object window. Right-click > New and give the new variable an ID. I am typing aaaDrinksBought into the ID slot. COPY this name and put it on a Notepad page, so it can be pasted later.
7b). Variable type can be Short if we want the game to count whole numbers (such as 1.00 and 4.00) or Float if we want a decimal point to float back and forth (0.75, 1.50, etc.). In most cases Long is not used. And I'm keeping my variable on Short.
7c). Leave the Value at 0 and do NOT toggle Constant on. Apparently, Constant means the game won't be able to count or change the value for whatever items we're dealing with. Whichever value the variable starts at is where it will
constantly stay, see?
7d). Click OK and save.
8a). OBJECT Window > Character > QuestSelect the Quest Data tab. Now, right-click into the Text Display Globals window (which is the lower right) and choose New. Find the global just created. Click OK.
Apparently we don't have to do this 100%. Bethesda never seems to use this window. But it's an option, which makes things organized a bit nicer.
8b). Click OK (closing the Quest window) and save.
9a). Reopen the quest, and select the Misc tab. Let's give the boss a greeting. Right-click > New into the middle window and select Hello. Highlight this and right-click into the right window and follow the typical process for making dialog. "Ah, look who's here." Follow all the processes for recording (even if it's just silence), and so on.
9b). Conditions are...
S GetGlobalValue Global: 'GameHour' > 11.00 AND
S GetGlobalValue Gloval: 'GameHour' < 15.00 AND
S GetStage Quest: aaaBarmaidJob == 50.00 AND
S GetIsID Actor: 'CorpulusVinius' == 1.00
Note that it is possible to make a tardiness factor at this point. For those who really want to be strict just change the second GameHour from 15.00 to 12.00. Make a second Hello which says "You're late! This better not happen again." A variable can then be used to make it so the boss only gives one chance. Once that variable climbs from 0 to 1 to 2 (as we're late twice), we're 86'd! ⌚
A final hello can be added, which states "Sorry, but gonna have to let you go..." which setstages to Stage 99.
9c). Locate the Hours Until Repeat slot, which is to the right of the other flags. Normally this is set at 0.00. Change this to
12.00. This is done so the bar owner won't keep greeting us with the same greeting. Basically, the shift lasts from 11:00 until 18:00, which is 7 hours. But we want to give a bit of extra time just so he doesn't keep delivering the same Hello on the same day.
Note:
There is no Say Once a Day flag like there was in Fallout 3's/NV's GECK, so what just happened in 9c can simulate this.9d). Now switch to Dialogue Views or Player Dialog. I am right-clicking > New into the Dialog Views window again, then following the steps above for making a new branch, and adding a topic to this branch. 5a through 5j. This phase of the quest is about us showing up for work, and speaking to whoever runs the place. In my game I've got...
ID: aaaJobStartWork
Branch: aaaJobStartWorkBranchTopic
Topic Text: "I'm here! What's going on at the Skeever today?"
Response Text: "Ah, glad you have arrived. Let's see if we can make some sales today."
Conditions:
S GetGlobalVariable Global: 'aaaDrinksBought' == 0.00 AND
S GetGlobalValue Global: 'GameHour' > 11.00 AND
S GetGlobalValue Gloval: 'GameHour' < 18.00 AND
S GetStage Quest: aaaBarmaidJob == 50.00 AND
S GetIsID Actor: 'CorpulusVinius' == 1.00
The way I've got this set up, the hire will need to speak to his/her boss first, before selling any drinks. This is not 100% necessary, it's simply the way I prefer things. `=
9e). Change the Hours Until Repeat slot from 0.00 to 12.00.
For those who are not making a job in which we're constantly interacting with the boss; let's say the boss is spoken to once, and then we're off to go hunting animals or whatever for the next day or however long, Hours Until Reset might not be needed at all. 9f). Select either of the Papyrus Fragment boxes: Begin or End. Type a semicolon and follow it with any text at all. Doesn't matter what it is, but perhaps it's best to put a description of what we want to happen at this moment.
So for instance I am typing
; Here is where the first variable gets set into the End: Papyrus Fragment box. This actually doesn't do anything in the game at all, but it's important to get a simple script into the Script Name window. We cannot add properties here unless there's a script already present.
9g). Click OK, and click OK again. Reopen the quest.
9h). Highlight the script so it turns
blue. Click the Properties button. And select Add Property.
9i). Find Global Variable in the Type scroll-bar. For Name, we can just put the ID name of the variable created earlier. So I am putting aaaDrinksBought into the Name slot. This can simply be copy/pasted from that Notepad page started earlier.
>>
Thing is, if we're constantly typing the variable name into this slot and in other areas of the quest's windows, and let's say we get it wrong. This can cause error messages if we consistently get it wrong! 9j). Click OK. Left-click on the property so it turns
blue. If you gave the property the same name as the variable, it should automatically appear in the Pick Object scroll-bar. If not, find the variable.
Click OK, and OK again, closing the Quest panel. Note that it's important to keep OK-ing and re-opening the Quest panel, because this saves any actions just performed. If this is not done; if the modder just skips to the next step that is, have fun dealing with a litany of errors.
9k). Reopen the quest window. Now type
; aaaDrinksBought.SetValue(1) into the End: Papyrus Fragment box. Compile that bit of code WITH the semi-colon in front. Now remove the semicolon and compile again. Voila. No error messages? Go ahead and close the Quest window and save.
On the other hand, if there ARE error messages do NOT press OK. Instead, click on the
red X in the top right corner of the Topic Info panel and try again. The worst thing we can do in Skyrim's Creation Kit is introduce faulty script fragments into the game.
The next bit of dialog in my game is going to come from any customers who dwell within Winking Skeever.
10a). In the Dialogue Views or Player Dialog tabs once again. Here's what I've got in my game.
ID: aaaBarWenchServiceID
Branch: aaaBarWenchPatronServiceBranch
Topic Text: "Can I get you anything?"
Response Text: "Yeah, gimme an ale."
Conditions:
S GetIsID Actor: 'CorpulusVinius' != 1.00 AND
S GetIsID Actor: 'Lisette' != 1.00 AND
S GetGlobalVariable Global: 'aaaDrinksBought' == 1.00 AND
S GetStage Quest: aaaBarmaidJob == 50.00 AND
S GetInCell Cell: 'SolitudeWinkingSkeever' == 1.00
> As we can see, anyone can get asked this question "Can I get you anything?" except the bar's owner, or Lisette. Lisette is the lady who plays music. Um, she's the bard.
>> Do not use the Prompt slot for this topic. We're going to want just ONE topic to click on, but two or more infos as a result.
10b) Has LIP File and Force Subtitle should both be toggled after recording is done. Toggle Random as well. This is done so the patron can refuse service, which we'll write up in a moment. Goodbye can be toggled, though this is optional.
10c). Change the Hours Until Reset slot to some small amount, such as
0.25. This allows a little time, so the same "Can I get you anything?" topic theoretically doesn't immediately show up (from the same NPC) after we've retrieved money, gotten a drink from Corpulus. Keep in mind I've got my timescale set to 30. Those with slower timescales, or even Skyrim's default of 20, might want less time than a quarter-hour.
0.25 (a quarter hour in-game) translates to roughly 15 seconds in our time with timescale of 30. I think..
10d). Type a semicolon and follow it with some text into either Papyrus Fragment box and compile. I just typed
; Patron gives barmaid money. Click OK twice. Reopen the same quest windows.
Now we need to make two properties: one for money, and one for the global variable. Let's start with the variable.
10e). Highlight the TIF script so it turns
blue. Click the Properties button. And select Add Property.
10f). Find Global Variable in the Type scroll-bar. For Name, we can just put the ID name of the variable created earlier. So I am pasting aaaDrinksBought into the Name slot.
10g). Click OK. Left-click on the property so it turns
blue. If you gave the property the same name as the variable, it should automatically appear in the Pick Object scroll-bar. If not, find the variable.
Click OK, and OK again, closing the Quest panel.
10g). Reopen the quest window. Now type
; aaaDrinksBought.SetValue(2) into the End: Papyrus Fragment box. Compile that bit of code WITH the semi-colon in front. Now remove the semicolon and compile again.
10h). Highlight the script and press the Properties button. Click Add Property.
10i). Find MiscObject in the scroll-bar and type Gold001 into the Name slot. Click OK. Click Edit Value. Again, Gold001 should automatically be in the Pick Object scroll-bar. Click OK.
Click OK twice more (closing the Topic Info and Quest panels) and reopen.
10j). Type
Game.GetPlayer().AddItem(Gold001, 5) into the Begin: Papyrus Fragment box. Click OK twice more.
OPTIONAL: A sixth condition can be added to the stack above in 10a, which'll check to make sure the NPC has enough money in his/her pocket. Add
GetItemCount MiscItem: 'Gold001' >= 5.00, and make sure the Run On scroll-bar has Target selected. Another script/property can be used to remove gold from the NPC.
This gets complicated though. It's beyond my capabilities as a modder, but let's also consider that eventually the NPC will run out of money! And once this happens, will that money ever respawn in their inventory? There's a bard mod which was used by Lopov a couple years back which did consider how much money was in the pockets of various NPCs, and somehow it also removed this money as they requested songs. Guess what? Eventually those NPCs would run out of money!
Up to you, folks.
11a). Now let's add some dialog which'll allow the patron to refuse service. Go back to the same branch which was just made for serving drinks. Right-click into its center (which should either be white or grey) and select New Info.
Topic Text: "Can I get you anything?" -- essentially this is the same text which is used for "Yes, gimme an ale."
Response Text: "No, I'm good."
Conditions:
S GetIsID Actor: 'CorpulusVinius' != 1.00 AND
S GetIsID Actor: 'Lisette' != 1.00 AND
S GetGlobalVariable Global: 'aaaDrinksBought' == 1.00 AND
S GetStage Quest: aaaJob == 50.00 AND
S GetInCell Cell: 'SolitudeWinkingSkeever' == 1.00 AND
11b). After recording is done Toggle Has LIP File, Force Subtitle, and Random. Goodbye should also be selected. Make sure a small number is in the Hours Until Reset slot. This time I've got 0.50. Click OK.
Notice that Random is selected for either service choice: Yes or No. As my character moves from patron to patron, some will want a drink, others will not.
Now to make the innkeeper hand over some drinks.
12a). Yet another branch is needed. I think we're up to four of these so far. I've got something like this...
ID: aaaBartenderFetchDrinks
Branch: aaaBartenderFetchDrinksBranch
Topic Text: "Someone over there wants a drink."
Response Text: "Here ya go!"
Conditions:
PL GetItemCount: MiscObject: 'Gold001' >=5.00 AND
S GetGlobalVariable Global: 'aaaDrinksBought' == 2.00 AND
S GetGlobalValue Global: 'GameHour' > 11.00 AND
S GetGlobalValue Gloval: 'GameHour' < 18.00 AND
S GetStage Quest: aaaBarmaidJob == 50.00 AND
S GetIsID Actor: 'CorpulusVinius' == 1.00
12b). After writing up the Response Text I toggled Use Emoticon Animation off, selecting IdleGive in the Idle Animations/Speaker scroll-bar. This is obviously to make it seems like the bartender's giving a bottle to my toon.
12c). After recording, toggle Has LIP File, Force Subtitle, and Goodbye on.
12d).. Follow steps 10d through 10j to make a simple semicolon script, and a property for the money. Here is how to utilize them...
; Player gives money to boss
Game.GetPlayer().RemoveItem(Gold001, 5)This time I put the gold removal script into the Papyrus: Begin Fragment box, as my character's supposed to be handing the money just paid over to the barkeep right away.
Click OK twice.
12e). Reopen. Make a second property following the steps above, except this time choose Potion in the Type scroll-bar. I've chosen aaaAleProperty as the property name, as for some reason just typing Ale caused problems. Once that was done I clicked Edit Value and manually found Ale in the scroll-bar.
12f). Click OK twice and reopen. In the Papyrus: End Fragment box type
Game.GetPlayer().AddItem(aaaPropertyName, 1), with "aaaPropertyName" whatever you really named that property. Click OK 2x. Save.
12g). A third property can be made which bumps
aaaDrinksBought.Setvalue(3), though this is optional. Without this addition, if we speak to the boss he or she will still have the "Someone over there wants a drink" and "Here you go" Topic Text and Response, meaning the player can just keep hitting the boss up for endless drinks!
But otherwise, there we go. Now my lady's got a drink she can serve.
13a). Start another branch, and this time ...
ID: aaaBarmaidServeDrinks
Branch: aaaBarmaidServeDrinksBranch
Topic Text: "Here you are."
Response Text: "Why thank you!"
Conditions:
PL GetItemCount Potion: 'Ale' >= 1.00 AND
S GetStage Quest: aaaBarmaidJob == 50.00 AND
S GetInCell Cell: 'SolitudeWinkingSkeever' == 1.00 AND
S GetIsID Actor: 'CorpulusVinius' != 1.00 AND
S GetIsID Actor 'Lisette' != 1.00
Flags: Has LIP File, Force Subtitle, Goodbye.
Script: ; Barmaid serves drink.
13b). In the Begin: Papyrus Fragment box create the same property as before using the steps above, but change the value:
aaaDrinksBought.SetValue(1). This is done so the quest returns back to where it was before, and we can ask someone else if they'd like a drink. 🍷
13c). The same property for the drink can also be used:
Game.GetPlayer().RemoveItem(aaaPropertyName, 1). I put this into the End: Papyrus Fragment box.
Click OK 2x. Next step is to make it so that the boss can pay us when the shift ends. We will also have the option to quit during this phase of the quest, or get fired (although as stated, my lady would really have to suck to get fired).
14a). Start yet another new branch.
ID: aaaBarmaidEndOfShiftID
Branch: aaaEndOFShiftBranch
Topic Text: "Looks as though my day is done."
Response Text: "Wonderful! Excellent service, today."
Conditions:
S GetGlobalVariable Global: 'aaaDrinksBought' == 1.00 AND
S GetGlobalValue Global: 'GameHour' > 18.00 AND
S GetGlobalValue Global: 'GameHour' < 23.00 AND
S GetStage Quest: aaaBarmaidJob == 50.00 AND
S GetIsID Actor: 'CorpulusVinius' == 1.00
Flags: Has LIP File, Force Subtitle, Goodbye.
Script: ; End of shift begins now
14b). Make a property for Gold001 and also the same variable (which I called aaaDrinksBought earlier).
Game.GetPlayer().AddItem(Gold001, 40)
aaaDrinksBought.SetValue(0)Now that the global variable is set to 0 if we try to speak to the boss he won't have anything to say regarding the day's job. There'll only be the usual topics he normally offers (Have you heard any rumors?, etc.) before we barged in with our own content. And this is how it'll stay until 11:00 the next day, unless some after-hours dialog gets added.
But the quest is not over yet. We still need to have some dialog regarding getting fired, or quitting.

An optional step is going into the Misc tab and making another Hello. "Ah, whatta day," says the boss.
S GetGlobalValue Global: 'GameHour' > 18.00 AND
S GetGlobalValue Global: 'GameHour' < 22.00 AND
S GetStage Quest: aaaBarmaidJob == 50.00 AND
S GetIsID Actor: 'CorpulusVinius' == 1.00
I gave 4 hours of leeway there just in case of emergency.
15a). Object Window > Miscellaneous > GlobalMake a new global. I'm calling this one aaaFiredGlobal. Leave it on Short, and leave Value at 0. Copy this name and paste it onto the Notepad page.
15b). Reopen the quest, and click on its Quest Data tab. In the Text Display Globals window find the new global just added.
15c). Go to Dialogue Views or Player Dialog. Find the Topic/Info panel which deals with making the first sale. "Yeah, gimme an ale" says the NPC in my game.
15d). Follow the process above for making a Global property (left-click the TIF script so it turns blue, click Properties, Add Property, GlobalVariable in the scroll-bar, paste or type the name of the global in the Name slot, click OK (if the name already shows in the Pick Object scroll-bar, that is), OK, OK...
15e). Put
aaaFiredGlobal.SetValue(1) into the Begin: Papyrus Fragment box. Compile. OK. OK.
15f). Reopen the quest and find the "end of shift" topic/info. Add a fifth condition which is
GetGlobalValue Global: 'aaaFiredGlobal' == 1.00. And yes, I know it appears that Fired == 1, yet we're not being fired.
Altogether now we've got...
S GetGlobalVariable Global: 'aaaFiredGlobal == 1.00 AND
S GetGlobalVariable Global: 'aaaDrinksBought' == 1.00 AND
S GetGlobalValue Global: 'GameHour' > 18.00 AND
S GetGlobalValue Global: 'GameHour' < 23.00 AND
S GetStage Quest: aaaBarmaidJob == 50.00 AND
S GetIsID Actor: 'CorpulusVinius' == 1.00
15g). Finally, go to the "beginning of shift" dialog started in step 9a. Follow the process above for making a Global property (left-click the TIF script so it turns blue, click Properties, Add Property, GlobalVariable in the scroll-bar, paste or type the aaaFiredGlobal into the Pick Object scroll-bar. Click OK, click ok...
15i). Reopen the Quest window. Put
aaaFiredGlobal.SetValue(0) into the Begin: Papyrus Fragment box. Compile. OK. OK.
That's the happy shift ending. Now for the sad one.
16a). Reopen the same quest/branch which was used for "end of shift", right-click into its center, and select New Info. Follow all the usual steps for making new dialog...
Topic Text: "Looks as though my day is done." (THIS won't need to be changed).
Response Text: "I'm afraid it is. Looks like you've bottomed out with sales today.
I'm afraid I'm gonna have to let you go..."
Conditions:
S GetGlobalVariable Global: aaaFiredGlobal == 0.00 AND
S GetGlobalValue Global: 'GameHour' > 18.00 AND
S GetGlobalValue Global: 'GameHour' < 23.00 AND
S GetStage Quest: aaaBarmaidJob == 50.00 AND
S GetIsID Actor: 'CorpulusVinius' == 1.00
Flags: Has LIP File, Force Subtitle, Goodbye.
Script:
GetOwningQuest().SetStage(99) can go into the Begin or End Papyrus Frag boxes.
17a). Finally, let's take this job and shove it! There are three ways this can be done. Quit dialog can be made to (1) be an option at any time (2) be an option only after the shift is done or (3) be an option while we're working.
Start a new branch, and this should be the very last one.
ID: aaaBarmaidJobQuit
Branch: aaaBarmaidJobQuitBranch
Topic Text: "I'm taking this job and shoving it!"
Response Text: "But...but why? What am I going to do without you?" (I believe there is a Emotion Animation which makes the NPC cry or at least bow down in sadness.)
Flags: Has LIP File, Force Subtitle, Goodbye.
Script:
GetOwningQuest().SetStage(100)17b). Conditions vary. If we want the option to be able to quit at any time, thereby ending the quest entirely, all that are needed is something like...
S GetStage Quest: aaaBarmaidJob == 50.00 AND
S GetIsID Actor: 'CorpulusVinius' == 1.00
If we want to quit during work hours...
S GetGlobalValue Global: 'GameHour' > 11.00 AND
S GetGlobalValue Global: 'GameHour' < 18.00 AND
S GetStage Quest: aaaBarmaidJob == 50.00 AND
S GetIsID Actor: 'CorpulusVinius' == 1.00
And if we're doing this strictly after hours (effectively getting paid before we quit)...
S GetGlobalValue Global: 'GameHour' > 18.00 AND
S GetGlobalValue Global: 'GameHour' < 23.00 AND
S GetStage Quest: aaaBarmaidJob == 50.00 AND
S GetIsID Actor: 'CorpulusVinius' == 1.00
Thing is, for those who choose the anytime-quit scenario, the boss is always going to have that Topic Text we can click on at all times, which can be rather awkward. I think I prefer the after-hours scenario.
18). Don't forget to update your mod's SEQ file after all dialog is written up, or while it's being written, for those who are in the habit of testing along the way. This is especially true when going into the game, trying to speak to the boss or whomever, and none of our dialog is showing up. Here's how to do it
(Click Here), in case a quick reminder is needed.
Renee
Jan 21 2023, 07:32 PM
Traveling with an NPC. Game: TES V: SkyrimHere's my next wacky idea. Usually when we've got a companion, he or she is following us. But for this post the opposite is true. My character's going to be following an NPC.
I've got a high elf Healer who's going to be taking her healing skills on the road, by helping travelers she randomly encounters, but also I've got a more specific idea: helping somebody get to another destination. The specific traveler wants my elf to go with him, healing him up as encounters occur, and wounds are suffered.
The idea here is that a random NPC is going to dwell within Whiterun's Bannered Mare. This NPC wants to go to some other location, and wants my healer to accompany him, keeping him full of health. I want this to seem like a somewhat random endeavor, so that the person who tries to hire my healer will be a bit different every time he respawns.
This first travel journey is going to be a test. The NPC will ask my character to walk to Dragonsreach. Once he gets there he'll be satisfied, and dialog will change. He'll give my character some money. In the future, there will be much greater distances being requested: Riverwood, Falkreath, Windhelm, and so on. But let's start off with something basic and easy.
Object window > Character > Class1a). So, class-wise, which sort of NPC's going to need a healer the most? Warriors, that's who. Warriors, fighters, basically those who've put all their skills into wielding weapons and shields while wearing armor, but have eschewed magical disciplines.
So first thing is to find a Class which already has some of the features I'm wanting. I scrolled the Class window down until I got to CombatWarrior1H. Right-click > Edit this class.
1b) ID is being changed to aaaWarriorClass. I'm clicking OK, choosing "Yes" when it asks if I'd like to make a New Form. Reopen the new class.
Thing is, even though the selections on the Class panel feature 1-handed warriors I'm going to modify this so a 1-handed OR a 2-handed guy can show up.
1c). I'm leaving Full Name as Warrior. The main thing I'm changing are the Skill Weight for Two-Handed, which is being changed from 1 to 3. I also added 2 into the Light Armor slot. Hmm. Nothing else really needs to be changed.
1b). Click OK.
Object window > Character > Faction2a). Right-click > New. ID = aaaTravellerFaction, Name: Traveller Faction.
2b). Click the General tab. Hidden from PC is toggled on. Right-Click > New into Interfaction Relations and find PlayerFaction in the scroll-bar. Ally can be selected. I'm not choosing Friends and Allies because I don't want the guy to become too helpful to other travelers on the road, who are being attacked.
2c). In the Crime tab we can select any of these toggles (or not), depending if we want somebody who doesn't care what we do at all, to somebody who's a stickler for any sort of criminal activity.

All the toggles are self-explanatory.
2d). Click OK, unless more features are desired (training, merchant ability, etc.)
Object window > Actors > Actor3a). Click on the Actors > Actor section. Right-click > New. I'm going to make a template, which will make it easier to make NPCs
from this template in the future. There's going to be more than one NPC who wants my character's services, and templates make it easier to set up multiple people in the gameworld.
ID: aaaWarriorTemplate
Name: Warrior Template.
3b.) Toggle Respawn on, do NOT toggle Unique.
3c.) Race can be anything human, elf, or beast, but the main thing is we're going to want to choose a Voice Type which works. Any of these below are supposed to work...
MaleEvenTonedAccented
FemaleSultry
MaleDrunk
FemaleDarkElf
MaleDarkEfl
MaleNord
FemaleCommander
MaleBrute
MaleArgonian
MaleKhajiit
FemaleOrc
FemaleCondescending
MaleEvenToned
FemaleEvenToned
MaleYoungEager
FemaleYoungEager
3d). Here is how I've got the rest of the tabs set up... and these can be played with, depending if a wimp is desired, or an Uberboss. Note that I am only messing with the choices which matter. Everything else not mentioned is optional. Keep in mind that what's being made is NOT the actual warrior NPC who wants assistance, it is a template for other warrior NPCs.
Stats tab
Auto Calc Stats can be chosen along with the Level slot if a static NPC is desired. I prefer PC Level Mult, with 2.00 in the Level Mult slot. This way, the traveling NPC is always tougher than my healer.
I also used the Class scroll-bar to find the aaaWarriorClass made a few steps ago.
Factions tab
Right-click > New and find the faction just created. aaaTravellerFaction is what I've got.
AI Data tab
Aggression: Aggressive
Confidence: Brave
Assistance: Helps Allies
AI Packages tab
DefaultSanboxCurrentLocation1024 is a good one to choose, since it'll cause the NPC to do random stuff wherever he winds up, but he won't try to return to Bannered Mare. In other words, don't choose an Editor version of Sandbox.
This Sandbox package will become the "base" AI that the NPC will possess during time off. More packages will get added later which will have the ability to override this sandbox package.
Inventory tab
Um, Actually, I'm going to stop before continuing with the Inventory tab. Stuff will get added here in a moment, but it's not as simple as finding stuff in the main Inventory window. Because the idea is that the NPC who shows up in the game is going to wear totally random stuff, and carry a random weapon.
3d). So click OK, closing the Actor panel.
Object window > Items > LeveledItem4a). Right-click > New so that the LeveledItem panel pops up. Here's what I got:
ID: aaaWarriorArmorList
Chance None: 0
Calculate from all levels <= PC's level: OFF
Calculate for each item in Count: OFF
4b). Now click on Items > Armor in the left side of the Object window, and drag whatever is desired into the LeveledItem's main window. I dragged ArmorIronCuirass, ArmorLeatherCuirass, and ArmorBandedIronCuirass A mishmash of armor types, basically.
Just for fun, I also dragged ClothesFarm into the window, which is a separate leveled list. 🧺 This way, the NPC can be met while wearing armor, but there's also a chance for ordinary clothes, as well.
We can also right-click > New into the window to find armor that way.
4c). Steps 4a through 4c can be followed to also add Helmet and Boots into separate LeveledItem lists. For Boots I set Chance None at 0 (so the NPC will always have a chance of wearing several boot types) but I made the aaaWarriorHelmetList with a 50% of Chance None. Just for variety.
4d). Click OK.
4e). Follow the same process for weapons: 4a through 4d. Here's what I came up with.
ID: aaaWarriorWeaponList
Chance None: 10
Calculate for each item in Count: OFF
I dragged a bunch of iron into the main window: IronGreatsword, IronMace, and so on. Only
one of these will be chosen, since the Calculate toggle is off. There's a chance the NPC won't have a weapon at all when he's met. Note that I've got 1-handed
and 2-handed weapons, to mix things up as much as possible.
Object window > Items > Outfit5a). Right-click > New into the right window. ID = aaaWarriorOutfit in my Creation Kit.
The Outfit section determines what the NPC shall wind up wearing out in the world. We cannot just add clothing or armor items into their main Inventory; they'll wind up not wearing anything if it's done this way.
5b). Drag or right-click > New the Leveled List items into the Outfit window. So I've got aaaWarriorArmorList, aaaWarriorBootsList, and aaaWarriorHelmetList.
5c). Click OK.
5d). Reopen the NPC template (Actor) panel. The Inventory tab should be open, or opened. Use the Default Outfit scroll-bar to find the Outfit just made. So, aaaWarriorOutfit is what's in my CK.
5e). Right-click > New into the Inventory window, and find the weapons list made earlier. Click OK, closing the Actor panel. The NPC can also have gauntlets added directly here, including a LeveledList version of gauntlet choices.
There. The NPCs which get pulled from this template will got random gear, Stats and Level will vary, and he's part of a faction which is completely separate from anything vanilla. We cannot make random faces, but later on it's possible to make several NPCs, who will later become part of a randomized list drawing from the 'Warrior List' made in step 3a, so that a different (and only one) NPC shows up at a time, and with random gear.
5f) Still in the Actor section, right-click into the Object window and select New. I am making aaaWarrior01 for the ID, and Name is simply staying as Warrior. I don't have a problem with generic names, but I know a lot of gamers do.
5g). Change the ActorBase scroll-bar (middle-lower-left side of the Actor panel) from NONE to whatever the name of the template is. So in my game, it'll be aaaWarriorTemplate.
5h). Now toggle the following on: Use Traits, Use Stats, Use Factions, Use AI Data, Use AI Packages, Use Def Pack List, Use Attack Data, Use Inventory, and Use Base Data. Click OK. A script might also get added to the template to make the NPC return or teleport back to his original location, we'll see.
Cell and Render Windows6a). Find whichever cell is desired and drag the NPC into the Render window. Keep in mind that he might appear without clothes, which is fine. Once we're in the game he'll be wearing something due to the Outfit added to his inventory.
6b). Double left-click NPC in the Render window, and click the Persist Location tab and find whichever cell or worldspace the NPC will dwell in. I've got WhiterunLocation. Click OK.
6c). Give the NPC a Reference ID. I've got aaaWarrior01Ref. Copy/paste that name to the text page.
Save. Now start the game, get your character into whichever cell or worldspace was used to drop the NPC into. Make sure the NPC's wearing clothes or armor, and has a weapon (if a weapon was added into inventory).
Object window > Miscellaneous > Global7a). Make these Globals:
aaaAccompanyGlobal
aaaRefuseAccompany
aaaTimerGlobal
aaaTravelDragonsreach
aaaWaitHereGlobal
All of these will have Short variables, with Values of 0.
7b). Copy the ID of all five names and paste them onto a Notepad page for later.
The Accompany global is going to become sort of a "master switch", which is turned on the entire time we're traveling with the companion. Other globals : Follow, Wait, and any Travel globals, are sub-switches which get turned on and off as the need requires. Object window > Character > Package8a). Make a ForceGreet package as per this post. This is an optional step, but it also makes sense that if my character is supposed to be getting known throughout parts of Skyrim as a healer, the warrior is going to interrupt her when he sees her walk into Bannered Mare.
I am calling its aaaWarrior01ForcegreetPackage. I'm just going to leave everything default for now on the Package tab, other than moving the Package Template scroll-bar to ForceGreet.
8b). Flags tab: toggle Must Complete, Hellos to Player, and Preferred Speed on. I've got that final selection placed on Walk.
8c). Conditions tab.
GetGlobalValue Global: aaaAccompanyGlobal == 0.00 AND
GetGlobalValue Global: aaaRefuseAccompany == 0.00.
Click OK or type into the package's ID slot and press Return or ENTER on the keyboard.
8d). Open up the NPC Template, find the AI Packages tab and right-click > Add the package just made. Make sure this package gets placed
over the Sandbox one added earlier. Click OK.
Save.
Now's a good time to start the game, just to see if everything works. The NPC won't have any dialog yet since no quest has been written (other than saying generic lines such as "Need something?" "Yes?"), but the guy should walk up to our character and keep following him or her around Bannered Mare. Keep in mind that if the NPC is sitting when encountered he probably won't forcegreet. A second "forcegreet from sitting" package is needed for that.
Here's something neat: by now I've loaded saves into the game three times, starting in the main Whiterun market area, and then walking into Bannered Mare. Each time, the NPC is wearing different gear: sometimes clothes, sometimes armor, and wielding a different weapon.
Object window > Character > Quest9a). Make a new quest.
ID: aaaDragonsreachTravelQuest
Name: A Journey to Dragonsreach
Type: Side Quests
Priority: 50
Start Game Enabled: toggled on. I toggled Run Once off.
Quest Dialog Conditions:
PL GetLevel NONE > 5.00 (Player is selected as the Reference.)
Basically, the quest won't start unless my character's got more than 5 levels of experience. Only makes sense.
9b). Click OK, save, and reopen the quest. Still on the Quest Data page, right-click > New all the globals made during step 7a into the Text Display Globals window on the right. Here they are again.
aaaAccompanyGlobal
aaaRefuseAccompany
aaaTimerGlobal
aaaTravelDragonsreach
aaaWaitHereGlobal
9c). Misc tab. Right-click > New Topic into the middle window and find Hello.
"Oi, you're that healer. Might I have a word with you?" says the Warrior guy.
Conditions:
GetInFaction aaaTravellerFaction == 1.00 AND
GetGlobalValue Global: 'aaaAccompanyGlobal' == 0.00
GetGlobalValue Global: 'aaaRefuseAccompany' == 0.00
Copy All those. Record dialog (or silence) and click OK.
WARNING: Make sure the Say Once flag is not toggled for this, for most of the dialogs in this quest. These topics are going to need to return every so often. If the PC refuses to go with the NPC for instance, but then later changes mind.
9d). Switch to Dialogue Views or Player Dialog tab.
ID: aaaTravellerRequestsCompanyID
Branch: aaaTravellerRequestsCompanyTopic
Topic ID: aaaTravellerForcegreet
Subtype: ForceGreet
Topic Text: Aye, what is it?
Priority: 100
Response: "Can you accompany me to Dragonsreach? I'll pay 5 gold once we get there."
9e). Paste the same conditions from the Hello made earlier but REMOVE aaaRefuseAccompany. Here are the remaining conditions.
GetInFaction aaaTravellerFaction == 1.00 AND
GetGlobalValue Global: 'aaaAccompanyGlobal' == 0.00 Copy All those two.
9f). Change the Hours until reset: slot from 0.00 to 24.00.
The aaaRefuseAccompany was removed because: if the player refuses to go with the warrior this triggers aaaRefuseAccompany on, which kills the warrior's ability to ForceGreet in the future. However, if (after 24+ hours) we change our mind, and want to go with the guy, we can do so, because aaaRefuseAccompany is not a condition for this dialog.
Toggle Force Subtitle on, and record. Click OK. Again, make sure Say Once is NOT toggled on.
9f). Now right-click > Add two more Topics into the same yellow branch. aaaDragonsreachYes and aaaDragonsreachNo. Let's start with the Yes version.
Topic Text: Yes, I shall accompany you...
Response: Let us go.
Conditions: Paste the two conditions from before.
GetInFaction aaaTravellerFaction == 1.00 AND
GetGlobalValue Global: 'aaaAccompanyGlobal' == 0.00 Flags: Has LIP File, Force Subtitle, Goodbye
Scripts: make a semicolon script into either box: Begin or End.
; Player goes with NPC or whatever. Compile and press OK.
9g). Follow step 9f to flesh out some "No" dialog, including a semicolon "No" script. Toggle Goodbye on.
Topic Text: No, I am too busy now.
Response: Drats. Too bad. Coulda made some coin! I'll be here if you change your mind.
Conditions: Paste the two conditions from before.
GetInFaction aaaTravellerFaction == 1.00 AND
GetGlobalValue Global: 'aaaAccompanyGlobal' == 0.00 Flags: Has LIP File, Force Subtitle, Goodbye
Scripts: make a semicolon script into either box: Begin or End.
; Player refuses accompany..
Once that is done, left-click onto the initial topic (the forcegreet) and link from there to the Yes, and from there to the No. Click OK, closing the Quest window. Again, go into the game, just to make sure everything's working so far. Um, make an SEQ file if you haven't for this .esp yet.
Object window > Character > Package10a). Right-click > New into the main window.
To make the NPC go to his/her destination I have experimented with Escort and EscortPlayerWhenNear because I wanted the NPC to lead my character, but not get too far ahead. These work initially, and are great if only one cell or worldspace is being traversed. But once the NPC goes through a load door he always disappears.
So choose a Travel package in Package Template scroll-bar.
ID: aaaTravelDragonsreach
Package Template: Travel
Owner quest: Do not use this. Leave it on NONE.
Package tab, Place to Travel: In cell: 'WhiterunDragonsreach'
Flags tab: Must Complete, Preferred Speed: Fast Walk. Everything else off.
Conditions tab: S GetGlobalValue Global: 'aaaTravelDragonsreach' == 1.00
........................ S GetGlobalValue Global: 'aaaWaitGlobal' == 0.00
........................ PL GetDistance <= 1024
NOTE: Even though all the "Fallout" flags are off (Hellos to Player, Random Conversations, etc.) there are still a few things which can make the NPC halt his progress. If the bard starts singing a song, this is one of those things. Do not fret. When the song is over the NPC should continue walking.
Even though Escort is not an option, the GetDistance condition is being used to make this work in a similar way to Escort.
10b). Now to make a package which tells the NPC to wait. But since Escort is not an option, I'm going to need to make sure the NPC is able to stop when my 'toon needs to take a break!
ID: aaaWaitPackage
Package Template: StayAtCurrentLocation
Package tab: not used. StayAtCurrentLocation defaults to a standard Wait package, basically.
Flags tab: Must Complete, Allow Idle Chatter, and any of the "fallout" behaviors on the right of the Flags panel are okay.
Conditions tab: S GetGlobalValue Global: 'aaaTravelDragonsreach' == 1.00
........................ S GetGlobalValue Global: 'aaaWaitGlobal == 1.00
Object window > Character > Quest11a). Go back to the Notepad or text file which has the globals pasted from before. Copy aaaTravelDragonsreach.
11b). Reopen the quest, and go to the Dialog which says "Yes".
11c). Click on the TIF script and press Properties. Press Add Property.
Type: GlobalVariable
Name: Paste the name just copied. Find the global's name in the Edit Value scroll-bar. Click OK.
11d). Now copy aaaAccompanyGlobal from the same page. Make a second property in the same manner as found in step 11c.
Click OK twice more, closing the Quest window, and reopen it. Type
; aaaTravelDragonsreach.SetValue(1)
; aaaAccompanyGlobal.SetValue(1)
into the End Script box. Compile. Remove the semicolons, compile again. Click OK and OK again, closing the Quest window.
11e). Make a third property.
Type: Actor
Property Name: aaaWarrior01 (the base ID gets used for the Property name, not the Ref ID)
Edit Value: Find the NPC's Reference ID in the Render window or using the Cell + Reference scroll-bars.
Script fragment:
aaaWarrior01.SetPlayerTeammate() SetPlayerTeammate causes the NPC to mirror whatever our character's doing. IF our character sneaks, the NPC will do so as well. If he/she draws a weapon, so will the NPC. Really the main reason SPT is needed is so we can get into their inventory as we're travelling. Click OK.
11f). Reopen the Quest window and find the "No" dialog
Follow steps 11a through 11c, except copy aaaRefuseAccompany from the Notepad or text page.
Script fragment:
aaaRefuseAccompany.SetValue(1)Object window > Actors > Actor12a). Open the NPC template and go to the AI Packages tab. Right-click > Add the travel package just written. It shouldn't matter if it sits above the ForceGreet from before, but make sure the DefaultSandbox stays at the very bottom.
12b). Also add the Wait package as well. Doesn't matter if it's above or below the Travel package. Overall the NPC now has four AIs:
aaaForceGreetPackage
aaaTravelDragonsreachPackage
aaaWaitPackage
DefaultSandboxCurrentLocation1024
Object window > Character > Quest13a). Reopen the quest and go into Dialogue Views or Player Dialogue. Time to make some dialog which causes the NPC to wait, continue, or show what he's got in his inventory, all of which are crucial during travel. Each of these is getting their own Branch and Topics.
13b). Here's what works for waiting.
ID: aaaDragonsreachTravelQuestWaitID
Branch: aaaDragonsreachTravelQuestWaitIDBranchTopic
Topic: aaaDragonsreachTravelQuestWaitIDTopic
Topic Text: Let's take a rest for just a moment.
Response Text: Alright. I'll be right here.
Hours until reset: 0.00
Flags: Has LIP File, Force Subtitle, Goodbye
Conditions:
S GetGlobalValue Global: 'aaaWaitHereGlobal == 0.00 AND
S GetGlobalValue Global: 'aaaTravelDragonsreach == 1.00 AND
S GetInFaction Faction: 'aaaTravellerFaction' == 1.00
Script Begin Box: ;Party comes to a halt.
Script End Box: aaaWaitHereGlobal.SetValue(1)
13c). Here's what works if we wish for the NPC to continue moving, after a wait period.
ID: aaaDragonsreachTravelQuestContinueID
Branch: aaaDragonsreachTravelQuestIDBranchTopic
Topic: aaaDragonsreachTravelQuestContinueIDTopic
Topic Text: Let's go.
Response Text: Fine. Let us commence.
Hours until reset: 0.00
Flags: Has LIP File, Force Subtitle, Goodbye
Conditions:
S GetGlobalValue Global: 'aaaWaitHereGlobal == 1.00 AND
S GetGlobalValue Global: 'aaaTravelDragonsreach == 1.00 AND
S GetInFaction Faction: 'aaaTravellerFaction' == 1.00
Script Begin Box: ;Party continues to destination.
Script End Box: aaaWaitHereGlobal.SetValue(0)
13d). Here's what works if we wish to open the NPC's inventory.
ID: aaaDragonsreachTravelQuestOpenInventoryID
Branch: aaaDragonsreachTravelQuestOpenInventoryBranchTopic
Topic: aaaDragonsreachTravelQuestOpenInventoryTopic
opic TexTt: Can we exchange items?
Response Text: Here's what I got.
Flags: Has LIP File, Force Subtitle.
Conditions:
S GetGlobalValue Global: 'aaaTravelDragonsreach == 1.00 AND
S GetInFaction Faction: 'aaaTravellerFaction' == 1.00
Script Begin Box: ;Opens NPC traveller inventory
Script End Box: NPCPropertyName.OpenInventory()
13e). Here's the dialog for when the NPC makes it to destination.
ID: aaaWarriorArriveDragonsreachID
Branch: aaaWarriorArriveDragonsReachBranch
Topic Text: Looks like we're here.
Response Text: Yes. And looks like I owe some coin.
Flags: Has LIP File, Force Subtitle, Goodbye
Conditions:
PL GetInCell Cell: 'WhiterunDragonsreach' == 1.00
S GetGlobalValue Global: 'aaaTravelDragonsreach' == 1.00 AND
S GetInFaction Faction: 'aaaTravellerFaction' == 1.00
Script Begin Box: ;Warrior makes it to Dragonsreach
Script End Box: aaaTravelDragonsreach.SetValue(2)
........................ aaaTimerGlobal.SetValue(1)
........................Game.GetPlayer().AddItem(Gold001, 5)
........................NPC.SetPlayerTeamMate(FALSE)
There we go. In the post below this one, I'm going to describe how to add some other locations to the quest, but also make it so that the Warrior (or any others in the Traveller Faction) can direct us to several, random locations.
TROUBLESHOOTING: As anyone who's had a follower knows, sometimes they like to disappear. Especially after they've gone through a door which leads from a cell into a worldspace. Here's a couple ways to avoid this.
1). Firstly, save often! Especially before the door or gate.
2). Whenever approaching a door or a gate which leads from an interior cell to an outdoor worldspace, our character should activate this door
first. And sometimes, when going from an outdoor space to an interior cell the opposite is true. Let them enter the door first. I have found these actions cut down the disappearing act 100% so far.
3). The console command moveto <actor ID> can also be tried.
4). If there's ever a problem with travelers suddenly getting up and trying to go somewhere (when they should be chillaxing in some inn), or disobeying commands; can't tell 'em to Wait, can't tell 'em to follow, especially if they just start walking somewhere they're not supposed to,
remove any forcegreet AI, properties, and script fragments.
Renee
Feb 10 2023, 03:07 PM
Traveling with an NPC, Additional Locations. Game: TES V: Skyrim This lesson goes with the one started above. The NPC warrior has been taken to Dragonsreach, and now he wants some downtime. Once he's done doing whatever he's done doing in Dragonsreach, he'll want my healer's services again. He's finished whatever business in Dragonsreach, and will want to go somewhere else, which can be either Nightgate Inn or Riverwood the way I'm about to write this, or it can be any other interior cell. But he don't want to go there alone. He wants someone to heal him as he travels, getting in fights and so on.
Eventually it's going to be possible to find multiple travelers who want to go to multiple destinations. Silly idea, but hey. It's necessary I learn how to do this for some future ideas I've got in my main Skyrim fanfiction.
Two quests are going to be needed: one which handles dialog, the other is a timer.
If you've already made the timer and finished adding a second location, but wish to add a third location, skip to step 3a.
I'll start with the timer. ⌛ There are two ways to go about this: the timer can be directly attached to the quest which handles dialog, or it can be standalone. I prefer standalone. Reason being: the same timer, just one, can be structured to handle several other quests.
Object window > Character > Quest1a). Start a new quest.
ID: aaaTimerQuest
Quest Name: not needed.
Priority: 0
Type: None
Flags: Start Game Enabled.
1b). Click OK and reopen the quest. In the Text Display Globals window add...
aaaAccompanyGlobal
aaaTimerGlobal
Other globals might be needed as seen fit. But I've been able to make this work with just those two.
1c). Click the Scripts tab. Right-click > Add Script into the window.
1d). Double left-click on [New Script] and give the script a name. I am calling it aaaTimerScript. The script appears in the window as a
blue + icon.
1e). Right-click onto the script's name > Edit Properties (or simply highlight the script name and press the Properties button).
1f). Press Add Property. First property added is like so...
Type: Float
Name: DelayHours
As always, the property's name can be whatever. I like DelayHours because this is the name of the property used by Helgen Reborn, and it's easy for me to remember.
Click OK, closing the Add Script Property panel.
1g). Highlight the property and select Edit Value button. Value is the number of hours which would normally pass before the timer finishes counting. 🕰 Leave this on 0. Reason being, this count gets started later on via dialog, which is when the true number of hours will get set.
1h).Press Add Property again. Second property is...
Type: GlobalVariable
Name: aaaTimerGlobal
Click OK, closing the Add Script Property panel.
1i). Highlight the aaaTimerGlobal property and select Edit Value button. Find the global's name. Or actually... since aaaTimerGlobal has already been created, this will auto-fill as a Value.
Click OK, closing the Script Property panel. The idea: The timer is not going to bump quest stages, instead it'll be moving the GlobalVariable around. The advantage here is exactly the same as found in Oblivion's Construction Set or Fallout's G.E.C.K.: variables can go up OR they can go down, whereas stages can only move upwards. Well, stages can be moved down as well, but the Story Manager is needed to make this happen, which is overly-complicated to use, imo.
1k). Right-click > Edit Source on the script. Right now here is what I'm seeing.
Scriptname aaaTimerScript extends Quest
Float Property DelayHours Auto
GlobalVariable Property aaaTimerGlobal Auto
These next parts, we'll need to type in manually. 📝
Scriptname aaaTimerScript extends Quest
Float Property DelayHours Auto
GlobalVariable Property aaaTimerGlobal Auto
function OnInIt()
EndFunction
Function OnUpdateGameTime()
EndFunction
1j). File > Save (or Ctrl + Save). If the script compiles, continue with the rest. I will color the new parts in
red ink to make this process a little easier.
----------------------------------
Scriptname aaaTimerScript extends Quest
Float Property DelayHours Auto
GlobalVariable Property aaaTimerGlobal Auto
function OnInIt()
If Self.IsRunning()
self.RegisterForSingleUpdateGameTime(DelayHours)
EndIf
EndFunction
Function OnUpdateGameTime()
If aaaTimerGlobal.GetValue() == 1
aaaTimerGlobal.SetValue(2)
UnregisterForUpdateGameTime()
EndIf
EndFunction
;----------------------------------------------------
1k). Save that script and close it.
OPTIONAL: For anyone who wants to make an obvious, immersion-breaking message POP UP after the timer counts down, continue with this lesson. For those who don't, please skip to 2a. Personally, I kinda enjoy messages because they are definite proof the timer has worked. If you agree, make a message
as per this post.
ID
: aaaTimerMessage
Message Box: I've got this toggled, which pauses the game until we click OK. If this is toggled off a message will flash upon the screen, but I've found it's not as obvious.
Message Text: X hours have passed. I should see if the warrior is ready to go.
1l). Return to the quest, and go to its Scripts tab. Add a Property like so.
Property Name: aaaTimerMessage
Type: Message
Value: the name of the message. In my case it's just aaaTimerMessage.
1m). Edit Source the script. Add this line of code into the second if/endif block...
aaaTimerMessage.Show(). That should go right under the line which sets the Timer global-variable.
Time to make the quest which handles dialog. It is possible to use the same quest as before (the one which leads to Dragonsreach) and just add to that. But this also means adding a lot of new Topics as well. For the sake of organization I'm starting a second. Thing is, this second quest doesn't need to have some of the dialogs found in the first quest, because the assumption is that the NPC and our PC know each other a little by now. Because of this a second ForceGreet is not needed, for instance.
Object Window > Character > Quest2a). Start a new quest.
ID: aaaRandomTravelQuest
Quest Name: A Warrior's Accompanyment
Priority: 50
Type: Side Quests or Miscellaneous
Flags: Start Game Enabled.
Conditions:
PL GetLevel NONE > 5.00 AND
S GetQuestRunning Quest: 'aaaDragonsreachTravelQuest' != 1.002b). Click OK. Save. Reopen.
2c). Right-click > Add the following into the Text Display Globals window. Or drag them from the Object window into the Quest window.
aaaAccompanyGlobal
aaaRefuseAccompany
aaaTimerGlobal
aaaWaitGlobal
Note that the Text Display window is mostly used for Aliases, and therefore is not 100% necessary for this lesson. I like putting these globals here anyway, just for organization's sake.
--RefuseAccompany is optional. I only used it in the initial lesson to get rid of the ForceGreet behavior when the NPC first meets our character. Anyone not planning to use a second ForceGreet won't need aaaRefuseAccompany.
2d). Click OK.
Now reopen the previous quest, the one which led the NPC to Dragonsreach. Add aaaTimerGlobal into its Text Quest Globals window.
Now open the final dialog, when the NPC paid us for taking him here.
2e). Remove the Goodbye flag. Right-click > Copy All Conditions.
2f). Click OK 2x, closing the quest window. Reopen it. Right-click > Add Topic into the same branch.
ID: aaaWarriorTravelDragonsreachFinalInfo
Topic Text: Thank you for payment.
Priority: 100
Response Text: I may need your help in a day or two, going somewhere else. Why don't you return tomorrow?
Flags: Has LIP File, Say Once, Force Subtitle, Goodbye.
Properties: Make GlobalValue properties for the TimerGlobal and AccompanyGlobal. Also make two more: a Quest-type property for aaaTimerQuest and a Float for DelayHours. These are created in exactly the same way as they were for the timer itself, except this time, give the Float an actual Value. So if the value is 8, eight hours will pass before the timer concludes.
SCRIPTS
Begin:
;Timer counts down.
End:
aaaTimerGlobal.SetValue(1)
aaaAccompanyGlobal.SetValue(0)
aaaTimerQuest.RegisterForSingleUpdateGameTime(DelayHours)Conditions:
PL GetInCell Cell: 'WhiterunDragonsreach' == 1.00
S GetGlobalValue Global: 'aaaTravelDragonsreach == 2.00 AND
S GetInFaction Faction: 'aaaTravellerFaction' == 1.00Note:
the 'Travel Dragonsreach' has been changed from 1.00 to 2.00, which occurred during step 13e in the previous lesson.2g). Link the existing topic in the Dragonsreach branch to the new topic. Click OK, closing the qeust window.
2h). OPTIONAL: make some quest stages for this initial quest, or skip to step 3a if you don't want these.
I made stages 0, 10, 50, and 100, for instance. Then I went back to the pertinent dialog, so that Stage 10 occurs after the initial ForceGreet is done, 50 triggers when the player decides to travel to Dragonsreach (this included a Log Entry for the quest journal), and Stage 100 triggers when we get there, get paid, and the NPC says "I may need your help tomorrow..." As stated, stages are only needed for anyone who wants some updates to appear in their in-game journals.
I also made an objective for Stage 50: "Accompany warrior to Dragonsreach" it says. SetObjectiveDisplayed(50) gets triggered. Unfortunately, objective messages can only get triggered via the Quest Stages page as far as I can tell.
2i). Type
Stop() into the Papyrus Fragment box. Compile. Click OK.
2j). Click on the final quest stage. Right next to the Complete Quest toggle is the Next Quest scroll-bar. Find the new quest (the one which was started during 2a...) in the scroll. So I've got aaaRandomTravelQuest selected.
Object Window > Miscellaneous > Global3a). Right-click > New into the main window.
3b). Add a global called aaaTravelRiverwood (or wherever). Repeat for Nightgate Inn, or any other location.
These shall have a Variable Type of Short and 0 for Value.
3c). Click OK. In the Character section open the new quest's Data tab. Right-click > New into the Text Display Globals window and find the global just created. Click OK, closing the quest window.
Object window > Character > Package4a). Right-click > New into the main window.
ID: aaaTravelRiverwoodPackage
Package Template: Travel
Owner quest: Do not use this. Leave it on NONE.
Package tab, Place to Travel: In cell: 'RiverwoodSleepingGiantInn'
Flags tab: Must Complete, Preferred Speed: Fast Walk. Everything else off, unless you don't mind the NPC chatting occasionally, or getting involved in "World Interactions".
Conditions tab:
PL GetDistance Reference: 'aaaWarrior01Reference' <= 512 AND
S GetGlobalValue Global: 'aaaTravelRiverwood' == 1.00 AND
S GetGlobalValue Global: 'aaaWaitGlobal' == 0.00 The GetDistance makes sure the NPC won't wander too far ahead. "512" units are about as far as one of the outdoor staircase sets in Whiterun, from bottom to top. Make this number lower if the NPC doesn't want to get too far ahead, and higher if they're more reckless. Run on scroll-bar should be Player and the [TARGET] button set on the NPC's Ref ID. 4b). Repeat 4a for any additional AI packages. In fact it's even easier to do so. Simply rename the ID (aaaTravelNightgateInnPackage), click on the Package tab, change Place to Travel to In cell: 'NightgateInn' (or wherever). Flags are all the same. Change the 'locational' global accordingly.
Close and save as a New Form.
4c). Find the Wait package previously used in the quest to Dragonsreach, or skip to 5a if this is already been done. Here are the Wait's features.
ID: aaaWaitPackage
Package Template: StayAtCurrentLocation
Public Package Data: Not used. Leave this window blank.
Flags tab: Must Complete for sure. Allow Idle Chatter, and any of the "fallout" behaviors on the right of the Flags panel are optional.
Hmm. For Conditions I kinda screwed up earlier, and added a condition which makes traveling to Dragonbridge == 1.00. This is not needed. And I want to make this Wait package generic so I can reuse it for other locations. So change the aaaTravelDragonbrige to aaaAccompanyGlobal.
Conditions tab: S GetGlobalValue Global: 'aaaAccompanyGlobal' == 1.00 AND
..................... S GetGlobalValue Global: 'aaaWaitGlobal == 1.00
5a). Open the new quest started in step 2a. During this quest we return to the NPC, who now wants us to accompany him somewhere else. As hinted, I am going to make two possible destinations, either of them random. So, he'll either want us to take him to Riverwood, or to Nightgate Inn. Random dice-roll here.
But I also don't want him to ask us to take him somewhere right away; in fact it'll be several hours before he's ready to go. During this time, my character can wander around town. Go shopping. Get a room, whatever. That's obviously what the timer is for. ⌛
NOTE:
If the quest has already been written and a new "return" dialog set is needed, go ahead and make this now. skip to 5c 5b). First, I went to the Quest Stages tab and added two stages: 0 and 1. I merely added these stages so a journal update would show up in the game once my healer starts this new adventure. "I have accompanied a warrior to Dragonsreach. He has paid me, and wishes for me to accompany him to other destinations. This could be a lucrative opportunity."
... something like that. It's possible to use more stages if anybody wants more journal updates. But I'm only using that one, as a signpost to signify the beginning of my healer's new path in life. Otherwise, this is a quest which never ends.
5c). Go to Dialogue Views or Player Dialogue tab, whatever you're more comfortable with. As per other 'random' quests I've made in the past, there will be several landing spots for dialog. This first one deals with the character when he/she returns to the NPC, during which there are Yes and No choices. The second (if Yes is chosen) is the Locational topic, which leads to several, random destinations. But let's start with the first bit.
ID: aaaRandomTravelQuestPlayerReturnsID
Branch: aaaRandomTravelQuestPlayerReturnsBranch
Topic ID: aaaPlayerReturnsTopic
Subtype: Custom
Topic Text: I have returned.
Prompt: How goes it here in Dragonsreach?
Priority: 100.00
Eventually, several responses from the NPC will share the same "I have returned" Topic Text. Prompt gets used to make the text we click on in-game vary from location to location. Response Text: Wonderful. I've got another delivery to make. Interested in making more coin?
Flags: Has Lip File, Force Subtitle (if using no voice)
Conditions:
PL GetInCell Cell: 'WhiterunDragonsreach' == 1.00 AND
GetGlobalValue Global: 'aaaAccompanyGlobal' == 0.00 AND
S GetGlobalValue Global: 'aaaTimerGlobal' == 2.00 AND
S GetInFaction Faction: 'aaaTravellerFaction' == 1.005d). Copy All those conditions.
5e). Right-click > AddTopic. This next topic shall be the "Locational" one during which the NPC offers a
random choice: either Riverwood or Nightgate Inn. And from either of those location-choices there will be either a "yes" or a "no" choice.
ID: aaaLocationalTopic
Priority: 50
Topic Text: So where are you headed next?
Prompt is not used. Several locational responses are going to share the same Topic Text. 5f). As mentioned, there shall be two or more infos contained within this "locational" topic. First one describes Riverwood.
Response: I need to go to Riverwood. I promise to pay 50 coins when we arrive to Riverwood's Tavern, the Sleeping Giant Inn. What say you?
Conditions: Paste the same conditions from step 5c, all four of them, however the GetInCell is going to get changed. Every time a new location gets added: Nightgate Inn, The Bee and Barb, and so on, that GetInCell is used to make sure the NPC will
not say this if he's in the particular location. Because we don't want him saying "Please take me to Riverwood" if we're already there.
PL GetInCell Cell: 'RiverwoodSleepingGiantInn' != 1.00 AND
S GetGlobalValue Global: 'aaaAccompanyGlobal' == 0.00 AND
S GetGlobalValue Global: 'aaaTimerGlobal' == 2.00 AND
S GetInFaction Faction: 'aaaTravellerFaction' == 1.00 Flags: Has Lip File, Force Subtitle (if using no voice), Random.
The Random flag is important. It makes sure this moment becomes a dice-roll. 5g). Click OK, closing the Topic Info panel. Right-click > Add Topic into the yellow branch section of the window.
Topic: aaaYesRiverwood
Priority: 50
Topic Text: Aye, let's head to Riverwood
Response Text: Splendid. I promise to pay 50 gold when we arrive to the Sleeping Giant Inn.
Flags: Has LIP File, Force Subtitle, Goodbye
Conditions: paste the same four from before, however GetInCell isn't needed anymore.
GetGlobalValue Global: 'aaaAccompanyGlobal' == 0.00 AND
S GetGlobalValue Global: 'aaaTimerGlobal' == 2.00 AND
S GetInFaction Faction: 'aaaTravellerFaction' == 1.00 Properties and Scripts:
Begin:
;Player decides to head to Riverwood
aaaNPCName.SetPlayerTeamMate()
aaaAccompanyGlobal.SetValue(1)
End:
aaaTravelNightgateInn.SetValue(1)
aaaNPCName.EvaluatePackage()
aaaTimerGlobal.SetValue(0)A short tutorial for SetPlayerTeammate is here, for those who have forgotten. EvaluatePackage is described as well. Both of these use Actor for their Property Type.
5h). Click OK.
Also start a new branch which leads to a "no" response (skip to 6a if this has already been done). Several dialog choices can get filtered to this one NO topic, saving time and effort.
ID: aaaNoTopic
Priority: 25
(Priority is lower than the usual 50 so "No" is always below "Yes".)Topic Text: I cannot follow you at this time.
Response: Ah fiddles. Guess I'm on my own then.
Conditions: Paste the same conditions from step 5c, of them, but get rid of GetInCell. So the Timer should be 2.00, the Accompany should be 0.00, and the GetInFaction is here as well.
Flags: Has Lip File, Force Subtitle (if using no voice), Goodbye.
So, let's review. If the guy is told "No" he will sulk (I gave him a Sad face of 100) but otherwise won't do anything but sandbox a bit. He'll just hang out in Dragonsreach unless we change our minds. When additional dialog for additional locations get added, he'll sulk in those locations as well, due to the DefaultSandbox in his AI Packages stack.
Let's say "No" is chosen, our character goes and does other things, but then changes mind, and returns to the warrior. Dialog should start all over from the beginning in this case. "I have returned," we click on in the game. "Wonderful. Interested in making more coin?" says he.
Good idea to go into the game now, just to make sure that portion of dialog shows up if "No" is chosen, but also repeats. So save all work, leave the Creation kit open, and go in the game. 👍 See you in a few.
6a). Single left-click on the original topic, in which we return to the traveller after X amount of waiting, timer counting down, etc. The mouse icon should turn into a hand. Drag the hand to the Yes topic, and repeat for the No topic.
Note:
Actually, for those who use Dialogue Views window, sometimes it's easier to go directly into each Topic Info panel, right-click into the Link To: window, and link topics this way, especially after adding multiple location choices. All those links begin to crisscross after a while, which can get confusing. 6b). Repeat steps 5f through 5g. Starting with the Locational topic, right-click > Edit Topic (so the Topic panel opens), and then right-click > New into the Info window. See? We can put as many location choices here as we want.
Again, make sure to test all of that works. By now, you should be able to return to the NPC in Dragonsreach after the timer counts down (and assuming the PC is in one of the other locations, the same should happen in those locations as well). Yes should lead to a choice of destinations (but NOT the cell the PC is in) and No should lead to a circular dialog loop, during which we can change our minds in the future.
Object window > Actors > Actor7a). Open the NPC template and go to the AI Packages tab (or if you're using a FormList as described in the next tutorial, open this instead). Right-click > Add any travel packages just written. It shouldn't matter if it sits above the ForceGreet from before, but make sure the DefaultSandbox stays at the very bottom.
7b). Click OK.
Object window > Character > Quest8a). Reopen the 'additional locations' quest and go into Dialogue Views or Player Dialogue. Time to make some dialog which causes the NPC to wait, continue, or show what he's got in his inventory, all of which are crucial during travel. All of this got written up for the initial quest, but heck, no harm in writing them up again. Each of these is (again) getting their own Branch and Topics, so anyone who already knows this stuff can skip the next few steps. But I'll write it up anyway. 👩🦳
Skip to 8d if Wait, Continue, and Share dialog has already been added.
Here's what works for waiting.
ID: aaaWaitID
Branch: aaaWaitBranch
Topic: aaaWaitTopic
Priority: 75
Topic Text: Let us take a few moments of respite.
Response Text: Alright. I'll be right here.
Flags: Has LIP File, Force Subtitle, Goodbye
Conditions:
S GetGlobalValue Global: 'aaaWaitGlobal == 0.00 AND
S GetGlobalValue Global: 'aaaAccompanyGlobal == 1.00 AND
S GetInFaction Faction: 'aaaTravellerFaction' == 1.00Copy All those three.
An additional GetInCell "CellName" != 1.00 can be used for each location, this way there won't be an option to make the NPC wait when he/she's already inside the destination. Use AND qualifiers between each location, don't use OR. PL GetInCell: Cell: 'NightgateInn' != 1.00 AND
PL GetInCell: Cell: 'RiverwoodSleepingGiantInn' != 1.00 AND
S GetGlobalValue Global: 'aaaWaitGlobal == 0.00 AND
S GetGlobalValue Global: 'aaaAccompanyGlobal == 1.00 AND
S GetInFaction Faction: 'aaaTravellerFaction' == 1.00Script Begin Box: ;Party comes to a halt.
Script End Box: aaaWaitGlobal.SetValue(1)
8b). Here's what works if we wish for the NPC to continue moving, after a wait period.
ID: aaaContinueTravelID
Branch: aaaContinueTravelTopic
Topic: aaaContinueTravelRiverwood
Topic Text: Let us sojourn.
Priority: 90
Response Text: Fine. Let us commence.
Flags: Has LIP File, Force Subtitle, Goodbye
Conditions: Paste the three conditions from before but change the WaitGlobal from 0.00 to 1.00.
S GetGlobalValue Global: 'aaaWaitGlobal == 1.00 AND
S GetGlobalValue Global: 'aaaAccompanyGlobal == 1.00 AND
S GetInFaction Faction: 'aaaTravellerFaction' == 1.00Script Begin Box: ;Party continues to destination.
Script End Box: aaaWaitGlobal.SetValue(0)
8c). And there's inventory management. Very important to upgrade the NPC's gear or hand over a potion and so on, once we're on the dangerous road. 👾
ID: aaaOpenInventoryID
Branch: aaaOpenInventoryBranchTopic
Topic: aaaOpenInventoryTopic
Priority: 20 (or make it higher if you want inventory access to be higher in the topic stack).
Topic Text: Here, let me give you something.
Response Text: Here's what I got.
Flags: Has LIP File, Force Subtitle.
Conditions:
S GetPlayerTeamMate == 1.00 AND
S GetGlobalValue Global: 'aaaAccompanyGlobal' == 1.00 AND
S GetInFaction Faction: 'aaaTravellerFaction' == 1.00Script Begin Box: ;Opens NPC traveller inventory
Script End Box: akSpeaker.OpenInventory()
Follow this tutorial to learn how to get into their stuff. And also, the aaaAccompanyGlobal variable can be used instead of GetStage, for anyone who wants the NPC to share ONLY while traveling. I just wanted the option of sharing at any time. 8d). Here's the dialog for when the NPC makes it to destination. This first example is for Riverwood.
ID: aaaArriveDestinationID
Branch: aaaArriveDestinationBranchTopic
Topic: aaaArriveDestinationTopic
Priority: 100
Topic Text: Looks like we're here.
Prompt: We've made it to Riverwood. Alive.
Response Text: Yes. And looks like I owe some coin. Why not treat yourself to a night of fun?
You are good at healing magic. Come back in a day, might want to travel with you again.
Flags: Has LIP File, Force Subtitle, Goodbye
Conditions:
PL GetInCell Cell: 'RiverwoodSleepingGiantInn' == 1.00 AND
S GetGlobalValue Global: 'aaaAccompanyGlobal' == 1.00 AND
S GetGlobalValue Global: 'aaaTravelRiverwood' == 1.00 AND
S GetInFaction Faction: 'aaaTravellerFaction' == 1.00
Script Begin Box:
;Warrior makes it to Riverwood
aaaNPC.SetPlayerTeamMate(FALSE)
aaaTravelRiverwood.SetValue(0)Script End Box:
aaaAccompanyGlobal.SetValue(0)
aaaTimerGlobal.SetValue(1)
Game.GetPlayer().AddItem(Gold001, 50)
aaaTimerQuest.RegisterForSingleUpdateGameTime(DelayHours)Note: The TimerGlobal getting set to 1 causes the timer to work at moving dialog forward after X amount of time, however the 'RegisterForSingleUpdateGameTime' is what TRIGGERS the timer's script into action. This is important, and is different from how timers work in earlier games. Each time a new instance of the timer is to run, it has to be "registered" to do so, and also unregistered at some point (assuming the quest is supposed to run eternally, such as a room rental quest).
Two properties are needed which are exactly the same as found in the standalone Timer Script quest written earlier: a Float with X number of hours which I'm calling DelayHours, and the Timer quest also has to be made into a property.
Property Name: DelayHours
Type: Float
Value: 8.00
Property Name: aaaTimerQuest
Type: Quest
Value: aaaTimerQuest
8e). After playtesting this mod a bit, especially out on the road, I also decided to make a global, a package, and dialog to make the NPC
follow my character rather than lead. This comes in handy during many situations: 1). if the player decides he/she'd like to stop in an inn along the way or go shopping in some village, and 2). the NPC starts walking in a direction we know is too dangerous, or too much of a long-cut, 3). A simple 'debugging' measure, because sometimes NPCs get stuck!
I won't go into full details with dialog and so forth. Make a package has Follow for the Package Type, with Player as the Reference. Conditions also are important. The NPC should be able to be told to follow while waiting, or while leading. Therefore, the conditions looked like this...
S GetGlobalValue Global: 'aaaFollowGlobal' != 1.00 AND
S GetGlobalValue Global: 'aaaAccompany Global == 1.00 AND
PL GetInCell Cell: 'RiverwoodSleepingGiantInn' != 1.00 AND
PL GetInCell Cell: 'NightgateInn' != 1.00 AND
S GetInFaction Faction: 'aaaTravellerFaction == 1.00Conditions for waiting won't require any new condition, but make a global to 'turn off' the Follow package when we wish to make him lead again, or wait:
aaaFollowGlobal.SetValue(0)Conditions for leading (the NPC leads, not the player) are as follows.
S GetGlobalValue Global: 'aaaFollowGlobal' == 1.00 OR
S GetGlobalValue Global: 'aaaWaitGlobal == 1.00 AND
S GetGlobalValue Global: 'aaaAccompany Global == 1.00 AND
S GetInFaction Faction: 'aaaTravellerFaction == 1.00Again, an additional property & script fragment are needed, to make aaaFollowGlobal.SetValue(0) happen.
8f). Go into any "travel" AI packages (such as aaaTravelNightgateInn) and add the condition:
S GetGlobalValue Global: 'aaaFollowGlobal' != 1.00. If this is not done the Follow package will begin fighting with the Travel packages, causing the NPC to try going somewhere, but abruptly turning to follow us.
9). Proofread everything. Go back through it all and see if everything looks as though it'll work. Or, step 9 can be skipped, or skimmed. Sometimes I get lazy at this point, or too burnt out after all those numbers and script fragments, and stuff gets overlooked, even after I've checked it over.
Mistakes tend to show up as we're out in the gameworld of course, usually something small which gets overlooked. A comparison which is wrong, such as PL GetInCell WhiterunBanneredMare == 1.00 which should have != for a comparison instead of ==. Stuff like that.
Finally, I need to make a death script. ☠ My warrior guy is not Essential, and if he dies, he'll respawn right where he fell. So there needs to be a way to make him respawn in (let's say) Bannered Mare, which is where this all started.
OBJECT window > Actors > Actor10a). Open up the NPC traveller (not the template). Press the Add button next to the Papyrus Scripts window.
There are two ways to handle this: 1). Set a quest stage when the NPC dies or 2). Set a variable. To set a quest stage, start by typing Death into the Filer slot and scroll down to "defaultOnDeathSetStage". A stage can be set to whatever ... let's say 10. Once the stage is 10 the Story Manager can be used to make the stage return to its initial value (stage 1 in my quest) via a timer, as well as making the NPC teleport to Bannered Mare or wherever.
However I prefer using variables. 🧮 I just love scripting.
10b). Object Window > Global. Make a new global called aaaDeathGlobal. Copy its ID name and paste it somewhere. Variable Type is Short and Value is 0.
10c). Return to the NPC (again, not the template). Right-click > Add Script and double-click [New Script].
Name: aaaDeathScript
10d). Click the Properties > Add Property. GlobalVariable for Type, and paste the ID name just copied, unless you want the Property to have a different name.
10e). Click OK, save. Reopen the NPC and Edit Source the script.
Scriptname aaaDeathScript extends ObjectReference
GlobalVariable aaaDeathGlobal Auto
Event OnDeath (Actor Killer)
EndEvent. 10f). Save that. Now add this code below the OnDeath event line
If aaaDeathGlobal.GetValue() == 0
aaaDeathGlobal.SetValue(1)
EndIf10g). Save and close that. Close the NPC. A second timer script quest can be started
as per this post so that after X amount of time the NPC gets moved to whichever initial location. Since corpses stay around for 10 days (I think) I'm going to use the timer to teleport (or MoveTo) the NPC to a new location after 240 hours. So make a Float property (that's the only one we'll need) for 240 hours.
Make the timer into a standalone quest, or attach it to the second traveling quest (the one which leads
from Dragonsreach), don't attach it to the NPC.
10h). In the timer quest's Quest Data page > Text Display Globals window attach aaaAccompanyGlobal, aaaDeathGlobal, aaaTravelRiverwood, aaaTravelNightgateInn (and any other locational globals), and aaaWaitGlobal. Click OK.
10i). Reopen the quest and go its scripts tab. There should be All 5 globals are made into GlobalVariable properties. I'm going to skip a few steps here, just to show the script looks like.
Scriptname aaaDeathTimerScript extends Quest
Float Property DelayHours Auto
GlobalVariable Property aaaAccompanyGlobal Auto
GlobalVariable Property aaaDeathGlobal Auto
GlobalVariable Property aaaTravelNightgateInn Auto
GlobalVariable Property aaaTravelRiverwood Auto
GlobalVariable Property aaaWaitGlobal Auto
Function Oninit()
self.RegisterForSingleUpdateGameTime(DelayHours)
EndFunction
Function OnUpdateGameTime()
If aaaDeathGlobal.GetValue() == 1
aaaAccompanyGlobal.SetValue(0)
aaaDeathGlobal.SetValue(0)
aaaTravelNightgateInn.SetValue(0)
aaaTravelRiverwood.SetValue(0)
aaaWaitGlobal.SetValue(0)
UnregisterForUpdateGameTime()
EndIf
EndFunction10j). Return to the NPC and open his/her script. There should already be a property for the DeathGlobal. Add a 2nd Property which references the timer quest just made. And add a third which counts time.
Property Name: aaaDeathTimerQuest
Type: Quest:
Value: aaaDeathTimerQuest
Property Name: Hours
Type: Float
Value: 1
10k). Click OK twice, closing the Properties panel, and closing the NPC. Reopen both.
10l). Right-click > Edit Source. Now add this line between the If and EndIf block:
aaaDeathTimerQuest.RegisterForSingleUpdateGameTime(Hours)This ensures the timer is reusable.
11a). Finally, we're going to make the NPC teleport to some other location
as per this post.
I put a XMarkerHeading into Bannered Mare, and then added a line like aaaWarrior01()Reference.MoveTo(aaaWarrior01XMarkerHeading) in the Death Timer's If/EndIf block
--------------------------------------
TROUBLESHOOTING:
1). Save often, especially just after the NPC begins heading to his/her next destination. If the NPC disappears while going through a door, reload the previous save, and make sure YOU go through the door FIRST.
2). If the NPC gets stuck somewhere, try telling him/her to Wait, and then Continue. One of my playtests, the guy began watching the preacher in the middle of Whiterun. He became fascinated until I tried the wait/continue trick.
Renee
Mar 26 2023, 07:31 PM
Repeatable Enemy Raids, Game: Fallout 3I love generic, repeatable quests. We speak to a quest agent who gives us a quest to pwn some enemy boss, we pwn the boss, then return to the agent to get paid. I've made these sort of quests for Oblivion and Skyrim, here's how to do it for Fallout 3.
The process has a lot of similarities to the way it all works in Oblivion, since both games use the Gamebyro engine and similar scripting. But there are enough differences for Fallout that this game deserves its own methods.
First of all, highly recommended to download
Encounter Zone Respawn Control, which makes interior locations (Super Duper Mart, for instance) respawn with enemies, but also loot. This mod requires
Fallout Script Extender, for those who don't have it yet.
Once both of those are in place, the way it works: whenever an interior location is entered, go into the character's ITEMS > Aid menus and select Zone Control. There are options to do Nothing, Enable Respawn, and Disable Respawn. If respawn is enabled, the enemies inside will (guess) return the place after 3 days. Most containers will also be restocked with loot.
Note that this mod works mostly with vanilla locations. Mod-added locations sometimes can have respawn enabled, sometimes not.
I have also come across one vanilla location (Bethesda Offices East) which did not accept the Enable Respawn command. However, Beth's offices are also supposed to be one of the rare interior locations in the gameworld which respawn by default. EDIT: And now I know why the office could not be Enabled. It's because it's not on Bethesda's "non-respawn" list. To further learn more about this list, click the spoiler tag.
So...the way my idea works is: I use Metro tickets to remind me of which location is currently on the roster; i.e., which location we're supposed to be headed to, to take care of its boss. Metro tickets, Messages, and Quest Objectives are how these reminders work. No quest stages. Repeatable quest stages can probably also be used, but I don't know how to do it that way.
Let's say the first location is a place we're all familiar with: Springvale School. I'm going to put the enemy boss into SpringvaleSchool02 (Springvale School Lower Level).
OBJECT window > Items > Misc Item1a). Find and then edit MetroTicket.
ID: aaaSpringvaleSchoolTicket
Name: Kill Boss of Springvale School
See? The ticket states exactly what the latest mission is.
1b). Toggle Quest Item on. Don't worry, the way this works, the ticket won't be in the PC's inventory forever.
It is possible to skip this step, of course. Especially for those who want to do the "pack rat" thing; acquire a stack of tickets to be kept in their home. Personally, I can't do it this way. I'd get confused after forgetting to drop my ticket(s). Wait, is my guy on a mission?

Which one?
1c). Copy the ID name and paste it onto a Text file or Wordpad file.
1d). Click OK, saving as a New Form.
Object window > Actors > NPC2a). Make a new NPC, who's going to be the quest agent. If it's your first time doing so, Bethesda's own GECK page is a good place to start:
LINK.
The guy or gal can be pretty minimal; like my other Quest Agents in other games, he/she only needs to handle and deliver a minimal number of lines. In my game, I made the agent a Regulator, who is part of the Regulator Faction (along with a couple Megaton factions). He lives in his own flat in Megaton, has his own little life and so on. But minimally, it's possible just to add somebody who lives in Moriarty's, if simplicity is desired.
2b). The only things I insisted upon was to make my agent's Alignment as Good (he is a Regulator, which means good guy). I gave him one of the DefaultSandboxEditorLocation packages too, just so he wanders around and stuff. Everything's an option.
2c). Put the agent into whichever location is desired.
Cell View window3). Find the location where the enemy boss will get added. Again, for me this is SpringvaleSchool02, which is the school's basement. I like putting bosses into areas which can possibly be the very
last place we search. Don't put a boss near the entry door, for instance. More fun to have to get through the boss's minions and sanctuary first!
Object window > Actor Data > Quest4a). Start a new quest. This tutorial's assuming those who read this know a lot about the Quest window already.
Quest Name: Generic Wasteland Quests
ID: aaaGenericWastelandQuests
Priority: 30
4b).Start Game Enabled and Script Processing Delay can both be toggled.
4c). Start a script like so...
Scriptname aaaGenericWastelandQuestScript
short DoOnce4d). Make sure the Script Type scroll-bar is set to Quest, not Object.
Save and close the script, click OK (closing the Quest window) and reopen it. Find the script in the scroll-bar, click OK again.
Object window > Actors > NPC5a). Make a new NPC.
ID: aaaSpringvaleSchoolBoss
Name: Springvale Headmaster (I like silly names)
Respawn: ON
5b). Click OK, closing the NPC panel. Save and reopen the NPC.
This next part is an optional step for those who want to skip a lot of the little stuff: adding gear, factions, and so on. These can be done with a quick set of toggles by using a pre-made template. Since Springvale is populated by bandits, it's easy to use a raider template to set the NPC up, with random gear and so on. Those who want to hand-craft their enemy a bit more can skip to step 6a.
5c). Use the ActorBase scroll-bar to select whichever template is most appropriate.
I started to use Raider2GunAAFTEMPLATE but this bothered me, because choosing its Use Traits flag always defaulted to African American Female. And I'm wanting a guy to rule this former school. So, time to make my own template. Again, those who just want to use one of Bethesda's default templates (or make a completely hand-made boss) can skip to 6a.
5d). Still in the NPC section, type Template into the Filter slot. I am editing Raider2GunAAFTEMPLATE, making only the changes stated below.
ID: aaaRaider2GunCAMTEMPLATE
Flags: No low level processing and Respawn both toggled ON.
TRAITS tab
Race: CaucasianRaider
Female: OFF
Voice Type: MaleAdult02*
STATS tab
PC Level Mult: ON
Level Mult: 4.00
FACTIONS tab
I removed the GeneralIdleFaction and MS13CanMez factions. Not needed. Two raider factions remained in this tab's window, and I also left this template's Smoker Faction.
Note that making the NPC's level go 4 levels above the player in the Stats area makes the boss into a bullet sponge. Hey, I like 'em tough. 🤬 Those who don't prefer this can substitute whatever, maybe put the boss into power armor to toughen him/her up and use Auto Calc Stats instead of PC Level Mult, and so on.
*
I used MaleAdult02 as the voice type instead of MaleRaiderGroup because I wanted the guy to be distinct from all the usual raiders, with their toughguy Jersey accents. Click OK.
6a). Reopen the NPC boss started in step 4a, or continued from the last step. Those who wanted to use the template just made can find it in the ActorBase scroll-bar, selecting whichever toggles fit best. Those who don't can continue to hand-craft, skipping to 6b.
I am choosing: Use Traits, Use Stats, Use AI Data, Use AI Packages, Use Factions, and Use Inventory. Therefore, I've always got a random white guy running the school, who's always 4 levels above the PC, is part of all the Raider factions (and smokes), is always mean, sandboxes, and has random raider-type inventory.
Note I did not use Add Script. It's best to give the NPC boss his/her own script. Stuff like this works best when it's kept local (rather than drawn from a template).
--Also, do not choose Use Base Data, as this can also mess up the script stuff. I also like giving each boss a unique name (like Nuka Cola Plant Bottler) while sometimes using templates. By default, the template I made earlier has "Raider" for a name.
6b). Drop the boss into the Render window. If Use Inventory was one of the flags toggled on, the boss will be in underclothes, which is fine. They get suited up once we're in the game.
6c). Give the boss a Reference ID. Copy this ID and paste it somewhere. I just typed aaaSpringvaleSchoolBossRef.
6d).Make sure to toggle Persistent Reference on. Click OK.
6e). Reopen the NPC's Reference and NPC panels from the Render window. Start a script like so...
Scriptname aaaSpringvaleSchoolBossScript
Short Dead6f). Save that script, close the editor, click OK 2x (closing the NPC panels) and reopen them. Find the script in the Script scroll-bar, click OK, and reopen.
Here is the rest of the script, and note that it's exactly the same as what'd be found in an Oblivion script.
Scriptname aaaSpringvaleSchoolBossScript
Short Dead
Begin OnDeath
If (aaaSpringvaleSchoolBoss.dead == 1)
Set aaaSpringvaleSchoolBossRef.dead to 2
Set aaaGenericWastelandQuests.DoOnce to 2
EndIf
End7a). Reopen the quest, and select the Quest Objectives tab. Right-click > New into the top(Objective Index) window. Two objectives are needed for now.
Index: 1
Display Text: Pwn the boss of Springvale Elementary.
Index: 2
Display Text: Return to Quest Agent for Reward.
7b). Go to the Topics tab. Right-click > Add Topic into the left-most window, and find GREETING.
"Hello &PCName;, and how are you today?" the agent greets. "Do you have any interest in tackling a location for the Regulators today?"
Note that typing &PCName; into the Response Text window causes our character's name to get placed automatically. In my game it'll say "Hello Cho Zen Wan, and how are you today?" Conditions:
GetIsID aaaQuestAgent == 1.00 AND
GetQuestVariable aaaGenericWastelandQuests, DoOnce == 0.00Copy All both those.
7c). In the Add Topics window, right-click > Add Topic, and then right-click > New into the window which pops up. Select the ID name of the topic. I'm calling it aaaWastelandMissions. Click OK.
Do this again, and add a "No" topic. aaaNo in my game.
7d). Find both these topics in the left-most window. Let's start with the missions topic.
7e). Topic Text: aaaWastelandMissions
Response Text: Well there are several problem areas, always are. Some locations close by, others farther away. Got a list here, hold on.
Prompt: Sure, whatcha got?
Conditions: paste the same conditions from step 7b.
Result Script (End):
Set aaaGenericWastelandQuests.DoOnce to 1Choices: Right-click > Add Topic. I'm adding aaaSpringvaleSchoolBossTopic, and also the aaaNo topic.
7f). Find the new topic just added into Choices (aaaSpringvaleSchoolBossTopic in my GECK) in the left-most window. Change the Topic Text to something in plain wording (Springvale Elementary School) and click OK.
Save. Reopen the quest window. Let's flesh out the No dialog. This is going to be an all-purpose topic + dialog which gets used whenever a "no" answer is needed. It's important to continually offer decisions like this, so that the player isn't railroaded into quests they don't want, and have maximum choice all along.
7g). Topic Text: aaaNo
Response: Damn, you're letting us down, soldier.
...............
Prompt: No, I cannot help at this time.
Priority: Change this from 50.00 to, let's say, 20.00. This makes the "No" topic always show up underneath whatever locational topics get added later on, as long as those topics have higher numbers than 20.
As more locations get added later on, Priority can be attempted to make them show in-game in alphabetical order, even if they aren't alphabetical in the Choices window. However, this doesn't always work correctly. I've had some success making jumps of 10, so that Bethesda Ruins (Priority 100) is at the top of my in-game list, Evergreen Mills (Priority 90) is underneath, Nuka Cola Plant (80) comes next, and so on. This doesn't always work 100% though, and might need to be played with. Conditions:
GetIsID aaaQuestAgent == 1.00 AND
GetQuestVariable aaaGenericWastelandQuests, DoOnce < 2.00Toggle Goodbye ON.
Result Script [End]:
Set aaaGenericWastelandQuests.DoOnce to 07h). Compile and click OK.
7i). Reopen the quest window and find the new location topic.
Topic Text: Springvale Elementary School
Response Text: "Springvale School. Once a bastion of PreK to 5th grade learning, now a den full of menacing raiders! - You'd think those *bungholes* would leave such a formerly innocent place alone, but no, they've continued to infest the school."
For this next part, it helps to have the NPC boss in the Render window, so he/she can be easily selected.
Conditions:
GetIsID aaaQuestAgent == 1.00 AND
GetQuestVariable aaaGenericWastelandQuests, DoOnce == 1.00 AND
GetScriptVariable aaaSpringvaleSchoolBoss, Dead == 0.00 AND
GetDead aaaSpringvaleSchoolBossRef != 1.00The Reference for the GetDead should have the Run on slot changed from Subject to Reference, and then we can simply select the NPC in the window.
Choices: aaaSpringvaleSchoolBossYes and aaaNo.
7j). Right-click > Add Topic into the vertical window and add aaaSpringvaleSchoolBossYes (or whatever it's named in your GECK).
Topic Text: Leave this just as it is (aaaSpringvaleSchoolBossYes) since Prompt is being used for the clickable topic.
Response Text: Awesome soldier. I think you already know where Springvale is; chances are you've been there before, right? - I'll add a map marker just in case. Here's a ticket to remind you. - Their leader is called the Headmaster. Kill him, and 300 caps are yours. - Make sure to search the entire place, the school's got two levels.
Prompt: Springvale's boss has taught his last lesson.
Conditions:
GetIsID aaaQuestAgent == 1.00 AND
GetScriptVariable aaaSpringvaleSchoolBossRef Reference: Dead == 0.00 (Note that the GetDead variable is not needed, it's already established the boss is alive. Same goes for the GetQuestVariable. If we've gotten this far with dialog, it's no longer a factor.)
Result Script [Begin]:
Set aaaSpringvaleSchoolBossRef.dead to 1
Player.AddItem aaaSpringvaleSchoolTicket 1
SetObjectiveDisplayed aaaGenericWastelandQuests 1 1Result Script [End]:
ShowMap SpringvaleElementaryMapMarker7k: Compile that and click OK.
Now, make sure the NPC boss is still in the Render window.
Object window > World Objects > Static8).: Drag an XMarkerHeading into the Render window and give it a Reference ID. I've got aaaSpringvaleSchoolXMarkerHeading. Copy its name and paste this onto the Notepad. This marker is going to be where the NPC gets teleported to, later on via script. So make sure it's in a spot which is clear of rubble / static items.
Note:
Step 8 is especially necessary for Fallout 3, since enemies will often respawn wherever they were killed. If the fight with the boss gets continued outside, or in some other cell, THIS is where he/she will respawn, even if a Sandbox package is supposed to make him/her return to an editor location.
Object window > Miscellaneous > Message9a). Right-click > New.
ID: aaaSpringvaleSchoolDeathMessage (copy/paste this to the Notepad).
Display Time: I've got 18, which means the message stays onscreen for 18 seconds. This can be changed to whatever is desired.
I like for the msg. to stay onscreen for awhile. Thing is, during the heat of combat, sometimes a quick message which flashes on for the default of 2 seconds can easily get missed.Title: Springvale Elementary Death Message
Message Text: The Headmaster of Springvale has been pwned.
Note:
Message Box is chosen by default, and I always toggle this off because when a box pops up in the game, this means all the action stops, until the player clicks OK. Messages are not 100% necessary and some mind even find them unimmersive. But I like this sort of thing because it shows that the quest is working.
9b). Click OK. Save.
10a). Reopen the NPC's script, either from the pencil icon on the main toolbar, or from the enemy itself.
10b). Add this line somewhere between the If and EndIf statements:
SetObjectiveDisplayed aaaGenericWastelandQuests 1 0
ShowMessage aaaSpringvaleSchoolDeathMessage
SetObjectiveDisplayed aaaGenericWastelandQuests 2 1 Note:
"SetObjectiveDisplayed" for the original mission is set to zero. This means this objective will no longer be displayed at the start of the game, or whenever this quest is toggled on. DO NOT use SetObjectiveCompleted. Doing so makes the objective work only once. If the quest is picked up later on (after the boss has been rid) those objectives will no longer show up in-game. Note 2:
Make sure the second SetObjectiveDisplayed (the one which tells the player to return for reward) goes UNDER the ShowMessage. This way, once the NPC boss has been rid, the message shows first, and the reward objective follows this. 10c). Save and close the script, and OK the NPC's panel(s) if needed.
11a). Now return to the quest. Open the first locational topic, which in my game is aaaSpringvaleSchoolBossTopic. Copy All its conditions stack.
11b). Right-click > New into the Info window.
Response Text: Well, good news is the baddies have not returned to Springvale. Yet. Would you like to take a look at the rest of our list?
Conditions: Paste these...
GetIsID aaaQuestAgent == 1.00 AND
GetDead aaaSpringvaleSchoolBossRef == 1.00 Basically, the ScriptVariable is not needed, and change the
!= comparison to
==.
11c). In the Choices window only aaaNo can go in there now. For future additions to the quest agent's list, other locational topics can get added here.
11d). Click OK and reopen the quest's Topics tab. Find GREETING.
Response Text: You are back. How's the latest mission coming along?
Conditions:
GetIsID aaaQuestAgent == 1.00 AND
GetQuestVariable aaaGenericWastelandQuests, DoOnce == 1.00Copy All those.
Add Topics: Add aaaWastelandMissions
11e). Find the Missions topic, there should already be a topic here with its own Topic Text and its own prompt. Right-click > New into the Info window.
Response Text: Seems you've got yourself a mission already. - Take a look at the latest ticket in your inventory, it should clue you in.
Prompt: What else you got?
Conditions: Paste the same conditions from the GREETING in 11d.
Toggle Say Once a Day and Goodbye on. Click OK.
12a).: Go back to the GREETING, and make a new one. This is what the agent's going to say when the boss has been put down, and now we're ready to be paid. 💰
Response Text: Ah wonderful, look who's back.
Conditions:
GetIsID aaaQuestAgent == 1.00 AND
GetQuestVariable aaaGenericWastelandQuests, DoOnce == 2.00Add Topics: Add aaaRewardTopic.
12b). Add the Reward topic into the leftmost window.
Topic Text: Reward
Response Text: Glad to hear Springvale's Headmaster is in detention. Here are your caps.
Prompt: The Headmaster of Springvale School is no longer in office.
Conditions:
GetIsID aaaQuestAgent == 1.00 AND
GetScriptVariable aaaSpringvaleSchoolBossRef, Dead == 2.00Toggle Goodbye on.
Result Script [Begin]:
Set aaaGenericWastelandQuests to 0
Player.RemoveItem aaaSpringvaleSchoolTicket 1
SetObjectiveDisplayed aaaGenericWastelandQuests 2 0Result Script [End]:
Set aaaSpringvaleSchoolBossRef.Dead to 3
Player.AddItem F 500
RewardXP 1012c). Click OK, closing the quest window, and save. And now to finish up the main script. For anybody who's made one of these repeatable quests for Oblivion, you'll be familiar with the timer script to come.
13a). Here's what the main script looks like so far...
Scriptname aaaGenericWastelandQuestScript
short DoOnceNow add the following, so that overall it'll look like this
----------------------------------------------------
Scriptname aaaGenericWastelandQuestScript
short DoOnce
Short Timer1
Short StartDay1-----------------------------------
13b). Save and close the script. Close and reopen the quest. Here's the entire script.
------------------------------------------------
Scriptname aaaGenericWastelandQuestScript
short DoOnce
short Timer1
short StartDay1
Begin GameMode
;----------------------------------
;This section pertains to the boss of Springvale Elementary
If (Timer1 == 0)
If (aaaSpringvaleSchoolBossBossRef.Dead == 3)
Set StartDay1 to GameDaysPassed
Set Timer1 to 1
EndIf
EndIf
If (Timer1 == 1)
If ((GameDaysPassed - StartDay1) >= 3)
Set Timer1 to 0
Set aaaSpringvaleSchoolBossRef.Dead to 0
aaaSpringvaleSchoolBossRef.MoveTo aaaSpringvaleSchoolXMarkerHeading
EndIf
EndIf
End--------------------------------------------------------
Pretty sure that covers everything.