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

741 lines
25 KiB
Python
Executable File

//////////////////////////////////////////////////////////////////////////////////////////
// //
// SCRIPT NAME : letterScraps.sc //
// AUTHOR : Joanna Wright //
// DESCRIPTION : Sets up 50 letter scraps around the map for the //
// player to collect //
// //
//////////////////////////////////////////////////////////////////////////////////////////
//Compile out Title Update changes to header functions.
//Must be before includes.
//CONST_INT USE_TU_CHANGES 0 // Removed by Kenneth R.
//----------------------
// INCLUDES
//----------------------
USING "email_public.sch"
USING "rgeneral_include.sch"
USING "RC_Helper_Functions.sch"
USING "CompletionPercentage_public.sch"
USING "savegame_public.sch"
USING "scrap_common.sch"
USING "pickups_letter.sch"
USING "net_system_activity_feed.sch"
//----------------------
// ENUMS
//----------------------
ENUM LScrap_MainState
MISSION_COLLECT_SCRAPS = 0,
MISSION_READ_FINISHED_NOTE
ENDENUM
ENUM LScrap_SubState
SS_SETUP = 0,
SS_UPDATE,
SS_CLEANUP
ENDENUM
//----------------------
// CONSTS
//----------------------
CONST_INT XVERSION_NUMBER 105
CONST_INT MAX_PAGES 4
//---------------------
// VARIABLES
//----------------------
LScrap_MainState m_eState = MISSION_COLLECT_SCRAPS
LScrap_SubState m_eSubState = SS_SETUP
SCRAP_MISSION_DATA sMissionData
SCRAP_PICKUP_DATA sPickupData[NUMBER_OF_LETTER_SCRAPS]
INT scrapInInterior = 4
STRING interiorName = "id1_11_tunnel6_int"
INT iMessageStage = 0
SCALEFORM_INDEX siMessage
SCALEFORM_INDEX mov
INT iPage = 0
STRING pageTextArray[MAX_PAGES]
BOOL bButtonPressed = FALSE
BOOL bDebugAllClearCheck = FALSE
BOOL bHasMissionBeenSetup = FALSE
#IF IS_DEBUG_BUILD
WIDGET_GROUP_ID mWidgetGroup
BOOL bMapAllScraps
BOOL bCollectAllScraps
BOOL bResetScrapCollection
BOOL bDebugAllowWarping
BOOL bWarpToScrap[NUMBER_OF_LETTER_SCRAPS]
BOOL bDebugQuitScript
BOOL bSimulateScrapCollect
INT iSimulateScrapCollect = 1
BOOL bUpdateDebugWidgets
#ENDIF
//----------------------
// FUNCTIONS
//----------------------
/// PURPOSE:
/// Sets the required state and sets it to SS_SETUP
/// PARAMS:
/// TheState - the wated state
PROC SET_STAGE(LScrap_MainState TheState)
m_eState = TheState
m_eSubState = SS_SETUP
ENDPROC
/// PURPOSE:
/// Setup letter scrap position and headings - set global variable for the mission being active
PROC INITIALISE_LETTER_SCRAPS()
// Mission is running
g_savedGlobals.sAmbient.sLetterScrapData.bMissionActive = TRUE
// Initialise letter scraps
INT i
REPEAT NUMBER_OF_LETTER_SCRAPS i
sPickupData[i].vCoords = GET_LETTERSCRAP_PICKUP_COORDS(i)
sPickupData[i].bActive = FALSE
ENDREPEAT
iMessageStage = 0
sPickupData[0].fHeading = 179.4746
sPickupData[1].vRot = << 0.0, 0.0, 198.0 >>
sPickupData[2].fHeading = 104.0000
sPickupData[3].fHeading = 321.5000
sPickupData[4].vRot = << 0.0, 0.0, 49.0 >>
sPickupData[5].vRot = << 0.0, 0.0, 286.5000 >>
sPickupData[6].fHeading = 278.0092
sPickupData[7].vRot = << 5.300, -1801.400, 15.570 >>
sPickupData[8].fHeading = 80.5000
sPickupData[9].fHeading = 116.0000
sPickupData[10].fHeading = 15.0000
sPickupData[11].fHeading = 305.5000
sPickupData[12].fHeading = 0.0000
sPickupData[13].fHeading = 95.0000
sPickupData[13].vRot = << -0.91, -0.03, -0.81 >>
sPickupData[14].fHeading = 40.0000
sPickupData[15].fHeading = 40.0000
sPickupData[16].fHeading = 40.0000
sPickupData[17].fHeading = 90.0000
sPickupData[17].vRot = << -0.55, 0.0, 0.78 >>
sPickupData[18].vRot = << 0.0, 0.0, 0.0 >>
sPickupData[19].fHeading = 40.0000
sPickupData[20].vRot = << 0.0, 2.0, 15.000 >>
sPickupData[21].fHeading = 40.0000
sPickupData[22].fHeading = 40.0000
sPickupData[23].fHeading = 40.0000
sPickupData[24].fHeading = 40.0000
sPickupData[25].fHeading = 40.0000
sPickupData[26].fHeading = 40.0000
sPickupData[26].vRot = << -6.0, 10.0, 0.0 >>
sPickupData[27].fHeading = 40.0000
sPickupData[27].vRot = << -4.66, 8.70, 67.03 >>
sPickupData[28].fHeading = 40.0000
sPickupData[28].vRot = << 1.54, -8.31, -19.94 >>
sPickupData[29].fHeading = 40.0000
sPickupData[30].fHeading = 40.0000
sPickupData[30].vRot = << 27.21, -3.11, -2.09 >>
sPickupData[31].fHeading = 40.0000
sPickupData[32].fHeading = 40.0000
sPickupData[33].fHeading = 40.0000
sPickupData[33].vRot = << -9.89, 0.30, -0.01 >>
sPickupData[34].fHeading = 40.0000
sPickupData[35].fHeading = 40.0000
sPickupData[36].fHeading = 40.0000
sPickupData[36].vRot = << 6.50, -4.41, -0.62 >>
sPickupData[37].vRot = << -9.0, 5.3, -2.0 >>
sPickupData[38].fHeading = 40.0000
sPickupData[38].vRot = << -13.32, -0.57, -0.15 >>
sPickupData[39].fHeading = 40.0000
sPickupData[39].vRot = << 4.71, -21.26, -0.06 >>
sPickupData[40].fHeading = 40.0000
sPickupData[41].fHeading = 80.0000
sPickupData[42].vRot = << -2.0, 9.0, 1.0 >>
sPickupData[43].fHeading = 198.0000
sPickupData[44].fHeading = 198.0000
sPickupData[44].vRot = << 0.0, -20.0, 0.0 >>
sPickupData[45].fHeading = 198.0000
sPickupData[46].fHeading = 198.0000
sPickupData[47].fHeading = 198.0000
sPickupData[48].fHeading = 198.0000
sPickupData[49].fHeading = 198.0000
ENDPROC
/// PURPOSE:
/// Updates the scrap array
/// PARAMS:
/// missionData - mission scrap data reference
/// missionPickup - reference to mission pickup array
FUNC BOOL UPDATE_LETTER_SCRAPS(SCRAP_MISSION_DATA &missionData, SCRAP_PICKUP_DATA &pickupData[])
INT i
BOOL bScrapCollected
VECTOR vPlayerPos
BOOL bShowHelp = (NOT IS_CURRENTLY_ON_MISSION_OF_ANY_TYPE()) AND (NOT IS_CURRENTLY_ON_MISSION_OF_ANY_TYPE())
// cache the player position and do is injured check to stop asserts
IS_PED_INJURED(PLAYER_PED_ID())
vPlayerPos = GET_ENTITY_COORDS(PLAYER_PED_ID())
REPEAT SCRAPS_TO_CHECK_PER_FRAME i
// Has this scrap already been collected?
bScrapCollected = HAS_SCRAP_BEEN_COLLECTED(missionData.scrapData, missionData.iCurrentCheckIndex)
// If the scrap isn't active...
IF NOT pickupData[missionData.iCurrentCheckIndex].bActive
// ...and hasn't been collected
IF NOT bScrapCollected
// Create pickup
IF missionData.iCurrentCheckIndex = 1
OR missionData.iCurrentCheckIndex = 5
OR missionData.iCurrentCheckIndex = 7
OR missionData.iCurrentCheckIndex = 13
OR missionData.iCurrentCheckIndex = 18
OR missionData.iCurrentCheckIndex = 20
OR missionData.iCurrentCheckIndex = 37
OR missionData.iCurrentCheckIndex = 42
CREATE_SCRAP_WHEN_IN_RANGE(pickupData[missionData.iCurrentCheckIndex], missionData.packageMdl, PICKUP_CUSTOM_SCRIPT, FALSE, TRUE)
// Scrap is within interior
ELIF missionData.iCurrentCheckIndex = scrapInInterior
CREATE_SCRAP_WHEN_IN_RANGE(pickupData[missionData.iCurrentCheckIndex], missionData.packageMdl, PICKUP_CUSTOM_SCRIPT, FALSE, TRUE)
IF DOES_PICKUP_EXIST(pickupData[missionData.iCurrentCheckIndex].pickup)
ADD_PICKUP_TO_INTERIOR_ROOM_BY_NAME(pickupData[missionData.iCurrentCheckIndex].pickup, interiorName)
ENDIF
ELSE
CREATE_SCRAP_WHEN_IN_RANGE(pickupData[missionData.iCurrentCheckIndex], missionData.packageMdl)
ENDIF
ENDIF
ELSE
// Update pickup state
IF NOT bScrapCollected
IF UPDATE_SCRAP_PICKUP(missionData, pickupData, vPlayerPos)
// Only display help text when not on mission
IF bShowHelp
IF NOT HAS_ONE_TIME_HELP_DISPLAYED(FHM_LETTER_INFO_DISPLAYED)
CPRINTLN(DEBUG_AMBIENT, "letters help displaying")
ADD_HELP_TO_FLOW_QUEUE("LETTERS_FIRST", FHP_MEDIUM)
SET_ONE_TIME_HELP_MESSAGE_DISPLAYED(FHM_LETTER_INFO_DISPLAYED)
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
// Increase the current index - make sure it doesn't overrun
missionData.iCurrentCheckIndex++
IF (missionData.iCurrentCheckIndex >= COUNT_OF(pickupData))
missionData.iCurrentCheckIndex = 0
ENDIF
ENDREPEAT
IF missionData.bDisplayMessage
CDEBUG1LN(debug_ambient,"Displaying letter scrap message")
IF NOT g_bResultScreenDisplaying
UPDATE_DISPLAY_MESSAGE(missionData.bDisplayMessage, missionData.bMessageOnDisplay, missionData.imessageTimer, SCRAP_LETTER, iMessageStage, siMessage, "LETTERS_TITLE", "LETTERS_COLLECT")
ELSE
CDEBUG1LN(debug_ambient,"Can't display, results screen is currently active")
ENDIF
ENDIF
// Send the complete flag once everything is collected and message has finished
IF NOT missionData.bMessageOnDisplay
AND NOT missionData.bDisplayMessage
RETURN (missionData.scrapData.iScrapsCollected >= missionData.scrapData.iMaxScraps)
ENDIF
RETURN FALSE
ENDFUNC
//----------------------
// DEBUG FUNCTIONS
//----------------------
#IF IS_DEBUG_BUILD
/// PURPOSE:
/// Setup Debug Widgets
PROC SETUP_DEBUG_WIDGETS(SCRAP_MISSION_DATA &missionData, SCRAP_PICKUP_DATA &pickupData[])
INT iScrap
TEXT_LABEL_63 tlTemp
mWidgetGroup = START_WIDGET_GROUP("Letter Scraps")
ADD_WIDGET_BOOL("Show all scraps on map", bMapAllScraps)
ADD_WIDGET_BOOL("Force Quit Script", bDebugQuitScript)
ADD_WIDGET_BOOL("Allow debug warp", bDebugAllowWarping)
ADD_WIDGET_BOOL("Allow debug tty", bShowScrapDebugTTY)
ADD_WIDGET_BOOL("Update Widgets", bUpdateDebugWidgets)
START_WIDGET_GROUP("Collection")
ADD_WIDGET_BOOL("Collect all scraps", bCollectAllScraps)
ADD_WIDGET_BOOL("Reset scraps collection", bResetScrapCollection)
ADD_WIDGET_BOOL("Simulate Scrap Collect", bSimulateScrapCollect)
ADD_WIDGET_INT_SLIDER("Sim Scraps to Collect", iSimulateScrapCollect, 1, COUNT_OF(pickupData), 1)
STOP_WIDGET_GROUP()
START_WIDGET_GROUP("Stats")
ADD_WIDGET_INT_READ_ONLY("Scraps Collected", missionData.scrapData.iScrapsCollected)
ADD_WIDGET_INT_READ_ONLY("Total Scraps", missionData.scrapData.iMaxScraps)
STOP_WIDGET_GROUP()
START_WIDGET_GROUP("Positions")
REPEAT COUNT_OF(pickupData) iScrap
tlTemp = "Scrap "
tlTemp += iScrap
START_WIDGET_GROUP(tlTemp)
ADD_WIDGET_BOOL("bWarp", bWarpToScrap[iScrap])
ADD_WIDGET_FLOAT_READ_ONLY("X Position", pickupData[iScrap].vCoords.x)
ADD_WIDGET_FLOAT_READ_ONLY("Y Position", pickupData[iScrap].vCoords.y)
ADD_WIDGET_FLOAT_READ_ONLY("Z Position", pickupData[iScrap].vCoords.z)
STOP_WIDGET_GROUP()
ENDREPEAT
STOP_WIDGET_GROUP()
STOP_WIDGET_GROUP()
ENDPROC
/// PURPOSE:
/// Updates all The Widgets
PROC UPDATE_DEBUG_WIDGETS(SCRAP_MISSION_DATA &missionData, SCRAP_PICKUP_DATA &pickupData[])
INT i
INT cnt = 0
IF bUpdateDebugWidgets = FALSE
EXIT
ENDIF
IF (bResetScrapCollection)
CPRINTLN(DEBUG_AMBIENT, "Resetting Scrap Collection")
STAT_SET_INT(missionData.packageStat, 0)
REPEAT COUNT_OF(pickupData) i
SAFE_REMOVE_PICKUP(pickupData[i].pickup)
SAFE_REMOVE_BLIP(pickupData[i].blip)
SET_SCRAP_AS_COLLECTED(missionData.scrapData, i, FALSE)
UPDATE_GLOBAL_SCRAP_DATA(missionData.missionType, i, FALSE)
pickupData[i].pickup = NULL
pickupData[i].bActive = FALSE
ENDREPEAT
SET_PACKED_STATS_FROM_SCRAP_COLLECT_DATA(missionData.scrapData)
bResetScrapCollection = FALSE
bMapAllScraps = TRUE
MAKE_AUTOSAVE_REQUEST()
ENDIF
IF (bSimulateScrapCollect)
CPRINTLN(DEBUG_AMBIENT, "Simulating Collecting ", iSimulateScrapCollect, "Scraps")
REPEAT COUNT_OF(pickupData) i
IF NOT HAS_SCRAP_BEEN_COLLECTED(missionData.scrapData, i)
COLLECT_SCRAP(missionData, pickupData, i)
// Display help for informing Player about the letter
IF NOT HAS_ONE_TIME_HELP_DISPLAYED(FHM_LETTER_INFO_DISPLAYED)
CPRINTLN(DEBUG_AMBIENT, "letters help displaying")
ADD_HELP_TO_FLOW_QUEUE("LETTERS_FIRST", FHP_MEDIUM)
SET_ONE_TIME_HELP_MESSAGE_DISPLAYED(FHM_LETTER_INFO_DISPLAYED)
ENDIF
cnt++
ENDIF
IF (cnt >= iSimulateScrapCollect)
i = COUNT_OF(pickupData) + 1 // so we break out of array
ENDIF
ENDREPEAT
bMapAllScraps = TRUE
bSimulateScrapCollect = FALSE
MAKE_AUTOSAVE_REQUEST()
ENDIF
IF (bCollectAllScraps)
CPRINTLN(DEBUG_AMBIENT, "Collecting All Scraps")
STAT_SET_INT(missionData.packageStat, 0)
REPEAT COUNT_OF(pickupData) i
COLLECT_SCRAP(missionData, pickupData, i)
ENDREPEAT
// Display help for informing Player about the letter
IF NOT HAS_ONE_TIME_HELP_DISPLAYED(FHM_LETTER_INFO_DISPLAYED)
CPRINTLN(DEBUG_AMBIENT, "letters help displaying")
ADD_HELP_TO_FLOW_QUEUE("LETTERS_FIRST", FHP_MEDIUM)
SET_ONE_TIME_HELP_MESSAGE_DISPLAYED(FHM_LETTER_INFO_DISPLAYED)
ENDIF
bCollectAllScraps = FALSE
bMapAllScraps = TRUE
bDebugAllClearCheck = TRUE
MAKE_AUTOSAVE_REQUEST()
ENDIF
IF (bMapAllScraps)
BLIP_SCRAP_POSITIONS(missionData, pickupData)
bMapAllScraps = FALSE
ENDIF
// Handle warping
IF (bDebugAllowWarping = FALSE)
EXIT
ENDIF
REPEAT COUNT_OF(pickupData) i
IF (bWarpToScrap[i])
CPRINTLN(DEBUG_AMBIENT, "Warping To Scrap:", i)
LOAD_SCENE(pickupData[i].vCoords)
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
IF i = scrapInInterior
CPRINTLN(DEBUG_AMBIENT, "Scrap coords are... ", pickupData[i].vCoords)
INTERIOR_INSTANCE_INDEX intScrap = GET_INTERIOR_AT_COORDS_WITH_TYPE(pickupData[i].vCoords, interiorName)
CPRINTLN(DEBUG_AMBIENT, "Scrap interior is... ", interiorName)
PIN_INTERIOR_IN_MEMORY(intScrap)
CPRINTLN(DEBUG_AMBIENT, "Pinned interior... ")
WHILE NOT IS_INTERIOR_READY(intScrap)
CPRINTLN(DEBUG_MISSION, "Waiting for interior")
WAIT(0)
ENDWHILE
CPRINTLN(DEBUG_MISSION, "Waiting over")
//CHECK_WARP_TO_PACKAGE(bWarpToScrap[i], pickupData[i].vCoords)
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
SET_ENTITY_COORDS(PLAYER_PED_ID(), pickupData[i].vCoords+<<0.0, -1.5, 0.0>>)
ENDIF
WAIT(0)
UNPIN_INTERIOR(intScrap)
// Special cases of delicate placing require other ped-placing coords, and terrain needing time to load)
ELIF i = 13
SET_ENTITY_COORDS(PLAYER_PED_ID(), << -112.4500, -972.5109, 296.2896 >>)
ELIF i = 24
SET_ENTITY_COORDS(PLAYER_PED_ID(), pickupData[i].vCoords+<<1.5, 0.0, 0.0>>)
ELSE
SET_ENTITY_COORDS(PLAYER_PED_ID(), pickupData[i].vCoords+<<0.0, -1.5, 0.0>>)
ENDIF
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
SET_ENTITY_HEADING(PLAYER_PED_ID(), 0.0)
ENDIF
ENDIF
bWarpToScrap[i] = FALSE
ENDIF
ENDREPEAT
ENDPROC
/// PURPOSE:
/// Cleans up All The Widgets
PROC CLEANUP_DEBUG_WIDGETS()
IF DOES_WIDGET_GROUP_EXIST(mWidgetGroup)
DELETE_WIDGET_GROUP(mWidgetGroup)
ENDIF
ENDPROC
#ENDIF
//----------------------
// SCRIPT FUNCTIONS
//----------------------
/// PURPOSE:
/// Script Cleanup
PROC SCRIPT_CLEANUP()
CPRINTLN(DEBUG_MISSION, "Cleanup Letter Scrap Collection")
SET_SCRIPT_GFX_DRAW_BEHIND_PAUSEMENU(FALSE)
SET_SCALEFORM_MOVIE_AS_NO_LONGER_NEEDED(mov)
SET_GAME_PAUSED(FALSE)
#IF IS_DEBUG_BUILD
CLEANUP_DEBUG_WIDGETS()
#ENDIF
// Mission script is no longer active
g_savedGlobals.sAmbient.sLetterScrapData.bMissionActive = FALSE
// Cleanup existing pickups
INT i
REPEAT COUNT_OF(sPickupData) i
SAFE_REMOVE_BLIP(sPickupData[i].blip)
SAFE_REMOVE_PICKUP(sPickupData[i].pickup)
sPickupData[i].pickup = NULL
ENDREPEAT
// Have we collected all letter pickups? (or selected Dreyfuss 1 from debug menu)
IF (GET_MISSION_FLOW_FLAG_STATE(FLOWFLAG_LETTER_SCRAPS_DONE) = TRUE)
// Set the flow flag so the Dreyfuss1 mission can be started
Set_Mission_Flow_Flag_State(FLOWFLAG_LETTER_SCRAPS_DONE, TRUE)
// Push a message to the PS4 activity feed.
REQUEST_SYSTEM_ACTIVITY_TYPE_ALL_LETTER_SCRAPS()
// No longer require the script to be relaunched when loading from a savegame.
Remove_Script_From_Relaunch_List(LAUNCH_BIT_RC_AMB_LETTER_SCRAPS)
ELIF HAVE_ALL_SCRAPS_BEEN_COLLECTED(sMissionData.scrapData)
// Set the flow flag so the Dreyfuss1 mission can be started
Set_Mission_Flow_Flag_State(FLOWFLAG_LETTER_SCRAPS_DONE, TRUE)
// Push a message to the PS4 activity feed.
REQUEST_SYSTEM_ACTIVITY_TYPE_ALL_LETTER_SCRAPS()
// No longer require the script to be relaunched when loading from a savegame.
Remove_Script_From_Relaunch_List(LAUNCH_BIT_RC_AMB_LETTER_SCRAPS)
ELSE
// Register the script so that it can be relaunched when loading from a savegame.
Register_Script_To_Relaunch_List(LAUNCH_BIT_RC_AMB_LETTER_SCRAPS)
ENDIF
IF (bHasMissionBeenSetup)
SET_MODEL_AS_NO_LONGER_NEEDED(sMissionData.packageMdl)
ENDIF
TERMINATE_THIS_THREAD()
ENDPROC
/// PURPOSE:
/// Setup pickup positions and initialise mission details and stats, and debug widgets if needed
/// Sort letter scrap collection and increase substate if all collected
PROC STATE_CollectScraps()
SWITCH(m_eSubState)
CASE SS_SETUP
INITIALISE_LETTER_SCRAPS()
SETUP_SCRAP_MISSION(sMissionData, SCRAP_LETTER, PROP_LD_SCRAP, "LETTERS_COLLECT")
SETUP_SCRAP_MISSION_STATS(sMissionData, NUM_HIDDEN_PACKAGES_0, PACKSTAT_LETTER_START, NUMBER_OF_LETTER_SCRAPS)
// Setup debug widgets
#IF IS_DEBUG_BUILD
//SET_PROFILING_OF_THIS_SCRIPT(TRUE)
SETUP_DEBUG_WIDGETS(sMissionData, sPickupData)
#ENDIF
m_eSubState = SS_UPDATE
bHasMissionBeenSetup = TRUE
BREAK
CASE SS_UPDATE
IF NOT IS_CURRENTLY_ON_MISSION_OF_TYPE(MISSION_TYPE_DIRECTOR)
AND NOT IS_SCREEN_FADED_OUT()
// Has the player collected all of the letter scraps?
IF UPDATE_LETTER_SCRAPS(sMissionData, sPickupData) OR (bDebugAllClearCheck)
CPRINTLN(DEBUG_AMBIENT, "All scraps have been collected - Game Time:", GET_GAME_TIMER())
m_eSubState = SS_CLEANUP
ENDIF
// don't wait for the message to be displayed - force set the flow flag so that i don't break dan's stuff
IF (sMissionData.scrapData.iScrapsCollected = sMissionData.scrapData.iMaxScraps)
IF (GET_MISSION_FLOW_FLAG_STATE(FLOWFLAG_LETTER_SCRAPS_DONE) = FALSE)
CPRINTLN(DEBUG_AMBIENT, "Don't wait for message, set the flag and execute the code ID:", GET_GAME_TIMER())
SET_MISSION_FLOW_FLAG_STATE(FLOWFLAG_LETTER_SCRAPS_DONE, TRUE)
Execute_Code_ID(CID_DREYFUSS1_COMPLETE_LETTER_SCRAPS, 0)
ENDIF
ENDIF
ENDIF
BREAK
CASE SS_CLEANUP
SET_MISSION_FLOW_FLAG_STATE(FLOWFLAG_LETTER_SCRAPS_DONE, TRUE)
Execute_Code_ID(CID_DREYFUSS1_COMPLETE_LETTER_SCRAPS, 0)
SET_STAGE(MISSION_READ_FINISHED_NOTE)
BREAK
ENDSWITCH
ENDPROC
/// PURPOSE:
/// Returns whether certain buttons used to display the confession letter are being used
/// RETURNS:
/// TRUE if at least one is, else FALSE
FUNC BOOL IS_CONFESSION_LETTER_BUTTON_PRESSED()
IF IS_CONTROL_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_RIGHT)
OR IS_CONTROL_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_LEFT)
OR IS_CONTROL_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_CANCEL)
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
PROC STATE_ReadFinishedNote()
SWITCH(m_eSubState)
CASE SS_SETUP
IF GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("startup_positioning")) > 0
CPRINTLN(DEBUG_AMBIENT, "Letter scraps read note trying to run on game startup. Jumping to cleanup phase.")
m_eSubState = SS_CLEANUP
ELSE
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
IF IS_SCREEN_FADED_IN()
IF NOT IS_CURRENTLY_ON_MISSION_OF_ANY_TYPE()
IF NOT IS_MOBILE_PHONE_CALL_ONGOING()
//AND NOT IS_HELP_MESSAGE_BEING_DISPLAYED()
//AND IS_FLOW_HELP_QUEUE_EMPTY()
AND NOT IS_ANY_FLOATING_HELP_BEING_DISPLAYED()
AND NOT HAS_ANY_SAVE_BEEN_REQUESTED() // B*1947128 - Prevent letter appearing game saving has been requested
AND NOT IS_SAVE_IN_PROGRESS() // B*1947128 - Prevent letter appearing while the game is saving
CPRINTLN(DEBUG_AMBIENT, "Free from mobile phone and help. Init STATE_ReadFinishedNote - Game Time:", GET_GAME_TIMER())
bButtonPressed = FALSE
iPage = 0
pageTextArray[0] = "LETTERS_PAGE_ONE"
pageTextArray[1] = "LETTERS_PAGE_TWO"
pageTextArray[2] = "LETTERS_PAGE_THREE"
pageTextArray[3] = "LETTERS_PAGE_FOUR"
mov = REQUEST_SCALEFORM_MOVIE("LETTER_SCRAPS")
WHILE (NOT HAS_SCALEFORM_MOVIE_LOADED(mov))
WAIT(0)
ENDWHILE
BEGIN_SCALEFORM_MOVIE_METHOD(mov, "SET_LETTER_TEXT")
SCALEFORM_MOVIE_METHOD_ADD_PARAM_STRING(pageTextArray[0])
END_SCALEFORM_MOVIE_METHOD()
SET_SCRIPT_GFX_DRAW_BEHIND_PAUSEMENU(TRUE)
HANG_UP_AND_PUT_AWAY_PHONE(TRUE)
SET_MULTIHEAD_SAFE(TRUE,TRUE)
DISPLAY_HELP_TEXT_THIS_FRAME("LETTERS_HELP2", FALSE)
SET_GAME_PAUSED(TRUE)
DISPLAY_RADAR(FALSE)
m_eSubState = SS_UPDATE
ENDIF
ELSE
CDEBUG1LN(DEBUG_AMBIENT, "Waiting to be off mission before displaying letter scrap note.")
ENDIF
ELSE
CDEBUG1LN(DEBUG_AMBIENT, "Waiting for the screen to fade in before displaying letter scrap note.")
ENDIF
ELSE
CDEBUG1LN(DEBUG_AMBIENT, "Waiting for the player to be alive before displaying letter scrap note.")
ENDIF
ENDIF
BREAK
CASE SS_UPDATE
DISABLE_CELLPHONE_THIS_FRAME_ONLY()
DISABLE_FRONTEND_THIS_FRAME() // B*1947144 Prevent being able to display the menu
//allows help text to display over scaleform
SET_SCRIPT_GFX_DRAW_BEHIND_PAUSEMENU(TRUE)
//DISPLAY_HUD_WHEN_NOT_IN_STATE_OF_PLAY_THIS_FRAME()
//DISPLAY_HUD_WHEN_PAUSED_THIS_FRAME()
//DISPLAY_HELP_TEXT_THIS_FRAME("LETTERS_HELP2", FALSE)
SET_SCRIPT_GFX_DRAW_ORDER(GFX_ORDER_BEFORE_HUD)
IF (iPage < MAX_PAGES)
//x:\gta5\script\dev\singleplayer\scripts\temp\scaleformGraphicTest.sc
IF NOT bButtonPressed
IF IS_CONTROL_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_RIGHT)
IF (iPage >= 0)
AND (iPage < (MAX_PAGES-1))
iPage++
BEGIN_SCALEFORM_MOVIE_METHOD(mov, "SET_LETTER_TEXT")
SCALEFORM_MOVIE_METHOD_ADD_PARAM_STRING(pageTextArray[iPage])
END_SCALEFORM_MOVIE_METHOD()
ENDIF
bButtonPressed = TRUE
ELIF IS_CONTROL_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_LEFT)
IF (iPage > 0)
AND (iPage < MAX_PAGES)
iPage--
BEGIN_SCALEFORM_MOVIE_METHOD(mov, "SET_LETTER_TEXT")
SCALEFORM_MOVIE_METHOD_ADD_PARAM_STRING(pageTextArray[iPage])
END_SCALEFORM_MOVIE_METHOD()
ENDIF
bButtonPressed = TRUE
ELIF IS_CONTROL_JUST_RELEASED(FRONTEND_CONTROL, INPUT_FRONTEND_CANCEL) // B*1946713 - Wait until player releases B to avoid latent triggering of the cinematic camera
m_eSubState = SS_CLEANUP
ENDIF
ELSE
IF NOT IS_CONFESSION_LETTER_BUTTON_PRESSED()
bButtonPressed = FALSE
ENDIF
ENDIF
DRAW_SCALEFORM_MOVIE_FULLSCREEN(mov, 255,255,255,255)
ELSE
m_eSubState = SS_CLEANUP
ENDIF
BREAK
CASE SS_CLEANUP
DISPLAY_RADAR(TRUE)
//B* 1751172: Activate Completion percentage as soon as last scrap is collected
//REGISTER_SCRIPT_IN_COMPLETION_PERCENTAGE_TOTAL (CP_DLS1)
CLEAR_HELP() //so help isn't hanging around
SET_MULTIHEAD_SAFE(FALSE,TRUE)
REMOVE_SCRIPT_FROM_RELAUNCH_LIST(LAUNCH_BIT_RC_AMB_LETTER_SCRAPS)
SCRIPT_CLEANUP()
BREAK
ENDSWITCH
ENDPROC
//----------------------
// MAIN SCRIPT
//----------------------
SCRIPT
// Setup callbacks
IF HAS_FORCE_CLEANUP_OCCURRED(FORCE_CLEANUP_FLAG_DEBUG_MENU|FORCE_CLEANUP_FLAG_SP_TO_MP|FORCE_CLEANUP_FLAG_REPEAT_PLAY|FORCE_CLEANUP_FLAG_DIRECTOR)
SCRIPT_CLEANUP()
ENDIF
// Close down in the event that this script is already running
IF GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH (HASH("letterScraps")) > 1
CPRINTLN(DEBUG_AMBIENT, "Letter Scraps is attempting to launch with an instance already active.")
TERMINATE_THIS_THREAD()
ENDIF
// Register the script so that it can be relaunched when loading from a savegame.
REGISTER_SCRIPT_TO_RELAUNCH_LIST(LAUNCH_BIT_RC_AMB_LETTER_SCRAPS)
// Setup arrays and everything else
CPRINTLN(DEBUG_AMBIENT, "Initializing Letter Scrap Collection - Version:", XVERSION_NUMBER)
IF (GET_MISSION_FLOW_FLAG_STATE(FLOWFLAG_LETTER_SCRAPS_DONE) = TRUE)
CPRINTLN(DEBUG_AMBIENT, "We've picked up scraps already - Abort")
REMOVE_SCRIPT_FROM_RELAUNCH_LIST(LAUNCH_BIT_RC_AMB_LETTER_SCRAPS)
REGISTER_SCRIPT_IN_COMPLETION_PERCENTAGE_TOTAL (CP_DLS1)
SET_MISSION_FLOW_FLAG_STATE(FLOWFLAG_LETTER_SCRAPS_DONE, TRUE)
Execute_Code_ID(CID_DREYFUSS1_COMPLETE_LETTER_SCRAPS, 0)
SCRIPT_CLEANUP()
ENDIF
// Main loop
WHILE (TRUE)
WAIT(0)
IS_ENTITY_OK(PLAYER_PED_ID())
SWITCH(m_eState)
CASE MISSION_COLLECT_SCRAPS
STATE_CollectScraps()
BREAK
CASE MISSION_READ_FINISHED_NOTE
STATE_ReadFinishedNote()
BREAK
ENDSWITCH
// Debug widgets
#IF IS_DEBUG_BUILD
UPDATE_DEBUG_WIDGETS(sMissionData, sPickupData)
IF bDebugQuitScript
SCRIPT_CLEANUP()
ENDIF
#ENDIF
ENDWHILE
ENDSCRIPT