Help - Search - Members - Calendar
Full Version: Renee's Modding Thread
Chorrol.com > Mods > General modding
Pages: 1, 2, 3
mALX

These are awesome tips! Thanks Renee!








SubRosa
Wow. That is amazing.
Renee
aw, well thanks.
I appreciate your encouragement, because even a simple quest like this takes a lot of learning. I feel like I'm getting the hang of it though. I really, finally am!


http://chorrol.com/forums/index.php?s=&...st&p=225359

http://img.photobucket.com/albums/v90/subr...Oblivion203.jpg

https://i1113.photobucket.com/albums/k505/m...21-05-51-44.jpg

https://web.archive.org/web/20200220053831/...ou-now-4/page-1

https://hosting.photobucket.com/albums/ad20...zpseff92113.jpg
Renee
Repeatable Bounty Quests, How to add new locations. Game: TESV: Skyrim

Here's how to add extra locations for plundering, and it assumes the previous lesson has already been completed and tested. Ultimately a total of FIVE locations can get added per quest, and that's as far as I prefer to go. Perhaps more than five can be added in the long run, but I prefer five for my own sanity.

1). Open up the mod and quest which have been built. The steward or agent who dispenses quests has already been made, and I am assuming the same person is going to be used.


2a). OBJECT window > Character > Quests > Bounty Quests\
Click on the Quest Stages tab. There should already be six stages here: stages 0, 10, 15, 20, 30, and 50. Add four more stages: 16, 21, 31, and 51.

Stage 16: Stage 16 is similar to Stage 15. Since a second location is getting added, stage 16 gets selected if the Player chooses to inquire about this second location. In my game, this is going to be Uttering Hills Cave. Right-click > New into the top Log Entry window. It'll say EMPTY in this window, and this is how we're going to leave it. In the Papyrus Fragment box, type ; X Location inquired, with X equaling whichever second lair you'd like to plunder.

Stage 21: This stage gets chosen if the player chooses to go to a second location. Again, right-click New, and type ; X Location chosen.

Stage 31: This gets triggered if the leader of the second location gets pwned. Right-click > New again, and type ; Leader of X location has been killed.

Stage 51: This is the reward stage. It is possible to simply use Stage 50 as an all-purpose reward to simplify things, but I like having different final stages, because each job should pay a little differently in my opinion. Final dialog can also vary. The steward might say a different set of congratulations after we take down Uttering Hills Cave, compared to the less remote Morvunskar, right?


For each new location which gets added, simply add four extra stages. My next location will include Stage 17, 22, 32, and 52, for instance.

2b). Click OK and save. Reopen the quest.


3a). Dialogue Views or Player Dialogue tab
There should be two branches of dialog already. The first branch deals with starting the quest and choosing a location (or not). The second branch deals with our reward phase. Click on the first branch.

I am going to describe what to do using the Dialogue Views tab. I am starting to get the hang of using this tab's windows, after all.

3b)
. Right-click into the large yellow box and select Add Topic.

3c). Change ID to something locational. So for instance, I am changing the ID of this topic to aaaUtteringHillsTopic. Topic Text can simply be the name of the location, so Uttering Hills Cave goes here in my game. Click OK.

3d). Find the first locational topic. This topic already corresponds to Stage 10 going into Stage 15. Open this topic up, and Copy All three of its conditions (GetIsID, GetStage, and GetDead).

3e). Now, back to the new topic just made. Double left-click into the blank white space (under the new topic's name). The Topic panel pops up again. Right-click > New into the giant lower window, and type the steward's response text. "Uttering Hills Cave, located somewhat on the edges of the Jarl's region..." and so on.

When the larger Topic Info panel pops up, Paste the three conditions into the Conditions window. Get rid of the GetDead condition, so only GetIsId and GetStage remain.

Don't forget to Record some voice, or simply record silence if no voice or microphone is available. Toggle 'Force Dialogue' (actual name?) on, and keep 'Has LIP File toggled' on.

3f). In the Papyrus Fragment: End box, type GetOwningQuest().SetStage (16). Copy this line of script so it can be pasted into other Papyrus Fragment boxes. Click OK. Click OK again, and save.

3g). Reopen the quest, and open its initial branch.

3h). Left-click on the very first Topic made for this entire quest. This should basically be its initial dialog.

3i). Move the cursor downwards into this topic's white area, so that it changes from a pointer to a hand. Now click and drag this hand from this initial topic to the topic which was just made. Voila, now the initial topic is linked to both locational topics.

Click OK, and save.


4a). Reopen the quest. Right-click > Add Topic into the initial branch's yellow area. This topic gets chosen if the player chooses to plunder the second location. So, ID can be aaaLocationYes, with "Location" being whichever location has been chosen for plundering.

4b). Click OK twice. By now, the Dialogue Views page might be quite a mess. Go ahead and rearrange all these topics to your liking, toggling Show All Text off if desired.

4c). Double left-click into the new topic's white area, then right-click > New into its main (lower) window. Type some dialog: "Oh blessed, we have been waiting for somebody to rid the scum of Uttering Hills Cave for months now..." Additional dialog can be typed: how to get to this location, how much it'll pay, and so on.

4d). Paste the two conditions (GetIsID and GetStage) into the Conditions window. The GetStage should be changed from 10 to 16.

4e). Paste GetOwningQuest().SetStage (10) from the quest's initial topic, changing 10 to 21.So it's going to say GetOwningQuest().SetStage (21).

4f). Click OK. Now link the previous inquiry topic to this new locational "Yes" topic. Click OK. Save.


5a). OBJECT window > Actors > Actor
Time to make the enemy leader. viking.gif Right-click > New into the window. Give the enemy an ID, Name and Short Name. I always use Boss for Short Name, which makes these enemies easier to find in the Object window.

5b). Toggle Unique and Respawns on. Click OK.

5c). Reopen the enemy, going through all the different tabs. Make sure, for instance, that this enemy winds up in the same faction as all the others he or she will be living with. Make sure the enemy's AI Data is Very Aggressive and either Brave or Foolhardy, otherwise they'll just stand there looking at us as we rush into their lair. Click OK.


6a). CELL + RENDER windows
Put the enemy into the proper cell, and give this enemy a Reference ID.

6b). Open up the enemy's Actor panel. Right-click > Add Script into the Papyrus Scripts window.

6c). Double left-click on [New Script]. Type something pertinent into the Name slot, such as aaaUtteringHillsChieftainScript. Click OK.

6d). Click the Properties button. Click Add Property. Change the Type scroll-bar to Quest.

6e). Name can be something unique, dealing with the enemy's ID name + property. aaaUtteringHillsChieftainProperty, for instance. Click OK, and wait for the Property to show up in the left window.

6f). Highlight (left-click) on the property. Press the Edit Value button. Find the quest's name in the Pick Object scroll-bar. Click OK.

6g). Right-click > Edit Source on the script. The first two lines of script have automatically been generated. The rest will need to be typed in mostly by hand. It is possible to simply Ctrl + C the property's name (located in the second line of text) and Ctrl + V (paste) it into the fourth line of text.

-------------------------------------

Scriptname aaaUtteringHillsChieftainScript extends ObjectReference

Quest Property aaaUtteringHillsChieftainProperty Auto

Event OnDeath (Actor Killer)
aaaUtteringHillsChieftainProperty.SetStage (31)
EndEvent


-------------------------------------------

6h). Click OK. If the script saves successfully, great. Go ahead and save.


7a). OBJECT window > Character > Quests
Open the Dialogue Views or Player Dialogue tab, and select the Reward branch.

7b). I am not going into full detail here, but follow steps above in the previous Skyrim lesson (if needed) to make a new topic, and add Reward dialog. "You've done us a great service, here is your reward...yadda yadda."

7c). Paste the same GetOwningQuest line of script (copied earlier during step 3f) and change its stage bump, so overall it says GetOwningQuest().SetStage (51). Click OK.


8). Quest Objectives tab.
Make two objectives: one for Stage 21, and one for Stage 31. Stage 21's text will say something like "Pwn the leader of X location." Stage 31's text will say something like "Return to X for your reward."


9a). Quest Stages tab
Open Stage 21, and type SetObjectiveDisplayed (21) into its Papyrus Fragment box. Copy this line of script.

9b): Open Stage 31. Paste the line of text just copied, and change 21 to 31, so now it says SetObjectiveDisplayed (31).

9c). Paste the same line of text, changing "Displayed" to Completed, so overall it'll say SetObjectiveCompleted (21). Copy this line of script.

9d). Open Stage 51. Paste the line of text from step 9c, changing 21 to 31, so overall it'll say SetObjectiveCompleted (31). Voila. All the quest's messages are in the game. Click OK.


10). OBJECT window > Items > Book
Edit the previously-made note or scroll, changing its ID (duh) and Book Text. Copy the ID of this note or scroll so it can be easily pasted in a few moments.


11a). QUEST window > Quest Stages tab
Select Stage 21. Click on the Properties button. After the panel pops up, click Add Property.

11b). Look for Book in the Type scroll-bar.

11c). Add the book's ID into the Name slot. If this ID was copied earlier, a simple paste will suffice. Click OK.

11d). Left-click on the Property for the book. In the Pick Object scroll-bar, find the book's ID (a lot of times, this ID will already be selected). Click OK.

11e). In the Papyrus Fragment box, type Game.GetPlayer().AddItem (aaaBookName, 1)

11f). Optional: add any other items which seem pertinent into Stage 21's Papyrus Fragment box. I like to add potions, mostly. Adding items via this Properties method can get dicey. One little mistake, and the game will scream error messages. Follow the Tip and Troubleshooting portions of the previous Skyrim Bounty Quests Lesson / Step 16f, if things go wrong.

After screwing up a few items in the past, then having to erase script fragments several times, it really makes one realize how much easier the Construction Set and Fallout 3's GECK are. Player.AddItem X X and it's done! I can literally add items via script in my sleep. sleep.gif mad.gif Grrr....

Click OK


Quest Stages tab
Time for our reward money. A script property has already been made for this stage.

12a). Click on Stage 50. Copy the line of text from the Papyrus Fragment box (Game.GetPlayer).AddItem Gold001, X).

12b). Click on Stage 51. Paste that line of text into its box, changing the amount of reward money, if desired.

Also type stop() into Stage 51's box. Click OK.

Stop() is what causes the quest to stop running, but do NOT toggle Shut Down Stage on.

For the next phase, make sure the new enemy is onscreen in the Render window.


13a). OBJECT window > Character > SM Event Node
Right-click > Edit on Change Location Event.

13b). Sometimes this page is a huge expanse of white, other times it's got a bunch of nodes in its main window. If nothing is showing, double left-click onto Stacked Event Node. At the very bottom (or near it) should be the quest node which already deals with the first location.

13c). Left-click onto the Stacked Quest Node which deals with the quest.

13d). Right-click onto the GetDead condition, and select Copy Condition.

13e). Paste this condition right back into the Conditions window. And open it.

13f). Press the Select button. Click on Select Reference from Reference Window. And double left-click on this fearsome predator. Click OK.

13g). Toggle the OR selection on, and click OK. Here is what the final result in the Node Conditions area should look like.

R GetDead NONE == 0.00 OR
R GetDead NONE == 0.00 AND
PL GetInCurrentLoc LOCATION == 1.00


Note: If those are out of order (AND, OR, for instance) it is possible to reorder them. Hopefully this won't need to be done, because it'll involve making you work in Portrait mode instead of Landscape. rolleyes.gif


Basically, the quest will only start from the beginning, with the agent's opening greeting, if the Player is in location, and if either enemy is alive.

-- If both enemies are dead, the quest will not start, and the agent will stand there saying "Yaah?" "Hmm?" It is possible to give the agent some dialog for this scenario, but first make sure the quest dialog actually works as-is.


13h). Click OK. Save


14a). QUEST window > Dialogue Views or Player Dialogue tab
Open the second locational topic (this is the one which goes from Stage 10 to Stage 16).

14b). Add a GetDead condition to this topic. Run On: Reference, and double-click on the referenced enemy in the Render window. Change the value to 0.00. Altogether this condition will read GetDead NONE == 0.00. Click OK.


15). Make sure to update the mod's SEQ file.

Have a glass of wine if you're of legal age. Or partake in some other form of celebration of your choosing.
Renee
SetActorOwner

https://www.creationkit.com/index.php?title...ObjectReference

Patrolling the Mojave almost makes for a nuclear winter. (NPC man says this)
SubRosa
You can use this at the console. It is a great way of making beds sleepable. Or items in dungeons that would otherwise count as being stolen, able to be picked up with no repercussions.
Renee
QUOTE(SubRosa @ Apr 1 2020, 07:28 PM) *

You can use this at the console. It is a great way of making beds sleepable. Or items in dungeons that would otherwise count as being stolen, able to be picked up with no repercussions.

Oh yes! Well I am trying to learn how to do this via quest. So in Vyvoor's game he'll be able to speak to somebody and they say "Oh you great Dragonborn, bla bla ...." and somebody gives him a horse for free. So up above that's just to remind myself where I found the correct scripting.

Renee
USE THIS idea for Fallout3_Jail.esp. We're going to work with Miss Vicious Delicious' game

Here is the GECK page describing how crime works.

https://geckwiki.com/index.php?title=Category:Crime

---------------------------------

Compiling ideas to make a Megaton Jail Cell. The condition below should begin the crime process IF the player murders somebody.

If (IsPlayerKiller == 1)

So if the PC is the one who murdered some NPC, this causes a variable to switch on. Which causes Lucas Simms to seek the PC when he/she returns to Megaton.

Only question is, how do we attach this script to peaceful NPCs? It can probably get attached to an entire faction, somehow.

----------------------------------------





----------------------------------
Renee
Adding a Jail and enhancing Fallout's Crime System. Game: Fallout 3

In 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. nono.gif

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 JAIL


1a). 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. embarrased.gif 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-63FR4

Note 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 window
Now 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. ph34r.gif

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. ph34r.gif 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 OFFICERS

One 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 tab
2b). 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 tab
2c). 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 Tab
2d). 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 tab
2e). 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 tab
AI 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 > Packages

2f). 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 Status


2l). 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. biggrin.gif

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? wacko.gif 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 QUEST

OBJECT window > Actor Data > Quest

3a). 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 StartDay5



3d) 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

End


As 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 Tab
3f). 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.00


And 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.00


3h). 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.00


or

GetIsID aaaMegatonOfficer == 1.00 AND
GetMinorCrimeCount >= 5.00 AND
GetGold Reference: Player >= 100.00


3l). 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 >= 200


Conditions for greater Major Crime ...

GetIsID aaaMegatonOfficer == 1.00 AND
GetMajorCrimeCount >= 5.00 AND
GetGold Reference: Player >= 1000


And 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.00



RENDER window
4a). 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 > Quest
5a). 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.00


Toggle 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 2


All 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.00


5f). 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 > Packages
6a). 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.00


7b). In the Result Script (End) box type Set aaaMegatonOfficerRef.Status to 3

7c). 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 JAILBOT


OBJECT window > Actors > Creature > Robot > Protectron

8a). 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 QUEST

OBJECT 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 Data
10a). 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


End



Note 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 tab

Start 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. ph34r.gif 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.00


Note 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
Making a Patrol package. Game: Fallout 3


Good day. Today I am going to discuss how to make an NPC patrol a fixed area, without just having them Wander or Sandbox aimlessly. This sort of package comes in handy when we want this NPC to do anything more specific than just move aimlessly.

When trying to add a patrol to a new cell (or any sort of area where an NPC will walk in an area without navmesh), it is important to add navmeshes to this cell. This sort of thing is rather complicated to describe, but this tutorial can help. Here is Beth's official tutorial on navmesh.

-------------------------------

Now, for the Patrol AI part.

Firstly, there are two types of NPC patrols. Generic NPCs (such as raiders) have a different method than named NPCs. To see a well-detailed video on generic patrols, click here.


And here is the video link for named NPCs, narrated by a modder with a British accent.

https://www.youtube.com/watch?v=VRzPxjeW750

But I am also going to describe how these work step-by-step.

--------------------------------

1). Create or edit an NPC, unless an NPC who's going to patrol has already been added into the game. It is possible to make vanilla Bethesda NPCs patrol as well, though this can get risky of course.

Note: for best results with named NPCs, where it says Template Data, make sure that ActorBase's scroll-down menu is set to NONE.

2). OBJECT window
Go into World Objects > Static, find Xmarker. Drag an Xmarker into the same cell as the NPC. Put this Xmarker onto the FIRST point you'd like the NPC to walk to.

3). RENDER window
Ctrl + D to duplicate this X-marker, and move it to some other area which will be the second point of the NPC's patrol. We can keep duplicating as many patrol points as we'd like.

4). Give each Xmarker its own Ref ID. Though this is not fully necessary (Beth sometimes uses generic markers with no references) it helps to know where the NPC is going to go more specifically, by naming these references and numbering them (aaaPoint1, aaaPoint2, aaaPoint3... etc.). Later on when the patrol package is being made, we can view these Xmarker points in a window.

5). Double left-click on the first X-marker. Go to its Linked Ref tab (this tab might be hidden in the row which starts with 3D Data, so use the < arrow to move to the left until the Linked Ref tab can be seen).

6). Click the "Select Reference in Render Window" button. Now the cursor gets moved into the Render window again, it will turn into a red circle with a + in its middle. Move the cursor until it is over the second patrol point, and it should turn white. Once it is white, click (maybe double-click) on the X-marker which will become the second patrol point.

7). Click OK. There should now be a green colored line going from the first patrol point to the second.

8). Repeat steps 5 through 7 with any other X-marker patrol points. If the patrol path is to go around and around in a loop, click the final X-marker and link it to the first one.

9). Double left-click on the NPC who will patrol, opening up its Reference panel, and click Edit Base. Go into the AI Packages tab. Right-click > New in the Editor ID box.

10). Give this package a unique ID.

Package Type: Patrol

11a)
. Starting Location: there is a button under these words which says "[none] n [none]". Click on this and choose Near Reference, and then specifically find the first Xmarker by selecting Select Reference in Render Window. Notice how in the Patrol Point List it will actually list all the different points of the patrol.

Click OK.

11b). Make sure Radius stays at 0, and "Repeatable" stays toggled on if the NPC is supposed to repeat this patrol.

11c). Flags tab-- Toggle Must Complete on. "Continue if PC is near" can also be toggled on if the Patrol is not working for some reason. I also like toggling Enable Fallout Behavior off, but Hellos to Player, Reactions to Player Actions, and Allow Idle Chatter on.

Click OK and close everything. SAVE all work.

12). Double left-click the NPC again, Find the Linked Ref tab. Click on the "Select Reference in Render Window" button, and link the NPC to the first X-marker patrol point. Click OK. There should now be a yellowish-green line going from the NPC to the first Xmarker.

That is the basic patrol path. Once we're back in-game, the NPC will move from point to point in a rather nervous fashion. Thankfully this can be slowed down. It is possible to modify how long the NPC stays at various patrol points, and other fun stuff.

13). RENDER window
Click on one of the X-markers which has been linked. Let's say we want the NPC to stay here for awhile. Click on the Patrol Data tab.

Idle Time defaults to 0.000, with that first digit being minutes. Change this to whatever is desired. It is not exactly accurate, but if 10.000 goes in this slot, the NPC will move after roughly 10 in-game minutes. 60 = an hour, 360 = 6 hours, and so on.

Topic scroll-bar: if we've already created a specific dialog topic in the Topics tab, and wish to use this topic AT this particular patrol point, scroll down and find it. The NPC will say this when standing at this point. This can also be triggered via quest topics too, of course.
....
Renee
Horse Rentals. Game: TES IV: Oblivion


This 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 > NPC
1). 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. nono.gif
--Do not edit an ImpLegion horse.


Actors > Creature > Horse
2a). 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 tab
2c). 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 window
4a). 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 StartDay


Save 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 1

5d). 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 1

Add aaaHorseTopic into the Add Topics window.

Click OK and save.


QUEST window > Topics tab
6a). 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.00


There 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.... >= 120


Make 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! panic.gif (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.00


Again, toggle Run on Target ON for that GetGold condition.

Result Script: Set QuestName.Rent to 0

7g). Click OK and save. All the dialog has been written, so phew.


QUEST window > Quest Data tab
8a). 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

End


Note: 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 window
9a). 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. sad.gif 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

End



10B). 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

End



10c). 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.00

10e). 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
Trigger Zones, Game: Fallout 3

Fallout 3 does have X-markers, but it also uses what are called trigger zones or 'triggers" to setstage quests and perform various script-related functions as we pass through them. Triggers can be more effective than X markers. The reason is, trigger zones can be structured to cover an entire area, to make sure the PC will pass through them. X-markers, on the other hand, require scripts to determine how close we are, which don't always work as well.

Here is a good video to watch, for those who want better visual aids.

https://www.youtube.com/watch?v=QaMtpvrEG9E&t=34s

Otherwise, here are some text instructions.

CELL window
1). Go into the Cell or Worldspace where the trigger zone is going to be added.

2). On the main toolbar, find the T button. It looks like a child's block with a T in it, and is just right of the NavMesh button (with red scribbles in it). Click this button.

3). In the Render window, left-click somewhere on the ground, and drag upon it. It helps if the area where you are clicking does not have a bunch of stuff on it (items, Markers, etc.). After you drag on the ground.

4). At first, nothing might happen. Or perhaps a red square will show onscreen. If nothing is seen, just move the mouse upwards (without holding any buttons). Now we should be seeing a transperant red cube. This red cube will be what activates the next stage of the quest, or the next script variable, or whatever.

Once we're back in game, walking THROUGH this red area is what makes things happen, so if it's not big enough, or if it's not in the right area, chances are it might need to be redrawn or dragged. These red cubes can be tricky to move around though.

5). Double left-click on the red cube. This will pull up the Activator panel.

6). We'll need to give it a new ID. Click on the New toggle (next to the ID pane), and give it a new ID name. "Name" is not important, and can be deleted, even.

7). If there is any Script on this Activator, get rid of it by moving the scroll-bar to NONE. Click OK. And Save.

Note: After we close the Activator panel, notice there are a bunch of colored lines & arrows in the cube. Now it can be moved and manipulated. Just left-click and drag. Pull or collapse. The video can give better visuals, of course.

8). Double-click on the red cube. Next, click on Edit Base. Now we're going to add a script, which can be left as an Object. It should look like this..

scn XnameScript

Begin OnTriggerEnter Player

If (GetStage == X)
SetStage X
EndIf

End


Save the script, click OK on the Activator panel, and reopen it.

9). Click Persistent Reference ON.

10). Click OK and as always, save.

The instructions below are for those who wish to attach the trigger zone to a Quest Objective, such as a marker.

11). Open up the Quest window you've been working on (if there is one). Go into the Quest Objectives tab. In the Target Ref window, add a target if this hasn't been done already.

12). In the Quest Objectives tab's Cell scroll-down bar, locate the area where the red cube has been added, and select its Ref.

Note: If this cube has been placed outside (especially somewhere in Wilderness) it may not show up in the scroll-bar. If this is so, click on the "Select Reference in Render Window" button. Make sure that the Render window is still displaying the area where the red cube has been created. Double-click on the cube, and it should automatically get selected as the Ref.
Renee
https://www.youtube.com/watch?v=wj6qGCT4isg...nnel=Seddon4494

Timer script with seconds

-----------------------------------------------

A REF variable stores a ref ID that you snatch out of the game in realtime. Like. if I am in combat with Fawkes, and I run the script commands:

Some stuff must use FLOAT values, such as additemhealthpercent.
Some stuff must use SHORT or INT, such as getweaponhealthperc

My understanding is that Short and Int don't get to have decimal point values after them. Float does. And Float numbers can hold values that are larger than Short ant Int - - like, really, really huge values, bigger than almost anyone would have a use for.\

I don't know what LONG is.



Float means floating point... which means has a "point" in it.

"Short" for the Geck is a 32 bit signed integer. This is large enough that you will not likely overrun it.

For Oblivion, short is only a 16 bit signed integer. Still pretty large.

In summary, use floats when you need fractional parts, use short otherwise.


Since using the GECK, I use only REF, FLOAT, and INT variables.

I prefix my variables with the first letter of the type of variable it is.
For example:
int iVariableName
float fVariableName
ref rVariableName

I stay away from labeling the INTs as SHORTs, because FOSE allows STRING variables, so
string sVariableName
won't get confused with
short sVariableName
Renee
https://web.archive.org/web/20130429160307/...ObjectReference -- has an example of locking a door via script. Just follow links in the wiki to also get it to Unlock.

------------------------------------


To add a spell effect to somebody in Skyrim just by putting something on...

https://web.archive.org/web/20200213110353/...xample-i-think/

-------------------------------------------

If you want a script to run on a piece of equipment when it is equipped, and affect the actor that has it equipped, you'll want to use a structure like this:int bEquipped
ref rContainer

Begin OnEquip
set bEquipped to 1
set rContainer to GetContainer
End

Begin GameMode
if bEquipped
; Do stuff using rContainer
endif
End

Begin OnUnequip
set bEquipped to 0
End

--------------------------

Disable referenced NPC 10 seconds after pwning

------------------------

Activate Parent and Enable Parent tabs, yes? The Activate Parent tab is used when you want an activator (like a door) to be activated by something else (like when opening a vault gear door by flipping a switch as opposed to just "activating" the door itself). If you set up an activate parent, the activator object will then be activated by the object itself and the parent object. If you check the "Parent Activate Only" flag on the tab, then only the parent will activate it.

The Enable Parent is more or less the same thing except instead of Activating, it enables/disables an object based of the parent's enable state. One way to use this is to set a bunch of lights that have their enable parent set to an Xmarker. Then when you enable the Xmarker, all the lights will be enabled as well (turn on). When you disable the Xmarker, all the lights will be disabled (turn off).

----------------------------------------

Change Creation Kit page size?

Did a quick test and by changing the value of

Creation Kit X=
Creation Kit Y=
Creation Kit W=
Creation Kit H=

I was able to play with the startposition and size of the windows. Use at you own discretion as I am a total noob regarding inifiles.

-------------------------------------------------------

Papyrus is very “type-oriented”. In programmer terms, it is “strongly-typed”. The best way I can think of to explain it would be that the compiler has a very narrow view of what you can and cannot do with various kinds of objects in the game (also known as “types”).

As an example, think of a car. The “Car” is our “type”. You can tell a “Car” to drive by writing: “Car.Drive()”. But you cannot tell a car to fly, because a car is not an airplane. So “Car.Fly()” doesn’t work. (And would give you the “function doesn’t exist error”)

One thing that can be incredibly useful if you are having trouble with a specific function is to search the other scripts included with the game for the name of the function. So, if you can’t seem to get SetEssential to work, search all the files in “Skyrim/Data/Scripts/Source” for “SetEssential” with your favorite text editor, or even Windows (they’re just text files), which should help you in figuring out what to do differently. Simply extending a different script will most likely make your script not run at all on the object you attached it to (because the game won’t let you run a quest script on an actor, for example), and importing another script is simply shorthand that is mostly useful for global functions.

----------------------------------

First you need to extract voice files from Oblivion BSA files. I found BSA Unpacker on Nexus and it did the trick, although some voices are missing - I see no Khajiit voices, for example. May be it didn't work right, but I got what I was looking for, so stopped looking. Now you can start the actual work. (Hmmm... This got me thinking. I could hijack Skyrim conversation as well! It's the same format. Oh!!!)

You start by locating the quest from the Companion Share mod - it's called aaaGeneric. Click on Topics and see all the various lines of conversation that you get (these are not all of the lines, there are more in the other quests, but these are the ones you start with). For example, start with GREETING. It has four different lines, I suppose you know this stuff as you do quests. Click one of the lines, then double click the line under Response. It opens a window to edit the response and this is where all the sound files go.

Firstly, there are no recorded lines of dialogue that say exactly what is written under Response, so I changed it. The tedious bit is to know what to change it to. You need to find a line somewhere else that you can copy from. I guess you know how to search - filter dialogue by NPC to see only lines of the same voice, etc. Or use "find text" from the Edit menu. Let me know if you have questions here. The bottom line is, once you find the line you want to copy from, you need to make note of three things: race, sex and audio ID. Race and sex is needed to make sure that you don't suddenly have your hulk of a Nord talking with the voice of a female Bosmer. wink.gif But you can do it if you really want to - there is no limitation where the audio comes from. Audio ID is a string in a box just above the list of voice files in the window. You cannot edit it but you can copy it, so do it.

Now go back to the line in the Companions quest that you want to paste this audio into. I edited the subtitle text so that it matches the spoken phrase, but you don't have to, especially if you pick different phrases for different races. So in this window there's a list of voice files. Find one with the correct race and sex and click it so it's highlighted. Then click "Copy audio file" button. It shows you a file selection window. Navigate to the correct folder where you want to copy the file from, for example Voices\Oblivion.esm\Nord\m and behold loads and loads of voice files. Paste the audio ID into the File box and it should come up with two files - an MP3 and a LIP file. Select the MP3. If it doesn't come up with anything useful, scroll through the long list and find the correct file manually. Did I mention it was tedious?

So, this copied the audio file. Now click "Generate Lips file". Also don't forget to check Emotion and its percentage. Done! Click Ok.

Repeat this for every single response that you want modified. wacko.gif

This is how to reuse lines that are already in the game. If you have new audio files from somewhere else, like from Skyrim for example, you can use them as well. You just need to know which MP3 file you want to use, then when you click "Copy audio file", you just navigate to whatever folder you want and select the correct file. The system copies it into the correct location and changes the file name to the correct one so that it can be found. This is why you cannot just copy files by hand - they have to be renamed. Well, you can rename them by hand but that's even more tedious! tongue.gif

It takes a long time, but it is so much better to have talking companions! biggrin.gif
Renee



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. tongue.gif



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
Getting an Xbox controller to work on PC. Game: TES III: Morrowind

First 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. nono.gif 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. sad.gif

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. mad.gif 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. Hug_emoticon.gif

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. unsure.gif 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. unsure.gif 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? unsure.gif


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! panic.gif

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. mad.gif 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. nono.gif

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.

-------------------------------------

TROUBLESHOOTING


1). 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
More Dynamic NPCs! Game: TES III: Morrowind

One of the first mods I looked for in this game was something which makes Morrowind's people actually move around. Especially those people who stand in the same spot (usually in indoor locations), literally for months. unsure.gif I figured this would be a quick search. Surprisingly, I still haven't found something which does this. There's gotta be a mod out there which makes the NPCs of this game wander a bit? Even if it's from one side of a room to the other?

Never did find anything, so far. But good news: it's pretty easy to make our own More Dynamic NPCs for Morrowind. smile.gif

I'm going to start with Arrille's Tradehouse in Seyda Neen. Now, I don't really have a problem with shopkeepers or merchants standing around. It makes sense that they'd tend to their counters, waiting for somebody like us to amble in.

Recommended: Nighttime Door Locks makes shopkeepers and home-owning NPCs lock their doors after dark. This dispels the illusion of people who stay put in the same cells 24/7 to some extent.

CELL & RENDER windows
1). I am going to start with Tolvise Othralen. This is the lady who wears green & yellow, and always stands next to Arrille. Find Seyda Neen, Arrille's Tradehouse, and find Tolvise in the Render window Double left-click on her in this window. Unlike Oblivion's CS, clicking on her in the CELL window will not open her NPC panel.

2). Click on the AI button. This is located toward the middle bottom of any NPC's panel. The AI Data panel pops up.

3). Look toward the left side of this panel, where the AI Packages window is. And notice this: Tolvise already has a Wander package!!! ... In fact this is true of a lot of NPCs who eternally stand around. A lot of them DO have Wander packages. blink.gif Which is why they'll occasionally take two steps in one direction, and then go back to standing around.

4). Double left-click on Tolvise's Wander package. The Distance slot is what we want to change. By default, a lot of indoor NPCs have a Distance of anywhere from 0 to 30, which is not very far. No wonder they barely move.

5). So this is easy to change. I like using binary numbers, such as 128, 256, 512, 1024, and so on. 256 is a good number for Tolvise (the Tradehouse is not very big) but for places which are larger, such as guilds, I'll choose 512 or 1024.

6). Click Save (or just press Return or Enter on your keyboard) twice, closing the package and AI Data panels. We'll usually have to manually click on Save to close the NPC's panel.

It is best to use the Render window, going into Cells which we know we want to influence, and clicking on each NPC just like I did with Tolvise. We can also make changes from the Object window, however it's not always easy to know which NPC we are changing, and personally I want to know. Because not all of them should wander about, in my opinion. Anyway, I just gave most of the NPCs in Balmora's Council Club the same treatment, for instance.

Note that some NPCs will have a AI button which is grey, and we can't click on it. Most of the NPC's info is Blocked. I'm not sure why Bethesda did this, but there's gotta be a reason. Maybe they didn't want a bunch of people walking into each other (which is what they will do sometimes, if the majority of them have broader Wander packages).

7). For such NPCs, I'll simply toggle Blocked (lower right corner of the NPC panel) off. Then I'll click Save. Reopen the NPC. Now we can change their AI as desired. And then I always toggle Blocked back on with these NPCs before saving. redwizardsmile.gif Because there's gotta be a reason why their info was blocked in the first place.

Like I said, occasionally they will now walk into inanimate objects, or each other! In my opinion, this is better than having a bunch of people standing around like statues, though. They will now clomp about, wandering into other rooms occasionally if their Distance is large enough. panic.gif It really changes the feel of interiors, right?

In situations where we have to steal something, such as the diamond which must get stolen during that first Thieves Guild quest, it is possible to wait for them wander into another room, making thievery less frustrating, and more possible. emot-ninja1.gif

Final note: Some NPCs don't have a Wander package, instead they'll have Follow or something else. DO NOT change these packages unless you really know what you're doing. They are there for a reason, usually something quest-related. And also, I never try to add a second package (Wander, or whatever) to these folks.

https://web.archive.org/web/20200218144534/...aithful-squire/
Renee
Getting the Take All button to work, Game: TES IV: Oblivion

Submitted by Lena Wolf

1. Get "Hotkeys galore" mod - it has all the interesting keys programmed... but to weird letters which clash with default Oblivion key assignment. They will also probably clash with whatever assignment you are using too, and they are not configurable.

2. Edit the mod to reassign to keys to something that works for you. I use standard key assignment, so I can send you the updated script that works with that.

3. Test it all with the keyboard - just to make sure it all works as you expect.

4. Make the appropriate mappings with your Joy2Keys/Xpadder. This must be the last step, it can be done with either utility. If you skipped step 3, go back and do it! mad.gif (I know I skipped it a few times, resulting in much time wasted.)

This mod does not conflict with hotkey mods that for example allow you more than 8 hotkeys for mapping your weapons or spells - those are not the same kind of hotkeys! So you can still keep your extended hotkeys and they will be unaffected (unless of course key assignment clashes, which is why you need to change it).

Renee
Setting fallback cell (instead of Tiber Septim)

https://web.archive.org/web/20200218144220/...a-strange-game/
Pseron Wyrd
QUOTE(Renee @ Sep 1 2021, 08:12 AM) *

Wow, that was a blast from the past. I haven't seen the names Breton Summer, Savlian and SOMEONE_reborn in years. SOMEONE_reborn was right: Tiber Septim as a fallback was a dumb idea.
Renee
I agree, Wyrd. Now that I know why random stuff shows up in Tiber Septim and how it gets there, that does seem a strange decision. Who knows why the fallback cell was designated that way. unsure.gif Maybe a dev goofing around.


fDlgFocus=9.0000 makes NPC faces more distant
Renee
Random Console Commands, Game: TES V: Skyrim

This post includes a few console commands used in Skyrim which are not listed at UESP. I keep wanting to use these commands here and there to change time in new games, but never can remember them!

set GameYear to X
set GameMonth to X
set GameDay to X
set GameHour to X

The year is always in the 4th Era, this cannot be changed.

Month uses the numbers 1 through 12. 10 equals Frostfall (October) for instance.

Day goes from 1 through 30.

Hour goes from 0 to 23, in 24 hour format. So set gamehour to 13 will make it 1pm.

---------------------------------------------------------------------------------
Renee
How to make a ForceGreet. Game: TES V: Skyrim

This one is going to teach how to make an NPC ForceGreet the player. What this means is the player (us) is greeted by an NPC. And when this NPC greets us, it pauses our ability to do anything else but answer the NPC's question, fulfill the NPC's demand, or whatever. Think of when we first enter Dragonsreach, and Irilith stalks up to us, blade in hand. "What's the meaning of this interruption?" she demands. And our ability to do almost anything else is temporarily disabled. Our options at that point are to continue the conversation, or back out of it entirely, and go back to whatever we were doing.

Note that only the Player-Character can be greeted in such a way. An NPC cannot forcegreet another NPC, they can only play part of one of Skyrim's scripted Scenes.

So, this assumes an NPC has already been made, because it's best to test this kind of stuff on our own custom-made people first. Make sure the NPC has a Voice Type which is supported (see the list below), and place him or her into a cell or worldspace.

MaleEvenTonedAccented
FemaleSultry
MaleDrunk
FemaleDarkElf
MaleDarkEfl
MaleNord
FemaleCommander
MaleBrute
MaleArgonian
MaleKhajiit
FemaleOrc
FemaleCondescending
MaleEvenToned
FemaleEvenToned
MaleYoungEager
FemaleYoungEager

I have found the best place to test this sort of item is in QASMoke, which is similar to the Testing Hall cell found in Oblivion. Here is a list of cells which might be safe to test.


RENDER window
1a). If the NPC being used for the ForceGreet is being added into the game (in other words, is not a vanilla NPC) double left-click on him or her in the Render window. Click on the Persist Location tab, and find the cell he or she is located, in the Persistence Location scroll-bar. Click OK.

If we don't do that, sometimes NPCs have a habit of disappearing once we add the package to them. mad.gif

OBJECT window > Character > Quest
1b). Make a quest, and give it an ID. I am calling this quest aaaForceGreetQuest.

Priority can be 60. Start Game Enabled and Run Once should be on. Use the Type scroll-bar to choose a type of quest. I am choosing Side Quests.

Note: --This quest going to be a very short example, which does not show in the Quest Journal once we're back in the game. So Quest Name is not necessary.


2). Click OK, closing the Quest window. Save. Reopen the quest.

3). In the Quest Stages tab, make three stages: 0, 1, and 2. Right-click into the Log Entry window for each of these so all three say EMPTY.

Stage 0 should have Start Up Stage toggled. This is the pre-stage, and the NPC will greet us during this stage, once we get near enough to him or her. "Do I know you? You look familiar" is what is in my game. After he or she says this, the quest bumps to 1.

Stage 1 "Afraid not," we answer. "Oh my mistake," the NPC says, and walks away, bumping the quest to 2. Note that in many cases, ForceGreets will automatically make an NPC Sandbox (walk away, sit down, eat, etc.) once the conversation ends.

Stage 2 should have Shut Down Stage toggled, as well as Complete Quest.


4). Click on the Dialogue Views or Player Dialogue tab. I am going to describe how this is done in Dialogue Views.

5). Right-click into the Editor ID window and choose New. Type a unique ID.

6a). Highlight the ID, and right-click > Create Branch in the larger window. Give the Branch an ID, Click OK, and OK again, closing the Quest window. Save.

6b). Reopen the quest. Now, open the same dialog window. Right-click into the gray box and select Edit Topic. The Topic panel pops up.

7a). Give the Topic a unique ID. And very important: Change the Priority slot from 50.00 to 100.00, if the ForceGreet is definitely supposed to happen.

7b) Type something into the Topic Text slot, which is what our character will say to the NPC after being greeted. I wrote "Afraid not" up above, and you can type whatever is desired.

7c). Change the Subtype scroll-bar from Custom to ForceGreet.

Click OK, and click OK again (closing the panel).

--Note also that so far, this dialog-making process seems backwards. Why didn't we type the NPC's greeting first? unsure.gif We'll see why in a few.

8a). Reopen the Topic panel, and right-click > New into the huge window area. Okay, now follow all the typical methods for making dialog. For those who have never made dialog in Skyrim (or have forgotten how) scroll down to step 5h of this post. This is the part where the NPC says "Oh, my mistake" in my example above.

Don't forget to make a recording. The process can be found in step 11n of this post, and we don't have to actually record any voice to make the dialog work once we are back in the game. smile.gif

8b). Toggle Has LIP File, Say Once, and Force Subtitle on, if you are like me, and do not use actual voice recordings. smile.gif For those who do use voice, only Has LIP File and Say Once are needed. I think.

9). There should be two conditions:

GetIsID aaaYourNPC == 1.00
GetStage aaaForceGreetQuest == 1.00


Copy All both of them.

10). Type GetOwningQuest().SetStage (2) into the End: Papyrus Fragment box.

11). Click OK, click OK again (closing the Quest window) and Save.

12). Reopen the quest, but this time click on the Misc tab. Right-click > New into the white Editor ID (tall, vertical window) and find Hello in the scroll-bar which is over this window.

13). Now's the time to make the dialog which will be our forcegreet. "Do I know you? You look familiar." Follow all steps for recording.

14). Paste the two conditions into the Conditions window, but change the GetStage to GetStage aaaForceGreetQuest < 1.00. And also add IsInDialogueWithPlayer.

Overall, the conditions should look like this...

GetStage aaaForceGreetQuest < 1.00 AND
GetIsID aaaNPC == 1.00 AND
IsInDialogueWithPlayer == 1.00


15). Type GetOwningQuest().SetStage (1) into the End: Papyrus Fragment box. Click OK, and OK again, and Save.


OBJECT window > Character > Package
16). Make a new package. Give it an ID.

17). Change the Package Template scroll-bar to ForceGreet. There are also ForceGreetFromSitting and ForceGreetWaitSitting, if the NPC is to greet us while sitting (for example, a Jarl on a throne). With ForceGreet, the NPC can walk toward us before saying their greeting if we choose for this to happen. With ForceGreetWhileSitting, they will simply continue to sit.

Do NOT touch the Owner Quest scroll-bar. Leave it at NONE or whatever. Changing this only works if other things get set up in advance, otherwise the package will not work if this has a quest's ID name here. rolleyes.gif

Package Tab
In the Public Package Data window there are a bunch of datas we have the option to manipulate: Topic, NPC Wait Location, Trigger Location, and so on.

-- Topic: click on this. By default this is set to [HELLO], and we are going to leave it there. This is obviously so the game engine picks up on the HELLO we just wrote.

-- NPC Wait Location is, of course, where the NPC will stay until we get near enough for him or her to start the ForceGreet package. Left click on this choice, and then select the button which says 'Near package wait location, radius 150'. The Location panel pops up. There are a bunch of options where the NPC can stay while waiting for us. For convenience, choose Near Self if we don't need a specific place for them to stay. Or, a referenced marker (such as an XMarkerHeading) can be chosen. For now, just leave this alone.

-- Trigger Location can be left at 'Near package start location, radius 500', or it can be increased. This is the area which causes the ForceGreet package to activate. The package activates, and begins processing so that the NPC gets ready to walk to us. Trigger Location can be changed larger than 500: Irilith, the NPC who accosts us as we first enter Dragonsreach for instance, has a Trigger Location of 3000, which is why she is already moving toward us to say the "jarl will not be receiving visitors" way before we even notice her.

-- Forcegreet Distance is the distance (in Bethesda units) of how far away the NPC will greet. Leave this on PlayerRef, of course. Radius is 300, but can be also changed larger or smaller. Don't make Radius too small though, or the NPC won't be able to greet properly.

--- Player must be detected. By default this is False. If this is set to True, it means the NPC will give their Hello only if they see our character. Oddly, I have found this quest works best while it stays False. If it stays False, all that matters is the Trigger Location and Forcegreet Distance. They don't have to physically see our character at all.



Flags tab

-- Toggle Preferred Speed on, and change this to Walk, Fast Walk, Jog, or Run.

-- It helps to toggle everything else off: all the "Fallout" stuff EXCEPT for Hellos to Player. Make sure Hellos to Player stays toggled, since we'll need the Hello written before to trigger the ForceGreet package.

-- Must Complete can also be tried, but only if the package seems not to be working.


Conditions tab
-- Set these as per whatever conditions are required. I am putting GetStage aaaForceGreetQuest < 1.00.


18). Click OK, closing the Package window. If OK cannot be seen, click on the package's ID name, and press ENTER or RETURN on the keyboard.

19). Open up the NPC from the Object or Render windows. Now we can either drag the new package into his or her AI Package window, or right-click > Add the package in there.

Go into the game and make sure everything works.


Final notes: It is also possible to use the Quest window's Quest Alias tab, add the NPC as Unique Actor, and attach the package into the lower right window. Bethesda does it this way, rather than attaching the package to the NPC itself. I got this to work ONCE, but have been unsuccessful at seeing it happen again. mad.gif The reason we might want the package to work this way is it's a little smoother, and there is less lag between the NPC walking toward us, and finally greeting.

Below is a script which also promises to make forcegreets happen, although I have not tried it yet.

Quest Property YourQuest Auto
Actor Property NPC Auto

Event OnTriggerEnter(ObjectReference AkActivator)

If(game.getPlayer()==AkActivator && YourQuest.GetStage() == 40)
YourQuest.SetStage(50)
NPC.EvaluatePackage()
Endif
EndEvent
Lena Wolf
I thought this thread was for Oblivion? wink.gif Never mind. I've been fiddling with animations lately, and have written up here how to define your own animations. Perhaps it can be useful to others. This is for Oblivion.
Acadian
QUOTE(Lena Wolf @ Jan 25 2022, 06:57 AM) *
I thought this thread was for Oblivion? wink.gif ...

Perhaps I can help here. Renee started this thread in 2018. At that time, our mods area of the forum was just all clumped together without specific sections for different games. That manner of organization was okay back when Chorrol was 'all about Oblivion', but in 2019 we reorganized the mods section of the forum into what you see today. Since there is really no specific home for threads that include more than one game, this one has just stayed with the Oblivion mods threads. I'm not sure it would be worth the effort for Renee and I to break this thread into different threads to fit the newer forum categories. Or whether it is worth it to create a new forum subcategory for only this one thread. I'm open to either option though if Renee would like. smile.gif
Lena Wolf
Well, there are of course a lot of similarities between Oblivion and Skyrim, but there are also distinct differences. I am not exactly sure what's best - to split things up or to keep things together. Not considering the work it to split it up, that is! Which would be quite a lot, I think.
Renee
Lena has a point. Maybe this thread can be moved to Mod Projects, which is not game-specific. I just didn't want to bug Acadian (again).

I do not want to split these tutorials up. Anyway let me know if that's ok Acadian!

Ow, and "boobras" goods and stores.
Acadian
Okay, the mod projects forum is simply a collection of subforums on retired projects. So I created a new section in the mods forum area for discussion of modding in general or that applies to multiple games and moved this thread there. I think this will help clarify things. Thanks to Lena's fresher eyes for pointing out the reasonable conflict. Thanks also to Renee for allowing me the flexibility to move her thread to a new home.
Renee
Thanks, paladin!
Renee
How to use the PC's face for an NPC. Game: TES V: Skyrim

1). Start Skyrim and either start a new game, or load a game.

2). If the game is being loaded (rather than started as New), open the console (press tilde key) and enter the showracemenu.

3). Create the appearance the same way you would create any other character you were going to play. Exit the character creation screen and save the game.

4) Open the console (tilde key) and type 'SPF' followed by the name of your character, but without spaces. Since my character is named Maya Purse, I just typed SPF MayaPurse. Exit the console, close the game.

Have a look into the main Skyrim folder. The character just made should be in this folder, with an extension of .npc. Yes, I am seeing MayaPurseFace.npc in this folder.

5). Open the Creation Kit and create a new NPC, or find an NPC whose face you wish to change. In the Traits tab, set the race and gender the same as the Player Character just made. So if the PC is a Nord Male, the NPC must also be male, and Nord.

6). Pick a voice from the VoicesFollowerNeutral formlist.

7). Click the Character Gen Parts tab, push the Import button. This button is on the upper-right side. The Skyrim folder should open, but sometimes it takes a few seconds to do so.

8). Find the .NPC file, double left-click on it. Voila.

Make any other changes necessary. If the NPC is going to be made into a follower, here is my link for that.
Renee
How to add a bounty to the Player via script. Game: TES V: Skyrim

This is how to modify the CrimeGold variable via a script, adding or removing a bounty from our character's head. In this case, I'll be raising CrimeGold during a quest stage, by adding a simple script. Sure, we can open the console once we're in the game, click on our character, and type Player.SetCrimeGold X or Player.ModCrimeGold X, but here's how to do it during a quest.

And I'm only adding this to the thread because it works. goodjob.gif Not everything listed at CreationKit.com works, or is easy to understand how to add its syntax, especially for a dummy like myself.

1). I am assuming a quest is being written with stages, or will be written with stages. Go to the Quest Stages tab, and find the stage during which we want to modify a character's CrimeGold.

2). Click the Properties button. Click Add Property. When the panel pops, find Factions in the scroll-bar.

I am writing this as though I want a bounty placed upon my character's head, so...

3). In the Name slot, I am typing PlayerCrimeProperty as the property's name. Click OK, which closes the Property panel.

4). After the nifty little blue & yellow symbol shows in the Property Name window, click the Edit Value button, and find whichever hold you'd like the bounty to show. So for instance, my character is doing a quest in which she receives a bounty in Solitude, so I'm going to find CrimeFactionHaafingar in the scroll-bar.

Click OK.

5). In the Papyrus Fragment box, type the property's name, followed by SetCrimeGold, and the amount of gold desired. So in my game, I've got PlayerCrimeProperty.SetCrimeGold(100), which adds a 100 gp bounty in the hold of Haafingar.
Renee
How to add the Player or NPC into a Faction via script. Game: TES V: Skyrim

Again, I am assuming there's a quest being written in stages, and again, I am mostly adding this into this thread because it works. Essentially, I wanted to add my character into a faction, but during gameplay, and not via console.

A good way to see if this script works (especially for our character) is this. Let's say we're trying to add our character into a faction which has items we cannot pick up. We look at some items which belong to, let's say, the Blue Palace, and all we see are Steal this and Steal that.

1). Go to the quest stage which we wish the player or NPC to join. Click Properties button. This time we'll need two properties to make this work.

2). Click Add Property button. In the Type scroll-bar find Actor.

3). Choose a name. If PlayerRef is chosen, this will automatically fill (Auto Fill) as the property's name during step 4 below. But for anyone who wants a customized name, y'all can choose your own name, such as PlayerProperty. Copy-paste that name to a Notepad or Wordpad page (or just remember it). Click OK.

4). If PlayerRef was chosen this will auto-fill. Otherwise, click Edit Value. Find PlayerRef in the Reference scroll-bar.

If we want to affect a particular NPC, choose whichever cell the NPC is in and find the NPC in the Reference scroll-bar. Note that only referenced NPCs will work, so if the NPC hasn't got a Reference ID, go ahead and add one. This Reference ID can become the property's name, which will auto-fill, just like PlayerRef did during step 4.

5). Click OK, closing the Properties for Script panel.

6). And now for the second property. Click Properties > Add Property, and find Faction in the scroll-bar. For my character, this is SolitudeBluePalaceFaction. Give the Faction a Property Name. I am choosing SolitudeBluePalaceFaction, just because this will simply auto-fill. Click OK.

7). If you've chosen a name which doesn't auto-fill, highlight the property just made, and find whichever faction in the scroll-bar. Click OK, closing the Properties panel, and click OK twice more, closing the Quest windows. Reopen the quest.

8). In the Papyrus Fragment box, type CharacterPropertyName.SetFactionRank(FactionPropertyName, 1), with 'CharacterPropertyName' whatever was chosen during step3. Since I am adding my own character into the Blue Palace Faction and used PlayerRef for the property name, I'm typing PlayerRef.SetFactionRank(SolitudeBluePalaceFaction, 1)

Note that final number "1". This is what the Creation Kit calls AIRank, and AIRank is a number which can vary from -127 to 128. In most cases, we're simply going to be using -1, 0, or 1, which removes or adds the PC or NPC to that faction.

9). Go back in the game. If the PlayerRef was just added to a faction, when the quest gets to that particular stage, try going back to wherever those forbidden items were. If the game said we can only Steal these items, now we should be able to pick them up.

For NPCs, the main way to test if a person has been added or removed to the faction is to click on them with the console, and type GetFactionRank "Faction ID", and the ID will be needed in the form of whichever 8 character ID number has been assigned to that faction.
Renee
How to fix "failed to load snowflake: Meshes\BM_Snow.01.nif" error.

Game: TES III: Morrowind

If Morrowind crashes on startup and the 'snowflake' message shows on your desktop, here's what I did to fix. This assumes Morrowind, Tribunal, and Bloodmoon have already been installed, and may have previously worked.

Some of these words are not mine. I copy/pasted from the Steam website. But I don't use the Steam version of MW, I have the disc version. There are instructions for both versions below.

For steam users
1). MAKE SURE your Steamapps folder is NOT in Program Files folder. Create a custom folder outside of Program Files and install the game there.

2). Once done, install Morrowind and run the launcher, close it. Verify your game integrity game cache


For CD GOTY users
1). Open the CD and RUN the AUTORUN.EXE AS ADMINISTRATOR if you have to. Install the files OUTSIDE PROGRAM FILES one by one: first Morrowind then Tribunal then Bloodmoon. Due to an unexpected failure in Windows Vista or later, some files will not be copied for some reason. You have to copy them manually.

Note: the guy at Steam said we also have to install the Construction Set separately, after installing Morrowind, but I did not need to do this. My CS was automatically installed from the MW disc. But I have the Anthology set, not GOTY. Maybe there's a difference.

2). Right-click on Morrowind (as it appears in the CD drive). Right-click Data Files folder and choose copy (I have Windows 8, I had to click Expand to see these files).

(2024 note: I did not see this folder when I reinstalled the game onto a brand new hard drive, Windows 10 this time, not that there should be a diff).

3). Paste the copied Data Files folder into the Morrowind installation folder. Overwrite? Yes. Remove the Morrowind installation disc.

4). Now follow the same steps for the Tribunal and Bloodmoon discs, starting with Tribunal. Right-click Data Files folder and choose copy. Paste these into the main Morrowind installation folder and paste there. Overwrite anything.

5). Follow the same process for the Bloodmoon disc.

Personally, my game was loading up fine by now. But here are some additional steps for those who might still be having probs.


1). Go into the main MW folder and open the Morrowind.ini (it's a Notepad file).

2). Find [Archives] and make sure it looks like this:

[Archives]
Archive 0=Morrowind.bsa
Archive 1=Tribunal.bsa
Archive 2=Bloodmoon.bsa

(note, my Morrowind.ini did not have an [Archives] section, but I found the three pertinent lines of text at the very bottom of the page under [Game Files]

3). If those three lines (nor an Archives or Game File section) do not exist on the .ini just copy/paste them in.


4). SAVE the ini. Congratulations, You are done, enjoy your game!

TROUBLESHOOTING: If the game blackscreens-on-start it's probably because its resolution does not match your screen, because vanilla MW has a limited number of resolutions it uses. My screen is 1360x768 for instance, which does not match any of the defaults MW is asking for. Try opening the Morrowind Launcher first, go into Options, then put the game into Windowed mode rather than Full Screen.

Later, MGE can be used to provide additional resolutions, and if you already have MGE installed ... unsure.gif
Renee
Installing Morrowind from Scratch

Recently I had some problems with Morrowind, and had to install from scratch, all the way back to the discs. At first I tried to circumvent this process, which (long story short) did not work. Here's the story.

I happen to have a backup folder with all the vanilla files intact, so I copy-pasted this, but the same problems persisted. So with no other choice, I decided to go all the way back to the beginning. Started all over, installing from the Anthology discs. But as I did so, I ran into a slew of problems. For some reason the buttons on my Xbox controller were not working properly. Or rather, they weren't registering properly. I'd go to jump, and nothing happened. Ready weapon? Same thing, unless I pressed the button over and over. Finally, the Mod Config menu was missing.

But I was also able to fix all of this, and here's how.

Firstly, do NOT get rid of your old Morrowind folder. Keep this around, at least for a while, even if you think there's nothing useful in there.

--============================================

1a). Rename the old Morrowind folder. For instance, I changed my folder's name from Modded Morrowind to "aModded Morrowind". This is important. If the folder is not renamed, later on when we're trying to reinstall the game it'll keep trying to uninstall from the old folder first. It's doing this so it can reinstall into this folder, which I already know will cause probs. This is what I described toward the end of the paragraph above.

1b). Make a new folder, outside of Program Files (x86). Name it whatever you want. I named this folder Modded Morrowind.

And this is why it's important to keep the old folder, at least for now. Sometimes it's useful to see how folder paths were structured, especially when comparing the old folder to the new one. It's also good to see what's stored in there, for whatever reason. Basically, that old folder becomes a point of reference.


2). Right-click > Install Morrowind from the disc. Follow all the prompts listed by the install wizard as usual. Install the game into your new folder.

Note that my copy of Morrowind is from the Anthology disc set, which included a separate disc for the Construction Set. We won't need to install this disc; the regular Morrowind disc already installs this for us, assuming you've also got the Anthology set. I think this separate CS disc is for those who wish to install only the Construction Set on some other computer.

3a). Remove the Morrowind disc and insert the Tribunal disc. Install, following all prompts. Do the same for the Bloodmoon disc, and don't forget to remove this disc and put the regular Morrowind disc into the tray before trying to start the game!

3b). Cut/paste the Saves folder from the old Morrowind folder to the new one. This is for those gamers who wish to continue a game which is already extant, of course.

>> HOWEVER, if this save included any bad stuff (mods which caused probs in the past, for instance) maybe it's better not to use it. In my case I had a brand-new character, whose game only included Tribunal and Bloodmoon so far. I hadn't added anything else yet, since I was trying to keep her game "pure" for the time being.

That's the vanilla game. At this point, I booted up the save I made from before and tried moving my gal around and stuff, but the same problems listed above were still there. Animations were jerky, especially if I tried to rotate the camera. Several buttons were still not working, unless I tapped them repeatedly.

I was pretty pissed off of course, even the vanilla game is broken??? But being stubborn, I decided to forge ahead with more installs anyway.


Next comes what I like to call the "Big Three" utilities. These are tools which are necessary for a lot of mods, and I installed each one from their original archive files (rather than copy-pasting from the old Morrowind folder).

4). I have Nexus Mod Manager (NMM) for Morrowind, because it's light and easy to use. Some folks use Wrye Mash, which is more comprehensive for those who have larger lists of mods, especially if they're beginning to conflict one another. Some folks won't need a manager at all, usually those with barely any additions. I prefer to have one though. Since I only have maybe 20 plug-ins plus a few random non-.esp additions, all I need is NMM.

NMM can be installed anywhere, it's one of those programs which automatically finds whatever games you've got. I prefer to throw its files straight into my Modded Morrowind folder, for convenience. Made a shortcut to desktop, as well.

5). Next comes Morrowind Code Patch 2.4, and again, I installed this straight into my Morrowind folder, and then made its executable file to a desktop shortcut. MCP fixes a lot of bugs and also includes a LOT of toggles we can click on or off. A lot of mods depend on MCP for its script extender functions. But it's all those dozens of toggles which can be really fun, not just for functionality, but also for roleplaying options.

For instance, for some characters who aren't thieves, I like going onto MCP's Game Mechanics page, toggling Hidden Traps and Hidden Locks on. This adds immersion. Now, my non-thief characters won't automatically know if some door is locked, or if there's a trap on that chest.

> Make sure to press Apply Chosen Patches at the bottom of the MCP page when done toggling stuff.

6). The last of the Big Three is MGE XE, Morrowind Graphics Extender XE. Again, I put this into the Morrowind folder, and sent a shortcut to desktop. This improves graphics in all kinds of ways. We can change resolution for instance, beyond the limited choices the vanilla game gives us. We can use the FPS Limiter to curtail the engine from throwing massive framerates around. I've got this set at 60, which improves overall performance since my Nvida isn't wasting frames.

I also like using its Menu UI Scaling feature. Since my TV is roughly 5 or 6 feet from where I sit while gaming, I jacked this from 1.00 to 1.55. Now I can read the game's menus without my glasses! 👓 Keep in mind that making menus larger can cause other problems. Some stuff can get pushed offscreen for instance, such as the confirmation we need tdo click for Starsigns when rolling a new character.

7). Actually, here's another utility, although not every mod uses it: Morrowind Script Extender. Copy/paste its files into the main Morrowind folder. Activate MWSE-Update.exe while it is in this folder. This ensures the Configuration menu and all sorts of other functions / modifications shall work.


---- By now I tried starting up my game again and got the "snowflake" error message, which is listed in the tutorial above this one. If you aren't seeing this error skip to step 10.

To fix this I removed the MW disc, inserted Tribunal, and copy/pasted all the files on this disc into my Modded Morrowind folder. Did the same thing with the Bloodmoon disc.

2024 Edit: Also, when reinstaling Morrowind onto a brand-new hard drive (my old one went kaput) I got a series of error messages later when trying to run Morrowind, or either of its main auxiliary programs: MCP and MGE. An example is "The code execution cannot proceed because MSVCR100.dll was not found. Reinstalling the program MAY fix this problem."

No. Do not bother doing a full reinstall. nono.gif In general, some info is just false.

In general, it's a better idea to do some research. I usually type the actual error message into Google or Bing, or some other search engine, word for word. MOST of the time solutions can be found. At Reddit, or some official Microsoft site, or wherever. Reddit came to the rescue for me in this case.

8). Remove Bloodmoon and put Morrowind back in the tray. I went back into the game, and voila... everything was working as it should. smile.gif Why were the animations jerky? I don't know. Why were the buttons I assigned for Jump, Ready Weapon, Ready Magic, Next Weapon, Next Magic, and Use not working instantly? Not a clue. Why did I not have a Mod Config menu? You got me, pretty sure getting MCP added from its original archive fixed this, though.

So that's it: the vanilla game + its two expansions + the three main utility tools and the script extender.

9). I found it best to also install most mods from scratch, straight from their archives. I did this rather than copy/pasting my old Data Files folder. This way, I knew everything that's going into my game, and was able to take notes on what goes where, and what does what.

This is also a great chance to eliminate any dead weight. There's usually some stuff which got added at some point in the past which is no longer used. Did not work, or has stopped working. During the passionate moments of gaming I tend to forget about these sort of add-ins.


10). Finally, there might be a few things in the old Morrowind folder which can't be taken out of an archive. Here's a few examples: My Screenshots folder, Readmes folder (which I've organized diligently so everything is in its proper place, rather than scattered all over the MW folder), and also Morrowind Additions.esp, my homemade overhaul mod with hundreds of changes. It's a good idea to keep the old folder around, at least for awhile, deleting whatever's not useful anymore while cut-pasting all the stuff that is.

🍷👑
macole
Those Intervention scrolls sure come in handy.

I was interested in you BSA archive issue. Not only do you have to make sure the Archive and the three BSAs are added to the ini but any mod that uses BSA file will have to be manually added to the ini [Archives] list. Oblivion and Skyrim are a bit better in that reguard although they do have their own BSA quirks.
Renee
Oops, I screwed up. whistling.gif Was cleaning the next draft of Joan's story and you weren't supposed to see that!

------------------------------------


Each exterior cell is 4096 units by 4096 units or 192 feet by 192 feet or 58.5 meters by 58.5 meters.

There are approximately 86 cells, counting from a bit below Leyawiin all the way up to the invisible border north of Cloud Ruler Temple.

192 x 86 = 16,512 feet. 5,280 feet = 1 mile. 3 miles = 15,840. So, north to south, the game world of Cyrodiil is slightly larger than three miles.

------------------------------------------------

The language of papyrus can be broken down into a handful of concepts: Objects, Functions, Events, Variables and Properties. The Script File Structure page provides information and examples of these concepts.

Objects: Nouns. Books, Actors, Quests, Weapons, Potions. These are things in their purest forms.

Functions: Verbs. Actions. SetStage(), Kill(), SetValue()

Events: Adverbs. When? etc. OnDeath, OnInIt, OnItemAdded. Basically "When" does X happen?

Values: Adjectives. How much? How many?

Variables: Adjectives. Whatever value is the answer or result of GetStage, GetActorValue, ModValue, and so on. So not the SetStage itself but the (5) which follows it.

Properties: Nouns, but defined in such a way that the game engine can communicate with. Because scripts are separate from data files, properties are used to define these objects (these nouns) so Papyrus can use them for the game engine.

An example: we won't kill Chamany when the time comes, we will assign a property to him, and use that property instead, even if the Property itself is called "Chamany".

Renee
Get a Job! Game: TES V: Skyrim

I 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. rolleyes.gif 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. laugh.gif

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. wacko.gif 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 > Quest
2). 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! cake.gif 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. laugh.gif 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 > Global
All 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 > Quest
Select 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. verysad.gif


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. mad.gif

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! blink.gif

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. tongue.gif 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. tongue.gif


15a). Object Window > Miscellaneous > Global
Make 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
Traveling with an NPC. Game: TES V: Skyrim

Here'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. viking.gif

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 > Class
1a). 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 > Faction
2a). 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. emot-ninja1.gif All the toggles are self-explanatory.

2d). Click OK, unless more features are desired (training, merchant ability, etc.)


Object window > Actors > Actor
3a). 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 > LeveledItem
4a). 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 > Outfit
5a). 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. laugh.gif

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 Windows
6a). 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 > Global
7a). 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 > Package
8a). 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. rolleyes.gif

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 > Quest
9a). 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 > Package
10a). 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. mad.gif

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 > Quest
11a). 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 > Actor
12a). 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 > Quest
13a). 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
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 > Quest
1a). 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 > Quest
2a). 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.00


2b). 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.00


Note: 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 > Global
3a). 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 > Package
4a). 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.00


5d). 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 > Actor
7a). 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 > Quest
8a). 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.00


Copy 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.00


Script 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.00


Script 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.00


Script 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.00


Conditions 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.00


Again, 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 > Actor
10a). 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)

EndIf



10g). 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

EndFunction


10j). 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
Traveling with an NPC, Additional NPCs. Game: TES V: Skyrim

This lesson goes with the two posts above. I have found that traveling with a second NPC (both of them warrior-types) is also possible. However, it is best if one of these people is regarded as the 'primary', any additional people are more secondary. Best to organize it this way, as we'll see.

I'm not sure if there's a limit to building a party this way. The more people we add, the more management they'll need: keeping them from straying too far ahead or behind, occasional disappearing acts, and so on.

Disappearing acts? Sounds aggravating! Why bother, Renee?

Hey, I find this method of gaming to be really fun, most of the time. Something different from the norm. I enjoy the idea that my character has a boss who she travels along with, not the other way around. tongue.gif NPCs also have different directions of travel, oftentimes they lead me into parts of the gameworld I never seen before.

Object Window > Actors > Actor
1a). Make a second NPC. This time I made a woman warrior, so now my elf has a man and a woman to travel with.

ID: aaaWarrior02
Name: Myrmidon

Toggle ON: Respawn.

1b). Click OK and reopen. Find aaaWarriorTemplate in the ActorBase scroll-bar. Here's what I got toggled on:

Use Stats
Use Factions
Use AI Data
Use Def Pack List
Use Attack Data
Use Inventory

"Use Traits", "Use AI Data", and "Use Base Data" were all toggled on for the first NPC, but for reasons I'll explain they don't need to be on for the second one.

1c).
Traits tab: For instance, I've got Traits untoggled because the template only includes a Male Imperial. Otherwise, the most important choice is Voice Type. Again here's the list supported by the vanilla game.

MaleEvenTonedAccented
FemaleSultry
MaleDrunk
FemaleDarkElf
MaleDarkElf
MaleNord
FemaleCommander
MaleBrute
MaleArgonian
MaleKhajiit
FemaleOrc
FemaleCondescending
MaleEvenToned
FemaleEvenToned
MaleYoungEager
FemaleYoungEager

1d). First open tab not covered by the template is the AI Packages tab. It's because I made a ForceGreet for the second warrior so she too can approach my healer and say "Looks like you've got an adventuring party, may I join?" - I also made a second AI which the first one doesn't have. We'll get to that in a few. Otherwise, she's got all the same AI as the first NPC.

And since she's also got the same Outfit, she'll also show up wearing random armor when first encountered.

1e). Click OK and save. Reopen.

1f). Press the Add button and add the Death script used for the first NPC. Press OK again.

However, since there are two NPCs traveling together I'm gonna need to change a few things. If the original guy got pwned, a timer would begin which would eventually 'clean up' the body from wherever he fell, and he'd respawn back in Bannered Mare. All the globals got cleared to zero. However this won't work if there's two people. If one of them dies and the script remains the same, we can't be traveling along with the second NPC and then all the sudden *poof*, he or she gets teleported into Whiterun! biggrin.gif

1g). Find a cell to drop the second traveler into, give him or her a Reference ID. Click the Persist Location tab and use the scroll-bar to find the cell he/she's in.

Go into the Object Window > WorldObjects > Static and drop an XMarkerHeading into the same cell. Reference that. I'm calling it aaaWarrior02XMarkerHeading.


Object Window > Character > Quest
2a). Open the Death Timer quest and click on the Scripts tab.

2b). New properties will be needed for the second NPC (Type: Actor), the reference to that actor (Type: ObjectReference), and the second XMarkerHeading (ObjectReference) which sends the NPC into some other cell. So... my first NPC gets teleported back to Bannered Mare while the second would get sent back to where we picked her up: Nightgate Inn. 🦉

2c). Click OK and reopen the death timer quest. Right-click > Edit Source. Note that I'm keeping the entire script intact, but making some changes, going mad with semicolons so those additional globals don't read.

Scriptname aaaDeathTimerScript extends Quest

Actor Property aaaWarrior01 Auto
Actor Property aaaWarrior02 Auto

Float Property DelayHours Auto

GlobalVariable Property aaaAccompanyGlobal Auto
GlobalVariable Property aaaDeathGlobal Auto
GlobalVariable Property aaaTravelNightgateInn Auto
GlobalVariable Property aaaTravelRiverwood Auto
GlobalVariable Property aaaWaitGlobal Auto

ObjectReference Property aaaWarrior01Ref Auto
ObjectReference Property aaaWarrior02Ref Auto
ObjectReference Property aaaWarrior01XMarkerHeading Auto
ObjectReference Property aaaWarrior02XMarkerHeading Auto

Function Oninit()
self.RegisterForSingleUpdateGameTime(DelayHours)

EndFunction

Function OnSingleUpdateGameTime()

If aaaDeathGlobal.GetValue() == 1
If aaaWarrior01.IsDead() == 1 && aaaWarrior02.IsDead() != 1
;aaaAccompanyGlobal.SetValue(0)
aaaDeathGlobal.SetValue(0) ; Leave this without a semicolon
;aaaTravelNightgateInn.SetValue(0)
;aaaTravelRiverwood.SetValue(0)
;aaaWaitGlobal.SetValue(0)

aaaWarrior01Ref.MoveTo(aaaWarrior01XMarkerHeading)

UnregisterForUpdateGameTime()

EndIf
EndIf

If aaaDeathGlobal.GetValue() == 1
If aaaWarrior02.IsDead() == 1 && aaaWarrior01.IsDead() != 1
;aaaAccompanyGlobal.SetValue(0)
aaaDeathGlobal.SetValue(0)
;aaaTravelNightgateInn.SetValue(0)
;aaaTravelRiverwood.SetValue(0)
;aaaWaitGlobal.SetValue(0)

aaaWarrior02Ref.MoveTo(aaaWarrior02XMarkerHeading)

UnregisterForUpdateGameTime()

EndIf
EndIf

EndFunction


See that? Most of those globals will no longer trigger if the timer counts down, IF one of the travellers dies; only the DeathGlobal remains. Now... If BOTH of them get killed the script is going to need to reflect this as well. Add a third block (as seen below) below the two blocks from above.


aaaDeathGlobal.GetValue() == 1
If aaaWarrior01.IsDead() == 1 && aaaWarrior02.IsDead() == 1
aaaAccompanyGlobal.SetValue(0)
aaaDeathGlobal.SetValue(0)
aaaTravelNightgateInn.SetValue(0)
aaaTravelRiverwood.SetValue(0)
aaaWaitGlobal.SetValue(0)

aaaWarrior01Ref.MoveTo(aaaWarrior01XMarkerHeading)
aaaWarrior02Ref.MoveTo(aaaWarrior02XMarkerHeading)

UnregisterForUpdateGameTime()

EndIf
EndIf

EndFunction


In this scenario both NPCs get killed during the same battle, or during a battle which occurs before the 240-hour (10 day) timer counts down, both of them will be teleported to wherever. In this case, all the globals are getting zeed-out to zero, so the entire quest can start anew. At this writing this portion of the script is untested, since I've PC Level Mult'd both travelers multiple levels above my healer's Level. viking.gif

2d). OPTIONAL: Make a message as per this post's instructions which indicates when the timer's done counting. I only made a message for the final block, during which both NPCs were pwned, to indicate when both have respawned.


Object Window > Character > Quest
3a). Open the quest which handles dialog for traveling, written up during the "Additional Locations" lesson up above. For me this is aaaRandomTravelQuest.

The aim now is to go through all the dialog which is going to need to reference the second NPC.

First, there's the branch and topics which deal with locational stuff. We speak to the NPC (either one, since both of them are in the TravellerFaction) and during this phase he or she explains where they'd like to go next.

> To start, there's the initial topic which occurs after the timer script counts down. We return to the NPC after x amount of hours, who welcomes us back, and says he/she is "ready to go somewhere else". Nothing additional is needed here.

>> Next topic is the Locational one. Riverwood, Nightgate Inn, or wherever else. In my game, I've added Windhelm's Candlehearth Hall and Ivarstead's Vilemyr Inn by now. Anyway, nothing additional is needed here. It's the NEXT topic (the one where they choose where to go next) where some changes occur. There should already be a slew of script fragments and properties associated with these Infos. 💽

3b). Make a property for the second warrior, with the Type being Actor. So for me this is aaaWarrior02. Click OK (closing the Topic Info panel) and reopen. This'll need to get done for any topic where an NPC states which location they'd like to go next.

3c). Here are the relevant scripts which get added.

Begin
aaaWarrior02.SetPlayerTeamMate()

End
aaaWarrior02.EvaluatePackage()


...That's how I've got them set up, anyway. All the TeamMate stuff is in the Begin box, all the globals and package evaluations in the End box.

3d). Repeat 3b and 3c for any "Yes" locational topics.

>>> The Wait topic, Follow topic, Open Inventory, and Continue topics can get skipped for now. Globals handle everything, and since both NPCs have the same Faction, and the same directional AI, they'll already do all these things when we tell 'em to. We'll add to these topic/infos later.

3e). Open the "Arrive" topic. This occurs once the NPCs reach their destination. Make a property for the second warrior with the Type being Actor. So for me (again) this is aaaWarrior02. Click OK (closing the Topic Info panel) and reopen.


3f). Here is the relevant script which gets added.

Begin
aaaWarrior02.SetPlayerTeamMate(FALSE)



Wow, am I done typing? Looks to be so. smile.gif Whoops no I'm not.

So the original Ai added to the original NPC includes several travel packages such as aaaTravelNightgatePackage and aaaTravelRiverwoodPackage. Both of these are set so that the Player needs to be within 512 units (about 24 feet, or 7 meters) to the original NPC for him to keep moving. If we're too far away from him, he'll stop moving until we get closer. I set it up this way because my character is a healer. She's always close enough to him so she can conveniently heal the guy at a moment's notice, and I loathe the idea of losing him if he gets too far away.

The decision needs to get made, though. Should I also reference the second person with a GetDistance? This is possible. However, problem is if BOTH NPCs are being referenced, this means my healer will need to be near both of them at all times. If one of them strays too far ahead or behind, the entire party comes to a halt.

One solution is to add a second GetDistance with an OR qualifier to each of the travel AIs.

PL GetDistance Reference: 'aaaWarrior01Ref' <= 512.00 OR
PL GetDistance Reference: 'aaaWarrior02Ref' <= 512.00 AND


The advantage here is if the primary NPC gets pwned, the secondary NPC can be traveled near as well. Again though, there's a problem. While traveling with this party I began to notice one of the NPCs still has the possibility of straying too far ahead or behind.

Let's step that dilemma aside for a moment, while another gets fixed. The next task is AI. By now, the NPC Template and the second NPC will both have quite a stack of AI in their AI Packages window, and this is okay if all you're doing is adding two locations. But as I write this (3/2/2024) I'm up to 8. I've also added some individual AI for the extra follower I'm adding now, and a third follower as well, who's got his own Forcegreet. That stack of AI keeps growing and growing. Here is a way to tidy it up.


Object Window > Miscellaneous > FormList
4a). Right-click > New and start a new formlist. I'm calling it aaaWarriorPackageList. This list is going to include ALL the AI Packages. Don't click OK yet.

4b). Drag any AI packages written so far from the Object window into the FormList window; I believe this includes the following: aaaTravelDragonreachPackage, aaaNightgateInnPackage, aaaTravelRiverwoodPackage, aaaWaitPackage, and aaaFollowPackage. Also drag the DefaultSandboxCurrentLocation1024, and the Forcegreet added to the second traveller (if one was added to her or him).

4c). Arrange these AI just as they'd be arranged in the AI Packages window, making sure the DefaultSandbox goes at the very bottom.

4d). If a Forcegreet was added to the second NPC, go back to that package and add a GetIsID condition to that package, with the NPC's name (not the template) as the ID.

4e). Return to the NPC template > AI Packages window. Now remove all AI from this window. Use the Default Package List scroll-bar to add AI instead. Click OK.

4f). Return to the secondary NPC. And NOW we can toggle Use AI Packages on for him or her as well. This will automatically erase any AI in their window.


And now, to solve the dilemma described above in step 3f. If the secondary follower keeps straying back and forth, here's how to fix that. Another cool thing is, if both NPCs get lost from us, one of them will at least come looking for us.

Object Window > Character > Package
5a). Right-click > New

ID: aaaAlternateFollowerPackage

5b). Click on the Package tab. Change Package Template to Follow

Target to Follow: SingleRef 'PlayerRef' Y
Min Radius: Float 256.000
Max Radius: Float 2048.000

Flags tab
Preferred Speed: Jog (or Run.. whatever). All other flags optional.

Conditions tab
S GetIsID Actor: aaaWarrior02 == 1.00 AND
R GetDead, Run on: aaaWarrior01Ref != 1.00 AND
S GetGlobalValue Global: 'aaaAccompanyGlobal' == 1.00 AND
S GetGlobalValue Global: 'aaaWaitGlobal' != 1.00 AND
PL Player GetDistance aaaWarrior02Ref => 2048


The advantage of having Preferred Speed on Jog or Run is secondary followers will move a bit faster, making shuffling sounds with their feet, as they follow us. This way, we avoid having to constantly look back to make sure they're still behind.

5c). Click OK (if you can see it) or highlight the cursor into the ID slot and press RETURN or ENTER on the keyboard.

Make sure to add this AI into the FormList added to the NPC Template. The GetIsID will make sure the original traveller will NOT use this AI.

And there we go. If the secondary NPC falls too far behind the primary NPC, this causes her to start following the Player instead. Catch is, The first warrior/traveller must be alive for this to happen.

That package alone works most of the time, but I also back it up with properties and a script, as follows.

5d). With the secondary NPC's Actor panel still open, start a new script. Make properties for the new package (aaaAlternateFollowerPackage), the Actor him or herself (aaaWarrior02), an ObjectReference of the actor (aaaWarrior02Ref) and at least one of the GlobalVariables (aaaAccompanyGlobal).


Scriptname aaaAlternateFollowerScript extends ObjectReference

Actor Property aaaWarrior02 Auto
GlobalVariable Property aaaAccompanyGlobal Auto
Package Property aaaAlternateFollowerPackage Auto
ObjectReference Property aaaWarrior02Ref Auto

Event OnPackageStart(Package akaaaAlternateFollowerPackage)

If aaaAccompanyGlobal.GetValue() == 1 && Game.GetPlayer().GetDistance(aaaWarrior02Ref) >= 2050
aaaWarrior02Ref.EvaluatePackage()
Debug.Trace("New package starts running")


EndIf
EndEvent


The Alternate Follow package works if the Player gets too far away from the second traveler, and this is backed up by the NPC's script above.

6). Final step (this time I mean it). Reopen the quest. Go into the "Open Inventory" topic and make an Actor property for the second NPC.

aaaWarrior02.OpenInventory() goes into either box if stuff is to be shared between both NPCs. akSpeaker.OpenInventory() can also be used if only that NPC is to be traded with. The advantage of this second script is properties aren't needed.

Okay NOW we're done.

🍷🍷

--------------------------------------

TROUBLESHOOTING

1). Sometimes an NPC won't respond to anything: won't follow, won't wait, might begin a journey, only to disappear later on if we enter/exit an unrelated cell, etc. One time, I was able to trace this problem to the fact I had changed a warrior's Reference ID from aaaWarrior02Ref to aaaShieldmaidenRef. I liked the "Shieldmaiden" name, thought it was more elegant. But later when making properties for this ref I kept having to fill the properties manually, even though I was able to find the Shieldmaiden Reference in her proper cell.

If something like this happens (especially if an NPC's info gets baked into the latest saves) there is no cure. Best to start all over with that one person, deleting any properties, scripts associated with that NPC.
Renee
Dialog Speech Checks Game: TES V: Skyrim

This tutorial comes from this Creation Kit page, main difference is I'm going to make this step by step, and add a couple things as well.

There are several ways Speech works in Skyrim. First, we'll discuss Persuasion. An example is from the WERJ02 quest (Thieves Guild Holdup), which has a thief walking up to us as we travel roads, and demanding money. There is a chance to Persuade the thief to leave us alone, as well as chances for Intimidation, walking away, or simply getting into a brawl. I will also include Bribery. We can't bribe the thief, but there are times when bribes can be offered. An example is when we approach the gates of Whiterun for the very first time, and a guard tells us we cannot go into town. viking.gif

PERSUASION


Object window > Character > Quests
1a). Use the Dialogue Views or Player Dialogue systems to start some dialog. ID can be whatever's unique, it's the Topic Text that's going to be important, since there needs to be something which makes it obvious which topic to click on for persuasion. Here is an example.

Do I look like I am rich? (Persuade)

Note that (Persuade) must be physically typed (and with parentheses) into the Topic Text slot, as seen next to the 'Do I look like I am rich?' topic.

1b). Two infos are needed under this topic, okay? First info, the NPC is persuaded by our character's loquacious Speechcraft abilities. Second info, they ... aren't.
Speech works: You win. I'll leave you be.. for now.

Speech doesn't work: Prepare for your room... erm... doom!!!

Make sure the Prompt slot is not used; both infos should share the same Topic Text.

1c). Goodbye is toggled on for both infos. Basically, the NPC will leave our toon alone if he or she is persuaded, or try to fight if not, with no further dialog.

1d). Use whatever conditions are appropriate, but make sure GetActorValue Speechcraft is used for the successful Info. Here is the entire condition.

PL GetActorValue Speechcraft >= X

The Player is used as a reference in the Run On scroll-bar. And where the X is there are two options. A physical number can be used to define how difficult the condition should be, but what's even easier to use are globals.

1e) Toggle Use Global on and find the Speech section in the Value scroll-bar. So if we want a really easy persuasion attempt, go for PL GetActorValue Speechcraft >= SpeechVeryEasy

1f). Type a semicolon script ;Persuasion succeeds into the Begin: Papyrus Script box. Compile that. Click OK 2x and reopen.

Again, this condition is not needed for the "fail" dialog.

2a). Add a property to the script.

Name: pFavorDialogueScript
Type: FavorDialogueScript (don't try looking for it in the scroll-bar, just type it in).

2b). Click Edit Value. There's only one value to pick which is DialogueFavorGeneric. Click OK 3x and reopen the Quest and Topic Info panels.

2c). Type ; pFavorDialogueScript.Persuade(akSpeaker) into the Begin: Papyrus box. Compile that with a semicolon first, then compile it again without the semicolon.


Now let's move on to the negative response... make sure the NPC is in the Render Window, and has been given a Reference ID. Keep in mind that this will only work for a specific NPC. Beth's random road thieves use a much more complicated system of dialogs and aliases, since they needed to write their quest dialog for a radiant-type thief who is not specific.

3a). Response Text: "You can't fool me!"

Flags: Goodbye

Papyrus script: ;Persuasion attempt fails

3b). Two properties are needed for this script: one for the Player, and one for the NPC who attacks us. I start with the NPC.

Property Name: aaaNPCName (this can be the NPC's actual base ID name.)

Type: Actor

Edit Value: Find the NPC in the Cell and Reference scroll-bars, or simply double left-click on the NPC in the Render window.

3c).
Property Name: Player (or PlayerRef).

Type: Actor

Edit Value: Choose (any) for the Cell scroll-bar and PlayerRef for the reference.

3d). The Papyrus fragment is aaaNPCName.StartCombat(Game.GetPlayer())

Note that StartCombat can also be used if our character wishes to just skip the speech stuff, and choose to fight. "I'd rather die!" is Beth's topic text for this when dealing with road thieves.


INTIMIDATION


4a). Everything is the same so far as setting up dialog: two infos are used (one positive, one negative). But make sure to put (Intimidate) at the end of the Topic Text slot.

4b). For conditions, GetIntimidateSuccess == 1.00 is used for the positive response, and this can simply be kept on Subject for the Reference.

In Bethesda's words, "[when] successful according to the algorithm used by the game engine to calculate this, which takes into account variables such as the player's level and the speaker's [NPC's] confidence value, as well as the player's speechcraft skill and some other factors", that's when this condition becomes chosen.

4c). For the Papyrus script, make a script and property as per steps 1f through 2c up above, but the script used is pFavorDialogueScript.Intimidate(akSpeaker), which goes into the Begin box.

4d). Continue through steps 3a through 3d for the failed Intimidation attempt. ph34r.gif


BRIBERY


5a). In this situation we attempt to pay those whom we're trying to influence. (<BribeCost> gold) goes at the end of the Topic Text. "Here, take my gold!" (<BribeCost> gold). "X" is a specific amount of coin, which automatically gets filled in by the game engine.

5b). This time, GetBribeSuccess == 1.00 is the needed condition.

5c). Follow steps 1f through 2c, with pFavorDialogueScript.Bribe(akSpeaker) going into the Begin script box.

For 5a, a specific amount of gold is not needed, as the favor dialogue script will calculate a levelled amount and handle its removal from the player's inventory. If a specific bribe amount is desired, its best to do this other ways without favor dialogue. GetItemCount works.
Renee
Map Marker Tutorial, Game: Fallout 3

Firstly, with some vanilla locations added by Bethesda themselves, these can sometimes be hard to find in the Render window. An example: Nuka Cola Plant. I needed to add the reference ID for its map marker into a script, yet where is the map marker?

Beth likes to sometimes put map markers UNDERNEATH the location, the building, the settlement we're trying to use. I found Nuka Cola's map marker by tapping on the entire Nuka Cola building, and then rotating the entire image until I was viewing under this building. Voila. There's the map marker, and now I can retrieve its Ref ID: NukaColaMapMarker.

The rest of this lesson shall focus on adding making map markers into the game.


1). Find the worldspace location in the Cell or Render windows.

2). In the Object window > World Objects > Static, find MapMarker, and drag it into the Render window.

Note that the marker itself is green, but it has a large yellow circle surrounding it. Walking into this circle is what causes the marker to appear on the map if we discover a new location.

3). Double left-click on the marker and give it a Reference ID. This is optional, and only needed if the marker's going to be used in scripts, like to make it appear in the map and stuff if somebody says "Let me mark that location on your map." 🌎

4). Click on the Marker Data tab. Toggle Marker Data on, and notice there's now a bunch of other toggles to press.

5). Give the marker a name, type this into the Name slot. This name is what will appear when somebody views the map's marker in-game. Very good.

6). Click on whatever sort of area the marker's going to portray, whether it's a factory or a settlement, or a cave, etc. This changes the marker's actual icon, making it easy to distinguish as what type of location is viewed on the map.

7). There are three other toggles underneath the icon panel:

Visible: The marker starts off visible right from the start of the game, even before the area's discovered or referenced in a script.

Can Travel To: If this toggle is ON it means we can immediately fast-travel there, as long as the icon appears on the map and we're in the world somewhere (not in an interior cell). Visible also needs to be toggled on for this to be an immediate option from the start of the game.

"Show All" Hidden: If this is toggled, the map marker will NOT appear if the ShowAllMapMarkers function is called for.


Normally, none of those three are toggled. So unless the location is supposed to be known to the player right away for some reason (and can also FT there) click OK.

8). Let's say the marker is going to be referenced during dialog, the classic "Let me mark that location on your map". The script necessary is ShowMap MapMarkerReferenceName

... to make it so the place can be fast-traveled to immediately, make that ShowMap MapMarkerReferenceName, 1

9). Final step. When we fast-travel to the location the map marker is not what's actually used to travel to. For this to happen, an XMarkerHeading needs to be placed somewhere. Usually right in front of the place's front door. So drag 'n' drop an XMarkerHeading into the world. Sometimes it helps to give it a Reference ID too.

10). Double left-click on the MapMarker and when the Reference panel pops up, select the Linked Ref tab. Find the XMHeading in the Reference scroll-bar. A green line should connect both markers once OK is clicked.
Renee
Repeatable Enemy Raids, Game: Fallout 3

I 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 Item
1a). 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? unsure.gif 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 > NPC
2a). 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 window
3). 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 > Quest
4a). 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 DoOnce



4d). 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 > NPC
5a). 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 Dead


6f). 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

End



7a). 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.00


Copy 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 1

Choices: 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.00


Toggle Goodbye ON. salute.gif

Result Script [End]: Set aaaGenericWastelandQuests.DoOnce to 0

7h). 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.00


The 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 1


Result Script [End]:
ShowMap SpringvaleElementaryMapMarker

7k: Compile that and click OK.

Now, make sure the NPC boss is still in the Render window.


Object window > World Objects > Static
8).: 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 > Message
9a). 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.00


Copy 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.00



Add 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.00


Toggle Goodbye on.

Result Script [Begin]:
Set aaaGenericWastelandQuests to 0
Player.RemoveItem aaaSpringvaleSchoolTicket 1
SetObjectiveDisplayed aaaGenericWastelandQuests 2 0


Result Script [End]:
Set aaaSpringvaleSchoolBossRef.Dead to 3
Player.AddItem F 500
RewardXP 10


12c). 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 DoOnce


Now 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. smile.gif
Renee
Repeatable Enemy Raids, Additional Locations. Game: Fallout 3

This time I'm going to put a boss into one of the Metro tunnels. Let's go for FriendshipMetro02. This is the tunnel which comes after the one Moira sends us into, when she's trying to get us to test her stupid mole rat repellant stick. The place is populated by ghouls, so I'm going to drop a Glowing One into one of the tunnel's restrooms.

OBJECT window > Items > Misc Item
1a). Edit the previous Metro ticket. Here is how I'm going to edit it for my game. Since the boss I'm adding is going to be a Glowing One type of ghoul, he's going to be known as "the Glower".

ID: aaaFriendshipMetroTicket
Name: Kill Glower of Friendship Tunnel 2

1b). Copy the ID name and paste it onto a Text file or Wordpad file.

1c). Click OK, saving as a New Form.


Cell View window
2). Find the location where the enemy boss will get added. Again, in my game this is FriendshipMetro02, somewhat towards the end of one of its branches, where the restrooms are.

Since I'm editing a creature this time (rather than an NPC) and I've never outlined how to set one of these up, here's the quick way. There are specific templates for ghouls, but a template is not needed. For those of you who wish to just make an NPC, and use the previous template to set him or her up quickly, have a look at steps 5b through 6a in the above tutorial.

Anyway, to make a quick ghoul, check this out.

Object window > Actors > Creature
3a). Find CFeralGhoulGlowingOne and right-click > Edit it.

ID: aaaFriendshipMetroGlowingOne

Name: Glower of Friendship Metro

No low level processing: OFF
Respawn: ON
Allow PC Dialog: ON

STATS tab
PC Level Mult: On
Level Mult: .25

AI PACKAGES tab: Remove the DefaultPatrolCasual package.


Level Mult(iplier) is set to 0.25, which means the glowing bastard levels up 1/4 as much as the Player-Character does. I tried using 1.00 but this was ridiculously tough. By default Glowing Ones are Level 11 I think.

3b). Click OK, closing the Creature panel, saving as a New Form.

3c). Drop the boss into the Render window.

3d). Give the boss a Reference ID. Copy this ID and paste it somewhere. I just typed aaaFriendshipMetroGlowingOneRef.

3e).Make sure to toggle Persistent Reference on.

This time, I'm also going to try something new, which is to toggle Initially Disabled on. Reason is, there are times when one of my guys or gals might just want to pass through this tunnel as they head on to one of the locations outside of Friendship Metro Exterior. And it would get a bit unrealistic (and also annoying) if the Glowing One is always there, even if the Friendship mission has not been chosen.

3f). Click Edit Base. Start a script like so...

Scriptname aaaFrienshipMetroGlowingOneScript

Short Dead


3g). Save that script, close the editor, click OK 2x (closing the Creature and Reference panels) and reopen them. Find the script in the Script scroll-bar, click OK, and reopen.

-------------------------------------------------------
Scriptname aaaFrienshipMetroGlowingOneScript

Short Dead

Begin OnDeath

If (aaaFriendshipMetroGlowingOneRef.dead == 1)
Set aaaFriendshipMetroGlowingOneRef.dead to 2
Set aaaGenericWastelandQuests.DoOnce to 2

EndIf

End


--------------------------------------------------

Save and close.

Object window > Actor Data > Quest
4a). Open the quest started up above, and select the Quest Objectives tab. Right-click > New into the top (Objective Index) window. There should already be two other objectives so far. Only one additional objective is needed.

Index: 3
Display Text: Pwn the boss of Friendship Metro Station #2.


4b). Go to the Topics tab. The same initial GREETING and initial topic are already set up. Click on the initial topic (aaaWastelandMissions).

4c). Right-click > Add Topic into the Choices window, and right-click > New into the Select Topic window. aaaFriendshipMetroTopic is going in my game. Click OK.

4d). Right-click > New in the left-most window. Add the new locational topic.

4e). Topic Text: Change the Topic Text to something in plain wording (Friendship Metro Tunnel #2) and click OK.

4f). Save. Reopen the Quest panel.

4g). Right-click > New into the Info window.

Response Text: Long ago before the bombs dropped, Metro tunnels were used as daily transport for the masses.
Now they're inhabited by ghouls! And in this particular tunnel, a Glowing One has been reported!
I can't emphasize how important it is to rid Glowing Ones from the Wasteland. Top priority, soldier.


Priority:

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 aaaFriendshipMetroGlowingOneRef, Dead == 0.00 AND
GetDisabled, Reference: aaaFriendshipMetroGlowingOneRef == 1.00


The Reference for GetDisabled should have the Run on slot changed from Subject to Reference, and then we can simply select the NPC in the window.

4h):Right-click > Copy All those conditions.

4i: Choices: aaaFriendshipMetroYes and aaaNo.

4j). Right-click > Add Topic into the vertical window and add whatever "yes" topic was just created. In my game: aaaFriendshipMetroYes is the one.

Topic Text: Leave this just as it is (aaaFriendshipMetroYes) since Prompt is being used for the clickable topic.

Response Text: Grreat. We'll be looking forward to hearing this glowing menace has been defeated.
Job pays 500 caps, standard contract. Here's some Rad-X, you'll probably need it.
I'll mark the nearest location on your map.

Prompt: It'll soon be "lights out" for that Glower of a ghoul.

Conditions: Paste the same conditions just copied, but remove the GetDisabled...

GetIsID aaaQuestAgent == 1.00 AND
GetScriptVariable aaaFriendshipMetroGlowingOneRef, Dead == 0.00 AND


Result Script [Begin]:
aaaFriendshipMetroGlowingOneRef.Enable
Set aaaFriendshipMetroGlowingOneRef.dead to 1
SetObjectiveDisplayed aaaGenericWastelandQuests 3 1


Result Script [End]:
Player.AddItem aaaFriendshipMetroTicket 1
Player.AddItem RadX 3
ShowMap X


Note: In my game, I'm using FriendshipHeightsMapMarkerREF for the Map Marker. Optional, for those who've already been there, or haven't been to this location, yet want to go HARDCORE!!!

4k: Compile that and click OK.

Now, make sure the NPC boss is still in the Render window.


Object window > World Objects > Static
5).: Drag an XMarkerHeading into the Render window and give it a Reference ID. I've got aaaFriendshipMetroXMarkerHeading. 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.

Object window > Miscellaneous > Message
6a). Right-click > Edit the previous message made for the previous boss.
ID: aaaFriendshipMetroBossDeathMessage (copy/paste this to the Notepad).

Title: Friendship Metro Death Message
Message Text: The Glowing One of Friendship Tunnel has been pwned!

6b). Click OK, saving as a New Form. Save from the main toolbar.


7a). Reopen the NPC's script, either from the pencil icon on the main toolbar, or from the enemy itself.

7b). Add this line somewhere between the If and EndIf statements:

SetObjectiveDisplayed aaaGenericWastelandQuests 3 0
ShowMessage aaaFriendshipMetroBossDeathMessage
SetObjectiveDisplayed aaaGenericWastelandQuests 2 1


Overall, what we've got for the boss's script goes like this...

-------------------------------------------------------
Scriptname aaaFrienshipMetroGlowingOneScript

Short Dead

Begin OnDeath

If (aaaFriendshipMetroGlowingOneRef.dead == 1)
Set aaaFriendshipMetroGlowingOneRef.dead to 2
Set aaaGenericWastelandQuests.DoOnce to 2

SetObjectiveDisplayed aaaGenericWastelandQuests 3 0
ShowMessage aaaFriendshipMetroBossDeathMessage
SetObjectiveDisplayed aaaGenericWastelandQuests 2 1

EndIf

End


--------------------------------------------------

7c). Save and close the script, and OK the NPC's panel(s) if needed.


8a). Now return to the quest. Open the new locational topic, which in my game is aaaFriendshipMetroTopic. Copy All its conditions stack. There should be three or four conditions to copy: a GetQuestVariable, GetScriptVariable, GetDead (or GetEnabled), and the GetIsID for the mission giver.

8b). Right-click > New into the Info window.

Response Text: There might be some ghouls in that tunnel, but haven't got word of any Glowing Ones roaming about.
Would you like to see the other problem locations?

Conditions: Paste these...

GetIsID aaaQuestAgent == 1.00 AND
GetQuestVariable aaaGenericWastelandQuests, DoOnce == 1.00 AND
GetScriptVarible aaaFriendshipMetroGlowingOneRef.dead == 3.00


The ScriptVariable is needed this time instead of GetDead, since there's a juggling act between whether the boss is Enabled or not, and whether he/she is dead or not. GetDisabled can get tricky to use, since the main script is going to disable the enemy in a few...

However, if the enemy did not start as Initially Disabled and GetDead was previously used, GetDead can be substituted now. Make sure to make the Comparison == 1.00 instead of != 1.00 though.


8c). Find any previous locational topics (so for me, this is aaaSpringvaleSchoolTopic). Find the "Good news, the enemy has not returned" response (this should be the second topic in the Info window).

8d). Add the new location into the Choices window and right-click > Copy All the stack. So, for those who are strictly following these tutorials, there should now be two locational topics in the Choices window.

aaaFriendshipMetroTopic
aaaNo


8e). Return to the new locational topic (Friendship Metro in my GECK) and click on the second response. "There might be some ghouls in that tunnel, but good news is the Glowing One has not returned...."

Paste the Choices stack copied from step 8d into the Choices window, but remove aaaFriendshipMetroTopic. How convenient. Now add aaaSpringvaleSchoolTopic.

-- That was a bit clumsy. But as more and more locations get added, pasting the locations into Choices makes the job somewhat easier than was found in the TES4 Construction Set. We still need to make sure the right locations get added into the right Choices windows, and the wrong ones get excluded. Basically, whichever location we're working with, in which the boss has NOT respawned, should have all the other locations (plus aaaNo) in its Choices window.

Hope that made sense.


9a).: Select the Reward topic, and right-click > New into the Info window.

Response Text: You were able to get rid of the Glowing One in the Metro, here are your caps.
Prompt: The Glower of the Friendship tunnel #2 is no longer alight.

Conditions:
GetIsID aaaQuestAgent == 1.00 AND
GetScriptVariable aaaFriendshipMetroGlowingOneRef, Dead == 2.00


Toggle Goodbye on.

Result Script [Begin]:
Set aaaGenericWastelandQuests.DoOnce to 0
Player.RemoveItem aaaFriendshipMetroTicket 1
SetObjectiveDisplayed aaaGenericWastelandQuests 2 0


Result Script [End]:
Set aaaFriendshipMetroGlowingOneRef.dead to 3
aaaFriendshipMetroGlowingOneRef.Disable
Player.AddItem F 500
RewardXP 10


--------

9b). 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.


10a). Here's what the main script looks like so far...

====================================

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


========================================

10b). At the top of the script, right under "short DoOnce" and above "Begin GameMode", add

short Timer2
short StartDay2


10c). Save and close the script. Click OK, closing the Quest panel. Reopen it.

10d). Copy everything between the first If and final EndIf statements. So, I'm copying this...

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


10e). Paste all of that text below the final EndIf, but above End

Now, make the following changes, so it'll look something like this...

If (Timer2 == 0)
If (aaaFriendshipMetroGlowingOneRef.dead == 3)
Set StartDay2 to GameDaysPassed
Set Timer2 to 1

EndIf
EndIf

If (Timer2 == 1)
If ((GameDaysPassed - StartDay2) >= 3)
Set Timer2 to 0
Set aaaFriendshipMetroGlowingOneRef.dead to 0

aaaFriendshipMetroGlowingOneRef.MoveTo aaaFriendshipMetroXMarkerHeading

EndIf
EndIf


Overall, the main script should now look something like....


========================================

Scriptname aaaGenericWastelandQuestScript

short DoOnce

short Timer1
short StartDay1

short Timer2
short StartDay2

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


;----------------------------------------
;This section pertains to the Glower of Friendship Metro Tunnel #2

If (Timer2 == 0)
If (aaaFriendshipMetroGlowingOneRef.dead == 3)
Set StartDay2 to GameDaysPassed
Set Timer2 to 1

EndIf
EndIf

If (Timer2 == 1)
If ((GameDaysPassed - StartDay2) >= 3)
Set Timer2 to 0
Set aaaFriendshipMetroGlowingOneRef.dead to 0

aaaFriendshipMetroGlowingOneRef.MoveTo aaaFriendshipMetroXMarkerHeading

EndIf
EndIf

End
Renee
Gray Face bug. Game: TES V: Skyrim

These are SubRosa's words, edited by me. Sometimes when making an NPC in the CK he or she will have a "two-tone" coloring: the face will be considerably darker or lighter than the rest of the body. Sometimes we can just cover this up with full-body armor or clothing. But to fix it properly.

1.) Create a new NPC, or edit one which has been afflicted by the bug.

2.) Edit the face if the person is new, or edit the already-made person, if needed.

Note: If there are additional textures installed in actors/character, NPC customization will result into a two toned NPC, move all the extra textures into a back up folder. (This doesn't apply to me, as far as I know.)

3.) Click "Okay" on the character window closing it. In the Object window, highlight (left-click) your new NPC in the actors list and press CTRL + F4. This causes the kit to export FacegenData.

4.) Save plugin.

5.) You can confirm success by checking Data/Meshes/Actors/Characters/FaceGenData/FaceGeom/<mod name> folder. There should be a folder specfically per the mod the actor is from (Laprima's World.esp for instance).

Also check Textures/Actors/Characters/FaceGenData/FaceTint/<mod name> folder. If it is simply a change to a vanilla NPC, it will be in the .../FaceGeom/Skyrim.esm subfolder. The file will be a .nif with the same name as the base id in the construction set.

Renee
Script Fragments. Game: TES V: Skyrim

I am writing this page to instruct how script fragments work, and to give direct instructions how to set them up.

Script fragments are small bits of code which are localized (they only affect the specific quest or object they've been placed into, unless called to act more globally). They make very specific changes in the game, usually when a bit of dialog is spoken, or a quest stage gets set, and so on.

There will be a bunch of script fragments on this page when it is done. I will include links to Bethesda's official Creation Kit site for each of these, as well. Click on the Spoiler tags for the "plain English" directions which go along with the official text.

-----------------------------------

Let's start with AddItem. -------- (click spoiler tag below for my explanations).



If adding an object to the player, type Game.GetPlayer().AddItem(ObjectName, X) and in that case a property is not needed for the player.

---------------------------------------

ENABLE



------------------------------------------------------------------

EVALUATE PACKAGE



-------------------------------------------------------

Making a Door set a Stage -- (Not a script fragment)



--------------------------------------------------------


Game.ShowLimitedRaceMenu() (This allows us to change a character's looks, without changing his/her skills, stats, etc.)



----------------------------------------

MoveTo



------------------------------------------------

OPENInventory



Quest Messages




SetEssential



SetPlayerTeamMate




StartCombat

Renee
Fixing the Sideways Glasses Bug, Game: Fallout 3 & Fallout New Vegas

When putting on mod-added glasses, goggles, and sometimes hats, these items will sometimes hang off the side of the PC's face instead of sitting properly. Here is an example. Look at Cho Zen Wan's glasses (he's the one on the right) which are hanging askew.

Basically, vanilla items (such as Biker Goggles) are fine, but when editing these items in the G.E.C.K. they won't sit properly on our character's nose. Instead, they'll hang sideways.

Here's the video tutorial which teaches the fix. It's made by Seddon, who makes perhaps the very best video tutorials!

And Here is the New Vegas fix. Note that trying to fix this in NV is different from FO3. Essentially, you'll need FNVEdit to fix the problem. *LINK*

Here is my own written fix for Fallout 3, though.

1). Open Fallout 3 GECK, and boot up whichever mod adds the appropriate item(s).

2). SAVE the plug-in from the main toolbar before continuing. Once the mod's been saved, click on Character from (again) the main toolbar. Select "Update FaceGen model availability". This is the second selection from the bottom of the list.

3). Save again. Problem should be fixed.
Renee
Nexus Mod Manager - installing and uninstalling

Yeah I know... why is she posting how to use NMM? wacko.gif Isn't that program self-explanatory? Hey, I get lost sometimes... So this lesson shows how to install entire mods from the manager itself (rather than copy/pasting into the Data Files folder, which was what I've been doing up til now). This can be helpful especially when installing or uninstalling lots of files.

Note that NMM is an outdated program which includes several features which don't work correctly. It occasionally gets buggy. Nowadays THE Nexus uses Vortex, which I believe they had to outsource. Personally though, I prefer the original Nexus Mod Manager, at least for older games such as Morrowind.


1). Open up Nexus Mod Manager, click on the Mods tab.

2). There should be an orange-colored icon which is called Unassigned. Expand this icon.

3). Click the large + button on the manager's left side. This is the Add Mod from File button. This should open up our Downloads folder. From here, simply navigate to the archive we wish to add.

4). Single left-click on the archive.

5). Click Open. The archive has been transferred into the Mods folder. Right-click on it and select Install and Activate. There we go. This should install the mod's entire folder path (not just the .esp). Larger mods (overhauls and such) might require a few minutes to install.

If the archive contains several .esp files yet we only need one of these, Open the archive itself and delete any files which are not wanted. There is no way to delete them straight from NMM, not that I've found, anyway.

----------------------------------

Here is how to make different Character profiles. When swapping from one guy or gal to the next, we can make it so all the particular mods in their game automatically switch as well. First step is to create a profile. If a profile has already been made and you just want to learn how to swap from one profile to the next, skip to Step 3.

1). Open the Mods tab. At the very top of the toolbar there should be a button for Launch "X", with X being whichever game, and next to this is the Profile button. Click on the little arrow to the RIGHT of the Profile button. This arrow points downwards.

This is tricky to do. Instead of making the actual Profile name the button, we gotta click on the tiny down-arrow to the right of the button. rolleyes.gif

2). Select New Profile. Name and address this profile somewhere.

Now let's say I've got two characters: one is an archer, the other a paladin-type. I want an Archery specific mod to show up in my archer's game, but not in my paladin's. I am now switching to my archer's list from my paladin's list.

3). Assuming the mod has already been installed from its compressed archive (see the instructions above for how to do this) left-click on the mod we wish to use for this particular 'toon. laugh.gif Now press the Big Green Check Icon on the left toolbar. The mod should install automatically.

Conversely, if we wish for a mod to Uninstall at the same moment, left-click on it and select the Big Red Cancel Icon. Voila.

- Keep in mind that mods which contain a lot of files (such as Morrowind Enhanced Textures) can take several minutes to activate, especially if this is the first time doing so. Keep an eye on the bottom of the Mods page. The section which says Mod Activation: Installing should have a spinning animation, which indicates NMM is working hard to get things working. Once it's activated it should say Idle.

4). Switch to the Plugins tab. Now click on the little arrow next to the Profile button, and select Save Current Profile.

5). Assuming a second Character Profile has been added, follow steps 3 and 4 again, to Install and/or Uninstall from that character's world as well.

Double-check that each pertinent .esp or .esm has activated. NMM is a buggy program. It Installs and Uninstalls faithfully, but sometimes it won't activate.
Renee
Breton Magic Resistance Tweak, Game: TES III: Morrowind

I recently discovered something about the way Magic Resistance works in this game and have come to this conclusion: MR is nearly useless! bluewizardsmile.gif Well, it's useless against elemental magics: Cold, Fire, and Shock spells do NOT get resisted by base Magic Resistance spells, abilities, potions or scrolls in this game. No wonder the Breton characters I've rolled in TES3 over the years keep getting drastically damaged by elemental magic, even though they've got 50% MR. rolleyes.gif

Poison and Paralyze also do not get affected by Magic Resistance. This sucks. Granted, MR does protect against plenty other magic types: Absorbs, Damages, Drains, Weakness spells, and a variety of Illusion spells. But not being able to resist against the elemental stuff is huge. As we're getting late into the game, dealing with atronachs and Daedra and some undead, lack of MR against their magics really makes things complicated. devilsmile.gif

So yeah, it's cheating, but I'm changing at least the elemental magic part. And it's not because MR resists all elemental magic in Oblivion and Skyrim, it's because the alternative to not making the changes below includes carrying a ton of potions and/or scrolls. Or cramming the Magic menu with three extra new resistance spells. My magical characters already have enough potions in their inventories, and spells in their books, which makes it cumbersome to select one of these spells in real-time (I prefer selecting spells in real-time rather than pausing constantly to switch magic).

So here goes. I am not changing the way Magic Resistance spells work; we can already do so with Spellmakers in the game. But I am changing the Breton's Magic Resistance ability. This is relatively easy.

1). In the Object window, select the Spellmaking tab.

2). Find Resist_Magicka_50. I am manipulating the Ability by the way, I'm not talking about any MR spells (though spells can also be tweaked). Resist_Magicka_50 is what Bretons have as a base Ability.

> We can also make tweaks to any Magicka Resistance spells as well, but the problem is this'll drive up Magicka costs in-game, and also lower the chance for a successful cast. Anyway,

3). As we can see, Resist_Magicka_50 already has Resist Magicka as an Effect, and there are seven additional scroll-bars below. To add additional effects, simply select any of the scroll-bars, and find the magical effect desired.

4). Change Magnitude as well. I've selected 50 for Resist Fire, Resist Frost, and Resist Shock.

Save. Voilà.

To double-check click on Character on the main tool bar. Select Race. Make sure the ability just modified corelates to what's shown in the Specials window. Yeup, resist magicka_50 is being shown.

Renee
Manipulating Leveled Lists

Here is how to change the leveled lists which reside in any Elder Scrolls or Fallout game made by Bethesda. This helps a lot to manage when certain enemies show up, whether stronger enemies replace weaker ones, and so on.

Do you want Minotaurs to show up in the game even though your character's a total Level 1 weakling? Make it happen. And for those who already have a mod which introduces leveled lists (such as MMM), these lists can be changed as well.

One of my only pet peeves with Oblivion when I was new to that game was the way it would replace weaker enemies with stronger ones, all due to our character attaining a certain level. rolleyes.gif I don't have a problem with stronger enemies eventually showing up, but what I didn't like was the way a lot of the weaker ones disappeared from the game entirely.

An example: Wolves are in the world of TES4 right away. But once we gain Level 6, ALL of the Wolves vanish, and now we have only Timber Wolves, which are stronger. To me, this seems unrealistic. Even a fantasy world such as Tamriel's should feature weaker and stronger opponents, with weaker enemies outnumbering the stronger ones. 🐺 Alpha monsters basically are at the very top of the food chain; that's Darwinism, baby!

Anyway, here's how to manipulate these lists. It's so easy, too. smile.gif I am going to manipulate the way skeletons show up in Morrowind for this example. Because lately I notice that we're not seeing any plain Skeletons in my Level 14 character's game if she's in the majority of Shrines; her world is only populated by Skeleton Champions.


OBJECT window
1). Find the area of the window where Leveled Lists are posted. So in Morrowind, this is in the Leveled Creatures tab.

2). Now, find the proper list. So... I am trying to change the list for Skeletons, and there are three lists in the Leveled Creatures page: in_tomb_skele_lev+0, in_tomb_skele_lev+2, and in_tomb_skele_lev-2. 🦴

Selecting in_tomb_skele_lev+0, I can see right away in the list's Creature Name window it looks like this.

1 Skeleton
1 Skeleton Archer
7 Skeleton Warrior
10 Skeleton Champion


The number on the left is our character's level. So from levels 1 through 6, Skeletons and Skeleton Archers are prevalent. From 7 to 9 we've got Skeleton Warriors, and from Level 10 there are Skeleton Champions. No wonder I'm not seeing any weaker variants in my gal's gameworld.

Here's how I'm changing it.

3). Note that every game does this part differently. Let's say I want ordinary Skeletons to show up at any time, along with the stronger variants. For Morrowind, click on the Creature tab. Find Skeleton, and drag this choice over to the Leveled Creature window. Here's what it looks like now.

1 Skeleton
1 Skeleton Archer
7 Skeleton Warrior
10 Skeleton Champion
10 Skeleton


Perfect. Now when my characters go delving into an area where this list is featured, Skeletons Champions are arranged at Level 10, but so are ordinary Skeletons.

4). And to change the Level modifier, left-click on whichever choice is desired, and press F2. I just dragged a second Skeleton into the window, clicked F2, and changed the number from 10 to 7. Now the list looks like this:

1 Skeleton
1 Skeleton Archer
7 Skeleton Warrior
7 Skeleton
10 Skeleton Champion
10 Skeleton


Overall, I came up with this when I was completely done with the in_tomb_skele_lev=0 list.

1 Skeleton
1 Skeleton Archer
7 Skeleton Archer
7 Skeleton Warrior
7 Skeleton
10 Skeleton Champion
10 Skeleton
10 Skeleton
10 Skeleton Archer


I've basically nerfed the lists for skeletons, because I'm after overall realism, not overall challenge. Some folks might want to make lists stronger, of course. Sure, this is possible as well.

Morrowind's Leveled Lists are as basic as it gets, by the way. When changing lists in OB, FO, or Sky things can get a lot more complicated. Lists which are comprised of lists which draw from OTHER lists... panic.gif it gets to be maddening!

But usually, the same basic process detailed above is still pertinent. I.E., in Fallout 3 Bloatflies (or some other creature) show up at low level. Some other creature eventually replaces Bloatflies, and so on. The same actual process for making these replacements is similar enough as what's stated above.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Invision Power Board © 2001-2025 Invision Power Services, Inc.