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

11524 lines
377 KiB
Python
Executable File

USING "rage_builtins.sch"
USING "globals.sch"
USING "commands_camera.sch"
USING "commands_entity.sch"
USING "commands_script.sch"
USING "commands_graphics.sch"
USING "commands_pad.sch"
USING "cellphone_public.sch"
USING "cellphone_private.sch"
USING "cellphone_movement.sch"
USING "dialogue_private.sch"
USING "dialogue_public.sch"
//USING "player_ped_public.sch"
USING "Cellphone_Settings_globals_reg.sch"
USING "finance_modifiers_public.sch"
USING "commands_zone.sch"
USING "comms_control_public.sch"
USING "script_misc.sch"
USING "net_comms_public.sch"
USING "ply_to_ply_calls.sch"
USING "script_ped.sch"
USING "transition_common.sch"
#if USE_TU_CHANGES
USING "drunk_public.sch"
#endif
//
// *****************************************************************************************************************
// *****************************************************************************************************************
// *****************************************************************************************************************
//
// MISSION NAME : cellphone_flashhand.sc
// AUTHOR : Steve T
// DESCRIPTION : Handles the various states the cellphone finds itself in from display to handling exits.
// Launched from cellphone_controller or LAUNCH_APPLICATION_EXIT. If this script is not
// running then the phone cannot be on screen.
//
//
//
// *****************************************************************************************************************
// *****************************************************************************************************************
// *****************************************************************************************************************
//Bug 2378079 - new content starts.
//For bug 2378079, implementing a failsafe to terminate AppInternet if it's locked in exit routine and a timer for launch problems.
//INT AppInternetFailsafeCounter = 0
//INT Post_AppLaunch_CurrentTime = 0
//INT AppLaunch_StartTime = 0
//2378079 - new content ends.
//Temp vars for drawing phone - This will all be handled by flash!
FLOAT minOriginX = 0.73
FLOAT minOriginY = 0.55
FLOAT maxOriginX = 0.73
FLOAT maxOriginY = 0.45
FLOAT drawItemX = 0.0
FLOAT drawItemY = 0.0
//FLOAT drawRingerOrigin = 0.81
//FLOAT drawRingerSignalMin = 0.81
//FLOAT drawRingerSignalMax = 0.91
//Removed due to unreference as code segment has been taken out due to bug 109069
//VEHICLE_INDEX Cellphone_CurrentPlayerVehicle //used to test submerging car in incident handling section.
//Values used to check app selection safely.
//6417795 - April 2020
//Add a simple counter for manually blanking out homescreen slots on the scaleform main state.
INT blankSlotCounter = 0
INT testReturnedSFInt
SCALEFORM_RETURN_INDEX testReturnedSFIndex
BOOL b_Waiting_On_SF_Return_Value = FALSE
BOOL local_Request_for_QuickSave = FALSE
//BOOL Movement_Exception = FALSE //Moved to globals to support bug 2050535
BOOL HasGameplayCameraTransitionOccurredDuringCall = FALSE
VECTOR v_CurrentHudPosition
BOOL InFirstPersonCamera = FALSE
BOOL PlayerIsInCover = FALSE
BOOL b_NeedToAdjustEmailForCameraTransition = FALSE
VECTOR v_3dEmailDesiredTransPosition
INT PhoneRenderTarget_ID //the render target id of the phone
BOOL b_PhoneDestroyed = FALSE
#IF IS_DEBUG_BUILD
FLOAT f_YComponent_FPSRemovalSpeed
#ENDIF
INT ThemeDecision, i_Provider_Ident
//BSMF_TYPES bsaq_mf_OpenDecision, bsaq_mf_CallDecision
INT testSignalInt = 0
INT ClockHours, ClockMins
DAY_OF_WEEK ClockDay
TEXT_LABEL_15 TempDayLabel
BOOL Failsafe_Depress_Period_Underway = FALSE
BOOL b_RemoteRingOngoing = FALSE
INT Player_PeriodicHealth //need to keep a copy of this so that we can tell if the player has taken any damage.
INT StockMarketChecks_StartTime, StockMarketChecks_CurrentTime
INT JustEnteredExitVehicle_StartTime, JustEnteredExitVehicle_CurrentTime //2269787
BOOL JustEnteredExitVehicle = FALSE
TIME_DATATYPE Net_StockMarketChecks_StartTime
INT i_TimeDifference
//INT Interference_Current_Time, Interference_Start_Time
INT TempColR, TempColG, TempColB, TempColA //holds the RGBA values extracted from various HUD_COLOURs and passed into SET_SOFT_KEYS_COLOUR
BOOL b_Sniper_equipped = FALSE
WEAPON_TYPE fh_TempWeapon
VEHICLE_INDEX tempFH_VehicleIndex
INT i_Affluence, i_SignalFluctuator
BOOL b_InSubmersible = FALSE
INT i_VibrationTimer = 0
VECTOR AwayVec
BOOL LaunchContactsFromTextMessage_LocalSignal = FALSE
BOOL b_ShouldDisableDirModeVehicleCamForThisActor = FALSE
//#2595711 - Signal MP to display help text explaining the Boss Agency App.
BOOL b_ShouldDisplayBossAgencyHelp = FALSE
#if IS_DEBUG_BUILD
VECTOR v_DebugRotation
#endif
//Moved to cellphone_globals.
//Prescribed phone width - height ratio from Gareth 0.316 x 0.755
//FLOAT g_SF_PhonePosX = 0.87//0.86
//FLOAT g_SF_PhonePosY = 0.797//0.527
//FLOAT g_SF_PhoneSizeX = 0.1548//0.148//0.18
//FLOAT g_SF_PhoneSizeY = 0.37//0.45
/*
FLOAT textSFfloat= 0.0.5
INT SFdirection = 0
INT TempRectColR, TempRectColG, TempRectColB //holds the RGB values used for temporarily differentiation different owners phones before FLASH takes over.
*/
/*
STATUS: 2d App Position array works. Get in! Need to have highlight and selection routines next which allow contacts to be selected for demo.
Once "contacts" is selected that should run a separate script to bring up a list or I'll try and re-use the slot filling routine.
The big plan!
Nice chaps who understand flash should have a phone which we can think of as having a blank master list of empty slots. I then fill these blank slots with
the various apps and their associated information. So, as far as flash is concerned, they provide something like this:
In Min Mode:
Slot 1 Slot 2 Slot 3 Slot 4.
When the phone is launched in min mode, I reference each application in my AppList and use the information associated with each field of the struct to fill
the list up.
So it becomes something like
CONTACTS TEXTS INTERNET CAMERA
So I know which App is in each slot via some kind of flashSlot1 = AppName call during a fill up slots routine
The navigation of this will all be handled by flash so I will need some way of knowing which position has been selected when the user makes his choice.
UPDATE: THE BIG PLAN WORKED. ALMOST TOO WELL...
*/
/*
PROC Check_Min_for_Max_DisplayStatus()
//All temp button presses - should be replaced by macros e.g USE_PHONE!
//IF IS_BUTTON_JUST_PRESSED (PAD1, INT_TO_ENUM (PAD_BUTTON_NUMBER, PHONE_TAKEOUT_INPUT))
IF Is_Phone_Control_Just_Pressed (FRONTEND_CONTROL, INT_TO_ENUM (CONTROL_ACTION, PHONE_TAKEOUT_INPUT))
WHILE IS_CONTROL_PRESSED (FRONTEND_CONTROL, INT_TO_ENUM (CONTROL_ACTION, PHONE_TAKEOUT_INPUT))
WAIT(0)
ENDWHILE
SWITCH g_Cellphone.PhoneDS
CASE PDS_MINIMAL
g_Cellphone.PhoneDS = PDS_MAXIMUM
#if IS_DEBUG_BUILD
cdPrintnl()
cdPrintstring("STATE ASSIGNMENT 50. Cellphone_flashhand assigns PDS_MAXIMUM")
cdPrintnl()
#endif
BREAK
DEFAULT
//Do nothing
BREAK
ENDSWITCH
ENDIF
ENDPROC
*/
/*Moved to cellphone_private.
PROC Update_Page_Indicator_SoftKey()
IF g_b_Secondary_Screen_Available = FALSE
LEGACY_SCALEFORM_MOVIE_METHOD_WITH_NUMBER_AND_STRING (SF_MovieIndex, "SET_SOFT_KEYS", BADGER_OTHER, 0,
1, INVALID_SCALEFORM_PARAM, INVALID_SCALEFORM_PARAM) //"Error!" - Other
CLEAR_BIT (BitSet_CellphoneDisplay, g_BS_OTHER_OPTION_IS_DISPLAYED)
ELSE
IF g_bInMultiplayer //no secondary screen for multiplayer...
LEGACY_SCALEFORM_MOVIE_METHOD_WITH_NUMBER_AND_STRING (SF_MovieIndex, "SET_SOFT_KEYS", BADGER_OTHER, 0,
1, INVALID_SCALEFORM_PARAM, INVALID_SCALEFORM_PARAM) //"Error!" - Other
CLEAR_BIT (BitSet_CellphoneDisplay, g_BS_OTHER_OPTION_IS_DISPLAYED)
ELSE
IF g_Homescreen_In_Secondary_Mode = TRUE
IF g_b_ToggleButtonLabels
LEGACY_SCALEFORM_MOVIE_METHOD_WITH_NUMBER_AND_STRING (SF_MovieIndex, "SET_SOFT_KEYS", BADGER_OTHER, 1,
20, INVALID_SCALEFORM_PARAM, INVALID_SCALEFORM_PARAM, "CELL_225") //Other Pages 2
ELSE
LEGACY_SCALEFORM_MOVIE_METHOD_WITH_NUMBER_AND_STRING (SF_MovieIndex, "SET_SOFT_KEYS", BADGER_OTHER, 1,
20, INVALID_SCALEFORM_PARAM, INVALID_SCALEFORM_PARAM) //Other Pages 2
ENDIF
ELSE
IF g_b_ToggleButtonLabels
LEGACY_SCALEFORM_MOVIE_METHOD_WITH_NUMBER_AND_STRING (SF_MovieIndex, "SET_SOFT_KEYS", BADGER_OTHER, 1,
3, INVALID_SCALEFORM_PARAM, INVALID_SCALEFORM_PARAM, "CELL_225") //Other Pages
ELSE
LEGACY_SCALEFORM_MOVIE_METHOD_WITH_NUMBER_AND_STRING (SF_MovieIndex, "SET_SOFT_KEYS", BADGER_OTHER, 1,
3, INVALID_SCALEFORM_PARAM, INVALID_SCALEFORM_PARAM) //Other Pages
ENDIF
ENDIF
SET_BIT (BitSet_CellphoneDisplay, g_BS_OTHER_OPTION_IS_DISPLAYED)
ENDIF
ENDIF
ENDPROC
*/
FUNC VEHICLE_SEAT GetSeatForTurretCheck(PED_INDEX PedIndex, VEHICLE_INDEX VehicleIndex)
IF NOT IS_ENTITY_DEAD(PedIndex)
AND NOT IS_ENTITY_DEAD(VehicleIndex)
IF IS_PED_SITTING_IN_VEHICLE(PedIndex, VehicleIndex)
IF GET_PED_IN_VEHICLE_SEAT(VehicleIndex, VS_DRIVER) = PedIndex
RETURN VS_DRIVER
ENDIF
IF GET_PED_IN_VEHICLE_SEAT(VehicleIndex, VS_FRONT_RIGHT) = PedIndex
RETURN VS_FRONT_RIGHT
ENDIF
IF GET_PED_IN_VEHICLE_SEAT(VehicleIndex, VS_BACK_LEFT) = PedIndex
RETURN VS_BACK_LEFT
ENDIF
IF GET_PED_IN_VEHICLE_SEAT(VehicleIndex, VS_BACK_RIGHT) = PedIndex
RETURN VS_BACK_RIGHT
ENDIF
//Turret Specifics
IF GET_PED_IN_VEHICLE_SEAT(VehicleIndex, VS_EXTRA_LEFT_1) = PedIndex
RETURN VS_EXTRA_LEFT_1
ENDIF
IF GET_PED_IN_VEHICLE_SEAT(VehicleIndex, VS_EXTRA_RIGHT_1) = PedIndex
RETURN VS_EXTRA_RIGHT_1
ENDIF
IF GET_PED_IN_VEHICLE_SEAT(VehicleIndex, VS_EXTRA_LEFT_2) = PedIndex
RETURN VS_EXTRA_LEFT_2
ENDIF
IF GET_PED_IN_VEHICLE_SEAT(VehicleIndex, VS_EXTRA_RIGHT_2) = PedIndex
RETURN VS_EXTRA_RIGHT_2
ENDIF
IF GET_PED_IN_VEHICLE_SEAT(VehicleIndex, VS_EXTRA_LEFT_3) = PedIndex
RETURN VS_EXTRA_LEFT_1
ENDIF
IF GET_PED_IN_VEHICLE_SEAT(VehicleIndex, VS_EXTRA_RIGHT_3) = PedIndex
RETURN VS_EXTRA_RIGHT_1
ENDIF
ELSE
#IF IS_DEBUG_BUILD
SCRIPT_ASSERT("Ped is not sitting in vehicle. Check if ped is sitting in vehicle first before calling GET_PED_VEHICLE_SEAT().")
#ENDIF
ENDIF
ENDIF
RETURN VS_ANY_PASSENGER
ENDFUNC
/* Moved to cellphone_private so AppContacts.sc can use.
PROC LaunchTransitionMoveUpIfRequired()
VECTOR CurrentCellphonePosition
GET_MOBILE_PHONE_POSITION (CurrentCellphonePosition)
IF g_This_Screen_3dPhoneEndVec[g_Chosen_Ratio].y = CurrentCellphonePosition.Y
#if IS_DEBUG_BUILD
cdPrintnl()
cdPrintstring("CELLPHONE_FH - LaunchTransitionMoveUpIfRequired() says phone already up!")
cdPrintnl()
#endif
ELSE
g_3DPhoneNeedsMovedUp = TRUE
ENDIF
ENDPROC
PROC LaunchTransitionMoveDownIfRequired()
VECTOR CurrentCellphonePosition
GET_MOBILE_PHONE_POSITION (CurrentCellphonePosition)
IF g_This_Screen_3dPhoneStartVec[g_Chosen_Ratio].y = CurrentCellphonePosition.Y
#if IS_DEBUG_BUILD
cdPrintnl()
cdPrintstring("CELLPHONE_FH - LaunchTransitionMoveDownIfRequired() says phone already up!")
cdPrintnl()
#endif
ELSE
g_FirstPersonTransitionOngoing = TRUE
ENDIF
ENDPROC
*/
PROC Move_to_Second_Screen(INT cursorPosition)
g_Homescreen_In_Secondary_Mode = TRUE
LEGACY_SCALEFORM_MOVIE_METHOD_WITH_NUMBER(SF_MovieIndex,"SET_DATA_SLOT_EMPTY", 1)
Scaleform_Place_Items_on_Homescreen(2)
Update_Page_Indicator_SoftKey()
LEGACY_SCALEFORM_MOVIE_METHOD_WITH_NUMBER (SF_MovieIndex, "DISPLAY_VIEW", 1, TO_FLOAT(cursorPosition))
#if IS_DEBUG_BUILD
cdPrintstring ("CELLPHONE_FH - Update_Scaleform_VSE called - 1998")
cdPrintnl ()
#endif
PLAY_SOUND_FRONTEND (-1, "Menu_Navigate", g_Owner_Soundset)
appCursorIndex = cursorPosition
ENDPROC
PROC Move_to_First_Screen(INT cursorPosition)
g_Homescreen_In_Secondary_Mode = FALSE
LEGACY_SCALEFORM_MOVIE_METHOD_WITH_NUMBER(SF_MovieIndex,"SET_DATA_SLOT_EMPTY", 1)
Scaleform_Place_Items_on_Homescreen(1)
Update_Page_Indicator_SoftKey()
LEGACY_SCALEFORM_MOVIE_METHOD_WITH_NUMBER (SF_MovieIndex, "DISPLAY_VIEW", 1, TO_FLOAT(cursorPosition))
#if IS_DEBUG_BUILD
cdPrintstring ("CELLPHONE_FH - Update_Scaleform_VSE called - 1999")
cdPrintnl ()
#endif
PLAY_SOUND_FRONTEND (-1, "Menu_Navigate", g_Owner_Soundset)
appCursorIndex = cursorposition
ENDPROC
PROC Perform_LeftmostFirst_to_RightmostSecond_Wrap(INT cursorPosition)
g_Homescreen_In_Secondary_Mode = TRUE
LEGACY_SCALEFORM_MOVIE_METHOD_WITH_NUMBER(SF_MovieIndex,"SET_DATA_SLOT_EMPTY", 1)
Scaleform_Place_Items_on_Homescreen(2)
Update_Page_Indicator_SoftKey()
//Supporting first line only so 0, 3 or 6 on first screen will only check for presence of app at 2, then 1, then 0 on second screen.
//Unref hack.
IF cursorPosition = 0
ENDIF
//Deliberately not else clauses! We need to try all slots in sequence. Move to loop when supporting more lines.
IF Has_this_AppSlot_Been_Assigned[0] = TRUE
AppCursorIndex = 0 //This should always be the default as there has to be an app in slot zero or the second screen would not be available.
ENDIF
IF Has_this_AppSlot_Been_Assigned[1] = TRUE
AppCursorIndex = 1
ENDIF
IF Has_this_AppSlot_Been_Assigned[2] = TRUE
AppCursorIndex = 2
ENDIF
PLAY_SOUND_FRONTEND (-1, "Menu_Navigate", g_Owner_Soundset)
LEGACY_SCALEFORM_MOVIE_METHOD_WITH_NUMBER (SF_MovieIndex, "DISPLAY_VIEW", 1, TO_FLOAT(appCursorIndex))
ENDPROC
PROC Check_For_Director_Mode_Navigation()
// Homescreen
// 0 1 2
//___________
// 3 4 5
//___________
// 6 7 8
IF dpad_pause_cued
IF TIMERA() > 50
dpad_pause_cued = FALSE
ENDIF
ENDIF
///////
/// PC MOUSE WHEEL SUPPORT - STEVE R. LDS
///
/// Scrolls through the entire list of icons using mouse wheel
/// dropping down to the next row when it reaches the right/left hand side, eg.
///
/// 0 -> 1 -> 2
/// <----------
/// 3 -> 4 -> 5
/// <----------
/// 6 -> 7 -> 8
///
///
IF IS_USING_KEYBOARD_AND_MOUSE(FRONTEND_CONTROL)
// Mousewheel scroll forward
IF IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_CELLPHONE_SCROLL_FORWARD)
SWITCH AppCursorIndex
CASE 6
IF Has_this_AppSlot_Been_Assigned[7]
Call_Scaleform_Input_Keypress_Right()
AppCursorIndex = 7
ENDIF
BREAK
CASE 7
IF Has_this_AppSlot_Been_Assigned[6]
Call_Scaleform_Input_Keypress_Left()
AppCursorIndex = 6
ENDIF
BREAK
ENDSWITCH
//dpad_pause_cued = TRUE
//SETTIMERA (0)
ENDIF
// Scroll backward
IF IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_CELLPHONE_SCROLL_BACKWARD)
SWITCH AppCursorIndex
CASE 6
IF Has_this_AppSlot_Been_Assigned[7]
Call_Scaleform_Input_Keypress_Right()
AppCursorIndex = 7
ENDIF
BREAK
CASE 7
IF Has_this_AppSlot_Been_Assigned[6]
Call_Scaleform_Input_Keypress_Left()
AppCursorIndex = 6
ENDIF
BREAK
ENDSWITCH
//dpad_pause_cued = TRUE
//SETTIMERA (0)
ENDIF
ENDIF
IF dpad_pause_cued = FALSE
IF Is_Phone_Control_Just_Pressed (FRONTEND_CONTROL, INT_TO_ENUM (CONTROL_ACTION, PHONE_NAV_RIGHT_INPUT))
Movement_Exception = FALSE
SWITCH AppCursorIndex
CASE 2
AppCursorIndex = 0
BREAK
CASE 5
AppCursorIndex = 3
BREAK
CASE 7
//Cater for missing bottom right hand corner app carousel scrolling...
IF Has_this_AppSlot_Been_Assigned[(appCursorIndex + 1)] = TRUE
AppCursorIndex = 8
ELSE
AppCursorIndex = 6
Movement_Exception = TRUE
ENDIF
BREAK
CASE 8
AppCursorIndex = 6
BREAK
DEFAULT
AppCursorIndex ++
BREAK
ENDSWITCH
IF Movement_Exception = TRUE
Call_Scaleform_Input_Keypress_Left()
ELSE
Call_Scaleform_Input_Keypress_Right()
ENDIF
dpad_pause_cued = TRUE
SETTIMERA (0)
ENDIF
IF Is_Phone_Control_Just_Pressed (FRONTEND_CONTROL, INT_TO_ENUM (CONTROL_ACTION, PHONE_NAV_LEFT_INPUT))
Movement_Exception = FALSE
SWITCH AppCursorIndex
CASE 0
AppCursorIndex = 2
BREAK
CASE 3
AppCursorIndex = 5
BREAK
CASE 6
IF Has_this_AppSlot_Been_Assigned[8] = TRUE
AppCursorIndex = 8
ELSE
AppCursorIndex = 7
Movement_Exception = TRUE
ENDIF
BREAK
DEFAULT
AppCursorIndex --
BREAK
ENDSWITCH
IF Movement_Exception = TRUE
Call_Scaleform_Input_Keypress_Right()
ELSE
Call_Scaleform_Input_Keypress_Left()
ENDIF
dpad_pause_cued = TRUE
SETTIMERA (0)
ENDIF
ENDIF
ENDPROC
PROC Check_For_Single_Homescreen_Navigation()
// Homescreen
// 0 1 2
//___________
// 3 4 5
//___________
// 6 7 8
IF dpad_pause_cued
IF TIMERA() > 50
dpad_pause_cued = FALSE
ENDIF
ENDIF
///////
/// PC MOUSE WHEEL SUPPORT - STEVE R. LDS
///
/// Scrolls through the entire list of icons using mouse wheel
/// dropping down to the next row when it reaches the right/left hand side, eg.
///
/// 0 -> 1 -> 2
/// <----------
/// 3 -> 4 -> 5
/// <----------
/// 6 -> 7 -> 8
///
///
IF IS_USING_KEYBOARD_AND_MOUSE(FRONTEND_CONTROL)
// Mousewheel scroll forward
IF IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_CELLPHONE_SCROLL_FORWARD)
SWITCH AppCursorIndex
CASE 0
IF Has_this_AppSlot_Been_Assigned[1]
Call_Scaleform_Input_Keypress_Right()
AppCursorIndex = 1
ENDIF
BREAK
CASE 1
IF Has_this_AppSlot_Been_Assigned[2]
Call_Scaleform_Input_Keypress_Right()
AppCursorIndex = 2
ENDIF
BREAK
CASE 2
IF Has_this_AppSlot_Been_Assigned[3]
Call_Scaleform_Input_Keypress_Right()
Call_Scaleform_Input_Keypress_Down()
AppCursorIndex = 3
ELSE
Call_Scaleform_Input_Keypress_Left()
Call_Scaleform_Input_Keypress_Down()
AppCursorIndex = 4
ENDIF
BREAK
CASE 3
IF Has_this_AppSlot_Been_Assigned[4]
Call_Scaleform_Input_Keypress_Right()
AppCursorIndex = 4
ENDIF
BREAK
CASE 4
IF Has_this_AppSlot_Been_Assigned[5]
Call_Scaleform_Input_Keypress_Right()
AppCursorIndex = 5
ENDIF
BREAK
CASE 5
IF Has_this_AppSlot_Been_Assigned[6]
Call_Scaleform_Input_Keypress_Right()
Call_Scaleform_Input_Keypress_Down()
AppCursorIndex = 6
ENDIF
BREAK
CASE 6
IF Has_this_AppSlot_Been_Assigned[7]
Call_Scaleform_Input_Keypress_Right()
AppCursorIndex = 7
ENDIF
BREAK
CASE 7
IF Has_this_AppSlot_Been_Assigned[8]
Call_Scaleform_Input_Keypress_Right()
AppCursorIndex = 8
ELSE
Call_Scaleform_Input_Keypress_Left()
Call_Scaleform_Input_Keypress_Down()
AppCursorIndex = 0
ENDIF
BREAK
CASE 8
IF Has_this_AppSlot_Been_Assigned[0]
Call_Scaleform_Input_Keypress_Right()
Call_Scaleform_Input_Keypress_Down()
AppCursorIndex = 0
ENDIF
BREAK
ENDSWITCH
//dpad_pause_cued = TRUE
//SETTIMERA (0)
ENDIF
// Scroll backward
IF IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_CELLPHONE_SCROLL_BACKWARD)
SWITCH AppCursorIndex
CASE 0
IF Has_this_AppSlot_Been_Assigned[8]
Call_Scaleform_Input_Keypress_Left()
Call_Scaleform_Input_Keypress_Up()
AppCursorIndex = 8
ELSE
Call_Scaleform_Input_Keypress_Right()
Call_Scaleform_Input_Keypress_Up()
AppCursorIndex = 7
ENDIF
BREAK
CASE 1
IF Has_this_AppSlot_Been_Assigned[0]
Call_Scaleform_Input_Keypress_Left()
AppCursorIndex = 0
ENDIF
BREAK
CASE 2
IF Has_this_AppSlot_Been_Assigned[1]
Call_Scaleform_Input_Keypress_Left()
AppCursorIndex = 1
ENDIF
BREAK
CASE 3
IF Has_this_AppSlot_Been_Assigned[2]
Call_Scaleform_Input_Keypress_Left()
Call_Scaleform_Input_Keypress_Up()
AppCursorIndex = 2
ENDIF
BREAK
CASE 4
IF Has_this_AppSlot_Been_Assigned[3]
Call_Scaleform_Input_Keypress_Left()
AppCursorIndex = 3
ELSE
Call_Scaleform_Input_Keypress_Up()
Call_Scaleform_Input_Keypress_Right()
Movement_Exception = TRUE
AppCursorIndex = 2
ENDIF
BREAK
CASE 5
IF Has_this_AppSlot_Been_Assigned[4]
Call_Scaleform_Input_Keypress_Left()
AppCursorIndex = 4
ENDIF
BREAK
CASE 6
IF Has_this_AppSlot_Been_Assigned[5]
Call_Scaleform_Input_Keypress_Up()
Call_Scaleform_Input_Keypress_Left()
AppCursorIndex = 5
ENDIF
BREAK
CASE 7
IF Has_this_AppSlot_Been_Assigned[6]
Call_Scaleform_Input_Keypress_Left()
AppCursorIndex = 6
ENDIF
BREAK
CASE 8
IF Has_this_AppSlot_Been_Assigned[7]
Call_Scaleform_Input_Keypress_Left()
AppCursorIndex = 7
ENDIF
BREAK
ENDSWITCH
//dpad_pause_cued = TRUE
//SETTIMERA (0)
ENDIF
ENDIF
IF dpad_pause_cued = FALSE
IF Is_Phone_Control_Just_Pressed (FRONTEND_CONTROL, INT_TO_ENUM (CONTROL_ACTION, PHONE_NAV_RIGHT_INPUT))
Movement_Exception = FALSE
SWITCH AppCursorIndex
CASE 2
AppCursorIndex = 0
BREAK
CASE 5
AppCursorIndex = 3
BREAK
CASE 7
//Cater for missing bottom right hand corner app carousel scrolling...
IF Has_this_AppSlot_Been_Assigned[(appCursorIndex + 1)] = TRUE
AppCursorIndex = 8
ELSE
AppCursorIndex = 6
Movement_Exception = TRUE
ENDIF
BREAK
CASE 8
AppCursorIndex = 6
BREAK
DEFAULT
AppCursorIndex ++
BREAK
ENDSWITCH
IF Movement_Exception = TRUE
Call_Scaleform_Input_Keypress_Left()
ELSE
Call_Scaleform_Input_Keypress_Right()
ENDIF
dpad_pause_cued = TRUE
SETTIMERA (0)
ENDIF
IF Is_Phone_Control_Just_Pressed (FRONTEND_CONTROL, INT_TO_ENUM (CONTROL_ACTION, PHONE_NAV_LEFT_INPUT))
Movement_Exception = FALSE
SWITCH AppCursorIndex
CASE 0
AppCursorIndex = 2
BREAK
CASE 3
AppCursorIndex = 5
BREAK
CASE 6
IF Has_this_AppSlot_Been_Assigned[8] = TRUE
AppCursorIndex = 8
ELSE
AppCursorIndex = 7
Movement_Exception = TRUE
ENDIF
BREAK
DEFAULT
AppCursorIndex --
BREAK
ENDSWITCH
IF Movement_Exception = TRUE
Call_Scaleform_Input_Keypress_Right()
ELSE
Call_Scaleform_Input_Keypress_Left()
ENDIF
dpad_pause_cued = TRUE
SETTIMERA (0)
ENDIF
IF Is_Phone_Control_Just_Pressed (FRONTEND_CONTROL, INT_TO_ENUM (CONTROL_ACTION, PHONE_NAV_UP_INPUT))
Movement_Exception = FALSE
SWITCH AppCursorIndex
CASE 0
IF Has_this_AppSlot_Been_Assigned[6]
AppCursorIndex = 6
ENDIF
BREAK
CASE 1
IF Has_this_AppSlot_Been_Assigned[7]
AppCursorIndex = 7
ENDIF
BREAK
CASE 2
IF Has_this_AppSlot_Been_Assigned[8]
AppCursorIndex = 8
ELSE
Movement_Exception = TRUE
AppCursorIndex = 5
ENDIF
BREAK
CASE 3
IF Has_this_AppSlot_Been_Assigned[0]
AppCursorIndex = 0
ENDIF
BREAK
CASE 4
IF Has_this_AppSlot_Been_Assigned[1]
AppCursorIndex = 1
ENDIF
BREAK
CASE 5
IF Has_this_AppSlot_Been_Assigned[2]
AppCursorIndex = 2
ENDIF
BREAK
CASE 6
IF Has_this_AppSlot_Been_Assigned[3]
AppCursorIndex = 3
ENDIF
BREAK
CASE 7
IF Has_this_AppSlot_Been_Assigned[4]
AppCursorIndex = 4
ENDIF
BREAK
CASE 8
IF Has_this_AppSlot_Been_Assigned[5]
AppCursorIndex = 5
ENDIF
BREAK
ENDSWITCH
IF Movement_Exception = TRUE
Call_Scaleform_Input_Keypress_Down()
ELSE
Call_Scaleform_Input_Keypress_Up()
ENDIF
dpad_pause_cued = TRUE
SETTIMERA (0)
ENDIF
IF Is_Phone_Control_Just_Pressed (FRONTEND_CONTROL, INT_TO_ENUM (CONTROL_ACTION, PHONE_NAV_DOWN_INPUT))
Movement_Exception = FALSE
SWITCH AppCursorIndex
CASE 0
IF Has_this_AppSlot_Been_Assigned[3]
AppCursorIndex = 3
ENDIF
BREAK
CASE 1
IF Has_this_AppSlot_Been_Assigned[4]
AppCursorIndex = 4
ENDIF
BREAK
CASE 2
IF Has_this_AppSlot_Been_Assigned[5]
AppCursorIndex = 5
ENDIF
BREAK
CASE 3
IF Has_this_AppSlot_Been_Assigned[6]
AppCursorIndex = 6
ENDIF
BREAK
CASE 4
IF Has_this_AppSlot_Been_Assigned[7]
AppCursorIndex = 7
ENDIF
BREAK
CASE 5
IF Has_this_AppSlot_Been_Assigned[8]
AppCursorIndex = 8
ELSE
Movement_Exception = TRUE
AppCursorIndex = 2
ENDIF
BREAK
CASE 6
IF Has_this_AppSlot_Been_Assigned[0]
AppCursorIndex = 0
ENDIF
BREAK
CASE 7
IF Has_this_AppSlot_Been_Assigned[1]
AppCursorIndex = 1
ENDIF
BREAK
CASE 8
IF Has_this_AppSlot_Been_Assigned[2]
AppCursorIndex = 2
ENDIF
BREAK
ENDSWITCH
IF Movement_Exception = TRUE
Call_Scaleform_Input_Keypress_Up()
ELSE
Call_Scaleform_Input_Keypress_Down()
ENDIF
dpad_pause_cued = TRUE
SETTIMERA (0)
ENDIF
ENDIF
ENDPROC
//6417795 - April 2020
//Sets up the secondary mode of the homescreen. Called whenever the player presses the new switch mode soft key on the cellphone.
PROC SET_UP_MULTIPLAYER_SECONDARY_MODE_HOMESCREEN()
SET_BIT (BitSet_CellphoneDisplay_Third, g_BSTHIRD_MP_CELLPHONE_IN_SECONDARY_MODE)
//...this ensures the "in secondary mode" bit flag is set prior to setting up the secondary mode.
//Specify the position that the settings application should now appear in the secondary mode as a failsafe.
//The third param specifies position 0, the top left cell of our 3 x 3 grid. Note that we do not change the sixth parameter.
//That relates to a legacy page precedence system used in SP; it is irrelevant to this new infrastructure.
Fill_App_Sheet (AppSETTINGS, "CELL_16", 0, "appSettings", 24, 1, App_O1_UNLOCKED, App_O2_LOCKED, App_O3_LOCKED)
//Clear all scaleform display slots on state 1, the homescreen. This still requires a manual refresh however...
LEGACY_SCALEFORM_MOVIE_METHOD_WITH_NUMBER(SF_MovieIndex,"SET_DATA_SLOT_EMPTY", 1)
//...so wipe out all of the 3 x 3 homescreen grid cells by injecting them with a blank icon and data.
blankSlotCounter = 0
WHILE blankSlotCounter < 9
BEGIN_SCALEFORM_MOVIE_METHOD (SF_MovieIndex, "SET_DATA_SLOT")
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(1)
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(blankSlotCounter)
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(25)
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(0)
//This string should never be seen, so just use the settings name rather than a dummy string. See #6437083
SCALEFORM_MOVIE_METHOD_ADD_PARAM_STRING(g_AppList[AppSETTINGS].AppName)
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(225)
END_SCALEFORM_MOVIE_METHOD()
blankSlotCounter ++
ENDWHILE
//Now we want to manually inject the Settings App into navigation slot 0 to match the desired cell position on the homescreen.
//When the user selects this cell, the application launch routine will extract the data associated with the Settings app.
AppSlot[0] = (ENUM_TO_INT(AppSETTINGS))
BEGIN_SCALEFORM_MOVIE_METHOD (SF_MovieIndex, "SET_DATA_SLOT")
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(1)
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(0)
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(g_AppList[AppSETTINGS].SF_IconEnum)
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(0)
SCALEFORM_MOVIE_METHOD_ADD_PARAM_STRING(g_AppList[AppSETTINGS].AppName)
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(255)
END_SCALEFORM_MOVIE_METHOD()
Update_Page_Indicator_SoftKey()
//Do a quick refresh of the homescreen by briefly switching to another scaleform state...
LEGACY_SCALEFORM_MOVIE_METHOD_WITH_NUMBER (SF_MovieIndex, "DISPLAY_VIEW", 4, TO_FLOAT(0))
//...then switch back to state 1, the homescreen.
LEGACY_SCALEFORM_MOVIE_METHOD_WITH_NUMBER (SF_MovieIndex, "DISPLAY_VIEW", 1, TO_FLOAT(0))
//Finally, re-add the new switch soft key in case it has gone walkabout during any of the other complex legacy manipulations.
ADD_NEW_MP_HOMESCREEN_MODE_SWITCH_SOFT_KEY()
ENDPROC
//6417795 - April 2020
//Called every frame when the cellphone is in homescreen secondary mode in MP only.
PROC Check_For_New_MP_Secondary_Mode_Navigation()
//We have only one app in secondary mode at present, so we only need to check for the user pressing the switch homescreen mode option.
//No navigational checks are required as yet.
IF Is_Phone_Control_Just_Pressed (FRONTEND_CONTROL, INT_TO_ENUM (CONTROL_ACTION, PHONE_SPECIAL_OPTION_INPUT))
Play_Select_Beep()
//The user has pressed the control to switch back to primary mode of the homescreen, clear our associated mode bit...
CLEAR_BIT (BitSet_CellphoneDisplay_Third, g_BSTHIRD_MP_CELLPHONE_IN_SECONDARY_MODE)
#if IS_DEBUG_BUILD
cdPrintstring("6417795 - April 2020: New MP Secondary Mode exit detected. Will return to Primary Mode...")
#ENDIF
//...flush the scaleform homescreen state.
LEGACY_SCALEFORM_MOVIE_METHOD_WITH_NUMBER (SF_MovieIndex, "SET_DATA_SLOT_EMPTY", 1)
//Prepare our return to primary mode by repopulating the homescreen via the existing legacy method...
Scaleform_Place_Items_on_Homescreen(1)
//...and refresh the scaleform view to show the reconstituted primary mode again, making sure to re-add our softkey as a failsafe.
LEGACY_SCALEFORM_MOVIE_METHOD_WITH_NUMBER (SF_MovieIndex, "DISPLAY_VIEW", 1, TO_FLOAT(Previous_SelectedAppCursorPos_pageOne))
ADD_NEW_MP_HOMESCREEN_MODE_SWITCH_SOFT_KEY()
ENDIF
//Comment in to display some debug text on the phone screen to show we are in secondary mode.
#if IS_DEBUG_BUILD
//DISPLAY_TEXT_WITH_LITERAL_STRING (0.55, 0.34, "STRING", "2nd")
#ENDIF
ENDPROC
PROC Check_For_New_MP_Single_Homescreen_Navigation() //Broadcast app requested to be commented out by Les TODO #1620959 - This is the new master routine for MP
//6417795 - April 2020
//Critical!
//If the user presses the new soft key to swap between the current primary mode to the new secondary mode,
//action this then exit to avoid any further navigational checks this frame.
//Tunable support added for 6474707 - should only check for this input if the tunable says the secondary screen mode is available.
IF SHOULD_MP_SECONDARY_MODE_BE_AVAILABLE()
IF Is_Phone_Control_Just_Pressed (FRONTEND_CONTROL, INT_TO_ENUM (CONTROL_ACTION, PHONE_SPECIAL_OPTION_INPUT))
Play_Select_Beep()
Previous_SelectedAppCursorPos_pageOne = AppCursorIndex //Grab a copy of where the selection cursor was for any future use.
//Call our main secondary mode set up routine.
SET_UP_MULTIPLAYER_SECONDARY_MODE_HOMESCREEN()
#if IS_DEBUG_BUILD
cdPrintstring("6417795 - April 2020: Was navigating Primary Mode. Secondary Mode is available. Detected requested to activate New MP Secondary Mode.")
#ENDIF
EXIT
ENDIF
ENDIF
// Homescreen
// 0 1 2
//___________
// 3 4 5
//___________
// 6 7 8
//All used, 5 now will be a launch tile. Settings app moved to second page.
IF dpad_pause_cued
IF TIMERA() > 50
dpad_pause_cued = FALSE
ENDIF
ENDIF
///////
/// PC MOUSE WHEEL SUPPORT - STEVE R. LDS
///
/// Scrolls through the entire list of icons using mouse wheel
/// dropping down/moving up to the next row when it reaches the right/left hand side, eg.
///
/// 0 -> 1 -> 2
/// <----------
/// 3 -> 4 -> 5
/// <----------
/// 6 -> 7 -> 8
///
///
IF IS_USING_KEYBOARD_AND_MOUSE(FRONTEND_CONTROL)
// Mousewheel scroll forward
IF IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_CELLPHONE_SCROLL_FORWARD)
SWITCH AppCursorIndex
CASE 0
IF Has_this_AppSlot_Been_Assigned[1]
Call_Scaleform_Input_Keypress_Right()
AppCursorIndex = 1
ENDIF
BREAK
CASE 1
IF Has_this_AppSlot_Been_Assigned[2]
Call_Scaleform_Input_Keypress_Right()
AppCursorIndex = 2
ENDIF
BREAK
CASE 2
IF Has_this_AppSlot_Been_Assigned[3]
Call_Scaleform_Input_Keypress_Right()
Call_Scaleform_Input_Keypress_Down()
AppCursorIndex = 3
ELSE
Call_Scaleform_Input_Keypress_Left()
Call_Scaleform_Input_Keypress_Down()
AppCursorIndex = 4
ENDIF
BREAK
CASE 3
IF Has_this_AppSlot_Been_Assigned[4]
Call_Scaleform_Input_Keypress_Right()
AppCursorIndex = 4
ENDIF
BREAK
CASE 4
IF Has_this_AppSlot_Been_Assigned[5]
Call_Scaleform_Input_Keypress_Right()
AppCursorIndex = 5
ENDIF
BREAK
CASE 5
IF Has_this_AppSlot_Been_Assigned[6]
Call_Scaleform_Input_Keypress_Right()
Call_Scaleform_Input_Keypress_Down()
AppCursorIndex = 6
ENDIF
BREAK
CASE 6
IF Has_this_AppSlot_Been_Assigned[7]
Call_Scaleform_Input_Keypress_Right()
AppCursorIndex = 7
ENDIF
BREAK
CASE 7
IF Has_this_AppSlot_Been_Assigned[8]
Call_Scaleform_Input_Keypress_Right()
AppCursorIndex = 8
ELSE
Call_Scaleform_Input_Keypress_Left()
Call_Scaleform_Input_Keypress_Down()
AppCursorIndex = 0
ENDIF
BREAK
CASE 8
IF Has_this_AppSlot_Been_Assigned[0]
Call_Scaleform_Input_Keypress_Right()
Call_Scaleform_Input_Keypress_Down()
AppCursorIndex = 0
ELSE
Call_Scaleform_Input_Keypress_Left()
Call_Scaleform_Input_Keypress_Down()
ENDIF
BREAK
ENDSWITCH
ENDIF
// Scroll backward
IF IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_CELLPHONE_SCROLL_BACKWARD)
SWITCH AppCursorIndex
CASE 0
IF Has_this_AppSlot_Been_Assigned[8]
Call_Scaleform_Input_Keypress_Left()
Call_Scaleform_Input_Keypress_Up()
AppCursorIndex = 8
ELSE
Call_Scaleform_Input_Keypress_Right()
Call_Scaleform_Input_Keypress_Up()
AppCursorIndex = 7
ENDIF
BREAK
CASE 1
IF Has_this_AppSlot_Been_Assigned[0]
Call_Scaleform_Input_Keypress_Left()
AppCursorIndex = 0
ELSE
IF Has_this_AppSlot_Been_Assigned[8]
Call_Scaleform_Input_Keypress_Up()
Call_Scaleform_Input_Keypress_Right()
ELSE
Call_Scaleform_Input_Keypress_Up()
ENDIF
ENDIF
BREAK
CASE 2
IF Has_this_AppSlot_Been_Assigned[1]
Call_Scaleform_Input_Keypress_Left()
AppCursorIndex = 1
ENDIF
BREAK
CASE 3
IF Has_this_AppSlot_Been_Assigned[2]
Call_Scaleform_Input_Keypress_Left()
Call_Scaleform_Input_Keypress_Up()
AppCursorIndex = 2
ENDIF
BREAK
CASE 4
IF Has_this_AppSlot_Been_Assigned[3]
Call_Scaleform_Input_Keypress_Left()
AppCursorIndex = 3
ELSE
Call_Scaleform_Input_Keypress_Up()
Call_Scaleform_Input_Keypress_Right()
Movement_Exception = TRUE
AppCursorIndex = 2
ENDIF
BREAK
CASE 5
IF Has_this_AppSlot_Been_Assigned[4]
Call_Scaleform_Input_Keypress_Left()
AppCursorIndex = 4
ENDIF
BREAK
CASE 6
IF Has_this_AppSlot_Been_Assigned[5]
Call_Scaleform_Input_Keypress_Up()
Call_Scaleform_Input_Keypress_Left()
AppCursorIndex = 5
ENDIF
BREAK
CASE 7
IF Has_this_AppSlot_Been_Assigned[6]
Call_Scaleform_Input_Keypress_Left()
AppCursorIndex = 6
ENDIF
BREAK
CASE 8
IF Has_this_AppSlot_Been_Assigned[7]
Call_Scaleform_Input_Keypress_Left()
AppCursorIndex = 7
ENDIF
BREAK
ENDSWITCH
//dpad_pause_cued = TRUE
//SETTIMERA (0)
ENDIF
ENDIF
IF dpad_pause_cued = FALSE
IF Is_Phone_Control_Just_Pressed (FRONTEND_CONTROL, INT_TO_ENUM (CONTROL_ACTION, PHONE_NAV_RIGHT_INPUT))
Movement_Exception = FALSE
SWITCH AppCursorIndex
CASE 2
IF Has_this_AppSlot_Been_Assigned[0] = TRUE
AppCursorIndex = 0
ELSE
AppCursorIndex = 1
Movement_Exception = TRUE
ENDIF
BREAK
CASE 5
AppCursorIndex = 3
BREAK
CASE 6
AppCursorIndex = 7
BREAK
CASE 7
//Cater for missing bottom right hand corner app carousel scrolling...
IF Has_this_AppSlot_Been_Assigned[(appCursorIndex + 1)] = TRUE
AppCursorIndex = 8
ELSE
AppCursorIndex = 6
Movement_Exception = TRUE
ENDIF
BREAK
CASE 8
AppCursorIndex = 6
BREAK
DEFAULT
AppCursorIndex ++
BREAK
ENDSWITCH
IF Movement_Exception = TRUE
Call_Scaleform_Input_Keypress_Left()
ELSE
Call_Scaleform_Input_Keypress_Right()
ENDIF
dpad_pause_cued = TRUE
SETTIMERA (0)
ENDIF
IF Is_Phone_Control_Just_Pressed (FRONTEND_CONTROL, INT_TO_ENUM (CONTROL_ACTION, PHONE_NAV_LEFT_INPUT))
Movement_Exception = FALSE
SWITCH AppCursorIndex
CASE 0
AppCursorIndex = 2
BREAK
CASE 1
IF Has_this_AppSlot_Been_Assigned[0] = TRUE
AppCursorIndex = 0
ELSE
AppCursorIndex = 2
Movement_Exception = TRUE
ENDIF
BREAK
CASE 3
AppCursorIndex = 5
BREAK
CASE 6
IF Has_this_AppSlot_Been_Assigned[8] = TRUE
AppCursorIndex = 8
ELSE
AppCursorIndex = 7
Movement_Exception = TRUE
ENDIF
BREAK
DEFAULT
AppCursorIndex --
BREAK
ENDSWITCH
IF Movement_Exception = TRUE
Call_Scaleform_Input_Keypress_Right()
ELSE
Call_Scaleform_Input_Keypress_Left()
ENDIF
dpad_pause_cued = TRUE
SETTIMERA (0)
ENDIF
IF Is_Phone_Control_Just_Pressed (FRONTEND_CONTROL, INT_TO_ENUM (CONTROL_ACTION, PHONE_NAV_UP_INPUT))
Movement_Exception = FALSE
SWITCH AppCursorIndex
CASE 0
IF Has_this_AppSlot_Been_Assigned[6]
AppCursorIndex = 6
ENDIF
BREAK
CASE 1
IF Has_this_AppSlot_Been_Assigned[7]
AppCursorIndex = 7
ELSE
Movement_Exception = TRUE
AppCursorIndex = 4
ENDIF
BREAK
CASE 2
IF Has_this_AppSlot_Been_Assigned[8]
AppCursorIndex = 8
ELSE
Movement_Exception = TRUE
AppCursorIndex = 5
ENDIF
BREAK
CASE 3
IF Has_this_AppSlot_Been_Assigned[0]
AppCursorIndex = 0
ELSE
Movement_Exception = TRUE
AppCursorIndex = 6
ENDIF
BREAK
CASE 4
IF Has_this_AppSlot_Been_Assigned[1]
AppCursorIndex = 1
ENDIF
BREAK
CASE 5
IF Has_this_AppSlot_Been_Assigned[2]
AppCursorIndex = 2
ENDIF
BREAK
CASE 6
IF Has_this_AppSlot_Been_Assigned[3]
AppCursorIndex = 3
ENDIF
BREAK
CASE 7
IF Has_this_AppSlot_Been_Assigned[4]
AppCursorIndex = 4
ENDIF
BREAK
CASE 8
IF Has_this_AppSlot_Been_Assigned[5]
AppCursorIndex = 5
ENDIF
BREAK
ENDSWITCH
IF Movement_Exception = TRUE
Call_Scaleform_Input_Keypress_Down()
ELSE
Call_Scaleform_Input_Keypress_Up()
ENDIF
dpad_pause_cued = TRUE
SETTIMERA (0)
ENDIF
IF Is_Phone_Control_Just_Pressed (FRONTEND_CONTROL, INT_TO_ENUM (CONTROL_ACTION, PHONE_NAV_DOWN_INPUT))
Movement_Exception = FALSE
SWITCH AppCursorIndex
CASE 0
IF Has_this_AppSlot_Been_Assigned[3]
AppCursorIndex = 3
ENDIF
BREAK
CASE 1
IF Has_this_AppSlot_Been_Assigned[4]
AppCursorIndex = 4
ENDIF
BREAK
CASE 2
IF Has_this_AppSlot_Been_Assigned[5]
AppCursorIndex = 5
ENDIF
BREAK
CASE 3
IF Has_this_AppSlot_Been_Assigned[6]
AppCursorIndex = 6
ENDIF
BREAK
CASE 4
IF Has_this_AppSlot_Been_Assigned[7]
AppCursorIndex = 7
ELSE
Movement_Exception = TRUE
AppCursorIndex = 1
ENDIF
BREAK
CASE 5
IF Has_this_AppSlot_Been_Assigned[8]
AppCursorIndex = 8
ELSE
Movement_Exception = TRUE
AppCursorIndex = 2
ENDIF
BREAK
CASE 6
IF Has_this_AppSlot_Been_Assigned[0]
AppCursorIndex = 0
ELSE
Movement_Exception = TRUE
AppCursorIndex = 3
ENDIF
BREAK
CASE 7
IF Has_this_AppSlot_Been_Assigned[1]
AppCursorIndex = 1
ENDIF
BREAK
CASE 8
IF Has_this_AppSlot_Been_Assigned[2]
AppCursorIndex = 2
ENDIF
BREAK
ENDSWITCH
IF Movement_Exception = TRUE
Call_Scaleform_Input_Keypress_Up()
ELSE
Call_Scaleform_Input_Keypress_Down()
ENDIF
dpad_pause_cued = TRUE
SETTIMERA (0)
ENDIF
ENDIF
//#2595711 - Signal MP to display help text explaining the Boss Agency App.
IF g_AppList[ENUM_TO_INT (AppDummyApp0)].SF_IconEnum = 57//Boss Agency App is positioned in the DummyApp position, we know this because the Boss Agency icon int is unique.
IF dpad_pause_cued = TRUE
AND AppCursorIndex = 8 //Cursor has just been positioned over the bottom right icon of the homescreen
IF b_ShouldDisplayBossAgencyHelp = FALSE //Make sure we only signal this once per phone launch. James A. say I don't need to worry about setting the bit each time the phone launches.
#if IS_DEBUG_BUILD
cdPrintnl()
cdPrintstring("#2595711 Cellphone_flashhand signalling net_gang_boss_common Boss Agency help bit")
cdPrintnl()
#endif
b_ShouldDisplayBossAgencyHelp = TRUE
GB_SET_LOCAL_HELP_BIT(eGB_LOCAL_HELP_BITSET_NOTIFICATION_BOSS_AGENCY_APP)
ENDIF
ENDIF
ENDIF
ENDPROC
PROC Check_for_Dual_Homescreen_Navigation() //maybe pass in screen type enum e.g contacts / omni-directional type so that nav types can be handled e.g Contacts will only move up / down
// Homescreen
// 0 1 2
//___________
// 3 4 5
//___________
// 6 7 8
IF dpad_pause_cued
IF TIMERA() > 50
dpad_pause_cued = FALSE
ENDIF
ENDIF
IF dpad_pause_cued = FALSE
IF Is_Phone_Control_Just_Pressed (FRONTEND_CONTROL, INT_TO_ENUM (CONTROL_ACTION, PHONE_NAV_RIGHT_INPUT))
IF g_Homescreen_In_Secondary_Mode
//Only supporting first line so far...
IF Has_this_AppSlot_Been_Assigned[(appCursorIndex + 1)] = TRUE //If there is app in the next slot and we are at position 1 or 2 on the second screen
AND AppCursorIndex < 2 //then we can move right.
AppCursorIndex ++
Call_Scaleform_Input_Keypress_Right()
dpad_pause_cued = TRUE
SETTIMERA (0)
ELSE
//We were already at the furthest right available app, wrap round to position 0 on the first screen.
Move_to_First_Screen(0)
ENDIF
ELSE
IF g_savedGlobals.sCellphoneSettingsData.b_IsTrackifyAppAvailable
OR g_savedGlobals.sCellphoneSettingsData.b_IsSniperAppAvailable
SWITCH AppCursorIndex
CASE 2
Move_to_Second_Screen(0)
BREAK
CASE 5
Move_to_Second_Screen(0)
BREAK
CASE 8
Move_to_Second_Screen(0)
BREAK
DEFAULT
AppCursorIndex ++
Call_Scaleform_Input_Keypress_Right()
dpad_pause_cued = TRUE
SETTIMERA (0)
BREAK
ENDSWITCH
ELSE
SWITCH AppCursorIndex
CASE 2
AppCursorIndex = 0
BREAK
CASE 5
AppCursorIndex = 3
BREAK
CASE 7
//Cater for missing bottom right hand corner app carousel scrolling...
IF Has_this_AppSlot_Been_Assigned[(appCursorIndex + 1)] = TRUE
AppCursorIndex = 8
ELSE
AppCursorIndex = 6
ENDIF
BREAK
CASE 8
AppCursorIndex = 6
BREAK
DEFAULT
AppCursorIndex ++
BREAK
ENDSWITCH
Call_Scaleform_Input_Keypress_Right()
dpad_pause_cued = TRUE
SETTIMERA (0)
ENDIF
ENDIF
ENDIF
IF Is_Phone_Control_Just_Pressed (FRONTEND_CONTROL, INT_TO_ENUM (CONTROL_ACTION, PHONE_NAV_LEFT_INPUT))
IF g_Homescreen_In_Secondary_Mode
//Only supporting first line so far...
IF appCursorIndex > 0
AppCursorIndex --
Call_Scaleform_Input_Keypress_Left()
ELSE
Move_to_First_Screen(2)
ENDIF
ELSE
IF g_savedGlobals.sCellphoneSettingsData.b_IsTrackifyAppAvailable
OR g_savedGlobals.sCellphoneSettingsData.b_IsSniperAppAvailable
SWITCH AppCursorIndex
CASE 0
Perform_LeftmostFirst_to_RightmostSecond_Wrap(appCursorIndex)
BREAK
CASE 3
Perform_LeftmostFirst_to_RightmostSecond_Wrap(appCursorIndex)
BREAK
CASE 6
Perform_LeftmostFirst_to_RightmostSecond_Wrap(appCursorIndex)
BREAK
DEFAULT
AppCursorIndex --
Call_Scaleform_Input_Keypress_Left()
dpad_pause_cued = TRUE
SETTIMERA (0)
BREAK
ENDSWITCH
ELSE
SWITCH AppCursorIndex
CASE 0
AppCursorIndex = 2
BREAK
CASE 3
AppCursorIndex = 5
BREAK
CASE 6
AppCursorIndex = 8
BREAK
DEFAULT
AppCursorIndex --
BREAK
ENDSWITCH
Call_Scaleform_Input_Keypress_Left()
dpad_pause_cued = TRUE
SETTIMERA (0)
ENDIF
ENDIF
ENDIF
IF Is_Phone_Control_Just_Pressed (FRONTEND_CONTROL, INT_TO_ENUM (CONTROL_ACTION, PHONE_NAV_UP_INPUT))
SWITCH AppCursorIndex
CASE 0
IF Has_this_AppSlot_Been_Assigned[6]
AppCursorIndex = 6
ENDIF
BREAK
CASE 1
IF Has_this_AppSlot_Been_Assigned[7]
AppCursorIndex = 7
ENDIF
BREAK
CASE 2
IF Has_this_AppSlot_Been_Assigned[8]
AppCursorIndex = 8
ENDIF
BREAK
CASE 3
IF Has_this_AppSlot_Been_Assigned[0]
AppCursorIndex = 0
ENDIF
BREAK
CASE 4
IF Has_this_AppSlot_Been_Assigned[1]
AppCursorIndex = 1
ENDIF
BREAK
CASE 5
IF Has_this_AppSlot_Been_Assigned[2]
AppCursorIndex = 2
ENDIF
BREAK
CASE 6
IF Has_this_AppSlot_Been_Assigned[3]
AppCursorIndex = 3
ENDIF
BREAK
CASE 7
IF Has_this_AppSlot_Been_Assigned[4]
AppCursorIndex = 4
ENDIF
BREAK
CASE 8
IF Has_this_AppSlot_Been_Assigned[5]
AppCursorIndex = 5
ENDIF
BREAK
ENDSWITCH
//Keypress Up
Call_Scaleform_Input_Keypress_Up()
dpad_pause_cued = TRUE
SETTIMERA (0)
ENDIF
IF Is_Phone_Control_Just_Pressed (FRONTEND_CONTROL, INT_TO_ENUM (CONTROL_ACTION, PHONE_NAV_DOWN_INPUT))
SWITCH AppCursorIndex
CASE 0
IF Has_this_AppSlot_Been_Assigned[3]
AppCursorIndex = 3
ENDIF
BREAK
CASE 1
IF Has_this_AppSlot_Been_Assigned[4]
AppCursorIndex = 4
ENDIF
BREAK
CASE 2
IF Has_this_AppSlot_Been_Assigned[5]
AppCursorIndex = 5
ENDIF
BREAK
CASE 3
IF Has_this_AppSlot_Been_Assigned[6]
AppCursorIndex = 6
ENDIF
BREAK
CASE 4
IF Has_this_AppSlot_Been_Assigned[7]
AppCursorIndex = 7
ENDIF
BREAK
CASE 5
IF Has_this_AppSlot_Been_Assigned[8]
AppCursorIndex = 8
ENDIF
BREAK
CASE 6
IF Has_this_AppSlot_Been_Assigned[0]
AppCursorIndex = 0
ENDIF
BREAK
CASE 7
IF Has_this_AppSlot_Been_Assigned[1]
AppCursorIndex = 1
ENDIF
BREAK
CASE 8
IF Has_this_AppSlot_Been_Assigned[2]
AppCursorIndex = 2
ENDIF
BREAK
ENDSWITCH
//Keypress Down
Call_Scaleform_Input_Keypress_Down()
dpad_pause_cued = TRUE
SETTIMERA (0)
ENDIF
ENDIF
ENDPROC
PROC Check_for_MP_Singlescreen_Navigation()
// Homescreen E = Empty
// 0 1 2
//___________
// 3 4 5
//___________
// 6 E E
// KGM 8/2/13: Updated checks to use Has_this_AppSlot_Been_Assigned() so that it doesn't need modified no matter where the gaps are on a single-screen multipalyer homepage
// Removed RaceToPoint app from slot 0, moved Settings app from Slot 7 to Slot 0
IF dpad_pause_cued
IF TIMERA() > 50
dpad_pause_cued = FALSE
ENDIF
ENDIF
IF dpad_pause_cued = FALSE
IF Is_Phone_Control_Just_Pressed (FRONTEND_CONTROL, INT_TO_ENUM (CONTROL_ACTION, PHONE_NAV_RIGHT_INPUT))
//Keith - this sort of function is available if you need it...
//Has_this_AppSlot_Been_Assigned[(appCursorIndex + 1)] = FALSE
SWITCH AppCursorIndex
CASE 0
IF Has_this_AppSlot_Been_Assigned[1]
AppCursorIndex = 1
ELIF Has_this_AppSlot_Been_Assigned[2]
AppCursorIndex = 2 // Gap at 1 but App in 2
ENDIF
BREAK
CASE 1
IF Has_this_AppSlot_Been_Assigned[2]
AppCursorIndex = 2
ENDIF
BREAK
CASE 2
IF Has_this_AppSlot_Been_Assigned[0]
AppCursorIndex = 0 // Single screen wrap
ENDIF
BREAK
CASE 3
IF Has_this_AppSlot_Been_Assigned[4]
AppCursorIndex = 4
ELIF Has_this_AppSlot_Been_Assigned[5]
AppCursorIndex = 5 // Gap at 4 but App in 5
ENDIF
BREAK
CASE 4
IF Has_this_AppSlot_Been_Assigned[5]
AppCursorIndex = 5
ENDIF
BREAK
CASE 5
IF Has_this_AppSlot_Been_Assigned[3]
AppCursorIndex = 3 // Single screen wrap
ENDIF
BREAK
CASE 6
IF Has_this_AppSlot_Been_Assigned[7]
AppCursorIndex = 7
ELIF Has_this_AppSlot_Been_Assigned[8]
AppCursorIndex = 8 // Gap at 7 but App in 8
ENDIF
BREAK
CASE 7
IF Has_this_AppSlot_Been_Assigned[8]
AppCursorIndex = 8
ENDIF
BREAK
CASE 8
IF Has_this_AppSlot_Been_Assigned[6]
AppCursorIndex = 6 // Single screen wrap
ENDIF
BREAK
ENDSWITCH
Call_Scaleform_Input_Keypress_Right()
dpad_pause_cued = TRUE
SETTIMERA (0)
ENDIF
IF Is_Phone_Control_Just_Pressed (FRONTEND_CONTROL, INT_TO_ENUM (CONTROL_ACTION, PHONE_NAV_LEFT_INPUT))
//Keith - this sort of function is available if you need it...
//Has_this_AppSlot_Been_Assigned[(appCursorIndex + 1)] = FALSE
SWITCH AppCursorIndex
CASE 0
IF Has_this_AppSlot_Been_Assigned[2]
AppCursorIndex = 2 // Single screen wrap
ENDIF
BREAK
CASE 1
IF Has_this_AppSlot_Been_Assigned[0]
AppCursorIndex = 0
ENDIF
BREAK
CASE 2
IF Has_this_AppSlot_Been_Assigned[1]
AppCursorIndex = 1
ELIF Has_this_AppSlot_Been_Assigned[0]
AppCursorIndex = 0 // Gap at 1 but App in 0
ENDIF
BREAK
CASE 3
IF Has_this_AppSlot_Been_Assigned[5]
AppCursorIndex = 5 // Single screen wrap
ENDIF
BREAK
CASE 4
IF Has_this_AppSlot_Been_Assigned[3]
AppCursorIndex = 3
ENDIF
BREAK
CASE 5
IF Has_this_AppSlot_Been_Assigned[4]
AppCursorIndex = 4
ELIF Has_this_AppSlot_Been_Assigned[3]
AppCursorIndex = 3 // Gap at 4 but App in 3
ENDIF
BREAK
CASE 6
IF Has_this_AppSlot_Been_Assigned[8]
AppCursorIndex = 8 // Single screen wrap
ENDIF
BREAK
CASE 7
IF Has_this_AppSlot_Been_Assigned[6]
AppCursorIndex = 6
ENDIF
BREAK
CASE 8
IF Has_this_AppSlot_Been_Assigned[7]
AppCursorIndex = 7
ELIF Has_this_AppSlot_Been_Assigned[6]
AppCursorIndex = 6 // Gap at 7 but App in 6
ENDIF
BREAK
ENDSWITCH
Call_Scaleform_Input_Keypress_Left()
dpad_pause_cued = TRUE
SETTIMERA (0)
ENDIF
IF Is_Phone_Control_Just_Pressed (FRONTEND_CONTROL, INT_TO_ENUM (CONTROL_ACTION, PHONE_NAV_UP_INPUT))
SWITCH AppCursorIndex
CASE 0
IF Has_this_AppSlot_Been_Assigned[6]
AppCursorIndex = 6 // Single screen wrap
ENDIF
BREAK
CASE 1
IF Has_this_AppSlot_Been_Assigned[7]
AppCursorIndex = 7 // Single screen wrap
ENDIF
BREAK
CASE 2
IF Has_this_AppSlot_Been_Assigned[8]
AppCursorIndex = 8 // Single screen wrap
ENDIF
BREAK
CASE 3
IF Has_this_AppSlot_Been_Assigned[0]
AppCursorIndex = 0
ENDIF
BREAK
CASE 4
IF Has_this_AppSlot_Been_Assigned[1]
AppCursorIndex = 1
ENDIF
BREAK
CASE 5
IF Has_this_AppSlot_Been_Assigned[2]
AppCursorIndex = 2
ENDIF
BREAK
CASE 6
IF Has_this_AppSlot_Been_Assigned[3]
AppCursorIndex = 3
ELIF Has_this_AppSlot_Been_Assigned[0]
AppCursorIndex = 0 // Gap at 3 but App in 0
ENDIF
BREAK
CASE 7
IF Has_this_AppSlot_Been_Assigned[4]
AppCursorIndex = 4
ELIF Has_this_AppSlot_Been_Assigned[1]
AppCursorIndex = 1 // Gap at 4 but App in 1
ENDIF
BREAK
CASE 8
IF Has_this_AppSlot_Been_Assigned[5]
AppCursorIndex = 5
ELIF Has_this_AppSlot_Been_Assigned[2]
AppCursorIndex = 2 // Gap at 5 but App in 2
ENDIF
BREAK
ENDSWITCH
//Keypress Up
Call_Scaleform_Input_Keypress_Up()
dpad_pause_cued = TRUE
SETTIMERA (0)
ENDIF
IF Is_Phone_Control_Just_Pressed (FRONTEND_CONTROL, INT_TO_ENUM (CONTROL_ACTION, PHONE_NAV_DOWN_INPUT))
SWITCH AppCursorIndex
CASE 0
IF Has_this_AppSlot_Been_Assigned[3]
AppCursorIndex = 3
ELIF Has_this_AppSlot_Been_Assigned[6]
AppCursorIndex = 6 // Gap at 3 but App in 6
ENDIF
BREAK
CASE 1
IF Has_this_AppSlot_Been_Assigned[4]
AppCursorIndex = 4
ELIF Has_this_AppSlot_Been_Assigned[7]
AppCursorIndex = 7 // Gap at 4 but App in 7
ENDIF
BREAK
CASE 2
IF Has_this_AppSlot_Been_Assigned[5]
AppCursorIndex = 5
ELIF Has_this_AppSlot_Been_Assigned[8]
AppCursorIndex = 8 // Gap at 5 but App in 8
ENDIF
BREAK
CASE 3
IF Has_this_AppSlot_Been_Assigned[6]
AppCursorIndex = 6
ENDIF
BREAK
CASE 4
IF Has_this_AppSlot_Been_Assigned[7]
AppCursorIndex = 7
ENDIF
BREAK
CASE 5
IF Has_this_AppSlot_Been_Assigned[8]
AppCursorIndex = 8
ENDIF
BREAK
CASE 6
IF Has_this_AppSlot_Been_Assigned[0]
AppCursorIndex = 0 // Single screen wrap
ENDIF
BREAK
CASE 7
IF Has_this_AppSlot_Been_Assigned[1]
AppCursorIndex = 1 // Single screen wrap
ENDIF
BREAK
CASE 8
IF Has_this_AppSlot_Been_Assigned[2]
AppCursorIndex = 2 // Single screen wrap
ENDIF
BREAK
ENDSWITCH
//Keypress Down
Call_Scaleform_Input_Keypress_Down()
dpad_pause_cued = TRUE
SETTIMERA (0)
ENDIF
ENDIF
ENDPROC
PROC tempDraw_FlashSlot_Items()
INT drawIndex = 0
INT AppsToDraw = 0
SWITCH g_Cellphone.PhoneDS
CASE PDS_MINIMAL
drawItemX = minOriginX
drawItemY = minOriginY
AppsToDraw = 4 //We only want to draw the apps in the 0, 1, 2, 3 flashslot position whilst in minimum mode.
BREAK
CASE PDS_MAXIMUM
drawItemX = maxOriginX
drawItemY = maxOriginY
AppsToDraw = (ENUM_TO_INT(MAX_APPLICATIONS)) //We want to draw all the applications in every flashslot position in maximum mode.
BREAK
ENDSWITCH
//WHILE drawIndex < (ENUM_TO_INT(MAX_APPLICATIONS))
WHILE drawIndex < AppsToDraw
format_medium_ostext (255, 255, 255, 205) //Semi transparent white
IF AppCursorIndex = drawIndex
highlight_Item()
ENDIF
DISPLAY_TEXT (drawItemX, drawItemY, g_AppList[AppSlot[drawIndex]].AppName)
drawItemX = drawItemX + 0.065 //Draw the next app slightly along the x-axis
//cdPrintnl()
//cdPrintint(drawIndex)
//cdPrintnl()
drawIndex ++
//TEMP: Adjust drawing positions for every 5th app so it starts on new line and original x origin position
// 0 1 2 3
// 4 5 6 7
//AppSlot4, the 5th app in total, draws at the original x origin, but at a lower y. This is only applicablke
SWITCH drawIndex
CASE 4
drawItemX = maxOriginX
drawItemY = (maxOriginY + 0.05)
BREAK
CASE 8
drawItemX = maxOriginX
drawItemY = (maxOriginY + 0.1)
BREAK
ENDSWITCH
ENDWHILE
ENDPROC
#if IS_DEBUG_BUILD
PROC Draw_Select_Back_HelpText()
format_medium_ostext (0, 128, 255, 255) //Light blue //SELECT
//DISPLAY_TEXT ((g_SF_PhonePosX - 0.05), (g_SF_PhonePosY + 0.20), "CELL_205")
DISPLAY_TEXT ((g_SF_PhonePosX - 0.05), (g_SF_PhonePosY + 0.16), "CELL_205")
format_medium_ostext (255, 0, 0, 255) //Solid Red //BACK
//DISPLAY_TEXT ((g_SF_PhonePosX + 0.01), (g_SF_PhonePosY + 0.20), "CELL_206")
DISPLAY_TEXT ((g_SF_PhonePosX + 0.01), (g_SF_PhonePosY + 0.16), "CELL_206")
DISPLAY_TEXT_WITH_LITERAL_STRING (0.60, 0.30, "STRING", "Current phone rotation")
DISPLAY_TEXT_WITH_FLOAT (0.6, 0.35, "CELL_500", v_DebugRotation.X, 2)
DISPLAY_TEXT_WITH_FLOAT (0.6, 0.40, "CELL_501", v_DebugRotation.Y, 2)
DISPLAY_TEXT_WITH_FLOAT (0.6, 0.45, "CELL_502", v_DebugRotation.Z, 2)
DISPLAY_TEXT_WITH_FLOAT (0.3, 0.35, "CELL_280", v_DebugRotation.X, 2)
DISPLAY_TEXT_WITH_FLOAT (0.3, 0.40, "CELL_281", v_DebugRotation.Y, 2)
DISPLAY_TEXT_WITH_FLOAT (0.3, 0.45, "CELL_282", v_DebugRotation.Z, 2)
DISPLAY_TEXT_WITH_FLOAT (0.3, 0.50, "CELL_283", v_DebugRotation.Z, 2)
DISPLAY_TEXT_WITH_FLOAT (0.3, 0.65, "CELL_284", v_DebugRotation.Z, 2)
DISPLAY_TEXT_WITH_FLOAT (0.3, 0.70, "CELL_285", v_DebugRotation.Z, 2)
ENDPROC
PROC Draw_SideTask_Back_HelpText() //Used primarily for debug text message display.
format_medium_ostext (0, 128, 255, 255) //Light blue //Select
DISPLAY_TEXT (0.752, 0.390, "CELL_205")
format_medium_ostext (255, 0, 0, 255) //Solid Red //BACK
DISPLAY_TEXT (0.835, 0.390, "CELL_206")
ENDPROC
PROC Draw_Options_Back_HelpText() //Used primarily for debug text message display.
format_medium_ostext (0, 128, 255, 255) //Light blue //OPTIONS
//DISPLAY_TEXT (0.752, 0.390, "CELL_214")
DISPLAY_TEXT ((g_SF_PhonePosX - 0.05), (g_SF_PhonePosY + 0.16), "CELL_214")
format_medium_ostext (255, 0, 0, 255) //Solid Red //BACK
//DISPLAY_TEXT (0.835, 0.390, "CELL_206")
DISPLAY_TEXT ((g_SF_PhonePosX + 0.01), (g_SF_PhonePosY + 0.16), "CELL_206")
ENDPROC
PROC Draw_Answer_Reject_HelpText()
format_medium_ostext (0, 128, 255, 255) //Light blue //ANSWER
//DISPLAY_TEXT (0.81, 0.63, "CELL_203")
DISPLAY_TEXT ((g_SF_PhonePosX - 0.05), (g_SF_PhonePosY + 0.16), "CELL_203")
format_medium_ostext (255, 57, 57, 255) //Solid Red //REJECT
//DISPLAY_TEXT (0.88, 0.63, "CELL_204")
DISPLAY_TEXT ((g_SF_PhonePosX + 0.01), (g_SF_PhonePosY + 0.16), "CELL_204")
ENDPROC
PROC Draw_Yes_No_HelpText()
format_medium_ostext (0, 128, 255, 255) //Light blue //YES
//DISPLAY_TEXT (0.81, 0.63, "CELL_212")
DISPLAY_TEXT ((g_SF_PhonePosX - 0.05), (g_SF_PhonePosY + 0.16), "CELL_212")
format_medium_ostext (255, 57, 57, 255) //Solid Red //NO
//DISPLAY_TEXT (0.88, 0.63, "CELL_213")
DISPLAY_TEXT ((g_SF_PhonePosX + 0.01), (g_SF_PhonePosY + 0.16), "CELL_213")
ENDPROC
PROC Draw_Emergency_HelpText()
format_medium_ostext (0, 128, 255, 255) //Light blue //Police
//DISPLAY_TEXT (0.81, 0.585, "CELL_602")
DISPLAY_TEXT ((g_SF_PhonePosX - 0.05), (g_SF_PhonePosY + 0.1), "CELL_604")
format_medium_ostext (255, 57, 57, 255) //Solid Red //Fire
//DISPLAY_TEXT (0.81, 0.61, "CELL_603")
DISPLAY_TEXT ((g_SF_PhonePosX - 0.05), (g_SF_PhonePosY + 0.125), "CELL_603")
format_medium_ostext (0, 255, 57, 255) //Solid Green //Ambulance
//DISPLAY_TEXT (0.81, 0.635, "CELL_604")
DISPLAY_TEXT ((g_SF_PhonePosX - 0.05), (g_SF_PhonePosY + 0.150), "CELL_602")
ENDPROC
#endif
#if IS_DEBUG_BUILD
PROC tempDraw_Phone()
SWITCH g_Cellphone.PhoneDS
CASE PDS_MINIMAL
//tempDraw_FlashSlot_Items()
format_medium_ostext (255, 255, 255, 75) //Pale Alpha White
DISPLAY_TEXT (minOriginX, 0.60, g_sCharacterSheetAll[g_Cellphone.PhoneOwner].label) //Display owner name
//DRAW_RECT (0.86, 0.58, 0.27, 0.14, TempRectColR, TempRectColG, TempRectColB, 165)
format_medium_ostext (255, 255, 255, 125) //Alpha White
DISPLAY_TEXT_WITH_LITERAL_STRING (0.81, 0.60, "STRING", "Cellphone - Minmode")
Draw_Select_Back_HelpText()
BREAK
CASE PDS_MAXIMUM
//tempDraw_FlashSlot_Items()
Draw_Select_Back_HelpText() //This needs to be here. Seems to be some temporary scaleform bug that makes text appear monochrome after a
//certain number of display_text calls
BREAK
CASE PDS_ONGOING_CALL
//Scaleform transition
//DRAW_RECT (0.87, 0.57, 0.14, 0.175, TempRectColR, TempRectColG, TempRectColB, 165)
IF g_IsConferenceCall = TRUE //if the call has been designated as a conference call, display the second name in conference on the calling screen.
format_medium_ostext (255, 255, 255, 255) //PS3 white
DISPLAY_TEXT (0.81, 0.55, g_sCharacterSheetAll[g_AdditionalContactInvolvedinCall].label)
ENDIF
IF g_InboundCallWaitAccRej = CALL_WAITING_TO_BE_ANSWERED
//format_medium_ostext (255, 255, 255, 255) //PS3 white
//DISPLAY_TEXT_WITH_LITERAL_STRING (0.81, 0.60, "STRING", "is calling...")
Draw_Answer_Reject_HelpText()
//Draw moving arrow to signify incoming call
//format_medium_ostext (255, 255, 255, 255) //PS3 white
//highlight_Item()
//DISPLAY_TEXT_WITH_LITERAL_STRING (drawRingerSignalMin, 0.57, "STRING", "o")
//drawRingerSignalMin = drawRingerSignalMin + 0.005
//IF drawRingerSignalMin > drawRingerSignalMax
//drawRingerSignalMin = drawRingerOrigin
//ENDIF
ELSE
IF g_ConversationStatus = CONV_STATE_PLAYING //only draw this screen if conversation is playing.
IF g_TellFlashHandToDisplayYN = FALSE
AND g_TellFlashHandToDisplayEmergencyServices = FALSE
format_medium_ostext (0, 255, 100, 255) //Light green //"CONNECTED"
DISPLAY_TEXT ((g_SF_PhonePosX - 0.05), (g_SF_PhonePosY + 0.08), "CELL_219")
format_medium_ostext (255, 57, 57, 255) //Solid Red //"END CALL"
DISPLAY_TEXT ((g_SF_PhonePosX + 0.01), (g_SF_PhonePosY + 0.16), "CELL_202")
ELSE
IF g_TellFlashHandToDisplayYN = TRUE //Display yes / no help text - stipulated by dialogue handler.sc
Draw_Yes_No_HelpText()
format_medium_ostext (255, 255, 255, 255) //white
//DISPLAY_TEXT (0.81, 0.60, g_QuestionGodLabel) //display got text prompt label that the user has passed in via dialogue public.sch
DISPLAY_TEXT ((g_SF_PhonePosX - 0.07), (g_SF_PhonePosY + 0.070), g_QuestionGodLabel)
ENDIF
IF g_TellFlashHandToDisplayEmergencyServices = TRUE //Display yes / no help text - stipulated by dialogue handler.sc
Draw_Emergency_HelpText()
format_medium_ostext (255, 255, 255, 255) //white
//DISPLAY_TEXT (0.81, 0.56, g_QuestionGodLabel) //display got text prompt label that the user has passed in via dialogue public.sch
DISPLAY_TEXT ((g_SF_PhonePosX - 0.07), (g_SF_PhonePosY + 0.070), g_QuestionGodLabel)
//WIPBmark
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
CASE PDS_ATTEMPTING_TO_CALL_CONTACT
//the other parts of this screen are drawn in appContacts.sc - might move here if it makes more sense.
format_medium_ostext (255, 57, 57, 255) //Solid Red //"END CALL"
DISPLAY_TEXT ((g_SF_PhonePosX + 0.01), (g_SF_PhonePosY + 0.16), "CELL_202")
BREAK
CASE PDS_RUNNINGAPP
IF GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH ("appTextMessage")) > 0 //if text message app is running then we want to display "Options and back" help text.
IF g_DoOptionsForSingleMessage = FALSE
//If a single message is selected, let appTextMessage handle the individual options for this. We need to grey out parts depending on lock status so it's better handled in the app itself.
//Display options for full display list.
Draw_Options_Back_HelpText()
ENDIF
ELSE
IF GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("appSideTask")) > 0
Draw_SideTask_Back_HelpText()
ELSE
Draw_Select_Back_HelpText()
ENDIF
ENDIF
BREAK
DEFAULT
//Do nothing as yet...
BREAK
ENDSWITCH
ENDPROC
#endif
//Manipulate the 3d phone's screen position and rotation a little to emulate a vibration effect when an incoming call or text is received.
PROC Vibrate_and_Ring_3dPhone()
#if IS_DEBUG_BUILD
//cdPrintstring ("3d phone is ringing and vibrating...")
//cdPrintnl ()
#endif
SET_INPUT_EXCLUSIVE(PLAYER_CONTROL, (INT_TO_ENUM(CONTROL_ACTION, PHONE_POSITIVE_INPUT))) //3176604
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_ATTACK2)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_ATTACK)
// B*2205053
IF IS_USING_KEYBOARD_AND_MOUSE(FRONTEND_CONTROL)
SET_INPUT_EXCLUSIVE(PLAYER_CONTROL, (INT_TO_ENUM(CONTROL_ACTION, PHONE_POSITIVE_INPUT)))
SET_INPUT_EXCLUSIVE(PLAYER_CONTROL, (INT_TO_ENUM(CONTROL_ACTION, PHONE_NEGATIVE_INPUT)))
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_ATTACK)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_ATTACK2)
ENDIF
IF g_bInMultiplayer
g_savedGlobals.sCellphoneSettingsData.This_Cellphone_Owner_Settings[CHAR_MULTIPLAYER].VibrateForThisPlayer = GET_MP_INT_CHARACTER_STAT(MP_STAT_FM_CELLPHONE_VIBRATE)
ENDIF
IF IS_PC_VERSION()
IF DECOR_EXIST_ON(PLAYER_PED_ID(), "Synched")
#if IS_DEBUG_BUILD
cdPrintstring ("Cellphone_FH. Decorator presence detected. Not vibrating phone...")
cdPrintnl ()
#endif
ELSE
IF GET_GAME_TIMER() - i_VibrationTimer >= 300 OR i_VibrationTimer = 0 OR i_VibrationTimer > GET_GAME_TIMER()
SET_CONTROL_SHAKE(PLAYER_CONTROL, 100, 100)
i_VibrationTimer = GET_GAME_TIMER()
ENDIF
ENDIF
ELSE
IF g_savedGlobals.sCellphoneSettingsData.This_Cellphone_Owner_Settings[g_Cellphone.PhoneOwner].VibrateForThisPlayer = 1 //Vibrate is set to ON.
#IF IS_DEBUG_BUILD
AND NOT GET_COMMANDLINE_PARAM_EXISTS("nocellvibrate")
#ENDIF
IF GET_GAME_TIMER() - i_VibrationTimer >= 300 OR i_VibrationTimer = 0 OR i_VibrationTimer > GET_GAME_TIMER()
SET_CONTROL_SHAKE(PLAYER_CONTROL, 100, 100)
i_VibrationTimer = GET_GAME_TIMER()
ENDIF
ENDIF
ENDIF
//IF NOT ARE_STRINGS_EQUAL (This_Cellphone_Owner_Settings_ListContents[1].g_SettingList[ENUM_TO_INT(SETTING_RINGTONE)].Setting_Secondary_Option_labels[g_savedGlobals.sCellphoneSettingsData.This_Cellphone_Owner_Settings[g_Cellphone.PhoneOwner].RingtoneForThisPlayer], "CELL_813")
// IF IS_BIT_SET (BitSet_CellphoneDisplay_Continued, g_BSC_PLAY_INTERFERENCE_AUDIO)
//
// CLEAR_BIT (BitSet_CellphoneDisplay_Continued, g_BSC_PLAY_INTERFERENCE_AUDIO)
//
// PLAY_AUDIO_EVENT("MOBILE_PRERING")
//
// Interference_Start_Time = GET_GAME_TIMER()
//
//
// ELSE
//
// Interference_Current_Time = GET_GAME_TIMER()
//
// IF Interference_Current_Time - Interference_Start_Time > 2000
IF NOT IS_ENTITY_DEAD (PLAYER_PED_ID())
//IF HAS_SOUND_FINISHED (g_Phone_Ringtone_SoundID) //#1392094 swap
IF NOT IS_PED_RINGTONE_PLAYING (PLAYER_PED_ID()) //#1392094 swap
IF g_bInMultiplayer
IF NOT ARE_STRINGS_EQUAL (This_Cellphone_Owner_Settings_ListContents[CHAR_MULTIPLAYER].g_SettingList[ENUM_TO_INT(SETTING_RINGTONE)].Setting_Secondary_Option_filename_label[GET_MP_INT_CHARACTER_STAT (MP_STAT_FM_CELLPHONE_RINGTONE)], "Silent Ringtone Dummy")
//#1392094 swap
//PLAY_SOUND_FROM_ENTITY (g_Phone_Ringtone_SoundID, This_Cellphone_Owner_Settings_ListContents[CHAR_MULTIPLAYER].g_SettingList[ENUM_TO_INT(SETTING_RINGTONE)].Setting_Secondary_Option_filename_label[GET_MP_INT_CHARACTER_STAT (MP_STAT_FM_CELLPHONE_RINGTONE)], PLAYER_PED_ID())
///#1392094 swap
PLAY_PED_RINGTONE (This_Cellphone_Owner_Settings_ListContents[CHAR_MULTIPLAYER].g_SettingList[ENUM_TO_INT(SETTING_RINGTONE)].Setting_Secondary_Option_filename_label[GET_MP_INT_CHARACTER_STAT (MP_STAT_FM_CELLPHONE_RINGTONE)], PLAYER_PED_ID(), TRUE)
ENDIF
ELSE
//If the ringtone has been set to "Silent" don't play anything. It just uses a dummy filename.
IF NOT ARE_STRINGS_EQUAL (g_savedGlobals.sCellphoneSettingsData.This_Cellphone_Owner_Settings[g_Cellphone.PhoneOwner].RingtoneForThisPlayer, "Silent Ringtone Dummy")
//Likewise, don't play if we are in "quiet mode".
IF NOT (This_Cellphone_Owner_Settings_ListContents[g_Cellphone.PhoneOwner].g_SettingList[ENUM_TO_INT(SETTING_PROFILE)].Setting_Currently_Selected_Option = ENUM_TO_INT(PROFILE_QUIET_MODE))
//#1392094 swap
//PLAY_SOUND_FROM_ENTITY (g_Phone_Ringtone_SoundID, g_savedGlobals.sCellphoneSettingsData.This_Cellphone_Owner_Settings[g_Cellphone.PhoneOwner].RingtoneForThisPlayer, PLAYER_PED_ID())
#if IS_DEBUG_BUILD
cdPrintnl()
cdPrintnl()
cdPrintstring("CELLPHONE_FH Cued SP RINGTONE...")
cdPrintnl()
cdPrintnl()
#endif
IF IS_PC_VERSION()
IF DECOR_EXIST_ON(PLAYER_PED_ID(), "Synched")
#if IS_DEBUG_BUILD
cdPrintnl()
cdPrintstring ("Cellphone_FH. Decorator presence detected. Cancelling player phone ringtone...")
cdPrintnl()
#endif
ELSE
PLAY_PED_RINGTONE (g_savedGlobals.sCellphoneSettingsData.This_Cellphone_Owner_Settings[g_Cellphone.PhoneOwner].RingtoneForThisPlayer, PLAYER_PED_ID(), TRUE)
ENDIF
ELSE
//#1392094 swap
PLAY_PED_RINGTONE (g_savedGlobals.sCellphoneSettingsData.This_Cellphone_Owner_Settings[g_Cellphone.PhoneOwner].RingtoneForThisPlayer, PLAYER_PED_ID(), TRUE)
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
//ENDIF
//ENDIF
//ENDIF
ENDPROC
PROC MovetoFirstPersonVanishPhone()
IF g_Phone_Blocked_While_Moving_Down = FALSE
AND g_3DPhoneNeedsMovedUp = FALSE
IF MovePhoneToDestination(g_This_Screen_3dPhoneEndVec[g_Chosen_Ratio], g_This_Screen_3dPhoneStartVec[g_Chosen_Ratio], g_3dPhoneStartRotVec, g_3dPhoneStartRotVec, 350.0, FALSE) >= 1.0
s_iTimeStampStart = 0
g_FirstPersonTransitionOngoing = FALSE
#if IS_DEBUG_BUILD
cdPrintstring ("CELLPHONE_FH - Move to first person vanish concluded.")
cdPrintnl()
#endif
ENDIF
ENDIF
ENDPROC
PROC CallInProgressVanishPhone()
IF g_Phone_Blocked_While_Moving_Down = FALSE
#if IS_DEBUG_BUILD
cdPrintstring ("CELLPHONE_FH - Testing vanish routine")
cdPrintnl()
#endif
IF MovePhoneToDestination(g_This_Screen_3dPhoneEndVec[g_Chosen_Ratio], g_This_Screen_3dPhoneStartVec[g_Chosen_Ratio], g_3dPhoneStartRotVec, g_3dPhoneStartRotVec, 350.0, FALSE) >= 1.0
s_iTimeStampStart = 0
//Set appropriate bits when finished vanish routine...
CLEAR_BIT (BitSet_CellphoneDisplay_Continued, g_BSC_CALL_IN_PROGRESS_VANISH_PHONE)
SET_BIT (BitSet_CellphoneDisplay_Continued, g_BSC_CALL_IN_PROGRESS_PHONE_FULLY_VANISHED)
#if IS_DEBUG_BUILD
cdPrintstring ("CELLPHONE_FH - Cellphone has entered STANDARD DEF fully vanished state during call.")
cdPrintnl()
#endif
ENDIF
ENDIF
ENDPROC
PROC CallInProgressReinstatePhone()
IF g_Phone_Blocked_While_Moving_Down = FALSE
IF MovePhoneToDestination(g_This_Screen_3dPhoneStartVec[g_Chosen_Ratio], g_This_Screen_3dPhoneEndVec[g_Chosen_Ratio], g_3dPhoneStartRotVec, g_3dPhoneStartRotVec, 350.0, TRUE) >= 1.0
s_iTimeStampStart = 0
//Clear bit when finished...
CLEAR_BIT (BitSet_CellphoneDisplay_Continued, g_BSC_CALL_IN_PROGRESS_REINSTATE_PHONE)
#if IS_DEBUG_BUILD
cdPrintstring ("CELLPHONE_FH - Cellphone has entered fully reinstated state during call.")
cdPrintnl()
#endif
IF g_IsThisAnMPChatCall
CLEAR_BIT (BitSet_CellphoneDisplay_Continued, g_BSC_CALL_IN_PROGRESS_PHONE_ALREADY_SIGNALLED_TO_VANISH_BY_DH) //As this is a chat call, clear this so we can go hands free multiple time in one call...
#if IS_DEBUG_BUILD
cdPrintnl()
cdPrintstring ("CELLPHONE_FH - This was a Chat Call Hands Free reinstatement - resetting critical ALREADY VANISHED bit for reuse.")
cdPrintnl()
#endif
ENDIF
ENDIF
ENDIF
ENDPROC
//After the phone is finished with for whatever reason, this proc will move it back to its position below the screen,
//then destroy the phone model and terminate this script.
PROC Move3dPhoneDownScreen_Then_Terminate()
CellphoneAppAutoLaunchType = ACT_APP_NONE
g_ShouldForceSelectionOfLatestAppItem = FALSE
SET_INPUT_EXCLUSIVE (PLAYER_CONTROL, (INT_TO_ENUM (CONTROL_ACTION, PHONE_NEGATIVE_INPUT))) //See bug 605548
//Hide hud elements that appear in bottom right corner.
HIDE_HUD_COMPONENT_THIS_FRAME (NEW_HUD_VEHICLE_NAME)
HIDE_HUD_COMPONENT_THIS_FRAME (NEW_HUD_AREA_NAME)
HIDE_HUD_COMPONENT_THIS_FRAME (NEW_HUD_DISTRICT_NAME)
HIDE_HUD_COMPONENT_THIS_FRAME (NEW_HUD_STREET_NAME)
IF g_Phone_Blocked_While_Moving_Down = FALSE
SET_MOBILE_PHONE_SCALE(500.0)
IF ShouldFirstPersonPhoneHudMovementBeHidden()
s_iTimeStampStart = GET_GAME_TIMER() //1983208
ELSE
s_iTimeStampStart = 0 //Don't need to slow the removal process down in 3rd person.
ENDIF
SCRIPT_IS_MOVING_MOBILE_PHONE_OFFSCREEN (TRUE)
g_Phone_Blocked_While_Moving_Down = TRUE
#if IS_DEBUG_BUILD
cdPrintnl()
cdPrintstring("CELLPHONE_FH - Setting IS_MOVING_MOBILE_PHONE_OFFSCREEN to true.")
cdPrintnl()
#endif
ENDIF
//IF NOT (HAS_SOUND_FINISHED (g_Phone_Ringtone_SoundID)) //#1392094 swap
IF NOT IS_ENTITY_DEAD (PLAYER_PED_ID())
IF IS_PED_RINGTONE_PLAYING (PLAYER_PED_ID())
//STOP_SOUND (g_Phone_Ringtone_SoundID) ////#1392094 swap
STOP_PED_RINGTONE (PLAYER_PED_ID())
ENDIF
ENDIF
//Deliberately not using an ELSE here...
IF IS_ENTITY_DEAD(PLAYER_PED_ID())
IF IS_PED_RINGTONE_PLAYING (PLAYER_PED_ID())
//STOP_SOUND (g_Phone_Ringtone_SoundID) ////#1392094 swap
STOP_PED_RINGTONE (PLAYER_PED_ID())
ENDIF
ENDIF
IF g_savedGlobals.sCellphoneSettingsData.b_HasSleepReminderBeenDisplayed = TRUE
g_savedGlobals.sCellphoneSettingsData.b_HasSleepReminderBeenDisplayed = FALSE
CLEAR_FLOATING_HELP (FLOATING_HELP_TEXT_ID_1)
ENDIF
FLOAT fRate = 350.0
IF IS_BIT_SET (BitSet_CellphoneDisplay, g_BS_MOVE_PHONE_DOWN_INSTANTLY)
OR IS_BIT_SET (BitSet_CellphoneDisplay_Third, g_BSTHIRD_DO_NOT_MOVE_PHONE_UP_ON_LAUNCH) //Added to fix url:bugstar:1866104
//fRate = 100.0
fRate = 25.0 //See bug 1796856, Alan requested this moved off screen quicker.
ENDIF
VECTOR endVec = g_3dPhoneStartRotVec
// Pocket Work
IF g_B_ForcedAway = TRUE
endVec = <<-45,45,25>>
ENDIF
IF IS_BIT_SET (BitSet_CellphoneDisplay_Continued, g_BSC_CALL_IN_PROGRESS_PHONE_FULLY_VANISHED) //Fixes issue with phone popping up then disappearing when a call concludes whilst the phone was already vanished but not destroyed.
OR IS_BIT_SET (BitSet_CellphoneDisplay, g_BS_MOVE_PHONE_DOWN_INSTANTLY) //2217483
OR IS_BIT_SET (BitSet_CellphoneDisplay_Third, g_BSTHIRD_DO_NOT_MOVE_PHONE_UP_ON_LAUNCH) //Added to fix url:bugstar:1866104
AwayVec = g_This_Screen_3dPhoneStartVec[g_Chosen_Ratio]
ELSE
AwayVec = g_This_Screen_3dPhoneEndVec[g_Chosen_Ratio]
ENDIF
FLOAT fComplete = MovePhoneToDestination(AwayVec, g_This_Screen_3dPhoneStartVec[g_Chosen_Ratio], g_3dPhoneStartRotVec, endVec, fRate, FALSE)
IF NOT b_PhoneDestroyed AND fComplete >= 1.0
DESTROY_MOBILE_PHONE ()
b_PhoneDestroyed = TRUE
ENDIF
//For bug 353016, need to have longer delay in SP only for phone going to pocket, phone not created in hand in MP.
//Update: For bug 988612, I'm making both delays the same as a trial.
IF b_PhoneDestroyed AND GET_GAME_TIMER() - s_iTimeStampStart > 500 // give it some time after destroying the phone to fix 'pink phone' display
//g_DelayCinematicCamReinstatement = INITIALISE_DELAY //Tell cellphone controller that I want to keep disabling the "negative" button to stop cinematic cam popping in for example.
SET_INPUT_EXCLUSIVE (PLAYER_CONTROL, (INT_TO_ENUM (CONTROL_ACTION, PHONE_NEGATIVE_INPUT))) //See bug 605548
IF g_Cellphone.PhoneDS = PDS_AWAY
#if IS_DEBUG_BUILD
cdPrintstring ("CELLPHONE_FH - Cellphone has been set to AWAY state. 3d phone moved offscreen and terminating cellphone_fh.sc when done.")
cdPrintnl()
cdPrintnl()
#endif
ENDIF
//Deliberate no use of ELSE here. The phone should not get here if it's not in AWAY or DISABLED state. If this runs and no debug text shows then something is wrong.
IF g_Cellphone.PhoneDS = PDS_DISABLED
#if IS_DEBUG_BUILD
cdPrintstring ("CELLPHONE_FH - Cellphone has been set to DISABLED state. 3d phone moved offscreen and terminating cellphone_flashhand.sc when done.")
cdPrintnl()
cdPrintnl()
#endif
ENDIF
IF g_Cellphone.PhoneDS = PDS_DISABLED_THIS_FRAME_ONLY
#if IS_DEBUG_BUILD
cdPrintstring ("CELLPHONE_FH - Cellphone has been set to DISABLED_THIS_FRAME_ONLY state. 3d phone moved offscreen and terminating cellphone_flashhand.sc when done.")
cdPrintnl()
cdPrintnl()
#endif
ENDIF
SCRIPT_IS_MOVING_MOBILE_PHONE_OFFSCREEN (FALSE) //See bug 740666
#if IS_DEBUG_BUILD
cdPrintnl()
cdPrintstring("CELLPHONE_FH - Clearing IS_MOVING_MOBILE_PHONE_OFFSCREEN flag to false.")
cdPrintnl()
#endif
//Tidy up or initialise critical bools...
g_3DPhoneNeedsMovedDown = FALSE
g_B_Scaleform_Movies_Loaded = FALSE
g_Cellphone_Launched_by_Button_Press = FALSE
IF g_savedGlobals.sCellphoneSettingsData.b_HasSleepReminderBeenDisplayed = TRUE
g_savedGlobals.sCellphoneSettingsData.b_HasSleepReminderBeenDisplayed = FALSE
CLEAR_FLOATING_HELP (FLOATING_HELP_TEXT_ID_1)
ENDIF
g_Cellphone_FH_Needs_To_Exit = TRUE
//Get rid of the cellphone 3d model from below the screen.
//DESTROY_MOBILE_PHONE ()
IF NOT IS_ENTITY_DEAD (PLAYER_PED_ID())
STOP_PED_RINGTONE (PLAYER_PED_ID()) //#1392094 swap
ENDIF
//STOP_SOUND (g_Phone_Ringtone_SoundID) //#1392094 swap
//RELEASE_SOUND_ID (g_Phone_Ringtone_SoundID) //#1392094 swap
#if IS_DEBUG_BUILD
cdPrintnl()
cdPrintstring ("CELLPHONE_FH - 3d cellphone destroyed - cellphone flashhand.sc exiting.")
cdPrintnl()
#endif
//CRITICAL!
IF g_b_RadarWasAlreadyHidden = FALSE //Phone wasn't already hidden, safe to turn back on.
//Phone back on RHS, commented out but infrastucture left intact.
//DISPLAY_RADAR (TRUE) //switch on radar!
ENDIF
g_Phone_Active_but_Hidden = FALSE
//If the player is on a mission and has perhaps started it with the phone already on the settings list,
//make sure that SLEEP profile mode cannot persist by returning to normal mode when the phone is put away.
IF IS_CURRENTLY_ON_MISSION_TO_TYPE(MISSION_TYPE_STORY)
SET_CELLPHONE_PROFILE_TO_NORMAL() //from cellphone_public.sch
ENDIF
CLEAR_BIT (BitSet_CellphoneDisplay_Continued, g_BSC_CELLPHONE_THREEQUARTERS_UP)
CLEAR_BIT (BitSet_CellphoneDisplay, g_BS_HAS_CELLPHONE_FULLY_MOVED_UP)
CLEAR_BIT (BitSet_CellphoneDisplay, g_BS_SENDING_CELLPHONE_CAM_PIC)
CLEAR_BIT (BitSet_CellphoneDisplay, g_BS_PROMPT_FLASHHAND_TO_PLAY_REMOTE_RING)
CLEAR_BIT (BitSet_CellphoneDisplay, g_BS_MOVE_PHONE_DOWN_INSTANTLY)
CLEAR_BIT (BitSet_CellphoneDisplay_Continued, g_BSC_FINISHED_CALL_RETURNS_TO_HOMESCREEN)
CLEAR_BIT (BitSet_CellphoneDisplay_Continued, g_BSC_PREVENT_CALL_FOR_CHAR_DETONATEPHONE)
CLEAR_BIT (BitSet_CellphoneDisplay_Continued, g_BSC_PLAY_INTERFERENCE_AUDIO)
CLEAR_BIT (BitSet_CellphoneDisplay_Continued, g_BSC_CALL_IN_PROGRESS_VANISH_PHONE)
CLEAR_BIT (BitSet_CellphoneDisplay_Continued, g_BSC_CALL_IN_PROGRESS_REINSTATE_PHONE)
CLEAR_BIT (BitSet_CellphoneDisplay_Continued, g_BSC_CALL_IN_PROGRESS_PHONE_ALREADY_SIGNALLED_TO_VANISH_BY_DH)
CLEAR_BIT (BitSet_CellphoneDisplay_Continued, g_BSC_CALL_IN_PROGRESS_PHONE_FULLY_VANISHED)
CLEAR_BIT (BitSet_CellphoneDisplay_Third, g_BSTHIRD_DO_NOT_MOVE_PHONE_UP_ON_LAUNCH)
g_LaunchContactsFromTextMessage = FALSE
LaunchContactsFromTextMessage_LocalSignal = FALSE
//CLEAR_BIT (BitSet_CellphoneDisplay_Third, g_CELLPHONE_MOVIE_STREAMING_IN) //Comment in for resolution of 1135663
IF NOT IS_PLAYER_PLAYING(PLAYER_ID())
KillAllConversations () //Failsafe that will kill any active conversations after phone has been put away and player has died.
//The KillAll needs to be here to make sure any script timing does not effect conversation tidy up. A similar check takes place in dialogue handler
//to make sure, everything is cleaned up if the phone was not up at the time of death.
ENDIF
//Tidy up scaleform movies...
//This needs to be here to ensure timing issues. as seen in bug 110732, can be avoided. We don't mark the critical scaleform movies as no longer needed until
//certain that any applications have stopped processing. Applications must ensure they are using CHECK_FOR_ABNORMAL_EXIT or will fall foul here.
SETTIMERA(0)
IF GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(g_AppList[AppINTERNET].AppScriptNameHash) = 0
WHILE IS_THREAD_ACTIVE (Application_Thread)
WAIT (0)
SET_INPUT_EXCLUSIVE (PLAYER_CONTROL, (INT_TO_ENUM (CONTROL_ACTION, PHONE_NEGATIVE_INPUT))) //See bug 605548
#if IS_DEBUG_BUILD
cdPrintnl()
cdPrintstring ("CELLPHONE_FH - Waiting on the script that initiated application thread to terminate itself.")
cdPrintnl()
IF g_b_DisplayDrawingMovieDump
cdPrintstring ("CELLPHONE_FH - Drawing movie this frame whilst in waiting for application exit loop.")
cdPrintnl()
ENDIF
#endif
IF HAS_SCALEFORM_MOVIE_LOADED (SF_MovieIndex) //Trial addition for bug 988612. Conceivable an app was taking a while to exit and movie may not have been rendering.
SET_TEXT_RENDER_ID (PhoneRenderTarget_ID)
DRAW_SCALEFORM_MOVIE (SF_MovieIndex, g_SF_PhonePosX, g_SF_PhonePosY, g_SF_PhoneSizeX, g_SF_PhoneSizeY, 255, 255, 255, 255)
ENDIF
IF TIMERA() > 5000
#if IS_DEBUG_BUILD
PRINTNL()
PRINTSTRING ("CELLPHONE_FH - Looks like IS_SCALEFORM_MOVIE_METHOD_RETURN_VALUE_READY from another app is stuck. Terminating after five seconds timeout has elapsed.")
PRINTNL()
#endif
TERMINATE_THREAD (Application_Thread)
ENDIF
ENDWHILE
ENDIF
//All applications must have terminated, provided they were launched with LAUNCH_CELLPHONE_APPLICATION or had the correct "application_thread" specification.
#if IS_DEBUG_BUILD
cdPrintnl()
cdPrintnl()
cdPrintstring ("CELLPHONE_FH - Marking cellphone scaleform movies as no longer needed from cellphone_flashhand.sc")
cdPrintnl()
cdPrintnl()
#endif
g_b_ToggleButtonLabels = FALSE
IF HAS_SCALEFORM_MOVIE_LOADED (SF_MovieIndex) //This needs to be done here, in case the movie aborts. See bug 740117
//LEGACY_SCALEFORM_MOVIE_METHOD_WITH_NUMBER (SF_MovieIndex, "DISPLAY_VIEW", 0) //Flush out any streamed resources used by cellphone. See bug 535099. Instance 1.
LEGACY_SCALEFORM_MOVIE_METHOD (SF_MovieIndex, "SHUTDOWN_MOVIE")
ENDIF
WAIT (0)
SET_SCALEFORM_MOVIE_AS_NO_LONGER_NEEDED (SF_MovieIndex)
//SET_SCALEFORM_MOVIE_AS_NO_LONGER_NEEDED (SF_MovieButtonsIndex)
g_Phone_Blocked_While_Moving_Down = FALSE //Important this is done here so that calls are barred until the cellphone has fully cleared up.
SET_INPUT_EXCLUSIVE (PLAYER_CONTROL, (INT_TO_ENUM (CONTROL_ACTION, PHONE_NEGATIVE_INPUT))) //See bug 605548
IF IS_ENTITY_DEAD(PLAYER_PED_ID())
IF voiceSession.bInVoiceSession //#1635701
IF g_bInMultiplayer
PLAY_SOUND_FRONTEND (-1, "Hang_Up", "Phone_SoundSet_Michael")
ELSE
PLAY_SOUND_FRONTEND (-1, "Hang_Up", g_Owner_Soundset)
ENDIF
ENDIF
ENDIF
//Network is in voice session check before doing this? Maybe add bool
SCRIPT_END_A_VOICE_SESSION() //1617499 Make sure that a script hang up also terminates a chat call. Check incoming call stage?
CLEAR_VOICE_SESSION_STRUCT() //Fix for 1891329.
/* Potential avenue to explore: when this happens... don't end a voice session?
#if IS_DEBUG_BUILD
cdPrintnl()
cdPrintstring("STATE ASSIGNMENT 51. Cellphone_flashhand assigns PDS_AWAY")
cdPrintnl()
#endif
*/
g_IsThisAnMPChatCall = FALSE //This has been moved here for 2111525. It was required so that the hands free handler is definitely reset.
g_FirstPersonTransitionOngoing = FALSE
#if IS_DEBUG_BUILD
cdPrintString ("g_IsThisAnMPChatCall assigned to false from Cellphone_Flashhand 1... 2111525")
cdPrintnl()
cdPrintnl()
#endif
//Quit this script.
TERMINATE_THIS_THREAD()
ENDIF
ENDPROC //end of Move3dPhoneDownScreen_Then_Terminate() procedure.
PROC Draw_DisplayStatus()
#if IS_DEBUG_BUILD
IF g_DoDebugTempDraw_Phone = TRUE
tempDraw_Phone() // - Reinstate to draw temp button labels.
ENDIF
#endif
IF g_InboundCallWaitAccRej = CALL_WAITING_TO_BE_ANSWERED //A call is waiting to be answered, the phone display state is PDS_ONGOING_CALL, player must accept or reject call.
Vibrate_and_Ring_3dPhone()
IF g_InputButtonJustPressed = FALSE
IF Is_Phone_Control_Just_Pressed (FRONTEND_CONTROL, INT_TO_ENUM (CONTROL_ACTION, PHONE_NEGATIVE_INPUT)) //Negative action - user rejected incoming phone call.
IF IS_BIT_SET (BitSet_CellphoneDisplay_Continued, g_BSC_CELLPHONE_THREEQUARTERS_UP) //#Les Bug 719218
IF g_ForcePlayerAnswer = FALSE //only let the player reject a call if he is not being forced to answer...
Play_Back_Beep()
g_InputButtonJustPressed = TRUE
g_InboundCallWaitAccRej = CALL_REJECTED
g_LastCellphoneCallInterrupted = TRUE
IF NOT IS_ENTITY_DEAD (PLAYER_PED_ID())
//STOP_SOUND (g_Phone_Ringtone_SoundID) //#1392094 swap
STOP_PED_RINGTONE (PLAYER_PED_ID())
ENDIF
#if IS_DEBUG_BUILD
cdPrintstring ("CELLPHONE_FH - Incoming call rejected by user.")
cdPrintnl()
#endif
//Stop vibration and reset position to normal?
ELSE
#if IS_DEBUG_BUILD
cdPrintstring ("CELLPHONE_FH - Unable to reject call as it has been created with FORCE ANSWER")
cdPrintnl()
#endif
ENDIF
ENDIF
ENDIF
ENDIF
IF g_InputButtonJustPressed = FALSE
IF Is_Phone_Control_Just_Pressed (FRONTEND_CONTROL, INT_TO_ENUM (CONTROL_ACTION, PHONE_POSITIVE_INPUT)) //Positive action - user accepted incoming phone call.
#if IS_DEBUG_BUILD
OR g_bFlowAutoplayInProgress = TRUE
#endif
IF IS_BIT_SET (BitSet_CellphoneDisplay_Continued, g_BSC_CELLPHONE_THREEQUARTERS_UP) //# 1096865 / 1056009
Play_Select_Beep()
g_InputButtonJustPressed = TRUE
g_InboundCallWaitAccRej = CALL_ACCEPTED
IF NOT IS_ENTITY_DEAD (PLAYER_PED_ID())
//STOP_SOUND (g_Phone_Ringtone_SoundID) //#1392094 swap
STOP_PED_RINGTONE (PLAYER_PED_ID())
ENDIF
#if IS_DEBUG_BUILD
cdPrintnl()
cdPrintString ("CELLPHONE_FH - User has actively pressed pick up button to answer an incoming call.")
cdPrintnl()
cdPrintstring ("CELLPHONE_FH - SuppTextButtonCall 01")
cdPrintnl()
#endif
Set_SF_Buttons_SuppText_For_ConnectedCall()
TitleUpdate_Add_Hide_Phone_Soft_Key()
ENDIF
ENDIF
ENDIF
ELSE
IF b_RemoteRingOngoing = FALSE
IF IS_BIT_SET (BitSet_CellphoneDisplay, g_BS_PROMPT_FLASHHAND_TO_PLAY_REMOTE_RING)
b_RemoteRingOngoing = TRUE
SETTIMERB(0)
ENDIF
ELSE
IF g_Cellphone.PhoneDS > PDS_AWAY //Fix for 946359. Prevent sound looping if phone has been forced away.
IF TIMERB() > 1500 //Might need to make this value differentiate between a call from appContacts or a scripted cut type call.
IF NOT IS_ENTITY_DEAD (PLAYER_PED_ID())
//IF HAS_SOUND_FINISHED (g_Phone_Ringtone_SoundID) //#1392094 swap
IF NOT IS_PED_RINGTONE_PLAYING (PLAYER_PED_ID()) //#1392094 swap
IF g_Use_Prologue_Cellphone
//PLAY_SOUND_FRONTEND (g_Phone_Ringtone_SoundID, "Dial_and_Remote_Ring", g_Owner_Soundset) //#1392094 swap
PLAY_PED_RINGTONE ("Dial_and_Remote_Ring", PLAYER_PED_ID(), true) //#1392094 swap
ELSE
//PLAY_SOUND_FROM_ENTITY (g_Phone_Ringtone_SoundID, "Phone_Generic_Remote_Ring_01", PLAYER_PED_ID())
//PLAY_SOUND_FRONTEND (g_Phone_Ringtone_SoundID, "Remote_Ring", g_Owner_Soundset) //#1392094 swap
//1552162 - If Alwyn's switch call bit is set, do not play remote ring...
IF NOT IS_BIT_SET (BitSet_CellphoneDisplay_Third, g_BSTHIRD_PREVENT_PRELOADED_PHONECALL_START)
PLAY_PED_RINGTONE ("Remote_Ring", PLAYER_PED_ID(), true) //#1392094 swap
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF NOT IS_BIT_SET (BitSet_CellphoneDisplay, g_BS_PROMPT_FLASHHAND_TO_PLAY_REMOTE_RING)
b_RemoteRingOngoing = FALSE
IF NOT IS_ENTITY_DEAD (PLAYER_PED_ID())
//STOP_SOUND (g_Phone_Ringtone_SoundID) ////#1392094 swap
STOP_PED_RINGTONE (PLAYER_PED_ID())
ENDIF
ENDIF
ENDIF
IF g_InboundCallWaitAccRej = CALL_NONE_WAITING
//CRITICAL SECTION! This specifies what state the phone will revert to after "back" has been pressed.
//Either have a keypress delay or check for disabled and away states before accepting back input.
IF g_InputButtonJustPressed = FALSE
IF Is_Phone_Control_Just_Pressed (FRONTEND_CONTROL, INT_TO_ENUM (CONTROL_ACTION, PHONE_GO_BACK_INPUT))
OR g_LaunchContactsFromTextMessage = TRUE //1636892
IF IS_PLAYER_PLAYING (PLAYER_ID())
//Could be taken out on a trial basis for Conor's TV stuff...
IF IS_PLAYER_CONTROL_ON (PLAYER_ID())
IF IS_BIT_SET (BitSet_CellphoneDisplay_Continued, g_BSC_CELLPHONE_THREEQUARTERS_UP) //Les Bug 719218
//g_InputButtonJustPressed = TRUE Removed on a trial basis 24.11.10 - was affecting MPJobList "waiting for confirmation" stuff
//IS_BUTTON_JUST_PRESSED should take care of any weirdness.
//New measures to determine exact phone state when button was pressed. 1924417
#if IS_DEBUG_BUILD
cdPrintnl()
cdPrintstring("CELLPHONE_FH - Cellphone flashhand reports that the back button has been pressed... Phone State is ")
cdPrintInt(ENUM_TO_INT(g_Cellphone.PhoneDS))
cdPrintstring(" and Conv State is ")
cdPrintint(ENUM_TO_INT(g_ConversationStatus))
cdPrintnl()
IF g_IsThisAnMPChatCall
cdPrintstring("CELLPHONE_FH g_IsThisAnMPChatCall is TRUE on back button press.")
ELSE
cdPrintstring("CELLPHONE_FH g_IsThisAnMPChatCall is FALSE on back button press.")
ENDIF
cdPrintnl()
#endif
/*
Play_Back_Beep()
IF NOT IS_ENTITY_DEAD (PLAYER_PED_ID())
PLAY_SOUND_FROM_ENTITY (-1, "PHONE_GENERIC_KEY_01", PLAYER_PED_ID())
ENDIF
*/
SWITCH g_Cellphone.PhoneDS
CASE PDS_AWAY
#if IS_DEBUG_BUILD
cdPrintstring("CELLPHONE_FH - Phone already in away state...")
cdPrintnl()
#endif
BREAK
CASE PDS_TAKEOUT
#if IS_DEBUG_BUILD
cdPrintstring("CELLPHONE_FH - Yes / no response - avoiding unknown state timing issue.")
cdPrintnl()
#endif
BREAK
CASE PDS_MAXIMUM
//Don't allow the phone to be put away by the user if the phone is hidden...
IF g_Phone_Active_but_Hidden = FALSE
//New addition... 20.09.10
IF g_Homescreen_In_Secondary_Mode = TRUE
Play_Back_Beep()
g_Homescreen_In_Secondary_Mode = FALSE
LEGACY_SCALEFORM_MOVIE_METHOD_WITH_NUMBER (SF_MovieIndex, "DISPLAY_VIEW", 4) //Quickly jump to another screen to tidy up and reset home screen
#if IS_DEBUG_BUILD
cdPrintstring ("CELLPHONE_FH - Update_Scaleform_VSE called - 201")
cdPrintnl ()
cdPrintstring ("Display View 4 - Cellphone Flashhand 1")
cdPrintnl()
#endif
Fill_All_Primary_App_Sheets()
TitleUpdate_Patch_In_JobList_For_SP_Phone()
//Could go!
//Fill_All_Secondary_App_Sheets()
Scaleform_Place_Items_on_Homescreen(1)
LEGACY_SCALEFORM_MOVIE_METHOD_WITH_NUMBER (SF_MovieIndex, "DISPLAY_VIEW", 1, TO_FLOAT (Previous_SelectedAppCursorPos_PageOne)) //Set enum state to HOME_SCREEN
#if IS_DEBUG_BUILD
cdPrintstring ("CELLPHONE_FH - Update_Scaleform_VSE called - 202")
cdPrintnl ()
#endif
ELSE
//Play_Back_Beep()
IF NOT IS_ENTITY_DEAD (PLAYER_PED_ID())
PLAY_SOUND_FRONTEND (-1, "Put_Away", g_Owner_Soundset) //Les TODO 1517916
ENDIF
//Put in this failsafe to make sure any apps left hanging get cleaned up when the phone goes away. 100374
/* Update: app itself should do this via ABNORMAL EXIT check when PhoneDS is set to PDS_AWAY
g_TerminateApp = TRUE
#if IS_DEBUG_BUILD
cdPrintstring ("g_TerminateApp set to TRUE - any apps in running state should exit if CHECK_APPLICATION_EXIT is integrated.")
cdPrintnl ()
#endif
*/
s_iTimeStampStart = 0
g_Cellphone.PhoneDS = PDS_AWAY
#if IS_DEBUG_BUILD
cdPrintnl()
cdPrintstring("STATE ASSIGNMENT 51. Cellphone_flashhand assigns PDS_AWAY")
cdPrintnl()
#endif
ENDIF
ENDIF
BREAK
CASE PDS_MINIMAL
g_Cellphone.PhoneDS = PDS_AWAY
#if IS_DEBUG_BUILD
cdPrintnl()
cdPrintstring("STATE ASSIGNMENT 52. Cellphone_flashhand assigns PDS_AWAY")
cdPrintnl()
#endif
BREAK
//CRITICAL: Running App to Homescreen transition on "Back" press
//Might need to move parts of this to check_application_exit
CASE PDS_RUNNINGAPP
//Terminate any running app if it is checking CHECK_APPLICATION_EXIT(), set the view state to PDS_MAXIMUM
//and restore homescreen by updating View State Enum. Apps in PDS_COMPLEXAPP state will not exit.
IF IS_BIT_SET (BitSet_CellphoneDisplay, g_BS_WAITING_ON_APP_TO_LOAD) = TRUE //#1431413
#if IS_DEBUG_BUILD
PRINTSTRING("Not allowing app exit as g_BS_WAITING_ON_APP_TO_LOAD is true this frame")
PRINTNL()
#endif
ENDIF
IF (g_App_Elapsed_SafetyBuffer - g_App_SafetyBuffer_StartTime) > g_App_Required_SafetyBuffer_Duration //Make sure script has had a chance to launch before exit... See bug 25815
AND IS_BIT_SET (BitSet_CellphoneDisplay, g_BS_WAITING_ON_APP_TO_LOAD) = FALSE //#1431413
IF IS_BIT_SET (BitSet_CellphoneDisplay_Continued, g_BSC_LAUNCH_FINALE_CONTACTS)
#if IS_DEBUG_BUILD
PRINTSTRING("Not allowing Contacts exit as this is the Finale Choice list!")
PRINTNL()
#endif
ELSE
Play_Back_Beep()
g_TerminateApp = TRUE
#if IS_DEBUG_BUILD
cdPrintstring ("CELLPHONE_FH - g_TerminateApp set to TRUE - app in running state should exit if CHECK_APPLICATION_EXIT is integrated.")
cdPrintnl ()
#endif
//Trial Exclusion Run 24.09.10 - this is now being done in CHECK_APPLICATION_EXIT to ensure that scripts which are special exceptions
//e.g appContacts, do not run Update_Scaleform_VSE twice (it will be in their cleanup ) as that can cause a screwy sliding effect.
//Trial failed. This needs to be here in order to guarantee the pick up of the back button press. Having a timed stagger on the acceptance
//of button presses seems a safer solution to PDS conflicts.
g_Cellphone.PhoneDS = PDS_MAXIMUM
#if IS_DEBUG_BUILD
cdPrintnl()
cdPrintstring("STATE ASSIGNMENT 53. Cellphone_flashhand assigns PDS_MAXIMUM")
cdPrintnl()
#endif
IF g_bInMultiplayer
LEGACY_SCALEFORM_MOVIE_METHOD_WITH_NUMBER (SF_MovieIndex, "SET_THEME", TO_FLOAT (Temp_MPcurrentTheme))
#if IS_DEBUG_BUILD
cdPrintstring("Cellphone_flashhand - Re-establish MP theme on return to maximum. May have been altered by Agency App.")
cdPrintint(Temp_MPCurrentTheme)
cdPrintnl()
#endif
ENDIF
//Make sure clock can update immediately...
ClockThrottleMins = 99
IF g_LaunchContactsFromTextMessage = FALSE //1636892 - only refresh the homescreen and return to that state if we are not immediately launching the contacts app.
Update_Scaleform_VSE ()
ENDIF
ENDIF
ENDIF
BREAK
CASE PDS_COMPLEXAPP
#if IS_DEBUG_BUILD
cdPrintstring ("CELLPHONE_FH - Unless app-specific check is made, flashhand not exiting app as it is in complex state...")
cdPrintnl ()
#endif
BREAK
CASE PDS_ATTEMPTING_TO_CALL_CONTACT
IF g_TheContactInvolvedinCall = CHAR_CHAT_CALL //Adding this on a trial basis to prevent quitting before PROCESS_VOICE_SESSION_STARTED_EVENT() has fired.
IF voiceSession.bInVoiceSession //1602347
OR IS_BIT_SET (BitSet_CellphoneDisplay_Continued, g_BSC_SET_CHAT_CALL_AS_ENGAGED)
Play_Back_Beep()
Remove_Cellphone_From_Ear()
ELSE
#if IS_DEBUG_BUILD
cdPrintnl()
cdPrintstring("CELLPHONE_FH - Not removing phone from ear as InVoiceSession has not yet returned TRUE for attempted chat call.")
cdPrintnl()
#endif
ENDIF
ELSE
Play_Back_Beep()
//See bug 1924417 - Perhaps put in a counter for repeated button presses...? Audio not streaming in.
//IF GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH ("appMPPlayerList")) = 0 //AppMPPlayerlist has been removed from the project.
Remove_Cellphone_From_Ear()
//This was removed for #1580608 - search on this bug number for related changes. Re-establish appContacts after aborting an attempted call.
//This meant we just went back to PDS_MAXIMUM after aborting an attempted call. Much simpler and cleaner.
/*
g_Cellphone.PhoneDS = PDS_MAXIMUM
#if IS_DEBUG_BUILD
cdPrintnl()
cdPrintstring("STATE ASSIGNMENT 54. Cellphone_flashhand assigns PDS_MAXIMUM")
cdPrintnl()
#endif
Update_Scaleform_VSE ()
*/
//Keep this!
g_LastCellphoneCallInterrupted = TRUE
ENDIF
/*
ELSE //If the player list is running then this meant the "attempting to call contact" state has been entered via
//cellphone_public procedure LAUNCH_CALL_SCREEN_FOR_OUTGOING_CHAT_CALL. We don't want to tidy up as normal.
//That should be left to the player list app itself to decide what to do, so we return to its last known state.
#if IS_DEBUG_BUILD
cdPrintnl()
cdPrintstring("CELLPHONE_FH - Attempted STATE ASSIGNMENT 54 routine but appMPPLAYERLIST was running. Performing STATE ASSIGNMENT 7754.")
cdPrintnl()
#endif
TERMINATE_APPCONTACTS_FOR_CHAT_CALL() //will let appContacts know it should terminate via bit set.
ENDIF
*/
BREAK
CASE PDS_ONGOING_CALL //Might not need this - should get done by dialogue handler at "critical" marked line. Have removed on a trial basis. 26.05.10
//13.10.11 Update - I'm adding this segment, with a conv check, as part of a suite of things to address bug 246816. The phone seemed to be
//stuck in ONGOING_CALL due to extreme game stress and calls coming in when it wasn't safe from MP. This may impact BeforeCallStateHandler, so note made there,
//This should always mirror the post phonecall behaviour of BeforeCallStateHandler()
IF g_ConversationStatus = CONV_STATE_FREE
g_Cellphone.PhoneDS = PDS_AWAY
#if IS_DEBUG_BUILD
cdPrintnl()
cdPrintstring("STATE ASSIGNMENT 55. Cellphone_flashhand assigns PDS_AWAY")
cdPrintnl()
#endif
#if IS_DEBUG_BUILD
cdPrintstring("CELLPHONE_FH - Reporting unusual PDS_ONGOING_CALL exit")
cdPrintnl()
#endif
ELSE
#if IS_DEBUG_BUILD
cdPrintstring("CELLPHONE_FH - back button pressed whilst in PDS_ONGOING_CALL - conv state NOT free.")
cdPrintnl()
#endif
ENDIF
BREAK
DEFAULT
#if IS_DEBUG_BUILD
cdPrintstring("CELLPHONE_FH - Strange phone_state = ")
cdPrintint(ENUM_TO_INT(g_Cellphone.PhoneDS))
cdPrintnl()
//SCRIPT_ASSERT("Phone in strange state. Tell Steve T.")
#endif
BREAK
ENDSWITCH
IF g_LaunchContactsFromTextMessage = TRUE //1636892
LaunchContactsFromTextMessage_LocalSignal = TRUE //1636892 use this to specify we want to launch the app now we have received the global from AppTextMessage.sc
g_LaunchContactsFromTextMessage = FALSE //1636892 Reset the global so this procedure does not run inadvertently.
#if IS_DEBUG_BUILD
cdPrintnl()
cdPrintstring("CELLPHONE_FH - Cellphone flashhand reports that g_LaunchContactsFromTextMessage was TRUE")
cdPrintnl()
#endif
ENDIF
ELSE
#if IS_DEBUG_BUILD
cdPrintstring("CELLPHONE_FH - Can't put phone away, fully moved up bit not set. #719218")
cdPrintint(ENUM_TO_INT(g_Cellphone.PhoneDS))
cdPrintnl()
#endif
ENDIF //Moved up check.
ENDIF //Player alive, control on checks.
ENDIF
ENDIF //button pressed checks.
ENDIF
ENDIF
ENDIF
ENDPROC
//This procedure is just a simple way of ensuring that a single button press does not carry throughtout menu navigation. In a scaleform context, WAITs are bad news.
//Every button press has a condition which checks if g_InputButtonJustPressed = FALSE before accepting input. Once input has been accepted the state is then set to TRUE
//and this script will run this proc continually to check if the buttons have been released, subsequently allowing for further input.
PROC Check_For_Just_Pressed_Revert()
IF NOT IS_CONTROL_PRESSED (FRONTEND_CONTROL, INT_TO_ENUM (CONTROL_ACTION, PHONE_POSITIVE_INPUT))
AND NOT IS_CONTROL_PRESSED (FRONTEND_CONTROL, INT_TO_ENUM (CONTROL_ACTION, PHONE_GO_BACK_INPUT)) //is the same key as negative input.
//We may need to add more button presses to the revert.
g_InputButtonJustPressed = FALSE
ENDIF
ENDPROC
//After the phone is taken out via cellphone controller or cellphone public's call to Create_3dPhoneObject() which starts this script, move the phone into position.
PROC Move3dPhoneUpScreen()
IF IS_BIT_SET (BitSet_CellphoneDisplay_Third, g_BSTHIRD_DO_NOT_MOVE_PHONE_UP_ON_LAUNCH)
SET_BIT (BitSet_CellphoneDisplay_Continued, g_BSC_CELLPHONE_THREEQUARTERS_UP)
SET_BIT (BitSet_CellphoneDisplay, g_BS_HAS_CELLPHONE_FULLY_MOVED_UP)
g_3DPhoneNeedsMovedUp = FALSE
s_iTimeStampStart = 0
//Pocket work.
SET_MOBILE_PHONE_ROTATION (g_3dPhoneStartRotVec)
//CLEAR_BIT (BitSet_CellphoneDisplay_Third, g_BSTHIRD_DO_NOT_MOVE_PHONE_UP_ON_LAUNCH) //Removed to fix url:bugstar:1866104
ELSE
IF GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("appEmail")) < 1
#if IS_DEBUG_BUILD
cdPrintnl()
cdPrintstring("Phone doing NORMAL transition")
#endif
FLOAT fComplete = MovePhoneToDestination(g_This_Screen_3dPhoneStartVec[g_Chosen_Ratio], g_This_Screen_3dPhoneEndVec[g_Chosen_Ratio], g_3dPhonePocketRotVec, g_3dPhoneStartRotVec, 450.0, TRUE)
IF fComplete >= 1.0
SET_BIT (BitSet_CellphoneDisplay_Continued, g_BSC_CELLPHONE_THREEQUARTERS_UP)
SET_BIT (BitSet_CellphoneDisplay, g_BS_HAS_CELLPHONE_FULLY_MOVED_UP)
g_3DPhoneNeedsMovedUp = FALSE
s_iTimeStampStart = 0
CLEAR_BIT (BitSet_CellphoneDisplay_Third, g_BSTHIRD_DO_NOT_MOVE_PHONE_UP_ON_LAUNCH)
b_NeedToAdjustEmailForCameraTransition = FALSE
#if IS_DEBUG_BUILD
cdPrintnl()
cdPrintstring("COMPLETED Normal Transition")
#endif
ELIF fComplete >= 0.75
SET_BIT (BitSet_CellphoneDisplay_Continued, g_BSC_CELLPHONE_THREEQUARTERS_UP)
ENDIF
ELSE
#if IS_DEBUG_BUILD
cdPrintnl()
cdPrintstring("Phone doing email transition")
#endif
IF b_NeedToAdjustEmailForCameraTransition = FALSE
v_3dEmailDesiredTransPosition = g_This_Screen_3dPhoneEndVec[g_Chosen_Ratio]
// original value was -6. Text-readable size is -10.
v_3dEmailDesiredTransPosition.x -= 10.0 //Specifies the size of the left adjustment to make sure the entire body text is visible in landscape mode.
v_3dEmailDesiredTransPosition.y += 20.0 //Fixes TRC bombshell with new anims by making sure the landscape phone lies above any long or four line subtitles - in German!
b_NeedToAdjustEmailForCameraTransition = TRUE
ENDIF
FLOAT fComplete = MovePhoneToDestination(g_This_Screen_3dPhoneStartVec[g_Chosen_Ratio], v_3dEmailDesiredTransPosition, <<-90, 0, 90.0>>, <<-90, 0, 90.0>>, 450.0, TRUE)
IF fComplete >= 1.0
SET_BIT (BitSet_CellphoneDisplay_Continued, g_BSC_CELLPHONE_THREEQUARTERS_UP)
SET_BIT (BitSet_CellphoneDisplay, g_BS_HAS_CELLPHONE_FULLY_MOVED_UP)
g_3DPhoneNeedsMovedUp = FALSE
s_iTimeStampStart = 0
CLEAR_BIT (BitSet_CellphoneDisplay_Third, g_BSTHIRD_DO_NOT_MOVE_PHONE_UP_ON_LAUNCH)
b_NeedToAdjustEmailForCameraTransition = FALSE
ELIF fComplete >= 0.75
SET_BIT (BitSet_CellphoneDisplay_Continued, g_BSC_CELLPHONE_THREEQUARTERS_UP)
ENDIF
ENDIF
ENDIF
ENDPROC
PROC Setup_MainGui_Rendertarget()
GET_MOBILE_PHONE_RENDER_ID (PhoneRenderTarget_Id)
IF PhoneRenderTarget_ID = -1
#if IS_DEBUG_BUILD
SCRIPT_ASSERT ("CELLPHONE_FH - Cannot find mobile phone render target id for cellphone.")
#endif
ELSE
#if IS_DEBUG_BUILD
cdPrintstring ("CELLPHONE_FH - Mobile Phone Render target id for cellphone is ")
cdPrintint (PhoneRenderTarget_Id)
cdPrintnl()
#endif
ENDIF
ENDPROC
PROC ProcessCellphoneSignalStrength()
IF IS_PLAYER_PLAYING (PLAYER_ID())
i_Affluence = GET_ZONE_SCUMMINESS(GET_ZONE_AT_COORDS(GET_ENTITY_COORDS(PLAYER_PED_ID())))
ENDIF
//3 - poor, 0 - affluent
//ENUM ZONE_SCUMMINESS
//SCUMMINESS_POSH, - 0
//SCUMMINESS_NICE,
//SCUMMINESS_ABOVE_AVERAGE,
//SCUMMINESS_BELOW_AVERAGE,
//SCUMMINESS_CRAP,
//SCUMMINESS_SCUM 5
//ENDENUM
SWITCH i_Affluence
CASE 0
testSignalInt = 5
BREAK
CASE 1
testSignalInt = 5
BREAK
CASE 2
testSignalInt = 4
BREAK
CASE 3
testSignalInt = 4
BREAK
CASE 4
testSignalInt = 3
BREAK
CASE 5
testSignalInt = 2
BREAK
DEFAULT
testSignalInt = 3
BREAK
ENDSWITCH
i_SignalFluctuator = GET_RANDOM_INT_IN_RANGE (0, 8) //returns 0 to 7 inclusive.
IF i_SignalFluctuator < 2 //1 in 4 chance of a fluctuation occurring.
IF testSignalInt > 2
testSignalInt --
ENDIF
ENDIF
IF b_inSubmersible = TRUE
OR IS_PLAYER_IN_ANY_COMMUNICATION_RESTRICTED_AREAS() //#1132229
testSignalInt = 0 //For # 1291886
ENDIF
LEGACY_SCALEFORM_MOVIE_METHOD_WITH_NUMBER (SF_MovieIndex, "SET_PROVIDER_ICON", TO_FLOAT (i_Provider_Ident), TO_FLOAT(testSignalInt))
/*
SWITCH testSignalInt
CASE 0
LEGACY_SCALEFORM_MOVIE_METHOD_WITH_NUMBER (SF_MovieIndex, "SET_PROVIDER_ICON", TO_FLOAT (i_Provider_Ident), TO_FLOAT(1))
BREAK
CASE 1
LEGACY_SCALEFORM_MOVIE_METHOD_WITH_NUMBER (SF_MovieIndex, "SET_PROVIDER_ICON", TO_FLOAT (i_Provider_Ident), 2)
BREAK
CASE 2
LEGACY_SCALEFORM_MOVIE_METHOD_WITH_NUMBER (SF_MovieIndex, "SET_PROVIDER_ICON", TO_FLOAT (i_Provider_Ident), 3)
BREAK
CASE 3
LEGACY_SCALEFORM_MOVIE_METHOD_WITH_NUMBER (SF_MovieIndex, "SET_PROVIDER_ICON", TO_FLOAT (i_Provider_Ident), 4)
BREAK
CASE 4
LEGACY_SCALEFORM_MOVIE_METHOD_WITH_NUMBER (SF_MovieIndex, "SET_PROVIDER_ICON", TO_FLOAT (i_Provider_Ident), 5)
BREAK
ENDSWITCH
*/
ENDPROC
PROC Update_Cellphone_Clock_and_Health()
IF IS_CURRENTLY_ON_MISSION_OF_TYPE (MISSION_TYPE_DIRECTOR) //Make sure highlight always remains on snapmatic or mpjoblist if available in director mode whilst phone is on homescreen.
//2411448
IF g_CellphoneHasMPAccess
IF g_Cellphone.PhoneDS = PDS_MAXIMUM
IF appCursorIndex = 7
LEGACY_SCALEFORM_MOVIE_METHOD_WITH_NUMBER (SF_MovieIndex, "DISPLAY_VIEW", 1, TO_FLOAT (7)) //Set enum state to HOME_SCREEN
ELSE
appCursorIndex = 6 //If the cursor is anything other than 6 or 7, which it shouldn't be in director mode, default back to 6 again.
LEGACY_SCALEFORM_MOVIE_METHOD_WITH_NUMBER (SF_MovieIndex, "DISPLAY_VIEW", 1, TO_FLOAT (6)) //Set enum state to HOME_SCREEN
ENDIF
ENDIF
ELSE
IF g_Cellphone.PhoneDS = PDS_MAXIMUM
LEGACY_SCALEFORM_MOVIE_METHOD_WITH_NUMBER (SF_MovieIndex, "DISPLAY_VIEW", 1, TO_FLOAT (6)) //Set enum state to HOME_SCREEN
ENDIF
ENDIF
ENDIF
//Update clock for badger_theme.
//IF g_savedGlobals.sCellphoneSettingsData.This_Cellphone_Owner_Settings[g_Cellphone.PhoneOwner].OSTypeForThisPlayer= OS_BADGER //Cellphone Badger type - includes clock.
//IF g_Use_Prologue_Cellphone = FALSE
/* Homescreen Update test.
IF g_Homescreen_In_Secondary_Mode = FALSE //If the player is on the homescreen, update any icons that should become greyed out due to a change in circumstances.
Scaleform_Place_Items_on_Homescreen(1)
ENDIF
*/
ClockMins = GET_CLOCK_MINUTES()
IF ClockMins <> ClockThrottleMins
ClockThrottleMins = ClockMins
ClockHours = GET_CLOCK_HOURS()
//Comment in to display debug console clock time.
/*
#if IS_DEBUG_BUILD
cdPrintnl()
cdPrintint(ClockHours)
cdPrintnl()
cdPrintint(ClockMins)
cdPrintnl()
#endif
*/
/*
ENUM DAY_OF_WEEK
SUNDAY = 0,
MONDAY,
TUESDAY,
WEDNESDAY,
THURSDAY,
FRIDAY,
SATURDAY
ENDENUM
*/
ClockDay = GET_CLOCK_DAY_OF_WEEK()
SWITCH ClockDay
CASE SUNDAY
TempDayLabel = "CELL_920"
BREAK
CASE MONDAY
TempDayLabel = "CELL_921"
BREAK
CASE TUESDAY
TempDayLabel = "CELL_922"
BREAK
CASE WEDNESDAY
TempDayLabel = "CELL_923"
BREAK
CASE THURSDAY
TempDayLabel = "CELL_924"
BREAK
CASE FRIDAY
TempDayLabel = "CELL_925"
BREAK
CASE SATURDAY
TempDayLabel = "CELL_926"
BREAK
DEFAULT //Would be a helluva error if this returns!
TempDayLabel = "CELL_206"
BREAK
ENDSWITCH
LEGACY_SCALEFORM_MOVIE_METHOD_WITH_NUMBER_AND_STRING (SF_MovieIndex, "SET_TITLEBAR_TIME", TO_FLOAT(ClockHours), TO_FLOAT(ClockMins),
INVALID_SCALEFORM_PARAM, INVALID_SCALEFORM_PARAM, INVALID_SCALEFORM_PARAM, TempDayLabel)
IF g_Use_Prologue_Cellphone = FALSE //don't set provider for prologue phone, as method is not accepted.
ProcessCellphoneSignalStrength()
ENDIF
//We need to get the player's health periodically so that we can reliably work out when he is actually taking damage. This is because the phone could have
//been taken out when at minimal health and then regenerates to full. If he then takes damage, we need to make sure we are comparing against the new regenerated
//health rather than just the starting health grabbed when the phone initially launched.
IF IS_PLAYER_PLAYING (PLAYER_ID())
Player_PeriodicHealth = GET_ENTITY_HEALTH (PLAYER_PED_ID())
ENDIF
ENDIF
//ENDIF
ENDPROC
PROC Perform_StockMarketChecks()
IF NETWORK_IS_GAME_IN_PROGRESS()
i_TimeDifference = GET_TIME_DIFFERENCE (GET_NETWORK_TIME(), Net_StockMarketChecks_StartTime)
ELSE
StockMarketChecks_CurrentTime = GET_GAME_TIMER()
i_TimeDifference = StockMarketChecks_CurrentTime - StockMarketChecks_StartTime
ENDIF
//IF StockMarketChecks_CurrentTime - StockMarketChecks_StartTime > 4000
IF i_TimeDifference > 4000
i_Provider_Ident = Get_Cellphone_Provider()
/*
SWITCH i_Provider_Ident
CASE PROVIDER_BADGER
bsaq_mf_OpenDecision = BSMF_PHONEOPENTIME_FOR_BDG
bsaq_mf_CallDecision = BSMF_CALLTIME_FOR_BDG
BREAK
CASE PROVIDER_WHIZ
bsaq_mf_OpenDecision = BSMF_PHONEOPENTIME_FOR_WIZ
bsaq_mf_CallDecision = BSMF_CALLTIME_FOR_WIZ
BREAK
CASE PROVIDER_TINKLE
bsaq_mf_OpenDecision = BSMF_PHONEOPENTIME_FOR_TNK
bsaq_mf_CallDecision = BSMF_CALLTIME_FOR_TNK
BREAK
DEFAULT //Default to badger.
bsaq_mf_OpenDecision = BSMF_PHONEOPENTIME_FOR_BDG
bsaq_mf_CallDecision = BSMF_CALLTIME_FOR_BDG
BREAK
ENDSWITCH
*/
//Deliberately allowing this to update along with the call update, as the phone is still open. Easy to change to "else" clause of IS_MOBILE_CALL_ONGOING if need be.
////BAWSAQ_INCREMENT_MODIFIER (bsaq_mf_OpenDecision, 1)
/*
#if IS_DEBUG_BUILD
cdPrintstring ("CELLPHONE_FH - Performing open time usage stock update.")
cdPrintnl()
#endif
*/
IF IS_MOBILE_PHONE_CALL_ONGOING()
////BAWSAQ_INCREMENT_MODIFIER (bsaq_mf_CallDecision, 1)
/*
#if IS_DEBUG_BUILD
cdPrintstring ("CELLPHONE_FH - Performing call time stock update.")
cdPrintnl()
#endif
*/
ENDIF
//Interval has passed, need to re-establish new start time.
IF NETWORK_IS_GAME_IN_PROGRESS()
Net_StockMarketChecks_StartTime = GET_NETWORK_TIME()
ELSE
StockMarketChecks_StartTime = GET_GAME_TIMER()
ENDIF
ENDIF
ENDPROC
PROC Check_For_QuickLaunch_of_Snapmatic()
//New block for 1855377 - Now GTAO only.
//"Suggestion for a new feature: quick access to the mobile phone camera by pressing the "up" arrow twice (quickly)."
//"Just like real phone like iPhone have the option to go directly to the camera from the lock screen."
IF g_InputButtonJustPressed = FALSE //Dedicated check for second phone takeout control makes sure we can't carry through to positive input check.
IF Is_Phone_Control_Just_Pressed (FRONTEND_CONTROL, INT_TO_ENUM (CONTROL_ACTION, PHONE_TAKEOUT_INPUT), TRUE) //Fix for 2193313. Quick launch on PC needs to reuse TAKEOUT rather than NAV_UP to support mouse wheel. // B* 2285479 - Check disabled input so this works on keyboard and mouse.
//Put back in when stat is available.
IF GET_MP_INT_CHARACTER_STAT(MP_STAT_FM_CELLPHONE_QUICKLAUNCH) = 1 //Snapmatic Quicklaunch stat has been set to ON in settings.
//Added for 1918479 to handle potential block of critical messages. We don't want to launch Snapmatic if a critical message is pending for this player.
IF g_savedGlobals.sCellphoneSettingsData.This_Cellphone_Owner_Settings[g_Cellphone.PhoneOwner].g_LastMessageSentMustBeRead = FALSE
IF NOT (IS_BIT_SET (BitSet_CellphoneDisplay_Continued, g_BSC_SHOULD_DISABLE_CAMERA_APP_THIS_FRAME))
IF NOT (g_Use_Prologue_Cellphone) //1911268
IF NOT (IS_BIT_SET (BitSet_CellphoneTU, g_BSTU_QUICK_LAUNCH_SNAPMATIC)) //1855377
IF NOT IS_BIT_SET (BitSet_CellphoneDisplay, g_BS_HAS_CELLPHONE_FULLY_MOVED_UP)
g_InputButtonJustPressed = TRUE //Makes sure we can't carry through to positive input check.
SET_BIT (BitSet_CellphoneTU, g_BSTU_QUICK_LAUNCH_SNAPMATIC) //This bit is cleared in the termination routine of appCamera, "Snapmatic" and on intial launch of flashhand.sc
CC_INTERNAL_LAUNCH_CELLPHONE_APPLICATION (AppCamera, FALSE, TRUE, FALSE) //don't load movies, override phone already on screen check, use CONTACTS_APP_STACK_SIZE
/*
//Check_for_App_Selection() //moved 25.10.11 so that another app can't be selected before contacts launches.
LAUNCH_CELLPHONE_APPLICATION (AppCamera, FALSE, TRUE, FALSE) //don't load movies, override phone already on screen check, use CONTACTS_APP_STACK_SIZE
*/
#if IS_DEBUG_BUILD
cdPrintnl()
cdPrintstring("CELLPHONE_FH - Quick Launching Snapmatic... ")
cdPrintInt (ENUM_TO_INT(CellphoneAppAutoLaunchType))
cdPrintnl()
#endif
CellphoneAppAutoLaunchType = ACT_APP_NONE
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF // Stat check condition end.
ENDIF
ENDIF
//End of new block for 1855377
ENDPROC
PROC Check_For_App_Selection() //Again, could pass stuff in here for context checking depending on screen. Will check all flash stuff.
//Partial dummy routine for automatic AppInternet launch from hyperlinked text message.
IF IS_BIT_SET (BitSet_CellphoneDisplay_Continued, g_BSC_LAUNCH_APPINTERNET_ON_RETURN_TO_PDS_MAXIMUM)
OR LaunchContactsFromTextMessage_LocalSignal = TRUE //1636892
#if IS_DEBUG_BUILD
cdPrintnl()
cdPrintstring("CELLPHONE_FH - Check_For_App_Selection has weirdly found an ACT_APP or Internet or g_LaunchContactsFromTextMessage launch.")
cdPrintnl()
#endif
g_App_SafetyBuffer_StartTime = GET_GAME_TIMER()
g_TerminateApp = FALSE //make sure that Check_Application_Exit() doesn't fire off accidentally.
g_InputButtonJustPressed = TRUE
BEGIN_SCALEFORM_MOVIE_METHOD (SF_MovieIndex, "GET_CURRENT_SELECTION")
testReturnedSFIndex = END_SCALEFORM_MOVIE_METHOD_RETURN_VALUE()
b_Waiting_On_SF_Return_Value = TRUE
ELSE
//Embedding this here in the ELSE branch makes sure that no apps can be selected during transition from text message to Internet after a Hyperlink launch.
IF g_InputButtonJustPressed = FALSE
IF Is_Phone_Control_Just_Pressed (FRONTEND_CONTROL, INT_TO_ENUM (CONTROL_ACTION, PHONE_POSITIVE_INPUT)) //positive action - application is being selected
//Play_Select_Beep() - Moved below, so we only beep if appLaunch has not been voided.
IF local_Request_for_QuickSave = FALSE
//IF g_HasCellphoneRequestedSave = FALSE //Too risky to put this check in. If quicksave breaks then you might not be able to launch apps.
g_App_SafetyBuffer_StartTime = GET_GAME_TIMER()
g_TerminateApp = FALSE //make sure that Check_Application_Exit() doesn't fire off accidentally.
g_InputButtonJustPressed = TRUE
//testReturnedSFInt = CALL_SCALEFORM_MOVIE_METHOD(SF_MovieIndex, "GET_CURRENT_SELECTION")
BEGIN_SCALEFORM_MOVIE_METHOD (SF_MovieIndex, "GET_CURRENT_SELECTION")
testReturnedSFIndex = END_SCALEFORM_MOVIE_METHOD_RETURN_VALUE()
b_Waiting_On_SF_Return_Value = TRUE
//ELSE
//#if IS_DEBUG_BUILD
//cdPrintnl()
//cdPrintstring("CELLPHONE_FLASHHAND - Can't launch app as g_HasCellphoneRequestedSave is TRUE!")
//cdPrintnl()
//#endif
//ENDIF
ELSE
#if IS_DEBUG_BUILD
cdPrintnl()
cdPrintstring("CELLPHONE_FLASHHAND - Can't launch app as local_Request_for_QuickSave is TRUE!")
cdPrintnl()
#endif
ENDIF
ENDIF
ENDIF
ENDIF
ENDPROC
#IF FEATURE_FIXER
FUNC STRING GET_BLOCK_INTERNET_APP_HELP_TEXT()
// Return different labels here if on a specific mission etc.
RETURN "BLOCK_APP_WEB"
ENDFUNC
#ENDIF
PROC Check_For_App_Return_Value_Ready()
IF IS_SCALEFORM_MOVIE_METHOD_RETURN_VALUE_READY (testReturnedSFIndex)
b_Waiting_On_SF_Return_Value = FALSE //Critical!
testReturnedSFInt = GET_SCALEFORM_MOVIE_METHOD_RETURN_VALUE_INT (testReturnedSFIndex)
IF g_Homescreen_In_Secondary_Mode = FALSE
Previous_SelectedAppCursorPos_PageOne = testReturnedSFInt
ELSE
Previous_SelectedAppCursorPos_PageTwo = testReturnedSFInt
ENDIF
#if IS_DEBUG_BUILD
cdPrintstring("CELLPHONE_FH - Returned SF INT via new style GCS is ")
cdPrintint(testReturnedSFInt)
cdPrintnl()
#endif
IF testReturnedSFInt < 0
testreturnedSFInt = 0
ENDIF
SelectedAppIndex = AppSlot[testReturnedSFInt]
//If automatic AppInternet launch from hyperlinked text message is in play, overwrite selection choice to force AppInternet as the launch app.
IF IS_BIT_SET (BitSet_CellphoneDisplay_Continued, g_BSC_LAUNCH_APPINTERNET_ON_RETURN_TO_PDS_MAXIMUM)
SelectedAppIndex = ENUM_TO_INT (appINTERNET)
CLEAR_BIT (BitSet_CellphoneDisplay_Continued, g_BSC_LAUNCH_APPINTERNET_ON_RETURN_TO_PDS_MAXIMUM) //clear bit to make sure normal usage resumes upon return to homescreen.
#if IS_DEBUG_BUILD
cdPrintnl()
cdPrintstring("CELLPHONE_FH - Check_For_App_Return_Value_Ready(). Internet Launch bit set. ")
cdPrintnl()
#endif
ENDIF
IF LaunchContactsFromTextMessage_LocalSignal = TRUE
Previous_SelectedAppCursorPos_PageOne = 1
SelectedAppIndex = ENUM_TO_INT (appCONTACTS)
g_LaunchContactsFromTextMessage = FALSE //clear global to make sure normal usage resumes upon return to homescreen.
LaunchContactsFromTextMessage_LocalSignal = FALSE
#if IS_DEBUG_BUILD
cdPrintnl()
cdPrintstring("CELLPHONE_FH - Check_For_App_Return_Value_Ready(). LaunchContactsFromTextMessage_LocalSignal was set to true. ")
cdPrintnl()
#endif
ENDIF
//Launch app from homescreen but check for voids.
BOOL b_AppLaunchVoided = FALSE
//6417795 - May 2020
//Critical!
//New handling for AppDummyApp1 which is being used to launch Arcade Mode in MP.
If g_bInMultiplayer
#IF FEATURE_FREEMODE_ARCADE
#IF FEATURE_COPS_N_CROOKS
//Joblist, Arcade Mode and Internet App are disabled whilst in CnC. See bugs 6417788 6457063 6461213
//Void their launch if in CnC mode.
IF IS_CELLPHONE_IN_CNC()
IF SelectedAppIndex = ENUM_TO_INT (AppDummyApp1)
OR SelectedAppIndex = ENUM_TO_INT (AppINTERNET)
OR SelectedAppIndex = ENUM_TO_INT (AppMPJOBLIST)
#if IS_DEBUG_BUILD
cdPrintnl()
cdPrintstring("Voided CnC incompatible application launch. See bugs 6417788 6457063 6461213")
cdPrintnl()
#endif
b_AppLaunchVoided = TRUE
ENDIF
ELSE
#ENDIF
#ENDIF
IF SelectedAppIndex = ENUM_TO_INT (AppDummyApp1) AND SHOULD_MP_SECONDARY_MODE_BE_AVAILABLE()
//6478196 - Arcade Mode app selection now requires a confirmation screen.
//This means we no longer void the launch of the script associated with the application.
//The currently associated app, now AppZit.sc will launch as normal to handle the Arcade Mode transition.
//Previous launch routine which went directly into the arcade mode transition when the app was selected.
//It did not run the app itself.
/*
b_AppLaunchVoided = TRUE
//Launch the MP technical transition. This calls an MP transition_common.sch proc to handle the mode swap.
TRANSITION_TO_ARCADE_MODE(FALSE, TRUE, ARCADE_ENTRY_POINT_INVITE)
#if IS_DEBUG_BUILD
cdPrintnl()
cdPrintstring("Detected user selection of AppDummyApp1 in MP. Voided any script launch.")
cdPrintnl()
#endif
*/
#IF FEATURE_COPS_N_CROOKS
REQUEST_CNC_TRANSITION_BG()
#ENDIF
ENDIF
#IF FEATURE_FREEMODE_ARCADE
#IF FEATURE_COPS_N_CROOKS
ENDIF
#ENDIF
#ENDIF
ENDIF
//Common voids to MP and SP_____________________________________________________________________________________________________________
IF IS_THREAD_ACTIVE (Application_Thread)
#if IS_DEBUG_BUILD
cdPrintnl()
cdPrintstring("Application_Thread is already running cannot launch another.")
cdPrintnl()
#endif
//2378079 - new content starts.
/*
//For bug 2378079, implementing a failsafe to terminate AppInternet.
IF g_Cellphone.PhoneDS = PDS_MAXIMUM
IF GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH ("appInternet")) > 0
#if IS_DEBUG_BUILD
cdPrintnl()
cdPrintstring("Trying to launch an app but Appinternet is still running. Failsafe counter is ")
cdPrintint(AppInternetFailsafeCounter)
cdPrintnl()
#endif
AppInternetFailsafeCounter ++
IF AppInternetFailsafeCounter = 8
#if IS_DEBUG_BUILD
cdPrintnl()
cdPrintstring("Trying to launch an app a critical amount of times. AppInternet's internal exit borked? Attempting external terminate of thread. Failsafe counter was ")
cdPrintint(AppInternetFailsafeCounter)
cdPrintnl()
#endif
AppInternetFailsafeCounter = 0
TERMINATE_THREAD (Application_Thread)
ENDIF
ENDIF
ELSE
#if IS_DEBUG_BUILD
cdPrintnl()
cdPrintstring("Application_Thread aborted launch but phone was not PDS_MAXIMUM")
cdPrintnl()
#endif
ENDIF
*/
//2378079 - new content ends.
b_AppLaunchVoided = TRUE //Added for 910427
ENDIF
IF SelectedAppIndex = ENUM_TO_INT (appCAMERA)
IF IS_BIT_SET (BitSet_CellphoneDisplay_Continued, g_BSC_SHOULD_DISABLE_CAMERA_APP_THIS_FRAME)
#if IS_DEBUG_BUILD
cdPrintnl()
cdPrintstring("appCamera cannot be launched as it is being disabled this frame.")
cdPrintnl()
#endif
b_AppLaunchVoided = TRUE
ELSE
IF NOT IS_ENTITY_DEAD (PLAYER_PED_ID())
IF IS_PED_ON_MOUNT (PLAYER_PED_ID()) //Don't allow camera use on horseback.
OR IS_STUNT_JUMP_IN_PROGRESS()
OR IS_PLAYER_CLIMBING (PLAYER_ID())
OR IS_PED_JACKING(PLAYER_PED_ID())
OR IS_PED_HANGING_ON_TO_VEHICLE(PLAYER_PED_ID()) //1950639
#if USE_TU_CHANGES
OR IS_PED_IN_MELEE_COMBAT(PLAYER_PED_ID())
OR IS_VEHICLE_DRIVEABLE(GET_VEHICLE_PED_IS_ENTERING(PLAYER_PED_ID()))
OR GET_USINGNIGHTVISION()
#endif
#if IS_DEBUG_BUILD
cdPrintnl()
cdPrintstring("appCAMERA cannot be launched on mount or during stunt jump or climbing. See Bug 528388.")
cdPrintnl()
#endif
b_AppLaunchVoided = TRUE
ENDIF
IF IS_PED_IN_ANY_VEHICLE (PLAYER_PED_ID())
IF IS_PED_SITTING_IN_ANY_VEHICLE (PLAYER_PED_ID()) = FALSE
#if IS_DEBUG_BUILD
cdPrintnl()
cdPrintstring("appCAMERA cannot be launched during vehicle entry / exit. See Bug 822459.")
cdPrintnl()
#endif
b_AppLaunchVoided = TRUE
ENDIF
VEHICLE_INDEX tempVehicleIndex = GET_VEHICLE_PED_IS_IN (PLAYER_PED_ID())
IF GET_ENTITY_UPRIGHT_VALUE (tempVehicleIndex) < 0.0
b_AppLaunchVoided = TRUE
#if IS_DEBUG_BUILD
cdPrintnl()
cdPrintstring("appCAMERA. Vehicle upright value less than zero! Aborting launch. See Bug 826009.")
cdPrintnl()
#endif
ENDIF
ENDIF
IF IS_PLAYER_TARGETTING_ANYTHING(PLAYER_ID())
b_AppLaunchVoided = TRUE
#if IS_DEBUG_BUILD
cdPrintnl()
cdPrintstring("appCAMERA - Cannot launch when player is targetting another ped. See bug 799705.")
cdPrintnl()
#endif
ENDIF
IF g_bInMultiplayer //2156297 - Prevent Camera use when aiming any kind of weapon.
IF IS_CONTROL_PRESSED(PLAYER_CONTROL, INPUT_AIM)
OR IS_CONTROL_PRESSED(PLAYER_CONTROL, INPUT_VEH_AIM)
GET_CURRENT_PED_WEAPON(PLAYER_PED_ID(), fh_TempWeapon)
IF fh_TempWeapon <> WEAPONTYPE_UNARMED
#if IS_DEBUG_BUILD
cdPrintstring ("CELLPHONE_FH- Can't launch snapmatic while aiming input is pressed by player in MP.")
cdPrintnl ()
#endif
b_AppLaunchVoided = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF SelectedAppIndex = ENUM_TO_INT (appInternet)
IF IS_BIT_SET (BitSet_CellphoneDisplay_Continued, g_BSC_SHOULD_DISABLE_INTERNET_APP_THIS_FRAME)
#if IS_DEBUG_BUILD
cdPrintnl()
cdPrintstring("appInternet cannot be launched as it is being disabled this frame.")
cdPrintnl()
#endif
b_AppLaunchVoided = TRUE
ENDIF
ENDIF
//2534800 - We need to make sure that Benny's quicklaunch is disabled if the internet is disabled by an external script.
IF SelectedAppIndex = ENUM_TO_INT (AppDummyApp0)
AND (ARE_STRINGS_EQUAL (g_AppList[SelectedAppIndex].AppName, "CELL_BENWEB"))
IF IS_BIT_SET (BitSet_CellphoneDisplay_Continued, g_BSC_SHOULD_DISABLE_INTERNET_APP_THIS_FRAME)
#if IS_DEBUG_BUILD
cdPrintnl()
cdPrintstring("Benny's site cannot be launched as the cellphone's internet launch is being disabled this frame.")
cdPrintnl()
#endif
b_AppLaunchVoided = TRUE
ENDIF
ENDIF
//MP specific voids_____________________________________________________________________________________________________________________
IF g_bInMultiplayer
IF SelectedAppIndex = ENUM_TO_INT (appPAUSEMAP)
OR SelectedAppIndex = ENUM_TO_INT (appSIDETASK)
//OR SelectedAppIndex = ENUM_TO_INT (appEMAIL)
//OR SelectedAppIndex = ENUM_TO_INT (appCAMERA) - Reincluded at request of TODO 425062
#if IS_DEBUG_BUILD
cdPrintnl()
cdPrintstring("CELLPHONE_FH - The chosen app has temporarily been disabled. No script requested or launched.")
cdPrintstring("CELLPHONE_FH - See Steve T if you need to re-enable this functionality.")
cdPrintnl()
#endif
ELSE
#if USE_TU_CHANGES
IF SelectedAppIndex = ENUM_TO_INT (AppDummyApp0) //This is the app in the bottom right hand corner of the cellphone homescreen. It's used by multiple apps.
/* Old legacy work for AppVLSI - now runs as an actual app rather than a launch signal.
//#if IS_DEBUG_BUILD
//cdPrintnl()
//cdPrintstring("CELLPHONE_FH - Circuit breaker has no actual script association. No script requested or launched.")
//cdPrintstring("CELLPHONE_FH - Setting fake Circuit Breaker launch global g_HackingAppHasBeenLaunched to TRUE.")
//cdPrintnl()
//#endif
//This script AppVLSI is now mapped to AppDummyApp0 and will now be a standard app launch. See 2150653.
//Void removed for VLSI
//b_AppLaunchVoided = TRUE
//g_HackingAppHasBeenLaunched = TRUE
*/
//AppDummyApp0 now used to launch Benny's site if the VLSI hacking app and Trackify and Sightseer are not in use.
//2411187
//Update for October 2015. Only set browser start state if VLSI, Trackify and Sightseer are not in use.
IF IS_BIT_SET (BitSet_CellphoneTU, g_BSTU_ENABLE_MP_TRACKIFY) = FALSE
AND g_bEnableHackingApp = FALSE
AND IS_BIT_SET (BitSet_CellphoneTU, g_BSTU_ENABLE_MP_SIGHTSEER_APP) = FALSE
AND IS_BIT_SET (BitSet_CellphoneTU, g_BSTU_ENABLE_MP_PRES_EXTRACTION_APP) = FALSE
//November 2015 url:bugstar:2554214 Update. This was only for the duration of Lowrider. Removing quick launch link setup.
//g_BrowserLinkToLaunch = "WWW_BENNYSORIGINALMOTORWORKS_COM"
//g_BrowserStartState = SBSS_Launch_Link
ENDIF
//VLSI and Trackfiy have dedicated apps, Sightseer doesn't. Void any app launch if its availability bit is true bug signal that the app has been selected.
IF IS_BIT_SET (BitSet_CellphoneTU, g_BSTU_ENABLE_MP_SIGHTSEER_APP) = TRUE
AND IS_BIT_SET (BitSet_CellphoneTU, g_BSTU_ENABLE_MP_TRACKIFY) = FALSE
AND g_bEnableHackingApp = FALSE
AND IS_BIT_SET (BitSet_CellphoneTU, g_BSTU_ENABLE_MP_PRES_EXTRACTION_APP) = FALSE
AND IS_BIT_SET (BitSet_CellphoneTU, g_BSTU_ENABLE_MP_SECUROSERV_HACK_APP) = FALSE
b_AppLaunchVoided = TRUE
#if IS_DEBUG_BUILD
cdPrintstring("CELLPHONE_FH - g_BSTU_ENABLE_MP_SIGHTSEER_APP is set, voiding normal app launch procedure but setting signal bit for external check")
cdPrintnl()
#endif
SET_BIT (BitSet_CellphoneTU, g_BSTU_MP_SIGHTSEER_APP_HAS_LAUNCHED)
ENDIF
ENDIF
#endif
IF NOT IS_ENTITY_DEAD (PLAYER_PED_ID())
IF GET_PED_CONFIG_FLAG(PLAYER_PED_ID(), PCF_IsAimingGun) //Don't allow camera launch if player is aiming gun in MP. See bug 495833.
OR IS_PLAYER_FREE_AIMING(PLAYER_ID()) //2071256
IF SelectedAppIndex = ENUM_TO_INT (appCAMERA)
b_AppLaunchVoided = TRUE
ENDIF
ENDIF
ENDIF
// KGM 8/2/13: RaceToPoint app removed from game. Left the 'disable' functionality commented out for now. Bug added to clean up this up entirely if the app is gone for good.
// IF SelectedAppIndex = ENUM_TO_INT (AppMPRACETOPOINT)
//
//
// IF IS_BIT_SET (BitSet_CellphoneDisplay_Continued, g_BSC_DISABLE_APPMPRACETOPOINT)
//
// #if IS_DEBUG_BUILD
// cdPrintnl()
// cdPrintstring("CELLPHONE_FH - AppMPRaceToPoint has been disabled from script. Launch voided.")
// cdPrintnl()
// #endif
//
// b_AppLaunchVoided = TRUE
//
// ENDIF
//
//
// ENDIF
// ----- Grey out and block apps if needed -----
#IF FEATURE_GEN9_EXCLUSIVE
IF IS_PLAYER_ON_MP_INTRO()
IF SelectedAppIndex = ENUM_TO_INT(AppJIPMP)
b_AppLaunchVoided = TRUE
IF NOT IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("G9_JIP_BLOCK")
PRINT_HELP("G9_JIP_BLOCK")
ENDIF
ENDIF
IF SelectedAppIndex = ENUM_TO_INT(AppINTERNET)
b_AppLaunchVoided = TRUE
IF NOT IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("G9_WEB_BLOCK")
PRINT_HELP("G9_WEB_BLOCK")
ENDIF
ENDIF
ENDIF
#ENDIF
#IF FEATURE_FIXER
IF (g_bBlockInternetApp)
AND SelectedAppIndex = ENUM_TO_INT(AppINTERNET)
b_AppLaunchVoided = TRUE
STRING _strBlockInternetHelpText = GET_BLOCK_INTERNET_APP_HELP_TEXT()
IF NOT IS_THIS_HELP_MESSAGE_BEING_DISPLAYED(_strBlockInternetHelpText)
PRINT_HELP(_strBlockInternetHelpText)
ENDIF
ENDIF
#ENDIF
//url:bugstar:7423972 - Re-theme player phone in GTAO when using the custom Franklin or Lamar model.
//As we force theme and wallpaper overrides for MP Franklin and Lamar, we need to prevent the player accessing the Settings
//app and seeing behind the magic. There would be a mismatch between what the app says and what the phone is presenting.
IF IS_MP_PHONE_OWNER_PLAYING_AS_FRANKLIN_LAMAR()
IF SelectedAppIndex = ENUM_TO_INT(AppSETTINGS)
//Could add more apps to void with an OR here.
//This message is generic so can be used for various blocked apps.
IF NOT IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("FIX_MPCHAR_BLCK")
PRINT_HELP("FIX_MPCHAR_BLCK")
ENDIF
b_AppLaunchVoided = TRUE
#if IS_DEBUG_BUILD
cdPrintstring("CELLPHONE_FH - Attempting to launch Settings App, but IS_MP_PHONE_OWNER_PLAYING_AS_FRANKLIN_LAMAR is true! Voiding.")
cdPrintnl()
#endif
ENDIF
ENDIF
IF b_AppLaunchVoided = FALSE //go ahead and launch...
//Switch the other option off, in case any other app has neglected to...
LEGACY_SCALEFORM_MOVIE_METHOD_WITH_NUMBER_AND_STRING (SF_MovieIndex, "SET_SOFT_KEYS", BADGER_OTHER, 0,
1, INVALID_SCALEFORM_PARAM, INVALID_SCALEFORM_PARAM) //"Error!" - Other
CLEAR_BIT (BitSet_CellphoneDisplay, g_BS_OTHER_OPTION_IS_DISPLAYED)
g_CellPhone.PhoneDS = PDS_RUNNINGAPP
#if IS_DEBUG_BUILD
cdPrintnl()
cdPrintstring("STATE ASSIGNMENT 1. Cellphone Flashhand assigns PDS_RUNNINGAPP")
cdPrintnl()
#endif
IF IS_BIT_SET (BitSet_CellphoneDisplay, g_BS_WAITING_ON_APP_TO_LOAD)
#if IS_DEBUG_BUILD
cdPrintnl()
cdPrintstring("CELLPHONE_FH - WARNING! Already waiting on mp app to load, can't request another app script.")
cdPrintnl()
#endif
ELSE
Play_Select_Beep()
REQUEST_SCRIPT (g_AppList[SelectedAppIndex].AppScriptName)
SET_BIT (BitSet_CellphoneDisplay, g_BS_WAITING_ON_APP_TO_LOAD)
ENDIF
ELSE
IF SelectedAppIndex = ENUM_TO_INT (appINTERNET) //#1253886 - put this back in if we need to reinstate translucent help on a global basis. #1473119
OR SelectedAppIndex = ENUM_TO_INT (appCAMERA)
//IF g_savedGlobals.sCellphoneSettingsData.b_MP_HasTranslucentIconHelpBeenDisplayed = FALSE
//PRINT_HELP ("CELL_36") //Removed by the request of Les bug #1473119
//g_savedGlobals.sCellphoneSettingsData.b_MP_HasTranslucentIconHelpBeenDisplayed = TRUE
//ENDIF
ENDIF
Play_Back_Beep()
#if IS_DEBUG_BUILD
cdPrintnl()
cdPrintstring("CELLPHONE_FH - Chosen MP app launch has been voided.")
cdPrintnl()
#endif
ENDIF
/* This form of request seems to cause a tiny pause on 360 due to the rendering taking place within flashhand. WAIT (0) can't be used.
// Therefore flashhand needs to use a bit system.
request_load_scriptstring (g_AppList[SelectedAppIndex].AppScriptName)
Application_Thread = START_NEW_SCRIPT (g_AppList[SelectedAppIndex].AppScriptName, DEFAULT_STACK_SIZE)
SET_SCRIPT_AS_NO_LONGER_NEEDED (g_AppList[SelectedAppIndex].AppScriptName)
//Force clock update for transition to miniature clock on scaleform display view state change.
ClockThrottleMins = 99
*/
ENDIF
ELSE
//SP specific voids_________________________________________________________________________________________________________________
SWITCH INT_TO_ENUM (enumApplicationList, SelectedAppIndex)
CASE appCamera
IF g_bTaxiCamIs1stPerson = TRUE
b_AppLaunchVoided = TRUE
#if IS_DEBUG_BUILD
cdPrintnl()
cdPrintstring("CELLPHONE_FH - Camera app cannot be launched while in SP taxi first person mode.")
cdPrintnl()
#endif
ENDIF
BREAK
//Temporary placeholder! ST 14.03.13
CASE appOrganiser
b_AppLaunchVoided = TRUE //Temporary void for 1169532, removal of organiser and insertion of placeholder app.
#if IS_DEBUG_BUILD
cdPrintnl()
cdPrintstring("CELLPHONE_FH - This placeholder app has temporarily been disabled. No script requested or launched.")
cdPrintnl()
#endif
BREAK
CASE appPAUSEMAP
b_AppLaunchVoided = TRUE
#if IS_DEBUG_BUILD
cdPrintnl()
cdPrintstring("CELLPHONE_FH - The chosen app has temporarily been disabled. No script requested or launched.")
cdPrintnl()
#endif
BREAK
CASE appSNIPER
b_AppLaunchVoided = TRUE
SET_BIT (BitSet_CellphoneDisplay, g_BS_SNIPER_APP_SELECTED)
#if IS_DEBUG_BUILD
cdPrintnl()
cdPrintstring("CELLPHONE_FH - Sniper app integrated within mission. No script requested or launched.")
cdPrintnl()
#endif
BREAK
CASE appSIDETASK
b_AppLaunchVoided = TRUE
#if IS_DEBUG_BUILD
cdPrintnl()
cdPrintstring("CELLPHONE_FH - The chosen app has temporarily been disabled. No script requested or launched.")
cdPrintnl()
#endif
BREAK
CASE appQUICKSAVE
b_AppLaunchVoided = TRUE
IF g_b_QuickSaveGreyedOut = FALSE //Make sure quick save is enabled at this time...
IF g_HasCellphoneRequestedSave = FALSE
AND local_Request_for_QuickSave = FALSE
AND g_OnMissionState = MISSION_TYPE_OFF_MISSION
local_Request_for_QuickSave = TRUE
Play_Select_Beep()
IF NOT g_savedGlobals.sCellphoneSettingsData.b_HasQuickSaveHelpBeenDisplayed
/* Comment out requested by bug 907584
SWITCH GET_FLOW_HELP_MESSAGE_STATUS("CELL_33")
CASE FHS_EXPIRED
ADD_HELP_TO_FLOW_QUEUE("CELL_33", FHP_HIGH, 500, DEFAULT_GOD_TEXT_TIME)
BREAK
CASE FHS_DISPLAYED
g_savedGlobals.sCellphoneSettingsData.b_HasQuickSaveHelpBeenDisplayed = TRUE
#if IS_DEBUG_BUILD
cdPrintstring("CELLPHONE_FH - QuickSave help has been displayed. Saved global set.")
cdPrintnl()
#endif
BREAK
ENDSWITCH
*/
ENDIF
#if IS_DEBUG_BUILD
PRINTNL()
PRINTLN("\nCELLPHONE has requested quick save via [", GET_THIS_SCRIPT_NAME(), "] homescreen icon. Setting g_HasCellphoneRequestedSave to TRUE")
PRINTNL()
#endif
ELSE
#if IS_DEBUG_BUILD
PRINTNL()
PRINTLN("\nCELLPHONE has requested another quicksave but g_HasCellphoneRequestedSave was already set to true!")
PRINTNL()
#endif
ENDIF
ELSE
Play_Back_Beep()
#if IS_DEBUG_BUILD
PRINTNL()
PRINTLN("\nAttempted quick save via [", GET_THIS_SCRIPT_NAME(), "] but homescreen icon is greyed out.")
PRINTNL()
#endif
ENDIF
BREAK
/*
CASE appCAMERA
IF NOT IS_PED_INJURED (PLAYER_PED_ID())
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
b_AppLaunchVoided = TRUE
#if IS_DEBUG_BUILD
cdPrintnl()
cdPrintstring("CELLPHONE_FH - Camera App chosen but won't launch if player in vehicle.")
cdPrintnl()
#endif
ENDIF
ENDIF
BREAK
*/
DEFAULT
#if IS_DEBUG_BUILD
cdPrintnl()
cdPrintstring("CELLPHONE_FH - Chosen app should be launched. No void applied.")
cdPrintnl()
#endif
BREAK
ENDSWITCH
//Special case for Lester 1B. Only that mission will be setting this to TRUE. The mission requires appContacts only.
IF CAN_USE_MOBILE_PHONE_DURING_CUTSCENE()
IF (INT_TO_ENUM (enumApplicationList, SelectedAppIndex)) <> appCONTACTS
b_AppLaunchVoided = TRUE
#if IS_DEBUG_BUILD
cdPrintnl()
cdPrintstring("CELLPHONE_FH - Chosen app launch has been voided due to special case CAN_USE_MOBILE_PHONE_DURING_CUTSCENE")
cdPrintnl()
#endif
ENDIF
ENDIF
IF IS_CURRENTLY_ON_MISSION_OF_TYPE (MISSION_TYPE_DIRECTOR)
IF (INT_TO_ENUM (enumApplicationList, SelectedAppIndex)) <> appCamera
AND (INT_TO_ENUM (enumApplicationList, SelectedAppIndex)) <> AppMPJOBLIST //2411448
b_AppLaunchVoided = TRUE
#if IS_DEBUG_BUILD
cdPrintnl()
cdPrintstring("CELLPHONE_FH - Chosen app launch has been voided as we are in Director Mode and app launch was not appCamera.")
cdPrintnl()
#endif
ENDIF
ENDIF
IF b_AppLaunchVoided = FALSE //go ahead and launch...
Play_Select_Beep()
//Switch the other option off, in case any other app has neglected to...
LEGACY_SCALEFORM_MOVIE_METHOD_WITH_NUMBER_AND_STRING (SF_MovieIndex, "SET_SOFT_KEYS", BADGER_OTHER, 0,
1, INVALID_SCALEFORM_PARAM, INVALID_SCALEFORM_PARAM) //"Error!" - Other
CLEAR_BIT (BitSet_CellphoneDisplay, g_BS_OTHER_OPTION_IS_DISPLAYED)
g_CellPhone.PhoneDS = PDS_RUNNINGAPP
#if IS_DEBUG_BUILD
cdPrintnl()
cdPrintstring("STATE ASSIGNMENT 2. Cellphone Flashhand assigns PDS_RUNNINGAPP")
cdPrintnl()
#endif
IF IS_BIT_SET (BitSet_CellphoneDisplay, g_BS_WAITING_ON_APP_TO_LOAD)
#if IS_DEBUG_BUILD
cdPrintnl()
cdPrintstring("CELLPHONE_FH - WARNING! Already waiting on SP app to load, can't request another app script.")
cdPrintnl()
#endif
ELSE
REQUEST_SCRIPT (g_AppList[SelectedAppIndex].AppScriptName)
SET_BIT (BitSet_CellphoneDisplay, g_BS_WAITING_ON_APP_TO_LOAD)
//Add in timer for bug 2378079 - new content starts.
/*
IF ARE_STRINGS_EQUAL ("appInternet", g_AppList[SelectedAppIndex].AppScriptName)
AppLaunch_StartTime = GET_GAME_TIMER()
#if IS_DEBUG_BUILD
cdPrintnl()
cdPrintstring("CELLPHONE_FH - App_Launch_StartTime grabbed.")
cdPrintnl()
#endif
ENDIF
*/
//2378079 - new content ends.
ENDIF
/* This form of request seems to cause a tiny pause on 360 due to the rendering taking place within flashhand. WAIT (0) can't be used.
// Therefore flashhand needs to use a bit system.
request_load_scriptstring (g_AppList[SelectedAppIndex].AppScriptName)
Application_Thread = START_NEW_SCRIPT (g_AppList[SelectedAppIndex].AppScriptName, DEFAULT_STACK_SIZE)
SET_SCRIPT_AS_NO_LONGER_NEEDED (g_AppList[SelectedAppIndex].AppScriptName)
//Force clock update for transition to miniature clock on scaleform display view state change.
ClockThrottleMins = 99
*/
ELSE
IF SelectedAppIndex <> ENUM_TO_INT(AppQuicksave) //Quicksave handled separately above, its app launch is always voided, it just sets a flag rather than launching an associated script.
IF g_savedGlobals.sCellphoneSettingsData.b_HasTranslucentIconHelpBeenDisplayed = FALSE
IF GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH ("paparazzo3b")) > 0 //Now putting cover specific help in for Paparazzo 3B - See bug 520630
IF SelectedAppIndex = ENUM_TO_INT (appCAMERA)
IF IS_PLAYER_PLAYING (PLAYER_ID())
IF IS_PED_IN_COVER(PLAYER_PED_ID())
PRINT_HELP ("CELL_38") //You cannot use Snapmatic app whilst in cover...
g_savedGlobals.sCellphoneSettingsData.b_HasTranslucentIconHelpBeenDisplayed = TRUE
#if IS_DEBUG_BUILD
cdPrintnl()
cdPrintstring("CELLPHONE_FH - Paparazzo 3b Specific help text has been sent to display.")
cdPrintnl()
#endif
ENDIF
ENDIF
ENDIF
ENDIF
/* //Removed by the request of Les bug #1473119
SWITCH GET_FLOW_HELP_MESSAGE_STATUS("CELL_36") //Display translucent icon help.
CASE FHS_EXPIRED
ADD_HELP_TO_FLOW_QUEUE("CELL_36", FHP_HIGH, 500, DEFAULT_GOD_TEXT_TIME)
BREAK
CASE FHS_DISPLAYED
g_savedGlobals.sCellphoneSettingsData.b_HasTranslucentIconHelpBeenDisplayed = TRUE
#if IS_DEBUG_BUILD
cdPrintstring("CELLPHONE_FH - Translucent app icon help has been displayed. Saved global set.")
cdPrintnl()
#endif
BREAK
ENDSWITCH
*/
ENDIF
Play_Back_Beep()
ENDIF
#if IS_DEBUG_BUILD
cdPrintnl()
cdPrintstring("CELLPHONE_FH - Chosen app launch has been voided.")
cdPrintnl()
#endif
ENDIF
ENDIF
ELSE
#if IS_DEBUG_BUILD
cdPrintstring("CELLPHONE_FH - Waiting on return value from scaleform. 101")
cdPrintnl()
#endif
ENDIF
ENDPROC
/* Moved to cellphone_private.sch
PROC SetUpPhoneSurroundTint() //Bit daft and inconsistent with colour of blips on radar for character missions. Requested by Stu Petri in url:bugstar:1827354
IF NOT IS_ENTITY_DEAD (PLAYER_PED_ID())
SWITCH g_savedGlobals.sCellphoneSettingsData.This_Cellphone_Owner_Settings[g_Cellphone.PhoneOwner].ThemeForThisPlayer
CASE 1 //Light Blue Theme
SET_PLAYER_PHONE_PALETTE_IDX(PLAYER_ID(), 0)
BREAK
CASE 2 //Green
SET_PLAYER_PHONE_PALETTE_IDX(PLAYER_ID(), 1)
BREAK
CASE 3 //Red
SET_PLAYER_PHONE_PALETTE_IDX(PLAYER_ID(), 2)
BREAK
CASE 4 //Orange
SET_PLAYER_PHONE_PALETTE_IDX(PLAYER_ID(), 3)
BREAK
CASE 5 //Grey
SET_PLAYER_PHONE_PALETTE_IDX(PLAYER_ID(), 4)
BREAK
CASE 6 //Purple
SET_PLAYER_PHONE_PALETTE_IDX(PLAYER_ID(), 5)
BREAK
CASE 7 //Orange
SET_PLAYER_PHONE_PALETTE_IDX(PLAYER_ID(), 6)
BREAK
DEFAULT
//Not setting any pallette here.
BREAK
ENDSWITCH
ENDIF
ENDPROC
*/
PROC StandardBackTo1stPersonOrHudHideChecks()
IF IS_BIT_SET (BitSet_CellphoneDisplay, g_BS_HAS_CELLPHONE_FULLY_MOVED_UP)
AND (g_FirstPersonTransitionOngoing = FALSE)
AND (g_3DPhoneNeedsMovedUp = FALSE)
IF HasGameplayCameraTransitionOccurredDuringCall = FALSE
IF IS_BIT_SET (BitSet_CellphoneDisplay_Continued, g_BSC_CALL_IN_PROGRESS_PHONE_FULLY_VANISHED)
CLEAR_BIT (BitSet_CellphoneDisplay_Continued, g_BSC_CALL_IN_PROGRESS_VANISH_PHONE)
CLEAR_BIT (BitSet_CellphoneDisplay_Continued, g_BSC_CALL_IN_PROGRESS_REINSTATE_PHONE)
CLEAR_BIT (BitSet_CellphoneDisplay_Continued, g_BSC_CALL_IN_PROGRESS_PHONE_ALREADY_SIGNALLED_TO_VANISH_BY_DH)
CLEAR_BIT (BitSet_CellphoneDisplay_Continued, g_BSC_CALL_IN_PROGRESS_PHONE_FULLY_VANISHED)
IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID())
IF NOT IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
LaunchTransitionMoveUpIfRequired()
//g_3DPhoneNeedsMovedUp = TRUE //Cues movement up screen.
#if IS_DEBUG_BUILD
cdPrintnl()
cdPrintstring("CELLPHONE_FH - Now in first person on foot after phone vanished in 3rd person during call. Emergency move up cued.")
cdPrintnl()
#endif
ELSE
IF ShouldFirstPersonPhoneHudMovementBeHidden() = FALSE //This vehicle is not no-hud compatible in first person. Move phone up if need be.
LaunchTransitionMoveUpIfRequired()
#if IS_DEBUG_BUILD
cdPrintnl()
cdPrintstring("CELLPHONE_FH - Now in first person on no_hud compatible vehicle after phone vanished in 3rd person during call. Emergency move up cued.")
cdPrintnl()
#endif
//g_3DPhoneNeedsMovedUp = TRUE //Cues movement up screen.
ENDIF
ENDIF
ENDIF
#if IS_DEBUG_BUILD
cdPrintnl()
cdPrintstring("CELLPHONE_FH - Now in first person after phone vanished in 3rd person during call. Emergency move up cued.")
cdPrintnl()
#endif
ENDIF
ENDIF
//Put in vehicle check exceptions here. Elsewhere, need to check being in first person, then swapping vehicles.
//Possibly just an OR call to ShouldFirstPersonPhoneHudMovementBeHidden() = FALSE
IF g_Cellphone.PhoneDS = PDS_ATTEMPTING_TO_CALL_CONTACT
OR g_Cellphone.PhoneDS = PDS_ONGOING_CALL
//Removed for 2038700 - Search on this if this needs to go back in again.
/*
IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID())
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID()) //If we're in a first person no_hud compatible vehicle and on call, move the phone back down again...
OR g_ConversationStatus = CONV_STATE_WAITING_ON_PLAYER_ACCREJ //2031019
IF ShouldFirstPersonPhoneHudMovementBeHidden()
LaunchTransitionMoveDownIfRequired()
ENDIF
ENDIF
ENDIF
#if IS_DEBUG_BUILD
cdPrintstring("CELLPHONE_FH - IsCurrentCamFirstPerson now returning TRUE. Unless player in compatible no-hud vehicle or ACC_REJ convstate, Transition aborted as player on call.")
cdPrintnl()
#endif
*/
//Added for 2038700
IF ShouldFirstPersonPhoneHudMovementBeHidden()
LaunchTransitionMoveDownIfRequired()
#if IS_DEBUG_BUILD
cdPrintstring("CELLPHONE_FH - IsCurrentCamFirstPerson now returning TRUE. Transition to 1st Person on call state cued.")
cdPrintnl()
#endif
ENDIF
ELSE
IF IS_CELLPHONE_CAMERA_IN_USE()
#if IS_DEBUG_BUILD
cdPrintstring("CELLPHONE_FH - IsCurrentCamFirstPerson now returning TRUE but Snapmatic in use. Transition to 1st Person occurred whilst phone was up.")
cdPrintnl()
#endif
ELSE
IF ShouldFirstPersonPhoneHudMovementBeHidden() //New!
LaunchTransitionMoveDownIfRequired()
ENDIF
//g_FirstPersonTransitionOngoing = TRUE //Cues movement off screen whilst in first person mode.
#if IS_DEBUG_BUILD
cdPrintstring("CELLPHONE_FH - IsCurrentCamFirstPerson now returning TRUE. Transition to 1st Person occurred whilst phone was up.")
cdPrintnl()
#endif
ENDIF
ENDIF
IF g_Cellphone.PhoneDS = PDS_ONGOING_CALL
IF g_IsThisAnMPChatCall = FALSE //Do not let this impact "hands free" mode in SP/MP chat calls.
HasGameplayCameraTransitionOccurredDuringCall = TRUE
//The above is dangerous if checked improperly! May need to have a global to reset the hide timer in dialog handler!
#if IS_DEBUG_BUILD
cdPrintstring("CELLPHONE_FH - HasGameplayCameraTransitionOccurredDuringCall has been set to TRUE. Camera transitioned to 1st person during ongoing call.")
cdPrintnl()
#endif
ENDIF
ENDIF
ENDIF
ENDPROC
PROC StandardBackTo3rdPersonorHudShownChecks()
IF IS_BIT_SET (BitSet_CellphoneDisplay, g_BS_HAS_CELLPHONE_FULLY_MOVED_UP)
AND (g_FirstPersonTransitionOngoing = FALSE)
AND (g_3DPhoneNeedsMovedUp = FALSE)
IF IS_CELLPHONE_CAMERA_IN_USE()
//Put in vehicle check exceptions here. Elsewhere, need to check being in first person, then swapping vehicles.
//Possibly just an OR call to ShouldFirstPersonPhoneHudMovementBeHidden() = FALSE
/*
#if IS_DEBUG_BUILD
cdPrintstring("CELLPHONE_FH - IsCurrentCamFirstPerson now returning FALSE. Transition aborted as vanish bits were set or Snapmatic running.")
cdPrintnl()
#endif
*/
ELSE
LaunchTransitionMoveUpIfRequired()
//g_3DPhoneNeedsMovedUp = TRUE //Cues movement up screen.
#if IS_DEBUG_BUILD
cdPrintstring("CELLPHONE_FH - IsCurrentCamFirstPerson now returning FALSE. Transition to 3rd Person occurred whilst phone was up.")
cdPrintnl()
#endif
ENDIF
IF g_Cellphone.PhoneDS = PDS_ONGOING_CALL
IF g_IsThisAnMPChatCall = FALSE //Do not let this impact "hands free" mode in SP/MP chat calls.
HasGameplayCameraTransitionOccurredDuringCall = TRUE
#if IS_DEBUG_BUILD
cdPrintstring("CELLPHONE_FH - HasGameplayCameraTransitionOccurredDuringCall has been set to TRUE. Camera transitioned to 3rd person during ongoing call.")
cdPrintnl()
#endif
ENDIF
ENDIF
ENDIF
ENDPROC
SCRIPT
//Ensure this script persists during network game
NETWORK_SET_SCRIPT_IS_SAFE_FOR_NETWORK_GAME()
g_ForcedContactSelection = NO_CHARACTER //clear out any forced character selections in appContacts. Done here so that end-user can check if phone is onscreen, rather than
//AppContacts running before forcing a selection.
//Clear "triangle displayed" bit and other miscellaneous phone status flags.
CLEAR_BIT (BitSet_CellphoneDisplay_Continued, g_BSC_CELLPHONE_THREEQUARTERS_UP)
CLEAR_BIT (BitSet_CellphoneDisplay, g_BS_HAS_CELLPHONE_FULLY_MOVED_UP)
CLEAR_BIT (BitSet_CellphoneTU, g_BSTU_QUICK_LAUNCH_SNAPMATIC)
CLEAR_BIT (BitSet_CellphoneDisplay_Continued, g_BSC_LAUNCH_APPINTERNET_ON_RETURN_TO_PDS_MAXIMUM)
CLEAR_BIT (BitSet_CellphoneDisplay, g_BS_OTHER_OPTION_IS_DISPLAYED)
CLEAR_BIT (BitSet_CellphoneDisplay, g_BS_SENDING_CELLPHONE_CAM_PIC)
CLEAR_BIT (BitSet_CellphoneDisplay, g_BS_SNIPER_APP_SELECTED)
CLEAR_BIT (BitSet_CellphoneDisplay, g_BS_WAITING_ON_APP_TO_LOAD)
CLEAR_BIT (BitSet_CellphoneDisplay_Continued, g_BSC_CALL_IN_PROGRESS_VANISH_PHONE)
CLEAR_BIT (BitSet_CellphoneDisplay_Continued, g_BSC_CALL_IN_PROGRESS_REINSTATE_PHONE)
CLEAR_BIT (BitSet_CellphoneDisplay_Continued, g_BSC_CALL_IN_PROGRESS_PHONE_ALREADY_SIGNALLED_TO_VANISH_BY_DH)
CLEAR_BIT (BitSet_CellphoneDisplay_Continued, g_BSC_CALL_IN_PROGRESS_PHONE_FULLY_VANISHED)
CLEAR_BIT (BitSet_CellphoneDisplay, g_BS_MOVE_PHONE_DOWN_INSTANTLY) //Precautionary clear for bug 1362605
g_LaunchContactsFromTextMessage = FALSE //1636892
LaunchContactsFromTextMessage_LocalSignal = FALSE
DRAW_LOW_QUALITY_PHOTO_TO_PHONE(FALSE) //Make sure we aren't rendering any photo images to the phone.
SCRIPT_IS_MOVING_MOBILE_PHONE_OFFSCREEN (FALSE) //See bug 740666
g_Phone_Blocked_While_Moving_Down = FALSE
b_Waiting_On_SF_Return_Value = FALSE
//Do not reset this as it may override setting from dialogue handler.
//CLEAR_BIT (BitSet_CellphoneDisplay, g_BS_PROMPT_FLASHHAND_TO_PLAY_REMOTE_RING)
//These additions added for 295259. The first is a simple emergency flag that doesn't rely on the phone state to signal to applications that this script is waiting on
//them to use abnormal exit to clear up, the second tidies up the abort flag next time the phone is launched if the preceding launch of this script resulted in an
//aborted call.
g_Cellphone_FH_Needs_To_Exit = FALSE
g_Attempted_Call_Aborted = FALSE
g_B_ForcedAway = FALSE
Get_Cellphone_Owner()
//#1392094 swap
//g_Phone_Ringtone_SoundID = GET_SOUND_ID() //This has to be done before the movies are requested in case they fail to load and RELEASE_SOUND_ID is called. See bug #455304
//Pocket work.
g_3dPhoneRotVec = g_3dPhonePocketRotVec
Previous_SelectedAppCursorPos_PageOne = 4 // Set default cursor position to centre on page one.
Previous_SelectedAppCursorPos_PageTwo = 0 // Set default cursor position to the first icon on page two.
g_LastUsed_Homescreen_Page_Precedence = 1
AppCursorIndex = Previous_SelectedAppCursorPos_PageOne
//Imported from cellphone_controller.sc
IF g_B_Scaleform_Movies_Loaded = FALSE
g_B_External_Interrupt_Autoplay_MovieFail_Flag = FALSE
#if IS_DEBUG_BUILD
cdPrintstring ("CELLPHONE_FH - About to request cellphone scaleform movies...")
cdPrintnl ()
cdPrintnl ()
#endif
#if IS_DEBUG_BUILD
IF b_DebugCellphoneGuiInfo
SF_MovieIndex = REQUEST_SCALEFORM_MOVIE (ScaleformDebugMovie[DebugCellphoneGui])
ELSE
#endif
IF g_bInMultiplayer
//SET_PLAYER_TEAM(PLAYER_ID(), 0)
// Freemode (and, by default, any other modes we add)
//url:bugstar:7423972 - Re-theme player phone in GTAO when using the custom Franklin or Lamar model.
//Default the cellphone operating system to Badger if playing as Franklin or Lamar in MP.
IF IS_MP_PHONE_OWNER_PLAYING_AS_FRANKLIN_LAMAR()
SF_MovieIndex = REQUEST_SCALEFORM_MOVIE ("cellphone_badger")
ELSE
SF_MovieIndex = REQUEST_SCALEFORM_MOVIE ("cellphone_ifruit")
ENDIF
ThemeDecision = 1
IF ThemeDecision = 1
#if IS_DEBUG_BUILD
cdPrintstring("Theme definitely at 1.")
cdPrintnl()
#endif
ENDIF
ELSE //Select movie based on singleplayer character...
IF g_Use_Prologue_Cellphone
//Perhaps add another failsafe by only allowing this to be set if Prologue1.sc is running?
g_b_ToggleButtonLabels = TRUE
SF_MovieIndex = REQUEST_SCALEFORM_MOVIE ("cellphone_prologue")
ELSE
SF_MovieIndex = REQUEST_SCALEFORM_MOVIE (g_savedGlobals.sCellphoneSettingsData.This_Cellphone_Owner_Settings[g_Cellphone.PhoneOwner].ScaleformOS_Movie_Name)
//LEGACY_SCALEFORM_MOVIE_METHOD_WITH_NUMBER (SF_MovieIndex, "SET_BACKGROUND_IMAGE", 3)
ENDIF
ENDIF
#if IS_DEBUG_BUILD
ENDIF
#endif
//SF_MovieButtonsIndex = REQUEST_SCALEFORM_MOVIE ("cellphone_buttons")
//Autoplay_Fix
//Have this timeout and call incident handling routine...
SETTIMERA(0)
//Think about having PDS_MAXIMUM here?
WHILE NOT HAS_SCALEFORM_MOVIE_LOADED (SF_MovieIndex)
AND g_B_External_Interrupt_Autoplay_MovieFail_Flag = FALSE
//OR NOT HAS_SCALEFORM_MOVIE_LOADED (SF_MovieButtonsIndex)
WAIT(0)
IF TIMERA() > 20000
g_B_External_Interrupt_Autoplay_MovieFail_Flag = TRUE
#if IS_DEBUG_BUILD
//SCRIPT_ASSERT ("Scaleform cellphone movie taking too long to load due to lack of memory; cellphone flashhand aborting...")
cdPrintnl()
cdPrintstring ("Scaleform cellphone movie taking too long to load due to lack of memory; cellphone flashhand aborting...")
cdPrintnl()
//This will likely only happen in autoplay scenarios. Script asserts fired by scaleform calls to an unloaded movie will be ignored.
#endif
ENDIF
//2260093 - TODO. Anti tamper measures. If the movie has been set as invalid by code, then only pause for a few seconds before cleaning up the phone.
IF IS_PC_VERSION()
IF DECOR_EXIST_ON(PLAYER_PED_ID(), "Synched")
IF TIMERA() > 2000
g_B_External_Interrupt_Autoplay_MovieFail_Flag = TRUE
#if IS_DEBUG_BUILD
cdPrintnl()
cdPrintstring ("Synched decorator. Flashhand aborting...")
cdPrintnl()
#endif
ENDIF
ENDIF
ENDIF
IF g_InboundCallWaitAccRej = CALL_WAITING_TO_BE_ANSWERED //A call is waiting to be answered, the phone display state is PDS_ONGOING_CALL, player must accept or reject call.
Vibrate_and_Ring_3dPhone()
ENDIF
ENDWHILE
IF g_B_External_Interrupt_Autoplay_MovieFail_Flag = TRUE
IF HAS_SCALEFORM_MOVIE_LOADED (SF_MovieIndex) //This needs to be done here, in case the movie aborts. See bug 740117
//LEGACY_SCALEFORM_MOVIE_METHOD_WITH_NUMBER (SF_MovieIndex, "DISPLAY_VIEW", 0) //Flush out any streamed resources used by cellphone. See bug 535099. Instance 2.
LEGACY_SCALEFORM_MOVIE_METHOD (SF_MovieIndex, "SHUTDOWN_MOVIE")
ENDIF
WAIT (0)
SET_SCALEFORM_MOVIE_AS_NO_LONGER_NEEDED (SF_MovieIndex)
//Tidy up or initialise critical bools...
g_3DPhoneNeedsMovedDown = FALSE
g_B_Scaleform_Movies_Loaded = FALSE
g_Cellphone_Launched_by_Button_Press = FALSE
IF g_savedGlobals.sCellphoneSettingsData.b_HasSleepReminderBeenDisplayed = TRUE
g_savedGlobals.sCellphoneSettingsData.b_HasSleepReminderBeenDisplayed = FALSE
CLEAR_FLOATING_HELP (FLOATING_HELP_TEXT_ID_1)
ENDIF
g_Cellphone_FH_Needs_To_Exit = TRUE
g_Cellphone.PhoneDS = PDS_AWAY
#if IS_DEBUG_BUILD
cdPrintnl()
cdPrintstring("STATE ASSIGNMENT 56. Cellphone_flashhand assigns PDS_AWAY")
cdPrintnl()
#endif
//Maybe force a reply here?
KILL_ANY_CONVERSATION()
#if IS_DEBUG_BUILD
cdPrintnl()
cdPrintstring ("CELLPHONE_FLASHHAND Cellphone flashhand aborting... Autoplay Fail has been tripped by dialogue handler phone launch or movie taking too long to load. ")
cdPrintnl()
#endif
g_b_ToggleButtonLabels = FALSE
//Get rid of the cellphone 3d model from below the screen.
DESTROY_MOBILE_PHONE ()
CLEAR_BIT (BitSet_CellphoneDisplay, g_BS_SENDING_CELLPHONE_CAM_PIC)
CLEAR_BIT (BitSet_CellphoneDisplay, g_BS_PROMPT_FLASHHAND_TO_PLAY_REMOTE_RING)
CLEAR_BIT (BitSet_CellphoneDisplay, g_BS_MOVE_PHONE_DOWN_INSTANTLY)
CLEAR_BIT (BitSet_CellphoneDisplay_Continued, g_BSC_FINISHED_CALL_RETURNS_TO_HOMESCREEN)
CLEAR_BIT (BitSet_CellphoneDisplay_Continued, g_BSC_PLAY_INTERFERENCE_AUDIO)
CLEAR_BIT (BitSet_CellphoneDisplay_Third, g_BSTHIRD_DO_NOT_MOVE_PHONE_UP_ON_LAUNCH)
//CLEAR_BIT (BitSet_CellphoneDisplay_Third, g_CELLPHONE_MOVIE_STREAMING_IN) //Comment in for resolution of 1135663
IF NOT IS_ENTITY_DEAD (PLAYER_PED_ID())
//STOP_SOUND (g_Phone_Ringtone_SoundID) ////#1392094 swap
STOP_PED_RINGTONE (PLAYER_PED_ID())
ENDIF
IF IS_ENTITY_DEAD (PLAYER_PED_ID())
//STOP_SOUND (g_Phone_Ringtone_SoundID) ////#1392094 swap
STOP_PED_RINGTONE (PLAYER_PED_ID())
ENDIF
//#1392094 swap
//RELEASE_SOUND_ID (g_Phone_Ringtone_SoundID)
g_Phone_Active_but_Hidden = FALSE
g_ShouldForceSelectionOfLatestAppItem = FALSE
CellphoneAppAutoLaunchType = ACT_APP_NONE
g_IsThisAnMPChatCall = FALSE //This has been moved here for 2111525. It was required so that the hands free handler is definitely reset.
SCRIPT_END_A_VOICE_SESSION() //1617499 Make sure that a script hang up also terminates a chat call. Check incoming call stage?
CLEAR_VOICE_SESSION_STRUCT() //Fix for 1891329.
g_FirstPersonTransitionOngoing = FALSE
#if IS_DEBUG_BUILD
cdPrintString ("g_IsThisAnMPChatCall assigned to false from Cellphone_Flashhand 2... 2111525")
cdPrintnl()
cdPrintnl()
#endif
//Quit this script.
TERMINATE_THIS_THREAD()
ENDIF //end of g_B_External_Interrupt_Autoplay_MovieFail_Flag = TRUE condition check
//Set up temporary button sizes for badger theme
//IF g_savedGlobals.sCellphoneSettingsData.This_Cellphone_Owner_Settings[g_Cellphone.PhoneOwner].OSTypeForThisPlayer = OS_BADGER
g_SF_ButtonsPosX = 0.1
g_SF_ButtonsPosY = 0.380//0.285//0.334
g_SF_ButtonsSizeX = 0.195
g_SF_ButtonsSizeY = 0.050
//ENDIF
IF IS_XBOX360_VERSION()
OR IS_XBOX_PLATFORM()
OR IS_PC_VERSION() //This will make next gen PC version use the same soft key colouring as the Xbox 360 version. Requested by NG bug 1702846
GET_HUD_COLOUR (HUD_COLOUR_GREEN, TempColR, TempColG, TempColB, TempColA )
LEGACY_SCALEFORM_MOVIE_METHOD_WITH_NUMBER (SF_MovieIndex, "SET_SOFT_KEYS_COLOUR", BADGER_POS, TO_FLOAT(TempColR), TO_FLOAT(TempColG), TO_FLOAT(TempColB))
//GET_HUD_COLOUR (HUD_COLOUR_YELLOW, TempColR, TempColG, TempColB, TempColA )
GET_HUD_COLOUR (HUD_COLOUR_BLUE, TempColR, TempColG, TempColB, TempColA ) //if we change to using 360 X, swap over
LEGACY_SCALEFORM_MOVIE_METHOD_WITH_NUMBER (SF_MovieIndex, "SET_SOFT_KEYS_COLOUR", BADGER_OTHER, TO_FLOAT(TempColR), TO_FLOAT(TempColG), TO_FLOAT(TempColB))
GET_HUD_COLOUR (HUD_COLOUR_RED, TempColR, TempColG, TempColB, TempColA )
LEGACY_SCALEFORM_MOVIE_METHOD_WITH_NUMBER (SF_MovieIndex, "SET_SOFT_KEYS_COLOUR", BADGER_NEG, TO_FLOAT(TempColR), TO_FLOAT(TempColG), TO_FLOAT(TempColB))
ELSE //PS3.... PC?
//Swapped over to this rather than the legacy compile flag after discussion with Ryan Elliott.
IF NOT IS_JAPANESE_VERSION()
GET_HUD_COLOUR (HUD_COLOUR_BLUE, TempColR, TempColG, TempColB, TempColA )//Cross getting used for accept and positive
LEGACY_SCALEFORM_MOVIE_METHOD_WITH_NUMBER (SF_MovieIndex, "SET_SOFT_KEYS_COLOUR", BADGER_POS, TO_FLOAT(TempColR), TO_FLOAT(TempColG), TO_FLOAT(TempColB))
//GET_HUD_COLOUR (HUD_COLOUR_GREENLIGHT, TempColR, TempColG, TempColB, TempColA )
GET_HUD_COLOUR (HUD_COLOUR_PINKLIGHT, TempColR, TempColG, TempColB, TempColA ) //Square getting used for centre button. Other options usually.
LEGACY_SCALEFORM_MOVIE_METHOD_WITH_NUMBER (SF_MovieIndex, "SET_SOFT_KEYS_COLOUR", BADGER_OTHER, TO_FLOAT(TempColR), TO_FLOAT(TempColG), TO_FLOAT(TempColB))
GET_HUD_COLOUR (HUD_COLOUR_RED, TempColR, TempColG, TempColB, TempColA ) //Circle getting used for exit, negative and back.
LEGACY_SCALEFORM_MOVIE_METHOD_WITH_NUMBER (SF_MovieIndex, "SET_SOFT_KEYS_COLOUR", BADGER_NEG, TO_FLOAT(TempColR), TO_FLOAT(TempColG), TO_FLOAT(TempColB))
#if IS_DEBUG_BUILD
cdPrintnl()
cdPrintnl()
cdPrintstring("CELLPHONE_FLASHHAND IJV Aug 21: - Setting EU/US SOFTKEY colours")
cdPrintnl()
cdPrintnl()
#endif
ENDIF
//For the frontend circle to proceed convention crossing over to the phone, comment this one in! #1571352
//Swapped over to this rather than the legacy compile flag after discussion with Ryan Elliott.
IF IS_JAPANESE_VERSION()
//Bug 7237325. Only apply this soft key colour swap in legacy Orbis builds that used the colouring model specific for the Japanese market.
#IF NOT FEATURE_GEN9_RELEASE
GET_HUD_COLOUR (HUD_COLOUR_RED, TempColR, TempColG, TempColB, TempColA )//Cross getting used for accept and positive
LEGACY_SCALEFORM_MOVIE_METHOD_WITH_NUMBER (SF_MovieIndex, "SET_SOFT_KEYS_COLOUR", BADGER_POS, TO_FLOAT(TempColR), TO_FLOAT(TempColG), TO_FLOAT(TempColB))
GET_HUD_COLOUR (HUD_COLOUR_PINKLIGHT, TempColR, TempColG, TempColB, TempColA ) //Square getting used for centre button. Other options usually.
LEGACY_SCALEFORM_MOVIE_METHOD_WITH_NUMBER (SF_MovieIndex, "SET_SOFT_KEYS_COLOUR", BADGER_OTHER, TO_FLOAT(TempColR), TO_FLOAT(TempColG), TO_FLOAT(TempColB))
GET_HUD_COLOUR (HUD_COLOUR_BLUE, TempColR, TempColG, TempColB, TempColA ) //Circle getting used for exit, negative and back.
LEGACY_SCALEFORM_MOVIE_METHOD_WITH_NUMBER (SF_MovieIndex, "SET_SOFT_KEYS_COLOUR", BADGER_NEG, TO_FLOAT(TempColR), TO_FLOAT(TempColG), TO_FLOAT(TempColB))
#if IS_DEBUG_BUILD
cdPrintnl()
cdPrintnl()
cdPrintstring("CELLPHONE_FLASHHAND - IJV Aug 21: Setting legacy JAPANESE SOFTKEY Circle to Select cellphone option colours")
cdPrintnl()
cdPrintnl()
#endif
#ENDIF
//Bug 7237325. In Gen 9 Japanese, we now use the normal colouring.
#IF FEATURE_GEN9_RELEASE
GET_HUD_COLOUR (HUD_COLOUR_BLUE, TempColR, TempColG, TempColB, TempColA )//Cross getting used for accept and positive
LEGACY_SCALEFORM_MOVIE_METHOD_WITH_NUMBER (SF_MovieIndex, "SET_SOFT_KEYS_COLOUR", BADGER_POS, TO_FLOAT(TempColR), TO_FLOAT(TempColG), TO_FLOAT(TempColB))
GET_HUD_COLOUR (HUD_COLOUR_PINKLIGHT, TempColR, TempColG, TempColB, TempColA ) //Square getting used for centre button. Other options usually.
LEGACY_SCALEFORM_MOVIE_METHOD_WITH_NUMBER (SF_MovieIndex, "SET_SOFT_KEYS_COLOUR", BADGER_OTHER, TO_FLOAT(TempColR), TO_FLOAT(TempColG), TO_FLOAT(TempColB))
GET_HUD_COLOUR (HUD_COLOUR_RED, TempColR, TempColG, TempColB, TempColA ) //Circle getting used for exit, negative and back.
LEGACY_SCALEFORM_MOVIE_METHOD_WITH_NUMBER (SF_MovieIndex, "SET_SOFT_KEYS_COLOUR", BADGER_NEG, TO_FLOAT(TempColR), TO_FLOAT(TempColG), TO_FLOAT(TempColB))
#if IS_DEBUG_BUILD
cdPrintnl()
cdPrintnl()
cdPrintstring("CELLPHONE_FLASHHAND - IJV Aug 21: Setting Gen9 JAPANESE SOFTKEY colours")
cdPrintnl()
cdPrintnl()
#endif
#ENDIF
ENDIF //End of IF IS_JAPANESE_VERSION() check.
//If the JAPANESE build IS allowed to use the CROSS to select a cellphone option convention, comment this one in! #1571352
/*
#IF IS_JAPANESE_BUILD
GET_HUD_COLOUR (HUD_COLOUR_BLUE, TempColR, TempColG, TempColB, TempColA )//Cross getting used for accept and positive
LEGACY_SCALEFORM_MOVIE_METHOD_WITH_NUMBER (SF_MovieIndex, "SET_SOFT_KEYS_COLOUR", BADGER_POS, TO_FLOAT(TempColR), TO_FLOAT(TempColG), TO_FLOAT(TempColB))
GET_HUD_COLOUR (HUD_COLOUR_PINKLIGHT, TempColR, TempColG, TempColB, TempColA ) //Square getting used for centre button. Other options usually.
LEGACY_SCALEFORM_MOVIE_METHOD_WITH_NUMBER (SF_MovieIndex, "SET_SOFT_KEYS_COLOUR", BADGER_OTHER, TO_FLOAT(TempColR), TO_FLOAT(TempColG), TO_FLOAT(TempColB))
GET_HUD_COLOUR (HUD_COLOUR_RED, TempColR, TempColG, TempColB, TempColA ) //Circle getting used for exit, negative and back.
LEGACY_SCALEFORM_MOVIE_METHOD_WITH_NUMBER (SF_MovieIndex, "SET_SOFT_KEYS_COLOUR", BADGER_NEG, TO_FLOAT(TempColR), TO_FLOAT(TempColG), TO_FLOAT(TempColB))
#if IS_DEBUG_BUILD
cdPrintnl()
cdPrintnl()
cdPrintstring("CELLPHONE_FLASHHAND - Setting JAPANESE SOFTKEY Cross to Select cellphone option colours")
cdPrintnl()
cdPrintnl()
#endif
#ENDIF
*/
ENDIF
/*
IF IS_XBOX360_VERSION()
//Xbox 360
LEGACY_SCALEFORM_MOVIE_METHOD_WITH_NUMBER (SF_MovieIndex, "SET_SOFT_KEYS_COLOUR", BADGER_POS, 77, 151, 4)
LEGACY_SCALEFORM_MOVIE_METHOD_WITH_NUMBER (SF_MovieIndex, "SET_SOFT_KEYS_COLOUR", BADGER_OTHER, 197, 147, 0)
LEGACY_SCALEFORM_MOVIE_METHOD_WITH_NUMBER (SF_MovieIndex, "SET_SOFT_KEYS_COLOUR", BADGER_NEG, 166, 4, 0)
ELSE
//PS3 or PC
LEGACY_SCALEFORM_MOVIE_METHOD_WITH_NUMBER (SF_MovieIndex, "SET_SOFT_KEYS_COLOUR", BADGER_POS, 128, 151, 230)
LEGACY_SCALEFORM_MOVIE_METHOD_WITH_NUMBER (SF_MovieIndex, "SET_SOFT_KEYS_COLOUR", BADGER_OTHER, 1, 216, 114)
LEGACY_SCALEFORM_MOVIE_METHOD_WITH_NUMBER (SF_MovieIndex, "SET_SOFT_KEYS_COLOUR", BADGER_NEG, 255, 85, 85)
ENDIF
*/
IF g_B_External_Interrupt_Autoplay_MovieFail_Flag = FALSE
#if IS_DEBUG_BUILD
cdPrintstring ("CELLPHONE_FH - Successfully loaded cellphone scaleform movies...")
cdPrintnl()
cdPrintnl()
#endif
ELSE
#if IS_DEBUG_BUILD
cdPrintstring ("CELLPHONE_FH - FAILED to load cellphone scaleform movies...")
cdPrintnl()
cdPrintnl()
#endif
ENDIF
Create_3dPhoneObject() //Change requested by bug number 310808 - was in cellphone_controller.
IF g_bInMultiplayer //Patch over Phone_SoundSet_Default with Michael's iFruit set for #1613268
g_Owner_Soundset = "Phone_SoundSet_Michael"
ENDIF
g_B_Scaleform_Movies_Loaded = TRUE
//New addition for #1546794
//LEGACY_SCALEFORM_MOVIE_METHOD_WITH_NUMBER (SF_MovieIndex, "SET_THEME", TO_FLOAT(g_savedGlobals.sCellphoneSettingsData.This_Cellphone_Owner_Settings[g_Cellphone.PhoneOwner].ThemeForThisPlayer))
ENDIF
#if IS_DEBUG_BUILD
IF g_bFlowAutoplayInProgress
cdPrintnl()
cdPrintstring ("CELLPHONE_FH - Autoplay enabled. Calls and phone responses will be automatically answered with positive actions.")
cdPrintnl()
ENDIF
#endif
//Force update of cellphone clock.
ClockThrottleMins = 99
Update_Cellphone_Clock_and_Health()
IF IS_PLAYER_PLAYING (PLAYER_ID())
Player_PeriodicHealth = GET_ENTITY_HEALTH (PLAYER_PED_ID())
ENDIF
IF IS_RADAR_HIDDEN()
g_b_RadarWasAlreadyHidden = TRUE
ELSE
g_b_RadarWasAlreadyHidden = FALSE //force reset of this.
//Phone back on RHS, commented out but infrastucture left intact.
//DISPLAY_RADAR (FALSE) //switch off radar so phone can take precedence in left hand corner.
ENDIF
//Flush sleep mode:
LEGACY_SCALEFORM_MOVIE_METHOD_WITH_NUMBER (SF_MovieIndex, "SET_SLEEP_MODE", 0)
//LEGACY_SCALEFORM_MOVIE_METHOD_WITH_NUMBER (SF_MovieIndex, "SET_BACKGROUND_IMAGE", 1)
g_Cellphone_FullScreen_Mode = TRUE
//Second screen, theme, wallpaper and provider setting... Will theme manipulation be disabled in multiplayer?
IF g_bInMultiplayer
g_b_Secondary_Screen_Available = FALSE
//Would need to get theme stat here... MP_STAT_FM_CELLPHONE_THEME
//url:bugstar:7423972 - Re-theme player phone in GTAO when using the custom Franklin or Lamar model.
//Bypass any user defined theme for their own avatar's cellphone and use a default color scheme for Franklin and Lamar.
IF IS_MP_PHONE_OWNER_PLAYING_AS_FRANKLIN_LAMAR()
//Search on This_Cellphone_Owner_Settings_ListContents[fill_index].g_SettingList[ENUM_TO_INT(SETTING_THEME)] to find full theme definitions.
IF g_bUseLamarThemeInMP = TRUE
Temp_MPcurrentTheme = 4 //Theme 4 - Orange
ELSE
//Otherwise use Franklin's starting green default to match his office decor. We most certainly cannot bring in whatever is stored as the SP current theme!
Temp_MPcurrentTheme = 2 //Theme 2 - Green
ENDIF
ELSE
Temp_MPcurrentTheme = GET_MP_INT_CHARACTER_STAT (MP_STAT_FM_CELLPHONE_THEME)
ENDIF
#if IS_DEBUG_BUILD
cdPrintstring("Cellphone_flashhand - Retrieved MP_STAT_FM_CELLPHONE_THEME. It is set to ")
cdPrintint(Temp_MPCurrentTheme)
cdPrintnl()
#endif
//Range of acceptable Theme colours is 1 to 7. If the stat has not been set, i.e at zero, set "Blue - 1" as the default.
IF Temp_MPcurrentTheme < 1
OR Temp_MPcurrentTheme > 7
Temp_MPcurrentTheme = 1
#if IS_DEBUG_BUILD
cdPrintstring("Cellphone_flashhand - Retrieved MP_STAT_FM_CELLPHONE_THEME but value was out of range. Defaulting to ")
cdPrintint(Temp_MPCurrentTheme)
cdPrintnl()
#endif
ENDIF
//Set the cellphone's theme colour via scaleform to the decision made above.
//Reminder: url:bugstar:7423972 - Re-theme player phone in GTAO when using the custom Franklin or Lamar model.
//Work for this will set a static value defined above if playing as either character model in MP.
LEGACY_SCALEFORM_MOVIE_METHOD_WITH_NUMBER (SF_MovieIndex, "SET_THEME", TO_FLOAT (Temp_MPcurrentTheme))
SetUpPhoneSurroundTint()
//url:bugstar:7423972 - Re-theme player phone in GTAO when using the custom Franklin or Lamar model.
//Bypass any user defined wallpaper for their own avatar's cellphone and use a default wallpaper for Franklin and Lamar.
IF IS_MP_PHONE_OWNER_PLAYING_AS_FRANKLIN_LAMAR()
//Careful changing these. Some wallpapers may not exist in the Badger movie! Test in MP before any submit.
//Search on This_Cellphone_Owner_Settings_ListContents[fill_index].g_SettingList[ENUM_TO_INT(SETTING_WALLPAPER)] to find full wallpaper definitions.
IF g_bUseLamarThemeInMP = TRUE
Temp_MPcurrentWallpaper = 16 //Orange Triangles - Text label reference CELL_856
ELSE
Temp_MPcurrentWallpaper= 9 //Green Shards - Text label reference CELL_849
ENDIF
ELSE
Temp_MPCurrentWallpaper = GET_MP_INT_CHARACTER_STAT (MP_STAT_FM_CELLPHONE_BACKGROUND)
ENDIF
#if IS_DEBUG_BUILD
cdPrintstring("Cellphone_flashhand - Retrieved MP_STAT_FM_CELLPHONE_BACKGROUND. It is set to ")
cdPrintint(Temp_MPCurrentWallpaper)
cdPrintnl()
#endif
IF Temp_MPCurrentWallpaper = 0 //Crew Emblem is set in the zero position of the settings list for wallpapers.
//Add crew emblem as cellphone wallpaper...
TEXT_LABEL_63 sCrewTextureName
GAMER_HANDLE PlayerHandle
PlayerHandle = GET_GAMER_HANDLE_PLAYER(PLAYER_ID())
BOOL b_TimedOutGettingCrewEmblem = FALSE
IF NETWORK_HAVE_USER_CONTENT_PRIVILEGES() = FALSE //See 2002264
#if IS_DEBUG_BUILD
cdPrintstring("Cellphone_flashhand - NETWORK_HAVE_USER_CONTENT_PRIVILEGES() returned false prior to Crew Emblem retrieval.")
cdPrintnl()
#endif
ENDIF
IF g_b_HasCrewEmblemRetrievalFailedThisSession = TRUE
#if IS_DEBUG_BUILD
cdPrintstring("Cellphone_flashhand - g_b_HasCrewEmblemRetrievalFailedThisSession = TRUE prior to Crew Emblem retrieval. Default to blank wallpaper.")
cdPrintnl()
#endif
ENDIF
IF NETWORK_CLAN_PLAYER_IS_ACTIVE(PlayerHandle)
AND NETWORK_HAVE_USER_CONTENT_PRIVILEGES()
AND g_b_HasCrewEmblemRetrievalFailedThisSession = FALSE
//AND (g_DumpDisableEveryFrameCaller = FALSE) //comment in for easy testing.
#if IS_DEBUG_BUILD
cdPrintstring("Cellphone_flashhand - Player primary clan active and privileges available! Will try to get texture name for cellphone background. ")
cdPrintnl()
#endif
/*Timeout section removed 26.11.14 - Camille says that NETWORK_CLAN_GET_EMBLEM_TXD_NAME should return false immediately.
SETTIMERA(0)
WHILE NOT (NETWORK_CLAN_GET_EMBLEM_TXD_NAME(PlayerHandle, sCrewTextureName))
AND (TIMERA() < 5000) //Give MP simulation 5 seconds to get crew texture for testing purposes.
WAIT (0)
#if IS_DEBUG_BUILD
cdPrintstring("Cellphone_flashhand - waiting on GET_EMBLEM_TXD_NAME to retrieve string")
cdPrintnl()
#endif
IF TIMERA() > 4999
#if IS_DEBUG_BUILD
cdPrintstring("WARNING! Cellphone_flashhand - TIMED OUT on GET_EMBLEM_TXD_NAME to retrieve string!")
cdPrintnl()
#endif
g_b_HasCrewEmblemRetrievalFailedThisSession = TRUE
b_TimedOutGettingCrewEmblem = TRUE
ENDIF
ENDWHILE
//End of timeout section.
*/
IF NETWORK_CLAN_GET_EMBLEM_TXD_NAME(PlayerHandle, sCrewTextureName)
#if IS_DEBUG_BUILD
cdPrintstring("Cellphone_flashhand - Emblem TXD string retrieved for NG was... ")
cdPrintstring(sCrewTextureName)
cdPrintnl()
#endif
ELSE
#if IS_DEBUG_BUILD
cdPrintstring("WARNING! Cellphone_flashhand - NETWORK_CLAN_GET_EMBLEM_TXD_NAME failed to retrieve string!")
cdPrintnl()
#endif
b_TimedOutGettingCrewEmblem = TRUE
ENDIF
IF b_TimedOutGettingCrewEmblem = FALSE //If we didn't time out, set the background crew image.
BEGIN_SCALEFORM_MOVIE_METHOD(SF_MovieIndex, "SET_BACKGROUND_CREW_IMAGE")
//SCALEFORM_MOVIE_METHOD_ADD_PARAM_STRING(sCrewTextureName)
//END_SCALEFORM_MOVIE_METHOD()
BEGIN_TEXT_COMMAND_SCALEFORM_STRING ("CELL_2000") //~a~
ADD_TEXT_COMPONENT_SUBSTRING_PLAYER_NAME(sCrewTextureName)
END_TEXT_COMMAND_SCALEFORM_STRING()
END_SCALEFORM_MOVIE_METHOD()
ELSE
LEGACY_SCALEFORM_MOVIE_METHOD_WITH_NUMBER (SF_MovieIndex, "SET_BACKGROUND_IMAGE", TO_FLOAT (0))
ENDIF
ELSE
#if IS_DEBUG_BUILD
cdPrintstring("Cellphone_flashhand - Clan not active, retrieval failed previously this session or no content privileges. Assigning default wallpaper as 0.")
cdPrintstring(sCrewTextureName)
cdPrintnl()
#endif
LEGACY_SCALEFORM_MOVIE_METHOD_WITH_NUMBER (SF_MovieIndex, "SET_BACKGROUND_IMAGE", TO_FLOAT (0))
ENDIF
ELSE
LEGACY_SCALEFORM_MOVIE_METHOD_WITH_NUMBER (SF_MovieIndex, "SET_BACKGROUND_IMAGE", TO_FLOAT (Temp_MPCurrentWallpaper))
ENDIF
ELSE
IF g_Use_Prologue_Cellphone
g_b_Secondary_Screen_Available = FALSE
ELSE
IF g_savedGlobals.sCellphoneSettingsData.b_IsSniperAppAvailable = TRUE //Either of these appear on the second screen.
OR g_savedGlobals.sCellphoneSettingsData.b_IsTrackifyAppAvailable = TRUE
//g_b_Secondary_Screen_Available = TRUE //Reinstate this if 1409258 is reversed.
g_b_Secondary_Screen_Available = FALSE
ELSE
g_b_Secondary_Screen_Available = FALSE
ENDIF
ENDIF
LEGACY_SCALEFORM_MOVIE_METHOD_WITH_NUMBER (SF_MovieIndex, "SET_THEME", TO_FLOAT(g_savedGlobals.sCellphoneSettingsData.This_Cellphone_Owner_Settings[g_Cellphone.PhoneOwner].ThemeForThisPlayer))
IF g_IsMonochromeCheatActive = FALSE
LEGACY_SCALEFORM_MOVIE_METHOD_WITH_NUMBER (SF_MovieIndex, "SET_BACKGROUND_IMAGE", TO_FLOAT(g_savedGlobals.sCellphoneSettingsData.This_Cellphone_Owner_Settings[g_Cellphone.PhoneOwner].WallpaperForThisPlayer))
ELSE
//Don't set a background image... and make the phone slightly bigger.
SET_MOBILE_PHONE_SCALE(500 + 75)
ENDIF
SetUpPhoneSurroundTint()
ENDIF
i_Provider_Ident = Get_Cellphone_Provider()
IF g_Use_Prologue_Cellphone = FALSE //don't set provider for prologue phone, as method is not accepted.
ProcessCellphoneSignalStrength()
//LEGACY_SCALEFORM_MOVIE_METHOD_WITH_NUMBER (SF_MovieIndex, "SET_PROVIDER_ICON", TO_FLOAT (i_Provider_Ident), TO_FLOAT() //Needs to be a global! 1132229
ENDIF
g_InputButtonJustPressed = FALSE //Make sure buttonjustpressed has been flushed - might move this and loop check to cellphone_controller.sc
g_Homescreen_In_Secondary_Mode = FALSE
CLEAR_BIT (BitSet_CellphoneDisplay, g_BS_SENDING_CELLPHONE_CAM_PIC)
//Critical reset.
g_CellphoneHasMPAccess = FALSE
//Critical - check if player has access to GTA Online - put in any further checks here.
IF IS_GTA_ONLINE_AVAILABLE()
AND NETWORK_IS_SIGNED_ONLINE()
#if IS_DEBUG_BUILD
cdPrintnl()
cdPrintstring("CELLPHONE_FH - Primary launch check of IS_GTA_ONLINE_AVAILABLE has returned TRUE. Setting joblist access flag to TRUE also")
cdPrintnl()
#endif
g_CellphoneHasMPAccess = TRUE
ENDIF
//New for 2222248 diagnosis. Making sure the phone's homescreen is empty.
#if IS_DEBUG_BUILD
cdPrintnl()
cdPrintstring("CELLPHONE_FH - February new debug for 2222248 diagnosis. Making sure the phone's homescreen is empty on Flashhand Launch.")
cdPrintnl()
#endif
LEGACY_SCALEFORM_MOVIE_METHOD_WITH_NUMBER (SF_MovieIndex, "SET_DATA_SLOT_EMPTY", 1)
Fill_All_Primary_App_Sheets() //Have single / multiplayer variant?
TitleUpdate_Patch_In_JobList_For_SP_Phone()
//Could go!
//Fill_All_Secondary_App_Sheets()
//Delay enum reset as a failsafe.
//g_DelayCinematicCamReinstatement = NO_DELAY_REQUIRED
//Make sure these are false just in case anyone has forgotten to reset them after use.
//SET_SPRITES_DRAW_BEFORE_FADE (FALSE)
//SET_TEXT_DRAW_BEFORE_FADE (FALSE)
//No longer required due to code side alteration in default behaviour. 24.04.12
//SET_SCRIPT_GFX_DRAW_ORDER (GFX_ORDER_AFTER_FADE) //altered in accordance with bug 391635
//Because of scaleform movie timings we need to make sure that when the phone is brought out from the away position for an inbound call or
//a "force in hand, we don't set the homescreen view state as it can supercede the calling screen view state.
//As cellphone_controller specifies the upcoming pds state if an inbound call or force is to occur, we can check if the PDS remains normal
//before drawing the homescreen.
Scaleform_Place_Items_on_Homescreen (1)
//LEGACY_SCALEFORM_MOVIE_METHOD_WITH_NUMBER (SF_MovieIndex, "SET_UI_COLOUR", 1, 114, 103, 243)
//Les changed his mind and wants the same sound to play for pulling the phone out and putting it away.
//PLAY_SOUND_FRONTEND (-1, "Put_Away", g_Owner_Soundset) // # 1535473
PLAY_SOUND_FRONTEND (-1, "Pull_Out", g_Owner_Soundset)
//This following section is important in that it prevents flashhand from drawing an empty screen if a live state has not been set. It also includes timeout failsafes
//and mutual exclusion checks for weird timings: e.g the phone being brought out to takeout state but instantly getting disabled or hung up, primarily by script.
SETTIMERB(0)
WHILE g_Cellphone.PhoneDS < PDS_MAXIMUM
AND g_B_External_Interrupt_Autoplay_MovieFail_Flag = FALSE //Without this, mutual exclusion could occur, as controller, dh will only make a decision if moviefail is false.
WAIT(0)
IF TIMERB() > 10000
g_B_External_Interrupt_Autoplay_MovieFail_Flag = TRUE //CRITICAL! This must be set so that it lets cellphone_controller know that it should break out of its WHILE clause in PDS_TAKEOUT check.
#if IS_DEBUG_BUILD
cdPrintnl()
cdPrintstring ("CELLPHONE_FH - Cellphone flashhand is waiting on controller or dialogue handler - TIMEOUT invoked, setting MovieFail to true")
cdPrintnl()
cdPrintstring ("CELLPHONE_FH - Should run through and terminate this script if state is stuck at DISABLED, TAKEOUT OR AWAY.")
#endif
ENDIF
IF g_Cellphone.PhoneDS < PDS_TAKEOUT
g_B_External_Interrupt_Autoplay_MovieFail_Flag = TRUE //CRITICAL! This must be set so that it lets cellphone_controller know that it should break out of its WHILE clause in PDS_TAKEOUT check.
#if IS_DEBUG_BUILD
cdPrintnl()
cdPrintstring ("CELLPHONE_FH - was waiting on controller or dialogue handler but the phone state has been set to either disabled or away by an external source.")
cdPrintnl()
cdPrintstring ("CELLPHONE_FH - Setting autoplay movie fail to true so this script will run through and terminate.")
#endif
ENDIF
#if IS_DEBUG_BUILD
cdPrintnl()
cdPrintstring ("CELLPHONE_FH - Movie should have loaded but cellphone flashhand is waiting on controller or dialogue handler to make a decision on what the phone state should be...")
cdPrintnl()
#endif
ENDWHILE
IF g_Cellphone.PhoneDS = PDS_MINIMAL
OR g_Cellphone.PhoneDS = PDS_MAXIMUM
IF IS_CURRENTLY_ON_MISSION_OF_TYPE (MISSION_TYPE_DIRECTOR) //In director mode, force cursor onto Snapmatic slot position only. 2171957
LEGACY_SCALEFORM_MOVIE_METHOD_WITH_NUMBER (SF_MovieIndex, "DISPLAY_VIEW", 1, TO_FLOAT (6)) //Set enum state to HOME_SCREEN
#if IS_DEBUG_BUILD
cdPrintstring ("CELLPHONE_FH - Forcing homescreen cursor highlight onto Snapmatic for director mode.")
cdPrintnl ()
#endif
ELSE
LEGACY_SCALEFORM_MOVIE_METHOD_WITH_NUMBER (SF_MovieIndex, "DISPLAY_VIEW", 1, TO_FLOAT (Previous_SelectedAppCursorPos_pageOne)) //Set enum state to HOME_SCREEN
ENDIF
#if IS_DEBUG_BUILD
cdPrintstring ("CELLPHONE_FH - Update_Scaleform_VSE called - 203")
cdPrintnl ()
#endif
//If phone is in sleep mode, show mini signifier in top portion of screen
//IF g_savedGlobals.sCellphoneSettingsData.This_Cellphone_Owner_Settings[g_Cellphone.PhoneOwner].g_SettingList[ENUM_TO_INT(SETTING_PROFILE)].Setting_Currently_Selected_Option = ENUM_TO_INT(PROFILE_SLEEP_MODE) //check if phone is in sleep mode.
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) //check if phone is in sleep mode.
LEGACY_SCALEFORM_MOVIE_METHOD_WITH_NUMBER (SF_MovieIndex, "SET_SLEEP_MODE", 1)
ELSE
LEGACY_SCALEFORM_MOVIE_METHOD_WITH_NUMBER (SF_MovieIndex, "SET_SLEEP_MODE", 0)
ENDIF
//Monochrome
/*
LEGACY_SCALEFORM_MOVIE_METHOD_WITH_NUMBER_AND_STRING (SF_MovieButtonsIndex, "SET_SOFT_KEYS", 1, 1,
INVALID_SCALEFORM_PARAM, INVALID_SCALEFORM_PARAM, INVALID_SCALEFORM_PARAM, "CELL_205") //"Select" Positive
*/
//Badger
IF g_b_ToggleButtonLabels
LEGACY_SCALEFORM_MOVIE_METHOD_WITH_NUMBER_AND_STRING (SF_MovieIndex, "SET_SOFT_KEYS", BADGER_POS, 1,
2, INVALID_SCALEFORM_PARAM, INVALID_SCALEFORM_PARAM, "CELL_205") //"Select" Positive
ELSE
LEGACY_SCALEFORM_MOVIE_METHOD_WITH_NUMBER_AND_STRING (SF_MovieIndex, "SET_SOFT_KEYS", BADGER_POS, 1,
2, INVALID_SCALEFORM_PARAM, INVALID_SCALEFORM_PARAM) //"Select" Positive
ENDIF
//Monochrome
/*
LEGACY_SCALEFORM_MOVIE_METHOD_WITH_NUMBER_AND_STRING (SF_MovieButtonsIndex, "SET_SOFT_KEYS", 2, 1,
INVALID_SCALEFORM_PARAM, INVALID_SCALEFORM_PARAM, INVALID_SCALEFORM_PARAM, "CELL_206") //"Back" - Negative
*/
//Badger
IF g_b_ToggleButtonLabels
LEGACY_SCALEFORM_MOVIE_METHOD_WITH_NUMBER_AND_STRING (SF_MovieIndex, "SET_SOFT_KEYS", 3, 1,
4, INVALID_SCALEFORM_PARAM, INVALID_SCALEFORM_PARAM, "CELL_206") //"Back" - Negative
ELSE
LEGACY_SCALEFORM_MOVIE_METHOD_WITH_NUMBER_AND_STRING (SF_MovieIndex, "SET_SOFT_KEYS", 3, 1,
4, INVALID_SCALEFORM_PARAM, INVALID_SCALEFORM_PARAM) //"Back" - Negative
ENDIF
//Monochrome
//Make sure this is off on homescreen - note that the second int method param is 0 for off.
/*
LEGACY_SCALEFORM_MOVIE_METHOD_WITH_NUMBER_AND_STRING (SF_MovieButtonsIndex, "SET_SOFT_KEYS", 3, 0,
INVALID_SCALEFORM_PARAM, INVALID_SCALEFORM_PARAM, INVALID_SCALEFORM_PARAM, "CELL_250") //"Error!" - Other
*/
//Badger
//Make sure this is off on homescreen - note that the second int method param is 0 for off.
IF g_b_Secondary_Screen_Available = FALSE
LEGACY_SCALEFORM_MOVIE_METHOD_WITH_NUMBER_AND_STRING (SF_MovieIndex, "SET_SOFT_KEYS", BADGER_OTHER, 0,
3, INVALID_SCALEFORM_PARAM, INVALID_SCALEFORM_PARAM) //"Error!" - Other
CLEAR_BIT (BitSet_CellphoneDisplay, g_BS_OTHER_OPTION_IS_DISPLAYED)
ELSE
IF g_bInMultiplayer //no secondary screen for multiplayer...
LEGACY_SCALEFORM_MOVIE_METHOD_WITH_NUMBER_AND_STRING (SF_MovieIndex, "SET_SOFT_KEYS", BADGER_OTHER, 0,
3, INVALID_SCALEFORM_PARAM, INVALID_SCALEFORM_PARAM) //"Error!" - Other
CLEAR_BIT (BitSet_CellphoneDisplay, g_BS_OTHER_OPTION_IS_DISPLAYED)
ELSE
IF g_Homescreen_In_Secondary_Mode = TRUE
IF g_b_ToggleButtonLabels
LEGACY_SCALEFORM_MOVIE_METHOD_WITH_NUMBER_AND_STRING (SF_MovieIndex, "SET_SOFT_KEYS", BADGER_OTHER, 1,
20, INVALID_SCALEFORM_PARAM, INVALID_SCALEFORM_PARAM, "CELL_225") //Other Pages 2
ELSE
LEGACY_SCALEFORM_MOVIE_METHOD_WITH_NUMBER_AND_STRING (SF_MovieIndex, "SET_SOFT_KEYS", BADGER_OTHER, 1,
20, INVALID_SCALEFORM_PARAM, INVALID_SCALEFORM_PARAM) //Other Pages 2
ENDIF
ELSE
IF g_b_ToggleButtonLabels
LEGACY_SCALEFORM_MOVIE_METHOD_WITH_NUMBER_AND_STRING (SF_MovieIndex, "SET_SOFT_KEYS", BADGER_OTHER, 1,
3, INVALID_SCALEFORM_PARAM, INVALID_SCALEFORM_PARAM, "CELL_225") //Other Pages
ELSE
LEGACY_SCALEFORM_MOVIE_METHOD_WITH_NUMBER_AND_STRING (SF_MovieIndex, "SET_SOFT_KEYS", BADGER_OTHER, 1,
3, INVALID_SCALEFORM_PARAM, INVALID_SCALEFORM_PARAM) //Other Pages
ENDIF
ENDIF
SET_BIT (BitSet_CellphoneDisplay, g_BS_OTHER_OPTION_IS_DISPLAYED)
ENDIF
ENDIF
//Set button bar visibility..
//LEGACY_SCALEFORM_MOVIE_METHOD_WITH_NUMBER (SF_MovieButtonsIndex, "SET_BACKGROUND_VISIBILITY", 0) //transparent
//6417795 - April 2020
//Makes sure the new homescreen mode switch soft key is shown in MP when initially launching to the homescreen but not during a phone call.
ADD_NEW_MP_HOMESCREEN_MODE_SWITCH_SOFT_KEY()
ENDIF
//Make sure main gui movie can render to the phone on the launching of this script
g_PhoneGuiRender_Enabled = TRUE
//Set up render target, with specific check to get mobile_phone_render_id.
Setup_MainGui_Rendertarget()
//Set up initial stock market check launch time.
IF NETWORK_IS_GAME_IN_PROGRESS()
Net_StockMarketChecks_StartTime = GET_NETWORK_TIME()
ELSE
StockMarketChecks_StartTime = GET_GAME_TIMER()
ENDIF
IF g_Cellphone_Launched_by_Button_Press = TRUE
//Display reminder about sleep status
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)
IF g_savedGlobals.sCellphoneSettingsData.b_HasSleepReminderBeenDisplayed = FALSE
//Going to keep on reminding every time phone is brought out in the meantime, so will set back to FALSE before terminating. ( Using flag as a check for clearing help! )
g_savedGlobals.sCellphoneSettingsData.b_HasSleepReminderBeenDisplayed = TRUE
FLOAT f_PrimaryHelpX, f_PrimaryHelpY
IF g_Chosen_Ratio = DISPLAY_16_9
f_PrimaryHelpX = 0.75
f_PrimaryHelpY = 0.8
ELSE
f_PrimaryHelpX = 0.65
f_PrimaryHelpY = 0.77
ENDIF
//HELP_AT_SCREEN_LOCATION("CELL_7052", f_PrimaryHelpX, f_PrimaryHelpY, HELP_TEXT_WEST, DEFAULT_GOD_TEXT_TIME, FLOATING_HELP_MISSION_SLOT)
IF f_PrimaryHelpX = f_PrimaryHelpY
//do nothing - unref hack that will deleted in final optimisations.
ENDIF
PRINT_HELP ("CELL_7052", DEFAULT_HELP_TEXT_TIME)
ENDIF
ENDIF
ENDIF
//Debug functionality to check if rendertarget has been acquired.
/*
PhoneRenderTarget_ID = GET_SCRIPT_RENDERTARGET_RENDER_ID() //replace with mobile phone render target? GET_MOBILE_PHONE_RENDER_ID?
IF PhoneRenderTarget_ID = -1
#if IS_DEBUG_BUILD
SCRIPT_ASSERT ("Cannot find render target id for cellphone.")
#endif
ELSE
#if IS_DEBUG_BUILD
cdPrintstring ("Render target id for cellphone is ")
cdPrintint (PhoneRenderTarget_Id)
cdPrintnl()
#endif
GET_MOBILE_PHONE_RENDER_ID (PhoneRenderTarget_Id)
ENDIF
*/
/*
LEFTSTICKX = 0,
LEFTSTICKY = 1,
RIGHTSTICKX = 2,
RIGHTSTICKY = 3,
LEFTSHOULDER1 = 4,
LEFTSHOULDER2 = 5,
RIGHTSHOULDER1 = 6,
RIGHTSHOULDER2 = 7,
DPADUP = 8,
DPADDOWN = 9,
DPADLEFT = 10,
DPADRIGHT = 11,
START = 12,
SELECT = 13,
SQUARE = 14,
TRIANGLE = 15,
CROSS = 16,
CIRCLE = 17,
LEFTSHOCK = 18,
RIGHTSHOCK = 19
*/
//Takeout anim delay mechanism.
// start the time earlier than before so it will catch up
IF g_bInMultiplayer = FALSE
s_iTimeStampStart = GET_GAME_TIMER() + 375
ENDIF
//Set up Phone transition checks.
IF IsCurrentCamFirstPerson() //Decide if the initial camera mode is first or third person so we can safely check for any change during the main loop.
InFirstPersonCamera = TRUE
#if IS_DEBUG_BUILD
cdPrintstring("CELLPHONE_FH - IsCurrentCamFirstPerson returned TRUE on launch of flashhand.")
cdPrintnl()
#endif
ELSE
InFirstPersonCamera = FALSE
#if IS_DEBUG_BUILD
cdPrintstring("CELLPHONE_FH - IsCurrentCamFirstPerson returned FALSE on launch of flashhand.")
cdPrintnl()
#endif
ENDIF
IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID())
//Cover checks for cellphone gameplay camera transitions. We need to show the hud cellphone whilst in cover, so we need to know when cover has been left to hide the hud in 1st person.
IF IS_PED_IN_COVER(PLAYER_PED_ID())
PlayerIsInCover = TRUE
#if IS_DEBUG_BUILD
cdPrintstring("CELLPHONE_FH - PlayerIsinCover returned TRUE on launch of flashhand.")
cdPrintnl()
#endif
IF IsCurrentCamFirstPerson()
//TASK_USE_MOBILE_PHONE(PLAYER_PED_ID(), FALSE)
Remove_Cellphone_From_Ear()
ENDIF
ELSE
PlayerIsInCover = FALSE
#if IS_DEBUG_BUILD
cdPrintstring("CELLPHONE_FH - PlayerIsinCover returned FALSE on launch of flashhand.")
cdPrintnl()
#endif
ENDIF
ENDIF
//Adding in an Enter / Exit vehicle timer mechanism to prevent 3rd person problem when opening Snapmatic immediately after an enter / exit.
IF IS_PC_VERSION() //2269787
IF g_bInMultiplayer = FALSE
JustEnteredExitVehicle_StartTime = GET_GAME_TIMER()//2269787
JustEnteredExitVehicle = FALSE
#if IS_DEBUG_BUILD
cdPrintnl()
cdPrintstring("Cellphone_flashhand - PC Only. Resetting Entered_Exit start timer and clearing Entered_Exit bool on FH launch.")
cdPrintnl()
#endif
ENDIF
ENDIF
//6417795 - April 2020
//Critical. As a precaution clear the bit that specifies the MP homescreen is in secondary mode whenever the cellphone is launched.
CLEAR_BIT (BitSet_CellphoneDisplay_Third, g_BSTHIRD_MP_CELLPHONE_IN_SECONDARY_MODE)
WHILE TRUE
WAIT(0)
/* Debug Block
IF g_FirstPersonTransitionOngoing
DISPLAY_TEXT_WITH_LITERAL_STRING (0.35, 0.34, "STRING", "gFPTO TRUE.")
ENDIF
IF IsCurrentCamFirstPerson() //Only vanish the phone in third person.
DISPLAY_TEXT_WITH_LITERAL_STRING (0.35, 0.54, "STRING", "IsCurrent TRUE.")
ENDIF
IF HasGameplayCameraTransitionOccurredDuringCall
DISPLAY_TEXT_WITH_LITERAL_STRING (0.35, 0.74, "STRING", "TransitionOC TRUE.")
ENDIF
*/
IF IS_BIT_SET (BitSet_CellphoneTU, g_BSTU_REQUEST_DYNAMIC_APPLIST_UPDATE)
IF NOT g_Homescreen_In_Secondary_Mode
IF g_Cellphone.PhoneDS = PDS_MAXIMUM //Only dynamically update app list or homescreen when user is on first homescreen page or running an app.
OR g_Cellphone.PhoneDS > PDS_MAXIMUM
#if IS_DEBUG_BUILD
cdPrintstring("Cellphone_FH REQUEST_DYNAMIC_UPDATE_OF_CELLPHONE_APPLIST has been called and phone is in correct state to allow update.")
cdPrintnl()
PRINTLN("Cellphone_FH REQUEST_DYNAMIC_UPDATE_OF_CELLPHONE_APPLIST has been called and phone is in correct state to allow update.")
#endif
CLEAR_BIT (BitSet_CellphoneTU, g_BSTU_REQUEST_DYNAMIC_APPLIST_UPDATE) //Critical!
Fill_All_Primary_App_Sheets()
LEGACY_SCALEFORM_MOVIE_METHOD_WITH_NUMBER (SF_MovieIndex,"SET_DATA_SLOT_EMPTY", 1)
Scaleform_Place_Items_on_Homescreen(1)
// Only set the display view to the homescreen if the user is currently on it. This preserves whatever app is running at the time.
IF g_Cellphone.PhoneDS = PDS_MAXIMUM
LEGACY_SCALEFORM_MOVIE_METHOD_WITH_NUMBER (SF_MovieIndex, "DISPLAY_VIEW", 1, TO_FLOAT(AppCursorIndex))
ENDIF
ENDIF
ENDIF
ENDIF
IF IS_CELLPHONE_CAMERA_IN_USE()
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_FLY_ATTACK) //Catch all fix for 1984437
ENDIF
IF g_bInMultiplayer = FALSE
IF HasGameplayCameraTransitionOccurredDuringCall //This should only have be set to true during an ongoing call. Once we go back to a safer phone state, this is reset to FALSE.
IF g_Cellphone.PhoneDS = PDS_MAXIMUM
OR g_Cellphone.PhoneDS = PDS_RUNNINGAPP
HasGameplayCameraTransitionOccurredDuringCall = FALSE
#if IS_DEBUG_BUILD
cdPrintstring("CELLPHONE_FH - HasGameplayCameraTransitionOccurredDuringCall reset to FALSE. Phone back in MAX or RUNNING_APP state.")
cdPrintnl()
#endif
ENDIF
ENDIF
//Would need to have separate vehicle transition checks that is mutually exclusive of this. So if you are in first person and change vehicles types,
//then something similar happens and the camera change checks can't run. Similarly, the vehicle checks can't run if g_FirstPersonTransitionOngoing = TRUE
//or g_3DPhoneNeedsMovedUp = TRUE. Check position before making any movement change.
IF g_Cellphone.PhoneDS > PDS_TAKEOUT
IF IS_BIT_SET (BitSet_CellphoneDisplay, g_BS_HAS_CELLPHONE_FULLY_MOVED_UP)
AND (g_FirstPersonTransitionOngoing = FALSE)
AND (g_3DPhoneNeedsMovedUp = FALSE)
IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID())
//Remember to put all further first person hud exceptions in ShouldFirstPersonPhoneHudMovementBeHidden()
//May need to put handling in for the player on call with a crash helmet in first person. He doesn't hold it to his ear in these scenarios.
IF ShouldFirstPersonPhoneHudMovementBeHidden()
GET_MOBILE_PHONE_POSITION (v_CurrentHudPosition)
IF g_This_Screen_3dPhoneStartVec[g_Chosen_Ratio].y <> v_CurrentHudPosition.Y
#if IS_DEBUG_BUILD
cdPrintstring("CELLPHONE_FH - Hud movement check fired. Hud movement says it should be hidden but phone not at startvec.y")
cdPrintnl()
#endif
StandardBackTo1stPersonOrHudHideChecks()
ENDIF
ELSE //Hud phone should not be hidden.
GET_MOBILE_PHONE_POSITION (v_CurrentHudPosition)
IF g_This_Screen_3dPhoneEndVec[g_Chosen_Ratio].y <> v_CurrentHudPosition.Y
IF NOT IS_CELLPHONE_CAMERA_IN_USE()
#if IS_DEBUG_BUILD
cdPrintstring("CELLPHONE_FH - Hud movement check fired. Hud movement says it should be shown but phone not at endvec.y")
cdPrintnl()
#endif
ENDIF
//Need to put special clauses in here to get .Y email position for email. Maybe signal that it needs to rotate? //2033540
/*
BOOL b_PhoneVanishingOrVanishedin3rdPersonForCall = FALSE
IF (IS_BIT_SET (BitSet_CellphoneDisplay_Continued, g_BSC_CALL_IN_PROGRESS_PHONE_FULLY_VANISHED))
OR (IS_BIT_SET (BitSet_CellphoneDisplay_Continued, g_BSC_CALL_IN_PROGRESS_VANISH_PHONE))
OR (IS_BIT_SET (BitSet_CellphoneDisplay_Continued, g_BSC_CALL_IN_PROGRESS_REINSTATE_PHONE))
b_PhoneVanishingOrVanishedin3rdpersonForCall = TRUE
#if IS_DEBUG_BUILD
cdPrintstring("CELLPHONE_FH - Phone vanished during call in 3rd, shouldn't move up.")
cdPrintnl()
#endif
ENDIF
*/
//IF b_PhoneVanishingOrVanishedin3rdpersonForCall = FALSE
IF GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("appEmail")) < 1 //Temp sub4 fix for 2033540
StandardBackTo3rdPersonorHudShownChecks()
ENDIF
//ENDIF
ENDIF
ENDIF
//Cover checks for cellphone gameplay camera transitions. We need to show the hud cellphone whilst in cover, so we need to know when cover has been left to hide the hud in 1st person.
IF PlayerIsInCover = FALSE
IF IS_PED_IN_COVER(PLAYER_PED_ID())
PlayerIsInCover = TRUE
#if IS_DEBUG_BUILD
cdPrintstring("CELLPHONE_FH - PlayerIsinCover now returning TRUE.")
cdPrintnl()
#endif
StandardBackTo3rdPersonorHudShownChecks()
Remove_Cellphone_From_Ear()
ENDIF
ELSE
IF NOT IS_PED_IN_COVER(PLAYER_PED_ID())
PlayerIsInCover = FALSE
#if IS_DEBUG_BUILD
cdPrintstring("CELLPHONE_FH - PlayerIsinCover now returning FALSE.")
cdPrintnl()
#endif
StandardBackTo1stPersonOrHudHideChecks()
IF g_Cellphone.PhoneDS = PDS_ATTEMPTING_TO_CALL_CONTACT //See 2001926. For 99 percent of calls we want to show the phone on the hud
OR g_Cellphone.PhoneDS = PDS_ONGOING_CALL
IF g_ConversationStatus <> CONV_STATE_WAITING_ON_PLAYER_ACCREJ
Put_Cellphone_To_Ear()
ENDIF
ENDIF
ENDIF
ENDIF
//Gameplay camera transition checks begin...
IF InFirstPersonCamera = FALSE
IF IsCurrentCamFirstPerson() //Keep checking for any change... we might need to move the phone down.
InFirstPersonCamera = TRUE
IF IS_PED_IN_COVER(PLAYER_PED_ID())
Remove_Cellphone_From_Ear()
ENDIF
StandardBackTo1stPersonOrHudHideChecks()
ENDIF
ELSE
IF GET_PED_STEALTH_MOVEMENT (PLAYER_PED_ID()) //Fix for 2040861
IF g_Cellphone.PhoneDS = PDS_ATTEMPTING_TO_CALL_CONTACT
OR g_Cellphone.PhoneDS = PDS_ONGOING_CALL
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_LOOK_BEHIND)
ENDIF
ENDIF
IF IsCurrentCamFirstPerson() = FALSE //Keep checking for any change.
InFirstPersonCamera = FALSE
StandardBackTo3rdPersonOrHudShownChecks()
ENDIF
ENDIF
//End of gameplay camera transition check block.
ENDIF //End of IS_ENTITY_DEAD checks,
ENDIF //g_BS_HAS_CELLPHONE_FULLY_MOVED_UP , transition and move up check wrap end.
ENDIF //g_Cellphone.PhoneDS > PDS_TAKEOUT wrap end.
ENDIF //g_bInMultiplayer = FALSE wrap end.
//Critical Title Update.
//This checks for a change in the availability of GTAO after the phone has launched.
IF g_CellphoneHasMPAccess = TRUE //HAS_GTAO_BEEN_PURCHASED() must have been TRUE when this script launched for the access flag to be TRUE.
IF NOT IS_GTA_ONLINE_AVAILABLE()
OR NOT NETWORK_IS_SIGNED_ONLINE()
IF GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH ("appCamera")) = 0 //Camera has its own sign-in checks. Phone should abort when it exits app.
IF g_Cellphone.PhoneDS > PDS_AWAY
g_B_ForcedAway = TRUE
Check_For_Ongoing_Call_Interruption()
HANG_UP_AND_PUT_AWAY_PHONE() //Hanging up phone seems safest bet here... Repopulating on the fly may prove too fiddly.
#if IS_DEBUG_BUILD
cdPrintstring("CELLPHONE_FH - Terminating SP and MP mobile phone use as IS_GTA_ONLINE_AVAILABLE() in no longer TRUE.")
cdPrintnl()
#endif
g_CellphoneHasMPAccess = FALSE
ENDIF
ENDIF
ENDIF
ENDIF
IF g_b_QuickSaveGreyedOut = FALSE //On launch this bool was not set to true so this means the quick save option wase not greyed out, so the external quick save
//check must have returned true.
IF g_OnMissionState != MISSION_TYPE_OFF_MISSION
OR (g_QuickSaveDisabledByScript = TRUE) // #1423552
OR IS_REPEAT_PLAY_ACTIVE() //Added at request of #1416986
//IF g_b_ReplaceThisWithQSavailable = FALSE //If the external quick save check now returns false, then we need to update the first page of the homescreen
//if the user is on that. This is ascertained by the PDS_MAXIMUM check and making sure the phone is not on the second page
//via the Secondary Mode clause.
IF NOT g_Homescreen_In_Secondary_Mode
IF g_Cellphone.PhoneDS = PDS_MAXIMUM //Only dynamically update number of texts notifications when user is on first homescreen page.
g_HomescreenIcon_AlphaValue = i_HomescreenIcon_GreyedOut
LEGACY_SCALEFORM_MOVIE_METHOD_WITH_NUMBER (SF_MovieIndex, "SET_DATA_SLOT_EMPTY", 1)
Fill_All_Primary_App_Sheets()
TitleUpdate_Patch_In_JobList_For_SP_Phone()
Scaleform_Place_Items_on_Homescreen(1)
LEGACY_SCALEFORM_MOVIE_METHOD_WITH_NUMBER (SF_MovieIndex, "DISPLAY_VIEW", 1, TO_FLOAT(AppCursorIndex))
#if IS_DEBUG_BUILD
cdPrintnl()
cdPrintstring("CELLPHONE_FH: Quicksave was available on phone launch but has now become unavailable. Updating homescreen with greyed out icons.")
cdPrintnl()
#endif
ENDIF
ENDIF
g_b_QuickSaveGreyedOut = TRUE
ENDIF
ELSE //The phone must initially have had the save option greyed out as the external quick save available check returned false.
IF g_OnMissionState = MISSION_TYPE_OFF_MISSION
AND (IS_REPEAT_PLAY_ACTIVE() = FALSE ) // Added at request of #1416986
AND (g_QuickSaveDisabledByScript = FALSE) // #1423552
//IF g_b_ReplaceThisWithQSavailable = TRUE //Quick save has become available whilst the phone is up.
IF NOT g_Homescreen_In_Secondary_Mode
IF g_Cellphone.PhoneDS = PDS_MAXIMUM
g_HomescreenIcon_AlphaValue = i_HomescreenIcon_FullAlpha
LEGACY_SCALEFORM_MOVIE_METHOD_WITH_NUMBER (SF_MovieIndex, "SET_DATA_SLOT_EMPTY", 1)
Fill_All_Primary_App_Sheets()
TitleUpdate_Patch_In_JobList_For_SP_Phone()
Scaleform_Place_Items_on_Homescreen(1)
LEGACY_SCALEFORM_MOVIE_METHOD_WITH_NUMBER (SF_MovieIndex, "DISPLAY_VIEW", 1, TO_FLOAT(AppCursorIndex))
#if IS_DEBUG_BUILD
cdPrintnl()
cdPrintstring("CELLPHONE_FH: Quicksave was unavailable on phone launch but has now become available. Updating homescreen with colour icons.")
cdPrintnl()
#endif
ENDIF
ENDIF
g_b_QuickSaveGreyedOut = FALSE
ENDIF
ENDIF
IF g_b_CameraGreyedOut = FALSE //On launch this bool was not set to true so this means the camera option was not greyed out.
IF IS_BIT_SET (BitSet_CellphoneDisplay_Continued, g_BSC_SHOULD_DISABLE_CAMERA_APP_THIS_FRAME)
IF NOT g_Homescreen_In_Secondary_Mode
IF g_Cellphone.PhoneDS = PDS_MAXIMUM //Only dynamically update when user is on first homescreen page.
//g_HomescreenIcon_AlphaValue = i_HomescreenIcon_GreyedOut //Transparency value now decided upon in Scaleform_Place_Items_on_Homescreen()
LEGACY_SCALEFORM_MOVIE_METHOD_WITH_NUMBER (SF_MovieIndex, "SET_DATA_SLOT_EMPTY", 1)
Fill_All_Primary_App_Sheets()
TitleUpdate_Patch_In_JobList_For_SP_Phone()
Scaleform_Place_Items_on_Homescreen(1)
LEGACY_SCALEFORM_MOVIE_METHOD_WITH_NUMBER (SF_MovieIndex, "DISPLAY_VIEW", 1, TO_FLOAT(AppCursorIndex))
#if IS_DEBUG_BUILD
cdPrintnl()
cdPrintstring("CELLPHONE_FH: Camera was available on phone launch but has now become unavailable. Updating homescreen with greyed out icons.")
cdPrintnl()
#endif
ENDIF
ENDIF
#if IS_DEBUG_BUILD
cdPrintnl()
cdPrintstring("CELLPHONE_FH: Secondary camera now greyed out output check. Updating homescreen with greyed out icons. Has previous check fired?")
cdPrintnl()
#endif
g_b_CameraGreyedOut = TRUE
ENDIF
ELSE //The phone must initially have had the camera option greyed out as the external quick save available check returned false.
IF NOT (IS_BIT_SET (BitSet_CellphoneDisplay_Continued, g_BSC_SHOULD_DISABLE_CAMERA_APP_THIS_FRAME))
IF NOT g_Homescreen_In_Secondary_Mode
IF g_Cellphone.PhoneDS = PDS_MAXIMUM
//g_HomescreenIcon_AlphaValue = i_HomescreenIcon_FullAlpha //Transparency value now decided upon in Scaleform_Place_Items_on_Homescreen()
LEGACY_SCALEFORM_MOVIE_METHOD_WITH_NUMBER (SF_MovieIndex, "SET_DATA_SLOT_EMPTY", 1)
Fill_All_Primary_App_Sheets()
TitleUpdate_Patch_In_JobList_For_SP_Phone()
Scaleform_Place_Items_on_Homescreen(1)
LEGACY_SCALEFORM_MOVIE_METHOD_WITH_NUMBER (SF_MovieIndex, "DISPLAY_VIEW", 1, TO_FLOAT(AppCursorIndex))
#if IS_DEBUG_BUILD
cdPrintnl()
cdPrintstring("CELLPHONE_FH: Camera was UNAVAILABLE on phone launch but has now become available. Updating homescreen with colour icons.")
cdPrintnl()
#endif
ENDIF
ENDIF
#if IS_DEBUG_BUILD
cdPrintnl()
cdPrintstring("CELLPHONE_FH: Secondary camera now full coloured output check. Updating homescreen with colour icons. Has previous check fired?")
cdPrintnl()
#endif
g_b_CameraGreyedOut = FALSE
ENDIF
ENDIF
IF NOT IS_PAUSE_MENU_ACTIVE()
IF g_3dPhonePosVec.y <> g_This_Screen_3dPhoneStartVec[g_Chosen_Ratio].y //If this is equal then we can assume the phone has been moved off screen for an mpJobOffer but is not AWAY.
//We wouldn't want to make exclusive any of these inputs any longer in that case.
OR IsCurrentCamFirstPerson() //We need to check this also as the Vec comparison above may not always return true in first person. 2006165
IF g_Cellphone.PhoneDS > PDS_AWAY //Only disable while phone is on screen AND not moving down.
IF GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH ("appTrackify")) = 0 //We need to allow the player to sprint if the Trackify app is in use. //Requested by bug 1156535
IF g_bInMultiplayer //2194226
IF g_Cellphone.PhoneDS = PDS_ONGOING_CALL
IF g_CallRequiringPlayerResponse = TRUE //We'll only make this exclusive, thus disabling sprint, when on a response call.
OR IS_BIT_SET (BitSet_CellphoneDisplay_Continued, g_BSC_CELLPHONE_WITH_REPLIES_WAITING_ON_USER_INPUT)
SET_INPUT_EXCLUSIVE (PLAYER_CONTROL, (INT_TO_ENUM (CONTROL_ACTION, PHONE_POSITIVE_INPUT)))
ENDIF
ELSE
SET_INPUT_EXCLUSIVE (PLAYER_CONTROL, (INT_TO_ENUM (CONTROL_ACTION, PHONE_POSITIVE_INPUT)))
ENDIF
ELSE
SET_INPUT_EXCLUSIVE (PLAYER_CONTROL, (INT_TO_ENUM (CONTROL_ACTION, PHONE_POSITIVE_INPUT)))
ENDIF
ENDIF
/*
#if IS_DEBUG_BUILD
cdPrintstring("Checking PHONE_NEGATIVE exclusivity")
cdPrintnl()
#endif
*/
IF GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH( HASH("appSecuroHack")) = 0
//Japanese
SET_INPUT_EXCLUSIVE (PLAYER_CONTROL, (INT_TO_ENUM (CONTROL_ACTION, PHONE_NEGATIVE_INPUT))) //See bug 605548
//Exclusivity for these should only be set when PS3 square / 360 X is displayed. Legacy.
IF IS_BIT_SET (BitSet_CellphoneDisplay, g_BS_OTHER_OPTION_IS_DISPLAYED) //See bug 740666
SET_INPUT_EXCLUSIVE (PLAYER_CONTROL, (INT_TO_ENUM (CONTROL_ACTION, PHONE_DELETE_OPTION_INPUT)))
//SET_INPUT_EXCLUSIVE (PLAYER_CONTROL, (INT_TO_ENUM (CONTROL_ACTION, PHONE_SPECIAL_OPTION_INPUT))) //1854594
ENDIF
ENDIF
//Have a nagging doubt that this was originally within the bitset check for a reason, but tests with hyperlink texts and contacts seem okay.
IF NOT IS_CELLPHONE_TRACKIFY_IN_USE() // Fix for B* 1880594
AND GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH( HASH("appSecuroHack")) = 0
SET_INPUT_EXCLUSIVE (PLAYER_CONTROL, (INT_TO_ENUM (CONTROL_ACTION, PHONE_SPECIAL_OPTION_INPUT))) //1854594
ENDIF
ENDIF
ENDIF
IF g_3dPhonePosVec.y = g_This_Screen_3dPhoneStartVec[g_Chosen_Ratio].y //Deliberately not using as ELSE until this auto integrates.
//Phone could be in hidden state if y component of vector is the same.
#IF IS_JAPANESE_BUILD
IF g_IsThisAnMPChatCall
//This should disable sprint and prevent the phone hanging up during a chat call in 2150013
SET_INPUT_EXCLUSIVE (PLAYER_CONTROL, (INT_TO_ENUM (CONTROL_ACTION, PHONE_NEGATIVE_INPUT))) //See bug 2150013
ENDIF
#ENDIF
ENDIF
ENDIF
//Legacy...
//Prevent radio station. changing weapon when d-pad navigates homescreen.
//DISABLE_CONTROL_BUTTON (PLAYER_CONTROL, DPADLEFT)
//DISABLE_CONTROL_BUTTON (PLAYER_CONTROL, DPADRIGHT)
//DISABLE_CONTROL_BUTTON (PLAYER_CONTROL, DPADUP)
//DISABLE_CONTROL_BUTTON (PLAYER_CONTROL, DPADDOWN)
IF NOT IS_USING_KEYBOARD_AND_MOUSE(FRONTEND_CONTROL)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_MELEE_ATTACK_LIGHT)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_MELEE_ATTACK_HEAVY)
//DISABLE_CONTROL_ACTION (PLAYER_CONTROL, INPUT_DETONATE)
ENDIF
IF NOT IS_PAUSE_MENU_ACTIVE() //1511782
/* Commenting this out as it causes conflicts with the PC control scheme, and may not be necessary anyway.
IF NOT (IS_BIT_SET (BitSet_CellphoneDisplay_Continued, g_BSC_CALL_IN_PROGRESS_PHONE_FULLY_VANISHED)) //If the phone isn't onscreen don't disable these... we need to be able
//to reinstate it from vanished...
IF !g_bBrowserVisible //1084004
//OR NOT IS_CELLPHONE_CAMERA_IN_USE()
SET_INPUT_EXCLUSIVE (PLAYER_CONTROL, (INT_TO_ENUM (CONTROL_ACTION, PHONE_TAKEOUT_INPUT))) //Need this as it may not necessarily always be the same as phone_nav_up...
SET_INPUT_EXCLUSIVE (PLAYER_CONTROL, (INT_TO_ENUM (CONTROL_ACTION, PHONE_NAV_UP_INPUT)))
ENDIF
ENDIF
*/
//IF g_Cellphone.PhoneDS < PDS_ONGOING_CALL //This will allow Radio Station control during a call. Included on a trial basis. See bug 990936.
//Not me disabling the radio wheel it seems... Adam F. says waive. Reverted change above.
IF !g_bBrowserVisible//1084004
//OR NOT IS_CELLPHONE_CAMERA_IN_USE()
// Mouse wheel scrolling - overrides other items set to mouse wheel while phone is active
IF NOT IS_CELLPHONE_CAMERA_IN_USE()
SET_INPUT_EXCLUSIVE( PLAYER_CONTROL, INPUT_CELLPHONE_SCROLL_FORWARD)
SET_INPUT_EXCLUSIVE( PLAYER_CONTROL, INPUT_CELLPHONE_SCROLL_BACKWARD)
// Have to re-enable these, as setting one exclusive can disable the other.
ENABLE_CONTROL_ACTION( PLAYER_CONTROL, INPUT_CELLPHONE_SCROLL_FORWARD)
ENABLE_CONTROL_ACTION( PLAYER_CONTROL, INPUT_CELLPHONE_SCROLL_BACKWARD)
ENDIF
SET_INPUT_EXCLUSIVE (PLAYER_CONTROL, (INT_TO_ENUM (CONTROL_ACTION, PHONE_NAV_LEFT_INPUT)))
IF NOT IS_CELLPHONE_TRACKIFY_IN_USE() //This should be enough to fix 1796220 but code are auto-blocking inputs whenever the phone object is created. Tested with
//a remote call to CREATE_MOBILE_PHONE that did not launch cellphone scripts.
SET_INPUT_EXCLUSIVE (PLAYER_CONTROL, (INT_TO_ENUM (CONTROL_ACTION, PHONE_NAV_RIGHT_INPUT)))
ENDIF
//cdPrintstring("Testing! x3")
//cdPrintnl()
IF g_Cellphone.PhoneDS > PDS_TAKEOUT
SET_INPUT_EXCLUSIVE (PLAYER_CONTROL, (INT_TO_ENUM (CONTROL_ACTION, PHONE_NAV_DOWN_INPUT)))
ENDIF
ENDIF
ENDIF
IF Is_Phone_Control_Just_Pressed (FRONTEND_CONTROL, INT_TO_ENUM (CONTROL_ACTION, PHONE_GO_BACK_INPUT))
Failsafe_Depress_Period_Underway = TRUE
SETTIMERA(0)
ENDIF
//Special case delay for quicksave button carry through to pausemenu that code don't want to fix. #967067
IF local_Request_for_QuickSave = TRUE
IF NOT (IS_CONTROL_PRESSED(FRONTEND_CONTROL, INT_TO_ENUM (CONTROL_ACTION, PHONE_POSITIVE_INPUT)))
g_HasCellphoneRequestedSave = TRUE //Button has been released, okay to launch quicksave routine in save_anywhere.sc
local_Request_for_QuickSave = FALSE
ELSE
#if IS_DEBUG_BUILD
cdPrintnl()
cdPrintstring("CELLPHONE_FLASHHAND - Waiting on Quicksave button release")
cdPrintnl()
#endif
ENDIF
IF NOT (g_Cellphone.PhoneDS > PDS_AWAY)
local_Request_for_QuickSave = FALSE //The phone has been forced away by injury, death or script. Abandon this routine and the quicksave launch.
ENDIF
ENDIF
//Mega_failsafe prompted by 246816
IF Failsafe_Depress_Period_Underway
IF IS_CONTROL_PRESSED (FRONTEND_CONTROL, INT_TO_ENUM (CONTROL_ACTION, PHONE_GO_BACK_INPUT))
IF TIMERA() > 5000
g_Cellphone.PhoneDS = PDS_AWAY
#if IS_DEBUG_BUILD
cdPrintnl()
cdPrintstring("STATE ASSIGNMENT 57. Cellphone_flashhand assigns PDS_AWAY")
cdPrintnl()
#endif
//Maybe force a reply here?
KILL_PHONE_CONVERSATION()
#if IS_DEBUG_BUILD
cdPrintnl()
cdPrintstring ("CELLPHONE_FLASHHAND Cellphone flashhand aborting... and killing any conversation due to long back button press!")
cdPrintnl()
#endif
ENDIF
ELSE
Failsafe_Depress_Period_Underway = FALSE
ENDIF
ENDIF
//Get this every frame... When an app launches the start time is reset so we can work out the difference
g_App_Elapsed_SafetyBuffer = GET_GAME_TIMER()
//CRITICAL! This is set to TRUE by CHECK_FOR_APPLICATION_EXIT() and CHECK_FOR_ABNORMAL_EXIT() when either of those functions return TRUE themselves.
//AppCamera explicitly sets g_MainGui_RendertargetNeedsReset as a special case.
IF g_MainGui_RendertargetNeedsReset
Setup_MainGui_Rendertarget() //Re-initialise the main scaleform gui movie rendertarget
g_PhoneGuiRender_Enabled = TRUE //Make sure that the cellphone is able to actually render the movie again.
g_MainGui_RendertargetNeedsReset = FALSE
//SET_SPRITES_DRAW_BEFORE_FADE (FALSE)
//SET_TEXT_DRAW_BEFORE_FADE (FALSE)
//No longer required due to code side alteration in default behaviour. 24.04.12
//SET_SCRIPT_GFX_DRAW_ORDER (GFX_ORDER_AFTER_FADE) //altered in accordance with bug 391635
ENDIF
/* Min mode not currently required...
IF g_Cellphone.PhoneDS = PDS_MINIMAL
Check_Min_for_Max_DisplayStatus()
ENDIF
*/
//Main gui drawing loop. This needs to draw consistently as any extra WAITs can impact it.
IF g_Phone_Active_but_Hidden = FALSE //Make sure the phone is being drawn and not hidden but still active, for any hotswap transition.
//Hide hud elements that appear in bottom right corner.
HIDE_HUD_COMPONENT_THIS_FRAME (NEW_HUD_VEHICLE_NAME)
HIDE_HUD_COMPONENT_THIS_FRAME (NEW_HUD_AREA_NAME)
HIDE_HUD_COMPONENT_THIS_FRAME (NEW_HUD_DISTRICT_NAME)
HIDE_HUD_COMPONENT_THIS_FRAME (NEW_HUD_STREET_NAME)
Draw_DisplayStatus()
Perform_StockMarketChecks()
SET_TEXT_RENDER_ID (PhoneRenderTarget_ID)
//Only render the movie if appropriate. Some app scripts may not want the main cellphone movie and associated buttons to render to the screen.
//If the main movie does not render when expected, check for running apps that have not terminated themselves by checking for normal or abnormal exits.
IF g_PhoneGuiRender_Enabled = TRUE
SET_SCRIPT_GFX_DRAW_ORDER (GFX_ORDER_AFTER_HUD)
IF g_Use_Prologue_Cellphone
//DRAW_SCALEFORM_MOVIE (SF_MovieIndex, 0.100, 0.118, 0.2, 0.223, 255, 255, 255, 255)
DRAW_SCALEFORM_MOVIE (SF_MovieIndex, g_SF_PhonePosX, g_SF_PhonePosY, g_SF_PhoneSizeX, g_SF_PhoneSizeY, 255, 255, 255, 255)
ELSE
DRAW_SCALEFORM_MOVIE (SF_MovieIndex, g_SF_PhonePosX, g_SF_PhonePosY, g_SF_PhoneSizeX, g_SF_PhoneSizeY, 255, 255, 255, 255)
#if IS_DEBUG_BUILD
IF g_b_DisplayDrawingMovieDump
cdPrintstring ("CELLPHONE_FH - Drawing movie this frame whilst in main loop.")
cdPrintnl()
ENDIF
#endif
ENDIF
/* Buttons are no longer a separate movie in Badger...
IF g_b_Rotate3dPhonePortrait = TRUE
OR g_b_Rotate3dPhoneLandscape = TRUE
//Don't draw buttons when rotating for camera app.
ELSE
DRAW_SCALEFORM_MOVIE (SF_MovieButtonsIndex, g_SF_ButtonsPosX, g_SF_ButtonsPosY, g_SF_ButtonsSizeX, g_SF_ButtonsSizeY, 255, 255, 255, 255)
ENDIF
*/
Update_Cellphone_Clock_and_Health()
ENDIF
IF g_3DPhoneNeedsMovedUp = TRUE
//Added for bug 69357
IF g_Cellphone.PhoneDS > PDS_AWAY
Move3dPhoneUpScreen()
ENDIF
ELSE
IF g_Cellphone.PhoneDS > PDS_AWAY
//Hands free mode will need to be multiplayer only.
IF g_FirstPersonTransitionOngoing = TRUE
MovetoFirstPersonVanishPhone()
#if IS_DEBUG_BUILD
cdPrintstring ("CELLPHONE_FH - Move to first person vanish called via g_FirstPersonTransitionOngoing.")
cdPrintnl()
#endif
ENDIF
IF IS_BIT_SET (BitSet_CellphoneDisplay_Continued, g_BSC_CALL_IN_PROGRESS_REINSTATE_PHONE)
/* Removing this block for Next Gen as vanishing the phone causes great confusion in first person.
IF g_FirstPersonTransitionOngoing = FALSE
CallInProgressReinstatePhone()
ENDIF
*/
IF g_bInMultiplayer = TRUE //Need to allow chat call hands free mode to function correctly in MP.
CallInProgressReinstatePhone()
ENDIF
ELSE
IF NOT (IS_BIT_SET (BitSet_CellphoneDisplay_Continued, g_BSC_CALL_IN_PROGRESS_VANISH_PHONE)) //Don't want to check this when phone is in transit...
IF IS_BIT_SET (BitSet_CellphoneDisplay_Continued, g_BSC_CALL_IN_PROGRESS_PHONE_FULLY_VANISHED) //Also need to make sure phone has actually been vanished once before reinstating it...
//Could remove this block for Next Gen as vanishing the phone causes great confusion in first person.
IF Is_Phone_Control_Just_Pressed (FRONTEND_CONTROL, INT_TO_ENUM (CONTROL_ACTION, PHONE_TAKEOUT_INPUT))
#if IS_DEBUG_BUILD
cdPrintstring ("CELLPHONE_FH - Vanished phone ordered to re-appear by user input")
cdPrintnl()
#endif
SET_BIT (BitSet_CellphoneDisplay_Continued, g_BSC_CALL_IN_PROGRESS_REINSTATE_PHONE) //signal that we want to run transit routine now.
CLEAR_BIT (BitSet_CellphoneDisplay_Continued, g_BSC_CALL_IN_PROGRESS_PHONE_FULLY_VANISHED) //phone no longer vanished.
CLEAR_BIT (BitSet_CellphoneDisplay_Third, g_BSTHIRD_DO_NOT_MOVE_PHONE_UP_ON_LAUNCH)
ENDIF
ENDIF
ELSE //This bit is set via dialogue handler's Has_HidePhoneTrialTimerElasped() routine AND the HANDS FREE stuff!
/* Removing this block for Next Gen as vanishing the phone causes great confusion in first person.
IF g_FirstPersonTransitionOngoing = FALSE
AND IsCurrentCamFirstPerson() = FALSE //Only vanish the phone in third person.
AND HasGameplayCameraTransitionOccurredDuringCall = FALSE
CallInProgressVanishPhone()
ENDIF
*/
IF g_bInMultiplayer = TRUE //Need to allow chat call hands free mode to function correctly in MP.
CallInProgressVanishPhone()
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF b_Waiting_On_SF_Return_Value
IF g_Cellphone.PhoneDS = PDS_MAXIMUM
//IF NOT (Is_Phone_Control_Just_Pressed (FRONTEND_CONTROL, INT_TO_ENUM (CONTROL_ACTION, PHONE_POSITIVE_INPUT))) //Experimenting with delay for 967067. Not a good idea.
Check_For_App_Return_Value_Ready()
//ENDIF
ENDIF
ELSE
IF NOT (IS_BIT_SET (BitSet_CellphoneDisplay, g_BS_WAITING_ON_APP_TO_LOAD))
//We only want to run an app if no other app is currently running...
IF g_Cellphone.PhoneDS = PDS_MINIMAL
OR g_Cellphone.PhoneDS = PDS_MAXIMUM
//Don't check for user navigation if the phone is hidden...
IF g_Phone_Active_but_Hidden = FALSE
//Check for app launching bit here...
IF GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("appCamera")) < 1 //special cases to cater for rotational delay.
AND GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("appEmail")) < 1
IF g_Use_Prologue_Cellphone = FALSE
IF IS_BIT_SET (BitSet_CellphoneDisplay, g_BS_HAS_CELLPHONE_FULLY_MOVED_UP) //1855377 - We want to allow time for a second "Up" press to launch Snapmatic...
//IF g_b_Secondary_Screen_Available //which should always be the case for SP now...
IF NOT g_bInMultiplayer
//Check this in to use multiple screen wrapping navigation requested in bug 740662
IF local_Request_for_Quicksave = FALSE //prevent further navigation if the user is still holding down the app select button during a quicksave launch.
//Check_for_Dual_Homescreen_Navigation()
IF NOT (IS_CURRENTLY_ON_MISSION_OF_TYPE (MISSION_TYPE_DIRECTOR)) //Prevents the user quickly moving to an undefined slot when Snapmatic only is present.
Check_For_Single_Homescreen_Navigation() //For 1409258
ELSE //2411448 AppMPJOBLIST now needs to be navigated to if available
IF g_CellphoneHasMPAccess
Check_For_Director_Mode_Navigation()
ENDIF
ENDIF
ENDIF
ELSE
//6417795 - April 2020
//Critical. MP Only.
//If we are in the secondary mode of the homescreen, specifically check for that navigation routine only...
IF IS_BIT_SET (BitSet_CellphoneDisplay_Third, g_BSTHIRD_MP_CELLPHONE_IN_SECONDARY_MODE)
Check_For_New_MP_Secondary_Mode_Navigation()
ELSE
Check_For_New_MP_Single_Homescreen_Navigation() //...otherwise, use the regular MP navigation mode.
ENDIF
ENDIF
ENDIF
ENDIF
IF IS_BIT_SET (BitSet_CellphoneDisplay, g_BS_SENDING_CELLPHONE_CAM_PIC) //launch routine sets state to running app, so this won't run more than once.
CC_INTERNAL_LAUNCH_CELLPHONE_APPLICATION (AppCONTACTS, FALSE, TRUE, TRUE) //don't load movies, override phone already on screen check, use CONTACTS_APP_STACK_SIZE
/*
LAUNCH_CELLPHONE_APPLICATION (AppCONTACTS, FALSE, TRUE, TRUE) //don't load movies, override phone already on screen check, use CONTACTS_APP_STACK_SIZE
*/
ELSE
IF CellphoneAppAutoLaunchType = ACT_APP_NONE
IF NOT (IS_BIT_SET (BitSet_CellphoneTU, g_BSTU_QUICK_LAUNCH_SNAPMATIC)) //1855377
IF g_bInMultiplayer //Can cause problems with crappy joypads / framerates so relegated to MP only and can be toggled off via an MP stat. 1988302
//Original bug was for GTAO and a suggestion so not missed in SP. Much trickier to put a setting in SP. Also problematic in NG.
Check_For_QuickLaunch_of_Snapmatic()
ENDIF
Check_for_App_Selection() //moved 25.10.11 so that another app can't be selected before contacts launches.
Check_for_Secondary_Screen_Selection()
ENDIF
ELSE
#if IS_DEBUG_BUILD
cdPrintnl()
cdPrintstring("CELLPHONE_FH - Activatable App Launch in process. Type is ")
cdPrintInt (ENUM_TO_INT(CellphoneAppAutoLaunchType))
cdPrintnl()
#endif
IF g_bInMultiplayer //Can cause problems with crappy joypads / framerates so relegated to MP only and can be toggled off via an MP stat. 1988302
//Original bug was for GTAO and a suggestion so not missed in SP. Much trickier to put a setting in SP. Also problematic in NG.
Check_For_QuickLaunch_of_Snapmatic()
ENDIF
IF NOT (IS_BIT_SET (BitSet_CellphoneTU, g_BSTU_QUICK_LAUNCH_SNAPMATIC))
IF CellphoneAppAutoLaunchType = ACT_APP_EMAIL
IF IS_BIT_SET (BitSet_CellphoneTU, g_BSTU_AUTOLAUNCH_NEW_EMAIL_APP) // Launch AppMPEmail rather than standard SP email
IF IS_BIT_SET (BitSet_CellphoneDisplay, g_BS_HAS_CELLPHONE_FULLY_MOVED_UP) //Need to allow for rotation.
IF g_bInMultiplayer
CC_INTERNAL_LAUNCH_CELLPHONE_APPLICATION (AppEmail, FALSE, TRUE, FALSE) //don't load movies, override phone already on screen check, use CONTACTS_APP_STACK_SIZE
/*
//Check_for_App_Selection() //moved 25.10.11 so that another app can't be selected before contacts launches.
LAUNCH_CELLPHONE_APPLICATION (AppEmail, FALSE, TRUE, FALSE) //don't load movies, override phone already on screen check, use CONTACTS_APP_STACK_SIZE
*/
//In MP, the AppEmail Enum is binded to a different script.
#if IS_DEBUG_BUILD
cdPrintnl()
cdPrintstring("CELLPHONE_FH - Activatable EMAIL App caused direct launch of MP Specific Email App. ")
cdPrintInt (ENUM_TO_INT(CellphoneAppAutoLaunchType))
cdPrintnl()
#endif
ELSE
g_ShouldForceSelectionOfLatestAppItem = FALSE //Make sure that if we somehow get an MP email in SP, it doesn't get stuck on Andrew Knight's shitty SP script.
#if IS_DEBUG_BUILD
cdPrintnl()
cdPrintstring("CELLPHONE_FH - Activatable MP EMAIL weirdly received in SP... taking precaution of removing last item force read.")
cdPrintInt (ENUM_TO_INT(CellphoneAppAutoLaunchType))
cdPrintnl()
#endif
ENDIF
CellphoneAppAutoLaunchType = ACT_APP_NONE
CLEAR_BIT (BitSet_CellphoneTU, g_BSTU_AUTOLAUNCH_NEW_EMAIL_APP)
ENDIF
ELSE
IF IS_BIT_SET (BitSet_CellphoneDisplay, g_BS_HAS_CELLPHONE_FULLY_MOVED_UP) //Need to allow for rotation.
CC_INTERNAL_LAUNCH_CELLPHONE_APPLICATION (AppEmail, FALSE, TRUE, FALSE) //don't load movies, override phone already on screen check, use CONTACTS_APP_STACK_SIZE
/*
//Check_for_App_Selection() //moved 25.10.11 so that another app can't be selected before contacts launches.
LAUNCH_CELLPHONE_APPLICATION (AppEmail, FALSE, TRUE, FALSE) //don't load movies, override phone already on screen check, use CONTACTS_APP_STACK_SIZE
*/
#if IS_DEBUG_BUILD
cdPrintnl()
cdPrintstring("CELLPHONE_FH - Activatable EMAIL App caused direct launch of standard SP email legacy app. ")
cdPrintInt (ENUM_TO_INT(CellphoneAppAutoLaunchType))
cdPrintnl()
#endif
CellphoneAppAutoLaunchType = ACT_APP_NONE
ENDIF
ENDIF
ELSE
IF CellphoneAppAutoLaunchType = ACT_APP_TEXT
CC_INTERNAL_LAUNCH_CELLPHONE_APPLICATION (AppTEXTS, FALSE, TRUE, FALSE) //don't load movies, override phone already on screen check, use CONTACTS_APP_STACK_SIZE
/*
LAUNCH_CELLPHONE_APPLICATION (AppTEXTS, FALSE, TRUE, FALSE) //don't load movies, override phone already on screen check, use CONTACTS_APP_STACK_SIZE
*/
#if IS_DEBUG_BUILD
cdPrintnl()
cdPrintstring("CELLPHONE_FH - Activatable TEXTS App caused direct launch of app. ")
cdPrintInt (ENUM_TO_INT(CellphoneAppAutoLaunchType))
cdPrintnl()
#endif
CellphoneAppAutoLaunchType = ACT_APP_NONE
ENDIF
//INVITES app would go here!
IF CellphoneAppAutoLaunchType = ACT_APP_INVITE
CC_INTERNAL_LAUNCH_CELLPHONE_APPLICATION (AppMPJobList, FALSE, TRUE, FALSE) //don't load movies, override phone already on screen check, use CONTACTS_APP_STACK_SIZE
/*
LAUNCH_CELLPHONE_APPLICATION (AppMPJobList, FALSE, TRUE, FALSE) //don't load movies, override phone already on screen check, use CONTACTS_APP_STACK_SIZE
*/
#if IS_DEBUG_BUILD
cdPrintnl()
cdPrintstring("CELLPHONE_FH - Activatable INVITE App caused direct launch of app. ")
cdPrintInt (ENUM_TO_INT(CellphoneAppAutoLaunchType))
cdPrintnl()
#endif
CellphoneAppAutoLaunchType = ACT_APP_NONE
ENDIF
//New launch type and script launch for BossAgency
IF CellphoneAppAutoLaunchType = ACT_APP_BOSSINV
CC_INTERNAL_LAUNCH_CELLPHONE_APPLICATION (AppDummyApp0, FALSE, TRUE, FALSE) //don't load movies, override phone already on screen check, use CONTACTS_APP_STACK_SIZE
/*
LAUNCH_CELLPHONE_APPLICATION (AppMPJobList, FALSE, TRUE, FALSE) //don't load movies, override phone already on screen check, use CONTACTS_APP_STACK_SIZE
*/
#if IS_DEBUG_BUILD
cdPrintnl()
cdPrintstring("CELLPHONE_FH - Activatable BOSSINV App caused direct launch of app. ")
cdPrintInt (ENUM_TO_INT(CellphoneAppAutoLaunchType))
cdPrintnl()
#endif
CellphoneAppAutoLaunchType = ACT_APP_NONE
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ELSE
IF HAS_SCRIPT_LOADED (g_AppList[SelectedAppIndex].AppScriptName)
IF SelectedAppIndex = ENUM_TO_INT (appCONTACTS)
IF GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(g_AppList[SelectedAppIndex].AppScriptNameHash) = 0
Application_Thread = START_NEW_SCRIPT (g_AppList[SelectedAppIndex].AppScriptName, CONTACTS_APP_STACK_SIZE)
#if IS_DEBUG_BUILD
cdPrintstring("CELLPHONE_FH - Launching chosen script with contacts stack size")
cdPrintnl()
#endif
ENDIF
ELSE
BOOL b_BennysQuickLaunchAvailable = FALSE
//2411187 - Add launch mechanism stack size clause for Benny's Motorworks
IF SelectedAppIndex = ENUM_TO_INT (appDummyApp0)
IF IS_BIT_SET (BitSet_CellphoneTU, g_BSTU_ENABLE_MP_TRACKIFY) = FALSE
AND g_bEnableHackingApp = FALSE
//November 2015 url:bugstar:2554214 Update. This was only for the duration of Lowrider. Removing Benny's launch from dummy app position.
//b_BennysQuickLaunchAvailable = TRUE
//#if IS_DEBUG_BUILD
//cdPrintstring("CELLPHONE_FH - Launching Bennys with contacts stack size")
//cdPrintnl()
//#endif
ENDIF
ENDIF
IF SelectedAppIndex = ENUM_TO_INT (appINTERNET) //Internet Stack Size Work.
OR b_BennysQuickLaunchAvailable = TRUE
IF GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(g_AppList[SelectedAppIndex].AppScriptNameHash) = 0
Application_Thread = START_NEW_SCRIPT (g_AppList[SelectedAppIndex].AppScriptName, APP_INTERNET_STACK_SIZE)
#if IS_DEBUG_BUILD
cdPrintstring("CELLPHONE_FH - Launching chosen Internet script with Internet stack size")
cdPrintnl()
#endif
ENDIF
ELSE
IF GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(g_AppList[SelectedAppIndex].AppScriptNameHash) = 0
Application_Thread = START_NEW_SCRIPT (g_AppList[SelectedAppIndex].AppScriptName, CELLPHONE_STACK_SIZE)
#if IS_DEBUG_BUILD
cdPrintstring("CELLPHONE_FH - Launching chosen script with cellphone stack size")
cdPrintnl()
#endif
ENDIF
ENDIF
ENDIF
SET_SCRIPT_AS_NO_LONGER_NEEDED (g_AppList[SelectedAppIndex].AppScriptName)
//Force clock update for transition to miniature clock on scaleform display view state change.
ClockThrottleMins = 99
CLEAR_BIT (BitSet_CellphoneDisplay, g_BS_WAITING_ON_APP_TO_LOAD)
ENDIF
//Timer check for bug 2378079 - new content starts.
/*
IF ARE_STRINGS_EQUAL ("appInternet", g_AppList[SelectedAppIndex].AppScriptName)
Post_AppLaunch_CurrentTime = GET_GAME_TIMER()
IF Post_AppLaunch_CurrentTime - AppLaunch_StartTime > 10000
#if IS_DEBUG_BUILD
cdPrintnl()
cdPrintstring("CELLPHONE_FH - WARNING! Was waiting on AppInternet to launch but load time has surprassed 10 seconds. Aborting!")
cdPrintnl()
#endif
SET_SCRIPT_AS_NO_LONGER_NEEDED (g_AppList[SelectedAppIndex].AppScriptName)
CLEAR_BIT (BitSet_CellphoneDisplay, g_BS_WAITING_ON_APP_TO_LOAD)
HANG_UP_AND_PUT_AWAY_PHONE()
ENDIF
ENDIF
*/
//2378079 - new content ends.
ENDIF // end of NOT IS_BIT_SET (BitSet_CellphoneDisplay, g_BS_WAITING_ON_APP_TO_LOAD) condition.
ENDIF // end of b_Waiting_On_SF_Return_Value condition.
// So we can go back using Esc
IF IS_USING_KEYBOARD_AND_MOUSE(FRONTEND_CONTROL)
IF IS_PAUSE_MENU_ACTIVE()
//DISABLE_FRONTEND_THIS_FRAME()
DISABLE_CONTROL_ACTION(FRONTEND_CONTROL, INPUT_FRONTEND_PAUSE_ALTERNATE)
ENDIF
ENDIF
//Will combine PDS_DISABLED and PDS_AWAY at some point. Looks like they will be identical in operation...
IF g_Cellphone.PhoneDS = PDS_DISABLED
//This spams until phone has finished moving down...
#if IS_DEBUG_BUILD
cdPrintstring ("CELLPHONE_FH - Cellphone now disabled. 3d phone moving offscreen and terminating cellphone_flashhand.sc. YcompSpeed is ")
PRINTFLOAT (f_YComponent_FPSRemovalSpeed)
cdPrintnl()
cdPrintnl()
#endif
Move3dPhoneDownScreen_Then_Terminate()
ENDIF
//Will combine PDS_DISABLED and PDS_AWAY at some point. Looks like they will be identical in operation...
IF g_Cellphone.PhoneDS = PDS_DISABLED_THIS_FRAME_ONLY
//This spams until phone has finished moving down...
#if IS_DEBUG_BUILD
cdPrintstring ("CELLPHONE_FH - Cellphone now disabled_this_frame_only. 3d phone moving offscreen and terminating cellphone_flashhand.sc. YcompSpeed is ")
PRINTFLOAT (f_YComponent_FPSRemovalSpeed)
cdPrintnl()
cdPrintnl()
#endif
Move3dPhoneDownScreen_Then_Terminate()
ENDIF
IF g_Cellphone.PhoneDS = PDS_AWAY
Move3dPhoneDownScreen_Then_Terminate()
//This procedure repeats... until phone has finished moving down.
#if IS_DEBUG_BUILD
cdPrintstring ("CELLPHONE_FH - Cellphone now in AWAY state. 3d phone moving offscreen and terminating cellphone_flashhand.sc. YcompSpeed is ")
PRINTFLOAT (f_YComponent_FPSRemovalSpeed)
cdPrintnl()
cdPrintnl()
#endif
ELSE
//-------------------------------------------------------------------------------------------------------------------------
//
// Incident and Disable App Handling!
//
//_________________________________________________________________________________________________________________________
IF (g_IsThisAnMPChatCall) //Chat call hands free control mechanism.
IF g_Cellphone.PhoneDS = PDS_ONGOING_CALL //1566736
IF g_bInMultiplayer
IF NOT IS_BIT_SET (BitSet_CellphoneDisplay_Continued, g_BSC_THIS_IS_AN_ANSWERPHONE_CALL) //If this is an answerphone call, don't auto-hide phone.
IF NOT IS_BIT_SET (BitSet_CellphoneDisplay_Continued, g_BSC_CALL_IN_PROGRESS_PHONE_ALREADY_SIGNALLED_TO_VANISH_BY_DH)
//IF Has_HidePhoneTrialTimerElasped() //Move phone downscreen after a short time after a call reaches CONNECTED status...
IF Is_Player_On_Voice_Chat_Phonecall()
IF NOT IS_BIT_SET (BitSet_CellphoneDisplay, g_BS_SENDING_CELLPHONE_CAM_PIC) //don't check for this button if we are sending a cellphone pic.
IF Is_Phone_Control_Just_Pressed (FRONTEND_CONTROL, INT_TO_ENUM (CONTROL_ACTION, PHONE_SPECIAL_OPTION_INPUT)) //Go Hands free button pressed!
IF NOT (IS_PC_VERSION()) //2193981 - Conflicts with handbrake. Confusing.
IF NOT (g_InboundCallWaitAccRej = CALL_WAITING_TO_BE_ANSWERED)
IF g_Cellphone.PhoneDS > PDS_MAXIMUM //Make sure the phone can only move offscreen if a call is ongoing
//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...
// Could remove this block for Next Gen as vanishing the phone causes great confusion in first person.
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_FHAND - Button press detected to go hands free on Chat Call. Setting vanish bits...")
cdPrintnl()
#endif
SET_BIT(MPGlobalsAmbience.iFmNmhBitSet7, BI_FM_NMH7_DO_REVEAL_PHONE)
/*
IF NOT IS_BIT_SET (BitSet_CellphoneDisplay_Third, g_BSTHIRD_HUMAN_TAKEOUT_FOR_HANDS_FREE_HELP_DONE)
PRINT_HELP("CELL_HF_VIEW") //When hidden during a chat call, press ~INPUT_CELLPHONE_UP~ to view your cellphone again.
SET_BIT (BitSet_CellphoneDisplay_Third, g_BSTHIRD_HUMAN_TAKEOUT_FOR_HANDS_FREE_HELP_DONE)
ENDIF
*/
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF g_B_External_Interrupt_Autoplay_MovieFail_Flag = TRUE
g_B_ForcedAway = TRUE
HANG_UP_AND_PUT_AWAY_PHONE()
#if IS_DEBUG_BUILD
cdPrintstring("CELLPHONE_FH - Movie Fail returns true, flashhand calls HANG_UP_AND_PUT_AWAY_PHONE")
cdPrintnl()
#endif
ENDIF
//Additional clause for 246816
IF g_Attempted_Call_Aborted = TRUE
g_B_ForcedAway = TRUE
HANG_UP_AND_PUT_AWAY_PHONE()
#if IS_DEBUG_BUILD
cdPrintstring("CELLPHONE_FH - Attempted_Call_Aborted returns true, flashhand calls HANG_UP_AND_PUT_AWAY_PHONE")
cdPrintnl()
#endif
ENDIF
IF g_bInMultiplayer
IF NOT IS_BIT_SET (BitSet_CellphoneDisplay_Third, g_BSTHIRD_KEEP_MP_CALL_ACTIVE_ON_PAUSE_MENU) //Can be set via public proc KEEP_MP_CALL_ACTIVE_ON_PAUSE_MENU()
IF IS_PAUSE_MENU_ACTIVE()
AND NOT IS_LOCAL_PLAYER_USING_DRONE()
IF voiceSession.bInVoiceSession = TRUE //Clause to prevent pause menu hanging up Chat Calls - #1478433
#if IS_DEBUG_BUILD
cdPrintstring("CELLPHONE_FH - MP Pause Menu Active - no keep call bit set, NOT hanging up phone as this player in VOICE SESSION.")
cdPrintnl()
#endif
ELSE
#if IS_DEBUG_BUILD
cdPrintstring("CELLPHONE_FH - MP Pause Menu Active - no keep call bit set, flashhand calling HANG_UP_AND_PUT_AWAY_PHONE...")
cdPrintnl()
#endif
Check_For_Ongoing_Call_Interruption()
HANG_UP_AND_PUT_AWAY_PHONE()
ENDIF
ENDIF
ENDIF
ENDIF
//Move phone away if the player in injured and, if appropriate, set g_LastCellphoneCallInterrupted to TRUE beforehand.
IF IS_PLAYER_PLAYING (PLAYER_ID()) //will replace this with health differential...
//Disable Camera app if in water or in certain vehicles. App will be greyed out dynamically if phone is on homescreen.
IF IS_ENTITY_IN_WATER (PLAYER_PED_ID())
IF GET_ENTITY_SUBMERGED_LEVEL(PLAYER_PED_ID()) > 0.3
//preventing camera use in deeper water due to code request. See bug #1238505
#if IS_DEBUG_BUILD
IF g_DumpDisableEveryFrameCaller
cdPrintnl()
cdPrintstring("CELLPHONE_FH - No camera use due to submerged level exceeding 0.3. See Bug 1336898.")
cdPrintnl()
ENDIF
#endif
SET_BIT (BitSet_CellphoneDisplay_Continued, g_BSC_REQUESTED_DISABLE_CAMERA_APP_THIS_FRAME)
ENDIF
IF GET_ENTITY_SUBMERGED_LEVEL(PLAYER_PED_ID()) = 1.0
IF IS_BIT_SET(g_FMMC_STRUCT.iOptionsMenuBitSetTwentySeven, ciOptionsBS27_HidePhoneInWater)
AND (NETWORK_IS_ACTIVITY_SESSION() OR g_bFMMC_InTestMode_MissionController)
HIDE_ACTIVE_PHONE(TRUE, TRUE)
SET_BIT(BitSet_CellphoneDisplay, g_BS_HAS_CELLPHONE_FULLY_MOVED_UP)
#if IS_DEBUG_BUILD
cdPrintstring("CELLPHONE_FH - Mission Option is enabled. Hiding Active Phone Instead of Hanging up. (Submerge Level is equal 1.0 See bug 6456016 (1)")
cdPrintnl()
#endif
ELSE
g_B_ForcedAway = TRUE
Check_For_Ongoing_Call_Interruption()
HANG_UP_AND_PUT_AWAY_PHONE()
#if IS_DEBUG_BUILD
cdPrintstring("CELLPHONE_FH - Terminating SP and MP mobile phone use as ped submerge level is equal to 1.0. See bug 1950752")
cdPrintnl()
#endif
ENDIF
ENDIF
ENDIF
IF IS_CURRENTLY_ON_MISSION_OF_TYPE (MISSION_TYPE_DIRECTOR)
IF GET_ENTITY_MODEL(PLAYER_PED_ID()) = g_savedGlobals.sCharSheetData.g_CharacterSheet[CHAR_MICHAEL].game_model
OR GET_ENTITY_MODEL(PLAYER_PED_ID()) = g_savedGlobals.sCharSheetData.g_CharacterSheet[CHAR_FRANKLIN].game_model
OR GET_ENTITY_MODEL(PLAYER_PED_ID()) = g_savedGlobals.sCharSheetData.g_CharacterSheet[CHAR_TREVOR].game_model
b_ShouldDisableDirModeVehicleCamForThisActor = FALSE
ELSE
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID()) //2410401 - Prevent Snapmatic use in a vehicle for non story character peds in Director Mode.
b_ShouldDisableDirModeVehicleCamForThisActor = TRUE
ENDIF
ENDIF
ENDIF
IF IS_PED_IN_ANY_TRAIN(PLAYER_PED_ID())
OR IS_PLAYER_RIDING_TRAIN(PLAYER_ID())
OR IS_PED_ON_MOUNT (PLAYER_PED_ID()) //Don't allow camera use on horseback.
OR IS_STUNT_JUMP_IN_PROGRESS()
OR IS_PLAYER_CLIMBING (PLAYER_ID())
OR IS_PED_JACKING(PLAYER_PED_ID())
OR IS_PED_IN_COVER(PLAYER_PED_ID())
OR IS_PED_HANGING_ON_TO_VEHICLE(PLAYER_PED_ID()) //1950639
OR GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH ("Michael1")) > 0
OR g_bResultScreenPrepared = TRUE //2115760
#if USE_TU_CHANGES
OR Is_Ped_Drunk (PLAYER_PED_ID()) //from drunk_public.sch See bug 1712545
OR IS_VEHICLE_DRIVEABLE(GET_VEHICLE_PED_IS_ENTERING(PLAYER_PED_ID()))
OR IS_PED_IN_MELEE_COMBAT(PLAYER_PED_ID())
OR GET_USINGNIGHTVISION()
OR b_ShouldDisableDirModeVehicleCamForThisActor
#endif
#if IS_DEBUG_BUILD
IF g_DumpDisableEveryFrameCaller
cdPrintnl()
cdPrintstring("CELLPHONE_FH - No camera use in this scenario. See Bug 1336898.")
cdPrintnl()
IF g_bResultScreenPrepared = TRUE
cdPrintnl()
cdPrintstring("CELLPHONE_FH - No camera use as g_bResultScreenPrepared is TRUE. See Bug 2115760.")
cdPrintnl()
ENDIF
ENDIF
#endif
IF NOT g_Use_Prologue_Cellphone
SET_BIT (BitSet_CellphoneDisplay_Continued, g_BSC_REQUESTED_DISABLE_CAMERA_APP_THIS_FRAME)
ENDIF
ENDIF
//Adding in an Enter / Exit vehicle timer mechanism to prevent 3rd person problem when opening Snapmatic immediately after an enter / exit.
IF IS_PC_VERSION() //2269787
IF g_bInMultiplayer = FALSE
IF JustEnteredExitVehicle = FALSE
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
IF NOT IS_PED_SITTING_IN_VEHICLE(PLAYER_PED_ID(),GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID()))
//SET_BIT (BitSet_CellphoneDisplay_Continued, g_BSC_REQUESTED_DISABLE_CAMERA_APP_THIS_FRAME)
JustEnteredExitVehicle_StartTime = GET_GAME_TIMER()//2269787
JustEnteredExitVehicle = TRUE
#if IS_DEBUG_BUILD
cdPrintnl()
cdPrintstring("Cellphone_flashhand - PC Only. Player just entered or exited vehicle. Starting timer for Snapmatic.")
cdPrintnl()
#endif
ENDIF
ENDIF
ELSE
JustEnteredExitVehicle_CurrentTime = GET_GAME_TIMER()
i_TimeDifference = JustEnteredExitVehicle_CurrentTime - JustEnteredExitVehicle_StartTime
IF i_TimeDifference < 4000
SET_BIT (BitSet_CellphoneDisplay_Continued, g_BSC_REQUESTED_DISABLE_CAMERA_APP_THIS_FRAME)
#if IS_DEBUG_BUILD
cdPrintnl()
cdPrintstring("Cellphone_flashhand - PC Only. Player just entered or exited vehicle. Timer block ongoing.")
cdPrintnl()
#endif
ELSE
JustEnteredExitVehicle = FALSE
#if IS_DEBUG_BUILD
cdPrintnl()
cdPrintstring("Cellphone_flashhand - PC Only. Player just entered or exited vehicle. Clearing timer and Entered_Exit bool.")
cdPrintnl()
#endif
ENDIF
ENDIF
ENDIF
ENDIF
//2156297 - Camera use is prevented when aiming any kind of weapon... grey out icon in that case.
IF IS_CONTROL_PRESSED(PLAYER_CONTROL, INPUT_AIM)
OR IS_CONTROL_PRESSED(PLAYER_CONTROL, INPUT_VEH_AIM)
IF g_bInMultiplayer
GET_CURRENT_PED_WEAPON(PLAYER_PED_ID(), fh_TempWeapon)
IF fh_TempWeapon <> WEAPONTYPE_UNARMED
AND g_Cellphone.PhoneDS < PDS_RUNNINGAPP
SET_BIT (BitSet_CellphoneDisplay_Continued, g_BSC_REQUESTED_DISABLE_CAMERA_APP_THIS_FRAME)
ENDIF
ENDIF
ENDIF
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
//Cheaper to have these clauses separated rather than a big compound if.
tempFH_VehicleIndex = GET_VEHICLE_PED_IS_IN (PLAYER_PED_ID()) //Any additions to the model list below should be cloned in appCamera's abort list as a failsafe.
/* //Bicycle check removed again, thanks to #1333593
IF (IS_THIS_MODEL_A_BICYCLE (GET_ENTITY_MODEL (tempFH_VehicleIndex)))
IF g_bInMultiplayer = FALSE
#if IS_DEBUG_BUILD
cdprintstring("CELLPHONE_FH - Phone up when on bicycle in SP. Aborting!")
cdprintnl()
#endif
HANG_UP_AND_PUT_AWAY_PHONE()
ENDIF
ENDIF
*/
IF GET_ENTITY_MODEL (tempFH_VehicleIndex) = SUBMERSIBLE //For #1291886
OR GET_ENTITY_MODEL (tempFH_VehicleIndex) = SUBMERSIBLE2 //For #2050088
b_inSubmersible = TRUE
ELSE
b_inSubmersible = FALSE
ENDIF
IF GET_ENTITY_MODEL (tempFH_VehicleIndex) = RHINO //no camera use in tank. See bug 394784
OR GET_ENTITY_MODEL (tempFH_VehicleIndex) = CUTTER //#1165672
OR GET_ENTITY_MODEL (tempFH_VehicleIndex) = CHERNOBOG //Added this check for 4199535 - No Snapmatic use in any seat in Chernobog. Front looks ropey, back decidedly dodgy!
OR GET_ENTITY_MODEL (tempFH_VehicleIndex) = KHANJALI //url:bugstar:4692191
OR b_inSubmersible //no camera use in submersible. See bug #1126212
OR (IS_VEHICLE_DRIVEABLE(tempFH_VehicleIndex) = FALSE) //#1950567
SET_BIT (BitSet_CellphoneDisplay_Continued, g_BSC_REQUESTED_DISABLE_CAMERA_APP_THIS_FRAME)
ENDIF
IF GET_ENTITY_MODEL (tempFH_VehicleIndex) = VALKYRIE //Fix for 2015231 - no Snapmatic use in turret seat.
OR GET_ENTITY_MODEL (tempFH_VehicleIndex) = INSURGENT //Fix for 2069655 - no Snapmatic use in turret seat for this one either.
OR GET_ENTITY_MODEL (tempFH_VehicleIndex) = TECHNICAL //Fix for 2079585 - no Snapmatic use when using the truckbed gun of this one.
OR GET_ENTITY_MODEL (tempFH_VehicleIndex) = TRASH //Fix for 2079577 - no Snapmatic use when hanging off back of this vehicle.
OR GET_ENTITY_MODEL (tempFH_VehicleIndex) = TRASH2 //Same as directly above.
OR GET_ENTITY_MODEL (tempFH_VehicleIndex) = LIMO2 //Added this check for 2578841 - No Snapmatic use in Limo Turret.
OR GET_ENTITY_MODEL (tempFH_VehicleIndex) = INSURGENT3 //Added this check for 3523983 - No Snapmatic use in INSURGENT3
OR GET_ENTITY_MODEL (tempFH_VehicleIndex) = HALFTRACK //Added this check for 3524009 - No Snapmatic use in HALFTRACK
OR GET_ENTITY_MODEL (tempFH_VehicleIndex) = DUNE3 //Added this check for 3527081 - No Snapmatic use in DUNE3
OR GET_ENTITY_MODEL (tempFH_VehicleIndex) = TRAILERSMALL2 //Added this check for 3530733 - No Snapmatic use in TRAILERSMALL2
OR GET_ENTITY_MODEL (tempFH_VehicleIndex) = TECHNICAL2 //Added this check for 3235690 - No Snapmatic use in Technical2 Turret.
OR GET_ENTITY_MODEL (tempFH_VehicleIndex) = BOXVILLE5 //Added this check for 3235690 - No Snapmatic use in Boxville5 Turret.
OR GET_ENTITY_MODEL (tempFH_VehicleIndex) = MOGUL //Added this check for 3781452 - No Snapmatic use in Mogul Turret.
OR GET_ENTITY_MODEL (tempFH_VehicleIndex) = BOMBUSHKA //Added this check for pre-emptive strike on 3781452
OR GET_ENTITY_MODEL (tempFH_VehicleIndex) = TULA //Added this check for pre-emptive strike on 3781452
OR GET_ENTITY_MODEL (tempFH_VehicleIndex) = CHERNOBOG //Added this check for 4199535 - No Snapmatic use in Chernobog.
IF IS_PED_SITTING_IN_VEHICLE(PLAYER_PED_ID(), tempFH_VehicleIndex)
//VEHICLE_SEAT tempVehicleSeat = GET_PED_VEHICLE_SEAT(PLAYER_PED_ID(), tempFH_VehicleIndex)
VEHICLE_SEAT tempVehicleSeat = GetSeatForTurretCheck(PLAYER_PED_ID(), tempFH_VehicleIndex)
/* Enum for reference.
ENUM VEHICLE_SEAT
VS_ANY_PASSENGER = -2, //Any passenger seat
VS_DRIVER = -1, //Drivers seat
VS_FRONT_RIGHT = 0, //Front Right seat
VS_BACK_LEFT, //Back left
VS_BACK_RIGHT, //Back right
VS_EXTRA_LEFT_1,
VS_EXTRA_RIGHT_1,
VS_EXTRA_LEFT_2,
VS_EXTRA_RIGHT_2,
VS_EXTRA_LEFT_3,
VS_EXTRA_RIGHT_3
ENDENUM
*/
#if IS_DEBUG_BUILD
cdPrintstring("Cellphone_Flashhand - Returned player seat enum from Valkyrie Insurgent Technical Limo2 Other was ")
cdPrintInt(ENUM_TO_INT(tempVehicleSeat))
cdPrintnl()
#endif
IF tempVehicleSeat <> VS_ANY_PASSENGER
IF GET_ENTITY_MODEL (tempFH_VehicleIndex) = INSURGENT
OR GET_ENTITY_MODEL (tempFH_VehicleIndex) = LIMO2 //Added this check for 2578841. Limo2 turret also returns 3 for the turret seat. Climb on top of the vehicle for easy access.
IF ENUM_TO_INT (tempVehicleSeat) = 3
SET_BIT (BitSet_CellphoneDisplay_Continued, g_BSC_REQUESTED_DISABLE_CAMERA_APP_THIS_FRAME)
ENDIF
ENDIF
//2079577
IF GET_ENTITY_MODEL (tempFH_VehicleIndex) = TRASH
OR GET_ENTITY_MODEL (tempFH_VehicleIndex) = TRASH2
IF ENUM_TO_INT (tempVehicleSeat) = 2
OR ENUM_TO_INT (tempVehicleSeat) = 1
SET_BIT (BitSet_CellphoneDisplay_Continued, g_BSC_REQUESTED_DISABLE_CAMERA_APP_THIS_FRAME)
ENDIF
ENDIF
//3235690
IF GET_ENTITY_MODEL (tempFH_VehicleIndex) = TECHNICAL2
IF ENUM_TO_INT (tempVehicleSeat) = 1
SET_BIT (BitSet_CellphoneDisplay_Continued, g_BSC_REQUESTED_DISABLE_CAMERA_APP_THIS_FRAME)
ENDIF
ENDIF
IF GET_ENTITY_MODEL (tempFH_VehicleIndex) = BOXVILLE5
IF ENUM_TO_INT (tempVehicleSeat) = 3
SET_BIT (BitSet_CellphoneDisplay_Continued, g_BSC_REQUESTED_DISABLE_CAMERA_APP_THIS_FRAME)
ENDIF
ENDIF
//3523983, 3527081 and 3524009.
//3530733.
IF GET_ENTITY_MODEL (tempFH_VehicleIndex) = INSURGENT3
IF ENUM_TO_INT (tempVehicleSeat) = 3
SET_BIT (BitSet_CellphoneDisplay_Continued, g_BSC_REQUESTED_DISABLE_CAMERA_APP_THIS_FRAME)
ENDIF
ENDIF
IF GET_ENTITY_MODEL (tempFH_VehicleIndex) = HALFTRACK
IF ENUM_TO_INT (tempVehicleSeat) = 1
SET_BIT (BitSet_CellphoneDisplay_Continued, g_BSC_REQUESTED_DISABLE_CAMERA_APP_THIS_FRAME)
ENDIF
ENDIF
IF GET_ENTITY_MODEL (tempFH_VehicleIndex) = DUNE3
IF ENUM_TO_INT (tempVehicleSeat) = 0
SET_BIT (BitSet_CellphoneDisplay_Continued, g_BSC_REQUESTED_DISABLE_CAMERA_APP_THIS_FRAME)
ENDIF
ENDIF
IF GET_ENTITY_MODEL (tempFH_VehicleIndex) = TRAILERSMALL2 //3530733
IF ENUM_TO_INT (tempVehicleSeat) = -1
SET_BIT (BitSet_CellphoneDisplay_Continued, g_BSC_REQUESTED_DISABLE_CAMERA_APP_THIS_FRAME)
ENDIF
ENDIF
IF IS_TURRET_SEAT(tempFH_VehicleIndex, tempVehicleSeat) //Doesn't seem to work for the Insurgent.
SET_BIT (BitSet_CellphoneDisplay_Continued, g_BSC_REQUESTED_DISABLE_CAMERA_APP_THIS_FRAME)
//Disables and greys out Snapmatic homescreen icon.
/*
#if IS_DEBUG_BUILD
cdPrintstring("Cellphone_Flashhand - Turret Seat returning true for this vehicle seat.")
cdPrintnl()
#endif
*/
ENDIF
ENDIF
ENDIF
ENDIF
IF IS_CONTROL_JUST_PRESSED (PLAYER_CONTROL, INPUT_VEH_ATTACK) //This also acts as accelerate in some configurations, so can't be checked if in a vehicle.
IF g_bInMultiplayer = FALSE //Phone is not in hand in multiplayer so this allows simultaneous firing and phone use. SP checks required only.
IF g_Cellphone.PhoneDS = PDS_MAXIMUM
OR g_Cellphone.PhoneDS = PDS_RUNNINGAPP
BOOL OK_to_abort_Phone = TRUE
//Potential fix for Mike W. #1770981
IF GET_ENTITY_MODEL (tempFH_VehicleIndex) = (INT_TO_ENUM(MODEL_NAMES, HASH("STROMBERG")))
AND IS_ENTITY_IN_WATER (tempFH_VehicleIndex)
OK_to_abort_Phone = FALSE
ENDIF
IF (IS_THIS_MODEL_A_HELI(GET_ENTITY_MODEL (tempFH_VehicleIndex)))
OR (IS_THIS_MODEL_A_PLANE(GET_ENTITY_MODEL (tempFH_VehicleIndex)))
OR (GET_ENTITY_MODEL (tempFH_VehicleIndex) = SUBMERSIBLE)
OR (GET_ENTITY_MODEL (tempFH_VehicleIndex) = SUBMERSIBLE2)
OK_to_abort_Phone = FALSE
ENDIF
IF OK_to_abort_Phone
#if IS_DEBUG_BUILD
cdprintstring("CELLPHONE_FH - Phone in running app or maximum state. In vehicle player attack instruction from pad takes precedence, moving phone away. LB TODO #1235429")
cdprintnl()
#endif
HANG_UP_AND_PUT_AWAY_PHONE()
ENDIF
ENDIF
ENDIF
ENDIF
ELSE
IF IS_CONTROL_JUST_PRESSED (PLAYER_CONTROL, INPUT_ATTACK) //This also acts as accelerate in some configurations, so can't be checked if in a vehicle.
IF g_bInMultiplayer = FALSE //Phone is not in hand in multiplayer so this allows simultaneous firing and phone use. SP checks required only.
IF g_Cellphone.PhoneDS = PDS_MAXIMUM
OR g_Cellphone.PhoneDS = PDS_RUNNINGAPP
#if IS_DEBUG_BUILD
cdprintstring("CELLPHONE_FH - Phone in running app or maximum state. On foot player attack instruction from pad takes precedence, moving phone away. LB TODO #1235429")
cdprintnl()
#endif
HANG_UP_AND_PUT_AWAY_PHONE()
ENDIF
ENDIF
ENDIF
b_inSubmersible = FALSE
ENDIF
IF IS_PED_SWIMMING_UNDER_WATER (PLAYER_PED_ID())
IF IS_BIT_SET(g_FMMC_STRUCT.iOptionsMenuBitSetTwentySeven, ciOptionsBS27_HidePhoneInWater)
AND (NETWORK_IS_ACTIVITY_SESSION() OR g_bFMMC_InTestMode_MissionController)
HIDE_ACTIVE_PHONE(TRUE, TRUE)
#if IS_DEBUG_BUILD
cdPrintstring("CELLPHONE_FH - Mission Option is enabled. Hiding Active Phone Instead of Hanging up. (Submerge Level is equal 1.0 See bug 6456016 (2)")
cdPrintnl()
#endif
ELSE
g_B_ForcedAway = TRUE
Check_For_Ongoing_Call_Interruption()
HANG_UP_AND_PUT_AWAY_PHONE()
#if IS_DEBUG_BUILD
cdPrintstring("CELLPHONE_FH - Terminating SP and MP mobile phone use as ped is swimming under water. See bug 990085 and 1018500")
cdPrintnl()
#endif
ENDIF
ENDIF
IF g_bInMultiplayer = FALSE
IF GET_ENTITY_HEALTH (PLAYER_PED_ID()) < Player_PeriodicHealth
IF NOT (IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID()))
g_B_ForcedAway = TRUE
Check_For_Ongoing_Call_Interruption()
HANG_UP_AND_PUT_AWAY_PHONE()
#if IS_DEBUG_BUILD
cdPrintstring("CELLPHONE_FH - Damage sustained by player outside of vehicle, flashhand calls HANG_UP_AND_PUT_AWAY_PHONE")
cdPrintnl()
#endif
ENDIF
ENDIF
//Superseded by new water check above but leaving in for reference in the meantime. Runs in SP only.
IF g_Cellphone.PhoneDS = PDS_ONGOING_CALL
OR g_Cellphone.PhoneDS = PDS_ATTEMPTING_TO_CALL_CONTACT
IF IS_PED_SWIMMING_UNDER_WATER (PLAYER_PED_ID())
g_B_ForcedAway = TRUE
Check_For_Ongoing_Call_Interruption()
HANG_UP_AND_PUT_AWAY_PHONE()
#if IS_DEBUG_BUILD
cdPrintstring("CELLPHONE_FH - Terminating SP mobile phone call swimming in water. See bug 907295.")
cdPrintnl()
#endif
ENDIF
ENDIF
/* Removed by request of 801233.
IF IS_SPECIAL_ABILITY_ACTIVE (PLAYER_ID()) //Asserts if checked in multiplayer.
g_B_ForcedAway = TRUE
Check_For_Ongoing_Call_Interruption()
HANG_UP_AND_PUT_AWAY_PHONE()
#if IS_DEBUG_BUILD
cdPrintstring ("CELLPHONE_FH - Phone somehow active during special ability, flashhand calls HANG_UP_AND_PUT_AWAY_PHONE")
cdPrintnl ()
#endif
ENDIF
*/
ELSE
IF IS_CELLPHONE_CAMERA_IN_USE() //Special damage during camera use check for 1253746
IF GET_ENTITY_HEALTH (PLAYER_PED_ID()) < Player_PeriodicHealth
IF NOT (IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID()))
g_B_ForcedAway = TRUE
Check_For_Ongoing_Call_Interruption()
HANG_UP_AND_PUT_AWAY_PHONE()
#if IS_DEBUG_BUILD
cdPrintstring("CELLPHONE_FH - Damage sustained by player outside of vehicle during MP camera use, flashhand calls HANG_UP_AND_PUT_AWAY_PHONE")
cdPrintnl()
#endif
ENDIF
ENDIF
ENDIF
ENDIF //end of g_bInMultiplayer = FALSE condition check
IF IS_AIM_CAM_ACTIVE() //fix for 807395. Abort the phone is the sniper aim cam is active.
IF NOT (IS_PED_IN_COVER (PLAYER_PED_ID(), TRUE)) //potential fix for #1069548, aim cam is deemed active in MP if the ped is in cover with the sniper rifle.
IF NOT (IS_CELLPHONE_CAMERA_IN_USE()) //potential fix for #1130708 - the first person viewfinder camera used in photo taking counts as AIM_CAM also.
//We don't want to abort the camera if the player has a sniper rifle then starts the app, so only abort the phone if the
//camera script is not running.
GET_CURRENT_PED_WEAPON(PLAYER_PED_ID(), fh_TempWeapon)
IF fh_TempWeapon = WEAPONTYPE_SNIPERRIFLE
OR fh_TempWeapon = WEAPONTYPE_HEAVYSNIPER
OR fh_TempWeapon = WEAPONTYPE_REMOTESNIPER
b_Sniper_equipped = TRUE
ELSE
b_Sniper_equipped = FALSE
ENDIF
IF IS_FIRST_PERSON_AIM_CAM_ACTIVE() //Added by request of Blair in #2009400
IF b_Sniper_equipped
g_B_ForcedAway = TRUE
Check_For_Ongoing_Call_Interruption()
HANG_UP_AND_PUT_AWAY_PHONE()
#if IS_DEBUG_BUILD
cdPrintstring("CELLPHONE_FH - sniper fp aim cam is active at same time as hud phone, flashhand calls HANG_UP_AND_PUT_AWAY_PHONE")
cdPrintnl()
#endif
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF IS_PED_BEING_JACKED (PLAYER_PED_ID())
g_B_ForcedAway = TRUE
Check_For_Ongoing_Call_Interruption()
HANG_UP_AND_PUT_AWAY_PHONE()
#if IS_DEBUG_BUILD
cdPrintstring("CELLPHONE_FH - Player has been jacked, flashhand calls HANG_UP_AND_PUT_AWAY_PHONE")
cdPrintnl()
#endif
ENDIF
IF IS_PED_BEING_STUNNED (PLAYER_PED_ID())
g_B_ForcedAway = TRUE
Check_For_Ongoing_Call_Interruption()
HANG_UP_AND_PUT_AWAY_PHONE()
#if IS_DEBUG_BUILD
cdPrintstring("CELLPHONE_FH - Player has been stunned, flashhand calls HANG_UP_AND_PUT_AWAY_PHONE")
cdPrintnl()
#endif
ENDIF
IF IS_PLAYER_BEING_ARRESTED (PLAYER_ID())
g_B_ForcedAway = TRUE
Check_For_Ongoing_Call_Interruption()
HANG_UP_AND_PUT_AWAY_PHONE()
#if IS_DEBUG_BUILD
cdPrintstring("CELLPHONE_FH - Player has been arrested, flashhand calls HANG_UP_AND_PUT_AWAY_PHONE")
cdPrintnl()
#endif
ENDIF
IF IS_PED_RAGDOLL (PLAYER_PED_ID())
OR IS_PED_IN_PARACHUTE_FREE_FALL (PLAYER_PED_ID()) //#1392720
IF g_bInMultiplayer = FALSE //requested by Andrew Duthie in bug 519214.
g_B_ForcedAway = TRUE
Check_For_Ongoing_Call_Interruption()
HANG_UP_AND_PUT_AWAY_PHONE()
#if IS_DEBUG_BUILD
cdPrintstring("CELLPHONE_FH - Player is ragdolling or freefalling, flashhand calls HANG_UP_AND_PUT_AWAY_PHONE")
cdPrintnl()
#endif
ENDIF
ENDIF
//Submerged vehicle handling.
/*Removed - see bug 109069
IF IS_PED_IN_ANY_VEHICLE (PLAYER_PED_ID())
Cellphone_CurrentPlayerVehicle = GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID())
IF IS_ENTITY_IN_WATER (Cellphone_CurrentPlayerVehicle)
Check_For_Ongoing_Call_Interruption()
HANG_UP_AND_PUT_AWAY_PHONE()
#if IS_DEBUG_BUILD
cdPrintstring("Player in submerging car, flashhand calls HANG_UP_AND_PUT_AWAY_PHONE")
cdPrintnl()
#endif
ENDIF
ENDIF
*/
//Update 25.11.11 - by request of TODO 293726 this check has been removed.
//Franklin has a waterproof phone, multiplayer allows it!
/*
IF NOT g_bInMultiplayer
IF NOT (g_Cellphone.PhoneOwner = CHAR_FRANKLIN)
IF IS_ENTITY_IN_WATER (PLAYER_PED_ID())
g_B_ForcedAway = TRUE
Check_For_Ongoing_Call_Interruption()
HANG_UP_AND_PUT_AWAY_PHONE()
#if IS_DEBUG_BUILD
cdPrintstring("CELLPHONE_FH - Player character in water but does not have waterproof phone, flashhand calls HANG_UP_AND_PUT_AWAY_PHONE")
cdPrintnl()
#endif
ENDIF
ENDIF
ENDIF
*/
ELSE
BOOL b_ShouldKeepPhoneActiveOnDeathArrest = FALSE
IF g_bInMultiplayer
AND voiceSession.bInVoiceSession
AND voiceSession.bConnectedCallOnGoing
AND g_Cellphone.PhoneDS = PDS_ONGOING_CALL
b_ShouldKeepPhoneActiveOnDeathArrest = TRUE
#if IS_DEBUG_BUILD
cdPrintstring("CELLPHONE_FH - Failsafe: Player is arrested or dead, flashhand has detected the player is in MP and in a connected voice session. Preserving phone.")
cdPrintnl()
#endif
// Could remove this block for Next Gen as vanishing the phone causes great confusion in first person.
IF NOT (IS_BIT_SET (BitSet_CellphoneDisplay_Continued, g_BSC_CALL_IN_PROGRESS_VANISH_PHONE)) //Don't want to check this when phone is in transit...
IF IS_BIT_SET (BitSet_CellphoneDisplay_Continued, g_BSC_CALL_IN_PROGRESS_PHONE_FULLY_VANISHED) //Also need to make sure phone has actually been vanished once before reinstating it...
#if IS_DEBUG_BUILD
cdPrintstring ("CELLPHONE_FH - Vanished phone ordered to re-appear due to death arrest during cellphone chat call.")
cdPrintnl()
#endif
SET_BIT (BitSet_CellphoneDisplay_Continued, g_BSC_CALL_IN_PROGRESS_REINSTATE_PHONE) //signal that we want to run transit routine now.
CLEAR_BIT (BitSet_CellphoneDisplay_Continued, g_BSC_CALL_IN_PROGRESS_PHONE_FULLY_VANISHED) //phone no longer vanished.
CLEAR_BIT (BitSet_CellphoneDisplay_Third, g_BSTHIRD_DO_NOT_MOVE_PHONE_UP_ON_LAUNCH)
ENDIF
ENDIF
ENDIF
IF b_ShouldKeepPhoneActiveOnDeathArrest = FALSE //Trial additions for TODO 1643537
g_B_ForcedAway = TRUE
Check_For_Ongoing_Call_Interruption()
HANG_UP_AND_PUT_AWAY_PHONE()
#if IS_DEBUG_BUILD
cdPrintstring("CELLPHONE_FH - Failsafe: Player is arrested or dead, flashhand calls HANG_UP_AND_PUT_AWAY_PHONE")
cdPrintnl()
#endif
ENDIF
ENDIF
ENDIF
IF g_InputButtonJustPressed = TRUE
Check_For_Just_Pressed_Revert()
ENDIF
//Special case for force answer and bug 29540
//This will call this every cycle until the call is cleaned up - may add a global or something to prevent this, although it causes no adverse effects
//for a ringing tone. It has to be done here not in the more obvious dialogue_handler due to the manner in which the sound ids are tied to a script.
IF g_InboundCallWaitAccRej = CALL_ACCEPTED
// B*2205053
IF IS_USING_KEYBOARD_AND_MOUSE(FRONTEND_CONTROL)
SET_INPUT_EXCLUSIVE(PLAYER_CONTROL, (INT_TO_ENUM(CONTROL_ACTION, PHONE_POSITIVE_INPUT)))
SET_INPUT_EXCLUSIVE(PLAYER_CONTROL, (INT_TO_ENUM(CONTROL_ACTION, PHONE_NEGATIVE_INPUT)))
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_ATTACK)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_ATTACK2)
ENDIF
IF NOT IS_ENTITY_DEAD (PLAYER_PED_ID())
//STOP_SOUND (g_Phone_Ringtone_SoundID) ////#1392094 swap
STOP_PED_RINGTONE (PLAYER_PED_ID())
ENDIF
ENDIF
#if IS_DEBUG_BUILD
//draw_debug_screen_grid()
//Uncomment to spam phone state or safety buffer for tricky bugs.
/*
cdPrintstring ("Phone_state = ")
cdPrintint(ENUM_TO_INT (g_Cellphone.PhoneDS))
cdPrintnl()
*/
/*
cdPrintstring ("Cellphone SafetyBuffer Elapsed Duration = ")
cdPrintint(g_App_Elapsed_SafetyBuffer)
cdPrintnl()
cdPrintnl()
cdPrintstring ("START TIME Cellphone SafetyBuffer = ")
cdPrintint(g_App_SafetyBuffer_StartTime)
cdPrintnl()
cdPrintnl()
*/
GET_MOBILE_PHONE_ROTATION (v_DebugRotation)
//DISPLAY_TEXT_WITH_LITERAL_STRING (0.60, 0.30, "STRING", "Current phone rotation")
//DISPLAY_TEXT_WITH_FLOAT (0.6, 0.35, "CELL_500", v_DebugRotation.X, 2)
//DISPLAY_TEXT_WITH_FLOAT (0.6, 0.40, "CELL_501", v_DebugRotation.Y, 2)
//DISPLAY_TEXT_WITH_FLOAT (0.6, 0.45, "CELL_502", v_DebugRotation.Z, 2)
/*
IF IS_KEYBOARD_KEY_JUST_PRESSED (KEY_0)
IF testSignalInt < 4
testSignalInt ++
ELSE
testSignalInt = 0
ENDIF
ENDIF
DISPLAY_TEXT_WITH_NUMBER (0.20, 0.45, "CELL_500", i_Affluence)
*/
#endif
ENDWHILE
ENDSCRIPT