About this mod
Attempts to fix issues such as taking prisoners alive where being knocked out doesn't reward the player for a non-lethal capture of a bounty target or killing a target and failing the objective.
- Permissions and credits
- Changelogs
Script “SFBGS003_SQ_Bounty_QuestScript” is used in the following Trackers Alliance quests:
1. SFBGS003_BountyScannerQuest (FD00556E)
2. SFBGS003_BountyScannerQuest00 (FD0066B6)
3. SFBGS003_BountyScannerQuest01 (FD0066B5)
4. SFBGS003_BountyScannerQuest02 (FD006684)
5. SFBGS003_BountyScannerQuest03 (FD0066B3)
6. SFBGS003_MB_EliteBounty01_WantedDead (FD00004A)
7. SFBGS003_MB_EliteBounty02_WantedAlive (FD002838)
8. SFBGS003_MB_EliteBountySpace01TA (FD000051)
Whether or not a player progresses to the Wanted: Dead, Wanted: Alive, Wanted: Dead or Alive completion stage is controlled by keywords that get assigned. The assignment happens when the quest first starts up by the script “SFBGS003_SQ_Bounty_QuestScript” as seen below:
; When the Quest Starts, determinewhether the Bounty allows the NPC to be "arrested" (aka Captured Alive)
Event OnQuestStarted()
SetBountyWantedAV()
EndEvent
We can see this event simply runs a function. So, let’s look at that function below:
; Determines a bounty status and sets the AV for UI to use in the Scanner Display.
;1.0 = Wanted Dead OR Alive
;2.0 = Wanted Dead (only)
;3.0 = Wanted Alive (only)
Function SetBountyWantedAV()
Actor BountyTargetREF = BountyTargetAlias.GetActorRef()
int WantedBounty = 0
int NumBounties = SFBGS003_Bounties_Total.GetValue() as Int
; If Player hasn't completed 10 bounties, only offer Wanted: Dead orAlive bounties.
If NumBounties >= 10
WantedBounty = Utility.RandomInt(1,3)
Else
WantedBounty = 1
EndIf
Trace(Self, " NumBounties: " + NumBounties + ",WantedBounty (1=Dead or Alive, 2=Dead, 3=Alive): " + WantedBounty)
; Set the AV used by the UI
If BountyTargetREF == NONE
BountyTargetREF =BountyTargetAlias.GetActorRef()
Trace(Self, " BountyTargetREF set to none. Fixing ref to " + BountyTargetAlias.GetActorRef() )
EndIf
BountyTargetREF.SetValue(SFBGS003_BountyWantedAliveAV, WantedBounty)
If WantedBounty <= 2
BountyTargetREF.AddKeyword(SFBGS003_Keyword_WantedDead)
Trace(self, "BountyTargetREF:" + BountyTargetREF + " has keyword " +
SFBGS003_Keyword_WantedDead)
EndIf
If WantedBounty != 2
BountyTargetREF.AddKeyword(SFBGS003_Keyword_WantedAlive)
Trace(self, "BountyTargetREF:" + BountyTargetREF + " has keyword " +
SFBGS003_Keyword_WantedAlive)
EndIf
Trace(Self, " WantedAV: " +BountyTargetREF.GetValue(SFBGS003_BountyWantedAliveAV) )
EndFunction
Unlike random crowd NPC bounties, the following quests are expecting a certain result and it should never be random:
1. SFBGS003_MB_EliteBounty01_WantedDead (FD00004A)
2. SFBGS003_MB_EliteBounty02_WantedAlive (FD002838)
3. SFBGS003_MB_EliteBountySpace01TA (FD000051)
SFBGS003_MB_EliteBountySpace01TA is especially odd as it handles death in 2 scripts which doesn't make much sense. The script "SFBGS003_SQ_Bounty_QuestScript" was likely not meant to be added onto this quest.
So what's the fix?
I recommend removing the keywords to check if the player killed or KO'd the bounty, as this is for edge cases unlikely to occur. Even if they do occur, they'd likely have to be loaded with the player nearby. This could also occur if the player is using a multiple companion mod and something else is credited with the kill. They are using logic to predict something unlikely to happen which can result in something unlikely to happen where the player isn't rightfully rewarded.
That aside, we can apply a band-aid to this by detecting the quests that require a certain keyword by pointing them out explicitly. I've chosen to do so without editing the quest itself:
; Determines a bounty status and sets the AV for UI to use in the Scanner Display.
; 1.0 = Wanted Dead OR Alive
; 2.0 = Wanted Dead (only)
; 3.0 = Wanted Alive (only)
Function SetBountyWantedAV()
Actor BountyTargetREF = BountyTargetAlias.GetActorRef()
int WantedBounty = 0
int NumBounties = SFBGS003_Bounties_Total.GetValue() as Int
; Trackers Alliance Wanted Alive Fix =============================================================
If Self == Game.GetFormFromFile(0x0000283B, "SFBGS003.esm") ; if I am SFBGS003_MB_EliteBounty02_WantedAlive
WantedBounty = 3
ElseIf Self == Game.GetFormFromFile(0x0000004A, "SFBGS003.esm") || Self == Game.GetFormFromFile(0x00000051, "SFBGS003.esm") ; if I am SFBGS003_MB_EliteBounty01_WantedDead or SFBGS003_MB_EliteBountySpace01_TA
WantedBounty = 2
ElseIf NumBounties >= 10 ; If Player hasn't completed 10 bounties, only offer Wanted: Dead or Alive bounties.
WantedBounty = Utility.RandomInt(1,3)
Else
WantedBounty = 1
EndIf
; ==================================================================================
; DEPRECATED - Original BGS bounty logic.
; If Player hasn't completed 10 bounties, only offer Wanted: Dead or Alive bounties.
; If NumBounties >= 10
; WantedBounty = Utility.RandomInt(1,3)
; Else
; WantedBounty = 1
; EndIf
Trace(Self, " NumBounties: " + NumBounties + ", WantedBounty (1=Dead or Alive, 2=Dead, 3=Alive): " + WantedBounty)
; Set the AV used by the UI
If BountyTargetREF == NONE
BountyTargetREF = BountyTargetAlias.GetActorRef()
Trace(Self, " BountyTargetREF set to none. Fixing ref to " + BountyTargetAlias.GetActorRef() )
EndIf
BountyTargetREF.SetValue(SFBGS003_BountyWantedAliveAV, WantedBounty)
If WantedBounty <= 2
BountyTargetREF.AddKeyword(SFBGS003_Keyword_WantedDead)
Trace(self, "BountyTargetREF: " + BountyTargetREF + " has keyword " + SFBGS003_Keyword_WantedDead)
EndIf
If WantedBounty != 2
BountyTargetREF.AddKeyword(SFBGS003_Keyword_WantedAlive)
Trace(self, "BountyTargetREF: " + BountyTargetREF + " has keyword " + SFBGS003_Keyword_WantedAlive)
EndIf
Trace(Self, " WantedAV: " + BountyTargetREF.GetValue(SFBGS003_BountyWantedAliveAV) )
EndFunction
---
Like the work I do? Consider supporting me via donation or by purchasing my content available on Creations.