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

1189 lines
37 KiB
Python
Executable File

//Compile out Title Update changes to header functions.
//Must be before includes.
//CONST_INT USE_TU_CHANGES 0 // Removed by Kenneth R.
USING "rage_builtins.sch"
USING "globals.sch"
USING "commands_camera.sch"
USING "commands_pad.sch"
USING "commands_script.sch"
USING "friendutil_private.sch"
USING "flow_public_core.sch"
USING "pb_prostitute_stats.sch"
USING "script_usecontext.sch"
USING "selector_public.sch"
// *****************************************************************************************
// *****************************************************************************************
// *****************************************************************************************
//
// MISSION NAME : shrinkLetter.sc
// AUTHOR :
// DESCRIPTION : Test script which generates the shrink letter displayed at the
// end of the game after the end credits.
//
// *****************************************************************************************
// *****************************************************************************************
// *****************************************************************************************
// Constants
CONST_INT TOTAL_MONEY_SPENT 1000000 // Money spent or saved
CONST_INT STRIP_CLUB_DANCES 3 // Strip club - number of lap dances
CONST_INT STRIP_CLUB_MONEY_SPENT 100 // Strip club - cash spent
CONST_INT STOCKMARKET_TIME_SPENT 120000 // Stockmarket - time spent
CONST_INT TOTAL_PEDS_KILLED 100 // Number of innocent peds killed
CONST_INT TOTAL_VEHICLES_STOLEN 100 // Number of vehicles stolen
CONST_INT FITNESS_LEVEL_FRANKLIN 50 // Fitness (Stamina, Strength, Lung Capacity)
CONST_INT FITNESS_LEVEL_MICHAEL 50
CONST_INT FITNESS_LEVEL_TREVOR 50
CONST_INT TOTAL_STRANGERS_MET 10 // Number of RC's and RE's completed
// Enums
ENUM STAGE_LETTER
SS_SETUP,
SS_INIT,
SS_UPDATE,
SS_CLEANUP
ENDENUM
STAGE_LETTER eLetterStage = SS_SETUP
// Structs
STRUCT STRUCT_PSYCH_DATA
INT iIntro
TEXT_LABEL_3 tl3storychoice
TEXT_LABEL_3 tl3mostplayedchar
TEXT_LABEL_7 tl3moneyspent
TEXT_LABEL_3 tl3stripclubs
TEXT_LABEL_3 tl3prostitute
TEXT_LABEL_3 tl3family
TEXT_LABEL_3 tl3stockmarket
TEXT_LABEL_3 tl3killpeds
TEXT_LABEL_3 tl3stolenvehicles
TEXT_LABEL_3 tl3yoga
TEXT_LABEL_3 tl3fitness
TEXT_LABEL_3 tl3strangers
TEXT_LABEL_3 tl3collectables
INT iSummary
ENDSTRUCT
// Variables
SCALEFORM_INDEX siLetter
STRUCT_PSYCH_DATA sUploadData
INT iCloudLoadStage
BOOL bCloudSuccess
SIMPLE_USE_CONTEXT ucInstructions
// Debug
#IF IS_DEBUG_BUILD
WIDGET_GROUP_ID widgetGroup
BOOL bKilledMichael
BOOL bKilledTrevor
BOOL bPlayedFranklin
BOOL bPlayedMichael
BOOL bPlayedTrevor
BOOL bSpentCash
BOOL bStripClubs
BOOL bProstitutes
BOOL bMichaelFamily
BOOL bStockMarket
BOOL bKilledPeds
BOOL bStoleVehicles
BOOL bYoga
BOOL bFitness
BOOL bRandomChar
BOOL bCollectables
BOOL bUseDebug
BOOL bUseScaleform
BOOL bGenerateLetter
#ENDIF
/// PURPOSE:
/// Returns randomised introduction line
FUNC TEXT_LABEL_15 GET_SHRINK_INTRO(STRUCT_PSYCH_DATA &sPsychData)
TEXT_LABEL_15 returnStr = "INTRO_"
INT randInt = GET_RANDOM_INT_IN_RANGE(1,21)
sPsychData.iIntro = randInt
returnStr += randInt
RETURN returnStr
ENDFUNC
/// PURPOSE:
/// Returns line dependant on whether the player killed Michael, Trevor or saved both
FUNC TEXT_LABEL_15 GET_SHRINK_STORY_CHOICE(STRUCT_PSYCH_DATA &sPsychData)
TEXT_LABEL_15 returnStr = "STORY_"
INT randInt
// Debug choice
#IF IS_DEBUG_BUILD
IF bUseDebug
IF bKilledMichael
sPsychData.tl3storychoice = "M"
returnStr += "M"
randInt = GET_RANDOM_INT_IN_RANGE(1,11)
ELIF bKilledTrevor
sPsychData.tl3storychoice = "T"
returnStr += "T"
randInt = GET_RANDOM_INT_IN_RANGE(1,10)
ELSE
sPsychData.tl3storychoice = "B"
returnStr += "B"
randInt = GET_RANDOM_INT_IN_RANGE(1,11)
ENDIF
sPsychData.tl3storychoice += randInt
returnStr += randInt
RETURN returnStr
ENDIF
#ENDIF
// Gameflow choice
IF GET_MISSION_FLOW_FLAG_STATE(FLOWFLAG_MICHAEL_KILLED)
sPsychData.tl3storychoice = "M"
returnStr += "M"
randInt = GET_RANDOM_INT_IN_RANGE(1,11)
ELIF GET_MISSION_FLOW_FLAG_STATE(FLOWFLAG_TREVOR_KILLED)
sPsychData.tl3storychoice = "T"
returnStr += "T"
randInt = GET_RANDOM_INT_IN_RANGE(1,10)
ELSE
sPsychData.tl3storychoice = "B"
returnStr += "B"
randInt = GET_RANDOM_INT_IN_RANGE(1,11)
ENDIF
sPsychData.tl3storychoice += randInt
returnStr += randInt
RETURN returnStr
ENDFUNC
/// PURPOSE:
/// Returns line associated with most played character
FUNC TEXT_LABEL_15 GET_SHRINK_MOST_PLAYED_CHAR(STRUCT_PSYCH_DATA &sPsychData)
TEXT_LABEL_15 returnStr = "CHAR_"
INT randInt
// Debug choice
#IF IS_DEBUG_BUILD
IF bUseDebug
IF bPlayedMichael
sPsychData.tl3mostplayedchar = "M"
returnStr += "M"
randInt = GET_RANDOM_INT_IN_RANGE(1,13)
ELIF bPlayedFranklin
sPsychData.tl3mostplayedchar = "F"
returnStr += "F"
randInt = GET_RANDOM_INT_IN_RANGE(1,13)
ELSE
sPsychData.tl3mostplayedchar = "T"
returnStr += "T"
randInt = GET_RANDOM_INT_IN_RANGE(1,12)
ENDIF
returnStr += randInt
RETURN returnStr
ENDIF
#ENDIF
// Work out most played character
enumCharacterList eMostPlayedChar = CHAR_MICHAEL
INT iTempTime
INT iMaxTime = 0
// Get Michael's playtime...
STAT_GET_INT(SP0_TOTAL_PLAYING_TIME, iMaxTime, 0)
// Get Franklin's play time and check if it's larger...
STAT_GET_INT(SP1_TOTAL_PLAYING_TIME, iTempTime, 1)
IF iTempTime > iMaxTime
iMaxTime = iTempTime
eMostPlayedChar = CHAR_FRANKLIN
ENDIF
// Check if Trevor's playtime is longest...
STAT_GET_INT(SP2_TOTAL_PLAYING_TIME, iTempTime, 2)
IF iTempTime > iMaxTime
iMaxTime = iTempTime
eMostPlayedChar = CHAR_TREVOR
ENDIF
// Build text based on most played char
IF eMostPlayedChar = CHAR_MICHAEL
sPsychData.tl3mostplayedchar = "M"
returnStr += "M"
randInt = GET_RANDOM_INT_IN_RANGE(1,13)
ELIF eMostPlayedChar = CHAR_FRANKLIN
sPsychData.tl3mostplayedchar = "F"
returnStr += "F"
randInt = GET_RANDOM_INT_IN_RANGE(1,13)
ELSE
sPsychData.tl3mostplayedchar = "T"
returnStr += "T"
randInt = GET_RANDOM_INT_IN_RANGE(1,12)
ENDIF
sPsychData.tl3mostplayedchar += randInt
returnStr += randInt
RETURN returnStr
ENDFUNC
/// PURPOSE:
/// Returns line associated with spending or saving money
FUNC TEXT_LABEL_15 GET_SHRINK_MONEY_SPENT(STRUCT_PSYCH_DATA &sPsychData)
TEXT_LABEL_15 returnStr = "CASH_"
INT randInt
// Debug choice
#IF IS_DEBUG_BUILD
IF bUseDebug
IF bSpentCash
sPsychData.tl3moneyspent = "SP"
returnStr += "SP"
randInt = GET_RANDOM_INT_IN_RANGE(1,14)
ELSE
sPsychData.tl3moneyspent = "SA"
returnStr += "SA"
randInt = GET_RANDOM_INT_IN_RANGE(1,13)
ENDIF
sPsychData.tl3moneyspent += randInt
returnStr += randInt
RETURN returnStr
ENDIF
#ENDIF
// Get total amount of cash spent by all characters
INT iTempCash, iTotalCash
STAT_GET_INT(SP0_MONEY_TOTAL_SPENT, iTempCash, 0) iTotalCash += iTempCash
STAT_GET_INT(SP1_MONEY_TOTAL_SPENT, iTempCash, 1) iTotalCash += iTempCash
STAT_GET_INT(SP2_MONEY_TOTAL_SPENT, iTempCash, 2) iTotalCash += iTempCash
// Player has spent over 1 million
IF iTotalCash >= TOTAL_MONEY_SPENT
sPsychData.tl3moneyspent = "SP"
returnStr += "SP"
randInt = GET_RANDOM_INT_IN_RANGE(1,14)
ELSE
sPsychData.tl3moneyspent = "SA"
returnStr += "SA"
randInt = GET_RANDOM_INT_IN_RANGE(1,13)
ENDIF
// Cloud data
sPsychData.tl3moneyspent += randInt
// Return suitable text
returnStr += randInt
RETURN returnStr
ENDFUNC
/// PURPOSE:
/// Returns line associated with whether player frequented strip clubs
FUNC TEXT_LABEL_15 GET_SHRINK_VISITED_STRIP_CLUBS(STRUCT_PSYCH_DATA &sPsychData)
TEXT_LABEL_15 returnStr = "STRIP_"
INT randInt
// Debug choice
#IF IS_DEBUG_BUILD
IF bUseDebug
IF bStripClubs
sPsychData.tl3stripclubs = "Y"
returnStr += "Y"
randInt = GET_RANDOM_INT_IN_RANGE(1,13)
ELSE
sPsychData.tl3stripclubs = "N"
returnStr += "N"
randInt = GET_RANDOM_INT_IN_RANGE(1,12)
ENDIF
sPsychData.tl3stripclubs += randInt
returnStr += randInt
RETURN returnStr
ENDIF
#ENDIF
// Get total amount of lap dances...
INT iTempDances, iTotalDances
STAT_GET_INT(SP0_LAP_DANCED_BOUGHT, iTempDances, 0) iTotalDances += iTempDances
STAT_GET_INT(SP1_LAP_DANCED_BOUGHT, iTempDances, 1) iTotalDances += iTempDances
STAT_GET_INT(SP2_LAP_DANCED_BOUGHT, iTempDances, 2) iTotalDances += iTempDances
// ...or money spent in strip clubs by all characters
INT iTempCash, iTotalCash
STAT_GET_INT(SP0_MONEY_SPENT_IN_STRIP_CLUBS, iTempCash, 0) iTotalCash += iTempCash
STAT_GET_INT(SP1_MONEY_SPENT_IN_STRIP_CLUBS, iTempCash, 1) iTotalCash += iTempCash
STAT_GET_INT(SP2_MONEY_SPENT_IN_STRIP_CLUBS, iTempCash, 2) iTotalCash += iTempCash
// Player has had 3 or more dances or spent over $100 in a strip club
IF iTotalDances >= STRIP_CLUB_DANCES
OR iTotalCash >= STRIP_CLUB_MONEY_SPENT
sPsychData.tl3stripclubs = "Y"
returnStr += "Y"
randInt = GET_RANDOM_INT_IN_RANGE(1,13)
ELSE
sPsychData.tl3stripclubs = "N"
returnStr += "N"
randInt = GET_RANDOM_INT_IN_RANGE(1,12)
ENDIF
// Cloud data
sPsychData.tl3stripclubs += randInt
// Return suitable text
returnStr += randInt
RETURN returnStr
ENDFUNC
/// PURPOSE:
/// Returns line associated with whether player used prostitutes
FUNC TEXT_LABEL_15 GET_SHRINK_USED_PROSTITUTES(STRUCT_PSYCH_DATA &sPsychData)
TEXT_LABEL_15 returnStr = "PROS_"
INT randInt
// Debug choice
#IF IS_DEBUG_BUILD
IF bUseDebug
IF bProstitutes
sPsychData.tl3prostitute = "Y"
returnStr += "Y"
randInt = GET_RANDOM_INT_IN_RANGE(1,13)
ELSE
sPsychData.tl3prostitute = "N"
returnStr += "N"
randInt = GET_RANDOM_INT_IN_RANGE(1,12)
ENDIF
sPsychData.tl3prostitute += randInt
returnStr += randInt
RETURN returnStr
ENDIF
#ENDIF
IF GET_NUM_PROSTITUTE_SERVICES_SOLICITED_BY_PLAYER(CHAR_FRANKLIN) > 0
OR GET_NUM_PROSTITUTE_SERVICES_SOLICITED_BY_PLAYER(CHAR_MICHAEL) > 0
OR GET_NUM_PROSTITUTE_SERVICES_SOLICITED_BY_PLAYER(CHAR_TREVOR) > 0
sPsychData.tl3prostitute = "Y"
returnStr += "Y"
ELSE
sPsychData.tl3prostitute = "N"
returnStr += "N"
ENDIF
randInt = GET_RANDOM_INT_IN_RANGE(1,13)
sPsychData.tl3prostitute += randInt
returnStr += randInt
RETURN returnStr
ENDFUNC
/// PURPOSE:
/// Returns line whether Michael has paid any attention to his family
FUNC TEXT_LABEL_15 GET_SHRINK_FAMILY_ATTENTION(STRUCT_PSYCH_DATA &sPsychData)
TEXT_LABEL_15 returnStr = "FAMILY_"
INT randInt
// Debug choice
#IF IS_DEBUG_BUILD
IF bUseDebug
IF bMichaelFamily
sPsychData.tl3family = "Y"
returnStr += "Y"
randInt = GET_RANDOM_INT_IN_RANGE(1,13)
ELSE
sPsychData.tl3family = "N"
returnStr += "N"
randInt = GET_RANDOM_INT_IN_RANGE(1,12)
ENDIF
sPsychData.tl3family += randInt
returnStr += randInt
RETURN returnStr
ENDIF
#ENDIF
IF HAS_CONNECTION_BEEN_PLAYED(FC_MICHAEL_AMANDA)
AND HAS_CONNECTION_BEEN_PLAYED(FC_MICHAEL_JIMMY)
sPsychData.tl3family = "Y"
returnStr += "Y"
ELSE
sPsychData.tl3family = "N"
returnStr += "N"
ENDIF
randInt = GET_RANDOM_INT_IN_RANGE(1,13)
sPsychData.tl3family += randInt
returnStr += randInt
RETURN returnStr
ENDFUNC
/// PURPOSE:
/// Returns line whether any attention was paid to the stockmarket
FUNC TEXT_LABEL_15 GET_SHRINK_PLAYED_STOCKMARKET(STRUCT_PSYCH_DATA &sPsychData)
TEXT_LABEL_15 returnStr = "STOCK_"
INT randInt
// Debug choice
#IF IS_DEBUG_BUILD
IF bUseDebug
IF bStockMarket
sPsychData.tl3stockmarket = "Y"
returnStr += "Y"
ELSE
sPsychData.tl3stockmarket = "N"
returnStr += "N"
ENDIF
randInt = GET_RANDOM_INT_IN_RANGE(1,13)
sPsychData.tl3stockmarket += randInt
returnStr += randInt
RETURN returnStr
ENDIF
#ENDIF
// Get total amount of time spent on stockmarket
INT iTime
STAT_GET_INT(TIME_SPENT_ON_STOCKMARKET, iTime, 0)
// Player has spent over x minutes in the stockmarket
IF iTime >= STOCKMARKET_TIME_SPENT
sPsychData.tl3stockmarket = "Y"
returnStr += "Y"
ELSE
sPsychData.tl3stockmarket = "N"
returnStr += "N"
ENDIF
randInt = GET_RANDOM_INT_IN_RANGE(1,13)
sPsychData.tl3stockmarket += randInt
returnStr += randInt
RETURN returnStr
ENDFUNC
/// PURPOSE:
/// Returns line whether player killed a lot of peds
FUNC TEXT_LABEL_15 GET_SHRINK_KILLED_PEDS(STRUCT_PSYCH_DATA &sPsychData)
TEXT_LABEL_15 returnStr = "PEDS_"
INT randInt
// Debug choice
#IF IS_DEBUG_BUILD
IF bUseDebug
IF bKilledPeds
sPsychData.tl3killpeds = "Y"
returnStr += "Y"
ELSE
sPsychData.tl3killpeds = "N"
returnStr += "N"
ENDIF
randInt = GET_RANDOM_INT_IN_RANGE(1,13)
sPsychData.tl3killpeds += randInt
returnStr += randInt
RETURN returnStr
ENDIF
#ENDIF
// Get number of innocent peds killed by all characters
INT iTempPeds, iTotalPeds
STAT_GET_INT(SP0_KILLS_INNOCENTS, iTempPeds, 0) iTotalPeds += iTempPeds
STAT_GET_INT(SP1_KILLS_INNOCENTS, iTempPeds, 1) iTotalPeds += iTempPeds
STAT_GET_INT(SP2_KILLS_INNOCENTS, iTempPeds, 2) iTotalPeds += iTempPeds
// Player has killed over threshold amount of innocent peds
IF iTotalPeds >= TOTAL_PEDS_KILLED
sPsychData.tl3killpeds = "Y"
returnStr += "Y"
ELSE
sPsychData.tl3killpeds = "N"
returnStr += "N"
ENDIF
randInt = GET_RANDOM_INT_IN_RANGE(1,13)
sPsychData.tl3killpeds += randInt
returnStr += randInt
RETURN returnStr
ENDFUNC
/// PURPOSE:
/// Returns line whether player stole a lot of vehicles
FUNC TEXT_LABEL_15 GET_SHRINK_STOLE_VEHICLES(STRUCT_PSYCH_DATA &sPsychData)
TEXT_LABEL_15 returnStr = "VEHS_"
INT randInt
// Debug choice
#IF IS_DEBUG_BUILD
IF bUseDebug
IF bStoleVehicles
sPsychData.tl3stolenvehicles = "Y"
returnStr += "Y"
ELSE
sPsychData.tl3stolenvehicles = "N"
returnStr += "N"
ENDIF
randInt = GET_RANDOM_INT_IN_RANGE(1,13)
sPsychData.tl3stolenvehicles += randInt
returnStr += randInt
RETURN returnStr
ENDIF
#ENDIF
// Get number of vehicles stolen by all characters
INT iTempVehicles, iTotalVehicles
// Michael
STAT_GET_INT(SP0_NUMBER_STOLEN_COP_VEHICLE, iTempVehicles, 0) iTotalVehicles += iTempVehicles
STAT_GET_INT(SP0_NUMBER_STOLEN_CARS, iTempVehicles, 0) iTotalVehicles += iTempVehicles
STAT_GET_INT(SP0_NUMBER_STOLEN_BIKES, iTempVehicles, 0) iTotalVehicles += iTempVehicles
STAT_GET_INT(SP0_NUMBER_STOLEN_BOATS, iTempVehicles, 0) iTotalVehicles += iTempVehicles
STAT_GET_INT(SP0_NUMBER_STOLEN_HELIS, iTempVehicles, 0) iTotalVehicles += iTempVehicles
STAT_GET_INT(SP0_NUMBER_STOLEN_QUADBIKES, iTempVehicles, 0) iTotalVehicles += iTempVehicles
STAT_GET_INT(SP0_NUMBER_STOLEN_BICYCLES, iTempVehicles, 0) iTotalVehicles += iTempVehicles
// Franklin
STAT_GET_INT(SP1_NUMBER_STOLEN_COP_VEHICLE, iTempVehicles, 1) iTotalVehicles += iTempVehicles
STAT_GET_INT(SP1_NUMBER_STOLEN_CARS, iTempVehicles, 1) iTotalVehicles += iTempVehicles
STAT_GET_INT(SP1_NUMBER_STOLEN_BIKES, iTempVehicles, 1) iTotalVehicles += iTempVehicles
STAT_GET_INT(SP1_NUMBER_STOLEN_BOATS, iTempVehicles, 1) iTotalVehicles += iTempVehicles
STAT_GET_INT(SP1_NUMBER_STOLEN_HELIS, iTempVehicles, 1) iTotalVehicles += iTempVehicles
STAT_GET_INT(SP1_NUMBER_STOLEN_QUADBIKES, iTempVehicles, 1) iTotalVehicles += iTempVehicles
STAT_GET_INT(SP1_NUMBER_STOLEN_BICYCLES, iTempVehicles, 1) iTotalVehicles += iTempVehicles
// Trevor
STAT_GET_INT(SP2_NUMBER_STOLEN_COP_VEHICLE, iTempVehicles, 2) iTotalVehicles += iTempVehicles
STAT_GET_INT(SP2_NUMBER_STOLEN_CARS, iTempVehicles, 2) iTotalVehicles += iTempVehicles
STAT_GET_INT(SP2_NUMBER_STOLEN_BIKES, iTempVehicles, 2) iTotalVehicles += iTempVehicles
STAT_GET_INT(SP2_NUMBER_STOLEN_BOATS, iTempVehicles, 2) iTotalVehicles += iTempVehicles
STAT_GET_INT(SP2_NUMBER_STOLEN_HELIS, iTempVehicles, 2) iTotalVehicles += iTempVehicles
STAT_GET_INT(SP2_NUMBER_STOLEN_QUADBIKES, iTempVehicles, 2) iTotalVehicles += iTempVehicles
STAT_GET_INT(SP2_NUMBER_STOLEN_BICYCLES, iTempVehicles, 2) iTotalVehicles += iTempVehicles
// Player has stolen over threshold amount of vehicles
IF iTotalVehicles >= TOTAL_VEHICLES_STOLEN
sPsychData.tl3stolenvehicles = "Y"
returnStr += "Y"
ELSE
sPsychData.tl3stolenvehicles = "N"
returnStr += "N"
ENDIF
randInt = GET_RANDOM_INT_IN_RANGE(1,13)
sPsychData.tl3stolenvehicles += randInt
returnStr += randInt
RETURN returnStr
ENDFUNC
/// PURPOSE:
/// Returns line whether player was active in yoga
FUNC TEXT_LABEL_15 GET_SHRINK_PERFORMED_YOGA(STRUCT_PSYCH_DATA &sPsychData)
TEXT_LABEL_15 returnStr = "YOGA_"
INT randInt
// Debug choice
#IF IS_DEBUG_BUILD
IF bUseDebug
IF bYoga
sPsychData.tl3yoga = "Y"
returnStr += "Y"
ELSE
sPsychData.tl3yoga = "N"
returnStr += "N"
ENDIF
randInt = GET_RANDOM_INT_IN_RANGE(1,13)
sPsychData.tl3yoga += randInt
returnStr += randInt
RETURN returnStr
ENDIF
#ENDIF
// Has the player completed the Yoga minigame?
IF HAS_THIS_SCRIPT_BEEN_REGISTERED_IN_COMPLETION_PERCENTAGE_TOTAL(CP_YOGA)
sPsychData.tl3yoga = "Y"
returnStr += "Y"
ELSE
sPsychData.tl3yoga = "N"
returnStr += "N"
ENDIF
randInt = GET_RANDOM_INT_IN_RANGE(1,13)
sPsychData.tl3yoga += randInt
returnStr += randInt
RETURN returnStr
ENDFUNC
/// PURPOSE:
/// Returns line whether player was generally fit and active
FUNC TEXT_LABEL_15 GET_SHRINK_FITNESS(STRUCT_PSYCH_DATA &sPsychData)
TEXT_LABEL_15 returnStr = "FIT_"
INT randInt
// Debug choice
#IF IS_DEBUG_BUILD
IF bUseDebug
IF bFitness
sPsychData.tl3fitness = "Y"
returnStr += "Y"
randInt = GET_RANDOM_INT_IN_RANGE(1,11)
ELSE
sPsychData.tl3fitness = "N"
returnStr += "N"
randInt = GET_RANDOM_INT_IN_RANGE(1,13)
ENDIF
sPsychData.tl3fitness = randInt
returnStr += randInt
RETURN returnStr
ENDIF
#ENDIF
// All player fitness levels are above set amounts
IF GET_SP_PLAYER_PED_STAT_VALUE(CHAR_FRANKLIN, PS_STAMINA) > FITNESS_LEVEL_FRANKLIN // Franklin
AND GET_SP_PLAYER_PED_STAT_VALUE(CHAR_FRANKLIN, PS_STRENGTH) > FITNESS_LEVEL_FRANKLIN
AND GET_SP_PLAYER_PED_STAT_VALUE(CHAR_FRANKLIN, PS_LUNG_CAPACITY) > FITNESS_LEVEL_FRANKLIN
AND GET_SP_PLAYER_PED_STAT_VALUE(CHAR_MICHAEL, PS_STAMINA) > FITNESS_LEVEL_MICHAEL // Michael
AND GET_SP_PLAYER_PED_STAT_VALUE(CHAR_MICHAEL, PS_STRENGTH) > FITNESS_LEVEL_MICHAEL
AND GET_SP_PLAYER_PED_STAT_VALUE(CHAR_MICHAEL, PS_LUNG_CAPACITY) > FITNESS_LEVEL_MICHAEL
AND GET_SP_PLAYER_PED_STAT_VALUE(CHAR_TREVOR, PS_STAMINA) > FITNESS_LEVEL_TREVOR // Trevor
AND GET_SP_PLAYER_PED_STAT_VALUE(CHAR_TREVOR, PS_STRENGTH) > FITNESS_LEVEL_TREVOR
AND GET_SP_PLAYER_PED_STAT_VALUE(CHAR_TREVOR, PS_LUNG_CAPACITY) > FITNESS_LEVEL_TREVOR
sPsychData.tl3fitness = "Y"
returnStr += "Y"
ELSE
sPsychData.tl3fitness = "N"
returnStr += "N"
ENDIF
randInt = GET_RANDOM_INT_IN_RANGE(1,11)
sPsychData.tl3fitness += randInt
returnStr += randInt
RETURN returnStr
ENDFUNC
/// PURPOSE:
/// Returns line whether player engaged in random chars/events
FUNC TEXT_LABEL_15 GET_SHRINK_RANDOM_CHARS(STRUCT_PSYCH_DATA &sPsychData)
TEXT_LABEL_15 returnStr = "RAND_"
INT randInt
// Debug choice
#IF IS_DEBUG_BUILD
IF bUseDebug
IF bRandomChar
sPsychData.tl3strangers = "Y"
returnStr += "Y"
ELSE
sPsychData.tl3strangers = "N"
returnStr += "N"
ENDIF
randInt = GET_RANDOM_INT_IN_RANGE(1,13)
returnStr += randInt
RETURN returnStr
ENDIF
#ENDIF
// Get total number of completed RCM's and RE's
INT iCompletedRC, iCompletedRE, iTotal
STAT_GET_INT(NUM_RNDPEOPLE_COMPLETED, iCompletedRC)
STAT_GET_INT(NUM_RNDEVENTS_COMPLETED, iCompletedRE)
iTotal = iCompletedRC + iCompletedRE
// Player has completed over x Random Events and Random Character missions
IF (iTotal > TOTAL_STRANGERS_MET)
sPsychData.tl3strangers = "Y"
returnStr += "Y"
ELSE
sPsychData.tl3strangers = "N"
returnStr += "N"
ENDIF
randInt = GET_RANDOM_INT_IN_RANGE(1,13)
sPsychData.tl3strangers += randInt
returnStr += randInt
RETURN returnStr
ENDFUNC
/// PURPOSE:
/// Returns line whether player was generally fit and active
FUNC TEXT_LABEL_15 GET_SHRINK_COLLECTABLES(STRUCT_PSYCH_DATA &sPsychData)
TEXT_LABEL_15 returnStr = "COLLECT_"
INT randInt
// Debug choice
#IF IS_DEBUG_BUILD
IF bUseDebug
IF bCollectables
sPsychData.tl3collectables = "Y"
returnStr += "Y"
randInt = GET_RANDOM_INT_IN_RANGE(1,11)
ELSE
sPsychData.tl3collectables = "N"
returnStr += "N"
randInt = GET_RANDOM_INT_IN_RANGE(1,12)
ENDIF
sPsychData.tl3collectables += randInt
returnStr += randInt
RETURN returnStr
ENDIF
#ENDIF
// Check collectables
IF GET_MISSION_FLOW_FLAG_STATE(FLOWFLAG_DIVING_SCRAPS_DONE) // Submarine parts
OR GET_MISSION_FLOW_FLAG_STATE(FLOWFLAG_EPSILON_UNLOCKED_TRACT) // Epsilon tract
OR GET_MISSION_FLOW_FLAG_STATE(FLOWFLAG_LETTER_SCRAPS_DONE) // Dreyfuss letter
OR GET_MISSION_FLOW_FLAG_STATE(FLOWFLAG_SPACESHIP_PARTS_DONE) // Omega spaceship
sPsychData.tl3collectables = "Y"
returnStr += "Y"
randInt = GET_RANDOM_INT_IN_RANGE(1,11)
ELSE
sPsychData.tl3collectables = "N"
returnStr += "N"
randInt = GET_RANDOM_INT_IN_RANGE(1,12)
ENDIF
sPsychData.tl3collectables += randInt
returnStr += randInt
RETURN returnStr
ENDFUNC
/// PURPOSE:
/// Returns randomised summary
FUNC TEXT_LABEL_15 GET_SHRINK_SUMMARY(STRUCT_PSYCH_DATA &sPsychData)
TEXT_LABEL_15 returnStr = "SUMMARY_"
INT randInt = GET_RANDOM_INT_IN_RANGE(1,24)
sPsychData.iSummary = randInt
returnStr += randInt
RETURN returnStr
ENDFUNC
/// PURPOSE:
/// Saves psychology report to a given path for the cloud dats
/// PARAMS:
/// iLoadStage - the switching stage
/// bSuccess - was it a sucess
/// sPsychData - Cloud data
FUNC BOOL SAVE_OUT_PSYCH_DATA(INT &iLoadStage, BOOL &bSuccess, STRUCT_PSYCH_DATA &sPsychData)
// The cloud is down... get out of here!
IF IS_CLOUD_DOWN_CLOUD_LOADER()
CPRINTLN(DEBUG_MISSION, "SAVE_OUT_PSYCH_DATA - NOT IS_CLOUD_DOWN_CLOUD_LOADER()")
RETURN TRUE
ENDIF
//Vars needed
DATAFILE_DICT dfdMainDict
SWITCH iLoadStage
// Deal with setup
CASE 0
IF IS_SCRIPT_UCG_REQUEST_IN_PROGRESS()
RETURN FALSE
ENDIF
CLEANUP_DATA_FILE()
iLoadStage++
BREAK
//Initilise the data file
CASE 1
//SET UP THE DATA FILE
DATAFILE_CREATE()
//Get a handel on the top level dictionay
dfdMainDict = DATAFILE_GET_FILE_DICT()
//Add an INT
DATADICT_SET_INT (dfdMainDict, "in", sPsychData.iIntro)
DATADICT_SET_STRING (dfdMainDict, "st", sPsychData.tl3storychoice)
DATADICT_SET_STRING (dfdMainDict, "mp", sPsychData.tl3mostplayedchar)
DATADICT_SET_STRING (dfdMainDict, "ms", sPsychData.tl3moneyspent)
DATADICT_SET_STRING (dfdMainDict, "sc", sPsychData.tl3stripclubs)
DATADICT_SET_STRING (dfdMainDict, "pr", sPsychData.tl3prostitute)
DATADICT_SET_STRING (dfdMainDict, "fa", sPsychData.tl3family)
DATADICT_SET_STRING (dfdMainDict, "sm", sPsychData.tl3stockmarket)
DATADICT_SET_STRING (dfdMainDict, "kp", sPsychData.tl3killpeds)
DATADICT_SET_STRING (dfdMainDict, "sv", sPsychData.tl3stolenvehicles)
DATADICT_SET_STRING (dfdMainDict, "yo", sPsychData.tl3yoga)
DATADICT_SET_STRING (dfdMainDict, "fi", sPsychData.tl3fitness)
DATADICT_SET_STRING (dfdMainDict, "rc", sPsychData.tl3strangers)
DATADICT_SET_STRING (dfdMainDict, "co", sPsychData.tl3collectables)
DATADICT_SET_INT (dfdMainDict, "su", sPsychData.iSummary)
DATAFILE_START_SAVE_TO_CLOUD("gta5/psych/index.json")
iLoadStage++
BREAK
CASE 2
// Wait for it to finish
IF PROCESS_SAVE_FILE_TO_CLOUD(bSuccess)
CPRINTLN(DEBUG_MISSION, "iIntro = ", sPsychData.iIntro)
CPRINTLN(DEBUG_MISSION, "tl3storychoice = ", sPsychData.tl3storychoice)
CPRINTLN(DEBUG_MISSION, "tl3mostplayedchar = ", sPsychData.tl3mostplayedchar)
CPRINTLN(DEBUG_MISSION, "tl3moneyspent = ", sPsychData.tl3moneyspent)
CPRINTLN(DEBUG_MISSION, "tl3stripclubs = ", sPsychData.tl3stripclubs)
CPRINTLN(DEBUG_MISSION, "tl3prostitute = ", sPsychData.tl3prostitute)
CPRINTLN(DEBUG_MISSION, "tl3family = ", sPsychData.tl3family)
CPRINTLN(DEBUG_MISSION, "tl3stockmarket = ", sPsychData.tl3stockmarket)
CPRINTLN(DEBUG_MISSION, "tl3killpeds = ", sPsychData.tl3killpeds)
CPRINTLN(DEBUG_MISSION, "tl3stolenvehicles = ", sPsychData.tl3stolenvehicles)
CPRINTLN(DEBUG_MISSION, "tl3yoga = ", sPsychData.tl3yoga)
CPRINTLN(DEBUG_MISSION, "tl3fitness = ", sPsychData.tl3fitness)
CPRINTLN(DEBUG_MISSION, "tl3strangers = ", sPsychData.tl3strangers)
CPRINTLN(DEBUG_MISSION, "tl3collectables = ", sPsychData.tl3collectables)
CPRINTLN(DEBUG_MISSION, "iSummary = ", sPsychData.iSummary)
CPRINTLN(DEBUG_MISSION, "SAVE_OUT_PSYCH_DATA - Success!")
RETURN TRUE
ENDIF
BREAK
ENDSWITCH
// Not done yet pal
RETURN FALSE
ENDFUNC
#IF IS_DEBUG_BUILD
PROC CREATE_SHRINK_WIDGETS()
IF NOT DOES_WIDGET_GROUP_EXIST(widgetGroup)
widgetGroup = START_WIDGET_GROUP("Shrink Letter")
ADD_WIDGET_STRING("Letter Variables")
ADD_WIDGET_BOOL("Killed Michael", bKilledMichael)
ADD_WIDGET_BOOL("Killed Trevor", bKilledTrevor)
ADD_WIDGET_BOOL("Most Played - Franklin", bPlayedFranklin)
ADD_WIDGET_BOOL("Most Played - Michael", bPlayedMichael)
ADD_WIDGET_BOOL("Most Played - Trevor", bPlayedTrevor)
ADD_WIDGET_BOOL("Spent Money", bSpentCash)
ADD_WIDGET_BOOL("Strip Clubs", bStripClubs)
ADD_WIDGET_BOOL("Prostitutes", bProstitutes)
ADD_WIDGET_BOOL("Family", bMichaelFamily)
ADD_WIDGET_BOOL("Stockmarket", bStockMarket)
ADD_WIDGET_BOOL("Killed Peds", bKilledPeds)
ADD_WIDGET_BOOL("Stole Vehicles", bStoleVehicles)
ADD_WIDGET_BOOL("Yoga", bYoga)
ADD_WIDGET_BOOL("Fitness", bFitness)
ADD_WIDGET_BOOL("Random Characters", bRandomChar)
ADD_WIDGET_BOOL("Collectables", bCollectables)
ADD_WIDGET_STRING("Create Content")
ADD_WIDGET_BOOL("Use Debug Settings", bUseDebug)
ADD_WIDGET_BOOL("Use Scaleform", bUseScaleform)
ADD_WIDGET_BOOL("Generate Letter", bGenerateLetter)
STOP_WIDGET_GROUP()
ENDIF
ENDPROC
PROC UPDATE_SHRINK_WIDGETS()
IF bGenerateLetter
IF bUseScaleform
// Create letter
CPRINTLN(DEBUG_MISSION, "Shrink Letter: Generating scaleform...")
eLetterStage = SS_INIT
ELSE
// Output TTY
CPRINTLN(DEBUG_MISSION, "Shrink Letter: Generating TTY...")
TEXT_LABEL_15 str
str = GET_SHRINK_INTRO(sUploadData) CPRINTLN(DEBUG_MISSION, GET_STRING_FROM_TEXT_FILE(str))
str = GET_SHRINK_STORY_CHOICE(sUploadData) CPRINTLN(DEBUG_MISSION, GET_STRING_FROM_TEXT_FILE(str))
str = GET_SHRINK_MOST_PLAYED_CHAR(sUploadData) CPRINTLN(DEBUG_MISSION, GET_STRING_FROM_TEXT_FILE(str))
str = GET_SHRINK_MONEY_SPENT(sUploadData) CPRINTLN(DEBUG_MISSION, GET_STRING_FROM_TEXT_FILE(str))
str = GET_SHRINK_VISITED_STRIP_CLUBS(sUploadData) CPRINTLN(DEBUG_MISSION, GET_STRING_FROM_TEXT_FILE(str))
str = GET_SHRINK_USED_PROSTITUTES(sUploadData) CPRINTLN(DEBUG_MISSION, GET_STRING_FROM_TEXT_FILE(str))
str = GET_SHRINK_FAMILY_ATTENTION(sUploadData) CPRINTLN(DEBUG_MISSION, GET_STRING_FROM_TEXT_FILE(str))
str = GET_SHRINK_PLAYED_STOCKMARKET(sUploadData) CPRINTLN(DEBUG_MISSION, GET_STRING_FROM_TEXT_FILE(str))
str = GET_SHRINK_KILLED_PEDS(sUploadData) CPRINTLN(DEBUG_MISSION, GET_STRING_FROM_TEXT_FILE(str))
str = GET_SHRINK_STOLE_VEHICLES(sUploadData) CPRINTLN(DEBUG_MISSION, GET_STRING_FROM_TEXT_FILE(str))
str = GET_SHRINK_PERFORMED_YOGA(sUploadData) CPRINTLN(DEBUG_MISSION, GET_STRING_FROM_TEXT_FILE(str))
str = GET_SHRINK_FITNESS(sUploadData) CPRINTLN(DEBUG_MISSION, GET_STRING_FROM_TEXT_FILE(str))
str = GET_SHRINK_RANDOM_CHARS(sUploadData) CPRINTLN(DEBUG_MISSION, GET_STRING_FROM_TEXT_FILE(str))
str = GET_SHRINK_COLLECTABLES(sUploadData) CPRINTLN(DEBUG_MISSION, GET_STRING_FROM_TEXT_FILE(str))
str = GET_SHRINK_SUMMARY(sUploadData) CPRINTLN(DEBUG_MISSION, GET_STRING_FROM_TEXT_FILE(str))
ENDIF
// Reset widget flag
bGenerateLetter = FALSE
ENDIF
ENDPROC
PROC CLEANUP_SHRINK_WIDGETS()
IF DOES_WIDGET_GROUP_EXIST(widgetGroup)
DELETE_WIDGET_GROUP(widgetGroup)
ENDIF
ENDPROC
#ENDIF
PROC SCRIPT_CLEANUP()
CPRINTLN(DEBUG_MISSION, "Shrink Letter: Cleanup")
#IF IS_DEBUG_BUILD
CLEANUP_SHRINK_WIDGETS()
#ENDIF
IF IS_SCREEN_FADED_OUT()
DO_SCREEN_FADE_IN(0)
ENDIF
TERMINATE_THIS_THREAD()
ENDPROC
#IF IS_DEBUG_BUILD
PROC CHECK_DEBUG_KEYS()
IF (IS_KEYBOARD_KEY_JUST_PRESSED(KEY_S))
OR (IS_KEYBOARD_KEY_JUST_PRESSED(KEY_F))
OR (IS_KEYBOARD_KEY_JUST_PRESSED(KEY_J))
OR (IS_KEYBOARD_KEY_JUST_PRESSED(KEY_P))
SCRIPT_CLEANUP()
ENDIF
ENDPROC
#ENDIF
/// PURPOSE:
/// Disables access to pause menu and hides HUD elements whilst shrink letter is onscreen
PROC HIDE_UI_AND_DISABLE_CONTROLS_FOR_LETTER()
DISABLE_CONTROL_ACTION(FRONTEND_CONTROL, INPUT_FRONTEND_PAUSE)
HIDE_HUD_COMPONENT_THIS_FRAME(NEW_HUD_AREA_NAME)
HIDE_HUD_COMPONENT_THIS_FRAME(NEW_HUD_AREA_NAME)
HIDE_HUD_COMPONENT_THIS_FRAME(NEW_HUD_VEHICLE_NAME)
HIDE_HUD_COMPONENT_THIS_FRAME(NEW_HUD_DISTRICT_NAME)
HIDE_HUD_COMPONENT_THIS_FRAME(NEW_HUD_STREET_NAME)
DISABLE_CELLPHONE_THIS_FRAME_ONLY()
ENDPROC
SCRIPT
CPRINTLN(DEBUG_MISSION, "Shrink Letter: Init")
IF HAS_FORCE_CLEANUP_OCCURRED(FORCE_CLEANUP_FLAG_DEBUG_MENU|FORCE_CLEANUP_FLAG_SP_TO_MP)
CPRINTLN(DEBUG_MISSION, "Shrink Letter: Force Clenaup")
SCRIPT_CLEANUP()
ENDIF
#IF IS_DEBUG_BUILD
CREATE_SHRINK_WIDGETS()
#ENDIF
// Load shrink report text
REQUEST_ADDITIONAL_TEXT("REPORT", MISSION_TEXT_SLOT)
WHILE NOT HAS_ADDITIONAL_TEXT_LOADED(MISSION_TEXT_SLOT)
WAIT(0)
ENDWHILE
WHILE (TRUE)
#IF IS_DEBUG_BUILD
UPDATE_SHRINK_WIDGETS()
CHECK_DEBUG_KEYS()
#ENDIF
SWITCH eLetterStage
CASE SS_SETUP
// Dummy state where player can update the debug widget
BREAK
CASE SS_INIT
// Prepare for letter
SET_SCRIPTS_SAFE_FOR_CUTSCENE(TRUE)
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
DISPLAY_RADAR(FALSE)
DISPLAY_HUD(FALSE)
// Load shrink letter
siLetter = REQUEST_SCALEFORM_MOVIE("PSYCHOLOGY_REPORT")
WHILE (NOT HAS_SCALEFORM_MOVIE_LOADED(siLetter))
HIDE_UI_AND_DISABLE_CONTROLS_FOR_LETTER()
WAIT(0)
ENDWHILE
// Load shrink report text
REQUEST_ADDITIONAL_TEXT("REPORT", MINIGAME_TEXT_SLOT)
WHILE NOT HAS_ADDITIONAL_TEXT_LOADED(MINIGAME_TEXT_SLOT)
HIDE_UI_AND_DISABLE_CONTROLS_FOR_LETTER()
WAIT(0)
ENDWHILE
// Add gamertag
BEGIN_SCALEFORM_MOVIE_METHOD(siLetter, "SET_PLAYER_NAME")
// B*2023149 - seperate "patient:" from gamertag
BEGIN_TEXT_COMMAND_SCALEFORM_STRING("STRING")
ADD_TEXT_COMPONENT_SUBSTRING_TEXT_LABEL("PATIENT")
CPRINTLN(DEBUG_MISSION, "Shrink Letter: set PATIENT string ")
END_TEXT_COMMAND_SCALEFORM_STRING()
// insert the gamertag
BEGIN_TEXT_COMMAND_SCALEFORM_STRING("GAMERTAG")
IF NETWORK_IS_SIGNED_IN()
ADD_TEXT_COMPONENT_SUBSTRING_PLAYER_NAME(GET_PLAYER_NAME(PLAYER_ID()))
CPRINTLN(DEBUG_MISSION, "Shrink Letter: set GAMERTAG string using player gamertag")
ELSE
ADD_TEXT_COMPONENT_SUBSTRING_TEXT_LABEL("ACCNA_MIKE")
CPRINTLN(DEBUG_MISSION, "Shrink Letter: set GAMERTAG string using ACCNA_MIKE for player name - not signed in")
ENDIF
END_TEXT_COMMAND_SCALEFORM_STRING()
END_SCALEFORM_MOVIE_METHOD()
// Holds individual line of shrink letter
TEXT_LABEL_15 str
// Build shrink letter
BEGIN_SCALEFORM_MOVIE_METHOD(siLetter, "SET_LETTER_TEXT")
// From the office of Dr Isiah Friedlander...
SCALEFORM_MOVIE_METHOD_ADD_PARAM_STRING("HEADER_1")
SCALEFORM_MOVIE_METHOD_ADD_PARAM_STRING("HEADER_2")
str = GET_SHRINK_INTRO(sUploadData) SCALEFORM_MOVIE_METHOD_ADD_PARAM_STRING(str)
str = GET_SHRINK_STORY_CHOICE(sUploadData) SCALEFORM_MOVIE_METHOD_ADD_PARAM_STRING(str)
str = GET_SHRINK_MOST_PLAYED_CHAR(sUploadData) SCALEFORM_MOVIE_METHOD_ADD_PARAM_STRING(str)
str = GET_SHRINK_MONEY_SPENT(sUploadData) SCALEFORM_MOVIE_METHOD_ADD_PARAM_STRING(str)
str = GET_SHRINK_VISITED_STRIP_CLUBS(sUploadData) SCALEFORM_MOVIE_METHOD_ADD_PARAM_STRING(str)
str = GET_SHRINK_USED_PROSTITUTES(sUploadData) SCALEFORM_MOVIE_METHOD_ADD_PARAM_STRING(str)
str = GET_SHRINK_FAMILY_ATTENTION(sUploadData) SCALEFORM_MOVIE_METHOD_ADD_PARAM_STRING(str)
str = GET_SHRINK_PLAYED_STOCKMARKET(sUploadData) SCALEFORM_MOVIE_METHOD_ADD_PARAM_STRING(str)
str = GET_SHRINK_KILLED_PEDS(sUploadData) SCALEFORM_MOVIE_METHOD_ADD_PARAM_STRING(str)
str = GET_SHRINK_STOLE_VEHICLES(sUploadData) SCALEFORM_MOVIE_METHOD_ADD_PARAM_STRING(str)
str = GET_SHRINK_PERFORMED_YOGA(sUploadData) SCALEFORM_MOVIE_METHOD_ADD_PARAM_STRING(str)
str = GET_SHRINK_FITNESS(sUploadData) SCALEFORM_MOVIE_METHOD_ADD_PARAM_STRING(str)
str = GET_SHRINK_RANDOM_CHARS(sUploadData) SCALEFORM_MOVIE_METHOD_ADD_PARAM_STRING(str)
str = GET_SHRINK_COLLECTABLES(sUploadData) SCALEFORM_MOVIE_METHOD_ADD_PARAM_STRING(str)
str = GET_SHRINK_SUMMARY(sUploadData) SCALEFORM_MOVIE_METHOD_ADD_PARAM_STRING(str)
END_SCALEFORM_MOVIE_METHOD()
// Upload data to the cloud!
WHILE NOT SAVE_OUT_PSYCH_DATA(iCloudLoadStage, bCloudSuccess, sUploadData)
HIDE_UI_AND_DISABLE_CONTROLS_FOR_LETTER()
WAIT(0)
ENDWHILE
CLEANUP_SIMPLE_USE_CONTEXT(ucInstructions)
INIT_SIMPLE_USE_CONTEXT(ucInstructions, FALSE, FALSE, FALSE, TRUE)
ADD_SIMPLE_USE_CONTEXT_INPUT(ucInstructions, "CONTINUE", FRONTEND_CONTROL, INPUT_FRONTEND_ACCEPT)
SET_SIMPLE_USE_CONTEXT_FULLSCREEN(ucInstructions)
SET_SIMPLE_USE_CONTEXT_MINIGAME_ATTACHED(ucInstructions)
// Fade screen back in for letter
IF IS_SCREEN_FADED_OUT()
IF NOT IS_SCREEN_FADING_IN()
HIDE_UI_AND_DISABLE_CONTROLS_FOR_LETTER()
DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME)
ENDIF
WHILE NOT IS_SCREEN_FADED_IN()
HIDE_UI_AND_DISABLE_CONTROLS_FOR_LETTER()
SET_SCRIPT_GFX_DRAW_ORDER(GFX_ORDER_BEFORE_HUD)
DRAW_SCALEFORM_MOVIE_FULLSCREEN(siLetter, 255,255,255,255)
WAIT(0)
ENDWHILE
ENDIF
// Prevent flicker
HIDE_UI_AND_DISABLE_CONTROLS_FOR_LETTER()
SET_SCRIPT_GFX_DRAW_ORDER(GFX_ORDER_BEFORE_HUD)
DRAW_SCALEFORM_MOVIE_FULLSCREEN(siLetter, 255,255,255,255)
eLetterStage = SS_UPDATE
BREAK
CASE SS_UPDATE
// Render shrink letter
SET_SCRIPT_GFX_DRAW_ORDER(GFX_ORDER_BEFORE_HUD)
DRAW_SCALEFORM_MOVIE_FULLSCREEN(siLetter, 255,255,255,255)
UPDATE_SIMPLE_USE_CONTEXT(ucInstructions)
// Wait for user input
IF IS_CONTROL_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_ACCEPT)
eLetterStage = SS_CLEANUP
ENDIF
BREAK
CASE SS_CLEANUP
// Remove continue button
CLEANUP_SIMPLE_USE_CONTEXT(ucInstructions)
// Fade back out
DO_SCREEN_FADE_OUT(3000)
WHILE IS_SCREEN_FADING_OUT()
DRAW_SCALEFORM_MOVIE_FULLSCREEN(siLetter, 255,255,255,255)
HIDE_UI_AND_DISABLE_CONTROLS_FOR_LETTER()
WAIT(0)
ENDWHILE
// Cleanup
SET_SCALEFORM_MOVIE_AS_NO_LONGER_NEEDED(siLetter)
// Restore control
SET_SCRIPTS_SAFE_FOR_CUTSCENE(FALSE)
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
DISPLAY_RADAR(TRUE)
DISPLAY_HUD(TRUE)
CPRINTLN(DEBUG_MISSION, "Shrink Letter: Cleanup")
SCRIPT_CLEANUP()
BREAK
ENDSWITCH
IF eLetterStage <> SS_SETUP
HIDE_UI_AND_DISABLE_CONTROLS_FOR_LETTER()
ENDIF
WAIT(0)
ENDWHILE
// Script should never reach here. Always terminate with cleanup function.
ENDSCRIPT