Files
gtav-src/script/dev_ng/singleplayer/include/public/cellphone_public.sch
T
2025-09-29 00:52:08 +02:00

8422 lines
344 KiB
XML
Executable File

USING "rage_builtins.sch"
USING "globals.sch"
USING "commands_audio.sch"
USING "commands_clock.sch"
USING "commands_entity.sch"
USING "commands_graphics.sch"
USING "cellphone_private.sch"
//Wiki-ed.
//Allows other scripts to check if the phone is on-screen. If you want to make sure the phone has finished moving up onscreen, set the BOOL parameter to TRUE
FUNC BOOL IS_PHONE_ONSCREEN (BOOL ShouldCheckForFullyMovedUp = FALSE)
IF ShouldCheckForFullyMovedUp = TRUE
IF (ENUM_TO_INT(g_Cellphone.PhoneDS)) > (ENUM_TO_INT(PDS_AWAY))
IF IS_BIT_SET (BitSet_CellphoneDisplay, g_BS_HAS_CELLPHONE_FULLY_MOVED_UP) //This bit is set by cellphone flashhand when phone has finished moving up.
RETURN TRUE
ELSE
RETURN FALSE
ENDIF
ELSE
RETURN FALSE
ENDIF
ELSE
#if USE_CLF_DLC
IF GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH ("cellphone_flashhandCLF")) > 0 //Phone may be moving offscreen after getting set to "away".
//Flashhand terminates only after it is fully offscreen.
RETURN TRUE
ENDIF
#endif
#if USE_NRM_DLC
IF GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH ("cellphone_flashhandNRM")) > 0 //Phone may be moving offscreen after getting set to "away".
RETURN TRUE
ENDIF
#endif
#if not USE_SP_DLC
IF GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH ("cellphone_flashhand")) > 0 //Phone may be moving offscreen after getting set to "away".
RETURN TRUE
ENDIF
#endif
IF (ENUM_TO_INT(g_Cellphone.PhoneDS)) > (ENUM_TO_INT(PDS_AWAY)) //Phone may be in TAKEOUT state.
RETURN TRUE
ELSE
RETURN FALSE
ENDIF
ENDIF
ENDFUNC
//Added to check if the script for cellphone_flashhand is running based on the active TU
FUNC BOOL IS_THE_SCRIPT_cellphone_flashhand_RUNNING()
#if USE_CLF_DLC
IF GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH ("cellphone_flashhandCLF")) > 0
RETURN TRUE
ENDIF
#endif
#if USE_NRM_DLC
IF GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH ("cellphone_flashhandNRM")) > 0
RETURN TRUE
ENDIF
#endif
#if not USE_SP_DLC
IF GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH ("cellphone_flashhand")) > 0
RETURN TRUE
ENDIF
#endif
RETURN FALSE
ENDFUNC
//DANGER - Only the Race Hud should use this! See Steve T. if you think you might need something similar. See bug 1033043
//This specifically checks for the AWAY state but does not wait on flashhand terminating before returning FALSE. If the phone is moving offscreen upon
//AWAY or DISABLED then we need to check its progress.
//If the phone has moved below the visible threshold, then it's safe to draw the race hud as the phone will not overlap it.
//Standard IS_PHONE_ONSCREEN commands may return true for longer as the phone's drawing script remains around a little to avoid
//the render target appearing blank or pink in certain situations.
FUNC BOOL IS_PHONE_ACTIVE_OR_OVERLAPPING_HUD_ITEMS()
IF (ENUM_TO_INT(g_Cellphone.PhoneDS)) > (ENUM_TO_INT(PDS_AWAY)) //Phone may be in TAKEOUT state.
RETURN TRUE
ELSE //Phone may be in process of being put away, so no longer active but we need to check position on screen to see if it's still above the visible threshold.
IF IS_THE_SCRIPT_cellphone_flashhand_RUNNING()
VECTOR TempPhonePosVec = <<0.0, -500.0, 0.0>> //Set Y component well below visible threshold initially.
GET_MOBILE_PHONE_POSITION (TempPhonePosVec)
IF g_Chosen_Ratio = DISPLAY_16_9
IF TempPhonePosVec.Y > -119.0
RETURN TRUE
ELSE
RETURN FALSE
ENDIF
ELSE //Must be 4_3
IF TempPhonePosVec.Y > -101.0
RETURN TRUE
ELSE
RETURN FALSE
ENDIF
ENDIF
ELSE //Phone not active, can't be overlapping either!
RETURN FALSE
//Seems pointless, but this fixes intellisense.
ENDIF
ENDIF
ENDFUNC
//This will return true if the phone is onscreen and in ringing state. If you want to make sure the phone has finished moving up onscreen before checking for the ringing state,
//set the passed BOOL parameter to TRUE
FUNC BOOL IS_PHONE_ONSCREEN_AND_RINGING (BOOL ShouldCheckForFullyMovedUp = FALSE)
IF ShouldCheckForFullyMovedUp = TRUE
IF (ENUM_TO_INT(g_Cellphone.PhoneDS)) > (ENUM_TO_INT(PDS_AWAY))
IF IS_BIT_SET (BitSet_CellphoneDisplay, g_BS_HAS_CELLPHONE_FULLY_MOVED_UP) //This bit is set by cellphone flashhand when phone has finished moving up.
IF g_InboundCallWaitAccRej = CALL_WAITING_TO_BE_ANSWERED
RETURN TRUE
ELSE
RETURN FALSE
ENDIF
ELSE
RETURN FALSE
ENDIF
ELSE
RETURN FALSE
ENDIF
ELSE
#if USE_CLF_DLC
IF GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH ("cellphone_flashhandCLF")) > 0 //Phone may be moving offscreen after getting set to "away".
//Flashhand terminates only after it is fully offscreen.
IF g_InboundCallWaitAccRej = CALL_WAITING_TO_BE_ANSWERED
RETURN TRUE
ELSE
RETURN FALSE
ENDIF
ENDIF
#endif
#if USE_NRM_DLC
IF GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH ("cellphone_flashhandNRM")) > 0 //Phone may be moving offscreen after getting set to "away".
//Flashhand terminates only after it is fully offscreen.
IF g_InboundCallWaitAccRej = CALL_WAITING_TO_BE_ANSWERED
RETURN TRUE
ELSE
RETURN FALSE
ENDIF
ENDIF
#endif
#if not USE_SP_DLC
IF GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH ("cellphone_flashhand")) > 0 //Phone may be moving offscreen after getting set to "away".
//Flashhand terminates only after it is fully offscreen.
IF g_InboundCallWaitAccRej = CALL_WAITING_TO_BE_ANSWERED
RETURN TRUE
ELSE
RETURN FALSE
ENDIF
ENDIF
#endif
IF (ENUM_TO_INT(g_Cellphone.PhoneDS)) > (ENUM_TO_INT(PDS_AWAY)) //Phone may be in TAKEOUT state.
IF g_InboundCallWaitAccRej = CALL_WAITING_TO_BE_ANSWERED
RETURN TRUE
ELSE
RETURN FALSE
ENDIF
ELSE
RETURN FALSE
ENDIF
ENDIF
ENDFUNC
//If the cellphone was in use and the player receives an injury or starts ragdolling then, in SP only, the phone is flagged as forced away specifically.
//The global is reset the next time the cellphone is launched to screen.
FUNC BOOL HAS_CELLPHONE_JUST_BEEN_FORCED_AWAY()
IF g_B_ForcedAway
RETURN TRUE
ELSE
RETURN FALSE
ENDIF
ENDFUNC
//Wiki-ed.
//This simulates pressing up on the d-pad to launch the phone. Cellphone_controller checks for this bit set and will launch the phone if it's not disabled.
PROC LAUNCH_CELLPHONE_FROM_CONTROLLER_SCRIPT()
SET_BIT (BitSet_CellphoneDisplay, g_BS_LAUNCH_PHONE_TO_HOMESCREEN)
ENDPROC
FUNC BOOL CHECK_AIMING_FIRING_RAGDOLL_STATE_FOR_DPAD_TAKEOUT()
//We may need to remove this check for multiplayer...
IF IS_PLAYER_PLAYING (PLAYER_ID())
/*Removing again... IS_AIM_CAM_ACTIVE seems to be returning TRUE when going into cover. See 2168736. Also look at 2032679 in cellphone_controller.
IF IS_AIM_CAM_ACTIVE() //Fix for 2155944.
#if IS_DEBUG_BUILD
cdPrintstring ("CELLPHONE_PUB - Can't take out phone via dpad as IS_AIM_CAM_ACTIVE is returning TRUE - 2155944")
cdPrintnl ()
#endif
RETURN TRUE
ENDIF
*/
//IF GET_PED_CONFIG_FLAG(PLAYER_PED_ID(), INT_TO_ENUM(PED_CONFIG_FLAGS, 78)) //Replace this int_to_enum with proper ENUM when Graeme put it in.
IF GET_PED_CONFIG_FLAG(PLAYER_PED_ID(), PCF_IsAimingGun)
OR IS_PED_RAGDOLL(PLAYER_PED_ID())
OR IS_PED_BEING_STUNNED (PLAYER_PED_ID())
OR IS_PED_IN_PARACHUTE_FREE_FALL (PLAYER_PED_ID())
OR GET_PED_PARACHUTE_STATE(PLAYER_PED_ID()) = PPS_DEPLOYING
//OR GET_PED_PARACHUTE_STATE(PLAYER_PED_ID()) = PPS_PARACHUTING
//Legacy
//IF (IS_PLAYER_TARGETTING_ANYTHING(PLAYER_ID())
//OR IS_PED_SHOOTING(PLAYER_PED_ID())) //Has a window of opportunity... not constant, so we need a replacement.
//OR IS_PLAYER_FREE_AIMING(PLAYER_ID())
#if IS_DEBUG_BUILD
cdPrintstring ("CELLPHONE_PUB - Can't take out phone via dpad. Player aiming, targetting, firing, freefalling, parachuting or ragdolling")
cdPrintnl ()
#endif
RETURN TRUE
ELSE
RETURN FALSE
ENDIF
ELSE
#if IS_DEBUG_BUILD
cdPrintstring ("CELLPHONE_PUB - Can't take out phone via dpad. Player not playing according to aim and fire or ragdoll check.")
cdPrintnl ()
#endif
RETURN TRUE
ENDIF
ENDFUNC
FUNC BOOL CHECK_AIMING_FIRING_STATE_FOR_CALL_LAUNCH()
IF g_bInMultiplayer
BOOL sniper_equipped = FALSE
WEAPON_TYPE TempWeapon
GET_CURRENT_PED_WEAPON(PLAYER_PED_ID(), TempWeapon)
IF IS_PLAYER_PLAYING (PLAYER_ID())
IF TempWeapon = WEAPONTYPE_SNIPERRIFLE
OR TempWeapon = WEAPONTYPE_HEAVYSNIPER
OR TempWeapon = WEAPONTYPE_REMOTESNIPER
sniper_equipped = TRUE
ENDIF
ENDIF
//Less checks for multiplayer, but we still don't want calls to come through when sniper scope is on.
IF IS_AIM_CAM_ACTIVE()
AND sniper_equipped = TRUE
#if IS_DEBUG_BUILD
cdPrintstring ("CELLPHONE_PUB - Can't launch phone for mp call. Player aiming in sniper mode.")
cdPrintnl ()
#endif
RETURN TRUE
ELSE
RETURN FALSE
ENDIF
ELSE
IF IS_PLAYER_PLAYING (PLAYER_ID())
//IF GET_PED_CONFIG_FLAG(PLAYER_PED_ID(), INT_TO_ENUM(PED_CONFIG_FLAGS, 78)) //Replace this int_to_enum with proper ENUM when Graeme put it in.
IF GET_PED_CONFIG_FLAG(PLAYER_PED_ID(), PCF_IsAimingGun)
//PCF_IsAimingGun
//Legacy
//IF (IS_PLAYER_TARGETTING_ANYTHING(PLAYER_ID())
//OR IS_PED_SHOOTING(PLAYER_PED_ID())) //Has a window of opportunity... not constant, so we need a replacement.
//OR IS_PLAYER_FREE_AIMING(PLAYER_ID())
#if IS_DEBUG_BUILD
cdPrintstring ("CELLPHONE_PUB - Can't launch phone for call. Player aiming, targetting or firing.")
cdPrintnl ()
#endif
RETURN TRUE
//Quick Fix
//RETURN FALSE
ELSE
RETURN FALSE
ENDIF
ELSE
#if IS_DEBUG_BUILD
cdPrintstring ("CELLPHONE_PUB - Can't launch phone for call. Player not playing according to aim and fire check.")
cdPrintnl ()
#endif
RETURN TRUE
ENDIF
ENDIF
ENDFUNC
//Wiki-ed.
//This will launch a cellphone application directly from the phone's away position. Primarily useful for cutscenes or to force an app in hand, it's best not to alter the default
//behaviour of the last two parameters. See Steve T if you have any questions - he uses these for specific cases but they are powerful in a phone context.
FUNC BOOL LAUNCH_CELLPHONE_APPLICATION (enumApplicationList AppEnum, BOOL LoadScaleformMovies = TRUE, BOOL OverrideOnscreenCheck = FALSE, BOOL UseContactStackSize = FALSE)
IF g_bInMultiplayer
//2139576
//Make exceptions to normal behaviour for MP launching of Trackify and Snapmatic. Would need further exceptions for any app launched from an MP script rather than the phone itself.
IF AppEnum <> AppTRACKIFY
AND AppEnum <> AppCAMERA
AND AppEnum <> AppDummyApp0
AND AppEnum <> AppTEXTS
#if IS_DEBUG_BUILD
SCRIPT_ASSERT ("Weird MP LAUNCH_CELLPHONE_APPLICATION detected!")
cdPrintnl()
cdPrintstring ("CELLPHONE_PUB - MP LAUNCH_CELLPHONE_APPLICATION... Weird MP LAUNCH_CELLPHONE_APPLICATION detected! AppEnum is ")
cdPrintint (ENUM_TO_INT(AppENum))
cdPrintnl()
#endif
RETURN FALSE
ENDIF
IF NOT IS_BIT_SET (BitSet_CellphoneTU, g_BSTU_SET_CELLPHONE_CONTROLLER_LAUNCH)
IF AppEnum = AppTRACKIFY
#if IS_DEBUG_BUILD
cdPrintnl()
cdPrintstring ("CELLPHONE_PUB - MP LAUNCH_CELLPHONE_APPLICATION... Setting AppTrackify MP launch bits.")
cdPrintnl()
#endif
SET_BIT (BitSet_CellphoneTU, g_BSTU_SET_CELLPHONE_CONTROLLER_LAUNCH)
SET_BIT (BitSet_CellphoneTU, g_BSTU_LAUNCH_CELLPHONE_MP_APPTRACKIFY)
ENDIF
IF AppEnum = AppCAMERA
#if IS_DEBUG_BUILD
cdPrintnl()
cdPrintstring ("CELLPHONE_PUB - MP LAUNCH_CELLPHONE_APPLICATION... Setting AppCamera MP launch bits.")
cdPrintnl()
#endif
SET_BIT (BitSet_CellphoneTU, g_BSTU_SET_CELLPHONE_CONTROLLER_LAUNCH)
SET_BIT (BitSet_CellphoneTU, g_BSTU_LAUNCH_CELLPHONE_MP_APPCAMERA)
ENDIF
IF AppEnum = AppDummyApp0
#if IS_DEBUG_BUILD
cdPrintnl()
cdPrintstring ("CELLPHONE_PUB - MP LAUNCH_CELLPHONE_APPLICATION... Setting AppDummyApp0 MP launch bits.")
cdPrintnl()
#endif
SET_BIT (BitSet_CellphoneTU, g_BSTU_SET_CELLPHONE_CONTROLLER_LAUNCH)
SET_BIT (BitSet_CellphoneTU, g_BSTU_LAUNCH_CELLPHONE_MP_APPDUMMYAPP0)
ENDIF
IF AppEnum = AppTEXTS
#if IS_DEBUG_BUILD
cdPrintnl()
cdPrintstring ("CELLPHONE_PUB - MP LAUNCH_CELLPHONE_APPLICATION... Setting AppTEXTS MP launch bits.")
cdPrintnl()
#endif
SET_BIT (BitSet_CellphoneTU, g_BSTU_SET_CELLPHONE_CONTROLLER_LAUNCH)
SET_BIT (BitSet_CellphoneTU, g_BSTU_LAUNCH_CELLPHONE_MP_APPTEXTS)
ENDIF
ENDIF
IF g_AppList[AppEnum].AppScriptNameHash = 0
Fill_All_Primary_App_Sheets() //Need to do this or else the AppScriptNameHash can be 0
ENDIF
IF GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(g_AppList[AppEnum].AppScriptNameHash) > 0
CLEAR_BIT (BitSet_CellphoneTU, g_BSTU_SET_CELLPHONE_CONTROLLER_LAUNCH)
CLEAR_BIT (BitSet_CellphoneTU, g_BSTU_LAUNCH_CELLPHONE_MP_APPTRACKIFY)
CLEAR_BIT (BitSet_CellphoneTU, g_BSTU_LAUNCH_CELLPHONE_MP_APPCAMERA)
CLEAR_BIT (BitSet_CellphoneTU, g_BSTU_LAUNCH_CELLPHONE_MP_APPDUMMYAPP0)
CLEAR_BIT (BitSet_CellphoneTU, g_BSTU_LAUNCH_CELLPHONE_MP_APPTEXTS)
#if IS_DEBUG_BUILD
cdPrintnl()
cdPrintstring ("CELLPHONE_PUB - MP LAUNCH_CELLPHONE_APPLICATION... Success or script already running. Returned TRUE and cleared MP launch bits.")
cdPrintnl()
#endif
RETURN TRUE
ELSE
RETURN FALSE
ENDIF
ELSE
Get_Cellphone_Owner()
/* Allowing non-conversation phone use in water now...
IF IS_PLAYER_PLAYING (PLAYER_ID())
IF NOT g_bInMultiplayer //multiplayer allows phone use in water...
IF NOT (g_Cellphone.PhoneOwner = CHAR_FRANKLIN) //i.e Michael or Trevor
AND IS_ENTITY_IN_WATER (PLAYER_PED_ID()) //and they are in the water
#if IS_DEBUG_BUILD
cdPrintstring ("CELLPHONE_PUB - Can't launch_cellphone_application current player character does not have waterproof phone.")
cdPrintnl ()
#endif
RETURN FALSE
ENDIF
ENDIF
ENDIF
*/
IF g_Cellphone.PhoneDS = PDS_ONGOING_CALL
#if IS_DEBUG_BUILD
cdPrintstring("CELLPHONE_PUB - Launch Cellphone Application called but phone in ONGOING_CALL state... can't launch application.")
cdPrintnl()
#endif
RETURN FALSE
ENDIF
IF OverrideOnscreenCheck = FALSE
IF IS_PHONE_ONSCREEN() = TRUE //could also check for PDS_RUNNINGAPP if I need to check for another app running.
#if IS_DEBUG_BUILD
cdPrintstring("CELLPHONE_PUB - The phone is already onscreen.. can't launch application")
cdPrintnl()
#endif
RETURN FALSE
ENDIF
ENDIF
IF g_Phone_Blocked_While_Moving_Down = TRUE
#if IS_DEBUG_BUILD
cdPrintstring("CELLPHONE_PUB - Phone currently moving down screen, can't launch application")
cdPrintnl()
#endif
RETURN FALSE
ENDIF
IF g_Cellphone.PhoneDS = PDS_RUNNINGAPP
#if IS_DEBUG_BUILD
cdPrintstring("CELLPHONE_PUB - Onscreen check overridden but an app is already running.. can't launch application")
cdPrintnl()
#endif
RETURN FALSE
ENDIF
IF LoadScaleformMovies = TRUE
#if IS_DEBUG_BUILD
cdPrintstring("CELLPHONE_PUB - Launch cellphone application received a request to load movies but these should have been loaded by flashhand")
cdPrintnl()
#endif
/* Removed as part of ongoing scaleform streamlining work with Derek and Graeme - 11.05.2011
IF g_B_Scaleform_Movies_Loaded = FALSE
g_B_Scaleform_Movies_Loaded = TRUE
//Usually done when phone is "taken out" in cellphone_controller.sc
//SF_MovieIndex = REQUEST_SCALEFORM_MOVIE ("cellphone_b")
Get_Cellphone_Owner()
SF_MovieIndex = REQUEST_SCALEFORM_MOVIE (This_Cellphone_Owner_Settings[g_Cellphone.PhoneOwner].g_SettingList[ENUM_TO_INT(SETTING_THEME)].Setting_Secondary_Option_filename_label[This_Cellphone_Owner_Settings[g_Cellphone.PhoneOwner].g_SettingList[ENUM_TO_INT(SETTING_THEME)].Setting_Currently_Selected_Option])
SF_MovieButtonsIndex = REQUEST_SCALEFORM_MOVIE ("cellphone_buttons")
WHILE NOT HAS_SCALEFORM_MOVIE_LOADED (SF_MovieIndex)
OR NOT HAS_SCALEFORM_MOVIE_LOADED (SF_MovieButtonsIndex)
WAIT(0)
ENDWHILE
ENDIF
*/
ENDIF
IF NOT IS_THREAD_ACTIVE (Cellphone_FlashResponseThread) //#1570364
#if USE_CLF_DLC
IF GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH ("cellphone_flashhandCLF")) = 0 //Make sure flashhand can run only once if we do let this function
//run with the phone already onscreen in the future.
IF g_Cellphone.PhoneDS < PDS_TAKEOUT // #1570364
//Launch flashhandler to fill app slots and draw phone surround.
request_load_scriptstring ("cellphone_flashhandCLF")
Cellphone_FlashResponseThread = START_NEW_SCRIPT ("cellphone_flashhandCLF", DEFAULT_STACK_SIZE)
SET_SCRIPT_AS_NO_LONGER_NEEDED ("cellphone_flashhandCLF")
ENDIF
ENDIF
#endif
#if USE_NRM_DLC
IF GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH ("cellphone_flashhandNRM")) = 0 //Make sure flashhand can run only once if we do let this function
//run with the phone already onscreen in the future.
IF g_Cellphone.PhoneDS < PDS_TAKEOUT // #1570364
//Launch flashhandler to fill app slots and draw phone surround.
request_load_scriptstring ("cellphone_flashhandNRM")
Cellphone_FlashResponseThread = START_NEW_SCRIPT ("cellphone_flashhandNRM", DEFAULT_STACK_SIZE)
SET_SCRIPT_AS_NO_LONGER_NEEDED ("cellphone_flashhandNRM")
ENDIF
ENDIF
#endif
#if not USE_SP_DLC
IF GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH ("cellphone_flashhand")) = 0 //Make sure flashhand can run only once if we do let this function
//run with the phone already onscreen in the future.
IF g_Cellphone.PhoneDS < PDS_TAKEOUT // #1570364
//Launch flashhandler to fill app slots and draw phone surround.
request_load_scriptstring ("cellphone_flashhand")
IF GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("cellphone_flashhand")) = 0 //1943564 - Required to prevent rare double launch of cellphone_flashhand.
#if USE_TU_CHANGES
Cellphone_FlashResponseThread = START_NEW_SCRIPT ("cellphone_flashhand", DEFAULT_STACK_SIZE)
#endif
#if not USE_TU_CHANGES
Cellphone_FlashResponseThread = START_NEW_SCRIPT ("cellphone_flashhand", CELLPHONE_STACK_SIZE)
#endif
ENDIF
SET_SCRIPT_AS_NO_LONGER_NEEDED ("cellphone_flashhand")
ENDIF
ENDIF
#endif
ENDIF
//Important! There is a danger of subsequently launched app scripts calling movie methods whilst movies might not have loaded via flashhand's calls.
//This check is therefore required!
WHILE NOT g_B_Scaleform_Movies_Loaded //Make sure that the movies requested by cellphone_flashhand have loaded before continuing.
//This bool is set after Create_3dPhoneObject has been called from cellphone_flashhand.sc
WAIT (0)
ENDWHILE
Fill_All_Primary_App_Sheets() //From cellphone_private.sch - we must make sure that the application sheet is completely filled before running an app.
#IF USE_TU_CHANGES
//May impact LAUNCH_TRACKIFY_IMMEDIATELY...
TitleUpdate_Patch_In_JobList_For_SP_Phone()
#ENDIF
//Hashfix required.
IF GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(g_AppList[AppEnum].AppScriptNameHash) = 0 //This thread is not already running so we can safely launch it.
g_TerminateApp = FALSE //make sure that Check_Application_Exit() doesn't fire off accidentally.
//Hide_phone_for_hotswap check?
//IF (ENUM_TO_INT(g_Cellphone.PhoneDS)) < (ENUM_TO_INT(PDS_TAKEOUT))
//only create the phone if it is not already onscreen... might put check in the creation procedure itself.
//Create_3dPhoneObject() //from cellphone_private.sch //Phone should be created by cellphone_flashhand only now. Avoids multiple instances of phone assert.
//ENDIF
//This is a liitle bit dangerous. There's a risk of RUNNINGAPP getting assigned whilst the phone is moving away that needs addressed. Might get rid of onscreen check.
g_Cellphone.PhoneDS = PDS_RUNNINGAPP
#if IS_DEBUG_BUILD
cdPrintnl()
cdPrintstring("STATE ASSIGNMENT 7. Cellphone Public assigns PDS_RUNNINGAPP")
cdPrintnl()
#endif
//Would need to terminate all other running apps if we allow this Launcher to be done when the phone is onscreen....
request_load_scriptstring (g_AppList[AppEnum].AppScriptName)
IF UseContactStackSize
IF GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(g_AppList[AppEnum].AppScriptNameHash) = 0 //Dev_NG only fix for 2133806
Application_Thread = START_NEW_SCRIPT (g_AppList[AppEnum].AppScriptName, CONTACTS_APP_STACK_SIZE)
#if IS_DEBUG_BUILD
cdPrintstring("CELLPHONE_PUB - Launch cellphone application launching chosen script with contacts stack size")
cdPrintnl()
#endif
ENDIF
ELSE
IF GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(g_AppList[AppEnum].AppScriptNameHash) = 0 //Dev_NG only fix for 2133806
Application_Thread = START_NEW_SCRIPT (g_AppList[AppEnum].AppScriptName, CELLPHONE_STACK_SIZE)
#if IS_DEBUG_BUILD
cdPrintstring("CELLPHONE_PUB - Launch cellphone application launching chosen script with cellphone stack size.")
cdPrintnl()
#endif
ENDIF
ENDIF
SET_SCRIPT_AS_NO_LONGER_NEEDED (g_AppList[AppEnum].AppScriptName)
RETURN TRUE
ELSE
#IF IS_DEBUG_BUILD
cdPrintstring("CELLPHONE_PUB - Launch Cellphone Application public function has requested a script that is already running.")
cdPrintnl()
#endif
RETURN TRUE
ENDIF
ENDIF //End of g_bInMultiplayer check.
ENDFUNC
//DO NOT USE THIS without asking Steve T first. It should be used by the Cellphone's internal scripts only.
FUNC BOOL CC_INTERNAL_LAUNCH_CELLPHONE_APPLICATION (enumApplicationList AppEnum, BOOL LoadScaleformMovies = TRUE, BOOL OverrideOnscreenCheck = FALSE, BOOL UseContactStackSize = FALSE)
#if IS_DEBUG_BUILD
cdPrintstring("CELLPHONE_PUB - CC_INTERNAL_LAUNCH_Cellphone_Application called.")
cdPrintnl()
#endif
Get_Cellphone_Owner()
IF g_bInMultiplayer = FALSE
IF IS_CURRENTLY_ON_MISSION_OF_TYPE (MISSION_TYPE_DIRECTOR)
IF CellphoneAppAutoLaunchType = ACT_APP_INVITE // Search for "CELLPHONE_FH - Activatable INVITE App caused direct launch of app" to see where this launch request is made.
OR CellphoneAppAutoLaunchType = ACT_APP_BOSSINV
#if IS_DEBUG_BUILD
cdPrintstring("CELLPHONE_PUB - Internal Launch Cellphone Application called and in Director Mode but exception made for ACT_APP_INVITE or BOSSINV")
cdPrintnl()
#endif
ELSE
#if IS_DEBUG_BUILD
cdPrintstring("CELLPHONE_PUB - Internal Launch Cellphone Application called but currently in Director Mode... can't launch application.")
cdPrintnl()
#endif
RETURN FALSE
ENDIF
ENDIF
ENDIF
IF g_Cellphone.PhoneDS = PDS_ONGOING_CALL
#if IS_DEBUG_BUILD
cdPrintstring("CELLPHONE_PUB - Launch Cellphone Application called but phone in ONGOING_CALL state... can't launch application.")
cdPrintnl()
#endif
RETURN FALSE
ENDIF
IF OverrideOnscreenCheck = FALSE
IF IS_PHONE_ONSCREEN() = TRUE //could also check for PDS_RUNNINGAPP if I need to check for another app running.
#if IS_DEBUG_BUILD
cdPrintstring("CELLPHONE_PUB - The phone is already onscreen.. can't launch application")
cdPrintnl()
#endif
RETURN FALSE
ENDIF
ENDIF
IF g_Phone_Blocked_While_Moving_Down = TRUE
#if IS_DEBUG_BUILD
cdPrintstring("CELLPHONE_PUB - Phone currently moving down screen, can't launch application")
cdPrintnl()
#endif
RETURN FALSE
ENDIF
IF g_Cellphone.PhoneDS = PDS_RUNNINGAPP
#if IS_DEBUG_BUILD
cdPrintstring("CELLPHONE_PUB - Onscreen check overridden but an app is already running.. can't launch application")
cdPrintnl()
#endif
RETURN FALSE
ENDIF
IF LoadScaleformMovies = TRUE
#if IS_DEBUG_BUILD
cdPrintstring("CELLPHONE_PUB - Launch cellphone application received a request to load movies but these should have been loaded by flashhand")
cdPrintnl()
#endif
/* Removed as part of ongoing scaleform streamlining work with Derek and Graeme - 11.05.2011
IF g_B_Scaleform_Movies_Loaded = FALSE
g_B_Scaleform_Movies_Loaded = TRUE
//Usually done when phone is "taken out" in cellphone_controller.sc
//SF_MovieIndex = REQUEST_SCALEFORM_MOVIE ("cellphone_b")
Get_Cellphone_Owner()
SF_MovieIndex = REQUEST_SCALEFORM_MOVIE (This_Cellphone_Owner_Settings[g_Cellphone.PhoneOwner].g_SettingList[ENUM_TO_INT(SETTING_THEME)].Setting_Secondary_Option_filename_label[This_Cellphone_Owner_Settings[g_Cellphone.PhoneOwner].g_SettingList[ENUM_TO_INT(SETTING_THEME)].Setting_Currently_Selected_Option])
SF_MovieButtonsIndex = REQUEST_SCALEFORM_MOVIE ("cellphone_buttons")
WHILE NOT HAS_SCALEFORM_MOVIE_LOADED (SF_MovieIndex)
OR NOT HAS_SCALEFORM_MOVIE_LOADED (SF_MovieButtonsIndex)
WAIT(0)
ENDWHILE
ENDIF
*/
ENDIF
IF NOT IS_THREAD_ACTIVE (Cellphone_FlashResponseThread) //#1570364
#if USE_CLF_DLC
IF GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH ("cellphone_flashhandCLF")) = 0 //Make sure flashhand can run only once if we do let this function
//run with the phone already onscreen in the future.
IF g_Cellphone.PhoneDS < PDS_TAKEOUT // #1570364
//Launch flashhandler to fill app slots and draw phone surround.
request_load_scriptstring ("cellphone_flashhandCLF")
IF GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH ("cellphone_flashhandCLF")) = 0
Cellphone_FlashResponseThread = START_NEW_SCRIPT ("cellphone_flashhandCLF", DEFAULT_STACK_SIZE)
ENDIF
SET_SCRIPT_AS_NO_LONGER_NEEDED ("cellphone_flashhandCLF")
ENDIF
ENDIF
#endif
#if USE_NRM_DLC
IF GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH ("cellphone_flashhandNRM")) = 0 //Make sure flashhand can run only once if we do let this function
//run with the phone already onscreen in the future.
IF g_Cellphone.PhoneDS < PDS_TAKEOUT // #1570364
//Launch flashhandler to fill app slots and draw phone surround.
request_load_scriptstring ("cellphone_flashhandNRM")
IF GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH ("cellphone_flashhandNRM")) = 0 //1943564 - Required to prevent rare double launch of cellphone_flashhand.
Cellphone_FlashResponseThread = START_NEW_SCRIPT ("cellphone_flashhandNRM", DEFAULT_STACK_SIZE)
ENDIF
SET_SCRIPT_AS_NO_LONGER_NEEDED ("cellphone_flashhandNRM")
ENDIF
ENDIF
#endif
#if not USE_SP_DLC
IF GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH ("cellphone_flashhand")) = 0 //Make sure flashhand can run only once if we do let this function
//run with the phone already onscreen in the future.
IF g_Cellphone.PhoneDS < PDS_TAKEOUT // #1570364
//Launch flashhandler to fill app slots and draw phone surround.
request_load_scriptstring ("cellphone_flashhand")
IF GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("cellphone_flashhand")) = 0 //1943564 - Required to prevent rare double launch of cellphone_flashhand.
#if USE_TU_CHANGES
Cellphone_FlashResponseThread = START_NEW_SCRIPT ("cellphone_flashhand", DEFAULT_STACK_SIZE)
#endif
#if not USE_TU_CHANGES
Cellphone_FlashResponseThread = START_NEW_SCRIPT ("cellphone_flashhand", CELLPHONE_STACK_SIZE)
#endif
ENDIF
SET_SCRIPT_AS_NO_LONGER_NEEDED ("cellphone_flashhand")
ENDIF
ENDIF
#endif
ENDIF
//Important! There is a danger of subsequently launched app scripts calling movie methods whilst movies might not have loaded via flashhand's calls.
//This check is therefore required!
WHILE NOT g_B_Scaleform_Movies_Loaded //Make sure that the movies requested by cellphone_flashhand have loaded before continuing.
//This bool is set after Create_3dPhoneObject has been called from cellphone_flashhand.sc
WAIT (0)
ENDWHILE
Fill_All_Primary_App_Sheets() //From cellphone_private.sch - we must make sure that the application sheet is completely filled before running an app.
#IF USE_TU_CHANGES
//May impact LAUNCH_TRACKIFY_IMMEDIATELY...
TitleUpdate_Patch_In_JobList_For_SP_Phone()
#ENDIF
//Hashfix required.
IF GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(g_AppList[AppEnum].AppScriptNameHash) = 0 //This thread is not already running so we can safely launch it.
g_TerminateApp = FALSE //make sure that Check_Application_Exit() doesn't fire off accidentally.
//Hide_phone_for_hotswap check?
//IF (ENUM_TO_INT(g_Cellphone.PhoneDS)) < (ENUM_TO_INT(PDS_TAKEOUT))
//only create the phone if it is not already onscreen... might put check in the creation procedure itself.
//Create_3dPhoneObject() //from cellphone_private.sch //Phone should be created by cellphone_flashhand only now. Avoids multiple instances of phone assert.
//ENDIF
//This is a liitle bit dangerous. There's a risk of RUNNINGAPP getting assigned whilst the phone is moving away that needs addressed. Might get rid of onscreen check.
g_Cellphone.PhoneDS = PDS_RUNNINGAPP
#if IS_DEBUG_BUILD
cdPrintnl()
cdPrintstring("STATE ASSIGNMENT 7. Cellphone Public assigns PDS_RUNNINGAPP")
cdPrintnl()
#endif
//Would need to terminate all other running apps if we allow this Launcher to be done when the phone is onscreen....
request_load_scriptstring (g_AppList[AppEnum].AppScriptName)
IF UseContactStackSize
IF GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(g_AppList[AppEnum].AppScriptNameHash) = 0
Application_Thread = START_NEW_SCRIPT (g_AppList[AppEnum].AppScriptName, CONTACTS_APP_STACK_SIZE)
#if IS_DEBUG_BUILD
cdPrintstring("CELLPHONE_PUB - Launch cellphone application launching chosen script with contacts stack size")
cdPrintnl()
#endif
ENDIF
ELSE
IF GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(g_AppList[AppEnum].AppScriptNameHash) = 0
Application_Thread = START_NEW_SCRIPT (g_AppList[AppEnum].AppScriptName, CELLPHONE_STACK_SIZE)
#if IS_DEBUG_BUILD
cdPrintstring("CELLPHONE_PUB - Launch cellphone application launching chosen script with cellphone stack size.")
cdPrintnl()
#endif
ENDIF
ENDIF
SET_SCRIPT_AS_NO_LONGER_NEEDED (g_AppList[AppEnum].AppScriptName)
RETURN TRUE
ELSE
#IF IS_DEBUG_BUILD
cdPrintstring("CELLPHONE_PUB - Launch Cellphone Application public function has requested a script that is already running.")
cdPrintnl()
#endif
RETURN TRUE
ENDIF
ENDFUNC
//Wiki-ed.
//This should be used by App scripts to check exit routines from simple RUNNINGAPP states only. See Steve T about using this.
//It's not as simple as it looks, particulary if you have specific audio other than keytones and apps with secondary screens.
//This should be called by all apps in RUNNINGAPP state and checked for a return of TRUE. If it returns TRUE, then the app should call its local cleanup function.
//e.g IF CHECK_FOR_APPLICATION_EXIT()
// Local_Cleanup_and_Terminate()
// ENDIF
//If a script is not checking CHECK_APPLICATION_EXIT() it should have a failsafe that ensure the correct display state is selected and scaleform
//resets the display to the homescreen to avoid any timing issues. Pressing "Select" then "Back" in very quick succession for example.
FUNC BOOL CHECK_FOR_APPLICATION_EXIT()
//If the PHONE_GO_BACK_INPUT check is true in cellphone_flashhand.sc, that script will set g_TerminateApp to true IF the app is in PDS_RUNNINGAPP state only.
//Any app looping CHECK_FOR_APPLICATION_EXIT and checking the return value whilst in RUNNINGAPP state does not need to explicitly check for "back" keypresses.
//This will do it automatically.
//This means that an app can have a secondary screen and define itself as being in COMPLEXAPP state. When a "back" option button is pressed, which must be checked
//by the local script, the app can return to RUNNINGAPP state and its primary screen without fear of inadvertently exiting completely.
IF g_TerminateApp = TRUE
OR g_Cellphone.PhoneDS < PDS_RUNNINGAPP //Added for 910427
g_MainGui_RendertargetNeedsReset = TRUE //Tell cellphone_flashhand.sc that the rendertarget should be reinitialised as failsafe. The app may have altered it.
//Trial Inclusion Run 24.09.10 See CRITICAL: Running App to Homescreen transition on "Back" press in cellphone_flashhand.sc
//Trial failed. It's dangerous to let anything other than cellphone_flashhand.sc in the critical section do it.
/*
g_Cellphone.PhoneDS = PDS_MAXIMUM
Update_Scaleform_VSE ()
*/
RETURN TRUE
ELSE
RETURN FALSE
ENDIF
ENDFUNC
//Wiki-ed.
//If the phone is forced away ( player dies, hit by car etc.) or disabled, then it's important that any running app terminates correctly.
//This should be called by all apps and checked for a return of TRUE. If it returns TRUE, then the app should call its local cleanup function.
//e.g IF CHECK_FOR_ABNORMAL_EXIT()
// Local_Cleanup_and_Terminate()
// ENDIF
FUNC BOOL CHECK_FOR_ABNORMAL_EXIT()
IF g_Cellphone.PhoneDS = PDS_DISABLED
OR g_Cellphone.PhoneDS = PDS_AWAY
OR g_Cellphone.PhoneDS = PDS_DISABLED_THIS_FRAME_ONLY
OR g_Cellphone_FH_Needs_To_Exit = TRUE//Additional check for 295259. Looked like appTextMessage had altered the app state just as flashhand was aborting.
g_MainGui_RendertargetNeedsReset = TRUE //Tell cellphone_flashhand.sc that the rendertarget should be reinitialised as failsafe. The app may have altered it.
RETURN TRUE
ELSE
RETURN FALSE
ENDIF
ENDFUNC
//Wiki-ed
//This will let you know if the contacts list is currently being displayed on the cellphone.
FUNC BOOL IS_CELLPHONE_ON_HOME_SCREEN()
IF g_Cellphone.PhoneDS = PDS_MAXIMUM //phone in home screen display state.
RETURN TRUE
ELSE
RETURN FALSE
ENDIF
ENDFUNC
//Wiki-ed
//This will let you know if the contacts list is currently being displayed on the cellphone.
FUNC BOOL IS_CONTACTS_LIST_ON_SCREEN()
#if USE_CLF_DLC
IF GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH ("appContactsCLF")) > 0 //phone in contacts list state as script is running.
RETURN TRUE
ELSE
RETURN FALSE
ENDIF
#endif
#if USE_NRM_DLC
IF GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH ("appContactsNRM")) > 0 //phone in contacts list state as script is running.
RETURN TRUE
ELSE
RETURN FALSE
ENDIF
#endif
#if not USE_SP_DLC
IF GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH ("appContacts")) > 0 //phone in contacts list state as script is running.
RETURN TRUE
ELSE
RETURN FALSE
ENDIF
#endif
ENDFUNC
//Wiki-ed
//This will let you know if the text message list is currently being displayed on the cellphone.
FUNC BOOL IS_TEXT_MESSAGE_LIST_ON_SCREEN()
#if USE_CLF_DLC
IF GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH ("appTextMessCLF")) > 0 //phone in text_message list state as script is running.
RETURN TRUE
ELSE
RETURN FALSE
ENDIF
#endif
#if USE_NRM_DLC
IF GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH ("appTextMessNRM")) > 0 //phone in text_message list state as script is running.
RETURN TRUE
ELSE
RETURN FALSE
ENDIF
#endif
#if not USE_SP_DLC
IF GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH ("appTextMessage")) > 0 //phone in text_message list state as script is running.
RETURN TRUE
ELSE
RETURN FALSE
ENDIF
#endif
ENDFUNC
//Wiki-ed
//This will let you know if the cellphone camera application is currently running fullscreen
FUNC BOOL IS_CELLPHONE_CAMERA_IN_USE()
IF GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH ("appCamera")) > 0
RETURN TRUE
ELSE
RETURN FALSE
ENDIF
ENDFUNC
PROC REPOSITION_LANDSCAPE_PHONE_FOR_LONG_SUBTITLES (BOOL ShouldReposition)
IF ShouldReposition = TRUE
SET_BIT (BitSet_CellphoneDisplay_Third, g_BSTHIRD_REPOSITION_SUBS_FOR_LANDSCAPE_PHONE)
#if IS_DEBUG_BUILD
//Make sure this always displays regardless of phone debug text widget toggle.
PRINTLN("\nCELLPHONE_PUB - Landscape Cellphone Camera will allow LONG subtitles. Set by [", GET_THIS_SCRIPT_NAME(), "] through public function.")
cdPrintnl()
cdPrintstring ("CELLPHONE_PUB - Landscape Cellphone Camera set to allow long subtitles.")
cdPrintnl()
#endif
ELSE
CLEAR_BIT (BitSet_CellphoneDisplay_Third, g_BSTHIRD_REPOSITION_SUBS_FOR_LANDSCAPE_PHONE)
#if IS_DEBUG_BUILD
//Make sure this always displays regardless of phone debug text widget toggle.
PRINTLN("\nCELLPHONE_PUB - Landscape Cellphone Camera now set to NORMAL. Set by [", GET_THIS_SCRIPT_NAME(), "] through public function.")
cdPrintnl()
cdPrintstring ("CELLPHONE_PUB - Landscape Cellphone Camera now set to NORMAL.")
cdPrintnl()
#endif
ENDIF
ENDPROC
//Will return true if the Cellphone camera application is in self-portrait mode.
FUNC BOOL IS_CELLPHONE_CAMERA_IN_SELFIE_MODE()
IF IS_BIT_SET (BitSet_CellphoneDisplay_Third, g_BSTHIRD_IS_CAMERA_IN_SELFIE_MODE)
RETURN TRUE
ELSE
RETURN FALSE
ENDIF
ENDFUNC
//Wiki-ed
//This will force all SP phones into Normal profile if they have been in SLEEP mode. This should really only be used by the flow to ensure that the phone is not in sleep mode after entering a mission trigger.
//New 27.03.12 - Quiet Mode has been added. If phones were in quiet mode, this will persist if this function is called. Quiet Mode still accepts calls, but does not play sound FX.
PROC SET_CELLPHONE_PROFILE_TO_NORMAL()
IF This_Cellphone_Owner_Settings_ListContents[CHAR_MICHAEL].g_SettingList[ENUM_TO_INT(SETTING_PROFILE)].Setting_Currently_Selected_Option = ENUM_TO_INT(PROFILE_SLEEP_MODE)
This_Cellphone_Owner_Settings_ListContents[CHAR_MICHAEL].g_SettingList[ENUM_TO_INT(SETTING_PROFILE)].Setting_Currently_Selected_Option = ENUM_TO_INT(PROFILE_NORMAL_MODE)
#if IS_DEBUG_BUILD
cdPrintstring("CELLPHONE_PUB - Michael Cellphone Profile set to Normal from SET_CELLPHONE_PROFILE_TO_NORMAL. ")
cdPrintnl()
#endif
ENDIF
IF This_Cellphone_Owner_Settings_ListContents[CHAR_FRANKLIN].g_SettingList[ENUM_TO_INT(SETTING_PROFILE)].Setting_Currently_Selected_Option = ENUM_TO_INT(PROFILE_SLEEP_MODE)
This_Cellphone_Owner_Settings_ListContents[CHAR_FRANKLIN].g_SettingList[ENUM_TO_INT(SETTING_PROFILE)].Setting_Currently_Selected_Option = ENUM_TO_INT(PROFILE_NORMAL_MODE)
#if IS_DEBUG_BUILD
cdPrintstring("CELLPHONE_PUB - Franklin Cellphone Profile set to Normal from SET_CELLPHONE_PROFILE_TO_NORMAL. ")
cdPrintnl()
#endif
ENDIF
IF This_Cellphone_Owner_Settings_ListContents[CHAR_TREVOR].g_SettingList[ENUM_TO_INT(SETTING_PROFILE)].Setting_Currently_Selected_Option = ENUM_TO_INT(PROFILE_SLEEP_MODE)
This_Cellphone_Owner_Settings_ListContents[CHAR_TREVOR].g_SettingList[ENUM_TO_INT(SETTING_PROFILE)].Setting_Currently_Selected_Option = ENUM_TO_INT(PROFILE_NORMAL_MODE)
#if IS_DEBUG_BUILD
cdPrintstring("CELLPHONE_PUB - Trevor Cellphone Profile set to Normal from SET_CELLPHONE_PROFILE_TO_NORMAL. ")
cdPrintnl()
#endif
ENDIF
CLEAR_BIT (BitSet_CellphoneDisplay, g_BS_DISPLAY_SLEEP_SIGNIFIER)
SET_BIT (BitSet_CellphoneDisplay_Continued, g_BSC_CELLPHONE_SIGNIFIERS_NEEDS_UPDATED)
//MP? Doesn't have sleep mode.
ENDPROC
PROC SET_CELLPHONE_PROFILE_TO_SLEEP() //Requested by Ben in 1521392
IF This_Cellphone_Owner_Settings_ListContents[CHAR_MICHAEL].g_SettingList[ENUM_TO_INT(SETTING_PROFILE)].Setting_Currently_Selected_Option = ENUM_TO_INT(PROFILE_NORMAL_MODE)
This_Cellphone_Owner_Settings_ListContents[CHAR_MICHAEL].g_SettingList[ENUM_TO_INT(SETTING_PROFILE)].Setting_Currently_Selected_Option = ENUM_TO_INT(PROFILE_SLEEP_MODE)
#if IS_DEBUG_BUILD
cdPrintstring("CELLPHONE_PUB - Michael Cellphone Profile set to SLEEP from SET_CELLPHONE_PROFILE_TO_SLEEP. ")
cdPrintnl()
#endif
ENDIF
IF This_Cellphone_Owner_Settings_ListContents[CHAR_FRANKLIN].g_SettingList[ENUM_TO_INT(SETTING_PROFILE)].Setting_Currently_Selected_Option = ENUM_TO_INT(PROFILE_NORMAL_MODE)
This_Cellphone_Owner_Settings_ListContents[CHAR_FRANKLIN].g_SettingList[ENUM_TO_INT(SETTING_PROFILE)].Setting_Currently_Selected_Option = ENUM_TO_INT(PROFILE_SLEEP_MODE)
#if IS_DEBUG_BUILD
cdPrintstring("CELLPHONE_PUB - Franklin Cellphone Profile set to SLEEP from SET_CELLPHONE_PROFILE_TO_SLEEP. ")
cdPrintnl()
#endif
ENDIF
IF This_Cellphone_Owner_Settings_ListContents[CHAR_TREVOR].g_SettingList[ENUM_TO_INT(SETTING_PROFILE)].Setting_Currently_Selected_Option = ENUM_TO_INT(PROFILE_NORMAL_MODE)
This_Cellphone_Owner_Settings_ListContents[CHAR_TREVOR].g_SettingList[ENUM_TO_INT(SETTING_PROFILE)].Setting_Currently_Selected_Option = ENUM_TO_INT(PROFILE_SLEEP_MODE)
#if IS_DEBUG_BUILD
cdPrintstring("CELLPHONE_PUB - Trevor Cellphone Profile set to SLEEP from SET_CELLPHONE_PROFILE_TO_SLEEP. ")
cdPrintnl()
#endif
ENDIF
SET_BIT (BitSet_CellphoneDisplay, g_BS_DISPLAY_SLEEP_SIGNIFIER)
SET_BIT (BitSet_CellphoneDisplay_Continued, g_BSC_CELLPHONE_SIGNIFIERS_NEEDS_UPDATED)
//MP? Doesn't have sleep mode.
ENDPROC
FUNC BOOL IS_CURRENT_PLAYER_IN_SLEEP_MODE()
Get_Cellphone_Owner()
IF This_Cellphone_Owner_Settings_ListContents[g_Cellphone.PhoneOwner].g_SettingList[ENUM_TO_INT(SETTING_PROFILE)].Setting_Currently_Selected_Option = ENUM_TO_INT(PROFILE_SLEEP_MODE)
RETURN TRUE
ELSE
RETURN FALSE
ENDIF
ENDFUNC
FUNC INT GET_SINGLEPLAYER_CELLPHONE_OPERATING_SYSTEM()
#if IS_DEBUG_BUILD
cdPrintstring("CELLPHONE_PUB - Returning int for OS Type.")
cdPrintnl()
#endif
IF g_bInMultiplayer
g_Cellphone.PhoneOwner = CHAR_MULTIPLAYER
ELSE
g_Cellphone.PhoneOwner = GET_CURRENT_PLAYER_PED_ENUM() //This does not return CHAR_MULTIPLAYER at this point if in MP, rather an array_bursting NO_CHARACTER.
ENDIF
IF g_Cellphone.PhoneOwner > CHAR_MULTIPLAYER
g_Cellphone.PhoneOwner = CHAR_MULTIPLAYER //In the mission creator, the player ped is in a funny state so was returning 153! The game cannot set g_bInMultiplayer here either.
//Force the return value to be the multiplayer phone at this time as a precaution #1357711
#if IS_DEBUG_BUILD
cdPrintstring("CELLPHONE_PUB - GET_CURRENT_PLAYER_PED_ENUM() is returning an abnormal number, for safety, setting owner to CHAR_MULTIPLAYER.")
cdPrintnl()
#endif
ENDIF
#if USE_CLF_DLC
RETURN g_savedGlobalsClifford.sCellphoneSettingsData.This_Cellphone_Owner_Settings[g_Cellphone.PhoneOwner].OSTypeForThisPlayer
#endif
#if USE_NRM_DLC
RETURN g_savedGlobalsnorman.sCellphoneSettingsData.This_Cellphone_Owner_Settings[g_Cellphone.PhoneOwner].OSTypeForThisPlayer
#endif
#if not USE_SP_DLC
RETURN g_savedGlobals.sCellphoneSettingsData.This_Cellphone_Owner_Settings[g_Cellphone.PhoneOwner].OSTypeForThisPlayer
#endif
ENDFUNC
//Wiki-ed.
//Returns the text_label string of the currently highlighted app on the cellphone. If you want to check if a specific app is highlighted use IS_THIS_APP_CURRENTLY_HIGHLIGHTED.
//Example Usage:
//CurrentAppString = GET_CURRENTLY_HIGHLIGHTED_APP()
/* This has been heavily impacted by Derek's scaleform changes. Commented out until we get a solution to the enforced delay to get_current_selection.
FUNC TEXT_LABEL GET_CURRENTLY_HIGHLIGHTED_APP()
INT HighlightedIndex = 0
INT AdjustedAppIndex = 0
TEXT_LABEL ReturnLabel = ""
IF g_Cellphone.PhoneDS = PDS_MAXIMUM //phone in homescreen state
IF GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("cellphone_flashhand")) > 0 //ergo cellphone scaleform must be loaded
//HighlightedIndex = CALL_SCALEFORM_MOVIE_METHOD (SF_MovieIndex, "GET_CURRENT_SELECTION")
BEGIN_SCALEFORM_MOVIE_METHOD (SF_MovieIndex, "GET_CURRENT_SELECTION")
HighlightedIndex = END_SCALEFORM_MOVIE_METHOD_INT()
IF (HighlightedIndex > ENUM_TO_INT(MAX_APPLICATIONS))
//OR (HighlightedIndex = ENUM_TO_INT(MAX_APPLICATIONS))
OR (HighlightedIndex < 0)
HighlightedIndex = ENUM_TO_INT(MAX_APPLICATIONS) //Avoid array overrun and scaleform method returning -1 value if someone is using this to check another screen by mistake.
ENDIF
AdjustedAppIndex = AppSlot[HighlightedIndex]
//ReturnString = GET_STRING_FROM_TEXT_FILE (g_AppList[AdjustedAppIndex].AppName)
ReturnLabel = (g_AppList[AdjustedAppIndex].AppName)
ELSE
ReturnLabel = "" //This has to be like this. Turns out you can't return NULL here.
ENDIF
ELSE
#IF IS_DEBUG_BUILD
cdPrintstring ("CELLPHONE_PUB - Get_currently_highlighted_app is checking this frame but cellphone is not currently on home screen!")
cdPrintnl()
#endif
ReturnLabel = "" //This has to be like this. Turns out you can't return NULL here.
ENDIF
RETURN ReturnLabel
ENDFUNC
*/
FUNC BOOL IS_THE_SCRIPT_appContacts_RUNNING()
#if USE_CLF_DLC
IF GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH ("appContactsCLF")) > 0 //phone in contacts list state
RETURN TRUE
ENDIF
#endif
#if USE_NRM_DLC
IF GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH ("appContactsNRM")) > 0 //phone in contacts list state
RETURN TRUE
ENDIF
#endif
#if not USE_SP_DLC
IF GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH ("appContacts")) > 0 //phone in contacts list state
RETURN TRUE
ENDIF
#endif
RETURN FALSE
ENDFUNC
//Wiki-ed
//Returns the enum of the currently highlighted contact on the contacts list.
//This has been heavily impacted by Derek's scaleform changes which forces us to wait for the scaleform return value to be ready.
//The WAIT (0) is expensive and not for the best in a public function, so this should be used only where absolutely necessary.
//You should therefore wrap this check with IS_CONTACTS_LIST_ON_SCREEN(). A warning line will spam if you don't.
//Example usage:
/*
IF IS_CONTACTS_LIST_ON_SCREEN()
IF GET_CURRENTLY_HIGHLIGHTED_CONTACT() = CHAR_DETONATEPHONE
DISPLAY_TEXT_WITH_LITERAL_STRING (0.35, 0.84, "STRING", "CHAR_DETONATEPHONE_HIGHLIGHTED")
ENDIF
ENDIF
*/
FUNC enumCharacterList GET_CURRENTLY_HIGHLIGHTED_CONTACT()
SCALEFORM_RETURN_INDEX SF_HighlightedContactIndex
INT i_HighlightedContactIndex
INT AdjustedIndex = 0
enumCharacterList ReturnCharacter = NO_CHARACTER
INT TimeoutValveStarted, TimeOutValveCurrent
IF g_bInMultiplayer
#if IS_DEBUG_BUILD
cdPrintstring ("CELLPHONE_PUB - Get_currently_highlighted_contact is not available in MP.")
cdPrintnl()
#endif
ReturnCharacter = NO_CHARACTER
ELSE
IF HAS_SCALEFORM_MOVIE_LOADED (SF_MovieIndex) = TRUE
IF IS_THE_SCRIPT_appContacts_RUNNING()
IF IS_THE_SCRIPT_cellphone_flashhand_RUNNING()
BOOL TimeOutValveFired = FALSE
BEGIN_SCALEFORM_MOVIE_METHOD (SF_MovieIndex, "GET_CURRENT_SELECTION")
SF_HighlightedContactIndex =END_SCALEFORM_MOVIE_METHOD_RETURN_VALUE()
TimeOutValveStarted = GET_GAME_TIMER()
//This is an expensive fix for PT 1431163. Will make a better function after lockdown where cellphone_flashhand passes the value back.
WHILE (NOT IS_SCALEFORM_MOVIE_METHOD_RETURN_VALUE_READY (SF_HighlightedContactIndex))
AND TimeOutValveFired = FALSE
AND HAS_SCALEFORM_MOVIE_LOADED (SF_MovieIndex) = TRUE
WAIT (0)
TimeOutValveCurrent = GET_GAME_TIMER()
IF ((TimeOutValveCurrent - TimeOutValveStarted) > 1500)
TimeOutValveFired = TRUE
ENDIF
#if IS_DEBUG_BUILD
cdPrintstring("CELLPHONE_PUB - GET_CURRENTLY_HIGHLIGHTED_CONTACT is waiting on return value from scaleform.")
cdPrintnl()
cdPrintstring( "SF_HighlightedContactIndex is: ")
PRINTINT (NATIVE_TO_INT(SF_HighlightedContactIndex))
cdPrintnl()
#endif
ENDWHILE
//Assume the return value must have been returned okay in the first instance...
i_HighlightedContactIndex = GET_SCALEFORM_MOVIE_METHOD_RETURN_VALUE_INT (SF_HighlightedContactIndex)
#if USE_CLF_DLC
IF (i_HighlightedContactIndex > ENUM_TO_INT(MAX_CLF_CHARACTERS))
OR (i_HighlightedContactIndex < 0)
i_HighlightedContactIndex = ENUM_TO_INT(MAX_CLF_CHARACTERS) //Avoid array overrun and scaleform method returning -1 value if someone is using this to check another screen by mistake.
ENDIF
#endif
#if USE_NRM_DLC
IF (i_HighlightedContactIndex > ENUM_TO_INT(MAX_NRM_CHARACTERS))
OR (i_HighlightedContactIndex < 0)
i_HighlightedContactIndex = ENUM_TO_INT(MAX_NRM_CHARACTERS) //Avoid array overrun and scaleform method returning -1 value if someone is using this to check another screen by mistake.
ENDIF
#endif
#if not USE_SP_DLC
IF (i_HighlightedContactIndex > ENUM_TO_INT(GLOBAL_CHARACTER_SHEET_GET_MAX_CHARACTERS_FOR_GAMEMODE()))
OR (i_HighlightedContactIndex < 0)
i_HighlightedContactIndex = ENUM_TO_INT(GLOBAL_CHARACTER_SHEET_GET_MAX_CHARACTERS_FOR_GAMEMODE()) //Avoid array overrun and scaleform method returning -1 value if someone is using this to check another screen by mistake.
ENDIF
#endif
AdjustedIndex = ContactListSlot[i_HighlightedContactIndex]
ReturnCharacter = (INT_TO_ENUM (enumCharacterList, AdjustedIndex))
//Now check the other two breakout clauses didn't fire. If so return NO_CHARACTER.
IF HAS_SCALEFORM_MOVIE_LOADED (SF_MovieIndex) = FALSE //Broke out of multi-condition WHILE above...
#if IS_DEBUG_BUILD
cdPrintstring ("CELLPHONE_PUB - Get_currently_highlighted_contact is checking this frame but cellphone movie is no longer loaded whilst getting return value. Returning NO CHARACTER")
cdPrintnl()
#endif
ReturnCharacter = NO_CHARACTER //This has to be like this.
ENDIF
IF TimeOutValveFired = TRUE //Broke out of multi-condition WHILE above...
#if IS_DEBUG_BUILD
cdPrintstring ("CELLPHONE_PUB - Get_currently_highlighted_contact is checking this frame but timeout safety valve was fired. Returning NO CHARACTER")
cdPrintnl()
#endif
ReturnCharacter = NO_CHARACTER //This has to be like this.
ENDIF
ELSE
#if IS_DEBUG_BUILD
cdPrintstring ("CELLPHONE_PUB - Get_currently_highlighted_contact is checking this frame but cellphone_flashhand no longer running. Returning NO CHARACTER")
cdPrintnl()
#endif
ReturnCharacter = NO_CHARACTER //This has to be like this. Turns out you can't return NULL here.
ENDIF
ELSE
#if IS_DEBUG_BUILD
cdPrintstring ("CELLPHONE_PUB - Get_currently_highlighted_contact is checking this frame but cellphone is not currently on contacts screen.")
cdPrintnl()
#endif
ReturnCharacter = NO_CHARACTER //This has to be like this. Turns out you can't return NULL here.
//Seems pointless but fixes intellisense.
ENDIF
ELSE
#if IS_DEBUG_BUILD
cdPrintstring ("CELLPHONE_PUB - Get_currently_highlighted_contact is checking this frame but cellphone movie is no longer loaded.")
cdPrintnl()
#endif
ReturnCharacter = NO_CHARACTER //This has to be like this. Turns out you can't return NULL here.
ENDIF
ENDIF
RETURN ReturnCharacter
ENDFUNC
//Wiki-ed
//This will check if the name of the app you pass in is the currently highlighted option on the cellphone homescreen
//Pass in the application name text label by referring to american_cellphone.txt. Search for "app names". They start from CELL_0 onwards.
//Example Usage:
//IF (Is_This_App_Currently_Highlighted ("CELL_16"))
// cdPrintstring ("AppSettingsHighlighted")
// cdPrintnl()
//ENDIF
//
/* This relies on GET_CURRENTLY_HIGHLIGHTED_APP which has been heavily impacted by Derek's scaleform changes. Commented out until we get a solution.
FUNC BOOL IS_THIS_APP_CURRENTLY_HIGHLIGHTED (STRING WhichAppTextLabel)
//IF (ARE_STRINGS_EQUAL (Get_Currently_Highlighted_App(), WhichAppTextLabel)) //Direct comparison won't compile...
TEXT_LABEL Temp_Label = Get_Currently_Highlighted_App()
IF ARE_STRINGS_EQUAL (Temp_Label, WhichAppTextLabel)
RETURN TRUE
ELSE
RETURN FALSE
ENDIF
ENDFUNC
*/
//Wiki-ed
//This will check if the name of the contact you pass in is the currently highlighted option on the contacts list
//Pass in the character name text label from the character sheet or refer to american_cellphone.txt. The label will be of the form CELL_1xx.
//Example Usage:
//IF (Is_This_Contact_Currently_Highlighted ("CELL_103"))
// cdPrintstring ("Franklin Highlighted")
// cdPrintnl()
//ENDIF
/* This relies on GET_CURRENTLY_HIGHLIGHTED_CONTACT which has been heavily impacted by Derek's scaleform changes. Commented out until we get a solution.
FUNC BOOL IS_THIS_CONTACT_CURRENTLY_HIGHLIGHTED (STRING WhichContactLabel)
//IF (ARE_STRINGS_EQUAL (Get_Currently_Highlighted_Contact(), WhichContactName)) //Direct comparison won't compile.
TEXT_LABEL Temp_Label = Get_Currently_Highlighted_Contact()
IF ARE_STRINGS_EQUAL (Temp_Label, WhichContactLabel)
RETURN TRUE
ELSE
RETURN FALSE
ENDIF
ENDFUNC
*/
//Wiki-ed.
//Check if the cellphone camera script has just taken a picture. Call this every frame in the segment of script where you want to check.
//The global bool, Cellphone_Pic_Just_Taken, resets to false after two seconds. ( temp measure )
FUNC BOOL HAS_CELLPHONE_CAM_JUST_TAKEN_PIC()
IF Cellphone_Pic_Just_Taken
RETURN TRUE
ELSE
RETURN FALSE
ENDIF
ENDFUNC
//Added to allow external scripts know if Snapmatic, the cellphone cam, is running but is in the "delete / save " picture mode rather than in the viewfinder.
FUNC BOOL IS_SNAPMATIC_NOT_IN_VIEWFINDER_MODE()
IF g_Cell_Pic_Stage = PIC_STAGE_HOLDING_LQ_COPY
OR g_Cell_Pic_Stage > PIC_STAGE_HOLDING_LQ_COPY
RETURN TRUE
ELSE
RETURN FALSE
ENDIF
ENDFUNC
//This can be used to prevent the cellphone's camera application displaying "delete" and "continue" and attempting to save to the cloud gallery when "continue" is selected.
//When passed with TRUE, this proc will only display "continue" and when that is selected, no save will take place and the camera readies itself for another photo to be taken.
PROC BYPASS_CELLPHONE_CAMERA_DEFAULT_SAVE_ROUTINE (BOOL b_PassedBypass)
IF b_PassedBypass = TRUE
SET_BIT (BitSet_CellphoneDisplay_Continued, g_BSC_BYPASS_CAMERA_APP_SAVE_ROUTINE)
#if IS_DEBUG_BUILD
PRINTNL()
PRINTLN("\nCELLPHONE_PUB - Cellphone Camera Default Save Routine BYPASSED from [", GET_THIS_SCRIPT_NAME(), "] through public function.")
PRINTNL()
#endif
ELSE
CLEAR_BIT (BitSet_CellphoneDisplay_Continued, g_BSC_BYPASS_CAMERA_APP_SAVE_ROUTINE)
#if IS_DEBUG_BUILD
PRINTNL()
PRINTLN("\nCELLPHONE_PUB - Cellphone Camera Default Save Routine REINSTATED from [", GET_THIS_SCRIPT_NAME(), "] through public function.")
PRINTNL()
#endif
ENDIF
ENDPROC
//Special procedure for Docks_Setup1 mission. During a picture taking sequence it was requested that the player's actions are inhibited.
PROC INHIBIT_CELLPHONE_CAMERA_FUNCTIONS_FOR_DOCKS_SETUP(BOOL b_ShouldInhibit = FALSE)
IF b_ShouldInhibit = TRUE
SET_BIT (BitSet_CellphoneDisplay, g_BS_DOCKS_SETUP_TUTORIAL_ONGOING)
#if IS_DEBUG_BUILD
cdPrintstring ("CELLPHONE_PUB - Docks Setup tutorial bit has been set. Cellphone Camera joypad button functionality inhibited.")
cdPrintnl()
#endif
ELSE
CLEAR_BIT (BitSet_CellphoneDisplay, g_BS_DOCKS_SETUP_TUTORIAL_ONGOING)
#if IS_DEBUG_BUILD
cdPrintstring ("CELLPHONE_PUB - Docks Setup tutorial bit cleared. Cellphone Camera functionality returned to normal.")
cdPrintnl()
#endif
ENDIF
ENDPROC
FUNC BOOL IS_CELLPHONE_CAMERA_INHIBITED_FOR_DOCKS_SETUP()
IF IS_BIT_SET (BitSet_CellphoneDisplay, g_BS_DOCKS_SETUP_TUTORIAL_ONGOING)
RETURN TRUE
ELSE
RETURN FALSE
ENDIF
ENDFUNC
/*Moved to dialogue_public.sch
//Check this after an inbound cellphone call has been successfully launched.
FUNC BOOL CHECK_CELLPHONE_LAST_CALL_REJECTED()
IF g_LastInboundCallRejected
RETURN TRUE
ELSE
RETURN FALSE
ENDIF
ENDFUNC
*/
//Wiki-ed.
//Check if the phone is in disabled mode or not.
FUNC BOOL IS_CELLPHONE_DISABLED()
IF g_Cellphone.PhoneDS = PDS_DISABLED
RETURN TRUE
ELSE
RETURN FALSE
ENDIF
ENDFUNC
//Check if the phone is in disabled mode or is being disabled this frame only. This cannot be combined with the above and is primarily a check for MP peculiarity.
//Self note: If an existing script checked for IS_CELLPHONE_DISABLED before deciding if they should re-enable or not when quitting, e.g the debug menu, and I_C_D included a check for this_frame_only
//then there's a chance that the phone would not be re-enabled if the DISABLE_THIS_FRAME_ONLY call has ceased while in the menu. Some things still need the phone fully disabled.
//Will change next game to everyone disabling_this_frame_only. Too many scripts are using the system "as was" to alter this late in development.
FUNC BOOL IS_CELLPHONE_DISABLED_OR_DISABLED_THIS_FRAME_ONLY()
IF g_Cellphone.PhoneDS = PDS_DISABLED
OR g_Cellphone.PhoneDS = PDS_DISABLED_THIS_FRAME_ONLY
RETURN TRUE
ELSE
RETURN FALSE
ENDIF
ENDFUNC
//Wiki-ed.
//Allows the phone to be hidden but remain active during any ongoing, answered phonecall. Should only really be used for hotswap transitions where swapping on the fly
//between character phones is necessary.
PROC HIDE_PHONE_FOR_HOTSWAP (BOOL ShouldHidePhone)
IF ShouldHidePhone
IF g_Cellphone.PhoneDS = PDS_ONGOING_CALL //only allow phone to be hidden for hotswap during ongoing phonecall
g_Phone_Active_but_Hidden = TRUE
#if IS_DEBUG_BUILD
PRINTLN("\nCELLPHONE_PUB - Hide phone from hotswap true via [", GET_THIS_SCRIPT_NAME(), "] through public function.")
cdPrintnl()
cdPrintstring ("CELLPHONE_PUB - Phone display has been hidden for hotswap transition.")
cdPrintnl()
#endif
ENDIF
ELSE
g_Phone_Active_but_Hidden = FALSE
#if IS_DEBUG_BUILD
PRINTLN("\nCELLPHONE_PUB - Hide phone from hotswap false via [", GET_THIS_SCRIPT_NAME(), "] through public function.")
cdPrintnl()
cdPrintstring ("CELLPHONE_PUB - Phone should be displayed - hotswap hide no longer active")
cdPrintnl()
#endif
ENDIF
ENDPROC
// This should be called if we want to put away the phone smoothly, the same animation that plays when we hang up the phone. This function can be used if we do not want to actually hang it up yet.
// HIDE_ACTIVE_PHONE does the same thing but without animation and instead it will instantly hide the phone from the screen. This also causes an issue because g_Cellphone.PhoneDS = PDS_AWAY
// is called inside there which makes the animation play at the END of the call too if we keep the phone hidden.
PROC PUT_AWAY_ACTIVE_PHONE ()
IF NOT IS_CELLPHONE_DISABLED_OR_DISABLED_THIS_FRAME_ONLY()
g_Cellphone.PhoneDS = PDS_AWAY
#if IS_DEBUG_BUILD
cdPrintnl()
cdPrintstring("STATE ASSIGNMENT 362-b. CELLPHONE_PUB PUT_AWAY_ACTIVE_PHONE assigns PDS_AWAY")
cdPrintnl()
#endif
ENDIF
ENDPROC
//DANGER!
//You really need a very good reason for doing this. It's in place for use by the full screen Internet that is launched from the phone.
//The in-game internet is a special case - it pauses the game. If you think you need to use this function, then please email Steven Taylor beforehand.
//This will hide a cellphone which is currently onscreen and not allow any button presses to interact with it.
PROC HIDE_ACTIVE_PHONE (BOOL ShouldHidePhone, BOOL UseCamPositions = FALSE)
DEBUG_PRINTCALLSTACK()
IF ShouldHidePhone
IF IS_PHONE_ONSCREEN () //only allow phone to be hidden if it's onscreen
g_Phone_Active_but_Hidden = TRUE
IF UseCamPositions //if we are using this proc to hide the cellphone during camera functionality, we need to keep a hold of its current position.
GET_MOBILE_PHONE_POSITION (g_TempCamPosVec)
ENDIF
g_3dPhonePosVec = g_This_Screen_3dPhoneStartVec[g_Chosen_Ratio]
//Update the 3d phone position...
SET_MOBILE_PHONE_POSITION (g_3dPhonePosVec)
#if IS_DEBUG_BUILD
PRINTLN("\nCELLPHONE_PUB - Hide active phone set to true via [", GET_THIS_SCRIPT_NAME(), "] through public function.")
cdPrintnl()
cdPrintstring ("CELLPHONE_PUB - Phone display has now been hidden.")
cdPrintnl()
#endif
ENDIF
ELSE
IF g_Phone_Active_but_Hidden = TRUE //only let this happen if the phone has already been hidden.
g_Phone_Active_but_Hidden = FALSE
g_3dPhonePosVec = g_This_Screen_3dPhoneEndVec[g_Chosen_Ratio]
IF UseCamPositions
SET_MOBILE_PHONE_POSITION (g_TempCamPosVec) //restore previous cellphone camera position if need be.
ELSE
//Update the 3d phone position...
SET_MOBILE_PHONE_POSITION (g_3dPhonePosVec)
ENDIF
#if IS_DEBUG_BUILD
PRINTLN("\nCELLPHONE_PUB - Hide active phone now false via [", GET_THIS_SCRIPT_NAME(), "] through public function.")
cdPrintnl()
cdPrintstring ("CELLPHONE_PUB - Phone should be displayed - no longer hidden.")
cdPrintnl()
#endif
ENDIF
ENDIF
ENDPROC
//Wiki-ed
//Will terminate any ongoing phonecall and force the cellphone down offscreen, out of the player's hand. Setting the bool parameter to TRUE will force the hud phone
//off screen instantly rather than smoothly moving down the screen.
PROC HANG_UP_AND_PUT_AWAY_PHONE (BOOL b_MovePhoneOffScreenInstantly = FALSE)
IF IS_DRONE_SNAPMATIC_ACTIVE()
PRINTLN("\nCELLPHONE_PUB - IGNORE HANG_UP_AND_PUT_AWAY_PHONE called by [", GET_THIS_SCRIPT_NAME(), "] through public function as drone snapmatic is active")
EXIT
ENDIF
IF g_Phone_Active_but_Hidden
IF IS_LOCAL_PLAYER_USING_DRONE()
HIDE_ACTIVE_PHONE(TRUE, TRUE)
ELSE
HIDE_ACTIVE_PHONE (FALSE) //make sure phone isn't hidden.
ENDIF
ENDIF
IF g_cellphone.PhoneDS = PDS_ATTEMPTING_TO_CALL_CONTACT
OR g_cellphone.PhoneDS = PDS_ONGOING_CALL
//Set bit for interrogating if a script hang up has occurred during a call state.
SET_BIT (BitSet_CellphoneDisplay_Continued, g_BSC_LAST_CALL_ABORTED_DUE_TO_SCRIPT_HANGUP)
//SetUpPhoneConversation() in dialogue private will clear this bit when the next phonecall is accepted into the system.
ENDIF
//Perhaps class as an interruption? It can only be done by script, an end user hang up will result in the "interruption" flag triggering already.
IF IS_MOBILE_PHONE_CALL_ONGOING()
STOP_SCRIPTED_CONVERSATION (FALSE) //don't finish last line of conversation as this is a call....
ENDIF
#if IS_DEBUG_BUILD
PRINTLN("\nCELLPHONE_PUB - HANG_UP_AND_PUT_AWAY_PHONE called by [", GET_THIS_SCRIPT_NAME(), "] through public function.")
#endif
g_ConversationStatus = CONV_STATE_HANGUPAWAY //tell dialogue handler to clean up a call using HungupAwayCleanup specifically.
IF b_MovePhoneOffScreenInstantly = TRUE
SET_BIT (BitSet_CellphoneDisplay, g_BS_MOVE_PHONE_DOWN_INSTANTLY)
#if IS_DEBUG_BUILD
PRINTLN("\nCELLPHONE_PUB - Move phone down instantly set by [", GET_THIS_SCRIPT_NAME(), "] through public function.")
#endif
ELSE
CLEAR_BIT (BitSet_CellphoneDisplay, g_BS_MOVE_PHONE_DOWN_INSTANTLY)
ENDIF
//Candidate for inclusion... post August milestone. Should get done by CONV_STATE_HANGUPAWAY but might be a wee bit safer below.
//Put phone away... only if not disabled
IF NOT IS_CELLPHONE_DISABLED_OR_DISABLED_THIS_FRAME_ONLY()
g_Cellphone.PhoneDS = PDS_AWAY
#if IS_DEBUG_BUILD
cdPrintnl()
cdPrintstring("STATE ASSIGNMENT 362. CELLPHONE_PUB HANG_UP_AND_PUT_AWAY_PHONE assigns PDS_AWAY")
cdPrintnl()
#endif
ENDIF
ENDPROC
//Wiki-ed.
//Puts phone in disabled mode - this means pressing up on the d-pad will NOT bring the phone on screen and setting this to true will hang up and put away the phone.
PROC DISABLE_CELLPHONE (BOOL IsPhoneDisabled)
IF IsPhoneDisabled
Check_For_Ongoing_Call_Interruption() //added for bug #413480
IF g_cellphone.PhoneDS = PDS_ATTEMPTING_TO_CALL_CONTACT
OR g_cellphone.PhoneDS = PDS_ONGOING_CALL
//Set bit for interrogating if a script hang up has occurred during a call state.
SET_BIT (BitSet_CellphoneDisplay_Continued, g_BSC_LAST_CALL_ABORTED_DUE_TO_SCRIPT_HANGUP)
//SetUpPhoneConversation() in dialogue private will clear this bit when the next phonecall is accepted into the system.
ENDIF
g_Cellphone.PhoneDS = PDS_DISABLED
#if IS_DEBUG_BUILD
cdPrintnl()
cdPrintstring("STATE ASSIGNMENT 8. Cellphone Public assigns PDS_DISABLED")
cdPrintnl()
#endif
IF IS_PHONE_ONSCREEN()
HANG_UP_AND_PUT_AWAY_PHONE() //tidy up call...
ENDIF
//Moved above for bug 69357.
//g_Cellphone.PhoneDS = PDS_DISABLED
#if IS_DEBUG_BUILD
g_Cellphone_Disable_WidgetToggle = TRUE //Update debug widget to let it know that the phone is disabled.
//Make sure this always displays regardless of phone debug text widget toggle.
PRINTLN("\nCELLPHONE_PUB - Cellphone disabled from [", GET_THIS_SCRIPT_NAME(), "] through public function.")
cdPrintnl()
cdPrintstring ("CELLPHONE_PUB - Mobile phone has been set to disabled via script DISABLE_CELLPHONE (TRUE). No calls can be passed to it!")
cdPrintnl()
#endif
ELSE
IF g_Cellphone.PhoneDS = PDS_DISABLED //Look at this! Debug menu is acting weirdly when running every frame test!
IF NOT (g_Cellphone.PhoneDS = PDS_DISABLED_THIS_FRAME_ONLY)
g_Cellphone.PhoneDS = PDS_AWAY
#if IS_DEBUG_BUILD
cdPrintnl()
cdPrintstring("STATE ASSIGNMENT 9. Cellphone Public assigns PDS_AWAY")
cdPrintnl()
#endif
ENDIF
#if IS_DEBUG_BUILD
g_Cellphone_Disable_WidgetToggle = FALSE //Update debug widget to let it know that the phone is enabled.
//Make sure this always displays regardless of phone debug text widget toggle.
PRINTLN("\nCELLPHONE_PUB - Cellphone re-enabled from [", GET_THIS_SCRIPT_NAME(), "] through public function.")
cdPrintnl()
cdPrintstring ("CELLPHONE_PUB - Mobile phone enabled via script DISABLE_CELLPHONE (FALSE). Calls enabled!")
cdPrintnl()
#endif
ENDIF
ENDIF
ENDPROC
PROC DISABLE_CELLPHONE_THIS_FRAME_ONLY(BOOL b_MovePhoneOffScreenInstantly = FALSE)
IF IS_DRONE_SNAPMATIC_ACTIVE()
PRINTLN("\nCELLPHONE_PUB - IGNORE DISABLE_CELLPHONE_THIS_FRAME_ONLY called by [", GET_THIS_SCRIPT_NAME(), "] through public function as drone snapmatic is active")
EXIT
ENDIF
IF NOT (g_Cellphone.PhoneDS = PDS_DISABLED) //Phone has already been fully disabled. Take no action.
IF IS_PHONE_ONSCREEN()
HANG_UP_AND_PUT_AWAY_PHONE(b_MovePhoneOffScreenInstantly) //tidy up call...
ENDIF
SET_BIT (BitSet_CellphoneDisplay_Continued, g_BSC_REQUESTED_DISABLE_CELLPHONE_THIS_FRAME)
ENDIF
#if IS_DEBUG_BUILD
IF g_DumpDisableEveryFrameCaller
OR g_DisplayNewSideTaskSignifier = TRUE
PRINTNL()
PRINTLN("\nCELLPHONE_PUB - Attempt to disable cellphone THIS FRAME from [", GET_THIS_SCRIPT_NAME(), "] through public function.")
DEBUG_PRINTCALLSTACK()
IF g_DisplayNewSideTaskSignifier = TRUE
cdPrintstring("DISABLE_CELLPHONE_THIS_FRAME_ONLY() calling script has been detailed above due to attempted user takeout. Search for Attempt to disable.")
cdPrintnl()
g_DisplayNewSideTaskSignifier = FALSE
ENDIF
ENDIF
#endif
ENDPROC
PROC BLOCK_HUD_PHONE_MOVEMENT_FOR_SWITCH_SCENE_CALL (BOOL ShouldBlockMovement = FALSE)
IF ShouldBlockMovement
SET_BIT (BitSet_CellphoneDisplay_Third, g_BSTHIRD_DO_NOT_MOVE_PHONE_UP_ON_LAUNCH)
#if IS_DEBUG_BUILD
PRINTNL()
PRINTLN("\nCELLPHONE_PUB - BLOCK_HUD_PHONE_MOVEMENT_FOR_SWITCH_SCENE_CALL set to TRUE from [", GET_THIS_SCRIPT_NAME(), "] through public function.")
//PRINTLN("\nCELLPHONE_PUB - Also setting fully vanished bit to TRUE to solve url:bugstar:1866104")
#endif
ELSE
CLEAR_BIT (BitSet_CellphoneDisplay_Third, g_BSTHIRD_DO_NOT_MOVE_PHONE_UP_ON_LAUNCH)
#if IS_DEBUG_BUILD
PRINTNL()
PRINTLN("\nCELLPHONE_PUB - BLOCK_HUD_PHONE_MOVEMENT_FOR_SWITCH_SCENE_CALL set to FALSE from [", GET_THIS_SCRIPT_NAME(), "] through public function.")
#endif
ENDIF
ENDPROC
PROC DISABLE_CELLPHONE_DIALOGUE_LINE_SKIP (BOOL bLineSkipDisable)
IF bLineSkipDisable
SET_BIT (BitSet_CellphoneDisplay_Continued, g_BSC_PREVENT_CELLPHONE_LINESKIP)
#if IS_DEBUG_BUILD
PRINTNL()
PRINTLN("\nCELLPHONE_PUB - Cellphone Dialogue line skip disabled from [", GET_THIS_SCRIPT_NAME(), "] through public function.")
#endif
ELSE
CLEAR_BIT (BitSet_CellphoneDisplay_Continued, g_BSC_PREVENT_CELLPHONE_LINESKIP)
#if IS_DEBUG_BUILD
PRINTNL()
PRINTLN("\nCELLPHONE_PUB - Cellphone Dialogue line skip enabled from [", GET_THIS_SCRIPT_NAME(), "] through public function.")
#endif
ENDIF
ENDPROC
PROC DISABLE_CELLPHONE_CAMERA_APP_THIS_FRAME_ONLY()
SET_BIT (BitSet_CellphoneDisplay_Continued, g_BSC_REQUESTED_DISABLE_CAMERA_APP_THIS_FRAME)
//Comment and compile with this line to see who is disabling at any given time...
#if IS_DEBUG_BUILD
IF g_DumpDisableEveryFrameCaller
PRINTNL()
PRINTLN("\nCELLPHONE_PUB - Cellphone Camera App disabled from [", GET_THIS_SCRIPT_NAME(), "] through public function.")
DEBUG_PRINTCALLSTACK()
ENDIF
#endif
ENDPROC
PROC DISABLE_CELLPHONE_INTERNET_APP_THIS_FRAME_ONLY()
SET_BIT (BitSet_CellphoneDisplay_Continued, g_BSC_REQUESTED_DISABLE_INTERNET_APP_THIS_FRAME)
ENDPROC
//Wiki-ed
//Allows script to alter the contact names displayed on the calling screen on the fly - only really useful for hot swap transitions so that names can be changed mid-phonecall.
//The second parameter, can be forgotten about - unless you are altering names mid-conference call and need to alter both names on the calling screen.
//Contact names are taken from the character list as normal. e.g CHAR_ARIANO
PROC CHANGE_CALLING_SCREEN_CONTACT_NAMES (enumCharacterList PrimaryChar, enumCharacterList SecondaryChar = NO_CHARACTER)
//This needs updated to change scaleform method.
g_TheContactInvolvedinCall = PrimaryChar
g_AdditionalContactInvolvedinCall = SecondaryChar
ENDPROC
//You should only call this after checking the phone is fully moved up onscreen or if appContacts is running.
//This is because, for safety reasons, the phone will reset any force on launch of its main graphics handling script.
//e.g Best usage:
/*
IF IS_CONTACTS_LIST_ON_SCREEN()
FORCE_SELECTION_OF_THIS_CONTACT_ONLY (CHAR_LAMAR)
ENDIF
*/
PROC FORCE_SELECTION_OF_THIS_CONTACT_ONLY (enumCharacterList ForcedChar)
g_ForcedContactSelection = ForcedChar
ENDPROC
PROC ENABLE_AUTO_SCROLL_TO_CONTACT (enumCharacterList DesiredContact)
g_AutoScrollContact = DesiredContact
SET_BIT (BitSet_CellphoneDisplay, g_BS_AUTO_SCROLL_CONTACT_ENABLED)
#if IS_DEBUG_BUILD
cdPrintnl()
cdPrintstring ("CELLPHONE_PUB - Auto Scroll for contact bit has been set. Will auto scroll if appContacts runs.")
cdPrintnl()
#endif
ENDPROC
PROC DISABLE_AUTO_SCROLL_TO_CONTACT()
CLEAR_BIT (BitSet_CellphoneDisplay, g_BS_AUTO_SCROLL_CONTACT_ENABLED)
#if IS_DEBUG_BUILD
cdPrintnl()
cdPrintstring ("CELLPHONE_PUB - Auto Scroll for contact bit has been disabled.")
cdPrintnl()
#endif
ENDPROC
//DO NOT CALL! This is here for convenience of reference.
PROC Create_Contact_Feed_Entry_Immediately()
TEXT_LABEL_63 s_TXD_Contact_decision
#if USE_CLF_DLC
s_TXD_Contact_decision = (GET_FILENAME_FOR_AUDIO_CONVERSATION (g_savedGlobalsClifford.sCharSheetData.g_CharacterSheet[g_Temp_ContactHeadshotRef].picture))
#endif
#if USE_NRM_DLC
s_TXD_Contact_decision = (GET_FILENAME_FOR_AUDIO_CONVERSATION (g_savedGlobalsnorman.sCharSheetData.g_CharacterSheet[g_Temp_ContactHeadshotRef].picture))
#endif
#if not USE_SP_DLC
s_TXD_Contact_decision = (GET_FILENAME_FOR_AUDIO_CONVERSATION (g_sCharacterSheetAll[g_Temp_ContactHeadshotRef].picture))
#endif
#if IS_DEBUG_BUILD //Important, make sure this is always in the logs.
PRINTNL()
PRINTSTRING("Extract headshot txd was ")
PRINTSTRING (s_TXD_Contact_Decision)
PRINTNL()
#endif
IF g_UseContactSignifierNewType = FALSE
BEGIN_TEXT_COMMAND_THEFEED_POST ("")
TEXT_LABEL_63 s_TempContactHolder
s_TempContactHolder = GET_FILENAME_FOR_AUDIO_CONVERSATION(SignifierData[SIG_CONTACT1].SignifierPrimaryText)
STRING s_ContactAddedString
s_ContactAddedString = GET_FILENAME_FOR_AUDIO_CONVERSATION("CELL_253")
#if IS_DEBUG_BUILD
cdPrintstring ("Strings for contact test are: ")
cdPrintstring (s_TXD_Contact_decision)
cdPrintstring (", ")
cdPrintstring (s_TempContactHolder)
cdPrintstring (", ")
cdPrintstring (s_ContactAddedString)
cdPrintnl()
#endif
END_TEXT_COMMAND_THEFEED_POST_MESSAGETEXT (s_TXD_Contact_decision, s_TXD_Contact_decision, FALSE, TEXT_ICON_NEW_CONTACT, s_ContactAddedString, s_TempContactHolder)
ELSE
BEGIN_TEXT_COMMAND_THEFEED_POST ("CELL_255")
ADD_TEXT_COMPONENT_SUBSTRING_TEXT_LABEL (SignifierData[SIG_CONTACT1].SignifierPrimaryText)
END_TEXT_COMMAND_THEFEED_POST_MESSAGETEXT(s_TXD_Contact_decision, s_TXD_Contact_decision, FALSE, TEXT_ICON_NEW_CONTACT, "")
ENDIF
#if IS_DEBUG_BUILD
cdPrintnl()
cdPrintstring ("CELLPHONE_CONT - Created New Contact feed entry. ")
cdPrintint (g_Current_Number_of_Signifiers)
cdPrintnl ()
SWITCH g_Cellphone.PhoneOwner
CASE CHAR_MICHAEL
PRINTLN("Owner this frame is Michael - ")
BREAK
CASE CHAR_FRANKLIN
PRINTLN("Owner this frame is Franklin - ")
BREAK
CASE CHAR_TREVOR
PRINTLN("Owner this frame is Trevor - ")
BREAK
DEFAULT
PRINTLN("Owner this frame is MP - ")
BREAK
ENDSWITCH
PRINTSTRING("CELLPHONE_CONT Created new feed entry as this contact has been added for the current owner. New contact: ")
PRINTSTRING(GET_FILENAME_FOR_AUDIO_CONVERSATION(SignifierData[SIG_CONTACT1].SignifierPrimaryText))
PRINTNL()
#endif
CLEAR_BIT (BitSet_CellphoneDisplay, g_BS_DISPLAY_NEW_CONTACT_SIGNIFIER)
ENDPROC
//Wiki-ed.
//Adds a new contact to the phonebooks of each playable character. The new contact should be in the form CHAR_NAME from the character enumlist in charsheet_globals.sch
//Once added to a phonebook, the new contact will appear in the player's phone's contact list provided the character sheet has designated that the new character is allowed to
//be included in the contacts list.
//The full phonebooks enum is as follows:
// MICHAEL_BOOK, //0
// FRANKLIN_BOOK, //1
// TREVOR_BOOK, //2
//
// MULTIPLAYER_BOOK, //3
// ALL_OWNERS_BOOKS
//The third parameter takes in a bool which lets cellphone_controller.sc know if it should display a "new contact available" message. This defaults to true.
PROC ADD_CONTACT_TO_PHONEBOOK (enumCharacterList CharacterToAdd, enumPhonebookPresence WhichPhonebook, BOOL ShouldDisplayNewContactSignifier = TRUE)
g_Temp_ContactHeadshotRef = CharacterToAdd
//Check if the character passed is allowed to be added to the phonebook via reference to the character sheet.
IF g_CharacterSheetNonSaved[CharacterToAdd].phone <> NO_PHONE_CONTACT //may do fancier check for last characters of string so names can be matched explicitly. Safer that way.
Get_Cellphone_Owner()
IF WhichPhoneBook = ALL_OWNERS_BOOKS
#if USE_CLF_DLC
//Add contact as listed in all three characters books. Not done in 0 to 2 loop for ease of testing...
g_savedGlobalsClifford.sCharSheetData.g_CharacterSheet[CharacterToAdd].PhonebookState[0] = LISTED
g_savedGlobalsClifford.sCharSheetData.g_CharacterSheet[CharacterToAdd].PhonebookState[1] = LISTED
g_savedGlobalsClifford.sCharSheetData.g_CharacterSheet[CharacterToAdd].PhonebookState[2] = LISTED
g_savedGlobalsClifford.sCharSheetData.g_CharacterSheet[CharacterToAdd].StatusAsCaller[0] = KNOWN_CALLER
g_savedGlobalsClifford.sCharSheetData.g_CharacterSheet[CharacterToAdd].StatusAsCaller[1] = KNOWN_CALLER
g_savedGlobalsClifford.sCharSheetData.g_CharacterSheet[CharacterToAdd].StatusAsCaller[2] = KNOWN_CALLER
#endif
#if USE_NRM_DLC
//Add contact as listed in all three characters books. Not done in 0 to 2 loop for ease of testing...
g_savedGlobalsnorman.sCharSheetData.g_CharacterSheet[CharacterToAdd].PhonebookState[0] = LISTED
g_savedGlobalsnorman.sCharSheetData.g_CharacterSheet[CharacterToAdd].PhonebookState[1] = LISTED
g_savedGlobalsnorman.sCharSheetData.g_CharacterSheet[CharacterToAdd].PhonebookState[2] = LISTED
g_savedGlobalsnorman.sCharSheetData.g_CharacterSheet[CharacterToAdd].StatusAsCaller[0] = KNOWN_CALLER
g_savedGlobalsnorman.sCharSheetData.g_CharacterSheet[CharacterToAdd].StatusAsCaller[1] = KNOWN_CALLER
g_savedGlobalsnorman.sCharSheetData.g_CharacterSheet[CharacterToAdd].StatusAsCaller[2] = KNOWN_CALLER
#endif
#if not USE_SP_DLC
//Add contact as listed in all three characters books. Not done in 0 to 2 loop for ease of testing...
GLOBAL_CHARACTER_SHEET_SET_PHONEBOOK_STATE(CharacterToAdd, 0, LISTED)
GLOBAL_CHARACTER_SHEET_SET_PHONEBOOK_STATE(CharacterToAdd, 1, LISTED)
GLOBAL_CHARACTER_SHEET_SET_PHONEBOOK_STATE(CharacterToAdd, 2, LISTED)
GLOBAL_CHARACTER_SHEET_SET_STATUS_AS_CALLER(CharacterToAdd, 0, KNOWN_CALLER)
GLOBAL_CHARACTER_SHEET_SET_STATUS_AS_CALLER(CharacterToAdd, 1, KNOWN_CALLER)
GLOBAL_CHARACTER_SHEET_SET_STATUS_AS_CALLER(CharacterToAdd, 2, KNOWN_CALLER)
#endif
ELSE
//For bug 900228, if the contact has already been added then we will make sure that we don't display the new contact signifier in the feed entry.
#if USE_CLF_DLC
IF g_savedGlobalsClifford.sCharSheetData.g_CharacterSheet[CharacterToAdd].PhonebookState[ENUM_TO_INT(WhichPhonebook)] = LISTED
AND g_savedGlobalsClifford.sCharSheetData.g_CharacterSheet[CharacterToAdd].StatusAsCaller[ENUM_TO_INT(WhichPhonebook)] = KNOWN_CALLER
#if IS_DEBUG_BUILD
PRINTNL()
PRINTSTRING("CELLPHONE_PUB - t. Will not create feed entry for new contact as this contact has already been added as a known caller.")
PRINTNL()
#endif
#if USE_TU_CHANGES
ShouldDisplayNewContactSignifier = FALSE
#endif
ENDIF
g_savedGlobalsClifford.sCharSheetData.g_CharacterSheet[CharacterToAdd].PhonebookState[ENUM_TO_INT (WhichPhonebook)] = LISTED
g_savedGlobalsClifford.sCharSheetData.g_CharacterSheet[CharacterToAdd].StatusAsCaller[ENUM_TO_INT (WhichPhonebook)] = KNOWN_CALLER
#endif
#if USE_NRM_DLC
IF g_savedGlobalsnorman.sCharSheetData.g_CharacterSheet[CharacterToAdd].PhonebookState[ENUM_TO_INT(WhichPhonebook)] = LISTED
AND g_savedGlobalsnorman.sCharSheetData.g_CharacterSheet[CharacterToAdd].StatusAsCaller[ENUM_TO_INT(WhichPhonebook)] = KNOWN_CALLER
#if IS_DEBUG_BUILD
PRINTNL()
PRINTSTRING("CELLPHONE_PUB - t. Will not create feed entry for new contact as this contact has already been added as a known caller.")
PRINTNL()
#endif
#if USE_TU_CHANGES
ShouldDisplayNewContactSignifier = FALSE
#endif
ENDIF
g_savedGlobalsnorman.sCharSheetData.g_CharacterSheet[CharacterToAdd].PhonebookState[ENUM_TO_INT (WhichPhonebook)] = LISTED
g_savedGlobalsnorman.sCharSheetData.g_CharacterSheet[CharacterToAdd].StatusAsCaller[ENUM_TO_INT (WhichPhonebook)] = KNOWN_CALLER
#endif
#if not USE_SP_DLC
IF GLOBAL_CHARACTER_SHEET_GET_PHONEBOOK_STATE(CharacterToAdd, ENUM_TO_INT(WhichPhonebook)) = LISTED
AND GLOBAL_CHARACTER_SHEET_GET_STATUS_AS_CALLER(CharacterToAdd, ENUM_TO_INT(WhichPhonebook)) = KNOWN_CALLER
#if IS_DEBUG_BUILD
PRINTNL()
PRINTSTRING("CELLPHONE_PUB - t. Will not create feed entry for new contact as this contact has already been added as a known caller.")
PRINTNL()
#endif
#if USE_TU_CHANGES
ShouldDisplayNewContactSignifier = FALSE
#endif
ENDIF
INT iPhoneBookID = ENUM_TO_INT(WhichPhonebook)
GLOBAL_CHARACTER_SHEET_SET_PHONEBOOK_STATE(CharacterToAdd, iPhoneBookID, LISTED)
GLOBAL_CHARACTER_SHEET_SET_STATUS_AS_CALLER(CharacterToAdd, iPhoneBookID, KNOWN_CALLER)
#endif
#IF FEATURE_TUNER
IF CharacterToAdd = CHAR_SESSANTA
AND NOT MPGlobalsAmbience.bAddSessantaContactWithTicker
ShouldDisplayNewContactSignifier = FALSE
ENDIF
IF CharacterToAdd = CHAR_MOODYMANN
AND NOT MPGlobalsAmbience.bAddMoodymannContactWithTicker
ShouldDisplayNewContactSignifier = FALSE
ENDIF
IF CharacterToAdd = CHAR_KDJ
AND NOT MPGlobalsAmbience.bAddMoodymannContactWithTicker
ShouldDisplayNewContactSignifier = FALSE
ENDIF
#ENDIF
ENDIF
IF ShouldDisplayNewContactSignifier
//For bug 880374, we should also hold a buffer string of the contact for the chosen recipient player character
IF NOT g_bInMultiplayer // don't include this check in MP
IF WhichPhoneBook <> ALL_OWNERS_BOOKS
IF ENUM_TO_INT(g_Cellphone.PhoneOwner) <> ENUM_TO_INT(WhichPhoneBook)
#if USE_CLF_DLC
BufferedContactSignifierText[ENUM_TO_INT(WhichPhoneBook)] = g_savedGlobalsClifford.sCharSheetData.g_CharacterSheet[CharacterToAdd].label
#endif
#if USE_NRM_DLC
BufferedContactSignifierText[ENUM_TO_INT(WhichPhoneBook)] = g_savedGlobalsnorman.sCharSheetData.g_CharacterSheet[CharacterToAdd].label
#endif
#if not USE_SP_DLC
BufferedContactSignifierText[ENUM_TO_INT(WhichPhoneBook)] = GLOBAL_CHARACTER_SHEET_GET_LABEL(CharacterToAdd)
#endif
BufferedContactAvailable[ENUM_TO_INT(WhichPhoneBook)] = TRUE
BufferedHeadshotRef[ENUM_TO_INT(WhichPhoneBook)] = CharacterToAdd
#if IS_DEBUG_BUILD
PRINTNL()
PRINTSTRING("CELLPHONE_PUB - Will not create feed entry for new contact as phonebook owner is not under control. Adding this contact to buffer:")
PRINTNL()
#if USE_CLF_DLC
PRINTSTRING(GET_FILENAME_FOR_AUDIO_CONVERSATION(g_savedGlobalsClifford.sCharSheetData.g_CharacterSheet[CharacterToAdd].label))
#endif
#if USE_NRM_DLC
PRINTSTRING(GET_FILENAME_FOR_AUDIO_CONVERSATION(g_savedGlobalsnorman.sCharSheetData.g_CharacterSheet[CharacterToAdd].label))
#endif
#if not USE_SP_DLC
PRINTSTRING(GET_FILENAME_FOR_AUDIO_CONVERSATION(g_sCharacterSheetAll[CharacterToAdd].label))
#endif
PRINTNL()
PRINTSTRING("Phonebook to add to was ")
PRINTINT(ENUM_TO_INT(WhichPhoneBook))
PRINTSTRING(" but current owner is ")
PRINTINT(ENUM_TO_INT(g_Cellphone.PhoneOwner))
PRINTNL()
#endif
ELSE
IF CharacterToAdd = g_Cellphone.PhoneOwner
#if IS_DEBUG_BUILD
PRINTNL()
PRINTSTRING("CELLPHONE_PUB - Will not create feed entry for new contact as the following is the same character as the current player.")
PRINTNL()
#if USE_CLF_DLC
PRINTSTRING(GET_FILENAME_FOR_AUDIO_CONVERSATION(g_savedGlobalsClifford.sCharSheetData.g_CharacterSheet[CharacterToAdd].label))
#endif
#if USE_NRM_DLC
PRINTSTRING(GET_FILENAME_FOR_AUDIO_CONVERSATION(g_savedGlobalsnorman.sCharSheetData.g_CharacterSheet[CharacterToAdd].label))
#endif
#if not USE_SP_DLC
PRINTSTRING(GET_FILENAME_FOR_AUDIO_CONVERSATION(g_sCharacterSheetAll[CharacterToAdd].label))
#endif
PRINTNL()
PRINTSTRING("Phonebook to add to was ")
PRINTINT(ENUM_TO_INT(WhichPhoneBook))
PRINTSTRING(" and current owner is ")
PRINTINT(ENUM_TO_INT(g_Cellphone.PhoneOwner))
PRINTNL()
#endif
ELSE
#if USE_CLF_DLC
SignifierData[SIG_CONTACT1].SignifierPrimaryText = g_savedGlobalsClifford.sCharSheetData.g_CharacterSheet[CharacterToAdd].label
#endif
#if USE_NRM_DLC
SignifierData[SIG_CONTACT1].SignifierPrimaryText = g_savedGlobalsnorman.sCharSheetData.g_CharacterSheet[CharacterToAdd].label
#endif
#if not USE_SP_DLC
SignifierData[SIG_CONTACT1].SignifierPrimaryText = GLOBAL_CHARACTER_SHEET_GET_LABEL(CharacterToAdd)
#endif
SignifierData[SIG_CONTACT1].SignifierPhonebook = WhichPhonebook
Create_Contact_Feed_Entry_Immediately()
ENDIF
ENDIF
ELSE
#if IS_DEBUG_BUILD
PRINTNL()
PRINTSTRING("CELLPHONE_PUB - Contact added to ALL_OWNERS_BOOKS. Allowing feed entry creation.")
PRINTNL()
#endif
#if USE_CLF_DLC
SignifierData[SIG_CONTACT1].SignifierPrimaryText = g_savedGlobalsClifford.sCharSheetData.g_CharacterSheet[CharacterToAdd].label
#endif
#if USE_NRM_DLC
SignifierData[SIG_CONTACT1].SignifierPrimaryText = g_savedGlobalsnorman.sCharSheetData.g_CharacterSheet[CharacterToAdd].label
#endif
#if not USE_SP_DLC
SignifierData[SIG_CONTACT1].SignifierPrimaryText = GLOBAL_CHARACTER_SHEET_GET_LABEL(CharacterToAdd)
#endif
SignifierData[SIG_CONTACT1].SignifierPhonebook = WhichPhonebook
Create_Contact_Feed_Entry_Immediately()
ENDIF
ELSE
#if IS_DEBUG_BUILD
PRINTNL()
PRINTSTRING("CELLPHONE_PUB - Multiplayer contact added. Allowing feed entry creation.")
PRINTNL()
#endif
#if USE_CLF_DLC
SignifierData[SIG_CONTACT1].SignifierPrimaryText = g_savedGlobalsClifford.sCharSheetData.g_CharacterSheet[CharacterToAdd].label
#endif
#if USE_NRM_DLC
SignifierData[SIG_CONTACT1].SignifierPrimaryText = g_savedGlobalsnorman.sCharSheetData.g_CharacterSheet[CharacterToAdd].label
#endif
#if not USE_SP_DLC
SignifierData[SIG_CONTACT1].SignifierPrimaryText = GLOBAL_CHARACTER_SHEET_GET_LABEL(CharacterToAdd)
#endif
SignifierData[SIG_CONTACT1].SignifierPhonebook = WhichPhonebook
Create_Contact_Feed_Entry_Immediately()
ENDIF
ENDIF //end of ShouldDisplayNewContactSignifier signifier check.
#if IS_DEBUG_BUILD
PRINTLN("\nCELLPHONE_PUB - Add contact to phonebook called via [", GET_THIS_SCRIPT_NAME(), "] through public function.")
cdPrintnl()
PRINTLN("CELLPHONE_PUB - Adding known contact to phonebook: ")
#if USE_CLF_DLC
PRINTLN(g_savedGlobalsClifford.sCharSheetData.g_CharacterSheet[CharacterToAdd].label)
#endif
#if USE_NRM_DLC
PRINTLN(g_savedGlobalsnorman.sCharSheetData.g_CharacterSheet[CharacterToAdd].label)
#endif
#if not USE_SP_DLC
PRINTLN(Get_String_From_TextLabel(g_sCharacterSheetAll[CharacterToAdd].label))
#endif
cdPrintnl()
#endif
ELSE
#if IS_DEBUG_BUILD
SCRIPT_ASSERT ("This character should not be added as a phone contact. See Steve or Keith")
#endif
ENDIF
ENDPROC
#if USE_CLF_DLC
PROC ADD_UNKNOWN_CONTACT_TO_PHONEBOOK_CLF (enumCharacterList CharacterToAdd, enumPhonebookPresence WhichPhonebook, BOOL ShouldDisplayNewContactSignifier = FALSE)
//Check if the character passed is allowed to be added to the phonebook via reference to the character sheet.
IF g_CharacterSheetNonSaved[CharacterToAdd].phone <> NO_PHONE_CONTACT //may do fancier check for last characters of string so names can be matched explicitly. Safer that way.
IF WhichPhoneBook = ALL_OWNERS_BOOKS
//Add contact as listed in all three characters books. Not done in 0 to 2 loop for ease of testing...
g_savedGlobalsClifford.sCharSheetData.g_CharacterSheet[CharacterToAdd].PhonebookState[0] = LISTED
g_savedGlobalsClifford.sCharSheetData.g_CharacterSheet[CharacterToAdd].PhonebookState[1] = LISTED
g_savedGlobalsClifford.sCharSheetData.g_CharacterSheet[CharacterToAdd].PhonebookState[2] = LISTED
g_savedGlobalsClifford.sCharSheetData.g_CharacterSheet[CharacterToAdd].StatusAsCaller[0] = UNKNOWN_CALLER
g_savedGlobalsClifford.sCharSheetData.g_CharacterSheet[CharacterToAdd].StatusAsCaller[1] = UNKNOWN_CALLER
g_savedGlobalsClifford.sCharSheetData.g_CharacterSheet[CharacterToAdd].StatusAsCaller[2] = UNKNOWN_CALLER
ELSE
g_savedGlobalsClifford.sCharSheetData.g_CharacterSheet[CharacterToAdd].PhonebookState[ENUM_TO_INT (WhichPhonebook)] = LISTED
g_savedGlobalsClifford.sCharSheetData.g_CharacterSheet[CharacterToAdd].StatusAsCaller[ENUM_TO_INT (WhichPhonebook)] = UNKNOWN_CALLER
ENDIF
IF ShouldDisplayNewContactSignifier
SignifierData[SIG_CONTACT1].SignifierPrimaryText = g_savedGlobalsClifford.sCharSheetData.g_CharacterSheet[CharacterToAdd].label
SignifierData[SIG_CONTACT1].SignifierPhonebook = WhichPhonebook
//SignifierData[SIG_CONTACT1].SignifierCharacter = CharacterToAdd
SET_BIT (BitSet_CellphoneDisplay, g_BS_DISPLAY_NEW_CONTACT_SIGNIFIER)
ENDIF
ELSE
#if IS_DEBUG_BUILD
SCRIPT_ASSERT ("This character should not be added as a phone contact. See Steve or Keith")
#endif
ENDIF
ENDPROC
#endif
#if USE_NRM_DLC
PROC ADD_UNKNOWN_CONTACT_TO_PHONEBOOK_NRM (enumCharacterList CharacterToAdd, enumPhonebookPresence WhichPhonebook, BOOL ShouldDisplayNewContactSignifier = FALSE)
//Check if the character passed is allowed to be added to the phonebook via reference to the character sheet.
IF g_CharacterSheetNonSaved[CharacterToAdd].phone <> NO_PHONE_CONTACT //may do fancier check for last characters of string so names can be matched explicitly. Safer that way.
IF WhichPhoneBook = ALL_OWNERS_BOOKS
//Add contact as listed in all three characters books. Not done in 0 to 2 loop for ease of testing...
g_savedGlobalsnorman.sCharSheetData.g_CharacterSheet[CharacterToAdd].PhonebookState[0] = LISTED
g_savedGlobalsnorman.sCharSheetData.g_CharacterSheet[CharacterToAdd].PhonebookState[1] = LISTED
g_savedGlobalsnorman.sCharSheetData.g_CharacterSheet[CharacterToAdd].PhonebookState[2] = LISTED
g_savedGlobalsnorman.sCharSheetData.g_CharacterSheet[CharacterToAdd].StatusAsCaller[0] = UNKNOWN_CALLER
g_savedGlobalsnorman.sCharSheetData.g_CharacterSheet[CharacterToAdd].StatusAsCaller[1] = UNKNOWN_CALLER
g_savedGlobalsnorman.sCharSheetData.g_CharacterSheet[CharacterToAdd].StatusAsCaller[2] = UNKNOWN_CALLER
ELSE
g_savedGlobalsnorman.sCharSheetData.g_CharacterSheet[CharacterToAdd].PhonebookState[ENUM_TO_INT (WhichPhonebook)] = LISTED
g_savedGlobalsnorman.sCharSheetData.g_CharacterSheet[CharacterToAdd].StatusAsCaller[ENUM_TO_INT (WhichPhonebook)] = UNKNOWN_CALLER
ENDIF
IF ShouldDisplayNewContactSignifier
SignifierData[SIG_CONTACT1].SignifierPrimaryText = g_savedGlobalsnorman.sCharSheetData.g_CharacterSheet[CharacterToAdd].label
SignifierData[SIG_CONTACT1].SignifierPhonebook = WhichPhonebook
//SignifierData[SIG_CONTACT1].SignifierCharacter = CharacterToAdd
SET_BIT (BitSet_CellphoneDisplay, g_BS_DISPLAY_NEW_CONTACT_SIGNIFIER)
ENDIF
ELSE
#if IS_DEBUG_BUILD
SCRIPT_ASSERT ("This character should not be added as a phone contact. See Steve or Keith")
#endif
ENDIF
ENDPROC
#endif
PROC ADD_UNKNOWN_CONTACT_TO_PHONEBOOK (enumCharacterList CharacterToAdd, enumPhonebookPresence WhichPhonebook, BOOL ShouldDisplayNewContactSignifier = FALSE)
#if USE_CLF_DLC
ADD_UNKNOWN_CONTACT_TO_PHONEBOOK_CLF(CharacterToAdd,WhichPhonebook,ShouldDisplayNewContactSignifier)
#endif
#if USE_NRM_DLC
ADD_UNKNOWN_CONTACT_TO_PHONEBOOK_NRM(CharacterToAdd,WhichPhonebook,ShouldDisplayNewContactSignifier)
#endif
#if not USE_SP_DLC
//Check if the character passed is allowed to be added to the phonebook via reference to the character sheet.
IF g_CharacterSheetNonSaved[CharacterToAdd].phone <> NO_PHONE_CONTACT //may do fancier check for last characters of string so names can be matched explicitly. Safer that way.
IF WhichPhoneBook = ALL_OWNERS_BOOKS
//Add contact as listed in all three characters books. Not done in 0 to 2 loop for ease of testing...
GLOBAL_CHARACTER_SHEET_SET_PHONEBOOK_STATE(CharacterToAdd, 0, LISTED)
GLOBAL_CHARACTER_SHEET_SET_PHONEBOOK_STATE(CharacterToAdd, 1, LISTED)
GLOBAL_CHARACTER_SHEET_SET_PHONEBOOK_STATE(CharacterToAdd, 2, LISTED)
GLOBAL_CHARACTER_SHEET_SET_STATUS_AS_CALLER(CharacterToAdd, 0, UNKNOWN_CALLER)
GLOBAL_CHARACTER_SHEET_SET_STATUS_AS_CALLER(CharacterToAdd, 1, UNKNOWN_CALLER)
GLOBAL_CHARACTER_SHEET_SET_STATUS_AS_CALLER(CharacterToAdd, 2, UNKNOWN_CALLER)
ELSE
GLOBAL_CHARACTER_SHEET_SET_PHONEBOOK_STATE(CharacterToAdd, ENUM_TO_INT (WhichPhonebook), LISTED)
GLOBAL_CHARACTER_SHEET_SET_STATUS_AS_CALLER(CharacterToAdd, ENUM_TO_INT (WhichPhonebook), UNKNOWN_CALLER)
ENDIF
IF ShouldDisplayNewContactSignifier
SignifierData[SIG_CONTACT1].SignifierPrimaryText = GLOBAL_CHARACTER_SHEET_GET_LABEL(CharacterToAdd)
SignifierData[SIG_CONTACT1].SignifierPhonebook = WhichPhonebook
//SignifierData[SIG_CONTACT1].SignifierCharacter = CharacterToAdd
SET_BIT (BitSet_CellphoneDisplay, g_BS_DISPLAY_NEW_CONTACT_SIGNIFIER)
ENDIF
ELSE
#if IS_DEBUG_BUILD
SCRIPT_ASSERT ("This character should not be added as a phone contact. See Steve or Keith")
#endif
ENDIF
#endif
ENDPROC
//Will maybe need to implement ADD_ADDITIONAL_CONTACT_TO_PHONEBOOK() post December deadline so as to facilitate adding two contacts at once.
//Wiki-ed.
//Removes a contact from all playable characters phonebooks.
PROC REMOVE_CONTACT_FROM_ALL_PHONEBOOKS (enumCharacterList CharacterToRemove)
//Check if the character passed is allowed to be added to the phonebook via reference to the character sheet.
IF g_CharacterSheetNonSaved[CharacterToRemove].phone <> NO_PHONE_CONTACT //may do fancier check for last characters of string so names can be matched explicitly. Safer that way.
#if USE_CLF_DLC
//Revert contact to not listed in all three characters books.
g_savedGlobalsClifford.sCharSheetData.g_CharacterSheet[CharacterToRemove].PhonebookState[0] = NOT_LISTED //Michael
g_savedGlobalsClifford.sCharSheetData.g_CharacterSheet[CharacterToRemove].PhonebookState[1] = NOT_LISTED //Franklin
g_savedGlobalsClifford.sCharSheetData.g_CharacterSheet[CharacterToRemove].PhonebookState[2] = NOT_LISTED //Trevor
g_savedGlobalsClifford.sCharSheetData.g_CharacterSheet[CharacterToRemove].StatusAsCaller[0] = UNKNOWN_CALLER
g_savedGlobalsClifford.sCharSheetData.g_CharacterSheet[CharacterToRemove].StatusAsCaller[1] = UNKNOWN_CALLER
g_savedGlobalsClifford.sCharSheetData.g_CharacterSheet[CharacterToRemove].StatusAsCaller[2] = UNKNOWN_CALLER
#if IS_DEBUG_BUILD
PRINTLN("\nCELLPHONE_PUB - Remove Contact from all phonebooks function called by [", GET_THIS_SCRIPT_NAME(), "] through public function.")
cdPrintnl()
cdPrintstring ("CELLPHONE_PUB - Removed contact from all phonebooks: ")
cdPrintstring(g_savedGlobalsClifford.sCharSheetData.g_CharacterSheet[CharacterToRemove].label)
cdPrintnl()
#endif
#endif
#if USE_NRM_DLC
//Revert contact to not listed in all three characters books.
g_savedGlobalsnorman.sCharSheetData.g_CharacterSheet[CharacterToRemove].PhonebookState[0] = NOT_LISTED //Michael
g_savedGlobalsnorman.sCharSheetData.g_CharacterSheet[CharacterToRemove].PhonebookState[1] = NOT_LISTED //Franklin
g_savedGlobalsnorman.sCharSheetData.g_CharacterSheet[CharacterToRemove].PhonebookState[2] = NOT_LISTED //Trevor
g_savedGlobalsnorman.sCharSheetData.g_CharacterSheet[CharacterToRemove].StatusAsCaller[0] = UNKNOWN_CALLER
g_savedGlobalsnorman.sCharSheetData.g_CharacterSheet[CharacterToRemove].StatusAsCaller[1] = UNKNOWN_CALLER
g_savedGlobalsnorman.sCharSheetData.g_CharacterSheet[CharacterToRemove].StatusAsCaller[2] = UNKNOWN_CALLER
#if IS_DEBUG_BUILD
PRINTLN("\nCELLPHONE_PUB - Remove Contact from all phonebooks function called by [", GET_THIS_SCRIPT_NAME(), "] through public function.")
cdPrintnl()
cdPrintstring ("CELLPHONE_PUB - Removed contact from all phonebooks: ")
cdPrintstring(g_savedGlobalsnorman.sCharSheetData.g_CharacterSheet[CharacterToRemove].label)
cdPrintnl()
#endif
#endif
#if not USE_SP_DLC
//Revert contact to not listed in all three characters books.
GLOBAL_CHARACTER_SHEET_SET_PHONEBOOK_STATE(CharacterToRemove, 0, NOT_LISTED)
GLOBAL_CHARACTER_SHEET_SET_PHONEBOOK_STATE(CharacterToRemove, 1, NOT_LISTED)
GLOBAL_CHARACTER_SHEET_SET_PHONEBOOK_STATE(CharacterToRemove, 2, NOT_LISTED)
GLOBAL_CHARACTER_SHEET_SET_STATUS_AS_CALLER(CharacterToRemove, 0, UNKNOWN_CALLER)
GLOBAL_CHARACTER_SHEET_SET_STATUS_AS_CALLER(CharacterToRemove, 1, UNKNOWN_CALLER)
GLOBAL_CHARACTER_SHEET_SET_STATUS_AS_CALLER(CharacterToRemove, 2, UNKNOWN_CALLER)
#if IS_DEBUG_BUILD
PRINTLN("\nCELLPHONE_PUB - Remove Contact from all phonebooks function called by [", GET_THIS_SCRIPT_NAME(), "] through public function.")
cdPrintnl()
cdPrintstring ("CELLPHONE_PUB - Removed contact from all phonebooks: ")
cdPrintstring(g_sCharacterSheetAll[CharacterToRemove].label)
cdPrintnl()
#endif
#endif
ELSE
#if IS_DEBUG_BUILD
SCRIPT_ASSERT ("This character is not a phone contact. See Steve or Keith")
#endif
ENDIF
ENDPROC
PROC REMOVE_CONTACT_FROM_INDIVIDUAL_PHONEBOOK (enumCharacterList CharacterToRemove, enumPhoneBookPresence WhichPhoneBook)
IF g_CharacterSheetNonSaved[CharacterToRemove].phone <> NO_PHONE_CONTACT
IF ENUM_TO_INT (WhichPhoneBook) > 3 //i.e not Michael, Franklin or Trevor or MP has been passed
#if IS_DEBUG_BUILD
SCRIPT_ASSERT ("You must pass in Michael, Franklin or Trevor book when removing contact from individual phonebook.")
#endif
ELSE
#if USE_CLF_DLC
g_savedGlobalsClifford.sCharSheetData.g_CharacterSheet[CharacterToRemove].PhonebookState[ENUM_TO_INT (WhichPhonebook)] = NOT_LISTED
g_savedGlobalsClifford.sCharSheetData.g_CharacterSheet[CharacterToRemove].StatusAsCaller[ENUM_TO_INT (WhichPhonebook)] = UNKNOWN_CALLER
#if IS_DEBUG_BUILD
cdPrintnl()
cdPrintstring ("CELLPHONE_PUB - Removed contact from individual phonebook: ")
cdPrintstring(g_savedGlobalsClifford.sCharSheetData.g_CharacterSheet[CharacterToRemove].label)
cdPrintnl()
#endif
#endif
#if USE_NRM_DLC
g_savedGlobalsnorman.sCharSheetData.g_CharacterSheet[CharacterToRemove].PhonebookState[ENUM_TO_INT (WhichPhonebook)] = NOT_LISTED
g_savedGlobalsnorman.sCharSheetData.g_CharacterSheet[CharacterToRemove].StatusAsCaller[ENUM_TO_INT (WhichPhonebook)] = UNKNOWN_CALLER
#if IS_DEBUG_BUILD
cdPrintnl()
cdPrintstring ("CELLPHONE_PUB - Removed contact from individual phonebook: ")
cdPrintstring(g_savedGlobalsnorman.sCharSheetData.g_CharacterSheet[CharacterToRemove].label)
cdPrintnl()
#endif
#endif
#if not USE_SP_DLC
INT iPhoneBookID = ENUM_TO_INT (WhichPhonebook)
GLOBAL_CHARACTER_SHEET_SET_PHONEBOOK_STATE(CharacterToRemove, iPhoneBookID, NOT_LISTED)
GLOBAL_CHARACTER_SHEET_SET_STATUS_AS_CALLER(CharacterToRemove, iPhoneBookID, UNKNOWN_CALLER)
#if IS_DEBUG_BUILD
cdPrintnl()
cdPrintstring ("CELLPHONE_PUB - Removed contact from individual phonebook: ")
TEXT_LABEL tlLabel = GLOBAL_CHARACTER_SHEET_GET_LABEL(CharacterToRemove)
STRING strLabel = Get_String_From_TextLabel(tlLabel)
cdPrintstring(strLabel)
cdPrintnl()
#endif
#endif
ENDIF
ELSE
#IF IS_DEBUG_BUILD
SCRIPT_ASSERT ("CELLPHONE_PUB - This character is not a phone contact. See Steve or Keith")
#endif
ENDIF
ENDPROC
//Wiki-ed.
//This will force the contact passed in to have his name appear first in the phonebook contact list, regardless of alphabetical order.
//It is possible to make several contacts "priority" names. They will appear in the order that they have been called.
PROC MAKE_CONTACT_ENTRY_PRIORITY (enumCharacterList CharToForce)
IF g_CharacterSheetNonSaved[CharToForce].phone <> NO_PHONE_CONTACT
#if USE_CLF_DLC
g_savedGlobalsClifford.sCharSheetData.g_CharacterSheet[CharToForce].alphaInt = 1 //Set this character to be first in the contacts list by setting their alphabetical sort int to 1, the lowest value.
#endif
#if USE_NRM_DLC
g_savedGlobalsnorman.sCharSheetData.g_CharacterSheet[CharToForce].alphaInt = 1 //Set this character to be first in the contacts list by setting their alphabetical sort int to 1, the lowest value.
#endif
#if not USE_SP_DLC
GLOBAL_CHARACTER_SHEET_SET_ORIGINAL_ALPHA_INT(CharToForce, 1) //Set this character to be first in the contacts list by setting their alphabetical sort int to 1, the lowest value.
#endif
ELSE
#IF IS_DEBUG_BUILD
SCRIPT_ASSERT ("CELLPHONE_PUB - This character is not a phone contact. See Steve or Keith")
#endif
ENDIF
ENDPROC
//Wiki-ed.
//This will make sure that the contact name passed in will appear in natural alphabetical order within the phonebook contact list. Call this to return any
//names that were made a priority for the duration of a particular mission back to normal.
PROC MAKE_CONTACT_ENTRY_ALPHA (enumCharacterList CharToForce)
IF g_CharacterSheetNonSaved[CharToForce].phone <> NO_PHONE_CONTACT
#if USE_CLF_DLC
g_savedGlobalsClifford.sCharSheetData.g_CharacterSheet[CharToForce].alphaInt = g_savedGlobalsClifford.sCharSheetData.g_CharacterSheet[CharToForce].original_alphaInt //Set this character's alpha int back to its' original value.
#endif
#if USE_NRM_DLC
g_savedGlobalsnorman.sCharSheetData.g_CharacterSheet[CharToForce].alphaInt = g_savedGlobalsnorman.sCharSheetData.g_CharacterSheet[CharToForce].original_alphaInt //Set this character's alpha int back to its' original value.
#endif
#if not USE_SP_DLC
GLOBAL_CHARACTER_SHEET_SET_ALPHA_INT(CharToForce, GLOBAL_CHARACTER_SHEET_GET_ORIGINAL_ALPHA_INT(CharToForce))
#endif
ELSE
#if IS_DEBUG_BUILD
SCRIPT_ASSERT ("CELLPHONE_PUB - This character is not a phone contact. See Steve or Keith")
#endif
ENDIF
ENDPROC
//Wiki-ed
//This procedure will remove all contacts from all three player characters' phonebooks. Should only be used by the flow!
PROC REMOVE_ALL_CONTACTS_FROM_ALL_PLAYER_CHARACTERS_PHONEBOOKS()
INT cs_index
#if USE_CLF_DLC
REPEAT MAX_CLF_CHARACTERS cs_index
IF NOT (g_savedGlobalsClifford.sCharSheetData.g_CharacterSheet[cs_index].PhonebookState[0] = SPECIAL_NUMBERS)
//Make sure special numbers like 911 are not removed. Only need to check first character. Special numbers are uniform across all player characters.
g_savedGlobalsClifford.sCharSheetData.g_CharacterSheet[cs_index].PhonebookState[0] = NOT_LISTED
g_savedGlobalsClifford.sCharSheetData.g_CharacterSheet[cs_index].PhonebookState[1] = NOT_LISTED
g_savedGlobalsClifford.sCharSheetData.g_CharacterSheet[cs_index].PhonebookState[2] = NOT_LISTED
g_savedGlobalsClifford.sCharSheetData.g_CharacterSheet[cs_index].StatusAsCaller[0] = UNKNOWN_CALLER
g_savedGlobalsClifford.sCharSheetData.g_CharacterSheet[cs_index].StatusAsCaller[1] = UNKNOWN_CALLER
g_savedGlobalsClifford.sCharSheetData.g_CharacterSheet[cs_index].StatusAsCaller[2] = UNKNOWN_CALLER
g_savedGlobalsClifford.sCharSheetData.g_CharacterSheet[cs_index].MissedCallStatus[0] = NO_MISSED_CALL
g_savedGlobalsClifford.sCharSheetData.g_CharacterSheet[cs_index].MissedCallStatus[1] = NO_MISSED_CALL
g_savedGlobalsClifford.sCharSheetData.g_CharacterSheet[cs_index].MissedCallStatus[2] = NO_MISSED_CALL
ENDIF
ENDREPEAT
#endif
#if USE_NRM_DLC
REPEAT MAX_NRM_CHARACTERS cs_index
IF NOT (g_savedGlobalsnorman.sCharSheetData.g_CharacterSheet[cs_index].PhonebookState[0] = SPECIAL_NUMBERS)
//Make sure special numbers like 911 are not removed. Only need to check first character. Special numbers are uniform across all player characters.
g_savedGlobalsnorman.sCharSheetData.g_CharacterSheet[cs_index].PhonebookState[0] = NOT_LISTED
g_savedGlobalsnorman.sCharSheetData.g_CharacterSheet[cs_index].PhonebookState[1] = NOT_LISTED
g_savedGlobalsnorman.sCharSheetData.g_CharacterSheet[cs_index].PhonebookState[2] = NOT_LISTED
g_savedGlobalsnorman.sCharSheetData.g_CharacterSheet[cs_index].StatusAsCaller[0] = UNKNOWN_CALLER
g_savedGlobalsnorman.sCharSheetData.g_CharacterSheet[cs_index].StatusAsCaller[1] = UNKNOWN_CALLER
g_savedGlobalsnorman.sCharSheetData.g_CharacterSheet[cs_index].StatusAsCaller[2] = UNKNOWN_CALLER
g_savedGlobalsnorman.sCharSheetData.g_CharacterSheet[cs_index].MissedCallStatus[0] = NO_MISSED_CALL
g_savedGlobalsnorman.sCharSheetData.g_CharacterSheet[cs_index].MissedCallStatus[1] = NO_MISSED_CALL
g_savedGlobalsnorman.sCharSheetData.g_CharacterSheet[cs_index].MissedCallStatus[2] = NO_MISSED_CALL
ENDIF
ENDREPEAT
#endif
#if not USE_SP_DLC
INT iMaxCharacter = ENUM_TO_INT(GLOBAL_CHARACTER_SHEET_GET_MAX_CHARACTERS_FOR_GAMEMODE())
REPEAT iMaxCharacter cs_index
enumCharacterList eCharacter = INT_TO_ENUM(enumCharacterList, cs_index)
IF NOT (GLOBAL_CHARACTER_SHEET_GET_PHONEBOOK_STATE(eCharacter, 0) = SPECIAL_NUMBERS)
//Make sure special numbers like 911 are not removed. Only need to check first character. Special numbers are uniform across all player characters.
GLOBAL_CHARACTER_SHEET_SET_PHONEBOOK_STATE(eCharacter, 0, NOT_LISTED)
GLOBAL_CHARACTER_SHEET_SET_PHONEBOOK_STATE(eCharacter, 1, NOT_LISTED)
GLOBAL_CHARACTER_SHEET_SET_PHONEBOOK_STATE(eCharacter, 2, NOT_LISTED)
GLOBAL_CHARACTER_SHEET_SET_STATUS_AS_CALLER(eCharacter, 0, UNKNOWN_CALLER)
GLOBAL_CHARACTER_SHEET_SET_STATUS_AS_CALLER(eCharacter, 1, UNKNOWN_CALLER)
GLOBAL_CHARACTER_SHEET_SET_STATUS_AS_CALLER(eCharacter, 2, UNKNOWN_CALLER)
GLOBAL_CHARACTER_SHEET_SET_MISSED_CALL_STATUS(eCharacter, 0, NO_MISSED_CALL)
GLOBAL_CHARACTER_SHEET_SET_MISSED_CALL_STATUS(eCharacter, 1, NO_MISSED_CALL)
GLOBAL_CHARACTER_SHEET_SET_MISSED_CALL_STATUS(eCharacter, 2, NO_MISSED_CALL)
ENDIF
ENDREPEAT
#endif
#IF IS_DEBUG_BUILD
cdPrintstring ("CELLPHONE_PUB - Removing all contacts from all singleplayer phonebooks via public function!")
cdPrintnl()
#endif
ENDPROC
PROC REMOVE_ALL_CONTACTS_FROM_MULTIPLAYER_PHONEBOOKS()
INT cs_index
REPEAT MAX_CHARACTERS_MP cs_index
IF NOT (GLOBAL_CHARACTER_SHEET_GET_PHONEBOOK_STATE(INT_TO_ENUM(enumCharacterList, cs_index), 3) = SPECIAL_NUMBERS)
//Make sure special numbers like 911 are not removed. Only need to check first character.
GLOBAL_CHARACTER_SHEET_SET_PHONEBOOK_STATE(INT_TO_ENUM(enumCharacterList, cs_index), 3, NOT_LISTED)
GLOBAL_CHARACTER_SHEET_SET_STATUS_AS_CALLER(INT_TO_ENUM(enumCharacterList, cs_index), 3, UNKNOWN_CALLER)
GLOBAL_CHARACTER_SHEET_SET_MISSED_CALL_STATUS(INT_TO_ENUM(enumCharacterList, cs_index), 3, NO_MISSED_CALL)
ENDIF
ENDREPEAT
#if IS_DEBUG_BUILD
cdPrintstring ("CELLPHONE_PUB - Removing all contacts from multiplayer phonebooks via public function!")
cdPrintnl()
#endif
ENDPROC
//Wiki-ed
//This procedure adds all characters, whether they are a phone contact or not, to all three player characters' phonebooks.
//This should be used in a debug capacity only.
//Remember to comment in ADD_ALL_CHARS_TO_ALL_PLAYER_CHARACTERS_PHONEBOOKS() WAIT (0) in appContacts.
#if IS_DEBUG_BUILD
#if USE_CLF_DLC
PROC ADD_ALL_CHARS_TO_ALL_PLAYER_CHARACTERS_PHONEBOOKSCLF()
INT cs_index
REPEAT MAX_CLF_CHARACTERS cs_index
IF cs_index <> ENUM_TO_INT(CHAR_CLF_CHAT_CALL)
OR cs_index <> ENUM_TO_INT(CHAR_CLF_AMMUNATION)
//Add contact as listed in all three characters books.
g_savedGlobalsClifford.sCharSheetData.g_CharacterSheet[cs_index].PhonebookState[0] = LISTED
g_savedGlobalsClifford.sCharSheetData.g_CharacterSheet[cs_index].PhonebookState[1] = LISTED
g_savedGlobalsClifford.sCharSheetData.g_CharacterSheet[cs_index].PhonebookState[2] = LISTED
g_savedGlobalsClifford.sCharSheetData.g_CharacterSheet[cs_index].StatusAsCaller[0] = KNOWN_CALLER
g_savedGlobalsClifford.sCharSheetData.g_CharacterSheet[cs_index].StatusAsCaller[1] = KNOWN_CALLER
g_savedGlobalsClifford.sCharSheetData.g_CharacterSheet[cs_index].StatusAsCaller[2] = KNOWN_CALLER
ENDIF
ENDREPEAT
#if IS_DEBUG_BUILD
cdPrintstring ("CELLPHONE_PUB - Adding all characters to all singleplayer phonebooks via public function!")
cdPrintnl()
#endif
ENDPROC
#endif
#if USE_NRM_DLC
PROC ADD_ALL_CHARS_TO_ALL_PLAYER_CHARACTERS_PHONEBOOKSNRM()
INT cs_index
REPEAT MAX_NRM_CHARACTERS cs_index
IF cs_index <> ENUM_TO_INT(CHAR_NRM_CHAT_CALL)
OR cs_index <> ENUM_TO_INT(CHAR_NRM_AMMUNATION)
//Add contact as listed in all three characters books.
g_savedGlobalsnorman.sCharSheetData.g_CharacterSheet[cs_index].PhonebookState[0] = LISTED
g_savedGlobalsnorman.sCharSheetData.g_CharacterSheet[cs_index].PhonebookState[1] = LISTED
g_savedGlobalsnorman.sCharSheetData.g_CharacterSheet[cs_index].PhonebookState[2] = LISTED
g_savedGlobalsnorman.sCharSheetData.g_CharacterSheet[cs_index].StatusAsCaller[0] = KNOWN_CALLER
g_savedGlobalsnorman.sCharSheetData.g_CharacterSheet[cs_index].StatusAsCaller[1] = KNOWN_CALLER
g_savedGlobalsnorman.sCharSheetData.g_CharacterSheet[cs_index].StatusAsCaller[2] = KNOWN_CALLER
ENDIF
ENDREPEAT
#if IS_DEBUG_BUILD
cdPrintstring ("CELLPHONE_PUB - Adding all characters to all singleplayer phonebooks via public function!")
cdPrintnl()
#endif
ENDPROC
#endif
PROC ADD_ALL_CHARS_TO_ALL_PLAYER_CHARACTERS_PHONEBOOKS()
#if USE_CLF_DLC
ADD_ALL_CHARS_TO_ALL_PLAYER_CHARACTERS_PHONEBOOKSCLF()
exit
#endif
#if USE_NRM_DLC
ADD_ALL_CHARS_TO_ALL_PLAYER_CHARACTERS_PHONEBOOKSNRM()
exit
#endif
#if not USE_SP_DLC
INT cs_index
INT iMaxCharacter = ENUM_TO_INT(GLOBAL_CHARACTER_SHEET_GET_MAX_CHARACTERS_FOR_GAMEMODE())
REPEAT iMaxCharacter cs_index
IF cs_index <> ENUM_TO_INT(CHAR_CHAT_CALL)
OR cs_index <> ENUM_TO_INT(CHAR_AMMUNATION)
//Add contact as listed in all three characters books.
GLOBAL_CHARACTER_SHEET_SET_PHONEBOOK_STATE(cs_index, 0, LISTED)
GLOBAL_CHARACTER_SHEET_SET_PHONEBOOK_STATE(cs_index, 1, LISTED)
GLOBAL_CHARACTER_SHEET_SET_PHONEBOOK_STATE(cs_index, 2, LISTED)
GLOBAL_CHARACTER_SHEET_SET_STATUS_AS_CALLER(cs_index, 0, KNOWN_CALLER)
GLOBAL_CHARACTER_SHEET_SET_STATUS_AS_CALLER(cs_index, 1, KNOWN_CALLER)
GLOBAL_CHARACTER_SHEET_SET_STATUS_AS_CALLER(cs_index, 2, KNOWN_CALLER)
ENDIF
ENDREPEAT
#if IS_DEBUG_BUILD
cdPrintstring ("CELLPHONE_PUB - Adding all characters to all singleplayer phonebooks via public function!")
cdPrintnl()
#endif
#endif
ENDPROC
#endif //debug
#if USE_CLF_DLC
FUNC BOOL IS_CONTACT_IN_PHONEBOOK_CLF (enumCharacterList CharacterToAdd, enumPhonebookPresence WhichPhonebook)
IF g_savedGlobalsClifford.sCharSheetData.g_CharacterSheet[ENUM_TO_INT(CharacterToAdd)].PhonebookState[ENUM_TO_INT(WhichPhonebook)] = LISTED
#if IS_DEBUG_BUILD
IF g_DumpDisableEveryFrameCaller
PRINTNL()
PRINTLN("\nCELLPHONE_PUB - IS_CONTACT_IN_PHONEBOOK called by [", GET_THIS_SCRIPT_NAME(), "] through public function.")
cdPrintstring ("CELLPHONE_PUB - IS_CONTACT_IN_PHONEBOOK returns TRUE.")
cdPrintnl()
ENDIF
#endif
RETURN TRUE
ELSE
#if IS_DEBUG_BUILD
IF g_DumpDisableEveryFrameCaller
PRINTNL()
PRINTLN("\nCELLPHONE_PUB - IS_CONTACT_IN_PHONEBOOK called by [", GET_THIS_SCRIPT_NAME(), "] through public function.")
cdPrintstring ("CELLPHONE_PUB - IS_CONTACT_IN_PHONEBOOK returns FALSE.")
cdPrintnl()
ENDIF
#endif
RETURN FALSE
ENDIF
endfunc
#endif
#if USE_NRM_DLC
FUNC BOOL IS_CONTACT_IN_PHONEBOOK_NRM (enumCharacterList CharacterToAdd, enumPhonebookPresence WhichPhonebook)
IF g_savedGlobalsnorman.sCharSheetData.g_CharacterSheet[ENUM_TO_INT(CharacterToAdd)].PhonebookState[ENUM_TO_INT(WhichPhonebook)] = LISTED
#if IS_DEBUG_BUILD
IF g_DumpDisableEveryFrameCaller
PRINTNL()
PRINTLN("\nCELLPHONE_PUB - IS_CONTACT_IN_PHONEBOOK called by [", GET_THIS_SCRIPT_NAME(), "] through public function.")
cdPrintstring ("CELLPHONE_PUB - IS_CONTACT_IN_PHONEBOOK returns TRUE.")
cdPrintnl()
ENDIF
#endif
RETURN TRUE
ELSE
#if IS_DEBUG_BUILD
IF g_DumpDisableEveryFrameCaller
PRINTNL()
PRINTLN("\nCELLPHONE_PUB - IS_CONTACT_IN_PHONEBOOK called by [", GET_THIS_SCRIPT_NAME(), "] through public function.")
cdPrintstring ("CELLPHONE_PUB - IS_CONTACT_IN_PHONEBOOK returns FALSE.")
cdPrintnl()
ENDIF
#endif
RETURN FALSE
ENDIF
endfunc
#endif
FUNC BOOL IS_CONTACT_IN_PHONEBOOK (enumCharacterList CharacterToAdd, enumPhonebookPresence WhichPhonebook)
#if USE_CLF_DLC
return IS_CONTACT_IN_PHONEBOOK_CLF(CharacterToAdd,WhichPhonebook)
#endif
#if USE_NRM_DLC
return IS_CONTACT_IN_PHONEBOOK_NRM(CharacterToAdd,WhichPhonebook)
#endif
#if not USE_SP_DLC
IF GLOBAL_CHARACTER_SHEET_GET_PHONEBOOK_STATE(CharacterToAdd, ENUM_TO_INT(WhichPhonebook)) = LISTED
#if IS_DEBUG_BUILD
IF g_DumpDisableEveryFrameCaller
PRINTNL()
PRINTLN("\nCELLPHONE_PUB - IS_CONTACT_IN_PHONEBOOK called by [", GET_THIS_SCRIPT_NAME(), "] through public function.")
cdPrintstring ("CELLPHONE_PUB - IS_CONTACT_IN_PHONEBOOK returns TRUE.")
cdPrintnl()
ENDIF
#endif
RETURN TRUE
ELSE
#if IS_DEBUG_BUILD
IF g_DumpDisableEveryFrameCaller
PRINTNL()
PRINTLN("\nCELLPHONE_PUB - IS_CONTACT_IN_PHONEBOOK called by [", GET_THIS_SCRIPT_NAME(), "] through public function.")
cdPrintstring ("CELLPHONE_PUB - IS_CONTACT_IN_PHONEBOOK returns FALSE.")
cdPrintnl()
ENDIF
#endif
RETURN FALSE
ENDIF
#endif
ENDFUNC
//Wiki-ed.
//Checks if the current player character is attempting to make a call to the character passed in and should be used for triggering phone calls from scripts.
//This will return true in the following circumstances:
// - waiting for the contact to answer.
// - whilst the contact's phone returns an engaged tone.
//Will return false if:
// - the player isn't attempting to call the contact
// - the contact is already in a phone conversation or relaying an answerphone messagee to the player, i.e the call is already connected.
//See also IS_CONTACT_IN_CONNECTED_CALL
FUNC BOOL IS_CALLING_CONTACT (enumCharacterList CharacterToCheck)
IF g_b_Is_This_An_Activity_Call
OR g_b_Is_This_An_Activity_Cancellation_Call
OR g_b_Is_This_A_Secondary_Function_Call
IF CharacterToCheck = CHAR_CALL911 //Adding exception for tricky bug 2117600. This seems the safest fix.
//This will spam if included without Dump widget clause...
#if IS_DEBUG_BUILD
IF g_DumpDisableEveryFrameCaller
cdPrintnl()
cdPrintstring("IS_CALLING_CONTACT reporting that a 911 exemption has taken place even though Activity or Secondary Function call was set to true. 2117600")
cdPrintnl()
ENDIF
#endif
ELSE
RETURN FALSE //If either of the flags are set, story mode should completely ignore the calls. They should be picked up by the friend controller or secondary function check.
ENDIF
ENDIF
IF g_CharacterSheetNonSaved[CharacterToCheck].phone <> NO_PHONE_CONTACT
IF g_Cellphone.PhoneDS = PDS_ATTEMPTING_TO_CALL_CONTACT
//OR g_Cellphone.PhoneDS = PDS_ONGOING_CALL
//Removed as this can feasibly spam the phone. Update: 07.09.10... That would mean the script which is triggering the phonecall
//is at fault. Might be reinstated to see who's doing it but IS_CONTACT_IN_CONNECTED_CALL should now be used to check specific ongoing call status.
IF ENUM_TO_INT(g_TheContactInvolvedinCall) = ENUM_TO_INT(CharacterToCheck)
//Note! g_TheContactInvolvedinCall is used. That means the player has pro-actively selected the contact from the contacts list via appContacts.sc
RETURN TRUE
ELSE
RETURN FALSE
ENDIF
ELSE
RETURN FALSE
ENDIF
ELSE
#if IS_DEBUG_BUILD
SCRIPT_ASSERT ("This character is not a phone contact. See Steve or Keith")
#endif
RETURN FALSE
ENDIF
ENDFUNC
//New. This would need to check for special bool or bit, so that IS_CALLING_CONTACT doesn't return true. So work needs done on the above function also.
FUNC BOOL IS_CALLING_FRIEND_FOR_ACTIVITY (enumCharacterList CharacterToCheck)
IF g_b_Is_This_An_Activity_Call = FALSE //If this isn't flagged as an activity call, it should be ignored.
RETURN FALSE
ENDIF
IF g_b_Is_This_An_Activity_Cancellation_Call = TRUE//If the call is flagged as requesting a cancellation then it should be ignored also.
RETURN FALSE
ENDIF
IF g_CharacterSheetNonSaved[CharacterToCheck].phone <> NO_PHONE_CONTACT
IF g_Cellphone.PhoneDS = PDS_ATTEMPTING_TO_CALL_CONTACT
//OR g_Cellphone.PhoneDS = PDS_ONGOING_CALL
//Removed as this can feasibly spam the phone. Update: 07.09.10... That would mean the script which is triggering the phonecall
//is at fault. Might be reinstated to see who's doing it but IS_CONTACT_IN_CONNECTED_CALL should now be used to check specific ongoing call status.
IF ENUM_TO_INT(g_TheContactInvolvedinCall) = ENUM_TO_INT(CharacterToCheck)
//Note! g_TheContactInvolvedinCall is used. That means the player has pro-actively selected the contact from the contacts list via appContacts.sc
RETURN TRUE
ELSE
RETURN FALSE
ENDIF
ELSE
RETURN FALSE
ENDIF
ELSE
#if IS_DEBUG_BUILD
SCRIPT_ASSERT ("This character is not a phone contact. See Steve or Keith")
#endif
RETURN FALSE
ENDIF
ENDFUNC
FUNC BOOL IS_CALLING_FRIEND_FOR_ACTIVITY_CANCELLATION (enumCharacterList CharacterToCheck)
IF g_b_Is_This_An_Activity_Call = TRUE
RETURN FALSE //Ignore if this is a "hang out" call.
ENDIF
IF g_b_Is_This_An_Activity_Cancellation_Call = FALSE //If it's not a hang out call, then ignore if it's not an activity cancellation request call also.
//It must be a story call.
RETURN FALSE
ENDIF
IF g_CharacterSheetNonSaved[CharacterToCheck].phone <> NO_PHONE_CONTACT
IF g_Cellphone.PhoneDS = PDS_ATTEMPTING_TO_CALL_CONTACT
//OR g_Cellphone.PhoneDS = PDS_ONGOING_CALL
//Removed as this can feasibly spam the phone. Update: 07.09.10... That would mean the script which is triggering the phonecall
//is at fault. Might be reinstated to see who's doing it but IS_CONTACT_IN_CONNECTED_CALL should now be used to check specific ongoing call status.
IF ENUM_TO_INT(g_TheContactInvolvedinCall) = ENUM_TO_INT(CharacterToCheck)
//Note! g_TheContactInvolvedinCall is used. That means the player has pro-actively selected the contact from the contacts list via appContacts.sc
RETURN TRUE
ELSE
RETURN FALSE
ENDIF
ELSE
RETURN FALSE
ENDIF
ELSE
#if IS_DEBUG_BUILD
SCRIPT_ASSERT ("This character is not a phone contact. See Steve or Keith")
#endif
RETURN FALSE
ENDIF
ENDFUNC
FUNC BOOL IS_CALLING_CONTACT_FOR_SECONDARY_FUNCTION (enumCharacterList CharacterToCheck)
IF g_b_Is_This_A_Secondary_Function_Call = FALSE
RETURN FALSE //Ignore if this is not a secondary function call.
ENDIF
IF g_CharacterSheetNonSaved[CharacterToCheck].phone <> NO_PHONE_CONTACT
IF g_Cellphone.PhoneDS = PDS_ATTEMPTING_TO_CALL_CONTACT
//OR g_Cellphone.PhoneDS = PDS_ONGOING_CALL
//Removed as this can feasibly spam the phone. Update: 07.09.10... That would mean the script which is triggering the phonecall
//is at fault. Might be reinstated to see who's doing it but IS_CONTACT_IN_CONNECTED_CALL should now be used to check specific ongoing call status.
IF ENUM_TO_INT(g_TheContactInvolvedinCall) = ENUM_TO_INT(CharacterToCheck)
//Note! g_TheContactInvolvedinCall is used. That means the player has pro-actively selected the contact from the contacts list via appContacts.sc
RETURN TRUE
ELSE
RETURN FALSE
ENDIF
ELSE
RETURN FALSE
ENDIF
ELSE
#if IS_DEBUG_BUILD
SCRIPT_ASSERT ("This character is not a phone contact. See Steve or Keith")
#endif
RETURN FALSE
ENDIF
ENDFUNC
FUNC BOOL ADD_SECONDARY_OPTION_FOR_MP_CHARACTER (INT SpecialMPCharacter_ArrayPos, enumCharacterList CharacterToAdd, STRING WhichSecondaryOptionLabel_1)
IF NOT (ARE_STRINGS_EQUAL (g_SpecialMPCharacters[SpecialMPCharacter_ArrayPos].SecondaryFunctionLabel_1, "CELL_SFUN_NULL"))
#if IS_DEBUG_BUILD
cdPrintstring("CELLPHONE_PUB - Cannot add a secondary character option as this Special MP Character array is already occupied at passed position ")
cdPrintint(SpecialMPCharacter_ArrayPos)
cdPrintnl()
cdPrintstring("This is already occupied by ")
cdPrintstring(GET_FILENAME_FOR_AUDIO_CONVERSATION(g_SpecialMPCharacters[SpecialMPCharacter_ArrayPos].Name_TextLabel))
cdPrintnl()
#endif
RETURN FALSE
ELSE
g_SpecialMPCharacters[SpecialMPCharacter_ArrayPos].Name_TextLabel = GLOBAL_CHARACTER_SHEET_GET_LABEL(CharacterToAdd)
g_SpecialMPCharacters[SpecialMPCharacter_ArrayPos].SecondaryFunctionLabel_1 = WhichSecondaryOptionLabel_1
#if IS_DEBUG_BUILD
cdPrintstring("CELLPHONE_PUB - Added a secondary character option into Special MP Character array at passed position ")
cdPrintint(SpecialMPCharacter_ArrayPos)
cdPrintnl()
cdPrintstring("This is now occupied by ")
cdPrintstring(GET_FILENAME_FOR_AUDIO_CONVERSATION(g_SpecialMPCharacters[SpecialMPCharacter_ArrayPos].Name_TextLabel))
cdPrintnl()
#endif
RETURN TRUE
ENDIF
ENDFUNC
FUNC BOOL REMOVE_SECONDARY_OPTION_FOR_MP_CHARACTER (enumCharacterList CharacterToRemove)
INT tempIndex = 0
BOOL b_FoundSecondaryOption = FALSE
WHILE tempIndex < MAX_SPECIAL_MP_CHARACTERS
IF ARE_STRINGS_EQUAL (GLOBAL_CHARACTER_SHEET_GET_LABEL(CharacterToRemove), g_SpecialMPCharacters[tempIndex].Name_TextLabel)
IF NOT (ARE_STRINGS_EQUAL (g_SpecialMPCharacters[tempIndex].SecondaryFunctionLabel_1, "CELL_SFUN_NULL")) //A secondary function must have been defined if the contents are no longer the predefined null.
#if IS_DEBUG_BUILD
cdPrintnl()
cdPrintstring("CELLPHONE_PUB - Removing secondary option found at special MP character index ")
cdPrintint(tempIndex)
cdPrintstring(" who is ")
cdPrintstring(GET_FILENAME_FOR_AUDIO_CONVERSATION(GLOBAL_CHARACTER_SHEET_GET_LABEL(CharacterToRemove)))
cdPrintnl()
#endif
g_SpecialMPCharacters[tempIndex].SecondaryFunctionLabel_1 = "CELL_SFUN_NULL"
b_FoundSecondaryOption = TRUE
ENDIF
ENDIF
tempIndex ++
ENDWHILE
IF b_FoundSecondaryOption
RETURN TRUE
ELSE
#if IS_DEBUG_BUILD
cdPrintnl()
cdPrintstring("CELLPHONE_PUB - Attempted to remove secondary option for ")
cdPrintstring(GET_FILENAME_FOR_AUDIO_CONVERSATION(GLOBAL_CHARACTER_SHEET_GET_LABEL(CharacterToRemove)))
cdPrintstring(" but none defined.")
cdPrintnl()
#endif
RETURN FALSE
ENDIF
ENDFUNC
FUNC BOOL IS_SECONDARY_OPTION_AVAILABLE_FOR_THIS_MP_CHARACTER (enumCharacterList CharacterToCheck)
INT tempIndex = 0
BOOL b_FoundSecondaryOption = FALSE
WHILE tempIndex < MAX_SPECIAL_MP_CHARACTERS
IF ARE_STRINGS_EQUAL (GLOBAL_CHARACTER_SHEET_GET_LABEL(CharacterToCheck), g_SpecialMPCharacters[tempIndex].Name_TextLabel)
IF NOT (ARE_STRINGS_EQUAL (g_SpecialMPCharacters[tempIndex].SecondaryFunctionLabel_1, "CELL_SFUN_NULL")) //A secondary function must have been defined if the contents are no longer the predefined null.
#if IS_DEBUG_BUILD
cdPrintnl()
cdPrintstring("CELLPHONE_PUB - Secondary option found for special MP character at index ")
cdPrintint(tempIndex)
cdPrintstring(" who is ")
cdPrintstring(GET_FILENAME_FOR_AUDIO_CONVERSATION(GLOBAL_CHARACTER_SHEET_GET_LABEL(CharacterToCheck)))
cdPrintnl()
#endif
b_FoundSecondaryOption = TRUE
ENDIF
ENDIF
tempIndex ++
ENDWHILE
IF b_FoundSecondaryOption
RETURN TRUE
ELSE
#if IS_DEBUG_BUILD
cdPrintnl()
cdPrintstring("CELLPHONE_PUB - No secondary option found for ")
cdPrintstring(GET_FILENAME_FOR_AUDIO_CONVERSATION(GLOBAL_CHARACTER_SHEET_GET_LABEL(CharacterToCheck)))
cdPrintnl()
#endif
RETURN FALSE
ENDIF
ENDFUNC
//If you need to know which postion in the special MP character array is free for adding a new character into, use this.
FUNC INT GET_FREE_POSITION_FOR_MP_CHARACTER_SECONDARY_OPTION()
INT tempIndex = 0
INT FreePositionInt = -99
BOOL b_FoundFreePosition = FALSE
WHILE tempIndex < MAX_SPECIAL_MP_CHARACTERS
IF (ARE_STRINGS_EQUAL (g_SpecialMPCharacters[tempIndex].SecondaryFunctionLabel_1, "CELL_SFUN_NULL")) //A secondary function must have been defined if the contents are no longer the predefined null.
#if IS_DEBUG_BUILD
cdPrintnl()
cdPrintstring("CELLPHONE_PUB - Free position found for special MP character at index ")
cdPrintint(tempIndex)
cdPrintnl()
#endif
FreePositionInt = tempIndex
b_FoundFreePosition = TRUE
ENDIF
tempIndex ++
ENDWHILE
IF b_FoundFreePosition
RETURN FreePositionInt
ELSE
RETURN -99
ENDIF
ENDFUNC
PROC SET_MICHAEL_SECONDARY_CONTACT_LIST_FUNCTION_AVAILABLE (STRING TextLabelForSecondaryOption)
g_SpecialSPCharacters[0].SecondaryFunctionLabel_1 = TextLabelForSecondaryOption
#if IS_DEBUG_BUILD
cdPrintstring("CELLPHONE_PUB. Michael - secondary contact option available.")
cdPrintnl()
#endif
ENDPROC
PROC SET_FRANKLIN_SECONDARY_CONTACT_LIST_FUNCTION_AVAILABLE (STRING TextLabelForSecondaryOption)
g_SpecialSPCharacters[1].SecondaryFunctionLabel_1 = TextLabelForSecondaryOption
#if IS_DEBUG_BUILD
cdPrintstring("CELLPHONE_PUB. Franklin - secondary contact option available.")
cdPrintnl()
#endif
ENDPROC
PROC SET_TREVOR_SECONDARY_CONTACT_LIST_FUNCTION_AVAILABLE (STRING TextLabelForSecondaryOption)
g_SpecialSPCharacters[2].SecondaryFunctionLabel_1 = TextLabelForSecondaryOption
#if IS_DEBUG_BUILD
cdPrintstring("CELLPHONE_PUB. Trevor - secondary contact option available.")
cdPrintnl()
#endif
ENDPROC
PROC SET_LESTER_SECONDARY_CONTACT_LIST_FUNCTION_AVAILABLE (STRING TextLabelForSecondaryOption)
g_SpecialSPCharacters[3].SecondaryFunctionLabel_1 = TextLabelForSecondaryOption
#if IS_DEBUG_BUILD
cdPrintstring("CELLPHONE_PUB. Lester - secondary contact option available.")
cdPrintnl()
#endif
ENDPROC
FUNC BOOL IS_MICHAEL_SECONDARY_CONTACT_LIST_FUNCTION_AVAILABLE()
IF ARE_STRINGS_EQUAL(g_SpecialSPCharacters[0].SecondaryFunctionLabel_1, "CELL_SFUN_NULL")
RETURN FALSE
ENDIF
RETURN TRUE
ENDFUNC
FUNC BOOL IS_FRANKLIN_SECONDARY_CONTACT_LIST_FUNCTION_AVAILABLE()
IF ARE_STRINGS_EQUAL(g_SpecialSPCharacters[1].SecondaryFunctionLabel_1, "CELL_SFUN_NULL")
RETURN FALSE
ENDIF
RETURN TRUE
ENDFUNC
FUNC BOOL IS_TREVOR_SECONDARY_CONTACT_LIST_FUNCTION_AVAILABLE()
IF ARE_STRINGS_EQUAL(g_SpecialSPCharacters[2].SecondaryFunctionLabel_1, "CELL_SFUN_NULL")
RETURN FALSE
ENDIF
RETURN TRUE
ENDFUNC
FUNC BOOL IS_LESTER_SECONDARY_CONTACT_LIST_FUNCTION_AVAILABLE()
IF ARE_STRINGS_EQUAL(g_SpecialSPCharacters[3].SecondaryFunctionLabel_1, "CELL_SFUN_NULL")
RETURN FALSE
ENDIF
RETURN TRUE
ENDFUNC
PROC REMOVE_MICHAEL_SECONDARY_CONTACT_LIST_FUNCTION()
g_SpecialSPCharacters[0].SecondaryFunctionLabel_1 = "CELL_SFUN_NULL"
#if IS_DEBUG_BUILD
cdPrintstring("CELLPHONE_PUB. Michael - secondary contact option removed.")
cdPrintnl()
#endif
ENDPROC
PROC REMOVE_FRANKLIN_SECONDARY_CONTACT_LIST_FUNCTION()
g_SpecialSPCharacters[1].SecondaryFunctionLabel_1 = "CELL_SFUN_NULL"
#if IS_DEBUG_BUILD
cdPrintstring("CELLPHONE_PUB. Franklin - secondary contact option removed.")
cdPrintnl()
#endif
ENDPROC
PROC REMOVE_TREVOR_SECONDARY_CONTACT_LIST_FUNCTION()
g_SpecialSPCharacters[2].SecondaryFunctionLabel_1 = "CELL_SFUN_NULL"
#if IS_DEBUG_BUILD
cdPrintstring("CELLPHONE_PUB. Trevor - secondary contact option removed.")
cdPrintnl()
#endif
ENDPROC
PROC REMOVE_LESTER_SECONDARY_CONTACT_LIST_FUNCTION()
g_SpecialSPCharacters[3].SecondaryFunctionLabel_1 = "CELL_SFUN_NULL"
#if IS_DEBUG_BUILD
cdPrintstring("CELLPHONE_PUB. Lester - secondary contact option removed.")
cdPrintnl()
#endif
ENDPROC
//Wiki-ed.
//This function will return true if the player's attempt to call to a contact has either:
// - got through and the contact is responding in real time.
// - got through but the contact is responding via answerphone.
//N.B it will also return true if the contact is calling the player and the phone is waiting to be answered.
//It will return false:
// - whilst the contact's phone is ringing and a full connection has not been made.
// - during an engaged tone.
FUNC BOOL IS_CONTACT_IN_CONNECTED_CALL (enumCharacterList CharacterToCheck)
IF g_CharacterSheetNonSaved[CharacterToCheck].phone <> NO_PHONE_CONTACT
IF g_Cellphone.PhoneDS = PDS_ONGOING_CALL
IF ENUM_TO_INT(g_TheContactInvolvedinCall) = ENUM_TO_INT(CharacterToCheck)
//Note! g_TheContactInvolvedinCall is used. This is stipulated when a phone call is incoming or an outgoing phonecall is fully connected.
RETURN TRUE
ELSE
RETURN FALSE
ENDIF
ELSE
RETURN FALSE
ENDIF
ELSE
#IF IS_DEBUG_BUILD
SCRIPT_ASSERT ("This character is not a phone contact. See Steve or Keith")
#endif
RETURN FALSE
ENDIF
ENDFUNC
//As soon as the user selects a contact from the contacts list this will return true.
//This will return true before an ongoing call or attempting to call state and during a call / hangout menu interim.
//The function will only return false again when another contact has been selected, or a call from a different contact comes in, so hanging
//up the phone will not necessarily clear the last contact selection, ( could be done if desired, though! )
FUNC BOOL HAS_CONTACT_BEEN_SELECTED_IN_CONTACTS_LIST (enumCharacterList CharacterToCheck)
IF g_CharacterSheetNonSaved[CharacterToCheck].phone <> NO_PHONE_CONTACT
IF ENUM_TO_INT(g_TheContactInvolvedinCall) = ENUM_TO_INT(CharacterToCheck)
RETURN TRUE
ELSE
RETURN FALSE
ENDIF
ELSE
#IF IS_DEBUG_BUILD
SCRIPT_ASSERT ("This character is not a phone contact. See Steve or Keith")
#endif
RETURN FALSE
ENDIF
ENDFUNC
PROC SET_CALL_PREVENTED_FOR_CHAR_DETONATEPHONE (BOOL b_PreventCall)
IF b_PreventCall
SET_BIT (BitSet_CellphoneDisplay_Continued, g_BSC_PREVENT_CALL_FOR_CHAR_DETONATEPHONE)
#if IS_DEBUG_BUILD
//Make sure this always displays regardless of phone debug text widget toggle.
PRINTLN("\nCELLPHONE_PUB - Call prevented for CHAR_DETONATEPHONE[", GET_THIS_SCRIPT_NAME(), "] through public function.")
PRINTSTRING("Will be re-enabled automatically on phone exit.")
PRINTNL()
#endif
ELSE
CLEAR_BIT (BitSet_CellphoneDisplay_Continued, g_BSC_PREVENT_CALL_FOR_CHAR_DETONATEPHONE)
#if IS_DEBUG_BUILD
//Make sure this always displays regardless of phone debug text widget toggle.
PRINTLN("\nCELLPHONE_PUB - Call enabled for CHAR_DETONATEPHONE[", GET_THIS_SCRIPT_NAME(), "] through public function.")
#endif
ENDIF
ENDPROC
//Wiki-ed.
//Similar to the above "IS_CALLING_CONTACT" function, this will return true if the player is attempting to call ANY contact from within his phonebook.
//As this function will not be used to trigger phone calls, it can be used to check if the player is having a connected phone conversation with anyone.
//Handy for flow work if you want to check whether or not the phone, in a conversation sense,
//is free before attempting to trigger a call. You could use this to work out how long the phone has been free etc.
FUNC BOOL IS_CALLING_ANY_CONTACT ()
IF g_Cellphone.PhoneDS = PDS_ATTEMPTING_TO_CALL_CONTACT
OR g_Cellphone.PhoneDS = PDS_ONGOING_CALL //It's safe to check this here, as IS_CALLING_ANY_CONTACT will not be directly triggering a phonecall, so poor scripting
//cannot spam the system.
RETURN TRUE
ELSE
RETURN FALSE
ENDIF
ENDFUNC
//This should only be used by the player list application. It is used to simulate an outgoing call to a human friend but does not go through the dialogue system.
//This will launch appContacts and keep the call screen and appContacts running up until the following happens:
//The phone aborts due to abnormal exit.
//The user who initiated the call selects hang up - this will trigger the state assignment 54 clause check for player list app active in Cellphone_Flashhand.
//A TERMINATE_APPCONTACTS_FOR_CHAT_CALL() is explicitly made by the app script.. This won't remove the screen itself, but does force appContacts to terminate, assign complex app and stop the dialing tone.
PROC LAUNCH_CALL_SCREEN_FOR_OUTGOING_CHAT_CALL(STRING WhichChatCallerString)
g_TheContactInvolvedinCall = CHAR_CHAT_CALL //Critical! This character is looked for specifically in appContacts to make sure the correct dialling tones
//are played and no engaged signal is cued.
g_ChatCallerString = WhichChatCallerString
IF g_CellPhone.PhoneDS > PDS_AWAY //make sure that the following state assignment cannot interfere with AWAY or DISABLED assignment.
g_CellPhone.PhoneDS = PDS_ATTEMPTING_TO_CALL_CONTACT //Setting this here will ensure the scaleform methods below take precedence above the creation of the contacts list itself.
//when appContacts is launched. See that script for more info.
Put_Cellphone_To_Ear()
#if IS_DEBUG_BUILD
cdPrintnl()
cdPrintstring("STATE ASSIGNMENT 4527. CELLPHONE_PUBLIC assigns PDS_ATTEMPTING_TO_CALL_CONTACT during chat_call launch.")
cdPrintnl()
#endif
ENDIF
#if USE_CLF_DLC
//appContacts handles all outgoing pro-active non-script calls by the player. We need to launch this.
request_load_scriptstring ("appContactsCLF")
Application_Thread = START_NEW_SCRIPT ("appContactsCLF", CONTACTS_APP_STACK_SIZE)
SET_SCRIPT_AS_NO_LONGER_NEEDED ("appContactsCLF")
#endif
#if USE_NRM_DLC
//appContacts handles all outgoing pro-active non-script calls by the player. We need to launch this.
request_load_scriptstring ("appContactsNRM")
Application_Thread = START_NEW_SCRIPT ("appContactsNRM", CONTACTS_APP_STACK_SIZE)
SET_SCRIPT_AS_NO_LONGER_NEEDED ("appContactsNRM")
#endif
#if not USE_CLF_DLC
#if not USE_NRM_DLC
//appContacts handles all outgoing pro-active non-script calls by the player. We need to launch this.
request_load_scriptstring ("appContacts")
Application_Thread = START_NEW_SCRIPT ("appContacts", CONTACTS_APP_STACK_SIZE)
SET_SCRIPT_AS_NO_LONGER_NEEDED ("appContacts")
#endif
#endif
BEGIN_SCALEFORM_MOVIE_METHOD (SF_MovieIndex, "SET_DATA_SLOT")
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(4)
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(0)
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(2)
BEGIN_TEXT_COMMAND_SCALEFORM_STRING ("CELL_CONDFON") //~a~
ADD_TEXT_COMPONENT_SUBSTRING_PLAYER_NAME (g_ChatCallerString)
END_TEXT_COMMAND_SCALEFORM_STRING()
SCALEFORM_MOVIE_METHOD_ADD_PARAM_STRING("CELL_300") //Point to CHAR_DEFAULT headshot for just now...
SCALEFORM_MOVIE_METHOD_ADD_PARAM_STRING("CELL_211") //Label to specify we are making an outgoing call, e.e CALLING, DIALLING
SCALEFORM_MOVIE_METHOD_ADD_PARAM_STRING("CELL_211") //This field is no longer displayed on the phone, so safe
//to duplicate required parameter with previous text label.
END_SCALEFORM_MOVIE_METHOD ()
Update_Scaleform_VSE ()
#if IS_DEBUG_BUILD
cdPrintstring ("appTextMessage - Attempting to call human player for chat call: ")
cdPrintstring (g_sCharacterSheetAll[g_TheContactInvolvedinCall].label)
cdPrintstring (" which is charsheet entry ")
cdPrintint (ENUM_TO_INT(g_TheContactInvolvedInCall))
cdPrintnl()
#endif
ENDPROC
PROC LAUNCH_CALL_SCREEN_FOR_OUTGOING_CHAT_CALL_FROM_APPCONTACTS (STRING WhichChatCallerString)
g_TheContactInvolvedinCall = CHAR_CHAT_CALL //Critical! This character is looked for specifically in appContacts to make sure the correct dialling tones
//are played and no engaged signal is cued.
g_ChatCallerString = WhichChatCallerString
IF g_CellPhone.PhoneDS > PDS_AWAY //make sure that the following state assignment cannot interfere with AWAY or DISABLED assignment.
g_CellPhone.PhoneDS = PDS_ATTEMPTING_TO_CALL_CONTACT //Setting this here will ensure the scaleform methods below take precedence above the creation of the contacts list itself.
//when appContacts is launched. See that script for more info.
Put_Cellphone_To_Ear()
#if IS_DEBUG_BUILD
cdPrintnl()
cdPrintstring("STATE ASSIGNMENT 45278. CELLPHONE_PUBLIC assigns PDS_ATTEMPTING_TO_CALL_CONTACT during chat_call launch.")
cdPrintnl()
#endif
ENDIF
BEGIN_SCALEFORM_MOVIE_METHOD (SF_MovieIndex, "SET_DATA_SLOT")
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(4)
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(0)
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(2)
BEGIN_TEXT_COMMAND_SCALEFORM_STRING ("CELL_CONDFON") //~a~
ADD_TEXT_COMPONENT_SUBSTRING_PLAYER_NAME (g_ChatCallerString)
END_TEXT_COMMAND_SCALEFORM_STRING()
SCALEFORM_MOVIE_METHOD_ADD_PARAM_STRING("CELL_300") //Point to CHAR_DEFAULT headshot for just now...
SCALEFORM_MOVIE_METHOD_ADD_PARAM_STRING("CELL_211") //Label to specify we are making an outgoing call, e.e CALLING, DIALLING
SCALEFORM_MOVIE_METHOD_ADD_PARAM_STRING("CELL_211") //This field is no longer displayed on the phone, so safe
//to duplicate required parameter with previous text label.
END_SCALEFORM_MOVIE_METHOD ()
//Adding this on a trial basis to prevent quitting before PROCESS_VOICE_SESSION_STARTED_EVENT() has fired. 1602347
SET_BIT (BitSet_CellphoneDisplay, g_BS_DISABLE_INCOMING_OR_OUTGOING_CALL_HANGUP) //Do not display hang up button until Voice session event is TRUE - this is done in ply_to_ply calls
//when voice session is started via PROCESS_VOICE_SESSION_STARTED_EVENT
Update_Scaleform_VSE () //This was always here...
CLEAR_BIT (BitSet_CellphoneDisplay, g_BS_DISABLE_INCOMING_OR_OUTGOING_CALL_HANGUP) //Re-enable immediately for safety.
#if IS_DEBUG_BUILD
cdPrintstring ("Cellphone Public - Attempting to call human player from within appContacts for chat call: ")
cdPrintstring (g_sCharacterSheetAll[g_TheContactInvolvedinCall].label)
cdPrintstring (" which is charsheet entry ")
cdPrintint (ENUM_TO_INT(g_TheContactInvolvedInCall))
cdPrintnl()
#endif
ENDPROC
PROC TERMINATE_APPCONTACTS_FOR_CHAT_CALL()
#if IS_DEBUG_BUILD
PRINTLN("\nCELLPHONE_PUB - Terminate appcontacts for chat called by[", GET_THIS_SCRIPT_NAME(), "] through public function.")
cdPrintnl()
/* Removed - appMPPlayerList is currently redundant.
IF GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH ("appMPPlayerList")) = 0
SCRIPT_ASSERT ("AppMPPlayerList is not running but chat call termination proc called! See Steve T.")
PRINTLN("\nCELLPHONE_PUB - Warning! AppMPPlayerList is not running. This may cause a phone lock up if used incorrectly!")
cdPrintnl()
ENDIF
*/
#endif
//Deliberately outwith the thread clause immediately above for testing.
SET_BIT (BitSet_CellphoneDisplay_Continued, g_BSC_TERMINATE_APPCONTACTS_FOR_CHAT_CALL)
ENDPROC
PROC SET_OUTGOING_CHAT_CALL_AS_ENGAGED (BOOL b_SetAsEngaged)
IF b_SetAsEngaged
SET_BIT (BitSet_CellphoneDisplay_Continued, g_BSC_SET_CHAT_CALL_AS_ENGAGED)
#if IS_DEBUG_BUILD
cdPrintstring ("CELLPHONE_PUB - Setting outgoing chat call bit as engaged.")
cdPrintnl()
#endif
ELSE
CLEAR_BIT (BitSet_CellphoneDisplay_Continued, g_BSC_SET_CHAT_CALL_AS_ENGAGED)
#if IS_DEBUG_BUILD
cdPrintstring ("CELLPHONE_PUB - Clearing outgoing call engaged bit")
cdPrintnl()
#endif
ENDIF
ENDPROC
PROC SET_PLAYER_CHAT_CALL_AS_CONNECTED()
BEGIN_SCALEFORM_MOVIE_METHOD (SF_MovieIndex, "SET_DATA_SLOT")
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(4)
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(0)
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(2)
BEGIN_TEXT_COMMAND_SCALEFORM_STRING ("CELL_CONDFON") //~a~
ADD_TEXT_COMPONENT_SUBSTRING_PLAYER_NAME (g_ChatCallerString)
END_TEXT_COMMAND_SCALEFORM_STRING()
SCALEFORM_MOVIE_METHOD_ADD_PARAM_STRING("CELL_300") //Point to CHAR_DEFAULT headshot for just now...
SCALEFORM_MOVIE_METHOD_ADD_PARAM_STRING("CELL_219") //"CONNECTED"
SCALEFORM_MOVIE_METHOD_ADD_PARAM_STRING("CELL_219") //This field is invisible, so feel free to duplicate with previous text label.
END_SCALEFORM_MOVIE_METHOD ()
PRINTLN("SET_PLAYER_CHAT_CALL_AS_CONNECTED- Called from ", GET_THIS_SCRIPT_NAME())
voiceSession.bConnectedCallOnGoing = TRUE
CLEAR_BIT(BitSet_CellphoneDisplay, g_BS_PROMPT_FLASHHAND_TO_PLAY_REMOTE_RING)
Update_Scaleform_VSE ()
/* Moved to TitleUpdate_Post_Set_Player_Chat_Call_As_Connected() in cellphone_private
IF g_Cellphone.PhoneDS > PDS_AWAY
g_Cellphone.PhoneDS = PDS_ONGOING_CALL //#1602347 - Makes sure that the hands free option can be used from the outgoing call end.
#if IS_DEBUG_BUILD
cdPrintnl()
cdPrintString("STATE ASSIGNMENT 36. Cellphone_Controller assigns PDS_ONGOING_CALL")
cdPrintnl()
#endif
g_IsThisAnMPChatCall = TRUE //Required so that the hands free handler can work for the call initiator
IF g_bInMultiplayer //Add hands free button if in MP.
LEGACY_SCALEFORM_MOVIE_METHOD_WITH_NUMBER_AND_STRING (SF_MovieIndex, "SET_SOFT_KEYS", BADGER_OTHER, 1,
5, INVALID_SCALEFORM_PARAM, INVALID_SCALEFORM_PARAM, "CELL_201") //Hands Free / Hide Phone button - NEEDS NEW ICON! #1566736
#if IS_DEBUG_BUILD
cdPrintnl()
cdPrintString("CELLPHONE_PUBLIC - Adding Hands Free option SOFT KEY - 2")
cdPrintnl()
#endif
IF NOT IS_BIT_SET(BitSet_CellphoneDisplay_Third, g_BSTHIRD_HUMAN_HIDE_FOR_HANDS_FREE_HELP_DONE)
PRINT_HELP("CELL_HF_HIDE")
SET_BIT (BitSet_CellphoneDisplay_Third, g_BSTHIRD_HUMAN_HIDE_FOR_HANDS_FREE_HELP_DONE)
ENDIF
ENDIF
ENDIF
*/
ENDPROC
//Text Messaging
//Wiki-ed.
//Send a text message to the player's phone.
//
//Text messages for the three singleplayer characters phones are stored in one large common array. A filter system is in operation, that specifies if a particular message should
//appear in that player's text message list when the application is run. Messages such as replays can easily appear in all filter streams.
//Parameter notes:
//enumCharacterList WhichSender is the name of the character to be displayed as the sender of the message on the phone. Take from the character sheet as normal.
//This parameter removed on trial basis! Text will be global for text messages rather than stored in a specific block.
//STRING WhichBlockOfTextToLoad is the common text block where all text messages are stored. This block is loaded when the phone displays the messages.
//For just now, the common text block is TMSG. We may be using multiple text blocks in the future hence why the parameter is passed in.
//STRING WhichTextLabel is the FULL text label from the .txt file that corresponds to the message you want to send.
//enumTxtMsgLockedStatus WhichLockStatus defines what type of message is being sent. Passing in TXTMSG_LOCKED means the message will have no chance of being overwritten
//unless the text array becomes completely full of LOCKED messages This is highly unlikely to happen. Mission critical text messages should have TXTMSG_LOCKED status.
//Unimportant messages should be passed in with TXTMSG_UNLOCKED. Once the text array is full, any incoming message will search for the earliest UNLOCKED message to overwrite.
//enumTxtMsgMissionCritical WhichCriticalStatus - If a txtmsg is critical then when the text message application is brought up on screen, it will default to the single message display of
//this message rather than the normal list of chronological texts.
//enumTxtMsgIsReplyRequired WhichReplyStatus - if a text message is a question that allows a simple YES / NO reply e.g "Replay Mission?", then set this to REPLY_IS_REQUIRED
//so the text message system knows to set up specific behaviour for these special messages.
//BOOL ShouldDisplayNewTxtMsgSignifier specifies that any new text message sent will display an onscreen indicator when it gets through to the phone.
//Example usage: SEND_TEXT_MESSAGE_TO_CURRENT_PLAYER (CHAR_MICHAEL, "TMSG", "TXT_101", TXTMSG_LOCKED)
//This lets the text message system know if a textmsg, after having been found by a string comparison in the array, is currently listed as included in any filter.
//Used by DELETE_TEXT_MESSAGE_BY_LABEL_FROM_CURRENT_PLAYER
FUNC BOOL IS_TEXTMSG_PRESENT_IN_ANY_FILTER(INT passedIndex)
#if USE_CLF_DLC
IF g_savedGlobalsClifford.sTextMessageSavedData.g_TextMessage[passedIndex].PhonePresence[0] = TRUE //Michael
OR g_savedGlobalsClifford.sTextMessageSavedData.g_TextMessage[passedIndex].PhonePresence[1] = TRUE //Franklin
OR g_savedGlobalsClifford.sTextMessageSavedData.g_TextMessage[passedIndex].PhonePresence[2] = TRUE //Trevor
RETURN TRUE
ELSE
RETURN FALSE
ENDIF
#ENDIF
#if USE_NRM_DLC
IF g_savedGlobalsnorman.sTextMessageSavedData.g_TextMessage[passedIndex].PhonePresence[0] = TRUE //Michael
OR g_savedGlobalsnorman.sTextMessageSavedData.g_TextMessage[passedIndex].PhonePresence[1] = TRUE //Franklin
OR g_savedGlobalsnorman.sTextMessageSavedData.g_TextMessage[passedIndex].PhonePresence[2] = TRUE //Trevor
RETURN TRUE
ELSE
RETURN FALSE
ENDIF
#ENDIF
#if not USE_SP_DLC
IF g_SavedGlobals.sTextMessageSavedData.g_TextMessage[passedIndex].PhonePresence[0] = TRUE //Michael
OR g_SavedGlobals.sTextMessageSavedData.g_TextMessage[passedIndex].PhonePresence[1] = TRUE //Franklin
OR g_SavedGlobals.sTextMessageSavedData.g_TextMessage[passedIndex].PhonePresence[2] = TRUE //Trevor
RETURN TRUE
ELSE
RETURN FALSE
ENDIF
#ENDIF
ENDFUNC
FUNC BOOL IS_TEXTMSG_PRESENT_IN_MULTIPLAYER_FILTER(INT passedIndex)
IF g_SavedGlobals.sTextMessageSavedData.g_TextMessage[passedIndex].PhonePresence[3] = TRUE //MULTIPLAYER
RETURN TRUE
ELSE
RETURN FALSE
ENDIF
ENDFUNC
//Wiki-ed.
FUNC BOOL SEND_TEXT_MESSAGE_TO_CURRENT_PLAYER (enumCharacterList WhichSender, STRING WhichTextLabel, enumTxtMsgLockedStatus WhichLockStatus,
enumTxtMsgMissionCritical WhichCriticalStatus = TXTMSG_NOT_CRITICAL,
enumTxtMsgAutoUnlockAfterRead WhichAutoUnlockStatus = TXTMSG_AUTO_UNLOCK_AFTER_READ,
enumTxtMsgIsReplyRequired WhichReplyStatus = NO_REPLY_REQUIRED,
eTextMessageIconStyle WhichIconStyle = ICON_STANDARD_TEXTMSG,
BOOL ShouldDisplayNewTxtMsgSignifier = TRUE,
enumTxtMsgIsBarterRequired WhichBarterStatus = NO_BARTER_REQUIRED,
enumTxtMsgCanCallSender WhichCanCallSenderStatus = CAN_CALL_SENDER)
CLEAR_BIT (BitSet_CellphoneDisplay, g_BS_SENDING_TXTMSG_TO_ALL_PLAYERS) //Make sure we only send to current player...
enumTxtMsgSpecialComponents ForcedComponentType = NO_SPECIAL_COMPONENTS
STRING ForcedBodyStringComponent = "NULL"
INT ForcedNumberComponent = -99
STRING ForcedSenderStringComponent = "NULL"
INT ForcedNumberofAdditionalStrings = 0
STRING ForcedSecondString = "NULL"
STRING ForcedThirdString = "NULL"
enumRecipientList SilentMessageRecipient = NO_SILENT_RECIPIENT
IF ProcessTextMessage (WhichSender, WhichTextLabel, WhichLockStatus,
ForcedComponentType, ForcedBodyStringComponent, ForcedSenderStringComponent, ForcedNumberComponent,
WhichCriticalStatus, WhichAutoUnlockStatus, WhichReplyStatus,
ShouldDisplayNewTxtMsgSignifier, WhichBarterStatus, WhichCanCallSenderStatus, ForcedNumberOfAdditionalStrings,
ForcedSecondString, ForcedThirdString, SilentMessageRecipient) = TRUE
IF ShouldDisplayNewTxtMsgSignifier = TRUE
g_TextMessageIconStyle = WhichIconStyle
#if USE_CLF_DLC
SignifierData[SIG_TEXT].SignifierPrimaryText = g_savedGlobalsClifford.sCharSheetData.g_CharacterSheet[WhichSender].label
#ENDIF
#if USE_NRM_DLC
SignifierData[SIG_TEXT].SignifierPrimaryText = g_savedGlobalsnorman.sCharSheetData.g_CharacterSheet[WhichSender].label
#ENDIF
#if not USE_SP_DLC
SignifierData[SIG_TEXT].SignifierPrimaryText = GLOBAL_CHARACTER_SHEET_GET_LABEL(WhichSender)
#ENDIF
g_Temp_MP_PassedCharacterListRef = WhichSender
SET_BIT (BitSet_CellphoneDisplay, g_BS_DISPLAY_NEW_TXTMSG_SIGNIFIER)
SET_BIT (BitSet_CellphoneDisplay, g_BS_CELLPHONE_TEXTFEED_NEEDS_UPDATED)
ENDIF
#if IS_DEBUG_BUILD
cdPrintnl()
cdPrintstring ("CELLPHONE_PUB - Text message successfully sent to current player. Label was: ")
cdPrintstring (WhichTextLabel)
cdPrintnl()
#endif
RETURN TRUE
ELSE
RETURN FALSE
ENDIF
ENDFUNC
FUNC BOOL SEND_SILENT_TEXT_MESSAGE_TO_PLAYER_CHARACTER (enumCharacterList WhichSender, enumRecipientList WhichSilentRecipient, STRING WhichTextLabel, enumTxtMsgLockedStatus WhichLockStatus,
enumTxtMsgMissionCritical WhichCriticalStatus = TXTMSG_NOT_CRITICAL,
enumTxtMsgAutoUnlockAfterRead WhichAutoUnlockStatus = TXTMSG_AUTO_UNLOCK_AFTER_READ,
enumTxtMsgIsReplyRequired WhichReplyStatus = NO_REPLY_REQUIRED,
eTextMessageIconStyle WhichIconStyle = ICON_STANDARD_TEXTMSG,
BOOL ShouldDisplayNewTxtMsgSignifier = TRUE,
enumTxtMsgIsBarterRequired WhichBarterStatus = NO_BARTER_REQUIRED,
enumTxtMsgCanCallSender WhichCanCallSenderStatus = CAN_CALL_SENDER)
CLEAR_BIT (BitSet_CellphoneDisplay, g_BS_SENDING_TXTMSG_TO_ALL_PLAYERS) //Make sure we only send to one player...
enumTxtMsgSpecialComponents ForcedComponentType = NO_SPECIAL_COMPONENTS
STRING ForcedBodyStringComponent = "NULL"
INT ForcedNumberComponent = -99
STRING ForcedSenderStringComponent = "NULL"
INT ForcedNumberofAdditionalStrings = 0
STRING ForcedSecondString = "NULL"
STRING ForcedThirdString = "NULL"
IF ProcessTextMessage (WhichSender, WhichTextLabel, WhichLockStatus,
ForcedComponentType, ForcedBodyStringComponent, ForcedSenderStringComponent, ForcedNumberComponent,
WhichCriticalStatus, WhichAutoUnlockStatus, WhichReplyStatus,
ShouldDisplayNewTxtMsgSignifier, WhichBarterStatus, WhichCanCallSenderStatus, ForcedNumberOfAdditionalStrings,
ForcedSecondString, ForcedThirdString, WhichSilentRecipient) = TRUE
IF ShouldDisplayNewTxtMsgSignifier = TRUE
g_TextMessageIconStyle = WhichIconStyle
#if USE_CLF_DLC
SignifierData[SIG_TEXT].SignifierPrimaryText = g_savedGlobalsClifford.sCharSheetData.g_CharacterSheet[WhichSender].label
#ENDIF
#if USE_NRM_DLC
SignifierData[SIG_TEXT].SignifierPrimaryText = g_savedGlobalsnorman.sCharSheetData.g_CharacterSheet[WhichSender].label
#ENDIF
#if not USE_SP_DLC
SignifierData[SIG_TEXT].SignifierPrimaryText = GLOBAL_CHARACTER_SHEET_GET_LABEL(WhichSender)
#ENDIF
g_Temp_MP_PassedCharacterListRef = WhichSender
SET_BIT (BitSet_CellphoneDisplay, g_BS_DISPLAY_NEW_TXTMSG_SIGNIFIER)
SET_BIT (BitSet_CellphoneDisplay, g_BS_CELLPHONE_TEXTFEED_NEEDS_UPDATED)
ENDIF
#if IS_DEBUG_BUILD
cdPrintnl()
cdPrintstring ("CELLPHONE_PUB - Silent Text message successfully sent to specified player. Label was: ")
cdPrintstring (WhichTextLabel)
cdPrintnl()
#endif
RETURN TRUE
ELSE
RETURN FALSE
ENDIF
ENDFUNC
//Wiki-ed.
#if USE_CLF_DLC
FUNC BOOL SEND_TEXT_MESSAGE_TO_CHARACTER_BUFFER_CLF (enumCharacterList WhichPlayerCharacter, enumCharacterList WhichSender, STRING WhichTextLabel,
enumTxtMsgLockedStatus WhichLockStatus,
enumTxtMsgMissionCritical WhichCriticalStatus = TXTMSG_NOT_CRITICAL,
enumTxtMsgAutoUnlockAfterRead WhichAutoUnlockStatus = TXTMSG_AUTO_UNLOCK_AFTER_READ,
enumTxtMsgIsReplyRequired WhichReplyStatus = NO_REPLY_REQUIRED,
enumTxtMsgIsBarterRequired WhichBarterStatus = NO_BARTER_REQUIRED,
enumTxtMsgCanCallSender WhichCanCallSenderStatus = CAN_CALL_SENDER)
INT PC_Decision
SWITCH WhichPlayerCharacter
CASE CHAR_MICHAEL
PC_Decision = SP_MICHAEL_BUFFER_INDEX
BREAK
CASE CHAR_FRANKLIN
PC_Decision = SP_FRANKLIN_BUFFER_INDEX
BREAK
CASE CHAR_TREVOR
PC_Decision = SP_TREVOR_BUFFER_INDEX
BREAK
DEFAULT
#if IS_DEBUG_BUILD
SCRIPT_ASSERT("BUFFERED TEXT MESSAGE - When sending a message to a character buffer, you must send to MICHAEL, FRANKLIN or TREVOR. See Steve T")
cdPrintstring ("CELLPHONE_PRIV - When sending a message to a character buffer, you must send to MICHAEL, FRANKLIN or TREVOR. See Steve T")
cdPrintnl ()
#endif
RETURN FALSE
BREAK
ENDSWITCH
g_savedGlobalsClifford.sTextMessageSavedData.g_TextMessage[PC_Decision].TxtMsgLabel = WhichTextLabel
g_savedGlobalsClifford.sTextMessageSavedData.g_TextMessage[PC_Decision].TxtMsgSender = WhichSender
IF WhichLockStatus = TXTMSG_EMPTY
#if IS_DEBUG_BUILD
cdPrintstring ("CELLPHONE_PRIV - When sending a message to a character buffer, you cannot define a text message lock status as empty. See Steve T")
cdPrintnl ()
#endif
RETURN FALSE
ELSE
g_savedGlobalsClifford.sTextMessageSavedData.g_TextMessage[PC_Decision].TxtMsgLockStatus = WhichLockStatus
ENDIF
g_savedGlobalsClifford.sTextMessageSavedData.g_TextMessage[PC_Decision].TxtMsgCritical = WhichCriticalStatus
g_savedGlobalsClifford.sTextMessageSavedData.g_TextMessage[PC_Decision].TxtMsgAutoUnlockStatus = WhichAutoUnlockStatus
g_savedGlobalsClifford.sTextMessageSavedData.g_TextMessage[PC_Decision].TxtMsgReplyStatus = WhichReplyStatus
g_savedGlobalsClifford.sTextMessageSavedData.g_TextMessage[PC_Decision].TxtMsgCanCallSenderStatus = WhichCanCallSenderStatus
g_savedGlobalsClifford.sTextMessageSavedData.g_TextMessage[PC_Decision].TxtMsgBarterStatus = WhichBarterStatus
g_savedGlobalsClifford.sTextMessageSavedData.g_TextMessage[PC_Decision].TxtMsgReadStatus = UNREAD_TXTMSG
#if IS_DEBUG_BUILD
cdPrintstring ("CELLPHONE_PRIV - BUFFERED TEXT Sending a message to character buffer ")
cdPrintnl ()
cdPrintint (PC_Decision)
cdPrintnl()
#endif
RETURN TRUE
ENDFUNC
#endif
#if USE_NRM_DLC
FUNC BOOL SEND_TEXT_MESSAGE_TO_CHARACTER_BUFFER_NRM (enumCharacterList WhichPlayerCharacter, enumCharacterList WhichSender, STRING WhichTextLabel,
enumTxtMsgLockedStatus WhichLockStatus,
enumTxtMsgMissionCritical WhichCriticalStatus = TXTMSG_NOT_CRITICAL,
enumTxtMsgAutoUnlockAfterRead WhichAutoUnlockStatus = TXTMSG_AUTO_UNLOCK_AFTER_READ,
enumTxtMsgIsReplyRequired WhichReplyStatus = NO_REPLY_REQUIRED,
enumTxtMsgIsBarterRequired WhichBarterStatus = NO_BARTER_REQUIRED,
enumTxtMsgCanCallSender WhichCanCallSenderStatus = CAN_CALL_SENDER)
INT PC_Decision
SWITCH WhichPlayerCharacter
CASE CHAR_NRM_MICHAEL
PC_Decision = SP_MICHAEL_BUFFER_INDEX
BREAK
CASE CHAR_NRM_JIMMY
PC_Decision = SP_FRANKLIN_BUFFER_INDEX
BREAK
CASE CHAR_NRM_TRACEY
PC_Decision = SP_TREVOR_BUFFER_INDEX
BREAK
DEFAULT
#if IS_DEBUG_BUILD
SCRIPT_ASSERT("BUFFERED TEXT MESSAGE - When sending a message to a character buffer, you must send to MICHAEL, FRANKLIN or TREVOR. See Steve T")
cdPrintstring ("CELLPHONE_PRIV - When sending a message to a character buffer, you must send to MICHAEL, FRANKLIN or TREVOR. See Steve T")
cdPrintnl ()
#endif
RETURN FALSE
BREAK
ENDSWITCH
g_savedGlobalsnorman.sTextMessageSavedData.g_TextMessage[PC_Decision].TxtMsgLabel = WhichTextLabel
g_savedGlobalsnorman.sTextMessageSavedData.g_TextMessage[PC_Decision].TxtMsgSender = WhichSender
IF WhichLockStatus = TXTMSG_EMPTY
#if IS_DEBUG_BUILD
cdPrintstring ("CELLPHONE_PRIV - When sending a message to a character buffer, you cannot define a text message lock status as empty. See Steve T")
cdPrintnl ()
#endif
RETURN FALSE
ELSE
g_savedGlobalsnorman.sTextMessageSavedData.g_TextMessage[PC_Decision].TxtMsgLockStatus = WhichLockStatus
ENDIF
g_savedGlobalsnorman.sTextMessageSavedData.g_TextMessage[PC_Decision].TxtMsgCritical = WhichCriticalStatus
g_savedGlobalsnorman.sTextMessageSavedData.g_TextMessage[PC_Decision].TxtMsgAutoUnlockStatus = WhichAutoUnlockStatus
g_savedGlobalsnorman.sTextMessageSavedData.g_TextMessage[PC_Decision].TxtMsgReplyStatus = WhichReplyStatus
g_savedGlobalsnorman.sTextMessageSavedData.g_TextMessage[PC_Decision].TxtMsgCanCallSenderStatus = WhichCanCallSenderStatus
g_savedGlobalsnorman.sTextMessageSavedData.g_TextMessage[PC_Decision].TxtMsgBarterStatus = WhichBarterStatus
g_savedGlobalsnorman.sTextMessageSavedData.g_TextMessage[PC_Decision].TxtMsgReadStatus = UNREAD_TXTMSG
#if IS_DEBUG_BUILD
cdPrintstring ("CELLPHONE_PRIV - BUFFERED TEXT Sending a message to character buffer ")
cdPrintnl ()
cdPrintint (PC_Decision)
cdPrintnl()
#endif
RETURN TRUE
ENDFUNC
#endif
FUNC BOOL SEND_TEXT_MESSAGE_TO_CHARACTER_BUFFER (enumCharacterList WhichPlayerCharacter, enumCharacterList WhichSender, STRING WhichTextLabel,
enumTxtMsgLockedStatus WhichLockStatus,
enumTxtMsgMissionCritical WhichCriticalStatus = TXTMSG_NOT_CRITICAL,
enumTxtMsgAutoUnlockAfterRead WhichAutoUnlockStatus = TXTMSG_AUTO_UNLOCK_AFTER_READ,
enumTxtMsgIsReplyRequired WhichReplyStatus = NO_REPLY_REQUIRED,
enumTxtMsgIsBarterRequired WhichBarterStatus = NO_BARTER_REQUIRED,
enumTxtMsgCanCallSender WhichCanCallSenderStatus = CAN_CALL_SENDER)
#if USE_CLF_DLC
return SEND_TEXT_MESSAGE_TO_CHARACTER_BUFFER_CLF(WhichPlayerCharacter, WhichSender,WhichTextLabel,WhichLockStatus,
WhichCriticalStatus,WhichAutoUnlockStatus,WhichReplyStatus,WhichBarterStatus,WhichCanCallSenderStatus)
#endif
#if USE_NRM_DLC
return SEND_TEXT_MESSAGE_TO_CHARACTER_BUFFER_NRM(WhichPlayerCharacter, WhichSender,WhichTextLabel,WhichLockStatus,
WhichCriticalStatus,WhichAutoUnlockStatus,WhichReplyStatus,WhichBarterStatus,WhichCanCallSenderStatus)
#endif
#if not USE_SP_DLC
INT PC_Decision
SWITCH WhichPlayerCharacter
CASE CHAR_MICHAEL
PC_Decision = SP_MICHAEL_BUFFER_INDEX
BREAK
CASE CHAR_FRANKLIN
PC_Decision = SP_FRANKLIN_BUFFER_INDEX
BREAK
CASE CHAR_TREVOR
PC_Decision = SP_TREVOR_BUFFER_INDEX
BREAK
DEFAULT
#if IS_DEBUG_BUILD
SCRIPT_ASSERT("BUFFERED TEXT MESSAGE - When sending a message to a character buffer, you must send to MICHAEL, FRANKLIN or TREVOR. See Steve T")
cdPrintstring ("CELLPHONE_PRIV - When sending a message to a character buffer, you must send to MICHAEL, FRANKLIN or TREVOR. See Steve T")
cdPrintnl ()
#endif
RETURN FALSE
BREAK
ENDSWITCH
g_SavedGlobals.sTextMessageSavedData.g_TextMessage[PC_Decision].TxtMsgLabel = WhichTextLabel
g_SavedGlobals.sTextMessageSavedData.g_TextMessage[PC_Decision].TxtMsgSender = WhichSender
IF WhichLockStatus = TXTMSG_EMPTY
#if IS_DEBUG_BUILD
cdPrintstring ("CELLPHONE_PRIV - When sending a message to a character buffer, you cannot define a text message lock status as empty. See Steve T")
cdPrintnl ()
#endif
RETURN FALSE
ELSE
g_SavedGlobals.sTextMessageSavedData.g_TextMessage[PC_Decision].TxtMsgLockStatus = WhichLockStatus
ENDIF
g_SavedGlobals.sTextMessageSavedData.g_TextMessage[PC_Decision].TxtMsgCritical = WhichCriticalStatus
g_SavedGlobals.sTextMessageSavedData.g_TextMessage[PC_Decision].TxtMsgAutoUnlockStatus = WhichAutoUnlockStatus
g_SavedGlobals.sTextMessageSavedData.g_TextMessage[PC_Decision].TxtMsgReplyStatus = WhichReplyStatus
g_SavedGlobals.sTextMessageSavedData.g_TextMessage[PC_Decision].TxtMsgCanCallSenderStatus = WhichCanCallSenderStatus
g_SavedGlobals.sTextMessageSavedData.g_TextMessage[PC_Decision].TxtMsgBarterStatus = WhichBarterStatus
g_SavedGlobals.sTextMessageSavedData.g_TextMessage[PC_Decision].TxtMsgReadStatus = UNREAD_TXTMSG
#if IS_DEBUG_BUILD
cdPrintstring ("CELLPHONE_PRIV - BUFFERED TEXT Sending a message to character buffer ")
cdPrintnl ()
cdPrintint (PC_Decision)
cdPrintnl()
#endif
RETURN TRUE
#endif
ENDFUNC
//To force the text message to display the WhichSenderStringComponent rather than a character name from the Character list, set Whichsender to NO_CHARACTER
FUNC BOOL SEND_TEXT_MESSAGE_TO_CURRENT_PLAYER_WITH_SPECIAL_COMPONENTS (enumCharacterList WhichSender, STRING WhichTextLabel,
enumTxtMsgLockedStatus WhichLockStatus,
STRING WhichBodyStringComponent, INT WhichNumberComponent,
STRING WhichSenderStringComponent,
enumTxtMsgSpecialComponents WhichComponentType = NO_SPECIAL_COMPONENTS,
enumTxtMsgMissionCritical WhichCriticalStatus = TXTMSG_NOT_CRITICAL,
enumTxtMsgAutoUnlockAfterRead WhichAutoUnlockStatus = TXTMSG_AUTO_UNLOCK_AFTER_READ,
enumTxtMsgIsReplyRequired WhichReplyStatus = NO_REPLY_REQUIRED,
eTextMessageIconStyle WhichIconStyle = ICON_STANDARD_TEXTMSG,
BOOL ShouldDisplayNewTxtMsgSignifier = TRUE,
enumTxtMsgIsBarterRequired WhichBarterStatus = NO_BARTER_REQUIRED,
enumTxtMsgCanCallSender WhichCanCallSenderStatus = CAN_CALL_SENDER,
INT WhichNumberofAdditionalStrings = 0,
STRING WhichSecondStringComponent = NULL, STRING WhichThirdStringComponent = NULL)
SWITCH WhichNumberOfAdditionalStrings
CASE 0
WhichSecondStringComponent = "NULL"
WhichThirdStringComponent = "NULL"
BREAK
CASE 1
WhichThirdStringComponent = "NULL"
BREAK
CASE 2
//Do not clear. Accept second and third string components as is.
BREAK
DEFAULT
#if IS_DEBUG_BUILD
SCRIPT_ASSERT ("SEND_TEXT_MESSAGE... Weird additional string counter passed in. See Steve T.")
cdPrintstring ("SEND_TEXT_MESSAGE... Weird additional string counter passed in. See Steve T.")
cdPrintnl()
#endif
BREAK
ENDSWITCH
CLEAR_BIT (BitSet_CellphoneDisplay, g_BS_SENDING_TXTMSG_TO_ALL_PLAYERS) //Make sure we only send to current player...
enumRecipientList SilentMessageRecipient = NO_SILENT_RECIPIENT
IF ProcessTextMessage (WhichSender, WhichTextLabel, WhichLockStatus,
WhichComponentType, WhichBodyStringComponent, WhichSenderStringComponent, WhichNumberComponent,
WhichCriticalStatus, WhichAutoUnlockStatus, WhichReplyStatus,
ShouldDisplayNewTxtMsgSignifier, WhichBarterStatus, WhichCanCallSenderStatus, WhichNumberOfAdditionalStrings,
WhichSecondStringComponent, WhichThirdStringComponent, SilentMessageRecipient) = TRUE
IF ShouldDisplayNewTxtMsgSignifier = TRUE
g_TextMessageIconStyle = WhichIconStyle
#if USE_CLF_DLC
SignifierData[SIG_TEXT].SignifierPrimaryText = g_savedGlobalsClifford.sCharSheetData.g_CharacterSheet[WhichSender].label
#endif
#if USE_NRM_DLC
SignifierData[SIG_TEXT].SignifierPrimaryText = g_savedGlobalsnorman.sCharSheetData.g_CharacterSheet[WhichSender].label
#endif
#if not USE_SP_DLC
SignifierData[SIG_TEXT].SignifierPrimaryText = GLOBAL_CHARACTER_SHEET_GET_LABEL(WhichSender)
#endif
g_Temp_MP_PassedCharacterListRef = WhichSender
g_Temp_MP_SenderString = WhichSenderStringComponent
SET_BIT (BitSet_CellphoneDisplay, g_BS_DISPLAY_NEW_TXTMSG_SIGNIFIER)
SET_BIT (BitSet_CellphoneDisplay, g_BS_CELLPHONE_TEXTFEED_NEEDS_UPDATED)
ENDIF
#if IS_DEBUG_BUILD
cdPrintnl()
cdPrintstring ("CELLPHONE_PUB - Special component text message successfully sent to current player. Label was: ")
cdPrintstring (WhichTextLabel)
cdPrintnl()
#endif
RETURN TRUE
ELSE
RETURN FALSE
ENDIF
ENDFUNC
//This should be used to send a text message to the three single player characters. Not multiplayer!
FUNC BOOL SEND_TEXT_MESSAGE_TO_ALL_PLAYER_CHARACTERS (enumCharacterList WhichSender, STRING WhichTextLabel, enumTxtMsgLockedStatus WhichLockStatus,
enumTxtMsgMissionCritical WhichCriticalStatus = TXTMSG_NOT_CRITICAL,
enumTxtMsgAutoUnlockAfterRead WhichAutoUnlockStatus = TXTMSG_AUTO_UNLOCK_AFTER_READ,
enumTxtMsgIsReplyRequired WhichReplyStatus = NO_REPLY_REQUIRED,
eTextMessageIconStyle WhichIconStyle = ICON_STANDARD_TEXTMSG,
BOOL ShouldDisplayNewTxtMsgSignifier = TRUE,
enumTxtMsgIsBarterRequired WhichBarterStatus = NO_BARTER_REQUIRED,
enumTxtMsgCanCallSender WhichCanCallSenderStatus = CAN_CALL_SENDER)
SET_BIT (BitSet_CellphoneDisplay, g_BS_SENDING_TXTMSG_TO_ALL_PLAYERS)
enumTxtMsgSpecialComponents ForcedComponentType = NO_SPECIAL_COMPONENTS
STRING ForcedBodyStringComponent = "NULL"
INT ForcedNumberComponent = -99
STRING ForcedSenderStringComponent = "NULL"
INT ForcedNumberofAdditionalStrings = 0
STRING ForcedSecondString = "NULL"
STRING ForcedThirdString = "NULL"
enumRecipientList SilentMessageRecipient = NO_SILENT_RECIPIENT
IF ProcessTextMessage (WhichSender, WhichTextLabel, WhichLockStatus,
ForcedComponentType, ForcedBodyStringComponent, ForcedSenderStringComponent, ForcedNumberComponent,
WhichCriticalStatus, WhichAutoUnlockStatus, WhichReplyStatus,
ShouldDisplayNewTxtMsgSignifier, WhichBarterStatus, WhichCanCallSenderStatus,
ForcedNumberOfAdditionalStrings,
ForcedSecondString, ForcedThirdString, SilentMessageRecipient) = TRUE
IF ShouldDisplayNewTxtMsgSignifier = TRUE
g_TextMessageIconStyle = WhichIconStyle
#if USE_CLF_DLC
SignifierData[SIG_TEXT].SignifierPrimaryText = g_savedGlobalsClifford.sCharSheetData.g_CharacterSheet[WhichSender].label
#endif
#if USE_NRM_DLC
SignifierData[SIG_TEXT].SignifierPrimaryText = g_savedGlobalsnorman.sCharSheetData.g_CharacterSheet[WhichSender].label
#endif
#if not USE_SP_DLC
SignifierData[SIG_TEXT].SignifierPrimaryText = GLOBAL_CHARACTER_SHEET_GET_LABEL(WhichSender)
#endif
g_Temp_MP_PassedCharacterListRef = WhichSender
SET_BIT (BitSet_CellphoneDisplay, g_BS_DISPLAY_NEW_TXTMSG_SIGNIFIER)
SET_BIT (BitSet_CellphoneDisplay, g_BS_CELLPHONE_TEXTFEED_NEEDS_UPDATED)
ENDIF
#if IS_DEBUG_BUILD
cdPrintnl()
cdPrintstring ("CELLPHONE_PUB - Text message successfully sent to all player characters. Label was: ")
cdPrintstring (WhichTextLabel)
cdPrintnl()
#endif
RETURN TRUE
ELSE
RETURN FALSE
ENDIF
ENDFUNC
//Only for use by MP only! Removes the signifier above the radar and will stop the phone defaulting to the textmessage app for the most recent text.
//Always do this BEFORE a purge if you want to make sure the signifier does not reappear.
PROC CLEAR_TEXT_MESSAGE_SIGNIFIER_FOR_MULTIPLAYER()
IF g_bInMultiplayer
#if USE_CLF_DLC
g_savedGlobalsClifford.sCellphoneSettingsData.This_Cellphone_Owner_Settings[CHAR_MULTIPLAYER].g_LaunchToTextMessageScreen = FALSE
#endif
#if USE_NRM_DLC
g_savedGlobalsnorman.sCellphoneSettingsData.This_Cellphone_Owner_Settings[CHAR_MULTIPLAYER].g_LaunchToTextMessageScreen = FALSE
#endif
#if not USE_SP_DLC
g_savedGlobals.sCellphoneSettingsData.This_Cellphone_Owner_Settings[CHAR_MULTIPLAYER].g_LaunchToTextMessageScreen = FALSE
#endif
#if IS_DEBUG_BUILD
cdPrintnl()
cdPrintstring("CELLPHONE_PUBLIC - Clearing signifier via CLEAR_TEXT_MESSAGE_SIGNIFIER_FOR_MP")
cdPrintnl()
#endif
ENDIF
ENDPROC
PROC CLEAR_AUTO_LAUNCH_TO_TEXT_MESSAGE_APP_FOR_THIS_SP_CHARACTER (enumCharacterList CharacterToClear)
IF CharacterToClear <> CHAR_MICHAEL
AND CharacterToClear <> CHAR_FRANKLIN
AND CharacterToClear <> CHAR_TREVOR
#if IS_DEBUG_BUILD
cdPrintnl()
cdPrintstring("CELLPHONE_PUBLIC - CLEAR_AUTO_LAUNCH_TO_TEXT_MESSAGE_APP_FOR_THIS_SP_CHARACTER called on non player character!")
cdPrintnl()
#endif
ELSE
#if USE_CLF_DLC
g_savedGlobalsClifford.sCellphoneSettingsData.This_Cellphone_Owner_Settings[CharacterToClear].g_LaunchToTextMessageScreen = FALSE
g_savedGlobalsClifford.sCellphoneSettingsData.This_Cellphone_Owner_Settings[CharacterToClear].g_LastMessageSentMustBeRead = FALSE
#endif
#if USE_NRM_DLC
g_savedGlobalsnorman.sCellphoneSettingsData.This_Cellphone_Owner_Settings[CharacterToClear].g_LaunchToTextMessageScreen = FALSE
g_savedGlobalsnorman.sCellphoneSettingsData.This_Cellphone_Owner_Settings[CharacterToClear].g_LastMessageSentMustBeRead = FALSE
#endif
#if not USE_SP_DLC
g_savedGlobals.sCellphoneSettingsData.This_Cellphone_Owner_Settings[CharacterToClear].g_LaunchToTextMessageScreen = FALSE
g_savedGlobals.sCellphoneSettingsData.This_Cellphone_Owner_Settings[CharacterToClear].g_LastMessageSentMustBeRead = FALSE
#endif
#if IS_DEBUG_BUILD
cdPrintnl()
cdPrintstring("CELLPHONE_PUBLIC - CLEAR_AUTO_LAUNCH_TO_TEXT_MESSAGE_APP_FOR_THIS_SP_CHARACTER called on player character ")
cdPrintint(ENUM_TO_INT(CharacterToClear))
cdPrintnl()
#endif
ENDIF
ENDPROC
//DANGER! This should only be used by MP when necessary. It clears out anything in the MP presence filter / portion of the overall text message array.
PROC PURGE_TEXT_MESSAGES_FOR_MULTIPLAYER()
INT TxtMsgArrayIndex = MP_TEXT_PORTION_START //defined in cellphone_globals.sch
WHILE TxtMsgArrayIndex < MAX_TEXT_MESSAGES //As MP portion concludes at end of global text array, it's safe to do this.
IF g_SavedGlobals.sTextMessageSavedData.g_TextMessage[TxtMsgArrayIndex].PhonePresence[CHAR_MULTIPLAYER] = TRUE
g_SavedGlobals.sTextMessageSavedData.g_TextMessage[TxtMsgArrayIndex].TxtMsgLockStatus = TXTMSG_EMPTY
g_SavedGlobals.sTextMessageSavedData.g_TextMessage[TxtMsgArrayIndex].TxtMsgReadStatus = UNREAD_TXTMSG
g_SavedGlobals.sTextMessageSavedData.g_TextMessage[TxtMsgArrayIndex].PhonePresence[CHAR_MULTIPLAYER] = FALSE
ENDIF
TxtMsgArrayIndex ++
ENDWHILE
g_savedGlobals.sCellphoneSettingsData.This_Cellphone_Owner_Settings[CHAR_MULTIPLAYER].g_LastMessageSentMustBeRead = FALSE
g_savedGlobals.sCellphoneSettingsData.This_Cellphone_Owner_Settings[CHAR_MULTIPLAYER].g_LaunchToTextMessageScreen = FALSE
#IF IS_DEBUG_BUILD
cdPrintnl()
cdPrintstring ("_______________________________________________________________________________________________________")
cdPrintnl()
cdPrintstring ("CELLPHONE_PUB - Purged mp text message list! g_TextMessage array set to TXTMSG_EMPTY and filters cleared.")
cdPrintstring ("_______________________________________________________________________________________________________")
cdPrintnl()
#endif
ENDPROC
#if USE_CLF_DLC
FUNC BOOL HAS_THIS_TEXT_MESSAGE_BEEN_READ_CLF(STRING LabelToCheck)
INT TxtMsgArrayIndex = 0
WHILE TxtMsgArrayIndex < MAX_TEXT_MESSAGES
IF NOT IS_STRING_NULL (g_savedGlobalsClifford.sTextMessageSavedData.g_TextMessage[TxtMsgArrayIndex].TxtMsgLabel)
IF ARE_STRINGS_EQUAL(g_savedGlobalsClifford.sTextMessageSavedData.g_TextMessage[TxtMsgArrayIndex].TxtMsgLabel, LabelToCheck)
IF g_savedGlobalsClifford.sTextMessageSavedData.g_TextMessage[TxtMsgArrayIndex].TxtMsgReadStatus = READ_TXTMSG
#if IS_DEBUG_BUILD
cdPrintstring ("CELLPHONE_PUB - Read Message found at text message array index ")
cdPrintint (TxtMsgArrayIndex)
cdPrintnl()
#endif
RETURN TRUE
ENDIF
ENDIF
ELSE
#if IS_DEBUG_BUILD
cdPrintstring ("CELLPHONE_PUB - No text message label specified. Cannot locate read status of empty string.")
cdPrintnl()
#endif
RETURN FALSE
ENDIF
TxtMsgArrayIndex ++
ENDWHILE
RETURN FALSE
ENDFUNC
#endif
#if USE_NRM_DLC
FUNC BOOL HAS_THIS_TEXT_MESSAGE_BEEN_READ_NRM(STRING LabelToCheck)
INT TxtMsgArrayIndex = 0
WHILE TxtMsgArrayIndex < MAX_TEXT_MESSAGES
IF NOT IS_STRING_NULL (g_savedGlobalsnorman.sTextMessageSavedData.g_TextMessage[TxtMsgArrayIndex].TxtMsgLabel)
IF ARE_STRINGS_EQUAL(g_savedGlobalsnorman.sTextMessageSavedData.g_TextMessage[TxtMsgArrayIndex].TxtMsgLabel, LabelToCheck)
IF g_savedGlobalsnorman.sTextMessageSavedData.g_TextMessage[TxtMsgArrayIndex].TxtMsgReadStatus = READ_TXTMSG
#if IS_DEBUG_BUILD
cdPrintstring ("CELLPHONE_PUB - Read Message found at text message array index ")
cdPrintint (TxtMsgArrayIndex)
cdPrintnl()
#endif
RETURN TRUE
ENDIF
ENDIF
ELSE
#if IS_DEBUG_BUILD
cdPrintstring ("CELLPHONE_PUB - No text message label specified. Cannot locate read status of empty string.")
cdPrintnl()
#endif
RETURN FALSE
ENDIF
TxtMsgArrayIndex ++
ENDWHILE
RETURN FALSE
ENDFUNC
#endif
FUNC BOOL HAS_THIS_TEXT_MESSAGE_BEEN_READ (STRING LabelToCheck)
#if USE_CLF_DLC
return HAS_THIS_TEXT_MESSAGE_BEEN_READ_CLF(LabelToCheck)
#endif
#if USE_NRM_DLC
return HAS_THIS_TEXT_MESSAGE_BEEN_READ_NRM(LabelToCheck)
#endif
#if not USE_SP_DLC
INT TxtMsgArrayIndex = 0
WHILE TxtMsgArrayIndex < MAX_TEXT_MESSAGES
IF NOT IS_STRING_NULL (g_SavedGlobals.sTextMessageSavedData.g_TextMessage[TxtMsgArrayIndex].TxtMsgLabel)
IF ARE_STRINGS_EQUAL(g_SavedGlobals.sTextMessageSavedData.g_TextMessage[TxtMsgArrayIndex].TxtMsgLabel, LabelToCheck)
IF g_SavedGlobals.sTextMessageSavedData.g_TextMessage[TxtMsgArrayIndex].TxtMsgReadStatus = READ_TXTMSG
#if IS_DEBUG_BUILD
cdPrintstring ("CELLPHONE_PUB - Read Message found at text message array index ")
cdPrintint (TxtMsgArrayIndex)
cdPrintnl()
#endif
RETURN TRUE
ENDIF
ENDIF
ELSE
#if IS_DEBUG_BUILD
cdPrintstring ("CELLPHONE_PUB - No text message label specified. Cannot locate read status of empty string.")
cdPrintnl()
#endif
RETURN FALSE
ENDIF
TxtMsgArrayIndex ++
ENDWHILE
RETURN FALSE
#endif
ENDFUNC
//Wiki-ed.
//This will set all text messages that were sent to the player's phone with that text label to TXTMSG_EMPTY. This means that they will no longer be included in
//the text message list displayed on the phone and the slot occupied in the text message array is available to write to when a fresh text message is set.
//Notes: For safety's sake, only messages with status of TXTMSG_UNLOCKED can be removed by this method
//This is a proc so that all messages with that label can be deleted at once.
#if USE_CLF_DLC
PROC DELETE_TEXT_MESSAGE_BY_LABEL_FROM_CURRENT_PLAYER_CLF(STRING LabelToDelete)
#if IS_DEBUG_BUILD
PRINTLN("\nCELLPHONE_PUB - DELETE_TEXT_MESSAGE_BY_LABEL_FROM_CURRENT_PLAYER called by [", GET_THIS_SCRIPT_NAME(), "] through public function.")
#endif
INT TxtMsgArrayIndex = 0
WHILE TxtMsgArrayIndex < MAX_TEXT_MESSAGES
IF NOT IS_STRING_NULL (g_savedGlobalsClifford.sTextMessageSavedData.g_TextMessage[TxtMsgArrayIndex].TxtMsgLabel)
IF ARE_STRINGS_EQUAL(g_savedGlobalsClifford.sTextMessageSavedData.g_TextMessage[TxtMsgArrayIndex].TxtMsgLabel, LabelToDelete)
IF g_savedGlobalsClifford.sTextMessageSavedData.g_TextMessage[TxtMsgArrayIndex].TxtMsgLockStatus = TXTMSG_LOCKED
#if IS_DEBUG_BUILD
cdPrintstring ("CELLPHONE_PUB - Cannot delete this message. It has LOCKED status.")
cdPrintnl()
#endif
ELSE
Get_Cellphone_Owner()
g_savedGlobalsClifford.sTextMessageSavedData.g_TextMessage[TxtMsgArrayIndex].PhonePresence[g_Cellphone.PhoneOwner] = FALSE
IF IS_TEXTMSG_PRESENT_IN_ANY_FILTER (TxtMsgArrayIndex)
#IF IS_DEBUG_BUILD
cdPrintstring ("CELLPHONE_PUB - Remove message from current player filter only. Current player Int is ")
cdPrintint (ENUM_TO_INT(g_Cellphone.PhoneOwner))
cdPrintnl()
#endif
ELSE
g_savedGlobalsClifford.sTextMessageSavedData.g_TextMessage[TxtMsgArrayIndex].TxtMsgLockStatus = TXTMSG_EMPTY
g_savedGlobalsClifford.sTextMessageSavedData.g_TextMessage[TxtMsgArrayIndex].TxtMsgReadStatus = UNREAD_TXTMSG
g_savedGlobalsClifford.sTextMessageSavedData.g_TextMessage[TxtMsgArrayIndex].TxtMsgReplyStatus = NO_REPLY_REQUIRED
#if IS_DEBUG_BUILD
cdPrintstring ("CELLPHONE_PUB - Current player message no longer in any player filter. Assigned EMPTY status to array position: ")
cdPrintint (TxtMsgArrayIndex)
cdPrintnl()
#endif
ENDIF
//If still on screen, we should remove the Feed Entry associated with this text message label now that it has been deleted.
THEFEED_REMOVE_ITEM (g_savedGlobalsClifford.sTextMessageSavedData.g_TextMessage[TxtMsgArrayIndex].TxtMsgFeedEntryId)
ENDIF
ENDIF
ELSE
#if IS_DEBUG_BUILD
cdPrintstring ("CELLPHONE_PUB - No txtmessage label specified. Cannot delete empty string.")
cdPrintnl()
#endif
ENDIF
TxtMsgArrayIndex ++
ENDWHILE
ENDPROC
#endif
#if USE_NRM_DLC
PROC DELETE_TEXT_MESSAGE_BY_LABEL_FROM_CURRENT_PLAYER_NRM(STRING LabelToDelete)
#if IS_DEBUG_BUILD
PRINTLN("\nCELLPHONE_PUB - DELETE_TEXT_MESSAGE_BY_LABEL_FROM_CURRENT_PLAYER called by [", GET_THIS_SCRIPT_NAME(), "] through public function.")
#endif
INT TxtMsgArrayIndex = 0
WHILE TxtMsgArrayIndex < MAX_TEXT_MESSAGES
IF NOT IS_STRING_NULL (g_savedGlobalsnorman.sTextMessageSavedData.g_TextMessage[TxtMsgArrayIndex].TxtMsgLabel)
IF ARE_STRINGS_EQUAL(g_savedGlobalsnorman.sTextMessageSavedData.g_TextMessage[TxtMsgArrayIndex].TxtMsgLabel, LabelToDelete)
IF g_savedGlobalsnorman.sTextMessageSavedData.g_TextMessage[TxtMsgArrayIndex].TxtMsgLockStatus = TXTMSG_LOCKED
#if IS_DEBUG_BUILD
cdPrintstring ("CELLPHONE_PUB - Cannot delete this message. It has LOCKED status.")
cdPrintnl()
#endif
ELSE
Get_Cellphone_Owner()
g_savedGlobalsnorman.sTextMessageSavedData.g_TextMessage[TxtMsgArrayIndex].PhonePresence[g_Cellphone.PhoneOwner] = FALSE
IF IS_TEXTMSG_PRESENT_IN_ANY_FILTER (TxtMsgArrayIndex)
#IF IS_DEBUG_BUILD
cdPrintstring ("CELLPHONE_PUB - Remove message from current player filter only. Current player Int is ")
cdPrintint (ENUM_TO_INT(g_Cellphone.PhoneOwner))
cdPrintnl()
#endif
ELSE
g_savedGlobalsnorman.sTextMessageSavedData.g_TextMessage[TxtMsgArrayIndex].TxtMsgLockStatus = TXTMSG_EMPTY
g_savedGlobalsnorman.sTextMessageSavedData.g_TextMessage[TxtMsgArrayIndex].TxtMsgReadStatus = UNREAD_TXTMSG
g_savedGlobalsnorman.sTextMessageSavedData.g_TextMessage[TxtMsgArrayIndex].TxtMsgReplyStatus = NO_REPLY_REQUIRED
#if IS_DEBUG_BUILD
cdPrintstring ("CELLPHONE_PUB - Current player message no longer in any player filter. Assigned EMPTY status to array position: ")
cdPrintint (TxtMsgArrayIndex)
cdPrintnl()
#endif
ENDIF
//If still on screen, we should remove the Feed Entry associated with this text message label now that it has been deleted.
THEFEED_REMOVE_ITEM (g_savedGlobalsnorman.sTextMessageSavedData.g_TextMessage[TxtMsgArrayIndex].TxtMsgFeedEntryId)
ENDIF
ENDIF
ELSE
#if IS_DEBUG_BUILD
cdPrintstring ("CELLPHONE_PUB - No txtmessage label specified. Cannot delete empty string.")
cdPrintnl()
#endif
ENDIF
TxtMsgArrayIndex ++
ENDWHILE
ENDPROC
#endif
PROC DELETE_TEXT_MESSAGE_BY_LABEL_FROM_CURRENT_PLAYER (STRING LabelToDelete)
#if USE_CLF_DLC
DELETE_TEXT_MESSAGE_BY_LABEL_FROM_CURRENT_PLAYER_CLF(LabelToDelete)
#endif
#if USE_NRM_DLC
DELETE_TEXT_MESSAGE_BY_LABEL_FROM_CURRENT_PLAYER_NRM(LabelToDelete)
#endif
#if not USE_SP_DLC
#if IS_DEBUG_BUILD
PRINTLN("\nCELLPHONE_PUB - DELETE_TEXT_MESSAGE_BY_LABEL_FROM_CURRENT_PLAYER called by [", GET_THIS_SCRIPT_NAME(), "] through public function.")
#endif
INT TxtMsgArrayIndex = 0
WHILE TxtMsgArrayIndex < MAX_TEXT_MESSAGES
IF NOT IS_STRING_NULL (g_SavedGlobals.sTextMessageSavedData.g_TextMessage[TxtMsgArrayIndex].TxtMsgLabel)
IF ARE_STRINGS_EQUAL(g_SavedGlobals.sTextMessageSavedData.g_TextMessage[TxtMsgArrayIndex].TxtMsgLabel, LabelToDelete)
IF g_SavedGlobals.sTextMessageSavedData.g_TextMessage[TxtMsgArrayIndex].TxtMsgLockStatus = TXTMSG_LOCKED
#if IS_DEBUG_BUILD
cdPrintstring ("CELLPHONE_PUB - Cannot delete this message. It has LOCKED status.")
cdPrintnl()
#endif
ELSE
Get_Cellphone_Owner()
g_SavedGlobals.sTextMessageSavedData.g_TextMessage[TxtMsgArrayIndex].PhonePresence[g_Cellphone.PhoneOwner] = FALSE
IF IS_TEXTMSG_PRESENT_IN_ANY_FILTER (TxtMsgArrayIndex)
#IF IS_DEBUG_BUILD
cdPrintstring ("CELLPHONE_PUB - Remove message from current player filter only. Current player Int is ")
cdPrintint (ENUM_TO_INT(g_Cellphone.PhoneOwner))
cdPrintnl()
#endif
ELSE
g_SavedGlobals.sTextMessageSavedData.g_TextMessage[TxtMsgArrayIndex].TxtMsgLockStatus = TXTMSG_EMPTY
g_SavedGlobals.sTextMessageSavedData.g_TextMessage[TxtMsgArrayIndex].TxtMsgReadStatus = UNREAD_TXTMSG
g_SavedGlobals.sTextMessageSavedData.g_TextMessage[TxtMsgArrayIndex].TxtMsgReplyStatus = NO_REPLY_REQUIRED
#if IS_DEBUG_BUILD
cdPrintstring ("CELLPHONE_PUB - Current player message no longer in any player filter. Assigned EMPTY status to array position: ")
cdPrintint (TxtMsgArrayIndex)
cdPrintnl()
#endif
ENDIF
//If still on screen, we should remove the Feed Entry associated with this text message label now that it has been deleted.
THEFEED_REMOVE_ITEM (g_SavedGlobals.sTextMessageSavedData.g_TextMessage[TxtMsgArrayIndex].TxtMsgFeedEntryId)
ENDIF
ENDIF
ELSE
#if IS_DEBUG_BUILD
cdPrintstring ("CELLPHONE_PUB - No txtmessage label specified. Cannot delete empty string.")
cdPrintnl()
#endif
ENDIF
TxtMsgArrayIndex ++
ENDWHILE
#endif
ENDPROC
//Whenever a text message has been sent, a feed ID is associated with it. By passing in the text label the text was originally sent with, the feed ID can be extracted in order
//to remove the feed entry independently of the text message itself. The latter remains in the phone unless other action is taken.
PROC REMOVE_TEXT_MESSAGE_FEED_ENTRY (STRING LabelOfFeedToRemove)
INT TxtMsgArrayIndex = 0
WHILE TxtMsgArrayIndex < MAX_TEXT_MESSAGES
#if USE_CLF_DLC
IF NOT IS_STRING_NULL (g_savedGlobalsClifford.sTextMessageSavedData.g_TextMessage[TxtMsgArrayIndex].TxtMsgLabel)
IF ARE_STRINGS_EQUAL(g_savedGlobalsClifford.sTextMessageSavedData.g_TextMessage[TxtMsgArrayIndex].TxtMsgLabel, LabelOfFeedToRemove)
//If still on screen, we should remove the Feed Entry associated with this text message label.
THEFEED_REMOVE_ITEM (g_savedGlobalsClifford.sTextMessageSavedData.g_TextMessage[TxtMsgArrayIndex].TxtMsgFeedEntryId)
#if IS_DEBUG_BUILD
cdPrintstring ("CELLPHONE_PUB - Call made to remove feed item associated with label at text message array index ")
cdPrintint (TxtMsgArrayIndex)
cdPrintnl()
#endif
ENDIF
ENDIF
#endif
#if USE_NRM_DLC
IF NOT IS_STRING_NULL (g_savedGlobalsnorman.sTextMessageSavedData.g_TextMessage[TxtMsgArrayIndex].TxtMsgLabel)
IF ARE_STRINGS_EQUAL(g_savedGlobalsnorman.sTextMessageSavedData.g_TextMessage[TxtMsgArrayIndex].TxtMsgLabel, LabelOfFeedToRemove)
//If still on screen, we should remove the Feed Entry associated with this text message label.
THEFEED_REMOVE_ITEM (g_savedGlobalsnorman.sTextMessageSavedData.g_TextMessage[TxtMsgArrayIndex].TxtMsgFeedEntryId)
#if IS_DEBUG_BUILD
cdPrintstring ("CELLPHONE_PUB - Call made to remove feed item associated with label at text message array index ")
cdPrintint (TxtMsgArrayIndex)
cdPrintnl()
#endif
ENDIF
ENDIF
#endif
#if not USE_SP_DLC
IF NOT IS_STRING_NULL (g_SavedGlobals.sTextMessageSavedData.g_TextMessage[TxtMsgArrayIndex].TxtMsgLabel)
IF ARE_STRINGS_EQUAL(g_SavedGlobals.sTextMessageSavedData.g_TextMessage[TxtMsgArrayIndex].TxtMsgLabel, LabelOfFeedToRemove)
//If still on screen, we should remove the Feed Entry associated with this text message label.
THEFEED_REMOVE_ITEM (g_SavedGlobals.sTextMessageSavedData.g_TextMessage[TxtMsgArrayIndex].TxtMsgFeedEntryId)
#if IS_DEBUG_BUILD
cdPrintstring ("CELLPHONE_PUB - Call made to remove feed item associated with label at text message array index ")
cdPrintint (TxtMsgArrayIndex)
cdPrintnl()
#endif
ENDIF
ENDIF
#endif
TxtMsgArrayIndex ++
ENDWHILE
ENDPROC
//This will only remove feed entries that have been associated with a sent text message. Some feed messages may not have been sent by script.
//Consider using these if necessary:
//NATIVE PROC THEFEED_HIDE_THIS_FRAME()
//NATIVE PROC THEFEED_FLUSH_QUEUE() - this will get rid of ALL feed items
PROC FLUSH_TEXT_MESSAGE_FEED_ENTRIES()
INT TxtMsgArrayIndex = 0
#if IS_DEBUG_BUILD
cdPrintstring ("CELLPHONE_PUB - Call made to flush all text message related feed items.")
cdPrintnl()
#endif
WHILE TxtMsgArrayIndex < MAX_TEXT_MESSAGES
#if USE_CLF_DLC
//Remove the Feed Entry associated with this text message label.
THEFEED_REMOVE_ITEM (g_savedGlobalsClifford.sTextMessageSavedData.g_TextMessage[TxtMsgArrayIndex].TxtMsgFeedEntryId)
#endif
#if USE_NRM_DLC
//Remove the Feed Entry associated with this text message label.
THEFEED_REMOVE_ITEM (g_savedGlobalsnorman.sTextMessageSavedData.g_TextMessage[TxtMsgArrayIndex].TxtMsgFeedEntryId)
#endif
#if not USE_SP_DLC
//Remove the Feed Entry associated with this text message label.
THEFEED_REMOVE_ITEM (g_SavedGlobals.sTextMessageSavedData.g_TextMessage[TxtMsgArrayIndex].TxtMsgFeedEntryId)
#endif
TxtMsgArrayIndex ++
ENDWHILE
ENDPROC
#if USE_CLF_DLC
PROC DELETE_TEXT_MESSAGE_BY_LABEL_FROM_ALL_PLAYER_CHARACTERS_CLF (STRING LabelToDelete)
INT TxtMsgArrayIndex = 0
WHILE TxtMsgArrayIndex < MAX_TEXT_MESSAGES
IF NOT IS_STRING_NULL (g_savedGlobalsClifford.sTextMessageSavedData.g_TextMessage[TxtMsgArrayIndex].TxtMsgLabel)
IF ARE_STRINGS_EQUAL(g_savedGlobalsClifford.sTextMessageSavedData.g_TextMessage[TxtMsgArrayIndex].TxtMsgLabel, LabelToDelete)
IF g_savedGlobalsClifford.sTextMessageSavedData.g_TextMessage[TxtMsgArrayIndex].TxtMsgLockStatus = TXTMSG_LOCKED
#IF IS_DEBUG_BUILD
cdPrintstring ("CELLPHONE_PUB - Cannot delete this text message. It has LOCKED status.")
cdPrintnl ()
#endif
ELSE
g_savedGlobalsClifford.sTextMessageSavedData.g_TextMessage[TxtMsgArrayIndex].PhonePresence[0] = FALSE
g_savedGlobalsClifford.sTextMessageSavedData.g_TextMessage[TxtMsgArrayIndex].PhonePresence[1] = FALSE
g_savedGlobalsClifford.sTextMessageSavedData.g_TextMessage[TxtMsgArrayIndex].PhonePresence[2] = FALSE
IF NOT IS_TEXTMSG_PRESENT_IN_ANY_FILTER (TxtMsgArrayIndex) //This should always return false due to the FALSE settings above.
g_savedGlobalsClifford.sTextMessageSavedData.g_TextMessage[TxtMsgArrayIndex].TxtMsgLockStatus = TXTMSG_EMPTY
g_savedGlobalsClifford.sTextMessageSavedData.g_TextMessage[TxtMsgArrayIndex].TxtMsgReadStatus = UNREAD_TXTMSG
#IF IS_DEBUG_BUILD
cdPrintstring ("CELLPHONE_PUB - All singleplayer characters message no longer in any player filter. Deleted message from list at array position ")
cdPrintint (TxtMsgArrayIndex)
cdPrintnl()
#endif
ENDIF
ENDIF
ENDIF
ELSE
#IF IS_DEBUG_BUILD
cdPrintstring ("CELLPHONE_PUB - No txtmessage label specified. Cannot delete empty string.")
cdPrintnl ()
#endif
ENDIF
TxtMsgArrayIndex ++
ENDWHILE
ENDPROC
#endif
#if USE_NRM_DLC
PROC DELETE_TEXT_MESSAGE_BY_LABEL_FROM_ALL_PLAYER_CHARACTERS_NRM (STRING LabelToDelete)
INT TxtMsgArrayIndex = 0
WHILE TxtMsgArrayIndex < MAX_TEXT_MESSAGES
IF NOT IS_STRING_NULL (g_savedGlobalsnorman.sTextMessageSavedData.g_TextMessage[TxtMsgArrayIndex].TxtMsgLabel)
IF ARE_STRINGS_EQUAL(g_savedGlobalsnorman.sTextMessageSavedData.g_TextMessage[TxtMsgArrayIndex].TxtMsgLabel, LabelToDelete)
IF g_savedGlobalsnorman.sTextMessageSavedData.g_TextMessage[TxtMsgArrayIndex].TxtMsgLockStatus = TXTMSG_LOCKED
#IF IS_DEBUG_BUILD
cdPrintstring ("CELLPHONE_PUB - Cannot delete this text message. It has LOCKED status.")
cdPrintnl ()
#endif
ELSE
g_savedGlobalsnorman.sTextMessageSavedData.g_TextMessage[TxtMsgArrayIndex].PhonePresence[0] = FALSE
g_savedGlobalsnorman.sTextMessageSavedData.g_TextMessage[TxtMsgArrayIndex].PhonePresence[1] = FALSE
g_savedGlobalsnorman.sTextMessageSavedData.g_TextMessage[TxtMsgArrayIndex].PhonePresence[2] = FALSE
IF NOT IS_TEXTMSG_PRESENT_IN_ANY_FILTER (TxtMsgArrayIndex) //This should always return false due to the FALSE settings above.
g_savedGlobalsnorman.sTextMessageSavedData.g_TextMessage[TxtMsgArrayIndex].TxtMsgLockStatus = TXTMSG_EMPTY
g_savedGlobalsnorman.sTextMessageSavedData.g_TextMessage[TxtMsgArrayIndex].TxtMsgReadStatus = UNREAD_TXTMSG
#IF IS_DEBUG_BUILD
cdPrintstring ("CELLPHONE_PUB - All singleplayer characters message no longer in any player filter. Deleted message from list at array position ")
cdPrintint (TxtMsgArrayIndex)
cdPrintnl()
#endif
ENDIF
ENDIF
ENDIF
ELSE
#IF IS_DEBUG_BUILD
cdPrintstring ("CELLPHONE_PUB - No txtmessage label specified. Cannot delete empty string.")
cdPrintnl ()
#endif
ENDIF
TxtMsgArrayIndex ++
ENDWHILE
ENDPROC
#endif
PROC DELETE_TEXT_MESSAGE_BY_LABEL_FROM_ALL_PLAYER_CHARACTERS (STRING LabelToDelete)
#if USE_CLF_DLC
DELETE_TEXT_MESSAGE_BY_LABEL_FROM_ALL_PLAYER_CHARACTERS_CLF(LabelToDelete)
#endif
#if USE_NRM_DLC
DELETE_TEXT_MESSAGE_BY_LABEL_FROM_ALL_PLAYER_CHARACTERS_NRM(LabelToDelete)
#endif
#if not USE_SP_DLC
INT TxtMsgArrayIndex = 0
WHILE TxtMsgArrayIndex < MAX_TEXT_MESSAGES
IF NOT IS_STRING_NULL (g_SavedGlobals.sTextMessageSavedData.g_TextMessage[TxtMsgArrayIndex].TxtMsgLabel)
IF ARE_STRINGS_EQUAL(g_SavedGlobals.sTextMessageSavedData.g_TextMessage[TxtMsgArrayIndex].TxtMsgLabel, LabelToDelete)
IF g_SavedGlobals.sTextMessageSavedData.g_TextMessage[TxtMsgArrayIndex].TxtMsgLockStatus = TXTMSG_LOCKED
#IF IS_DEBUG_BUILD
cdPrintstring ("CELLPHONE_PUB - Cannot delete this text message. It has LOCKED status.")
cdPrintnl ()
#endif
ELSE
g_SavedGlobals.sTextMessageSavedData.g_TextMessage[TxtMsgArrayIndex].PhonePresence[0] = FALSE
g_SavedGlobals.sTextMessageSavedData.g_TextMessage[TxtMsgArrayIndex].PhonePresence[1] = FALSE
g_SavedGlobals.sTextMessageSavedData.g_TextMessage[TxtMsgArrayIndex].PhonePresence[2] = FALSE
IF NOT IS_TEXTMSG_PRESENT_IN_ANY_FILTER (TxtMsgArrayIndex) //This should always return false due to the FALSE settings above.
g_SavedGlobals.sTextMessageSavedData.g_TextMessage[TxtMsgArrayIndex].TxtMsgLockStatus = TXTMSG_EMPTY
g_SavedGlobals.sTextMessageSavedData.g_TextMessage[TxtMsgArrayIndex].TxtMsgReadStatus = UNREAD_TXTMSG
#IF IS_DEBUG_BUILD
cdPrintstring ("CELLPHONE_PUB - All singleplayer characters message no longer in any player filter. Deleted message from list at array position ")
cdPrintint (TxtMsgArrayIndex)
cdPrintnl()
#endif
ENDIF
ENDIF
ENDIF
ELSE
#IF IS_DEBUG_BUILD
cdPrintstring ("CELLPHONE_PUB - No txtmessage label specified. Cannot delete empty string.")
cdPrintnl ()
#endif
ENDIF
TxtMsgArrayIndex ++
ENDWHILE
#endif
ENDPROC
FUNC BOOL CHECK_FOR_MESSAGE_PRESENCE_IN_CHARACTER_MESSAGE_LIST (STRING LabelToCheck, enumCharacterList CharacterToCheck )
INT TxtMsgArrayIndex = 0
BOOL CheckBool = FALSE
IF ENUM_TO_INT(CharacterToCheck) > 3 //i.e not any SP or MP player character...
#if IS_DEBUG_BUILD
cdPrintstring ("CELLPHONE_PUB - The character passed into CHECK_FOR_MESSAGE_PRESENCE is not a phone owner! See Steve T.")
cdPrintnl ()
#endif
RETURN (FALSE)
ENDIF
WHILE TxtMsgArrayIndex < MAX_TEXT_MESSAGES
#if USE_CLF_DLC
IF NOT IS_STRING_NULL (g_savedGlobalsClifford.sTextMessageSavedData.g_TextMessage[TxtMsgArrayIndex].TxtMsgLabel)
IF ARE_STRINGS_EQUAL(g_savedGlobalsClifford.sTextMessageSavedData.g_TextMessage[TxtMsgArrayIndex].TxtMsgLabel, LabelToCheck)
IF g_savedGlobalsClifford.sTextMessageSavedData.g_TextMessage[TxtMsgArrayIndex].PhonePresence[ENUM_TO_INT(CharacterToCheck)]
#if IS_DEBUG_BUILD
cdPrintstring ("CELLPHONE_PUB - Specified message found in specified character message list at: ")
cdPrintint (TxtMsgArrayIndex)
cdPrintnl ()
#endif
CheckBool = TRUE
ENDIF
ENDIF
ENDIF
#endif
#if USE_NRM_DLC
IF NOT IS_STRING_NULL (g_savedGlobalsnorman.sTextMessageSavedData.g_TextMessage[TxtMsgArrayIndex].TxtMsgLabel)
IF ARE_STRINGS_EQUAL(g_savedGlobalsnorman.sTextMessageSavedData.g_TextMessage[TxtMsgArrayIndex].TxtMsgLabel, LabelToCheck)
IF g_savedGlobalsnorman.sTextMessageSavedData.g_TextMessage[TxtMsgArrayIndex].PhonePresence[ENUM_TO_INT(CharacterToCheck)]
#if IS_DEBUG_BUILD
cdPrintstring ("CELLPHONE_PUB - Specified message found in specified character message list at: ")
cdPrintint (TxtMsgArrayIndex)
cdPrintnl ()
#endif
CheckBool = TRUE
ENDIF
ENDIF
ENDIF
#endif
#if not USE_SP_DLC
IF NOT IS_STRING_NULL (g_SavedGlobals.sTextMessageSavedData.g_TextMessage[TxtMsgArrayIndex].TxtMsgLabel)
IF ARE_STRINGS_EQUAL(g_SavedGlobals.sTextMessageSavedData.g_TextMessage[TxtMsgArrayIndex].TxtMsgLabel, LabelToCheck)
IF g_SavedGlobals.sTextMessageSavedData.g_TextMessage[TxtMsgArrayIndex].PhonePresence[ENUM_TO_INT(CharacterToCheck)]
#if IS_DEBUG_BUILD
cdPrintstring ("CELLPHONE_PUB - Specified message found in specified character message list at: ")
cdPrintint (TxtMsgArrayIndex)
cdPrintnl ()
#endif
CheckBool = TRUE
ENDIF
ENDIF
ENDIF
#endif
TxtMsgArrayIndex ++
ENDWHILE
IF CheckBool = TRUE
#if IS_DEBUG_BUILD
cdPrintstring ("CELLPHONE_PUB - Specified message found in specified character message list.")
cdPrintnl ()
#endif
RETURN (TRUE)
ELSE
#if IS_DEBUG_BUILD
cdPrintstring ("CELLPHONE_PUB - Specified message NOT found in specified character message list.")
cdPrintnl ()
#endif
RETURN (FALSE)
ENDIF
ENDFUNC
#if USE_CLF_DLC
FUNC BOOL CHECK_FOR_MESSAGE_PRESENCE_IN_ANY_PLAYER_CHARACTER_MESSAGE_LIST_CLF (STRING LabelToCheck)
INT TxtMsgArrayIndex = 0
BOOL CheckBool = FALSE
WHILE TxtMsgArrayIndex < MAX_TEXT_MESSAGES
IF NOT IS_STRING_NULL (g_savedGlobalsClifford.sTextMessageSavedData.g_TextMessage[TxtMsgArrayIndex].TxtMsgLabel)
IF ARE_STRINGS_EQUAL(g_savedGlobalsClifford.sTextMessageSavedData.g_TextMessage[TxtMsgArrayIndex].TxtMsgLabel, LabelToCheck)
IF g_savedGlobalsClifford.sTextMessageSavedData.g_TextMessage[TxtMsgArrayIndex].PhonePresence[0]
OR g_savedGlobalsClifford.sTextMessageSavedData.g_TextMessage[TxtMsgArrayIndex].PhonePresence[1]
OR g_savedGlobalsClifford.sTextMessageSavedData.g_TextMessage[TxtMsgArrayIndex].PhonePresence[2]
#if IS_DEBUG_BUILD
cdPrintstring ("CELLPHONE_PUB - Specified message found in Michael, Trevor or Franklin message list at: ")
cdPrintint (TxtMsgArrayIndex)
cdPrintnl ()
#endif
CheckBool = TRUE
ENDIF
ENDIF
ENDIF
TxtMsgArrayIndex ++
ENDWHILE
IF CheckBool = TRUE
#if IS_DEBUG_BUILD
cdPrintstring ("CELLPHONE_PUB - Specified message found in any character message list.")
cdPrintnl ()
#endif
RETURN (TRUE)
ELSE
#if IS_DEBUG_BUILD
cdPrintstring ("CELLPHONE_PUB - Specified message NOT found in any character message list.")
cdPrintnl ()
#endif
RETURN (FALSE)
ENDIF
ENDFUNC
#endif
#if USE_NRM_DLC
FUNC BOOL CHECK_FOR_MESSAGE_PRESENCE_IN_ANY_PLAYER_CHARACTER_MESSAGE_LIST_NRM (STRING LabelToCheck)
INT TxtMsgArrayIndex = 0
BOOL CheckBool = FALSE
WHILE TxtMsgArrayIndex < MAX_TEXT_MESSAGES
IF NOT IS_STRING_NULL (g_savedGlobalsnorman.sTextMessageSavedData.g_TextMessage[TxtMsgArrayIndex].TxtMsgLabel)
IF ARE_STRINGS_EQUAL(g_savedGlobalsnorman.sTextMessageSavedData.g_TextMessage[TxtMsgArrayIndex].TxtMsgLabel, LabelToCheck)
IF g_savedGlobalsnorman.sTextMessageSavedData.g_TextMessage[TxtMsgArrayIndex].PhonePresence[0]
OR g_savedGlobalsnorman.sTextMessageSavedData.g_TextMessage[TxtMsgArrayIndex].PhonePresence[1]
OR g_savedGlobalsnorman.sTextMessageSavedData.g_TextMessage[TxtMsgArrayIndex].PhonePresence[2]
#if IS_DEBUG_BUILD
cdPrintstring ("CELLPHONE_PUB - Specified message found in Michael, Trevor or Franklin message list at: ")
cdPrintint (TxtMsgArrayIndex)
cdPrintnl ()
#endif
CheckBool = TRUE
ENDIF
ENDIF
ENDIF
TxtMsgArrayIndex ++
ENDWHILE
IF CheckBool = TRUE
#if IS_DEBUG_BUILD
cdPrintstring ("CELLPHONE_PUB - Specified message found in any character message list.")
cdPrintnl ()
#endif
RETURN (TRUE)
ELSE
#if IS_DEBUG_BUILD
cdPrintstring ("CELLPHONE_PUB - Specified message NOT found in any character message list.")
cdPrintnl ()
#endif
RETURN (FALSE)
ENDIF
ENDFUNC
#endif
FUNC BOOL CHECK_FOR_MESSAGE_PRESENCE_IN_ANY_PLAYER_CHARACTER_MESSAGE_LIST (STRING LabelToCheck)
#if USE_CLF_DLC
return CHECK_FOR_MESSAGE_PRESENCE_IN_ANY_PLAYER_CHARACTER_MESSAGE_LIST_CLF(LabelToCheck)
#endif
#if USE_NRM_DLC
return CHECK_FOR_MESSAGE_PRESENCE_IN_ANY_PLAYER_CHARACTER_MESSAGE_LIST_NRM(LabelToCheck)
#endif
#if not USE_SP_DLC
INT TxtMsgArrayIndex = 0
BOOL CheckBool = FALSE
WHILE TxtMsgArrayIndex < MAX_TEXT_MESSAGES
IF NOT IS_STRING_NULL (g_SavedGlobals.sTextMessageSavedData.g_TextMessage[TxtMsgArrayIndex].TxtMsgLabel)
IF ARE_STRINGS_EQUAL(g_SavedGlobals.sTextMessageSavedData.g_TextMessage[TxtMsgArrayIndex].TxtMsgLabel, LabelToCheck)
IF g_SavedGlobals.sTextMessageSavedData.g_TextMessage[TxtMsgArrayIndex].PhonePresence[0]
OR g_SavedGlobals.sTextMessageSavedData.g_TextMessage[TxtMsgArrayIndex].PhonePresence[1]
OR g_SavedGlobals.sTextMessageSavedData.g_TextMessage[TxtMsgArrayIndex].PhonePresence[2]
#if IS_DEBUG_BUILD
cdPrintstring ("CELLPHONE_PUB - Specified message found in Michael, Trevor or Franklin message list at: ")
cdPrintint (TxtMsgArrayIndex)
cdPrintnl ()
#endif
CheckBool = TRUE
ENDIF
ENDIF
ENDIF
TxtMsgArrayIndex ++
ENDWHILE
IF CheckBool = TRUE
#if IS_DEBUG_BUILD
cdPrintstring ("CELLPHONE_PUB - Specified message found in any character message list.")
cdPrintnl ()
#endif
RETURN (TRUE)
ELSE
#if IS_DEBUG_BUILD
cdPrintstring ("CELLPHONE_PUB - Specified message NOT found in any character message list.")
cdPrintnl ()
#endif
RETURN (FALSE)
ENDIF
#endif
ENDFUNC
//DANGER! This should only be used by the flow when necessary.
//This will completely reset the master text message list and as a consequence, all player character filters.
PROC PURGE_TEXT_MESSAGES_FOR_ALL_PLAYER_CHARACTERS()
INT TxtMsgArrayIndex = 0
#if USE_CLF_DLC
WHILE TxtMsgArrayIndex < MAX_TEXT_MESSAGES
g_savedGlobalsClifford.sTextMessageSavedData.g_TextMessage[TxtMsgArrayIndex].TxtMsgLockStatus = TXTMSG_EMPTY
g_savedGlobalsClifford.sTextMessageSavedData.g_TextMessage[TxtMsgArrayIndex].TxtMsgReadStatus = UNREAD_TXTMSG
g_savedGlobalsClifford.sTextMessageSavedData.g_TextMessage[TxtMsgArrayIndex].PhonePresence[0] = FALSE
g_savedGlobalsClifford.sTextMessageSavedData.g_TextMessage[TxtMsgArrayIndex].PhonePresence[1] = FALSE
g_savedGlobalsClifford.sTextMessageSavedData.g_TextMessage[TxtMsgArrayIndex].PhonePresence[2] = FALSE
TxtMsgArrayIndex ++
ENDWHILE
g_savedGlobalsClifford.sCellphoneSettingsData.This_Cellphone_Owner_Settings[CHAR_MICHAEL].g_LastMessageSentMustBeRead = FALSE
g_savedGlobalsClifford.sCellphoneSettingsData.This_Cellphone_Owner_Settings[CHAR_MICHAEL].g_LaunchToTextMessageScreen = FALSE
g_savedGlobalsClifford.sCellphoneSettingsData.This_Cellphone_Owner_Settings[CHAR_FRANKLIN].g_LastMessageSentMustBeRead = FALSE
g_savedGlobalsClifford.sCellphoneSettingsData.This_Cellphone_Owner_Settings[CHAR_FRANKLIN].g_LaunchToTextMessageScreen = FALSE
g_savedGlobalsClifford.sCellphoneSettingsData.This_Cellphone_Owner_Settings[CHAR_TREVOR].g_LastMessageSentMustBeRead = FALSE
g_savedGlobalsClifford.sCellphoneSettingsData.This_Cellphone_Owner_Settings[CHAR_TREVOR].g_LaunchToTextMessageScreen = FALSE
#endif
#if USE_NRM_DLC
WHILE TxtMsgArrayIndex < MAX_TEXT_MESSAGES
g_savedGlobalsnorman.sTextMessageSavedData.g_TextMessage[TxtMsgArrayIndex].TxtMsgLockStatus = TXTMSG_EMPTY
g_savedGlobalsnorman.sTextMessageSavedData.g_TextMessage[TxtMsgArrayIndex].TxtMsgReadStatus = UNREAD_TXTMSG
g_savedGlobalsnorman.sTextMessageSavedData.g_TextMessage[TxtMsgArrayIndex].PhonePresence[0] = FALSE
g_savedGlobalsnorman.sTextMessageSavedData.g_TextMessage[TxtMsgArrayIndex].PhonePresence[1] = FALSE
g_savedGlobalsnorman.sTextMessageSavedData.g_TextMessage[TxtMsgArrayIndex].PhonePresence[2] = FALSE
TxtMsgArrayIndex ++
ENDWHILE
g_savedGlobalsnorman.sCellphoneSettingsData.This_Cellphone_Owner_Settings[CHAR_MICHAEL].g_LastMessageSentMustBeRead = FALSE
g_savedGlobalsnorman.sCellphoneSettingsData.This_Cellphone_Owner_Settings[CHAR_MICHAEL].g_LaunchToTextMessageScreen = FALSE
g_savedGlobalsnorman.sCellphoneSettingsData.This_Cellphone_Owner_Settings[CHAR_FRANKLIN].g_LastMessageSentMustBeRead = FALSE
g_savedGlobalsnorman.sCellphoneSettingsData.This_Cellphone_Owner_Settings[CHAR_FRANKLIN].g_LaunchToTextMessageScreen = FALSE
g_savedGlobalsnorman.sCellphoneSettingsData.This_Cellphone_Owner_Settings[CHAR_TREVOR].g_LastMessageSentMustBeRead = FALSE
g_savedGlobalsnorman.sCellphoneSettingsData.This_Cellphone_Owner_Settings[CHAR_TREVOR].g_LaunchToTextMessageScreen = FALSE
#endif
#if not USE_SP_DLC
WHILE TxtMsgArrayIndex < MAX_TEXT_MESSAGES
g_SavedGlobals.sTextMessageSavedData.g_TextMessage[TxtMsgArrayIndex].TxtMsgLockStatus = TXTMSG_EMPTY
g_SavedGlobals.sTextMessageSavedData.g_TextMessage[TxtMsgArrayIndex].TxtMsgReadStatus = UNREAD_TXTMSG
g_SavedGlobals.sTextMessageSavedData.g_TextMessage[TxtMsgArrayIndex].PhonePresence[0] = FALSE
g_SavedGlobals.sTextMessageSavedData.g_TextMessage[TxtMsgArrayIndex].PhonePresence[1] = FALSE
g_SavedGlobals.sTextMessageSavedData.g_TextMessage[TxtMsgArrayIndex].PhonePresence[2] = FALSE
TxtMsgArrayIndex ++
ENDWHILE
g_savedGlobals.sCellphoneSettingsData.This_Cellphone_Owner_Settings[CHAR_MICHAEL].g_LastMessageSentMustBeRead = FALSE
g_savedGlobals.sCellphoneSettingsData.This_Cellphone_Owner_Settings[CHAR_MICHAEL].g_LaunchToTextMessageScreen = FALSE
g_savedGlobals.sCellphoneSettingsData.This_Cellphone_Owner_Settings[CHAR_FRANKLIN].g_LastMessageSentMustBeRead = FALSE
g_savedGlobals.sCellphoneSettingsData.This_Cellphone_Owner_Settings[CHAR_FRANKLIN].g_LaunchToTextMessageScreen = FALSE
g_savedGlobals.sCellphoneSettingsData.This_Cellphone_Owner_Settings[CHAR_TREVOR].g_LastMessageSentMustBeRead = FALSE
g_savedGlobals.sCellphoneSettingsData.This_Cellphone_Owner_Settings[CHAR_TREVOR].g_LaunchToTextMessageScreen = FALSE
#endif
#IF IS_DEBUG_BUILD
cdPrintnl()
cdPrintstring ("_______________________________________________________________________________________________________")
cdPrintnl()
cdPrintstring ("CELLPHONE_PUB - Purged text message list! g_TextMessage array set to TXTMSG_EMPTY and filters cleared.")
cdPrintstring ("_______________________________________________________________________________________________________")
cdPrintnl()
#endif
ENDPROC
FUNC BOOL IS_TEXTMESSAGE_LIST_IN_SINGLE_MESSAGE_VIEW()
#if USE_CLF_DLC
IF GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH ("appTextMessCLF")) > 0
IF g_Cellphone.PhoneDS = PDS_COMPLEXAPP
RETURN TRUE
ELSE
RETURN FALSE // Using text message app but it must be in full list view, so return false.
ENDIF
ELSE
RETURN FALSE
ENDIF
#endif
#if USE_NRM_DLC
IF GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH ("appTextMessNRM")) > 0
IF g_Cellphone.PhoneDS = PDS_COMPLEXAPP
RETURN TRUE
ELSE
RETURN FALSE // Using text message app but it must be in full list view, so return false.
ENDIF
ELSE
RETURN FALSE
ENDIF
#endif
#if not USE_CLF_DLC
#if not USE_NRM_DLC
IF GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH ("appTextMessage")) > 0
IF g_Cellphone.PhoneDS = PDS_COMPLEXAPP
RETURN TRUE
ELSE
RETURN FALSE // Using text message app but it must be in full list view, so return false.
ENDIF
ELSE
RETURN FALSE
ENDIF
#endif
#endif
ENDFUNC
PROC AUTO_RETURN_TO_FULL_TEXT_MESSAGE_LIST_VIEW()
SET_BIT (BitSet_CellphoneDisplay_Continued, g_BSC_AUTO_BACK_TEXTS_SINGLEMESSAGE_VIEW)
#if IS_DEBUG_BUILD
PRINTLN("\nCELLPHONE_PUB - Auto_Return_to_Full_Text bit set by [", GET_THIS_SCRIPT_NAME(), "] through public function.")
#endif
ENDPROC
//Wiki-ed.
//DANGER! This should really only be used by the flow. Locked messages will include those that are mission critical, so if you are removing the lock in order to delete
//a message, then proceed with caution!
//Update: If the message was critical it gets rid of that status and removes any signifiers.
#if USE_CLF_DLC
PROC UNLOCK_TEXT_MESSAGE_BY_LABEL_CLF (STRING LabelToUnlock, BOOL b_EnMasseDeletion = FALSE)
#if IS_DEBUG_BUILD
PRINTLN("\nCELLPHONE_PUB - UNLOCK_TEXT_MESSAGE_BY_LABEL called by [", GET_THIS_SCRIPT_NAME(), "] through public function.")
#endif
INT TxtMsgArrayIndex = 0
WHILE TxtMsgArrayIndex < MAX_TEXT_MESSAGES
IF NOT IS_STRING_NULL (g_savedGlobalsClifford.sTextMessageSavedData.g_TextMessage[TxtMsgArrayIndex].TxtMsgLabel)
IF ARE_STRINGS_EQUAL(g_savedGlobalsClifford.sTextMessageSavedData.g_TextMessage[TxtMsgArrayIndex].TxtMsgLabel, LabelToUnlock)
IF g_savedGlobalsClifford.sTextMessageSavedData.g_TextMessage[TxtMsgArrayIndex].TxtMsgLockStatus = TXTMSG_EMPTY
#if IS_DEBUG_BUILD
PRINTNL()
PRINTLN("\nCELLPHONE_PUB - UNLOCK_TEXT_MESSAGE_BY_LABEL called on EMPTY message index by [", GET_THIS_SCRIPT_NAME(), "] through public function. Overwriting with UNLOCK as a test.")
PRINTNL()
#endif
ENDIF
g_savedGlobalsClifford.sTextMessageSavedData.g_TextMessage[TxtMsgArrayIndex].TxtMsgLockStatus = TXTMSG_UNLOCKED
IF g_savedGlobalsClifford.sTextMessageSavedData.g_TextMessage[TxtMsgArrayIndex].TxtMsgCritical = TXTMSG_CRITICAL
//Revert all three player characters... do this based on presence
IF g_savedGlobalsClifford.sTextMessageSavedData.g_TextMessage[TxtMsgArrayIndex].PhonePresence[0] = TRUE
g_savedGlobalsClifford.sCellphoneSettingsData.This_Cellphone_Owner_Settings[CHAR_MICHAEL].g_LastMessageSentMustBeRead = FALSE
//g_LastMessageSentMustBeRead[0] = FALSE
ENDIF
IF g_savedGlobalsClifford.sTextMessageSavedData.g_TextMessage[TxtMsgArrayIndex].PhonePresence[1] = TRUE
g_savedGlobalsClifford.sCellphoneSettingsData.This_Cellphone_Owner_Settings[CHAR_FRANKLIN].g_LastMessageSentMustBeRead = FALSE
//g_LastMessageSentMustBeRead[1] = FALSE
ENDIF
IF g_savedGlobalsClifford.sTextMessageSavedData.g_TextMessage[TxtMsgArrayIndex].PhonePresence[2] = TRUE
g_savedGlobalsClifford.sCellphoneSettingsData.This_Cellphone_Owner_Settings[CHAR_TREVOR].g_LastMessageSentMustBeRead = FALSE
//g_LastMessageSentMustBeRead[2] = FALSE
ENDIF
// KGM 19/9/11: Added to allow Critical MP txtmsgs to be unlocked and cleaned up without being read
IF g_savedGlobalsClifford.sTextMessageSavedData.g_TextMessage[TxtMsgArrayIndex].PhonePresence[3] = TRUE
g_savedGlobalsClifford.sCellphoneSettingsData.This_Cellphone_Owner_Settings[CHAR_MULTIPLAYER].g_LastMessageSentMustBeRead = FALSE
#if IS_DEBUG_BUILD
cdPrintstring ("CELLPHONE_PUB - MP Critical text message marked as not critical at array position ")
cdPrintint (TxtMsgArrayIndex)
cdPrintnl ()
cdPrintstring ("CELLPHONE_PUB - MP Setting g_LastMessageSentMustBeRead to FALSE")
cdPrintnl()
#endif
//g_LastMessageSentMustBeRead[3] = FALSE
ENDIF
g_savedGlobalsClifford.sTextMessageSavedData.g_TextMessage[TxtMsgArrayIndex].TxtMsgCritical = TXTMSG_NOT_CRITICAL
//If en masse deletion is required, set the flag in this message and this will ensure that when the message is deleted, either manually or from script,
//it will be removed from all character filters.
IF b_EnMasseDeletion = TRUE
g_savedGlobalsClifford.sTextMessageSavedData.g_TextMessage[TxtMsgArrayIndex].TxtMsgDeletionMode = DELETE_FROM_ALL_CHARACTERS
ENDIF
ENDIF
#if IS_DEBUG_BUILD
cdPrintstring ("CELLPHONE_PUB - Unlocked text message at array position ")
cdPrintint (TxtMsgArrayIndex)
cdPrintnl ()
#endif
ENDIF
ENDIF
TxtMsgArrayIndex ++
ENDWHILE
ENDPROC
#endif
#if USE_NRM_DLC
PROC UNLOCK_TEXT_MESSAGE_BY_LABEL_NRM (STRING LabelToUnlock, BOOL b_EnMasseDeletion = FALSE)
#if IS_DEBUG_BUILD
PRINTLN("\nCELLPHONE_PUB - UNLOCK_TEXT_MESSAGE_BY_LABEL called by [", GET_THIS_SCRIPT_NAME(), "] through public function.")
#endif
INT TxtMsgArrayIndex = 0
WHILE TxtMsgArrayIndex < MAX_TEXT_MESSAGES
IF NOT IS_STRING_NULL (g_savedGlobalsnorman.sTextMessageSavedData.g_TextMessage[TxtMsgArrayIndex].TxtMsgLabel)
IF ARE_STRINGS_EQUAL(g_savedGlobalsnorman.sTextMessageSavedData.g_TextMessage[TxtMsgArrayIndex].TxtMsgLabel, LabelToUnlock)
IF g_savedGlobalsnorman.sTextMessageSavedData.g_TextMessage[TxtMsgArrayIndex].TxtMsgLockStatus = TXTMSG_EMPTY
#if IS_DEBUG_BUILD
PRINTNL()
PRINTLN("\nCELLPHONE_PUB - UNLOCK_TEXT_MESSAGE_BY_LABEL called on EMPTY message index by [", GET_THIS_SCRIPT_NAME(), "] through public function. Overwriting with UNLOCK as a test.")
PRINTNL()
#endif
ENDIF
g_savedGlobalsnorman.sTextMessageSavedData.g_TextMessage[TxtMsgArrayIndex].TxtMsgLockStatus = TXTMSG_UNLOCKED
IF g_savedGlobalsnorman.sTextMessageSavedData.g_TextMessage[TxtMsgArrayIndex].TxtMsgCritical = TXTMSG_CRITICAL
//Revert all three player characters... do this based on presence
IF g_savedGlobalsnorman.sTextMessageSavedData.g_TextMessage[TxtMsgArrayIndex].PhonePresence[0] = TRUE
g_savedGlobalsnorman.sCellphoneSettingsData.This_Cellphone_Owner_Settings[CHAR_NRM_MICHAEL].g_LastMessageSentMustBeRead = FALSE
//g_LastMessageSentMustBeRead[0] = FALSE
ENDIF
IF g_savedGlobalsnorman.sTextMessageSavedData.g_TextMessage[TxtMsgArrayIndex].PhonePresence[1] = TRUE
g_savedGlobalsnorman.sCellphoneSettingsData.This_Cellphone_Owner_Settings[CHAR_NRM_JIMMY].g_LastMessageSentMustBeRead = FALSE
//g_LastMessageSentMustBeRead[1] = FALSE
ENDIF
IF g_savedGlobalsnorman.sTextMessageSavedData.g_TextMessage[TxtMsgArrayIndex].PhonePresence[2] = TRUE
g_savedGlobalsnorman.sCellphoneSettingsData.This_Cellphone_Owner_Settings[CHAR_NRM_TRACEY].g_LastMessageSentMustBeRead = FALSE
//g_LastMessageSentMustBeRead[2] = FALSE
ENDIF
// KGM 19/9/11: Added to allow Critical MP txtmsgs to be unlocked and cleaned up without being read
IF g_savedGlobalsnorman.sTextMessageSavedData.g_TextMessage[TxtMsgArrayIndex].PhonePresence[3] = TRUE
g_savedGlobalsnorman.sCellphoneSettingsData.This_Cellphone_Owner_Settings[CHAR_MULTIPLAYER].g_LastMessageSentMustBeRead = FALSE
#if IS_DEBUG_BUILD
cdPrintstring ("CELLPHONE_PUB - MP Critical text message marked as not critical at array position ")
cdPrintint (TxtMsgArrayIndex)
cdPrintnl ()
cdPrintstring ("CELLPHONE_PUB - MP Setting g_LastMessageSentMustBeRead to FALSE")
cdPrintnl()
#endif
//g_LastMessageSentMustBeRead[3] = FALSE
ENDIF
g_savedGlobalsnorman.sTextMessageSavedData.g_TextMessage[TxtMsgArrayIndex].TxtMsgCritical = TXTMSG_NOT_CRITICAL
//If en masse deletion is required, set the flag in this message and this will ensure that when the message is deleted, either manually or from script,
//it will be removed from all character filters.
IF b_EnMasseDeletion = TRUE
g_savedGlobalsnorman.sTextMessageSavedData.g_TextMessage[TxtMsgArrayIndex].TxtMsgDeletionMode = DELETE_FROM_ALL_CHARACTERS
ENDIF
ENDIF
#if IS_DEBUG_BUILD
cdPrintstring ("CELLPHONE_PUB - Unlocked text message at array position ")
cdPrintint (TxtMsgArrayIndex)
cdPrintnl ()
#endif
ENDIF
ENDIF
TxtMsgArrayIndex ++
ENDWHILE
ENDPROC
#endif
PROC UNLOCK_TEXT_MESSAGE_BY_LABEL (STRING LabelToUnlock, BOOL b_EnMasseDeletion = FALSE)
#if USE_CLF_DLC
unlock_text_message_by_label_CLF(LabelToUnlock,b_EnMasseDeletion)
#endif
#if USE_NRM_DLC
unlock_text_message_by_label_NRM(LabelToUnlock,b_EnMasseDeletion)
#endif
#if not USE_SP_DLC
#if IS_DEBUG_BUILD
PRINTLN("\nCELLPHONE_PUB - UNLOCK_TEXT_MESSAGE_BY_LABEL called by [", GET_THIS_SCRIPT_NAME(), "] through public function.")
#endif
INT TxtMsgArrayIndex = 0
WHILE TxtMsgArrayIndex < MAX_TEXT_MESSAGES
IF NOT IS_STRING_NULL (g_SavedGlobals.sTextMessageSavedData.g_TextMessage[TxtMsgArrayIndex].TxtMsgLabel)
IF ARE_STRINGS_EQUAL(g_SavedGlobals.sTextMessageSavedData.g_TextMessage[TxtMsgArrayIndex].TxtMsgLabel, LabelToUnlock)
IF g_SavedGlobals.sTextMessageSavedData.g_TextMessage[TxtMsgArrayIndex].TxtMsgLockStatus = TXTMSG_EMPTY
#if IS_DEBUG_BUILD
PRINTNL()
PRINTLN("\nCELLPHONE_PUB - UNLOCK_TEXT_MESSAGE_BY_LABEL called on EMPTY message index by [", GET_THIS_SCRIPT_NAME(), "] through public function. Overwriting with UNLOCK as a test.")
PRINTNL()
#endif
ENDIF
g_SavedGlobals.sTextMessageSavedData.g_TextMessage[TxtMsgArrayIndex].TxtMsgLockStatus = TXTMSG_UNLOCKED
IF g_SavedGlobals.sTextMessageSavedData.g_TextMessage[TxtMsgArrayIndex].TxtMsgCritical = TXTMSG_CRITICAL
//Revert all three player characters... do this based on presence
IF g_SavedGlobals.sTextMessageSavedData.g_TextMessage[TxtMsgArrayIndex].PhonePresence[0] = TRUE
g_savedGlobals.sCellphoneSettingsData.This_Cellphone_Owner_Settings[CHAR_MICHAEL].g_LastMessageSentMustBeRead = FALSE
//g_LastMessageSentMustBeRead[0] = FALSE
ENDIF
IF g_SavedGlobals.sTextMessageSavedData.g_TextMessage[TxtMsgArrayIndex].PhonePresence[1] = TRUE
g_savedGlobals.sCellphoneSettingsData.This_Cellphone_Owner_Settings[CHAR_FRANKLIN].g_LastMessageSentMustBeRead = FALSE
//g_LastMessageSentMustBeRead[1] = FALSE
ENDIF
IF g_SavedGlobals.sTextMessageSavedData.g_TextMessage[TxtMsgArrayIndex].PhonePresence[2] = TRUE
g_savedGlobals.sCellphoneSettingsData.This_Cellphone_Owner_Settings[CHAR_TREVOR].g_LastMessageSentMustBeRead = FALSE
//g_LastMessageSentMustBeRead[2] = FALSE
ENDIF
// KGM 19/9/11: Added to allow Critical MP txtmsgs to be unlocked and cleaned up without being read
IF g_SavedGlobals.sTextMessageSavedData.g_TextMessage[TxtMsgArrayIndex].PhonePresence[3] = TRUE
g_savedGlobals.sCellphoneSettingsData.This_Cellphone_Owner_Settings[CHAR_MULTIPLAYER].g_LastMessageSentMustBeRead = FALSE
#if IS_DEBUG_BUILD
cdPrintstring ("CELLPHONE_PUB - MP Critical text message marked as not critical at array position ")
cdPrintint (TxtMsgArrayIndex)
cdPrintnl ()
cdPrintstring ("CELLPHONE_PUB - MP Setting g_LastMessageSentMustBeRead to FALSE")
cdPrintnl()
#endif
//g_LastMessageSentMustBeRead[3] = FALSE
ENDIF
g_SavedGlobals.sTextMessageSavedData.g_TextMessage[TxtMsgArrayIndex].TxtMsgCritical = TXTMSG_NOT_CRITICAL
//If en masse deletion is required, set the flag in this message and this will ensure that when the message is deleted, either manually or from script,
//it will be removed from all character filters.
IF b_EnMasseDeletion = TRUE
g_SavedGlobals.sTextMessageSavedData.g_TextMessage[TxtMsgArrayIndex].TxtMsgDeletionMode = DELETE_FROM_ALL_CHARACTERS
ENDIF
ENDIF
#if IS_DEBUG_BUILD
cdPrintstring ("CELLPHONE_PUB - Unlocked text message at array position ")
cdPrintint (TxtMsgArrayIndex)
cdPrintnl ()
#endif
ENDIF
ENDIF
TxtMsgArrayIndex ++
ENDWHILE
#endif
ENDPROC
//Tbis should ONLY be used by the flow... not for MULTIPLAYER. If you need an equivalent, please speak to me.
//Checks if any player character has a critical message waiting...
#if USE_CLF_DLC
FUNC BOOL IS_CRITICAL_MESSAGE_ALREADY_PENDING_FOR_ANY_PLAYER_CLF()
IF g_savedGlobalsClifford.sCellphoneSettingsData.This_Cellphone_Owner_Settings[CHAR_MICHAEL].g_LastMessageSentMustBeRead
OR g_savedGlobalsClifford.sCellphoneSettingsData.This_Cellphone_Owner_Settings[CHAR_FRANKLIN].g_LastMessageSentMustBeRead
OR g_savedGlobalsClifford.sCellphoneSettingsData.This_Cellphone_Owner_Settings[CHAR_TREVOR].g_LastMessageSentMustBeRead
IF g_savedGlobals.sCellphoneSettingsData.This_Cellphone_Owner_Settings[CHAR_MICHAEL].g_LastMessageSentMustBeRead
#IF IS_DEBUG_BUILD
cdPrintnl()
cdPrintstring ("CELLPHONE_PUB - Critical text message pending in Michael's list and has yet to be read. Won't accept another message for that character unless this is overridden.")
cdPrintnl()
#endif
ENDIF
IF g_savedGlobalsClifford.sCellphoneSettingsData.This_Cellphone_Owner_Settings[CHAR_FRANKLIN].g_LastMessageSentMustBeRead
#IF IS_DEBUG_BUILD
cdPrintnl()
cdPrintstring ("CELLPHONE_PUB - Critical text message pending in Franklin's list and has yet to be read. Won't accept another message for that character unless this is overridden.")
cdPrintnl()
#endif
ENDIF
IF g_savedGlobalsClifford.sCellphoneSettingsData.This_Cellphone_Owner_Settings[CHAR_TREVOR].g_LastMessageSentMustBeRead
#IF IS_DEBUG_BUILD
cdPrintnl()
cdPrintstring ("CELLPHONE_PUB - Critical text message pending in Trevor's list and has yet to be read. Won't accept another message for that character unless this is overridden.")
cdPrintnl()
#endif
ENDIF
RETURN TRUE
ELSE
#if IS_DEBUG_BUILD
cdPrintstring ("CELLPHONE_PUB - No critical text message pending in any character's stream. Can accept new critical message.")
cdPrintnl()
#endif
RETURN FALSE
ENDIF
ENDFUNC
#endif
#if USE_NRM_DLC
FUNC BOOL IS_CRITICAL_MESSAGE_ALREADY_PENDING_FOR_ANY_PLAYER_NRM()
IF g_savedGlobalsnorman.sCellphoneSettingsData.This_Cellphone_Owner_Settings[CHAR_NRM_MICHAEL].g_LastMessageSentMustBeRead
OR g_savedGlobalsnorman.sCellphoneSettingsData.This_Cellphone_Owner_Settings[CHAR_NRM_JIMMY].g_LastMessageSentMustBeRead
OR g_savedGlobalsnorman.sCellphoneSettingsData.This_Cellphone_Owner_Settings[CHAR_NRM_TRACEY].g_LastMessageSentMustBeRead
IF g_savedGlobalsnorman.sCellphoneSettingsData.This_Cellphone_Owner_Settings[CHAR_NRM_MICHAEL].g_LastMessageSentMustBeRead
#IF IS_DEBUG_BUILD
cdPrintnl()
cdPrintstring ("CELLPHONE_PUB - Critical text message pending in Michael's list and has yet to be read. Won't accept another message for that character unless this is overridden.")
cdPrintnl()
#endif
ENDIF
IF g_savedGlobalsnorman.sCellphoneSettingsData.This_Cellphone_Owner_Settings[CHAR_NRM_JIMMY].g_LastMessageSentMustBeRead
#IF IS_DEBUG_BUILD
cdPrintnl()
cdPrintstring ("CELLPHONE_PUB - Critical text message pending in Franklin's list and has yet to be read. Won't accept another message for that character unless this is overridden.")
cdPrintnl()
#endif
ENDIF
IF g_savedGlobalsnorman.sCellphoneSettingsData.This_Cellphone_Owner_Settings[CHAR_NRM_TRACEY].g_LastMessageSentMustBeRead
#IF IS_DEBUG_BUILD
cdPrintnl()
cdPrintstring ("CELLPHONE_PUB - Critical text message pending in Trevor's list and has yet to be read. Won't accept another message for that character unless this is overridden.")
cdPrintnl()
#endif
ENDIF
RETURN TRUE
ELSE
#if IS_DEBUG_BUILD
cdPrintstring ("CELLPHONE_PUB - No critical text message pending in any character's stream. Can accept new critical message.")
cdPrintnl()
#endif
RETURN FALSE
ENDIF
ENDFUNC
#endif
FUNC BOOL IS_CRITICAL_MESSAGE_ALREADY_PENDING_FOR_ANY_PLAYER()
#if USE_CLF_DLC
return IS_CRITICAL_MESSAGE_ALREADY_PENDING_FOR_ANY_PLAYER_CLF()
#endif
#if USE_NRM_DLC
return IS_CRITICAL_MESSAGE_ALREADY_PENDING_FOR_ANY_PLAYER_NRM()
#endif
#if not USE_SP_DLC
IF g_savedGlobals.sCellphoneSettingsData.This_Cellphone_Owner_Settings[CHAR_MICHAEL].g_LastMessageSentMustBeRead
OR g_savedGlobals.sCellphoneSettingsData.This_Cellphone_Owner_Settings[CHAR_FRANKLIN].g_LastMessageSentMustBeRead
OR g_savedGlobals.sCellphoneSettingsData.This_Cellphone_Owner_Settings[CHAR_TREVOR].g_LastMessageSentMustBeRead
IF g_savedGlobals.sCellphoneSettingsData.This_Cellphone_Owner_Settings[CHAR_MICHAEL].g_LastMessageSentMustBeRead
#IF IS_DEBUG_BUILD
cdPrintnl()
cdPrintstring ("CELLPHONE_PUB - Critical text message pending in Michael's list and has yet to be read. Won't accept another message for that character unless this is overridden.")
cdPrintnl()
#endif
ENDIF
IF g_savedGlobals.sCellphoneSettingsData.This_Cellphone_Owner_Settings[CHAR_FRANKLIN].g_LastMessageSentMustBeRead
#IF IS_DEBUG_BUILD
cdPrintnl()
cdPrintstring ("CELLPHONE_PUB - Critical text message pending in Franklin's list and has yet to be read. Won't accept another message for that character unless this is overridden.")
cdPrintnl()
#endif
ENDIF
IF g_savedGlobals.sCellphoneSettingsData.This_Cellphone_Owner_Settings[CHAR_TREVOR].g_LastMessageSentMustBeRead
#IF IS_DEBUG_BUILD
cdPrintnl()
cdPrintstring ("CELLPHONE_PUB - Critical text message pending in Trevor's list and has yet to be read. Won't accept another message for that character unless this is overridden.")
cdPrintnl()
#endif
ENDIF
RETURN TRUE
ELSE
#if IS_DEBUG_BUILD
cdPrintstring ("CELLPHONE_PUB - No critical text message pending in any character's stream. Can accept new critical message.")
cdPrintnl()
#endif
RETURN FALSE
ENDIF
#endif
ENDFUNC
//Specifies if the cellphone signifier movie is drawn to the screen, regardless of any signifiers present.
//
//CAUTION!
//
//
//Any onscreen signifiers will be hidden when this command is called with TRUE. Please ensure you call this with FALSE in your mission cleanup.
//
PROC HIDE_CELLPHONE_SIGNIFIERS_FOR_CUTSCENE (BOOL b_PassedBool)
IF b_PassedBool = TRUE
#if IS_DEBUG_BUILD
PRINTLN("\nCELLPHONE_PUB - Signifier movie hidden by script [", GET_THIS_SCRIPT_NAME(), "] through public function.")
cdPrintstring("CELLPHONE_PUB - Signifier movie HIDDEN by script")
cdPrintnl()
g_Debug_Signifiers_Hidden_by_Script = TRUE
#endif
SET_BIT (BitSet_CellphoneDisplay, g_BS_DISABLE_SIGNIFIERS_FOR_CUTSCENE)
ELSE
#if IS_DEBUG_BUILD
PRINTLN("\nCELLPHONE_PUB - Signifier movie now set to draw by script [", GET_THIS_SCRIPT_NAME(), "] through public function.")
cdPrintstring("CELLPHONE_PUB - Signifier movie re-enabled by script")
cdPrintnl()
g_Debug_Signifiers_Hidden_by_Script = FALSE
#endif
CLEAR_BIT (BitSet_CellphoneDisplay, g_BS_DISABLE_SIGNIFIERS_FOR_CUTSCENE)
ENDIF
ENDPROC
//Checks if the player character currently under control has a critical message in unread state...
FUNC BOOL IS_CRITICAL_MESSAGE_ALREADY_PENDING_FOR_CURRENT_PLAYER()
Get_Cellphone_Owner()
//IF g_LastMessageSentMustBeRead[g_Cellphone.PhoneOwner]
#if USE_CLF_DLC
IF g_savedGlobalsClifford.sCellphoneSettingsData.This_Cellphone_Owner_Settings[g_Cellphone.PhoneOwner].g_LastMessageSentMustBeRead
#IF IS_DEBUG_BUILD
cdPrintnl()
cdPrintstring ("CELLPHONE_PUB - Critical text message pending in current character's stream and has yet to be read. Won't accept another message for that character unless this is overridden. Character Int is ")
cdPrintint(ENUM_TO_INT(g_Cellphone.PhoneOwner))
cdPrintnl()
#endif
RETURN TRUE
ELSE
#IF IS_DEBUG_BUILD
cdPrintstring ("CELLPHONE_PUB - No critical text message pending for current character. Can accept new critical message for his stream.")
cdPrintnl()
#endif
RETURN FALSE
ENDIF
#endif
#if USE_NRM_DLC
IF g_savedGlobalsnorman.sCellphoneSettingsData.This_Cellphone_Owner_Settings[g_Cellphone.PhoneOwner].g_LastMessageSentMustBeRead
#IF IS_DEBUG_BUILD
cdPrintnl()
cdPrintstring ("CELLPHONE_PUB - Critical text message pending in current character's stream and has yet to be read. Won't accept another message for that character unless this is overridden. Character Int is ")
cdPrintint(ENUM_TO_INT(g_Cellphone.PhoneOwner))
cdPrintnl()
#endif
RETURN TRUE
ELSE
#IF IS_DEBUG_BUILD
cdPrintstring ("CELLPHONE_PUB - No critical text message pending for current character. Can accept new critical message for his stream.")
cdPrintnl()
#endif
RETURN FALSE
ENDIF
#endif
#if not USE_SP_DLC
IF g_savedGlobals.sCellphoneSettingsData.This_Cellphone_Owner_Settings[g_Cellphone.PhoneOwner].g_LastMessageSentMustBeRead
#IF IS_DEBUG_BUILD
cdPrintnl()
cdPrintstring ("CELLPHONE_PUB - Critical text message pending in current character's stream and has yet to be read. Won't accept another message for that character unless this is overridden. Character Int is ")
cdPrintint(ENUM_TO_INT(g_Cellphone.PhoneOwner))
cdPrintnl()
#endif
RETURN TRUE
ELSE
#IF IS_DEBUG_BUILD
cdPrintstring ("CELLPHONE_PUB - No critical text message pending for current character. Can accept new critical message for his stream.")
cdPrintnl()
#endif
RETURN FALSE
ENDIF
#endif
ENDFUNC
//Checks if the player character currently under control has a critical message in unread state...
FUNC BOOL IS_CRITICAL_MESSAGE_ALREADY_PENDING_FOR_PLAYER_ENUM(enumCharacterList PlayerEnum)
//Check enum is valid.
IF PlayerEnum != CHAR_MICHAEL
AND PlayerEnum != CHAR_FRANKLIN
AND PlayerEnum != CHAR_TREVOR
SCRIPT_ASSERT("IS_CRITICAL_MESSAGE_ALREADY_PENDING_FOR_PLAYER_ENUM: Enum passed was not for a player. Could not return valid result.")
RETURN FALSE
ENDIF
//IF g_LastMessageSentMustBeRead[g_Cellphone.PhoneOwner]
#if USE_CLF_DLC
IF g_savedGlobalsClifford.sCellphoneSettingsData.This_Cellphone_Owner_Settings[PlayerEnum].g_LastMessageSentMustBeRead
#IF IS_DEBUG_BUILD
cdPrintnl()
cdPrintstring ("CELLPHONE_PUB - Critical text message pending in player character's stream and has yet to be read. Won't accept another message for that character unless this is overridden. Character Int is ")
cdPrintint(ENUM_TO_INT(g_Cellphone.PhoneOwner))
cdPrintnl()
#ENDIF
RETURN TRUE
ELSE
#IF IS_DEBUG_BUILD
cdPrintstring ("CELLPHONE_PUB - No critical text message pending for player character. Can accept new critical message for his stream.")
cdPrintnl()
#ENDIF
RETURN FALSE
ENDIF
#endif
#if USE_NRM_DLC
IF g_savedGlobalsnorman.sCellphoneSettingsData.This_Cellphone_Owner_Settings[PlayerEnum].g_LastMessageSentMustBeRead
#IF IS_DEBUG_BUILD
cdPrintnl()
cdPrintstring ("CELLPHONE_PUB - Critical text message pending in player character's stream and has yet to be read. Won't accept another message for that character unless this is overridden. Character Int is ")
cdPrintint(ENUM_TO_INT(g_Cellphone.PhoneOwner))
cdPrintnl()
#ENDIF
RETURN TRUE
ELSE
#IF IS_DEBUG_BUILD
cdPrintstring ("CELLPHONE_PUB - No critical text message pending for player character. Can accept new critical message for his stream.")
cdPrintnl()
#ENDIF
RETURN FALSE
ENDIF
#endif
#if not USE_SP_DLC
IF g_savedGlobals.sCellphoneSettingsData.This_Cellphone_Owner_Settings[PlayerEnum].g_LastMessageSentMustBeRead
#IF IS_DEBUG_BUILD
cdPrintnl()
cdPrintstring ("CELLPHONE_PUB - Critical text message pending in player character's stream and has yet to be read. Won't accept another message for that character unless this is overridden. Character Int is ")
cdPrintint(ENUM_TO_INT(g_Cellphone.PhoneOwner))
cdPrintnl()
#ENDIF
RETURN TRUE
ELSE
#IF IS_DEBUG_BUILD
cdPrintstring ("CELLPHONE_PUB - No critical text message pending for player character. Can accept new critical message for his stream.")
cdPrintnl()
#ENDIF
RETURN FALSE
ENDIF
#endif
ENDFUNC
//Overrides any critical block for all player characters. Singleplayer only.
#if USE_CLF_DLC
FUNC BOOL OVERRIDE_CRITICAL_MESSAGE_BLOCK_FOR_ALL_PLAYERS_CLF()
IF g_savedGlobalsClifford.sCellphoneSettingsData.This_Cellphone_Owner_Settings[CHAR_MICHAEL].g_LastMessageSentMustBeRead
OR g_savedGlobalsClifford.sCellphoneSettingsData.This_Cellphone_Owner_Settings[CHAR_FRANKLIN].g_LastMessageSentMustBeRead
OR g_savedGlobalsClifford.sCellphoneSettingsData.This_Cellphone_Owner_Settings[CHAR_TREVOR].g_LastMessageSentMustBeRead
g_savedGlobalsClifford.sCellphoneSettingsData.This_Cellphone_Owner_Settings[CHAR_MICHAEL].g_LastMessageSentMustBeRead = FALSE
g_savedGlobalsClifford.sCellphoneSettingsData.This_Cellphone_Owner_Settings[CHAR_FRANKLIN].g_LastMessageSentMustBeRead = FALSE
g_savedGlobalsClifford.sCellphoneSettingsData.This_Cellphone_Owner_Settings[CHAR_TREVOR].g_LastMessageSentMustBeRead = FALSE
#if IS_DEBUG_BUILD
cdPrintnl()
cdPrintstring ("CELLPHONE_PUB - A critical message was already pending but blocks in all player streams have been overridden. Another message can be accepted")
cdPrintnl()
#endif
RETURN TRUE
ELSE
g_savedGlobalsClifford.sCellphoneSettingsData.This_Cellphone_Owner_Settings[CHAR_MICHAEL].g_LastMessageSentMustBeRead = FALSE
g_savedGlobalsClifford.sCellphoneSettingsData.This_Cellphone_Owner_Settings[CHAR_FRANKLIN].g_LastMessageSentMustBeRead = FALSE
g_savedGlobalsClifford.sCellphoneSettingsData.This_Cellphone_Owner_Settings[CHAR_TREVOR].g_LastMessageSentMustBeRead = FALSE
#if IS_DEBUG_BUILD
cdPrintstring ("CELLPHONE_PUB - No critical message was pending but blocks overridden anyway.")
cdPrintnl()
#endif
RETURN FALSE
ENDIF
ENDFUNC
#endif
#if USE_NRM_DLC
FUNC BOOL OVERRIDE_CRITICAL_MESSAGE_BLOCK_FOR_ALL_PLAYERS_NRM()
IF g_savedGlobalsnorman.sCellphoneSettingsData.This_Cellphone_Owner_Settings[CHAR_NRM_MICHAEL].g_LastMessageSentMustBeRead
OR g_savedGlobalsnorman.sCellphoneSettingsData.This_Cellphone_Owner_Settings[CHAR_NRM_JIMMY].g_LastMessageSentMustBeRead
OR g_savedGlobalsnorman.sCellphoneSettingsData.This_Cellphone_Owner_Settings[CHAR_NRM_TRACEY].g_LastMessageSentMustBeRead
g_savedGlobalsnorman.sCellphoneSettingsData.This_Cellphone_Owner_Settings[CHAR_MICHAEL].g_LastMessageSentMustBeRead = FALSE
g_savedGlobalsnorman.sCellphoneSettingsData.This_Cellphone_Owner_Settings[CHAR_NRM_JIMMY].g_LastMessageSentMustBeRead = FALSE
g_savedGlobalsnorman.sCellphoneSettingsData.This_Cellphone_Owner_Settings[CHAR_NRM_TRACEY].g_LastMessageSentMustBeRead = FALSE
#if IS_DEBUG_BUILD
cdPrintnl()
cdPrintstring ("CELLPHONE_PUB - A critical message was already pending but blocks in all player streams have been overridden. Another message can be accepted")
cdPrintnl()
#endif
RETURN TRUE
ELSE
g_savedGlobalsnorman.sCellphoneSettingsData.This_Cellphone_Owner_Settings[CHAR_NRM_MICHAEL].g_LastMessageSentMustBeRead = FALSE
g_savedGlobalsnorman.sCellphoneSettingsData.This_Cellphone_Owner_Settings[CHAR_NRM_JIMMY].g_LastMessageSentMustBeRead = FALSE
g_savedGlobalsnorman.sCellphoneSettingsData.This_Cellphone_Owner_Settings[CHAR_NRM_TRACEY].g_LastMessageSentMustBeRead = FALSE
#if IS_DEBUG_BUILD
cdPrintstring ("CELLPHONE_PUB - No critical message was pending but blocks overridden anyway.")
cdPrintnl()
#endif
RETURN FALSE
ENDIF
ENDFUNC
#endif
FUNC BOOL OVERRIDE_CRITICAL_MESSAGE_BLOCK_FOR_ALL_PLAYERS()
#if USE_CLF_DLC
return OVERRIDE_CRITICAL_MESSAGE_BLOCK_FOR_ALL_PLAYERS_CLF()
#endif
#if USE_NRM_DLC
return OVERRIDE_CRITICAL_MESSAGE_BLOCK_FOR_ALL_PLAYERS_NRM()
#endif
#if not USE_SP_DLC
IF g_savedGlobals.sCellphoneSettingsData.This_Cellphone_Owner_Settings[CHAR_MICHAEL].g_LastMessageSentMustBeRead
OR g_savedGlobals.sCellphoneSettingsData.This_Cellphone_Owner_Settings[CHAR_FRANKLIN].g_LastMessageSentMustBeRead
OR g_savedGlobals.sCellphoneSettingsData.This_Cellphone_Owner_Settings[CHAR_TREVOR].g_LastMessageSentMustBeRead
g_savedGlobals.sCellphoneSettingsData.This_Cellphone_Owner_Settings[CHAR_MICHAEL].g_LastMessageSentMustBeRead = FALSE
g_savedGlobals.sCellphoneSettingsData.This_Cellphone_Owner_Settings[CHAR_FRANKLIN].g_LastMessageSentMustBeRead = FALSE
g_savedGlobals.sCellphoneSettingsData.This_Cellphone_Owner_Settings[CHAR_TREVOR].g_LastMessageSentMustBeRead = FALSE
#if IS_DEBUG_BUILD
cdPrintnl()
cdPrintstring ("CELLPHONE_PUB - A critical message was already pending but blocks in all player streams have been overridden. Another message can be accepted")
cdPrintnl()
#endif
RETURN TRUE
ELSE
g_savedGlobals.sCellphoneSettingsData.This_Cellphone_Owner_Settings[CHAR_MICHAEL].g_LastMessageSentMustBeRead = FALSE
g_savedGlobals.sCellphoneSettingsData.This_Cellphone_Owner_Settings[CHAR_FRANKLIN].g_LastMessageSentMustBeRead = FALSE
g_savedGlobals.sCellphoneSettingsData.This_Cellphone_Owner_Settings[CHAR_TREVOR].g_LastMessageSentMustBeRead = FALSE
#if IS_DEBUG_BUILD
cdPrintstring ("CELLPHONE_PUB - No critical message was pending but blocks overridden anyway.")
cdPrintnl()
#endif
RETURN FALSE
ENDIF
#endif
ENDFUNC
//Wiki-ed.
//This function can be used to check if a text message that takes a reply, e.g a "replay mission" text, has received a specified reply.
//Returns one of the following:
//ENUM enumTxtMsgIsReplyRequired //specifies whether this text message will allow the player to reply with yes / no... a "replay mission" txt for example.
// NO_REPLY_REQUIRED,
// REPLY_IS_REQUIRED,
// REPLIED_YES,
// REPLIED_NO
//ENDENUM
#if USE_CLF_DLC
FUNC enumTxtMsgIsReplyRequired GET_TEXT_MESSAGE_REPLY_STATUS_CLF (STRING LabelToQuery)
INT TxtMsgArrayIndex = 0
enumTxtMsgIsReplyRequired eReplyStatusToReturn = NO_REPLY_REQUIRED
WHILE TxtMsgArrayIndex < MAX_TEXT_MESSAGES
IF NOT IS_STRING_NULL (g_savedGlobalsClifford.sTextMessageSavedData.g_TextMessage[TxtMsgArrayIndex].TxtMsgLabel)
IF ARE_STRINGS_EQUAL(g_savedGlobalsClifford.sTextMessageSavedData.g_TextMessage[TxtMsgArrayIndex].TxtMsgLabel, LabelToQuery)
eReplyStatusToReturn = g_savedGlobalsClifford.sTextMessageSavedData.g_TextMessage[TxtMsgArrayIndex].TxtMsgReplyStatus
RETURN eReplyStatusToReturn
ENDIF
ELSE
#IF IS_DEBUG_BUILD
cdPrintstring ("CELLPHONE_PUB - No txtmessage label specified. Cannot find reply match for empty string.")
cdPrintnl ()
#endif
ENDIF
TxtMsgArrayIndex ++
ENDWHILE
RETURN eReplyStatusToReturn
ENDFUNC
#endif
#if USE_NRM_DLC
FUNC enumTxtMsgIsReplyRequired GET_TEXT_MESSAGE_REPLY_STATUS_NRM (STRING LabelToQuery)
INT TxtMsgArrayIndex = 0
enumTxtMsgIsReplyRequired eReplyStatusToReturn = NO_REPLY_REQUIRED
WHILE TxtMsgArrayIndex < MAX_TEXT_MESSAGES
IF NOT IS_STRING_NULL (g_savedGlobalsnorman.sTextMessageSavedData.g_TextMessage[TxtMsgArrayIndex].TxtMsgLabel)
IF ARE_STRINGS_EQUAL(g_savedGlobalsnorman.sTextMessageSavedData.g_TextMessage[TxtMsgArrayIndex].TxtMsgLabel, LabelToQuery)
eReplyStatusToReturn = g_savedGlobalsnorman.sTextMessageSavedData.g_TextMessage[TxtMsgArrayIndex].TxtMsgReplyStatus
RETURN eReplyStatusToReturn
ENDIF
ELSE
#IF IS_DEBUG_BUILD
cdPrintstring ("CELLPHONE_PUB - No txtmessage label specified. Cannot find reply match for empty string.")
cdPrintnl ()
#endif
ENDIF
TxtMsgArrayIndex ++
ENDWHILE
RETURN eReplyStatusToReturn
ENDFUNC
#endif
FUNC enumTxtMsgIsReplyRequired GET_TEXT_MESSAGE_REPLY_STATUS (STRING LabelToQuery)
#if USE_CLF_DLC
return GET_TEXT_MESSAGE_REPLY_STATUS_CLF(LabelToQuery)
#endif
#if USE_NRM_DLC
return GET_TEXT_MESSAGE_REPLY_STATUS_NRM(LabelToQuery)
#endif
#if not USE_SP_DLC
INT TxtMsgArrayIndex = 0
enumTxtMsgIsReplyRequired eReplyStatusToReturn = NO_REPLY_REQUIRED
WHILE TxtMsgArrayIndex < MAX_TEXT_MESSAGES
IF NOT IS_STRING_NULL (g_SavedGlobals.sTextMessageSavedData.g_TextMessage[TxtMsgArrayIndex].TxtMsgLabel)
IF ARE_STRINGS_EQUAL(g_SavedGlobals.sTextMessageSavedData.g_TextMessage[TxtMsgArrayIndex].TxtMsgLabel, LabelToQuery)
eReplyStatusToReturn = g_SavedGlobals.sTextMessageSavedData.g_TextMessage[TxtMsgArrayIndex].TxtMsgReplyStatus
RETURN eReplyStatusToReturn
ENDIF
ELSE
#IF IS_DEBUG_BUILD
cdPrintstring ("CELLPHONE_PUB - No txtmessage label specified. Cannot find reply match for empty string.")
cdPrintnl ()
#endif
ENDIF
TxtMsgArrayIndex ++
ENDWHILE
RETURN eReplyStatusToReturn
#endif
ENDFUNC
//If you need to make sure that any text message with the passed label in the global array does not already contain a RESPONDED_YES or RESPONDED_NO tag
//but does require a reply if the same label is sent again, e.g a replay message, then call this. Call it just before you make your new request to SEND_TEXT_MESSAGE...
//This prevents a scenario where a fresh text message may auto-accept or reject because an earlier text with the same label has already been responded to by the player
//which would result in GET_TEXT_MESSAGE_REPLY_STATUS firing off the previous response.
#if USE_CLF_DLC
PROC SET_ALL_MATCHING_TEXT_MESSAGES_TO_REPLY_REQUIRED_CLF (STRING LabelToClear)
INT TxtMsgArrayIndex = 0
WHILE TxtMsgArrayIndex < MAX_TEXT_MESSAGES
IF NOT IS_STRING_NULL (g_savedGlobalsClifford.sTextMessageSavedData.g_TextMessage[TxtMsgArrayIndex].TxtMsgLabel)
IF ARE_STRINGS_EQUAL(g_savedGlobalsClifford.sTextMessageSavedData.g_TextMessage[TxtMsgArrayIndex].TxtMsgLabel, LabelToClear)
g_savedGlobalsClifford.sTextMessageSavedData.g_TextMessage[TxtMsgArrayIndex].TxtMsgReplyStatus = REPLY_IS_REQUIRED
#IF IS_DEBUG_BUILD
cdPrintstring ("CELLPHONE_PUB - Setting text message in array position ")
cdPrintint (TxtMsgArrayIndex)
cdPrintstring ("to require a reply via script.")
cdPrintnl()
#endif
ENDIF
ELSE
#IF IS_DEBUG_BUILD
cdPrintstring ("CELLPHONE_PUB - Cannot find reply match for empty string.")
cdPrintnl()
#endif
ENDIF
TxtMsgArrayIndex ++
ENDWHILE
ENDPROC
#endif
#if USE_NRM_DLC
PROC SET_ALL_MATCHING_TEXT_MESSAGES_TO_REPLY_REQUIRED_NRM (STRING LabelToClear)
INT TxtMsgArrayIndex = 0
WHILE TxtMsgArrayIndex < MAX_TEXT_MESSAGES
IF NOT IS_STRING_NULL (g_savedGlobalsnorman.sTextMessageSavedData.g_TextMessage[TxtMsgArrayIndex].TxtMsgLabel)
IF ARE_STRINGS_EQUAL(g_savedGlobalsnorman.sTextMessageSavedData.g_TextMessage[TxtMsgArrayIndex].TxtMsgLabel, LabelToClear)
g_savedGlobalsnorman.sTextMessageSavedData.g_TextMessage[TxtMsgArrayIndex].TxtMsgReplyStatus = REPLY_IS_REQUIRED
#IF IS_DEBUG_BUILD
cdPrintstring ("CELLPHONE_PUB - Setting text message in array position ")
cdPrintint (TxtMsgArrayIndex)
cdPrintstring ("to require a reply via script.")
cdPrintnl()
#endif
ENDIF
ELSE
#IF IS_DEBUG_BUILD
cdPrintstring ("CELLPHONE_PUB - Cannot find reply match for empty string.")
cdPrintnl()
#endif
ENDIF
TxtMsgArrayIndex ++
ENDWHILE
ENDPROC
#endif
PROC SET_ALL_MATCHING_TEXT_MESSAGES_TO_REPLY_REQUIRED (STRING LabelToClear)
#if USE_CLF_DLC
SET_ALL_MATCHING_TEXT_MESSAGES_TO_REPLY_REQUIRED_CLF(LabelToclear)
#endif
#if USE_NRM_DLC
SET_ALL_MATCHING_TEXT_MESSAGES_TO_REPLY_REQUIRED_NRM(LabelToclear)
#endif
#if not USE_SP_DLC
INT TxtMsgArrayIndex = 0
WHILE TxtMsgArrayIndex < MAX_TEXT_MESSAGES
IF NOT IS_STRING_NULL (g_SavedGlobals.sTextMessageSavedData.g_TextMessage[TxtMsgArrayIndex].TxtMsgLabel)
IF ARE_STRINGS_EQUAL(g_SavedGlobals.sTextMessageSavedData.g_TextMessage[TxtMsgArrayIndex].TxtMsgLabel, LabelToClear)
g_SavedGlobals.sTextMessageSavedData.g_TextMessage[TxtMsgArrayIndex].TxtMsgReplyStatus = REPLY_IS_REQUIRED
#IF IS_DEBUG_BUILD
cdPrintstring ("CELLPHONE_PUB - Setting text message in array position ")
cdPrintint (TxtMsgArrayIndex)
cdPrintstring ("to require a reply via script.")
cdPrintnl()
#endif
ENDIF
ELSE
#IF IS_DEBUG_BUILD
cdPrintstring ("CELLPHONE_PUB - Cannot find reply match for empty string.")
cdPrintnl()
#endif
ENDIF
TxtMsgArrayIndex ++
ENDWHILE
#endif
ENDPROC
//Picture Message handling.
//Important that you set this to false when you're finished and in cleanup. It dynamically alters the cellphone camera help text to include and facilitate a "send" option.
PROC ENABLE_PICTURE_MESSAGE_SENDING_AND_HELP (BOOL b_Enable)
IF b_Enable
SET_BIT (Bitset_CellphoneDisplay, g_BS_DISPLAY_SEND_IN_CAMERA_HELP_TEXT)
#if IS_DEBUG_BUILD
cdPrintstring ("CELLPHONE_PUB - Camera and help text set to include SEND functionality")
cdPrintnl()
#endif
ELSE
CLEAR_BIT (Bitset_CellphoneDisplay, g_BS_DISPLAY_SEND_IN_CAMERA_HELP_TEXT)
#if IS_DEBUG_BUILD
cdPrintstring ("CELLPHONE_PUB - Camera and help text now removes SEND functionality")
cdPrintnl()
#endif
ENDIF
ENDPROC
//If this is true, but HAS_CONTACT_RECEIVED is false, then you know the wrong contact has been selected by the user...
FUNC BOOL HAS_PICTURE_MESSAGE_BEEN_SENT_TO_ANY_CONTACT()
IF IS_BIT_SET (BitSet_CellphoneDisplay, g_BS_SENDPIC_CONTACT_SELECTED)
RETURN TRUE
ELSE
RETURN FALSE
ENDIF
ENDFUNC
//Checks that a specific contact has received a picture message. If a character has been sent a picture message, HAS_PICMSG_STORED will be the enum state for this element of his character sheet data.
FUNC BOOL HAS_CONTACT_RECEIVED_PICTURE_MESSAGE (enumCharacterList CharacterToCheck)
IF g_CharacterSheetNonSaved[CharacterToCheck].phone <> NO_PHONE_CONTACT
#if USE_CLF_DLC
IF g_savedGlobalsClifford.sCharSheetData.g_CharacterSheet[CharacterToCheck].picmsgStatus = HAS_PICMSG_STORED
RETURN TRUE
ELSE
RETURN FALSE
ENDIF
#endif
#if USE_NRM_DLC
IF g_savedGlobalsnorman.sCharSheetData.g_CharacterSheet[CharacterToCheck].picmsgStatus = HAS_PICMSG_STORED
RETURN TRUE
ELSE
RETURN FALSE
ENDIF
#endif
#if not USE_SP_DLC
IF GLOBAL_CHARACTER_SHEET_GET_PICTURE_MESSAGE_STATUS(CharacterToCheck) = HAS_PICMSG_STORED
RETURN TRUE
ELSE
RETURN FALSE
ENDIF
#endif
ELSE
/* Removed to make thing simpler for Hunting oddjob.
#if IS_DEBUG_BUILD
SCRIPT_ASSERT ("This character is not a phone contact. See Steve or Keith")
#endif
*/
RETURN FALSE
ENDIF
ENDFUNC
//Get rids of the HAS_PICMSG_STORED element of a character's individual sheet. Do this before your "take pic and send" routines to make sure you are starting afresh.
FUNC BOOL CLEAR_CONTACT_PICTURE_MESSAGE (enumCharacterList CharacterToCheck)
IF g_CharacterSheetNonSaved[CharacterToCheck].phone <> NO_PHONE_CONTACT
#if USE_CLF_DLC
g_savedGlobalsClifford.sCharSheetData.g_CharacterSheet[CharacterToCheck].picmsgStatus = NO_PICMSG_STORED
#endif
#if USE_NRM_DLC
g_savedGlobalsnorman.sCharSheetData.g_CharacterSheet[CharacterToCheck].picmsgStatus = NO_PICMSG_STORED
#endif
#if not USE_SP_DLC
GLOBAL_CHARACTER_SHEET_SET_PICTURE_MESSAGE_STATUS(CharacterToCheck, NO_PICMSG_STORED)
#endif
#if IS_DEBUG_BUILD
cdPrintstring ("CELLPHONE_PUB - Picture message status for contact cleared to empty.")
cdPrintnl()
#endif
RETURN TRUE
ELSE
#if IS_DEBUG_BUILD
SCRIPT_ASSERT ("CELLPHONE_PUB - This character is not a phone contact. See Steve or Keith")
#endif
RETURN FALSE
ENDIF
ENDFUNC
//Missed Calls
#if USE_CLF_DLC
FUNC BOOL SET_CONTACT_AS_MISSED_CALLER_CLF (enumCharacterList CharacterToCheck)
IF g_CharacterSheetNonSaved[CharacterToCheck].phone <> NO_PHONE_CONTACT
g_savedGlobalsClifford.sCharSheetData.g_CharacterSheet[CharacterToCheck].missedCallStatus[g_Cellphone.PhoneOwner] = MISSED_CALL
IF g_savedGlobalsClifford.sCharSheetData.g_CharacterSheet[CharacterToCheck].phonebookState[ENUM_TO_INT (g_Cellphone.PhoneOwner)] = NOT_LISTED
//Adds missed caller to current player.
INT tempInt = ENUM_TO_INT (g_Cellphone.PhoneOwner)
ADD_UNKNOWN_CONTACT_TO_PHONEBOOK (CharacterToCheck, INT_TO_ENUM (enumPhoneBookPresence, tempInt), FALSE)
ELSE
#IF IS_DEBUG_BUILD
cdPrintstring ("CELLPHONE_PUB - Missed call from contact already in phonebook...")
cdPrintnl()
#endif
ENDIF
#IF IS_DEBUG_BUILD
cdPrintstring ("CELLPHONE_PUB - Missed call set.")
cdPrintnl()
#endif
RETURN TRUE
ELSE
#IF IS_DEBUG_BUILD
SCRIPT_ASSERT ("CELLPHONE_PUB - This character is not a phone contact. See Steve, Ben or Keith")
#endif
RETURN FALSE
ENDIF
ENDFUNC
#endif
#if USE_NRM_DLC
FUNC BOOL SET_CONTACT_AS_MISSED_CALLER_NRM (enumCharacterList CharacterToCheck)
IF g_CharacterSheetNonSaved[CharacterToCheck].phone <> NO_PHONE_CONTACT
g_savedGlobalsnorman.sCharSheetData.g_CharacterSheet[CharacterToCheck].missedCallStatus[g_Cellphone.PhoneOwner] = MISSED_CALL
IF g_savedGlobalsnorman.sCharSheetData.g_CharacterSheet[CharacterToCheck].phonebookState[ENUM_TO_INT (g_Cellphone.PhoneOwner)] = NOT_LISTED
//Adds missed caller to current player.
INT tempInt = ENUM_TO_INT (g_Cellphone.PhoneOwner)
ADD_UNKNOWN_CONTACT_TO_PHONEBOOK (CharacterToCheck, INT_TO_ENUM (enumPhoneBookPresence, tempInt), FALSE)
ELSE
#IF IS_DEBUG_BUILD
cdPrintstring ("CELLPHONE_PUB - Missed call from contact already in phonebook...")
cdPrintnl()
#endif
ENDIF
#IF IS_DEBUG_BUILD
cdPrintstring ("CELLPHONE_PUB - Missed call set.")
cdPrintnl()
#endif
RETURN TRUE
ELSE
#IF IS_DEBUG_BUILD
SCRIPT_ASSERT ("CELLPHONE_PUB - This character is not a phone contact. See Steve, Ben or Keith")
#endif
RETURN FALSE
ENDIF
ENDFUNC
#endif
FUNC BOOL SET_CONTACT_AS_MISSED_CALLER (enumCharacterList CharacterToCheck)
#if USE_CLF_DLC
return SET_CONTACT_AS_MISSED_CALLER_CLF(CharacterToCheck)
#endif
#if USE_NRM_DLC
return SET_CONTACT_AS_MISSED_CALLER_NRM(CharacterToCheck)
#endif
#if not USE_SP_DLC
IF g_CharacterSheetNonSaved[CharacterToCheck].phone <> NO_PHONE_CONTACT
GLOBAL_CHARACTER_SHEET_SET_MISSED_CALL_STATUS(CharacterToCheck, ENUM_TO_INT(g_Cellphone.PhoneOwner), MISSED_CALL)
IF GLOBAL_CHARACTER_SHEET_GET_PHONEBOOK_STATE(CharacterToCheck, ENUM_TO_INT (g_Cellphone.PhoneOwner)) = NOT_LISTED
//Adds missed caller to current player.
INT tempInt = ENUM_TO_INT (g_Cellphone.PhoneOwner)
ADD_UNKNOWN_CONTACT_TO_PHONEBOOK (CharacterToCheck, INT_TO_ENUM (enumPhoneBookPresence, tempInt), FALSE)
ELSE
#IF IS_DEBUG_BUILD
cdPrintstring ("CELLPHONE_PUB - Missed call from contact already in phonebook...")
cdPrintnl()
#endif
ENDIF
#IF IS_DEBUG_BUILD
cdPrintstring ("CELLPHONE_PUB - Missed call set.")
cdPrintnl()
#endif
RETURN TRUE
ELSE
#IF IS_DEBUG_BUILD
SCRIPT_ASSERT ("CELLPHONE_PUB - This character is not a phone contact. See Steve, Ben or Keith")
#endif
RETURN FALSE
ENDIF
#endif
ENDFUNC
FUNC BOOL CLEAR_MISSED_CALLER_STATUS_FOR_CONTACT (enumCharacterList CharacterToCheck)
IF g_CharacterSheetNonSaved[CharacterToCheck].phone <> NO_PHONE_CONTACT
#if USE_CLF_DLC
IF g_savedGlobalsClifford.sCharSheetData.g_CharacterSheet[CharacterToCheck].missedCallStatus[g_Cellphone.PhoneOwner] = MISSED_CALL
#IF IS_DEBUG_BUILD
cdPrintstring ("CELLPHONE_PUB - Clearing missed call status...")
cdPrintnl()
#endif
g_savedGlobalsClifford.sCharSheetData.g_CharacterSheet[CharacterToCheck].missedCallStatus[g_Cellphone.PhoneOwner] = NO_MISSED_CALL
//Remove this caller from the current player's phonebook if he is an unknown caller.
IF g_savedGlobalsClifford.sCharSheetData.g_CharacterSheet[CharacterToCheck].StatusAsCaller[g_Cellphone.PhoneOwner] = UNKNOWN_CALLER
INT tempInt = ENUM_TO_INT (g_Cellphone.PhoneOwner)
REMOVE_CONTACT_FROM_INDIVIDUAL_PHONEBOOK (CharacterToCheck, INT_TO_ENUM (enumPhoneBookPresence, tempInt))
ENDIF
RETURN TRUE
ELSE
#if IS_DEBUG_BUILD
cdPrintstring ("CELLPHONE_PUB - Missed call status was already clear for this contact.")
cdPrintnl()
#endif
RETURN FALSE
ENDIF
#endif
#if USE_NRM_DLC
IF g_savedGlobalsnorman.sCharSheetData.g_CharacterSheet[CharacterToCheck].missedCallStatus[g_Cellphone.PhoneOwner] = MISSED_CALL
#IF IS_DEBUG_BUILD
cdPrintstring ("CELLPHONE_PUB - Clearing missed call status...")
cdPrintnl()
#endif
g_savedGlobalsnorman.sCharSheetData.g_CharacterSheet[CharacterToCheck].missedCallStatus[g_Cellphone.PhoneOwner] = NO_MISSED_CALL
//Remove this caller from the current player's phonebook if he is an unknown caller.
IF g_savedGlobalsnorman.sCharSheetData.g_CharacterSheet[CharacterToCheck].StatusAsCaller[g_Cellphone.PhoneOwner] = UNKNOWN_CALLER
INT tempInt = ENUM_TO_INT (g_Cellphone.PhoneOwner)
REMOVE_CONTACT_FROM_INDIVIDUAL_PHONEBOOK (CharacterToCheck, INT_TO_ENUM (enumPhoneBookPresence, tempInt))
ENDIF
RETURN TRUE
ELSE
#if IS_DEBUG_BUILD
cdPrintstring ("CELLPHONE_PUB - Missed call status was already clear for this contact.")
cdPrintnl()
#endif
RETURN FALSE
ENDIF
#endif
#if not USE_SP_DLC
IF GLOBAL_CHARACTER_SHEET_GET_MISSED_CALL_STATUS(CharacterToCheck, ENUM_TO_INT(g_Cellphone.PhoneOwner)) = MISSED_CALL
#IF IS_DEBUG_BUILD
cdPrintstring ("CELLPHONE_PUB - Clearing missed call status...")
cdPrintnl()
#endif
GLOBAL_CHARACTER_SHEET_SET_MISSED_CALL_STATUS(CharacterToCheck, ENUM_TO_INT(g_Cellphone.PhoneOwner), NO_MISSED_CALL)
//Remove this caller from the current player's phonebook if he is an unknown caller.
IF GLOBAL_CHARACTER_SHEET_GET_STATUS_AS_CALLER(CharacterToCheck, ENUM_TO_INT(g_Cellphone.PhoneOwner)) = UNKNOWN_CALLER
INT tempInt = ENUM_TO_INT (g_Cellphone.PhoneOwner)
REMOVE_CONTACT_FROM_INDIVIDUAL_PHONEBOOK (CharacterToCheck, INT_TO_ENUM (enumPhoneBookPresence, tempInt))
ENDIF
RETURN TRUE
ELSE
#if IS_DEBUG_BUILD
cdPrintstring ("CELLPHONE_PUB - Missed call status was already clear for this contact.")
cdPrintnl()
#endif
RETURN FALSE
ENDIF
#endif
ELSE
#if IS_DEBUG_BUILD
SCRIPT_ASSERT ("CELLPHONE_PUB - This character is not a phone contact. See Steve, Ben or Keith")
#endif
RETURN FALSE
ENDIF
ENDFUNC
//_______________________________________________________________________________________________________________________________________________________________________
//
// Special Application section.
//
//_______________________________________________________________________________________________________________________________________________________________________
//Second application screen functionality.
//Currently only the sniper app is making use of the second screen. This may be expanded upon.
#if USE_CLF_DLC
PROC ENABLE_SECOND_SCREEN_SNIPER_APP_CLF (BOOL bEnable = FALSE)
IF bEnable
g_savedGlobalsClifford.sCellphoneSettingsData.b_IsSniperAppAvailable = TRUE
#if IS_DEBUG_BUILD
PRINTLN("\nCELLPHONE_PUB - Sniper App enabled from [", GET_THIS_SCRIPT_NAME(), "] through public function.")
#endif
ELSE
g_savedGlobalsClifford.sCellphoneSettingsData.b_IsSniperAppAvailable = FALSE
#if IS_DEBUG_BUILD
PRINTLN("\nCELLPHONE_PUB - Sniper App disabled from [", GET_THIS_SCRIPT_NAME(), "] through public function.")
#endif
ENDIF
ENDPROC
#ENDIF
#if USE_NRM_DLC
PROC ENABLE_SECOND_SCREEN_SNIPER_APP_NRM (BOOL bEnable = FALSE)
IF bEnable
g_savedGlobalsnorman.sCellphoneSettingsData.b_IsSniperAppAvailable = TRUE
#if IS_DEBUG_BUILD
PRINTLN("\nCELLPHONE_PUB - Sniper App enabled from [", GET_THIS_SCRIPT_NAME(), "] through public function.")
#endif
ELSE
g_savedGlobalsnorman.sCellphoneSettingsData.b_IsSniperAppAvailable = FALSE
#if IS_DEBUG_BUILD
PRINTLN("\nCELLPHONE_PUB - Sniper App disabled from [", GET_THIS_SCRIPT_NAME(), "] through public function.")
#endif
ENDIF
ENDPROC
#ENDIF
PROC ENABLE_SECOND_SCREEN_SNIPER_APP (BOOL bEnable = FALSE)
#if USE_CLF_DLC
ENABLE_SECOND_SCREEN_SNIPER_APP_CLF(bEnable)
#endif
#if USE_NRM_DLC
ENABLE_SECOND_SCREEN_SNIPER_APP_NRM(bEnable)
#endif
#if not USE_SP_DLC
IF bEnable
g_savedGlobals.sCellphoneSettingsData.b_IsSniperAppAvailable = TRUE
#if IS_DEBUG_BUILD
PRINTLN("\nCELLPHONE_PUB - Sniper App enabled from [", GET_THIS_SCRIPT_NAME(), "] through public function.")
#endif
ELSE
g_savedGlobals.sCellphoneSettingsData.b_IsSniperAppAvailable = FALSE
#if IS_DEBUG_BUILD
PRINTLN("\nCELLPHONE_PUB - Sniper App disabled from [", GET_THIS_SCRIPT_NAME(), "] through public function.")
#endif
ENDIF
#endif
ENDPROC
FUNC BOOL HAS_SNIPER_APP_BEEN_SELECTED()
IF IS_BIT_SET (BitSet_CellphoneDisplay, g_BS_SNIPER_APP_SELECTED)
RETURN TRUE
ELSE
RETURN FALSE
ENDIF
ENDFUNC
PROC CLEAR_SNIPER_APP_SELECTION()
CLEAR_BIT (BitSet_CellphoneDisplay, g_BS_SNIPER_APP_SELECTED)
ENDPROC
//Trackify
#if USE_CLF_DLC
PROC ENABLE_SECOND_SCREEN_TRACKIFY_APP_CLF (BOOL bEnable = FALSE)
IF bEnable
g_savedGlobalsClifford.sCellphoneSettingsData.b_IsTrackifyAppAvailable = TRUE
#if IS_DEBUG_BUILD
PRINTLN("\nCELLPHONE_PUB - Trackify enabled from [", GET_THIS_SCRIPT_NAME(), "] through public function.")
#endif
ELSE
g_savedGlobalsClifford.sCellphoneSettingsData.b_IsTrackifyAppAvailable = FALSE
#if IS_DEBUG_BUILD
PRINTLN("\nCELLPHONE_PUB - Trackify disabled from [", GET_THIS_SCRIPT_NAME(), "] through public function.")
#endif
ENDIF
ENDPROC
#ENDIF
#if USE_NRM_DLC
PROC ENABLE_SECOND_SCREEN_TRACKIFY_APP_NRM (BOOL bEnable = FALSE)
IF bEnable
g_savedGlobalsnorman.sCellphoneSettingsData.b_IsTrackifyAppAvailable = TRUE
#if IS_DEBUG_BUILD
PRINTLN("\nCELLPHONE_PUB - Trackify enabled from [", GET_THIS_SCRIPT_NAME(), "] through public function.")
#endif
ELSE
g_savedGlobalsnorman.sCellphoneSettingsData.b_IsTrackifyAppAvailable = FALSE
#if IS_DEBUG_BUILD
PRINTLN("\nCELLPHONE_PUB - Trackify disabled from [", GET_THIS_SCRIPT_NAME(), "] through public function.")
#endif
ENDIF
ENDPROC
#ENDIF
PROC ENABLE_SECOND_SCREEN_TRACKIFY_APP (BOOL bEnable = FALSE)
#if USE_CLF_DLC
ENABLE_SECOND_SCREEN_TRACKIFY_APP_CLF(bEnable)
#ENDIF
#if USE_NRM_DLC
ENABLE_SECOND_SCREEN_TRACKIFY_APP_NRM(bEnable)
#ENDIF
#if not USE_SP_DLC
IF bEnable
g_savedGlobals.sCellphoneSettingsData.b_IsTrackifyAppAvailable = TRUE
#if IS_DEBUG_BUILD
PRINTLN("\nCELLPHONE_PUB - Trackify enabled from [", GET_THIS_SCRIPT_NAME(), "] through public function.")
#endif
ELSE
g_savedGlobals.sCellphoneSettingsData.b_IsTrackifyAppAvailable = FALSE
#if IS_DEBUG_BUILD
PRINTLN("\nCELLPHONE_PUB - Trackify disabled from [", GET_THIS_SCRIPT_NAME(), "] through public function.")
#endif
ENDIF
#ENDIF
ENDPROC
//Multiplayer Trackify
PROC ENABLE_MULTIPLAYER_TRACKIFY_APP (BOOL bEnable = FALSE)
IF bEnable
SET_BIT (BitSet_CellphoneTU, g_BSTU_ENABLE_MP_TRACKIFY)
#if IS_DEBUG_BUILD
PRINTLN("\nCELLPHONE_PUB - MULTIPLAYER Trackify enabled from [", GET_THIS_SCRIPT_NAME(), "] through public function.")
#endif
//g_b_Secondary_Screen_Available = TRUE //enable seconds screen if not already present, which in turn adds trackify app.
ELSE
CLEAR_BIT (BitSet_CellphoneTU, g_BSTU_ENABLE_MP_TRACKIFY)
#if IS_DEBUG_BUILD
PRINTLN("\nCELLPHONE_PUB - MULTIPLAYER Trackify disabled from [", GET_THIS_SCRIPT_NAME(), "] through public function.")
#endif
//g_b_Secondary_Screen_Available = FALSE //default to having secondary screen unavailable
ENDIF
ENDPROC
FUNC BOOL LAUNCH_TRACKIFY_IMMEDIATELY(BOOL SkipLoadingScreen = FALSE)
IF LAUNCH_CELLPHONE_APPLICATION (appTrackify, FALSE, TRUE)
#if IS_DEBUG_BUILD
PRINTLN("\nCELLPHONE_PUB - Trackify launched from [", GET_THIS_SCRIPT_NAME(), "] through public function.")
#endif
IF SkipLoadingScreen = TRUE
SET_BIT (BitSet_CellphoneDisplay_Continued, g_BSC_SKIP_TRACKIFY_LOADING_SCREEN)
ELSE
CLEAR_BIT (BitSet_CellphoneDisplay_Continued, g_BSC_SKIP_TRACKIFY_LOADING_SCREEN)
ENDIF
RETURN TRUE
ELSE
#if IS_DEBUG_BUILD
cdPrintnl()
cdPrintstring ("CELLPHONE_PUB - Failed to launch Trackify via script function.")
cdPrintnl()
#endif
RETURN FALSE
ENDIF
ENDFUNC
FUNC BOOL IS_CELLPHONE_TRACKIFY_IN_USE()
IF GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH ("appTrackify")) > 0
RETURN TRUE
ELSE
RETURN FALSE
ENDIF
ENDFUNC
PROC SET_TRACKIFY_TARGET_VECTOR (VECTOR YourVector, BOOL b_HideTargetArrow = FALSE, BOOL b_DisplayRelativeHeight = FALSE)
g_v_TrackifyTarget = YourVector
CLEAR_BIT (BitSet_CellphoneDisplay_Continued, g_BSC_REMOVE_TRACKIFY_TARGET)
IF b_HideTargetArrow
SET_BIT (BitSet_CellphoneDisplay_Continued, g_BSC_HIDE_TRACKIFY_TARGET_ARROW)
#if IS_DEBUG_BUILD
//Make sure this always displays regardless of phone debug text widget toggle.
PRINTLN("\nCELLPHONE_PUB - Trackify target arrow hidden from [", GET_THIS_SCRIPT_NAME(), "] through public function.")
#endif
ELSE
CLEAR_BIT (BitSet_CellphoneDisplay_Continued, g_BSC_HIDE_TRACKIFY_TARGET_ARROW)
#if IS_DEBUG_BUILD
//Make sure this always displays regardless of phone debug text widget toggle.
PRINTLN("\nCELLPHONE_PUB - Trackify target arrow shown from [", GET_THIS_SCRIPT_NAME(), "] through public function.")
#endif
ENDIF
IF b_DisplayRelativeHeight
SET_BIT (BitSet_CellphoneDisplay_Third, g_BSTHIRD_DISPLAY_TRACKIFY_RELATIVE_HEIGHT)
#if IS_DEBUG_BUILD
//Make sure this always displays regardless of phone debug text widget toggle.
PRINTLN("\nCELLPHONE_PUB - Trackify relative height set to display from [", GET_THIS_SCRIPT_NAME(), "] through public function.")
#endif
ELSE
CLEAR_BIT (BitSet_CellphoneDisplay_Third, g_BSTHIRD_DISPLAY_TRACKIFY_RELATIVE_HEIGHT)
#if IS_DEBUG_BUILD
//Make sure this always displays regardless of phone debug text widget toggle.
PRINTLN("\nCELLPHONE_PUB - Trackify relative height hidden from [", GET_THIS_SCRIPT_NAME(), "] through public function.")
#endif
ENDIF
ENDPROC
PROC SET_NUMBER_OF_MULTIPLE_TRACKIFY_TARGETS(INT YourTargetAmount)
IF YourTargetAmount > c_MaxNumberOfTrackifyTargets //currently at 4
#if IS_DEBUG_BUILD
//Make sure this always displays regardless of phone debug text widget toggle.
PRINTLN("\nCELLPHONE_PUB - WARNING! Number of trackify targets is greater than Max Number. Set from [", GET_THIS_SCRIPT_NAME(), "] through public function.")
cdPrintstring("CELLPHONE_PUB - Faulty number of Trackify Targets passed was ")
cdPrintint(YourTargetAmount)
#endif
ELSE
#if IS_DEBUG_BUILD
cdPrintstring ("CELLPHONE_PUB - Number of Multiple Trackify Targets set to ")
cdPrintint(YourTargetAmount)
cdPrintnl()
#endif
g_i_NumberOfTrackifyTargets = YourTargetAmount
ENDIF
ENDPROC
//Specifies the arrow type for this Trackify target, Useful for displaying relative height indicators between a target blip and another entity. You need to set this every time you want the arrow to change.
//Trackify doesn't work out the relative heights between things. You need to do that calculation in your script and then call the procedure below.
/*
ENUM eTrackifyArrowType
Arrow_Off,
Arrow_Neutral,
Arrow_Up,
Arrow_Down
ENDENUM
*/
PROC SET_TRACKIFY_MULTIPLE_TARGET_ARROW_TYPE (INT WhichTarget, eTrackifyArrowType ArrowType)
g_v_TrackifyMPTargetArrowType[WhichTarget] = ArrowType
ENDPROC
PROC SET_TRACKIFY_MULTIPLE_TARGET_VECTOR (INT WhichTarget, VECTOR YourVector, BOOL b_HideTargetArrow = TRUE, BOOL b_DisplayRelativeHeight = FALSE)
g_v_TrackifyMultipleTarget[WhichTarget] = YourVector
#if IS_DEBUG_BUILD
cdPrintstring ("CELLPHONE_PUB - Specifying Multiple Target Vector instance ")
cdPrintint(WhichTarget)
cdPrintstring(" at ")
cdPrintint(FLOOR(YourVector.X))
cdPrintint(FLOOR(YourVector.Y))
cdPrintint(FLOOR(YourVector.Z))
cdPrintnl()
#endif
SWITCH WhichTarget
CASE 0
CLEAR_BIT (BitSet_CellphoneTU, g_BSTU_REMOVE_MP_TRACKIFY_TARGET_0)
BREAK
CASE 1
CLEAR_BIT (BitSet_CellphoneTU, g_BSTU_REMOVE_MP_TRACKIFY_TARGET_1)
BREAK
CASE 2
CLEAR_BIT (BitSet_CellphoneTU, g_BSTU_REMOVE_MP_TRACKIFY_TARGET_2)
BREAK
CASE 3
CLEAR_BIT (BitSet_CellphoneTU, g_BSTU_REMOVE_MP_TRACKIFY_TARGET_3)
BREAK
DEFAULT
#if IS_DEBUG_BUILD
//Make sure this always displays regardless of phone debug text widget toggle.
PRINTLN("\nCELLPHONE_PUB - Weird Target specified [", GET_THIS_SCRIPT_NAME(), "] through public function. This will likely cause an array overrun")
#endif
BREAK
ENDSWITCH
g_v_TrackifyMultipleTarget[WhichTarget] = YourVector
IF b_HideTargetArrow
SET_BIT (BitSet_CellphoneDisplay_Continued, g_BSC_HIDE_TRACKIFY_TARGET_ARROW)
#if IS_DEBUG_BUILD
//Make sure this always displays regardless of phone debug text widget toggle.
PRINTLN("\nCELLPHONE_PUB - Trackify target arrow hidden from [", GET_THIS_SCRIPT_NAME(), "] through public function.")
#endif
ELSE
CLEAR_BIT (BitSet_CellphoneDisplay_Continued, g_BSC_HIDE_TRACKIFY_TARGET_ARROW)
#if IS_DEBUG_BUILD
//Make sure this always displays regardless of phone debug text widget toggle.
PRINTLN("\nCELLPHONE_PUB - Trackify target arrow shown from [", GET_THIS_SCRIPT_NAME(), "] through public function.")
#endif
ENDIF
IF b_DisplayRelativeHeight
SET_BIT (BitSet_CellphoneDisplay_Third, g_BSTHIRD_DISPLAY_TRACKIFY_RELATIVE_HEIGHT)
#if IS_DEBUG_BUILD
//Make sure this always displays regardless of phone debug text widget toggle.
PRINTLN("\nCELLPHONE_PUB - Trackify relative height set to display from [", GET_THIS_SCRIPT_NAME(), "] through public function.")
#endif
ELSE
CLEAR_BIT (BitSet_CellphoneDisplay_Third, g_BSTHIRD_DISPLAY_TRACKIFY_RELATIVE_HEIGHT)
#if IS_DEBUG_BUILD
//Make sure this always displays regardless of phone debug text widget toggle.
PRINTLN("\nCELLPHONE_PUB - Trackify relative height hidden from [", GET_THIS_SCRIPT_NAME(), "] through public function.")
#endif
ENDIF
ENDPROC
PROC REMOVE_TRACKIFY_MULTIPLE_TARGET (INT WhichTarget)
#if IS_DEBUG_BUILD
cdPrintstring ("CELLPHONE_PUB - Specifying Multiple Target Vector for removal. Passed instance ")
cdPrintint(WhichTarget)
cdPrintnl()
#endif
SWITCH WhichTarget
CASE 0
SET_BIT (BitSet_CellphoneTU, g_BSTU_REMOVE_MP_TRACKIFY_TARGET_0)
BREAK
CASE 1
SET_BIT (BitSet_CellphoneTU, g_BSTU_REMOVE_MP_TRACKIFY_TARGET_1)
BREAK
CASE 2
SET_BIT (BitSet_CellphoneTU, g_BSTU_REMOVE_MP_TRACKIFY_TARGET_2)
BREAK
CASE 3
SET_BIT (BitSet_CellphoneTU, g_BSTU_REMOVE_MP_TRACKIFY_TARGET_3)
BREAK
DEFAULT
#if IS_DEBUG_BUILD
//Make sure this always displays regardless of phone debug text widget toggle.
PRINTLN("\nCELLPHONE_PUB - Weird Removal Target specified [", GET_THIS_SCRIPT_NAME(), "] through public function..")
#endif
BREAK
ENDSWITCH
ENDPROC
PROC REMOVE_TRACKIFY_TARGET ()
SET_BIT (BitSet_CellphoneDisplay_Continued, g_BSC_REMOVE_TRACKIFY_TARGET)
#if IS_DEBUG_BUILD
//Make sure this always displays regardless of phone debug text widget toggle.
PRINTLN("\nCELLPHONE_PUB - Trackify target removed from [", GET_THIS_SCRIPT_NAME(), "] through public function.")
#endif
ENDPROC
//This function will make a concluded call return the phone to the homescreen rather than put it away. You need to call this during or just before the phonecall takes
//place as the controlling bit is cleared after the phone returns to the homescreen or it is put away by other means.
PROC SET_FINISHED_CALL_RETURNS_TO_HOMESCREEN (BOOL ReturnToHomeScreen)
IF ReturnToHomeScreen
//Make sure this always displays regardless of phone debug text widget toggle.
#if IS_DEBUG_BUILD
PRINTLN("\nCELLPHONE_PUB - Concluded cellphone call set to homescreen return by [", GET_THIS_SCRIPT_NAME(), "] through public function.")
cdPrintnl()
cdPrintstring ("CELLPHONE_PUB - Set_Finished_Call_Returns_To_Homescreen bit set!")
cdPrintnl()
#endif
SET_BIT (BitSet_CellphoneDisplay_Continued, g_BSC_FINISHED_CALL_RETURNS_TO_HOMESCREEN)
ELSE
CLEAR_BIT (BitSet_CellphoneDisplay_Continued, g_BSC_FINISHED_CALL_RETURNS_TO_HOMESCREEN)
ENDIF
ENDPROC
FUNC BOOL IS_CELLPHONE_ON_HOMESCREEN()
IF g_Cellphone.PhoneDS = PDS_MAXIMUM
RETURN TRUE
ELSE
RETURN FALSE
ENDIF
ENDFUNC
//You need to make sure that the finale contacts are currently in the player's phonebook before calling this.
FUNC BOOL LAUNCH_FINALE_CHOICE_CONTACT_LIST()
IF g_Cellphone.PhoneDS > PDS_AWAY
#if IS_DEBUG_BUILD
cdPrintstring ("CELLPHONE_PUB - 2433277 fix 2. Tried to launch Finale Choice Contact List but phone was already in hand. Hanging up phone.")
cdPrintnl()
#endif
CLEAR_BIT (BitSet_CellphoneDisplay_Continued, g_BSC_LAUNCH_FINALE_CONTACTS) //Fix for 2433277
HANG_UP_AND_PUT_AWAY_PHONE()
RETURN FALSE
ENDIF
SET_BIT (BitSet_CellphoneDisplay_Continued, g_BSC_LAUNCH_FINALE_CONTACTS) //Needs to be done before app launch, get reset automatically after successful launch.
IF (LAUNCH_CELLPHONE_APPLICATION (AppCONTACTS, FALSE, TRUE, TRUE)) //don't load movies, override phone already on screen check, use CONTACTS_APP_STACK_SIZE...
#if IS_DEBUG_BUILD
cdPrintstring ("CELLPHONE_PUB - Launch Finale Choice Contact List function called and launched from script. 2433277 launch fix.")
cdPrintnl()
#endif
RETURN TRUE
ELSE
#if IS_DEBUG_BUILD
cdPrintstring ("CELLPHONE_PUB - 2433277 fix. Tried to launch Finale Choice Contact List but Launch_Cellphone_Application has returned false. 2433277 fix.")
cdPrintnl()
#endif
CLEAR_BIT (BitSet_CellphoneDisplay_Continued, g_BSC_LAUNCH_FINALE_CONTACTS) //Fix for 2433277
RETURN FALSE
ENDIF
ENDFUNC
//Sidetask prototypes for ambient department.
//Example usage:
//SET_SIDETASK_LIVE(CHAR_ARIANO, Sidetask_2)
FUNC BOOL SET_SIDETASK_LIVE (enumCharacterList WhichSideTaskGiver, enumSideTaskList WhichSideTaskIdentifier, BOOL ShouldDisplayNewSideTaskSignifier = TRUE,
enumSideTaskLockedStatus WhichLockStatus = SIDETASK_UNLOCKED)
IF IS_CELLPHONE_DISABLED_OR_DISABLED_THIS_FRAME_ONLY() //If the phone is flow sleeping or disabled, no new sidetask can be delivered, so we must return false.
#IF IS_DEBUG_BUILD
cdPrintnl()
cdPrintstring ("CELLPHONE_PUB - Mobile phone is flow sleeping! Can't set sidetask as live!")
cdPrintnl()
#endif
RETURN FALSE
ENDIF
IF ProcessLiveSideTask (WhichSideTaskGiver, WhichSideTaskIdentifier, ShouldDisplayNewSideTaskSignifier, WhichLockStatus) = TRUE
#IF IS_DEBUG_BUILD
cdPrintstring ("CELLPHONE_PUB - Sidetask successfully set to live.")
cdPrintnl()
#endif
RETURN TRUE
ELSE
RETURN FALSE
ENDIF
ENDFUNC
PROC SET_SIDETASK_DEAD (enumSideTaskList WhichSideTaskIdentifier)
INT SideTaskArrayIndex = 0
WHILE SideTaskArrayIndex < MAX_NUM_SIDETASKS
IF g_LiveSideTask[SideTaskArrayIndex].SideTaskIdentifier = WhichSideTaskIdentifier
IF g_LiveSideTask[SideTaskArrayIndex].SideTaskLockStatus = SIDETASK_LOCKED
#IF IS_DEBUG_BUILD
cdPrintstring ("CELLPHONE_PUB - Cannot set this sidetask to dead. It has LOCKED status.")
cdPrintnl()
#endif
ELSE
g_LiveSideTask[SideTaskArrayIndex].SideTaskLockStatus = SIDETASK_EMPTY
#IF IS_DEBUG_BUILD
cdPrintstring ("CELLPHONE_PUB - Sidetask set to dead and removed from live array at position ")
cdPrintint (SideTaskArrayIndex)
cdPrintnl()
#endif
ENDIF
ENDIF
SideTaskArrayIndex ++
ENDWHILE
ENDPROC
//________________________________________________________________________________________________________________________________________________________________________________
//
// Special MP and SP character secondary function integration.
//________________________________________________________________________________________________________________________________________________________________________________
FUNC BOOL SEND_EMAIL_MESSAGE_TO_CURRENT_PLAYER (enumCharacterList WhichSender, STRING WhichTextLabel, enumMPemailLockedStatus WhichLockStatus,
enumMPemailMissionCritical WhichCriticalStatus = EMAIL_NOT_CRITICAL,
enumMPemailAutoUnlockAfterRead WhichAutoUnlockStatus = EMAIL_AUTO_UNLOCK_AFTER_READ,
enumMPemailIsReplyRequired WhichReplyStatus = MPE_NO_REPLY_REQUIRED,
eTextMessageIconStyle WhichIconStyle = ICON_STANDARD_TEXTMSG,
BOOL ShouldDisplayEmailSignifier = TRUE,
enumMPemailIsBarterRequired WhichBarterStatus = MPE_NO_BARTER_REQUIRED,
enumMPemailCanCallSender WhichCanCallSenderStatus = MPE_CANNOT_CALL_SENDER)
enumTxtMsgSpecialComponents ForcedComponentType = NO_SPECIAL_COMPONENTS
STRING ForcedBodyStringComponent = "NULL"
INT ForcedNumberComponent = -99
STRING ForcedSenderStringComponent = "NULL"
INT ForcedNumberofAdditionalStrings = 0
STRING ForcedSecondString = "NULL"
STRING ForcedThirdString = "NULL"
enumRecipientList SilentMessageRecipient = NO_SILENT_RECIPIENT
IF ProcessEmailMessage (WhichSender, WhichTextLabel, WhichLockStatus,
ForcedComponentType, ForcedBodyStringComponent, ForcedSenderStringComponent, ForcedNumberComponent,
WhichCriticalStatus, WhichAutoUnlockStatus, WhichReplyStatus,
ShouldDisplayEmailSignifier, WhichBarterStatus, WhichCanCallSenderStatus, ForcedNumberOfAdditionalStrings,
ForcedSecondString, ForcedThirdString, SilentMessageRecipient) = TRUE
IF ShouldDisplayEmailSignifier = TRUE
g_TextMessageIconStyle = WhichIconStyle
/* Need updated
g_TextMessageIconStyle = WhichIconStyle
g_Temp_MP_PassedCharacterListRef = WhichSender
SET_BIT (BitSet_CellphoneDisplay, g_BS_DISPLAY_NEW_TXTMSG_SIGNIFIER)
SET_BIT (BitSet_CellphoneDisplay, g_BS_CELLPHONE_TEXTFEED_NEEDS_UPDATED)
*/
SET_BIT (BitSet_CellphoneTU, g_BSTU_DISPLAY_EMAIL_SIGNIFIER)
ENDIF
#if IS_DEBUG_BUILD
cdPrintnl()
cdPrintstring ("CELLPHONE_PUB - Email message successfully sent to current player. Label was: ")
cdPrintstring (WhichTextLabel)
cdPrintnl()
#endif
RETURN TRUE
ELSE
RETURN FALSE
ENDIF
ENDFUNC
//To force the text message to display the WhichSenderStringComponent rather than a character name from the Character list, set Whichsender to NO_CHARACTER
FUNC BOOL SEND_EMAIL_MESSAGE_TO_CURRENT_PLAYER_WITH_SPECIAL_COMPONENTS (enumCharacterList WhichSender, STRING WhichTextLabel,
enumMPemailLockedStatus WhichLockStatus,
STRING WhichBodyStringComponent, INT WhichNumberComponent,
STRING WhichSenderStringComponent,
enumTxtMsgSpecialComponents WhichComponentType = NO_SPECIAL_COMPONENTS,
enumMPemailMissionCritical WhichCriticalStatus = EMAIL_NOT_CRITICAL,
enumMPemailAutoUnlockAfterRead WhichAutoUnlockStatus = EMAIL_AUTO_UNLOCK_AFTER_READ,
enumMPemailIsReplyRequired WhichReplyStatus = MPE_NO_REPLY_REQUIRED,
eTextMessageIconStyle WhichIconStyle = ICON_STANDARD_TEXTMSG,
BOOL ShouldDisplayEmailSignifier = TRUE,
enumMPemailIsBarterRequired WhichBarterStatus = MPE_NO_BARTER_REQUIRED,
enumMPemailCanCallSender WhichCanCallSenderStatus = MPE_CANNOT_CALL_SENDER,
INT WhichNumberofAdditionalStrings = 0,
STRING WhichSecondStringComponent = NULL, STRING WhichThirdStringComponent = NULL)
SWITCH WhichNumberOfAdditionalStrings
CASE 0
WhichSecondStringComponent = "NULL"
WhichThirdStringComponent = "NULL"
BREAK
CASE 1
WhichThirdStringComponent = "NULL"
BREAK
CASE 2
//Do not clear. Accept second and third string components as is.
BREAK
DEFAULT
#if IS_DEBUG_BUILD
SCRIPT_ASSERT ("SEND_EMAIL_MESSAGE_SC... Weird additional string counter passed in. See Steve T.")
cdPrintstring ("SEND_EMAIL_MESSAGE_SC... Weird additional string counter passed in. See Steve T.")
cdPrintnl()
#endif
BREAK
ENDSWITCH
enumRecipientList SilentMessageRecipient = NO_SILENT_RECIPIENT
IF ProcessEmailMessage (WhichSender, WhichTextLabel, WhichLockStatus,
WhichComponentType, WhichBodyStringComponent, WhichSenderStringComponent, WhichNumberComponent,
WhichCriticalStatus, WhichAutoUnlockStatus, WhichReplyStatus,
ShouldDisplayEmailSignifier, WhichBarterStatus, WhichCanCallSenderStatus, WhichNumberOfAdditionalStrings,
WhichSecondStringComponent, WhichThirdStringComponent, SilentMessageRecipient) = TRUE
IF ShouldDisplayEmailSignifier = TRUE
g_TextMessageIconStyle = WhichIconStyle
//g_Temp_MP_PassedCharacterListRef = WhichSender
//g_Temp_MP_SenderString = WhichSenderStringComponent
//SET_BIT (BitSet_CellphoneDisplay, g_BS_DISPLAY_NEW_TXTMSG_SIGNIFIER)
//SET_BIT (BitSet_CellphoneDisplay, g_BS_CELLPHONE_TEXTFEED_NEEDS_UPDATED)
SET_BIT (BitSet_CellphoneTU, g_BSTU_DISPLAY_EMAIL_SIGNIFIER)
ENDIF
#if IS_DEBUG_BUILD
cdPrintnl()
cdPrintstring ("CELLPHONE_PUB - Special component email message successfully sent to current player. Label was: ")
cdPrintstring (WhichTextLabel)
cdPrintnl()
#endif
RETURN TRUE
ELSE
RETURN FALSE
ENDIF
ENDFUNC
FUNC BOOL IS_EMAIL_PRESENT_IN_MULTIPLAYER_FILTER(INT passedIndex)
IF g_EmailMessage[passedIndex].PhonePresence[3] = TRUE //MULTIPLAYER
RETURN TRUE
ELSE
RETURN FALSE
ENDIF
ENDFUNC
//If the player has a message matching the text label passed in his current inbox, then this will return true.
FUNC BOOL CHECK_FOR_MP_EMAIL_PRESENCE_IN_CHARACTER_INBOX (STRING LabelToCheck, enumCharacterList CharacterToCheck = CHAR_MULTIPLAYER )
INT EmailMsgArrayIndex = 0
BOOL CheckBool = FALSE
IF ENUM_TO_INT(CharacterToCheck) > 3 //i.e not any SP or MP player character...
#if IS_DEBUG_BUILD
cdPrintstring ("CELLPHONE_PUB - The character passed into CHECK_FOR_MP_EMAIL_PRESENCE is not a phone owner! See Steve T.")
cdPrintnl ()
#endif
RETURN (FALSE)
ENDIF
WHILE EmailMsgArrayIndex < MAX_MP_EMAILS
IF NOT IS_STRING_NULL (g_EmailMessage[EmailMsgArrayIndex].emailLabel)
IF ARE_STRINGS_EQUAL(g_EmailMessage[EmailMsgArrayIndex].emailLabel, LabelToCheck)
IF g_EmailMessage[EmailMsgArrayIndex].PhonePresence[ENUM_TO_INT(CharacterToCheck)]
#if IS_DEBUG_BUILD
cdPrintstring ("CELLPHONE_PUB - Specified email found in specified character inbox at: ")
cdPrintint (EmailMsgArrayIndex)
cdPrintnl ()
#endif
CheckBool = TRUE
ENDIF
ENDIF
ENDIF
EmailMsgArrayIndex ++
ENDWHILE
IF CheckBool = TRUE
#if IS_DEBUG_BUILD
cdPrintstring ("CELLPHONE_PUB - Specified email found in specified character inbox.")
cdPrintnl ()
#endif
RETURN (TRUE)
ELSE
#if IS_DEBUG_BUILD
cdPrintstring ("CELLPHONE_PUB - Specified email NOT found in specified character inbox.")
cdPrintnl ()
#endif
RETURN (FALSE)
ENDIF
ENDFUNC
//Returns one of the following
// MPE_NO_REPLY_REQUIRED,
// MPE_REPLY_IS_REQUIRED,
// MPE_REPLIED_BARTER,
// MPE_REPLIED_YES,
// MPE_REPLIED_NO
FUNC enumMPemailIsReplyRequired GET_MP_EMAIL_REPLY_STATUS (STRING LabelToQuery)
INT EmailMsgArrayIndex = 0
enumMPemailIsReplyRequired eReplyStatusToReturn = MPE_NO_REPLY_REQUIRED
WHILE EmailMsgArrayIndex < MAX_MP_EMAILS
IF NOT IS_STRING_NULL (g_EmailMessage[EmailMsgArrayIndex].emailLabel)
IF ARE_STRINGS_EQUAL(g_EmailMessage[EmailMsgArrayIndex].emailLabel, LabelToQuery)
eReplyStatusToReturn = g_EmailMessage[EmailMsgArrayIndex].EmailReplyStatus
RETURN eReplyStatusToReturn
ENDIF
ELSE
#IF IS_DEBUG_BUILD
cdPrintstring ("CELLPHONE_PUB - No email label specified. Cannot find reply match for empty string.")
cdPrintnl ()
#endif
ENDIF
EmailMsgArrayIndex ++
ENDWHILE
RETURN eReplyStatusToReturn
ENDFUNC
PROC SET_MP_EMAIL_REPLY_STATUS(STRING LabelToSet, enumMPemailIsReplyRequired WhichReplyStatus = MPE_NO_REPLY_REQUIRED)
#if IS_DEBUG_BUILD
PRINTLN("\nCELLPHONE_PUB - SET_MP_EMAIL_REPLY_STATUS called by [", GET_THIS_SCRIPT_NAME(), "] through public function.")
//DEBUG_PRINTCALLSTACK()
#endif
INT EmailArrayIndex = 0
WHILE EmailArrayIndex < MAX_MP_EMAILS
IF NOT IS_STRING_NULL (g_EmailMessage[EmailArrayIndex].EmailLabel)
IF ARE_STRINGS_EQUAL (g_EmailMessage[EmailArrayIndex].EmailLabel, LabelToSet)
IF g_EmailMessage[EmailArrayIndex].EmailLockStatus = EMAIL_LOCKED
#if IS_DEBUG_BUILD
cdPrintstring ("CELLPHONE_PUB - Warning! This email was locked before setting reply status: ")
cdPrintint (EmailArrayIndex)
cdPrintnl()
#endif
ENDIF
Get_Cellphone_Owner()
g_EmailMessage[EmailArrayIndex].EmailReplyStatus = WhichReplyStatus
ENDIF
ELSE
#if IS_DEBUG_BUILD
cdPrintstring ("CELLPHONE_PUB - No email label specified. Cannot set reply status of empty string.")
cdPrintnl()
#endif
ENDIF
EmailArrayIndex ++
ENDWHILE
ENDPROC
PROC DELETE_EMAIL_BY_LABEL_FROM_CURRENT_PLAYER (STRING LabelToDelete)
#if IS_DEBUG_BUILD
PRINTLN("\nCELLPHONE_PUB - DELETE_EMAIL_BY_LABEL_FROM_CURRENT_PLAYER called by [", GET_THIS_SCRIPT_NAME(), "] through public function.")
//DEBUG_PRINTCALLSTACK()
#endif
INT EmailArrayIndex = 0
WHILE EmailArrayIndex < MAX_MP_EMAILS
IF NOT IS_STRING_NULL (g_EmailMessage[EmailArrayIndex].EmailLabel)
IF ARE_STRINGS_EQUAL (g_EmailMessage[EmailArrayIndex].EmailLabel, LabelToDelete)
IF g_EmailMessage[EmailArrayIndex].EmailLockStatus = EMAIL_LOCKED
#if IS_DEBUG_BUILD
cdPrintstring ("CELLPHONE_PUB - Warning! This email was locked before deletion: ")
cdPrintint (EmailArrayIndex)
cdPrintnl()
#endif
ENDIF
Get_Cellphone_Owner()
g_EmailMessage[EmailArrayIndex].PhonePresence[g_Cellphone.PhoneOwner] = FALSE
g_EmailMessage[EmailArrayIndex].EmailLockStatus = EMAIL_EMPTY
g_EmailMessage[EmailArrayIndex].EmailReadStatus = UNREAD_MPEMAIL
g_EmailMessage[EmailArrayIndex].EmailReplyStatus = MPE_NO_REPLY_REQUIRED
#if IS_DEBUG_BUILD
cdPrintstring ("CELLPHONE_PUB - Current player email message no longer in player filter. Assigned EMPTY status to array position: ")
cdPrintint (EmailArrayIndex)
cdPrintnl()
#endif
//If still on screen, we should remove the Feed Entry associated with this text message label now that it has been deleted.
THEFEED_REMOVE_ITEM (g_EmailMessage[EmailArrayIndex].EmailFeedEntryId)
ENDIF
ELSE
#if IS_DEBUG_BUILD
cdPrintstring ("CELLPHONE_PUB - No email label specified. Cannot delete empty string.")
cdPrintnl()
#endif
ENDIF
EmailArrayIndex ++
ENDWHILE
ENDPROC
FUNC BOOL HAS_THIS_MP_EMAIL_BEEN_READ (STRING LabelToCheck)
INT EmailArrayIndex = 0
WHILE EmailArrayIndex < MAX_MP_EMAILS
IF NOT IS_STRING_NULL (g_EmailMessage[EmailArrayIndex].emailLabel)
IF ARE_STRINGS_EQUAL(g_EmailMessage[EmailArrayIndex].emailLabel, LabelToCheck)
IF g_EmailMessage[EmailArrayIndex].emailReadStatus = READ_MPEMAIL
#if IS_DEBUG_BUILD
cdPrintstring ("CELLPHONE_PUB - Read Message found at MP email array index ")
cdPrintint (EmailArrayIndex)
cdPrintnl()
#endif
RETURN TRUE
ENDIF
ENDIF
ELSE
#if IS_DEBUG_BUILD
cdPrintstring ("CELLPHONE_PUB - No MP email specified. Cannot locate read status of empty string.")
cdPrintnl()
#endif
RETURN FALSE
ENDIF
EmailArrayIndex ++
ENDWHILE
RETURN FALSE
ENDFUNC
PROC HIDE_PHONE_IN_FIRST_PERSON_EXPERIMENTAL()
//May need to check that no phone or chat call is ongoing here
IF g_Cellphone.PhoneDS = PDS_MAXIMUM
OR g_Cellphone.PhoneDS = PDS_RUNNINGAPP
OR g_Cellphone.PhoneDS = PDS_COMPLEXAPP
//Might have to have a check in here to not put the phone away if it's on the last couple of lines? Polish.
//Set appropriate bits...
SET_BIT (BitSet_CellphoneDisplay_Continued, g_BSC_CALL_IN_PROGRESS_VANISH_PHONE) //Let flashhand know transit routine should commence...
SET_BIT (BitSet_CellphoneDisplay_Continued, g_BSC_CALL_IN_PROGRESS_PHONE_ALREADY_SIGNALLED_TO_VANISH_BY_DH) //we don't want to go through this routine more than once in one call...
CLEAR_BIT (BitSet_CellphoneDisplay_Continued, g_BSC_CALL_IN_PROGRESS_PHONE_FULLY_VANISHED)
CLEAR_BIT (BitSet_CellphoneDisplay_Continued, g_BSC_CALL_IN_PROGRESS_REINSTATE_PHONE)
#if IS_DEBUG_BUILD
cdPrintnl()
cdPrintstring ("CELLPHONE_PUBLIC - HIDE_PHONE_IN_FIRST_PERSON_EXPERIMENTAL()")
cdPrintnl()
#endif
ENDIF
ENDPROC
//#1896233
//Returns the correct currently selected cellphone prop tint ID for the passed player character from the player's saved setting.
//The return value can be passed into commands such as SET_PLAYER_PHONE_PALETTE_IDX to modify the cellphone prop's outer casing.
//Alex will be opening up functionality on other peds with 1895413
//Update! TASK_USE_MOBILE_PHONE will always use Michael's phone as the prop on any other character, so the return values have been altered to cope with this.
//The original phone prop character specific return values are cloned in PROP_SPECIFIC_GET_PHONE_SURROUND_TINT_FOR_SP_PLAYER_CHARACTER should we need it.
FUNC INT GET_PHONE_SURROUND_TINT_FOR_SP_PLAYER_CHARACTER(enumCharacterList PassedChar)
//WARNING! The tints are not uniform ids. "Blue" is not tint ID 0 across all phone props. Hence the explicit cases.
//UPDATE! Number after // in the CASE decisions reflects the correct values for that character's specific phone prop. TASK_USE_MOBILE_PHONE
//use's Michael's prop regardless of ped it seems.
IF PassedChar = CHAR_MICHAEL //Franklin's tints seem jumbled...
#if USE_CLF_DLC
SWITCH g_savedGlobalsClifford.sCellphoneSettingsData.This_Cellphone_Owner_Settings[CHAR_MICHAEL].ThemeForThisPlayer
#ENDIF
#if USE_NRM_DLC
SWITCH g_savedGlobalsnorman.sCellphoneSettingsData.This_Cellphone_Owner_Settings[CHAR_MICHAEL].ThemeForThisPlayer
#ENDIF
#if not USE_SP_DLC
SWITCH g_savedGlobals.sCellphoneSettingsData.This_Cellphone_Owner_Settings[CHAR_MICHAEL].ThemeForThisPlayer
#ENDIF
CASE 1 RETURN 0 BREAK //Light Blue Theme from Settings Menu
CASE 2 RETURN 1 BREAK//Green
CASE 3 RETURN 2 BREAK//Red
CASE 4 RETURN 3 BREAK//Orange
CASE 5 RETURN 4 BREAK//Grey
CASE 6 RETURN 5 BREAK//Purple
CASE 7 RETURN 6 BREAK//Pink
DEFAULT
#if IS_DEBUG_BUILD
cdPrintstring("GET_PHONE_SURROUND_TINT_FOR_SP_PLAYER_CHARACTER - Weird Michael CASE. Returning -1")
cdPrintnl()
#endif
RETURN -1
BREAK
#if USE_CLF_DLC
ENDSWITCH
#ENDIF
#if USE_NRM_DLC
ENDSWITCH
#ENDIF
#if not USE_SP_DLC
ENDSWITCH
#ENDIF
ENDIF
IF PassedChar = CHAR_FRANKLIN //Remove this when tints are fixed...
#if USE_CLF_DLC
SWITCH g_savedGlobalsClifford.sCellphoneSettingsData.This_Cellphone_Owner_Settings[CHAR_FRANKLIN].ThemeForThisPlayer
#ENDIF
#if USE_NRM_DLC
SWITCH g_savedGlobalsnorman.sCellphoneSettingsData.This_Cellphone_Owner_Settings[CHAR_FRANKLIN].ThemeForThisPlayer
#ENDIF
#if not USE_SP_DLC
SWITCH g_savedGlobals.sCellphoneSettingsData.This_Cellphone_Owner_Settings[CHAR_FRANKLIN].ThemeForThisPlayer
#ENDIF
CASE 1 RETURN 0 BREAK //Light Blue Theme from Settings Menu
CASE 2 RETURN 1 BREAK//Green
CASE 3 RETURN 2 BREAK//Red
CASE 4 RETURN 3 BREAK//Orange
CASE 5 RETURN 4 BREAK//Grey
CASE 6 RETURN 5 BREAK//Purple
CASE 7 RETURN 6 BREAK//Pink
DEFAULT
#if IS_DEBUG_BUILD
cdPrintstring("GET_PHONE_SURROUND_TINT_FOR_SP_PLAYER_CHARACTER - Weird Franklin CASE. Returning -1")
cdPrintnl()
#endif
RETURN -1
BREAK
#if USE_CLF_DLC
ENDSWITCH
#ENDIF
#if USE_NRM_DLC
ENDSWITCH
#ENDIF
#if not USE_SP_DLC
ENDSWITCH
#ENDIF
ENDIF
IF PassedChar = CHAR_TREVOR
#if USE_CLF_DLC
SWITCH g_savedGlobalsClifford.sCellphoneSettingsData.This_Cellphone_Owner_Settings[CHAR_TREVOR].ThemeForThisPlayer
#ENDIF
#if USE_NRM_DLC
SWITCH g_savedGlobalsnorman.sCellphoneSettingsData.This_Cellphone_Owner_Settings[CHAR_TREVOR].ThemeForThisPlayer
#ENDIF
#if not USE_SP_DLC
SWITCH g_savedGlobals.sCellphoneSettingsData.This_Cellphone_Owner_Settings[CHAR_TREVOR].ThemeForThisPlayer
#ENDIF
CASE 1 RETURN 0 BREAK //Light Blue Theme from Settings Menu
CASE 2 RETURN 1 BREAK//Green
CASE 3 RETURN 2 BREAK//Red
CASE 4 RETURN 3 BREAK//Orange
CASE 5 RETURN 4 BREAK//Grey
CASE 6 RETURN 5 BREAK//Purple
CASE 7 RETURN 6 BREAK//Pink
DEFAULT
#if IS_DEBUG_BUILD
cdPrintstring("GET_PHONE_SURROUND_TINT_FOR_SP_PLAYER_CHARACTER - Weird Trevor CASE. Returning -1")
cdPrintnl()
#endif
RETURN -1
BREAK
#if USE_CLF_DLC
ENDSWITCH
#ENDIF
#if USE_NRM_DLC
ENDSWITCH
#ENDIF
#if not USE_SP_DLC
ENDSWITCH
#ENDIF
ENDIF
#if IS_DEBUG_BUILD
cdPrintstring("GET_PHONE_SURROUND_TINT_FOR_SP_PLAYER_CHARACTER - Passed Character was not Michael, Franklin or Trevor. Returning -2")
cdPrintnl()
#endif
RETURN -2
ENDFUNC
FUNC INT PROP_SPECIFIC_GET_PHONE_SURROUND_TINT_FOR_SP_PLAYER_CHARACTER(enumCharacterList PassedChar)
//WARNING! The tints are not uniform ids. "Blue" is not tint ID 0 across all phone props. Hence the explicit cases.
//UPDATE!
IF PassedChar = CHAR_MICHAEL //Franklin's tints seem jumbled...
#if USE_CLF_DLC
SWITCH g_savedGlobalsClifford.sCellphoneSettingsData.This_Cellphone_Owner_Settings[CHAR_MICHAEL].ThemeForThisPlayer
#ENDIF
#if USE_NRM_DLC
SWITCH g_savedGlobalsnorman.sCellphoneSettingsData.This_Cellphone_Owner_Settings[CHAR_MICHAEL].ThemeForThisPlayer
#ENDIF
#if not USE_SP_DLC
SWITCH g_savedGlobals.sCellphoneSettingsData.This_Cellphone_Owner_Settings[CHAR_MICHAEL].ThemeForThisPlayer
#ENDIF
CASE 1 RETURN 0 BREAK //Light Blue Theme from Settings Menu
CASE 2 RETURN 1 BREAK//Green
CASE 3 RETURN 2 BREAK//Red
CASE 4 RETURN 3 BREAK//Orange
CASE 5 RETURN 4 BREAK//Grey
CASE 6 RETURN 5 BREAK//Purple
CASE 7 RETURN 6 BREAK//Pink
DEFAULT
#if IS_DEBUG_BUILD
cdPrintstring("GET_PHONE_SURROUND_TINT_FOR_SP_PLAYER_CHARACTER - Weird Michael CASE. Returning -1")
cdPrintnl()
#endif
RETURN -1
BREAK
#if USE_CLF_DLC
ENDSWITCH
#ENDIF
#if USE_NRM_DLC
ENDSWITCH
#ENDIF
#if not USE_SP_DLC
ENDSWITCH
#ENDIF
ENDIF
IF PassedChar = CHAR_FRANKLIN //Remove this when tints are fixed...
#if USE_CLF_DLC
SWITCH g_savedGlobalsClifford.sCellphoneSettingsData.This_Cellphone_Owner_Settings[CHAR_FRANKLIN].ThemeForThisPlayer
#ENDIF
#if USE_NRM_DLC
SWITCH g_savedGlobalsnorman.sCellphoneSettingsData.This_Cellphone_Owner_Settings[CHAR_FRANKLIN].ThemeForThisPlayer
#ENDIF
#if not USE_SP_DLC
SWITCH g_savedGlobals.sCellphoneSettingsData.This_Cellphone_Owner_Settings[CHAR_FRANKLIN].ThemeForThisPlayer
#ENDIF
CASE 1 RETURN 6 BREAK//Light Blue Theme from Settings Menu
CASE 2 RETURN 0 BREAK//Green
CASE 3 RETURN 1 BREAK//Red
CASE 4 RETURN 2 BREAK//Orange
CASE 5 RETURN 3 BREAK//Grey
CASE 6 RETURN 4 BREAK//Purple
CASE 7 RETURN 5 BREAK//Pink
DEFAULT
#if IS_DEBUG_BUILD
cdPrintstring("GET_PHONE_SURROUND_TINT_FOR_SP_PLAYER_CHARACTER - Weird Franklin CASE. Returning -1")
cdPrintnl()
#endif
RETURN -1
BREAK
#if USE_CLF_DLC
ENDSWITCH
#ENDIF
#if USE_NRM_DLC
ENDSWITCH
#ENDIF
#if not USE_SP_DLC
ENDSWITCH
#ENDIF
ENDIF
IF PassedChar = CHAR_TREVOR
#if USE_CLF_DLC
SWITCH g_savedGlobalsClifford.sCellphoneSettingsData.This_Cellphone_Owner_Settings[CHAR_TREVOR].ThemeForThisPlayer
#ENDIF
#if USE_NRM_DLC
SWITCH g_savedGlobalsnorman.sCellphoneSettingsData.This_Cellphone_Owner_Settings[CHAR_TREVOR].ThemeForThisPlayer
#ENDIF
#if not USE_SP_DLC
SWITCH g_savedGlobals.sCellphoneSettingsData.This_Cellphone_Owner_Settings[CHAR_TREVOR].ThemeForThisPlayer
#ENDIF
CASE 1 RETURN 5 BREAK//Light Blue Theme from Settings Menu
CASE 2 RETURN 6 BREAK//Green
CASE 3 RETURN 1 BREAK//Red
CASE 4 RETURN 0 BREAK//Orange
CASE 5 RETURN 2 BREAK//Grey
CASE 6 RETURN 3 BREAK//Purple
CASE 7 RETURN 4 BREAK//Pink
DEFAULT
#if IS_DEBUG_BUILD
cdPrintstring("GET_PHONE_SURROUND_TINT_FOR_SP_PLAYER_CHARACTER - Weird Trevor CASE. Returning -1")
cdPrintnl()
#endif
RETURN -1
BREAK
#if USE_CLF_DLC
ENDSWITCH
#ENDIF
#if USE_NRM_DLC
ENDSWITCH
#ENDIF
#if not USE_SP_DLC
ENDSWITCH
#ENDIF
ENDIF
#if IS_DEBUG_BUILD
cdPrintstring("GET_PHONE_SURROUND_TINT_FOR_SP_PLAYER_CHARACTER - Passed Character was not Michael, Franklin or Trevor. Returning -2")
cdPrintnl()
#endif
RETURN -2
ENDFUNC
//2574720
//MP App Presidential Extraction. Need to display two sets of co-ordinates on a Cellphone App. One for a "president" player and the other for the bodyguard.
//Color
PROC SET_EXTRACTION_PRESIDENT_VECTOR (VECTOR YourVector, HUD_COLOURS PassedColourX = HUD_COLOUR_GREEN, HUD_COLOURS PassedColourY = HUD_COLOUR_YELLOW, HUD_COLOURS PassedColourZ = HUD_COLOUR_WHITE)
g_v_ExtractionPresidentVec = YourVector
g_hc_PresX = PassedColourX
g_hc_PresY = PassedColourY
g_hc_PresZ = PassedColourZ
#if IS_DEBUG_BUILD
cdPrintstring("Cellphone EXTRACTION_APP - g_v_ExtractionPresidentVec and colours set this frame")
cdPrintnl()
#endif
ENDPROC
PROC SET_EXTRACTION_BODYGUARD_VECTOR (VECTOR YourVector, HUD_COLOURS PassedColourX = HUD_COLOUR_WHITE, HUD_COLOURS PassedColourY = HUD_COLOUR_YELLOW, HUD_COLOURS PassedColourZ = HUD_COLOUR_GREEN)
g_v_ExtractionBodyguardVec = YourVector
g_hc_BodygX = PassedColourX
g_hc_BodygY = PassedColourY
g_hc_BodygZ = PassedColourZ
#if IS_DEBUG_BUILD
cdPrintstring("Cellphone EXTRACTION_APP - g_v_ExtractionBodyguardVec and colours set this frame")
cdPrintnl()
#endif
ENDPROC
//THIS WILL BE DEPRECATED.2603763 requested a change in functionality for the Extraction app, that requires two columns in both President and Player view.
//PLEASE CONSIDER using SET_THIS_PLAYER_TO_PRESIDENT_VIEW instead.
//If this is set to true, then the Bodyguard co-ordinates will not display on the Presidential Extraction app. If the player is playing as the President then you'd want this to be set to true.
//By default this is FALSE. Both co-ordinates will display.
PROC HIDE_EXTRACTION_BODYGUARD_COLUMN (BOOL PassedBool)
IF PassedBool = TRUE
SET_BIT (BitSet_CellphoneTU, g_BSTU_SET_EXTRACTION_PRES_VIEW )
#if IS_DEBUG_BUILD
cdPrintstring("Cellphone EXTRACTION_APP - g_v_ExtractionBodyguardVec has been set to HIDDEN - This proc will be deprecated soon!")
cdPrintnl()
#endif
ELSE
CLEAR_BIT (BitSet_CellphoneTU, g_BSTU_SET_EXTRACTION_PRES_VIEW )
#if IS_DEBUG_BUILD
cdPrintstring("Cellphone EXTRACTION_APP - g_v_ExtractionBodyguardVec has been set to DISPLAY - This proc will be deprecated soon!")
cdPrintnl()
#endif
ENDIF
ENDPROC
PROC SET_THIS_PLAYER_TO_PRESIDENT_VIEW (BOOL PassedBool)
IF PassedBool = TRUE
SET_BIT (BitSet_CellphoneTU, g_BSTU_SET_EXTRACTION_PRES_VIEW )
#if IS_DEBUG_BUILD
cdPrintstring("Cellphone EXTRACTION_APP - SET_THIS_PLAYER_TO_PRESIDENT_VIEW called with TRUE, setting respective bit.")
cdPrintnl()
#endif
ELSE
CLEAR_BIT (BitSet_CellphoneTU, g_BSTU_SET_EXTRACTION_PRES_VIEW )
#if IS_DEBUG_BUILD
cdPrintstring("Cellphone EXTRACTION_APP - SET_THIS_PLAYER_TO_PRESIDENT_VIEW has been called with FALSE, clearing respective bit.")
cdPrintnl()
#endif
ENDIF
ENDPROC
//2588287 - If the player has the phone open and we need to repopulate the context sensitive bottom right homescreen position with a different app,
//we can use this to repopulate the applist without closing and launching the phone. The bit is actioned upon and reset in cellphone_flashhand.sc
PROC REQUEST_DYNAMIC_UPDATE_OF_CELLPHONE_APPLIST()
IF NOT IS_BIT_SET (BitSet_CellphoneTU, g_BSTU_REQUEST_DYNAMIC_APPLIST_UPDATE)
IF g_Cellphone.PhoneDS > PDS_TAKEOUT
#if IS_DEBUG_BUILD
cdPrintstring("Cellphone_Public REQUEST_DYNAMIC_UPDATE_OF_CELLPHONE_APPLIST has been called.")
cdPrintnl()
PRINTLN("\nCELLPHONE_PUB - REQUEST_DYNAMIC_UPDATE_OF_CELLPHONE_APPLIST called by [", GET_THIS_SCRIPT_NAME(), "] through public function.")
#endif
SET_BIT (BitSet_CellphoneTU, g_BSTU_REQUEST_DYNAMIC_APPLIST_UPDATE) //This will signal cellphone_flashhand to perform the more complex mechanics. That script is responsible for resetting the bit.
ELSE
#if IS_DEBUG_BUILD
cdPrintstring("Cellphone_Public REQUEST_DYNAMIC_UPDATE_OF_CELLPHONE_APPLIST called but phone was either already away or in takeout state.")
cdPrintnl()
PRINTLN("\nCELLPHONE_PUB - REQUEST_DYNAMIC_UPDATE_OF_CELLPHONE_APPLIST called but phone is already away or in takeout state. [", GET_THIS_SCRIPT_NAME(), "] used public function.")
#endif
ENDIF
ELSE
#if IS_DEBUG_BUILD
cdPrintstring("Cellphone_Public REQUEST_DYNAMIC_UPDATE_OF_CELLPHONE_APPLIST has been called but action bit is already set.")
cdPrintnl()
PRINTLN("\nCELLPHONE_PUB - REQUEST_DYNAMIC_UPDATE_OF_CELLPHONE_APPLIST called whilst action bit is already set by [", GET_THIS_SCRIPT_NAME(), "] through public function.")
#endif
ENDIF
ENDPROC
PROC DISPLAY_GR_BEACON_SIGNIFIER_BESIDE_RADAR()
#if IS_DEBUG_BUILD
cdPrintstring("Cellphone_Public DISPLAY_GR_BEACON_SIGNIFIER_BESIDE_RADAR() has been called.")
cdPrintnl()
PRINTLN("\nCELLPHONE_PUB - DISPLAY_GR_BEACON_SIGNIFIER_BESIDE_RADAR() called by [", GET_THIS_SCRIPT_NAME(), "] through public function.")
#endif
SET_BIT (BitSet_CellphoneTU, g_BSTU_BEACON_SIGNIFIER_DISPLAYED)
SET_BIT (BitSet_CellphoneDisplay_Continued, g_BSC_CELLPHONE_SIGNIFIERS_NEEDS_UPDATED)
ENDPROC
PROC CLEAR_GR_BEACON_SIGNIFIER_FROM_RADAR()
#if IS_DEBUG_BUILD
cdPrintstring("Cellphone_Public CLEAR_GR_BEACON_SIGNIFIER_FROM_RADAR() has been called.")
cdPrintnl()
PRINTLN("\nCELLPHONE_PUB - CLEAR_GR_BEACON_SIGNIFIER_FROM_RADAR() called by [", GET_THIS_SCRIPT_NAME(), "] through public function.")
#endif
CLEAR_BIT (BitSet_CellphoneTU, g_BSTU_BEACON_SIGNIFIER_DISPLAYED)
SET_BIT (BitSet_CellphoneDisplay_Continued, g_BSC_CELLPHONE_SIGNIFIERS_NEEDS_UPDATED)
ENDPROC