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