Files
gtav-src/script/dev_ng/singleplayer/scripts/web/appFixerSecurity.sc
T
2025-09-29 00:52:08 +02:00

2977 lines
112 KiB
Python
Executable File

USING "rage_builtins.sch"
USING "globals.sch"
USING "cellphone_public.sch"
USING "net_transition_sessions.sch"
USING "net_objective_text.sch"
USING "net_gang_boss_private.sch"
USING "svm_mission_flow.sch"
USING "menu_cursor_public.sch"
//***********Script CONSTS***********
CONST_INT FAA_BS_PRINTED_PAUSE_MENU_ACTIVE 0
CONST_INT FAA_BS_DISPLAY_ROLLOVER_HELP 1
CONST_INT FAA_BS_OVERLAY_SCREEN_ACTIVE 2
CONST_INT FAA_BS_CURSOR_INPUT_PROCESSED 3
CONST_INT FAA_BS_WAITING_FOR_BUTTON_RETURN_VALUE 4
CONST_INT FAA_BS_WAITING_FOR_ROLLOVER_RETURN_VALUE 5
CONST_INT FAA_BS_FADE_TO_EXIT 6
CONST_INT FAA_BS_DIALOGUE_TUTORIAL_COMPLETE 7
CONST_INT FAA_BS_CURRENTLY_PLAYING_TUTORIAL 8
CONST_INT FAA_BS_DIALOGUE_TUTORIAL_COMPLETE_THIS_BOOT 9
CONST_INT FAA_BS_PRINTED_INTRO_PLEASE_WAIT 10
CONST_INT FAA_BS_PRINTED_DL_PLEASE_WAIT 11
CONST_INT FAA_BS_PRINTED_CONTINUE_STORY_HELP 12
CONST_INT FAA_BS_TRIGGER_BONUS_BILLBOARD_DIALOGUE 13
CONST_INT FAA_BS_OPENED_SEC_CONTRACT_PAGE_W_ACTIVE_CD 14
CONST_INT FAA_BS_DISPLAYING_LEAK_OVERVIEW 15
CONST_INT FAA_BS_INTRO_MISSION_LAUNCH_PREPARED 16
CONST_INT FAA_BS_SETUP_MISSION_LAUNCH_PREPARED 17
CONST_INT ciINPUT_KEYBOARD_DOWN 300
CONST_INT ciINPUT_KEYBOARD_UP 301
//Dialogue consts
CONST_INT F_APP_D_INTRO 0
CONST_INT F_APP_D_SEC_CON 1
CONST_INT F_APP_D_SEC_CON2 2
CONST_INT F_APP_D_SEC_CON3 3
CONST_INT F_APP_D_SETUP 4
CONST_INT F_APP_D_SETUP_2 5
CONST_INT F_APP_D_SELECT_LEAK 6
CONST_INT F_APP_D_PARTY_P_INT 7
CONST_INT F_APP_D_BILL_G_INT 8
CONST_INT F_APP_D_HOOD_P_INT 9
CONST_INT F_APP_D_PARTY_P_M2 10
CONST_INT F_APP_D_PARTY_P_F 11
CONST_INT F_APP_D_HOOD_P_M2 12
CONST_INT F_APP_D_HOOD_P_F 13
CONST_INT F_APP_D_BILL_G_M2 14
CONST_INT F_APP_D_BILL_G_F 15
//Enum for the current page ID
ENUM FAA_PAGE_INDEX
FAA_PAGE_LOGIN,
FAA_PAGE_HOME,
FAA_PAGE_DATA_LEAK_SELECTION,
FAA_PAGE_SECURITY_CONTRACT_SELECTION,
FAA_PAGE_DATA_RECOVERY
ENDENUM
//Enum for button indexes returned by SF
ENUM FAA_BUTTON_INDEXES
BUTTON_OVERLAY_CANCEL = 201,
BUTTON_OVERLAY_ACCEPT,
BUTTON_HOME_SECURITY_CONTRACT,
BUTTON_HOME_VIP_CONTRACT,
BUTTON_DATA_LEAK_1,
BUTTON_DATA_LEAK_2,
BUTTON_DATA_LEAK_3,
BUTTON_DATA_LEAK_TAB_1,
BUTTON_DATA_LEAK_TAB_2,
BUTTON_DATA_LEAK_TAB_3,
BUTTON_SECURITY_CONTRACT_1,
BUTTON_SECURITY_CONTRACT_2,
BUTTON_SECURITY_CONTRACT_3,
BUTTON_INTRO_MISSION,
BUTTON_SETUP_MISSION,
BUTTON_LOGIN,
BUTTON_DATA_LEAK_ACCEPT,
BUTTON_SECURITY_CONTRACT_ACCEPT,
BUTTON_SECURITY_PAGE_VIP_CONTRACT, //Security page - VIP contract button
BUTTON_VIP_PAGE_SEC_CONTRACT, //VIP page - Security contract button
BUTTON_DREC_PAGE_SEC_CONTRACT, //Data recovery page - Security contract button
BUTTON_DATA_RECOVERY,
BUTTON_DATA_RECOVERY_START
ENDENUM
//Enum for the current state of the script
ENUM FAA_APP_STAGE_ID
FAA_STAGE_IDLE = 0,
FAA_STAGE_SEC_CONTRACT_SELECTED,
//Overlay on screen stages
FAA_STAGE_STRAND_CONFIRM //Overlay asking the player to confirm their choice of strand
ENDENUM
ENUM SECURITY_CONTRACT_DIFFICULTY
SCD_NORMAL = 1,
SCD_HARD = 2,
SCD_VS = 3
ENDENUM
ENUM FAA_INPUT_SOUNDS
FAA_IS_NAV_UP_DOWN,
FAA_IS_NAV_LEFT_RIGHT,
FAA_IS_NAV_BLOCKED,
FAA_IS_SELECT,
FAA_IS_BACK,
FAA_IS_EXIT,
FAA_IS_ERROR,
FAA_IS_LOGIN,
FAA_IS_LAUNCH_MISSION,
FAA_IS_BOOT
ENDENUM
//***********Script VARIABLES***********
INT iBS
INT iSelectedSecurityContract
INT iSelectedDataLeakInStrand
FIXER_STRANDS eSelectedDataLeakStrand
//Input cache values
INT iLeftX, iLeftY, iRightX, iRightY
//Dialogue tutorial
INT iTutorialHelpTime = 0
INT iDialogueRequestID = -1
INT iDialoguePlayingID = -1
STRING sTutTextAfterDialogue = ""
SCRIPT_TIMER stTutorialTimer
STRING sRolloverHelp
STRING sOverlayMethod
FIXER_HQ_ID eThisFixerHQ
FAA_APP_STAGE_ID eCurrentStage
FAA_PAGE_INDEX eCurrentPage
FAA_BUTTON_INDEXES eButtonLastHighlighted
FIXER_STRANDS eCurrentlyDisplayedStrand = FS_NONE
//The Scaleform movie
SCALEFORM_INDEX mov
//Data return indexes
SCALEFORM_RETURN_INDEX currentSelectionReturnIndex
SCALEFORM_RETURN_INDEX currentRollOverReturnIndex
INT iRolloverReturnTimeOut = 0
#IF IS_DEBUG_BUILD
BOOL bRender = TRUE
#ENDIF
//***********Debug Helper functions***********
#IF IS_DEBUG_BUILD
FUNC STRING DEBUG_GET_BUTTON_NAME(FAA_BUTTON_INDEXES eButton)
SWITCH eButton
CASE BUTTON_OVERLAY_CANCEL RETURN "BUTTON_OVERLAY_CANCEL"
CASE BUTTON_OVERLAY_ACCEPT RETURN "BUTTON_OVERLAY_ACCEPT"
CASE BUTTON_HOME_SECURITY_CONTRACT RETURN "BUTTON_HOME_SECURITY_CONTRACT"
CASE BUTTON_HOME_VIP_CONTRACT RETURN "BUTTON_HOME_VIP_CONTRACT"
CASE BUTTON_DATA_LEAK_1 RETURN "BUTTON_DATA_LEAK_1"
CASE BUTTON_DATA_LEAK_2 RETURN "BUTTON_DATA_LEAK_2"
CASE BUTTON_DATA_LEAK_3 RETURN "BUTTON_DATA_LEAK_3"
CASE BUTTON_DATA_LEAK_TAB_1 RETURN "BUTTON_DATA_LEAK_TAB_1"
CASE BUTTON_DATA_LEAK_TAB_2 RETURN "BUTTON_DATA_LEAK_TAB_2"
CASE BUTTON_DATA_LEAK_TAB_3 RETURN "BUTTON_DATA_LEAK_TAB_3"
CASE BUTTON_SECURITY_CONTRACT_1 RETURN "BUTTON_SECURITY_CONTRACT_1"
CASE BUTTON_SECURITY_CONTRACT_2 RETURN "BUTTON_SECURITY_CONTRACT_2"
CASE BUTTON_SECURITY_CONTRACT_3 RETURN "BUTTON_SECURITY_CONTRACT_3"
CASE BUTTON_INTRO_MISSION RETURN "BUTTON_INTRO_MISSION"
CASE BUTTON_SETUP_MISSION RETURN "BUTTON_SETUP_MISSION"
CASE BUTTON_LOGIN RETURN "BUTTON_LOGIN"
CASE BUTTON_DATA_LEAK_ACCEPT RETURN "BUTTON_DATA_LEAK_ACCEPT"
CASE BUTTON_SECURITY_CONTRACT_ACCEPT RETURN "BUTTON_SECURITY_CONTRACT_ACCEPT"
CASE BUTTON_SECURITY_PAGE_VIP_CONTRACT RETURN "BUTTON_SECURITY_PAGE_VIP_CONTRACT"
CASE BUTTON_VIP_PAGE_SEC_CONTRACT RETURN "BUTTON_VIP_PAGE_SEC_CONTRACT"
CASE BUTTON_DREC_PAGE_SEC_CONTRACT RETURN "BUTTON_DREC_PAGE_SEC_CONTRACT"
CASE BUTTON_DATA_RECOVERY RETURN "BUTTON_DATA_RECOVERY"
CASE BUTTON_DATA_RECOVERY_START RETURN "BUTTON_DATA_RECOVERY_START"
ENDSWITCH
RETURN "***INVALID***"
ENDFUNC
FUNC STRING FIXER_APP_GET_APP_STAGE_DEBUG_NAME(FAA_APP_STAGE_ID eStage)
SWITCH eStage
CASE FAA_STAGE_IDLE RETURN "FAA_STAGE_IDLE"
CASE FAA_STAGE_SEC_CONTRACT_SELECTED RETURN "FAA_STAGE_SEC_CONTRACT_SELECTED"
CASE FAA_STAGE_STRAND_CONFIRM RETURN "FAA_STAGE_STRAND_CONFIRM"
ENDSWITCH
RETURN "****Invalid****"
ENDFUNC
FUNC STRING FIXER_APP_GET_APP_PAGE_DEBUG_NAME(FAA_PAGE_INDEX ePage)
SWITCH ePage
CASE FAA_PAGE_LOGIN RETURN "FAA_PAGE_LOGIN"
CASE FAA_PAGE_HOME RETURN "FAA_PAGE_HOME"
CASE FAA_PAGE_DATA_LEAK_SELECTION RETURN "FAA_PAGE_DATA_LEAK_SELECTION"
CASE FAA_PAGE_SECURITY_CONTRACT_SELECTION RETURN "FAA_PAGE_SECURITY_CONTRACT_SELECTION"
CASE FAA_PAGE_DATA_RECOVERY RETURN "FAA_PAGE_DATA_RECOVERY"
ENDSWITCH
RETURN "****Invalid****"
ENDFUNC
#ENDIF
//***********Core Script functions***********
PROC FIXER_APP_PLAY_INPUT_SOUND(FAA_INPUT_SOUNDS eSound)
STRING sSoundName
SWITCH eSound
CASE FAA_IS_NAV_UP_DOWN sSoundName = "Nav_Up_Down" BREAK
CASE FAA_IS_NAV_LEFT_RIGHT sSoundName = "Nav_Left_Right" BREAK
CASE FAA_IS_NAV_BLOCKED sSoundName = "Nav_Blocked" BREAK
CASE FAA_IS_SELECT sSoundName = "Select" BREAK
CASE FAA_IS_BACK sSoundName = "Back" BREAK
CASE FAA_IS_EXIT sSoundName = "Exit" BREAK
CASE FAA_IS_ERROR sSoundName = "Error" BREAK
CASE FAA_IS_LOGIN sSoundName = "Key_Hit" BREAK
CASE FAA_IS_LAUNCH_MISSION sSoundName = "Launch_Mission" BREAK
CASE FAA_IS_BOOT sSoundName = "Boot" BREAK
ENDSWITCH
PLAY_SOUND_FRONTEND(-1, sSoundName, "DLC_Fixer_Agency_Computer_Soundset")
ENDPROC
PROC CLEAR_ROLLOVER_HELP()
IF IS_BIT_SET(iBS, FAA_BS_DISPLAY_ROLLOVER_HELP)
CLEAR_HELP()
sRolloverHelp = ""
CLEAR_BIT(iBS, FAA_BS_DISPLAY_ROLLOVER_HELP)
PRINTLN("<APP_FIXER_HQ> CLEAR_ROLLOVER_HELP")
ENDIF
ENDPROC
PROC SCRIPT_CLEANUP(BOOL bPlayExitSound = TRUE, BOOL bLaunchingMission = FALSE)
SET_SCALEFORM_MOVIE_AS_NO_LONGER_NEEDED(mov)
IF IS_AUDIO_SCENE_ACTIVE("DLC_Fixer_Office_Room_Use_PC_Scene")
STOP_AUDIO_SCENE("DLC_Fixer_Office_Room_Use_PC_Scene")
ENDIF
DISABLE_CELLPHONE(FALSE)
Unpause_Objective_Text()
SET_AUDIO_SCRIPT_CLEANUP_TIME(1000)
IF bPlayExitSound
IF bLaunchingMission
FIXER_APP_PLAY_INPUT_SOUND(FAA_IS_LAUNCH_MISSION)
ELSE
FIXER_APP_PLAY_INPUT_SOUND(FAA_IS_EXIT)
ENDIF
ENDIF
IF IS_PC_VERSION()
SET_MULTIHEAD_SAFE(FALSE, TRUE, TRUE, TRUE)
ENDIF
THEFEED_RESUME()
CLEAR_ROLLOVER_HELP()
CLEAR_BIT(GlobalplayerBD[NATIVE_TO_INT(PLAYER_ID())].SimpleInteriorBD.iBSTwo, BS_SIMPLE_INTERIOR_GLOBAL_BS_SIX_FIXER_HQ_COMPUTER_IN_USE)
g_bFHQAppOpen = FALSE
TERMINATE_THIS_THREAD()
ENDPROC
PROC SET_INPUT_EXCLUSIVE_AND_ENABLED(CONTROL_TYPE eType, CONTROL_ACTION eAction, BOOL bEnableRelatedActions = TRUE)
IF NOT IS_PAUSE_MENU_ACTIVE_EX()
SET_INPUT_EXCLUSIVE(eType, eAction)
ENABLE_CONTROL_ACTION(eType, eAction, bEnableRelatedActions)
ELSE
#IF IS_DEBUG_BUILD
IF NOT IS_BIT_SET(iBS, FAA_BS_PRINTED_PAUSE_MENU_ACTIVE)
PRINTLN("<APP_FIXER_HQ>, SET_INPUT_EXCLUSIVE_AND_ACTIVE called but IS_PAUSE_MENU_ACTIVE_EX returned true")
SET_BIT(iBS, FAA_BS_PRINTED_PAUSE_MENU_ACTIVE)
ENDIF
#ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// Returns if the overlay screen is currently active
FUNC BOOL FIXER_APP_IS_OVERLAY_OPEN()
RETURN IS_BIT_SET(iBS, FAA_BS_OVERLAY_SCREEN_ACTIVE)
ENDFUNC
/// PURPOSE:
/// Returns the current app stage
FUNC FAA_APP_STAGE_ID FIXER_APP_GET_APP_STAGE()
RETURN eCurrentStage
ENDFUNC
/// PURPOSE:
/// Sets the current app stage
PROC FIXER_APP_SET_APP_STAGE(FAA_APP_STAGE_ID eNewStage)
IF eCurrentStage != eNewStage
eCurrentStage = eNewStage
PRINTLN("<APP_FIXER_HQ> FIXER_APP_SET_APP_STAGE Setting new stage to: ", FIXER_APP_GET_APP_STAGE_DEBUG_NAME(eNewStage))
ENDIF
ENDPROC
/// PURPOSE:
/// Returns the current app stage
FUNC FAA_PAGE_INDEX FIXER_APP_GET_APP_CURRENT_PAGE()
RETURN eCurrentPage
ENDFUNC
/// PURPOSE:
/// Sets the current app page
PROC FIXER_APP_SET_APP_PAGE(FAA_PAGE_INDEX eNewPage)
IF eCurrentPage != eNewPage
eCurrentPage = eNewPage
PRINTLN("<APP_FIXER_HQ> FIXER_APP_SET_APP_PAGE Setting new stage to: ", FIXER_APP_GET_APP_PAGE_DEBUG_NAME(eNewPage))
ENDIF
IF eNewPage != FAA_PAGE_SECURITY_CONTRACT_SELECTION
CLEAR_BIT(iBS, FAA_BS_OPENED_SEC_CONTRACT_PAGE_W_ACTIVE_CD)
PRINTLN("<APP_FIXER_HQ> FIXER_APP_SET_APP_PAGE - Clear FAA_BS_OPENED_SEC_CONTRACT_PAGE_W_ACTIVE_CD")
ENDIF
ENDPROC
/// PURPOSE:
/// Checks if the specified dialogue is playing
FUNC BOOL FIXER_APP_IS_DIALOGUE_PLAYING(INT iDialogueID)
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
RETURN iDialoguePlayingID = iDialogueID
ENDIF
RETURN FALSE
ENDFUNC
PROC SET_SELECTED_DATA_LEAK_STRAND_MISSION(INT iMission)
#IF IS_DEBUG_BUILD
IF iMission != iSelectedDataLeakInStrand
PRINTLN("<APP_FIXER_HQ> SET_SELECTED_DATA_LEAK_STRAND_MISSION - New selected leak mission: ", iSelectedDataLeakInStrand)
ENDIF
#ENDIF
iSelectedDataLeakInStrand = iMission
ENDPROC
PROC SET_SELECTED_DATA_LEAK_STRAND(FIXER_STRANDS eNewStrand)
#IF IS_DEBUG_BUILD
IF eNewStrand != eSelectedDataLeakStrand
PRINTLN("<APP_FIXER_HQ> SET_SELECTED_DATA_LEAK_STRAND - New selected strand: ", eSelectedDataLeakStrand)
ENDIF
#ENDIF
eSelectedDataLeakStrand = eNewStrand
ENDPROC
PROC UPDATE_CURRENTLY_DISPLAYED_STRAND(FIXER_STRANDS eStrand)
eCurrentlyDisplayedStrand = eStrand
PRINTLN("<APP_FIXER_HQ> UPDATE_CURRENTLY_DISPLAYED_STRAND - Strand: ", eCurrentlyDisplayedStrand)
ENDPROC
PROC SET_DISPLAYING_LEAK_OVERVIEW(BOOL bDisplaying)
IF bDisplaying
SET_BIT(iBS, FAA_BS_DISPLAYING_LEAK_OVERVIEW)
ELSE
CLEAR_BIT(iBS, FAA_BS_DISPLAYING_LEAK_OVERVIEW)
ENDIF
PRINTLN("<APP_FIXER_HQ> SET_DISPLAYING_LEAK_OVERVIEW - bDisplaying: ", bDisplaying)
ENDPROC
PROC CLEAR_REPLAY_MISSION_PREPARED_FLAGS()
CLEAR_BIT(iBS, FAA_BS_INTRO_MISSION_LAUNCH_PREPARED)
CLEAR_BIT(iBS, FAA_BS_SETUP_MISSION_LAUNCH_PREPARED)
PRINTLN("<APP_FIXER_HQ> CLEAR_REPLAY_MISSION_PREPARED_FLAGS - flags cleared")
ENDPROC
PROC SET_REPLAY_INTRO_MISSION_PREPARED_FLAG()
CLEAR_REPLAY_MISSION_PREPARED_FLAGS()
SET_BIT(iBS, FAA_BS_INTRO_MISSION_LAUNCH_PREPARED)
PRINTLN("<APP_FIXER_HQ> SET_REPLAY_INTRO_MISSION_PREPARED_FLAG - flag set")
ENDPROC
PROC SET_REPLAY_SETUP_MISSION_PREPARED_FLAG()
CLEAR_REPLAY_MISSION_PREPARED_FLAGS()
SET_BIT(iBS, FAA_BS_SETUP_MISSION_LAUNCH_PREPARED)
PRINTLN("<APP_FIXER_HQ> SET_REPLAY_SETUP_MISSION_PREPARED_FLAG - flag set")
ENDPROC
//***********Mission information lookups***********
FUNC STRING GET_INTRO_MISSION_TITLE()
RETURN "FIX_APP_DATA_R1_T"
ENDFUNC
FUNC STRING GET_INTRO_MISSION_DESCRIPTION()
RETURN "FIX_APP_DATA_R1_D"
ENDFUNC
FUNC STRING GET_INTRO_MISSION_TEXTURE()
RETURN "MISSION_ON_COURSE"
ENDFUNC
FUNC STRING GET_SETUP_MISSION_TITLE()
RETURN "FIX_APP_DATA_R2_T"
ENDFUNC
FUNC STRING GET_SETUP_MISSION_DESCRIPTION()
RETURN "FIX_APP_DATA_R2_D"
ENDFUNC
FUNC STRING GET_SETUP_MISSION_TEXTURE()
RETURN "SETUP_DATA_RECOVERY"
ENDFUNC
FUNC STRING GET_SECURITY_CONTRACT_TITLE(FIXER_SECURITY_CONTRACTS fixerSecurityContracts)
SWITCH fixerSecurityContracts
CASE FSC_PACKAGE_RECOVERY RETURN "FXR_STSTART_RP" BREAK
CASE FSC_VEHICLE_RECOVERY RETURN "FXR_STSTART_RV" BREAK
CASE FSC_ASSAULT RETURN "FXR_STSTART_AS" BREAK
CASE FSC_RESCUE RETURN "FXR_STSTART_RE" BREAK
CASE FSC_PROTECT RETURN "FXR_STSTART_PR" BREAK
CASE FSC_TAIL_AND_DESTROY RETURN "FXR_STSTART_TD" BREAK
ENDSWITCH
RETURN ""
ENDFUNC
FUNC STRING GET_SECURITY_CONTRACT_DESCRIPTION(FIXER_SECURITY_CONTRACTS fixerSecurityContracts)
SWITCH fixerSecurityContracts
CASE FSC_PACKAGE_RECOVERY RETURN "FXR_STSTART_RP_D" BREAK
CASE FSC_VEHICLE_RECOVERY RETURN "FXR_STSTART_RV_D" BREAK
CASE FSC_ASSAULT RETURN "FXR_STSTART_AS_D" BREAK
CASE FSC_RESCUE RETURN "FXR_STSTART_RE_D" BREAK
CASE FSC_PROTECT RETURN "FXR_STSTART_PR_D" BREAK
CASE FSC_TAIL_AND_DESTROY RETURN "FXR_STSTART_TD_D" BREAK
ENDSWITCH
RETURN ""
ENDFUNC
FUNC STRING GET_SECURITY_CONTRACT_KEY_STAT_LABEL(FIXER_SECURITY_CONTRACTS fixerSecurityContracts)
SWITCH fixerSecurityContracts
CASE FSC_PACKAGE_RECOVERY RETURN "FIX_A_STAT_VAR" BREAK
CASE FSC_VEHICLE_RECOVERY RETURN "FIX_A_STAT_VHR" BREAK
CASE FSC_ASSAULT RETURN "FIX_A_STAT_GE" BREAK
CASE FSC_RESCUE RETURN "FIX_A_STAT_VIP" BREAK
CASE FSC_PROTECT RETURN "FIX_A_STAT_AP" BREAK
CASE FSC_TAIL_AND_DESTROY RETURN "FIX_A_STAT_AD" BREAK
ENDSWITCH
RETURN ""
ENDFUNC
FUNC SECURITY_CONTRACT_DIFFICULTY GET_SECURITY_CONTRACT_DIFFICULTY(INT iSlot)
SWITCH GET_PLAYER_FIXER_SECURITY_CONTRACT_DIFFICULTY(PLAYER_ID(), iSlot)
CASE FSCD_DEFAULT RETURN SCD_NORMAL BREAK
CASE FSCD_HARD RETURN SCD_HARD BREAK
CASE FSCD_HARD_WITH_RIVALS RETURN SCD_VS BREAK
ENDSWITCH
RETURN SCD_NORMAL
ENDFUNC
FUNC BOOL FIXER_APP_IS_DATA_LEAK_LOCKED(FIXER_STRANDS eStrandChecked)
IF GET_LOCAL_PLAYER_CURRENT_FIXER_STRAND(TRUE) = FS_NONE
RETURN FALSE
ENDIF
IF GET_LOCAL_PLAYER_CURRENT_FIXER_STRAND(TRUE) != eStrandChecked
SWITCH eStrandChecked
CASE FS_PARTY_PROMOTER RETURN NOT HAS_LOCAL_PLAYER_COMPLETED_FIXER_STORY_MISSION(FSM_PARTY_PROMOTER_MISSION) BREAK
CASE FS_BILLIONAIRE_GAMES RETURN NOT HAS_LOCAL_PLAYER_COMPLETED_FIXER_STORY_MISSION(FSM_BILLIONAIRE_GAMES_MISSION) BREAK
CASE FS_HOOD_PASS RETURN NOT HAS_LOCAL_PLAYER_COMPLETED_FIXER_STORY_MISSION(FSM_HOOD_PASS_MISSION) BREAK
ENDSWITCH
ENDIF
RETURN FALSE
ENDFUNC
FUNC STRING GET_STRAND_INVESTIGATION_MISSION_TITLE(FIXER_STRANDS eStrand, INT iMission)
SWITCH eStrand
CASE FS_PARTY_PROMOTER
SWITCH iMission
CASE 0 RETURN "FIX_APP_DATA_L1_T1" BREAK
CASE 1 RETURN "FIX_APP_DATA_L1_T2" BREAK
CASE 2 RETURN "FIX_APP_DATA_L1_T3" BREAK
ENDSWITCH
BREAK
CASE FS_BILLIONAIRE_GAMES
SWITCH iMission
CASE 0 RETURN "FIX_APP_DATA_L2_T1" BREAK
CASE 1 RETURN "FIX_APP_DATA_L2_T2" BREAK
CASE 2 RETURN "FIX_APP_DATA_L2_T3" BREAK
ENDSWITCH
BREAK
CASE FS_HOOD_PASS
SWITCH iMission
CASE 0 RETURN "FIX_APP_DATA_L3_T1" BREAK
CASE 1 RETURN "FIX_APP_DATA_L3_T2" BREAK
CASE 2 RETURN "FIX_APP_DATA_L3_T3" BREAK
ENDSWITCH
BREAK
ENDSWITCH
RETURN "UNKNOWN"
ENDFUNC
FUNC STRING GET_STRAND_INVESTIGATION_MISSION_TEXTURE(FIXER_STRANDS eStrand, INT iMission)
SWITCH eStrand
CASE FS_PARTY_PROMOTER
SWITCH iMission
CASE 0 RETURN "DATA_LEAK_1_NIGHTCLUB" BREAK
CASE 1 RETURN "DATA_LEAK_1_MARINA" BREAK
CASE 2 RETURN "MISSION_VINEWOOD" BREAK
ENDSWITCH
BREAK
CASE FS_BILLIONAIRE_GAMES
SWITCH iMission
CASE 0 RETURN "DATA_LEAK_2_COUNTRY" BREAK
CASE 1 RETURN "DATA_LEAK_2_GUEST_LIST" BREAK
CASE 2 RETURN "MISSION_RICHMAN_LEAK" BREAK
ENDSWITCH
BREAK
CASE FS_HOOD_PASS
SWITCH iMission
CASE 0 RETURN "DATA_LEAK_3_DAVIS" BREAK
CASE 1 RETURN "DATA_LEAK_3_BALLAS" BREAK
CASE 2 RETURN "MISSION_SOUTH_CENTRAL" BREAK
ENDSWITCH
BREAK
ENDSWITCH
RETURN "UNKNOWN"
ENDFUNC
FUNC STRING GET_STRAND_OVERVIEW_DESCRIPTION(FIXER_STRANDS eStrand)
SWITCH eStrand
CASE FS_PARTY_PROMOTER RETURN "FIX_APP_DL1_D_B" BREAK
CASE FS_BILLIONAIRE_GAMES RETURN "FIX_APP_DL2_D_B" BREAK
CASE FS_HOOD_PASS RETURN "FIX_APP_DL3_D_B" BREAK
ENDSWITCH
RETURN ""
ENDFUNC
FUNC STRING GET_STRAND_INVESTIGATION_MISSION_DESCRIPTION(FIXER_STRANDS eStrand, INT iMission)
SWITCH eStrand
CASE FS_PARTY_PROMOTER
SWITCH iMission
CASE 0 RETURN "FIX_APP_DATA_L1_D1" BREAK
CASE 1 RETURN "FIX_APP_DATA_L1_D2" BREAK
CASE 2 RETURN "FIX_APP_DATA_L1_D3" BREAK
ENDSWITCH
BREAK
CASE FS_BILLIONAIRE_GAMES
SWITCH iMission
CASE 0 RETURN "FIX_APP_DATA_L2_D1" BREAK
CASE 1 RETURN "FIX_APP_DATA_L2_D2" BREAK
CASE 2 RETURN "FIX_APP_DATA_L2_D3" BREAK
ENDSWITCH
BREAK
CASE FS_HOOD_PASS
SWITCH iMission
CASE 0 RETURN "FIX_APP_DATA_L3_D1" BREAK
CASE 1 RETURN "FIX_APP_DATA_L3_D2" BREAK
CASE 2 RETURN "FIX_APP_DATA_L3_D3" BREAK
ENDSWITCH
BREAK
ENDSWITCH
RETURN "UNKNOWN"
ENDFUNC
/// PURPOSE:
/// Returns the lable to be used for a given mission in a strand to indicate the objective e.g. Investigated
FUNC STRING GET_STRAND_INVESTIGATION_OBJECTIVE(FIXER_STRANDS eStrand, INT iMission)
SWITCH eStrand
CASE FS_PARTY_PROMOTER
SWITCH iMission
CASE 0 RETURN "FIX_APP_INVEST" BREAK
CASE 1 RETURN "FIX_APP_INVEST" BREAK
CASE 2 RETURN "FIX_APP_RECOVR" BREAK
ENDSWITCH
BREAK
CASE FS_BILLIONAIRE_GAMES
SWITCH iMission
CASE 0 RETURN "FIX_APP_INVEST" BREAK
CASE 1 RETURN "FIX_APP_INVEST" BREAK
CASE 2 RETURN "FIX_APP_RECOVR" BREAK
ENDSWITCH
BREAK
CASE FS_HOOD_PASS
SWITCH iMission
CASE 0 RETURN "FIX_APP_INVEST" BREAK
CASE 1 RETURN "FIX_APP_INVEST" BREAK
CASE 2 RETURN "FIX_APP_RECOVR" BREAK
ENDSWITCH
BREAK
ENDSWITCH
RETURN "UNKNOWN"
ENDFUNC
FUNC STRING GET_STRAND_SELECTION_PROMPT_MESSAGE(FIXER_STRANDS eStrand)
SWITCH eStrand
CASE FS_PARTY_PROMOTER RETURN "FIX_APP_DL1_D" BREAK
CASE FS_BILLIONAIRE_GAMES RETURN "FIX_APP_DL2_D" BREAK
CASE FS_HOOD_PASS RETURN "FIX_APP_DL3_D" BREAK
ENDSWITCH
RETURN ""
ENDFUNC
FUNC STRING GET_STRAND_SELECTION_PROMPT_TITLE(FIXER_STRANDS eStrand)
SWITCH eStrand
CASE FS_PARTY_PROMOTER RETURN "FIX_APP_DL1_T" BREAK
CASE FS_BILLIONAIRE_GAMES RETURN "FIX_APP_DL2_T" BREAK
CASE FS_HOOD_PASS RETURN "FIX_APP_DL3_T" BREAK
ENDSWITCH
RETURN ""
ENDFUNC
FUNC BOOL IS_STRAND_INVESTIGATION_MISSION_LOCKED(FIXER_STRANDS eStrand, INT iMission)
SWITCH eStrand
CASE FS_PARTY_PROMOTER
SWITCH iMission
CASE 0 RETURN FALSE BREAK
CASE 1
IF HAS_LOCAL_PLAYER_COMPLETED_FIXER_STORY_MISSION(FSM_PARTY_PROMOTER_INVESTIGATION_1)
AND g_eFixerDisableMissionLaunchReason != FMLDR_PP1_COMPLETED_TEXT
AND g_eFixerDisableMissionLaunchReason != FMLDR_PP2_UNLOCKED_CALL
RETURN FALSE
ENDIF
BREAK
CASE 2
IF HAS_LOCAL_PLAYER_COMPLETED_FIXER_STORY_MISSION(FSM_PARTY_PROMOTER_INVESTIGATION_2)
AND g_eFixerDisableMissionLaunchReason != FMLDR_PP2_COMPLETED_TEXT
AND g_eFixerDisableMissionLaunchReason != FMLDR_PPF_UNLOCKED_CALL
RETURN FALSE
ENDIF
BREAK
ENDSWITCH
BREAK
CASE FS_BILLIONAIRE_GAMES
SWITCH iMission
CASE 0 RETURN FALSE BREAK
CASE 1
IF HAS_LOCAL_PLAYER_COMPLETED_FIXER_STORY_MISSION(FSM_BILLIONAIRE_GAMES_INVESTIGATION_1)
AND g_eFixerDisableMissionLaunchReason != FMLDR_BG1_COMPLETED_TEXT
AND g_eFixerDisableMissionLaunchReason != FMLDR_BG2_UNLOCKED_CALL
RETURN FALSE
ENDIF
BREAK
CASE 2
IF HAS_LOCAL_PLAYER_COMPLETED_FIXER_STORY_MISSION(FSM_BILLIONAIRE_GAMES_INVESTIGATION_2)
AND g_eFixerDisableMissionLaunchReason != FMLDR_BG2_COMPLETED_TEXT
AND g_eFixerDisableMissionLaunchReason != FMLDR_BGF_UNLOCKED_CALL
RETURN FALSE
ENDIF
BREAK
ENDSWITCH
BREAK
CASE FS_HOOD_PASS
SWITCH iMission
CASE 0 RETURN FALSE BREAK
CASE 1
IF HAS_LOCAL_PLAYER_COMPLETED_FIXER_STORY_MISSION(FSM_HOOD_PASS_INVESTIGATION_1)
AND g_eFixerDisableMissionLaunchReason != FMLDR_HP1_COMPLETED_TEXT
AND g_eFixerDisableMissionLaunchReason != FMLDR_HP2_UNLOCKED_CALL
RETURN FALSE
ENDIF
BREAK
CASE 2
IF HAS_LOCAL_PLAYER_COMPLETED_FIXER_STORY_MISSION(FSM_HOOD_PASS_INVESTIGATION_2)
AND g_eFixerDisableMissionLaunchReason != FMLDR_HP2_COMPLETED_TEXT
AND g_eFixerDisableMissionLaunchReason != FMLDR_HPF_UNLOCKED_CALL
RETURN FALSE
ENDIF
BREAK
ENDSWITCH
BREAK
ENDSWITCH
RETURN TRUE
ENDFUNC
FUNC BOOL IS_STRAND_INVESTIGATION_MISSION_COMPLETE(FIXER_STRANDS eStrand, INT iMission)
SWITCH eStrand
CASE FS_PARTY_PROMOTER
SWITCH iMission
CASE 0 RETURN HAS_LOCAL_PLAYER_COMPLETED_FIXER_STORY_MISSION(FSM_PARTY_PROMOTER_INVESTIGATION_1) BREAK
CASE 1 RETURN HAS_LOCAL_PLAYER_COMPLETED_FIXER_STORY_MISSION(FSM_PARTY_PROMOTER_INVESTIGATION_2) BREAK
CASE 2 RETURN HAS_LOCAL_PLAYER_COMPLETED_FIXER_STORY_MISSION(FSM_PARTY_PROMOTER_MISSION) BREAK
ENDSWITCH
BREAK
CASE FS_BILLIONAIRE_GAMES
SWITCH iMission
CASE 0 RETURN HAS_LOCAL_PLAYER_COMPLETED_FIXER_STORY_MISSION(FSM_BILLIONAIRE_GAMES_INVESTIGATION_1) BREAK
CASE 1 RETURN HAS_LOCAL_PLAYER_COMPLETED_FIXER_STORY_MISSION(FSM_BILLIONAIRE_GAMES_INVESTIGATION_2) BREAK
CASE 2 RETURN HAS_LOCAL_PLAYER_COMPLETED_FIXER_STORY_MISSION(FSM_BILLIONAIRE_GAMES_MISSION) BREAK
ENDSWITCH
BREAK
CASE FS_HOOD_PASS
SWITCH iMission
CASE 0 RETURN HAS_LOCAL_PLAYER_COMPLETED_FIXER_STORY_MISSION(FSM_HOOD_PASS_INVESTIGATION_1) BREAK
CASE 1 RETURN HAS_LOCAL_PLAYER_COMPLETED_FIXER_STORY_MISSION(FSM_HOOD_PASS_INVESTIGATION_2) BREAK
CASE 2 RETURN HAS_LOCAL_PLAYER_COMPLETED_FIXER_STORY_MISSION(FSM_HOOD_PASS_MISSION) BREAK
ENDSWITCH
BREAK
ENDSWITCH
RETURN FALSE
ENDFUNC
FUNC INT GET_DATA_LEAK_COPIES_FOUND()
INT i = 0
i += BOOL_TO_INT(HAS_PLAYER_COMPLETED_FIXER_STORY_MISSION(PLAYER_ID(), FSM_BILLIONAIRE_GAMES_MISSION))
i += BOOL_TO_INT(HAS_PLAYER_COMPLETED_FIXER_STORY_MISSION(PLAYER_ID(), FSM_HOOD_PASS_MISSION))
i += BOOL_TO_INT(HAS_PLAYER_COMPLETED_FIXER_STORY_MISSION(PLAYER_ID(), FSM_PARTY_PROMOTER_MISSION))
RETURN i
ENDFUNC
//***********Scaleform wrappers***********
PROC SHOW_LOGIN_SCREEN()
FIXER_APP_SET_APP_PAGE(FAA_PAGE_LOGIN)
BEGIN_SCALEFORM_MOVIE_METHOD(mov, "SHOW_LOGIN_SCREEN")
SCALEFORM_MOVIE_METHOD_ADD_PARAM_LITERAL_STRING(GET_PLAYER_NAME(PLAYER_ID()))
END_SCALEFORM_MOVIE_METHOD()
ENDPROC
FUNC BOOL HAS_PLAYER_STARTED_A_STRAND_OR_COMPLETED_FIXER_STORY()
IF HAS_LOCAL_PLAYER_COMPLETED_FIXER_INTRO_MISSION()
AND HAS_LOCAL_PLAYER_COMPLETED_FIXER_SETUP_MISSION()
IF g_eFixerDisableMissionLaunchReason = FMLDR_POST_SETUP_MISSION_CALL
RETURN FALSE
ENDIF
IF GET_LOCAL_PLAYER_CURRENT_FIXER_STRAND(TRUE) != FS_NONE
RETURN TRUE
ENDIF
ENDIF
IF HAS_PLAYER_COMPLETED_FIXER_STORY_AS_LEADER(PLAYER_ID())
RETURN TRUE
ENDIF
IF HAS_LOCAL_PLAYER_COMPLETED_FIXER_STORY_MISSION(FSM_PARTY_PROMOTER_MISSION)
OR HAS_LOCAL_PLAYER_COMPLETED_FIXER_STORY_MISSION(FSM_BILLIONAIRE_GAMES_MISSION)
OR HAS_LOCAL_PLAYER_COMPLETED_FIXER_STORY_MISSION(FSM_HOOD_PASS_MISSION)
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL DOES_PLAYER_NEED_TO_MEET_FRANKLIN_AT_GOLF_COURSE()
IF HAS_LOCAL_PLAYER_UNLOCKED_FIXER_STORY()
AND NOT HAS_LOCAL_PLAYER_COMPLETED_FIXER_INTRO_MISSION()
RETURN IS_BIT_SET(g_sFixerFlow.Bitset2, ciFIXER_FLOW_BITSET2__FRANKLIN_GOLF_COURSE_CALL_DONE)
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL DOES_PLAYER_NEED_TO_MEET_IMANI_AFTER_INTRO()
IF HAS_LOCAL_PLAYER_UNLOCKED_FIXER_STORY()
AND HAS_LOCAL_PLAYER_COMPLETED_FIXER_INTRO_MISSION()
RETURN NOT HAS_LOCAL_PLAYER_VIEWED_FIXER_HQ_POST_SETUP_CUTSCENE()
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL DOES_PLAYER_NEED_TO_WAIT_FOR_IMANI_TO_ANALYSE_FIB_DATA()
IF HAS_LOCAL_PLAYER_COMPLETED_FIXER_SETUP_MISSION()
AND NOT HAS_PLAYER_STARTED_FIXER_STORY_INVESTIGATIONS(PLAYER_ID())
RETURN NOT IS_BIT_SET(g_sFixerFlow.Bitset2, ciFIXER_FLOW_BITSET2__INVESTIGATIONS_CALL_DONE)
ENDIF
RETURN FALSE
ENDFUNC
FUNC STRING FIXER_APP_GET_VIP_BUTTON_LOCKED_REASON(BOOL &bContractLocked)
STRING sLockedVipLabel
bContractLocked = FALSE
IF IS_FIXER_STORY_ON_COOLDOWN(TRUE)
sLockedVipLabel = "FIX_VIP_LOCK3"
bContractLocked = TRUE
ELIF NOT HAS_PLAYER_STARTED_A_STRAND_OR_COMPLETED_FIXER_STORY()
IF DOES_PLAYER_NEED_TO_MEET_FRANKLIN_AT_GOLF_COURSE()
sLockedVipLabel = "FIX_VIP_LOCK"
bContractLocked = TRUE
ELIF DOES_PLAYER_NEED_TO_MEET_IMANI_AFTER_INTRO()
sLockedVipLabel = "FIX_VIP_LOCK1"
bContractLocked = TRUE
ELIF NOT HAS_LOCAL_PLAYER_UNLOCKED_FIXER_STORY()
OR NOT HAS_LOCAL_PLAYER_COMPLETED_FIXER_INTRO_MISSION()
sLockedVipLabel = "FIX_VIP_INTRO"
bContractLocked = TRUE
ELIF DOES_PLAYER_NEED_TO_WAIT_FOR_IMANI_TO_ANALYSE_FIB_DATA()
sLockedVipLabel = "FIX_VIP_LOCK2"
bContractLocked = TRUE
ENDIF
ENDIF
RETURN sLockedVipLabel
ENDFUNC
PROC SHOW_HOME_SCREEN()
FIXER_APP_SET_APP_PAGE(FAA_PAGE_HOME)
FIXER_APP_SET_APP_STAGE(FAA_STAGE_IDLE)
BOOL bvipContractLocked
STRING sLockedVipLabel = FIXER_APP_GET_VIP_BUTTON_LOCKED_REASON(bvipContractLocked)
BEGIN_SCALEFORM_MOVIE_METHOD(mov, "SHOW_HOME_SCREEN")
//Security Contract title
SCALEFORM_MOVIE_METHOD_ADD_PARAM_STRING("FIX_APP_SECU_T")
//Vip Contract title
SCALEFORM_MOVIE_METHOD_ADD_PARAM_STRING("FIX_APP_VIP_T")
//VIP Contract Locked
SCALEFORM_MOVIE_METHOD_ADD_PARAM_BOOL(bvipContractLocked)
//VIP contract locked messaging
IF bvipContractLocked
SCALEFORM_MOVIE_METHOD_ADD_PARAM_STRING(sLockedVipLabel)
ELSE
SCALEFORM_MOVIE_METHOD_ADD_PARAM_STRING("")
ENDIF
END_SCALEFORM_MOVIE_METHOD()
ENDPROC
PROC SCALEFORM_MOVIE_METHOD_ADD_PARAM_ENUM(ENUM_TO_INT enumValue)
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(ENUM_TO_INT(enumValue))
ENDPROC
PROC MOVE_CURSOR_TO_BUTTON(FAA_BUTTON_INDEXES eButton)
BEGIN_SCALEFORM_MOVIE_METHOD(mov, "SET_CURRENT_SELECTION")
SCALEFORM_MOVIE_METHOD_ADD_PARAM_ENUM(eButton)
END_SCALEFORM_MOVIE_METHOD()
ENDPROC
PROC SHOW_SPEAKER_ICON(BOOL bShow)
BEGIN_SCALEFORM_MOVIE_METHOD(mov, "SHOW_SPEAKER")
SCALEFORM_MOVIE_METHOD_ADD_PARAM_BOOL(bShow)
END_SCALEFORM_MOVIE_METHOD()
ENDPROC
/// PURPOSE:
/// Updates the security contract selection screen with the top stat information. UPDATE_SECURITY_CONTRACT_SCREEN should be called immediately after SHOW_SECURITY_CONTRACT_SCREEN to populate the top stat.
PROC UPDATE_SECURITY_CONTRACTS_SELECTION_SCREEN_STATS(BOOL bTopStatVisible = FALSE, INT iSelectedContract = 0)
FIXER_SECURITY_CONTRACTS fixerSecurityContract = GET_PLAYER_FIXER_SECURITY_CONTRACT_IN_SLOT(PLAYER_ID(), iSelectedContract)
STRING sStatOneLabel = GET_SECURITY_CONTRACT_KEY_STAT_LABEL(fixerSecurityContract)
INT iStatOneValue = GET_LOCAL_PLAYER_NUM_COMPLETIONS_OF_FIXER_SECURITY_CONTRACT(fixerSecurityContract)
BOOL bStatOneVisible = bTopStatVisible
STRING sStatTwoLabel = "FAPP_CONTRACTS_COMPLETE"
INT iStatTwoValue = GET_LOCAL_PLAYER_NUM_FIXER_SECURITY_CONTRACTS_COMPLETED()
BOOL bStatTwoVisible = TRUE
STRING sStatThreeLabel = "FAPP_EARNINGS"
INT iStatThreeValue = GET_PLAYER_TOTAL_FIXER_SECURITY_CONTRACT_EARNINGS(PLAYER_ID())
BOOL bStatThreeVisible = TRUE
BEGIN_SCALEFORM_MOVIE_METHOD(mov, "UPDATE_SECURITY_CONTRACT_SELECTION_SCREEN")
SCALEFORM_MOVIE_METHOD_ADD_PARAM_STRING(sStatOneLabel)
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(iStatOneValue)
SCALEFORM_MOVIE_METHOD_ADD_PARAM_BOOL(bStatOneVisible)
SCALEFORM_MOVIE_METHOD_ADD_PARAM_STRING(sStatTwoLabel)
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(iStatTwoValue)
SCALEFORM_MOVIE_METHOD_ADD_PARAM_BOOL(bStatTwoVisible)
SCALEFORM_MOVIE_METHOD_ADD_PARAM_STRING(sStatThreeLabel)
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(iStatThreeValue)
SCALEFORM_MOVIE_METHOD_ADD_PARAM_BOOL(bStatThreeVisible)
END_SCALEFORM_MOVIE_METHOD()
ENDPROC
/// PURPOSE:
/// Shows the security contract selection screen. UPDATE_SECURITY_CONTRACT_SCREEN should be called immediately after SHOW_SECURITY_CONTRACT_SCREEN to populate the top stat.
PROC SHOW_SECURITY_CONTRACTS_SELECTION_SCREEN()
FIXER_APP_SET_APP_PAGE(FAA_PAGE_SECURITY_CONTRACT_SELECTION)
INT iSecContractsCompleted = GET_LOCAL_PLAYER_NUM_FIXER_SECURITY_CONTRACTS_COMPLETED()
INT iSecContractsEarnings = GET_PLAYER_TOTAL_FIXER_SECURITY_CONTRACT_EARNINGS(PLAYER_ID())
INT ivaluablesRecovered = GET_PLAYER_NUM_COMPLETIONS_OF_FIXER_SECURITY_CONTRACT(PLAYER_ID(), FSC_PACKAGE_RECOVERY)
BOOL bVipContractLocked = FALSE
STRING sLockedVipLabel = FIXER_APP_GET_VIP_BUTTON_LOCKED_REASON(bvipContractLocked)
//Security contract one
FIXER_SECURITY_CONTRACTS fixerSecurityContracts = GET_PLAYER_FIXER_SECURITY_CONTRACT_IN_SLOT(PLAYER_ID(), 0)
STRING sContractOneTitle = GET_SECURITY_CONTRACT_TITLE(fixerSecurityContracts)
STRING sContractOneDesc = GET_SECURITY_CONTRACT_DESCRIPTION(fixerSecurityContracts)
STRING sContractOneTexture = "SEC_VIP_LANDING_IMAGE"
INT iContractOnePayment = GET_FIXER_SECURITY_CONTRACT_REWARD(0)
SECURITY_CONTRACT_DIFFICULTY eContractOneDifficulty = GET_SECURITY_CONTRACT_DIFFICULTY(0)
//Security contract two
fixerSecurityContracts = GET_PLAYER_FIXER_SECURITY_CONTRACT_IN_SLOT(PLAYER_ID(), 1)
STRING sContractTwoTitle = GET_SECURITY_CONTRACT_TITLE(fixerSecurityContracts)
STRING sContractTwoDesc = GET_SECURITY_CONTRACT_DESCRIPTION(fixerSecurityContracts)
STRING sContractTwoTexture = "SEC_VIP_LANDING_IMAGE"
INT iContractTwoPayment = GET_FIXER_SECURITY_CONTRACT_REWARD(1)
SECURITY_CONTRACT_DIFFICULTY eContractTwodifficulty = GET_SECURITY_CONTRACT_DIFFICULTY(1)
//Security Contract three
fixerSecurityContracts = GET_PLAYER_FIXER_SECURITY_CONTRACT_IN_SLOT(PLAYER_ID(), 2)
STRING sContractThreeTitle = GET_SECURITY_CONTRACT_TITLE(fixerSecurityContracts)
STRING sContractThreeDesc = GET_SECURITY_CONTRACT_DESCRIPTION(fixerSecurityContracts)
STRING sContractThreeTexture = "SEC_VIP_LANDING_IMAGE"
INT iContractThreePayment = GET_FIXER_SECURITY_CONTRACT_REWARD(2)
SECURITY_CONTRACT_DIFFICULTY eContractThreeDifficulty = GET_SECURITY_CONTRACT_DIFFICULTY(2)
UNUSED_PARAMETER(sLockedVipLabel)
BEGIN_SCALEFORM_MOVIE_METHOD(mov, "SHOW_SECURITY_CONTRACT_SELECTION_SCREEN")
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(iSecContractsCompleted)
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(iSecContractsEarnings)
//Security contract one
SCALEFORM_MOVIE_METHOD_ADD_PARAM_STRING(sContractOneTitle)
SCALEFORM_MOVIE_METHOD_ADD_PARAM_STRING(sContractOneDesc)
SCALEFORM_MOVIE_METHOD_ADD_PARAM_ENUM(eContractOneDifficulty)
SCALEFORM_MOVIE_METHOD_ADD_PARAM_LITERAL_STRING(sContractOneTexture)
//Security contract two
SCALEFORM_MOVIE_METHOD_ADD_PARAM_STRING(sContractTwoTitle)
SCALEFORM_MOVIE_METHOD_ADD_PARAM_STRING(sContractTwoDesc)
SCALEFORM_MOVIE_METHOD_ADD_PARAM_ENUM(eContractTwodifficulty)
SCALEFORM_MOVIE_METHOD_ADD_PARAM_LITERAL_STRING(sContractTwoTexture)
//Security contract three
SCALEFORM_MOVIE_METHOD_ADD_PARAM_STRING(sContractThreeTitle)
SCALEFORM_MOVIE_METHOD_ADD_PARAM_STRING(sContractThreeDesc)
SCALEFORM_MOVIE_METHOD_ADD_PARAM_ENUM(eContractThreeDifficulty)
SCALEFORM_MOVIE_METHOD_ADD_PARAM_LITERAL_STRING(sContractThreeTexture)
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(ivaluablesRecovered)
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(iContractOnePayment)
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(iContractTwoPayment)
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(iContractThreePayment)
SCALEFORM_MOVIE_METHOD_ADD_PARAM_BOOL(bVipContractLocked)
END_SCALEFORM_MOVIE_METHOD()
UPDATE_SECURITY_CONTRACTS_SELECTION_SCREEN_STATS()
ENDPROC
/// PURPOSE:
/// Toggles the button functionality between the menu items on the left and the tabs on the right. Automatically moves the cursor to the first unlocked item and highlights it.
PROC SET_MISSION_SCREEN_TABS_ENABLED(BOOL bEnabled)
BEGIN_SCALEFORM_MOVIE_METHOD(mov, "ENABLE_TABS")
SCALEFORM_MOVIE_METHOD_ADD_PARAM_BOOL(bEnabled)
END_SCALEFORM_MOVIE_METHOD()
ENDPROC
/// PURPOSE:
/// Updates the enabled state of start button and its text. By default the start button will start disabled and with the text "START"
PROC UPDATE_MISSION_SCREEN_START_BUTTON(STRING sButtonLabel, BOOL bEnabled)
BEGIN_SCALEFORM_MOVIE_METHOD(mov, "UPDATE_START_BUTTON")
SCALEFORM_MOVIE_METHOD_ADD_PARAM_STRING(sButtonLabel)
SCALEFORM_MOVIE_METHOD_ADD_PARAM_BOOL(bEnabled)
END_SCALEFORM_MOVIE_METHOD()
ENDPROC
PROC SETUP_START_MISSION_BUTTON_SECURITY_CONTRACTS(BOOL bEnabled)
UPDATE_MISSION_SCREEN_START_BUTTON("FIX_APP_ACC_CON", bEnabled)
ENDPROC
/// PURPOSE:
/// Update the tab information and stats. this is intended to be called when a security contract is clicked.
/// PARAMS:
/// iMission - The index of the mission selected in the menu
PROC SCALEFORM_SELECT_SECURITY_CONTRACT(INT iMission)
FIXER_APP_SET_APP_STAGE(FAA_STAGE_SEC_CONTRACT_SELECTED)
FIXER_SECURITY_CONTRACTS fixerSecurityContracts = GET_PLAYER_FIXER_SECURITY_CONTRACT_IN_SLOT(PLAYER_ID(), iMission)
STRING sTitle = GET_SECURITY_CONTRACT_TITLE(fixerSecurityContracts)
STRING sDescription = GET_SECURITY_CONTRACT_DESCRIPTION(fixerSecurityContracts)
STRING sImage = "SEC_VIP_LANDING_IMAGE"
INT iPayment = GET_FIXER_SECURITY_CONTRACT_REWARD(iMission)
SECURITY_CONTRACT_DIFFICULTY eDifficulty = GET_SECURITY_CONTRACT_DIFFICULTY(iMission)
BEGIN_SCALEFORM_MOVIE_METHOD(mov, "UPDATE_SECURITY_CONTRACT_SELECTION_TAB")
SCALEFORM_MOVIE_METHOD_ADD_PARAM_STRING(sTitle)
SCALEFORM_MOVIE_METHOD_ADD_PARAM_STRING(sDescription)
SCALEFORM_MOVIE_METHOD_ADD_PARAM_ENUM(eDifficulty)
SCALEFORM_MOVIE_METHOD_ADD_PARAM_LITERAL_STRING(sImage)
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(iPayment)
END_SCALEFORM_MOVIE_METHOD()
IF ARE_FIXER_SECURITY_CONTRACTS_ON_COOLDOWN()
PRINTLN("<APP_FIXER_HQ> SCALEFORM_SELECT_SECURITY_CONTRACT - Set FAA_BS_OPENED_SEC_CONTRACT_PAGE_W_ACTIVE_CD")
SET_BIT(iBS, FAA_BS_OPENED_SEC_CONTRACT_PAGE_W_ACTIVE_CD)
IF NOT IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("FXR_NX_SEC_WAIT")
PRINT_HELP("FXR_NX_SEC_WAIT")
ENDIF
SETUP_START_MISSION_BUTTON_SECURITY_CONTRACTS(FALSE)
ELSE
SETUP_START_MISSION_BUTTON_SECURITY_CONTRACTS(TRUE)
ENDIF
ENDPROC
PROC SF_UPDATE_TAB_DATA(STRING sTabDescription, STRING sTabImage, STRING sObjectiveFoundLabel, BOOL bShowObjective, BOOL bMissionComplete, BOOL bCheckboxVisible, STRING sStatusLabel)
BEGIN_SCALEFORM_MOVIE_METHOD(mov, "UPDATE_TAB_DATA")
SCALEFORM_MOVIE_METHOD_ADD_PARAM_STRING(sTabDescription)
SCALEFORM_MOVIE_METHOD_ADD_PARAM_LITERAL_STRING(sTabImage)
SCALEFORM_MOVIE_METHOD_ADD_PARAM_STRING(sObjectiveFoundLabel)
SCALEFORM_MOVIE_METHOD_ADD_PARAM_BOOL(bShowObjective)
SCALEFORM_MOVIE_METHOD_ADD_PARAM_BOOL(bMissionComplete)
SCALEFORM_MOVIE_METHOD_ADD_PARAM_BOOL(bCheckboxVisible)
SCALEFORM_MOVIE_METHOD_ADD_PARAM_STRING(sStatusLabel)
END_SCALEFORM_MOVIE_METHOD()
ENDPROC
/// PURPOSE:
/// Updates the description, images, the copy found label, and the copy found tick mark. This should be called when a tab is selected.
PROC UPDATE_DATA_LEAK_TAB_DATA(FIXER_STRANDS eStrand, INT iMission, INT iOverrideForLeakOverview = -1)
STRING sTabDescription = GET_STRAND_INVESTIGATION_MISSION_DESCRIPTION(eStrand, iMission)
STRING sTabImage = GET_STRAND_INVESTIGATION_MISSION_TEXTURE(eStrand, iMission)
STRING sObjectiveFoundLabel = GET_STRAND_INVESTIGATION_OBJECTIVE(eStrand, iMission)
BOOL bObjectiveComplete = IS_STRAND_INVESTIGATION_MISSION_COMPLETE(eStrand, iMission)
STRING sStatusLabel = ""
IF iOverrideForLeakOverview != -1
sTabImage = GET_STRAND_INVESTIGATION_MISSION_TEXTURE(eStrand, iOverrideForLeakOverview)
sTabDescription = GET_STRAND_OVERVIEW_DESCRIPTION(eStrand)
ENDIF
CLEAR_REPLAY_MISSION_PREPARED_FLAGS()
SF_UPDATE_TAB_DATA(sTabDescription, sTabImage, sObjectiveFoundLabel, bObjectiveComplete, bObjectiveComplete, TRUE, sStatusLabel)
ENDPROC
PROC UPDATE_REPLAY_MISSION_TAB_DATA(FAA_BUTTON_INDEXES eButton)
//Intro mission
STRING sMissionDescription = GET_INTRO_MISSION_DESCRIPTION()
STRING sMissionTexture = GET_INTRO_MISSION_TEXTURE()
IF eButton = BUTTON_SETUP_MISSION
//Setup mission
sMissionDescription = GET_SETUP_MISSION_DESCRIPTION()
sMissionTexture = GET_SETUP_MISSION_TEXTURE()
SET_REPLAY_SETUP_MISSION_PREPARED_FLAG()
ELSE
SET_REPLAY_INTRO_MISSION_PREPARED_FLAG()
ENDIF
SF_UPDATE_TAB_DATA(sMissionDescription, sMissionTexture, "FIX_APP_INVEST", FALSE, TRUE, FALSE, "")
ENDPROC
/// PURPOSE:
/// Updates the locked state of the menu items.
PROC UPDATE_DATA_LEAK_STRAND_LOCK_STATE()
BEGIN_SCALEFORM_MOVIE_METHOD(mov, "UPDATE_MENU_LOCKED_STATES")
SCALEFORM_MOVIE_METHOD_ADD_PARAM_BOOL(FIXER_APP_IS_DATA_LEAK_LOCKED(FS_PARTY_PROMOTER))
SCALEFORM_MOVIE_METHOD_ADD_PARAM_BOOL(FIXER_APP_IS_DATA_LEAK_LOCKED(FS_BILLIONAIRE_GAMES))
SCALEFORM_MOVIE_METHOD_ADD_PARAM_BOOL(FIXER_APP_IS_DATA_LEAK_LOCKED(FS_HOOD_PASS))
END_SCALEFORM_MOVIE_METHOD()
ENDPROC
/// PURPOSE:
/// Updates the data leak screen. Updates the tabs and related data. UPDATE_DATA_LEAK_SCREEN should be called immediately after SHOW_DATA_LEAK_SCREEN to populate the tabs.
PROC UPDATE_DATA_LEAK(STRING sTabOneTitle, BOOL bTabOneLocked, BOOL bTabOneComplete, STRING sTabTwoTitle, BOOL bTabTwoLocked, BOOL bTabTwoComplete, STRING sTabThreeTitle, BOOL bTabThreeLocked, BOOL bTabThreeComplete, INT iStrandTotalPayment, INT iMissionItemsFound)
BEGIN_SCALEFORM_MOVIE_METHOD(mov, "UPDATE_DATA_LEAK_SCREEN")
//First Tab
SCALEFORM_MOVIE_METHOD_ADD_PARAM_STRING(sTabOneTitle)
SCALEFORM_MOVIE_METHOD_ADD_PARAM_BOOL(bTabOneLocked)
SCALEFORM_MOVIE_METHOD_ADD_PARAM_BOOL(bTabOneComplete)
//Second Tab
SCALEFORM_MOVIE_METHOD_ADD_PARAM_STRING(sTabTwoTitle)
SCALEFORM_MOVIE_METHOD_ADD_PARAM_BOOL(bTabTwoLocked)
SCALEFORM_MOVIE_METHOD_ADD_PARAM_BOOL(bTabTwoComplete)
//Third Tab
SCALEFORM_MOVIE_METHOD_ADD_PARAM_STRING(sTabThreeTitle)
SCALEFORM_MOVIE_METHOD_ADD_PARAM_BOOL(bTabThreeLocked)
SCALEFORM_MOVIE_METHOD_ADD_PARAM_BOOL(bTabThreeComplete)
//Strand general data
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(iStrandTotalPayment)
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(iMissionItemsFound)
END_SCALEFORM_MOVIE_METHOD()
ENDPROC
PROC UPDATE_DATA_LEAK_SCREEN_WITH_STRAND(FIXER_STRANDS eStrand)
STRING sTabOneTitle = GET_STRAND_INVESTIGATION_MISSION_TITLE(eStrand, 0)
BOOL bTabOneLocked = IS_STRAND_INVESTIGATION_MISSION_LOCKED(eStrand, 0)
BOOL bTabOneComplete = IS_STRAND_INVESTIGATION_MISSION_COMPLETE(eStrand, 0)
STRING sTabTwoTitle = GET_STRAND_INVESTIGATION_MISSION_TITLE(eStrand, 1)
BOOL bTabTwoLocked = IS_STRAND_INVESTIGATION_MISSION_LOCKED(eStrand, 1)
BOOL bTabTwoComplete = IS_STRAND_INVESTIGATION_MISSION_COMPLETE(eStrand, 1)
STRING sTabThreeTitle = GET_STRAND_INVESTIGATION_MISSION_TITLE(eStrand, 2)
BOOL bTabThreeLocked = IS_STRAND_INVESTIGATION_MISSION_LOCKED(eStrand, 2)
BOOL bTabThreeComplete = IS_STRAND_INVESTIGATION_MISSION_COMPLETE(eStrand, 2)
INT iStrandTotalPayment = GET_FIXER_FINALE_CASH_REWARD()
INT iMissionItemsFound = GET_DATA_LEAK_COPIES_FOUND()
UPDATE_DATA_LEAK(sTabOneTitle, bTabOneLocked, bTabOneComplete, sTabTwoTitle, bTabTwoLocked, bTabTwoComplete, sTabThreeTitle, bTabThreeLocked, bTabThreeComplete, iStrandTotalPayment, iMissionItemsFound)
ENDPROC
/// PURPOSE:.
/// If one is active then the next mission up will be returned
/// If there are no more missions or we are waiting for a flow call before the next mission can launch then -1 is returned
FUNC INT GET_NEXT_MISISON_IN_STRAND(FIXER_STRANDS eStrand)
IF eStrand != FS_NONE
IF IS_STRAND_INVESTIGATION_MISSION_COMPLETE(eStrand, 2)
RETURN -1
ELIF IS_STRAND_INVESTIGATION_MISSION_COMPLETE(eStrand, 1)
IF NOT IS_STRAND_INVESTIGATION_MISSION_LOCKED(eStrand, 2)
RETURN 2
ENDIF
ELIF IS_STRAND_INVESTIGATION_MISSION_COMPLETE(eStrand, 0)
IF NOT IS_STRAND_INVESTIGATION_MISSION_LOCKED(eStrand, 1)
RETURN 1
ENDIF
ELSE
RETURN 0
ENDIF
ENDIF
RETURN -1
ENDFUNC
FUNC FAA_BUTTON_INDEXES FIXER_APP_GET_BUTTON_FOR_DATA_LEAK(FIXER_STRANDS eStrand)
SWITCH eStrand
CASE FS_PARTY_PROMOTER RETURN BUTTON_DATA_LEAK_1 BREAK
CASE FS_BILLIONAIRE_GAMES RETURN BUTTON_DATA_LEAK_2 BREAK
CASE FS_HOOD_PASS RETURN BUTTON_DATA_LEAK_3 BREAK
ENDSWITCH
RETURN BUTTON_LOGIN
ENDFUNC
FUNC FIXER_STORY_MISSIONS FIXER_APP_GET_FINAL_MISSION_ID_FOR_DATA_LEAK_STRAND(FIXER_STRANDS eStrand)
SWITCH eStrand
CASE FS_PARTY_PROMOTER RETURN FSM_PARTY_PROMOTER_MISSION BREAK
CASE FS_BILLIONAIRE_GAMES RETURN FSM_BILLIONAIRE_GAMES_MISSION BREAK
CASE FS_HOOD_PASS RETURN FSM_HOOD_PASS_MISSION BREAK
ENDSWITCH
RETURN FSM_NONE
ENDFUNC
FUNC FIXER_STRANDS FIXER_APP_GET_DATA_LEAK_FROM_BUTTON(FAA_BUTTON_INDEXES eButton)
SWITCH eButton
CASE BUTTON_DATA_LEAK_1 RETURN FS_PARTY_PROMOTER BREAK
CASE BUTTON_DATA_LEAK_2 RETURN FS_BILLIONAIRE_GAMES BREAK
CASE BUTTON_DATA_LEAK_3 RETURN FS_HOOD_PASS BREAK
ENDSWITCH
RETURN FS_NONE
ENDFUNC
/// PURPOSE:
/// When on the data leak screen this will move the cursor to the appropriate mission tab
PROC MOVE_CURSOR_TO_MISSION_TAB(INT iMission)
FAA_BUTTON_INDEXES eButton
SWITCH iMission
CASE 0 eButton = BUTTON_DATA_LEAK_TAB_1 BREAK
CASE 1 eButton = BUTTON_DATA_LEAK_TAB_2 BREAK
CASE 2 eButton = BUTTON_DATA_LEAK_TAB_3 BREAK
ENDSWITCH
MOVE_CURSOR_TO_BUTTON(eButton)
ENDPROC
/// PURPOSE:
/// Sets up the data leak screen with default data
PROC SETUP_DEFAULT_MISSION_TAB_DATA()
INT iStrandTotalPayment = GET_FIXER_FINALE_CASH_REWARD()
INT iMissionItemsFound = GET_DATA_LEAK_COPIES_FOUND()
UPDATE_DATA_LEAK("", TRUE, FALSE, "", TRUE, FALSE, "", TRUE, FALSE, iStrandTotalPayment, iMissionItemsFound)
ENDPROC
/// PURPOSE:
/// Shows the data leak screen. Setups all the menu items and labels. UPDATE_DATA_LEAK_SCREEN should be called immediately after SHOW_DATA_LEAK_SCREEN to populate the tabs.
PROC SHOW_DATA_LEAK_SCREEN()
FIXER_APP_SET_APP_PAGE(FAA_PAGE_DATA_LEAK_SELECTION)
//Intro mission
STRING sIntroTitle = GET_INTRO_MISSION_TITLE()
STRING sIntroDesc = GET_INTRO_MISSION_DESCRIPTION()
STRING sIntroTexture = GET_INTRO_MISSION_TEXTURE()
//Setup mission
STRING sSetupTitle = GET_SETUP_MISSION_TITLE()
STRING sSetupDesc = GET_SETUP_MISSION_DESCRIPTION()
STRING sSetupTexture = GET_SETUP_MISSION_TEXTURE()
//Data Leak One
STRING sDataleakOneTitle = "FIX_APP_DL1_T"
STRING sDataleakOneDesc = GET_STRAND_OVERVIEW_DESCRIPTION(FS_PARTY_PROMOTER)
STRING sDataLeakOneTexture = "MISSION_VINEWOOD"
BOOL bDataLeakOneLocked = FIXER_APP_IS_DATA_LEAK_LOCKED(FS_PARTY_PROMOTER)
BOOL bDataLeakOneComplete = HAS_LOCAL_PLAYER_COMPLETED_FIXER_STORY_MISSION(FSM_PARTY_PROMOTER_MISSION)
//Data Leak Two
STRING sDataleakTwoTitle = "FIX_APP_DL2_T"
STRING sDataleakTwoDesc = GET_STRAND_OVERVIEW_DESCRIPTION(FS_BILLIONAIRE_GAMES)
STRING sDataLeakTwoTexture = "MISSION_RICHMAN_LEAK"
BOOL bDataLeakTwoLocked = FIXER_APP_IS_DATA_LEAK_LOCKED(FS_BILLIONAIRE_GAMES)
BOOL bDataLeakTwoComplete = HAS_LOCAL_PLAYER_COMPLETED_FIXER_STORY_MISSION(FSM_BILLIONAIRE_GAMES_MISSION)
//Data Leak Three
STRING sDataleakThreeTitle = "FIX_APP_DL3_T"
STRING sDataleakThreeDesc = GET_STRAND_OVERVIEW_DESCRIPTION(FS_HOOD_PASS)
STRING sDataLeakThreeTexture = "MISSION_SOUTH_CENTRAL"
BOOL bDataLeakThreeLocked = FIXER_APP_IS_DATA_LEAK_LOCKED(FS_HOOD_PASS)
BOOL bDataLeakThreeComplete = HAS_LOCAL_PLAYER_COMPLETED_FIXER_STORY_MISSION(FSM_HOOD_PASS_MISSION)
BOOL bReplayAvailable = HAS_LOCAL_PLAYER_COMPLETED_FIXER_STORY_AS_LEADER()
BEGIN_SCALEFORM_MOVIE_METHOD(mov, "SHOW_DATA_LEAK_SCREEN")
//Data leak one
SCALEFORM_MOVIE_METHOD_ADD_PARAM_STRING(sDataleakOneTitle)
SCALEFORM_MOVIE_METHOD_ADD_PARAM_STRING(sDataleakOneDesc)
SCALEFORM_MOVIE_METHOD_ADD_PARAM_BOOL(bDataLeakOneLocked)
SCALEFORM_MOVIE_METHOD_ADD_PARAM_BOOL(bDataLeakOneComplete)
SCALEFORM_MOVIE_METHOD_ADD_PARAM_LITERAL_STRING(sDataLeakOneTexture)
//Data leak two
SCALEFORM_MOVIE_METHOD_ADD_PARAM_STRING(sDataleakTwoTitle)
SCALEFORM_MOVIE_METHOD_ADD_PARAM_STRING(sDataleakTwoDesc)
SCALEFORM_MOVIE_METHOD_ADD_PARAM_BOOL(bDataLeakTwoLocked)
SCALEFORM_MOVIE_METHOD_ADD_PARAM_BOOL(bDataLeakTwoComplete)
SCALEFORM_MOVIE_METHOD_ADD_PARAM_LITERAL_STRING(sDataLeakTwoTexture)
//Data leak three
SCALEFORM_MOVIE_METHOD_ADD_PARAM_STRING(sDataleakThreeTitle)
SCALEFORM_MOVIE_METHOD_ADD_PARAM_STRING(sDataleakThreeDesc)
SCALEFORM_MOVIE_METHOD_ADD_PARAM_BOOL(bDataLeakThreeLocked)
SCALEFORM_MOVIE_METHOD_ADD_PARAM_BOOL(bDataLeakThreeComplete)
SCALEFORM_MOVIE_METHOD_ADD_PARAM_LITERAL_STRING(sDataLeakThreeTexture)
//Replay
SCALEFORM_MOVIE_METHOD_ADD_PARAM_BOOL(bReplayAvailable)
//Intro mission
SCALEFORM_MOVIE_METHOD_ADD_PARAM_STRING(sIntroTitle)
SCALEFORM_MOVIE_METHOD_ADD_PARAM_STRING(sIntroDesc)
SCALEFORM_MOVIE_METHOD_ADD_PARAM_LITERAL_STRING(sIntroTexture)
//Setup mission
SCALEFORM_MOVIE_METHOD_ADD_PARAM_STRING(sSetupTitle)
SCALEFORM_MOVIE_METHOD_ADD_PARAM_STRING(sSetupDesc)
SCALEFORM_MOVIE_METHOD_ADD_PARAM_LITERAL_STRING(sSetupTexture)
END_SCALEFORM_MOVIE_METHOD()
//should be called immediately after SHOW_DATA_LEAK_SCREEN to populate the tabs
FIXER_STRANDS eActiveStrand = GET_LOCAL_PLAYER_CURRENT_FIXER_STRAND(TRUE)
INT iActiveMission = GET_NEXT_MISISON_IN_STRAND(eActiveStrand)
//Setup the page as appropriate
SWITCH eActiveStrand
CASE FS_NONE
//Default data to have the screen display correctly
SETUP_DEFAULT_MISSION_TAB_DATA()
IF NOT HAS_LOCAL_PLAYER_COMPLETED_FIXER_STORY_MISSION(FSM_PARTY_PROMOTER_MISSION)
UPDATE_DATA_LEAK_TAB_DATA(FS_PARTY_PROMOTER, 2, 0)
UPDATE_CURRENTLY_DISPLAYED_STRAND(FS_PARTY_PROMOTER)
MOVE_CURSOR_TO_BUTTON(BUTTON_DATA_LEAK_1)
ELIF NOT HAS_LOCAL_PLAYER_COMPLETED_FIXER_STORY_MISSION(FSM_BILLIONAIRE_GAMES_MISSION)
UPDATE_DATA_LEAK_TAB_DATA(FS_BILLIONAIRE_GAMES, 2, 0)
UPDATE_CURRENTLY_DISPLAYED_STRAND(FS_BILLIONAIRE_GAMES)
MOVE_CURSOR_TO_BUTTON(BUTTON_DATA_LEAK_2)
ELSE
UPDATE_DATA_LEAK_TAB_DATA(FS_HOOD_PASS, 2, 0)
UPDATE_CURRENTLY_DISPLAYED_STRAND(FS_HOOD_PASS)
MOVE_CURSOR_TO_BUTTON(BUTTON_DATA_LEAK_3)
ENDIF
SET_DISPLAYING_LEAK_OVERVIEW(TRUE)
UPDATE_MISSION_SCREEN_START_BUTTON("FAPP_ACCEPT", FALSE)
BREAK
DEFAULT
//Set the primary screen with the current data
UPDATE_DATA_LEAK_SCREEN_WITH_STRAND(eActiveStrand)
//Enable tab selection
SET_MISSION_SCREEN_TABS_ENABLED(TRUE)
IF iActiveMission != -1
//Auto setup the mission information for the relevant mission
UPDATE_DATA_LEAK_TAB_DATA(eActiveStrand, iActiveMission)
SET_SELECTED_DATA_LEAK_STRAND_MISSION(iActiveMission)
SET_DISPLAYING_LEAK_OVERVIEW(FALSE)
UPDATE_CURRENTLY_DISPLAYED_STRAND(eActiveStrand)
MOVE_CURSOR_TO_MISSION_TAB(iActiveMission)
ELSE
//If no active or available misison then default to strand overview
UPDATE_DATA_LEAK_TAB_DATA(eActiveStrand, 2, 0)
//Default cursor placement
MOVE_CURSOR_TO_BUTTON(FIXER_APP_GET_BUTTON_FOR_DATA_LEAK(eActiveStrand))
//Keep script data up to date
SET_DISPLAYING_LEAK_OVERVIEW(TRUE)
UPDATE_CURRENTLY_DISPLAYED_STRAND(eActiveStrand)
//Disable the start button
IF IS_STRAND_INVESTIGATION_MISSION_COMPLETE(eActiveStrand, 2)
UPDATE_MISSION_SCREEN_START_BUTTON("FIX_APP_MIS_COM", FALSE)
ELSE
UPDATE_MISSION_SCREEN_START_BUTTON("FAPP_ACCEPT", FALSE)
ENDIF
ENDIF
//Set the strand to make sure we are launching from the appropriate strand
SET_SELECTED_DATA_LEAK_STRAND(eActiveStrand)
BREAK
ENDSWITCH
ENDPROC
/// PURPOSE:
/// Show the data recovery screen for launching the setup mission
PROC SHOW_DATA_RECOVERY_SCREEN()
STRING sMissionTitle = "FIX_APP_VIP_SETUP_T"
STRING sMissionDescription = "FIX_APP_VIP_SETUP_D"
STRING sMissionTexture = "SETUP_DATA_RECOVERY"
STRING sInvestigateLabel = ""
STRING sMissionStartLabel = "FAPP_ACCEPT"
INT iEarnings = 0
BOOL bComplete = FALSE //Should always be false - we will only show this screen once
BEGIN_SCALEFORM_MOVIE_METHOD(mov, "SHOW_DATA_RECOVERY_SCREEN")
SCALEFORM_MOVIE_METHOD_ADD_PARAM_STRING(sMissionTitle)
SCALEFORM_MOVIE_METHOD_ADD_PARAM_STRING(sMissionDescription)
SCALEFORM_MOVIE_METHOD_ADD_PARAM_BOOL(bComplete)
SCALEFORM_MOVIE_METHOD_ADD_PARAM_LITERAL_STRING(sMissionTexture)
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(iEarnings)
SCALEFORM_MOVIE_METHOD_ADD_PARAM_STRING(sInvestigateLabel)
SCALEFORM_MOVIE_METHOD_ADD_PARAM_STRING(sMissionStartLabel)
END_SCALEFORM_MOVIE_METHOD()
FIXER_APP_SET_APP_PAGE(FAA_PAGE_DATA_RECOVERY)
MOVE_CURSOR_TO_BUTTON(BUTTON_DATA_RECOVERY)
ENDPROC
//***********Mission Launching***********
FUNC BOOL LAUNCH_FIXER_STORY_NSTANCED_MISSION(FIXER_STORY_MISSIONS eMission)
FIXER_APP_PLAY_INPUT_SOUND(FAA_IS_LAUNCH_MISSION)
INT iArrayPos = GET_FIXER_STORY_MISSION_ARRAY_POS(eMission)
IF iArrayPos = -1
#IF IS_DEBUG_BUILD
PRINTLN("[TS][FIXER] LAUNCH_FIXER_STORY_NSTANCED_MISSION - iArrayPos = -1. Candidate args present? ", GET_STRING_FROM_BOOL(GET_COMMANDLINE_PARAM_EXISTS("sc_UseRockstarCandidateMissions")))
#ENDIF
RETURN FALSE
ENDIF
TEXT_LABEL_23 tlName = g_FMMC_ROCKSTAR_CREATED.sMissionHeaderVars[iArrayPos].tlName
INT iType = g_FMMC_ROCKSTAR_CREATED.sMissionHeaderVars[iArrayPos].iType
INT iMaxPlayers = g_FMMC_ROCKSTAR_CREATED.sMissionHeaderVars[iArrayPos].iMaxPlayers
PRINTLN("[TS] ****************************************************")
PRINTLN("[TS] * [FIXER] * LAUNCH_FIXER_STORY_NSTANCED_MISSION tlName = ", tlName, "- ", GET_CLOUD_TIME_AS_INT(), ", F - ", GET_FRAME_COUNT(), " *")
PRINTLN("[TS] ****************************************************")
PRINTLN("[TS][FIXER] LAUNCH_FIXER_STORY_NSTANCED_MISSION - eMission = ", FIXER_STORY_MISSIONS_TO_STRING(eMission))
PRINTLN("[TS][FIXER] LAUNCH_FIXER_STORY_NSTANCED_MISSION - iArrayPos = ", iArrayPos)
PRINTLN("[TS][FIXER] LAUNCH_FIXER_STORY_NSTANCED_MISSION - tlName = ", tlName)
PRINTLN("[TS][FIXER] LAUNCH_FIXER_STORY_NSTANCED_MISSION - iType = ", iType)
PRINTLN("[TS][FIXER] LAUNCH_FIXER_STORY_NSTANCED_MISSION - iMaxPlayers = ", iMaxPlayers)
SET_PLAYER_LEAVING_CORONA_VECTOR(GET_PLAYER_PERCEIVED_COORDS(PLAYER_ID()))
NET_SET_PLAYER_CONTROL(PLAYER_ID(), FALSE, NSPC_NO_COLLISION | NSPC_CAN_BE_TARGETTED | NSPC_FREEZE_POSITION | NSPC_USE_PLAYER_FADE_OUT)
g_TransitionSessionNonResetVars.bSaveBeforeCoronaVehicle = TRUE
SET_MP_DECORATOR_BIT(PLAYER_ID(), MP_DECORATOR_BS_INVALID_TO_SPECTATE)
CLEAR_PAUSE_MENU_IS_USING_UGC()
SET_TRANSITION_SESSIONS_SKIP_JOB_WARNING()
iType = FMMC_TYPE_FIXER_STORY_MISSION
SET_FM_JOB_ENTERY_TYPE(ciMISSION_ENTERY_TYPE_FIXER_APP)
SET_TRANSITION_SESSIONS_LAUNCHING_FIXER_STORY_MISSION_FROM_APP()
SET_PLAYER_LAUNCHING_FIXER_STORY_MISSION_IN_AGENCY()
IF (AM_I_TRANSITION_SESSIONS_STARTING_ON_CALL()
OR SHOULD_TRANSITION_SESSIONS_CLEAN_UP_ON_CALL_NOW())
SET_TRANSITION_SESSIONS_CLEAN_UP_ON_CALL_NOW()
PRINTLN("[TS][FIXER] LAUNCH_FIXER_STORY_NSTANCED_MISSION - On call, setting to clean up on call")
//If we are
ELSE
g_SimpleInteriorData.bAcceptedSimpleIntSameSessionHeistInv = TRUE
SET_TRANSITION_SESSIONS_QUICK_MATCH_TYPE(iType)
IF GB_GET_NUM_GOONS_IN_LOCAL_GANG() <= 3
SMV_FLOW_SET_LAUNCHING_SMV_IN_OFFICE()
ENDIF
SET_GAMER_HANDLE_OF_PLAYER_LAUNCHING_SMPL_INT_HEIST(GET_GAMER_HANDLE_PLAYER(PLAYER_ID()))
SET_MY_TRANSITION_SESSION_CONTENT_ID(tlName)
SET_TRANSITION_SESSIONS_QUICK_MATCH_MAX_PLAYERS(iMaxPlayers)
CLEAR_TRANSITION_SESSIONS_NEED_TO_SKYCAM_UP_NOT_WARP()
SET_TRANSITION_SESSIONS_STARTING_QUICK_MATCH()
CLEAR_TRANSITION_SESSIONS_NEED_TO_WARP_TO_START_SKYCAM()
CLEAR_TRANSITION_SESSIONS_CORONA_CONTROLLER_MAINTAIN_CAMERA()
SET_TRANSITION_SESSIONS_FORCE_ME_HOST_QUICK_MATCH()
VECTOR vCamPosTemp
BOOL bTemp
VECTOR vZero = << 0.0, 0.0, 0.0 >>
INT iSetupBS
SET_BIT(iSetupBS, ciCORONA_CAMERA_SETUP_BS_FIXER_STORY)
SETUP_CORONA_CAMERA(g_sTransitionSessionData.ciCam, FMMC_TYPE_MISSION, 0, vZero, vCamPosTemp, vZero, TRUE, FALSE, vCamPosTemp, bTemp, bTemp, FALSE, iSetupBS)
TOGGLE_RENDERPHASES(FALSE)
GlobalplayerBD_FM[NATIVE_TO_INT(PLAYER_ID())].iFmLauncherGameState = FMMC_LAUNCHER_STATE_LOAD_MISSION_FOR_TRANSITION_SESSION
PRINTLN("[TS][FIXER] LAUNCH_FIXER_STORY_NSTANCED_MISSION - Found mission at set vars, good to go!")
SCRIPT_CLEANUP(FALSE, FALSE)
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
PROC FIXER_LAUNCH_VIP_SETUP_MISSION()
g_bLaunchedMissionFrmLaptop = TRUE
// NeilF: commented out due to url:bugstar:7428366. The missio script will need to call TRIGGER_EXIT_FROM_SIMPLE_INTERIOR_NOW() on players that
// dont' get warped into the heli, or just let them leave the agency on their own.
//TRIGGER_EXIT_FROM_SIMPLE_INTERIOR_NOW()
REQUEST_LAUNCH_GB_MISSION(FMMC_TYPE_FIXER_VIP, ENUM_TO_INT(FVV_SETUP))
SCRIPT_CLEANUP(TRUE, TRUE)
ENDPROC
PROC FIXER_LAUNCH_SECURITY_CONTRACT(INT iSlot)
g_bSecuroQuickExitOfficeChair = TRUE
g_bLaunchedMissionFrmLaptop = TRUE
REQUEST_LAUNCH_GB_MISSION(FMMC_TYPE_FIXER_SECURITY, ENUM_TO_INT(GET_PLAYER_FIXER_SECURITY_CONTRACT_IN_SLOT(PLAYER_ID(), iSlot)))
SCRIPT_CLEANUP(TRUE, TRUE)
ENDPROC
PROC FIXER_LAUNCH_DATA_LEAK_INVESTIGATION(FIXER_VIP_VARIATION fixVipVar)
g_bLaunchedMissionFrmLaptop = TRUE
g_bSecuroQuickExitOfficeChair = TRUE
REQUEST_LAUNCH_GB_MISSION(FMMC_TYPE_FIXER_VIP, ENUM_TO_INT(fixVipVar))
SCRIPT_CLEANUP(TRUE, TRUE)
ENDPROC
PROC FIXER_CHECK_AND_LAUNCH_SELECTED_DATA_LEAK(FIXER_STRANDS eStrand, INT iMission)
IF IS_FIXER_MISSION_LAUNCH_DISABLED()
PRINTLN("<APP_FIXER_HQ> FIXER_CHECK_AND_LAUNCH_SELECTED_DATA_LEAK Launch blocked for IS_FIXER_MISSION_LAUNCH_DISABLED")
FIXER_APP_PLAY_INPUT_SOUND(FAA_IS_NAV_BLOCKED)
EXIT
ENDIF
SWITCH eStrand
CASE FS_PARTY_PROMOTER
SWITCH iMission
CASE 0
// Launch investigation 1
IF HAS_LOCAL_PLAYER_COMPLETED_FIXER_STORY_MISSION(FSM_PARTY_PROMOTER_INVESTIGATION_1)
FIXER_APP_PLAY_INPUT_SOUND(FAA_IS_NAV_BLOCKED)
ELSE
FIXER_LAUNCH_DATA_LEAK_INVESTIGATION(FVV_NIGHTCLUB)
ENDIF
BREAK
CASE 1
// Launch investigation 2
IF NOT HAS_LOCAL_PLAYER_COMPLETED_FIXER_STORY_MISSION(FSM_PARTY_PROMOTER_INVESTIGATION_1)
OR HAS_LOCAL_PLAYER_COMPLETED_FIXER_STORY_MISSION(FSM_PARTY_PROMOTER_INVESTIGATION_2)
FIXER_APP_PLAY_INPUT_SOUND(FAA_IS_NAV_BLOCKED)
ELSE
FIXER_LAUNCH_DATA_LEAK_INVESTIGATION(FVV_YACHT)
ENDIF
BREAK
CASE 2
// Launch investigation finale
IF NOT HAS_LOCAL_PLAYER_COMPLETED_FIXER_STORY_MISSION(FSM_PARTY_PROMOTER_INVESTIGATION_1)
OR NOT HAS_LOCAL_PLAYER_COMPLETED_FIXER_STORY_MISSION(FSM_PARTY_PROMOTER_INVESTIGATION_2)
OR HAS_LOCAL_PLAYER_COMPLETED_FIXER_STORY_MISSION(FSM_PARTY_PROMOTER_MISSION)
FIXER_APP_PLAY_INPUT_SOUND(FAA_IS_NAV_BLOCKED)
ELSE
LAUNCH_FIXER_STORY_NSTANCED_MISSION(FSM_PARTY_PROMOTER_MISSION)
ENDIF
BREAK
ENDSWITCH
BREAK
CASE FS_BILLIONAIRE_GAMES
SWITCH iMission
CASE 0
// Launch investigation 1
IF HAS_LOCAL_PLAYER_COMPLETED_FIXER_STORY_MISSION(FSM_BILLIONAIRE_GAMES_INVESTIGATION_1)
FIXER_APP_PLAY_INPUT_SOUND(FAA_IS_NAV_BLOCKED)
ELSE
FIXER_LAUNCH_DATA_LEAK_INVESTIGATION(FVV_LIMO)
ENDIF
BREAK
CASE 1
// Launch investigation 2
IF NOT HAS_LOCAL_PLAYER_COMPLETED_FIXER_STORY_MISSION(FSM_BILLIONAIRE_GAMES_INVESTIGATION_1)
OR HAS_LOCAL_PLAYER_COMPLETED_FIXER_STORY_MISSION(FSM_BILLIONAIRE_GAMES_INVESTIGATION_2)
FIXER_APP_PLAY_INPUT_SOUND(FAA_IS_NAV_BLOCKED)
ELSE
FIXER_LAUNCH_DATA_LEAK_INVESTIGATION(FVV_WAY_IN)
ENDIF
BREAK
CASE 2
// Launch investigation finale
IF NOT HAS_LOCAL_PLAYER_COMPLETED_FIXER_STORY_MISSION(FSM_BILLIONAIRE_GAMES_INVESTIGATION_1)
OR NOT HAS_LOCAL_PLAYER_COMPLETED_FIXER_STORY_MISSION(FSM_BILLIONAIRE_GAMES_INVESTIGATION_2)
OR HAS_LOCAL_PLAYER_COMPLETED_FIXER_STORY_MISSION(FSM_BILLIONAIRE_GAMES_MISSION)
FIXER_APP_PLAY_INPUT_SOUND(FAA_IS_NAV_BLOCKED)
ELSE
LAUNCH_FIXER_STORY_NSTANCED_MISSION(FSM_BILLIONAIRE_GAMES_MISSION)
ENDIF
BREAK
ENDSWITCH
BREAK
CASE FS_HOOD_PASS
SWITCH iMission
CASE 0
// Launch investigation 1
IF HAS_LOCAL_PLAYER_COMPLETED_FIXER_STORY_MISSION(FSM_HOOD_PASS_INVESTIGATION_1)
FIXER_APP_PLAY_INPUT_SOUND(FAA_IS_NAV_BLOCKED)
ELSE
FIXER_LAUNCH_DATA_LEAK_INVESTIGATION(FVV_FAMILIES)
ENDIF
BREAK
CASE 1
// Launch investigation 2
IF NOT HAS_LOCAL_PLAYER_COMPLETED_FIXER_STORY_MISSION(FSM_HOOD_PASS_INVESTIGATION_1)
OR HAS_LOCAL_PLAYER_COMPLETED_FIXER_STORY_MISSION(FSM_HOOD_PASS_INVESTIGATION_2)
FIXER_APP_PLAY_INPUT_SOUND(FAA_IS_NAV_BLOCKED)
ELSE
FIXER_LAUNCH_DATA_LEAK_INVESTIGATION(FVV_BALLAS)
ENDIF
BREAK
CASE 2
// Launch investigation finale
IF NOT HAS_LOCAL_PLAYER_COMPLETED_FIXER_STORY_MISSION(FSM_HOOD_PASS_INVESTIGATION_1)
OR NOT HAS_LOCAL_PLAYER_COMPLETED_FIXER_STORY_MISSION(FSM_HOOD_PASS_INVESTIGATION_2)
OR HAS_LOCAL_PLAYER_COMPLETED_FIXER_STORY_MISSION(FSM_HOOD_PASS_MISSION)
FIXER_APP_PLAY_INPUT_SOUND(FAA_IS_NAV_BLOCKED)
ELSE
LAUNCH_FIXER_STORY_NSTANCED_MISSION(FSM_HOOD_PASS_MISSION)
ENDIF
BREAK
ENDSWITCH
BREAK
ENDSWITCH
ENDPROC
//***********Script functions***********
PROC SHOW_OVERLAY(STRING sTitle, STRING sMessage, STRING sAcceptButtonLabel, STRING sCancelButtonLabel, BOOL bPlayFailSound, BOOL bPlayClickSound, FAA_APP_STAGE_ID eNewAppStage = FAA_STAGE_IDLE, INT iAdditionalINT = -1, INT iSecondAdditionalINT = -1, STRING sAdditionalString = NULL, STRING sAdditionalString2 = NULL)
sOverlayMethod = "SHOW_OVERLAY_TWO_BUTTON"
IF IS_STRING_NULL_OR_EMPTY(sCancelButtonLabel)
sOverlayMethod = "SHOW_OVERLAY_ONE_BUTTON"
ENDIF
BEGIN_SCALEFORM_MOVIE_METHOD(mov, sOverlayMethod)
SCALEFORM_MOVIE_METHOD_ADD_PARAM_STRING(sTitle)
//Build the string we need to display
BEGIN_TEXT_COMMAND_SCALEFORM_STRING(sMessage)
//These parameters need to be given in the correct order(May need a new function if more are added)
IF NOT IS_STRING_NULL_OR_EMPTY(sAdditionalString)
//Add the first int if needed
IF iadditionalINT != -1
ADD_TEXT_COMPONENT_INTEGER(iadditionalINT)
ENDIF
//Add the string
ADD_TEXT_COMPONENT_SUBSTRING_TEXT_LABEL(sAdditionalString)
//Add the extra int if needed
IF iSecondAdditionalINT != -1
//For messages that use all available parameters: Int-String-Int
ADD_TEXT_COMPONENT_INTEGER(iSecondAdditionalINT)
ENDIF
//Add the extra string if needed
IF NOT IS_STRING_NULL_OR_EMPTY(sAdditionalString2)
ADD_TEXT_COMPONENT_SUBSTRING_TEXT_LABEL(sAdditionalString2)
ENDIF
ELSE
IF iadditionalINT != -1
ADD_TEXT_COMPONENT_INTEGER(iadditionalINT)
ENDIF
ENDIF
END_TEXT_COMMAND_SCALEFORM_STRING()
SCALEFORM_MOVIE_METHOD_ADD_PARAM_STRING(sAcceptButtonLabel)
IF NOT IS_STRING_NULL_OR_EMPTY(sCancelButtonLabel)
SCALEFORM_MOVIE_METHOD_ADD_PARAM_STRING(sCancelButtonLabel)
ENDIF
END_SCALEFORM_MOVIE_METHOD()
IF bPlayClickSound
FIXER_APP_PLAY_INPUT_SOUND(FAA_IS_SELECT)
ELIF bPlayFailSound
FIXER_APP_PLAY_INPUT_SOUND(FAA_IS_ERROR)
ENDIF
SET_BIT(iBS, FAA_BS_OVERLAY_SCREEN_ACTIVE)
FIXER_APP_SET_APP_STAGE(eNewAppStage)
CLEAR_ROLLOVER_HELP()
PRINTLN("<APP_FIXER_HQ> SHOW_OVERLAY with method: ", sOverlayMethod, " title: ", sTitle, " message: ", sMessage, " Accept button: ", sAcceptButtonLabel, " Cancel button: ", sCancelButtonLabel)
ENDPROC
PROC HIDE_OVERLAY()
STRING sCloseOverlayMethod = "HIDE_OVERLAY_ONE_BUTTON"
IF GET_HASH_KEY(sOverlayMethod) = HASH("SHOW_OVERLAY_TWO_BUTTON")
sCloseOverlayMethod = "HIDE_OVERLAY_TWO_BUTTON"
ENDIF
BEGIN_SCALEFORM_MOVIE_METHOD(mov, sCloseOverlayMethod)
END_SCALEFORM_MOVIE_METHOD()
FIXER_APP_SET_APP_STAGE(FAA_STAGE_IDLE)
CLEAR_BIT(iBS, FAA_BS_OVERLAY_SCREEN_ACTIVE)
PRINTLN("<APP_FIXER_HQ> HIDE_OVERLAY")
ENDPROC
PROC HANDLE_CANCEL_BUTTON_PRESS()
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
FIXER_APP_PLAY_INPUT_SOUND(FAA_IS_NAV_BLOCKED)
EXIT
ELIF IS_BIT_SET(iBS, FAA_BS_FADE_TO_EXIT)
EXIT
ENDIF
IF FIXER_APP_IS_OVERLAY_OPEN()
//Hide any overlay
HIDE_OVERLAY()
ELIF FIXER_APP_GET_APP_STAGE() = FAA_STAGE_SEC_CONTRACT_SELECTED
//Go home for now, but could do something different here if asked
SHOW_HOME_SCREEN()
ELIF FIXER_APP_GET_APP_CURRENT_PAGE() != FAA_PAGE_HOME
AND FIXER_APP_GET_APP_CURRENT_PAGE() != FAA_PAGE_LOGIN
//Go back to the home page
SHOW_HOME_SCREEN()
ELSE
SCRIPT_CLEANUP()
ENDIF
CALL_SCALEFORM_MOVIE_METHOD_WITH_NUMBER(mov, "SET_INPUT_EVENT", TO_FLOAT(ENUM_TO_INT(INPUT_FRONTEND_CANCEL)))
FIXER_APP_PLAY_INPUT_SOUND(FAA_IS_BACK)
ENDPROC
PROC PASS_INPUTS_TO_SCALEFORM()
CLEAR_BIT(iBS, FAA_BS_CURSOR_INPUT_PROCESSED)
#IF IS_DEBUG_BUILD
CLEAR_BIT(iBS, FAA_BS_PRINTED_PAUSE_MENU_ACTIVE)
#ENDIF
SET_INPUT_EXCLUSIVE_AND_ENABLED(FRONTEND_CONTROL, INPUT_FRONTEND_LB)
IF IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_LB)
CALL_SCALEFORM_MOVIE_METHOD_WITH_NUMBER(mov, "SET_INPUT_EVENT", TO_FLOAT(ENUM_TO_INT(INPUT_FRONTEND_LB)))
ENDIF
SET_INPUT_EXCLUSIVE_AND_ENABLED(FRONTEND_CONTROL, INPUT_FRONTEND_RB)
IF IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_RB)
CALL_SCALEFORM_MOVIE_METHOD_WITH_NUMBER(mov, "SET_INPUT_EVENT", TO_FLOAT(ENUM_TO_INT(INPUT_FRONTEND_RB)))
ENDIF
SET_INPUT_EXCLUSIVE_AND_ENABLED(FRONTEND_CONTROL, INPUT_FRONTEND_UP)
IF IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_UP)
CALL_SCALEFORM_MOVIE_METHOD_WITH_NUMBER(mov, "SET_INPUT_EVENT", TO_FLOAT(ENUM_TO_INT(INPUT_FRONTEND_UP)))
SET_BIT(iBS, FAA_BS_CURSOR_INPUT_PROCESSED)
ENDIF
SET_INPUT_EXCLUSIVE_AND_ENABLED(FRONTEND_CONTROL, INPUT_FRONTEND_DOWN)
IF IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_DOWN)
CALL_SCALEFORM_MOVIE_METHOD_WITH_NUMBER(mov, "SET_INPUT_EVENT", TO_FLOAT(ENUM_TO_INT(INPUT_FRONTEND_DOWN)))
SET_BIT(iBS, FAA_BS_CURSOR_INPUT_PROCESSED)
ENDIF
SET_INPUT_EXCLUSIVE_AND_ENABLED(FRONTEND_CONTROL, INPUT_FRONTEND_LEFT)
IF IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_LEFT)
CALL_SCALEFORM_MOVIE_METHOD_WITH_NUMBER(mov, "SET_INPUT_EVENT", TO_FLOAT(ENUM_TO_INT(INPUT_FRONTEND_LEFT)))
ENDIF
SET_INPUT_EXCLUSIVE_AND_ENABLED(FRONTEND_CONTROL, INPUT_FRONTEND_RIGHT)
IF IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_RIGHT)
CALL_SCALEFORM_MOVIE_METHOD_WITH_NUMBER(mov, "SET_INPUT_EVENT", TO_FLOAT(ENUM_TO_INT(INPUT_FRONTEND_RIGHT)))
ENDIF
SET_INPUT_EXCLUSIVE_AND_ENABLED(FRONTEND_CONTROL, INPUT_FRONTEND_ACCEPT)
IF IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_ACCEPT)
CALL_SCALEFORM_MOVIE_METHOD_WITH_NUMBER(mov, "SET_INPUT_EVENT", TO_FLOAT(ENUM_TO_INT(INPUT_FRONTEND_ACCEPT)))
ENDIF
SET_INPUT_EXCLUSIVE_AND_ENABLED(FRONTEND_CONTROL, INPUT_FRONTEND_CANCEL)
IF IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_CANCEL)
AND NOT IS_BIT_SET(iBS, FAA_BS_WAITING_FOR_BUTTON_RETURN_VALUE)
HANDLE_CANCEL_BUTTON_PRESS()
ENDIF
SET_INPUT_EXCLUSIVE_AND_ENABLED(FRONTEND_CONTROL, INPUT_FRONTEND_X)
IF IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_X)
CALL_SCALEFORM_MOVIE_METHOD_WITH_NUMBER(mov, "SET_INPUT_EVENT", TO_FLOAT(ENUM_TO_INT(INPUT_FRONTEND_X)))
ENDIF
SET_INPUT_EXCLUSIVE_AND_ENABLED(FRONTEND_CONTROL, INPUT_FRONTEND_Y)
IF IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_Y)
CALL_SCALEFORM_MOVIE_METHOD_WITH_NUMBER(mov, "SET_INPUT_EVENT", TO_FLOAT(ENUM_TO_INT(INPUT_FRONTEND_Y)))
ENDIF
IF IS_USING_KEYBOARD_AND_MOUSE(FRONTEND_CONTROL)
UPDATE_MENU_CURSOR_GLOBALS()
// Only set the mouse position if it's moved - this fixes a conflict between the mouse and navigating using keyboard.
IF g_fMenuCursorXMoveDistance !=0
OR g_fMenuCursoryMoveDistance !=0
BEGIN_SCALEFORM_MOVIE_METHOD(mov, "SET_MOUSE_INPUT")
SCALEFORM_MOVIE_METHOD_ADD_PARAM_FLOAT(GET_DISABLED_CONTROL_NORMAL(FRONTEND_CONTROL, INPUT_CURSOR_X))
SCALEFORM_MOVIE_METHOD_ADD_PARAM_FLOAT(GET_DISABLED_CONTROL_NORMAL(FRONTEND_CONTROL, INPUT_CURSOR_Y))
END_SCALEFORM_MOVIE_METHOD()
SET_BIT(iBS, FAA_BS_CURSOR_INPUT_PROCESSED)
ENDIF
SET_INPUT_EXCLUSIVE_AND_ENABLED(FRONTEND_CONTROL, INPUT_CURSOR_ACCEPT)
IF IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_CURSOR_ACCEPT)
CALL_SCALEFORM_MOVIE_METHOD_WITH_NUMBER(mov, "SET_INPUT_EVENT", TO_FLOAT(ENUM_TO_INT(INPUT_FRONTEND_ACCEPT)))
ENDIF
SET_INPUT_EXCLUSIVE_AND_ENABLED(FRONTEND_CONTROL, INPUT_CURSOR_CANCEL)
IF IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_CURSOR_CANCEL)
AND NOT IS_BIT_SET(iBS, FAA_BS_WAITING_FOR_BUTTON_RETURN_VALUE)
HANDLE_CANCEL_BUTTON_PRESS()
ENDIF
ELSE
SET_INPUT_EXCLUSIVE_AND_ENABLED(FRONTEND_CONTROL, INPUT_FRONTEND_AXIS_X)
SET_INPUT_EXCLUSIVE_AND_ENABLED(FRONTEND_CONTROL, INPUT_FRONTEND_AXIS_Y)
INT iLeftXNew = GET_CONTROL_VALUE(FRONTEND_CONTROL, INPUT_FRONTEND_AXIS_X)
INT iLeftYNew = GET_CONTROL_VALUE(FRONTEND_CONTROL, INPUT_FRONTEND_AXIS_Y)
IF (iLeftXNew != 127) OR (iLeftX != 127) OR (iLeftYNew != 127) OR (iLeftY != 127)
BEGIN_SCALEFORM_MOVIE_METHOD(mov, "SET_ANALOG_STICK_INPUT")
iLeftX = iLeftXNew
iLeftY = iLeftYNew
SCALEFORM_MOVIE_METHOD_ADD_PARAM_BOOL(TRUE)
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(iLeftX)
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(iLeftY)
END_SCALEFORM_MOVIE_METHOD()
SET_BIT(iBS, FAA_BS_CURSOR_INPUT_PROCESSED)
ENDIF
ENDIF
SET_INPUT_EXCLUSIVE_AND_ENABLED(FRONTEND_CONTROL, INPUT_FRONTEND_RIGHT_AXIS_X)
SET_INPUT_EXCLUSIVE_AND_ENABLED(FRONTEND_CONTROL, INPUT_FRONTEND_RIGHT_AXIS_Y)
INT iRightXNew = GET_CONTROL_VALUE(FRONTEND_CONTROL, INPUT_FRONTEND_RIGHT_AXIS_X)
INT iRightYNew = GET_CONTROL_VALUE(FRONTEND_CONTROL, INPUT_FRONTEND_RIGHT_AXIS_Y)
IF (iRightXNew != 127) OR (iRightX != 127) OR (iRightYNew != 127) OR (iRightY != 127)
BOOL bUsingScrollWheel = (IS_CONTROL_PRESSED(FRONTEND_CONTROL, INPUT_CURSOR_SCROLL_DOWN) OR IS_DISABLED_CONTROL_PRESSED(FRONTEND_CONTROL, INPUT_CURSOR_SCROLL_DOWN))
IF NOT bUsingScrollWheel
bUsingScrollWheel = (IS_CONTROL_PRESSED(FRONTEND_CONTROL, INPUT_CURSOR_SCROLL_UP) OR IS_DISABLED_CONTROL_PRESSED(FRONTEND_CONTROL, INPUT_CURSOR_SCROLL_UP))
SET_BIT(iBS, FAA_BS_CURSOR_INPUT_PROCESSED)
ENDIF
BEGIN_SCALEFORM_MOVIE_METHOD(mov, "SET_ANALOG_STICK_INPUT")
iRightX = iRightXNew
iRightY = iRightYNew
SCALEFORM_MOVIE_METHOD_ADD_PARAM_BOOL(FALSE)
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(iRightX)
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(iRightY)
SCALEFORM_MOVIE_METHOD_ADD_PARAM_BOOL(bUsingScrollWheel)
END_SCALEFORM_MOVIE_METHOD()
ENDIF
IF (IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_Y)
OR IS_DISABLED_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_Y))
AND NOT IS_USING_KEYBOARD_AND_MOUSE(FRONTEND_CONTROL)
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
FIXER_APP_PLAY_INPUT_SOUND(FAA_IS_NAV_BLOCKED)
ELIF NOT IS_BIT_SET(iBS, FAA_BS_FADE_TO_EXIT)
CPRINTLN(DEBUG_INTERNET,"<APP_FIXER_HQ> EXITING WEBSITE for Triangle press")
SCRIPT_CLEANUP()
ENDIF
ENDIF
#IF IS_DEBUG_BUILD
IF (IS_KEYBOARD_KEY_JUST_PRESSED(KEY_F))
SCRIPT_CLEANUP()
ENDIF
#ENDIF
ENDPROC
/// PURPOSE:
/// Check for any flags that mean this script should terminate
PROC RUN_CLEANUP_CHECKS()
IF NOT NETWORK_IS_GAME_IN_PROGRESS()
PRINTLN("<APP_FIXER_HQ> Shutting down! No network game is currently active")
SCRIPT_CLEANUP()
ELIF IS_PAUSE_MENU_ACTIVE_EX()
PRINTLN("<APP_FIXER_HQ> Shutting down! Player opend the pause menu")
SCRIPT_CLEANUP()
ELIF IS_ENTITY_DEAD(PLAYER_PED_ID())
PRINTLN("<APP_FIXER_HQ> Shutting down! Player is injured or dead")
SCRIPT_CLEANUP()
ELIF IS_PLAYER_WALKING_IN_OR_OUT_OF_SIMPLE_INTERIOR(PLAYER_ID())
g_SimpleInteriorData.eInteriorToPauseBlockedEntryHelp = GET_SIMPLE_INTERIOR_PLAYER_IS_WALKING_IN_OR_OUT_FROM(PLAYER_ID())
PRINTLN("<APP_FIXER_HQ> Shutting down! Player is walking out. MAINTAIN_HELP_FOR_REASON_FOR_BLOCKED_ENTRY - Set blocker for interior: ", g_SimpleInteriorData.eInteriorToPauseBlockedEntryHelp)
SCRIPT_CLEANUP()
ELIF SHOULD_THIS_MULTIPLAYER_THREAD_TERMINATE()
PRINTLN("<APP_FIXER_HQ> Shutting down! SHOULD_THIS_MULTIPLAYER_THREAD_TERMINATE")
SCRIPT_CLEANUP()
ENDIF
ENDPROC
PROC DISPLAY_APP_ROLLOVER_HELP(STRING sHelp)
IF IS_BIT_SET(iBS, FAA_BS_DISPLAY_ROLLOVER_HELP)
IF GET_HASH_KEY(sRolloverHelp) != GET_HASH_KEY(sHelp)
PRINTLN("<APP_FIXER_HQ> DISPLAY_APP_ROLLOVER_HELP - Switching help message to: ", sHelp)
PRINT_HELP_FOREVER(sHelp)
sRolloverHelp = sHelp
ENDIF
ELSE
PRINTLN("<APP_FIXER_HQ> DISPLAY_APP_ROLLOVER_HELP - New help message: ", sHelp)
PRINT_HELP_FOREVER(sHelp)
sRolloverHelp = sHelp
SET_BIT(iBS, FAA_BS_DISPLAY_ROLLOVER_HELP)
ENDIF
ENDPROC
FUNC BOOL IS_ACCEPT_BUTTON_INPUT_JUST_PRESSED()
IF IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_ACCEPT)
OR IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_CURSOR_ACCEPT)
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
PROC MAINTAIN_CHECKS_FOR_CURRENT_SELECTION_ID()
IF IS_ACCEPT_BUTTON_INPUT_JUST_PRESSED()
IF NOT IS_BIT_SET(iBS, FAA_BS_WAITING_FOR_BUTTON_RETURN_VALUE)
BEGIN_SCALEFORM_MOVIE_METHOD(mov, "GET_CURRENT_SELECTION")
currentSelectionReturnIndex = END_SCALEFORM_MOVIE_METHOD_RETURN_VALUE()
SET_BIT(iBS, FAA_BS_WAITING_FOR_BUTTON_RETURN_VALUE)
ENDIF
ENDIF
ENDPROC
PROC SET_SELECTED_SECUITY_CONTRACT(FAA_BUTTON_INDEXES eHighlightedButton)
#IF IS_DEBUG_BUILD
INT iCurrentValue = iSelectedSecurityContract
#ENDIF
SWITCH eHighlightedButton
CASE BUTTON_SECURITY_CONTRACT_1 iSelectedSecurityContract = 0 BREAK
CASE BUTTON_SECURITY_CONTRACT_2 iSelectedSecurityContract = 1 BREAK
CASE BUTTON_SECURITY_CONTRACT_3 iSelectedSecurityContract = 2 BREAK
ENDSWITCH
#IF IS_DEBUG_BUILD
IF iCurrentValue != iSelectedSecurityContract
PRINTLN("<APP_FIXER_HQ> SET_SELECTED_SECUITY_CONTRACT - New selected contract: ", iSelectedSecurityContract)
ENDIF
#ENDIF
ENDPROC
PROC MAINTAIN_CHECKS_FOR_CURRENT_ROLLOVER_ID()
IF NOT IS_BIT_SET(iBS, FAA_BS_WAITING_FOR_BUTTON_RETURN_VALUE)
AND NOT FIXER_APP_IS_OVERLAY_OPEN()
IF NOT IS_BIT_SET(iBS, FAA_BS_WAITING_FOR_ROLLOVER_RETURN_VALUE)
BEGIN_SCALEFORM_MOVIE_METHOD(mov, "GET_CURRENT_ROLLOVER")
currentRollOverReturnIndex = END_SCALEFORM_MOVIE_METHOD_RETURN_VALUE()
//Add a safety timeout of 20 frames
iRolloverReturnTimeOut = 20
SET_BIT(iBS, FAA_BS_WAITING_FOR_ROLLOVER_RETURN_VALUE)
ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// Handles the player input when the accept input is pressed
PROC HANDLE_OVERLAY_ACCEPT_PRESSED()
SWITCH FIXER_APP_GET_APP_STAGE()
CASE FAA_STAGE_STRAND_CONFIRM
//Set & save the selected strand
SET_CURRENT_FIXER_STRAND(eSelectedDataLeakStrand, TRUE)
//Tell the app which strand we have selected
UPDATE_DATA_LEAK_SCREEN_WITH_STRAND(eSelectedDataLeakStrand)
//Lock the other options
UPDATE_DATA_LEAK_STRAND_LOCK_STATE()
//Fill out the scren with information for the first mission in the strand
UPDATE_DATA_LEAK_TAB_DATA(eSelectedDataLeakStrand, 0)
//Enable the tab buttons
SET_MISSION_SCREEN_TABS_ENABLED(TRUE)
//Enable the start button for mission selection
UPDATE_MISSION_SCREEN_START_BUTTON("FAPP_ACCEPT", TRUE)
//Move the cursor
MOVE_CURSOR_TO_BUTTON(BUTTON_DATA_LEAK_ACCEPT)
IF HAS_PLAYER_COMPLETED_FIXER_STORY_AS_LEADER(PLAYER_ID())
AND NOT GET_FIXER_MATCH_HISTORY_PLAYSTATS_HAVE_BEEN_GENERATED()
SET_BIT(g_sFixerFlow.Bitset2, ciFIXER_FLOW_BITSET2__GENERATE_PLAYSTATS)
PRINTLN("<APP_FIXER_HQ>[FIXER_TELEM] ciFIXER_FLOW_BITSET2__GENERATE_PLAYSTATS set.")
ENDIF
HIDE_OVERLAY()
BREAK
ENDSWITCH
ENDPROC
/// PURPOSE:
/// Handles selection of a mission from the currently selected data leak
PROC HANDLE_DATA_LEAK_BUTTON_SELECTION(FAA_BUTTON_INDEXES eButtonPressed)
FIXER_STRANDS eStrand = FIXER_APP_GET_DATA_LEAK_FROM_BUTTON(eButtonPressed)
FIXER_STORY_MISSIONS eFinalStrandMission = FIXER_APP_GET_FINAL_MISSION_ID_FOR_DATA_LEAK_STRAND(eStrand)
UPDATE_CURRENTLY_DISPLAYED_STRAND(eStrand)
IF GET_LOCAL_PLAYER_CURRENT_FIXER_STRAND(TRUE) = eStrand
OR HAS_LOCAL_PLAYER_COMPLETED_FIXER_STORY_MISSION(eFinalStrandMission)
//Update script leak cache
SET_SELECTED_DATA_LEAK_STRAND(eStrand)
IF HAS_LOCAL_PLAYER_COMPLETED_FIXER_STORY_MISSION(eFinalStrandMission)
//If we have already done the final mission in this strand then enable all tabs for selection as an overview
//Update scaleform with leak info
UPDATE_DATA_LEAK_SCREEN_WITH_STRAND(eStrand)
UPDATE_MISSION_SCREEN_START_BUTTON("FIX_APP_MIS_COM", FALSE)
SET_MISSION_SCREEN_TABS_ENABLED(TRUE)
FIXER_APP_PLAY_INPUT_SOUND(FAA_IS_SELECT)
ELSE
//We are on this strand so highlight the active mission
INT iActiveMission = GET_NEXT_MISISON_IN_STRAND(eStrand)
IF iActiveMission = -1
FIXER_APP_PLAY_INPUT_SOUND(FAA_IS_NAV_BLOCKED)
ELSE
UPDATE_DATA_LEAK_TAB_DATA(eStrand, iActiveMission)
SET_SELECTED_DATA_LEAK_STRAND_MISSION(iActiveMission)
SET_DISPLAYING_LEAK_OVERVIEW(FALSE)
MOVE_CURSOR_TO_MISSION_TAB(iActiveMission)
UPDATE_MISSION_SCREEN_START_BUTTON("FAPP_ACCEPT", TRUE)
FIXER_APP_PLAY_INPUT_SOUND(FAA_IS_SELECT)
ENDIF
ENDIF
ELIF GET_LOCAL_PLAYER_CURRENT_FIXER_STRAND(TRUE) = FS_NONE
//Show select strand confirm
STRING sOverlayTitle = GET_STRAND_SELECTION_PROMPT_TITLE(eStrand)
STRING sOverlayMessage = GET_STRAND_SELECTION_PROMPT_MESSAGE(eStrand)
SHOW_OVERLAY(sOverlayTitle,sOverlayMessage, "WHOUSE_CONF", "WHOUSE_CANC", FALSE, TRUE, FAA_STAGE_STRAND_CONFIRM)
MOVE_CURSOR_TO_BUTTON(BUTTON_OVERLAY_ACCEPT)
SET_SELECTED_DATA_LEAK_STRAND(eStrand)
ELSE
//This strand is currently unavailable while another strand is active
PRINT_HELP("FXR_VIP_STRAND2")
FIXER_APP_PLAY_INPUT_SOUND(FAA_IS_NAV_BLOCKED)
ENDIF
ENDPROC
/// PURPOSE:
/// Handles selection of one of the data leak options
/// Sets up the movie to display the appropriate information
/// Sets up script to launch a mission from this leak
PROC HANDLE_DATA_LEAK_MISSION_BUTTON_SELECTION(FAA_BUTTON_INDEXES eButtonPressed)
INT iMissionID = 0
IF eButtonPressed = BUTTON_DATA_LEAK_TAB_2
iMissionID = 1
ELIF eButtonPressed = BUTTON_DATA_LEAK_TAB_3
iMissionID = 2
ENDIF
SET_DISPLAYING_LEAK_OVERVIEW(FALSE)
UPDATE_DATA_LEAK_TAB_DATA(eSelectedDataLeakStrand, iMissionID)
SET_SELECTED_DATA_LEAK_STRAND_MISSION(iMissionID)
FIXER_APP_PLAY_INPUT_SOUND(FAA_IS_SELECT)
IF IS_STRAND_INVESTIGATION_MISSION_COMPLETE(eSelectedDataLeakStrand, iMissionID)
UPDATE_MISSION_SCREEN_START_BUTTON("FIX_APP_MIS_COM", FALSE)
ELSE
UPDATE_MISSION_SCREEN_START_BUTTON("FAPP_ACCEPT", TRUE)
ENDIF
ENDPROC
/// PURPOSE:
/// Handles selection of a security contract
/// Asks the movie to display the appropriate contract
/// Sets the script up for launching this mission
PROC HANDLE_SECURITY_CONTRACT_BUTTON_SELECTION(FAA_BUTTON_INDEXES eButtonPressed)
INT iContractID = 0
IF eButtonPressed = BUTTON_SECURITY_CONTRACT_2
iContractID = 1
ELIF eButtonPressed = BUTTON_SECURITY_CONTRACT_3
iContractID = 2
ENDIF
SET_SELECTED_SECUITY_CONTRACT(eButtonPressed)
SCALEFORM_SELECT_SECURITY_CONTRACT(iContractID)
UPDATE_SECURITY_CONTRACTS_SELECTION_SCREEN_STATS(TRUE, iContractID)
FIXER_APP_PLAY_INPUT_SOUND(FAA_IS_SELECT)
ENDPROC
FUNC BOOL IS_BUTTON_INPUT_ALLOWED_DURING_DIALOGUE(FAA_BUTTON_INDEXES eButtonPressed)
SWITCH eButtonPressed
CASE BUTTON_SECURITY_CONTRACT_1
CASE BUTTON_SECURITY_CONTRACT_2
CASE BUTTON_SECURITY_CONTRACT_3
RETURN TRUE
BREAK
ENDSWITCH
RETURN FALSE
ENDFUNC
PROC CHECK_BUTTON_PRESS()
MAINTAIN_CHECKS_FOR_CURRENT_SELECTION_ID()
MAINTAIN_CHECKS_FOR_CURRENT_ROLLOVER_ID()
//Check if we clicked a button
IF IS_BIT_SET(iBS, FAA_BS_WAITING_FOR_BUTTON_RETURN_VALUE)
IF IS_SCALEFORM_MOVIE_METHOD_RETURN_VALUE_READY(currentSelectionReturnIndex)
FAA_BUTTON_INDEXES eButtonPressed = INT_TO_ENUM(FAA_BUTTON_INDEXES, GET_SCALEFORM_MOVIE_METHOD_RETURN_VALUE_INT(currentSelectionReturnIndex))
IF NOT IS_SCREEN_FADED_IN()
PRINTLN("<APP_FIXER_HQ> CHECK_BUTTON_PRESS button press returned a value but the screen is not faded in")
CLEAR_BIT(iBS, FAA_BS_WAITING_FOR_BUTTON_RETURN_VALUE)
EXIT
ELIF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
AND NOT IS_BUTTON_INPUT_ALLOWED_DURING_DIALOGUE(eButtonPressed)
PRINTLN("<APP_FIXER_HQ> CHECK_BUTTON_PRESS button press returned = ", DEBUG_GET_BUTTON_NAME(eButtonPressed), " ID: ", eButtonPressed, " ignore input for dialogue.")
//Do not allow input while we are running the tutorial
IF FIXER_APP_IS_DIALOGUE_PLAYING(F_APP_D_INTRO)
IF NOT IS_BIT_SET(iBS, FAA_BS_PRINTED_INTRO_PLEASE_WAIT)
//Please wait until dialogue is complete
PRINT_HELP("FIX_HQ_APP_WAIT")
SET_BIT(iBS, FAA_BS_PRINTED_INTRO_PLEASE_WAIT)
ENDIF
ENDIF
FIXER_APP_PLAY_INPUT_SOUND(FAA_IS_NAV_BLOCKED)
CLEAR_BIT(iBS, FAA_BS_WAITING_FOR_BUTTON_RETURN_VALUE)
EXIT
ELSE
PRINTLN("<APP_FIXER_HQ> CHECK_BUTTON_PRESS button press returned = ", DEBUG_GET_BUTTON_NAME(eButtonPressed), " ID: ", eButtonPressed)
ENDIF
SWITCH eButtonPressed
CASE BUTTON_OVERLAY_ACCEPT
HANDLE_OVERLAY_ACCEPT_PRESSED()
BREAK
CASE BUTTON_OVERLAY_CANCEL
HIDE_OVERLAY()
BREAK
CASE BUTTON_LOGIN
SHOW_HOME_SCREEN()
SET_BIT(GlobalplayerBD[NATIVE_TO_INT(PLAYER_ID())].SimpleInteriorBD.iBSTwo, BS_SIMPLE_INTERIOR_GLOBAL_BS_SIX_FIXER_HQ_COMPUTER_IN_USE)
FIXER_APP_PLAY_INPUT_SOUND(FAA_IS_SELECT)
BREAK
//Setup
CASE BUTTON_DATA_RECOVERY
//Do nothing for now
BREAK
CASE BUTTON_DATA_RECOVERY_START
PRINTLN("<APP_FIXER_HQ> HANDLE_OVERLAY_ACCEPT_PRESSED - Launching setup mission")
SET_BIT(iBS, FAA_BS_FADE_TO_EXIT)
FIXER_APP_PLAY_INPUT_SOUND(FAA_IS_LAUNCH_MISSION)
BREAK
//Security contracts
CASE BUTTON_HOME_SECURITY_CONTRACT
CASE BUTTON_VIP_PAGE_SEC_CONTRACT
CASE BUTTON_DREC_PAGE_SEC_CONTRACT
SHOW_SECURITY_CONTRACTS_SELECTION_SCREEN()
FIXER_APP_PLAY_INPUT_SOUND(FAA_IS_SELECT)
SCALEFORM_SELECT_SECURITY_CONTRACT(0)
UPDATE_SECURITY_CONTRACTS_SELECTION_SCREEN_STATS(TRUE, 0)
BREAK
CASE BUTTON_SECURITY_CONTRACT_ACCEPT
//Start the mission
FIXER_LAUNCH_SECURITY_CONTRACT(iSelectedSecurityContract)
BREAK
CASE BUTTON_SECURITY_CONTRACT_1
CASE BUTTON_SECURITY_CONTRACT_2
CASE BUTTON_SECURITY_CONTRACT_3
HANDLE_SECURITY_CONTRACT_BUTTON_SELECTION(eButtonPressed)
BREAK
//VIP
CASE BUTTON_HOME_VIP_CONTRACT
CASE BUTTON_SECURITY_PAGE_VIP_CONTRACT
IF HAS_LOCAL_PLAYER_UNLOCKED_FIXER_STORY()
AND HAS_LOCAL_PLAYER_COMPLETED_FIXER_INTRO_MISSION()
AND HAS_LOCAL_PLAYER_VIEWED_FIXER_HQ_POST_SETUP_CUTSCENE()
AND NOT IS_FIXER_STORY_ON_COOLDOWN(TRUE)
IF NOT HAS_LOCAL_PLAYER_COMPLETED_FIXER_SETUP_MISSION()
//Offer up the setup mission
SHOW_DATA_RECOVERY_SCREEN()
FIXER_APP_PLAY_INPUT_SOUND(FAA_IS_SELECT)
ELIF NOT HAS_PLAYER_STARTED_FIXER_STORY_INVESTIGATIONS(PLAYER_ID())
AND NOT IS_BIT_SET(g_sFixerFlow.Bitset2, ciFIXER_FLOW_BITSET2__INVESTIGATIONS_CALL_DONE)
//Wait for the flow call following setup first
FIXER_APP_PLAY_INPUT_SOUND(FAA_IS_NAV_BLOCKED)
ELSE
SHOW_DATA_LEAK_SCREEN()
FIXER_APP_PLAY_INPUT_SOUND(FAA_IS_SELECT)
ENDIF
ELSE
FIXER_APP_PLAY_INPUT_SOUND(FAA_IS_NAV_BLOCKED)
ENDIF
BREAK
//Data leaks
CASE BUTTON_DATA_LEAK_1
CASE BUTTON_DATA_LEAK_2
CASE BUTTON_DATA_LEAK_3
HANDLE_DATA_LEAK_BUTTON_SELECTION(eButtonPressed)
BREAK
//Data leak missions
CASE BUTTON_DATA_LEAK_TAB_1
CASE BUTTON_DATA_LEAK_TAB_2
CASE BUTTON_DATA_LEAK_TAB_3
HANDLE_DATA_LEAK_MISSION_BUTTON_SELECTION(eButtonPressed)
BREAK
//Mission start button - Data leak page
CASE BUTTON_DATA_LEAK_ACCEPT
IF IS_BIT_SET(iBS, FAA_BS_INTRO_MISSION_LAUNCH_PREPARED)
IF NOT LAUNCH_FIXER_STORY_NSTANCED_MISSION(FSM_INTRO)
FIXER_APP_PLAY_INPUT_SOUND(FAA_IS_ERROR)
ENDIF
ELIF IS_BIT_SET(iBS, FAA_BS_SETUP_MISSION_LAUNCH_PREPARED)
PRINTLN("<APP_FIXER_HQ> CHECK_BUTTON_PRESS - BUTTON_DATA_LEAK_ACCEPT - Launching setup mission")
SET_BIT(iBS, FAA_BS_FADE_TO_EXIT)
FIXER_APP_PLAY_INPUT_SOUND(FAA_IS_LAUNCH_MISSION)
ELSE
FIXER_CHECK_AND_LAUNCH_SELECTED_DATA_LEAK(eSelectedDataLeakStrand, iSelectedDataLeakInStrand)
ENDIF
BREAK
CASE BUTTON_INTRO_MISSION
CASE BUTTON_SETUP_MISSION
MOVE_CURSOR_TO_BUTTON(BUTTON_DATA_LEAK_ACCEPT)
BREAK
ENDSWITCH
CLEAR_BIT(iBS, FAA_BS_WAITING_FOR_BUTTON_RETURN_VALUE)
ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// Handles selection of a mission from the currently selected data leak
PROC HANDLE_DATA_LEAK_BUTTON_ROLLOVER(FAA_BUTTON_INDEXES eButtonHighlighted)
FIXER_STRANDS eStrand = FIXER_APP_GET_DATA_LEAK_FROM_BUTTON(eButtonHighlighted)
FIXER_STORY_MISSIONS eFinalStrandMission = FIXER_APP_GET_FINAL_MISSION_ID_FOR_DATA_LEAK_STRAND(eStrand)
IF eCurrentlyDisplayedStrand = eStrand
AND IS_BIT_SET(iBS, FAA_BS_DISPLAYING_LEAK_OVERVIEW)
EXIT
ELSE
UPDATE_CURRENTLY_DISPLAYED_STRAND(eStrand)
ENDIF
SET_DISPLAYING_LEAK_OVERVIEW(TRUE)
//Update script leak cache
IF g_bUpdateLeakStrandOnRollover
SET_SELECTED_DATA_LEAK_STRAND(eStrand)
ENDIF
IF GET_LOCAL_PLAYER_CURRENT_FIXER_STRAND(FALSE) = eStrand
OR HAS_LOCAL_PLAYER_COMPLETED_FIXER_STORY_MISSION(eFinalStrandMission)
//Update scaleform with leak info
UPDATE_DATA_LEAK_SCREEN_WITH_STRAND(eStrand)
SET_MISSION_SCREEN_TABS_ENABLED(TRUE)
IF HAS_LOCAL_PLAYER_COMPLETED_FIXER_STORY_MISSION(eFinalStrandMission)
//If we have already doen the final mission in this strand then enable all tabs for selection as an overview
UPDATE_MISSION_SCREEN_START_BUTTON("FIX_APP_MIS_COM", FALSE)
SET_MISSION_SCREEN_TABS_ENABLED(TRUE)
UPDATE_DATA_LEAK_TAB_DATA(eStrand, 2, 2)
ELSE
UPDATE_MISSION_SCREEN_START_BUTTON("FAPP_ACCEPT", FALSE)
UPDATE_DATA_LEAK_TAB_DATA(eStrand, 2, 0)
ENDIF
ELSE
SETUP_DEFAULT_MISSION_TAB_DATA()
UPDATE_MISSION_SCREEN_START_BUTTON("FAPP_ACCEPT", FALSE)
SET_MISSION_SCREEN_TABS_ENABLED(FALSE)
UPDATE_DATA_LEAK_TAB_DATA(eStrand, 2, 0)
ENDIF
ENDPROC
PROC MAINTAIN_ROLLOVER_FUNCTIONALITY()
IF IS_BIT_SET(iBS, FAA_BS_WAITING_FOR_ROLLOVER_RETURN_VALUE)
IF IS_SCALEFORM_MOVIE_METHOD_RETURN_VALUE_READY(currentRollOverReturnIndex)
FAA_BUTTON_INDEXES eButtonHighlighted = INT_TO_ENUM(FAA_BUTTON_INDEXES, GET_SCALEFORM_MOVIE_METHOD_RETURN_VALUE_INT(currentRollOverReturnIndex))
IF eButtonHighlighted != eButtonLastHighlighted
PRINTLN("<APP_FIXER_HQ> MAINTAIN_ROLLOVER_FUNCTIONALITY - New highlighted button: ", DEBUG_GET_BUTTON_NAME(eButtonHighlighted), " ID: ", eButtonHighlighted)
IF NOT FIXER_APP_IS_OVERLAY_OPEN()
SWITCH eButtonHighlighted
CASE BUTTON_INTRO_MISSION
CASE BUTTON_SETUP_MISSION
SET_DISPLAYING_LEAK_OVERVIEW(FALSE)
UPDATE_REPLAY_MISSION_TAB_DATA(eButtonHighlighted)
UPDATE_MISSION_SCREEN_START_BUTTON("FAPP_ACCEPT", TRUE)
BREAK
CASE BUTTON_DATA_LEAK_1
CASE BUTTON_DATA_LEAK_2
CASE BUTTON_DATA_LEAK_3
HANDLE_DATA_LEAK_BUTTON_ROLLOVER(eButtonHighlighted)
BREAK
ENDSWITCH
ELSE
PRINTLN("<APP_FIXER_HQ> MAINTAIN_ROLLOVER_FUNCTIONALITY - Ignore rollover return value - FIXER_APP_IS_OVERLAY_OPEN")
ENDIF
ENDIF
eButtonLastHighlighted = eButtonHighlighted
iRolloverReturnTimeOut = 0
CLEAR_BIT(iBS, FAA_BS_WAITING_FOR_ROLLOVER_RETURN_VALUE)
ELSE
//Have a timeout because there are instances where we can get stuck with this command and IS_SCALEFORM_MOVIE_METHOD_RETURN_VALUE_READY
//will no longer return true because it has thrown out currentRollOverReturnIndex
//Found when using the debug pause
iRolloverReturnTimeOut --
IF iRolloverReturnTimeOut = 0
PRINTLN("MAINTAIN_ROLLOVER_FUNCTIONALITY - waiting for return value timed out. Clear")
CLEAR_BIT(iBS, FAA_BS_WAITING_FOR_ROLLOVER_RETURN_VALUE)
ELSE
PRINTLN("MAINTAIN_ROLLOVER_FUNCTIONALITY - waiting for return value")
ENDIF
ENDIF
ENDIF
ENDPROC
PROC APP_CONTROL_DISABLE()
SET_CLEAR_ON_CALL_HUD_THIS_FRAME()
IF (NOT IS_SYSTEM_UI_BEING_DISPLAYED())
AND (NOT IS_PAUSE_MENU_ACTIVE())
DISABLE_ALL_CONTROL_ACTIONS(PLAYER_CONTROL)
DISABLE_CONTROL_ACTION(FRONTEND_CONTROL, INPUT_FRONTEND_PAUSE_ALTERNATE)
ENDIF
ENDPROC
PROC HIDE_CASH_HUD_IN_APP()
HIDE_HUD_COMPONENT_THIS_FRAME(NEW_HUD_CASH)
HIDE_HUD_COMPONENT_THIS_FRAME(NEW_HUD_MP_CASH)
HIDE_HUD_COMPONENT_THIS_FRAME(NEW_HUD_CASH_CHANGE)
ENDPROC
PROC RENDER_FIXER_APP()
#IF IS_DEBUG_BUILD
IF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_1)
bRender = !bRender
PRINTLN("<APP_FIXER_HQ> bRender toggled to ", bRender)
ENDIF
IF !bRender
EXIT
ENDIF
#ENDIF
HIDE_HUD_AND_RADAR_THIS_FRAME()
HIDE_SCRIPTED_HUD_COMPONENT_THIS_FRAME(HUD_MP_RANK_BAR)
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
APP_CONTROL_DISABLE()
HIDE_CASH_HUD_IN_APP()
THEFEED_HIDE_THIS_FRAME()
SET_INPUT_EXCLUSIVE_AND_ENABLED(FRONTEND_CONTROL,INPUT_FRONTEND_PAUSE)
SET_SCRIPT_GFX_DRAW_ORDER(GFX_ORDER_BEFORE_HUD)
DRAW_RECT_FROM_CORNER(0.0, 0.0, 1.0, 1.0, 0, 0, 0, 255)
SET_SCRIPT_GFX_DRAW_ORDER(GFX_ORDER_BEFORE_HUD)
DRAW_SCALEFORM_MOVIE_FULLSCREEN(mov,255,255,255,255)
REPLAY_PREVENT_RECORDING_AND_UI_THIS_FRAME()
DISABLE_CELLPHONE_THIS_FRAME_ONLY()
DISABLE_ALL_MP_HUD_THIS_FRAME()
ENDPROC
PROC SEND_ALL_DATA_TO_SCALEFORM()
SHOW_LOGIN_SCREEN()
ENDPROC
////////////////////////////////////////////////////////////////////////////
/// Dialogue tutorial
FUNC BOOL FIXER_APP_TUT_IS_ROOT_FOR_FRANKLIN(INT iTutorialID)
SWITCH iTutorialID
CASE F_APP_D_INTRO //Intro - Home - Franklin
CASE F_APP_D_SEC_CON //Intro - Security Contracts - Franklin
CASE F_APP_D_SEC_CON2 //Intro - Security Contracts pt2 - Franklin
CASE F_APP_D_SEC_CON3 //Intro - Security Contracts pt3 - Franklin
RETURN TRUE
BREAK
ENDSWITCH
RETURN FALSE
ENDFUNC
FUNC BOOL FIXER_APP_TUT_IS_ROOT_FOR_FRANKLIN_AND_IMANI(INT iTutorialID)
SWITCH iTutorialID
CASE F_APP_D_PARTY_P_M2 //VIP - Party promoter mission 2 intro - Imani & Franklin
CASE F_APP_D_BILL_G_M2 //VIP - Billionaire games mission 2 intro - Imani & Franklin
RETURN TRUE
BREAK
ENDSWITCH
RETURN FALSE
ENDFUNC
FUNC STRING FIXER_APP_TUT_GET_ROOT_LABEL(INT iTutorialID)
SWITCH iTutorialID
CASE F_APP_D_INTRO RETURN "FXFR_FOC_1" BREAK //Intro - Home - Franklin
CASE F_APP_D_SEC_CON RETURN "FXFR_FOC_2" BREAK //Intro - Security Contracts - Franklin
CASE F_APP_D_SEC_CON2 RETURN "FXFR_FOC_3" BREAK //Intro - Security Contracts pt2 - Franklin
CASE F_APP_D_SEC_CON3 RETURN "FXFR_FOC_4" BREAK //Intro - Security Contracts pt3 - Franklin
CASE F_APP_D_SETUP RETURN "FXIM_FL_1" BREAK //Home - Setup description - Imani
CASE F_APP_D_SETUP_2 RETURN "FXIM_FL_2" BREAK //Home - Setup description part 2 - Imani
CASE F_APP_D_SELECT_LEAK RETURN "FXIM_FL_4" BREAK //VIP - Select leak intro - Imani
CASE F_APP_D_PARTY_P_INT RETURN "FXIM_FL_5" BREAK //VIP - Party promoter strand intro - Imani
CASE F_APP_D_BILL_G_INT RETURN "FXIM_FL_6" BREAK //VIP - Billionaire games strand intro - Imani
CASE F_APP_D_HOOD_P_INT RETURN "FXIM_FL_7" BREAK //VIP - Hood pass strand intro - Imani
CASE F_APP_D_PARTY_P_M2 RETURN "FXIM_FL_8" BREAK //VIP - Party promoter mission 2 intro - Imani & Franklin
CASE F_APP_D_PARTY_P_F RETURN "FXIM_FL_9" BREAK //VIP - Party promoter finale intro - Imani
CASE F_APP_D_HOOD_P_M2 RETURN "FXIM_FL_10" BREAK //VIP - Hood pass mission 2 intro - Imani
CASE F_APP_D_HOOD_P_F RETURN "FXIM_FL_11" BREAK //VIP - Hood pass finale intro - Imani
CASE F_APP_D_BILL_G_M2 RETURN "FXIM_FL_12" BREAK //VIP - Billionaire games mission 2 intro - Imani & Franklin
CASE F_APP_D_BILL_G_F RETURN "FXIM_FL_13" BREAK //VIP - Billionaire games finale intro - Imani
ENDSWITCH
CASSERTLN(DEBUG_INTERNET, "FIXER_APP_TUT_GET_ROOT_LABEL: Invalid tutorial ID: ", iTutorialID)
RETURN "FXFR_FOC_1"
ENDFUNC
PROC SET_ACTIVE_APP_DIALOGUE()
iDialoguePlayingID = iDialogueRequestID
iDialogueRequestID = -1
SHOW_SPEAKER_ICON(TRUE)
ENDPROC
PROC FIXER_APP_START_TUTORIAL_DIALOGUE(INT iTutorialID)
structPedsForConversation sDialogue
IF FIXER_APP_TUT_IS_ROOT_FOR_FRANKLIN_AND_IMANI(iTutorialID)
ADD_PED_FOR_DIALOGUE(sDialogue, 2, NULL, "FIX_IMANI")
ADD_PED_FOR_DIALOGUE(sDialogue, 3, NULL, "FIX_FRANKLIN")
IF CREATE_CONVERSATION(sDialogue, "FXIMAUD", FIXER_APP_TUT_GET_ROOT_LABEL(iTutorialID), CONV_PRIORITY_HIGH)
CPRINTLN(DEBUG_INTERNET, "<APP_FIXER_HQ> Created Franklin & Imani tutorial converstion: ", iTutorialID, " Root: ", FIXER_APP_TUT_GET_ROOT_LABEL(iTutorialID))
SET_ACTIVE_APP_DIALOGUE()
ENDIF
ELIF FIXER_APP_TUT_IS_ROOT_FOR_FRANKLIN(iTutorialID)
ADD_PED_FOR_DIALOGUE(sDialogue, 2, NULL, "FIX_FRANKLIN")
IF CREATE_CONVERSATION(sDialogue, "FXFRAUD", FIXER_APP_TUT_GET_ROOT_LABEL(iTutorialID), CONV_PRIORITY_HIGH)
CPRINTLN(DEBUG_INTERNET, "<APP_FIXER_HQ> Created Franklin tutorial converstion: ", iTutorialID, " Root: ", FIXER_APP_TUT_GET_ROOT_LABEL(iTutorialID))
SET_ACTIVE_APP_DIALOGUE()
ENDIF
ELSE
ADD_PED_FOR_DIALOGUE(sDialogue, 2, NULL, "FIX_IMANI")
IF CREATE_CONVERSATION(sDialogue, "FXIMAUD", FIXER_APP_TUT_GET_ROOT_LABEL(iTutorialID), CONV_PRIORITY_HIGH)
CPRINTLN(DEBUG_INTERNET, "<APP_FIXER_HQ> Created Imani tutorial converstion: ", iTutorialID, " Root: ", FIXER_APP_TUT_GET_ROOT_LABEL(iTutorialID))
SET_ACTIVE_APP_DIALOGUE()
ENDIF
ENDIF
ENDPROC
PROC FIXER_APP_RUN_TUTORIAL_DIALOGUE()
//Start the dialogue
IF iDialogueRequestID != -1
FIXER_APP_START_TUTORIAL_DIALOGUE(iDialogueRequestID)
ENDIF
ENDPROC
PROC MAINTAIN_SECURITY_CONTRACT_COOLDOWN_EXPIRATION()
IF IS_BIT_SET(iBS, FAA_BS_OPENED_SEC_CONTRACT_PAGE_W_ACTIVE_CD)
IF NOT ARE_FIXER_SECURITY_CONTRACTS_ON_COOLDOWN()
PRINTLN("<APP_FIXER_HQ> MAINTAIN_SECURITY_CONTRACT_COOLDOWN_EXPIRATION - timer expired - Clear FAA_BS_OPENED_SEC_CONTRACT_PAGE_W_ACTIVE_CD")
CLEAR_BIT(iBS, FAA_BS_OPENED_SEC_CONTRACT_PAGE_W_ACTIVE_CD)
IF IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("FXR_NX_SEC_WAIT")
CLEAR_HELP()
ENDIF
IF FIXER_APP_GET_APP_CURRENT_PAGE() = FAA_PAGE_SECURITY_CONTRACT_SELECTION
SETUP_START_MISSION_BUTTON_SECURITY_CONTRACTS(TRUE)
ENDIF
ENDIF
ENDIF
ENDPROC
PROC FIXER_APP_RUN_HELP_TUTORIAL()
IF NOT IS_BIT_SET(iBS, FAA_BS_CURRENTLY_PLAYING_TUTORIAL)
AND NOT IS_STRING_NULL_OR_EMPTY(sTutTextAfterDialogue)
AND NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
PRINT_HELP(sTutTextAfterDialogue)
sTutTextAfterDialogue = ""
ENDIF
IF NOT IS_BIT_SET(iBS, FAA_BS_PRINTED_DL_PLEASE_WAIT)
AND IS_FIXER_MISSION_LAUNCH_DISABLED()
IF FIXER_APP_GET_APP_CURRENT_PAGE() = FAA_PAGE_DATA_LEAK_SELECTION
SWITCH g_eFixerDisableMissionLaunchReason
CASE FMLDR_PP2_UNLOCKED_CALL
CASE FMLDR_PPF_UNLOCKED_CALL
CASE FMLDR_BG2_UNLOCKED_CALL
CASE FMLDR_BGF_UNLOCKED_CALL
CASE FMLDR_HP2_UNLOCKED_CALL
CASE FMLDR_HPF_UNLOCKED_CALL
PRINT_HELP("FXR_NX_MIS_WAIT")
SET_BIT(iBS, FAA_BS_PRINTED_DL_PLEASE_WAIT)
BREAK
ENDSWITCH
ENDIF
ENDIF
IF NOT IS_BIT_SET(iBS, FAA_BS_PRINTED_CONTINUE_STORY_HELP)
IF NOT HAS_LOCAL_PLAYER_COMPLETED_FIXER_STORY_MISSION(FSM_PARTY_PROMOTER_MISSION)
OR NOT HAS_LOCAL_PLAYER_COMPLETED_FIXER_STORY_MISSION(FSM_BILLIONAIRE_GAMES_MISSION)
OR NOT HAS_LOCAL_PLAYER_COMPLETED_FIXER_STORY_MISSION(FSM_HOOD_PASS_MISSION)
OR IS_FIXER_STORY_ON_COOLDOWN(TRUE)
SET_BIT(iBS, FAA_BS_PRINTED_CONTINUE_STORY_HELP)
EXIT
ENDIF
IF FIXER_APP_GET_APP_CURRENT_PAGE() = FAA_PAGE_DATA_LEAK_SELECTION
IF HAS_PLAYER_COMPLETED_FIXER_STORY_AS_LEADER(PLAYER_ID())
//We have finished the story.
IF NOT HAS_PLAYER_COMPLETED_FIXER_STRAND(PLAYER_ID(), FS_FIRE_IN_THE_BOOTH)
PRINT_HELP("FXRAP_FIN_WAIT3")
ELIF NOT HAS_PLAYER_COMPLETED_FIXER_STRAND(PLAYER_ID(), FS_FINALE)
PRINT_HELP("FXRAP_FIN_WAIT5")
ENDIF
SET_BIT(iBS, FAA_BS_PRINTED_CONTINUE_STORY_HELP)
ELSE
//We have finished the three data leaks. Show appropriate help
IF NOT HAS_LOCAL_PLAYER_VIEWED_FIXER_HQ_POST_DATALEAK_CUTSCENE()
PRINT_HELP("FXR_AP_FIN_WAIT")
ELIF NOT HAS_PLAYER_COMPLETED_FIXER_STRAND(PLAYER_ID(), FS_FIRE_IN_THE_BOOTH)
IF IS_BIT_SET(g_sFixerFlow.Bitset, ciFIXER_FLOW_BITSET__FIRE_IN_BOOTH_READY_CALL_DONE)
PRINT_HELP("FXRAP_FIN_WAIT3")
ELSE
PRINT_HELP("FXRAP_FIN_WAIT2")
ENDIF
ELIF NOT HAS_PLAYER_COMPLETED_FIXER_STRAND(PLAYER_ID(), FS_FINALE)
IF IS_BIT_SET(g_sFixerFlow.Bitset, ciFIXER_FLOW_BITSET__FINALE_READY_CALL_DONE)
PRINT_HELP("FXRAP_FIN_WAIT5")
ELSE
PRINT_HELP("FXRAP_FIN_WAIT4")
ENDIF
ENDIF
SET_BIT(iBS, FAA_BS_PRINTED_CONTINUE_STORY_HELP)
ENDIF
ENDIF
ENDIF
ENDPROC
PROC SET_HELP_TO_DISPLAY_AFTER_DIALOGUE(STRING sHelp)
sTutTextAfterDialogue = sHelp
PRINTLN(DEBUG_INTERNET, "<APP_FIXER_HQ> SET_HELP_TO_DISPLAY_AFTER_DIALOGUE - Text label: ", sTutTextAfterDialogue)
ENDPROC
FUNC BOOL HAVE_ALL_DIALOGUE_TUTORIALS_BEEN_COMPLETED()
IF GET_MP_BOOL_CHARACTER_STAT(MP_STAT_BS_FRANKLIN_DIALOGUE_0)
AND GET_MP_BOOL_CHARACTER_STAT(MP_STAT_BS_FRANKLIN_DIALOGUE_1)
AND GET_MP_BOOL_CHARACTER_STAT(MP_STAT_BS_FRANKLIN_DIALOGUE_2)
AND GET_MP_BOOL_CHARACTER_STAT(MP_STAT_BS_IMANI_D_APP_SETUP)
AND GET_MP_BOOL_CHARACTER_STAT(MP_STAT_BS_IMANI_D_APP_STRAND)
AND GET_MP_BOOL_CHARACTER_STAT(MP_STAT_BS_IMANI_D_APP_PARTY)
AND GET_MP_BOOL_CHARACTER_STAT(MP_STAT_BS_IMANI_D_APP_PARTY_2)
AND GET_MP_BOOL_CHARACTER_STAT(MP_STAT_BS_IMANI_D_APP_PARTY_F)
AND GET_MP_BOOL_CHARACTER_STAT(MP_STAT_BS_IMANI_D_APP_BILL)
AND GET_MP_BOOL_CHARACTER_STAT(MP_STAT_BS_IMANI_D_APP_BILL_2)
AND GET_MP_BOOL_CHARACTER_STAT(MP_STAT_BS_IMANI_D_APP_BILL_F)
AND GET_MP_BOOL_CHARACTER_STAT(MP_STAT_BS_IMANI_D_APP_HOOD)
AND GET_MP_BOOL_CHARACTER_STAT(MP_STAT_BS_IMANI_D_APP_HOOD_2)
AND GET_MP_BOOL_CHARACTER_STAT(MP_STAT_BS_IMANI_D_APP_HOOD_F)
AND GET_PACKED_STAT_BOOL(PACKED_MP_BOOL_BS_IMANI_D_APP_SETUP_2)
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
PROC FIXER_APP_SELECT_DIALOGUE_TUTORIAL()
BOOL bStartNewDialogue
IF NOT IS_BIT_SET(iBS, FAA_BS_CURRENTLY_PLAYING_TUTORIAL)
AND NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF FIXER_APP_GET_APP_CURRENT_PAGE() = FAA_PAGE_HOME
AND NOT GET_MP_BOOL_CHARACTER_STAT(MP_STAT_BS_FRANKLIN_DIALOGUE_0)
//Main intro
bStartNewDialogue = TRUE
iTutorialHelpTime = 28500
iDialogueRequestID = F_APP_D_INTRO
SET_HELP_TO_DISPLAY_AFTER_DIALOGUE("FIX_VIP_TUT1")
SET_MP_BOOL_CHARACTER_STAT(MP_STAT_BS_FRANKLIN_DIALOGUE_0, TRUE)
ELIF FIXER_APP_GET_APP_CURRENT_PAGE() = FAA_PAGE_SECURITY_CONTRACT_SELECTION
AND NOT GET_MP_BOOL_CHARACTER_STAT(MP_STAT_BS_FRANKLIN_DIALOGUE_1)
//Security contracts explanation
bStartNewDialogue = TRUE
iTutorialHelpTime = 30000
iDialogueRequestID = F_APP_D_SEC_CON
SET_MP_BOOL_CHARACTER_STAT(MP_STAT_BS_FRANKLIN_DIALOGUE_1, TRUE)
ELIF FIXER_APP_GET_APP_CURRENT_PAGE() = FAA_PAGE_SECURITY_CONTRACT_SELECTION
AND NOT GET_MP_BOOL_CHARACTER_STAT(MP_STAT_BS_FRANKLIN_DIALOGUE_2)
//Security contracts explanation part 2
bStartNewDialogue = TRUE
iTutorialHelpTime = 18500
iDialogueRequestID = F_APP_D_SEC_CON2
IF g_sMPTunables.bFIXER_ENABLE_SF_BILLBOARDS
SET_BIT(iBS, FAA_BS_TRIGGER_BONUS_BILLBOARD_DIALOGUE)
ELSE
SET_HELP_TO_DISPLAY_AFTER_DIALOGUE("FIX_VIP_TUT2")
ENDIF
SET_MP_BOOL_CHARACTER_STAT(MP_STAT_BS_FRANKLIN_DIALOGUE_2, TRUE)
ELIF IS_BIT_SET(iBS, FAA_BS_TRIGGER_BONUS_BILLBOARD_DIALOGUE)
//Security contracts explanation part 3
bStartNewDialogue = TRUE
iTutorialHelpTime = 12000
iDialogueRequestID = F_APP_D_SEC_CON3
SET_HELP_TO_DISPLAY_AFTER_DIALOGUE("FIX_VIP_TUT2")
CLEAR_BIT(iBS, FAA_BS_TRIGGER_BONUS_BILLBOARD_DIALOGUE)
ELIF FIXER_APP_GET_APP_CURRENT_PAGE() = FAA_PAGE_HOME
AND HAS_LOCAL_PLAYER_VIEWED_FIXER_HQ_POST_SETUP_CUTSCENE()
AND NOT (GET_MP_BOOL_CHARACTER_STAT(MP_STAT_BS_IMANI_D_APP_SETUP)
AND GET_PACKED_STAT_BOOL(PACKED_MP_BOOL_BS_IMANI_D_APP_SETUP_2))
IF HAS_LOCAL_PLAYER_UNLOCKED_FIXER_STORY()
AND HAS_LOCAL_PLAYER_COMPLETED_FIXER_INTRO_MISSION()
IF HAS_LOCAL_PLAYER_COMPLETED_FIXER_SETUP_MISSION()
SET_MP_BOOL_CHARACTER_STAT(MP_STAT_BS_IMANI_D_APP_SETUP, TRUE)
SET_PACKED_STAT_BOOL(PACKED_MP_BOOL_BS_IMANI_D_APP_SETUP_2, TRUE)
ELSE
IF NOT GET_MP_BOOL_CHARACTER_STAT(MP_STAT_BS_IMANI_D_APP_SETUP)
//Imani - Setup mision description
bStartNewDialogue = TRUE
iTutorialHelpTime = 25000
iDialogueRequestID = F_APP_D_SETUP
SET_MP_BOOL_CHARACTER_STAT(MP_STAT_BS_IMANI_D_APP_SETUP, TRUE)
ELIF NOT GET_PACKED_STAT_BOOL(PACKED_MP_BOOL_BS_IMANI_D_APP_SETUP_2)
//Imani - Setup mision description part 2
bStartNewDialogue = TRUE
iTutorialHelpTime = 11300
iDialogueRequestID = F_APP_D_SETUP_2
SET_HELP_TO_DISPLAY_AFTER_DIALOGUE("FIX_VIP_TUT3")
SET_PACKED_STAT_BOOL(PACKED_MP_BOOL_BS_IMANI_D_APP_SETUP_2, TRUE)
ENDIF
ENDIF
ENDIF
ELIF FIXER_APP_GET_APP_CURRENT_PAGE() = FAA_PAGE_DATA_LEAK_SELECTION
AND NOT GET_MP_BOOL_CHARACTER_STAT(MP_STAT_BS_IMANI_D_APP_STRAND)
//Imani - Select strand first intro
bStartNewDialogue = TRUE
iTutorialHelpTime = 17250
iDialogueRequestID = F_APP_D_SELECT_LEAK
SET_HELP_TO_DISPLAY_AFTER_DIALOGUE("FIX_VIP_TUT4")
SET_MP_BOOL_CHARACTER_STAT(MP_STAT_BS_IMANI_D_APP_STRAND, TRUE)
ELIF FIXER_APP_GET_APP_CURRENT_PAGE() = FAA_PAGE_DATA_LEAK_SELECTION
AND GET_LOCAL_PLAYER_CURRENT_FIXER_STRAND(TRUE) = FS_PARTY_PROMOTER
AND NOT GET_MP_BOOL_CHARACTER_STAT(MP_STAT_BS_IMANI_D_APP_PARTY)
//Imani - Party promoter strand intro
bStartNewDialogue = TRUE
iTutorialHelpTime = 11000
iDialogueRequestID = F_APP_D_PARTY_P_INT
SET_MP_BOOL_CHARACTER_STAT(MP_STAT_BS_IMANI_D_APP_PARTY, TRUE)
ELIF FIXER_APP_GET_APP_CURRENT_PAGE() = FAA_PAGE_DATA_LEAK_SELECTION
AND GET_LOCAL_PLAYER_CURRENT_FIXER_STRAND(TRUE) = FS_BILLIONAIRE_GAMES
AND NOT GET_MP_BOOL_CHARACTER_STAT(MP_STAT_BS_IMANI_D_APP_BILL)
// Billionaire games strand intro - Imani
bStartNewDialogue = TRUE
iTutorialHelpTime = 13000
iDialogueRequestID = F_APP_D_BILL_G_INT
SET_MP_BOOL_CHARACTER_STAT(MP_STAT_BS_IMANI_D_APP_BILL, TRUE)
ELIF FIXER_APP_GET_APP_CURRENT_PAGE() = FAA_PAGE_DATA_LEAK_SELECTION
AND GET_LOCAL_PLAYER_CURRENT_FIXER_STRAND(TRUE) = FS_HOOD_PASS
AND NOT GET_MP_BOOL_CHARACTER_STAT(MP_STAT_BS_IMANI_D_APP_HOOD)
// Hood pass strand intro - Imani
bStartNewDialogue = TRUE
iTutorialHelpTime = 11000
iDialogueRequestID = F_APP_D_HOOD_P_INT
SET_MP_BOOL_CHARACTER_STAT(MP_STAT_BS_IMANI_D_APP_HOOD, TRUE)
ELIF FIXER_APP_GET_APP_CURRENT_PAGE() = FAA_PAGE_DATA_LEAK_SELECTION
AND GET_LOCAL_PLAYER_CURRENT_FIXER_STRAND(TRUE) = FS_PARTY_PROMOTER
AND eSelectedDataLeakStrand = FS_PARTY_PROMOTER
IF iSelectedDataLeakInStrand = 1
IF NOT GET_MP_BOOL_CHARACTER_STAT(MP_STAT_BS_IMANI_D_APP_PARTY_2)
AND HAS_LOCAL_PLAYER_COMPLETED_FIXER_STORY_MISSION(FSM_PARTY_PROMOTER_INVESTIGATION_1)
//Imani - Party promoter mission 2 intro
bStartNewDialogue = TRUE
iTutorialHelpTime = 29600
iDialogueRequestID = F_APP_D_PARTY_P_M2
SET_MP_BOOL_CHARACTER_STAT(MP_STAT_BS_IMANI_D_APP_PARTY_2, TRUE)
ENDIF
ELIF iSelectedDataLeakInStrand = 2
IF NOT GET_MP_BOOL_CHARACTER_STAT(MP_STAT_BS_IMANI_D_APP_PARTY_F)
AND HAS_LOCAL_PLAYER_COMPLETED_FIXER_STORY_MISSION(FSM_PARTY_PROMOTER_INVESTIGATION_2)
//Imani - Party promoter finale intro
bStartNewDialogue = TRUE
iTutorialHelpTime = 6000
iDialogueRequestID = F_APP_D_PARTY_P_F
SET_MP_BOOL_CHARACTER_STAT(MP_STAT_BS_IMANI_D_APP_PARTY_F, TRUE)
ENDIF
ENDIF
ELIF FIXER_APP_GET_APP_CURRENT_PAGE() = FAA_PAGE_DATA_LEAK_SELECTION
AND GET_LOCAL_PLAYER_CURRENT_FIXER_STRAND(TRUE) = FS_HOOD_PASS
AND eSelectedDataLeakStrand = FS_HOOD_PASS
IF iSelectedDataLeakInStrand = 1
IF NOT GET_MP_BOOL_CHARACTER_STAT(MP_STAT_BS_IMANI_D_APP_HOOD_2)
AND HAS_LOCAL_PLAYER_COMPLETED_FIXER_STORY_MISSION(FSM_HOOD_PASS_INVESTIGATION_1)
//Imani - Hood pass mission 2 intro
bStartNewDialogue = TRUE
iTutorialHelpTime = 9500
iDialogueRequestID = F_APP_D_HOOD_P_M2
SET_MP_BOOL_CHARACTER_STAT(MP_STAT_BS_IMANI_D_APP_HOOD_2, TRUE)
ENDIF
ELIF iSelectedDataLeakInStrand = 2
IF NOT GET_MP_BOOL_CHARACTER_STAT(MP_STAT_BS_IMANI_D_APP_HOOD_F)
AND HAS_LOCAL_PLAYER_COMPLETED_FIXER_STORY_MISSION(FSM_HOOD_PASS_INVESTIGATION_2)
//Imani - Hood Pass finale intro
bStartNewDialogue = TRUE
iTutorialHelpTime = 7250
iDialogueRequestID = F_APP_D_HOOD_P_F
SET_MP_BOOL_CHARACTER_STAT(MP_STAT_BS_IMANI_D_APP_HOOD_F, TRUE)
ENDIF
ENDIF
ELIF FIXER_APP_GET_APP_CURRENT_PAGE() = FAA_PAGE_DATA_LEAK_SELECTION
AND GET_LOCAL_PLAYER_CURRENT_FIXER_STRAND(TRUE) = FS_BILLIONAIRE_GAMES
AND eSelectedDataLeakStrand = FS_BILLIONAIRE_GAMES
IF iSelectedDataLeakInStrand = 1
IF NOT GET_MP_BOOL_CHARACTER_STAT(MP_STAT_BS_IMANI_D_APP_BILL_2)
AND HAS_LOCAL_PLAYER_COMPLETED_FIXER_STORY_MISSION(FSM_BILLIONAIRE_GAMES_INVESTIGATION_1)
//Imani - Billionaire games mission 2 intro
bStartNewDialogue = TRUE
iTutorialHelpTime = 29000
iDialogueRequestID = F_APP_D_BILL_G_M2
SET_MP_BOOL_CHARACTER_STAT(MP_STAT_BS_IMANI_D_APP_BILL_2, TRUE)
ENDIF
ELIF iSelectedDataLeakInStrand = 2
IF NOT GET_MP_BOOL_CHARACTER_STAT(MP_STAT_BS_IMANI_D_APP_BILL_F)
AND HAS_LOCAL_PLAYER_COMPLETED_FIXER_STORY_MISSION(FSM_BILLIONAIRE_GAMES_INVESTIGATION_2)
//Imani - Billionaire games finale intro
bStartNewDialogue = TRUE
iTutorialHelpTime = 4250
iDialogueRequestID = F_APP_D_BILL_G_F
SET_MP_BOOL_CHARACTER_STAT(MP_STAT_BS_IMANI_D_APP_BILL_F, TRUE)
ENDIF
ENDIF
ENDIF
ENDIF
IF bStartNewDialogue
SET_BIT(iBS, FAA_BS_CURRENTLY_PLAYING_TUTORIAL)
PRINTLN("<APP_FIXER_HQ><APP_TUT> FIXER_APP_SELECT_DIALOGUE_TUTORIAL Running tutorial for: ", iTutorialHelpTime, " seconds. Tutorial ID: ", iDialogueRequestID)
ELIF IS_BIT_SET(iBS, FAA_BS_CURRENTLY_PLAYING_TUTORIAL)
IF NOT HAS_NET_TIMER_STARTED(stTutorialTimer)
START_NET_TIMER(stTutorialTimer)
PRINTLN("<APP_FIXER_HQ><APP_TUT> FIXER_APP_SELECT_DIALOGUE_TUTORIAL Starting timer time: ", iTutorialHelpTime, " Tutorial ID: ", iDialogueRequestID)
ELIF HAS_NET_TIMER_EXPIRED(stTutorialTimer, iTutorialHelpTime)
AND NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
CLEAR_BIT(iBS, FAA_BS_CURRENTLY_PLAYING_TUTORIAL)
iDialoguePlayingID = -1
iTutorialHelpTime = 0
RESET_NET_TIMER(stTutorialTimer)
SHOW_SPEAKER_ICON(FALSE)
PRINTLN("<APP_FIXER_HQ><APP_TUT> FIXER_APP_SELECT_DIALOGUE_TUTORIAL Starting timer expired time: ", iTutorialHelpTime, " Tutorial ID: ", iDialogueRequestID)
//Once all the tutorial are complete we no longer need this function
IF HAVE_ALL_DIALOGUE_TUTORIALS_BEEN_COMPLETED()
SET_BIT(iBS, FAA_BS_DIALOGUE_TUTORIAL_COMPLETE)
SET_BIT(iBS, FAA_BS_DIALOGUE_TUTORIAL_COMPLETE_THIS_BOOT)
ENDIF
ENDIF
ENDIF
ENDPROC
PROC FIXER_APP_SETUP_TUTORIAL_DIALOGUE()
IF HAVE_ALL_DIALOGUE_TUTORIALS_BEEN_COMPLETED()
SET_BIT(iBS, FAA_BS_DIALOGUE_TUTORIAL_COMPLETE)
ELSE
SET_USE_DLC_DIALOGUE(TRUE)
PRINTLN("<APP_FIXER_HQ> FIXER_APP_SETUP_TUTORIAL_DIALOGUE peds added for dialogue")
ENDIF
ENDPROC
#IF IS_DEBUG_BUILD
PROC DEBUG_PRINT_FIXER_FLOW_STATE()
PRINTLN("<APP_FIXER_HQ> DEBUG_PRINT_FIXER_FLOW_STATE - HAS_LOCAL_PLAYER_UNLOCKED_FIXER_STORY = ", HAS_LOCAL_PLAYER_UNLOCKED_FIXER_STORY())
PRINTLN("<APP_FIXER_HQ> DEBUG_PRINT_FIXER_FLOW_STATE - HAS_LOCAL_PLAYER_COMPLETED_FIXER_INTRO_MISSION = ", HAS_LOCAL_PLAYER_COMPLETED_FIXER_INTRO_MISSION())
PRINTLN("<APP_FIXER_HQ> DEBUG_PRINT_FIXER_FLOW_STATE - HAS_LOCAL_PLAYER_COMPLETED_FIXER_SETUP_MISSION = ", HAS_LOCAL_PLAYER_COMPLETED_FIXER_SETUP_MISSION())
PRINTLN("<APP_FIXER_HQ> DEBUG_PRINT_FIXER_FLOW_STATE - HAS_PLAYER_STARTED_FIXER_STORY_INVESTIGATIONS = ", HAS_PLAYER_STARTED_FIXER_STORY_INVESTIGATIONS(PLAYER_ID()))
PRINTLN("<APP_FIXER_HQ> DEBUG_PRINT_FIXER_FLOW_STATE - HAS_LOCAL_PLAYER_VIEWED_FIXER_HQ_POST_SETUP_CUTSCENE = ", HAS_LOCAL_PLAYER_VIEWED_FIXER_HQ_POST_SETUP_CUTSCENE())
PRINTLN("<APP_FIXER_HQ> DEBUG_PRINT_FIXER_FLOW_STATE - HAS_PLAYER_STARTED_A_STRAND_OR_COMPLETED_FIXER_STORY = ", HAS_PLAYER_STARTED_A_STRAND_OR_COMPLETED_FIXER_STORY())
PRINTLN("<APP_FIXER_HQ> DEBUG_PRINT_FIXER_FLOW_STATE - ciFIXER_FLOW_BITSET2__INVESTIGATIONS_CALL_DONE = ", IS_BIT_SET(g_sFixerFlow.Bitset2, ciFIXER_FLOW_BITSET2__INVESTIGATIONS_CALL_DONE))
PRINTLN("<APP_FIXER_HQ> DEBUG_PRINT_FIXER_FLOW_STATE - ciFIXER_FLOW_BITSET2__FRANKLIN_GOLF_COURSE_CALL_DONE = ", IS_BIT_SET(g_sFixerFlow.Bitset2, ciFIXER_FLOW_BITSET2__FRANKLIN_GOLF_COURSE_CALL_DONE))
PRINTLN("<APP_FIXER_HQ> DEBUG_PRINT_FIXER_FLOW_STATE - ciFIXER_FLOW_BITSET2__FRANKLIN_MEET_IMANI_CALL_DONE = ", IS_BIT_SET(g_sFixerFlow.Bitset2, ciFIXER_FLOW_BITSET2__FRANKLIN_MEET_IMANI_CALL_DONE))
PRINTLN("")
PRINTLN("<APP_FIXER_HQ> DEBUG_PRINT_FIXER_FLOW_STATE - GET_LOCAL_PLAYER_CURRENT_FIXER_STRAND(TRUE) = ", GET_LOCAL_PLAYER_CURRENT_FIXER_STRAND(TRUE))
IF IS_FIXER_MISSION_LAUNCH_DISABLED()
PRINTLN("<APP_FIXER_HQ> DEBUG_PRINT_FIXER_FLOW_STATE - IS_FIXER_MISSION_LAUNCH_DISABLED() ", FIXER_MISSION_LAUNCH_DISABLE_REASON_TO_STRING(g_eFixerDisableMissionLaunchReason))
ELSE
PRINTLN("<APP_FIXER_HQ> DEBUG_PRINT_FIXER_FLOW_STATE - IS_FIXER_MISSION_LAUNCH_DISABLED() = FALSE")
ENDIF
PRINTLN("")
PRINTLN("<APP_FIXER_HQ> DEBUG_PRINT_FIXER_FLOW_STATE - HAS_LOCAL_PLAYER_COMPLETED_FIXER_STORY_MISSION - FSM_PARTY_PROMOTER_INVESTIGATION_1 = ", HAS_LOCAL_PLAYER_COMPLETED_FIXER_STORY_MISSION(FSM_PARTY_PROMOTER_INVESTIGATION_1))
PRINTLN("<APP_FIXER_HQ> DEBUG_PRINT_FIXER_FLOW_STATE - HAS_LOCAL_PLAYER_COMPLETED_FIXER_STORY_MISSION - FSM_PARTY_PROMOTER_INVESTIGATION_2 = ", HAS_LOCAL_PLAYER_COMPLETED_FIXER_STORY_MISSION(FSM_PARTY_PROMOTER_INVESTIGATION_2))
PRINTLN("<APP_FIXER_HQ> DEBUG_PRINT_FIXER_FLOW_STATE - HAS_LOCAL_PLAYER_COMPLETED_FIXER_STORY_MISSION - FSM_PARTY_PROMOTER_MISSION = ", HAS_LOCAL_PLAYER_COMPLETED_FIXER_STORY_MISSION(FSM_PARTY_PROMOTER_MISSION))
PRINTLN("")
PRINTLN("<APP_FIXER_HQ> DEBUG_PRINT_FIXER_FLOW_STATE - HAS_LOCAL_PLAYER_COMPLETED_FIXER_STORY_MISSION - FSM_BILLIONAIRE_GAMES_INVESTIGATION_1 = ", HAS_LOCAL_PLAYER_COMPLETED_FIXER_STORY_MISSION(FSM_BILLIONAIRE_GAMES_INVESTIGATION_1))
PRINTLN("<APP_FIXER_HQ> DEBUG_PRINT_FIXER_FLOW_STATE - HAS_LOCAL_PLAYER_COMPLETED_FIXER_STORY_MISSION - FSM_BILLIONAIRE_GAMES_INVESTIGATION_2 = ", HAS_LOCAL_PLAYER_COMPLETED_FIXER_STORY_MISSION(FSM_BILLIONAIRE_GAMES_INVESTIGATION_2))
PRINTLN("<APP_FIXER_HQ> DEBUG_PRINT_FIXER_FLOW_STATE - HAS_LOCAL_PLAYER_COMPLETED_FIXER_STORY_MISSION - FSM_BILLIONAIRE_GAMES_MISSION = ", HAS_LOCAL_PLAYER_COMPLETED_FIXER_STORY_MISSION(FSM_BILLIONAIRE_GAMES_MISSION))
PRINTLN("")
PRINTLN("<APP_FIXER_HQ> DEBUG_PRINT_FIXER_FLOW_STATE - HAS_LOCAL_PLAYER_COMPLETED_FIXER_STORY_MISSION - FSM_HOOD_PASS_INVESTIGATION_1 = ", HAS_LOCAL_PLAYER_COMPLETED_FIXER_STORY_MISSION(FSM_HOOD_PASS_INVESTIGATION_1))
PRINTLN("<APP_FIXER_HQ> DEBUG_PRINT_FIXER_FLOW_STATE - HAS_LOCAL_PLAYER_COMPLETED_FIXER_STORY_MISSION - FSM_HOOD_PASS_INVESTIGATION_2 = ", HAS_LOCAL_PLAYER_COMPLETED_FIXER_STORY_MISSION(FSM_HOOD_PASS_INVESTIGATION_2))
PRINTLN("<APP_FIXER_HQ> DEBUG_PRINT_FIXER_FLOW_STATE - HAS_LOCAL_PLAYER_COMPLETED_FIXER_STORY_MISSION - FSM_HOOD_PASS_MISSION = ", HAS_LOCAL_PLAYER_COMPLETED_FIXER_STORY_MISSION(FSM_HOOD_PASS_MISSION))
PRINTLN("")
ENDPROC
#ENDIF
PROC SCRIPT_INITALISE()
// pregame cleanup
RUN_CLEANUP_CHECKS()
IF HAS_FORCE_CLEANUP_OCCURRED()
OR MPGlobalsAmbience.bRunningFmIntroCut
IF MPGlobalsAmbience.bRunningFmIntroCut
PRINTLN("<APP_FIXER_HQ> bRunningFmIntroCut is true so cleaning up!")
ENDIF
PRINTLN("<APP_FIXER_HQ> DEFAULT CLEANUP")
SCRIPT_CLEANUP()
ENDIF
mov = REQUEST_SCALEFORM_MOVIE("FIXER_APP")
WHILE (NOT HAS_SCALEFORM_MOVIE_LOADED(mov))
HIDE_CASH_HUD_IN_APP()
WAIT(0)
ENDWHILE
HANG_UP_AND_PUT_AWAY_PHONE(TRUE)
DISABLE_CELLPHONE(TRUE)
HIDE_CASH_HUD_IN_APP()
Pause_Objective_Text()
THEFEED_PAUSE()
//Grab the current property
eThisFixerHQ = eThisFixerHQ // Fixing release compiler error
eThisFixerHQ = GET_FIXER_HQ_ID_FROM_SIMPLE_INTERIOR_ID(GET_SIMPLE_INTERIOR_PLAYER_IS_IN(PLAYER_ID()))
SEND_ALL_DATA_TO_SCALEFORM()
FIXER_APP_PLAY_INPUT_SOUND(FAA_IS_BOOT)
FIXER_APP_SETUP_TUTORIAL_DIALOGUE()
IF IS_PC_VERSION()
SET_MULTIHEAD_SAFE(TRUE, TRUE, TRUE, TRUE)
ENDIF
IF NOT IS_AUDIO_SCENE_ACTIVE("DLC_Fixer_Office_Room_Use_PC_Scene")
START_AUDIO_SCENE("DLC_Fixer_Office_Room_Use_PC_Scene")
ENDIF
g_bFHQAppOpen = TRUE
#IF IS_DEBUG_BUILD
DEBUG_PRINT_FIXER_FLOW_STATE()
#ENDIF
#IF FEATURE_GEN9_EXCLUSIVE
SET_MP_BOOL_CHARACTER_STAT(MP_STAT_DARKNETACCESSED, TRUE)
#ENDIF
ENDPROC
#IF IS_DEBUG_BUILD
PROC CREATE_WIDGETS()
START_WIDGET_GROUP("appFixerSecurity")
ADD_BIT_FIELD_WIDGET("iBS", iBS)
STOP_WIDGET_GROUP()
ENDPROC
#ENDIF
//***********SCRIPT***********
SCRIPT
PRINTLN("<APP_FIXER_HQ> started \"", GET_THIS_SCRIPT_NAME(), "\"")
IF GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(GET_HASH_KEY("appFixerSecurity")) > 1
PRINTLN("<APP_FIXER_HQ> Fixer HQ app script already running! cleaning up.")
SCRIPT_CLEANUP()
ENDIF
NETWORK_SET_SCRIPT_IS_SAFE_FOR_NETWORK_GAME()
SCRIPT_INITALISE()
PRINTLN("<APP_FIXER_HQ> Initalisation complete. Fixer HQ = ", eThisFixerHQ)
WAIT(0)
CLEAR_HELP()
#IF IS_DEBUG_BUILD
CREATE_WIDGETS()
#ENDIF
/// main update loop
WHILE g_bFHQAppOpen
RUN_CLEANUP_CHECKS()
RENDER_FIXER_APP()
PASS_INPUTS_TO_SCALEFORM()
FIXER_APP_RUN_HELP_TUTORIAL()
IF NOT IS_BIT_SET(iBS, FAA_BS_DIALOGUE_TUTORIAL_COMPLETE)
FIXER_APP_SELECT_DIALOGUE_TUTORIAL()
FIXER_APP_RUN_TUTORIAL_DIALOGUE()
ENDIF
IF NOT IS_BIT_SET(iBS, FAA_BS_FADE_TO_EXIT)
CHECK_BUTTON_PRESS()
MAINTAIN_ROLLOVER_FUNCTIONALITY()
MAINTAIN_SECURITY_CONTRACT_COOLDOWN_EXPIRATION()
ELIF IS_BIT_SET(iBS, FAA_BS_FADE_TO_EXIT)
IF IS_SCREEN_FADED_OUT()
FIXER_LAUNCH_VIP_SETUP_MISSION()
ELIF NOT IS_SCREEN_FADING_OUT()
DO_SCREEN_FADE_OUT(500)
ENDIF
ENDIF
WAIT(0)
ENDWHILE
// Script should never reach here. Always terminate with cleanup function.
CASSERTLN(DEBUG_INTERNET, "<APP_FIXER_HQ> \"", GET_THIS_SCRIPT_NAME(), "\" should never reach here. Always terminate with cleanup function.")
#ENDIF
ENDSCRIPT