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 > BookFind 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 > NPCFind 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 tabOpen 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.
NOTE (4/20/2025): only five topics + the "No" topic can be squeezed into the Choices box while using the standard Construction Set, so keep this in mind. Perhaps Construction Set Extended allows more space, not sure.
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.00Copy 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 MapLocationSubstitute 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.004c). 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 tabTime 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 Timer2It 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 tabThe 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.006c). 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 3And, 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 > StaticClick 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 tabOpen 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.
This post has been edited by Renee: Apr 21 2025, 10:58 PM