Files
2025-09-29 00:52:08 +02:00

1082 lines
39 KiB
Python
Executable File

///// appCovertOps
///// Mark Richardson - 27/03/17
///// Covert Ops WVM mission launching functionality
USING "rage_builtins.sch"
USING "globals.sch"
USING "cellphone_public.sch"
USING "commands_zone.sch"
USING "menu_public.sch"
USING "svm_mission_flow.sch"
//***********Script CONSTS***********
//Local BS consts
CONST_INT WVM_BS_WAITING_FOR_BUTTON_RETURN_VALUE 0
CONST_INT WVM_BS_OVERLAY_SCREEN_ACTIVE 1
CONST_INT WVM_BS_MISSION_IMAGES_DOWNLOADED 2
CONST_INT WVM_BS_DIALOGUE_TUTORIAL_COMPLETE 3
CONST_INT WVM_BS_CURRENTLY_PLAYING_TUTORIAL 4
CONST_INT WVM_BS_FIRST_MISSION_UNLOCKED 5
CONST_INT WVM_BS_HELP_TEXT_DONE_THIS_BOOT 6
CONST_INT WVM_BS_ALL_MISSIONS_UNLOCKED 7
CONST_INT ciINPUT_KEYBOARD_DOWN 300
CONST_INT ciINPUT_KEYBOARD_UP 301
//Enum for button indexes returned by SF
ENUM WVM_BUTTON_INDEXES
BUTTON_LOGIN = 100,
BUTTON_OVERLAY_ACCEPT = 101,
BUTTON_OVERLAY_CANCEL = 102,
//SVM mission buttons
BUTTON_WVM_1 = 0,
BUTTON_WVM_2 = 1,
BUTTON_WVM_3 = 2,
BUTTON_WVM_4 = 3,
BUTTON_WVM_5 = 4,
BUTTON_WVM_6 = 5,
BUTTON_WVM_7 = 6,
BUTTON_WVM_8 = 7
ENDENUM
//Enum for the current page ID
ENUM WVM_PAGE_ID
PAGE_LOGIN = 0,
PAGE_HOME
ENDENUM
ENUM WVM_APP_STAGE_ID
WVM_STAGE_IDLE = 0,
//Overlay on screen stages
WVM_STAGE_CONFIRM_WVM_LAUNCH //Confirm the launch of a setup mission
ENDENUM
//***********Script variables***********
INT iBS = 0
INT iWVMToLaunch = -1
INT iTutorialHelpTime = 0
INT iTutorialDialogueID = -1
INT iMissionsCompleted = 0
STRING sMissionLanuchFailReason = ""
//Mission downloaded data
FMMC_PLANNING_MISSION_HEADER_DESCRIPTIONS sWVMDescriptions
WVM_PAGE_ID eCurrentPage = PAGE_LOGIN
WVM_APP_STAGE_ID eCurrentStage = WVM_STAGE_IDLE
SCRIPT_TIMER stDescriptionLoadTO
SCRIPT_TIMER stTutorialTimer
structPedsForConversation tutPedStruct
//The Scaleform movie
SCALEFORM_INDEX mov
SCALEFORM_RETURN_INDEX currentSelectionReturnIndex
SCALEFORM_RETURN_INDEX currentPageReturnIndex
//Control input variables
INT iLeftX
INT iLeftY
INT iRightX
INT iRightY
//***********Script functions***********
PROC SCRIPT_CLEANUP(BOOL bCleanupPlayerControl = FALSE, BOOL bDontCleanupBrowserFlag = FALSE)
SET_SCALEFORM_MOVIE_AS_NO_LONGER_NEEDED(mov)
SET_BROWSER_OPEN(bDontCleanupBrowserFlag)
DISABLE_CELLPHONE(FALSE)
Unpause_Objective_Text()
SET_AUDIO_SCRIPT_CLEANUP_TIME(1000)
PLAY_SOUND_FRONTEND(-1, "Logout", "DLC_GR_MOC_Computer_Sounds")
IF IS_PC_VERSION()
SET_MULTIHEAD_SAFE(FALSE, TRUE, TRUE, TRUE)
ENDIF
IF bCleanupPlayerControl
NET_SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
ENDIF
THEFEED_RESUME()
TERMINATE_THIS_THREAD()
ENDPROC
#IF IS_DEBUG_BUILD
FUNC STRING COVERT_OPS_GET_APP_STAGE_DEBUG_NAME(WVM_APP_STAGE_ID eStage)
SWITCH eStage
CASE WVM_STAGE_IDLE RETURN "WVM_STAGE_IDLE"
CASE WVM_STAGE_CONFIRM_WVM_LAUNCH RETURN "WVM_STAGE_CONFIRM_WVM_LAUNCH"
ENDSWITCH
RETURN "****Invalid****"
ENDFUNC
#ENDIF
/// PURPOSE:
/// Returns the current app stage
FUNC WVM_APP_STAGE_ID COVERT_OPS_GET_APP_STAGE()
RETURN eCurrentStage
ENDFUNC
/// PURPOSE:
/// Sets the current app stage
PROC COVERT_OPS_SET_APP_STAGE(WVM_APP_STAGE_ID eNewStage)
IF eCurrentStage != eNewStage
eCurrentStage = eNewStage
PRINTLN("<APP_CO> COVERT_OPS_SET_APP_STAGE Setting new stage to: ", COVERT_OPS_GET_APP_STAGE_DEBUG_NAME(eNewStage))
ENDIF
ENDPROC
/// PURPOSE:
/// Returns if the overlay screen is currently active
FUNC BOOL COVERT_OPS_IS_OVERLAY_OPEN()
RETURN IS_BIT_SET(iBS, WVM_BS_OVERLAY_SCREEN_ACTIVE)
ENDFUNC
PROC COVERT_OPS_SET_MISSION_LAUNCH_FAIL_REASON(STRING sReason)
sMissionLanuchFailReason = sReason
#IF IS_DEBUG_BUILD
PRINTLN("<APP_CO> COVERT_OPS_SET_MISSION_LAUNCH_FAIL_REASON Setting new fail reason: ", GET_FILENAME_FOR_AUDIO_CONVERSATION(sReason))
#ENDIF
ENDPROC
FUNC INT GET_REORDERED_WVM_MISSION_ID(INT iMissionID)
#IF IS_DEBUG_BUILD
IF GET_COMMANDLINE_PARAM_EXISTS("sc_GR_FLOW_PLAY_WVM_ORDER")
SWITCH iMissionID
CASE ciWVM_FLOW_MISSION_WVM_DUNE3 RETURN ciWVM_FLOW_MISSION_WVM_HALFTRACK
CASE ciWVM_FLOW_MISSION_WVM_HALFTRACK RETURN ciWVM_FLOW_MISSION_WVM_OPPRESSOR_1
CASE ciWVM_FLOW_MISSION_WVM_TRAILERSMALL RETURN ciWVM_FLOW_MISSION_WVM_APC
CASE ciWVM_FLOW_MISSION_WVM_APC RETURN ciWVM_FLOW_MISSION_WVM_TRAILERSMALL
CASE ciWVM_FLOW_MISSION_WVM_TRAILERLARGE RETURN ciWVM_FLOW_MISSION_WVM_OPPRESSOR_2
CASE ciWVM_FLOW_MISSION_WVM_TAMPA RETURN ciWVM_FLOW_MISSION_WVM_DUNE3
CASE ciWVM_FLOW_MISSION_WVM_OPPRESSOR_1 RETURN ciWVM_FLOW_MISSION_WVM_TAMPA
CASE ciWVM_FLOW_MISSION_WVM_OPPRESSOR_2 RETURN ciWVM_FLOW_MISSION_WVM_TRAILERLARGE
ENDSWITCH
ENDIF
#ENDIF
RETURN iMissionID
ENDFUNC
/// PURPOSE:
/// Sets the current app stage
PROC COVERT_OPS_SET_MISSION_TO_LAUNCH(INT iMissionID)
IF iWVMToLaunch != GET_REORDERED_WVM_MISSION_ID(iMissionID)
iWVMToLaunch = GET_REORDERED_WVM_MISSION_ID(iMissionID)
PRINTLN("<APP_CO> COVERT_OPS_SET_MISSION_TO_LAUNCH Setting new mission to: ", iWVMToLaunch)
ENDIF
ENDPROC
PROC COVERT_OPS_CLEAR_MISSION_LAUNCH_FAIL_REASON()
sMissionLanuchFailReason = ""
PRINTLN("<APP_CO> COVERT_OPS_CLEAR_MISSION_LAUNCH_FAIL_REASON called.")
ENDPROC
FUNC STRING COVERT_OPS_GET_MISSION_LAUNCH_FAIL_REASON()
RETURN sMissionLanuchFailReason
ENDFUNC
#IF IS_DEBUG_BUILD
FUNC BOOL SHOULD_WVM_MISSION_BE_AUTO_UNLOCKED(INT iMissionID)
IF NOT GET_COMMANDLINE_PARAM_EXISTS("sc_GUNRUNFlowPlayVariations")
AND NOT GET_COMMANDLINE_PARAM_EXISTS("sc_GUNRUNUnlockMobileOps")
RETURN FALSE
ENDIF
SWITCH iMissionID
CASE ciWVM_FLOW_MISSION_WVM_DUNE3 RETURN TRUE
CASE ciWVM_FLOW_MISSION_WVM_HALFTRACK RETURN TRUE
CASE ciWVM_FLOW_MISSION_WVM_TRAILERSMALL RETURN TRUE
CASE ciWVM_FLOW_MISSION_WVM_APC RETURN TRUE
CASE ciWVM_FLOW_MISSION_WVM_TRAILERLARGE RETURN TRUE
CASE ciWVM_FLOW_MISSION_WVM_TAMPA RETURN TRUE
CASE ciWVM_FLOW_MISSION_WVM_OPPRESSOR_1 RETURN TRUE
CASE ciWVM_FLOW_MISSION_WVM_OPPRESSOR_2 RETURN TRUE
ENDSWITCH
RETURN FALSE
ENDFUNC
#ENDIF
FUNC BOOL HAS_LOCAL_PLAYER_UNLOCKED_WVM_MISSION(INT iMissionID)
#IF IS_DEBUG_BUILD
IF SHOULD_WVM_MISSION_BE_AUTO_UNLOCKED(iMissionID)
RETURN TRUE
ENDIF
#ENDIF
RETURN (iMissionsCompleted >= GET_WVM_UNLOCK_VALUE(iMissionID))
ENDFUNC
/// PURPOSE:
/// Sets the mission unavailable value
FUNC BOOL CAN_PLAYER_LAUNCH_MISSION(INT iWVMissionToLaunch)
// // Check that mission is available
// IF NOT GB_IS_BOSS_MISSION_AVAILABLE(PLAYER_ID(), iMissionToLaunch, FALSE)
// CPRINTLN(DEBUG_INTERNET, "<APP_CO>CAN_PLAYER_LAUNCH_MISSION: NOPE! mission unavailable")
// COVERT_OPS_SET_MISSION_LAUNCH_FAIL_REASON("BKR_TF_R6")
// RETURN FALSE
// ENDIF
// IF NOT GB_IS_PLAYER_BOSS_OF_A_GANG(PLAYER_ID())
// CPRINTLN(DEBUG_INTERNET, "<APP_CO> CAN_PLAYER_LAUNCH_MISSION: NOPE! GB_IS_PLAYER_BOSS_OF_A_GANG is false")
// COVERT_OPS_SET_MISSION_LAUNCH_FAIL_REASON("DBG_BUN_NB")
// RETURN FALSE
// ENDIF
IF iWVMissionToLaunch < 0
OR iWVMissionToLaunch >= ciWVM_FLOW_MISSION_MAX
CPRINTLN(DEBUG_INTERNET, "<APP_CO> CAN_PLAYER_LAUNCH_MISSION: NOPE! mission to launch is invalid: ", iWVMissionToLaunch)
COVERT_OPS_SET_MISSION_LAUNCH_FAIL_REASON("SVM_MIS_FL")
RETURN FALSE
ENDIF
IF NOT HAS_LOCAL_PLAYER_UNLOCKED_WVM_MISSION(iWVMissionToLaunch)
CPRINTLN(DEBUG_INTERNET, "<APP_CO> CAN_PLAYER_LAUNCH_MISSION: NOPE! mission not unlocked: ", iWVMissionToLaunch)
COVERT_OPS_SET_MISSION_LAUNCH_FAIL_REASON("WVM_MIS_FNA")
RETURN FALSE
ENDIF
// Check we're not taking part in some other mission
IF GB_IS_PLAYER_CRITICAL_TO_JOB(PLAYER_ID())
CPRINTLN(DEBUG_INTERNET, "<APP_CO> CAN_PLAYER_LAUNCH_MISSION: NOPE! player critical to job")
COVERT_OPS_SET_MISSION_LAUNCH_FAIL_REASON("WVM_MIS_FL2")
RETURN FALSE
ENDIF
IF NETWORK_IS_ACTIVITY_SESSION()
CPRINTLN(DEBUG_INTERNET, "<APP_CO> CAN_PLAYER_LAUNCH_MISSION: NOPE! NETWORK_IS_ACTIVITY_SESSION is true")
COVERT_OPS_SET_MISSION_LAUNCH_FAIL_REASON("SVM_MIS_FL")
RETURN FALSE
ENDIF
IF iWVMissionToLaunch = ciWVM_FLOW_MISSION_WVM_OPPRESSOR_2 //Fail this mission is not available until you've completed ciWVM_FLOW_MISSION_WVM_OPPRESSOR_1
AND NOT WVM_IS_SPECIAL_VEHICLE_UNLOCKED(ciWVM_FLOW_MISSION_WVM_OPPRESSOR_1)
#IF IS_DEBUG_BUILD
AND NOT SHOULD_WVM_MISSION_BE_AUTO_UNLOCKED(iWVMissionToLaunch)
#ENDIF
CPRINTLN(DEBUG_INTERNET, "<APP_CO> CAN_PLAYER_LAUNCH_MISSION: NOPE! we have not completed ciWVM_FLOW_MISSION_WVM_OPPRESSOR_1. Launch mission = ", iWVMissionToLaunch)
COVERT_OPS_SET_MISSION_LAUNCH_FAIL_REASON("WVM_MIS_FDB")
RETURN FALSE
ENDIF
RETURN TRUE
ENDFUNC
PROC HIDE_OVERLAY()
BEGIN_SCALEFORM_MOVIE_METHOD(mov, "HIDE_OVERLAY")
END_SCALEFORM_MOVIE_METHOD()
COVERT_OPS_SET_APP_STAGE(WVM_STAGE_IDLE)
CLEAR_BIT(iBS, WVM_BS_OVERLAY_SCREEN_ACTIVE)
CDEBUG1LN(DEBUG_INTERNET, "<APP_CO> HIDE_OVERLAY")
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 RENDER_COVERT_OPS_APP()
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()
IF g_bInMultiplayer
SHOW_HUD_COMPONENT_THIS_FRAME(NEW_HUD_MP_CASH)//1544427
SHOW_HUD_COMPONENT_THIS_FRAME(NEW_HUD_MP_MESSAGE)
SHOW_HUD_COMPONENT_THIS_FRAME(NEW_HUD_CASH_CHANGE)
SHOW_HUD_COMPONENT_THIS_FRAME(NEW_HUD_CASH)
ENDIF
THEFEED_HIDE_THIS_FRAME()
ENABLE_CONTROL_ACTION(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 PASS_INPUTS_TO_SCALEFORM()
// bCursorInputProcessed = FALSE
ENABLE_CONTROL_ACTION(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
ENABLE_CONTROL_ACTION(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
IF IS_USING_CURSOR(FRONTEND_CONTROL)
ENABLE_CONTROL_ACTION(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(ciINPUT_KEYBOARD_UP)))
ENDIF
ENABLE_CONTROL_ACTION(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(ciINPUT_KEYBOARD_DOWN)))
ENDIF
IF IS_CONTROL_JUST_RELEASED(FRONTEND_CONTROL, INPUT_FRONTEND_DOWN)
CALL_SCALEFORM_MOVIE_METHOD_WITH_NUMBER(mov, "SET_INPUT_RELEASE_EVENT", TO_FLOAT(ENUM_TO_INT(ciINPUT_KEYBOARD_DOWN)))
ENDIF
IF IS_CONTROL_JUST_RELEASED(FRONTEND_CONTROL, INPUT_FRONTEND_UP)
CALL_SCALEFORM_MOVIE_METHOD_WITH_NUMBER(mov, "SET_INPUT_RELEASE_EVENT", TO_FLOAT(ENUM_TO_INT(ciINPUT_KEYBOARD_UP)))
ENDIF
ELSE
ENABLE_CONTROL_ACTION(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)))
// bCursorInputProcessed = TRUE
ENDIF
ENABLE_CONTROL_ACTION(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)))
//bCursorInputProcessed = TRUE
ENDIF
ENDIF
ENABLE_CONTROL_ACTION(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
ENABLE_CONTROL_ACTION(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
ENABLE_CONTROL_ACTION(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
ENABLE_CONTROL_ACTION(FRONTEND_CONTROL, INPUT_FRONTEND_CANCEL)
IF IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_CANCEL)
CALL_SCALEFORM_MOVIE_METHOD_WITH_NUMBER(mov, "SET_INPUT_EVENT", TO_FLOAT(ENUM_TO_INT(INPUT_FRONTEND_CANCEL)))
IF eCurrentPage = PAGE_LOGIN
OR eCurrentPage = PAGE_HOME
IF NOT COVERT_OPS_IS_OVERLAY_OPEN()
SCRIPT_CLEANUP(TRUE)
ELSE
CDEBUG1LN(DEBUG_INTERNET, "<APP_CO> [APP_CLOSE] 2 Back pressed not closing the app. page: ", eCurrentPage, " overlay: ", COVERT_OPS_IS_OVERLAY_OPEN())
ENDIF
ELSE
CDEBUG1LN(DEBUG_INTERNET, "<APP_CO> [APP_CLOSE] Back pressed not closing the app. page: ", eCurrentPage, " overlay: ", COVERT_OPS_IS_OVERLAY_OPEN())
ENDIF
IF COVERT_OPS_IS_OVERLAY_OPEN()
PLAY_SOUND_FRONTEND(-1, "Select_Mission_Cancel", "DLC_GR_MOC_Computer_Sounds")
HIDE_OVERLAY()
ENDIF
ENDIF
ENABLE_CONTROL_ACTION(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
ENABLE_CONTROL_ACTION(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_CURSOR(FRONTEND_CONTROL)
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))
//bCursorInputProcessed = TRUE
END_SCALEFORM_MOVIE_METHOD()
ENABLE_CONTROL_ACTION(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
ENABLE_CONTROL_ACTION(FRONTEND_CONTROL, INPUT_CURSOR_CANCEL)
IF IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_CURSOR_CANCEL)
CALL_SCALEFORM_MOVIE_METHOD_WITH_NUMBER(mov, "SET_INPUT_EVENT", TO_FLOAT(ENUM_TO_INT(INPUT_FRONTEND_CANCEL)))
IF eCurrentPage = PAGE_LOGIN
OR eCurrentPage = PAGE_HOME
IF NOT COVERT_OPS_IS_OVERLAY_OPEN()
SCRIPT_CLEANUP(TRUE)
ELSE
CDEBUG1LN(DEBUG_INTERNET, "<APP_CO> [APP_CLOSE] 2 Back pressed not closing the app. page: ", eCurrentPage, " overlay: ", COVERT_OPS_IS_OVERLAY_OPEN())
ENDIF
ELSE
CDEBUG1LN(DEBUG_INTERNET, "<APP_CO> [APP_CLOSE] Back pressed not closing the app. page: ", eCurrentPage, " overlay: ", COVERT_OPS_IS_OVERLAY_OPEN())
ENDIF
IF COVERT_OPS_IS_OVERLAY_OPEN()
PLAY_SOUND_FRONTEND(-1, "Select_Mission_Cancel", "DLC_GR_MOC_Computer_Sounds")
HIDE_OVERLAY()
ENDIF
ENDIf
ELSE
ENABLE_CONTROL_ACTION(FRONTEND_CONTROL, INPUT_FRONTEND_AXIS_X)
ENABLE_CONTROL_ACTION(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()
// bCursorInputProcessed = TRUE
ENDIF
ENDIF
ENABLE_CONTROL_ACTION(FRONTEND_CONTROL, INPUT_FRONTEND_RIGHT_AXIS_X)
ENABLE_CONTROL_ACTION(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))
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()
// IF NOT bUsingScrollWheel
// bCursorInputProcessed = TRUE
// ENDIF
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)
CPRINTLN(DEBUG_INTERNET,"<APP_CO> EXITING WEBSITE for Triangle press")
SCRIPT_CLEANUP(TRUE)
ENDIF
#IF IS_DEBUG_BUILD
IF (IS_KEYBOARD_KEY_JUST_PRESSED(KEY_F))
SCRIPT_CLEANUP(TRUE)
ENDIF
#ENDIF
ENDPROC
FUNC BOOL GET_DESCRIPTION_FOR_WVM(INT iMissionDecHash)
BOOL bDescriptionReady = TRUE
CACHED_MISSION_DESCRIPTION_LOAD_VARS sMissionDescLoadVars
IF iMissionDecHash != 0
WHILE NOT REQUEST_AND_LOAD_CACHED_DESCRIPTION_FOR_HEIST(iMissionDecHash, sMissionDescLoadVars)
PRINTLN("<APP_CO> DOWNLOAD_PLANNING_MISSION_HEADER_DATA - GET_DESCRIPTION_FOR_WVM - IS_HEIST_DESCRIPTION_READY - Waiting on sub HASH: ", iMissionDecHash)
WAIT(0)
ENDWHILE
IF NOT sMissionDescLoadVars.bSucess
bDescriptionReady = FALSE
ENDIF
ENDIF
IF bDescriptionReady
PRINTLN("<APP_CO> [BDEC] * DOWNLOAD_PLANNING_MISSION_HEADER_DATA - GET_DESCRIPTION_FOR_WVM - All description strings are available; beginning dump: ")
STRING sText
INT iStartCharacterIndex, iStringLengthInCharacters, iArrayIndex, i
BOOL bFinishedCopying
//Clear the previously saved data
REPEAT FMMC_NUM_LABELS_FOR_DESCRIPTION i
sWVMDescriptions.tl63MissionDecription[i] = ""
ENDREPEAT
//Get the cached description:
sText = UGC_GET_CACHED_DESCRIPTION_WITH_NO_TRANSLATION_CHECK(iMissionDecHash, INVITE_MAX_DESCRIPTION_LENGTH)
iStringLengthInCharacters = GET_LENGTH_OF_LITERAL_STRING(sText)
PRINTLN("<APP_CO> [BDEC] DOWNLOAD_PLANNING_MISSION_HEADER_DATA - GET_DESCRIPTION_FOR_PLANNING_MISSION_HEADER_DATA - [", sText, "] - iStringLengthInCharacters = ", iStringLengthInCharacters)
//Copy this string into chunks using a byte limit
WHILE NOT bFinishedCopying
//If we've got to the end of the string then we're done
IF iStartCharacterIndex >= iStringLengthInCharacters
PRINTLN("<APP_CO> [BDEC] DOWNLOAD_PLANNING_MISSION_HEADER_DATA - GET_DESCRIPTION_FOR_PLANNING_MISSION_HEADER_DATA - IS_HEIST_DESCRIPTION_READY = ", sWVMDescriptions.tl63MissionDecription[0], sWVMDescriptions.tl63MissionDecription[1], sWVMDescriptions.tl63MissionDecription[2], sWVMDescriptions.tl63MissionDecription[3],
sWVMDescriptions.tl63MissionDecription[4], sWVMDescriptions.tl63MissionDecription[5], sWVMDescriptions.tl63MissionDecription[6], sWVMDescriptions.tl63MissionDecription[7])
bFinishedCopying = TRUE
ELSE
//If we're over the array size then we done
IF iArrayIndex >= FMMC_NUM_LABELS_FOR_DESCRIPTION
PRINTLN("<APP_CO> bFinishedCopying (iArrayIndex >= FMMC_NUM_LABELS_FOR_DESCRIPTION)")
bFinishedCopying = TRUE
ELSE
//Get the next chunk
sWVMDescriptions.tl63MissionDecription[iArrayIndex] = GET_CHARACTER_FROM_AUDIO_CONVERSATION_FILENAME_WITH_BYTE_LIMIT(sText, iStartCharacterIndex, iStringLengthInCharacters, 63)
//Print
PRINTLN("<APP_CO> [BDEC]DOWNLOAD_PLANNING_MISSION_HEADER_DATA - GET_DESCRIPTION_FOR_PLANNING_MISSION_HEADER_DATA - g_HeistPrePlanningClient.sPlanningData.sMissionData.tl63MissionDecription[", iArrayIndex, "] = ", sWVMDescriptions.tl63MissionDecription[iArrayIndex])
//Get the length of the chunk that we've just grabbed so we can move start position
iStartCharacterIndex += GET_LENGTH_OF_LITERAL_STRING(sWVMDescriptions.tl63MissionDecription[iArrayIndex])
PRINTLN("iStartCharacterIndex is now ", iStartCharacterIndex)
//Move to the next array
iArrayIndex++
PRINTLN("<APP_CO> iArrayIndex is now ", iArrayIndex)
ENDIF
ENDIF
ENDWHILE
ENDIF
RETURN bDescriptionReady
ENDFUNC
PROC SEND_WVM_MISSION_DATA_TO_SCALEFORM(INT iMissionID)
iMissionsCompleted = GET_BIKER_RESUPPLY_COMPLETE_TOTAL_FOR_FACTORY(GET_ACTIVE_CHARACTER_SLOT(), BUNKER_SAVE_SLOT)
INT i
INT iArrayPos = SVM_FLOW_GET_NEXT_AVAILABLE_MISSION_CONTENT_ARRAY_POS(GET_REORDERED_WVM_MISSION_ID(iMissionID), ciFLOW_MISSION_TYPE_WVM)
INT iMissionUnlockCount = GET_WVM_UNLOCK_VALUE(iMissionID)
BOOL bMissionUnlocked = (iMissionsCompleted >= iMissionUnlockCount)
STRING sTextureHandle = TEXT_LABEL_TO_STRING(g_txtWVMThumbnails[GET_REORDERED_WVM_MISSION_ID(iMissionID)])
FLOAT fMissionRPMultiplier = 0.0
FLOAT fMissionCashMultiplier = 0.0
#IF IS_DEBUG_BUILD
IF SHOULD_WVM_MISSION_BE_AUTO_UNLOCKED(iMissionID)
bMissionUnlocked = TRUE
iMissionUnlockCount = 0
ENDIF
#ENDIF
IF bMissionUnlocked
IF iMissionID = ciWVM_FLOW_MISSION_WVM_APC
PRINTLN("<APP_BUNKER> SEND_WVM_MISSION_DATA_TO_SCALEFORM First mission unlocked. Using auto unlock param? ", SHOULD_WVM_MISSION_BE_AUTO_UNLOCKED(iMissionID))
SET_BIT(iBS, WVM_BS_FIRST_MISSION_UNLOCKED)
ENDIF
iMissionUnlockCount = 0
IF iMissionID = ciWVM_FLOW_MISSION_WVM_OPPRESSOR_2
IF NOT WVM_IS_SPECIAL_VEHICLE_UNLOCKED(ciWVM_FLOW_MISSION_WVM_OPPRESSOR_1)
#IF IS_DEBUG_BUILD
AND NOT SHOULD_WVM_MISSION_BE_AUTO_UNLOCKED(iMissionID)
#ENDIF
iMissionUnlockCount = -1
bMissionUnlocked = FALSE
ENDIF
ENDIF
ELSE
CLEAR_BIT(iBS, WVM_BS_ALL_MISSIONS_UNLOCKED)
ENDIF
//If we have a valid mision request the description
IF iArrayPos != -1
IF NOT IS_CLOUD_DOWN_CLOUD_LOADER()
WHILE NOT GET_DESCRIPTION_FOR_WVM(g_FMMC_ROCKSTAR_CREATED.sMissionHeaderVars[iArrayPos].iMissionDecHash)
IF NOT HAS_NET_TIMER_STARTED(stDescriptionLoadTO)
START_NET_TIMER(stDescriptionLoadTO)
ELIF HAS_NET_TIMER_EXPIRED(stDescriptionLoadTO, 750)
iArrayPos = -1
CASSERTLN(DEBUG_INTERNET, "<APP_CO> SEND_WVM_MISSION_DATA_TO_SCALEFORM Description failed to load! using fallback")
BREAKLOOP
ENDIF
CDEBUG1LN(DEBUG_INTERNET, "<APP_CO> SEND_WVM_MISSION_DATA_TO_SCALEFORM waiting on descriptions to load using GET_DESCRIPTION_FOR_WVM")
WAIT(0)
ENDWHILE
RESET_NET_TIMER(stDescriptionLoadTO)
IF iArrayPos != -1
GET_XP_MULTIPLIER_AND_CASH_MULTIPLIER_BASED_ON_MISSION_TYPE(fMissionRPMultiplier, fMissionCashMultiplier, FMMC_TYPE_MISSION, FMMC_TYPE_MISSION_CONTACT, DEFAULT, DEFAULT, GET_HASH_KEY(g_FMMC_ROCKSTAR_CREATED.sMissionHeaderVars[iArrayPos].tlName))
ENDIF
IF fMissionRPMultiplier = 1.0
fMissionRPMultiplier = 0.0
ELSE
CDEBUG1LN(DEBUG_INTERNET, "<APP_CO> SEND_WVM_MISSION_DATA_TO_SCALEFORM Mission RP multiplier set to: ", fMissionRPMultiplier)
ENDIF
IF fMissionCashMultiplier = 1.0
fMissionCashMultiplier = 0.0
ELSE
CDEBUG1LN(DEBUG_INTERNET, "<APP_CO> SEND_WVM_MISSION_DATA_TO_SCALEFORM Mission cash multiplier set to: ", fMissionCashMultiplier)
ENDIF
ELSE
iArrayPos = -1
CDEBUG1LN(DEBUG_INTERNET, "<APP_CO> SEND_WVM_MISSION_DATA_TO_SCALEFORM cloud down. Using fallback")
ENDIF
ELSE
CASSERTLN(DEBUG_INTERNET, "<APP_CO> SEND_WVM_MISSION_DATA_TO_SCALEFORM Description failed to load because iArrayPos is -1")
ENDIF
BEGIN_SCALEFORM_MOVIE_METHOD(mov, "ADD_MISSION")
// Mission ID
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(iMissionID)
IF iArrayPos != -1
// Mission name
SCALEFORM_MOVIE_METHOD_ADD_PARAM_LITERAL_STRING(g_FMMC_ROCKSTAR_CREATED.sMissionHeaderVars[iArrayPos].tlMissionName)
BEGIN_TEXT_COMMAND_SCALEFORM_STRING("FMMC_OFFLN_HD")
//Add the text description for the mission grabbed above
REPEAT FMMC_NUM_LABELS_FOR_DESCRIPTION i
ADD_TEXT_COMPONENT_SUBSTRING_PLAYER_NAME(sWVMDescriptions.tl63MissionDecription[i])
ENDREPEAT
END_TEXT_COMMAND_SCALEFORM_STRING()
ELSE
//Fallback on the old descriptions
SCALEFORM_MOVIE_METHOD_ADD_PARAM_STRING("")
SCALEFORM_MOVIE_METHOD_ADD_PARAM_STRING("")
ENDIF
SCALEFORM_MOVIE_METHOD_ADD_PARAM_LITERAL_STRING(sTextureHandle) // TXD
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(iMissionUnlockCount) // Unlock count
SCALEFORM_MOVIE_METHOD_ADD_PARAM_BOOL(bMissionUnlocked) // Enabled
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(FLOOR(fMissionCashMultiplier)) // Cash bonus
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(FLOOR(fMissionRPMultiplier)) // RP bonus
END_SCALEFORM_MOVIE_METHOD()
ENDPROC
PROC SEND_INITIAL_DATA_TO_SCALEFORM()
INT i
BEGIN_SCALEFORM_MOVIE_METHOD(mov, "SET_PLAYER_DATA")
SCALEFORM_MOVIE_METHOD_ADD_PARAM_LITERAL_STRING(GET_PLAYER_NAME(PLAYER_ID())) // Local players name
END_SCALEFORM_MOVIE_METHOD()
//Base data
REPEAT ciWVM_FLOW_MISSION_MAX i
SEND_WVM_MISSION_DATA_TO_SCALEFORM(i)
ENDREPEAT
ENDPROC
////////////////////////////////////////////
/// Scaleform methods
PROC SHOW_OVERLAY(STRING sTitle, STRING sMessage, STRING sAcceptButtonLabel, STRING sCancelButtonLabel, INT iadditionalINT = -1, WVM_APP_STAGE_ID eNewAppStage = WVM_STAGE_IDLE)
BEGIN_SCALEFORM_MOVIE_METHOD(mov, "SHOW_OVERLAY")
SCALEFORM_MOVIE_METHOD_ADD_PARAM_STRING(sTitle)
BEGIN_TEXT_COMMAND_SCALEFORM_STRING(sMessage)
IF iadditionalINT != -1
ADD_TEXT_COMPONENT_INTEGER(iadditionalINT)
ENDIF
END_TEXT_COMMAND_SCALEFORM_STRING()
SCALEFORM_MOVIE_METHOD_ADD_PARAM_STRING(sAcceptButtonLabel)
SCALEFORM_MOVIE_METHOD_ADD_PARAM_STRING(sCancelButtonLabel)
END_SCALEFORM_MOVIE_METHOD()
SET_BIT(iBS, WVM_BS_OVERLAY_SCREEN_ACTIVE)
COVERT_OPS_SET_APP_STAGE(eNewAppStage)
CDEBUG1LN(DEBUG_INTERNET, "<APP_CO> SHOW_OVERLAY with message: ", sMessage, " Accebt button: ", sAcceptButtonLabel, " Cancel button: ", sCancelButtonLabel)
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, WVM_BS_WAITING_FOR_BUTTON_RETURN_VALUE)
BEGIN_SCALEFORM_MOVIE_METHOD(mov, "GET_CURRENT_SELECTION")
currentSelectionReturnIndex = END_SCALEFORM_MOVIE_METHOD_RETURN_VALUE()
BEGIN_SCALEFORM_MOVIE_METHOD(mov, "GET_CURRENT_SCREEN_ID")
currentPageReturnIndex = END_SCALEFORM_MOVIE_METHOD_RETURN_VALUE()
SET_BIT(iBS, WVM_BS_WAITING_FOR_BUTTON_RETURN_VALUE)
ENDIF
ENDIF
ENDPROC
#IF IS_DEBUG_BUILD
FUNC STRING DEBUG_GET_BUTTON_NAME(WVM_BUTTON_INDEXES eButton)
SWITCH eButton
CASE BUTTON_LOGIN RETURN "BUTTON_LOGIN"
CASE BUTTON_OVERLAY_CANCEL RETURN "BUTTON_OVERLAY_CANCEL"
CASE BUTTON_OVERLAY_ACCEPT RETURN "BUTTON_OVERLAY_ACCEPT"
CASE BUTTON_WVM_1 RETURN "BUTTON_WVM_1"
CASE BUTTON_WVM_2 RETURN "BUTTON_WVM_2"
CASE BUTTON_WVM_3 RETURN "BUTTON_WVM_3"
CASE BUTTON_WVM_4 RETURN "BUTTON_WVM_4"
CASE BUTTON_WVM_5 RETURN "BUTTON_WVM_5"
CASE BUTTON_WVM_6 RETURN "BUTTON_WVM_6"
CASE BUTTON_WVM_7 RETURN "BUTTON_WVM_7"
ENDSWITCH
RETURN "***INVALID***"
ENDFUNC
#ENDIF
/// PURPOSE:
/// Checks if we can launch a sell mission and sets up the overlay screen with the necessary text
PROC RUN_INITIAL_WVM_MISSION_CHECKS(INT iMissionID)
IF NOT CAN_PLAYER_LAUNCH_MISSION(iMissionID) //FAIL: Not available
SHOW_OVERLAY("WVM_MIS_TI", COVERT_OPS_GET_MISSION_LAUNCH_FAIL_REASON(), "OR_OVRLY_OK", "")
PLAY_SOUND_FRONTEND(-1, "Select_Mission_Unavailable", "DLC_GR_MOC_Computer_Sounds")
ELSE
COVERT_OPS_SET_MISSION_TO_LAUNCH(iMissionID)
SHOW_OVERLAY("WVM_MIS_TI", "SVM_MIS_L", "WHOUSE_CONF", "WHOUSE_CANC", DEFAULT, WVM_STAGE_CONFIRM_WVM_LAUNCH)
PLAY_SOUND_FRONTEND(-1, "Select_Mission_Are_You_Sure", "DLC_GR_MOC_Computer_Sounds")
ENDIF
COVERT_OPS_CLEAR_MISSION_LAUNCH_FAIL_REASON()
ENDPROC
/// PURPOSE:
/// Handles the player pressing confirm on the overlay screen
PROC HANDLE_ACCEPT_OVERLAY_PRESS()
SWITCH COVERT_OPS_GET_APP_STAGE()
CASE WVM_STAGE_CONFIRM_WVM_LAUNCH
PLAY_SOUND_FRONTEND(-1, "Select_Mission_Launch", "DLC_GR_MOC_Computer_Sounds")
SVM_FLOW_LAUNCH_NEXT_AVAILABLE_MISSION(g_sTransitionSessionData.ciCam, iWVMToLaunch, ciFLOW_MISSION_TYPE_WVM)
SCRIPT_CLEANUP()
BREAK
CASE WVM_STAGE_IDLE
PLAY_SOUND_FRONTEND(-1, "Select_Mission_Unavailable_OK", "DLC_GR_MOC_Computer_Sounds")
//Do Nothing
BREAK
ENDSWITCH
HIDE_OVERLAY()
ENDPROC
PROC CHECK_BUTTON_PRESS()
MAINTAIN_CHECKS_FOR_CURRENT_SELECTION_ID()
IF IS_BIT_SET(iBS, WVM_BS_WAITING_FOR_BUTTON_RETURN_VALUE)
IF IS_SCALEFORM_MOVIE_METHOD_RETURN_VALUE_READY(currentSelectionReturnIndex)
AND IS_SCALEFORM_MOVIE_METHOD_RETURN_VALUE_READY(currentPageReturnIndex)
WVM_BUTTON_INDEXES eButtonPressed = INT_TO_ENUM(WVM_BUTTON_INDEXES, GET_SCALEFORM_MOVIE_METHOD_RETURN_VALUE_INT(currentSelectionReturnIndex))
WVM_PAGE_ID ePage = INT_TO_ENUM(WVM_PAGE_ID, GET_SCALEFORM_MOVIE_METHOD_RETURN_VALUE_INT(currentPageReturnIndex))
CDEBUG1LN(DEBUG_INTERNET, "<APP_CO> CHECK_BUTTON_PRESS button press returned = ", DEBUG_GET_BUTTON_NAME(eButtonPressed), " ID: ", eButtonPressed, " current page: ", ePage)
SWITCH eButtonPressed
CASE BUTTON_OVERLAY_CANCEL
PLAY_SOUND_FRONTEND(-1, "Select_Mission_Cancel", "DLC_GR_MOC_Computer_Sounds")
HIDE_OVERLAY()
BREAK
CASE BUTTON_OVERLAY_ACCEPT
HANDLE_ACCEPT_OVERLAY_PRESS()
BREAK
CASE BUTTON_WVM_1
CASE BUTTON_WVM_2
CASE BUTTON_WVM_3
CASE BUTTON_WVM_4
CASE BUTTON_WVM_5
CASE BUTTON_WVM_6
CASE BUTTON_WVM_7
CASE BUTTON_WVM_8
RUN_INITIAL_WVM_MISSION_CHECKS(ENUM_TO_INT(eButtonPressed))
BREAK
ENDSWITCH
eCurrentPage = ePage
CLEAR_BIT(iBS, WVM_BS_WAITING_FOR_BUTTON_RETURN_VALUE)
ENDIF
ENDIF
ENDPROC
/////////////////////////////////////////////////////////////////////
/// Dialogue tutorials
FUNC BOOL HAVE_ALL_DIALOGUE_TUTORIALS_BEEN_COMPLETED()
IF (GET_PACKED_STAT_BOOL(PACKED_MP_BOOL_CO_TRUCK_TUT_1) OR IS_BIT_SET(iBS, WVM_BS_FIRST_MISSION_UNLOCKED))
AND GET_PACKED_STAT_BOOL(PACKED_MP_BOOL_CO_TRUCK_TUT_2)
CPRINTLN(DEBUG_INTERNET, "<APP_CO_TUT> HAVE_ALL_DIALOGUE_TUTORIALS_BEEN_COMPLETED TRUE")
RETURN TRUE
ENDIF
CPRINTLN(DEBUG_INTERNET, "<APP_CO_TUT> HAVE_ALL_DIALOGUE_TUTORIALS_BEEN_COMPLETED FALSE")
RETURN FALSE
ENDFUNC
FUNC STRING CO_TUT_GET_ROOT_LABEL(INT iTutorialID)
SWITCH iTutorialID
CASE 0 RETURN "GNRC_WVMPCT1" //No unlocked missions
CASE 1 RETURN "GNRC_WVMPCT2" //First mission unlocked
ENDSWITCH
CASSERTLN(DEBUG_SAFEHOUSE, "CO_TUT_GET_ROOT_LABEL: Invalid tutorial ID: ", iTutorialID)
RETURN "GNRC_WVMPCT1"
ENDFUNC
PROC CO_START_TUTORIAL_DIALOGUE(INT iTutorialID)
IF CREATE_CONVERSATION(tutPedStruct, "GNRCAUD", CO_TUT_GET_ROOT_LABEL(iTutorialID), CONV_PRIORITY_HIGH)
CPRINTLN(DEBUG_INTERNET, "<APP_CO> Created tutorial converstion: ", iTutorialID)
iTutorialDialogueID = -1
ENDIF
ENDPROC
PROC CO_RUN_TUTORIAL_DIALOGUE()
//Start the dialogue
IF iTutorialDialogueID != -1
CO_START_TUTORIAL_DIALOGUE(iTutorialDialogueID)
ENDIF
ENDPROC
FUNC BOOL HAVE_ALL_HELP_TEXT_TUTORIALS_BEEN_DONE()
IF GET_PACKED_STAT_BOOL(PACKED_MP_BOOL_MO_TUT_1)
AND GET_PACKED_STAT_BOOL(PACKED_MP_BOOL_MO_TUT_2)
AND GET_PACKED_STAT_BOOL(PACKED_MP_BOOL_MO_TUT_3)
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
PROC INCREMENT_TIMES_HELP_MESSAGE_HAS_DISPLAYED()
IF NOT GET_PACKED_STAT_BOOL(PACKED_MP_BOOL_MO_TUT_1)
SET_PACKED_STAT_BOOL(PACKED_MP_BOOL_MO_TUT_1, TRUE)
ELIF NOT GET_PACKED_STAT_BOOL(PACKED_MP_BOOL_MO_TUT_2)
SET_PACKED_STAT_BOOL(PACKED_MP_BOOL_MO_TUT_2, TRUE)
ELSE
SET_PACKED_STAT_BOOL(PACKED_MP_BOOL_MO_TUT_3, TRUE)
ENDIF
ENDPROC
PROC RUN_HELP_TEXT_TUTORIAL()
IF NOT IS_BIT_SET(iBS, WVM_BS_ALL_MISSIONS_UNLOCKED)
AND NOT IS_BIT_SET(iBS, WVM_BS_HELP_TEXT_DONE_THIS_BOOT)
AND eCurrentPage = PAGE_HOME
AND NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF NOT HAVE_ALL_HELP_TEXT_TUTORIALS_BEEN_DONE()
IF NOT IS_HELP_MESSAGE_BEING_DISPLAYED()
PRINT_HELP("WVM_LAUNCH_TUT", 9000)
SET_BIT(iBS, WVM_BS_HELP_TEXT_DONE_THIS_BOOT)
INCREMENT_TIMES_HELP_MESSAGE_HAS_DISPLAYED()
ENDIF
ELSE
SET_BIT(iBS, WVM_BS_HELP_TEXT_DONE_THIS_BOOT)
ENDIF
ENDIF
ENDPROC
PROC CO_SELECT_APP_DIALOGUE_TUTORIAL()
BOOL bStartNewDialogue
IF NOT IS_BIT_SET(iBS, WVM_BS_CURRENTLY_PLAYING_TUTORIAL)
AND NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
AND eCurrentPage = PAGE_HOME
IF NOT IS_BIT_SET(iBS, WVM_BS_FIRST_MISSION_UNLOCKED)
IF NOT GET_PACKED_STAT_BOOL(PACKED_MP_BOOL_CO_TRUCK_TUT_1)
//No missions unlocked
bStartNewDialogue = TRUE
iTutorialHelpTime = 9000
iTutorialDialogueID = 0
SET_PACKED_STAT_BOOL(PACKED_MP_BOOL_CO_TRUCK_TUT_1, TRUE)
ENDIF
ELSE
IF NOT GET_PACKED_STAT_BOOL(PACKED_MP_BOOL_CO_TRUCK_TUT_2)
//Missions unlocked
bStartNewDialogue = TRUE
iTutorialHelpTime = 9000
iTutorialDialogueID = 1
SET_PACKED_STAT_BOOL(PACKED_MP_BOOL_CO_TRUCK_TUT_2, TRUE)
ENDIF
ENDIF
ENDIF
IF bStartNewDialogue
SET_BIT(iBS, WVM_BS_CURRENTLY_PLAYING_TUTORIAL)
CPRINTLN(DEBUG_INTERNET, "<APP_CO_TUT> CO_SELECT_APP_DIALOGUE_TUTORIAL Running tutorial for: ", iTutorialHelpTime, " seconds. Tutorial ID: ", iTutorialDialogueID)
ELIF IS_BIT_SET(iBS, WVM_BS_CURRENTLY_PLAYING_TUTORIAL)
IF NOT HAS_NET_TIMER_STARTED(stTutorialTimer)
START_NET_TIMER(stTutorialTimer)
CPRINTLN(DEBUG_INTERNET, "<APP_CO_TUT> CO_SELECT_APP_DIALOGUE_TUTORIAL Starting timer time: ", iTutorialHelpTime, " Tutorial ID: ", iTutorialDialogueID)
ELIF HAS_NET_TIMER_EXPIRED(stTutorialTimer, iTutorialHelpTime)
CLEAR_BIT(iBS, WVM_BS_CURRENTLY_PLAYING_TUTORIAL)
iTutorialHelpTime = 0
RESET_NET_TIMER(stTutorialTimer)
CPRINTLN(DEBUG_INTERNET, "<APP_CO_TUT> CO_SELECT_APP_DIALOGUE_TUTORIAL Starting timer expired time: ", iTutorialHelpTime, " Tutorial ID: ", iTutorialDialogueID)
//Once all the tutorial are complete we no longer need this function
IF HAVE_ALL_DIALOGUE_TUTORIALS_BEEN_COMPLETED()
SET_BIT(iBS, WVM_BS_DIALOGUE_TUTORIAL_COMPLETE)
ENDIF
ENDIF
ENDIF
ENDPROC
PROC CO_SETUP_TUTORIAL_DIALOGUE()
IF HAVE_ALL_DIALOGUE_TUTORIALS_BEEN_COMPLETED()
SET_BIT(iBS, WVM_BS_DIALOGUE_TUTORIAL_COMPLETE)
ELSE
SET_USE_DLC_DIALOGUE(TRUE)
ADD_PED_FOR_DIALOGUE(tutPedStruct, 2, NULL, "AGENT14")
CPRINTLN(DEBUG_INTERNET, "<APP_CO> CO_SETUP_TUTORIAL_DIALOGUE ped added for dialogue")
ENDIF
ENDPROC
/// PURPOSE:
/// Check for any flags that mean this script should terminate
PROC RUN_CLEANUP_CHECKS()
IF NOT NETWORK_IS_GAME_IN_PROGRESS()
CDEBUG1LN(DEBUG_INTERNET, "<APP_CO> Shutting down! No network game is currently active")
SCRIPT_CLEANUP()
ELIF IS_ENTITY_DEAD(PLAYER_PED_ID())
CDEBUG1LN(DEBUG_INTERNET, "<APP_CO> Shutting down! Player is injured or dead")
SCRIPT_CLEANUP()
ELIF IS_PAUSE_MENU_ACTIVE_EX()
CDEBUG1LN(DEBUG_INTERNET, "<APP_CO> Shutting down! Pause menu active")
SCRIPT_CLEANUP(TRUE)
ELIF NOT IS_PLAYER_IN_ANY_SIMPLE_INTERIOR(PLAYER_ID())
CDEBUG1LN(DEBUG_INTERNET, "<APP_CO> Shutting down! Player is no longer in a simple interior")
SCRIPT_CLEANUP()
ELIF IS_PLAYER_WALKING_IN_OR_OUT_OF_SIMPLE_INTERIOR(PLAYER_ID())
CDEBUG1LN(DEBUG_INTERNET, "<APP_CO> Shutting down! Pause is transitioning in or out of a simple interior")
SCRIPT_CLEANUP()
ENDIF
ENDPROC
PROC SCRIPT_INITALISE()
RUN_CLEANUP_CHECKS()
mov = REQUEST_SCALEFORM_MOVIE("COVERT_OPS")
WHILE (NOT HAS_SCALEFORM_MOVIE_LOADED(mov))
WAIT(0)
ENDWHILE
SET_BIT(iBS, WVM_BS_ALL_MISSIONS_UNLOCKED)
HANG_UP_AND_PUT_AWAY_PHONE(TRUE)
DISABLE_CELLPHONE(TRUE)
Pause_Objective_Text()
THEFEED_PAUSE()
SET_BROWSER_OPEN(TRUE)
NET_SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
// Default cleanup
IF HAS_FORCE_CLEANUP_OCCURRED()
OR MPGlobalsAmbience.bRunningFmIntroCut
IF MPGlobalsAmbience.bRunningFmIntroCut
CDEBUG1LN(DEBUG_INTERNET, "<APP_CO> bRunningFmIntroCut is true so cleaning up!")
ENDIF
CDEBUG1LN(DEBUG_INTERNET, "<APP_CO> DEFAULT CLEANUP")
SCRIPT_CLEANUP()
ENDIF
SET_BROWSER_OPEN(TRUE)
SEND_INITIAL_DATA_TO_SCALEFORM()
CO_SETUP_TUTORIAL_DIALOGUE()
IF IS_PC_VERSION()
SET_MULTIHEAD_SAFE(TRUE, TRUE, TRUE, TRUE)
ENDIF
ENDPROC
//FEATURE_GUNRUNNING
//***********SCRIPT***********
SCRIPT
CDEBUG1LN(DEBUG_INTERNET, "<APP_CO> started \"", GET_THIS_SCRIPT_NAME(), "\"")
IF GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(GET_HASH_KEY("appCovertOps")) > 1
CDEBUG1LN(DEBUG_INTERNET, "<APP_CO> bunker business script already running! cleaning up.")
SCRIPT_CLEANUP()
ENDIF
SCRIPT_INITALISE()
CDEBUG1LN(DEBUG_INTERNET, "<APP_CO> SCRIPT_INITALISE done!")
/// main update loop
WHILE IS_BROWSER_OPEN()
RUN_CLEANUP_CHECKS()
RENDER_COVERT_OPS_APP()
PASS_INPUTS_TO_SCALEFORM()
CHECK_BUTTON_PRESS()
IF NOT IS_BIT_SET(iBS, WVM_BS_DIALOGUE_TUTORIAL_COMPLETE)
CO_SELECT_APP_DIALOGUE_TUTORIAL()
CO_RUN_TUTORIAL_DIALOGUE()
ELSE
RUN_HELP_TEXT_TUTORIAL()
ENDIF
WAIT(0)
ENDWHILE
// Script should never reach here. Always terminate with cleanup function.
CASSERTLN(DEBUG_INTERNET, "<APP_CO> \"", GET_THIS_SCRIPT_NAME(), "\" should never reach here. Always terminate with cleanup function.")
ENDSCRIPT