Printable Version of Topic

Click here to view this topic in its original format

Chorrol.com _ General modding _ Renee's Modding Thread

Posted by: Renee Feb 25 2018, 01:30 PM

Mod-making thread basically, which focuses heavily on quest-making. The first two tutorials (How to make a fetch quest and how to make a kill quest) are very hand-holdy. They are designed for those who are just starting to learn the art of quest-making. Other tutorials get more advanced, as my wacky ideas have pushed their boundaries.

Just click on any of the links in the post below this one. smile.gif



https://wiki.bethesda.net/wiki/creationkit/Skyrim/Unit/. (How distance compares in-game to real-life).

Posted by: Lady Saga Feb 25 2018, 01:35 PM

Tip: For Oblivion, Always use https://www.nexusmods.com/oblivion/mods/16622 when making silent-text dialog. Without this utility, dialog will stay on-screen for just a fraction of a second. Of course, if recording actual voice, this utility is not needed. wink.gif


1). http://chorrol.com/forums/index.php?s=&showtopic=8089&view=findpost&p=298641. Game: TES IV: Oblivion.

2). http://chorrol.com/forums/index.php?s=&showtopic=8089&view=findpost&p=298793. Game: TES IV: Oblivion.

3). http://chorrol.com/forums/index.php?s=&showtopic=8089&view=findpost&p=298927, and some advice. Game: TES IV: Oblivion.

4). http://chorrol.com/forums/index.php?s=&showtopic=8089&view=findpost&p=299086 Game: TES IV: Oblivion.

5). http://chorrol.com/forums/index.php?s=&showtopic=8089&view=findpost&p=299282. Game: Fallout 3.

6). http://chorrol.com/forums/index.php?s=&showtopic=8089&view=findpost&p=299491. Game: TES V: Skyrim.

7). http://chorrol.com/forums/index.php?s=&showtopic=8089&view=findpost&p=299767. Game: Fallout 3 (should also work for Oblivion and New Vegas).

8). http://chorrol.com/forums/index.php?s=&showtopic=8089&view=findpost&p=300498. Game: TES IV: Oblivion.

9). http://chorrol.com/forums/index.php?s=&showtopic=8089&view=findpost&p=301151 Game: Fallout 3

10). http://chorrol.com/forums/index.php?s=&showtopic=8089&view=findpost&p=301633. Game: Fallout 3

11). http://chorrol.com/forums/index.php?s=&showtopic=8089&view=findpost&p=302271 Game: TES IV Oblivion or Fallout 3

12). http://chorrol.com/forums/index.php?s=&showtopic=8089&view=findpost&p=303069. Game: TES IV: Oblivion

13). http://chorrol.com/forums/index.php?s=&showtopic=8089&view=findpost&p=305053 Game: Fallout 3

14). http://chorrol.com/forums/index.php?s=&showtopic=8089&view=findpost&p=305505. Game: Fallout 3

15).http://chorrol.com/forums/index.php?s=&showtopic=8089&view=findpost&p=305756. Game: TES IV: Oblivion

16). http://chorrol.com/forums/index.php?s=&showtopic=8089&view=findpost&p=307172

17). http://chorrol.com/forums/index.php?s=&showtopic=8089&view=findpost&p=307909 Game: TES IV: Oblivion

18). http://chorrol.com/forums/index.php?s=&showtopic=8089&view=findpost&p=308055 Game: TES IV: Oblivion

19). http://chorrol.com/forums/index.php?s=&showtopic=8089&view=findpost&p=308105, Game: TES V: Skyrim

20). http://chorrol.com/forums/index.php?s=&showtopic=8089&view=findpost&p=308798, Game: Fallout 3

21). http://chorrol.com/forums/index.php?s=&showtopic=8089&view=findpost&p=309878, Game: TES: V Skyrim

22). http://chorrol.com/forums/index.php?s=&showtopic=8089&view=findpost&p=310093, Game: TES V Skyrim

23). http://chorrol.com/forums/index.php?s=&showtopic=8089&view=findpost&p=310529, Game TES V Skyrim

24). http://chorrol.com/forums/index.php?s=&showtopic=8089&view=findpost&p=310606 (which gives the PC a horse) WIP at the moment.. do NOT follow this lesson.

25). http://chorrol.com/forums/index.php?s=&showtopic=8089&view=findpost&p=311049 Game: TES IV: Oblivion

26). http://chorrol.com/forums/index.php?s=&showtopic=8089&view=findpost&p=311853 Game: TES V: Skyrim

27). http://chorrol.com/forums/index.php?s=&showtopic=8089&view=findpost&p=315792. Game: Elder Scrolls Online

28). http://chorrol.com/forums/index.php?s=&showtopic=8089&view=findpost&p=315815 Game: Fallout 3

29).http://chorrol.com/forums/index.php?s=&showtopic=8089&view=findpost&p=316814. Games: Oblivion, Fallout 3, Skyrim

30). http://chorrol.com/forums/index.php?s=&showtopic=8089&view=findpost&p=320065. Game: TES V: Skyrim

31): http://chorrol.com/forums/index.php?s=&showtopic=8089&view=findpost&p=322207. Game: TES V: Skyrim

32): http://chorrol.com/forums/index.php?s=&showtopic=8089&view=findpost&p=322995 Game: TES V: Skyrim.

33). http://chorrol.com/forums/index.php?s=&showtopic=8089&view=findpost&p=326897. Game: Fallout 3

34). http://chorrol.com/forums/index.php?s=&showtopic=8089&view=findpost&p=327333 Game: Fallout 3.

35). http://chorrol.com/forums/index.php?s=&showtopic=8089&view=findpost&p=328235. Game: TES IV: Oblivion

36). http://chorrol.com/forums/index.php?s=&showtopic=8089&view=findpost&p=329901. Game: Fallout 3 & New Vegas

37). http://chorrol.com/forums/index.php?s=&showtopic=8089&view=findpost&p=331652 (by Boxx Mann)

38). http://chorrol.com/forums/index.php?s=&showtopic=8089&view=findpost&p=336457: TES III: Morrowind

39).http://chorrol.com/forums/index.php?s=&showtopic=8089&view=findpost&p=336730 Game: TES III: Morrowind.

40). http://chorrol.com/forums/index.php?s=&showtopic=8089&view=findpost&p=337982. Game: TES IV: Oblivion

41). http://chorrol.com/forums/index.php?s=&showtopic=8089&view=findpost&p=341713. Game: TES V: Skyrim

42). http://chorrol.com/forums/index.php?s=&showtopic=8089&view=findpost&p=341715. Game: TES V: Skyrim

43). http://chorrol.com/forums/index.php?s=&showtopic=8089&view=findpost&p=342869. Game: TES V: Skyrim

44). http://chorrol.com/forums/index.php?s=&showtopic=8089&view=findpost&p=343194. Game: TES V: Skyrim

45). http://chorrol.com/forums/index.php?s=&showtopic=8089&view=findpost&p=343215. Game: TES V: Skyrim

46). http://chorrol.com/forums/index.php?s=&showtopic=8089&view=findpost&p=347307

47). http://chorrol.com/forums/index.php?s=&showtopic=8089&view=findpost&p=347454

48). http://chorrol.com/forums/index.php?s=&showtopic=8089&view=findpost&p=347647

49). http://chorrol.com/forums/index.php?s=&showtopic=8089&view=findpost&p=348272

50). http://chorrol.com/forums/index.php?s=&showtopic=8089&view=findpost&p=348663

51). http://chorrol.com/forums/index.php?s=&showtopic=8089&view=findpost&p=348731 (Skyrim)

52). http://chorrol.com/forums/index.php?s=&showtopic=8089&view=findpost&p=349149

53). http://chorrol.com/forums/index.php?s=&showtopic=8089&view=findpost&p=349505

54). http://chorrol.com/forums/index.php?s=&showtopic=8089&view=findpost&p=349643

55). http://chorrol.com/forums/index.php?s=&showtopic=8089&view=findpost&p=349787

56). http://chorrol.com/forums/index.php?s=&showtopic=8089&view=findpost&p=350158 (lesson by SubRosa)

57). http://chorrol.com/forums/index.php?s=&showtopic=8089&view=findpost&p=350596

58). http://chorrol.com/forums/index.php?s=&showtopic=8089&view=findpost&p=350689

59). http://chorrol.com/forums/index.php?s=&showtopic=8089&view=findpost&p=350840

60). http://chorrol.com/forums/index.php?s=&showtopic=8089&view=findpost&p=351017

61). http://chorrol.com/forums/index.php?s=&showtopic=8089&view=findpost&p=351104 -- This works for any Bethesda game with Leveled Lists

62). http://chorrol.com/forums/index.php?s=&showtopic=8089&view=findpost&p=352374 Game: TES IV: Oblivion

63). http://chorrol.com/forums/index.php?s=&showtopic=8089&view=findpost&p=353804. Game: TES V: Skyrim

64). http://chorrol.com/forums/index.php?s=&showtopic=8089&view=findpost&p=353834

65). http://chorrol.com/forums/index.php?s=&showtopic=8089&view=findpost&p=353909, Game, TES V: Skyrim

66). http://chorrol.com/forums/index.php?s=&showtopic=8089&view=findpost&p=354294, Game: TES V: Skyrim.

67). http://chorrol.com/forums/index.php?s=&showtopic=8089&view=findpost&p=354328 Game: TES V: Skyrim

68). http://chorrol.com/forums/index.php?s=&showtopic=8089&view=findpost&p=354767. Games: Oblivion, Fallout 3 & NV, Skyrim

69). http://chorrol.com/forums/index.php?s=&showtopic=8089&view=findpost&p=354935 (Aliases also discussed a bit), Game: TES V: Skyrim

Posted by: Renee Feb 25 2018, 01:51 PM

The Fetch Quest, Game: TES IV: Oblivion.

So this tutorial will be about how to make one of the most basic types of quests we can find in any Bethesda game: the Fetch Quest. We've got an NPC whose valuable item was stolen, and now it's our character's job to fetch it back.

The very first quest I ever wrote, way back in 2016, was a fetch, and it's because it was one of the only quests which included https://www.youtube.com/watch?v=myUnmRU1m4o.* I knew absolutely nothing about using the Oblivion Construction Set folks, absolutely nothing beyond renaming an item, or making a chest not respawn anymore. I mean, I'm a dummy gamer who used to put tape on my TV to simulate the compass being removed. Yet here I was, with this grand idea to start adding content to one of my character's games.

* Note, 2024: that video link got removed unfortunately. It featured a "kill" quest, not a fetch, but a lot of the same steps still applied. Only real difference is the main script which gets associated with the actor-to-kill. I have written a kill quest lesson below, for those who want it.


This tutorial assumes you have used the CS before, and have some basic knowledge about how to get around: how to use the Object, Render, and Cell windows, and how Beth has their main toolbar set up. If you've never used the Construction Set before yet want to learn, http://www.youtube.com/watch?v=ipEOrBBB4ig&t=18s. It was made by a teenager, but believe me, this is one of the better ones I've found. https://cs.elderscrolls.com/index.php?title=Category:A_beginner%27s_guide, and there are also classes over at http://tesalliance.org/forums/index.php?/forum/82-esiv-oblivion-school/

So if you've never used the CS before, I encourage you to watch and read those first, because I'm going to just jump right in, here. wink.gif Still, this tutorial does start with a few basic instructions, just because it's the very first one in this thread.

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

1). Open the TES4 Construction Set. Several windows should pop up: the Object window, Cell window and Render window. There is also a main window which I'll call the "main toolbar". This window/toolbar is always beneath the others, and it's the one with the typical "File", "Edit", "View" (etc.).

Go ahead and organize the Object, Cell, and Render windows to your liking. These three windows can be pulled and stretched this way and that, so that they are nicely laid out side-by-side or above/below each other, while the main toolbar window always stays beneath the others.

Left-click on File and then move your mouse pointer over where it says Data. Left-click on Data. A panel will pop up, listing Oblivion.esm (which is the vanilla game, basically), any DLC you've got, and any mods you've installed in your Data folder. Go ahead and double left-click on Oblivion.esm, and then click OK.

Now, if you've got some mod you're already working with, this process is different. In such case, you're going to double left-click on that mod (so an X shows up next to it), and then move down to the button which allows us to Activate that mod. Once the mod you're working with is Active, click OK. You can also simply double right-click upon that mod. The X should show up, and then you press OK.

It can take awhile for the Construction Set to load up. As it does so, occasional error messages usually show up. These are usually harmless, so click Yes or "Yes to All" as they pop up.


1a). OBJECT window
First thing we're going to do is make an NPC, a chest, a key, and an object to fetch. For this tutorial, I am making aaaDungeonKey, aaaDungeonChest, aaaLostAmulet, and aaaBob. aaaBob will be my starring NPC quest-giver. These names don't have to be used exactly by anyone reading this, but those are the ID names I am going to use.

For my first fetch quest, the object to fetch was an amulet. There's always someone in RPGs (not just Oblivion) who've had their precious jewelry stolen, and now it's OUR job to get it back, right? Anyway, here is what to do. I shall start with the container in which the object-to-fetch is being placed.

Tip: It's easier to edit stuff, rather than right-clicking > New into the Object window. Reason is, all the features native to the object, the container, the NPC (etc.) will be included in the edited object. So for instance, the chest will already make sounds when we open and close it, NPCs will already have a set of animations and sounds that they use, and so on.


Chest: Go into WorldObjects > Container section. Find a chest in the list. Right-click on the chest and select Edit. Change the ID name to something unique. As stated, I am calling it aaaDungeonChest.

Tip: When making items, NPCs, and so on, it's a good idea to put "aaa" in front of any name being typed for ID names or Reference ID names. So if a key gets made it can be called aaaDungeonKey, for instance. This will cause the key, or most any object or quest, to get placed at (or near) the very top of any list in the Construction Set, GECK, or Creation Kit. Makes stuff easier to find.

...Conversely, some folks prefer to start ID names with ZZ, which automatically puts these items towards the bottom of most lists. Well truthfully, everyone's got their own methods. When tearing into other peoples' mods though, sometimes it can be challenging to find any content they've modified or added, if this content isn't located at the top or the bottom.

... A lot of modders will tag their content in such a way that it's always in a particular section of the alphabet. MMM's creatures all have ID names which start with (you guessed it) MMM, like MMMWolf02, and so on.


1b). Remove anything you don't want in the chest, by right-clicking these items and selecting Delete (or left-clicking and pressing Delete on your keyboard). Sometimes though, I like leaving stuff in there.

1c). Remove any scripts, if the container actually has a script (most containers don't). The script area is a drop-down menu next to the button with three dots on it (literally this button looks like [...] If the scroll-down already says NONE, that is perfect, as this means the container hasn't got a script. If it says anything else, scroll upwards until NONE is found.

1d). Click OK, and when it asks if we want to save as a New Form, choose Yes.

Note: As these items are being created, editing from stuff already in the game, the CS will ask if we'd like to save each each object as a New Form? Always click "Yes." This will create these objects as unique items, rather than overwriting stuff already in the game. You definitely DON'T want to be overwriting things which are already in the game, as this can cause problems.

SAVE from the main toolbar. Get into the habit of saving often, as the Construction Set can occasionally crash, just like the game can. Now that the mod is being saved you'll be given a chance to name it! "YourMod.esp" is what'll show in the game's Data folder, with 'YourMod' being whatever it was just named.


And now that the .esp has been named, copy it and save it into a separate folder. Always a good idea to get into this habit, as well. Sometimes I find myself making mistakes while modding, and the only choices then are to start all over from the beginning, or copy/pasting the backup which hasn't got those latter mistakes!

1e). Go into the Object window's Items section, and find Key. Repeat the same steps: 1a through 1d, while editing a key. Obviously, 1b can get skipped, since keys do not hold inventory. Anyway, these steps can be repeated for the object-to-fetch as well, except that amulets can be found in the Items > Jewelry section. Or maybe it's Items > Clothing. I forget.

1f).
NPC: Go into Actors > Actor > NPC. Making people is a bit trickier than making other objects.

NOTE: and this is very important. When editing a Bethesda NPC, make sure to edit someone found in the base game, NOT Shivering Isles. Editing a Shivering Isles NPC will confuse the game's engine, making any text written for that NPC not show up in the game! If there's any confusion about whether an NPC is from the base game or not, go to www.UESP.net and find that NPC. Make sure he or she is not from SI. Some NPCs from Shivering Isles start their ID names with "SE", when viewed in the Object window.


... It is also important to edit a named NPC, such as Samuel Bantien, rather generic one, such as a marauder or a bandit. Editing generic people is okay if making another generic, but if you're making somebody who is named (and therefore unique) it's less work to begin with somebody who is named.

Get rid of any AI, Factions, or scripts associated with your edited NPC. For instance, if you've edited a guy whose everyday life has him walking, sleeping, and eating in the Imperial City, that's exactly what the edited NPC will try to do if you don't get rid of his/her AI. When you find the guy in-game, he'll probably be walking out of the cell he's been placed into!

... So, click on the edited NPC's AI button, then right-click on any AI packages found in the AI Package List. Delete all of these. Also, look at the NPC's Aggression rating. For most ordinary town-dwelling people, this rating is going to be set at 5. If, for some reason, Aggression is set much higher than this, if it is over 40 for instance, change this to 5.

... To get rid of Factions, click on the Factions tab (which is right between Stats and Inventory). Right-click and Delete any factions listed. We can also add factions, if we want our NPC to be allowed into certain restricted areas, but that's for another tutorial.

....Getting rid of scripts has already been discussed while making the Container. Do this now, or wait until later during step 10b, assuming the NPC (or any other object being edited) actually has a script. Not all NPCs do, but scripts are found more often on people than they are on containers or keys.

In a moment, I'm going to go into more details about the items we're going to need.


2a). CELL + RENDER windows
Select a dangerous cell where the chest shall get placed. Or, you can opt to choose a non-dangerous cell, if you'd just like to see the quest work, without needing to deal with combat & exploration. Either way, choose a cell in the Cell window's left panel, so that it shows up in the Render window. The cell being chosen will probably be too far away to see. To get a closer look, double left-click on any item in the right side of the Cell window, a barrel or a wall or whatever.

2b). Left-click anywhere into the Render window, then tap A on the keyboard to see better!

For anyone who's not sure how to navigate around the Render window, a good description of mouse & keyboard commands https://cs.elderscrolls.com/index.php?title=A_beginner%27s_guide,_lesson_2_-_Creating_a_room, in the box right under "Introduction."

2c). Find the chest edited earlier in the Object window > WorldObjects > Container section and drag the chest into the Render window. Find a spot where you'd like the chest to be, then press F so that it falls to the floor, or some other surface like a table. >> Though it might seem like this chest is going to be easy to find, since we're the one putting it in some dungeon, oftentimes once we're back in-game we might be surprised how often our own content might take some searching for!

Note: Working in the Render window can take lots of practice. For those who're having trouble selecting the chest, rather than a wall or some other dungeon feature, sometimes it helps to get really close to the chest (or any object you'd like to move) with the cursor. Use the mouse wheel to do this. Double-click on the item until its Reference panel pop up.

...Once the chest selected, this panel will list the chest's name in its Base Object slot. Use the mouse wheel to zoom in and out, to get closer or farther. To move the entire cell, hold down the mouse wheel while moving the mouse. This will to cause the entire dungeon to move. Do this until finding the correct cursor position, where it can grab the chest properly. Once you've got the chest selected, the cursor will turn into a + sign, with pointers on it. Left-click on the chest and hold the left mosue button down to move the chest around by itself.

The set of mouse & key commands I just linked to really helps with object movement; https://cs.elderscrolls.com/index.php?title=A_beginner%27s_guide,_lesson_2_-_Creating_a_room. When accidentally moving something you shouldn't move (like an entire wall or floor!), click ctrl + Z. This will get whichever object back to where it should be.


Note 2: If you've got any mod in your game which change dungeons (such as Snu's Dungeons), there's always a chance that any content being added or changed won't necessarily conflict with others such as Snu's, but it's possible to find some odd things happening back in the game, and in that dungeon. I once modified a cave, added my own enemy into this cave, only to find that enemy was dead by the time we got there. Why? Because a plug-in I've got called Fighters Guild Quests added about fifty mudcrabs into that same cave!


3). Once the chest is in its proper cell, double left-click on it in the Render window. This will open up the chest's Reference panel. Now click on the Edit Base button, and drag the object to fetch, whether its's an amulet or something else, from the Object window into the chest's inventory window. Make sure the darn thing (the chest) doesn't respawn, by making sure Respawn is not toggled.

Click OK.

4). Now we're back to looking at the Reference panel for the chest. There should be four visible tabs on this panel: 3D Data, Enable Parent, Ownership, and Lock. Go to the Lock tab, and toggle 'Locked' on. Make the lock's Level whatever is desired, from "Very Easy" (one tumbler) to "Needs a Key." We can have the NPC we made give us the key we made, and make it so that it will fit this chest (optional)*. Toggle the Key bar, and search for the Key that just made, aaaDungeonKey, or whatever. THIS KEY will open this chest.

* All of this key stuff is optional, because sometimes it doesn't make sense for the quest-giver to magically have the exact key that opens some chest far away! But not everything needs to make sense in the world of Tamriel, right? .... we're just learning here.


5). CELL window
Place the NPC in a friendly cell, such as Bravil's Silverhome-on-the-Water (which will be called BravilSilverhomeOnTheWater in the Cell window).

> An optional step is to give him or her appropriate AI packages, Faction, Class, etc, https://cs.elderscrolls.com/index.php?title=Basic_NPC_Creation_Tutorial. We don't absolutely need to add AI, but if we don't, the NPC will simply stand wherever he or she was placed, hardly able to move. This might be okay for our purposes now of course, but in the future, all these things can be added to make people more dynamic.

Go to the CS's main toolbar and click on the SAVE icon. Keep saving, too. Always a good idea, and I'm going to keep repeating this idea because it is that important.

6). Click on the Q button (on the Construction Set main toolbar). This is the Quest window, where quests get made. Since most of these tutorials deal with quests, I'll be clicking on this button a lot! wink.gif

7a). QUEST DATA tab
Right-click on the Editor window, and give the Quest a unique name. For this tutorial I am calling my quest aaaFetchQuest1, though you can call yours whatever you'd like. Also, give the quest an actual name in its Quest Name slot. This name is what will appear in the game's quest journals.

7b). Priority can be medium-high. 60 is good for now, though for other quests this number can vary quite a lot. Those with higher priority (such as the quest which causes arrest) are going to take precedence over those with lower priority, such as Generic Dialog-type quests.

Toggle "Start Game Enabled" on, if it's not already toggled.

7c). Now, look toward the center of the Quest Data page, where the Quest Conditions box is. Right-click > New into the main white portion of this box, or click the New button at the bottom-left. By default, the CS will display the GetDisposition function, but we don't need GetDisposition.

7d). Go to the scroll-bar next to the New button, and search for (or type in) GetIsPlayableRace. As you type, the CS will fill in what it thinks you're looking for, saving some time.

7e). Ignore Function Parameters, but make sure Comparison is ==, and Value is 1. So altogether, in the Quest Conditions window it will say GetIsPlayableRace NONE == 1. This is what the game uses to make sure only playable races (wood elves, Khajiit, Redguards, etc.) can receive this quest in the first place.

7f). Follow all the steps from 7c to 7e, except this time add GetPlayerInSEWorld NONE == 0. This function makes sure the player/character is not in Shivering Isles, which the CS refers to as SE World for some reason.

Again, here is what you should see in the Quest Conditions box...

GetPlayerInSEWorld NONE == 0.00 AND
GetIsPlayableRace NONE == 1.00



8a). QUEST STAGES tab.
Right-click in the Index window, and select New. The number 0 will show up. Just leave it like that.

8b). Now right-click > New four more times, but type numbers for each of these four. Altogether, I am choosing 0, 10, 20, 30, and 100. These numbers don't have to be exactly 0, 10, 20, 30, and 100, you can use whatever numbers you'd like, but always make sure there is some numerical space between whatever numbers being added. Don't just put 1, 2, 3, 4, etc.. Doing this makes it impossible to add content in between these stages, which can get problematic at times. Because sometimes when writing quests, all the sudden we'll think of more content which should go between any two stages, see?

Anyway, three of these five indexes will include text which will show up in our Current Quests journal as the quest updates, making that drum sound. *Doooon!*

8c). Don't touch Stage 0 at all. It is more like a pre-stage, which exists as soon as the game starts up.

8d). Click on Stage 10, and right-click > New into the top Log Entry box. Doing so will open up the box below it (which is also called Log Entry). This is where all those nifty in-game quest updates get written. But don't do anything else. There should be the word EMPTY in the top Log Entry box. Just leave it like this.

> During Stage 10, the NPC greets our character, and will be telling us about his/her missing item, laying it all out there. If the player decides they don't want to hear the NPC's speil (in other words, if the player backs out of conversation during, or just right after the NPC greets us), it would be silly for the quest to update. We should be able to back out of greetings without quest updates, otherwise it feels like the quest is railroading us.

Note: (Better Cities quests are famous for railroading!)

8e). The next stage (which I'm calling 20) will be a true quest update that will put information into the in-game Current Quests journal. This update pops up only if the player clicks on the NPC's Lost Item topic though, after we have listened to the NPC's initial greeting, and decided to help him or her. We haven't written this topic yet, but we will.

So go ahead and right-click into the top Log Entry box. Now left-click into the central Log Entry box, and start typing the update. "I have met a desperate man who seems to have lost his amulet"... etc.

8f). The next index (30 in this case) will need some text explaining that the lost item has been found. "I have found the item that was stolen from Bob"... etc.

8g). The final Index (100) can have text stating what has happened altogether, now that the entire quest is over. "I have found the magic amulet stolen from Bob, and have returned it to him," or whatever. Make sure to toggle Complete Quest on for this one.

8h). Add a script into Stage 100's Result Script box, which says ...

StopQuest aaaFetchQuest1

If this doesn't get added, the game's engine will try to read any scripts associated with this quest over and over forever, which causes unnecessary bloat. cake.gif


9a). TOPICS tab.
The Topics tab is where the bulk of PC/NPC dialog gets written. Other tabs (Conversation, Service, Detection, etc.) only get used for specific types of dialog. Anyway, right-clik into the Editor ID window and select Add Topic. Look for and left-click GREETING, and press OK. The slot for Topic Text will now also say GREETING. Do not change this.

...Notice I skipped over the Quest Targets tab. This is the tab in which we can add (guess) Quest Targets, which show up green or red on the magical compass back in game. I never use targets, personally. I'd rather search around and not be hand-held, when it comes to missing items and such. Map markers can also be added too, which I use more often. But for now let's skip this tab.

9b). Now, make a second Topic, give this one a unique name, such as aaaLostItem. Right-click into the Editor ID window, select Add Topic. Next, right-click > New into the Select Topic panel. Type in a unique ID name .. aaaLostItem,* or whatever. Click OK.

In the Topic Text slot it will now say whatever's been typed. So if you did type aaaLostItem, this is what it will say in the Topic Text slot. Go ahead and change this to plain English: Lost Item instead of aaaLostItem. The reason is, the words in this slot are what we're going to see in-game, alongside other topics such as Bravil, Rumors, etc.

* If you've already named an amulet, or ring, or any other item "aaaLostItem", the CS will inform that we can't make multiple objects have the same name. It'll then automatically rename the topic aaaLostItemDUPLICATE, instead. This is fine. The topic will still work, its ID name will just be not very aesthetically-pleasing, here in the Construction Set.

9c). Click on GREETING in the Editor ID. Now, in the Info window (right beside the Editor ID window), right-click, and select New. A dialog panel will pop with a bunch of features on it, but we're only going to use the very top box for now, which is called Response Text. This box is where we can type an NPC's dialog. So now's the time to get creative, and add some text.

Something like "Hey, you look like a capable adventurer. I need your help to find my missing item," or whatever.

9d). Optional: change the Emotion Type scroll-bar from Neutral to any of six other emotions. And there's also Emotion Value, which defaults on the number 50. This is what changes the look on the NPC's face as he/she is speaking. Zero means there is no real difference from Neutral, while 100 will make his/her face look extremely sad, extremely happy, and so on. Numbers in between 0 and 100 can be chosen so that the NPC looks somewhat happy, sort of fearful, etc.

9e). Click OK. The panel will close, making any typed dialog appear in the central box, which is called Response Text.

>> The cool thing about adding our own words? Us modders can go into as much, or as little, detail as we'd like. We can eventually add our character's name directly into dialog, too. smile.gif If we run out of space while adding text, just Click OK, and then right-click > New into the Response Text box (where our first block of text has now been added). An empty Dialogue panel will pop up, so more dialog can be added.

9f). Look to the middle-right of the Topics page, where the Add Topics window is. Should be right above Choices. Right-click into the Add Topics window, and find aaaLostItem, or whatever unique ID got added before. Select this, and click OK.

9g). Now we're going to use the Conditions window, located near the bottom of the Topics page. Conditions get used a LOT while making quests and dialog. Right-click > New into this window.

By default, GetDisposition shows up in the Condition Function scroll-bar. Click onto this scroll-bar and search for GetIsID. This is probably the most popular function of all, because it's what the game uses to search out of thousands of people. GetIsID will narrow this search down to just one NPC, so that only this unique NPC will say the things he/she's supposed to say.

Left-click on the Function Parameters button, which currently says INVALID. A panel will pop up. Find the name of the NPC who was created earlier in this tutorial. For me, this was aaaBob (ha ha). Click OK.

Comparison should be == and Value should be 1. So altogether, this condition will be GetIsID "aaaNPCname" == 1, with aaaNPCname being the name of your quest-giver.

9h). Right-click > New into the Conditions window again, follow all the steps in 9g, but this time, search for GetStage in the Condition Function scroll-bar. Left-click on the Function Parameters button again, and look for the ID name of the quest itself, aaaFetchQuest1, or whatever. Comparison should be < and Value should be 10. We'll need to type in that value of 10. So overall, it will say GetStage "aaaFetchQuest1" < 10.

So there should be two conditions now....

GetIsID "aaaNPCName" == 1 AND
GetStage "aaaFetchQuest1" < 10


...and these conditions will ensure that only the quest-giver can deliver the opening greeting, and he/she can ONLY do this if the quest's stage is below 10.

9i). Time to type the second script (yaah fun!) into the Result Script box. Left-click into this box, then type ...

Player.SetStage aaaFetchQuest1 10

What this means: once our character is greeted by the quest-giver, the game's engine will be commanded to move the entire quest from Stage 0 to Stage 10. By doing this, it means the NPC won't keep giving us the same "Hey you look like an adventurer" greeting over and over, every time we initiate a new conversation with him or her.

Tip: It's now a good idea to click OK (closing the quest window) and save. Don't close the Construction Set itself, though. Go into the game, and make sure JUST THIS part of the quest is working. Though it can get tedious to keep going back and forth into the game like this, this is the best way to ensure everything works as it should.

9j). Reopen the Quest window if it was closed eariler, and select the Topics tab. Go back to the tall, rectangular Editor ID box, and click on GREETING. Let's add a couple more GREETINGS: one which will show up if we go back to this NPC, but don't have his / her lost item yet ("You're back, but where is my amulet?"), and one which will show up after the item has been found ("I knew you could do it! Huzzah!"). Both responses should have the same GetIsID as the first GREETING, but the second GREETING should have GetStage "aaaFetchQuest1" == 20, and the third should be GetStage "aaaFetchQuest1" == 30.

The third greeting (when the lost item has been found, and returned to the NPC) should also have a Result Script which says ...

player.SetStage aaaFetchQuest1 100

... which is the final stage of the Fetch. Type that into the Result Script box.


9k). Now go to the unique topic created earlier, highlight it, and then right-click > New into its Info box. Type in something like "Yes, I lost my valuable amulet, and I have reason to believe it is in X location..." Use the Emotion toggles to make the NPC look ultra sad or disgusted when this gets said! mad.gif

9l) In the Result Script box, add Player.SetStage aaaFetchQuest1 20. If we want to have the NPC give a key at this moment, press Enter after adding the SetStage script, and then type player.AddItem aaaDungeonKey 1 right below the SetStage script. (This assumes the key was named aaaDungeonKey of course. If it was cnamed something else, this ID should be typed exactly.)

The number 1 denotes the number of keys the quest-starter gives at this moment. So one key get get added, five keys, ten keys....and so on. Only one is needed though, of course. whitewizardsmile.gif It's never good to bloat the game with unnecessary content.

9m). Again, the Conditions for aaaLostItem's dialog should be the same GetIsID used before, but also add GetStage "aaaFetchQuest1" == 10.


Tip: In the future to make this process simpler, go back to the very first GREETING, right-click anywhere in its Conditions box, and then select Copy All Conditions. Now go to the aaaLostItem topic, right-click into its Conditions box, and select Paste. All that's needed now is make sure to change the GetStage comparison, which is <, to == so we've got GetStage "aaaFetchQuest1" == 10 instead of GetStage "aaaFetchQuest1" < 10.

It's possible to keep pasting those same conditions over and over again, which is mighty convenient, but don't get into the habit of rushing. It's important to go slow. Pay attention to which stage you're trying to match dialog for, and make sure Comparison matches up with what you're trying to accomplish. Once you're back in the game, let's say you KNOW your NPC should say certain things at certain times, but he or she is not saying them. Oftentimes it'll be a simple mistake made with Conditions, Comparisons, and so on. The dialog will be in the CS for instance, but the NPC is being commanded to say this dialog before Stage 10, when he should say it during Stage 10.

9n). Now go back to the second GREETING. This is the greeting the NPC says if we return to him or her, before finding his/her amulet, yet. The Conditions here will be

GetIsID "aaaNPCname" == 1 AND
GetStage "aaaFetchQuest1" == 20


If we want our NPC to be extra pissed during this moment, make his Emotion Angry or Disgusted. Toggle Goodbye and Say Once on, so that he or she won't say anything further, until we've got that stupid amulet back!

9o). Now to the final GREETING, which the NPC says after we have fetched the item, and returned to him or her. "Oh, you've got my amulet! You are so wonderful!!!..... bla bla bla." The Stage is 30 when this happens in my example above.

Type Player.SetStage aaaFetchQuest1 100 into the Result Script box, so the quest moves from Stage 30 to the final stage of 100. It's also possible to add or remove whatever's desired at this point. An example: you can add gold, and remove the lost item at this moment. Here's what goes into the Result Script box for Stage 30, if so.

Player.SetStage aaaFetchQuest1 100
Player.RemoveItem aaaLostAmulet 1
Player.AddItem Gold001 1000


Those scripts will bump the quest to Stage 100, remove the amulet (or other lost item), and award the character with a thousand gold. Neat, eh? Another option: those last two scripts (the RemoveItem and AddItem) can instead be placed into the Quest Stages tab's final Stage of 100, in its Result Script box. Cut those two scripts from the Topics tab, swap to the Quest Stages tab, and paste them into Stage 100's Result Script box. Doing it this way is actually better, because the item being removed and gold being added will get removed and added after the NPC finishes this final dialog, rather than during this dialog. The whole scene is less distracting this way.

9q). Click OK, closing out the Quest window, and save all work.


...So, we've bumped from Stage 0 to Stage 10 via dialog. We've also bumped from Stage 10 to Stage 20 using the NPC's words, and from 30 to 100. But.... how do we get from Stage 20 (where dialog left off) to Stage 30 (when the NPC gets his treasure back)?


10a). OBJECT window > Items
Find the lost item made during step 2, whether it was an amulet or a ring or whatever. Right-click > Edit on it, so its information panel opens up.

10b). Three selections down on the left side of this panel is Script. When editing an item which does not have a script, it should say NONE in the script's scroll-bar, which is perfect. Go to Step 10d if this is so. If the item has a script, go ahead and move the scroll-bar all the way upwards, so that it says NONE. Continue to 10c, which is the very next step.

10c). Click OK, closing the item's panel. Now, reopen the item. If the item previousy had a script, now it should be gone.

10d). So now let's have some fun, and add our own script. hubbahubba.gif Click on the [...] button. Literally, this is a button with three dots on it, which is right next to the Script scroll-bar. The script editor opens. Like most windows, this one's got its own little tool bar.

Left-click on Script, and select New.. This allows us to type into the script editor box, opening up all kinds of scripting fun. Anyway, type in the following...


scriptname aaaFetchQuest1Script

Begin OnAdd Player

End


10e). From this point, you can either click on the script editor's Save icon, or try to close the script by pressing X in the script window's upper-right corner. If you try to close it out without saving, the CS will then ask Do you want to save your script? .... And of course the answer is usually Yes.

If any odd messages show up, the script will not save or close. Usually this is due to something not being spelled correctly, or not being written in a proper way. "Begin On Add" for instance, instead of "Begin OnAdd". Don't get frustrated; mistakes like this happen all the time. Correct this, and try saving (or closing) again.

10f). Click OK, closing the item's panel. Next, reopen it. Find the script just created in the Script scroll-bar, and click OK again. Reopen the item. Make sure the script is now attached to the item.

All of this closing and reopening can seem redundant, but this process is necessary to make sure the script gets added to the item properly, without annoying error messages!

10g). Now it's time to flesh out the rest of the script, by adding...


if (player.GetStage aaaFetchQuest1 == 20)
SetStage aaaFetchQuest1 30

Endif

... between the OnAdd and End functions. Overall, the script should look like this....


scriptname aaaFetchQuest1Script

Begin OnAdd Player
if (player.GetStage aaaFetchQuest1 == 20)
SetStage aaaFetchQuest1 30

Endif

End


Again, if everything got typed okay, there should be no problem / the script panel will close. If something did not typed propertly, there will then be some weird message, screaming any mistakes. mad.gif I've been there, zillions of times. If this happens, something in the script is obviously wrong. The script editor will try to point us in the correct direction, by pointing which line has some erroneous data. It's often something small and easy to miss: a missing parenthesis bracket, or a period (full stop for your Brits) missing between Player and GetStage. Or a space between Set and Stage. rolleyes.gif Or an If statement, without a corresponding EndIf.

For anyone who wants to know more about Ifs, EndIfs, OnAdds, and zillions of other checks and functions work, the Construction Set wiki linked above explains all this stuff in great detail, in its gigantic Scripts tutorials.

Once the script is saved and ready to go, THIS collection of words, symbols, and numbers is what will wind up moving the quest from Stage 20 to Stage 30, when we fetch that lost item.

One final thing can get added to this Fetch quest. This is entirely optional, and has to do with our character getting a point of Fame for delivering that amulet. This is a little silly of course, but necessary for learning. And maybe it's not so silly. Maybe Bob tells all his friends, half the population of Bravil, about our character's exploits. Sir Bob of Bravil makes our character a little more famous.

Just open up the Quest window again, go to Quest Stages, and in the final stage of 100. Type the following into the Result Script box...

ModPCFame 1

... right above the StopQuest script. Altogether, you might be seeing all of these scripts in Stage 100's Result Script box by now, assuming you've removed that lost item, added some gold, and added a point of Fame...


Player.RemoveItem aaaLostAmulet 1
Player.AddItem Gold001 X
ModPCFame 1
StopQuest aaaFetchQuest1


12). Click OK, closing the Quest window, and then close the Construction Set, choosing Yes if you want to save.

13). A good idea now is to go into the game's Data folder. Find the .esp file just made, and immediately make a copy of it. Paste this copy in a safe place, maybe a separate hard drive if you've got one. This is a really good habit to get into, for obvious reasons.

14). Get in the game, and play! If anything is wrong, just be patient. Go back into the CS, and fix it. You're alpha-testing your own material now, which in my opinion can be the most aggravating part of quest-making. I usually turn my TV all the way down (so that I'm not actually roleplaying anymore) if I begin to get frustrated.

But I almost always figure it out, whatever it is I'm trying to accomplish, and so can you.


Conclusion: You may notice that this fetch quest boils down to maybe a minute or two of actual gameplay in total (not including travel, exploration of lairs, battles with enemies, etc.). And maybe you've spent hours designing it with this guide. This may seem like a heck of a lot of work for not much playtime. Eventually though, all of the steps mentioned in this first tutorial will become second-nature for those who decide to keep at it. You'll be able to fly through these steps much more quickly. goodjob.gif

Posted by: ghastley Feb 25 2018, 04:25 PM

The problem with the YouTube tutorials is that they have a fixed pace - which will always be both too fast in some parts, and too slow in others, and that they are all "watch how I did something specific which will be different from what you want to do."

I much prefer text-based stuff, that I can use as a reference, read in any order at my own pace, and preferably explains why, as well as how.

That's not easy to produce, but hypertext (HTML) makes it easier, as you can put links to the why inside the tutorial that shows how. And vice-versa; a tutorial explaining how something works can link to examples of using the methods.

So thanks for getting this thread started. I'll dig around and see if I have any Oblivion material to add.

Posted by: Renee Feb 25 2018, 05:18 PM

Awesome, ghastley.

QUOTE(ghastley @ Feb 25 2018, 10:25 AM) *

The problem with the YouTube tutorials is that they have a fixed pace - which will always be both too fast in some parts, and too slow in others, and that they are all "watch how I did something specific which will be different from what you want to do."


Not to mention they always get something wrong! Usually something very small, but which will cause an entire portion of the quest not to work. On the positive side, video tutorials can be good to watch just to visually see what the mod-author is clicking on, and typing into.

Anyway, hopefully I got everything up right up above, and did not make any mistakes of my own! I'll be adding one of these tutorials per week, hopefully. This means I'll be fawning over anything I add to this thread, making sure it should all go swell and smoothly, for any green modders out there.

Posted by: SubRosa Feb 25 2018, 05:41 PM

Excellent fetch tutorial Renee! I will probably try this out with my Anchorage Aftermath mod. I always wanted a fetch quest in there to gather up a bunch of holotapes scattered around the area. But I was never able to make it work.

Posted by: Renee Feb 25 2018, 11:40 PM

Thank you. I tend to write up everything I do step-by-step, because otherwise there's no way I'd remember it all!

If you're going to do this for Fallout, there might be a few things different. In fact, I know there are. But that's no problem, I've done this before for Fallout as well. As I'm looking at the fetch quest during the week, I'll see if I can glean what's different from Oblivion to Fallout 3, and then add those differences in the next tutorial.

Posted by: Renee Mar 2 2018, 11:16 PM

The Kill Quest, Map Markers, and X markers. Game: TES IV: Oblivion

This is another simple quest, but it’s very essential to know how to write a Kill, since it’s such a popular quest in any Bethesda game (or any RPG, really). We’ve got somebody who's either got a bounty on his/her head, or has stolen something valuable, or is just really mean, or *insert reason here*. Bottom line, our character gets a quest to hunt this NPC down, and get rid of him or her for good.

Fetch and Kill quests, as simple as they are, are essential to know because sometimes even the most elaborate quests out there will have a fetch or a kill buried in them. When we go to confront Mannimarco during the Main Quest for instance, there are all sorts of variables and other fancy things going on, but what does this portion of the Main Quest really boil down to?

A lot of the steps that are needed (such as making NPCs and items, how to start topics and quest stages) are steps which can also be found in the Fetch quest tutorial above, and other tutorials I've linked to. To save space, I won't repeat myself a whole lot.

The first video I linked to (with the British guy) is also a Kill quest. You can therefore watch that vid, and follow along with a lot of the things I'm going to type here. However, the Brit's quest is extremely simplistic, while my version is going to be more comprehensive. I’m going to teach a few new tricks during my version.

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

1). Start up the TES4 Construction Set, bla bla bla.

This time we're going to make two NPCs, and that is all we'll need for a basic kill quest. First NPC is the quest-giver, and the second will be the one we're supposed to hunt down.

For anyone who's already made an NPC quest-giver for the Fetch quest, this guy or gal can be used again. Or, you can opt to make somebody who's totally new. If you have not made an NPC at all yet, follow the Fetch lecture up above, starting with Step 2. Or have a look at one of the tutorials linked above.

1b). So make that quest-giver, if you haven't already. If not, right-click > Edit on any named NPC who is not part of Shivering Isles. Also, do not edit a generic NPC, such as a bandit or marauder.

TIP: I frequently edit NPCs. Though it's possible to simply use pre-existing Bethesda NPCs (such as Thoronir or Jensine) to give out quests and rewards and such, sometimes they can be more difficult to work with, since they are not "blank slates," the way anybody we create will be. Sometimes, Beth NPCs have AI which causes them to roam around. Sometimes they’ll have quests and scripts associated with them, causing them to potentially be in places we don’t expect, doing things which conflict with what we’re trying to achieve. Sometimes Bethesda NPCs won't respond to the Priority rating our quest has, and so on.

Basically, in most cases it is NOT a good idea to make changes to these pre-existing NPCs who are already in the world. Changes can cause problems.

… In the future (for those who get confident and knowledgeable) it's possible to use Beth NPCs for this or that. But for now, it's better to work with somebody who is solely focused on whatever we write.

This kill tutorial is going to be focused in Skingrad, and I'm going to hide my NPC-to-kill in Cursed Mine, which is just west of SKingrad. If you've already made a quest-giver for the fetch quest, and placed him or her into Bravil (since this is what I did during the Fetch tutorial), you've now got several options. You can keep this quest-giver in Bravil and make a new one for Skingrad. Or, you can Cut (Ctrl + X) the guy/gal already made, and Paste him or her into some Skingrad cell, such as SkingradWestWealdInn, or SkingradTwoSistersLodge. Or, it's possible to just use the Bravil person, who sends us off to Cursed Mine. That final option is my favorite, I think. smile.gif I always like long road trips.

2a). OBJECT window
Now to make the enemy. Since I'm placing my enemy into Cursed Mine, which is full of bandits, the easiest way to do this is to edit a generic NPC who is already a bandit. So in the Object window, click on Actors > NPC, and expand the NPC branch so you can see all the different races.

2b).
To find a generic bandit, look into any races that bandits can possibly be in the vanilla game. So, this includes Argonians, Dark Elves, Khajiit, Redguards, and Wood Elves. Pick one of those races, so the Construction Set focuses on only this race.

There are still hundreds of NPCs listed. To make this process simpler, we'll need to narrow down to only the bandits. In the GECK and Creation Kit, Bethesda got smart and included a search feature, but for the Oblivion Construction Set, there is no search. That is okay though...

2c). At the top of the Object window are a bunch of tabs: Editor ID, Count, Users, Name ... and so on. Single left-click on Name.* This will organize all the NPCs listed in alphabetical order, from A to Z, according to their in-game names, or generic names. ... Well, some NPCs won't have a name at all, so you might be seeing a bunch of blank spaces at the top of the Name list. Just scroll downward, and you'll eventually see all the As listed.

We'll need the Bs. Keep scrolling down to the Bs, and finally some Bandits.

* This can be done with any tab. Single left-clicking the first time will organize all names from A to Z. Single left-click again, and now they'll be organized from Z to A. This can also be done with the Editor ID names, as well.

2d). Right-click > Edit on any generic bandit which is not a TEMPLATE, whether it's an archer or a melee-type, and so on. BanditMeleeFemale2, for instance. So if you want your kill quest to feature an archer, locate one of these. Right-click > Edit him or her. Make sure to follow all the steps for making an NPC discussed so far in this thread, or in any tutorials linked above.

Changing ID name is always the first essential step, and saving the edited NPC as a New Form is always the most important. Go ahead and play with Stats, Magic, Inventory, and so on.

Try to stay away from any generics that are associated with quests, or Shivering Isles. Quest-based generic NPCs often use ID names which have nonsense letters and/or numbers associated with them. You might see something like MS09BanditMissileMale. MS09 is the name of the quest that generic will be associated with. Shivering Isles generics often have SE at the front of their ID names.

I'm not sure if any vanilla bandits are associated with specific quests or Shivering Isles, I'm almost certain some of them are associated with a few specific quests. Don't use these types of NPCs though, now and in the future.


2e). Toggle "No Low Level Processing" off.

>> No Low Level Processing tells the game's engine to ignore NPCs, if we're not in their cell or worldspace while in-game. If an NPC is associated with quests, or other specific functions in the gameworld, they'll need to have low level processing off so that the game knows to keep an eye on them, even when we're not around. But the engine doesn't need to know what all the generics are up to. As far as the game's engine is concerned, these generics aren't even active until we're in their area. viking.gif

2f). Click onto the enemy's AI button, and have a look at what is in there. Typically, there'll be a couple Wander packages: one for Exterior locations, and one for Interiors. These packages cause the enemy to walk randomly around, of course. These can be kept as-is, because they won't usually wander too far from where they've been placed. There might also be a Sleep package, or an Eat package. If you don't want your NPC to sleep or eat (which could make for too easy of a kill), go ahead and right-click > Delete these.

If a bandit was edited, his/her Aggression will often be set to 100, which is fine. Almost all enemies have their Aggression set to 100. viking.gif


3a). CELL + RENDER windows
Locate CursedMine01 (or wherever) and place the edited enemy into the Render window. I tend to prefer putting kill-quest enemies into the very LAST possible location of the lair. This makes it so that we'll need to search for this enemy, dealing with all the others in front of him or her first. But if you want to just get this Kill quest over quickly, simply put the enemy into an initial room.

There are also CursedMine02 and CursedMine03, two other cells which go deeper underground. For now, just put the enemy into the first cell. This will make it easier for me to teach something later on.

3b). Have a look into the enemy's Faction tab. If an actual bandit was edited, he or she should already be in the BanditFaction. Continue to step 5, if so. But I will go ahead and show how to add the enemy into this (or any) faction.


4a). TES Construction Set main window
Make sure the enemy's Factions tab is selected. Now look at the main window, which is the window that's always below the Object, Cell, and Render windows. There's a bunch of choices on its toolbar: File, Edit, View, etc. Look for Character. Select this, and then double left-click on Faction... This will open up the Factions panel.

On the left side of this panel are all the possible factions in the vanilla game. Scroll down to BanditFaction.

4b). Left-click on BanditFaction and drag this into your enemy's Factions box.

4c). Click OK or Cancel on the Factions panel, and click OK on your NPC's panel, saving the enemy as a New Form, if you haven't done so already. There. Now the enemy is good to go, in any cell featuring other bandits.


5). QUEST window
Click on the main toolbar's Q button, and Right-click > New into the Editor ID box. For this tutorial, I am calling it aaaKillQuest1.


6). QUEST DATA tab
All the things we did during the Fetch can be repeated here. So give this new quest a name in the Quest Name slot, "A Bandit's Last Day" or whatever.

> Start Game Enabled stays on.
> Priority can be 60.
> GetIsPlayableRace == 1 goes into the Conditions window, along with GetPlayerInSEWorld == 0.

Optional: to add a little flair to the quest when it appears in the in-game journal, click on the Icon button. This will link into the Data > Textures > Menus > Icons folder. If you've got any mods that add icons, there should be some icons and/or folders to select from. Look for icons that are appropriate for your quest. For instance, since this is a Kill quest, I'm selecting an icon from the Fighters Guild Quests mod which displays a knife. Double left-click on the icon, so that it shows up (hopefully) on the Quest Data page. This icon will now also show up in the in-game quest journals. smile.gif

I have found that for some reason, some icons won't show up at all. If so, don't stress; all of this is optional.


7a). QUEST STAGES tab
I think the Brit in that video up above used two or three stages for his kill quest. I am going to use a total of six: 0, 5, 10, 20, 50, and 100. And again, you don't have to use 0, 5, 10, 20, 50, and 100, but make sure there is some numerical space between whatever numbers being chosen.

> Stage 0 is the pre-stage. Right-click > New into the top Log Entry window so it says EMPTY. Otherwise, don't need to change anything here.

>> Stage 5 is when the quest-giver first greets us, which leads to him or her giving an introductory spiel to what he/she wants us to do. Right-click into the top Log Entry box, but don't do anything further. It should say EMPTY in this box. Just leave it like that. By now, the quest-giver's initial greeting is done, and we've got a choice to click on a topic, which we haven't written yet.

>>> Stage 10 is when the quest-giver has told us all his worries (or her worries), leaving that burden on our shoulders. Great. Gee, thanks. Right-click > New into the top Log Entry box, and type something into the central Log Entry Box. "I have just met a person in need of my assistance. He has told me about a dangerous enemy living inside of Cursed Mine, just outside of Skingrad, and would like to know if i can kill this enemy." Something like that.

>>>> Stage 20 occurs after we have entered the proper cell where the enemy is hiding. Right-click > New into the top Log Entry box, and type something like "I am now inside of Cursed Mine. Gong by the smell, this place really is cursed..."

>>>>> Stage 50 occurs after we have decimated the enemy, rid him or her from existence. Something like, "I found the bandits' leader inside of Cursed Mine, and now he's been owned. Time to head back to Bob, back in Skingrad. Sir Bobby will be pleased."

>>>>>> Stage 100 is the reward stage. "I have returned to Bob, and have been paid a measly three beers! I don't even like beer. I am never doing another job for Bob again!' ... whatever you'd like. smile.gif


7b). Make sure Quest Completed is toggled on for that final stage.

In the Result Script box type StopQuest aaaKillQuest1 to keep it from running forever and ever.


8a). RENDER window
Now I am going to teach something new: how to add a Map Marker. I don't use quest targets (too much hand-holding), but I do like map markers. The NPC who gives us the quest can mark the in-game map to let us know where to go. Those who are reading this might already know where Cursed Mine is of course, but we're just learning here.

If the Render window is still open with the cell in which the enemy was added, that's great. If not, search for that cell in the Cell window, which is CursedMine01, for anybody who's strictly following this tutorial.

8b). Click into the Render window, and press A to see better. We need to get outside of this cell, now. This is easiest if the cell only has one zone to get out of. This is why I chose Cursed Mine's first zone to add my enemy into; I want to be able to get out of this zone easily, so I can include this next trick.

8c). Find the entrance/exit door to Cursed Mine, or whatever cell you're working with. There are two ways to do this. You can physically click & drag (holding the mouse wheel as you drag) the entire cell in the Render window, until the cell's entry door is located. Or, look for any doors in the Cell window, and double left-click on them. Usually, the entry door will have the numbers '01' at the end of its name.

Once the door is found, there should be a yellow rectangle with a purple pointer on its top, sitting right next to the door. https://i.imgur.com/oHwaEf2.png?1 This is called a Door Marker. If you don't see this marker, press M on the keyboard. This will cause any markers in the Render window to display.

8d). Double left-click on the Door Marker. It will ask if you want to "View Door reference for this Door Marker?" which is a nerdy way of asking "Do you want to leave this cell?" Click Yes. And ... wait a few moments while the exterior worldspace loads.

We should be outside of Cursed Mine now, seeing an identical Door Marker. Double-click on this one, press Yes, and voila, we're back inside Cursed Mine. This is how all Door Markers work.

8e). Zoom the mouse-wheel out. Start looking for any nearby Map Markers. Map Markers are similar to Door Markers, except they are red rectangles with lilac-colored pointers on them. https://i.imgur.com/xbI70a2.png The Map Marker for Cursed Mine should be a few yards away from its entrance, slightly downhill. Most vanilla locations will already have their own map markers. If for some reason you can't find one, it's possible to create one.

If you see the map marker outside of Cursed Mine, go to Step 10a. If for some reason you can't find it (or just want to learn how to make these), continue to the next step.


9a). OBJECT window + RENDER window
In the Object window, go to the WorldObjects branch, and look for Static. Click on Static. Click on any item in the large right window now. Look for MapMarker. Now, click & drag this MapMarker into the Render window. The marker should appear as a red rectangular marker (as linked above), which will probably be floating in the middle of space. Move it somewhere near the cell's entry door, and press F so it falls to the ground.

9b). Double left-click on the marker, so its Reference panel opens up. Give the marker a Reference ID name, such as CursedMineMapMarker or something similar. If there already is a CursedMineMapMarker (and there should be) somewhere nearby, yet you can't find it, the CS will scream that the "Form's ID is not unique!" ... Okay, whatever. Just rename the marker, since the original one can't be found.

9c). Click OK.


QUEST window > Quest Targets tab
I skipped this tab before, now I'm going to show how to use it to make markers show up on the map, once we're back in-game, and doing this quest.

10a). Make sure the Render window still shows that map marker, outside of Cursed Mine. Now, in the Quest Targets page, right-click > New into its top window, which is called Target Ref.

10b). The central section of the panel which pops up is called Quest Target Data. Select the button which says Select Reference in Render Window. Click on this button. After doing so, the mouse pointer will temporarily become an icon which looks like a Celtic cross, a + inside of a O. It will be also be red-colored.

10c). Move the Celtic cross over the map marker in the Render Window. It should turn white. Double left-click on the Map Marker. The CS will now put the Quest window back on top, and you should be seeing the name of the Cell in which that marker is in, along with the map marker's Reference name. If the official Bethesda Cursed Mine map maker was selected, the Cell and Ref slots will say this..

Cell: CursedMineExterior
Ref: "MapMarker" 'CursedMineMapMarker'

TIP: In the future when working with Map Markers, if the Render window is not open to the actual location of the map marker, you can also search for it by choosing whatever worldspace the marker is in, and then choosing its Reference ID name. This process is more time-consuming though, since you'll need to remember which worldspace that marker lies in. Exterior locations are tougher to locate than interiors (outdoor locations are often called "Wilderness"), which is one of the reasons I started inside of CursedMine01 instead of outside.

10d). We'll want this Map Marker to show up on the map during Stage 10, when the quest-giver lets us know where the enemy can be found. So return to the Quest Stages tab and select Index 10. Type ShowMap CursedMineMapMarker into its Result Script box.


11). TOPICS tab
Now to write some dialog. Three GREETINGs are needed, and one unique topic. I am calling the unique topic aaaKillTopic. To save space I'm not going into full detail here. If you need a memory-jogger on how to make GREETINGs and Topics, follow the steps found above in the Fetch quest, starting from step 9a.

For the lessons below, I am calling my quest-giver aaaQuestGiver, though you can change this to whatever ID you actually used. Note that some of the text below is redundant, if you're using the same quest-giver used for the Fetch quest. If this NPC already knows our character, type in stuff appropriate for this. "Hey, I remember you" instead of "You look like a capable adventurer..." My Kill Quest-giver is a different guy, though.

--------------------
First Greeting = "Hello, you look like a capable adventurer, might you be able to help me with something?"

GetISID "aaaQuestGiver" == 1 AND
GetStage "aaaKillQuest1" < 5


Result Script box: Player.SetStage aaaKillQuest1 5

AddTopic box: add the unique topic here. So I am right-click into this box > Add Topic > aaaKillTopic.

-----------------
Second Greeting = "You are back. Have you been to Cursed Mine yet?"

GetIsID "aaaQuestGiver" == 1 AND
GetStage "aaaKillQuest1" == 20


Note: Again, you can make your quest-giver's dialog ultra-snarky, if he/she is not pleased that we have been to Cursed Mine, yet haven't killed that wanted bandit. Toggle Goodbye on, and change their facial expressions appropriately.

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

Third Greeting = "You have returned! And due to my magical talisman, I already know the bandit leader is dead! Here, have some beers on me!"

GetIsID "aaaQuestGiver" == 1 AND
GetStage "aaaKillQuest1" == 50


Result Script box: Player.SetStage aaaKillQuest1 100

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

12). Now, go to the unique topic. This is the one I called aaaKillTopic in my own build.

aaaKillTopic = “Yes, there’s a fellow who’s been causing some trouble here in Skingrad,” bla bla bla “...and I happen to know he’s been living in Cursed Mine. Here, I will mark it on your map. Will you help me?”

GetIsID "aaaQuestGiver" == 1 AND
GetStage "aaaKillQuest1" == 5


Result Script box: Player.SetStage aaaKillQuest1 10

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

Click OK, closing the Quest window, and save all work, please.


13). OBJECT window
So… we’ve bumped the quest from 0 to 5 via dialog, and done the same thing from 5 to 10, and 50 to 100. But what about 10 to 20? And 20 to 50?

In the Object window, look for WorldObjects > Static > and look for Xmarker in the Editor ID window. Left-click on any object in this window and type the letter X. There are the XMarkers. (Not talking about XMarkerHeading, by the way).

14a). RENDER window
If the Render window is still showing the exterior of Cursed Mine, we'll now need to get back inside. Double left-click on the yellow Door Marker near the place’s entrance, and select Yes.

14b). Back inside of Cursed Mine, where that wanted enemy’s been hiding, that bastard. Move a bit into the cell, by click + holding the mouse wheel and dragging.

14c). Left-click on the Xmarker in the Object window, and drag it into the cell. This marker will look like a red X once it’s in the cell.

14d). Press F so it falls to the floor. Position this X somewhere onto the cell’s floor, so that it's easy to click on. It doesn’t really matter where it lands. I like putting it where it's easy to click, though. I like putting it where there isn't too much other stuff nearby.

If the XMarker disappears this could be because it wasn't able to land on the floor, or some other surface. Press Ctrl+Z if this happens! Voila, now start over.

14e). Double left-click on the Xmarker, opening up its Reference panel. Give the Xmarker a Reference ID name. I am calling my Xmarker aaaCursedMineXMarker, pressing OK, and then I am immediately copying (Ctrl + C) this name, so I can paste it into a script we're about to write.

Copying Reference names so they can pasted later, or better yet, onto a Notepad or text file, is a good habit to get into, by the way.

... By default, all Xmarkers are also references, and all references can be used by the game's engine to trigger during quests. This is why the Persistent Reference toggle is greyed-out. We don't even have a choice to turn this off.


15a), QUEST window > Quest Data tab
Click Q on the CS’s main toolbar, opening up the Quest window, and select its Quest Data tab if it’s not already selected.

15b
). Time to write a script for the Xmarker. Click on the [...] button, opening up the script editor.

Note: This editor (unlike the editor we used for that Fetch item) has the power to control any object, spell, or quest function in the game, that is associated with this quest. It is like the queen on a chessboard, which often has a greater immediate reach in-game than Object scripts do.

15c). Click on Script > New, and type in the following…

scriptname aaaKillQuest1Script

Begin GameMode

End


15d). Before saving this script, look at the Script Type scroll-bar. By default, this will be set to Object. There are three choices we can make in this bar though: Object, Quest, and Magic Effect. We’ll want to set it to Quest. This is VERY important.

...If this bar is still set on Object, and you close/save it before changing this to Quest, the script will then disappear into the Construction Set. You will be able to find it, but finding it creates unnecessary steps. For those who make this mistake (and don't feel bad, I've made it a bunch of times) click on the Pencil icon, located on the main window's toolbar. The script will be somewhere in this huge list of others. Locate it, open it up, and change its Script Type to Quest.

So save the script by closing the script window, and select Yes.

15e). Again, the script won't immediately appear in the scroll-bar, even if it is set to Quest. Click OK on the Quest window (closing it) and save. Now, reopen the Quest window. The script should be in the scroll-bar now, so left-click on the bar and find/reopen it.

Click OK again (ensuring that the main script is now attached to the quest), and reopen.

15f). Add the following Conditional statements into the script, putting it between GameMode, and End.

If (Player.GetDistance aaaCursedMineXMarker <= 400)
If (Player.GetStage aaaKillQuest1 == 10)
SetStage aaaKillQuest1 20

EndIF
EndIf


Altogether the script'll look like this...

scriptname aaaKillQuest1Script

Begin GameMode
If (Player.GetDistance aaaCursedMineXMarker <= 400)
If (Player.GetStage aaaKillQuest1 == 10)
SetStage aaaKillQuest1 20

EndIF
EndIf

End


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

This means: when your character enters Cursed Mine and gets close enough to this Xmarker (less than 400 units, or at 400 units), the quest will move from Stage 10 to Stage 20, and we'll get that update saying "I have now entered Cursed Mine....etc." This Xmarker will ONLY do this though, IF the character is at Stage 10 of aaaKillQuest1 (if the character has been given this quest, by speaking to the quest-giver). Without those If and EndIf conditions in place for the quest stage especially, we could go into that cell at any time, and we’d automatically be at Stage 20, for a quest which we did not even begin yet, see?

Tip: You can change the distance that the Xmarker triggers, by changing 400 to 500, or whatever number. I wouldn’t go too small though, unless the marker is in an area with a confined entry passage, ensuring that the character will pass near it. The downside is, your character must get near enough for the Xmarker to trigger, otherwise the quest won't update. But this is why it's important to put your Xmarker into an initial area of the cell, and also an area which is not too wide, so that the character will definitely walk near it.


17a). OBJECT window
Now to make sure the quest bumps from 20 to 50. How do we do this? Find the enemy NPC in the Object window, and open his or her information up.

17b). Click on the [...] button, Script > New, and we’re going to type the following.

-------
Scriptname aaaKillBanditScript

Begin OnDeath

End

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

17c). Close/save the script, and click OK, closing the NPC's panel. Reopen the NPC's info and find the script in his/her script scroll-bar. Click OK again, and reopen.

Open the script.

17d). Add the following...

If (player.GetStage aaaKillQuest1 == 20)
SetStage aaaKillQuest1 50
EndIf


....in between the OnDeath event and "End". Altogether we've got this...


Scriptname aaaKillBanditScript

Begin OnDeath
If (player.GetStage aaaKillQuest1 == 20)
SetStage aaaKillQuest1 50
EndIf

End



And that script obviously triggers the quest to move from 20 to 50, once the NPC enemy gets killed. viking.gif Now.... it does not matter how the enemy gets killed, whether he falls down a mine shaft, walks into a blade trap, or whatever. But that’s why I recommended Cursed Mine; there aren’t any traps or mine-shafts in Cursed Mine. wink.gif

So there we have it. The entire kill quest has been written up, but oops! We have not rewarded the character yet.


18), QUEST STAGES tab
Go to your final stage. For me this is 100. In the Result Script box there should already be a StopQuest command here. Right above this command I am typing...

Player.AddItem DrinkBeer X

... with X being whatever number you’d like. But again, I was being silly there. You can award your character with whatever item(s) you find in the Object window, basically. I awarded my character three beers during my Kill Quest, just to add a little humor. Substitute Gold001 instead of DrinkBeer, for a more serious reward.

Posted by: Turija Mar 7 2018, 11:58 PM

Great thread. I will have to think about what I can add for Oblivion modding. Most of the modding I have done for Oblivion so far has been patches or add-ons for other mods. One of the best tools for that (besides xEdit) is the https://www.nexusmods.com/oblivion/mods/36370/. With the Construction Set Extender, you can work on mods that have esp files as masters without having to "esmify" them, which makes things a lot easier. The Construction set Extender also fixes a ton of bugs in the CS and adds a number of new features, like color coding changes made by the currently active mod, so you can easily see what's changed. The Consruction Set Extender really makes my time in the CS more enjoyable, so that is my pro-tip for the day.

One caveat. If you are running an ENB (or ENBoost), then the Construction Set Extender won't start, so you have to remove the ENB from the Oblivion directory or rename it before launching the Construction Set through the Construction Set extender. There are several available on Nexus, https://www.nexusmods.com/oblivion/mods/47125 is the one I use. It works pretty well, I just click on it to launch the Construction Set Extender and it automatically renames my ENB and then automatically changes the name back when I exit.

Posted by: Renee Mar 8 2018, 02:53 AM

Sweet Turija! See, I just learned a few new things there. Did not know about Construction Set Extender. Yeah, because the regular CS does have a few rather odd things about it So does the GECK and Creation Kit as well.

Posted by: Renee Mar 13 2018, 02:27 AM

How to repair Hair, Game: TES IV: Oblivion

This one is going to feature Oblivion again, and it'll be a shortie. smile.gif I will get to other games too: Fallout 3 and Skyrim.

Anyways, yes ... hair. After rebuilding my entire Data folder from scratch a few weeks ago, I had a bunch of little problems to then take care of. One of these had to deal with weird-looking hair, or missing hair. I use a couple different mods for hair: Coolsims Hair Pack, and Apachii Wigs. I noticed that RG3 (who has Coolsims), and a variety of NPCs (some of whom have Apachi Wigs), had this jet-black hair, which looked really unnatural. Damn I wish I had a picture to show, as an example.

Anyway, the fixes are really easy, and I'm adding them here for convenience. One fix will work with Apachii, and the other with Coolsims. The Apachii fix assumes you've got Wrye Bash. I think there are ways to fix Apachii hair without Bash, in fact I saw some options for fixing hair without WB. I don't know how to fix without WB, so if you don't have Bash, just know that there are some other options out there.

Anyways, try this for Apachii.

1). Open up https://www.nexusmods.com/oblivion/mods/22368?tab=files.

2). Click on the Saves tab. Find a save, and right-click on it. At the bottom of the list is Repair Hair. Left-click on this.

3). The program will tell you whether or not it was able to repair the hair. It worked for me, hopefully it'll work for you too.


And here is the fix for Coolsims


5). To fix Coolsims hair, start your game up, with whatever save you're using currently.

6). Open the console, type in ShowRaceMenu. Do NOT close the console window.

7). Choose the hair you want for your character, but (again) keep the console window and race/class/birthsign menu open. Do not click 'Done'.

8). Press your Esc key, and make a new save.

9). Load this new save.

10). You can now close the console window, but at no time before finishing those steps should you close it, or the game will change all your character's stats back to default values.

The words below in the spoiler tags are from UESP.net, in case you aren't able to save with the console open...


Posted by: Renee Mar 18 2018, 06:29 PM

How to make an NPC Vendor & Mechanic. Game: Fallout 3

This module is going to show us how to make an NPC, who is also a vendor and repair-person, in the Fallout 3 Garden of Eden Kit (GECK). The process of starting NPCs in this program is slightly different from making one in the Oblivion Construction Set (CS).

I think the reason why I wanted to make an NPC who does all these things in Fallout 3 (before I learned in Elder Scrolls games) is because there are so many areas of the wasteland in which it'd be nice to buy and sell stuff, and get our gear repaired. But nobody nearby offers any of these services. Guns in particular tend to take quite a beating as they're being used, and ammo is always in demand. Sure there are merchant caravans who wander around, but there's never one around when we need one. So I began to think it'd be nice to have some extra merchants in fixed locations.

An example is when Janet, my Talon Company rogue, took up residence inside of Fort Bannister. Nobody in there to buy / sell / repair from, yet doesn't it make sense that there could be? Most of the soldiers in there are deadbeats who only one-line our characters to death! Same thing when Cho, my main quest guy, began spending lots of time in the Citadel. I believe there are some merchants in there, but they weren't specialized enough for what Cho needs from day-to-day.


1). Open up the Fallout 3 GECK. Now, open up Fallout 3.esm, or if you've already got a plug-in you're working with, you can make this active. Everything here is exactly the same as it was in the CS, so far as opening up the main .esm, or any .esps. We're still working with the Object, Cell, and Render windows, while the main window always stays beneath the others.

First, we're going to make an NPC. If you've made people before in this game skip to Step 3a. Otherwise, the process is slightly different than it was in the CS, so for anyone who is new to this, continue the 2nd steps.


OBJECT window
You'll notice there are now eight branches in this window (rather than the CS's five). We have Actor Data, Actors, Game Effects, Items, Miscellaneous, Special Effects, World Objects, and All. Bethesda has also provided us with a convenient Filter slot, which allows us to search for specific objects if we need to.

Go ahead and try to narrow down on MoiraBrown, for instance. Make sure "All" is selected in the left side of the Object window, and then type her name into the filter. You might only get as far as Moira before *Bam* there she is, out of thousands of objects.

2). But now, let's make our vendor. Get Moira out of the filter, so the window expands back to All again.

To make an NPC, expand the Actors branch and single-click on NPC. Right-click > New into the larger Editor ID window.

Note: In the CS, it is common to edit pre-made NPCs, and then work with whatever person we've clicked on. When working in the GECK or Skyrim Creation Kit however, we often start from New, instead. This is because these latter programs include a lot of pre-configured features for NPCs, which makes starting somebody new much easier.


3a). Make an NPC as per all the usual steps: start by giving him or her an ID and a Name. Notice how the GECK has a lot of new features on this very first panel, yet there are also some features you might be familiar with, if you've already made an NPC in the Oblivion CS. I'm not going into detail right now, but if you'd like to learn more about all these features, http://geck.bethsoft.com/index.php?title=Category:NPC. There are also dozens of videos out there, too.

3b). Go into your NPC's Traits tab (which should be selected by default), find Class, and select Mechanic in the scroll-bar. Nothing else really matters about this NPC so far as vendoring and repairing goes, so choose whatever Race you want, whether the guy/gal is tall or short, etc.

3c). AI Data tabs
We can either toggle Autocalc Services on if we want him or her to just sell random stuff, or we can specifically click on Weapons, Food, Books, whatever we'd like them to buy and sell. I am going to make my guy sort of a low-life drug dealer. He'll sell chems in Moriarty's Saloon, and that is all. ph34r.gif

3d). Inventory tab
We're about to throw our NPC somewhere into the world, but how about we put some clothes on him or her first? wink.gif Right-click into the box where it says Count, Object ID, and so on. Select New.

3e). In the Object scroll-bar are all the possible items in the game. Single-click on this, and type in (or scroll down for) outfit. There's a huge list of generic and specific outfits to choose from. I chose OutfitWasteland02.

Tip: if you want to see what your person looks like with clothes on, move your cursor to the bottom/center of the NPC's panel (where it says Preview) and toggle Full on.


4). CELL + RENDER windows
Find a cell where you'd like your NPC to be, open it up, and put him or her into that cell in the Render window. All of this is exactly the same, compared to the CS. I put my lowlife NPC into MegatonMoriartysSaloon. Since I did this, I also want to officially make him one of Moriarty's buddies. This means adding the guy into Moriarty's faction. Adding NPCs into factions is slightly different, from CS to GECK.


5). Double left-click on the NPC in the Render window, and click on Edit Base.


6). Factions tab
Right-click > New into this box. This will open up all the factions in the game. You can choose as many Factions as you'd like, within reason. My lowlife chem dealer will be a part of MegatonMoriartysFaction and also MegatonResidentFaction. He's got some cred with the people, you see.

Click OK, and OK again (closing both NPC's panels) and save your work.

Now we're going to start a new, very short, quest. Yes, to make an NPC buy and sell, we'll need to have a quest to back this up. This goes for the prostitute (Nova, I think) inside of Moriarty's, and innkeepers in Elder Scrolls games, as well. Making quests is sometimes different in the GECK, and the main difference to start with? No more Q button on the main toolbar. Ugh.


7a). OBJECT Window
Expand the Actor Data branch, and click on Quest. You'll see all the game's quests *POP* up, all colored yellow & black.

7b). Right-click > New into the window, and give your quest a Quest Name and ID. Priority can be 55. Most quests Bethesda writes are at 55. Start Game Enabled should be toggled on, and make sure that "Script Processing Delay" is also toggled on.

One thing which is different though is we don't have to add GetIsPlayableRace into the Quest Conditions box. In fact, Bethesda never seems to use this box, anymore.


8a). TOPICS tab
Right-click > Add Topic into the large, vertical window on the left, and find GREETING. Click OK.

Note:: If you've got Windows 7, XP, or Vista, from here on you should have no problems. Continue to Step 8b. If your computer is Windows 8 or 8.1 though, chances are you won't be able to see the word GREETING in the Editor ID at all. This is because Beth configured the GECK for older systems, unable to see what the future would hold. I have heard Windows 10 is the worst, when it comes to working in the GECK. Since I don't have 10 though (I have Win 8.1) I don't know how to work around this problem with 10.

Working with the GECK's various windows for Windows 8 or 8.1 (such as the Editor ID window, Conditions, etc.) is a pain, and there is no instant cure that I've found, to get text to display properly. You can still work around this problem though. Here is how.


a. Make sure "Top-level only" is toggled off. This toggle can be found near the top-left of the Topics page.

b. Move your cursor to the very top-left corner of the Editor ID window. This box is unnamed, but it's the one in which you just added GREETING, yet GREETING is not showing. As your cursor moves over the top-left area of this window, it should turn into an icon which looks like <-||-> once it's in the correct place. Now, left-click and drag your cursor all the way to the right. You should now be able to see GREETING.

... There. I just saved all the Windows 8 owners at least an hour of frustrating Google searches! hehe.gif

Unfortunately, you'll need to repeat this process over and over again, in order to see text in various windows and boxes. Annoying, but at least possible. The Info and Response Text windows (where we start and type dialog) do not have this problem though, so we won't have to drag anything to start and type some dialog.


8b). Make some sort of GREETING. "What do you want, punk?" or whatever. All of this is done in exactly the same manner as in the CS.

8c). Right-click > New into the Conditions window. Make a GetIsID for your NPC. This is the only condition that's needed.

Again this window will be grayed-out if you've got something from the Windows 8 series (necessitating another drag from left to right), but visible if you've got anything earlier.


8d). Right-click > Add Topic into the Add Topic box, and make a unique topic which deals with vendoring. aaaVendorTopic is an example.

8e). Also add this topic in the tall, vertical window where GREETING is.

Windows 8 users: if you haven't closed the Quest window, you should still be able to see into all the smaller windows. Once you click OK though, you'll need to click & drag again, once you get back in to add things to your quest.


8f). This vendor topic will be whatever we say to get the vendor experience going. Right-click > New into the Info window, and type something our NPC will say. "Sure, I have lots of things to sell. What would you like?" Click OK, and then type something into the Topic Text slot up top. "What do you got?" or whatever. Again, all this is the same from CS to GECK.

8g). Don't forget to copy/paste the GetIsID from GREETING to the vendor topic.

8h). Look to the bottom of the Topics page now. In the Result Script (End) box, type ShowBarterMenu


9a). Conversation tab
In the tall, vertical window (which again, will be grayed-out if you've got Windows 8), right-click > Add Topic, and look for GOODBYE.

The Topic Text which Bethesda added for GOODBYE is "See ya," I think, and it's best to leave it this way. We don't have to add anything further here, no Conditions, no nothing, unless we want our NPC to say something we specifically have added.* If so, just follow all the normal steps with Response Text and Conditions (GetIsId, for instance). Otherwise, the NPC will simply give us a random Bethesda Goodbye when we break conversation.

9b). Make sure the Goodbye and Random toggles are checked on. They should be, by default.

*Note: Sometimes I have encountered glitches when trying to add specific dialog, causing the GECK to not save anything I type. If this happens, make sure there aren't any deleted Topics in either the Topics or Conversations tabs. If there are, press OK, closing out the Quest panel. Save the work done so far, close the GECK, and re-open it. Those deleted topics should be gone, now.


10). CELL window
Make sure "Interiors" is selected in the World Space scroll-bar, and find VendorChestCell. This contains all the possible chest-types in the game. Leave the Render window for this cell open,.


11). OBJECT window > World Objects > Container.

Find VendorChestBuriedClutter and drag this chest into the Render window. It apparently does not matter where this chest ends up (there is no floor) but try to put it somewhere that you can find it easily, if you need to return to this cell for some reason. Set this chest obviously off to the side if you have to, away from all the others.


12a). REFERENCE window.
Double left-click on the chest you just dragged. Click the Edit Base button. Give this chest its own ID (starting with aaa if you want it to show at the top of the list later on) and close its panel by clicking OK, saving the chest as a new form. We do not need to give it a Name, but make sure "Respawns" stays toggled on, otherwise the vendor will eventually run out of salable stuff!

12b). Go back into the chest now, and add whatever we want into its Item List. By default, this chest will have random medical stuff, and "VendorChestCapsSmall," which is going to give this vendor a variable amount of caps to buy stuff with. We probably want to add more stuff in here though, right? Right-click > New into the Item List

Some good things to add in here (if we want inventory to stay as random as possible) are VendorMiscItems, VendorWeaponsAllCommon, VendorAmmoBullets, and VendorArmorCommon. Since my NPC is a lowlife chem dealer, I just chose VendorChestChems.

12c). If we want our vendor to have a larger amount of caps to buy with, we can leave the VendorChestCapsSmall in there for the variable amount of money, but then we can a fixed amount of caps to their Item List as well. There are several choices here. Caps001 is good if we want them to have one guaranteed cap at all times, Caps90 if we want them to have a guaranteed 90 caps at all times, and so on.

We can simply choose Caps001, and then in the Count slot, we can add as much to this as we want. Type 200 in there if you want your vendor to have 200 guaranteed caps, plus whatever random amount VendorChestCapsSmall will also add.

12d). Click OK. Make sure Persistent Reference is clicked ON before clicking OK on the chest's Reference panel. Having this toggled on allows the game's engine to access this chest when we're speaking to our vendor. We do not need to give our vendor chest a Reference ID, though.


13). CELL / RENDER windows
Place the NPC vendor in the world, unless he/she is already out there.*

Tip: *Since your Render window will probably still be in the VendorChestCell, a quick way to get back to your NPC is to find him /her in the Object window, right/click on him/her, and choose Use Info. A panel will pop up with two windows. Double left-click on the text in the bottom window (where it says Interior). It can take up to a minute for the GECK to locate your NPC, but still, this process is easier than always remembering which cell you've put the NPC into.


14). Double-left click your vendor, so the Reference panel pops up. Select the Merchant Container tab. In the Cell scroll-bar, find the VendorChestCell. In the Reference scroll-bar, find the chest you just made. If you put "aaa" at the front of its ID name, yours should be at the very top of the list.


15). Click OK. And there you go.

Now, if we want this NPC to also repair stuff,..


16). QUEST window
Follow all the steps from 8d through 8g, to add dialog, conditions, and such. For step 8d, make a new topic which deals with repairing stuff. Make sure this topic links from the initial NPC's GREETING. So in that Greeting's Add Topics box, you'll now be seeing something like..

aaaRepairTopic
aaaVendorTopic


Now add some dialog into the repair topic. "I can fix whatever you break."


17). The main difference here is in the repair topic's Result Script (End) box, we're going to type ShowRepairMenu.


18). The NPC probably has a low Repair skill by default. If we want this NPC to be really good at repairing stuff, open up his/her information and select the Stats tab. Make sure Auto-calc stats and PC Level Mult are NOT chosen.


19). Click on the Repair skill (so it is highlighted) and press F2 on your keyboard. Now we can make this skill as low or high as we want, by adding some number, and then left-click on Repair to set this number. This number gets added to the NPC's base number. If the NPC's base Repair skill is 20 for instance, and we offset this by 60, their total skill will wind up as 80.

That is all. Close the GECK, save all your work, make yourself a copy of your .esp.

Posted by: Renee Mar 25 2018, 05:20 PM

How to fix "Missing flowchartx32.dll" file. Game: TES V: Skyrim

I was going to post another modding tutorial, except this past weekend I ran into a problem with Skyrim's Creation Kit, and wrote the solution all up with a pretty bow upon it, for any others who can possibly have this problem. So here it is. Missing flowchartx32.dll is one of those things which is pretty obscure, and normally you wouldn't ever have to worry about. Until you do have to worry about it. Then it can occupy ALL of your time trying to find a fix. panic.gif

The solution to this problem was found on https://forums.nexusmods.com/index.php?/topic/560134-could-not-get-flow-chart-class-object/ Note that some folks claimed success using methods found https://forums.nexusmods.com/index.php?/topic/555636-missing-flowchartxdll-creation-kit-error/, going into their PC's Safe Mode. Those solutions did not work for me, however. sad.gif

Basically, the problem is this. When using the Creation Kit, if an error message shows up saying something about a "missing flowchartX32.dll file," especially when trying to use the Dialogue Views tab to write dialog for quests, here is what to do.

Oh, and I have Windows 8.1 on my gaming computer, but this seems to have worked for those who have earlier operating systems.

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

1). Go to the folder where "flowchartX32.dll" is, or should be. This is the same folder where the Skyrim.exe lives. Obviously if you're not seeing this file in your Skyrim folder, you'll need to get it in there pronto, maybe locating it through a google search, perhaps. But if the file is there, yet you're still having this problem, continue onwards to step 2.

2). Right-click into the folder path bar, and select "Copy address as text." (I think those with earlier OS's can simply copy the text found in this bar).

Close the Skyrim folder.

3). Open up any Notepad page, and paste the folder path you just copied, onto this Notepad page so you can see what it looks like. On my gaming computer, the path looks like this...

C:\Modded Skyrim\SteamApps\common\Skyrim

4). For Windows 8 users, swipe the right side of the screen (Windows 7 or earlier can use their Start button). Now in the Search bar, type cmd.

5). An icon saying "Command Prompt" will show up. Right-click on this, and left-click Run as Administrator. A simple box with white-on-black text pops up. It'll have syntax saying C:\windows\system32> or something similar.

6). Type in the following: the letters cd, and then paste the path to your Skyrim folder after cd, by right-clicking the window icon in the top left corner. That should drop down a window menu that includes "Edit," which will have a sub-menu for copy, paste, etc. If there is no icon, the whole title bar may work in later versions.

So altogether, this is what I was seeing in total.

C:\windows\system32> cd C:\Modded Skyrim\SteamApps\common\Skyrim


7). Press Enter (or Return) on your keyboard. If there are any errors, the program will tell you right away. Hopefully there aren't any errors, though, and you'll be seeing this....

C:\Modded Skyrim\SteamApps\common\Skyrim>

8). Now type regsvr32 flowchartx32.dll after the text above...here is what it looked like for me:

C:\Modded Skyrim\SteamApps\common\Skyrim> regsvr32 flowchartx32.dll


9). Press Enter. Hopefully, a small panel will pop up saying "DllRegisterServer in flowchartx32.dll succeeded," or something similar. As long as a word like "succeeded" shows up, instead of something indicating "errors" are present, you're on the right track.

10). Click OK. Close the Command Prompt window.

Start up the Creation Kit. Problem should be solved.

I have heard that this problem has something to do with turning the Start Game Enabled toggle on and off too many times during the same quest, and saving the quest into its corresponding mod with this toggled turned on and off. I have not confirmed this to be true, though.

Posted by: ghastley Mar 26 2018, 03:06 PM

FWIW, you CAN paste into the command prompt window. At least up to Win 7, it works this way:

Right click the window icon in the top left corner. That should drop down a window menu that includes "Edit" which will have a sub-menu for copy, paste, etc. If there is no icon, the whole title bar may work in later versions.

Shortcuts like Ctrl+V won't work. Those key strokes will just get entered where you're typing. However, there is an option to change that, accessible the same way, in the Properties sub-menu. Of course, that then prevents you from entering those key sequences as data.

Posted by: Renee Mar 29 2018, 05:18 PM

Okay thanks, ghastley. I'll see if this works with Windows 8, because you are right, ctrl + v doesn't work.

Posted by: Renee Mar 31 2018, 11:36 PM

How to make a Fetch Quest (with multiple items). Game: Fallout 3

This is going to be another fetch quest, but this time it'll be directed at Fallout 3, rather than Oblivion. Since there are lots of similarities between the Construction Set (CS) and the GECK, there isn't much point in writing a pure fetch-style quest twice. So, in this tutorial I'll be talking about fetching multiple items rather than just one. I'll also try to illuminate any differences between CS and GECK that we come across, okay?

A lot of the things in this post can be used for the CS as well. So if you make a quest which fetches multiple items in the CS, you should be able to follow most of the steps here.


One way to fetch multiple items is to use "ItemCount," which is a variable often used when multiple items are involved. So today you'll be getting your first lesson in variables, perhaps. smile.gif ItemCount, and other variables such as Dead or Timer, can be used to do all sorts of things. Today we are going to be using ItemCount to make our fetch quest bump forward while using a non-linear approach, and also generic (rather than referenced) items. In other words, say we've got three baseballs to find during a quest. We won't have to find these balls in any strict order if we use ItemCount, which frees the Player from following a strict path.

The items also won't need to be "special" (in the sense that they won't need reference IDs), but they will all need to share the same Object Script. So it'll be like picking up three generic baseballs, rather than one baseball specifically referenced (possibly owned) by Three Dog, another specific to Moira Brown, etc.

This lesson assumes you've already studied some of the steps, tips, and notes found in other lessons above, just so I don't repeat myself too much, and save some space. smile.gif It also assumes the GECK is already opened, and you've got a mod you're already working with, or at least an idea for a mod.

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

1). OBJECT window
Go to Actor Data > Quest. Single left-click on Quest, and all the quests appear in the right window. Right-click > New into this window. Start a new quest.

2a). QUEST DATA
Give your quest a Name, an ID, and Priority of 55. "Start Game Enabled" and "Script Processing Delay" can both be toggled on.

2b). Open up the Script button, which (again) is the button which looks like [...], and type in the following...
---------------
scriptname aaaFetchQuestScript

short ItemCount


-----------
Substitute the words 'FetchQuest' with the name of your quest if you'd like, but the syntax I'll be using today will be "scriptname aaaFetchQuestScript."

We're going to add to that script in a minute, but for now...

2c). Save the script as a Quest in the Script Type scroll-bar. Click OK so the Quest window closes. Save your progress, and then reopen your quest. Make sure your script is in the scroll-bar.

I am going to make this fetch quest a lot more basic than the Oblivion one up above, to save time and space, so I won't go into as much detail about how to create an NPC, how to use the Render window, etc. Study the Vendor NPC post up above, if you need to backtrack.



3a). OBJECT window
You'll need to make an NPC, unless you already made that vendor from the last tutorial, and want to reuse him or her. If this is so, you can use this guy/gal again, and he/she can be today's fetch quest-giver.

If you do it this way, you'll need to change the Priority of your fetch quest to 60 instead of 55, so the game recognizes that your fetch quest needs to get done before the vendor quest's dialog (especially Greetings) kick in again. If your NPC is totally new though, you won't have to change this.

I am going to be using the same low-life chem dealer I put into Moriarty's Saloon. This guy will be the one who wants my character to fetch three stacks of Pre-War Money, and bring them back to him. When he gets his three stacks, he will then give my character some caps, and the game will reward some XP. Ka-ching!, in other words. cool.gif

From here on, you can use PreWarMoney like I am, or you can edit your own item from Bethesda's Object window. PreWarMoney can be found in the Object window > Items > Misc Items > Clutter > PreWarMoney.

3b). Edit PreWarMoney (or whatever item you're going to want fetched), and give it a new ID, saving this item as a New Form.

Note: It is possible to attach scripts to stuff Bethesda has already made without saving these items as New Forms, but it's just better to make our own ID. This way, our script won't wind up getting attached to every generic Pre-War Money stack (or whatever generic item you're fetching) in the game. Try to keep your own material clean from Beth's, if possible.


3c). Now to write that script. Or start it, at least. Open up your item-to-fetch, click on its [...] button, and type in the following.

----------------------------
scriptname aaaItemScript

short ItemCount

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

You can substitute whatever words you'd like where "Item" is. aaaBaseballScript or aaaPencilScript. Whatever. In my game, the scriptname is aaaPreWarMoneyScript.

3d). Close the script, save it, and click OK, closing your item's panel.

3e). Now, reopen your item, and look for your script in the scroll-bar. Select this script, and press OK.


4a). CELL + RENDER windows
Place the item and NPC into any cell(s) you like. For convenience, I'm keeping my NPC in MegatonMoriartysSaloon, and placing my stack of edited Pre-War Money into MegatonMensRestroom. My current character is male, you see. Not many NPCs go in restrooms (why should they?), so the money won't get kicked around, yet this cell happens to be a public place, meaning that my character won't have to steal anything. wink.gif

4b). Single left-click on the item in the Render window, and duplicate it (ctrl + D). Now you've got two items, though they're probably sitting in the same space. Drag one of these away from the original, and duplicate it again, so that there are three in total.

If you are putting items into multiple cells, obviously you won't be duplicating. Ctrl + D is a little trick which only works if each item is in the same cell.


Note: if your fetchable items are different from one another, for instance if you've got multiple items, each with its own ID name, this is okay. As long as the same script gets used for all of these, and that script can also be attached to the item, everything should work.

Some items can't have scripts attached directly to them though. Holotapes are an example. For these items, Reference IDs will need to be used, and then the main script can handle collection of these items. That's for another tutorial, though.


5). OBJECT window
Go back to Actor Data and find your quest. Click on the Quest Stages tab. Put seven stages into the Index. I am using the stages 0, 5, 10, 30, 40, 50, and 100.


6a). Topics tab
Right-click > New into the Editor ID window (Windows 8 users: this is the tall vertical window which doesn't have a name). Find and select GREETING.

6b). Make a greeting which the NPC will start with. "Yo, you got a moment?" is what my chem-dealer will say.

6c). Conditions window: make a GetIsID for your NPC, and GetStage Quest: 'aaaFetchQuest' < 5.

6d). In the Result Script (End) box, type Player.SetStage aaaFetchQuest 5

6e). In the Add Topics box, add whatever unique topic name you'd like. For me, this is going to be aaaFetchTopic.

6f). Right-click > New into the Editor ID window, find your unique topic, and click OK.

6g): Highlight the topic you just created, and add some dialog which the NPC will say. "So I gots these three stacks of bills hidden in the men's restroom... and I needs somebody to go get them for me," is what my chem dealer will say. "I can't go in there myself, 'cause I don't want the sheriff to see me goin' in there."

a). One of the differences between the CS and GECK is we can make NPCs move around in specific ways as they speak to us. Before you click OK, click on the Use Emoticon Animation toggle instead, so that it is off.

b). In the Speaker scroll-bar, look for any animation which seems like it'd be appropriate for the moment. There's a HUGE list in this scroll-bar, and not all animations will work (a animation for an ant or a brahmin, for instance, will not work on a human).

But for instance, I am choosing 3rdP1HPShrugs, which will cause my chem-dealer guy to look as though he's trying to be nonchalant.



Now.... another one of the differences between the Oblivion Construction Set and the Fallout 3 GECK is we can either use the Topic Text slot to move dialog forward, or we can use the Prompt slot, which is right below the Info window. Basically, you can use just one Topic for your entire quest, along with that initial GREETING. Instead of potentially making dozens of new topics, you can instead use the Prompt slot to introduce new dialog for us to click on, once we're back in-game.

I hope that made sense. laugh.gif It will eventually, if it doesn't at the moment. Basically, the Prompt slot will save us from having to create a bunch of different Topics.


6h). So I am going to leave Topic Text as "aaaFetchTopic," but I'm going to change Prompt to "What is it? I'm not interested in any of your junk."

6i). Go back to the GREETING's Conditions window, and Copy All Conditions found there. Now go to your unique fetch topic, and Paste these conditions in there, changing GetStage 'aaaFetchQuest' < 5 to GetStage 'aaaFetchQuest' == 5.

Also, type player.SetStage aaaFetchQuest 10 into the Result Script (End) box.

6j). Toggle Say Once on, unless you want the option to have your NPC repeat the same "Go fetch these items" over and over during Stage 5. (Edit: actually, ignore this, since the setstage causes dialog to move forward, Say Once won't be needed. If the same stage is kept though, Say Once can be used if we don't want dialog to keep repeating/the same Prompt or Topic Text to keep being shown.)

6g). Click OK, closing the quest window. Save, and reopen your quest.


7). QUEST window > Quest Stages tab
Notice I am sort of dancing back and forth between Quest Stages and Topics this time, rather than writing up all the Stages, and then writing all the Topics as I did in earlier lessons. I usually dance back and forth like this as I write quests; and once you get good at writing your own, you won't need to follow any strict sort of path yourself.

Anyway, here is what our quest stages are going to look like.

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

Stage 0: Right-click > New into the top Log Entry window, and move on. It'll say EMPTY in there. Just leave it like that.

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

Stage 5: Right-click > New into the top Log Entry box, but this time, type whatever you want into the lower Log Entry box.

Note: Unlike the Oblivion CS, the GECK does not use Log Entry Info when quests get bumped. Instead, the GECK uses Quest Objectives for our in-game quest messages. So, whatever you type into the Log Entry box will be strictly for your own reference, and will NOT appear in the game. Therefore, you don't really need to type anything into Log Entry. It helps to add something in there though, just to keep things organized for your own purposes. Just imagine that you've got dozens of stages, and begin to forget what their significances are as you add more!

Anyway, by now the NPC has greeted our character, but has not told him/her what needs to be done yet. You can simply type "NPC has greeted the PC" into Log Entry.

----------------------------------
Stage 10: Right-click > New into the top Log Entry box again. For your own reference, you can type "NPC tells PC about some items that need to be found, and brought back."

In the Result Script box, type SetObjectiveDisplayed aaaFetchQuest 10 1. This command is what will cause one of those creepy messages to appear onscreen, once we've reached this stage in the game. The number "1" at the end is very important; it is what tells the game to flash that message on. Easy to forget that final "1", and then get an error message. rolleyes.gif I've done this soooo many times, folks. panic.gif

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

Stages 30 and 40: These two stages are optional, so far as in-game messages go. When the Player finds the first stack of money, the quest bumps from 10 to 30. When he/she finds the second stack, it goes from 30 to 40. Each stage will have its own corresponding message in my game from the Quest Objectives tab, but if you find all these messages distracting you don't absolutely need to add them.

I will simply teach you the most important messages in a moment, which are 10 and 50. If you want to add more on your own, this is certainly possible.

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

Stage 50: Under Log Entry you can type "All items found" into the lower Log Entry box.

Result Script will be....

SetObjectiveCompleted aaaFetchQuest 10 1

SetObjectiveDisplayed aaaFetchQuest 50 1


... and these will cause the game to say the message from Stage 10 has been completed, while the message from 50 has just been assigned to us. We have not created these messages yet, but we will.

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

Stage 100: "Items brought back to NPC" can go under Log Entry. And make sure to toggle Complete Quest on.

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

8a
). Quest Objectives tab
We're going to type those creepy in-game messages now. Right-click > New into the top window, which is called Objective Index.

8b). Change the number in the Index slot from 0 to 10.

8c). Type whatever you'd like into the Display Text slot. This is what we're going to see flash across the screen, after the NPC tells us of the items he/she wants fetched. So I'm going to type "Find three stacks of Pre-War Money" into this slot, and you can substitute your own material here.

8d). Follow the same steps for the objective which will appear for Stage 50. So during Stage 50, "Find three stacks of Pre-War Money" will show up as COMPLETED in my game, and then my character will get assigned its next mission, which (for me) will be "Return to Chem Dealer in Moriarty's Saloon for reward."

Note: Working in the Quest Objectives tab can be notoriously slow as you move from window to window. Just be patient!


9).
Quest Data tab
Time to flesh out the rest of the quest's main script, heh heh. Open it up, and here is what it'll look like in my game ...

scriptname aaaFetchQuestScript

short ItemCount

Begin GameMode

If (aaaFetchQuest.ItemCount == 1)
SetStage aaaFetchQuest 30
EndIf

If (aaaFetchQuest.ItemCount == 2)
SetStage aaaFetchQuest 40
EndIf

If (aaaFetchQuest.ItemCount == 3)
SetStage aaaFetchQuest 50
EndIf

End


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

Not so bad, eh? The quest will bump with each item we find now. However, the game's engine also needs to be able to "see" whenever we pick up one of these items, at the very moment we pick it up.


10). OBJECT window
Find the object you edited earlier. And here is what goes into its script. Again, you can substitute your own words where I currently put aaaFetchQuestScript, if you haven't already done so.

scriptname aaaFetchQuestScript

short ItemCount

Begin OnAdd

If (Player.GetStage aaaFetchQuest == 10)
If (aaaFetchQuest.ItemCount < 1)
Set aaaFetchQuest.ItemCount to 1
SetQuestObject aaaObjectName 1
EndIf
EndIf


If (Player.GetStage aaaFetchQuest == 30)
If (aaaFetchQuest.ItemCount == 1)
Set aaaFetchQuest.ItemCount to 2
EndIf
EndIf


If (Player.GetStage aaaFetchQuest == 40)
If (aaaFetchQuest.ItemCount == 2)
Set aaaFetchQuest.ItemCount to 3
EndIf
EndIf

End

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

Tip: Note in that first If/EndIf block I typed in SetQuestObject aaaObjectName 1. Substitute your own item's name where it says aaaObjectName. What this does is makes your mundane item into a Quest Object, which prevents the player from simply dropping this item twice, and picking it up two more times to bump the quest forward. Although you might not cheat in this manner, this trick will prevent anybody who uses your mod in the future from doing so, and then claiming that your fetch mod is "broken." rolleyes.gif

You can also change the status of a Quest Object back to zero by typing SetQuestObject aaaObjectName -1 anywhere that a Result Script box appears in the GECK.


11a). QUEST window > Topics tab
Open up your quest again, and find GREETING. Add the greeting which the NPC says when we return. "Have you got my things yet?" or whatever. Conditions are....

GetStage aaaFetchQuest == 50 AND
GetIsID aaaNPCName == 1


11b). Click on the topic you created earlier. For me, this was aaaFetchTopic. Make some dialog the NPC will say. "Oh hell yes, you got my things! Here is your reward."

11c). Put something appropriate in the Prompt slot. "I have returned with your things.... bla bla..." Again, this is what your character will say (what you'll click on), once you're back in-game.

11d
). Copy All Conditions from the Stage 50 greeting, and Paste them into your fetch topic.

11e). Result Script (End) should have Player.SetStage aaaFetchQuest 100, and toggle Goodbye on if you'd like the NPC to dismiss your character, without having to click on that awkward "Goodbye" option.


12). Quest Stages tab
Go to your final stage, which is 100 (unless you chose some other number). Make sure Complete Quest is toggled on. And here is what'll go in the Result Script box...

SetObjectiveCompleted aaaFetchQuest 50 1

Player.RemoveItem aaaFetchObject X

Player.AddItem Caps001 X

RewardXP X

StopQuest aaaFetchQuest


Where it says aaaFetchObject, put the ID name of your fetchable object. Where it says X, you can substitute your own numbers. So in my game, 3 Pre-War Bills being removed, 50 caps are given to my character, and just 5 XP are awarded for him, since he didn't have to work very hard at this one. wink.gif


13). There you go. Save your work, close the GECK, and always make sure you make an immediate copy of your .esp, or overwrite one already in your backup folder.

Posted by: Renee Apr 3 2018, 02:56 PM

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.

Posted by: ghastley Apr 10 2018, 07:33 PM

At some time in the past I did a tutorial on how to create the conversations between NPC's, which I'd just done for the staff of Gweden. I have all the screenshots of the Construction Set dialogs, but can't track down the text. I'm frantically Googling, trying to see where I might have posted it before. If it turns up, I'll copy it here.

Posted by: Renee Apr 10 2018, 08:15 PM

That'd be great. smile.gif

Posted by: Renee Apr 24 2018, 12:19 AM

Making a weather-changing item. Game: TES IV: Oblivion.

This is going to be a shortie.

I had this idea for Sarah Phimm's game a bunch of months ago to make an item which would change weather, just like that, if she equipped this item. She is a vampire, and as we all know, when vampires get stuck outside in sunlight, things really start to suck for them. But, if the weather is "bad", if it is rainy for instance, vampires won't take the full effect of sun-damage they'd take on a sunny day.

So that was the idea. To make an item for my vampire character, so that if she happened to get caught outside when the sun was coming up, and had nowhere to run & hide, she'd at least be able to equip this magical item. This would keep things very roleplay-ish, without needing to play Weather God with the console.

This magic item was incredibly easy to create. I assumed I'd need to delve into magic scripting, something which I still have not learned yet. But such was not the case. Actually, getting this idea to work was merely as easy as retrieving a console code, and then attaching it to that item via script.


1). Open Construction Set, bla bla...

2). OBJECT window
First, choose an ordinary, non-enchanted piece of jewelry, or any item which is wearable, and not already enchanted. Although I chose an amulet for Sarah's game, this effect should work with any piece of jewelry, clothing, armor, etc.

But since I chose an amulet ...

Items > Clothing > Amulet.

Find any of the non-enchanted amulets, such as JewelryAmulet6Jeweled, right-click and edit this with a new ID and new name.

3). Make sure the item is Playable (duh). And also, make sure it hasn't already got a script attached to it. If it does, get rid of this script, so you can write your own.

4). Click OK, saving as a New Form. Find and reopen the new item.

5). Tap on the script button, which is the one which looks like [...], and then Script > New Script. And check out this incredibly advanced bit of coding, yo.

scriptname aaaItemScript

Begin OnEquip

If Player.IsInInterior == 0

fw 38eef

EndIf

End


"Item Script" can be whatever name you choose. ... and that's it! Note that the weather code there is for fog, and it's the same exact code that we'd use for console commands. "fw" = "force weather," and 38eef is what Bethesda chose for fog in the vanilla game. This code will still work if you've got All Natural installed in your game though.

We can choose any weather codes found on http://en.m.uesp.net/wiki/Oblivion:Console_Command_Tutorial, So to change this to sun, substitute 38eef with 38eee. Rain is 38ef2, and so on.

6). Close Construction Set and bla bla bla...

Posted by: Renee May 13 2018, 07:53 PM

Faction-changing Armor and Clothing

Game: Fallout 3 or Oblivion

Good evening. This one is going to focus on making faction changes, which are caused by simply putting on some clothes or armor. This will work best when changing outfits just before going from one cell to another, and is much more RP-friendly than using console commands. wink.gif

I got this to work in Fallout 3 last summer, in Janet Telia's game. I was able to get her into a faction which was compatible with the RaiderFaction by having her put on some specialized raider armor, waiting an hour, and then entering a cell full of raiders. Once inside that cell, these enemies were now her friends. The entire faction of raiders remained friendly to her from that point on, all across the Wasteland, as long as she was wearing her special armor.

This works also in Oblivion, but a few things are done different in this earlier game.


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

1).Open up the GECK, bla bla... First thing we're going to do is to make a customized faction.

1a). MAIN toolbar > Characters > Faction
Go ahead and make a custom faction by right-clicking > New into the Editor ID window. I called Janet's special faction aaaRaiderFaction, though you can call yours whatever you'd like.


NOTE: If modding Fallout 3 DO NOT just use one of Bethesda's factions (such as RaiderFaction). It is better to make a custom faction, rather than adding the PC to one of the game's premade factions. Before I figured this out, I was using the Bethesda raider faction. When Janet put on her raider-faction armor, she was accepted by raiders just fine. Problem was, she could not 'break' out of this faction just by removing her armor. Even if she shot somebody, they would continue to be her friend. dry.gif Maybe this is a 'friendly fire' sort of function, so that if one raider shoots another, he/she won't just turn around and begin fighting this other raider, when they should be coming after us.

With a custom faction, the results worked just as I wanted them to. smile.gif There were some limits though, and these limits will be discussed toward the bottom-third of this post.

NOTE:: IF making a faction-changing apparel item for Oblivion don't use a custom faction. Instead use one of the game's ordinary factions such as BanditFaction. Maybe there's a way to make custom factions work but the game seems more hardcoded to only accept the vanilla factions.


1b). Give this faction a Name. You can toggle Evil on if you want to, which will temporarily influence how Karma works.

1c). Right-click > New into the Interfaction Relations window, and use the Opposing/Affiliated scroll-bar to find the faction you want to modify toward your character's custom faction.

1d). Let's say RaiderFaction got chosen during step 1c. For best results, make the Disposition Modifier 100, with Group Combat Reactions toggled to Ally.

Experiments can be tried with numbers lower than 100, and 'Friend' or 'Neutral' can also be chosen instead of Ally, if you want to make this faction-change happen with more of a question mark.


1e). Click OK (closing the Factions panel) and SAVE.


2a). OBJECT window
Go into Items. Edit an outfit (a piece of clothing or armor), and give it a unique ID. Make sure this item hasn't got a script attached. If it does, set this to NONE. Click OK. When asked if we want to save this under a new ID? Click Yes.

2b). The Script Type scroll-bar can stay as Object. Here is what to write.


scriptname aaaFactionChangingArmorScript

Begin OnEquip Player

End

Begin OnUnequip Player

End


Close/save that, click OK (closing the Armor panel). Reopen the new armor, find the script just wrote in the Script scroll-bar. Click OK again, SAVE, and reopen again. Here is the rest of the script.

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

scriptname aaaFactionChangingArmorScript

Begin OnEquip Player

Player.SetFactionRank aaaFaction 1

End

Begin OnUnequip Player
Player.SetFactionRank aaaFaction -1

End


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

Where it says "aaaFaction", substitute this term with the name of your actual custom faction. So for me, I'm typing aaaRaiderFaction where it says aaaFaction.

And here's one final trick which is optional. It it possible to put messages into the game as well. This is for our information only, and is a way to make sure the mod's working. Some may find it immersion-breaking.

** Adding a message into Oblivion is easy. Simply type Message "Type message content here", X into either of the script's Begin and End blocks. X = the number of seconds the message will stay onscreen for. So if I type

Begin OnEquip Player
Player.SetFactionRank aaaFaction 1

Message "I am now a bandit", 10

End


This will cause a message to flash onscreen for 10 seconds which says "I am now a bandit". For Fallout 3 or NV the process requires more steps.




Object window > Miscellaneous > Message
3a). Right-click > New into the window.

3b). For ID, I am calling it aaaRaiderArmorEquipMessage. Copy that name and paste it on a Notepad file.

Give the message a name. Use the Icon scroll-bar to add an image to the message (although sometimes, the icon doesn't work in-game).

3c). Turn Message Box off, and change the Display Time slot from 2 to whatever. I find that 2 seconds aren't long enough sometimes for the message to sink in. smile.gif

3d). Message can be whatever is desired. In my game it says "Yo, checkit! I am now part of the Raider Faction, beeyatch!"

Ahem. Click OK.

3e). Return to the armor script, and add ShowMessage aaaMessage somewhere between the OnEquip and End functions, with 'aaaMessage' being the name of the message created during step 3b. A second message can be added which denotes our character moving out of the faction.

So in my game, in total, it says


scriptname aaaFactionChangingArmorScript

Begin OnEquip Player

Player.SetFactionRank aaaFaction 1

ShowMessage aaaRaiderArmorEquipMessage

End

Begin OnUnequip Player

Player.SetFactionRank aaaFaction -1

ShowMessage aaaRaiderArmorUnEquipMessage

End



There it is. 😶 This script will make sure the player-character gets added and removed from whatever faction desired, in a never-ending loop. However, there are limitations to this.

-- Make sure your character changes clothes in a cell which is separate from any enemies. Once this is done it's best to wait an hour (press the wait button), and then enter the cell which is being influenced. Over time I've gotten lazy here and there, forgotten to wait for instance, and everything might still work fine. But to make this work 100% it's best to follow that sequence. The faction-changing effect works best this way. Plus, it's more realistic that a bunch of enemies won't change their hostile minds, simply because they witness our toon changing into some outfit!

Edit 2022: I have recently discovered that we don't always need to be in a separate cell for this to work, however it helps if NPCs (if they are supposed to be hostile) don't see our character at the time of the armor/clothing change.

--I tried entering the raider-infested grocery store (the store next to Gold Ribbon Grocery, with all those raiders inside), for instance. Janet entered this store wearing ordinary clothes. The raiders inside were hostile. Then, I had her leave the building, changing into her special Faction Armor. Back inside, the raiders were now friendly. Back outside, change of clothes again, now they're hostile again.

However, after doing this several times, they eventually defaulted to friendly no matter what she was wearing.

...Of course, nobody would do any of this in the game. It's silly to change back and forth like this as we're actually playing. We only need to change into the outfit once before we enter their territory, and maybe change back out of it once, if we're going back into ordinary civilization again. I'm just highlighting that there are some limits, here. These limits won't be found though, until the gamer is doing some heavy experimentation. ph34r.gif


--To break her friends-only status, I tried having her attack a raider. He ignored her attack at first, but eventually fought back. Once this moment was crossed, this guy was now NOT her friend anymore, and attacked every time, even if she ran outside and changed clothes from and to the Faction armor. Thing is, only that one raider attacked her. The others were still friendly to Janet.

Bottom line though: when just playing the game normally, change the character's outfit once, wait an hour, and then enter a cell with enemies in it, everything should work. Later, if the outfit gets removed, maybe your character's going back to Megaton or Rivet City (wearing outlaw armor wouldn't be appropriate) all of that should work too.

Posted by: Renee May 29 2018, 01:25 AM

Making an NPC Follower Game: Fallout 3

Note: this method will work for Oblivion too, however, I also had some unsolvable problems with my OB followers. So for now, this only pertains to FO3. Oblivion has CM Partners, as well as Companion Share & Recruit. Both of these mods are so well done, it's almost pointless to try and top them.

Personally though, I've been dissatisfied with the follower mods I've seen in Fallout so far. Maybe that's why I decided to learn how to make my own.

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

1). Start up the Fallout 3 GECK, yadd yadda....

2). OBJECT window > Actors > NPC
Make a new NPC. Place him or her into the world somewhere. Do the usual: ID, Name, Race, and don't forget to give him or her a Voice Type. Once he or she is in the world, give him/her a Reference ID. Persistent Reference toggled on. I am calling this ID aaaFollowerRef for this lesson.

If the follower is going to be combat-oriented, choose an appropriate Class, like "SoldierScout" or "BrotherhoodKnight." Not Doctor, or Drunk.


3). Stats tab:
Change the various settings to make this NPC as you'd like, so they'll be strong, or agile, or proficient with a particular type of weapon, etc. Note that Class tends to change those Skill values around, if Auto Calc Stats is chosen.

4). Factions tab:
Putting the NPC into a particular Faction is good, but the PlayerFaction is NOT important at all. Do not put them in Player Faction, I have found it can actually cause problems.

AI Data tab
This can vary a lot of course, depending what kind of NPC follower you're going to make. A combat-oriented character (if we want him / her to live) should have Aggression set to Aggressive, Average for Confidence, and Helps Friends and Allies for Assistance. We don't want them too aggressive or confident; this can cause them to do stupid things.

Even with the settings I just suggested, they can still do stupid things. wacko.gif But those are the settings I prefer. If you'd like to know more about setting up an NPC, just http://geck.bethsoft.com/index.php?title=Category:NPC.


5). OBJECT window > Actor Data > Quest
Right-click > New into the Editor ID window. Quest Name is not important, except for your own reference. None of this will appear in-game, except NPC dialog.

Make sure Start Game Enabled is on, and Priority can be 55. Script Processing Delay can be on.


6). We're going to write a script now.... under the main script area, so make sure its type is Quest. Note that this script is ultra-short.
===========

sciptname aaaFollowerScript

short Status

; 0 = Sandbox, 1 = Follow, 2 = Wait


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

Note: The semi-colon to the left of 0 = Sandbox is there to make sure the game's engine won't read the words which come after the semi-colon. The game will not actually read anything after a semi-colon (on that particular line of text, anyway), so you can type whatever you'd like after one, for your own reference.

Save the script and close it. Click OK (closing the Quest window), save, reopen the Quest window, and find your script in the scroll-bar. Click OK again.

Now, the weird thing about followers or companions in Fallout 3 is: there are two methods which will work. Method 1 begins below. Method 1 uses AI Packages which are attached directly to the NPC's AI Packages tab, however, I have found that sometimes this method does not work 100%. One follower might follow us. Tell them to Wait, and they still follow us, for instance. So... follow steps 7a through 9c below for Method 1. Method 1 is the 'official' method taught in a few You Tube videos, okay?

If stuff is not working properly (Follow, Wait, and Sandbox, mostly) go to Method 2, which is at the bottom of this post.

7a). Go back into the NPC's AI Packages tab, right-click > New into the AI Package List window, and make a Sandbox AI, by changing the Package Type scroll-bar to Sandbox. Give the package an ID name too. I am calling it aaaFollowerSandbox for this lesson.

7b). Click on the the Wander Location button, and change it from Near Editor Location to Near Current Location. Click OK. Make Radius = 1000, or whatever number you choose. Numbers lower than 50 will cause them to wander in almost in a circle. Anything over 500 will give the follower some breadth, causing him or her to move around an entire room or two.

Basically, this Sandbox package will be used whenever we leave the follower in a situation that isn't dangerous. For RP purposes, they should be able to move around and do stuff in their time off, since they're "at ease".

7c). We can toggle as many Allowed Behaviors as we'd like. In the Flags tab, we can also leave Enable Fallout Behavior toggled on, for somebody who's got some dynamic off-time going. Or we can toggle this off, and then click whatever behaviors we'd like the follower to allow.


8a). Now make a Follow AI. Follow all the steps in 7a, except find Follow in the scroll-bar this time. I am calling it aaaFollowerFollow

8b). In the Follow Target area, choose "Specific Reference," and choose Player in the Ref scroll-bar. "Cell" is not important.

8c). "Follow Distance" can be set at 300 for close-quarter action, or much further away if we want a tail rather than a shadow.

8d). Uncheck the "EndLocation" toggle.

8e). Flags tab
We can leave Enable Fallout Behavior on (or turn this off, but choose a few individual flags, like "Reaction to Player Actions"). But make sure to also check the "Continue during Combat" toggle on. "Allow Swimming" and "Allow Falls" can also be checked on.

On the other hand, "Allow Swimming" might be bad in some cases. It really sucks seeing your follower go rushing underwater just to defeat a mirelurk. rolleyes.gif Next thing you know, your stupid follower is drowning.


Now, to make a Wait AI. "Wait here" is going to be used to make an NPC just stand in one place. This is obviously best to use once we're out in the field again. The follower won't go wandering off, and is less likely to attract danger because of this. I am naming this final AI Package aaaFollowerWait.

9a). Right-click > New into the Editor ID window again. Choose "Guard" for the Package Type.

9b). Under "Reference to Guard" leave the 'Linked Ref' toggle on. "Remain Near Guard Location" can also be on. Press the rectangular button (it should say Near Editor Location by default) and change this to Near Current Location. Guard Location Radius can be 0, for best results.

9c). Flags tab
Most of these should be off, unless we've got ourselves a chatty, undisciplined follower who doesn't stand down very well. sad.gif For best results, of course, just turn all the Fallout Behavior stuff off.


12). QUEST window > Topics tab.

We're going to make a total of four GREETINGS, and five dialog Topics. Go ahead and right-click > New a GREETING topic, as well as these five dialog topics: one to do with Following, Waiting, Trading, getting Fired, and a "Goodbye" topic.

12a). The first GREETING should literally be a 'first time' greeting, which will be what the follower says to our character when first met. "Hey, who are you?" or whatever. That's a bad example, but you can get more creative here. Make sure "Say Once" is toggled on. The only Condition will be a GetIsID, for that particular NPC.

Now, in the Add Topic window, we can link from this first GREETING to only the Follow topic.

>>> 12b). The second GREETING assumes we went ahead and got this NPC to start following us. Conditions go....

GetIsID aaaFollowerName == 1.00 AND
GetQuestVariable 'aaaFollowerQuest', Status == 1.00


... since this GREETING will be what the follower says when actively following. Dialog for this greeting can be "What's up? Why have we stopped?" or whatever.

In the Add Topics box, right-click > New, and then link this GREETING to the Wait, Trade, You're Fired!, and Goodbye topics. When the NPC is already following us, we'll be able to tell him or her to "Wait here," "Can we trade some things?" and so on.

>>> 12c). The third GREETING is going to be used when the guy has been waiting around in Guard mode (not moving, in other words). "Hey I'm bored. When are we gonna get going again?"... Copy All Conditions from the second GREETING, and paste them into the third. But we're going to change the final number to match what's in the Main Script.

GetIsID aaaFollowerName == 1.00 AND
GetQuestVariable 'aaaFollowerQuest', Status == 2.00


In the Add Topics box, add all the topics except the Wait one, since the NPC is already waiting during this greeting (duh).

>>> 12d). The fourth and final GREETING will be used once the NPC has joined us (or we've fired him or her, or he/she hasn't been rehired yet), yet still is in Sandbox mode. So the NPC will say "Want me to follow?" for this GREETING, or whatever.

GetIsID aaaFollowerName == 1.00 AND
GetQuestVariable: 'aaaFollowerQuest', Status == 0.00
, since this GREETING will be what the follower says when he or she is still sandboxing.

In the Add Topics box, only add the Follow and Goodbye topics. This way, we have the option to have the NPC follow us (breaking Sandbox mode) or simply stay there.



13a). For the NPC following topic. Give the NPC some stuff to say under Response Text ("YES, time to kick some Wasteland ass!") and add some words into the Prompt slot to make some text for us to click on, telling the NPC that we'd like him or her to start following us. "Hey, I could use your help," is fine.

Paste the same Conditions from the GREETING, but this time it will be ...

GetIsID aaaFollowerName == 1.00 AND
GetQuestVariable: 'aaaFollowerQuest', Status != 1.00


Note: != means "does not equal one."

13b). In the Result Script (End) box it should say these three things:

Set aaaFollowerQuest.Status to 1
aaaNPCFollwerRef.EVP
SetPlayerTeammate 1


Substitute "aaaNPCFollowerRef" with the actual Reference ID of your follower.

> EVP stands for EValuate Package. It is what the GECK uses to translate stuff, somehow.


*Note that final script: SetPlayerTeammate. This will make sure the follower tends to mirror the pc's behavior. So the follower will sneak if we do. He/she will draw their weapon when we do, and also use up any ammo we give him or her. Ammo which is a default part of their inventory though (from the GECK) will not decrease.


13c). In the Add Topics box, add the Wait, Trade, and Fire topics, so that even after we ask them to follow, we can change our mind, or still trade with them.


14a). Now, the Wait topic. Follow all the steps from the Follow topic, but make sure "Goodbye" is toggled on, if you want a quick exit.

14b). Paste all the same Conditions from before, but this time the quest variable will be....

GetIsID aaaFollowerName == 1.00 AND
GetQuestVariable 'aaaFollowerQuest', Status == 1.00


14c). Result Script (End) should be

Set aaaFollowerQuest.Status to 2
aaaNPCFollowerRef.EVP



15). Next is the Dismiss (or Fire) topic. Give this an appropriate Prompt ("Time for us to part ways, pard'ner...") and NPC Response Text ("WHAT? I thought we were buds! You suck!"). "Goodbye" should be checked on.

GetIsID aaaNPCFollower == 1 AND
GetQuestVariable: 'aaaFollowerQuest', Status != 0


The Result Script (End) should say

Set aaaFollowerQuest.Status to 0
aaaNPCFollowerRef.EVP
SetPlayerTeamMate 0


Note that last one, the teammate one. This will cancel any behaviors the NPC was up to before we fired him or her. So if this NPC was sneaking especially, they will go away while not sneaking. sad.gif


16a). Now, Trading topic. Do all the stuff with dialog and Prompts. Set the condition window like this to make sure he only trades while following.

GetIsID aaaFollowerName == 1.00 AND
GetQuestVariable aaaFollowerQuest.Status == 1.00


We can also set it so that he'll trade only while waiting, by changing that 1 to 2. And there's actually also a third option, as seen below...

GetQuestVariable aaaFollowerQuest Status != 0

I actually like this one the best. It allows the NPC to trade while they're following or waiting. Only when sandboxing will we not be able to trade stuff.

16b). We also have a choice of 'hearing' the NPC speak either while his/her inventory is opening, or after it opens. If we put the following in the Result Script (Begin) window, it will make them speak while we are looking at their stuff, the way some merchants speak while we're starting to browse their menus.

OpenTeamMateContainer 1

If we put this into the End box, they will say what they have to say, and then show us their inventory.

The 'Trade" topic does not need anything in the Add Topics box, so leave this box blank.


17). Finally we need a way to get out of conversations. which is the Goodbye topic. We can just make some dialog and Prompt, and choose the Goodbye toggle. We can use the same GetIsId, but we finally won't need a GetQuestVariable, so that we can say Goodbye to this NPC whether or not he /she is following.


18). Now... Priorities. In the upper right hand corner of the Topic panel is a small slot for Priority. Give this Goodbye topic a lower Priority than the others (all of which will be 50 except for GREETING, which is 55). We can give the Goodbye topic 49. What this does is it causes the NPC's topics to appear from top to bottom according to how high each Priority is. "Goodbye" will always appear toward the bottom.

That should be all. smile.gif Note that during actual gameplay, NPC followers sometimes wander off and do their own thing, when they're supposed to be following us. This happens especially when going from one cell to another: indoor to outdoor is most common. This can get frustrating! But even though there are some long pauses when it seems the NPC is nowhere around, they eventually do start following.


19A). Oops, one more thing. We can add a script to the NPC follower which makes them not only heal up, but which will also restore several of their stats, especially once combat is over. Here it is.

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

scriptname aaaNPCFollowerScript

Begin OnCombatEnd

If (GetPlayerTeammate == 1)


ResetHealth
restoreav PerceptionCondition 100
restoreav EnduranceCondition 100
restoreav LeftAttackConditino 100
restoreav RightAttackCondition 100
restoreav LeftMobilityCondition 100
restoreav RightMobilityCondition 100

EndIf
End

Begin OnDeath
Set aaaFollowerQuest.Status to 0
SetPlayerTeammate 0

EndIf
End


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

This script is especially helpful, since followers don't seem to use Stimpaks, even if we add these to their inventories. mad.gif Grrr.....

The death script at the bottom is basically a "clean up" function, which turns the entire follower quest off for that particular NPC, once he or she had died. It cancels any running background scripts to keep the game not sending or collecting any information to this dead NPC.


METHOD 2.

This portion of the tutorial will hopefully work 100%, assuming the follower(s) don't always do what they're told. Don't worry, this is easy.

20a). Remove the AI Packages (Sandbox, Follow, and Wait) from all NPC followers involved.

20b). Open up the follower quest > Topics section. Start with the topic which causes them to Sandbox. In the Result Script (End) box, remove the aaaFollowerRef.EVP part. Leave the "Set aaaFollowerQuest.Status to 0" and "SetPlayerTeammate" parts alone.

20c). Now type aaaFollowerRef.AddScriptPackage aaaFollowerSandbox and put this below the aaaFollowerQuest.Sandbox line of code.

20d). Do the same for the Follow and Wait parts of the quest.

Voila.

Posted by: Renee Jun 10 2018, 11:53 PM

Timer Scripts. Game: TES IV: Oblivion or Fallout 3

Today's post is going to be another shortie, and shall deal specifically with timers. I use timers a lot, for a bunch of different ideas, so it'll be good to have a timer standalone post.

There are a couple different types of timers Bethesda uses; daily and hourly versions. I've only figured out the daily ones. Timers can be used in all sorts of ways for scripting, for a variety of different functions. In this case, the timer script below will cause a quest stage to advance.



1). Open up the Oblivion Construction Set, or Fallout 3 GECK. File > Data.

2). Find the esp you've been working with and activate it, bla bla bla..

...Let's say a quest is already being written, and there are two quest stages. For now, I'll call them Stage X and Stage Y. Between these two stages is going to be a timer script, which triggers after Stage X begins. And Stage X begins due to some sort of event. This event can be any number of things: Maybe an NPC finishes pontificating a speech. Maybe a door gets unlocked. Maybe an enemy gets pwned. Maybe a certain calendar day gets passed. Whatever it is, the event causes Stage X to occur. Once X is happening, now the timer begins its job. The timer counts down a day, or a certain number of days. Once the timer's job is done, the quest advances from Stage X to Stage Y.

Hope that made sense. rolleyes.gif Basically the process goes: event occurs, quest bumps to Stage X, timer begins, a day (or more) passes, timer ends, quest bumps to Stage Y.

That is just one example of how a timer script can be used. And here is how to set it all up.


3). Go into your quest's Quest Data tab. Open up its main script.

And here is the script necessary to make the timer begin...

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

scriptname aaaQuestnameScript

short Timer
short StartDay

Begin GameMode

If (GetStage aaaQuestname == X)

If (Timer == 0)
Set StartDay to GameDaysPassed
SetTimer to 1

EndIf
EndIf

If (Timer == 1)
If ((GameDaysPassed - StartDay) >=1)
SetStage aaaQuestname Y
Set Timer to 0

EndIf
EndIf

End


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

Notice the "StartDay) >=1" part. The number 1 means at least one day must pass before the quest stage advances from X to Y. The number 1 can be changed to whatever you'd like though: 3... 10 .... 16 whatever you'd like. I'm sure there is some sort of limit here. Not sure what this could be though. I've gone as high as 30.

Let's say Stage X is actually Stage 30, and Stage Y is actually Stage 40. Altogether, this means an event happens which sets Stage 30 (whether an NPC gives us information, a door is opened, the death of an NPC occurs, whatever). Since the quest is at 30, this triggers the timer to begin. After a day (or more) has passed, the timer automatically moves the quest's stage to 40.

During playtesting, the timer might sometimes require more than an actual day before it does its job. We've all been there during certain Bethesda quests, right? laugh.gif We wait and wait for ... whatever the quest is supposed to do next. An example is during Oblivion's Main Quest, when Martin needs time to translate the Mysterium Xarxes. This takes several days, if I remember correctly, during which some gamers can become impatient.

I think it all depends on what hour the timer began. In-game days begin at midnight, just like they do on Earth. I haven't figured out what this means in-game though, pertaining to timer scripts. Does the timer begin counting at the very hour the event occurs? (9 pm, for instance?) or does it start at midnight, since that's the beginning of the next day? .... I haven't figured that out, yet.

To be safe, if you want 10 days to go by, and the quest must get something done within 10 days, you can use the number 9 instead of 10, in the StartDay line. Chances are, 10 days are what will pass.


4). Save the script and close it.

And that is all. As I said, timers can be used to do all sorts of things, not just triggering quest stages. The first time I used a timer, I managed to make a quest advance, but the timer also made two NPCs teleport from two outside cells, into Summitmist Manor. These two NPCs met, had a conversation full of threats and insults, and then began attacking one another.



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

And here's a timer I wrote in which time is counted in seconds, rather than days. This timer can repeat itself, too. The idea: My skooma dealer, if he makes a sale, won't immediately be able to just make another sale right away, to the same NPC or to any other NPC. He must wait 30 seconds. The idea being: we can't just spam sales to the same NPC (asking them over and over), the temptation will be there to move on to another NPC.

Making a sale (via dialog with skooma den addicts and bandits) causes the DoOnce variable to go from 0 to 1

1). Start the script like so...

scriptname TimerScript

short DoOnce
short Timer

Begin GameMode

End


2). Change Script Type from Object to Quest and save.

Close the script, press OK, closing the quest, reopen the quest and find the script in the scroll-bar. Click OK again, and reopen.

3). Here is the rest of the script.


scriptname TimerScript

short DoOnce
float Timer

Begin GameMode

If (DoOnce == 1) && (Timer < 30)
Set Timer to Timer + GetSecondsPassed

EndIf

If (DoOnce == 1) && (Timer >= 30)
Set DoOnce to 0
SetTimer to 0

Message "I should try for another sale."

EndIf

End

Posted by: Renee Jun 24 2018, 03:37 AM

Making a house for sale or rent. Game: TES IV: Oblivion

(This also works for Fallout 3, but there are enough differences between each game that Fallout will get its own post).

This one is going to explain how to make a house (or flat, or whatever sort of dwelling you'd like) into something we can not only buy, but also rent. And when we rent this space, we'll be able to make it rentable for an entire month.... or however long you'd like.

But why rent, when we can just buy?


Glad you asked. It's because in many cases (if we're keeping things somewhat realistic, as per the vanilla game's policy on housing prices), our character cannot afford the house he or she may want to buy. Not until later on, when lots of money has been accrued. Renting is cheaper, therefore we can get a place earlier. I also like the idea of having something to always spend money on. And it's just fun making this stuff up, and seeing it all work in-game.

We can create a new place to live, or we can use one which is already in the game, it doesn't matter. Here is my personal story on how the idea came about.




1a). CELL + RENDER windows
First thing to do is find the place's interior in the cell window, and then click on its Door Marker so now we're outside. Double left-click on its door. Give this door a Reference ID. I'm going to give this door a Ref ID called aaaFrontDoorRef.

1b). Click on the Lock tab too, and lock that door if it's not already locked. Or, lock that door with a tougher lock than it has. Click OK, closing the door's Reference panel.

1c). OBJECT window > Items > Key. Edit a key, save it as a New Form. If the door already has a key, this key can be used and a key won't need to be created.

1d). Reopen the door's Reference panel > Lock tab. Use the door's Key scroll-bar to find the key you just made. Again, if it already has a key, just keep using that one. Click OK.


2a). OBJECT window
Edit a named NPC. I wanted this NPC to also buy & sell stuff, so for convenience, I edited Velus Hosidius, the guy who runs the Merchants' Inn in the I.C. Market District. Since Velus is already a merchant, this will make setting him up easier. I edited his ID to aaaHouseAgent and changed his Name to Leyawiin House Agent.

Click OK, closing the NPC's panel.

2b). Place the NPC housing agent out in the world and give him or her a Reference ID. This NPC is going to be our agent who we rent the house from, or buy it from. So depending where we put him, we should alter his Faction, his AI, his Inventory, etc.

2c). Class can stay as MerchPublican, unless there's some specific reason to change it.

2d). Whoever you chose to edit, make sure to get rid of all his or her AI. If you want the agent to buy & sell stuff, you can keep any AI that has the "Offers Services" toggle on, just make sure to change the AI package's Cell Location to where the NPC has been placed. You can also add your own AI (making the agent travel or sleep or whatever) though that is optional.

2e). Get rid of any script too, by scrolling the scroll-bar up until it says NONE.

2f). Click OK and use the main tool bar to SAVE.

2g). Now, open up your NPC house agent's panel again. Start a new script. The script's Script Type will stay as Object, and the script itself is incredibly simple, compared to what Velos had.

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

scriptname aaaHouseAgentScript

short Rent


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

2h). Close and save that script. Click OK (closing the house agent's panel) and reopen it. Find the house agent's script. Click OK again. bluewizardsmile.gif And that's all for his script.

It's a good idea to leave the agent on-screen, in the Render window. Later on when conditions are being set up (as the quest is being made), the agent can be clicked upon to quickly set up some stuff that'll be gotten to in a few more steps.


3). QUEST window > Quest Data tab
Press the Q button on the main toolbar, and start a new quest. All the typical things that usually go into the Quest Data page will also be in this one. Start Game Enabled toggled on, GetIsPlayableRace == 1.00 under Quest Conditions, etc. The only difference is we don't have to set Priority very high. Matter of fact, it can be as low as 10, especially since the NPC we're dealing with won't be associated with any other quests.

4). Quest Stages tab:
A minimum of three quest stages go in the Index window. I am choosing 0, 5, and 100.

You can add more stages than this if you'd like to build some sort of story, and make this into an actual quest. But the basic build only requires three stages.


5a). Topics tab
Go ahead and give your NPC a GREETING. He / she will explain that there is a house for rental or purchase in his / her dialog. "How fares thee? My name is X, and I am the official housing agent here in X. Have you come to rent or buy a home today?"

There are three Conditions:

GetIsID aaaHouseAgent == 1.00 AND
GetStage aaaQuestName < 5.00 AND
GetScriptVariable 'aaaHouseAgentRef', Rent == 0


For the GetScriptVariable, when it asks for a reference, just click the "Select Reference in Render Window" button, and then double left-click on the agent. This'll set things up nice and quick.

.... that final Condition (the GetScriptVariable) is one I'd never used before, at the time that I made this mod. What this does is makes sure the agent ONLY says this greeting if we have not rented the place yet. Of course, this is the first time we're meeting the agent, so of course it hasn't been rented yet. But that line of code will show up several times later on, and it's got an ability to make sure certain dialog happens when the agent is spoken to, or does not happen.

Buying the place won't require this variable, because if we can afford to buy it, the entire quest simply ends. But if we rent it, the game needs to know whether or not we've already rented the place, so that the agent's dialog fits what is happening. This variable will also ensure that the game won't keep taking our money, if we accidentally try to rent after the place has already been rented. .

When we speak to this agent for the first time, this will bump the quest into a "middle" stage, which I'm calling Stage 5. This stage does not actually need a Log Entry (it's like if we rent a room from Velus, or any innkeeper; there is no need for a quest stage to appear). But it's important to make this quest move forward via SetStage. This way, we can add dialog which includes the moment that agent is first met, and also after we meet him or her. Dialog will be different in each situation, which adds some realism.

5b). So, in the Result Script add Player.SetStage aaaQuestName 5

Substitute your quest's name where it says "aaaQuestName."


6). Choices box: Add two dialog choices here: one which will lead to renting the space, another which will lead to buying it. aaaRent and aaaBuy.


7a). First, let's discuss renting. In the Editor ID, find the two Choices just added, and add them into this window as well. Now let's choose the Topic which will allow rental dialog.

7b). "How much to rent the place?" we can put under Topic Text. And give the agent a response. "It's your lucky day! The market has been down, and so we're asking for 300 gold per month," or whatever you think is appropriate.

7c). In the Conditions window, we can just copy/paste everything from the GREETING, including the Script Variable. The only difference will be the GetStage Condition, which will reflect that middle stage the quest has bumped to.

GetIsId aaaHouseAgent == 1.00 AND
GetStage aaaQuestName == 5.00 AND
GetScriptVariable 'aaaHouseAgentRef', Rent == 0


7d). Now, add two more choices in the Choices box: one which is a "Yes" response (aaaRentYes), and one which is a "No" response (aaaRentNo).

7e). Add these into the Editor ID window, and change the Topic Text for each into plain English. "Yes, I'd like to rent it", and "No, I changed my mind."


First, the aaaRentYes topic: Once we're back in-game, and at the moment when we wish to rent, there has to be some way for the game to know if the character has enough money. If the character can afford to rent it, there'll be a response for this. We'll also need to make a response which the agent will say if we can't afford to rent it. Go ahead and make both of these responses: "Very well, your house has been rented. You'll find its door unlocked for the next 30 days," or "Hmm, seems you haven't enough gold at this time."

8a). Let's say the agent is asking 300 gold a month, and our character can afford this. Here are what will go in the Conditions box for that response...

GetIsId aaaHouseAgent == 1.00 AND
GetStage aaaQuestName == 5.00 AND
GetScriptVariable 'aaaHouseAgentRef', Rent == 0.00 AND
GetGold NONE >= 300.00


8b). Toggle "Run on Target" ON for that final condition (the GetGold one). The character needs to have 300 gold or more, to make this response happen, and the game engine needs to be able to look into the character's inventory at this moment. If Run on Target is not toggled on, the game won't be able to "see" how much gold the character has.

8c). In the Result Script box, add the following.

aaaFrontDoorRef.unlock
Player.RemoveItem Gold001 300
Set aaaHouseAgentRef.Rent to 1
SetCellOwnership Cell


> Substitute 'aaaFrontDoorRef' with the Reference ID you gave the door of your rentable space.

> Substitute 'Cell' with whatever cell your character is going to be living in. This assumes (of course) the Player does not already own this cell. So in my game, that final script is SetCellOwnership LeyawiinCingorsHouse


Overall ... when the agent is spoken to, and we tell him or her we'd like to rent the place, what'll happen is the game will automatically unlock the place's door IF our character has 300 gold, or more. The game changes the place's Rent variable from 0 to 1, which causes the agent's dialog to follow a different path if we try to speak to him / her again. And finally, the game makes sure the cell now belongs to the player-character.


9). Now ... if your character can't afford the 300 gold, here are the Conditions for this...

GetIsId aaaHouseAgent == 1.00 AND
GetStage aaaQuestName == 5.00 AND
GetGold NONE < 300


... Again, make sure GetGold has Run on Target toggled ON. "Goodbye" can also be toggled on, making the NPC ForceBye us, because he or she's not happy that we're wasting their time.


10a). Make a second GREETING, this one saying "You're back. And the place is still available. Would you like to rent or buy it?" ... The NPC will say this Greeting after the place has been rented, but 30 days have passed, therefore the rental has expired.

10b). Again, include the same topic Choices (for renting or buying) which were included during the first GREETING: aaaRent and aaaBuy. These choices will lead in the exact same directions as they did after the first GREETING, which ensures that this quest is repeatable, giving us maximum choice all along.

Conditions look like this....

GetIsId aaaHouseAgent == 1.00 AND
GetStage aaaQuestName == 5.00 AND
GetScriptVariable 'aaaHouseAgentRef', Rent == 0.00


10c). Now, make a third GREETING. This one will show up after the place has been rented, but the rental has not expired yet: "You are back. How is your lovely home? You have already rented it, are you thinking of buying today?"

GetIsId aaaHouseAgent == 1.00 AND
GetStage aaaQuestName == 5.00 AND
GetScriptVariable 'aaaHouseAgentRef', Rent == 1.00


We have not written any "buy" dialog yet, but we'll do that in a moment. For now, just click OK (closing the quest window) and save. And reopen the Quest window.


11a). QUEST DATA tab
It's that time! Time to write a script, and it's going to be a timer script, just like in the post above this one. This timer script will allow the game to rent us the place for however long we'd like. Let's say we're renting it for 30 days. First make sure the Script Type scroll-bar is on Quest (not Object). Here is what should be started...

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

scriptname aaaHomeScript

short Timer
short StartDay

Begin GameMode

End


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

11b). Type that up and close/save it. Click OK (closing the quest window) and reopen the quest window.

11c). Find the script in the Quest Data tab's script scroll-bar. Click OK and reopen.

11d). And here is the rest of the script.

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

scriptname aaaHomeScript

short Timer
short StartDay

Begin GameMode

If (aaaHouseAgentRef.Rent == 1)

If (Timer == 0)
Set StartDay to GameDaysPassed
Set Timer to 1

EndIf
EnfIf

If (Timer == 1)
If ((GameDaysPassed - StartDay) >= 29)

If (Player.GetInCell Cell != 1)
Set Timer to 0
aaaFrontDoorRef.lock 100
set aaaHouseAgentRef.rent to 0

Message "Your home rental has expired", 36

EndIf
EndIf
EndIf

End


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

So... this timer ensures that several things will happen. When the agent has been paid 300 gold, this begins the timer's script. After 30 days have passed, this script now LOCKS the front door with a "Needs a Key" lock. An easier lock can be placed here if you'd like. Just change 100 to any number between 1 and 99, if you want a situation in which the house can possibly be broken into. This door will ONLY Lock if the character is not inside the cell though, ensuring the character won't get locked in. There is also a message which tells the player when the rental terms are over, which will stay onscreen 36 seconds. This part is optional and may be game-breaking for some, but it helps to know if the quest is working, or not.

Finally, in the line which says StartDay, note that I put 29 instead of 30. The game always seems to add an extra day.

Optional: If desired, the game can also give the character the key, which opens the front door. Make this key a Quest Item, so it can't be dropped, and then picked up later on after the rental has expired. This key can get added via dialog, at the moment of rental (player.AddItem aaaFrontDoorKey 1 would go into the Result Script box). This key can also be removed after 30 days have passed. The Main Script is used to remove this key, once the timer is finished, by putting Player.RemoveItem aaaFrontDoorKey 1 into the second block of If/EndIf texts, under the line which says aaaFrontDoorRef.lock 100. Adding a key during the rental phase is more necessary in Fallout than it is in Oblivion (Fallout doors tend to lock themselves prematurely).


12a). TOPICS tab
Now, it's time to finally going to add dialog and Topics which will allow the agent to sell the place. Selling is not nearly as complicated as renting. Click on the Buy topic you created before, and change its Topic Text to something appropriate. "How much to buy the place?" or whatever. And add some appropriate text like as a Response. "It's your lucky day! We're asking just 2000 gold."

Conditions look like this:

GetIsID aaaHouseAgent == 1.00 AND
GetStage aaaQuestName == 5.00


12b). Let's say the place does cost 2000 gold. In the Choices box, make a choice which says includes a Yes response, and one which includes a No response: aaaBuyYes and aaaBuyNo. Add both of these into the Editor ID as well.

12c). For the aaaBuyYes topic, if the character has the 2000 gold, everything moves forward, and the entire quest comes to an end.

Conditions:

GetIsId aaaHouseAgent == 1.00 AND
GetStage aaaQuestName == 5.00 AND
GetGold NONE >= 2000


Make sure "Run on Target" is toggled ON for GetGold.

12d). Result Script is very simple: Player.SetStage aaaQuestName 100

12e). Make a second response for aaaBuyYes, in which the character wishes to buy the place, but hasn't got enough gold. "Ahhm. Seems you haven't enough. I asked specifically for 2000 gold!!!"

GetIsID aaaHouseAgent == 1.00 AND
GetStage aaaQuestName == 5.00 AND
GetGold NONE < 2000


12f). Toggle Goodbye on for this response, if the agent becomes haughty, angry, or whatever. mad.gif Or maybe the agent remains cordial. Don't toggle goodbye, if this is so, and make the agent smile.


13a). QUEST STAGES tab
Go to the final stage (I am calling this Stage 100). Add a Log Entry, denoting that the house, the warehouse, the loft, etc. has been purchased. "I have decided to purchase the home.... bla bla bla."

Result Scripts should be....

Player.RemoveItem Gold001 2000
Player.AddItem aaaFrontDoorKey 1
SetQuestObject aaaFrontDoorKey -1
StopQuest aaaQuestName


> The "SetQuestObject" script is only necessary if the key has been made into a quest item earlier for the rental phase. If it hasn't, don't worry about this script.

> Since we're purchasing this house and the agent will never talk to us again, he / she simply gives us the key we made in step 1a.

13b). Don't forget to toggle Complete Quest on.


14). Topics tab
Finally, fill in the Topic and dialog which causes the PC to back out of buying the place. This is the topic I called aaaBuyNo earlier. "2000 is too much," or whatever. Again, the NPC's response can be haughty if you'd like. Conditions are just the same GetIsID as before, along with the GetStage pertaining to Stage 5, or whatever number you chose for the quest's middle stage.

Voila.

Posted by: Renee Aug 12 2018, 04:13 PM

Cripes, it's been since JUNE since I've added one of these?

This one is going to teach how to add songs to a radio station in Fallout 3. Last summer it was my goal to get heavy metal into Janet Telia's game, because in my RP with her, there was some sort of stash of all kinds of modern music, and she grew up on metal.

SubRosa tried to teach me how to do add songs to radio last summer, but I wasn't able to get it back then. I figured out my own way though. It requires a radio station mod which can be found here: https://www.nexusmods.com/fallout3/mods/18358 Now, this may seem unethical, since I'm tearing into somebody else's mod. I'm not going around claiming the author's work to be mine, at least.

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

1). First step is to find some songs in mp3 format. On my computer, they will show up as HP Connected Music Files (colored red). There are all sorts of ways to get music onto computers nowadays, legally, or gray-area-gally. emot-ninja1.gif

2). Copy/paste these songs over to Fallout 3 > Data > Sound > Songs > Radio > OnTheRoadRadio. As an example, I am going to add the song https://www.youtube.com/watch?v=L_BJlBjF2Vc by The Cure.

3). Open up the GECK. File > Data > OnTheRoadRadio.esp. Make this esp active. (duh)

4). OBJECT window
Go to Miscellaneous > Sound. The added songs are in the right folder, but we can't see them yet. This is because their name hasn't been transformed to something that the GECK wants to see.

So right-click > New into the Editor ID. A panel should pop up.

5). For ID, choose anything you'd like to name your song but it HAS to start with the letters MUS in its beginning. So for example, I'm going to type MUS1015SaturdayNight. It's possible to do the same trick to get our music at the very top of the pile, by adding 'aaa' up there. So MUSaaa1015SaturdayNight.

NOTE: If this is your first time adding a song into the GECK, continue to step 6a. If a song has already been added and you just want to add another, go to step 11a.


6a). Click on the Add Sound File button. It should automatically find Fallout 3's Data > Sound folder. You can then manually direct into the OnTheRoadRadio folder (Data > Sound > Songs > Radio > OnTheRoadRadio). Find the song just added into this folder, and click OK. The song should show up in the greyed-out button you just clicked.



Note that there are Play and Stop buttons. These don't seem to do anything, unfortunately.

7). Below those two buttons, there are two tabs: Main and Attenuation. Start with MAIN. There are three sliders, and the first two don't get touched for some reason. But move 'Static Attenuation" to -12.33 db.

Note: I am not sure what this does. Maybe it adds a slight bit of static to the song, making it seem as though it's more on the radio? Hmm. 12.33 is used every time, though.


8). Frequency Adjustment can be left at 0.

And only the 'Dialog sound' toggle is going to be clicked ON.

'Looping" can be kept on None, and the two sliders at the bottom can be kept at Midnight.

9). ATTENUATION tab
I have no idea what any of the sliders on this page do, but the game has them set up like this:

100
50
20
5
0

'Reverb Attenuation Control' is set at 80.

...and the very bottom slider (Priority) is set on Default. Leave this slider alone. I tried putting it up to 'Highest,' to see if it would play a particular song first, but this didn't happen in-game.

Basically, we're not going to touch any of these sliders, but just make sure they all read what's supposed to be there.

10). Click OK. Now the song is in the game, but not on the radio. If this is the first time a song has been manipulated to appear in the Sound window, continue on to step 12. Steps 11a through 11d are for those who are adding additional songs.


11a). Right-click > Edit on the song (or one of the songs) previously added. For me, this was MUSaaa1015SaturdayNight.

11b). Change the ID. I just added "Ride My See Saw" by the Moody Blues, so I'm changing this to MUSaaaRideMySeeSaw.

11c). Click on the Add Sound File button (this is the gray rectangle below the ID slot). Find the song in the Songs > OnTheRoadRadio folders. Select the song, and click OK.

11d). Click OK, closing the Sound panel, saving as a New Form if the original song was not to be overwritten. Everything else, such as that pesky Static Attenuation slider, has already been set up.


12). Use the main toolbar and Save!

I am going to describe how to add songs by overwriting what's already contained in OnTheRoadRadio.esp, and then I'll discuss how to make a New list. For those who want to overwrite, continue to Step 13.
For those who want to learn to make a new list, go to Step 16.


13). OBJECT window
Now, go to Actor Data > Quest. Find the OnTheRoadRadio quest. Double-click on it.

Note: At the top of the page is a quest which has something to do with OnTheRoadRadio, however, it does not have an Editor ID, so ignore this quest. Look for a second OnTheRoadRadio, which is listed under Editor ID.


14a). RADIO tab.
In the Display Text window (Windows 8 users: this is the tall, vertical window on the left. It'll be greyed-out and will need to be dragged from the top left), right-click > New > Add Topic. Right-click > Add Topic and make a new radio list.

I am not sure if there is some limitation here, as to how many songs can get added overall... I have recently installed GNR Enhanced, which adds 100 songs though, so I think we're safe adding as many as we wish. Anyway,


15a). Left-click on the top OnTheRoadRadioList. Now double left-click on one of the songs in the Info window. I am going to overwrite Beautiful Baby.

15b). In the Response Text area, delete the text that's already there, and write the name of the song which is going to overwrite Beautiful Baby. This name does not have to be written en CamelCase, so I'm putting 10:15 Saturday Night instead of 1015SaturdayNight.

15c). Click the button next to Sound File. Find the name of the song added earlier (MUSaaa1015SaturdayNight for instance). Double left-click on this name, and press OK. Note that some of sound items on this list actually DO make sound, when clicked on or highlighted accidentally. This seems to be hit-or-miss though.

15d). Click OK, closing the Quest window, and Save.

Save after EVERY song. If the GECK refuses to save (there's a spinning blue circle staying onscreen forever) it could be that the song being added can't be put into the game for some reason, even if it works outside the game. Maybe, maybe not. If this happens, try seeing if one of the "Warning" panels which randomly show up sometimes has not been clicked "Yes" or "Yes to all". This panel will sometimes be underneath the GECK itself as a separate window. If this panel is here, close it.

And if there's no Warning panel, maybe it's time to Ctrl + Alt + Delete and restart computer if this blue circle happens. sad.gif

15e). Since all the songs in this mod play randomly, it's a good idea to go through each song we DON'T want to play, and remove their Link To and Link From topics. Once we're back in the game, On The Road Radio should only play those which still have their Link To and Link From topics intact. Go into the game, and make sure the songs which have been chosen actually play in the game.

15f). Later on if more songs are being overwritten, make sure to right-click > Add Topic into the Link To box, and find RadioHello. Click OK for every desired song. In the Link From box, right-click and then double-click on ANY.

Do not toggle anything else on or off. The mod author has already provided the correct toggles, such as Random and Run Immediately.


Below are the steps needed if making a new list of songs. Make sure the OnTheRoadRadio quest is open to its Radio tab.

16). Right-click > Add Topic into the left (tall, vertical) window. This causes the Select Topic window to pop up. Right-click > New into this window. Name the topic, and click OK.

17). Right-click > New into the Info window. Type the name of the song (and maybe the artist) into the Response Text box. We don't have to type in CamelCase, so Six Underground can go into the box instead of SixUnderground.

18). Click the Sound File button which says 'Select TESSound'. Another panel should pop up, which is called Sound Pick. This button is fidgety, and it may take a couple tries. Single-click into the Sound Pick window.

19). Now find MUSaaa1015SaturdayNight, or whatever song is being added. Find it manually by scrolling, or type the song's name. Again, as we type, the window will eventually locate the song.

NOTE: Typing into the window will cause a warning to pop up. ⚠ Simply select Yes to all.

20). Double left-click on the song you want to add. Click OK. The song should now be in the Info window, as well as the Response Text box.

21). Make sure "Run Immediately" and "Random" are both toggled on.

22). In the 'Link To' box, right-click > New > Add Topic, and find 'RadioHello.' It should be somewhere down toward the bottom of the list, but you can type its name until we find it.

23). In the Link From box simply choose ANY. Then click OK (closing the quest panel).

24). Go back to the main toolbar and SAVE.

Final steps (which applies only if you've made a new Song List): Each Song List has its own 'Greeting,' and if a new song list is being started (Step 14), a new Greeting will be needed as well. This is not the same as GREETING.

25). In the Display Text window, click on RadioHello.

26). In the Info window, right-click > New. In the panel which pops up, add Greetings X in the Response Text box, with X being a number which corresponds to the new song list we've added. So if this song list is 5, it should say Greetings 5.

27). Click OK. Now, double-click on that same Info topic (Greetings 5, or whatever). Look at the Voice Filename area. 'OnTheRoadRadio_RadioHello_XXXXXXXX_X' should automatically be there, with all the Xs randomized numbers. So what I am seeing here is OnTheRoadRadio_RadioHello_005EEE_1, but you may see some other numbers...

Click OK.

28). The flags chosen should be "Run Immediately" and "Random". But since a new Greetings info is being added, make sure "Random End" also gets toggled.

Important: whichever song list is at the bottom should have Random End toggled on. ONLY this bottom list should get this particular toggle, so whatever list is directly above should've had Random End toggled, right? Make sure this gets toggled OFF.

29). In the Link To box, find your newest song list (OnTheRoadRadioList5 in this example).

Ignore the Link From box.

30). Now, the final touch will be to look on the right side of the Radio quest panel. There is a scroll-down bar called Speaker. Select this and find 'Zimmer.' I assume this is supposed to be the DJ of this radio station, but so far I've never heard him in the game.

Click OK.

28). Hope and pray everything saves when we close the GECK.

Posted by: Renee Aug 26 2018, 08:52 PM

Gun Tutorial Game: Fallout 3

This will not be as comprehensive as some others; it will merely blow through what all the different scroll-bars, slot numbers, and toggles do, and how they affect in-game play. In this case, I am going to edit something already pre-made by Bethesda, so nothing new is being made here. I don't know how to add totally new weapons into the game.

1). Fire up the GECK.

2). OBJECT window
Go to Items > Weapon. Find a weapon you'd like to make some changes to. Right-click > Edit on it. Give it a new ID and Name.

For me, this is going to be the very fast, very loud, but extremely inaccurate Assault Rifle. I'm not going to change its speed, or its weight, or anything like that. I will try to make it more accurate though. And also, I'm going to make its components last longer.

3). Here are all the items on the top half of the Weapon panel.

Script: Do not use.

Object Effect
: This scroll-bar will add certain effects to different weapons. For instance, we can put Moira Brown's "mole repellant" effect (which is found in a different part of the Object window) onto a Baseball Bat.

Ammunition: self-explanatory. This is what sort of Ammo your gun will require to operate.

Clip Rounds: Same as above. We can change the number of bullets in each clip.

Skill: another self-explanatory scroll-bar. Which skill does the gun affect?

Repair Item List: VERY important. Whatever is in this scroll-bar is what we can use to repair the gun with in-game. Since my assault rifle will be a unique item, found in very rare locations throughout my game, this doesn't mean it won't be able to be repaired. I'm leaving this on RepairAssaultRifle.

Equip Type: Again, self-explanatory. Don't change this away from SmallGuns, or whatever weapon is being edited.

Flags: These are various toggles which can be turned on and off, mostly self-explanatory. More detail about this can be found here...

http://geck.bethsoft.com/index.php?title=Ammo

One thing of interest is "Ignores Normal Weapon Resistance" which is a holdover from Oblivion, affecting the way silver weapons can damage undead, for instance. In other words, this flag doesn't do anything in Fallout. (thank you 'Rosa).

"No Jam After Reload" ... guns which have low Health will sometimes stick (not fire) after a new clip is slammed into them.

"Minor Crime" if the gun is used in-game, it is going to be considered a crime!


4). Game Data tab
On the lower half of the Weapon panel, and on the middle-left of the page, are three tabs. The Game Data tab is selected by default, and there are also Art and Sound and Rumble tabs.

Weight: After all these years, I'm still not sure if Beth uses pounds or kilograms.

Health: Yes!!! Finally, a way to make weapons last longer before repairing sets in. Though this is cheating, there's always a way to explain more durable guns through roleplay, right?

Reach: Do not use. This is always set at 1.000 by Beth.

Fire Rate: Another duh.

Spread
: This controls how accurate or inaccurate a gun is. Assault weapons in general are pretty inaccurate. By default this is set to 4.000 for an Assault Rifle. Change this to a lower number for less chance of missing, but also less chance of randomly hitting.

Min Spread: Guns have a minimum and maximum spread.

Sight FOV: This has to do with how far "inwards" the player's vision narrows in while aiming.

Sight Usage:

Crit Damage: How much damage this gun will do through critical hits.

Aim Arc
: Not sure. Do not use.

Value: Durrr.

Damage: This is the base damage the gun will do most of the time, while Critical Damage is what it can do, some of the time. Obviously, it can be very easy to make a gun which oneshotkills everything in the Wasteland, so don't remove all challenge from the game, else you might also remove a lot of its fun!

Ammo Use: How many bullets get used up per round.

# Projectiles: How may bullets come out of the gun at once. I don't think it has anything to do with Ammo Use.

Limb Dmg Mult: When making critical hits through VATS, this is what causes more or less damage. Leave this at 1.000. I think problems with glitches can otherwise occur.

Base VATS To-Hit Chance: this number can also be affected by certain Perks the character has, as well as Luck.

Burst Shot / Long Bursts: Do not use.

Semi-Automatic Fire Delay Min / Max: These affect the delay between shots. Don't mess with this.

Resist: This scroll-bar determines if the gun has resistance against various types of damage, such as resistance against energy weapons, fire, and so on.

On Hit: Don't mess with this.

Range: There is a minimum or maximum range in which the bullet has effect. This is measured in Bethesda's cryptic "units", (the same units that get used for setting X-marker distances, for instance), so this does not measure standard or metric.

Action Points: How many "Action Points" the gun uses per shot.

Damage to Weapon Mult: How quickly health regenerates. Don't change this.


5). Art and Sound tab.
Most of this we won't mess with, because this tab affects all the various artworks (such as icons) that are already in the game.

An example of a time we'd want to mess in this tab though is let's say we want to make a pistol shoot fire instead of bullets. If we have a 10mm Pistol, and make changes to it in the Game Data tab so that it uses Flamer Fuel, if we didn't change anything in the Art and Sound tab, the gun would still visually shoot 10mm ammo, even though the effect would be enemies burning up. We'd have to go into the Art and Sound tab to make the gun visually shoot flames, and also have the sound-effects for this as well.

To make a pistol which shoots fire, make all the changes in the Game Data tab, but then study the Art and Sound tab for a Flamer. Make the appropriate changes to the flaming pistol.

In most cases though, skip the Art and Sound tab.


6). Rumble tab.
This affects Xbox and Playstation controllers. We can make the motors in our controllers rumble more or less, amazingly.

Don't mess with this, in most cases.

Posted by: SubRosa Aug 26 2018, 08:59 PM

Ignores Normal Weapon Resistance is a holdover from the older Elder Scrolls games like Oblivion and Morrowind. It is for things like Silver and Daedric weapons, that can harm ghosts and other critters that are immune to normal weapons. It does not do anything in the Fallout games. I think it didn't work in Skyrim either.

Posted by: Renee Sep 2 2018, 12:55 PM

Thanks. I changed the info in my previous post.

Repeatable Bounty Quests, Game: TES IV: Oblivion

This one is going to discuss how to make a revolving, never-ending, set of bounty quests, similar to what Skyrim has, when we get bandit raids from innkeepers. My version is different from Skyrim's though, in several ways. Bottom line: If you're the type of gamer who wants to be sent off to do random kill-type missions, which are also repeatable, this is what is going to be taught in this post.

Here is what I decided to create in my game. Count Marius Caro begins to sponsor endeavors to clear out certain lairs of whatever scummy enemies they hold. My character (Lady Saga) will be able to go into Leyawiin's castle, speak to a certain NPC agent, and then select a location to plunder. Once she finds the location and eradicates a specific boss, the game informs the player that the boss has been taken care of. And now a reward can be collected back in Leyawiin's castle.

Though this sounds like just another kill quest, again, the main difference is this one can respawn itself. And multiple locations can be added.



1a). Fire up the Oblivion Construction Set.

1b). First thing to do is start a new quest. Give it an ID. Quest Name is not important (as will be seen, the name of these quests will never appear in-game), but you can name it just for reference, here in the Construction Set. For this lesson, I am giving an ID called aaaBountyQuest, which can be changed to whatever you'd like.

1c). In the quest's Data tab, start a script which looks like this...

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

scriptname aaaBountyQuestScript

short DoOnce


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

"aaaBountyQuestScript" can be made more specific, especially if you want to make this script more regional. In my game for instance, I've got aaaLeyawiinBountyQuestScript.

1d). Change the Script Type scroll bar from Object to Quest.

Save that script (using the save icon) and close it. Click OK, closing the quest window. Reopen it, find the script you just started, select it, and click OK (closing the quest window again).


Next, we're going to edit a letter, a town-based NPC, and an enemy NPC. All of this happens in the steps below.


2a). OBJECT window > Items > Books
Edit a handbill, or a letter, or a note, etc. Give whatever parchment you decide to edit a new ID. It makes sense to associate this ID name with whatever lair it's going to direct the player to. My first note will send the player to Undertow Cavern for instance, so I'm calling the note's ID aaaUndertowQuestNote, and then changing its Name to Undertow Cavern Order.

2b). Change the note's Book Text too, of course. Write some material describing that (1) there is a problem at a nearby lair (whether it's Undertow or somewhere else), and (2) a reward can be had after this lair is dealt with. Write something like...

Hear ye, hear ye!

By order of the County of Leyawiin, this parchment shall direct its bearer towards the subterranean dwelling known as Undertow Cavern. Once riddance and eradication of Undertow's scum has been accomplished, We of the County of Leyawiin shall have knowledge of its leader being taken down, through the glass of our specialized crystal ball. Thence, the bearer of this note shalt return toward our magnificent domain, and payment of 200 gold shall be dispensed.

~ Count Marius Caro~


2c). Ahem. It's a good idea to make this note a Quest Item. Here is why: This method of quest-making does not use stages at all. So the note is the only reminder a player will have, explaining where to go.

And don't worry. This quest item/note won't get stuck in inventory forever; it's going to get removed later on, or its quest-status is going to get removed.


3a). OBJECT window > Actors > NPC
Edit a named (not generic) Bethesda NPC who is not associated with Shivering Isles. This is going to be the guy or lady who will dispense quest locations.

If you have already made an agent and wish to reuse him or her, you can just skip to step 4a, whcih teaches how to make the enemy.

3b). Remove the NPC's script (if there is one), and also get rid of any AI. Change the NPC's Class to Agent. Edit the NPC in any manner you'd like.

I edited Agamir, removed his script, changed his Class from Thief to Agent, amd removed all his AI and Factions. Changed his ID and Name, bla bla bla. I transformed Agarmir into the "Leyawiin Quest Agent". Since this agent lives in Leyawiin Castle, I made sure to add him into the LeyawiinFaction (so he'll occasionally gossip about local topics), and also LeyawiinCastleFaction.


An optional step is to give the agent some AI (skip to step 4 if you just want to move on to the quest-making part). I gave him AI which causes him to Travel from the castle's court area into its Servants' Quarters. Most important though, I made a 'Use Item At' package called aaaLeyawiinAgentOnDuty. I then toggled Must Complete on. And changed the Time scroll-bar to 9, with a Duration of 8, meaning that he'll be "on duty" from 9 to 5. I gave him a desk to sit at (WorldObjects > Static > LowerClassTable01), and a chair to sit upon (World Objects > Furniture > UCChair05L). Gave the chair a Reference ID so the agent would sit down while "on duty". All of these furniture pieces were put off to the side of Leyawiin Castle's Great Hall.

.....If you want to do something simliar, just make two Travel packages: one which causes the NPC agent to travel to some other location, and another which causes him/her to return to work. The third AI package (Use Item At) makes the agent sit down from 9 to 5. I went into the agent's Use Item At again, and clicked on the Location tab. Toggled 'Near Reference' on, and then pushed the Select Reference in Render Window button. Double-clicked on the chair added earlier. Clicked OK.

Overall, he will travel to Leyawiin's court area at 7 am, sit down at 9, and stay there until 5. After 5, he walks to the Servants' Quarters, where he basically stands around doing nothing. Lol. You don't have to do all this. I like dynamic NPCs though. smile.gif


4a).
OBJECT window > NPC
Find a generic enemy who will be appropriate for whichever cell you'd like to plunder. Since I chose Undertow Cavern (which hosts Black Bow Bandits) I went into the Redguard section, and then edited BanditBlackBowBoss4Male1.

4b). Change ID, and change Name if you'd like. Toggle Respawn on, and toggle No Low Level Processing off.

Since the NPC I edited is already a Black Bow Bandit, he already has the correct factions and AI. It's always good to double-check these features, though. wink.gif

4c). Stats tab
Now's the time to make the enemy boss into whatever he or she is supposed to be. Whether he's a wimp, or an über. viking.gif Take the time to set the enemy up for combat.

Tip: There are two basic ways to set up the enemy's Health, Magicka, and Fatigue: these stats can either be fixed, or Leveled. PC Level Mult will make an enemy who levels with the player/character, or below / above the PC. This is my favorite way to set up enemies. Problem is, I have found that sometimes the game's engine screws up when respawning the enemy, leaving him or her with zero Health, and (sometimes) a huge negative number for Fatigue.

The only way I've found to fix this is to click PC Level Mult off. This will cause the CS to automatically choose Auto Calc Stats instead. Click Auto Calc Stats off too. Now it is possible to choose any numbers, not just for Health, Magicka, and Fatigue, but also for all the Attributes, and wherever else there is a slot which can be modified.

It is also possible to use scripts, so that these numbers get generated in real-time back in-game. But this too me seems overly complicated, like it could also welcome new problems in the future. I like keeping things simple.


4d). Inventory tab
All generic Bethesda enemies use Leveled Lists to determine what gets added into their inventories, so I personally don't mess with this tab. Leveled lists give random things to NPCs, to wear and use. Because of this, the enemy boss will be a little bit different every time he gets encountered, since he'll be wearing different armor / carrying different weapons, every time he respawns.

Go ahead and add or subtract whatever you'd like, though.



5a). CELL + RENDER windows
Place the NPC enemy into whichever cell he /she belongs in. It's a good idea to put him/her into a final room, so that the PC will be forced to defeat most of the lair before the boss is found. Once the enemy is in place, he or she might be in underclothes. ohmy.gif This is okay. Those leveled lists will handle this dilemma; giving the NPC something to wear, and carry, once we're back in the game.

5b). Give the enemy a Reference ID. For this tutorial, I am calling it aaaEnemyBossRef, but for my actual game I chose aaaUndertowBossRef. It's a good idea to copy whatever ID is chosen, so it can be pasted into scripts later on.

5c). Toggle Persistent Reference on, if it's not already on.

5d). Also, start a script for the enemy that looks like this....

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

scriptname aaaEnemyBossScript

short Dead


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

Substitute "EnemlyBossScript" with whatever name is more specific. In my game, I've got aaaUndertowBossScript.

5e). Save that script (using the save icon), and close it. Click OK, closing the NPC's panel, and click OK again, closing his or her Reference panel. If you're editing the NPC from the Object window (instead of its Reference window) you won't need to close a Reference panel.

5f). Reopen the NPC's panel(s), and find the script you started earlier. Click OK again (closing the NPC and Reference panels if both were opened) SAVE all progress using the main toolbar, and reopen the NPC's panel(s) again.

Though all of that opening & closing seems redundant, it's actually necessary to follow those steps, in that order. If you don't, sometimes problems can happen. The script might give annoying error messages later on when we're trying to save it, for instance.

5g). Now, to add more to the script.

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

scriptname aaaEnemlyBossScript

short Dead

Begin OnDeath

If (aaaEnemyBossRef.Dead == 1)
Set aaaEnemyBossRef.Dead to 2
Set aaaBountyQuest.DoOnce to 2

Message "The leader of X has been killed", 36

EndIf
End


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

Substitute "aaaEnemyBossRef" with the Reference ID of your enemy, if you gave him/her some different Reference ID name.

Substitute X with whatever location name was chosen.

Note the message, too. Since this method of quest-making does not use stages, it's important to be informed of the boss's death in real-time, just so you know the quest is working. This message will not show up as a quest update (it will not pause the game). If you still find this to be immersion-breaking, just delete that whole line of text.


5h). Use the Save icon to save the script before it's closed. Click OK on the enemy's information panel(s).

5i).. RENDER window: Get back into the cell where the enemy is. Now go into the OBJECT window > WorldObjects > Static, and pull an XMarkerHeading from the Object window into the Render window. Give this XMarkerHeading a Reference ID. I am calling it aaaXMarkerHeading for this lesson, but this can be changed to something more specific, as per the enemy's name, for instance. The XMarkerHeading be discussed later in this post.


6a). QUEST window > Quest Data tab
Reopen the quest which got started earlier in this tutorial.

6b). Priority can be anywhere from 10 to 70, depending if the quest is going to 'compete' with others out there. For instance, if you only use the one NPC agent added during 3a, Priority can be set low. If you're going to include other NPCs (let's say Count Marius Caro or some other NPC gets spoken to, to introduce the character to this new concept of bounty hunting) Priority should be set higher, since other quests associated with the extra NPCs might prevent the bounty quest dialog from showing up.

6c). Make sure Start Game Enabled is toggled on (it should be, by default) and add GetIsPlayableRace == 1.00 goes into the Quest Conditions window.

6d). Return to the script. Time to add a few more lines of text, so that it'll now look like this...

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

scriptname aaaBountyQuestScript

short DoOnce
short Timer
short StartDay


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

Close and save, bla bla bla...

7a). Topics tab
As usual, start with a GREETING. "How fares thee? ... Have you come to take down one of our nearby locations?" is an example of what the NPC Agent could first say. Here are the Conditions.

GetIsID 'aaaQuestAgent' == 1.00 AND
GetQuestVariable 'aaaBountyQuest', DoOnce == 0.00


Substitute "aaaQuestAgent" with whatever ID you actually chose.

7b). Use the Add Topics box to to add a custom topic, and (as usual) add this topic into the Editor ID window as well. I am calling this topic "aaaBountyQuest01"

7c). During aaaBountyQuest01 (or whatever you named your topic), the Agent explains what's going on locally, with forts and caves and ruins all harboring lots of baddies. The agent then asks if we'd like to see a list of possible places to plunder.

The cool thing about this type of quest (once it is all set up) is we can add several locations to go to, later on. And all of these locations get chosen through dialog.

Conditions from the GREETING can be copy / pasted. Again, they go like this...

GetIsID 'aaaQuestAgent' == 1.00 AND
GetQuestVariable 'aaaBountyQuest', DoOnce == 0.00


7d). In the Result Script box, type this: Set aaaBountyQuest.DoOnce to 1

7e). In the Choices window, right-click > New and make a second custom topic, dealing with whichever lair is being featured. So in my game, I've got aaaUndertow as a topic ID.

Add that topic into the Editor ID window, too. This topic is going to be the first locational topic. As I said, more locations (and topics for each location) can be added later, each one getting its own dialog.

7e). For this first locational topic, do all the usual steps: change Topic Text to something in plain English (if needed). Make some dialog which furthers the conversation "Ah, so you'd like to head to Undertow Cavern...." The agent explains whatever local problems the town has been having with Undertow, then. "Located off the west gate, right above the town. Such a menace to the stable and travellers below..."

Conditions go like this....

GetIsID 'aaaQuestAgent' == 1.00 AND
GetScriptVariable 'aaaaEnemyBossRef', Dead == 0.00


That script variable function is an awesome tool, by the way. Variables are what often cause the game to allow, or not allow, all sorts of things. Same goes for the quest variable used in the first Greeting. Script and quest variables shall get used a lot during this entire process.

7f). If you want to make this moment into a Yes or No choice, use the Choices window to add Yes and No topics. If not, skip to step 8.

.... The "Yes" choice is going to be specific to Undertow Cavern (ID name is aaaYesUndertow, for instance). The "No" choice is going to be much more generic (aaaNo), and will pertain to any moment the player clicks on "No" during conversation. In fact, if you already have a "No" topic from previous quests, you can just reuse this.

7g). Add both Choices (aaaYesLocation and aaaNo) into the Editor ID as well, and add dialog for each one. If you want some dialog which explains where the lair is, you can type this in too. "Let me put that location on your map."

Conditions for the "yes" topic are the usual GetIsID and script variable...

GetIsID 'aaaQuestAgent' == 1.00 AND
GetScriptVariable 'aaaaEnemyBossRef', Dead == 0.00


In the Result Script box, type these in....

Set aaaEnemyBossRef.Dead to 1
Player.AddItem aaaQuestNote 1
ShowMap UndertowCavernMapMarker


Substitute "aaaEnemyBossRef" with the Reference ID of your enemy.

Substitute "aaaQuestNote" with the ID of the note made during step 2..

Substitute "UndertowCavernMapMarker" with the name of the location, unless you also are using Undertow, of course.



8a). Assuming you don't already have a "No" topic, make some dialog like "STOP WASTING MY TIME!" in response to our character opting out. Only one Condition is needed, which is the same GetIsID from previous steps.

8b). Result Script should be Set aaaBountyQuest.DoOnce to 0

8c). Toggle Goodbye on, to simulate the Quest Agent losing temper, if you'd like! mad.gif


Note: notice the QuestVariable up above in step 8b. It started out as 0, changed to 1, and now it's 0 again. What's that all about? Well, the way this bounty quest works is: we can only choose one quest location at a time. This is important. If we accept a quest (Undertow Cavern, for instance) and then immediately accept another one (assuming you write in more than one location), this will confuse the game's dialog, and screw it all up. It is possible to make more than one location at a time viable, but the amount of work it'd take is just not worth it. Much better to keep things simple!

So it's important to have a way to make sure only one quest location at a time gets focused on. But it's ALSO important that dialog is able to reset itself to the very beginning ("How fares thee?") so that the entire process can be started over.

>> This entire bounty quest idea works on timer scripts, which will get written up in a few moments. After a location gets accepted, its leader get killed, it is these timers which cause the quest to reset.


9a). Go back into the first locational topic (the one which describes where to go, and why to go there). Right-click > New into the Info window. Write some dialog which explains that a certain location has already been plundered.

For instance, let's say Undertow Cavern has already been eradicated, its timer has not reset, and its enemy has not respawned. The player forgets this though, and clicks on Undertow Cavern. Dialog in this situation can go like "Hmm. Seems you have already cleared that location. No need to go there again; Undertow's enemies have not returned. Would you like to choose another location?"

9b). Conditions ....

GetIsID 'aaaQuestAgent' == 1.00 AND
GetScriptVariable 'aaaEnemyBossRef', Dead >= 2.00


9c). In the Choices window, add any other locations which have been set up so far. In my game for instance, I've got aaaFortDoublecross and aaaFortTeleman in this window. Of course, if this is the first time setting all of this up, there won't be any other locations, yet.

Also, add in that "no" topic again, so the player has a choice to opt out entirely.


10a). Quest Data tab
Time to finish up the main script. Here is what it'll look like. Again, this will be a timer script.

------------------------------------
scriptname aaaBountyQuestScript

short DoOnce
short Timer
short StartDay

Begin GameMode

If (Timer == 0)

If (aaaEnemyBossRef.Dead == 3)
Set StartDay to GameDaysPassed
Set Timer to 1
EndIf
EndIf

If (Timer == 1)
If ((GameDaysPassed - StartDay) >= 3)
Set Timer to 0
Set aaaEnemyBossRef.Dead to 0

EndIf
EndIf

End


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

* To summarize, the script above will start its timer after we speak to the NPC agent, and are rewarded. The dialog for this reward has not been written yet, but we'll get to that later. After the timer starts, it will reset the quest once 3 days have passed. After those 3 days have passed, voila, the agent's dialog updates, which can potentially send us off to that same lair again. In that lair, the NPC enemy respawns, along with the cell he or she is in.

** It is possible to change the timer to your liking. If 3 days seems too soon, just change the "3" in If ((GameDaysPassed - StartDay) >= 3) to some other number. Changing this to 10 will make sure dialog doesn't reset until 10 days have passed, for instance.

*** 3 days happens to be the realistic minimum here, though. Since Bethesda cells don't reset until 3 days have passed, it's pointless to make dialog which resets before then (sending us off to that same lair), if the cell itself hasn't reset yet. Only for testing purposes should you try less than 3 days. Making the script reset after one day, for instance, is an experiment you can try just to see if the original dialog resets.


10b). Save the script and close it, close the Quest window, save, bla bla bla....

These next steps are optional, and deal with adding map markers and quest targets. If you don't want to add these, skip to step 12.


11a). CELL + RENDER windows
Go into the cell where the enemy got added, and find the way out of this cell, by clicking on the lair's Door Markers. Since I chose Undertow Cavern, this isn't such a task for me. wink.gif I only have one cell to exit from.

11b). Once you are outside this cell, try to find its Map Marker. Hopefully there is one! If not, you'll need to make one. Anyway, leave this marker on-screen.

11c). QUEST window > Quest Targets tab
Right-click into the large Target Ref window and select New.

11d). Click on the Select Reference in Render Window button, and double-click on the Map Marker.

11e). Right-click > New into the Conditions box, and add GetScriptVariable 'aaaEnemyBossRef', Dead == 1.00

11f). Go back into the Topics tab and find the "Yes" response (if you added this). Add some more dialog that goes "I will mark the location on your map."

11g). In the Yes topic's Result Script box, type ShowMap XMapMarker, with "X" being whichever lair the quest pertains to. So an example is ShowMap UndertowCavernMapMarker


To summarize, by now there should be five topics in this quest: the initial GREETING, the initial topic which follows the GREETING (in which the agent explains where some trouble areas are in Cyrodiil), a topic which discusses a specific lair (Undertow Cavern, in my case). Then there should be Yes and No topics, with the "Yes" being a specific topic sending the player to a specific lair, and the "No" topic being more generic.

12). Save, goshdarnit!


13a). Time to make a second GREETING, which shows up if the PC has started a quest, but has not completed it yet. "Ah, you are back. How's your latest expedition coming along?"

Conditions ....

GetIsID 'aaaQuestAgent' == 1.00 AND
GetQuestVariable 'aaaBountyQuest', DoOnce == 1.00


13b). Use the Add Topics box to move the conversation toward the same custom topic created in step 7b. This time though, write some dialog which says "Seems you've already got a quest to follow. Finish that one up, then come see me."

13c). Copy all the conditions from the GREETING just above, and paste them into this "Seems you have already...." topic. Toggle Goodbye on, if you'd like.


14a). Time to write the reward stuff. Start a final GREETING in which the agent is glad to see us return. "You've made it back!" Give the agent a surprised look, perhaps. The agent is amazed how good our toon is.

GetIsID 'aaaQuestAgent' == 1.00 AND
GetQuestVariable 'aaaBountyQuest', DoOnce == 2.00


14b). Use the Add Topics box to link to a "reward" topic. If youv'e already got one of these made from previous quests, you can just use this again.

14c). "Here is your reward.... bla bla bla" says the agent.

GetIsId 'aaaQuestAgent' == 1.00 AND
GetScriptVariable 'aaaEnemyBossRef', Dead == 2.00


14d). In the Result Script box, type ...

Set aaaBountyQuest.DoOnce to 0
Set aaaEnemyBossRef.Dead to 3
Player.AddItem Gold001 X
Player.RemoveItem aaaQuestNote 1


Substitute .... well, you know what to do by now, right? wink.gif

The "X" can be whatever number you'd like. 200 gold, 2000 gold, whatever.

Note the RemoveItem part, which removes the note which initially sends the player off to Undertow, or wherever. If you made this note a Quest Item, now you don't have to worry about getting it out of inventory. Another option: if you want to keep this note in some desk (perhaps your character is some sort of pack rat) yet the note is a Quest Item, just type SetQuestObject aaaQuestNote -1

Now for the final touch. Since the enemy boss is not generic, he or she tends to stay wherever he/she winds up. In other words, if the boss fight causes the player-character to flee to another location (even outside the lair) and the boss gets killed in that other location, THIS is where the boss will respawn. So here's how to put the boss back into that initial room. In fact, the boss will respawn exactly where the XMarkerHeading from step 5i was placed.

15a). OBJECT window > World Objects > Static
Click on anything in the right side of the Object window, and press X.

15b). Go into the lair where the enemy boss is located (unless the Render window is still showing this boss).

Now, if the enemy is in a multi-celled lair (for instance, if the enemy is in UndertowCavern02 instead of UndertowCavern01) you'll want to get into that initial cell, in this case, UndertowCavern01. If the enemy is in a lair which only has one cell, that'll be less work.

15c). Get to the initial cell's entry door. Typically, this is going to be the very FIRST door the PC walks through, to get into that initial cell.

15d). Go back to the Object window, and drag an XMarker from this window into the initial cell. Try to place this XMarker somewhere right behind the initial door, right on its floor. Give this XMarker a Reference ID. I am calling it aaaXMarker for this lesson.

15e). Save.

16a) QUEST window > Quest Data tab
Open up the main script. And add this script anywhere onto this page between its Begin / End block...

If (aaaNPCBossRef.Dead == 1)
If (Player.GetDistance aaaXMarker <= 500)

aaaNPCBossRef.MoveTo aaaMarkerHeadingRef

Message "I have entered the lair called X. The evil, it simmers from within...", 30


EndIf
EndIf


This script will ensure that the enemy boss gets moved back where it should be, in real-time, and its message lets the player know the script has worked. The only possible remaining issue is if that enemy somehow got located outside of his/her lair. If so, another idea is to attach aaaNPCBossRef.MoveTo aaaMarkerHeadingRef into the Result Script box when the reward is given.

Using the XMarker script works most reliably though, since it's very rare the boss will get outside that lair and into the open world. This script can go anywhere within the Begin GameMode / End block. To keep things nifty, I like to put it outside of any other If/EndIf blocks. Example of the final main script is below.

scriptname aaaBountyQuestScript

short DoOnce
short Timer
short StartDay

Begin GameMode

If (Timer == 0)

If (aaaEnemyBossRef.Dead == 3)
Set StartDay to GameDaysPassed
Set Timer to 1
EndIf
EndIf

If (Timer == 1)
If ((GameDaysPassed - StartDay) >= 3)
Set Timer to 0
Set aaaEnemyBossRef.Dead to 0

EndIf
EndIf

If (aaaNPCBossRef.Dead == 1)
If (Player.GetDistance aaaXMarker <= 500)
[indent]aaaNPCBossRef.MoveTo aaaMarkerHeadingRef

Message "I have entered the lair called X. The evil, it simmers from within...", 30

EndIf
EndIf

End


And that is all. All sorts of dialog can be written to enhance this type of quest. Greetings and topics can be made for townspeople for instance, making them praise and glorify our character through random dialog (or curse him or her, if they happen to feel compassion toward baddies). But for the basic revolving quest itself, everything above shall send the player off to one initial lair, which can be repeated later on (days, months, years later). Replayability, that's what it's all about.

In the next post, I'm going to discuss how to add extra locations to this same quest.

Posted by: Renee Sep 29 2018, 06:50 PM

Another tip for making these bounty quests: I like to keep a Notepad page open while using the Construction Set. It helps to copy/paste three pieces of information from the CS onto this Notepad page: the note's name (aaaBountyQuestNote or whatever), the Reference ID for the enemy, plus its 'dead' variable (aaaEnemyBossRef.dead or whatever), and the quest's variable name (aaaBountyQuest.doonce). The name of the XMarkerHeading and XMarker can also get pasted onto this page.

All of this helps so that those who want to try to make these quests have an open source to copy/paste all those complicated terms from, whenever these terms are needed.

Posted by: Renee Oct 12 2018, 02:41 AM

This post goes with the one above, and is going to show how to add extra locations to repeatable bounty quests. A lot of steps get skipped, while some get repeated.

It's a good idea to make each location one at a time. Put the enemy in some lair, write the quest, playtest it, and so on. This way, if there's some problem with the previous potion of the quest, this problem won't possibly compound later on.

For this lesson, I already have Undertow Cavern as a solid, repeatable location. Now I am going to add Fort Doublecross.


1a). OBJECT window > Items > Book
Find the previous note which was used for your first location, and edit this note. Change its ID, its Name, and (optional) leave Quest Item toggled on. I am calling this note aaaQuestNote2 for this lesson, but its actual in-game name is "aaaDoublecrossNote" and you can name the note whatever you'd like. It helps to associate the note's name with its corresponding location, of course.

1b). Change the note's Book Text. If this text already says something like "The Count and his people wish to see the eradication of X" (X being Undertow in my game), all that's needed then is to change the name of the old location to whatever new location is being added.

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


2a). OBJECT window > Actors > NPC
Find a generic enemy who is appropriate for the second lair you have chosen.

2b). Change ID and Name.

2c). Toggle No low-level processing off, and toggle Respawn on.

2d). Double-check AI and Factions. AI is typically going to be two Wander packages: one for Interiors, and one for Exteriors .... and Faction is really important!! If the NPC is in the wrong faction, he/she could get pwned by some opposing faction before we've even dealt with them!

Get rid of any scripts, too. Move the Script scroll-bar up to NONE.

2e). Make any other changes you wish, to Stats, Inventory, facial features, whatever. Click OK, saving as a New Form.

Tip: It helps to toggle PC Level Mult and Auto-Calc Stats off, and enter fixed numbers into Health, Magicka, Fatigue, various Attributes (etc.) for the greatest chance that the enemy will respawn with those fixed numbers. I myself prefer using PC Level Mult, which causes the enemy to level with the PC, but I have also had problems with enemies respawning improperly, with zero Health and minus Fatigue.

2f). Place the enemy into whatever cell you've chosen. Give him or her a Reference ID. For convenience, copy this Ref Id so it can be pasted into scripts later. I am calling this Ref ID "aaaNPCenemy2Ref".

2g). Time to write the enemy's death script. Start with just the script's name, and the "short Dead" function...

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

scriptname aaaNPCenemy2Script

short Dead


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

.... save that script, close it, close the NPC's panel and Reference panel (if you're editing from the Render window). Now, open both panels (or only one if you're editing from the Object window) and find the script. Select it. Close the NPC's panel(s). Reopen them, or it. Click the script button. Now's the time to add to this script, so in total, it'll look something like this...

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

scriptname aaaNPCenemy2Script

short Dead

Begin OnDeath

If (aaaNPCenemy2Ref.Dead == 1)
Set aaaNPCenemy2Ref.Dead to 2
Set aaaBountyQuest.DoOnce to 2
Message "The leader of X has been killed", 36

EndIf

End


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

Substitute "aaaNPCenemy2Script" with whatever name you chose, as needed.
Substitute "aaaNPCenem2Ref" with the Reference ID of the enemy.
Substitute X with the name of the location.

2h).. OBJECT window > WorldObjects > Static,
Pull an XMarkerHeading from the Object window into the Render window. Wherever this XMarkerHeading gets placed is where the enemy boss will respawn. Give this XMarkerHeading a Reference ID. I am calling it aaaXMarkerHeading for this lesson, but this can be changed to something more specific, as per the enemy's name, for instance. The XMarkerHeading be discussed later in this post.


3a). QUEST window > Topics tab
Open up the original bounty quest's Topics tab (for me, this includes Undertow). Thankfully, the same GREETING, and the same initial topic, can both be kept as-is. So in my game, the greeting ("How fares thee? Have you come to partake of more adventuring?") and the initial topic which links from that greeting ("As noted, we've got several problem areas which have become a local menace...") can both be kept, just like they are.

3b). In the initial topic's Choices box, there should already be one topic. This topic leads to whatever specific lair has already been added. So for me, once again, this is aaaUndertow, and also aaaNo, the topic which gives an option to back out. Now, it's time to add a third topic. This topic will lead to whatever second lair you'd like to plunder.

So for example, I've already got aaaUndertow and aaaNo here. Now I'm going to add aaaDoublecross.

Tip: if you wish these topics to show up in alphabetical order once you're back in-game, it is possible to remove one topic, and add it later. For instance, "aaaUndertow" is currently above "aaaDoublecross" in the Choices box, and this is how they'll appear in-game, if I don't rearrange them. Just right-click on each topic in the Choices box and select Remove Topic. Then add these topics back in, alphabetically. So now at the top, I'm seeing aaaDoublecross above aaaUndertow. This tip goes for the "no" topic, as well. I like having "no" as the very bottom choice.

3c). Right-click > New into the Editor ID window, and add the topic which leads to the second location.

3d).
Change the Topic Text slot (if needed) so that it's plain English. And add some text into the Info window, in which the quest agent explains what's going on at the second location. "Fort Doublecross, wretched place! The peoples of Brindlehome are constantly in fear and doubt, as they wish someone to come along and rid that fort's inhabitants....!"

3e). Right-click > New into the Conditions window. Add ....

GetIsID 'aaaQuestAgent' == 1.00 AND
GetScriptVariable 'aaaNPCenemy2Ref,' Dead == 0.00


Copy All those two conditions so they can be pasted later on. It also helps to have the enemy boss on-screen in the Render window, so you can simply double left-click on this enemy when choosing the script variable's reference.

3d). In the Choices box, add a Yes and a No topic. The Yes topic should be specific to whatever lair needs to get plundered (aaaYesDoublecross in my game). The No topic can be the same, generic no that's been used previously.

3e). Add the Yes topic into the Editor ID window. Change Topic Text (if needed) and add some dialog. "Yes! Glad to hear you are interested in downing Fort Doublecross..." Optional: add some dialog in which the agent explains a marker is getting added to the map.

3f). Paste the conditions from the previous locational topic (the GetIsID and GetScriptVariable) just as they are.

3g). In the Result Script box ...

Set aaaNPCenemy2Ref.Dead to 1
Player.AddItem aaaQuestNote2 1
ShowMap MapLocation


Substitute aaaQuestNote2 with whatever you named the note.

3h). Click OK (closing the Quest window) and save.


4a). Reopen the Quest window, and go into the second locational topic (this is aaaDoublecross, in my game). This is the topic which has a Yes and a No choice. Right-click > New into the Info window, and start second dialog response, in which the agent says "But you have already been to that location. Would you like to choose another?"

4b). Conditions go like...

GetIsID aaaQuestAgent == 1.00 AND
GetScriptVariable aaaNPCenemy2Ref, Dead >= 2.00


4c). In the Choices box, add topics which lead to any location which the player has NOT chosen yet. Make sure to add the "No"choice here, too. In my game's Choices box, I am seeing this...

aaaUndertow
aaaNo

Again, if there are already several locations listed here, these can be made alphabetical.

4d). Click OK (closing the Quest window). Save.

4e). Go back into any initial locational topic which includes "But you have already been to that location" (aaaUndertow for me), and add the second locational topic into its Choices box. Add the No topic as well, keeping things alphabetical if desired. I am seeing this...

aaaDoublecross
aaaNo


5a). QUEST window > Quest Data tab
Time to add more to the main script. At the top of the script, you should be seeing something like this...

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

scriptname aaaBountyScript

short DoOnce
short Timer
short StartDay


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

.... now it's time to add more variable functions to this list, so that here is what you'll see at the top.

scriptname aaaBountyScript

short DoOnce
short Timer
short StartDay

short StartDay2
short Timer2


It doesn't matter which order those extra lines of text get added. It helps to organize this text to your liking, though.

5b). Click the Save icon, and close the script. Close the quest window. Save. And reopen the quest window. Reopen the script too.

Altogether, the script should be looking like this now...

-------------------------------------------
scriptname aaaBountyScript

short DoOnce
short StartDay
short Timer

short StartDay2
short Timer2

Begin GameMode

If (Timer == 0)

If (aaaNPCEnemyRef.Dead == 3)
Set StartDay to GameDaysPassed
Set Timer to 1
EndIf
EndIf

If (Timer == 1)
If ((GameDaysPassed - StartDay) >= 3)
Set Timer to 0
Set aaaNPCEnemyRef.Dead to 0

EndIf
EndIf

End


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

....but a lot of extra lines are going to get added. In fact, an entire second timer script is getting added, so that in total, it'll look like this...


scriptname aaaBountyScript

short DoOnce
short StartDay
short Timer

short StartDay2
short Timer2

Begin GameMode

If (Timer == 0)

If (aaaNPCEnemyRef.Dead == 3)
Set StartDay to GameDaysPassed
Set Timer to 1
EndIf
EndIf

If (Timer == 1)
If ((GameDaysPassed - StartDay) >= 3)
Set Timer to 0
Set aaaNPCEnemyRef.Dead to 0

EndIf
EndIf

If (Timer2 == 0)

If (aaaNPCEnemy2Ref.Dead == 3)
Set StartDay2 to GameDaysPassed
Set Timer2 to 1
EndIf
EndIf

If (Timer2 == 1)
If ((GameDaysPassed - StartDay2) >= 3)
Set Timer2 to 0
Set aaaNPCEnemy2Ref.Dead to 0

EndIf
EndIf

End


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

As can be seen, the top timer deals with the first quest, associated with the first enemy. Now, there is a second timer (Timer2) which is associated with the second enemy. For every new enemy / quest / quest-location, you'll need to also add a new timer script! And again, both timer scripts will reset after three days have passed, though this reset can be changed if you'd like.

Note: I have found that a maximum of five locations can get added overall. Nothing wrong with going for more than five, per NPC agent's dialog, per town (so that I've got five in Leyawiin, five in Bravil, etc). But just keep in mind that I haven't tried more than 5.

5c). Save the script and close it. Close the Quest window and save all work.

At this stage, the player has gotten the quest, the second enemy has been killed, and now it's time for a reward.



6a). QUEST window, Topics tab
The return GREETING has already been written, and won't need to get altered. Instead, go to the Reward topic. Right-click > New into the Info window, and add some dialog. "The peoples of Blankenmarch thank thee, for taking care of Fort Doublecross..." is what'll go into my game.

6b). In the Conditions window, here is what goes....


GetIsID aaaQuestAgent == 1.00 AND
GetScriptVariable aaaNPCenemy2Ref, Dead == 2.00


6c). And here is what goes in the Result Script box...

Player.AddItem Gold001 X
Player.RemoveItem aaaQuestNote2 1
Set aaaBountyQuest.DoOnce to 0
Set aaaNPCEnemy2Ref.Dead to 3



And, time for the final bits. The script below gets added to the main script, and makes sure the enemy boss gets sent back into the cell where he/she initially started.


7a). OBJECT window > World Objects > Static
Click on anything in the right side of the Object window, and press X. Now go into the Render window. Chances are the enemy boss will still be onscreen, unless you moved away from this boss.

7b). If the enemy is in a multi-celled lair (for instance, if the enemy is in FortDoublecross02 instead of FortDoublecross01) you'll want to get into the initial cell, in this case, FortDoublecross01. If the enemy is in a lair which only has one cell, it'll be less work.

7c). Get to the initial cell's entry door. Typically, this is going to be the very FIRST door the PC walks through, to get into the initial cell.

7d). Go back to the Object window, and drag an XMarker from this window into the initial cell. Try to place this XMarker somewhere right behind the initial door, right on its floor, somewhere that the character will definitely walk across. Give this XMarker a Reference ID. I am calling it aaaXMarker for this lesson.

7e). Save.

7f). QUEST window > Quest Data tab
Open up the main script. And add this script anywhere onto this page between its Begin / End block...

If (aaaNPCBossRef.Dead == 1)
If (Player.GetDistance aaaXMarker <= 500)

aaaNPCBossRef.MoveTo aaaMarkerHeadingRef

Message "I have entered the lair called X. The evil, it simmers from within...", 30



EndIf
EndIf


This script will ensure that the enemy boss gets moved back where it should be, in real-time, and its message lets the player know the script has worked. The only possible remaining issue is if that enemy somehow got located outside of his/her lair. If so, another idea is to attach aaaNPCBossRef.MoveTo aaaMarkerHeadingRef into the Result Script box when the reward is given. It is also possible to use both scripts (one for the main script, another for the Reward's Result Script box) which is best of all.

Anyway, this script can go anywhere within the Begin GameMode / End block. To keep things nifty, I like to put it outside of any other If / EndIf blocks. Example of the final main script is below.

scriptname aaaBountyQuestScript

short DoOnce
short Timer
short StartDay

Begin GameMode

If (Timer == 0)

If (aaaEnemyBossRef.Dead == 3)
Set StartDay to GameDaysPassed
Set Timer to 1
EndIf
EndIf

If (Timer == 1)
If ((GameDaysPassed - StartDay) >= 3)
Set Timer to 0
Set aaaEnemyBossRef.Dead to 0

EndIf
EndIf

If (aaaNPCBossRef.Dead == 1)
If (Player.GetDistance aaaXMarker <= 500)
aaaNPCBossRef.MoveTo aaaMarkerHeadingRef

Message "I have entered the lair called X. The evil, it simmers from within...", 30

EndIf
EndIf

End



[b]9).[/9] Voila. Time for a glass of wine.

Posted by: Renee Oct 25 2018, 10:59 PM

Lizard Men! -- Game: TES IV: Oblivion

https://i.imgur.com/QnGNiay.png

This one is not very comprehensive. Just something neat I added into my own game.

In TES 1: Arena, there were no Argonian enemies, https://images.uesp.net//2/2b/AR-creature-Lizard_Man.gif. These were similar to the primitive, reckless creatures found in many of the tabletop games: DnD and others. I wanted to put lizard men back into the Elder Scrolls series, starting with Oblivion. Because they were in the first game, so there.

This is going to show how I got lizard men into my game, and also how I added them to Leveled Lists, so they'll appear as generic enemies. Mostly in monster and goblin lairs, but also in underwater outdoor locations.

1). OBJECT window > Actors > NPC > Argonian
Select either Male or Female, and then scroll down to the V section. Any of the Veyond Argonians can be used (VeyondArgBossMale1, for instance).

Funny thing. I never really noticed that Argonian enemies are actually pretty rare in the fourth game! But yeah, they don't appear as bandits or conjurers or any other generic enemy except Marauders, I think. This only furthers my quest to add these into the game. Lizard men are not the same as Argonians though, as we'll see.

2a). Edit one of the Veyond enemies. Change ID, change Name. Class can be changed to whatever enemy-class fits best, such as BanditMelee for one which primarily uses melee weapons.

Make any changes you'd like to Stats, but make sure No Low Level Processing stays toggled on.

2b). Factions tab
Add or remove factions that seem pertinent. I tend to think lizard men will dwell mostly around creatures, so I added Lizard Man Warrior into the Creature Faction, removing him from VeyondCaveBandits.

2c). Inventory tab
Lizard men also don't go around wearing silly town clothes, in fact, the Veyond bandits aren't wearing anything much at all. I gave my lizard a Leather Shield, a Club, and left the two Leveled List selections alone. Gave the guy Leather Greaves though, otherwise he'd be walking around in loincloths, which is even sillier-looking than town clothes. Up to you, of course.

3). Click OK, saving as a New Form.

4a). Main Toolbar > Character > Faction
The Lizard Man deserves his own faction, and for dialog purposes, it's easiest just to make a new faction, just for the lizards. Right-click > New into the Factions window.

4b). Give the faction a name. I am calling it aaaLizardmen. Yeah, real original.

4c). Name the faction (in the top-center Name slot) and toggle "Hidden from PC" and "Evil" on.

4d). In the Interfaction Relations window, right-click > New and make this faction friendly, or hostile, or somewhere in between, to whatever other factions are in the game. Since my lizard men will primarily be put into Creature dungeons, I selected this, then put 70 into the Disposition Modifier slot. With 70, there is a chance there'll be occasional disagreements between the lizards and (let's say) some goblin or rat. They aren't totally rational beings.

4e). Keep the Faction window open.

5a)
. Reopen the Lizard Man's NPC panel, click the Factions tab, and drag the faction just made into the Lizard Man's Factions window. Click OK.

5b). Close the Factions window.

Main toolbar > Dialog button
(this is the button which has a quote bubble for an icon).
Lizard Men are supposed to be primitives. They live in their own society, away from the colloquial civilization of Cyrodiil. They are basically like slightly-more-intelligent animals, since they have their own language, and can wield weapons. This being said, it'd be rather silly if they go around saying "How does the day greet you friend?" talking like any other NPC, if they are supposed to be monsters. laugh.gif

6a). Once the Dialog panel opens up (and it can take a few seconds) the Filter scroll-bar should automatically be on the lizard's ID IF aaa is at the front of the ID's name. If this ID is not showing in the filter, go ahead and find it.

6b). Click on the Conversation tab. This tab controls all the silly conversations NPCs normally say. In the center-left Editor ID (this is the tall window) there's a long list of topics. We're only going to focus on Hellos.

6c). Left-click on Hello. Scroll down to GenericArg. The first Argonian greeting is "Blessed we are." In the Conditions window, notice that there are two conditions: only Argonians are going to be able to say this.

6d). Add a third condition, which is GetInFaction aaaLizardman != 1.00

6e). Copy this Condition, then Paste it into all the other GenericArg Topics below.

6f). Scroll down to the Generic topics which do NOT include the Player in the NPC column. The first generic topic which qualifies is "Good Morning."

6g). Paste the same condition into Good Morning's Conditions window.

Pay attention to the variety of conditions which appear as you scroll downward. "You're making me nervous, sneaking around like that" is never said by any NPC I've ever heard. The aaaLizardMan condition won't need to be pasted into this one.

Also, any racial Hellos can get skipped. The game recognizes lizard men as Argonians, but not as Imperials, Orcs, High Elves, etc.

Any Generic Hellos which feature low Disposition ratings can also get skipped. Anything below 20.

6h). Click on the Combat tab, and click Attack in the Editor ID window.

Some of these Attacks can be kept. Anything not in plain English, for instance, such as "Huuagh!" or "Arrgh!" could potentially be said by a primitive beast. Anything English though, can get removed from lizard men dialog by pasting the same condition which was pasted into the Conversation tab topics.

Again, a lot of these Generics can be skipped. The lizard man character is not an elf for instance, so it's pointless to paste the GetInFaction aaaLizardman != 1 condition in.

6h). Detection tab
Every single selection in this tab will need to have that same condition pasted in. Good news is though, the job is finally done.

6i). Click OK, closing the Dialog panel, click OK on the NPC panel, and save.


Time to add these lizards into the game. If put into Leveled Lists, they will show up randomly

7a). OBJECT window > Actors > Leveled Creature
Find any list the lizard can possibly get added to. Since these lizards are friendly to goblins and monsters in my game, I started with LL0Goblin100. Double left-clicked on this selection.

As can be seen, there are three possible goblin-types which can appear in this list, all of them Level 1. Any instance of LL0Goblin100 (in a goblin lair or outdoors) will cause one of these three types to show up 100%

7b). Right-click > New into the window, and find the lizard man, or a lizard man. In my game so far, I've got aaaLizardmanWarrior and aaaLizardmanSwimmer (the underwater / swamp version). Swimmers don't carry weapons or shields, but are good with Hand-to-Hand. wink.gif Now, there is a chance one of lizards can show up, along with any one of those three goblins. Basically, there is a 25% chance the lizard will appear from that LL0Goblin100 list.

7c). The Level slot can be changed if desired. For instance, if the lizard man is not to appear until the PC is Level 6, this can be changed from 1 to 6.

7d). The Count slot can also be changed. By default, one lizard man (or one of those goblins) will appear from that list. If the slot is changed to two, now two will appear instead of one.

If more than one get added into Leveled Lists, chances are the Dialog window will need to get opened again. Go back into the Conversation tab, and paste the GetInFaction aaaLizardmanFaction !=1 condition into any conversation topic which goes beyond the Hellos. In other words, the lizards won't say any Hellos, but if there are more than one of these in the same cell, there's a chance they can still meet & greet and fall into a silly NPC conversation.

Same condition can be pasted into Goodbyes as well.

7e). Click OK. Save.

7f). Continue to scroll down the entire list of enemies, adding the lizard into whichever lists seem appropriate. Since Argonians can stay underwater indefinitely, I put the swimmers into some LL0WaterShallow and LL0WaterDeep lists, so they'll occasionally replace mudcrabs and slaughterfish respectively.

Posted by: Lopov Oct 25 2018, 11:25 PM

Nice! goodjob.gif I'll be using this mod when I come back to Oblivion.

QUOTE
but also in underwater outdoor locations.


So it's possible to encounter them in Lake Rumare too?

Posted by: Renee Oct 26 2018, 12:04 AM

QUOTE(Lopov @ Oct 25 2018, 06:25 PM) *

So it's possible to encounter them in Lake Rumare too?

If there are generic slaughterfish which swim in there, yes. I know that the infamous slaughterfish from the Weye quest are quest-specific though, so these lizardmen will not replace those. But yes, I did set it up so that "swimmer" versions show up in either shallow water areas (replacing mudcrabs occasionally) or in deep water areas (replacing slaughterfish occasionally).

The really COOL thing is, in theory, the lizards should be able to detect our characters from underwater, meaning they'll be able to emerge from the deep! ... Theory though for now. Has not been seen yet.

Posted by: Renee Oct 28 2018, 02:08 AM

Making an NPC Vendor / Repairist. Game: TES IV: Oblivion

I've got a recurring problem in one of my games, which is a lot of merchants tend to lock their doors at night, and then sometimes never reopen them. And if I use the Unlock console command, what I usually find inside is an empty shop, with no shopkeeper(s). This problem has something to do with Open Cities I think. I don't know. And I do not have much desire to delve into the Open / Better Cities conglomeration of mods. Instead, I'm going to make my own merchants. Surprisingly, making a merchant in Oblivion is much easier than it is in later games!

In Bruma's Nord Winds shop (in Renee Gade III's gameworld only), Skjorta shows up for work, but Ofland never does anymore. Perhaps he got pwned. Or perhaps he got sick of being in Bruma. Now he's in Skyrim. I don't know. Since Renee Gade III got kicked out of the Fighters Guild, and since the smith who runs Hammer and Axe also seems to have joined Olfland, nobody can repair RG3's gear in this town.

I know I can just use console commands to find these guys and bring them back, but screw it. My PC game needs new faces. I decided to make a young NPC named Olfland Junior, who takes over his father's shop.


1). OBJECT WINDOW > Actor > NPC
Find a named NPC who is also a merchant. Do all the usual: change ID and Name, bla bla.

2). Class can be MerchTrader, or change it to MerchSmith.

Note: Do NOT toggle Auto Calc Stats or PC Level Mult on. Toggling these will cause the NPC's inventory to go "grey", meaning we can't control what they buy or sell.

3). Since I am editing a named NPC, it's important to remove any AI they've got, so they don't wander off to Skingrad or wherever. Also, put the NPC into any Factions which are appropriate to where they live.

4). Click OK, closing the NPC's panel. Save as a New Form.

5). Reopen the NPC and click on the AI button.

I am going to make this NPC very "light" on AI. Olfland Junior will basically stand in Nord Winds by its forge 24/7. indifferent.gif He won't go anywhere, he won't even eat or sleep. But one thing he will do is BE there in Nord Winds, so my character and her friends have somebody to buy, sell, and repair stuff from.

6). Right-click > New into the Editor ID window. Give the AI Package an ID, and put Package Type on Wander.

7). Offers Services should be toggled on. VERY important, and easy to overlook this! Click OK.

8). All the various Buys/Sells toggles can also be turned on or off: Weapons, Armor, Books, etc.

9). Change Barter Gold to whatever you'd like. Oldland Junior is in charge of 1000 gold. Quite a responsibility for his 19 year-old self.

10). If the NPC is to Recharge and/or Repair, toggle these on.

11). Click the Save button.

12a). CELL + RENDER windows
Put the NPC in to the cell where he or she will do business. Olfland Junior goes into Nord Winds, by its forge area.

The job is basically done, assuming you just want the NPC to buy random stuff. That is what the "Offers Services" toggle does: it makes them buy random things. If more specific things are to be sold however, continue to the next step.

13). Move into an area of the cell which is not going to be inhabited by anybody. So...out in the void somewhere. We're going to put a vendor chest out into this void, where nobody can steal stuff from it. Bethesda tends to put vendor chests beneath the shop itself.

14). OBJECT window > WorldObjects > Container
Left-click into the Editor ID window (so you've highlighted one of the containers) and type VEN. This should automatically send you down to the VendorChest area, starting with VendorCFightingChance. Any of these chests can simply be edited, for quickest results.

15). Drag the chest into the Render window, out into the void. Left-click on the chest (so the Reference panel opens). Click on the Ownership tab, and find the NPC vendor in the NPC scroll-bar.

16). Put a Reference ID into the appropriate slot, and toggle Persistent Reference on. Click OK.

17). Reopen the chest, either from the Object window or Render window. Drag salable items from the Object window into this container's main window. Bethesda tends to use their hidden vendor chests to sell unique objects. If you choose to do the same, make sure Respawn stays toggled OFF. Click OK.

Conversely, if the merchant is to sell random things as well as buy them, toggle Respawn on, and drag some Leveled List stuff from the Object > Items window. Specific items (not from lists) can also be dragged over.

18). Find the vendor in the Reference window, and double-left click on him or her. Click on the Merchant Container tab.

19). Use the Cell scroll down to find the cell the vendor chest is in. Then use the Reference scroll-down to find the vendor's unique chest.

20). Click okay, and save. Done and done. Oops, I forgot to make sure the shop's door unlocks and locks.

21). Edit a key, and give it a new ID, save, bla bla.

22). Give the NPC this key. Now go back into the NPC's AI button and find the package which is on while they are offering services. Let's say the shop is to open at 8 am, and stays open for 12 hours. Toggle...

At Package Start: Unlock Doors on.
At Location: Unlock Doors on.
At Package End, Lock Doors can be toggled on.

23). Find the shop's main door, and double left-click on it. Don't go outside though, stay inside and open this door's information. Use the Lock tab to assign the key just made to this door.

24). Click on the door's Ownership tab. If this door is part of an existing building it may be owned either by a single NPC, or a Faction. If it's owned by a single NPC who is no longer around, easy. Just make the door owned by the new person. If it's owned by some faction, the NPC can simply be included into this faction.


click OK, click Save, click OK, and save. NOW we're done.

Posted by: Renee Oct 29 2018, 12:17 AM

SEQ Files, Game: TES V: Skyrim

Requires the TESVEdit program https://www.nexusmods.com/skyrim/mods/25859.

This one is not about modding per se, it is about an important step one must take for quest-making, though. SEQ stands for "Startgame Enabled Quest." SEQ Files must be updated every time a new quest gets made or (sometimes) updated for a particular .esp in the Skyrim Creation Kit. Otherwise, the game may not even recognize that a new quest is there, in this .esp.


1). In Skyrim's Data folder, look for the SEQ folder. Make sure it is there. If there is no SEQ file, one can be created in the Data folder, literally by right-clicking > New into the Data folder, and then naming the new folder SEQ.

2). Open TESVEdit. Right-click on any of the files which show up, and left-click None.

3). Find the mod you're working with, single left-click the mod's checkbox, and press OK. Do NOT double-click it, or it won't load properly.

4). After the mod loads, right-click onto the mod's name and select the very bottom selection , which is "Other." Left-click on Create SEQ File.

5). Close the TESVEdit program by left-clicking on the red X up in the upper-right corner. A final panel shows up which lists our mod with a check-mark next to it. Click OK.

6). Go into your Skyrim > Data > SEQ folder and see that your mod now has its own SEQ file. Hopefully it does.

If you've already made an SEQ file in the past, hover your mouse-cursor over this file, and make sure that it has today's date on it. This indicates that the file has been updated.

Posted by: Renee Nov 11 2018, 04:32 PM

Making FOMODs through Fallout Mod Manager

This post is going to discuss making FOMODs for the Fallout Mod Manager version which is found here, https://www.nexusmods.com/newvegas/mods/36901/. There could be other versions of FOMM which are easier, I don't know. Without the notes below though, I would be lost if I tried to make another FOMOD again. Making FOMODs for Fallout is a hell of a lot more involved and even stressful than making OMODs for Oblivion, I have found so anyway. I have heard others say the same, too.

The following assumes an archive file was downloaded, its author is promising a FOMOD can be made from this archive, and now you're going to make this archive into a FOMOD. Not all mods will need this method, of course; only those which are supposed to have their installation simplified by the FOMOD process. Only those which are more complicated than usual, in other words.

1). Open Fallout Mod Manager

2). On the right side of this program, click Package Manager.

3). Again, on the right side, click Create FOMOD. Wait a moment or two.

4). A new panel *POPs* up with two main windows, which is called FOMod Builder Form. It is easiest to just drag the archive into the Source Files window. We can also click the Add Files button and search for the archive this way.

5). Double-click on the archive (opening it up in the Source Files window).

6). Now, drag any folders, files, and readmes over to the FOMod Files window. rolleyes.gif See? More complicated for some reason. Neither OBMM nor Wrye Bash / Oblivion has me doing things so manually. Anyway...

7). Go back to the archive file. NO, not the archive in the FOMod program, go back to the archive in your Downloads folder, or wherever your original archive has been saved. Right-click on this file and choose Rename. Now copy / paste this name into the long, rectangular box where it says FOMOD File Name (without extensions).

Try clicking OK in the lower right corner, and be patient while the program does its work. Chances are some errors will show up, but hopefully one of these is not the FOMOD File Name.

8). Now, have a look at the left side of this panel. The 'Sources" button should be greyed-out. Click on the Download Locations button. IF the chosen mod came with pre-made FOMod stuff (like MMM does) simply click the "Included" toggle on. ... Do not mess with Hidden or General, both of these are for more advanced modders.

9). Click on the OK button again. Chances are some errors will be found, and again, allow the program to list them, because some FOMODs make certain changes that others do not.

-- For instance, if "FOMod Info" has an error, it's usually because of empty boxes that haven't been filled in, like "Mod Author" and "Version." Go ahead and fill in this info manually, but some of the stuff can be left blank. In the Groups box, toggle anything in here (such as Textures, Quests, etc.) These are all the things the mod is going to include.

Click OK again. The program will warn that some stuff hasn't been filled in, but we don't always have to do this.

-- If the "Readme" area has an error, this is simply because any Readme file(s) have not been moved over to the FOMOD Files box. rolleyes.gif Even though we're supposed to be able to pick and choose this sort of stuff.

-- If the "Save Locations" area has an error, go ahead and click on this button and choose the Create FOMOD toggle. As can be seen, there is a "Premade FOMOd pack" toggle as well, but I haven't been able to get it to work, even though MMM is supposed to include premade FOMod stuff. rolleyes.gif Be patient!

10). Click OK. If everything goes right, a new panel will *POP* up with two bars, which should be compressing information, turning green as progress commences. In some cases, these two bars won't show up though, because there isn't any stuff to compress. huh.gif

11). Be patient. If everything goes right, the previous FOMOD Builder panel will close (along with the progress panel) and we'll be back on the Package Manager panel, with our new FOMOD available as a one-click .esp or .esm choice. Go ahead and one-click (or double left-click) on it. If this doesn't work, highlight it, then press the Activate button.

12). Every FOMOD does this next part differently. Just go through all the choices that come up, clicking "Next" when you're ready to move to the next option. MMM, for instance, includes a choice of making the Configuration Menu either an in-game deal (similar to Skyrim's MCM Menu) or it uses an older method of ESP choices.

13). Click Finish whenever the choices sequence is done. If the mod is wanting to overwrite anything (MMM asked if I wanted to overwrite a variety of meshes, for instance), the cool thing is Fallout Mod Manager will let us know if we want to do this.

14). Close the Package Manager by clicking the red X in its upper-right corner.

15).
Now we're back on the original FOMM program. Double-check to see that any .esps we chose earlier are clicked on.

16). Close the program, https://loot.github.io/ and re-open it to make sure everything is still there

Posted by: Renee Dec 1 2018, 06:40 PM

`
Making an NPC follower Game: TES V: Skyrim

Firstly https://www.youtube.com/watch?v=BFHbusKVqZ0 shows how to make an NPC, it goes through all the different features of the NPC panel, Stats tab, Factions tab, etc. Bethesda also has their own https://www.creationkit.com/index.php?title=Bethesda_Tutorial_Creating_an_Actor.

Second, I use https://www.nexusmods.com/skyrim/mods/15524 for the quest component of my followers. What I am about to describe below is merely how to make an NPC follower with basic commands available (Follow, Wait, etc.) and AFT can extend these commands and options. I have found that AFT does the job just the way I'd like. AFT also has a feature (a spell, basically) which can automatically make a lot of NPCs into followers. So all the stuff below is just for gamers who want to custom-make an NPC follower from scratch.

https://www.nexusmods.com/skyrim/mods/16266 is also recommended. Helps them say more things. I have found that not all the voices listed in this mod work, but I have listed the ones that do below.


1). OBJECT window > Actors
Make a New NPC in Object window. Type an ID, a name, and a short name.

2). Make this NPC Unique. This is the most important button for now, on this first page. You might want to make him/her Essential as well, but the Respawn toggle is optional.

I made several generic followers for Sir Vyvoor for instance (a warrior, archer, and spellsword). These followers begin their lives in Windhelm's palace, and in case any one of them gets pwned, another one will eventually respawn in this palace.

Note: sometimes it helps to click OK (closing this new character window) and then reopen it. Otherwise, "Unique" and other selections will keep getting toggled off.

3a). Traits tab: Choose Race, Sex, etc.

3b). Give the NPC a voice in the Voice Type scroll bar. This will make them speak when we tell them to "wait" or "follow", etc. I have found that most voices do not work in the base Creation Kit, even that voice mod linked above. There are two ways to figure out which voices will work, and which do not. The first way is rather blind. Experiment by choosing a voice type, and then going back in-game to see if it works.

The second way to do this is much more specific. In the Object Window, find the Miscellaneous section, then choose FormList. Type "voice" in the Filter slot, and scroll down to VoicesFollowersAll. There are a total of seventeen voices that are guaranteed to work for followers.

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

3c). Raise Disposition Base from 35 to anywhere above 50, unless for some reason that follower is supposed to hate our character.


4a). Stats tab: Click PC Level Multiplier if you want somebody who will level with player, or Auto Calc Stats (ACS) for soembody who is outside these bounds. ACS will cause the person's skills to match whatever their Class is. Clicking both of these OFF is the best way to make the most unique person, with skills as high or as low.

4b). Choose their Class. This is a scroll bar at the very bottom.


5a). Factions tab: very important. Right-click on this window and choose New. Filter the word "follower" and choose Current Follower Faction and Potential Follower Factionn

5b).
Current Follower Faction will need to be -1, meaning the NPC is not a follower yet. Change this from 0 by left-clicking under Rank, and pressing F2. Highlight 0 and type in -1.

Tip: when making multiple followers of the same type (soldiers or guards, for instance), it is possible to set a bunch of factions for one NPC, and then copy all these factions for the next one. Just right-click > Copy Stack from the first NPC, and Paste Stack to any others. Done.


6). AI Data tab: Make the NPC Aggressive if we want him / her to fight. Very Aggressive is only recommended for somebody who can possibly be an enemy to citizens. Also, choose Help Allies. We can go back to the Faction tab to see everyone this person has in his / her Faction.

Note: "Help Friends and Allies" may make the NPC jump into too many battles.


7a). Inventory Tab: we can give them a Default Outfit. Click on the Preview > Full button to see this in real-time. Amazing Follower Tweaks has a neat feature which also allows us to select an outfit which the NPC will wear when he/she is relaxing, which is a way to get them out of an armor suit.

7b). To give the NPC a weapon, click in the middle window > New, and then scroll down whatever object(s) you want. IronDagger or whatever.

... also visit the Spells tab, if the NPC is to be a magic-user.


8). Click OK to save the NPC to the Object window. NOW THE NPC IS MADE, however, it is NOT yet a Follower


9a). In the Object window, go to Character > Relationship. Right-click on the window and select New. It helps to create a Relationship ID with a similar name as the NPC ID, just for convenience. We cannot make this ID exactly the same as the NPC's ID though.

9b). Under Parent NPC, find the name of the NPC, and choose this. This does not mean we are the NPC's parent, ha ha. It merely means we are the one who calls the shots for this NPC, when he/she is following.

-- Child NPC: Find "Player" for this.

-- Relationship Level: select "Ally". This is needed to make sure recruiting dialog shows up for the NPC.

-- Association Type can be left to NONE in most cases, unless we want to further define the NPC somehow.


DONE. To double-check all work, go back to the NPC just created, and look under the Relationship tab. It should have a Player reference here. Now, simply place the NPC where he/she is to begin.


Troubleshooting: if there is no dialog option when the NPC is spoken to in-game, make sure Additional Follower Voices is toggled on in your mod manager. Again, not all this mod's voices work! The NPCs will also not actually speak 100% of the time. I have found that sometimes they speak HELLOs, and sometimes Topic dialog added by AFV, but lots of times they won't.


some Amazing Follower Tweak options:

-- To enable outfit management: Once you're back in-game, talk to the NPC, select Tweak Options > Gear > then scroll all the way down. Toggle Enable Outfit Management on (if it's not already on) and then there are some different choices for City Outfit and Home Outfit. "Home Outfit" might just be them not wearing much at all, and I'm sure there's a way to change this. Basically, there are dozens of options AFT offers, too many to list here!

--There are also ways to get ALL followers to do something at once, manually or remotely. To manually do this, talk to the NPC, select Tweak Options > Actions > then scroll down to the ALL Followers section. We can make all of them follow us, wait, sandbox (relax) and so on.

--To command all followers remotely, got into your character's MAGIC menu, select POWERS, then scroll down to Tweak Commands. Hotkey this. When we're back in game mode, that hotkey toggle will work via the Shout button by default. All followers can be told to Wait, Follow, Relax, etc. Neato!

Posted by: Renee Dec 5 2018, 02:59 AM

Making an NPC Vendor Game: TES V: Skyrim

1a). OBJECT window > WorldObjects > Containers
Left-click into the Editor ID window and type Merch so all the merchant chests show up.

1b). Find a chest that sells things which you'd like the merchant to also sell. Duplicate this chest.

1c). Rename its ID, click OK. And select "no" when the CK asks if you'd like to make this chest into a New Item (since it already is a new item), and confirm this by clicking Yes.

1d): Go into this container's inventory and change anything you'd like. I duplicated VendorMiscChestSmall, which contains several Leveled List items.

Note: Make sure the Respawns toggle stays toggled on, so the merchant will restock their store.

It's a good idea to right-click > New into the Item List window, and add find VendorGold X in the scroll-bar, with the X being "Apothecary", 'Inn", and so on. Since I need a general merchant, I am choosing VendorGoldMisc, and then changing Count to 1. This will give the vendor 750 gold to play around with, though sometimes other mods will cause this amount to vary. Gold can also be added directly into the NPC's inventory window as well, after this NPC is created. Any gold added here will not vary.

1e). If there are any leveled items in the container's inventory which say anything to do with "PerkInvestor X" go ahead and remove these. Since the container was duplicated, sometimes this perk will hitchhike along. Since these perks are already associated with other merchants, we don't want to influence these others with our custom merchant. That can mess up things on their ends.


2a). CELL + RENDER windows
Drag the container into a cell where the vendor will be placed. Put it into the void though (outside of character reach), unless you want there to be a chance that the player will choose to try stealing from this chest. emot-ninja1.gif

Make sure the chest stays onscreen.


3a). OBJECT window > Character > Faction
Right-click > New into the window. Give the faction an ID and Name.

3b). Make sure the General tab is selected. If the vendor will be running his/her own shop or stall, click the Can Be Owner toggle on. This is not important for NPCs added into cells which are already inhabited by other vendors though. For instance, I wanted to add a general vendor into Dawnstar's Mortar & Pestle. Frida (the default merchant there) will gladly buy & sell apothecary stuff like potions and ingredients, but I want somebody else in there who will buy general stuff. This second NPC won't need "Can Be Owner" toggled on.

3c). Vendor tab: toggle Vendor on. And click on the Select Reference in Window button. Double left-click on the merchant's chest.

3d). Put some numbers into the Start Hour and End Hour slots. These numbers correspond to hours in the game, however they must be added in military time .... i.e., 18 instead of 6 pm. If times are not added into these slots, the NPC will not buy or sell at all.

3e). Change the Vendor Buy/Sell List to whatever is appropriate. Since my merchant will buy and sell general stuff, I changed this to VendorItemsMisc.

Note: when choosing VendorItemsMisc, toggle Not Sell/Buy on. This keeps them from buying & selling stuff which should not get bought or sold (such as keys).

3f). Click the Location button and choose Near Self. (Note, we can also choose Near Reference, and I will explain why this can sometimes be chosen later). Click Ok.

3g). Click OK, closing the Faction panel, and save all work.


4a). OBJECT window > Actors > Actor.
Right-click > New into the Object window. Do all the usual: ID, Name, and Short Name.

4b). Toggle Unique on, and click OK (this closes the NPC's panel). Now reopen the NPC's panel.


5a). Traits tab: choose a Race. And choose a Voice Type in the scroll-bar.

Note that not all of these voices will work in-game, and if they don't work, sometimes this can screw up the onscreen dialog as well. It helps to make sure the NPC's voice will work. So since I am making my NPC a vendor, here is what to do.

5b). Object window > Miscellaneous > FormList
Type "voice" into the Filter, so that the window focuses on Voice Types. There are dozens of results in the window now.

5c).
Scroll down to VoicesVendor and double left-click on this.

The FormList panel pops up, and this shows all the voice types which are "safe" to use. There are quite a few. Since my NPC will be an ordinary Nord, I can see that MaleNord is indeed safe to use. Why is this important? It's important because choosing the right voice will guarantee the NPC will say all the things vendors usually say: "You lookin' to buy something?" "Trinkets, odds and ends, that sort of thing," and so on. If they haven't got the correct voice type, they won't say anything. And while to some of you this might be a small blessing, I'm not sure if they'll also be able to participate in buying / selling stuff. sad.gif

5d). Click OK, save. And reopen NPC's info again.


6a). Stats tab: Choose PC Level Mult to make the NPC level with the character. Choose Auto-calc stats (and then give the NPC a level in the Level slot) to make an NPC who will pertain to a specific level. Or choose neither of these, and customize the NPC in the Skills window.

6b). In the Class scroll-down, VendorPawnbroker is a good class for a general merchant. There are also classes geared toward Smiths, Food, Alchemy, and so on.

Notice that when each class is chosen, this will change some of the numbers up above in the Skills window, if Auto-calc Stats is toggled on.

6c). Go through the rest of the tabs as you see fit, giving the NPC some AI, some clothes, some personal objects, and so on. Note that items in the Inventory tab's main window COULD get sold, if the NPC deals in this type of vendoring. For instance, if the NPC is to sell potions, any potions in his/her inventory can get sold as one-time items. This is useful for adding rare, possibly expensive items for sale.

6d).. Click OK and save.


7a). Reopen the NPC vendor's info and select his/her Factions tab. Drag the new faction from the Object window into the NPC's Factions and Ranks window. Right-click > New into this window too, and find the JobMerchantsFaction. These two factions alone are all that's needed for a basic merchant. Our custom faction makes sure the merchant will sell & buy from and to the right container, and the JobMerchantFaction makes sure the NPC will say all the things vendors usually say.

Note: Blacksmiths should not be added into the BlacksmithFaction. JobMerchantFaction will handle all their merchant duties.

It's also a good idea to add one of the crime factions, such as CrimeFactionPale, which is what my vendor will have. This will cause the NPC to freak out and give us a bounty if we get caught stealing something, or attack the NPC. Below the Factions and Ranks window, change the Assigned Crime Faction scroll-bar from None to whichever crime faction was added. Now.... depending how much Confidence this NPC has in her or his AI Data tab, this NPC will either run away if Cowardly is chosen, attack our character if Foolhardy is chosen, or somewhere in between.

A town faction (such as TownDawnstarFaction) might also be a good thing to add. This helps the vendor become part of the town itself, meaning they'll get involved in various things those townies say.

7b). Make sure any factions which are supposed to be "on" have a 0 next to them, under the Rank column. If there's a -1 in this column, change this by highlighting the faction, pressing F2, and changing this manually to 0.

7c).. Click OK, closing the NPC's info, and save.


8). Place the NPC into the cell where the container was added.

The work is basically done. Below are some tips which will make the vendor sell things which are right there in the store. As we buy these items, they will disappear from the store! They will also respawn when the store or stall's cell respawns. Neato.


9a). Grab 'n' drag any items from the Object window, into the Render window, and place these items onto any nearby surfaces. Double left-click on these items in the Render window, and select one of the Ownership tab's scroll-bars, selecting either the NPC vendor, or his/her faction.

9b). Double left-click on any object near where the NPC which cannot be sold, such as a counter or a table, where the vendor will do all vendoring.

9c). Give this object a Reference ID. Click OK.


10a). Double left-click an unsalable object (such as a counter or stall where the NPC will be vendoring) and give this object a Reference ID. Now, make sure this object (counter, stall, whatever) stays onscreen.

10b). Reopen the NPC's custom faction in the Object window, select the Vendor tab, and press the Location button. "Near Self" is toggled already, from step #3f. Change this to Near Reference.

10c). Press the Select Reference button and double left-click on the counter, stall, whatever.

10d). Put a number into the Radius slot, such as 256 or 512. Now, any referenced items placed nearby can be bought in real-time once we're back in-game, and if we can see these items onscreen, they will disappear when bought. smile.gif

Posted by: Renee Dec 15 2018, 02:39 AM

Making a Book bump a quest stage Game: TESV: Skyrim

This post assumes you've already written a quest (even if it's a partial quest) or have an idea for one. And then a book gets used to bump one of this quest's stages, objectives, and so on.

1). Start up the Creation Kit. Edit or Duplicate a book or a note. Give it an ID name and an actual Name. Change its Book Text.

2). Close and save the book as a New Form if you edited it, or don't do so if you duplicated it.

3). Reopen the book/note. In the Scripts section, click the Add button.

4). Type OnRead into the Filter. Two pre-made scripts will show up under [New Script]. Select the second one, which is DefaultOnReadSetQuestStageNotAlias.

Again, make sure you choose the NOTAlias version. For some reason, the first script will not work.

5). Click OK.

This attaches a generic script to the book which has been pre-written by Bethesda, which saves us a lot of time because we don't have to type the entire script!

6).
Go ahead and right-click onto the script, and select Edit Source to have a look at all the text we didn't have to write. How lovely. Thanks Beth, for finally making our scripting endeavors easier.

Close that script when you're done.

7). Click on the Properties button. A panel pops up which should have a couple items in its window: myQuest and myStage. By now, you're going to need to have a partially-written quest already extant.

8). Highlight myQuest. Press the Edit Value button. Look for the name of your quest in the scroll-bar, and select this.

9). Now highlight myStage, press the Edit Value button, and choose the stage which you'd like the quest to bump to, once the book is read.

10).
Click OK, closing the script, and click OK again, closing the book. Or Note. Save, and that should be all.

Note that this can be used for OnAdd (actually, DefaultSetStageOnPlayerAcquireItem works better), OnActivate, and other typical functions found in earlier game scxripts.

Posted by: Renee Dec 17 2018, 12:02 AM

Skyrim Quest Tutorial (WORK IN PROGRESS, do not follow this one!)

So this one is sort of like an introduction to Skyrim quest-making. It rambles a lot, it's not very focused, but itintroduces a bunch of basic concepts, and shows how to use a lot features in the Quest windows. Because making quests in the Creation Kit is waaaaaaaaaay different sometimes than making quests in earlier programs. I wrote all this last year, so for me this is a refresher course, because I don't play Skyrim year-round, so I forgot a lot of stuff.

At the moment, I'm wanting to make a simple quest which gives Sir Vyvoor a horse, which will take place in Whiterun. I know he can just pay 1000 gold and buy one, but wouldn't it make sense that the Dragonborn, which is what Vyvoor is, should just get a free horse? viking.gif I mean, c'mon.

Quests can vary wildly of course. In this one, I already know I'm going to need a note, a horse, and a new NPC. The note is what begins the quest, and the NPC is going to be who my character speaks to. Pretend I am making a note and an NPC therefore. I won't write it all up. Basic notes are pretty much the same as from previous games, they can be edited from premade examples, then placed somewhere in the world. NPCs however, are best started from scratch, especially if this NPC is going to participate only with our quests.

How to make a note and an NPC are described in posts above this one, and the horse will get discussed at the end of this post.


1a). Open Creation Kit. File > Data > open the mod you want, if you're already working on something. If you're not, just double right-click on Skyrim.esm.


2). Object window > Character > Quests. All those yellow icons in the right window pane are quests. Right-click > New into this window.

3). Give the quest a unique ID name, and Quest name. Priority is good at 60 for this tutorial, though it will vary in the future, for some other quests you might write.

4).
Next to ID is a function called 'Type,' which is a scroll-bar. In most cases, we can just choose Side Quests or Miscellaneous. Miscellaneous quests will go into that bottom section of the Current Quests window once we're back in-game, and this is the place for lots of easy things to do, like Fetch or Kills. For this one I am choosing Side Quest.

*Note: to make an NPC who one-lines us with forcegreets (and that is all, this NPC cannot be spoken to more thoroughly) leave the scroll-bar at None. ...

5). Object Window Filter: leave this slot blank.

6). Event is another scroll down. We can leave this on NONE for now.

7). Toggle Start Game Enabled on if it's not already on, leave other toggles blank. In some cases, toggle Run Once on too, if it's not already toggled.

8
). In the Quest Dialog Conditions window, select New, then GetIsPlayableRace == 1.00

9). Close the Quest page by clicking OK. This will allow more tabs on the very top of the page. Once it is closed, SAVE all work. Now re-open the quest.


10a). QUEST STAGES tab
In the Index window, make stages 0, 5, 10, and 20, 50, and 100. Always leave some space between these numbers (don't put 1, 2, 3, 4.... etc.). This way, if you need to add more stages later on, you can put them easily between the ones you've already go.

Stage 0: Left-click on 0. Right-click into the top Log Entry window and do nothing else. It'll say EMPTY. Leave it just like that. Toggle Start-Up Stage on.

Stage 5: Enter an initial Log Entry for 5 (or whatever you put first) by right-clicking > New into the Log Entry window, and then type the first update into the Log Entry box below. Unlike the GECK, whatever we write into the Log Entry box is going to show in-game. In the Papyrus Fragment box, type SetObjectiveDisplayed (5)

The way this quest is going to work, the player finds the note written at the start of this quest. This note is what bumps the quest from 0 to 5. The lesson on how to do this is in the post above this one, so go follow those instructions (if this hasn't been done yet), then come back here.

So two stages are written so far. I will come back to this tab later.

DIALOGUE VIEWS and PLAYER DIALOGUE tabs
In that note, I wrote some dialog explaining who left the note, and to come see her. Again, this is Stage 5. When the player finds whoever left that note, my character will have a conversation with her.

Unlike the Construction Set and older versions of the GECK, in the Creation Kit there are two ways to structure dialog: the Dialog Views tab and Player Dialogue tab. Dialog Views introduces a very visual layout to see dialog (and how it can branch in different directions) as we're adding it. The Player Dialogue tab is a more old-fashioned way to lay out text, though it's also not laid out the same way as in the CS and GECK. Either tab can be used, whichever the modder feels more comfortable with.

11a) Let's start with the more-visual Dialogue Views windows. In the vertical left Editor ID window, right-click > New, then type aaaQuestNameDialogIntro. "Quest Name" can be whatever ID name was chosen in the Quest Data tab. Click OK. Now highlight that text in the Editor ID window, by left-clicking on it once.

11b). In the larger, blank window, right-click > Create Branch. Give the ID for this Branch name like aaaQuestNameStartBranch. Click OK. The CK will automatically add the word "Topic" after this.

11c). Click OK again. A yellow box should *POP* up in the larger window. If it doesn't, just click on another tab (such as Quest Data), return to the Dialog Views tab, highlight the topic name (aaaQuestNameDialogIntro) in the Editor ID window, and the yellow box should show up in the larger right window.

Note: Though I am teaching how to do this in the more-visual Dialogue Views page, keep an eye on what's happening in Player Dialogue as well, just in case you're more comfortable using this page. I actually prefer the older way of doing this, but for this very reason that's why I'm reminding myself how D. Views works.

11d). Double-click in the grey area inside the yellow box. Wait for it. Now a Topic page should open.

11e). The Subtype scroll-bar should stay as Custom, though in the future it is also make this dialog topic into a ForceGreet or Rumor.

11f). "Do all before repeating" is a toggle which works similar to the "Random" toggle in the CS; i.e. the NPC who says this stuff will say something different every time we click on their topic. Since I am writing a one-time quest which gives my toon a horse, I'm not toggling this on.

11g).
Topic Text is similar to what is in the CS as well. This is what we can click on as we speak to this NPC in-game. Priority can be left at 50.

11h). Double-click in the large Info window so that a New Response page pops up. The Response Text is what the NPC will say when we click on that topic.

11ii). Script Notes is sort of like a "notes to self" sort of area, which has nothing to do with in-game stuff at all.

11j). Idle Animations has a scroll bar for Speaker and Listener. And this will cause the NPC or PC to do certain things (such as gesture, clap hands, etc.) when dialog is being spoken. In most cases, both of these can be left at NONE.

11k). Give the NPC an Emotion and Emotion value, and click OK. A larger Topic Info page now pops onscreen.

11l). Prompt was first used in the GECK, and now we've got it in the CK. It is an overwrite feature, which will replace the Topic Text above it. Prompt will railroad the player into a specific discussion, so if you choose to add a Prompt into dialog, you won't see Rumors or any other choices at this moment, once you're back in-game.

Again, those who are familiar with Prompts in the GECK already know how it's possible to use the same topic over and over again, merely writing up new prompts for the player to click on, instead.

11m). We can see the Response Text we added a moment ago, and we can add more Responses by right-clicking > New into this long horizontal window.

11n). Conditions is similar to the CS. GetIsId is the default condition for this small page, which makes things SO convenient, since GetIsID is the most common condition. We can also put GetStage and other typical functions for this area.

Now comes the weird part. To make the dialog show up onscreen once we're back in-game, a Sound File must be made for the dialog which was just typed, otherwise the text will remain onscreen for literally a millisecond. Now, this sound file does NOT need to have any actual sound, that's the good thing. smile.gif

11o). Double left-click on the first Response Text which was just typed up, so the Edit Response panel pops up. There should be a Voice Type listed in the bottom window which corresponds to the NPC who says this dialog (MaleNord, for instance). If there isn't anything in this window, you'll need to go back to the NPC and make sure an appropriate Voice Type is chosen.

11p). Highlight this Voice Type. Now click the Record button. If you have a microphone, you can record your voice if you feel confident, but this is not 100% necessary. It is possible to just record silence. But there MUST be an appropriate amount of silence (while reading the text) so that the actor's mouth moves for an appropriate amount of time. In other words, if there's no actual dialog, press the Record button, then count to ten or whatever. Click Done.

11q). Click again on the VoiceType (MaleNord or whatever), and click the Save button. If a warning shows up saying this file already exists, it's because there is already a MaleNord (or whatever) file saved. Ignore the warning.

11r). If some actual voice was recorded, highlight the same Voice Type text, and click the Preview button to have a listen how awesome, or silly that voice sounds.

11s). Toggle the From WAV ON, and press Generate Lip File. Click OK.

11t). Toggle Has LIP File off, but Force Subtitle on.

11u) In Scripts End box, type GetOwningQuest().SetStage (10)


12). Click OK, OK, and OK, closing out all the quest windows, just to make sure everything is saved. SAVE. Reopen the Quest.


13a). DIALOG VIEWS tab:
Left-click the top of the EditorID name` (the top-yellow part of the box), and right-click > Add Topic. When the Topic page opens, the ID can be QuestNameYes if we want to make a Yes/No scenario. Add some text in the Topic Text slot, too. Since my character just got info about attaining a free horse, this'll say "You are giving me a horse?"

Tip: Once you're back in the Dialog Views tab, it's possible to click on the 'Show all text' toggle at the bottom of the panel if you want to see all the text typed up so far.

13b). Click OK. Again, the New Response panel *POPS* up. Write some Response Text that the NPC will say. "Oh yes, you've done many great things for us..." etc.

Follow all the steps from 13j to 14 for all dialog, to make sure recordings are made, even if they're silent.

13c): Back on the Dialogue Views tab, left-click into the first batch of NPC text. The cursor changes to a hand. Now, drag this hand over to the topic which follows the initial one. We can see how the conversation will flow now, right?

Have a look now in the Player Dialogue tab, at the initial topic. Note that in the Link To window (which is center-right) this initial topic ("Are you the one who left that note?") has been linked up to the topic which follows ("You are giving me a free horse?"). If you're not using the Dialogue Views tab, topics can still be linked manually by right-clicking into the Link To window, clicking Add Link and find the topic which follows. By doing all this, we do not need to make the quest SetStage as often as was needed in the CS and earlier GECK versions.

Click OK and OK, closing quest windows. Save.


Time to go backwards for a moment. I'm going to add an onscreen update into the game now, so that when the player finds the note, a message will flash onscreen.

14a). Quest Objectives tab
The Quest Objectives page works in a similar manner to the GECK. Right-click > New into the top horizontal window.

14b). Type the number 5 into the Index slot. And type some text into the Display Text slot. Whatever gets typed in there will be the onscreen update (and will show in the quest journal as well).

14c). Go into the Quest Stages tab, and select Stage 5. In the Papyrus Fragments box, type SetObjectiveDisplayed (5).

14d). Since dialog already bumps the quest up to Stage 10, let's go ahead and take care of 10. Right-click > New into the top Log Entry window, and type an update into the Log Entry box below it.

14e). In the Papyrus Fragments box, type SetObjectiveCompleted (5), and then SetObjectiveDisplayed (10). Go back into the Quest Objectives tab and type make and objective for Stage 10.

Click OK, and save. Reopen the quest window, with the Quest Stages tab showing.

Now comes the part that's really different. Once the player speaks to the quest-giver, she's going to ask for "tacking fees" of 150 gold before the horse becomes ours. So this horse is not really free. Plot-twist. In the CS and older GECK, all that was needed was to use a GetGold condition so the game could see if we've got enough to afford these fees. But getting the game to see our gold is now more complicated than it was.

14f). Select Stage 100, which is the final stage, so toggle Shut Down Stage on. Click the Properities button (this is right under the Papyrus Fragment scripting area).

14g). Click the Add Property button. For the Type scroll-bar, look for MiscObject. In the Name slot, type Gold001. Click OK, and click OK.

14h) In the Papyrus Fragment box, type Game.GetPlayer().RemoveItem (Gold001, X) , with "X" being whatever you think is fair. Also type...

SetObjectiveCompleted (10)
stop()


..........That is it! "Stop()" is what shuts down the quest. Now, to make sure the horse becomes ours.

15. OBJECT window > Actors
Type EncHorse into the Filter, and duplicate one of the horses which show up. Note that there are saddled and unsaddled versions to choose from.

Put into world somewhere (near a stable, usually). Give horse Ref ID. Click the horse's Ownership tab and make this horse belong to the NPC added earlier, the one who's giving all the dialog so far. Make sure the horse stays onscreen.

16a). QUEST window > Quest Aliases tab
Time to add some aliases to this quest. This is one of the huge differences between the Construction set and Creation Kit: we can create references to objects much more specifically in this latter program. References are going to be made for the player, gold, the horse, and the quest-giver. These references will make more sense later.

16b. Right-click > New Reference Alias. After the Reference Alias panel pops up, fill in the Alias Name slot with the word "Player" (without quotes, of course). Toggle Unique Actor on, and find Player in the scroll-bar. Click OK.

Note: Chances are the OK button for the Reference Alias panel will be off-screen. If so, single left-click on the Alias Name (so a cursor appears next to the name you typed earlier, which should be Player) and press Enter. This should close the panel, saving everything just added to it.

16c). Do all the steps in 16b, but this time type Gold into the Alias Name. Toggle Create Reference to Object on, find Gold001 in the scroll-bar, and leave everything else as-is. The entire string of information should be "Create Reference to Object: Gold001, Level: Easy, Create: at Player. Close the panel, again using the method from 16a, if the OK button is not onscreen.

16d. Follow all steps from 16b again, this time type Horse into the Alias Name slot. Toggle the Specific Reference on, click the Select Forced Reference button, then click the Select Reference in Reference Window button. Double left-click on the horse, and click OK. Close the panel.

16e). Last one. Follow 16b again, but this time, type QuestGiver into the Alias Name slot. Toggle the Unique Actor on, and find the NPC who speaks to us during the quest. Close the panel. Click OK. save.


17a). DIALOGUE VIEWS or PLAYER DIALOGUE tab
Whichever is preferred. Go back to the last bit of dialog added, which is "You are giving me a free horse?" Add a GetIsId and GetStage into the Conditions window. The stage so far is 10.

17b). In the Scripts: End box, type GetOwningQuest().SetStage (20). Click Ok, but leave the Quest window open.

17c). From here on, I'm going to be working in the Player Dialogue tab. Right-click > New into the gigantic window on the right, and type some text. "Well it's not exactly free. We'll need to charge some tacking fees..."

17d). Now, notice in the Topic Text slot, the same text from the first entry ("You are giving me a free horse?") is still in this slot. Do not change this. Instead, type something into the Prompt slot. "You want to charge me for this horse? How much, then?" All of this is similar to the way the GECK from earlier Fallout games works. We can keep the same topic going, substituting different prompts for the player to click on as the conversation commences.

17d). Follow steps 11j through 11t to add voice or silence, animations, facial emotions, etc.

17e).. GetIsID and GetStage can be pasted from the previous bit of dialog, but change the GetStage to 20. Now, if the player backs out of conversation early, he or she won't have to go through all that text about a horse being offered again.

17f). TBC

Posted by: Renee Dec 29 2018, 04:04 PM


Repeatable Bounty Quests II (innkeeper involvement). Game: TES IV: Oblivion


This post shall deal with Respawning Bounty Quests, but it's different from the process I detailed earlier in this thread. Again, the quest-giver won't give us this bounty quest just once. It can potentially happen over and over, as the game respawns every 3 days.

The main difference between this process and the previous bounty quest is: the request to take care of some baddie shows up occasionally when speaking to particular NPCs. We go to speak to this person (to rent a room, usually) and sometimes he or she will want the PC to do something about the boss of some local lair. Once we have done what this NPC wants us to do, it's then possible to go back for a reward from that NPC, or some other NPC. Like the previous method, this one can potentially happen every 3 days. Again, this adds to the roleplaying side of things just like the previous method, but the involved process is more random.

Since the NPC's request shows up randomly, the player never knows when the NPC will give the option to start things. Because of this, when the quest finally shows up it feels more natural, as it becomes a part of conversation only occasionally. I have gotten this to work with numerous NPCs, mostly innkeepers.

The subject of my first respawning quest is the most difficult to work with, but I didn't know this at the time. I got the inspiration for this idea after visiting Malene of Roxey Inn, and she's more complicated to work with than some others. The idea: Malene already knows my character (Renee Gade III), since Renee has helped Malene in the past during the Gravefinder's Repose quest. So the idea was: those pesky necromancers have returned, and Malene needs RG3's help again! emot-ninja1.gif But Malene will ONLY ask for this help AFTER The Gravefinder's Repose is done.

Since Malene has a pre-written Bethesda quest associated with her, she required some extra steps be taken to make my idea work. Other NPC innkeepers (Foroch, owner of Gottshaw Inn, for instance) did not require as much help to get similar quests running. In this post I will be trying to provide details for the different methods followed for several different innkeepers.


1). Open Construction Set, bla bla bla.

Innkeepers who aren't in walled towns make perfect quest-givers, because their places of business are not as protected. Whether it's Malene, Diram Sirethi, Candice Corgine, Foroch, and so on, these people have an interest in keeping the area near their establishments safe. But the thing is, using each of these innkeepers as quest-givers will make things different every time. Each one requires a unique approach.


OBJECT window > Actors > NPC
First thing to do is perform some research on the innkeeper / quest-giver. Double left-click on one of the names listed (Corgine, Malene, Diram, etc.), and click on their Dialogue button. The Dialogue panel takes forever to open. Once it does, look at the NPC's GREETINGs.

On the top right-hand side of the Dialogue panel is a large window, listing all the quests these NPCs will have for greetings. There is dialog which deals with Crime, as well as some Generic greetings. In some cases, they will also have greetings which deal with quests, such as SQ05, which is https://en.uesp.net/wiki/Oblivion:The_Gravefinder%27s_Repose.

It's time to determine if the chosen NPC is already involved with any other quests. Are any of these quests current in our character's game? Have they already been done? Or have any not been started yet? If there are any quests, will they be ignored by the character? Or will they eventually get tackled?

Some innkeepers are involved in quests, and some are not. Either way, look at all the GREETINGs the NPC has. If our character is in the middle of some quest (or eventually will be) an innkeeper deals with, you need to then look at these individually, and find their Priorities. In some cases, there might not be any quests being done any time soon. If there aren't, look at the innkeeper's Generic greetings. Generic greetings often have lower Priorities than quest greetings.

For instance, I am going to tackle Candice Corgine first. Candice Corgine of Pell's Gate's inn has a bunch of Crime greetings (which can be ignored, unless your character is some sort of constant criminal). She also has DAClavicusVile, aka https://en.uesp.net/wiki/Oblivion:Clavicus_Vile, which has a Priority of 60. She will give her innocuous Clavicus Vile greeting when spoken to ("Welcome to Pells Gate, friend."), but only if this quest has not been started yet, or we're in the middle of it. She also has Vampire greetings, one Thieves Guild greeting, and several dealing with the MQEndgame. MQEndgame greetings only show up once the Main Quest is done.

Rule out which quests you've done, and ones which you're in the middle of. If your character is not a vampire for instance, you don't have to worry about Vampire greetings. If your character has done the Main Quest, look at the Priority for MQEndgame's GREETINGs (Priority is 12). Once all these are ruled out, this leaves DAClavicusVile. If the character meets Candice before DAClavicusVile is done (Priority is 60), there are three choices, assuming you want your greetings to show up in-game.


1). Simply lower DAClavicusVile's Priority to 5 or below, ONLY if you're positive you're never going to do this quest. Maybe your current character could care less about daedric quests.

2). Finish the quest in-game, or

3). SetStage the entire thing with the console. Again, this works if your character never intends to do this quest.


Once those greetings get ironed out, this leaves the greetings for Bethesda's "Generic" quest (literally, it is called "Generic" in the Quest window), which mostly dispenses random dialog such as "Good day" and "Well met."

As I said before, for each innkeeper that gets looked at, approaching their Greetings goes differently.

> For instance, https://en.uesp.net/wiki/Oblivion:Foroch, the wood elf who runs Gottshaw Inn, is not involved with any quests. So, just look at any Generic greetings he has. The Generic quest has a Priority of 5. Since Foroch hasn't got any quests associated with him, this means there are no other quests that introduce dialog with Priorities higher than 5.

Therefore, a revolving bounty quest that only involves Foroch can also have a Priority of 5. This Priority rating can get raised, for those who want to see their GREETINGs showing up more often. These greetings will still be competing with Generic though, so moving Priority higher than 5 won't automatically make any added greeting trump those of the Generic quest 100% of the time.

>>https://en.uesp.net/wiki/Oblivion:Candice_Corgine has a bunch of generics she can randomly say, once the DAClavicusVile quest is out of the way. Again, the Priority for Generic is 5. Assuming no other quests are being involved with Candice, 5 can be chosen for her revolving bounty quest. Or, choose a number higher than 5. Maybe 7 or 9 or 15.


In some cases, the NPC will give GREETINGs which are Generic, but specific to a certain race.

>>> https://en.uesp.net/wiki/Oblivion:Diram_Serethi is like this. Assuming MS47 (the Aleswell Invisibility quest) is done, he will begin giving Greetings which are from the GenericDarkElf quest, which has a Priority of 6. Therefore, a bounty quest which involves him should also have a Priority of 6 at the very least.


So, as can be seen from the list above, Foroch is the least demanding, Candice has some issues which need to be addressed, and Malene and Diram are the ones who will require the most tweaking, since both of them are the most-directly involved.

QUEST window, Quest Data tab
2a). Start a new quest. For this lesson I am calling its ID aaaBountyQuest, though in-game I've got names which are more elaborate, such as aaaMossRockCavernQuest. Whatever you name it, this quest won't require a Name in its Name slot, but you can add one for reference. And add the appropriate Priority. GetIsPlayableRace == 1 goes into the Quest Conditions window, as usual.

2b). Start a script which looks like this...

----------------------
scriptname aaaBountyQuestScript

short DoOnce

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

Save using the Save icon, close script. Click OK (closing the quest window) and reopen the quest. Find the script in the scroll-bar, and click OK again.

Substitute the name 'aaaBountyQuestScript' with something more specific, if desired. In my game I've got several of these bounty quests going, each with a name pertaining to its location.


If you're working with Malene, keep reading. If working with any of the others, skip to step 5a.

2c). For Malene, find SQFN in the Editor window (the long, vertical scroll-down box on the left side of the Quest window). SQFN stands for Side Quest FiNished, and it deals with NPCs who greet us after some official Beth quests have been done. ..... So, once Gravefinder's Repose is done, that's when Malene will begin to use Topics and dialog found in SQFN.

2d) Topics Tab
Look at Malene's GREETING, and she only has one GREETING in this window, which is "What can I do for you today?" ... Note the Conditions for this GREETING. One of them is GetStage SQ05 >= 100, meaning she will only say this once SQ05 (Gravefinder's Repose) is done. Malene will say this GREETING randomly, along with about a dozen other Beth-added GREETINGS, such as "What?" and "Good to see you."

We're going to include our own GREETING mixed in with all these others, so that she will only greet with any material we write once in a while. However, there's a small problem. If we include "What can I do for you today?" with our own GREETING, the game will only recognize the official GREETING from Bethesda, ignoring ours entirely.

2e). So Step #2e might seem rather controversial. I'm going to give this GREETING to somebody else, preferably somebody who will never be spoken to in-game, and/or is preferably not involved with any other quests. Just go to the Conditions box, click on the GetIsID function, and change its NPC to some other NPC. I chose Malintus Ancrus, which is the person right below Malene. Although Malintus is involved with some Thieves Guild stuff, my current character is not into TG, so this works for her.

3). Click OK, closing the quest window, and save.

4).

5a). Open up the bounty quest started earlier, starting with the Topics tab. Now to add your own GREETING. I made one which says "You're back, and I've got a problem."

5b). In the Conditions window, add a GetIsId for whomever this pertains to (Malene, Diram, or whomever).

6). Click OK, exiting the Quest window and SAVE.


OBJECT window > Actors > NPC
7a). Time to make an NPC enemy. If you are working with Malene / Moss Rock Cave, quickest method is to edit a generic necromancer, such as NecromancerBossMaleBreton, saving this NPC as a New Form. Likewise, if you're adding this NPC into some lair full of bandits, you can edit an actual bandit, and so on. Edit generic enemies though, not named ones. And do not edit anybody associated with Shivering Isles. SI NPCs will have SE at the front of their ID names.

7b). For the purposes of this lesson, I'm going to call the edited enemy boss aaaNPCBoss as a Base ID. In my actual game, they've got names which are more specific, such as aaaMossRockWitch or aaaHomesteadWarlord, etc.

7c). If this generic enemy has any sort of script, make sure to change the Script scroll-bar to NONE.

8). Make sure 'Respawn' is toggled on, but 'No Low Level Processing' is toggled off.


9a). Go to the Factions tab and double-check the enemy is in the correct faction(s). Necromancers for instance are usually going to be part of two: the NecromancerDungeon and NecromancerFaction factions. If you edited an actual necromancer, these factions will probably, already be chosen. Same goes for bandits, marauders, conjurers, and so on.

In many cases, there's no need to mess with the enemy's AI, but have a look at it anyway. Most of the time, their AI will include two Wander packages, maybe a Sleep or an Eat package. As long as there's a wander package for IsInInterior (rather than some specific dungeon) this is good. As long as the NPC enemy is placed in an interior, he or she will wander around a bit, but won't just leave.

9b). Also, delve into the Stats tab. I prefer to make my NPC a boss-type with lots of health, or I'll offset him / her several levels above my character using the PC Multi toggle.

9c). The Inventory tab can be important too. Usually for generics, this tab will be packed with armor, clothing, weapons, and other items drawn from Leveled Lists. It's a good idea to keep these lists intact. Doing so will ensure the boss will be wearing / carrying different gear every time he/she is encountered.


10). CELL / RENDER windows
Go into the cell where this enemy shall be placed. So for Malene / Moss Rock, the NPC enemy is placed into MossRockCavern. For Candice Corgine, she wants my toon to do something about either Fort Homestead, or Horn Cave. Diram Serethi wants us to do something about Fort Caractacus again, and so on.

Drop the NPC somewhere in this dungeon, preferably somewhere toward the end of it (so that he/she gets encountered near the place's end, or in a boss room). This will ensure that most, if not all, of the location's enemies will have been dealt with, by the time the hand-placed boss gets encountered.

11a).
Give the NPC a Reference ID. I am using aaaNPCBossRef for this lesson, but the actual names in-game can vary according to location. For instance, the necromancer of Moss Rock is called aaaMossRockBossRef. Whichever Ref ID gets chosen, copy this name so it can be conveniently pasted into scripts later.

11b). Click OK, closing all the NPC's panels, and save all work.


OBJECT window > Actors
11c). Find the NPC and right-click > Edit. Open up the NPC's script window. Type the following...
-------------------

scriptname aaaNPCBossScript

short Dead


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

Substitute aaaNPCBossScript with whatever name is more desirable. Again, I tend to choose names which match the location of where the boss was placed.

Save the script (click on its Save icon) and close it. Click OK on the NPC's window, closing him or her. SAVE goshdarnit.

11d). Reopen the NPC's info from the Object window again. Find the script just saved in the scroll-bar. Select it, and click OK. Re-open the NPC again.

Now, add to the script, so (in total) it will look like this...

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

scriptname aaaNPCBossScript

short Dead

Begin OnDeath

If (aaaNPCBossRef.Dead == 1)
Set aaaNPCBossRef.Dead to 2

Message "The leader of X has been killed", 36

EndIf
End


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

Where the X is, substitute the name of the cell where the enemy has been placed, and of course, substitute the script's name and/or NPC's reference ID name with whatever was used
.

11e). Use the Save icon to save the script, before closing it.

Note: There are no quest stages being used for this process, which means no pop-up messages will pause the game. So, that on-screen message in the NPC's script is important. It lets the player know the proper NPC has been defeated, and now we have the option to collect a reward. You can opt for a MessageBox instead of a message (just substitute MessageBox instead of Message in the script), but this will pause the game, killing action until OK gets clicked.

Note 2: Technically, we won't need to kill any other NPCs once the one we added is pwned, but this is why it's a good idea to put him or her somewhere near the end of the dungeon.

11f). Click OK, closing the NPC's panel. Save.


12a). QUEST window > Topics tab
Open up the bounty quest again. Find the GREETING made earlier, the one which says "You're back and we've got a problem" or whatever.

Here are the needed Conditions IF working with Malene.

GetIsId NPC: Malene == 1
GetStage SQ05 >= 100
GetQuestVariable Quest: aaaBountyQuest DoOnce == 0.00
GetScriptVariable Reference: aaaNPCBossRef Dead == 0.00


Note that the conditions above specify: (1) Malene is the one who will say "You're back ...", (2) the bounty quest won't begin until SQ05 (Gravefinder's Repose) is basically done. And there are also a couple of variables being thrown into the mix, which will make more sense later.

Here are the needed Conditions if working with Diram Serethi.

GetIsId NPC: DiramSerethi == 1
GetStage MS47 >= 100
GetQuestVariable Quest: aaaBountyQuest DoOnce == 0.00
GetScriptVariable Reference: aaaNPCBossRef Dead == 0.00


MS47 is, of course, the Aleswell Invisibility quest.

If NOT working with either of them (in effect, you're writing your own quest without worrying if some other Bethesda-written quest is involved) here are the conditions which typically go...

GetIsId NPC: X == 1
GetQuestVariable Quest: X DoOnce == 0.00
GetScriptVariable Reference: X, Dead == 0.00


As always, substitute X for the NPC innkeeper's name, the name of the quest, and the Reference ID of the enemy
.

In any case, the innkeeper will only say "You're back, and we've got a problem" if everything is ready to go, and the enemy boss is theoretically alive. I am not including conditions which specify IF that enemy is actually alive, but it's certainly possible to do so. I fear that this can lead to occasional CTDs though, as the game's engine tries to figure whether some enemy who is in some faraway cell is alive or dead. So I did not write my quests this way.

For those who want to experiment, add a GetDead condition into that GREETING, specifying whether the enemy boss is alive or dead.

12b). In the Result Script box type Set aaaNPCBossRef.Dead to 1, substituting the actual Reference ID of the added enemy. This changes the ScriptVariable for that enemy from 0 to 1. Why is this important? It's important because this change ensures that Malene, Diram, Foroch, Candice, or anybody else will potentially give us this GREETING only once per 3 days. As soon as they greet us in this way, they won't do so again, not for 3 days. After 3 days, the variable will reset back to 0, meaning the NPC can potentially say "You're back...." once again.

In a minute, more dialog is going to get added which will allow the quest to move forward. It would be weird if (let's say) every time we speak to them, they try to goad us into going into that same lair, even though we've already accepted, or turned down, their proposal. So this issue is going to be addressed.

12c). Toggle Random on, and click OK, closing the Quest window. Save.

Quest-givers will now say this GREETING sometimes. Not all the time. As said before in this tutorial, they will also give other random GREETINGS like "What?" and "How are you?" .. Therefore, they won't always try to dispense this quest. You can add a second GREETING (or a third, or however many you'd like) if you want to increase the chances of them giving this mission. Just make sure to add all the respective Conditions, Result Scripts, and check "Random" for any additional greetings.

> Conversely, if you do not want there to be any randomness with this quest showing up, only one GREETING is required. Random can stay toggled off, in this case. In my opinion this is not as fun though. wink.gif It also feels a bit forced.

>> For testing purposes, once you're back in-game, it is possible to enter and exit dialog with the quest-giving NPCs over and over, until they say what we've added.

12d). In the Add Topics box, add a new topic which deals further with Malene's wish to have us kill the necromancers of Moss Rock Cavern, or if you're working with Diram, Foroch, or Candice, add dialog which explains that they want us to go into whichever lair is pertinent. I am calling it aaaBountyTopic. Find this topic in the Editor ID box as well, and add it there also.


13). Exit the Quest window by clicking OK, and use the main toolbar to SAVE.


14a). QUEST window > Topics tab > Topic Text slot
Go back to the topic just added (aaaBountyTopic) and add some dialog in which the innkeeper further explains his or her plight. "Yes, they have returned, those rascals, and we need to rid them once again, lest this local business suffers!"

14b). The Topic Text slot can be changed from aaaBountyTopic to "Enemies" or "Have they returned?" or whatever.

14c). Copy all the Conditions from the GREETING added earlier, and paste them into this new topic. So for Malene's quest it'll have the GetStage SQ05 >= 100, the GetIsID, GetQuestVariable SQFN DoOnce == 0, and the GetScriptVariable aaaNPCBossRef == 0.

Diram will have GetStage MS47 >= 100, the GetIsID, and so on.

For any of the others, there'll just be a GetIsID, GetQuestVariable X, DoOnce == 0, and the GetScriptVariable. Paste these into the conditions for the new topic

14d). Change GetScriptVariable aaaNPCBossRef.Dead == 0 to GetScriptVariable aaaNPCBossRef.Dead == 1.

From this moment, the quest can be written so that the innkeeper will simply give the quest to the PC without choice (the player is basically railroaded) or the quest can be written so there is a choice involved. Yes or no.

16). To railroad the player (maybe your character is somebody who always goes for quests) use the Add Topics box to add the next topic. To provide a choice, use the Choices box.

Continue to step 17a if choice is involved.
Continue to step 17b if no choice is involved.


17a). Add a Yes and a No choice into the Choices box, and also into the Editor ID window. If you've already got Yes and No choice topics from other quests, these can be reused. Add dialog and Topic Texts for each choice. Now, if the player chooses Yes, this will obviously lead to the innkeeper giving the quest. "Ah, I knew I could count on you." If No gets chosen, the innkeeper will say something appropriate, maybe even be angry or fearful.

For the Yes choice here are the needed Conditions...

GetIsId NPC: NPC Name == 1.00
GetScriptVariable Reference: aaaNPCBossRef Dead == 1.00


For the No choice, all that's needed is a GetIsId. Also add a Result Script which says Set aaaNPCBossRef.Dead to 0 for the No choice, so the entire quest can potentially get started again.

17b). (Skip this step if you opted for choices instead of railroading). Use the Add Topic box to start a second topic, and also add this into the tall, vertical Editor ID window. Add dialog to this second topic ("They're located deep within X location, and there's a reward of X if you rid them....") and add something into the Topic Text slot. "Enemies" or whatever.

Conditions are similar to what's above....

GetIsId NPC: NPC Name == 1.00
GetScriptVariable Reference: aaaNPCBossRef Dead == 1.00


From this moment, the player has either accepted, turned down, or been forced to take on the quest. Off he or she goes, to rid the enemy boss (or not).


18a). QUEST DATA tab
Time to continue the main script now, and it's going to be yet another timer script. How it'll work: when the timer runs out after 3 days, the entire quest resets itself silently, along with the chosen dungeon itself. The NPC boss also respawns, since his or her Respawns toggle is turned on. Here is what the timer script looks like in total.

------------------------------------
scriptname aaaBountyQuestScript

short DoOnce
short Timer
short StartDay

Begin GameMode

if (Timer == 0)
If (aaaNPCBossRef.Dead >= 2)
Set StartDay to GameDaysPassed
Set Timer to 1
EndIf
Endif

If (Timer == 1)
If ((GameDaysPassed - StartDay) >=3)
Set Timer to 0
set aaaNPCBossRef.Dead to 0

If (aaaNPCBossRef.Dead == 3)
aaaNPCBossRef.MoveTo aaaMarkerRef (edit)


EndIf
EndIf

End

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

Substitute aaaNPCBossRef with whatever name was chosen for the boss, yadda yadda.

18b). Click the save icon, and if everything saves okay, close the script. Click OK, closing the Quest window.

.... Again, when the NPC boss gets pwned, this causes the timer to begin. Once 3 days have passed, the dungeon respawns all its enemies (including the boss), and the quest will reset. We'll be able to go back to our quest-giver, and potentially receive this entire quest over again! From this moment on, the player has three days to collect the reward (which has not been added yet). If the player does not do so within 3 days, oh well that's tough, because by then the entire quest will have reset itself, including any Reward dialog. blink.gif There are probably ways to avoid this problem (for instance, the timer can get started only after collecting the reward, via dialog). But in most cases, the above process will be sufficient.


19). Open the Quest window. Go back into the Topics tab > GREETING. Give the innkeeper a GREETING which deals with her or him being happy we have killed the enemy boss. "Oh glory, you have done it, and we are saved!"

Do NOT make this GREETING random. We want the innkeeper to just dispense a reward, not beat around the bush with "Hello" or "Good to see you!", when we return from our endeavor.

And here are the needed conditions.

GetScriptVariable Reference: aaaNPCBossRef.Dead == 2.00
GetIsID NPCname == 1.00


20a). Use the Add Topic box to give the innkeeper a topic which will lead to a reward (I usually just call this topic "Reward" in the Topic Text slot). If you already have a Reward topic from other quests, this can be reused.

20b). As always, add this reward topic in the Editor ID box. Once some dialog has been typed for this reward, use its Result Script box to make the innkeeper reward whatever is desired. For this lesson, I've chosen three bottles of beer, 100 gold, and some mutton. laugh.gif I'm also going to add another script which involves the main script's DoOnce (which causes dialog to change during future encounters with that same innkeeper), and bumps the ScriptVariable forward as well, so that there's no chance the NPC will keep giving this lame reward over and over.

Player.AddItem DrinkBeer 3
Player.AddItem Gold001 100
Player.AddItem Mutton 1
Set aaaBountyQuest.DoOnce to 1
Set aaaNPCBossRef.Dead to 3


Make sure to copy the Conditions from the reward GREETING just added....

GetScriptVariable Reference: aaaNPCBossRef Dead == 2
GetIsId NPC: NPCname == 1



21). Click OK, closing the Quest window, and SAVE.


22). QUEST WINDOW > Topics tab
Make another GREETING, and this one can be sort of generic. "So glad you have saved us from those bastards!" or whatever. Conditions for this GREETING will be

GetIsID NPCname == 1.00
GetScriptVariable aaaNPCBossRef.Dead == 3.00


It is also possible to put a GetInFaction condition up there, replacing the GetIsId, and then add the faction of an entire town (such as LeyawiinFaction == 1.00) so that this entire location gets excited when they recognize our toon. Make sure Random is toggled on, so that people will only say this GREETING (mixed along with others Bethesda added) once the quest is done, its reward is given out, but 3 days have not passed yet.

Again, you can test to make sure the quest is still "working" by entering and exiting dialog with the innkeeper (or any other NPCs who are grateful for our character's success) over and over, until the "So glad you have saved us..." greeting shows up. Since the GetScritptVariable is now 3 instead of 2, the innkeeper won't keep rewarding the PC over and over, as dialog gets entered and exited.


23). Make one more GREETING, this one will be the final one. It is optional, and only to add realism. In this GREETing, the innkeeper will be greeting as though he or she's familiar with our past actions (we've basically helped the NPC once or twice by now), but those pesky enemies have returned one more time. "I know you've done so much for us in the past, but can I bend your ear one more time?"

GetIsID NPC: NPCname == 1.00
GetQuestVariable Quesname DoOnce == 1.00
GetScriptVariable aaaNPCBossRef.Dead == 0.00


Again, Set aaaNPCBossRef.Dead to 1 goes n the Result Script box, and make sure Random gets toggled.


24). The same secondary topic which was used just after that very first GREETING (aaaBountyTopic aka "Enemies") can be added into the Add Topic box, but the quest-giver (whether it's Malene or somebody else) won't need to explain in as much detail what comes next.

Copy all the Conditions from the final GREETING, and paste them into this topic. Make sure to change the ScriptVariable to 1 though. So now, it'll look like....

GetIsID NPC: NPCname == 1.00
GetQuestVariable Quest: Questname DoOnce == 1.00
GetScriptVariable aaaNPCBossRef.Dead == 1.00


25). Add the same Topic or Choices which got added before, starting from step 16. No additional dialog needs to get added, and Conditions can be exactly the same for all this dialog, and also for the Reward part too.

26). Exit the Construction Set, saving all work. Make sure to make a backup copy of the .esp too, since it involved so much detail. goodjob.gif

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

Once this respawning bounty quest is set up, we can potentially add other NPCs who give out quests, not just Foroch or Candice or Malene or Diram. If you're trying to use the same quest for multiple people, it's also possible to add to the main script. Follow the same steps found on Page 2, post 30 of this thread. Not every step in that post will get repeated of course, so you'll need to use some judgement to get this all working properly, and also do lots of playtesting.

Posted by: mALX Jan 14 2019, 07:56 PM


This is an Awesome thread, Renee!!!

Posted by: Renee Jan 19 2019, 08:25 PM

Awesome, thanks so much. smile.gif

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

Respawning Bounty Quests, Game: TES V: Skyrim

Note: Currently the first 11 steps deal with my learning process. I wanted to make a repeatable bounty quest for Skyrim, but my version works differently than what Beth wrote. The way I've got it, certain people will occasionally want us to go kill some bandit boss who's been terrorizing locally, but they won't ALWAYS want us to do this. It's not the same as going into Bannered Mare, where Hulda always gives us a flier, advertising some local menace.

Anyway, to skip the "research" part of this lesson, go to step 12.



1). First step is open up the Creation Kit. Like, duh.

I am going to be focusing on Lucan Valerian, proprietor of Riverwood Trader. The idea behind this quest is that Lucan is fed up with the lowlifes of Embershard Mine ekeing out a living right beside the respectable town of Riverwood. Lucan recognizes my character for being an adventurer, especially after we help him get his stupid Golden Claw back. In fact, this bounty quest won't even begin until the Golden Claw is done. This is the way I decided to write what's below. With different NPCs (innkeepers, smiths, etc.) the process will be a little different every time. It all starts with figuring out what quests (if any) get associated with each one.

As I did in Oblivion, I must first have a look at all the quests involved with Lucan, so I can see all the dialog he can possibly say, especially Hellos and Greetings. I want to make sure that the dialog will match up to these quests and their Priority ratings, so that Lucan won't just start this quest every time his shop gets entered, and dialog is initiated.


2). OBJECT window > Actors > Imperial Race > Male.
Find LucanValerius. Now right-click on him and left-click "Use Info." The Use Report panel shows up, and it includes two windows. The top one is the one I'm interested in.

At first glance, this top window seems to include everything Lucan is involved in, quest-wise. It actually does not include everything though, as I'll explain in a minute. Still, even though everything can't be seen here, the Use Report panel is still a good place to start. Immediately, I can see a slew of INFO topics that get associated with Lucan.

Go ahead and left-click on a few of these INFOs, just to see what shows up. Mostly, these are just fragments of the actual quests.


3). Scroll the top window down until you see QUST. Obviously, this stands for Quest. Look at every quest Lucan's got listed in this window. Here they all are:

MS13Intro
DialogueRiverwood_Revised
MS13LucanCamillaScene
MS13
DialogueRiverwoodDryGoodsScene1


Note that MS13 pops up several times, and this is Lucan Valerian's shining moment in the game, since it is the Golden Claw quest.

Double left-click on each QUST topic, and see what pops* up. Every time we double-click on one of these topics, a quest panel will open up, which is mighty convenient.

Since I will be writing the bounty quest so that it doesn't begin until MS13 is done, I'm not going to worry about MS13's Priority. But I will go through those five quests. It is important to research each of these, so that my own quest will work with the same randomness that the Oblivion version did.


a}. Double-left click on MS13Intro, and look at its Player Dialog tab. This quest deals with starting the Golden Claw, and its Priority is 0. Not only that, but Lucan doesn't have any dialog yet. Nothing to worry about, since I'm not going to write my quest for pre-MS13, or during any portion of MS13.

Close the MS13Intro panel.

b}. DialogueRiverwood_Revised is the first quest I might be dealing with, since it stays active after MS13 is done. Its Priority is 30. This quest, and all its dialog, remains active throughout the game. A lot of the dialog in DialogueRiverwood_Revised has to do with generic things Riverwood residents say, so it's definitely important to check further.

c}. MS13DialogueLucanCamillaScene: open it up, and look at its Player Dialogue tab. This is a short quest which causes Lucan and his wife to begin arguing about their claw, when we first walk in their shop. Its Priority is 60, and there's nothing under the Player Diaglogue tab, (everything is in the Scenes tab). Let's move on.

d}. Open up MS13 itself. This one deals with the rest of the Golden Claw quest: going up to Bleak Falls, retrieving the claw, returning it to Lucan (or not), etc. Its Priority is also 60. Keep moving along.

e}. DialogueRiverwoodDryGoodsScene1 also has a Priority of 30. However, it doesn't have any dialog at all. It only includes a "Scene", which can be found under the Scenes tab. Scenes involve two NPCs, when they speak to each other back and forth. This quest has nothing clickable under Player Dialogue, so I'm closing this panel out.


... Hmm. So far, I haven't found any of Lucan's more famous post-MS13 GREETINGs. Where, for instance, is "Thanks so much for taking care of those thieves...." ? I haven't seen this dialog yet, and I must find it. Because the dialog in my quest is going to work alongside the dialog of "Thanks so much for taking care of those thieves...."


4).
Close the Use Report panel. It seems like a bunch of time just got wasted, but not really. It's important to find everything an NPC says, if he/she is to be included in the bounty quest. If you don't find the things you'd normally expect, this just means it's important to keep digging, until these things are found.


5). OBJECT window > Characters > Quest.
Scroll down to the MS13 area. Ah-ha! There's an additional quest involving MS13, which is called MS13Fin. MS13Fin deals with the aftermath of the Golden Claw quest.

Double left-click on MS13Fin. I'm going to click from tab to tab, across the top of this quest's window. Start with the Quest Data tab, which should be open by default. Notice that it's got a Priority of 60.


6a). Now go to Quest Stages tab. Notice there no Quest Stages.

6b). Skip Quest Objectives because it does not handle dialog at all. Same goes with Quest Aliases, skip that one too.

6c). The two tabs which often handle dialog: Dialogue Views and Player Dialogue, also have nothing.

You can keep clicking other tabs, just to see if there's anything under there, but it's not until I got to the Misc tab that something shows up. Finally! All the more prominent post-MS13 Greetings are right here, and there are four of them, though they aren't called GREETINGs anymore, like we'd see in the Construction Set or the GECK, they are now called Hellos. Two of these Hellos are said by Lucan, and two are said by Camilla, therefore we can immediately rule Camilla's Hellos out.

7).
Double left-click on one of Lucan's Hellos. Note that 'Random' is not toggled. Oddly, once we're back in the game, he will say his Hellos in a random fashion, when greeted several times in a row (as I did when playtesting respawning bounty quests for TES IV: Oblivion). Why is this?

>>> From this point, if you'd like to know how everything works in detail (how the game involves Lucan in various dialogue Hellos), click the Spoiler tag below, and go to Step 8. If you'd just like to continue writing the quest, go to Step 12.




12).
Open up MS13Fin > Misc tab again (if it's not already open). Now, open up Lucan's "Thank you" greeting, and toggle Random on. Click OK. Now open up the topic just below it, which is "Thank you for bringing the claw back." Toggle random on for this one, too.

13). Change Hours until reset from 0.50 to 0.00 for both these Hellos. This is not 100% necessary, but it increases the chance of my own Hello, which will get written soon, appearing.

From this point on, you can either write your quest into MS13Fin, or start your own quest. Although I prefer to start my own, right now I'm not good enough yet with the CK to link multiple quests, so I'll hitchhike my material onto MS13Fin.


14). In the big Info window, right-click > New. Write up Lucan's Response Text, which will be something like "Hey, you're that guy who helped us before. We've got a small problem now. Care to have a listen?"

15a). Click OK. The Topic Info panel will show up, and it should include the "Hey, you're that guy..." text just typed.

15b). Toggle Random on. Leave Hours until reset at 0.00.

15c). In the Conditions box, right-click > New. GetIsID is what shows up by default, so choose LucanValerius for this condition.

15d). Toggle Force Subtitle on.

Time to make some voice files, as was done for the Skyrim Quest Tutorial. Again, an actual voice is not needed in-game. If you already know how to do this from that previous lesson, skip to Step 16.

15e). Double left-click the dialog just added in the Response Text window, so the Edit Response panel shows up again. There should be a Voice Type listed in the bottom window which corresponds to the NPC who says this dialog (MaleNord, for instance).

15f). Highlight this Voice Type. Now click the Record button. If you have a microphone and want to record your, or someone else's voice, now's the time. If not, just press Record and read the text which just got written. Press Done.

15g). Toggle the From WAV ON, and press Generate Lip File.

15h). Click the Save button. If a warning shows up saying this file already exists, it's because there is already a MaleNord (or whatever) file saved. There is a choice to overwrite any previous recording made, basically.


16). Click OK, OK, and OK, closing all the quest windows. SAVE by pushing the main toolbar's save button. Reopen the Quest now.

The new Hello is now in the game, and if I were to go back into Riverwood to greet Lucan, there's now a 50/50 chance he'll say "Thanks for taking care of those thieves," or whatever just got written. Thing is, he will only greet in these two ways, and he won't give any other Hellos he was formerly using. If you are fine with this, move on to Step 18. If you want to further reduce the chances of the new Hello showing up (so that he may only give this quest much more rarely, maybe once or twice a year), go to 17.


17a). To decrease the chance of Lucan saying the new Hello, simply lower MS13Fin's Priority to 30. This will cause Lucan to have five extra Hellos in his arsenal from the DialogueRiverwood_Revised quest. An occasional generic Hello from DialogueGeneric may also sneak in there. To increase our Hello showing up from this point (while keeping all the vanilla Hellos), simply add another greeting into MS13Fin's Misc tab.

17b). Optional: Go into DialogueRiverwood's Hellos, and make these random too. Hours Until Reset can stay off, or you can turn them on for each Hello.

** Now, the main difference between the respawning bounty quests for Oblivion, compared to these ones in Skyrim, is that the Oblivion versions worked solely with script and quest variables. In Skyrim, I will be using quest stages, along with some of the other things the CK likes to see, such as Properties and Aliases. There probably is a way to avoid using stages, instead using variables like Oblivion does (EDIT, 2024: certainly there is! But back in 2019 I didn't know how). Bethesda themselves prefer stages for their own bounty quests though, so that's the way I learned.


18). OBJECT window > Actors .
Right-click > New. I made an NPC enemy, and put him somewhere in the center of Embershard Mine. I prefer to put the guy near where those jail cells are, this way he gets encountered roughly half-way through the cave. When you make your enemy, you can follow any steps you've found in other tutorials. Template Data can get used for instance, to make things more convenient. Just make sure the enemy winds up in the BanditFaction.

19). Toggle "Respawn" and "Unique" on for this enemy. Click OK. SAVE.


20a). Open MS13Fin again > Quest Data tab. Toggle "Allow repeated stages" on.

20b). Also, where the "Type" scroll-bar is, change this to Miscellaneous.

20c). Object Window Filter: type Misc\Riverwood\


21). Quest Stages tab.
Go ahead and make seven stages here. Bethesda only uses three, and you don't have to use seven, but seven is what I wound up with. My stages are 0, 10, 15, 20, 30, 50, and 100. For convenience, I recommend you use these numbers too.

21a). The first stage, of course, is 0. It is more like a pre-stage, actually. Toggle "Start Up Stage" on. Now, right-click > New into the Log Entry area, but don't add any text. It should say EMPTY in this box. In the Papyrus Fragment tab's box, you can type a comment saying ;Pre-quest, just for reference. Make sure that semi-colon goes before any comment added into this box, this'll prevent the CK from trying to read these comments, then screaming errors at us!

21b). Do the same things for Stage 10, so EMPTY shows up in the Log Entry box. Stage 10 shall deal with Lucan greeting the PC, pitching his idea. Another comment can be added into the Papyrus Fragment box, such as ;Lucan greets player.

21c). Repeat all of this for the next stage. I'm up to 15, by now. 15 shall be an intermediate stage, during which Lucan has spoken about his concern, and we've got a choice to say "yes" or "no" to the idea of invading Embershard. Stage 15 is optional, though. If your own character always takes on quests, never turns them down, don't worry about making a "no" choice here.

21d). Stage 20 now. If "yes" is chosen, the quest will bump to 20. If not, it'll just stay at 15 if you want it that way. The neat thing is, this quest won't even appear in the journal if "no" gets chosen. Do all the same things for this stage (EMPTY, and a semi-colon comment).

21e). Stage 30 is the first stage which adds some scripts, but for now, just do the same as what's been done for those four other stages, so that there's EMPTY and comment. I am putting ;NPC Boss gets pwned!


22a). RENDER window.
Go find the Embershard Enemy, and give him or her a Reference ID.

22b). Click Edit Base from the NPC's reference panel. In the Papyrus Scripts box, right-click > Add Script. Now double-click on [New Script]. Give the script a unique name (I named it aaaEmbershardEnemyScript), and leave Extends: ObjectReference alone. Click OK. A blue + symbol should show up in the Script Name box.

22b). Right-click on the script, and then left-click Edit Source. You should be seeing this....

Scriptname aaaEmbershardEnemyScript extends ObjectReference

22c). Close the script. Now highlight it, and press Properties. Press Add Property. Use the Type scroll bar to find Quest.

For "Name", just put the name of the quest. It doesn't have to be called MS13Fin, although if MS13Fin is typed here, this will cause the Property Name to be the same as the quest's actual name. But I began calling it aaaEmbershardBountyQuest for convenience, since anything starting with "aaa" will usually show up at or near the top of any list.

22d). Click OK. Wait a moment until a symbol shows up. You have just made a Property! It should have the quest's name, and under Type it should say Quest. If MS13Fin is the name which was used, this will auto-fill. Go to step 22f, if so. If the property was named anything else, continue to 22e.

22e). Highlight the Property and press.the Edit Value button. Since this property is a quest, all of the quests listed in the game show up. To link this new Property with MS13Fin, go ahead and find MS13Fin in the Pick Object scroll-bar.

Note: It really helps to read about Skyrim's use of Properties, Aliases, and Fragments, if you haven't done so already. https://www.creationkit.com/index.php?title=Bethesda_Tutorial_Quest_Aliases. If you've already done some modding in the CS or GECK (which don't use properties or aliases, and don't use script fragments in the same was as the CK does) using them in the CK may seem like extra, unnecessary steps. But these things are really here to make our lives easier in the long run, especially when it comes to writing some really complicated scripts.

Click OK, closing the Add Script Properties panel.

22f). Now right-click on the blue & yellow icon and select Edit Source. This opens up the Script panel (just like the script panel for earlier programs), and here is what should show up...

-----------------
Scriptname aaaEmbershardEnemyScript extends ObjectReference

Quest Property aaaEmbershardBountyQuest Auto


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

Note: The Quest Property will be MS13Fin for those who wrote it that way).

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

22g). Write the rest of this script manually, so in total it'll look like this....

----------------
Scriptname aaaEmbershardEnemyScript extends ObjectReference

Quest Property aaaEmbershardBountyQuest Auto

Event OnDeath (Actor Killer)
aaaEmbershardBountyQuest.SetStage (30)

EndEvent

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

22h). From the script panel's tool-bar, click on File > Save (or just ctrl + s) to see if everything got typed okay. Close the script window, and click OK on the enemy NPC's window, closing him or her out as well.


23). Open MS13Fin > Misc tab again. Find the Hello added earlier.

23a). There should already be a GetIsID == Lucan there. Now add the following conditions....

GetStage Quest: MS13Fin < 10.00
IsDead aaaEmbershardEnemy == 0.00


That second condition is obviously a check to make sure the enemy added to Embershard is alive. If he/she is not (if he/she has not respawned along with Embershard itself), Lucan won't be able to say the Hello we've added at all. To find the enemy, click on the scroll-bar next to where it says "Run on" and find him or her in this list. Click the Select button, find the Cell and the enemy's Reference ID, and click OK. Result should look like this...

S GetStage Quest: MS13Fin < 10.00 AND
R IsDead aaaEmbershardEnemy == 0.00


R = Reference.

23b). In the "End: Papyrus Fragments" box (located bottom-middle) type GetOwningQuest().SetStage (10). This way, Lucan will keep saying random Hellos until he says the one we wrote. Once he says our material, the quest bumps forward to 10, and he won't say this Hello anymore, not until the entire quest resets itself.


24). Dialogue Views or Player Dialogue tab.
Go ahead and write up all the rest of the dialog . Five different branches are needed, which shall include topics and infos as follows....

> Lucan informs the player about the menaces inside Embershard Mine {Stage 10. Type GetOwningQuest().SetStage (15) into the End: Papyrus Fragment box}.

>> We answer Yes or No to Lucan's proposal (Stage 15. Type GetOwningQuest().SetStage (20) into the End : Papyrus Fragment box for a "Yes" response. If "No" gets chosen, simply leave the quest at 15, and toggle Goodbye on, if desired).

>>> Lucan says some follow-up info: where Embershard can be found, how we'll get paid, and so on. (Stage 20, a SetStage does not occur here, since killing the enemy will do this).

>>>> We return to Lucan, after Embershard has been cleared, (its top enemy is dead. Stage 30.)

>>>>> Lucan gives a note, which can be taken to Proventus Avenicci, Whiterun Jarl's steward, to get paid. (Stage 30. Don't worry about adding scripts yet, these get added in a few). Another option is to add your own steward, in fact this might be the better option for those who are doing the Civil War on the Stormcloaks' side, since I'm pretty sure Proventius disappears after the sack of Whiterun.

>>>>>> We get our money! (Stage 50. Type GetOwningQuest().SetStage (100) into the End: Papyrus Fragment box).


I won't go into detail here, but write up your own dialog for each of those five branches.


25). Quest Objectives tab.
By now, all dialog has been written, and quest stages should all be set up. Time to add some quest objectives. Just like in Fallout 3, Objectives are what cause onscreen messages to be displayed when important moments get passed during the quest.

I'm not going into full detail here, since this info is already in the Skyrim Quest Tutorial found on Page 2 of this thread, but I wound up with three Objectives: one which tells the player to "Kill the leader of Fort Embershard", one for "Return to Lucan" and one for "Head to Dragonsreach for a reward." These Objectives get displayed and completed as follows....

"Kill..." (Stage 20, Stage 30)
"Return.." (Stage 30, Stage 50)
"Head to.." (Stg 50, Stage 100)


26a). OBJECT window > Items > Books.
Find a note, and Duplicate it. I am calling this note aaaRewardNote. Erase this duplicate's text, and type something pertinent. "Ye, bearer of this note, who has't defeated the abominable enemies of Embershard Mine, shalt become dispenseda 100 gold...." etc.

My idea here: Lucan is pleased that we've killed the leader of Embershard, but he can't afford to pay us. He's got a business after all, and cannot (in roleplay terms) afford the downfall paying our character hundreds of gold would cause. See? So what he does is gives a note, explaining that we've taken care of Embershard Mine. This note gets taken to Dragonsreach, just like we'd do during any of Bethesda's bounty quests. Difference is, we're going to NEED this note if we want to get paid!

26b). Click OK, closing the note.

And now, we're going to use the Quest Aliases tab to add three different aliases: one for the Player, one for the quest-giver (Lucan), and one for the note.


27a). Aliases tab.
Always start with the Player. Right-click into the giant Alias window, and select New Reference Alias . This opens up the Reference Alias tab. Alias Name shall simply be Player (type Player in this slot). Now click on the Unique Actor toggle, and find Player in the scroll-bar. Click OK.

Note: Chances are the page is too big, and the OK button cannot be seen! If this is the case, just click into the Alias Name slot (where Player was typed earlier), and press Enter or Return on your keyboard.

27b). Next, to tackle Lucan, who is the one who gives the note. ALWAYS add the giver of any item first into the Quest Alias window, before the item itself gets added. Type QuestStarter into the Alias Name slot. Click the Unique Actor toggle on, and find LucanValerius in the scroll-bar.

27c). Click OK, or do the Alias Name slot thing, and press Enter.

27d). Do the same for the note. Type Note into the Alias Name slot.

27e). Toggle "Create Reference to Object" on. Find aaaRewardNote (or whatever you called it) in the scroll-bar. Leave "Level" as Easy (always leave it on Easy). Now, for Create, leave the toggle on "At". And find QuestStarter in the scroll-bar. Altogether, this should read "Create Reference to Object: aaaRewardNote, Level: Easy At QuestStarter.

Tip: Toggle Quest Object on to make absolutely sure this note will never get misplaced. Quest Object is on the top-right of this panel. Because remember: if we don't have the note, we won't get paid!

27f). Click OK.... or Enter.


28a). Dialogue Views or Player Dialogue tab.
Go back to whatever dialog got written for Lucan after the boss of Embershard was dealt with.

28b). In the Begin: Papyrus Fragment box, type SetObjectiveCompleted (30).

28c). In the End: Papyrus Fragment box, type GetOwningQuest().SetStage(50)

28d). Now find whatever dialog got written for Stage 50, when Proventus Avenicci or whomever is supposed to dispense payment. Here are the Conditions for Stage 50...

GetItemCount 'aaaRewardNote' == 1 And
GetStage Quest: 'MS13Fin' == 50 And
GetIsID Actor: 'ProventusAvenicci' == 1


Make sure that "Target" is selected for GetItemCount, rather than Subject.

28e). In the End: Papyrus Fragment box, type GetOwningQuest().SetStage (100) if this hasn't been added yet.


29a). Quest Stages tab > Stage 50 > Papyrus Fragment box. Click on the Properties button.

29b). After the panel pops up, click the Add Property button.

29c). In the Type scroll-bar, look for Book.

29d). In the Name slot, type the name of the note. Click OK.

29e). Click on the Property for the book. In the Pick Object scroll-down, look for aaaRewardNote.

29f). Click OK, closing the Properties for script panel.

29g). In the Papyrus Fragment box, type Game.GetPlayer().AddItem (aaaRewardNote, 1) .

30a). Now for the final stage, which I called 100 up above. In the Papyrus Fragment box, type Game.GetPlayer().RemoveItem (Note, 1)

Now to get paid.

30b). Click the Properties button. Click the Add Property button. For the Type scroll-bar, look for MiscObject. In the Name slot, type Gold001. Click OK, and click OK.

30c). In the Papyrus Fragment box, type Game.GetPlayer().AddItem (Gold001, X) , with "X" being whatever you think is fair. Also type...

stop()

..........That is it! "Stop()" is what shuts down the quest, after payment is received. Do NOT toggle Complete Quest on though. We want this quest to never get completed, right? We want it to possibly return; that's the whole idea here.

So now the quest is good as a one-time affair. Here's how to make sure the entire thing respawns.


31). Quest Data tab
Find the Event scroll-bar, and choose Change Location Event. Make sure "Allow Repeated Stages" is on, if it's not already toggled.

Notice how "Start Game Enabled" is now grayed-out, and there is no longer an option to toggle this on or off. This is fine. Click OK, closing the Quest window.

32). OBJECT window > Character > SM Event Node.
Right-click on "Change Location Event" in the the right window, and select Edit. SM stands for Story Manager, by the way.

33). You might see several nodes made for other quests, or you might just see a large panel which is mostly empty. Right-click on the very top choice, which is "Stacked Event Node: Change Location Event". Select New Quest Node. A new choice called "Stacked Quest Node" should be at the very bottom of this window. Scroll down (if needed) and find it.

34). Right-click on Stacked Quest Node and choose Add Quests. Find MS13Fin. Click OK.

Now comes the tricky part. The SM Event Node page is similar to the Quest Aliases page, in the sense that it's too big for some screens. Bethesda actually put OK in the top-right corner this time, yet you might not be able to see the bottom of the panel. rolleyes.gif And we'll need to be working down there. If you can't see the bottom, you'll possibly need to minimize the entire Creation Kit from its tool bar. Now right-click on your desktop, and change your Screen Resolution setting to something smaller, or rotate the entire screen to Portrait instead of Landscape. You will need to adapt to working sideways for a few minutes!

35). Highlight the Node which just got created (not the quest below it). Now look down the page (or to the right, if you had to rotate). In the ID slot, type in aaaMS13FinQuestNode. Toggle "Do all before repeating" on. And toggle "Shares Event" on.

Once all this is done, the screen can be rotated back to Landscape.

36a). Right-click > New in the Node Conditions box, and add the two conditions...

GetInCurrentLoc Location: "RiverwoodLucanDryGoodsLocation" == 1.00 And
GetDead NONE == 0.00


36b). For the first condition, change Subject to Player, meaning that the Player/character needs to be in Riverwood Trader for the quest to begin.

36 c). For the second condition it says NONE, but there is some hidden information within this one that cannot be seen. Double left-click on this condition, and in its scroll-bar (where it says Subject) change this to Reference. Now push the Select button, and use the Cell scroll-bar to find EmbershardMine01. Find the enemy's Reference ID, and click OK.

37) Click OK, closing the SM Event Node panel.

38). Close Creation Kit, saving all work. Don't forget to create or update the SEQ file (see SEQ File Creation tutorail on Page 2 of this thread).


And that should be all. If you have Wrye Bash (or some mod which modifies cell resets) use a minimal number of days when playtesting this quest, to make sure it begins, runs through all its stages, shuts down, and starts all over again. When the quest shuts down, we can test to make sure it's shut down by spam-greeting Lucan several times. The opening Hello which begins the entire quest should not be showing up for X number of days.

Posted by: Renee May 15 2019, 12:53 AM

Setting up a gamepad controller Game: Elder Scrolls Online

This is for those gamers who prefer gamepad controllers, like myself. I am going to teach how to do some rather basic things, such as change what each button does, how to invert X and Y axises, and so on. Figuring this stuff out is a cinch in many other games. ESO on the other hand requires some background knowledge.

In some games (like Skyrim or Fallout 3) getting a controller to work is as easy as going into the menu, then toggling a button on. Elder Scrolls Online is trickier, and more difficult to figure out. But overall, the experience is more rewarding because there are SO MANY options we can configure for ESO.

So this assumes that you've got a mouse and keyboard, but also a controller which is specifically made for PC gaming. This controller can apparently be Xbox or Playstation styled, or it can be something which is more customized. I myself only use Xbox-style controllers, and Microsoft models at that, but I also use mouse & keys for some tasks.

Required: https://www.elderscrollsonline.com/en-us/esoplus. Buying this upgrade will open up some new areas of the menus. ESO+ is therefore necessary for the rest of these steps to work properly.


1). Get into the game, so that you are not in its opening menu, you are in the actual game. This way, everything can get tested in real-time.

2). Controller should be on. Now, press the Esc key on the keyboard. Press Settings. And press Gameplay. About three-quarters down the menu page is the GAMEPAD section. Turn this on.

Once the gamepad is on, notice the menu changes to one which is more 'consolized.' wink.gif

Another feature: there are now TWO main menus which can be pulled up -- one can be gotten from the keyboard, the other from the controller itself. These are the sort of menus that allow us to change options, look for Help, and so on. Though these two menu sets might seem like they're the same at first, they actually have quite a lot of differences between them.

Now. If you are like me, you'll want the option to switch the X/Y Axis, which affects the "look around" feature normally assigned to the right mushroom stick. Normally, if the right stick is pushed forward (away from the player), the character looks upward. If the stick is pushed back (toward the player), the character looks down. For those who want to invert this, go to step 3. If not, go to step 4.

3). Press the Start button on the controller. Use the left mushroom stick to scroll down to OPTIONS. Select Camera, and INVERT Y is the very top option.


4). Zenimax gives us a total of three templates, each featuring a different set button assignments. But if you'd like to make your OWN button assignments, here is how to do that.

Press the ESC key. Again, this key works in a similar way as the START key on a controller, except ESC opens up different options.

5). Select CONTROLS. This opens up a menu with four columns, which Zenimax calls Binds.


The First Bind deals with the keyboard itself. All the selections in this column deal with keyboard and mouse assignments.

The Second Bind
deals with a lot of the in-game button assignments which get used during gameplay moments, such as pulling levers, choosing to accept another player into your party, and so on. For the most part I do not mess with the Second Bind at all.

The Third Bind handles the bulk of controller button assignments, most of which correspond to keyboard and mouse buttons / functions. This is the Bind which most changes can get made which affect the actual sandbox gameplay, outside of menu surfing. Attack, Jump, Sheathe/Unsheathe Weapon, and so on.

The Fourth Bind never gets used, at least in my game. I assume it's there for some sort of unknown function.


So, since the keyboard stuff should already be set up, I am going to show how to assign stuff to the controller.

Tip: Use the mouse-wheel to scroll the Binds menu up and down, it just works more efficiently than the controller does. In general, Mouse + Keys should be used at all times, except when actually choosing which buttons, bumpers, toggles, and analog sticks are going to correspond to keyboard / mouse buttons.


6). Start with the very top, which deals with Movement. By default, Move Forward is already set as "Left Stick Up," which is how most gamers prefer it to be set. Suppose you want to change this though? Doing so is easy as using the mouse to left-click on this selection, and then moving the left stick (or right stick, for southpaws) in the direction you'd prefer. In the BINDINGS window, it then shows whatever key, or button, or bumper, or trigger, has been selected.

Frequently, you may notice that some function has already been assigned to a button, bumper, trigger, or stick. If this is true, you'll be erasing this function if you choose to Accept, and the menu will ask to confirm if you really want to make this choice, or not.

7). Use the mouse to left-click on Bind.

From here, literally just scroll down the entire page, selecting whatever feature (such as Jump) with whatever button, trigger, stick (etc.) is preferred.

Elder Scrolls Online allows us to select "While Held" commands, too. So for instance, I've got my game set so that if I hold my right analog stick down (instead of briefly pressing it) this will cause the HUD to vanish. smile.gif If I press this stick briefly, this is what changes from First to Third Person.

We can even sometimes select a combination of buttons. For instance, I just clicked on Autorun, pressed & held the B button, and then pressed the right bumper. Binded this selection. So now my character will run automatically (and keep running) if I press B + RB back in game mode.

8). When done making assignments, always press ESC on the keyboard. This will lock these assignments in.


Troubleshooting: For me, the Bind menu has a tendency to not register certain buttons. For instance, I'd try to set A for Attack, but the selection onscreen would merely flash very quickly, without the key getting set. To fix this, I used https://www.xpadder.com/. Made a New profile, but did not set any buttons, bumpers, triggers, or sticks at all. Selected Save As, and then named the profile Blank. Literally, the Xpadder has not had anything changed, and everything is blank. This, for some reason, worked for me.

Posted by: mALX May 15 2019, 01:55 AM

Awesome! You got it working!

By the way; you can set a key on your keyboard to toggle your character to always run; or always walk when toggled. I use the "7" key on my NumPad on the right side of my keyboard as a "walk or run" toggle. That frees up those two keys on your controller for something else.

That run is a kind of "Jogging" run; not a high speed run you might do if you are running for your life. If your character needs to get out of danger; you will want to sprint as fast as you can to get away:

To sprint (no matter which way that toggle is set, run or walk) = just hold down the LEFT shift key while walking or jogging; and your character will sprint as long as your stamina lasts.

Sprinting can't be toggled on or off; you have to actually hold it down = so if you want sprinting set to your controller; find it in the "Controls" list for the controller and set it where you want it.







Posted by: Renee May 15 2019, 01:05 PM

Awesome, thanks. I have noticed there's TONS of stuff which can be set up. Options, options, options. I like the way there are separate HUDs for PC and consolized versions. Everyone is happy, in theory. smile.gif

I think I'll let the controller handle most "immediate" functions (such as action / combat / hotkeys) but the keyboard will handle all the background functions, such as the quest window, Crown Store and so on.


Posted by: Renee Jun 19 2019, 02:28 AM

Game: Fallout 3, How to use Zone Triggers to set quest stages.

Video example: https://www.youtube.com/watch?v=QaMtpvrEG9E

TES IV: Oblivion uses X-markers to bump stages, set variables, and so on. Fallout 3 does use X-markers for some functions, but it also uses what are called zone triggers, or simply "triggers," to setstage quests and perform other functions, as we pass through them. "Pass THROUGH them" is the actual idea here. For an X-marker to work, the character (or NPC) must walk near the X-marker for it to do its job. With Fallout's triggers, we are going to walk through these areas instead.

A quick example from Oblivion's day was during the Unfriendly Competition quest, when the player is supposed to be sneaking a listen to a conversation between Agamir and Thoronir. If we weren't close enough to the X-marker which activates during this quest, the conversation would simply not happen, leading to dozens of "Broken" accusations from various gamers. If a giant trigger zone were used instead, chances are there wouldn't be as many problems.

Zone triggers appear red in the GECK but invisible in the game, and are also used in Skyrim.

CELL window

1). Go into the cell or wilderness area where the trigger is to be added. An example is right outside of Megaton.

2). On the main toolbar, find the T button. It looks like a child's block with a T in it, and is located to the right of the NavMesh button (the button with red scribbles in it). Click the T button. Sometimes it takes a couple of clicks before the button gets pushed inward.

3). In the Render window, left-click somewhere on the ground, and drag upon it. It helps if the area being clicked does not have a bunch of stuff on it (items, Markers, etc.). Try not to click on anything else but the ground, or (if inside a cell) the floor itself.

4). At first, nothing might happen. Maybe a red 2-dimensional rectangle will show up, but maybe not.

Let go of the mouse button. Now move the mouse upwards (away from you) without touching or holding any buttons. If done correctly, there should be a transparent red cube which morphs from two dimensions to three. The mouse can be moved away or toward you, to make the cube shorter or taller. It should be tall enough for a person to walk through though, for best results. If the cube is placed in front of a door for instance, it should be made so that it's taller than a person. It should also be placed across the entire door, which ensures the character will definitely walk through it.

This red cube will be what activates the next stage of the quest. Or it can be used to toggle an objective, set a variable, and so on. Again, the character is going to need to walk THROUGH this cube, 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 draw, so it can take some messing around.

5). Anyway, double left-click on the red cube. If done right, the Activator panel will pop up. Note that the game calls the cube "Gas Valve" for some reason. Note that the ID is part of a scroll-bar too. Every trigger zone in the game will be include in this ID slot.

Tips: Sometimes it's difficult not to select some other object (or a wall) which is right behind the cube. Simply click OK when this happens, and try again to position the Render window so that the cube gets selected. It might help to hold the left Shift key while moving the mouse around (don't press or hold any mouse buttons down while doing this). And if things really get aggravating, Hold Z while pulling the entire cube down! Once the cube is below the ground (or floor) it's now in the void, where it's easier to select the cube itself.

6). Click on the New toggle (next to the ID panel). This closes the scroll-bar, so a new ID can be typed in. "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 closing the Activator panel, notice there are a bunch of colored lines & arrows in the cube. Now it can be moved, and also manipulated larger or smaller, with greater ease. If the cube was moved out into the void, time to move it back in place, back to where a character will definitely walk through it.

An easier way to change the cube's dimensions than trying to drag upon it is to double left-click on it, select the Primitive tab. From here, its X, Y, and Z Bounds can be changed. Click OK when done.

8). Double left-click on the red cube > Edit Base. Now it's time to add a script, which can be left as an Object. It should look like this..

scriptname aaaTriggerScript

Begin OnTriggerEnter Player

If (GetStage == X)
SetStage X
EndIf

End


Save the script, click OK on the Activator panel, and reopen it. Find the script in the scroll-bar area and select it. Click OK again.

9). When the Reference panel is reopened, click Persistent Reference ON. An actual Reference ID is not needed, unless there are plans for some quest or script to "know" that the cube/trigger zone is there. Usually this is not needed though.

10). Click OK and as always, save.

11). Open up the Quest window. Open the Target Ref tab, and add a target (vamp).

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.

Posted by: Renee Jun 26 2019, 12:10 PM

How to transfer saves from Xbox to PC, Games: Oblivion, Fallout 3, Skyrim

Although all the info here can be found online, here is a helpful step-by-step version. I am also including the YouTube video I found....

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

To make save transfers happen, Modio 5.3 must be downloaded. It can be found from several sites, but here's one I found.

https://modio.en.lo4d.com/windows

Download Modio from the big green Download for Windows button (and then choose either the US or UK versions) and save the program somewhere on the computer's hard drive. Make a desktop icon to make using this program even more convenient.


1). Insert a USB stick into the the Xbox 360. Some sticks go in the rear of this box, some might go in the front. Since the USB area is poorly-designed on my model, you may need an extension cord to plug into the box, if you have the same model I have.

2). Go into the Xbox's storage area like; Settings > Storage > Hard Drive > Games & Apps and then find the game, and the save you want to transfer. Copy this save from the hard drive to the USB stick.

3). On the PC, the USB stick will have a new folder in there, and each game will get its own folder.

> For Oblivion, this folder is called "Content." And inside of Content should be two more folders. One of these is called 00000000000000000, and this one will not be used at all, but keep it around anyway. The other folder will have its own, more complicated name. Go into this one, and keep diving into it until you find the Xbox save.

> For Fallout 3, there will be only one folder, and buried within this folder will be the save which just got transferred.

> Skyrim is like Oblivion, with two folders. Ignore the folder with all the zeros, instead delve into the second folder.

4). Copy/paste this save from the USB to the PC, in whichever area you like to keep saves.

5). Now, open Modio from wherever it got downloaded to.

6). On the bottom of the program, left-click on Open a Save.

7). Select the "Browse" button.

8). Now find the save just placed on the PC which got derived from step 3. Double-click on it.

9). On the left side of the program, select "Advanced."

10). Press the Edit Package Contents button (on the bottom of the window).

Now it's time to modify the file that's buried within the Xbox save. If this save was made in Oblivion, the file will be called gamedata.dat. If it was made in Fallout 3 or Skyrim, it will be called savegame.dat

11). Right-click on this file, and right-click "Save as...." and save it to the same area where the Xbox save was transferred to. Do NOT rename it.

12). Close Modio.

13). Now find the file just converted (which will be called gamedata.dat or savegame.dat). The game will not be able to read either of these as .dat files, so right-click on the file > Rename, and change the .dat extension to .ess for an Elder Scrolls game, or .fos for a Fallout game. So in other words, the file will now be called gamedata.ess, savegame.fos, or savegame.ess, depending if it's going to be used for Oblivion, FO3, or Skyrim.

.. It is possible change the file's name further if desired, but this is not 100% necessary.

...If the name gets changed, there will be a warning (after renaming the file) which can be ignored. Just click Yes.

14). Now, move the .ess or .fos file into Documents > My Games > *GAME* > Saves. There you go.

(*GAME* == Oblivion, Fallout 3, or Skyrim).

Posted by: Renee Oct 29 2019, 10:53 PM

Making a generic NPC Enemy, Game: TES V: Skyrim

Please refer to https://www.creationkit.com/index.php?title=Bethesda_Tutorial_Creating_an_Actorfor all the basics. The main diff with making a generic enemy is the Template Data area of the NPC page can get used, which makes spamming several different enemy-types much easier.

1). ActorBase: scroll this down to the Lvl area, and look for the type of enemy you want (bandit, necromancer, etc.). What this is, is a quick method of rolling up a new NPC.

2). Note there are 6 stages to every Class type. So for instance there will be LvlBandit01MissleWoodElf, but there will also be an 02, 03, 04, 05, and 06 version of this same NPC. This system goes from easiest (basic bandit archer) to hardest (Highwayman archer, perhaps).

3). Once we put the NPC into the game, he/she will not appear as an NPC, he/she will appear as a giant M. The CK cannot show this NPC yet, this will be handled once we're gaming.

4).
And this M will be colored. Note that the color goes from easiest to hardest. Double-click on the M, and then select the Leveled Actor tab. There is a scroll bar right in the middle of this page, which goes from Easy to Very Hard, and as we change this scroll, the color of the M also changes.

Posted by: Renee Jan 5 2020, 05:47 AM

Repeatable Bounty Quests Game: TESV: Skyrim

This module shall teach how to make an agent give out quests for multiple locations. Again, these will be bounty-type quests which are repeatable. And I have found they are also bullet proof (as in, stuff only goes wrong if I make a mistake somewhere, otherwise they are solid). As time goes on, I will add more and more to this idea, hopefully.

1). Open Creation Kit, find the mod you've been working with lately, bla bla.

Firstly, let's make the NPC quest-giver.


2a). OBJECT window > Actors
Give the quest-giver an ID, Name, and Short Name. I am naming him aaaQuestSteward for the rest of this tutorial. I am also suggesting "Steward" for his or her Short Name.

The most important thing about the NPC quest-giver is to make sure he or she is Unique. Toggle this on, and click OK.

2b). https://www.creationkit.com/index.php?title=Bethesda_Tutorial_Creating_an_Actor if you are unfamiliar with setting up an NPC. with these features being most important.


Traits tab: Voice Type. Make sure the NPC's Voice Type is one which is supported by the game.

Stats tab: The Class scroll-bar can be set to Citizen in most cases, especially if he or she is going to be put into proper society (not enemy territory).


Everything else about the Quest Steward (Factions, AI Packages, etc.) can be customized to your liking.

2c). Place the NPC into a Cell somewhere. WhiterunDragonsreach01 for instance. Make sure to remember which cell you put the NPC into, this is going to become important later.


3). OBJECT window > Character > Quest
Right-click > New into the main window.

3a). Give the quest an ID and Quest Name. For this tutorial I am naming the ID aaaBountyQuests (though in my game, its ID is more specific) Priority can stay at 50. Toggle Run Once off.

3b). Click OK, save from the main toolbar, and reopen the quest.

3c). Put the Type scroll-bar to Miscellaneous.

3d). In the Object Window Filter slot, type Bounty Quests\ and make sure that backwards slash gets typed in. Now, your quest will appear in the Character > Quests > Bounty Quests section of the Creation Kit, making it even easier to find.

4). Quest Stages tab
Six stages in total will be used. I am numbering them 0, 10, 15, 20, 30, and 50.


Stage 0: Left-click on 0. Now right-click > New into the top Log Entry window, and leave it alone, so it says EMPTY. Stage 0 is a pre-quest stage, so type ;Pre-quest into the Papyrus Fragment box.

Toggle Start Up Stage on.

Stage 10: During this stage the Quest Agent tells the player all the places there are to delve. These places will get added later, of course. Do all the same with the Log Entry window, so it says EMPTY. In the Papyrus Fragment box, some notes to self (aka documentation string....) can be added with a semicolon, such as ;Quest Agent greets player, offers locations.


Stage 15: Do all the same with the Log Entry window. During this stage there's going to be a crucial moment when the player-character inquires about the first location to go to. Or not. Documentation can be added into the Papyrus Fragment box.

Stage 20: This stage gets triggered after the PC chooses the first place to go. In my game, this is Morvunskar. Do all the same with the top Log Entry window and Papyrus Fragment box.


Stage 30 This stage gets triggered after the enemy gets pwned.


Stage 50 And here is the final stage, which gets bumped to after the PC returns to the quest agent, and gets a reward for pwning whichever enemy boss. Though this is technically the final stage, do NOT toggle Shut Down Stage on.


The Creation Kit often has two ways of doing the same things, and this is true with dialog. Modders can use the Dialogue Views window https://i.ytimg.com/vi/KA1BSEKFClY/maxresdefault.jpg or Player Dialogue https://ck.uesp.net/w/images/8/8a/QuestPlayerDialogueViewsWindow.png. I prefer Dialogue Views, so that's what's described below. Those who prefer Player Dialogue can still figure out what's below, as this latter method is similar to what's found in the editors of earlier games.


5a). Dialogue Views tab
Right-click > New into the tall Dialog Views window. Type whatever unique ID you'd like. For this module I am typing aaaDialogIntro.

5b). Click OK. Click OK again (closing the Quest window) and save from the main toolbar.


Now. Repeat after me: Branch > Topic > Info > Response. This is the typical way conversations between PC and NPCs are structured in the Creation Kit.

A new dialog Branch gets started whenever a new instance of dialog is begun. And each Branch can have one or more Topics (which are what we click on after an NPC has greeted). Each Topic leads to an Info, and each Info can hold one or more Responses (which are spoken by NPCs during conversations).

Again: Branch > Topic > Info > Response.


5c). Reopen the quest. Its Dialogue Views page should open by default.

5d). Left-click on the initial ID (in the tall, vertical window). Now right-click > Create Branch into the larger window. The name for this branch can be aaaBountyQuestStartBranch, though it can be named whatever is desired. Click OK. The CK will automatically put the word "Topic" at the end of the ID's name.


5e). In the larger window, there should now be a yellow box (representing the quest's opening Branch) and a smaller box within the Branch box. This smaller box has a horizontal yellow area (representing the branch's opening Topic, which has not been written yet) and a white area, (representing the Topic's Info + Response, which have not been written yet).

Note: If that yellow box doesn't show up, go to another tab (such as Quest Data) and come back to Dialog Views.

5f). Double left-click into the white area inside the yellow box. The Topic panel opens. Type an opening topic into the Topic Text slot. For now I'll type Adventures into this slot. Click OK. Click OK again.

Note: During the first OK click, the CK does a quick spellcheck, making sure the opening Topic is spelled correctly. If it is, nothing happens, so OK gets clicked again.

From here on, it's possible to continue using the Dialogue Views tab. If not, switch to the older-fashioned Player Dialogue tab. Since I am trying to learn Dialogue Views, that's what most of this shall discuss.

5g). Double left-click into the white Topic Info area.

5h). Right-click > New into the gigantic Info window. The New Response panel pops up.

5i). Type some Response Text. "Yes we have a few problem areas which need addressing. Bandits, necromancers, witches, they must be STOPPED!" Click OK.

The larger, more detailed Topic Info panel pops up. Fill in the Prompt slot "I have heard the Jarl wishes to see some areas eradicated?" This is the first dialog topic which gets seen in-game. If the Prompt slot is left empty, I'll see Adventures (the actual Topic name) instead.

5j). Right-click > New into the Conditions window. Conditions go like this...

GetIsID aaaQuestSteward == 1.00 AND
GetStageDone QuestName, 10 == 0


That second condition obviously tells the quest agent to say this opening bit of dialog if Stage 10 has not been done yet. This is a nifty new feature not found in Oblivion's Construction Set, and it works better with these repeatable quests of Skyrim.

Make sure to right-click > Copy All Conditions, so both of these conditions can get added into later portions of the quest.

5k). Type GetOwningQuest().SetStage (10) into the End: Papyrus Fragment box. A blue cross should show up in the Script Name window. Copy this command, so it can be conveniently pasted later on.

5l). Click OK. Click OK again, and save.

6). Quest Data tab
Make sure Start Game Enabled is toggled on. Later on, it's going to automatically get toggled off, but for now leave it on so the dialog written so far can be tested.

Tip: It's a good idea now to open up TES5Edit and make an SEQ file (or update it) for the mod, as detailed http://chorrol.com/forums/index.php?s=&showtopic=8089&view=findpost&p=308105. Next, go into the game itself, and speak to the Quest Steward. Make sure that opening Topic (and its Response) both show up. Obviously if that Topic and its resulting Response are not in the game, this needs to get addressed.


Close the game, and return to the CK. It's a good idea to keep following this process when making Skyrim quests, just to confirm everything is showing up in the game.

7a). QUEST window > Dialogue Views tab
Left-click on the initial ID in the tall left window, so the yellow box shows up again in the right window.

7b). Toggle Show All Text on (this is at the bottom of the panel) to see all the text typed so far. Sometimes the Branch's Topic won't show for some reason, but the first Response should be seen in the Info's white area.

7c). Right-click into the Branch area, which is the outer yellow part of the box. Choose Add Topic.

7d). Make a unique ID. In my game, since my first location is going to be https://en.uesp.net/wiki/Skyrim:Morvunskar, I typed aaaMorvunskarTopic for this ID.

This quest is eventually going to assume several locations are going to get added, just like the repeatable Oblivion Bounty Quests in this thread. So...

7e). Type the name of the first location into the Topic Text slot. For my game, I just typed Morvunskar. Click OK.

So let's recap. So far within this Branch (which I called aaaBoutyQuestStartBranch in my own game) are two Topics: the opening topic, and what shall become the first locational topic. In my Creation Kit, I seldom see the opening topic, but the locational topic often shows up, in the Topic (upper white) area of the yellow box.

7f). Double left-click into the lower white area.. Now right-click > New into the large, lower window.

7g). Type the Quest Steward's first locational response. "Aye, Morvunskar, retched place...." The steward then explains whatever details seem pertinent. "Was once a glorious fort filled with Nords, and now, it's nothing inside but nefarious necromancers! Have ye any interest?"

7h). Click OK. The Topic Info panel pops up.

7i). Add some text into the Prompt slot, if desired. As mentioned before, whatever goes into this slot is the topic we click in the game. If nothing gets added into the Prompt slot, we'll merely see the Topic Text typed earlier.

7j). Paste the two previous conditions into the Conditions area, but make sure to change the GetStageDone gets changed to ...

GetStage aaaBountyQuest == 10.

Right-click > Copy All Conditions these two conditions.

7k). In the Papyrus Fragment box, paste the command copied during step 5k, but change 10 to 15. Overall it'll say GetOwningQuest().SetStage (15)

7l). Click OK, and Click OK again.


So now we've got two topics located in one branch. But they are not "linked" together yet. If you were to go into the game now, the NPC steward is going to start by presenting his/her initial Topic ("Yes we have a few problem areas") but the following, locational topic may or may not show up properly.

First I am going to teach how to link them together using the Dialogue Views window, then I'm going to teach Player Dialogue. For those who wish to learn the Player Dialogue way, skip to Step 8a.

7p). Single left-click on the opening topic's upper (white or yellow) area. Now move the cursor down into the Info/Response (lower white) area. The cursor should change into a hand.

7q). Click and drag the hand from the opening Info/Topic are to the locational Info/Topic. It is now very obvious these two topics are connected. Easy as pie.

For those who prefer to use Player Dialogue, here's how to link those topics. (I'm going to pretend I didn't just link them).

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

8a). Player Dialogue tab
The opening Topic should be at the top of the middle section. Left-click on this, and double left-click on the Topic Info.

8b). At the far right side of the panel is the Link To section. Right-click > Add Link into this window. The locational topic should show up in the Select Topic panel.

8c). Select this topic (duh), and press OK.

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

By the way, don't forget to make recordings (or mock recordings) of all the dialog typed so far. Follow step 11p http://chorrol.com/forums/index.php?s=&showtopic=8089&view=findpost&p=310606 if reminders are needed. Or just Google "Creation Kit recording voices," and hope to find something on YouTube.

Now it's time to make the NPC enemy, heh heh! viking.gif

9a). OBJECT window > Actors > Actor
Right-click > New into the Editor ID window.

9b). Give the enemy an ID, Name, and Short Name. Toggle Respawn on. Toggle Unique on. Click OK.

Note that there are two ways to make an enemy:

a ). we can make him or her Unique (toggling Unique on) and then clicking OK. Using this section will create an enemy who is pretty much the same every time.

b ). ... Or we can go into the Template Data area, which is in the lower-left corner. Change ActorBase to whichever selection is appropriate. Using this section will create an enemy which is different every time (similar to using enemies created from Leveled Lists).


Only Method A (static enemy) reliably works, though. Using Templates will not work, the script which gets added later can be attached to what is essentially a random enemy, but the script itself won'd be able to trigger the quest to Stage 30. So ignore Method B.

It will be necessary to go into every pertinent tab (Traits, Stats, Factions, etc.) and fill in all those blanks. This allows the modder to create a very specific enemy, who will be more similar every time. The enemy's level can be varied a bit, if PC Mult is toggled on, and his/her Inventory can also be varied if Leveled List items are thrown in there. Otherwise, this enemy's always going to be the same, look the same and so on.

Make sure to go into the enemy's AI Data tab. Make this guy Very Aggressive if we want him or her to attack on sight!

Another method is to use Bethesda's method, which is to make it so that Stage 30 gets set once an entire lair gets cleared. I don't know how to do this yet, but even if I did, I prefer the specific enemy OnDeath method (described below) anyway. It's just more predictable. The game won't try to consider any enemies which get stuck in walls, or fall through the cell's floor.

9c). CELL + Render windows
Place the enemy into its appropriate lair and give him or her a Reference ID.

Tip:It's a good idea to put this enemy deep into the lair, so it'll feel like he or she is the actual leader, who must be clawed and searched before he/she gets found! On the other hand, for those who are just testing this quest (to make sure all its stages get updated without traveling all that way) the enemy can temporarily get dumped into one of the Creation Kit's testing cells. A full list of these cells can be found https://en.uesp.net/wiki/Skyrim:Test_Cells.


9d). Time to write the enemy's death script. Open the enemy's info from the Object or Render windows. Right-click > Add script into the Papyrus Scripts box.

9e). Double left-click on [New Script]. Give the script a unique name, like aaaEnemyDeathScript. Although I'm going for something more specific, so aaaMorvunskarDeathScript for my enemy orc. Click OK. A blue + with the script's name shows up in the Papyrus Scripts window.

9f). Left-click on the script, and press the Properties button. Press Add Properties. Time to give this script a Property. Change the Type scroll-bar to Quest.

9g). Change the Name to something unique. Since I am adding the first enemy into Morvunskar, I typed aaaMorvunskarDeathProperty.

9h). Click Ok, and wait for the Property to show up in the left window.

9i). Left-click on the Property, and press the Edit Value button. Now the Property should have a blue and yellow symbol next to its name.

9k).
Find the parent quest in the Pck Object scroll-bar. Click OK.

9l). Right-click on the script and select Edit Source. The script has a heading and its property has been named and created, so right now in my game looks like this...

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

Scriptname aaaMorvunskarDeathScript extends ObjectReference

Quest Property aaaMorvunskarDeathProperty Auto


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

The rest of the script will need to get typed in by hand. Altogether it's going to look like this....

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

Scriptname aaaMorvunskarDeathScript extends ObjectReference

Quest Property aaaMorvunskarDeathProperty Auto

Event OnDeath (Actor Killer)
aaaMorvunskarDeathProperty.SetStage (30)
EndEvent


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

Phew. Notice the fourth line of the script: "aaaMorvunskarDeathProperty" is what is setting the stage to 30, when the NPC enemy gets pwned. This is important to notice! ... Oblivion's Construction Set and Fallout 3's GECK both would use the actual quest name in scripts, when setting stages. Skyrim uses the Properties instead, because the Creation Kit does lots of things ass-backwards. It does them ass-backwards though, so that the game's resources run with more efficiency!

9m). Close the script editor, or select File > Save if merely checking to see if the script will save.

9n). Click OK, closing the NPC's panel(s).


10a). OBJECT window > Character > Quest
Select the Dialogue Views or Player Dialogue tab. Add a new Topic.

I won't go into as much detail now, but this topic continues the dialog choices which started during Stage 10. So now, there's an option to say "Yes, we shalt plunder X lair..." Follow steps 5f through 5i to create dialog, add voice, and so on.

10b). Conditions are as follows...

GetIsID aaaQuestSteward == 1.00 AND
GetStage aaaQuestName == 15


10c). Type GetOwningQuest().SetStage (20) into the End: Papyrus Fragment box. Click OK.

10d). Link the first locational topic to the follow-up topic just made (in which we agree to plunder that lair).

Tip: Eventually as more and more topics get added, the Dialogue Views window gets messier and messier. Toggle Show All Topics off. Now, it's easier to move these topics around to your liking. Single left-click on one of the Topics (the upper-yellow area, or sometimes it'll appear white) and literally drag the topic to wherever is desired. Its location in the window will not matter.


10e). Click OK, closing the Quest window. Save.

Again, it's a good idea to go into the game, speak to the steward NPC, and just make sure all those Topics and Responses are showing up.

So, all the dialog for starting the quest has been written, the NPC enemy has been created, now it's time to make the reward phase.


11a). OBJECT window > Character > Quest
We're going to use Player Dialogue or Dialogue Views to make a final branch (NOT topic, not yet anyway), this one dealing with getting paid. We return to the steward, he or she is able to confirm somehow that the lair's leader has been pwned, and now it's time for that reward.

Right-click > New into the leftmost (vertical) window, and for this lesson I'm naming this ID aaaBountyQuestsReward. Follow steps 5E through 5I to make the Reward topic, dialog, and so on.

11b). Conditions go like....

GetIsID aaaQuestSteward == 1.00 AND
GetStage aaaQuestName == 30


11c). In the Papyrus Fragment End box, type GetOwningQuest().SetStage (50)

11d). Click OK. And Click OK again. Save.

Time to put some messages into this quest, which will show onscreen as certain stages get fulfilled. This is done with the Objectives page, and there'll be a total of two objectives for this quest.


12a). QUEST window > Quest Objectives tab
Right-click > New into the topmost window.

12b). Type 20 into the Index slot, and type "Kill X leader of X location."

12c). Perform steps 12a and 12b again, this time adding 30 into the Index slot. Type "Return to Quest Steward" in the Display Text slot.


13a). Quest Stages tab
Left-click on Stage 20. In the Papyrus Fragment box, type SetObjectiveDisplayed (20)

13b). Click on Stage 30. In the Papyrus Fragment box, type SetObjectiveCompleted (20). Also type SetObjectiveDisplayed (30) in the same box.

13c). Click on Stage 50. In the Papyrus Fragment box, type SetObjectiveCompleted (30).

Click OK. Save.


14a). OBJECT Window > Items > Book
Edit a note which has the certain "look" that is desired (such as one of Bethesda's own bounty quest notes), and give this item fresh ID. Click OK, and click Yes, saving the Note as a New Form. Highlight this ID, and select Copy.

14b). Reopen the edited note, and type up a writ stating where to go, how much the party will get paid, and so on. Click OK.

Making this note a Quest Object is optional. Unlike the Construction Set, for which I made notes into Quest Items (necessary, since the actual Quest Journal was not used) the Creation Kit does not need to have this stipulation. The Objectives typed for Stages 20 and 30 will show up in the PC's Quest Journal, in its Miscellaneous section.



16a). QUEST window > Quest Stages tab
Click on Stage 20.

16b). Click on the Properties button. After the panel pops up, click Add Property.

16c). Look for Book in the Type scroll-bar.

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

16e). 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.

16f). In the Papyrus Fragment box, type Game.GetPlayer().AddItem (aaaBookName, 1)

Click OK, closing the Quest window. And save, and reopen the quest.

Tip: During step 16f other items can get added. For instance, in my game, I'll use the Properties button to make properties for potions. Select Potion in the Type scroll-bar, and add the potion's actual name from the Object window, such as HealingPotion01 or whatever. This way, the NPC quest giver gives us that note, but also gives us a bunch of helpful potions (and whatever other items) as well.

Troubleshooting: Sometimes the Papyrus Fragment box will scream error messages for all sorts of reasons, as Properties are trying to get made. A common error has to do with "Reference already created" or something such, like this...

C:\Program Files\Steam\steamapps\common\skyrim\Data\Scripts\Source\temp\ Startingquest.psc (19,13): script property NewProperty already defined

Arrgh!!! If this happens, click on the Scripts tab of the Quest window, select the ID (it'll be the only item which is selectable on this page) right-click then select Edit Source. This will open up a page full of script fragments. Scroll down until you find any script which has to do with the error(s) seen earlier, and erase these. For instance, if too many properties have been made for a particular potion, erase any script fragments which have been made for that potion's name, and then select File > Save to make sure the Script editor saves everything successfully.

More info can be found here..
http://tesalliance.org/forums/index.php?/topic/5482-creation-kit-cant-compile-scripts/



17a). Quest Stages tab
Click on Stage 50 again. Click the Properties button, and click on Add Property.

17b). Look for MiscObject in the Type scroll-down. Type Gold001 into Name. Click OK, and click OK.

17c). In the Papyrus Fragment box, type Game.GetPlayer().AddItem (Gold001, X) with "X" being whatever you think is fair. Also type...

stop()

Stop() is what causes the quest to stop running, but do NOT toggle Shut Down Stage on. This quest is now good as a one-time affair. Here's how to make sure the entire thing respawns.


18a). QUEST window > Quest Data tab
Toggle Start Game Enabled off, then toggle Allow Repeated Stages on.

18b). Change the Event scroll-bar to Change Location Event. Click OK.


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

19b). You might see several nodes made for other quests, or you might just see a large window which is mostly empty. Right-click on the very top choice, which is "Stacked Event Node: Change Location Event".

19d). Select New Quest Node. A new choice called "Stacked Quest Node" should be at the very bottom of this window. Scroll down (if needed) and find it.

19e). Right-click on Stacked Quest Node and choose Add Quest. Find the quest being worked on, and lcick OK.

This page is similar to the Quest Aliases page, which is too big to fit entirely on most computer screens. So in most cases, it's time to work sideways. What I'm about to describe is from my Windows 8.1 computer, so maybe other operating systems do this differently.

19f). Minimize the Creation kit. Right-click onto the desktop and choose Screen Resolution.

19g). Change the Orientation scroll-bar to Portrait. Click Apply, and click Keep Changes. Everything is pointed to the left now! Also, note that everything I'm describing is for a Windows 8.1 system, so i have no idea how Window 7 or 10 does this.

19h). Return the CK to its full size. Highlight the Node which just got created (not its quest, which is to its right).

19i). Type aaaQuestNameQuestNode into the ID slot, changing "Quest Name" to whatever the name of the quest is.

19j). Toggle "Do all before repeating" and "Shares Event" on.

Minimize the CK (if needed), and change Screen Orientation back to Landscape.

19k). Right-click > New into the Node Conditions window and make these conditions.

GetInCurrentLoc Location: X == 1.00 AND
GetDead None == 0.00


For the first condition, change the Run on scroll-bar from Subject to Player. Click on the INVALID button, and find the location where the quest agent works. Click OK.

For the GetDead condition, change the Run on scroll-bar from Subject to Reference. Press the Select button, and find the enemy's cell. If the enemy is still in the Reference window, it's easy to simply click Select Reference In Render Window and double left-click on the referenced enemy. Click OK.

19l). Click OK at the top of the SM Event Node panel.


Finally, there needs to be some "no" dialog, so the character will have a choice to pick a location to plunder, or not. Saying "No" is actually important, because it can reset the entire quest back to its pre-stage 10 again.

20). Go into Quest Stages and add Stage 29. Add some ;notes to self in the Papyrus Fragment box, and type Stop() into this box. Click OK.


21a). QUEST window > Dialogue Views or Player Dialogue tab
Make sure the enemy is still in the Render Window. Open the locational topic (this is the one which goes from Stage 10 to Stage 15). In my game, this is Morvunskar.

21b). 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. There should be three conditions for this topic now: GetIsId, GetStage, and GetDead. All three are needed just so the agent's information stays efficient. He or she won't blab about a location if its top leader has already been taken care of.

21c). Click OK.



22a). Reopen the Quest window (I swear this will be the last time!) Go into Dialogue Views or Player Dialogue. Right-click > Add Topic into the branch.

22b). Make a topic dealing with the PC saying "no!" Add dialog, bla bla bla.

22c). For this topic to work, all that's needed is the same GetIsID condition.

GetOwningQuest().SetStage (29) goes into the Papyrus: End box.

22d). Now it's possible to link the No topic from the quest's initial dialog ("So, you have come to assist us...") or at any point between Stages 10 and 20. This will ultimately cancel the quest's progress, sending it back to Stage 0. The only catch is, you'll need to exit and re-enter the same cell where the quest agent works. This way, the quest's GetInCurrentLoc node triggers.

23). Save everything, and test in the game. Make sure the update that SEQ file.

Note that this quest will start only if that NPC enemy is alive. Once the enemy has been killed, the quest will remain dormant until the enemy respawns (along with the entire cell he or she is in).

Note 2: After a quest is done, the character rewarded, it can sometimes take awhile for the quest to reset back to the beginning. Usually after several hours / going into different cells, the quest will then reset back to the beginning.

Posted by: mALX Jan 5 2020, 06:26 PM


These are awesome tips! Thanks Renee!









Posted by: SubRosa Jan 5 2020, 07:54 PM

Wow. That is amazing.

Posted by: Renee Jan 5 2020, 10:48 PM

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=&showtopic=5023&view=findpost&p=225359

http://img.photobucket.com/albums/v90/subrosa_florens/oblivion/Oblivion203.jpg

https://i1113.photobucket.com/albums/k505/mirocu/Oblivion2011-01-1521-05-51-44.jpg

https://web.archive.org/web/20200220053831/http://forums.bethsoft.com/topic/1235244-where-are-you-now-4/page-1

https://hosting.photobucket.com/albums/ad208/xenaclone/.highres/99c77b54-bd4a-480b-a87e-5c1118b502cd_zpseff92113.jpg

Posted by: Renee Jan 29 2020, 01:46 AM

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 https://en.m.uesp.net/wiki/Skyrim: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.

Posted by: Renee Apr 1 2020, 11:43 PM

SetActorOwner

https://www.creationkit.com/index.php?title=SetActorOwner_-_ObjectReference

Patrolling the Mojave almost makes for a nuclear winter. (NPC man says this)

Posted by: SubRosa Apr 2 2020, 12:28 AM

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.

Posted by: Renee Apr 2 2020, 12:33 AM

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.


Posted by: Renee May 31 2020, 05:11 PM

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.

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





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

Posted by: Renee Jun 4 2020, 08:25 PM

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

In the year 2017 a character I rolled, Janet Telia, http://chorrol.com/forums/index.php?s=&showtopic=5175&view=findpost&p=289848. 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 http://fose.silverlock.org/fose_command_doc.htmldid 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.

https://i.imgur.com/UAqfCWl.png.

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.

https://i.imgur.com/ERtBXh4.png. 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.


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 what's below has already been written, if you've been following this guide so far. But some new material also gets added...

scriptname aaaEnforcementOfficerScript

; 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 some sort of hunger strike.

Only the bot's GetIsID is needed here. Toggle Goodbye on. Toggle Say Once a Day on.

Posted by: Renee Jun 20 2020, 04:55 PM

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. https://www.youtube.com/watch?v=RYJAj-63FR4.

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

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, https://www.youtube.com/watch?v=rXTo5i-NtzI&has_verified=1.


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

Posted by: Renee Jul 26 2020, 06:07 PM

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..."


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

Posted by: Renee Sep 27 2020, 12:47 AM

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.

Posted by: Renee Sep 28 2020, 02:55 PM

https://www.youtube.com/watch?v=wj6qGCT4isg&ab_channel=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

Posted by: Renee Oct 29 2020, 11:17 PM

https://web.archive.org/web/20130429160307/http://www.creationkit.com/SetLockLevel_-_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/http://forums.bethsoft.com/topic/1343689-papyrus-onequipped-example-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

Posted by: Renee Nov 28 2020, 03:00 AM




I have found a really good Daggerfall tutorial which was originally written in Beth's forums by BOX MAAAN. I'm copy/pasting most of it, so if I ever get involved with Daggerfall again I'll have this guide ready.

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

INSTALLATION:

This is the easy part. Just check out "DaggerfallSetup"; it's an installer that comes with a preconfigured DOSBox and a bunch of unofficial patches, so after everything is all installed all you have to do is double-click a shortcut and you're in the game. You can download Daggerfall from Bethesda's official website, but I'd strongly recommend just sticking with DaggerfallSetup. And don't worry, it's completely legal.


It also comes with a few extra goodies. Once you get into the game and make your first save, open the Eye of Argonia application in your Daggerfall installation folder and run it to patch your savegames to increase your view distance. Don't ever touch the detail slider on any of your saves, before or after running this patch, otherwise it won't work. And if your save ever gets screwed up in some way, try using Fixsave on it before giving up.


CONTROLS:

The first thing you want to do when you wake up in Privateers' Hold is customize the control scheme to something more to your liking. With a little tinkering, you can make Daggerfall's controls feel positively modern - which for me is a huge help in making the game enjoyable. I can't tell you what your ideal control scheme is, but�€�

�—�
Turn on mouse look. For the love of Arkay, turn on mouse look. Daggerfall was one of the earliest games to feature full mouse look, and don't you ever take it for granted.

�—�
Remap WASD so that it uses "Slide Left/Right" instead of "Turn Left/Right". Mouse is covering the camera, so for the most part you can forget about the Turn Left/Right mappings.

�—�
Since you're using mouse look, you'll need to use either "Activate Center Object" to interact with things (which works just like it does in modern Elder Scrolls games), or "activate cursor" to temporarily toggle off mouse look and bring up the cursor to click on whatever you want to interact with. I generally just use "Activate center object", but Daggerfall doesn't have a crosshair it can sometimes be tricky to activate those little switches and stuff - "activate cursor" comes in handy there.

�—�
You could also enable fullscreen to disable that bar at the bottom of the screen with all of your interact options and the wait/rest menu - it's not as useful if you're using mouse look, and in fullscreen your HUD will just be you health/magicka/fatigue bars and your compass, which looks nice.

�—�
"Float Up/Down" are used for when you're underwater, or under the effects of a levitation spell.

�—�
I've honestly never used the "steal/grab/info/talk" mode keys - generic activate seems to be pretty smart about what you're doing when you click on something, but maybe you'll need "Steal mode" to pickpocket people. Never knew if just crouching/sneaking let you pickpocket people like in the later games.

�—�
As it happens, "Sneak" doesn't put you in a stealth crouch like the later games, it just slows down your speed so you can tip-toe around, since faster movement means more noise. Similarly, your starting speed isn't as bad as in Morrowind so "run" feels like actual sprinting. And the fatigue drain from running isn't too bad, so feel free to run around a lot. I never had much use for "crouch" or "slide", but you will need crouch for a dreaded wall opening in Wayrest Castle.

�—�
You need to be moving when you jump if you want to jump in any direction other than straight up.

�—�
"Cast Spell" brings up your spell list. Double-click a spell (or hit Enter with that spell highlighted) to cast it: on-self effects (and Open, for some reason) will automatically cast, but on-touch and ranged spells are only loaded; you'll have to hit the "activate center object" key to fire. On-touch requires a valid target (so with an enemy within attacking range), on-target can be fired regardless. Recast spell loads whatever spell you last cast. "Abort spell" unloads any spell you've loaded but haven't cast, as well as refunds the magicka cost. "Use magic item" works like "Cast spell", but instead of opening the spellbook it opens a list of magic items in your inventory to load spells from.

�—�
"Rest" is how you wait to pass time. Resting restores your health/magicka/fatigue, loitering doesn't but it passes the time just the same. Loitering is for when you need to pass the time in a city until the shop/guild you want is open - don't rest inside a city, or you'll get arrested for vagrancy. You can't loiter for more than three hours at a time, because Daggerfall hates you. Just re-enter the menu every three hours.

�—�
"Transport" opens a menu where you can choose whether to walk, or mount your horse and/or cart. You need to buy a horse and cart at any general trader, and then when you do they'll exist in hammerspace until you mount them with this key - can't do it in interiors of course, and remember if you're riding on your horse or cart you won't be able to grind your Running/Jumping skills. If that's important to you. Also, if you own a ship, you can use this menu to basically teleport to it.

�—�
Think of "automap" as the local map from the modern games - a top-down look at the city or interior space you're hanging out in. The automap inside dungeons is super useful, and even more frustrating to actually use; but it's not hard to get used to. The travel map is the world map, and you'll use it to, yup, fast-travel. Which isn't optional, by the way. And don't misspell the whacky fantasy name of the location you're traveling to, the map isn't smart enough to guess what you were saying.

�—�
You can access your inventory menu from the character sheet, in case you need to be conservative with how many buttons you have (for instance, if you're trying to use a controller). Status tells you the time, date, and your current health. "Logbook" shows you any active quest notes, and your main quest progress. "Notebook" is for any dialog you save, but I honestly haven't really used it all that much.

�—�
Oh right, weapons. "Ready weapon" is just the draw/sheathe key. You can equip two one-handed weapons, and switch between them with "switch hand". "Swing weapon" is the part everyone gets confused on, but IMO once you know how to use it combat feels great. You don't attack by pressing "swing weapon", you hold down that key while you move the mouse to attack. So just think of it as "attack mode": with "swing weapon" held, you use your mouse to attack, and with it up, you use your mouse to look around normally. For reference: Mouse up is a thrust (lower damage, better accuracy), mouse down is a chop (higher damage, lower accuracy), diagonal attacks do slightly more damage with slightly less accuracy, and horizontal attacks are neutral. You can even just hold down the "swing weapon button" and draw circles with your mouse, and you'll get by in most cases.



CHARACTER CREATION:

My favorite feature in Daggerfall is the most open-ended, and most utterly broken, character creation in the entire series. If you pick a preset class via list or personality test, you'll have a fine experience; but in this guide I want to go into detail about how to get the most of the custom classmaker, with and without exploits. I'll also touch on the background questions that come after deciding your character class, which has some important parts to it.


Attributes: distribution is pretty straightforward, any points you add to an attribute must be subtracted from another. Attributes can't go higher than 75 or lower than 10 here. (Exploit: if you hit U in the classmaker screen, it resets the counter for attribute distribution to zero while keeping any changes you made. Useful for creating a god character, but this is indisputably cheating.) UESP does a fine job of describing each attribute, but a few notes:

�—�
Speed governs attack speed, not just movement speed. Since the combat is dice-roll based like Morrowind, it may be more beneficial to boost speed and your frequency of attacks than it is to boost damage with Strength.

�—�
I'd say the biggest dump stat would have to be Personality. It affects barter prices, but finding enough gold is hardly a problem. It also affects your ability to get information from people, which basically amounts to asking for directions. Which isn't difficult to do, at all.


Skills: Daggerfall has 35 skills, more than any other Elder Scrolls game, but it also has the highest number of useless skills in any Elder Scrolls game. You may have difficulty filling out your list of class skills with things you actually care about. A few notes:
�—�
Since combat is dice-roll based, your best bet is to pick one weapon skill and just stick with that. Of these, Long Blade is probably the best, but keep in mind that bladed weapons deal half damage to Skeleton Warriors (but not any other skeletal enemies, like Liches, I think). And there are no artifacts that use the Axe skill, if that's something you care about.

�—�
Lockpicking is a pretty crummy skill even if you're a thief-type character. It's automatically checked at any locked doors, and to my knowledge even if you raise it up it's not very reliable and doesn't work on any magically sealed doors. You can bash any door you could potentially lockpick, so just do that and have an Open spell handy for any magic locks.

�—�
Language skills are useless. Don't even bother. For reference, a language skill is checked when you approach an applicable enemy with your weapon down, and if the check is successful, all that happens is that particular enemy isn't hostile to you. And to be honest, I can count the number of Centaurs and Dragonlings I've seen in this game on one hand, so their language skills are even more useless.

�—�
It's worth checking UESP to see the schools of any spells you plan on casting. Daggerfall's spell schools are�€� bizarre, from the perspective of a modern Elder Scrolls player.


Difficulty dagger: this shows how much time it will take for your character to advance their skills. It goes up when you take an advantage or increase your HP gain, and goes down when you take a disadvantage or lower your HP gain. Your class isn't acceptable if the dagger is ever in the red.


Hit Points per level: the amount of HP you gain with each level up is anywhere between this number and half of this number. Plus your bonuses from Endurance. I've always liked playing tanky, so I generally pump this up, but it's your call how high you want to go. I wouldn't go extremely low, though.


Advantages and disadvantages: this is where you can really break the game.
�—�
Acute Hearing, Adrenaline Rush, and Athleticism aren't really worthwhile advantages.

�—�
"Bonus to Hit" is good, but I wouldn't suggest picking it for Animals. That may give you a small boost early on, but animals are generally the weakest creatures in this entire game. Likewise, this means animals are the best group to take the "Phobia" disadvantage for, since they're the least threatening option and all of the phobias are worth the same on the difficulty dagger.

�—�
Take "Expertise In" whatever weapon skill you chose for your class. This will increase your accuracy even further with that weapon type, which will remain useful for the majority of the game. Likewise, you can take "forbidden weapon type" for any weapon types you never, ever plan on using to get more mileage out of your difficulty dagger. Maybe don't forbid Short Blades, though.

�—�
Increased Magery is essential if you ever plan on casting more than just a few spells. By default, your max magicka is only half of your Intelligence, which is barely good enough for the weakest spells. Don't be afraid to go all the way to 3x INT in spell points. I strongly recommend you have at least enough magicka for basic spells.

�—�
Immunity, Resistance, Low Tolerance, and Critical Weakness are pretty self-explanatory, but a few things to clear up: "Magic" in this sense is an element alongside poison, fire, frost, or shock; it's not all-encompassing like it is in Oblivion or Skyrim. By glancing at the bestiary on UESP and looking at all of the enemy spells, it seems like the best element to take a weakness to is Frost - it's the least common element among higher level spellcasters, so you'll only ever need to worry about Ice Daedra after you level up a little. Most of the other elements are about equally common, although Poison seems to be the second least common after frost.

�—�
Also! Feel free to take a critical weakness to paralysis. All you need if you ever get paralyzed, is to cast Free Action. Which is one of the cheapest spells in the game, and easy for even non-mages to cast. Plus, if you start as a High Elf, your racial immunity to Paralysis completely overrides any class weakness to it you pick, for some free space on the difficulty dagger. That's kinda exploity, though, sooo...

�—�
Regenerate health, I think, isn't worth the chunk it takes out of your difficulty dagger. Damage health, similarly, I don't think is worth taking in any context. Worth mentioning that for the purposes of these effects, and any other advantage/disadvantage, "darkness" means not just night, but inside every dungeon. Which is where 90% of the game takes place, and where your choices here really matter.

�—�
Rapid Healing, on the other hand, might be a worthy timesaver. It increases how much HP you heal for each hour you rest, and since most quests have a time limit, this will give you some extra breathing room to rest up without running out the clock. It doesn't increase how quickly you recover fatigue or magicka from resting, though, so if those are tapped out it won't make a difference.

�—�
Spell absorption is weird. Your chance to absorb spells half your INT+WIL, but you can also absorb the magicka from your own area-of-effect spells if you get caught in the splash damage. And any magicka absorbed over your max directly damages your health. Magicka burn, it is called.

�—�
I don't recommend taking "Forbidden Armor Type: Plate" as that forbids you from everything but the first two tiers of armor. The classmaker makes it seem like leather, chain, and plate are Daggerfall's version of light, medium and heavy armors; but there aren't any armor skills, armor only factors into your defense and not things like movement or fatigue drain, and leather and chain are simply the two weakest tiers of armor. On the contrary, you could get away with forbidding yourself from using leather and/or chain, and never miss either after leveling up once or twice.

�—�
"Forbidden Shield Type", you can take or leave. Shields aren't actively used like in Oblivion or Skyrim, or even activated like a dice roll in Morrowind - they're just an extra armor slot you can throw on if you're not wielding two weapons, or a two-handed weapon.


Reputations: Optional, and just affects your rep with generic groups in the game. No huge game-changers here.


Background questions: One nifty feature about Daggerfall is that it will automatically generate your character's backstory depending on your class and how you answer some of these background questions. Most of this is just flavor, or for some marginal stat changes that you can find in the UESP, but two things to highlight:

�—�
One of the questions will ask you what you got as a gift from the Emperor. Choose the Ebony Dagger. Always. (and make sure you haven't forbidden your character from using Short Blades in the Classmaker) This means you'll start the game with one of the most powerful daggers in the game. Most other weapon types will start to outperform it as you upgrade to a higher tier, and you'll want to focus on whatever weapon type you picked as your class skill - but the Ebony Dagger will be a huge lifesaver if you ever encounter an enemy that's immune to your current weapon material. Ebony is capable of damaging anything - up until you find Mithril at later levels, there will be enemies your current weapon may not be able to damage. Especially if it's something like a Daedra spawned as part of a quest, instead of the typical level-scaled fare.

�—�
Exploit: If you take "Critical weakness to disease" as a disadvantage in the classmaker, and then take an additional weakness to disease, you'll gain complete immunity to diseases. And diseases in this game are mean. But you won't get immunity to vampirism or lycanthropy - those have a chance to transfer that isn't changed by disease resistance.



That's it for character creation. After picking your class and background, you'll be able to distribute some extra points among your skills and attributes. Fun fact: you can potentially start the game with one attribute as high as 99, if you raise it to 75 in the classmaker and keep rolling the dice for a satisfactory attribute spread. Another fun fact: You can change your character's name at any time by clicking on it in the character sheet.


I'd recommend reading a little about the leveling mechanics on UESP. Skills only advance when you rest. Every time you level up, you get 4-6 points to distribute among your attributes freely as well as a health boost determined by what you chose in class creation. You can save scum for each level-up to get the best results, but it's hard to track when your character will actually level up. And despite the save scumminess, I honestly prefer Daggerfall's leveling system to Morrowind and Oblivion's. 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.

Posted by: Renee Jun 11 2021, 12:47 AM

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 https://www.nexusmods.com/morrowind/mods/45352 >> 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 https://xpadder.com/. 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.

Posted by: Renee Jun 24 2021, 02:36 AM

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.

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/https://forums.bethsoft.com/topic/1436806-the-cocky-and-arrogant-knight-and-his-faithful-squire/

Posted by: Renee Aug 20 2021, 06:40 PM

Getting the Take All button to work, Game: TES IV: Oblivion

Submitted by Lena Wolf

1. Get https://www.nexusmods.com/oblivion/mods/39313 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).


Posted by: Renee Sep 1 2021, 01:12 PM

Setting fallback cell (instead of Tiber Septim)

https://web.archive.org/web/20200218144220/https://forums.bethsoft.com/topic/1438510-this-has-been-a-strange-game/

Posted by: Pseron Wyrd Sep 1 2021, 04:32 PM

QUOTE(Renee @ Sep 1 2021, 08:12 AM) *

https://web.archive.org/web/20200218144220/https://forums.bethsoft.com/topic/1438510-this-has-been-a-strange-game/

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.

Posted by: Renee Sep 2 2021, 01:58 AM

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

Posted by: Renee Jan 23 2022, 03:36 PM

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.

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

Posted by: Renee Jan 23 2022, 07:24 PM

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.http://en.m.uesp.net/wiki/Skyrim:Test_Cells.


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 http://chorrol.com/forums/index.php?s=&showtopic=8089&view=findpost&p=322207. 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 http://chorrol.com/forums/index.php?s=&showtopic=8089&view=findpost&p=310606, 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

Posted by: Lena Wolf Jan 25 2022, 03:57 PM

I thought this thread was for Oblivion? wink.gif Never mind. I've been fiddling with animations lately, and have written up https://masserandsecunda.wordpress.com/making-proper-mods/using-idle-animations-in-your-mods/ how to define your own animations. Perhaps it can be useful to others. This is for Oblivion.

Posted by: Acadian Jan 25 2022, 05:30 PM

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

Posted by: Lena Wolf Jan 25 2022, 05:41 PM

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.

Posted by: Renee Jan 25 2022, 06:12 PM

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.

Posted by: Acadian Jan 25 2022, 07:22 PM

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.

Posted by: Renee Jan 25 2022, 08:44 PM

Thanks, paladin!

Posted by: Renee Mar 13 2022, 10:11 PM

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. http://chorrol.com/forums/index.php?showtopic=8089&st=20&p=309878&#entry309878.

Posted by: Renee Apr 1 2022, 01:21 AM

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.

Posted by: Renee Apr 3 2022, 02:39 AM

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.

Posted by: Renee Nov 27 2022, 04:20 PM

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

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) exists on the .ini just copy/paste them in.


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

Posted by: Renee Dec 3 2022, 02:53 AM

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 https://nexus-mod-manager.com/ (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 https://www.nexusmods.com/morrowind/mods/19510, 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 https://www.nexusmods.com/morrowind/mods/41102, 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). By now I tried starting up my game again and got the "snowflake" error message, which is listed in the tutorial above this one. 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.

8). Removed Bloodmoon and put Morrowind back in the tray. 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. 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.


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

🍷👑

Posted by: macole Dec 3 2022, 07:59 AM

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.

Posted by: Renee Dec 3 2022, 02:26 PM

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".


Posted by: Renee Dec 11 2022, 11:41 PM

Get a Job! Game: TES V: Skyrim

I wanted to make one of my characters in this game get a job working for https://en.uesp.net/wiki/Skyrim: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, https://i.imgur.com/KItDHS8.jpg. 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 https://www.nexusmods.com/oblivion/mods/44087, 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 https://en.uesp.net/wiki/Skyrim:Quest_all_Beggars_Have. 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 http://chorrol.com/forums/index.php?s=&showtopic=8089&view=findpost&p=308105, in case a quick reminder is needed.

Posted by: Renee Jan 21 2023, 07:32 PM

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.


Object window > Character > Package
8a). http://chorrol.com/forums/index.php?s=&showtopic=8089&view=findpost&p=341715. 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.

Posted by: Renee Feb 10 2023, 03:07 PM

Traveling with an NPC, Additional Locations. Game: TES V: Skyrim

This lesson goes with the one started above. The NPC warrior has been taken to Dragonsreach, and now he wants some downtime. Once he's done doing whatever he's done doing in Dragonsreach, he'll want my healer's services again. He's finished whatever business in Dragonsreach, and will want to go somewhere else, which can be either Nightgate Inn or Riverwood the way I'm about to write this, or it can be any other interior cell. But he don't want to go there alone. He wants someone to heal him as he travels, getting in fights and so on.

Eventually it's going to be possible to find multiple travelers who want to go to multiple destinations. Silly idea, but hey. It's necessary I learn how to do this for some future ideas I've got in my main Skyrim fanfiction.

Two quests are going to be needed: one which handles dialog, the other is a timer. If you've already made the timer and finished adding a second location, but wish to add a third location, skip to step 3a.

I'll start with the timer. ⌛ There are two ways to go about this: the timer can be directly attached to the quest which handles dialog, or it can be standalone. I prefer standalone. Reason being: the same timer, just one, can be structured to handle several other quests.

Object window > Character > 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 http://chorrol.com/forums/index.php?s=&showtopic=8089&view=findpost&p=350596.

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:

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.

And actually, 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.

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.


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: 50.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
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

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 http://chorrol.com/forums/index.php?s=&showtopic=8089&view=findpost&p=350596, 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 criss-cross 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

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.

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

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: NPCPropertyName.OpenInventory()

http://chorrol.com/forums/index.php?s=&showtopic=8089&view=findpost&p=350596 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

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.


9a). Return to the initial branch & topic which started this entire quest in step 3c. This is aaaPlayerReturnsBranchTopic for me.

9b). Right-click > Edit Topic the top (yellow) portion of the topic, so the Topic panel shows up. There should already be a Dragonsreach info here.

9c). Right-click > New into the window. The info/response being written is going to share this same topic. So "I have returned" should be the Topic Text from before.

Response: Good. Think I'm done here in Riverwood. Wish to head somewhere else?
Prompt: Are you done here in Riverwood?

Flags: Has Lip File, Force Subtitle (if using no voice).

Conditions
:
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

Make sure the "GetInCell" references the Player.

9d). Use the Link To: window to link to the Locational topic. And also the "No" topic.

Now... the Locational topic currently has one or two random choices: Riverwood and maybe Nightgate Inn, I'm forgetting if I added Nightgate already. As before it'd be silly to have the guy say "Take me to Riverwood" if this was just done, so.....

9e). Add a PL GetInCell Cell: 'RiverwoodSleepingGiantInn' != 1.00

Hmm, I think I added that before. Anyway,

9f). Repeat the step above for Nightgate Inn, or any other locations.

Click OK 2x and save.

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 http://chorrol.com/forums/index.php?s=&showtopic=8089&view=findpost&p=353909 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:

aaaDeathTimerScript.RegisterForSingleUpdateGameTime(Hours)

This ensures the timer is reusable.



11a). Finally, we're going to make the NPC teleport to some other location http://chorrol.com/forums/index.php?s=&showtopic=8089&view=findpost&p=350596.

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.

Posted by: Renee Feb 13 2023, 01:58 AM

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 http://chorrol.com/forums/index.php?s=&showtopic=8089&view=findpost&p=350596 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.

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
R (aaaWarrior01Ref) 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 (aaaWarrior2Ref), and at least one of the GlobalVariables (aaaAccompanyGlobal).


Scriptname aaaAlternateFollowerScript extends ObjectReference

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

Event OnPackageStart(Package akaaaAlternateFollowerPackage)
If aaaAccompanyGlobal.GetValue() == 1
aaaWarrior02Ref.EvaluatePackage()
Debug.Trace("New package starts running")


EndIf
EndEvent


I also added a message in the If/EndIf block so that I know when the package kicks in, but messages are optional.

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.

🍷🍷

Posted by: Renee Mar 3 2023, 03:58 AM

Dialog Speech Checks Game: TES V: Skyrim

This tutorial comes from https://www.creationkit.com/index.php?title=Tutorial:_Dialogue_Speech_Checks, 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)

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.


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.

Posted by: Renee Mar 19 2023, 05:52 PM

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.

Posted by: Renee Mar 26 2023, 07:31 PM

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 https://www.nexusmods.com/fallout3/mods/22312, which makes interior locations (Super Duper Mart, for instance) respawn with enemies, but also loot. This mod requires https://www.nexusmods.com/fallout3/mods/8606 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: https://geck.bethsoft.com/index.php?title=Category:NPC.

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

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

Posted by: Renee Apr 2 2023, 06:36 PM

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 the new topic in the left-most window.

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
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 conditions to copy.

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
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 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 Timer1 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

Posted by: Renee Apr 23 2023, 01:50 AM

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.


Posted by: Renee May 19 2023, 06:54 PM

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 my "plain English" directions as well.

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

Let's start with https://skyrimck.uesp.net/wiki/AddItem_-_ObjectReference.



If adding an object to the player, type Game.GetPlayer().AddItem(ObjectName, X) instead of "aaaNPCRef.AddItem..."

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

https://www.creationkit.com/index.php?title=Enable_-_ObjectReference -------- (click spoiler tag below for my explanations).




https://www.creationkit.com/index.php?title=EvaluatePackage_-_Actor




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




https://skyrimck.uesp.net/wiki/ShowLimitedRaceMenu_-_Game

"LimitedRaceMenu" used as a script frag opens up the limited version of SRM, which means the character's Name, Race, Sex (and skills) stay intact while we can modify only their looks. It is apparently what the face sculptor added by Dawnguard in the Ragged Flagon uses.


https://www.creationkit.com/index.php?title=ObjectReference.MoveTo_(Papyrus)




https://www.creationkit.com/index.php?title=OpenInventory_-_Actor



https://www.creationkit.com/index.php?title=Show_-_Message




https://www.creationkit.com/index.php?title=SetEssential_-_ActorBase



https://wiki.bethesda.net/wiki/creationkit/Skyrim/SetPlayerTeammate_-_Actor/




https://www.creationkit.com/index.php?title=StartCombat


Posted by: Renee May 26 2023, 10:29 PM

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. https://i.imgur.com/mLqCugl.jpg. 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.

https://www.youtube.com/watch?v=Exc5pm92akk&t=6s. It's made by Seddon, who makes perhaps the very best video tutorials!

https://www.youtube.com/watch?v=Exc5pm92akk&t=31s. Note that trying to fix this in NV is different from FO3. Essentially, you'll need FNVEdit to fix the problem. https://www.nexusmods.com/newvegas/mods/34703/

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. https://i.imgur.com/oWniPfc.jpg.

Posted by: Renee Jun 8 2023, 08:02 PM

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.


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.

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.

Posted by: Renee Jun 21 2023, 12:03 PM

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.


Posted by: Renee Jun 24 2023, 07:29 PM

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 to me I'm after overall realism, not overall challenge. Some folks might want to make lists stronger, of course. Sure, this is possible as well.

I'll include guides for some latter games, as well. Each game does things a little differently.

Posted by: Renee Sep 25 2023, 12:19 AM

Skooma Dealer, Game: TES IV: Oblivion

I recently returned to Oblivion, decided to return to my very first PC character, https://i.imgur.com/PkGeE4Z.jpg, originally rolled in 2014. All he does is buy skooma at a discounted rate, and then tries to sell it. You'd think that such a game might become stale rather quickly, but being a skooma dealer is often a bit risky. It's not just buy/sell, there are other factors. Sometimes customers curse at Snaaty, sometimes they even try to pick fights, or call the guards (if they're of higher morals), etc.

I originally had https://www.nexusmods.com/oblivion/mods/31130, by PrettyMurky. Installed it way back in 2014, but recently the mod has stopped working. There's no dialog for skooma selling, even after a fresh uninstall/reinstall the mod stopped working. Began getting frustrated, and so on. mad.gif

Truth is, I've never been 100% satisfied with Skooma Deals. So now here's my version.



1). Start the Construction Set, bla bla bla. I'm assuming a quest needs to be written from scratch.

2a). Press the Q button on the main toolbar, and right-click > New into the Editor window. Give your quest an ID. I'm calling it aaaSkoomaDealer.

2b). Here's a quick summary of the Quest Data page.

Quest Name: Skooma Dealer
Priority: 30

Toggle Start Game Enabled and Allow Repeated Conversation Topics on.

Quest Conditions: GetIsPlayableRace == 1.00 AND

GetPlayerInSEWorld == 0.00


Note: GetPlayerinSEWorld is only needed if Shivering Isles is active (toggled on) along with this .esp I'm about to work on.

2c). Start a new script as so...

Scriptname aaaSkoomaDealerMainScript

short DoOnce
float Timer

Begin GameMode

End


2d). Change the Script Type scroll-bar from Object to Quest and save. Close the Script Edit panel, Click OK (closing the Quest panel), reopen the quest, and find the script in the scroll-bar. Click OK. Reopen.

2e). The rest of the script is as follows...

Scriptname aaaSkoomaDealerMainScript

short DoOnce
float Timer

Begin GameMode


If (DoOnce == 1) && (Timer < 30)
Set Timer to Timer + GetSecondsPassed

EndIf

If (DoOnce == 1) && (Timer >= 30)
Set DoOnce to 0
Set Timer to 0


Message "I should try another sale..."

EndIf
End



Explanation: What this script will do: every time a sale gets made we can't just spam another sale to the same NPC (this was one of the gripes I had with Skooma Deals). I've got it set so that it'll take 30 seconds for another sale to be attempted, which is the best idea I can come up with for now. Someone more talented might figure a way so that when a sale is made to a particular NPC they won't want another one for X amount of time. Couldn't figure any better than what I've got, though.

So, I'm gaming, my character makes a sale, and since he can't go through the same dialog until 30 seconds have passed, the urge is there to move on to some other NPC.

Some NPCs, as we'll see, are hooked on this junk! They're always eager for more. Others (as they say their dialog) are more cautious. Others are downright angry at my 'toon for trying to sell skooma, and as stated, the worst ones will either call the guards, or try to pick a fight with my dealer.

2f). Click OK (closing the Quest panel) and save.


Now to make a couple quick changes. The Skooma Deals quest I originally had starts by speaking with Roxanne Brigette, an older lady who lives in Bravil's Skooma Den. I don't remember why, and maybe we have a choice to speak to someone else to start things in the Skooma Deals mod. But I do remember that she's one of the NPCs we can buy skooma from.

So in my mod, I've got it so Roxanne is still important because she sells skooma at a lowered price. To make these lowered prices happen, continue to step 3a. For those who are happy with buying at vanilla prices, continue to 4a. To me, the vanilla prices are too high, which means it's harder to make a profit. rolleyes.gif


Object Window > Magic > Potion
3a). . Find PotionSkooma and change its Potion Value (lower right corner). I lowered this to 10. Click OK.

Reason being: real-life dealers often buy drugs at a discounted rate so they can make a profit, and return a portion of this profit to their lord (or lady). With the usual upscale in value caused by NPCs' Dispositions and their Mercantile skill, the price will automatically increase. My dealer buys from Roxy at 23 gp, and mostly sells between 40 to 70 gold.

But it makes no sense to me, the extremely high prices for skooma we see in the game, for such a short-lasting effect. By default, skooma's main effects only last 20 seconds.

3b). Actors > NPC > Breton. Find RoxanneBrigette, or whoever is going to be the main dealer.

3c). Toggle Auto Calc Stats OFF.

3d). Find Mercantile in her Skills window. Click on the Value, press F2, and lower this. I lowered Value from whatever it was all the way down to 5. Not that she's a horrible merchant; I wanted Roxanne to have the cheapest skooma in all the land.

There are several others in my game who sell skooma: Shady Sam, a dealer I added into The Foaming Flask, perhaps a few others I don't know about. There's also a wood elf who stands in shadow behind Bravil's Silverhome On The Water. None of these folks can beat Roxanne's price though, causing the player (me) to have a reason to return to Bravil.

3e). Assuming the seller has AI (and Roxanne does) open whichever packages are pertinent, and toggle Offers Services on. Make sure Potions is selected in their AI panel, whether this AI is a Wander package, an Eat package, etc.

I'm noticing that one of Roxy's AI packages is BravilSkoomaAddictSeek8x12, which is a Bethesda-created package. What this does: if she runs out of skooma she'll leave the den, then go walking around Bravil looking to find more! Since I'm going to add a bunch of skooma to a chest she's in charge of, this means she'll possibly use some of the skooma in this chest. Good gosh.

4a). Reopen the quest and select Quest Stages. Three stages are needed.
Stage 0: Right-click > New into the top Log Entry window and do nothing else.

Stage 5: Right-click > New. In the Result Script box type Player.AddItem PotionSkooma 1. Roxanne gives us a 'sample' during this stage, ya see. cool.gif

Stage 10: Again, right-click > New into the top window. In the lower Log Entry box I've got "I have now been designated as an official member of a very unofficial group. Uh... maybe I should just leave it at that."

4b). Click OK, closing the Quest panel, and save.


5a). Reopen the quest and select its Topics tab. I've currently got a total of six GREETINGs.


GREETING 1: First GREETING is when we initially speak to Roxanne.

Info: So you're the new guy, eh? Want to sell ya some skooma?
.............. Well, you've come to the right place. Thing is, if ya wanna do this on yer own ya can, but I gots the best prices!
'ere, 'ave yourself a sample.

GetIsID NPC: RoxanneBrigette == 1.00 AND
GetStage aaaSkoomaDealer < 10.00


Result Script: SetStage aaaSkoomaDealer 5

Add Topics window: add an initial skooma topic during which buying arrangements are discussed. I've got aaaBuySkooma here. Right-click > Add Topic into the Editor ID (vertical) window and add the initial skooma topic into this window as well. Dialog for this topic will be added later; for now I want to focus on the GREETINGs.

A second topic, a "NO" topic, can be added as well, which can effectively end the entire quest, if desired. "Seems I've wandered into the wrong hovel, no I ain't interested." Add a fourth stage to the Quest Stages page, toggle Complete Quest on, and type StopQuest aaaSkoomaDealer into the Result Script box. This is for those who don't want to become a skooma dealer at all! ... Which might be a silly option to have. Assuming someone follows the instructions to create their own version of this idea, or downloads the skooma dealer mod you've made, why would they install this mod in the first place?

OTOH, options are always nice. The "No" topic can also be used for somebody who simply wants to back out of conversation early, so write the quest this way if desired.


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

GREETING 2: During this GREETING the player returns to Roxanne.

Info: Back for more, eh?

GetIsID NPC: RoxanneBrigette == 1.00 AND
GetStage aaaSkoomaDealer == 10.00


Choices: aaaBuySkooma and a "No" topic can go here. Basically there's choice of inquiring about skooma or backing out of conversation altogether.

Right-click > Add Topic into the Editor ID window and add the No topic.


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

GREETING 3: This GREETING is said by skooma users and outlaws. I decided to split the world into criminals and citizens, basically. Real-life criminals always adhere to "the code", which means they NEVER rat out a dealer. B1tch, don't snitch.


Info: You... ya ... ya got what I need?

Conditions:

GetQuestVariable Quest: 'aaaSkoomaDealer', DoOnce == 0.00 AND
GetInFaction Faction: 'BravilSkoomaDen' == 1.00 OR
GetInFaction Faction: 'BanditFaction' == 1.00 AND
GetIsID NPC: RoxanneBrigette != 1.00 AND
GetStage Quest: 'aaaSkoomaDealer' == 10.00


Copy All those Conditions, so they can be pasted later.


Notice the OR designator between the BravilSkoomaDen faction and BanditFaction. Without OR (if it says AND instead) the game will only allow this GREETING if somebody is in both factions, which is impossible.

Add Topics: Right-click > Add aaaSkoomaDealsTopic1 into this window. Add it into the Editor ID window as well. Dialog for this topic will be written in a few.

Flags: Toggle Random on. This is optional. What this does is makes it so sometimes NPCs will greet us with the sketchy "Ya got what I need?" greeting. Other times they'll say typical generic stuff like "How does the day greet you, friend?" ... Without this toggled on these folks will always use the sketchy greeting, which gets old.


Note: As we can see, I've got it so those addicts in the Skooma Den faction and bandits use this GREETING. My skooma dealer is aligned with bandits, which means he can freely roam their territory; they know who he is. He is also aligned with Conjurers. But, (being smarter and not so overt with their addictions), Conjurers are going to have their own GREETING. Those who follow this guide can come up with their own faction-alliances, of course.

Marauders, I figure, are more interested in mead and wine and beer. They generally abhor skooma and we never see the drug in their lairs, if I recall correct.

Necromancers also are not generally interested in skooma, although there may be some exceptions; they seem a lot more 'religious' than Conjurers, and therefore don't use drugs which cloud their minds. They also will try to kill my dealer on sight! ph34r.gif He's not aligned with them.

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

GREETING 4: This GREETING is said by middle-class and upper-class citizens of the Empire; those who dwell within law-abiding areas, and it's assumed they sometimes have money. Basically, the NPCs who use this GREETING seem to know who my character is. They might be interested in his product, maybe. The world of the skooma dealer is a tricky one though, as we'll see.


Info: You're a shady-looking sort.

Conditions: Paste the conditions copied for the previous greeting, but make sure to change the OR signifiers to ANDs.

GetQuestVariable Quest: 'aaaSkoomaDealer', DoOnce == 0.00 AND
GetInFaction Faction: 'BravilSkoomaDen' != 1.00 AND
GetInFaction Faction: 'BanditFaction' != 1.00 AND
GetInFaction Faction: 'ConjurerFaction' != 1.00 AND
GetStage Quest: 'aaaSkoomaDealer' == 10.00 AND
GetClothingValue NONE > 20.00



Add Topics: Right-click > Add aaaSkoomaDealsTopic2 into this window. Add it again into the Editor ID window.

Flags: Toggle Random on.


Note: GetClothingValue is a way to distinguish those who theoretically have money from those who don't. I experimented with a value of 10 at first, but beggars (and other lower-class citizens) continued to use this GREETING. 20 weeds these people out. smile.gif

Note 2: It is possible to add another condition, one which tries to determine whether the NPC actually HAS gold in their pockets via GetItemCount. If they do, the quest continues. If they don't, there is no opening dialog. Problem is, most NPCs don't walk around with money. Or if they do, it isn't very much. Adding coin to them on the spot is possible with scripts, but that gets complicated. OBSE scripts might be required for that.

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

GREETING 5: This GREETING is said by citizens of the Empire; those who dwell within law-abiding areas, but are of a lower class (or pretend they're of a lower class). Not just beggars, but poorer NPCs such as https://en.uesp.net/wiki/Oblivion:Ursanne_Loche.

The NPCs who use this GREETING seem to know who my character is; they might be interested in his product.


Info: Hey. Whatcha got goin' on today?

Conditions: Paste the same conditions, but change the Clothing Value's comparison to reflect poorer clothing choices.

GetQuestVariable Quest: 'aaaSkoomaDealer', DoOnce == 0.00 AND
GetInFaction Faction: 'BravilSkoomaDen' != 1.00 AND
GetInFaction Faction: 'BanditFaction' != 1.00 AND
GetInFaction Faction: 'ConjurerFaction' != 1.00 AND
GetStage Quest: 'aaaSkoomaDealer' == 10.00 AND
GetClothingValue NONE <= 20.00


Add Topics: Right-click > Add aaaSkoomaDealsTopic2 into this window.

Flags: Toggle Random on.


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

GREETING 6: This GREETING is said by Conjurers in my gameworld. As magicians who pride themselves on how clever they are, they aren't going to appear as openly desperate for drugs with their dialog.


Info: Hmm. I smell something sweet...

Conditions: The conditions from GREETING 3 can be copy-all > pasted, just make sure to get rid of the conditions for BanditFaction and SkoomaDenFaction. The condition for Roxanne is also not needed, since we've eliminated the skooma faction.

GetQuestVariable Quest: 'aaaSkoomaDealer', DoOnce == 0.00 AND
GetInFaction Faction: 'ConjurerFaction' == 1.00 AND
GetStage Quest: 'aaaSkoomaDealer' == 10.00 AND


Add Topics: Right-click > Add aaaSkoomaDealsTopic1 into this window.

Flags: Toggle Random on, and if this is the final GREETING in the list, toggle Random End on as well.


5b). Click OK, closing the Quest panel, and save.


Now, to add a couple things into the gameworld.

OBJECT Window > WorldObjects > Container
6a). Right-click > edit a chest. ChestVendorSam is a great one to start with, since it's got a sample of skooma, lockpicks, poisons, all items valued highly by the underworld.

I named it aaaSkoomaChest and saved as a New Form.

6b). Make sure Respawns stays toggled on. Left-click onto the Count next to skooma and press F2. I changed the number from 1 to 50. I also got rid of all the other potions in Sam's chest because I felt that a lowlife like Roxanne wouldn't dare keep all those items (she'd sell 'em for more skooma). Instead, I dragged a bunch of Leveled Lists into the chest: VendorAlcoholCommon, VendorAlcoholWine, VendorIngredientsFlora, and so on. This way, all the stuff she's got for sale is random, except the skooma! 🍷

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

CELL window > Bravil Skooma Den
7a). Drag the chest under whatever cell it's going in, so that it's floating in the void. It should be relatively near to Roxanne (or whomever) though, under her feet.

7b). Give the chest a Reference ID. I've got aaaRoxannaChestRef. --- Copy this name and paste it on a Notepad or Wordpad page. Most of all: Make sure Persistent Reference is toggled on!

7c). Click the Ownership tab and change NPC slot from None to whomever. Click OK and save.

Make sure the chest and whoever the merchant is stay in the Render Window, so that both can be accessed.

7d). Now click on the drug lord, or drug lady, while he or she is in the Render Window. So I'm double left-clicking on Roxanne. Select the Merchant Container tab and press the Select Reference in Render Window bar. Now it should be easy to double-click on the chest, and the chest is now referenced when we buy/sell.


Main toolbar > Character > Packages...
8a). Right-click > New into the AI Packages window. Create an ID. I've got aaaDrinkSkoomaPackage. Copy this ID and paste it onto a Notepad page.

8b). Package Type should be Use Item At.

8c). Flags: "Continue if PC is near" and "Skip Fallout Behavior" can both be toggled on. "Must Complete" is optional. The problem with Must Complete is sometimes NPCs can get stuck on this behavior.

Schedule tab: Change Duration from 0 to 1.

Target tab: Select Any Object and find PotionSkooma in the Object ID scroll-bar. Note that this scroll can take a while to pull up.

8d). Count slot should be 1 or 3 or whatever. I assume this is the number of times the NPC uses the item, so if 3 is added, he or she will quaff their bottle three times. 🍾



QUEST Window > Topics tab
9a). In the Editor ID window, choose aaaBuySkooma.

Topic Text: Let me see what ya got.

Info: Right, then. You can buy your skooma elsewhere and pay a fortune, but Roxanne's got the best prices in all Cyrodiil...

Conditions:
GetIsID NPC: 'RoxanneBrigette' == 1.00 AND
GetStage Quest: 'aaaSkoomaDealer' == 5.00


Choices: aaaBuySkooma
...................... aaaNo

Result Script: SetStage aaaSkoomaDealer 10


9b). For those who did not finish the "No" topic, here we go.

Topic Text: No, I changed my mind.

Info: Argh, don'cha waste any more of my time!

Conditions:
GetIsID NPC: 'RoxanneBrigette' == 1.00 AND
GetStage Quest: 'aaaSkoomaDealer' <= 10.00


Toggle Goodbye on.

Click OK and save.

9c). Reopen and select the aaaBuySkooma topic again. This topic comes after we've gotten all the initial dialog done, and have established a rapport with the seller.

Topic Text: Let me see what you got.

Info: Great ta see ya again. 'ave yerself a look!

Conditions:
GetIsID NPC: 'RoxanneBrigette' == 1.00 AND
GetStage Quest: 'aaaSkoomaDealer' == 10.00


Result Script (SEE NOTES BELOW): aaaRoxanneChestRef.Activate player, 1

*This 'activate' script will automatically open the skooma chest so we can buy and sell. This is similar to the ShowBarterMenu function used by the GECK. Interestingly, the NPC will stay onscreen while we're shopping, and time does not freeze, which means people continue to walk around in the background. How cool. Why didn't Beth ever use this script for shopping?

Edit: I have gotten this to work with Roxanne, but have had probs with money not being taken/the player getting threatened after "stealing" from the chest, after trying to add the same script to a custom-made NPC I added. So, experiment with this, knowing things could go wrong.


Alright, now the fun really begins. There's going to be dialog, as much dialog as our fingers can type. That Skooma Deals mod I originally had almost always had the same dialog. Those who were inquiring about skooma would say "Hmm, how much?" and then they'd either say "That works for me" if they bought, or "Nah, I'm good" if they didn't buy. The second and third versions of Skooma Deals focused more heavily on how much we sold our product for, and included a heads-up display which added an actual number onscreen, which designated how much of a persuasion chance we had with whichever NPC the PC is looking at. It also completely destroyed how the Persuasion wheel and Barter system worked. Some gamers might think this sounds great, however I'm one of those people who actually like the vanilla systems. Skooma Deals Version 2 and 3 also seemed to conflict with Enhanced Economy. It also wasn't as 'fun' as the dialog and possibilities we can come up with.

It sounds like I'm bashing Skooma Deals, but there are a few features it has which I probably won't be able to replicate, one of these is Addiction. The more we sell to a particular NPC, the more addicted he or she becomes. This causes their behavior and AI to change. The player-character can designate NPCs to sell product, as well, earning even more coin. All of this requires OBSE, as well as some really complicated scripts.

10a). Go back to the 'criminal', sketchy GREETING, which for me is "You... ya.. ya got what I need?" Right-click its Conditions window and select Copy All Conditions.

Now select the aaaSkoomaDealsTopic1. This has already been linked by the "criminal" GREETING created earlier. The idea is there will be roughly a dozen responses which segue from this greeting, okay? Some responses will be favorable, and others not so favorable... In this first example, we've got an enthusiastic YES from a potential user.


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

Topic Text: Get your skooma, right here!

Info: Aye sure, gimme a phial.

Conditions: Paste the conditions from the sketchy GREETING into this window, and note that a couple new conditions are being added into the stack.

GetQuestVariable Quest: 'aaaSkoomaDealer', DoOnce == 0.00 AND
GetItemCount Potion: 'PotionSkooma' >= 1.00 AND
GetInFaction Faction: 'BravilSkoomaDen' == 1.00 OR
GetInFaction Faction: 'ConjurerFaction' == 1.00 OR
GetInFaction Faction: 'BanditFaction' == 1.00 AND
GetIsID NPC: RoxanneBrigette != 1.00 AND
GetStage Quest: 'aaaSkoomaDealer' == 10.00


- Select GetItemCount and toggle Run on Target on. This way, the Player-Character is being referenced. If the PC hasn't got any skooma at all, this topic (and most of the other topics) will not show up.

- As can be seen, a GetInFaction has been included for Conjurers, so they can say "Aye sure, gimme a phial" as well.

Result Script:

Set aaaSkoomaDealer.DoOnce to 1
Player.RemoveItem PotionSkooma 1
Player.AddItem Gold001 50
AddScriptPackage aaaDrinkSkoomaPackage


Flags: toggle Goodbye and Random on.


NOTE the DrinkSkooma package. This will cause the NPC who just bought the skooma to immediately start quaffing their bottle! 🍾 Only criminal types and addicts will do this in my game. Citizens of the Empire are more discreet; I figure they buy their dose and then go home before they suck it.

NOTE 2: The 'Set aaaSkoomaDealer.DoOnce to 1', again, causes the quest's timer script to run, which means after a sale is made it'll take 30 seconds to have a chance for another sale.


10c). Right-click > Copy All Conditions (all six of them).


10d). Next response is going to be a "no". Note that it shares the same "Get your skooma, right here" Topic Text as the response above.

Info: Nah, I think I'm good.

Conditions: Paste the conditions which were Copy All'd up above in Step 10c.

Result Script: Set aaaSkoomaDealer.DoOnce to 1

Flags: toggle Goodbye and Random on.


10e). This response is another positive sale, identical to the first response, except the Response text is "Ah. Sweet moon sugar..." .... Everything else, the conditions, the toggles, the scripts, all of that is the same. This second response is therefore only so the NPC says something different from "Aye sure, gimme a phial."


10f). The fourth response is going to be another "no", but the NPC goes out of his or her mind, angrily accusing my dealer.

Info: NO! GET AWAY WITH THAT GARBAGE, SNAKE!

.... Everything else, the conditions, the toggles, the Set aaaSkoomaDealer.DoOnce script, all of that is the same. So we've got a yes, a no, a yes and a no, all four responses randomly and possibly said by the same criminal elements of society. So now it's time to mix things up a bit.

Actually, add a Result Script like so: ModDisposition Player - 10 to that last "no" response, so the NPC now likes our character a little less. dry.gif

10g). Next response is going to be another "no", however the outlaw NPC doesn't just want to make a fair purchase. Again, this shares the same "Get your skooma right here" Topic Text.


Info: How about you give me one of them fer free?
....... Or... give me some coin, mate, gimme ALL yer coin! indifferent.gif

Flags: toggle Goodbye and Random on.

Conditions: Copy All these after they've been arranged.

GetQuestVariable Quest: 'aaaSkoomaDealer', DoOnce == 0.00 AND
GetIsSex Male == 1.00 AND
GetInFaction Faction: 'ConjurerFaction' == 1.00 OR
GetInFaction Faction: 'BanditFaction' == 1.00 AND
GetStage Quest: 'aaaSkoomaDealer' == 10.00



- Note that GetItemCount PotionSkooma is not needed for this to show up. There's a reason, as we'll see.

- The conditions up above also don't include the Skooma Den faction (I figure they're too docile and spaced out), nor is Roxanne needed to be canceled, since only males will attack my dealer. huh.gif Yeah, that's right, it's possible my skooma dealer can be attacked, as we'll see in a moment.

Choices: Right-click > Add Topic. I've got aaaGiveSkoomaTopic and aaaNo for choices.


10h). Add aaaGiveSkoomaTopic into the Editor ID window. The idea is: my dealer gives a free phial to the guy threatening him.

Topic Text: I'll give you a free sample, don't hurt me!

Info: Ah, that's the way I like it!

Result Script: Player.RemoveItem PotionSkooma 1
................... Set aaaSkoomaDealer.DoOnce to 1


Flags: toggle Random and Goodbye.

Conditions: Paste the conditions just copy-all'd.

GetQuestVariable Quest: 'aaaSkoomaDealer', DoOnce == 0.00 AND
GetItemCount Potion: 'PotionSkooma' >= 1.00 AND
GetInFaction Faction: 'ConjurerFaction' == 1.00 OR
GetInFaction Faction: 'BanditFaction' == 1.00 AND
GetStage Quest: 'aaaSkoomaDealer' == 10.00




Also, make a second response under this same 'free sample' topic.

Info: A-ha-ha-ha!! Fool'd ya! How about I STILL take all your stash, and your coin!

Result Script: Player.RemoveItem PotionSkooma 1
.......................... AddItem PotionSkooma 1
..........................SetAV Aggression 50
........................ StartCombat Player


Flags: toggle Goodbye, Random, and Random End.

Conditions: Paste the same conditions copy-all'd earlier.

The usual Result Script which delays chance of another sale is not needed, as we'll hopefully be too busy trying not to get our ass kicked!


Note: The AddItem PotionSkooma adds a bottle to whomever the PC is talking to. This way, we can get our skooma back after we've pwned our attacker!


10i). The steps above assumes the dealer has a bottle of skooma to give. What happens if he doesn't?

Right-click > New into the same Info window...so the "I'll give you a sample" topic is shared with this new response.

Info: Huh, what is this? You ain't got no skooma!
....Don't you dare filch on me! You gonna git what's comin' to ya now!

Result Script: SetAV Aggression 50
........................ StartCombat Player


Flags: toggle Goodbye.

Conditions: Paste the same ones, making a change to GetItemCount's comparison value.

GetQuestVariable Quest: 'aaaSkoomaDealer', DoOnce == 0.00 AND
GetItemCount Potion: 'PotionSkooma' < 1.00 AND
GetInFaction Faction: 'ConjurerFaction' == 1.00 OR
GetInFaction Faction: 'BanditFaction' == 1.00 AND
GetStage Quest: 'aaaSkoomaDealer' == 10.00



10j). Select aaaNo in the Editor ID window. The scenario here is similar to if we haven't got any skooma. Basically, we say "NO" to the guy taunting us, which causes him to attack.

Info: NO?!? We'll just see about that, skooma dealer!

Result Script: SetAV Aggression 50
........................ StartCombat Player


Flags: toggle Goodbye.

Conditions:

GetQuestVariable Quest: 'aaaSkoomaDealer', DoOnce == 0.00 AND
GetInFaction Faction: 'ConjurerFaction' == 1.00 OR
GetInFaction Faction: 'BanditFaction' == 1.00 AND
GetStage Quest: 'aaaSkoomaDealer' == 10.00



10k).Click OK, closing the Quest panel, and save.

I made 6 more responses: three of them "yeses" and three extra "nos". One of the yes responses is only said by females: after she makes her purchase she starts flirting with my dealer and even follows him around for a bit (AddScriptPackage aaaFollowPlayerPackage). wub.gif I added some choices to make her follow around or not. If we don't allow her to follow there's a ModDisposition Player -40 script.

Another Yes makes NPCs lose Fatigue and fall to the ground after they suck their purchase (ModAV Fatigue -50). One of the Nos makes an NPC lecture my character, even though the NPC is an outlaw. 🤠 I also made Yes responses specifically for the beasts: one for Khajiit and one for the lizards.

None of the no responses are as dramatic as the fight scenario above, because I want this scenario to happen more rarely than the others. HOWEVER, note that some Khajiit bandit NPCs will still randomly try to attack my dealer. Some of them pick up the "This is a hold-up, and it over, or DIE!" threat, even if they're not Khajiit Highwaymen. Which adds to the unpredictable nature of playing a skooma dealer, of course.


11a). Open the quest, go to its Topics tab, and select aaaSkoomaDealsTopic2. This is the topic used by citizens, and others who dwell within lawfully-abiding areas. Most of these are "no" responses, since most citizens are not users of skooma. So my dealer's only going to sell to these folks in a more cautious, sometimes experimental, manner. Because there are more consequences if trying to go this route. Disposition also becomes a factor at times, as some citizens are unsure if they'd like to cross that line into illegal behavior.

However, more money can be made per sale. 60 to 70 gold instead of 50 or less, gained from outlaws, especially amongst those whose Clothing Value is over 20. Note that the GREETING which leads to this set of responses tends to weed out a good number of customers who haven't got the money.

Right-click > New into the Info window.

Topic Text: You look weary. Have a look at this.

Info: Hmm, I like what I see!

Result Script: Set aaaSkoomaDealer.DoOnce to 1
Player.RemoveItem PotionSkooma 1
.................. Player.AddItem Gold 60


Flags: toggle Goodbye and Random on.

Conditions:

GetQuestVariable Quest: 'aaaSkoomaDealer', DoOnce == 0.00 AND
GetItemCount Potion: 'PotionSkooma' >= 1.00 AND
GetDisposition Reference: [TARGET] > 40.00 AND
GetInFaction Faction: 'BravilSkoomaDen' != 1.00 AND
GetInFaction Faction: 'ConjurerFaction' != 1.00 AND
GetInFaction Faction: 'BanditFaction' != 1.00 AND
GetStage Quest: 'aaaSkoomaDealer' == 10.00 AND
GetClothingValue NONE > 20


- Make sure to toggle Run on Target on for the GetItemCount.
- Note Disposition is involved. This response only shows up if the citizen is comfortable around my dealer.


11b). Copy All Conditions so they can be pasted for the next response.


11c). The next response is a "no". Right-click > New into the Info window.

Info: NO! Get AWAY from me, FILCHER!!!

Result Script: ModDisposition Player -40
.................. Set aaaSkoomaDealer.DoOnce to 1


Flags: toggle Goodbye and Random on.

Conditions:

GetQuestVariable Quest: 'aaaSkoomaDealer', DoOnce == 0.00 AND
GetItemCount Potion: 'PotionSkooma' >= 1.00 AND
GetInFaction Faction: 'BravilSkoomaDen' != 1.00 AND
GetInFaction Faction: 'ConjurerFaction' != 1.00 AND
GetInFaction Faction: 'BanditFaction' != 1.00 AND
GetStage Quest: 'aaaSkoomaDealer' == 10.00 AND
GetClothingValue NONE > 20


Note: Disposition is no longer a factor; it doesn't matter if they like our character, all that matters is they HATE skooma.

GetClothingValue is still present. Only higher-brow sorts are going to make a scene.


11d). Here we have another "Yes", however there's a catch, as now we're talking to someone who hasn't got as much money.

Info: Ah, that looks good. Afraid I can't afford your price, though.

Result Script:

Flags: toggle Random on.

Conditions: Copy All the conditions below after they've been set up.

GetQuestVariable Quest: 'aaaSkoomaDealer', DoOnce == 0.00 AND
GetItemCount Potion: 'PotionSkooma' >= 1.00 AND
GetInFaction Faction: 'BravilSkoomaDen' != 1.00 AND
GetInFaction Faction: 'ConjurerFaction' != 1.00 AND
GetInFaction Faction: 'BanditFaction' != 1.00 AND
GetStage Quest: 'aaaSkoomaDealer' == 10.00 AND
GetClothingValue NONE <= 20


Choices: Right-click > Add Topic. Two choices can be added here: aaaReducedSaleTopic and aaaSaleRefusalTopic


11e). Right-click > New into the Editor ID window, and add those two topics.

11f). Let's start with the Reduced Sale topic. Two Infos are needed here. In the first one, the NPC agrees to a lowered price. In the second, he or she declines the sale.

Topic Text: How about half price? 30 gold?

Info: Ah, that'll be just the thing.

Result Script: Set aaaSkoomaDealer.DoOnce to 1
Player.RemoveItem PotionSkooma 1
.................. Player.AddItem Gold 30


Flags: toggle Goodbye and Random on.

Conditions: paste the conditions from 11d, although the GetItemCount is no longer needed.

GetQuestVariable Quest: 'aaaSkoomaDealer', DoOnce == 0.00 AND
GetInFaction Faction: 'BravilSkoomaDen' != 1.00 AND
GetInFaction Faction: 'ConjurerFaction' != 1.00 AND
GetInFaction Faction: 'BanditFaction' != 1.00 AND
GetStage Quest: 'aaaSkoomaDealer' == 10.00 AND
GetClothingValue NONE <= 20


Obviously, too many reduced sales are not a good thing. In my gameworld Roxanne charges 23 gp for each bottle of skooma, meaning my dealer only makes 7 gp for this sale.

I also made a second "poor person" topic, this time they agree to spend 40.


11g). If the NPC declines purchase...

Topic Text: (this is shared with the dialog in 11f above).

Info: Nah, think I'll pass. Gotta come up with some coin for me children!

Result Script: Set aaaSkoomaDealer.DoOnce to 1

Flags: toggle Goodbye, Random on, and Random End on.

Conditions: The same conditions are used from the response above.


11h). Select the 'sale refusal' topic, aaaSaleRefusal. This is the choice the PC makes if they decide not to sell to this poorer soul.

Topic Text: Can't do that, sorry. Maybe next time.

Info: I'll be off, then.

Result Script:

Flags: toggle Goodbye.

Conditions: Same as above in 11d, 11e, and 11f

GetQuestVariable Quest: 'aaaSkoomaDealer', DoOnce == 0.00 AND
GetInFaction Faction: 'BravilSkoomaDen' != 1.00 AND
GetInFaction Faction: 'ConjurerFaction' != 1.00 AND
GetInFaction Faction: 'BanditFaction' != 1.00 AND
GetStage Quest: 'aaaSkoomaDealer' == 10.00 AND
GetClothingValue NONE <= 20


Click OK and save. Reopen the quest's Topics tab, and


11i). Select aaaSkoomaDealsTopic2. Right-click > New into the Info window. Okay, this next response is THE one any skooma dealer dreads.

Info: NO, and I'm calling the guards at you, you menace.
GUARDS!!!! COME QUICK COME QUICK, WE'VE GOT A SKOOMA MERCHANT ON THE PREMISES!!!

Result Script: Set aaaSkoomaDealer.DoOnce to 1
................... Player.ModCrimeGold 40
................... ModDisposition Player -40


Flags: toggle Goodbye and Random on.

Conditions: paste the same conditions copy-all'd from Step 11b, but remove the GetDisposition.

GetQuestVariable Quest: 'aaaSkoomaDealer', DoOnce == 0.00 AND
GetItemCount Potion: 'PotionSkooma' >= 1.00 AND
GetInFaction Faction: 'BravilSkoomaDen' != 1.00 AND
GetInFaction Faction: 'ConjurerFaction' != 1.00 AND
GetInFaction Faction: 'BanditFaction' != 1.00 AND
GetStage Quest: 'aaaSkoomaDealer' == 10.00 AND
GetClothingValue NONE > 20


- Only the higher-brow types are going to call the guards. In my real-life experience, those with less money would rather not cause such a fuss because they sometimes fear retaliation from gangs.

Note: ModCrimeGold is only adjusted upward by 40, which might not seem enough. Guards are not going to try to arrest the PC if their CrimeGold is only 40, not unless we speak to them directly. So make this higher, if desired. Thing is, my dealer has already racked up quite a few of these charges. As I type this, he's already edging near to 500, which is the mark when guards WILL come after us, "STOP RIGHT THERE CRIMINAL SCUM!"



11j). Disposition makes a factor for this next one. Again, all of these responses stem from the "You look weary..." Topic Text.

Info: Not interested. And I don't like your kind!

Result Script: Set aaaSkoomaDealer.DoOnce to 1

Flags: toggle Goodbye and Random on.

Conditions:

GetQuestVariable Quest: 'aaaSkoomaDealer', DoOnce == 0.00 AND
GetItemCount Potion: 'PotionSkooma' >= 1.00 AND
GetDisposition Reference: [TARGET] <= 40.00 AND
GetInFaction Faction: 'BravilSkoomaDen' != 1.00 AND
GetInFaction Faction: 'ConjurerFaction' != 1.00 AND
GetInFaction Faction: 'BanditFaction' != 1.00 AND
GetStage Quest: 'aaaSkoomaDealer' == 10.00


- Make sure to toggle Run on Target is on for the GetItemCount.


11k). I've also got a couple of "No" responses which haven't got anything to do with Disposition or Clothing Value. They're just negative responses from folks who generally aren't interested, without any morality factoring in.


11l). This next response is from potential buyers who are "on the fence". Note that the Persuasion mini-game is going to be needed for these folks.

Info: Hmm, I am interested. Tell me a little more. (Disposition is below 40).

Result Script:

Flags: toggle Random on.

Conditions:

GetQuestVariable Quest: 'aaaSkoomaDealer', DoOnce == 0.00 AND
GetItemCount Potion: 'PotionSkooma' >= 1.00 AND
GetDisposition Reference: [TARGET] < 40.00 AND
GetInFaction Faction: 'BravilSkoomaDen' != 1.00 AND
GetInFaction Faction: 'ConjurerFaction' != 1.00 AND
GetInFaction Faction: 'BanditFaction' != 1.00 AND
GetStage Quest: 'aaaSkoomaDealer' == 10.00


GetClothingValue is not on in my game, but this can be added if desired.


11m). Right-click > Add Topic into the Add Topics window (NOT the Choices window). Make a new topic. I am calling this one aaaExplainSkoomaTopic. Add the aaaNo topic into this window as well.

Choices forces us to make a choice during this section, whereas Topics do not. Therefore, it's possible to play the Persuasion mini-game at this point in an attempt to boost the potential customer's confidence. Another option is, of course, to choose "No" or back out of conversation altogether.

11n). Right-click > New into the Editor ID window and add the "explain" topic. During this step the dealer tries to convince the potential customer to buy a bottle, and for this first portion, is successful. This step assumes the player has played the Persuasion game, and Disposition is 40 or above.

Topic Text: Let me talk about my, uh, 'product'.

Info: Aye, I'll take one, then. Just... be quick about this.

Result Script: Set aaaSkoomaDealer.DoOnce to 1
...................Player.RemoveItem PotionSkooma 1
.................. Player.AddItem Gold 60


Flags: toggle Goodbye and Random on.

Conditions:

GetQuestVariable Quest: 'aaaSkoomaDealer', DoOnce == 0.00 AND
GetItemCount Potion: 'PotionSkooma' >= 1.00 AND
GetDisposition Reference: [TARGET] > 39.00 AND
GetInFaction Faction: 'BravilSkoomaDen' != 1.00 AND
GetInFaction Faction: 'ConjurerFaction' != 1.00 AND
GetInFaction Faction: 'BanditFaction' != 1.00 AND
GetStage Quest: 'aaaSkoomaDealer' == 10.00


11o). Right-click > New into the same Info window shared by "Let me tell you about my product." This dialog is used if the NPC's disposition has not been boosted highly enough.

Topic Text: Let me talk about my, uh, 'product'.

Info: Hmm, I'm not convinced. I'll be off, then.

Result Script: Set aaaSkoomaDealer.DoOnce to 1

Flags: toggle Goodbye on.

Conditions:

GetQuestVariable Quest: 'aaaSkoomaDealer', DoOnce == 0.00 AND
GetItemCount Potion: 'PotionSkooma' >= 1.00 AND
GetDisposition Reference: [TARGET] < 40.00 AND
GetInFaction Faction: 'BravilSkoomaDen' != 1.00 AND
GetInFaction Faction: 'ConjurerFaction' != 1.00 AND
GetInFaction Faction: 'BanditFaction' != 1.00 AND
GetStage Quest: 'aaaSkoomaDealer' == 10.00



11p). Finally, we need dialog for when the NPC's Disposition has been boosted high enough, yet they've decided they're not interested.

Info: No, I don't think I want any. Sorry to have wasted your time.

Result Script: Set aaaSkoomaDealer.DoOnce to 1

Flags: toggle Goodbye, Random, and Random End on.

Conditions:

GetQuestVariable Quest: 'aaaSkoomaDealer', DoOnce == 0.00 AND
GetItemCount Potion: 'PotionSkooma' >= 1.00 AND
GetDisposition Reference: [TARGET] > 39.00 AND
GetInFaction Faction: 'BravilSkoomaDen' != 1.00 AND
GetInFaction Faction: 'ConjurerFaction' != 1.00 AND
GetInFaction Faction: 'BanditFaction' != 1.00 AND
GetStage Quest: 'aaaSkoomaDealer' == 10.00



11q). Click OK and save. For now, here is the final response, and this one's going to potentially be used by shopkeepers, innkeepers, or any NPC who owns the cell my dealer is in. This response goes under the "You look weary..." topic. Again we've got an angry response, aimed at making a large fuss, and causing a scene.

Info: Listen, I don't like the likes of you, coming into our establishments, our homes, our places of business.
I can't change the law, but I can banish you from here! ...DO NOT return with your foul peddlings, dealer!

Result Script: Player.ModCrimeGold 40
................... SendTrespassAlarm PlayerRef


Flags: toggle Goodbye, Random, and Random End on, assuming this is the last random response of the list.

Conditions:

GetQuestVariable Quest: 'aaaSkoomaDealer', DoOnce == 0.00 AND
IsInMyOwnedCell NONE == 1.00 AND
GetItemCount Potion: 'PotionSkooma' >= 1.00
GetStage Quest: 'aaaSkoomaDealer' == 10.00


Now we've got a problem! During Step 11i the NPC called for the guards, but this was mostly a bunch of hot air. Unless the dealer's CrimeGold was about to tip over 500, such a threat is harmless. In THIS scenario however, the site's owner is able to actually charge the dealer with a viable crime. For those who've never trespassed in this game, be aware that we've only got a few seconds to vacate the premises, otherwise a guard will show up. "STOP RIGHT THERE..." bla bla bla. 👮🏿‍♀️

Because of responses like this, my dealer is really aware of whom he tries to peddle his wares to. Consequences! It only takes one time hearing a warning like this, and the temptation to try selling to another cell-owner falls to just about nil.

Hmm, one more. This one will require another AI package, but this time the NPC's not gonna be sucking skooma.

Main toolbar > Character > Packages
11r). Right-click > New into the Ai Packages window.

ID: aaaNineDivineMagicPackage (copy this and paste it somewhere).

Package Type: Cast Magic

Flags: Continue if PC is Near, Must Complete, Skip Fallout Behavior

Schedule tab
Duration: 1

Location tab: Toggle Location on, select Near Reference
Ref: 'Player' 'PlayerRef'

Target tab: Click Target. Toggle 'Any Object' on.
Object ID: StandardRestoreHealthTarget2Apprentice

Count: 3

-- StandardRestoreHealthTarget2Apprentice is basically Convalescence. In effect, the chapel dweller is now trying to HEAL our toon. ✝

The Object ID scroll-bar is notoriously aggravating to narrow our toward intended object, as there are a zillion objects in this bar. Be patient!


11s). So one final Response Text, last one, I promise. This one's gonna be said by Holier-than-Thou types, literally. Again, it falls under the "You look weary..." i.e., aaaSkoomaDealsTopic2.

Info: Sir, no, and I advise you to change thy wicked ways. For it is folks like ye who threaten to befoul the grand splendor that is Cyrodiil.


Result Script: Set aaaSkoomaDealer.DoOnce to 1
................... AddScriptPackage aaaNineDivineMagicPackage


Flags: toggle Goodbye on.

Conditions:

GetQuestVariable Quest: 'aaaSkoomaDealer', DoOnce == 0.00 AND
GetItemCount Potion: 'PotionSkooma' >= 1.00 AND
GetInFaction Faction: 'NineDivines' == 1.00
GetStage Quest: 'aaaSkoomaDealer' == 10.00



11t). And that about wraps it up for today's lesson on how to create a skooma dealer. There are other things we can try to implement while rolling with this idea, but that's plenty for now. Ciao!

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

Let me give a shoutout to some other skooma mods

1). https://www.nexusmods.com/oblivion/mods/8596: Puts a 'stolen' tag on most examples of skooma in the game. If a guard sees us picking up a bottle, it's a crime. Skooma also gets confiscated when arrests occur.

2). https://www.nexusmods.com/oblivion/mods/22612: Adds a smoking pipe which automatically goes into the PC's inventory, very professionally done. My dealer can be seen smoking the pipe https://i.imgur.com/PkGeE4Z.png?1.

There are a number of other skooma mods at THE Nexus: some of them add addiction, others add skooma dens and the ability to craft our own drugs. I haven't tried any of them, but some do look worth looking into.


3). https://www.nexusmods.com/oblivion/mods/20575 -- Adds random travellers to the roads of Cyrodiil. Is customizable through an .ini file, so we can make some roads less full of people than others. There are dozens of mods like this one. I like Crowded Roads because it adds plenty of random NPCs to sell to.

Posted by: Renee Dec 25 2023, 12:24 AM

Fixing the ;CODE NOT LOADED error. Game: TES V: Skyrim, Legendary Edition

When trying to view scripts in the CK sometimes we'll see ;CODE NOT LOADED in the boxes and windows where scripts and fragments should be. This can happen with mods, but it also occurs with Bethesda's official DLC: Hearthfires, Dawnguard, and Dragonborn. Because of this, we cannot just view or alter the scripts associated with these add-ons.

The reason: the CK is trying to peer into the Data > Scripts folder, and also the Data > Scripts > Source folder, looking for script files associated with whatever particular mod or DLC being worked on, but guess what? The script files aren't there. 💡 Codes aren't getting loaded where they should be. These 'script files' include .pex files in the Data > Scripts folder, and/or .psc files in Data > Scripts > Source.

There are are a couple ways to attempt fixing ;CODE NOT LOADED. First question: does the mod or DLC have a .bsa file?

-If not, there is no BSA and the .pex and .psc files definitely are not packed into a BSA (instead they are loose), https://www.youtube.com/watch?v=bA8cmautUuM. Her 'fix' is the more-popular one I found as I spent hours searching; there are other sites which teach the same lessons as her vid. It involves backing up (copy>pasting) the entire Scripts folder (including the Source folder inside of the Scripts folder) into a safe place, and then deleting these folders from the Data folder. blink.gif Yeah. Scary. Once that is done however, next step is to right-click Scripts.rar (which is an archive in the Data folder, hopefully it's there) and then Extract Here all the content from this .rar file, so that all its content gets extracted into Data. Once this is done, the scripts folder which was backed-up can be copy-pasted back in.

However, this didn't work for me. rolleyes.gif So I had to continue searching for a fix. Good thing is, I'm putting the results of my searching into this post. Hopefully saving somebody out there from going mad. panic.gif

-If yes, there is a BSA associated with the mod (this includes all three of Skyrim's official DLCs!), chances are all the scripts are locked inside of it.


The reason BSAs are used is to keep things tidy. There's usually a lot of files packed into BSAs. If all of these files were loose, the Data folder, and many of its sub-folders would be hella cluttered.

However, we're going to need to make at least some of these files loose. And for this, a BSA unpacking program is required. So continue to step 1a if the BSAs need to be unpacked, for anyone who doesn't know how to do this, yet. If the files are already loose, go to step 2a.

If you don't already have a BSA program, https://www.nexusmods.com/skyrim/mods/4804 can be tried. It is not the one I am describing how to use below; I have no idea where I found the BSA program I've been using. However, these sort of programs can generally be placed anywhere, they don't typically need to be in any of the Skyrim folders, unless you want it there.

I am going to describe working with a mod, but this lesson applies to DLC too. I am also going to describe working with the BSA unpacker I've got, which may be different from other programs out there.


1a). Double left-click on the BSA unpacker, opening the program.

1b). Click Open, and follow the folder path to where the .bsa file is. So for this example I am going into Skyrim > Data and highlighting Helgen Reborn.bsa and clicking Open.

1c). Click Extract all. This opens the Browse For Folder panel.

1d).. It is possible to place this content straight into the Data folder, but a better idea might be to put it into a folder which is completely separate from the Skyrim megatroplis of folders, just to test and make sure everything {all the folder paths contained in the BSA} structure where they should. On my computer I've got C:\Users\Renee\Desktop\Unzipping Folder.

1e). Click OK. As stated, I just dumped everything outside of Skyrim > Data, just to see what happens. Having a look, I can see the BSA program unpacked all sorts of stuff, including additional folders such as Meshes and Textures. But I'm not interested in those, I'm only trying to mess with Scripts. So I kept the Scripts folder, and deleted all the others.

Anyway, if everything looks good, now you can either return to 1c and put everything directly into Data, OR you can merely copy/paste only the content which is needed from the 'safe' folder, into Data. 😎 Either way, don't delete the script files which were just copied into the Data folder. Not just yet. Keep them where they are (which should be the Scripts folder they've been extracted to).


NOW... try opening the Creation kit to the mod or DLC being worked on, and get into one of its quests. Is it still saying ;CODE NOT LOADED? If not, if there are now actual scripts and script fragments, great!

But... mad.gif If ;CODE NOT LOADED is still the norm, chances are there are still some files missing. kvright.gif Which is what happened to me. There were plenty of .pex files (which are the scripts the actual game looks at) but without any corresponding .psc files (which are what are what we view and manipulate in the Creation Kit).

Continue to Step 2a. This does get sort of complicated, just so ya know.


2a). Two or three additional programs are needed, all of which can be found at THE Nexus.
> First needed program is https://www.nexusmods.com/skyrim/mods/82147. Follow the instructions included on its DESCRIPTION page. If done correctly, there should be a new folder in the Data folder called "Processors". There should also be two folders inside of Processors: Creation Kit and Champollion, and maybe a half-dozen or so files inside these folders.

>> Second needed program is https://www.nexusmods.com/skyrim/mods/35307/. Again, follow its instructions. There are 32 bit and 64 bit versions available. I've got the 32 bit version, which I assume works best with Legendary Edition (LE) Skyrim.

For anyone who is familiar and confident with using the command prompt window, these folks probably won't need the rest of this tutorial. But I am not so familiar, or confident! So...

>>> https://www.nexusmods.com/skyrim/mods/82367 is an executable which opens an easy-to-use set of panels and windows, just like any typical PC computer program. 🖥 Champollion GUI should go into the same folder as the other Champollion files (Data > Processors > Champollion).


That final program is incredibly user-friendly (Endorsed) and https://www.youtube.com/watch?v=S9VCvZLMpfo&embeds_referring_euri=https%3A%2F%2Fwww.nexusmods.com%2F&source_ve_path=Mjg2NjY&feature=emb_logo just in case of further confusion. However, I am going a step further, and including my OWN instructions below. Because there were still a couple things I was confused about. For instance, the video-maker did not use his actual Skyrim directory. *sigh* Which left a few questions, for me at least.


3a). Go into the Skyrim > Data > Processors > Champollion folder and open the ChampollionGUI. Champollion Interface panel should leap forth.

Tip: Clicking the Help button opens up the program's readme, for anyone who wants to get the mod-author's official instructions.

3b). Again, it's a good idea to firstly experiment with a folder which is outside the Skyrim folder path. Plus it's just tidier to work this way while testing. Again I'm using C:\Users\Renee\Desktop\Unzipping Folder. The Scripts folder from step 1e is still there, with all those .pex files inside of it.

However, now I'm realizing that there is no Source folder inside of the Scripts folder! huh.gif Which means there are no .psc files. And this is because (get this) sometimes mod authors do not include .psc files. And why not? From what I've gathered, they don't include .pscs because they don't want their work to be as accessible. Or maybe they're paranoid. Who know?

3c). Since I am trying to mess with scripts, I went into my Unzipping Folder > Scripts and right-click > New'd a Source folder.

3d). Return to Champollion GUI. Click on the Scripts Folder (.pex): button, which is on the far right of the panel. Go to whatever temporary folder path you're using. For me, this is (again) C:\Users\Renee\Desktop\Unzipping Folder\Scripts.

3e). Click the "Output Source in Different Location" toggle on. This allows the Source Destination to get used.

3f). Use the Source Destination button to put the reassembled .pex files into a different location. I've got C:\Users\Renee\Desktop\Unzipping Room\Scripts\Source. Click OK.

3g). Toggle "Generate Assembly" on. Toggle "Output Assembly in Different Location" as well. Both of these need to be toggled. Select the same path as found in step 3f, which (again) for me is C:\Users\Renee\Desktop\Unzipping Room\Scripts\Source.

3h). Toggle Generate Comments on. This adds comments from the Champollion program directly into various locations of the scripts, which is rather nifty. OTOH, some scripters might not want extra comments, they tend to clutter up the scripts.

3i). Press the Run... button. Select Yes. Watch your monitor screen go nuts... 📺

If there a lot of files to process it'll take a few seconds, perhaps more than a minute. The program is automatically opening Command Prompt windows over and over. .pex files get converted into .pscs, but I've also noticed the program introduces a third type of script files: .pas files.

3j). If there are no errors, the pop-up window only gives one option: Click OK.

Check that the .pex files (in the Scripts folder) have been converted to .psc files (in the Scripts > Source folder). If so, copy-paste all of this into the Data folder. Yes To All, if you're overwriting scripts which were placed in an earlier step.


4). Start the Creation Kit. Open the mod or DLC. Open one of its quests. Hopefully ;CODE NOT LOADED is no longer showing up. 🍷

Posted by: Renee Dec 27 2023, 02:25 AM

Zoinks! You've taken a wrong turn!

Ugh. I'm guessing that many of us who've used Imgur have seen this annoying message. All we want to do is access our precious screenshots, yet *Zoinks!*, things now slow to a stop.

Wait, didn't I fix this somehow about a month ago? Sure did, and I typed up the solution too. Gosh darn, that's beautiful, sometimes things work out okay. Think it'll be a good idea to type the fix HERE, so I won't forget. happy.gif This tutorial assumes you're already logged into the site. If not, see if you can log in.


1). Type https://imgur.com/user/X with "X" being your username, into the URL slot. So I'm typing https://imgur.com/user/xenaclone. The Zoinks! message only seems to show up if I'm trying to look at my screenies.

2). Press the "button" on the top-right of the page. This button is actually your profile pic, or if you haven't chosen a profile pic, a single initial will be there. Since my username is Xenaclone there will be a large X in the top right. Left-click this. If your computer has Windows 10 or newer, continue to step 3. If it's OS is older (Windows 8 or older) go to Step 5.

3). At the top left of the page is the imgur icon with a down arrow next to it. Click the down arrow > need help?

4). Press the Known Issues button. There should be a "How do I switch to the old design?" choice. Sometimes the solution it says is not even necessary, we can simply press the imgur toolbar icon and it'll immediately change to the original design.

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

5). Older operating systems (Windows 8 or older): there should be a link on the LOWER RIGHT side of the page which says Use Old Design. Left-click on this and fill out their silly little survey. I just selected "The New Design is too buggy." rolleyes.gif

After all of this the site logged me off. But after logging back in I was able to access my pictures. 🖼 You're welcome.

Posted by: Renee Dec 31 2023, 09:35 PM

Timers. Game: TES V: Skyrim

Happy New Year! And it's a very happy one for me. Because I finally figured how to make a working timer script for this game, after struggling without a tutorial, and only half-baked answers at Nexus and in Reddit threads.

Timer scripts are used to measure hours or days in the game. Just like in earlier games, once a timer gets triggered it'll count time silently. Once the timer's count concludes X happens. X being a quest stage advancing, a variable being moved toward a certain value, an object enabling. Whatever is desired. ⌛

There are multiple ways to set these up, I am merely posting the simple method which worked for me. No quest stages, no dialog, only the basic quest, and its script. I am going to pretend to set a quest stage though. This sort of timer script can either be attached directly to a typical quest (which handles dialog, for instance), or it can work remotely as a standalone, influencing a seperate quest, a "host" quest if you will.


Object Window > Character > Quest
1). Right-click > New, starting a new quest.

ID: aaaTimerQuest
Priority: 0

Timers don't need priority if working remotely, because they'll be getting triggered by some other quest which does have a higher rating. If this script is being added to a normal quest though (locally) a higher Priority can be chosen.


Start Game Enabled: On
Run Once: Optional

It is possible to just use only THE information above on the Quest Data page, which is as basic as timers get.

2). Click OK, closing the quest window, and reopen it. This is so all those extra tabs show up.

3). Select the Scripts tab. Right-click > Add Script into the window.

4). 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.

5). Right-click onto the script's name > Edit Properties (or simply highlight the script name and press the Properties button).

6). Press Add Property. First property added is like so...

Type: Float
Name: Hours


Click OK, closing the Add Script Property panel.

7). Highlight the property and select Edit Value button. If the timer is standalone, if it is being used to influence a host quest, then 0 can be used as the Value. This means zero hours. Presumably the host will have a higher Value. Want just one hour to pass before something occurs in the host's quest? Put 1 in Float Value slot. Want 8 hours to pass? Type 8.

8). Press Add Property again. Second property is...
Type: Quest
Name: myQuest


Click OK, closing the Add Script Property panel.

9). Highlight the myQuest property and select Edit Value button. Find the quest's name, whether it is the actual quest being worked on now, or something remote. I am selecting aaaTimerQuest, since I'm working locally.

10). Press Add Property a third time. In this case, I am going to describe a timer which sets a stage.
Type: Int
Name: Stage


Click OK, closing the Add Script Property panel.

11). Highlight the property just created, which I'm calling Stage. Edit Value can be whatever stage we want the quest to set to. I am typing 5.

12). Click OK and click OK again, closing the Quest panel. Save. And reopen to the Scripts tab.

13). Right-click > Edit Source on the script. Right now here is what I'm seeing.

Scriptname aaaTimerScript extends Quest

Float Property Hours Auto
Quest Property myQuest Auto
Int Property Stage Auto


These next parts, we'll need to type in manually. 📝

Scriptname aaaTimerScript extends Quest

Float Property Hours Auto
Quest Property myQuest Auto
Int Property Stage Auto

function OnInIt()

EndFunction

Function OnUpdateGameTime()

EndFunction


OnInIt is used when the script has been created and all its properties have been initialized.

OnUpdateGameTime is used frequently with timers (such as when we rent a room for a day), magic effects, or many other events when time needs to be measured.


14). File > Save (or Ctrl + Save). If the script compiles, continue with the rest.

Scriptname aaaTimerScript extends Quest

Float Property Hours Auto
Quest Property myQuest Auto
Int Property Stage Auto

function OnInIt()

If Self.IsRunning()
self.RegisterForSingleUpdateGameTime(Hours)

EndIf

EndFunction

Function OnUpdateGameTime()
MyQuest.SetCurrentStageID(Stage)


EndFunction





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

--The timer script above will be ready to run right away, as soon as a quest begins, IF the script is attached to the actual quest which handles dialog or whatever. This is good for a one-time event. When the quest completes its last stage the timer (along with any other scripts) will shut off for good.

--If the timer script is standalone it'll usually need to be 'registered' before it'll trigger. Let's say a line of dialog occurs, and after this line is spoken we want the timer to begin. Go to the Topic/Info page where this line occurs and use the Script Begin or Script End boxes to make two properties: one for the standalone Timer quest (which I'll conveniently call TimerQuest), and a Float which counts a certain amount of hours. The script fragment TimerQuest.RegisterForSingleUpdateGameTime(Hours) gets typed into either Script box. This is what'll get the quest registered, get it running, basically.

--Now if we want a timer which we have more control over, let's say we want it to trigger only when a certain stage has passed, everything is the same, except some changes in the second If/EndIf block.

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

Scriptname aaaTimerScript extends Quest

Float Property Hours Auto
Quest Property myQuest Auto
Int Property Stage Auto

function OnInIt()

If Self.IsRunning()
self.RegisterForSingleUpdateGameTime(Hours)

EndIf

EndFunction

Function OnUpdateGameTime()
If myQuest.GetStage() == 1
myQuest.SetStage(5)

UnregisterForUpdateGameTime() ;This line gets added only if the quest itself runs forever, like a room rental quest.
;in such a case, the timer will need to be 'unregistered' before it can be used again.

EndFunction


;--------------------------

So the timer above was began when the quest was Stage 1, perhaps after speaking to an NPC, who said his Goodbye. Try speaking to him just afterwards, and he'll say "Hmm?" "Need something?" ... But after waiting X hours or more, now he's got something new to say. "You're back!"

Happy New Year!!! 🍷 🍾

Posted by: Renee Jan 25 2024, 08:02 PM

Making a Bookshelf, Game: TES V: Skyrim

Skyrim is full of little tricks and improvements, things most folks hardly seemed to mention in bulletin boards online. One of the things I liked are bookshelves. 📚 No longer do we have to use the Grab function to awkwardly place books on shelves (half-open, which means getting them to land properly on a shelf takes mad dexterity) only to have them all fall or fly across the room if the wrong object touches another. Instead we can merely activate the bookshelf, choose which books or notes we'd like to place on there, and everything gets placed into the shelf efficiently.

Surprise, though. We can't just take a piece of furniture from the Object window, throw it into a cell, and everything works. No, we have to arrange for this to happen in the CK. EDIT: Actually, ghastley's post below says we can do this. But I'm writing up this tutorial anyway.

https://www.youtube.com/watch?v=n8hr1Tp4hrI. Darkfox is very good at making these videos, but there were a few things I was confused about, hence this writeup.

Object Window > WorldObjects > Static
1). Find UpperShelf01. Find the cell where the shelf is going to get placed and drag the shelf into the Render Window.

Tip: it helps to have Snap To Grid toggled on the main tool bar, so the shelf can be rotated in 45 degree angles.

Save.

2a). Still in the Object window, left-click Container. It helps to type Book into the Filter slot to narrow things down.

2b). Drag PlayerBookShelfContainer into the Render window. This is a marker, odd that it's placed into the Container section. Anyway, once it is in the window, carefully place the marker behind the shelf. In fact it's okay to drag the marker into the void.


3a). Still in the Object window, go to the Items section > Book. Type Default into the Filter. Click & drag DefaultBookShelfMarker into the Render window.

3b). Type the letter W and use the gyroscopic pattern thingie (Darkfox calls it a gizmo) to rotate the book marker so that its spine is showing outward, and the marker is placed with its hardbound covers holding it upwards. Just like a real book.

Again, https://www.youtube.com/watch?v=n8hr1Tp4hrI for a visible example.

3c). Left-click on the marker and Ctrl + D so it gets duplicated. Keep doing this until the shelf is full. SAVE.

Another option is to make add just one bookmarker for now, and continue the steps below. This is for anyone who wants to check and make sure the shelf works, before moving on and finishing the rest of the job.

-- Though this seems really tedious to set up all these bookmarkers side by side, consider how much more tedious it is trying to use the Grab in the game. Placing books flat on their side instead of upright! Spending X amount of time getting everything arranged, only to find them all falling off as you reenter the cell in-game! dry.gif

3d). Select (left-click) the book case and click the Trigger button on the main toolbar. This is the button with the upper-case T.

3e). Type book into the Filter, and select PlayerBookShelfClickTrigger, which should be the very top of the list. Click OK. This causes another 'gizmo' to show.

3f). Left-click and hold the vertical arrow. Drag it downwards so that the entire marker collapses. Each of the three directional bars can be used to shape and reshape the marker. Basically, we only need it to be as large as the shelf itself. So that (in the game) clicking on THIS shelf will only activate the invisible book markers on the shelf. 📙📕📗

To move the gizmo (without stretching it) single left-click on the marker (but not the arrows). Hold Ctrl + Z to move the maker up and down, without stretching it all over the place. This takes practice! The marker should be arranged so that it's visibly covering the bottom portion of the shelf. This is what we'll be clicking on in the game.

3g). Select the entire shelf in the Render window. Click on the Toggle button again from the main toolbar. Type Book into the Filter, and single-left-click PlayerBookShelfTrigger (Not the "click trigger" version). Click OK. That is a 2-step process by the way: Don't try to simply double-left click on PlayerBookShelfTrigger.

A red marker shows up covering the entire bookshelf. As the video shows, move the entire marker so that it collapses around the area where all the book markers have been placed.

3h). Save, goshdarnit.

3i). Return to the PlayerBookShelfContainer marker. This was placed into the void, or somewhere behind the bookshelf, during step 2b. Single left-click on it and press the number 2 on the keyboard, so the gizmo goes away. Now double-left on it.

3j). Select the Linked Ref tab. Rotate the window so that the PlayerBookShelfTrigger can be accessed. This is the marker which covers all the book markers (confusing, I know) not the marker which triggers the shelf itself.

3k). Single-left click on the PlayerBookShelfTrigger and press the number 1 twice on your keyboard. This causes the marker to temporarily disappear.

3l). Return to the Reference panel which is pulled from the Container marker. Right-click > New into its window. Now press the Select Reference in Render Window button, and double-left click on the book marker on the very left. I'm gonna work left to right.

3m). Click on the Keyword scroll-bar and type "book". Now select BookShelf01 (which should be the very top of the stack) and click OK. BookShelf01 should now be in the Keyword window, along with the first Bookmarker.

Repeat steps 3j thru 3m for EVERY book marker, left to right (or right to left, for Arabic-readers).

Otherwise, make sure these books are being referenced in order: BookShelfBook01, BookShelfBook02, and so on. Yes this is tedious. Consider again how much more tedious it is to set up a bookshelf with the Grab function though! laugh.gif

It helps to use the View Reference button occasionally, before clicking OK to close the Choose Reference panel. This is so we are 100% sure each marker is getting referenced properly. By the time I'd gotten this done I realized I only had 14 books on the top shelf, rather than the max of 18. Meh.

3n). Once the entire process is done, left-click somewhere in the render window. Press Alt + 1 to make the hidden PlayerBookShelfTrigger reappear.

3o). Double left-click on the PlayerBookShelfTrigger so its Reference panel shows up. Rotate the window (if needed) so that the Container marker is showing in the void.

3p). With the Linked Ref tab selected, right-click > New and use the Select Reference in Render Window button to link the container to the trigger.

3q). Use the Keyword scroll-bar to find Book Shelf Container. Click OK.

3r). Still with the Reference panel onscreen, select the Primitive tab. Toggle Player Activation on.

3s). Select the 3D tab. Change each Rotation number (X, Y, and Z) from 0.000 to 0.001. This has to be done manually; clicking the little arrows up or down introduces too much rotation.

All three Position numbers should be slightly off, rather than exactly 0.000. This is to avoid a glitch in the game, or something. Click OK.

3t). Select the PlayerBookShelfTrigger (the marker which surrounds all the books. Double-left click on it. Select Linked Ref. Right-click > New into the window and link the trigger to the container out in the void. Click OK.

3u). With the Reference panel still up, select the Primitive tab. Change Collision Layer from L_ACTORZONE to L_TRIGGER. Click OK.

3v). Double-click on the container out in the void. Select Linked Ref tab and right-click > New into the winodw. Use the Select Reference button to link the container to the PlayerBookShelfTrigger (again, this is the marker which covers all the books).

Use the Keyword scroll-bar to find BookShelfTrigger01. Click OK, closing the reference panel for the container.

Final step, coming right up. We need to make a Collision marker. Its purpose is to make sure books which get placed on the shelf won't just fall off at some point, and also to make sure that the player cannot just remove books from the shelf individually, which can screw things up. We want to make sure the player is only able to click on the shelf itself, which then automatically arranges the menu to pop up so books can be removed or added.

3w). Click on the entire book shelf. From the main toolbar click the Collision button. This is a C, located five buttons from the right. The shelf should be covered in a yellow marker. This can be resized again, using the arrows.

MAKE SURE the yellow Collision marker is placed slightly behind the PlayerBookShelfClickTrigger, otherwise we won't be able to activate the shelf.

TROUBLESHOOTING: If nothing happens when trying to activate the shelf (yet an option to Activate can be seen), try turning PlayerBookShelfClickTrigger (invisible marker we click on in-game) around 180 degrees.

Posted by: ghastley Jan 25 2024, 09:25 PM

Or you could just go the warehouse, and cut and paste a ready made one. Still, you do need the Ikea method when your bookshelf isn’t the same model as the prefab. And it usually isn’t.

That PlayerBookShelfContainer really is a container, like an invisible chest. The player is a container, too. Anything that can invisibly hold other items is a container. So the really bizarre thing is that the books you see on the shelf are copies linked to the ones in the container. Weapon racks work the same way, as does the mask display at Labyrinthian.

Posted by: Renee Jan 25 2024, 09:43 PM

Right, and any thing in the Creation Kit (including quests) are Objects. Anyway, dang.

Funny thing is, I went into the CK looking for just that: a ready-made bookshelf without all the work. Ah well.

... Edit: and then after all that the dang bookshelf doesn't work! I missed something apparently. Although I did get a workable light switch into Laprima's room. Turns the invisible light markers on and off.

Posted by: Renee Jan 26 2024, 05:52 PM

Next

Posted by: ghastley Jan 26 2024, 06:49 PM

When bookshelves don’t work for me, it is usually the orientation of the ClickTrigger. That can easily end up facing backwards or even sideways, so you can’t operate it from in front. It’s built that way so you have to use the shelf from the front, but the orientation of the widget is not too clear in the CK.

Posted by: Renee Jan 26 2024, 07:17 PM

How to make Generic NPCs, Game: TES V: Skyrim

Renee's Modding Thread is a bit of a mess during that last post, it's because I'm experimenting, but hit a dead-end. But I have discovered how to make generics in the game of Skyrim. Since the process is rather involved (and I doubt I'd be able to remember it without reminders) here the next tutorial.

Three items are needed to make this happen: a LeveledCharacter list, a NPC template, and an actual NPC.

Now... Bethesda themselves often go way beyond these three basic things. As I was trying to figure this out, I was studying bandits. And found a Leveled list which draws from a leveled list which draws from another leveled list which FINALLY dice-rolls some NPC(s) which have been drawn from their own templates, which have multiple LeveledList items for Inventory, and so on. It gets to be crazy, and it took me over an hour to figure out how all these objects and lists correlate to one another and show up properly in the game.

Ahem. But for the basic idea to work, all that are needed are three factors.


Object window > Actors > LeveledCharacter
1a). Right-click > New. Make an ID. aaaLeveledCharacterList or whatever.

1b). Toggles are described below in Bethesda's own words, from the Creation Kit website. I've put my own comments (in parenthesis) as well.


Calculate from all levels <= PC's level: If checked, the level list will use any item at or below the player's level in the list. If not checked, it uses the closest item or items to the player's level, but not exceeding it.

Calculate for each item in count: If this list is in another leveled list with a count greater than zero, this check box determines if each item in the count is the same, or is recalculated. (Bethesda often has both of the Calculate toggles on.)

Use All: Mutually exclusive with the previous two selections, Use All causes the list to always return all of its contents. (In most cases, this is off).

Special Loot: Whether to select items from this list using the Special Loot formula.

Chance None: The chance that the leveled list will not produce an item at all. This chance can be supplied either as a fixed percentage or as a value in a Global. (0 is chosen if we want to make SURE the NPC always has this item type.)


Click OK. It helps to copy the ID of the list sometimes, and paste it to a Notepad or some other text-based page, especially for those who don't put "aaa" at the start, or don't remember what name they chose.

1c). Staying in the Object window, 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.

ID: aaaNPCTemplate

Name: NPC Template.

ActorBase: find the LeveledCharacter list made during step 1a in this scroll-bar, which for my example above is aaaLeveledCharacterList.


1d.) Toggle Respawn on, do NOT toggle Unique. Click OK and reopen.

1e.) 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.

Stats tab
Auto calc stats should be toggled on. Level stays at 1 because the Leveled List will handle overall level.

Use the Class scroll-bar to find whichever class is desired: EncBanditMelee1handed or whichever. This all depends what sort of weapon-type will be wielded by enemies, of course. If the generic NPC is not an enemy, Drunk or Monk or whatever can be chosen, although in most cases, this entire process is used for enemies. emot-ninja1.gif

Factions tab
Use whatever faction is necessary. If the generic(s) is or are supposed to be placed with the bandits for instance, obviously Add the BanditFaction. Otherwise, go into Object window > Character > Faction and make a new faction if for some reason a new one is needed.

AI Data tab
For most enemies...
Aggression: Very Aggressive
Confidence: Foolhardy
Assistance: Helps Allies or Helps Friends and Allies

AI Packages tab
DefaultSanboxEditorLocation1024 is a good one to choose. In some cases, AI is not added to generic-type NPCs; I think the game will make them mildly sandbox even if they don't have any specific AI.


As per the Inventory tab described in the post above, Inventory can be rather more complex, so that'll be discussed next. OH, and if the NPC is supposed to use spells, don't forget the SpellList tab. bluewizardsmile.gif

1f). So click OK, closing the Actor panel.


Object window > Items > LeveledItem
It is possible to simply find LeveledItem lists which have already been made, and these can simply be added to the NPC template. Skip to step 3a if this is desired. But to start something new... especially for randomized enemy gear....

2a). Right-click > New so that the LeveledItem panel pops up. Here's what I got:

ID: aaaArmorList

Chance None: 0
Calculate from all levels <= PC's level: OFF
Calculate for each item in Count: OFF

With these settings, several armor cuirass/greaves sets or outfits can be added to the list, but the game will choose only ONE of these for the NPC to wear. If "Calculate for each item in Count" is toggled ON (along with Chance None at say, 50), the game will make a dice roll for each item on the list, with a 50% outcome that item will or won't show up. Actually,
.
2b). 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.

We can also right-click > New into the window to find armor or clothes that way.

2c). Steps 2a through 2b 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 aaaHelmetList with a 50% of Chance None. Just for variety.

2d). Click OK.

2e). Follow the same process for weapons: 2a through 2d. Here's what I came up with.

ID: aaaWeaponList

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. There's a chance the NPC won't have a weapon at all when he's met since I made a 10% chance of this, so change this to 0 if a weapon is always supposed to be in the person's inventory.


Object window > Items > Outfit
3a). Right-click > New into the right window. ID = aaaNPCOutfit is an example.

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, especially if they're generic.

3b). Drag or right-click > New the Leveled List items into the Outfit window. So I've got the lists I just made: aaaArmorList, aaaBootsList, and aaaHelmetList.

3c). Click OK.

3d). 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, aaaNPCOutfit is my example.

3e). 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.


4a) Still in the Actor section, right-click into the Object window and select New. I am making aaaBandit01 for the ID, and Name is simply staying as Bandit.

4b). 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 aaaNPCTemplate.

4c). 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. In most cases, Scripts are not needed with generics.

Note that as we toggle stuff on, we'll no longer be able to manipulate the actual NPC's data choices, those windows, boxes, and toggles will be grayed-out. The template is now handling these choices. wink.gif

4d). Go back to the LeveledCharacter list made before (aaaNPCList for my example). Right-click > New into its main window and find the NPC (NOT the Template). I've got aaaBandit01 so far. From this moment on, if more NPCs are desired into this list, steps 4a through 4c can be followed. The Level slots can be used to make sure enemies only show up at certain times, all with different names in the game. Think of the difference between a Bandit who shows up at low levels, to a Bandit Skirmisher or Bandit Plunderer.


Cell and Render Windows
5a). Go back to the NPC in the Actors section. Find whichever cell is desired and drag the NPC into the Render window. He or she's going to appear as a green-colored M icon, which means we're on the right track if we're wanting randomized, generic NPCs showing up, not someone specific.

5b). Double left-click on the green icon in the Render window, and select the Leveled Actor tab. By default this is on Easy. We can change this around, making the guy tougher if desired.

5c). Click the Persist Location tab and find whichever cell or worldspace the NPC will dwell in. I've got EmbershardLocation. Maybe it's a good idea to put the NPC into an area which is not populated by other people. This way, if we want to see that the NPC actually shows up, we can easily do so.

Click OK.

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 with a chance of 0).

Posted by: Renee Feb 20 2024, 02:23 AM

Light Switches and Triggers, Games: TES IV: Oblivion, Fallout 3, TES V: Skyrim

This mod idea is so simple, it's probably already been done before. Gotta be. Because it's such a brilliant concept (pun intended). 💡💡💡💡💡💡💡 This idea is the ability to turn a light switch on, or turn it off. It's probably been done, somewhere. Yet I've never seen any mod that features it.

Normally if we walk into any room, in any of these games, the lights are already on. I'm not talking about candles, not talking about torches or sconces. I am talking about the invisible light markers which can be seen in any of these three games' editors. They illuminate indoor areas, even caves which should be pitch black. ph34r.gif

So... my idea breaks lore (for Elder Scrolls), because nobody in Tamriel ever turns lights on and off. In my mind however, doing so can be explained in-game by magic, and a bit of make-believe. redwizardsmile.gif Doesn't anybody ever walk into their bedroom, and want to make it darker before they go to sleep? Not by turning lights off but by blowing out the candles, snuffing the sconces? 🕯

Well... I'm not that talented of a modder, I can't animate my character blowing out candles and such, but I can 'pretend' my character does all of this, through scripting.

--- And in Fallout 3, which is supposed to be based on Earth, light switches could certainly be possible. I'm assuming in Pre-War days, people were able to turn lights on and off. 💡💡💡💡💡💡💡💡💡💡💡 No lore broken. tongue.gif

The process below works for both these games, since they both share the same scripting system, though each of these two games do things a bit differently. And Skyrim has its own process which is completely different, of course. Big surprise, right?

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

OBLIVION or FALLOUT 3: Modding these two with working light activators is SUPER-easy. Really a good n00b-friendly way to learn scripting.

CELL window + RENDER window
1a). Find a place in which you'd like to turn lights off in-game. Best areas, of course, are our characters' bedrooms. Pretty much any cell in any game has light markers, except maybe some testing areas.

To anyone who is a complete n00b, light markers float in the Render window, in whatever Cell is being looked into. They literally look like floating lightbulbs. 💡 <--- Like this.

1b). Double left-click on a light marker, opening its Reference panel, and select Edit Base. Firstly, the ID name for light markers won't need to be changed in most cases. The main thing most folks might want to mess with is color. And if color of a base marker is changed then it's best to change its ID as well.

Click the Select Color button; and voila. First color I changed in FO3 was the Pip Boy light. My character wanted hers to be pink. rolleyes.gif

1c). Click OK, bla bla. Now when we get back to the Reference panel, give the marker a Reference ID. I am going for aaaLightMarkerRef. COPY that name onto a Notepad or Wordpad.

Oblivion: Toggle Persistent Reference on. Click OK.
Fallout 3: Pretty sure it's already on. If not, toggle it on.

In both games, toggle Initially Disabled on. This means the room will be dark (or darker) first time it's walked into.

Now... for Fallout 3 it's possible to make it that the lights are on (not disabled) when the room is first entered, but the scripting will be different. I'm gonna describe it so that they are OFF, though.


OBJECT window > WorldObjects > Activator
2a). Again, we're in the Activator section. Each game (OB and FO3) has different artwork of course, so there are different activators to look for.

Oblivion: Find HourglassSkingradSpecialHourglass
Fallout 3: Find ControlPanelVault01


OBLIVION
2b). For Oblivion, edit HourglassSkingradSpecialHourglass twice. First time, call it something like aaaOnSwitch. Change the Script scroll-bar to NONE. Click OK. Save as a New Form. Repeat the process over, except this time call it aaaOffSwitch. We're gonna need two activators.

I have experimented with a bunch of activators in this game. I like the Old Hourglass because all we have to do is click on it. Push blocks, levers, and other activators also work, but they need more complicated scripts. Feel free to experiment with these too if you like. But they are more complicated. Hint: most of the original script for these other activators must stay intact, because these script-fragments ensure that the lever, push block, pull rope (etc.) moves in real-time when we push or pull them.

Anyway, the reason why two switches are needed is because all the activators in this game only work one time. This is the conclusion I'm drawing, anyway. They work just one time because Bethesda hardcoded them this way. kvleft.gif So I am using two Hourglasses: one to turn the lights ON, and a second Hourglass to turn them OFF. If there just happens to be a 2-way activator for this game, I haven't found it yet.


2b). Reopen the ON activator, click on the Script button (which looks like [...]) and type something like...

Scriptname aaaLightsOnScript

Begin OnActivate

End


2c). Save and close the script. Click OK, saving as New Form. Reopen the ON activator, find the script in the scroll-bar, click OK.

Repeat all of that for the OFF switch.

2d). Reopen the ON activator. Here is the rest of the super-easy script.

Scriptname aaaLightsONScript

Begin OnActivate

aaaLightMarkerRef.Enable

End


2e). Reopen the OFF activator.

Scriptname aaaLightsOFFScript

Begin OnActivate
aaaLightMarkerRef.Disable

End



2e). Place both Hourglass activators side by side in the same cell as the light marker, or however. Voila. One turns the lights on, the other turns 'em off.


FALLOUT 3
3a). For Fallout 3, again, I am messing with the ControlPanelVault01 activator. Change ID, set script-bar to NONE, Click OK, saving as New Form. FO3 has actual two-way activators. smile.gif The script is a little more complex, but only one activator is needed in-game.

3b). Reopen the activator, click on the [...] button, which is the script button just like in OB's editor, and start a script like so....

scriptname aaaLightActivatorScript

Short DoOnce

Begin OnActivate

End


3c).... Save that, close it, click OK, closing the activator panel, and reopen it. Find the script in the scroll-bar, click OK. Reopen.

Here is the script in total...

scriptname aaaLightActivatorScript

Short DoOnce

Begin OnActivate

If (DoOnce == 0)
aaaLightMarkerRef.Enable
Set DoOnce to 1

EndIf

If (DoOnce == 1)
aaaLightMarkerRef.Disable
Set DoOnce to 0

EndIf

End



3d). Drag the activator into the same cell as the light marker. Toggle Persistent Reference on (if it's not already on).

And there we go. It is possible to enable and disable as many light markers or candles and other light sources as we wish, illuminating an entire room with one touch, in either game. 🕯

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

TRIGGERED LIGHTS

And this idea also can work well in OB or FO3. In this case, lights enable and disable as our character walks near them, or away from them. cool.gif Again, in Oblivion this can be explained by magic, and in Fallout it can be explained by some sort of unseen motion detectors, like we'd see in a sci-fi movie.

No activator is needed this time. And in this case I'm giving an example for two light markers, placed on each end of a short hallway.


1). Find a light marker in the Object window > WorldObjects > Light section. 💡 Or find one in the Cell + Render windows.

2a). Open the marker, change color if desired, give it a new ID name, click OK, save as New Form.

2b). Drag the edited marker into the Render window (if it's not already there).

2c). Give the marker a Reference ID. aaaHallwayLight1Ref is what I got. Copy/paste that ID somewhere.

Persistent Reference ON.
Initially Disabled ON.

In this case, I am left-clicking on the marker I just edited, pressing Ctrl + D, and dragging a second marker a few meters away. Give the new marker a Ref ID as well (aaaHallwayLight2Ref for me). Push the script button of either marker. Both are going to share the same script.


3). This time the script looks like this.....


scriptname aaaTriggeredLightScript

Short DoOnce

Begin GameMode

If (Player.GetDistance aaaHallwayLight1Ref < 128) || (Player.GetDistance aaaHallwayLight2Ref < 128)
If (DoOnce == 0)
aaaHallwayLight1Ref.Enable
aaaHallwayLight2Ref.Enable
Set DoOnce to 1

endIf
EndIf

If (Player.GetDistance aaaHallwayLight1Ref > 128) || (Player.GetDistance aaaHallwayLight2Ref > 128)
If (DoOnce == 1)
aaaHallwayLight1Ref.Disable
aaaHallwayLight2Ref.Disable
Set DoOnce to 0

endIf
EndIf

End



The script makes sure that BOTH markers illuminate if we get close enough to either one, and both of them turn off when far enough away.

SKYRIM:

🍷

Posted by: Renee Feb 29 2024, 04:21 AM

Adding an AI Package to an NPC, Game: TES V: Skyrim

The idea for this lesson: I am trying to get an NPC to do X, whether it's follow me, or wait, or whatever. To get this to work, conventionally the NPC normally might have an AI Package attached directly to him or her, right? This package might have some conditions added to it (GlobalVariable or GetStage or whatever) so the package only works at certain times. Overall this is a rather passive method of making an NPC do stuff.

But what if I want a more direct approach? What if I don't want to keep adding AI Packages to the NPC? This is why it's important to delve into the world of Quest Aliases.

In Oblivion or Fallout, we can change an NPC's AI packages on-the-fly, by using AddScriptPackage, which works better sometimes than adding AI directly to that NPC. I made some goggles in FO3's GECK, for instance. If my character puts them on this causes his team of followers to find him, anywhere in the game. He takes them off, and now they wait around. aaaFollower01.AddScriptPackage aaaFollowPackage or aaaFollower01.AddScriptPackage aaaWaitPackage.

Skyrim no longer has AddScriptPackage (except as a console command) and it's because the CK uses Aliases instead. In fact, Aliases are a much more efficient and broad-minded approach, because not only can we add packages to the alias (which, in turn, can then be added to the NPC in real-time) but scripts can be added and removed, Essential status, and dozens of other features, all with one click. One alias can also affect multiple NPCs, which means less properties, less scripting, less work. Finally, an alias can effect is a similar manner as AddScriptPackage in the old editors; which means aliases work in a more direct manner.

Another advantage of aliases: sometimes AI Packages need to be backed up with EvaluatePackage() just to get them to work. Aliases won't need this command.

https://ck.uesp.net/wiki/Quest_Alias_Tab

Let's say I already have a quest with some dialog written. "Would you like to join my party?" I click in the game, and the NPC agrees, causing the alias to fill.


1). If the NPC hasn't got a Reference ID, give the NPC a Reference ID in the Render window. Copy this name so it can be pasted. Ref ID's aren't 100% needed to get this idea to work, but they are what I'm gonna describe.

2). Make an alias on a quest. As stated, I've got a quest with some dialog which goes "Want to join my party?" and when the person agrees, that's when the alias fills. Anyway, right-click > New Reference Alias into the Alias window.

3). Click Specific Reference as the Fill Type, and find the NPC's Cell and Reference in the scroll-bars. Conversely, Unique Actor can also be used, as long as the NPC is a (you guessed it) Unique Actor.

Conversely, we can also click Specific Reference but leave the Reference button blank, so the long rectangular button says says "Force Reference". Done this way, the alias can be used to affect multiple NPCs, meaning we can tell an entire party to follow us. Each NPC will need his/her own Ref ID in this case, but we won't need multiple aliases written up as script fragments.

The alias can have the AI package attached directly to it, along with scripts, and all sorts of other good geekiness. And see: the advantage is, this frees up space in the NPC's AI Packages window. smile.gif From what I understand, adding packages this way works more flawlessly than adding packages directly to an AI stack. Although I've never had any problems doing so.

4). Toggle Optional on, and this is the only flag which needs to be toggled. Sometimes if Optional is not toggled on this can cause a quest to not start.

--These are the minimal features to add an alias (and therefore an AI Package) to an NPC. So click OK, or click into the Alias Name slot and press ENTER or RETURN. Click OK again, closing the quest panel, and save. Reopen, and head to Dialogue Views or Player Dialogue.

5). At the moment (when speaking to the NPC) when I've got "Yes you can follow me" for a clickable topic, two properties are needed: 1. a ReferenceAlias (can be the same name as the alias just made) and 2). an Actor property. Paste the Ref ID copied in step 1, this way the property auto-fills.

6). Final script is: ReferenceAlias.ForceRefTo(ActorProperty)  


Aliases clear automatically when the quest stops. However if the quest is to continue running while the alias ends, the fragment is ReferenceAlias.Clear()


Posted by: Renee Mar 14 2024, 05:20 PM

https://tesalliance.org/forums/index.php?/topic/5039-class-2-properties/ -- Study Array, as a way to add multiple objects to an alias.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)