Scriptname _00E_NQ_Bounty01_BoardScript extends ObjectReference


; SCRIPT AUTHOR DENNIS MAY 2014
; Script handles all the bounty board functions
; Script is automated, use the quest NQ_Bounty01 to do the configuration
; ====================================================================================
                                    ; EVENTS                                     
; ====================================================================================  
    
Int iStage = 0
Int iQuestDone = 0

Event OnActivate (ObjectReference akActionRef)
  
    If ( akActionRef == game.GetPlayer() )
        Int iAvailableQuests = BountyScript._00E_NQ_Bounty01_Quest01_mb_FormList.GetSize()  
        GotoState("TurnOffActivate")

        If ( iStage == 0 )                                                  ;Do this once when board board is activated the first time
            NQ_Bounty01.Start()
            NQ_Bounty01.SetObjectiveDisplayed(iStage)
        Endif
    

        If ( BountyScript._00E_NQ_Bounty01_Status == 0)                     ;APPEARS WHEN YOU HAVE NO CURRENT BOUNTY MISSION
            M_one (_00E_NQ_Bounty_mainMenu_mb)                  
        elseif ( BountyScript._00E_NQ_Bounty01_Status == 10) 
            _00E_NQ_Bounty_noMissions_mb.Show()
            return
        ElseIf ( BountyScript._00E_NQ_Bounty01_Status == 2)                 ;APPEARS WHEN TARGET IS KILLED - REWARD BLOCK
        
            NQ_Bounty01.SetObjectiveDisplayed(iStage, false)                ;Hide Kill objective
        
            iStage += 5                                                     ;Up QuestStage +5
            NQ_Bounty01.SetObjectiveCompleted(iStage)                       ;Complete previous objective = Collect your bounty
            
            BountyScript.GiveGold(BountyScript.__Config_MissionRewards[iQuestDone]) ;Give Player the Gold
        
            iStage += 5                                                     ;Up QuestStage +5
            NQ_Bounty01.SetStage(iStage)
            iQuestDone += 1
            If ( iQuestDone == iAvailableQuests )
                BountyScript._00E_NQ_Bounty01_Status = 10
                NQ_Bounty01.Stop()
            else
                BountyScript._00E_NQ_Bounty01_Status = 0                                ;Unlock bounty board again 
            Endif
        
            _00E_NQ_Bounty_recieveBounty_mb.Show()
            GotoState("")
    
        Else                                                                ;APPEARS WHEN YOU ARE ON A BOUNTY MISSION
            _00E_NQ_Bounty_activeMission_mb.Show()                          ;Bounty active message
            GotoState("")
            Return
        Endif
        
    Endif
  
EndEvent

State TurnOffActivate
    Event OnActivate(ObjectReference akActionRef)
        ; Do nothing
    endEvent
endState


; ====================================================================================
;                                       FUNCTIONS                                    
; ====================================================================================


Function M_one (Message chosenMessage)                                      ;CHECK FOR BOUNTY MISSIONS
    
    Int iAvailableQuests = BountyScript._00E_NQ_Bounty01_Quest01_mb_FormList.GetSize()      ;Get the count of Quests available in the FormList
    Int iButton = chosenMessage.Show()              
    
    If ( iButton == 0 )                                                     ;ACCESS BOUNTY MISSION TAB
        ;debug.Notification(iQuestDone + " " + iAvailableQuests)
        If ( iQuestDone < iAvailableQuests )
            Message SelectQuestMessage = BountyScript._00E_NQ_Bounty01_Quest01_mb_FormList.GetAt(iQuestDone) as Message ;SHOW CURRENT BANDIT DESCRIPTION
            M_two (SelectQuestMessage)
        Else
            _00E_NQ_Bounty_noMissions_mb.Show()                             ;SORRY, NO MORE QUESTS
            GotoState("")
        Endif
    
    ElseIf ( iButton == 1 )                                                 ;CLOSE BOUNTY MISSION TAB
        GotoState("")
        Return
    EndIf
    
EndFunction



Function M_two (Message chosenMessage2)                                     ;ACCEPT BOUNTY MISSIONS OR DENY THEM

    Utility.Wait(0.5)

    Int iButton2 = chosenMessage2.Show(BountyScript.__Config_MissionRewards[iQuestDone])    ;Fill mission description with given bounty value                   
    
    If ( iButton2 == 0 )                                                    ;ACCEPT THE SHOWN BOUNTY MISSION

        If ( iStage == 0 )                                                  ;Complete first objective / DO it once
            NQ_Bounty01.SetObjectiveCompleted(iStage)
        Endif

        ; Now comes some trickery. What this function is supposed to
        ; do is raising iStage (a local copy of the quest stage) from
        ; an integer of the form 20k (with k an integer) to 20k+10.
        ; (Indeed, 20k means "no current bounty mission", while 20k+10
        ; means "bounty mission started but target not yet killed".)
        ; However, sometimes this function gets called when iStage is
        ; at a value of the form 20k+10 (this tends to happen when
        ; you activate the bounty board many times in rapid
        ; succession, due to the latency of something in the engine).
        ; To prevent this from incorrectly raising quest stages, we
        ; first check that iStage is divisible by 20:
        ; [NOTE: I'm not sure if this is necessary at all, as I have
        ; troubles reproducing this bug.]
        
        int iStagemod20 = iStage - ((20 * math.floor(iStage / 20)) as int)
        if !(iStagemod20 == 0) && !(iStagemod20 == 20) && !(iStagemod20 == -20)
            ;Debug.Notification("machine-gun clicking detected")
            GotoState("")
            Return
        endif
        
        iStage += 10														;Up QuestStage +10
		NQ_Bounty01.SetStage(iStage)
        NQ_Bounty01.SetObjectiveDisplayed(iStage)
        BountyScript._00E_NQ_Bounty01_Status = 1                            ;Bounty quest active
        GotoState("")

    ElseIf ( iButton2 == 1 )                                                ;DENY THE SHOWN BOUNTY MISSION
        GotoState("")
        return
    EndIf

EndFunction



; ====================================================================================
;                                       PROPERTIES                                       
; ====================================================================================

Quest property NQ_Bounty01 Auto
Message property _00E_NQ_Bounty_mainMenu_mb auto
Message property _00E_NQ_Bounty_activeMission_mb auto
Message property _00E_NQ_Bounty_recieveBounty_mb auto
Message property _00E_NQ_Bounty_noMissions_mb auto

_00E_NQ_Bounty01_Functions Property BountyScript Auto           ;ACCESS TO QUEST SCRIPT


; ====================================================================================
;                                       DESCRIPTIONS                                     
; ====================================================================================

    ; BOUNTY QUEST STATUS BOARD
    ; _00E_NQ_Bounty01_Status (0) - No bounty mission selected
    ; _00E_NQ_Bounty01_Status (1) - Bounty quest active
    ; _00E_NQ_Bounty01_Status (2) - Target killed, time for the reward
    
    
    ; QUEST STAGE PROCEDURE RULES
    ; 10 New Mission
    ; 15 Target Killed
    ; 20 Reward Collected
    ; --- 10 Stage Gap ---
    ; 30 New Mission
    ; 35 Target Killed
    ; 40 Reward Collected
    ; --- 10 Stage Gap ---
    ; 50 New Mission
    ; 55 Target etc. ...