///// 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(" 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(" 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(" COVERT_OPS_SET_MISSION_TO_LAUNCH Setting new mission to: ", iWVMToLaunch) ENDIF ENDPROC PROC COVERT_OPS_CLEAR_MISSION_LAUNCH_FAIL_REASON() sMissionLanuchFailReason = "" PRINTLN(" 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, "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, " 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, " 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, " 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, " 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, " 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, " 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, " 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_CLOSE] 2 Back pressed not closing the app. page: ", eCurrentPage, " overlay: ", COVERT_OPS_IS_OVERLAY_OPEN()) ENDIF ELSE CDEBUG1LN(DEBUG_INTERNET, " [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_CLOSE] 2 Back pressed not closing the app. page: ", eCurrentPage, " overlay: ", COVERT_OPS_IS_OVERLAY_OPEN()) ENDIF ELSE CDEBUG1LN(DEBUG_INTERNET, " [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," 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(" 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(" [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(" [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(" [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(" 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(" [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(" 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(" 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, " SEND_WVM_MISSION_DATA_TO_SCALEFORM Description failed to load! using fallback") BREAKLOOP ENDIF CDEBUG1LN(DEBUG_INTERNET, " 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, " SEND_WVM_MISSION_DATA_TO_SCALEFORM Mission RP multiplier set to: ", fMissionRPMultiplier) ENDIF IF fMissionCashMultiplier = 1.0 fMissionCashMultiplier = 0.0 ELSE CDEBUG1LN(DEBUG_INTERNET, " SEND_WVM_MISSION_DATA_TO_SCALEFORM Mission cash multiplier set to: ", fMissionCashMultiplier) ENDIF ELSE iArrayPos = -1 CDEBUG1LN(DEBUG_INTERNET, " SEND_WVM_MISSION_DATA_TO_SCALEFORM cloud down. Using fallback") ENDIF ELSE CASSERTLN(DEBUG_INTERNET, " 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, " 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, " 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, " HAVE_ALL_DIALOGUE_TUTORIALS_BEEN_COMPLETED TRUE") RETURN TRUE ENDIF CPRINTLN(DEBUG_INTERNET, " 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, " 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, " 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, " 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, " 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, " 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, " Shutting down! No network game is currently active") SCRIPT_CLEANUP() ELIF IS_ENTITY_DEAD(PLAYER_PED_ID()) CDEBUG1LN(DEBUG_INTERNET, " Shutting down! Player is injured or dead") SCRIPT_CLEANUP() ELIF IS_PAUSE_MENU_ACTIVE_EX() CDEBUG1LN(DEBUG_INTERNET, " Shutting down! Pause menu active") SCRIPT_CLEANUP(TRUE) ELIF NOT IS_PLAYER_IN_ANY_SIMPLE_INTERIOR(PLAYER_ID()) CDEBUG1LN(DEBUG_INTERNET, " 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, " 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, " bRunningFmIntroCut is true so cleaning up!") ENDIF CDEBUG1LN(DEBUG_INTERNET, " 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, " started \"", GET_THIS_SCRIPT_NAME(), "\"") IF GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(GET_HASH_KEY("appCovertOps")) > 1 CDEBUG1LN(DEBUG_INTERNET, " bunker business script already running! cleaning up.") SCRIPT_CLEANUP() ENDIF SCRIPT_INITALISE() CDEBUG1LN(DEBUG_INTERNET, " 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, " \"", GET_THIS_SCRIPT_NAME(), "\" should never reach here. Always terminate with cleanup function.") ENDSCRIPT