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

800 lines
30 KiB
Scheme
Executable File

//////////////////////////////////////////////////////////////////////
/* shrink_office.sch */
/* Author: DJ Jones, Yomal Perera */
/* Functionality for shrink office sessions. */
//////////////////////////////////////////////////////////////////////
USING "flow_public_game.sch"
USING "clubs_public.sch"
USING "shrink_kill.sch"
USING "rc_helper_functions.sch"
// Disable player controls for the current frame. To be used for Accept/Deny scripted cam.
PROC SHRINK_DISABLE_PLAYER_CONTROLS()
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
DISABLE_CELLPHONE_THIS_FRAME_ONLY()
HIDE_HUD_COMPONENT_THIS_FRAME(NEW_HUD_WEAPON_WHEEL)
IF IS_USING_KEYBOARD_AND_MOUSE(FRONTEND_CONTROL)
DISABLE_CONTROL_ACTION(FRONTEND_CONTROL, INPUT_FRONTEND_PAUSE_ALTERNATE, FALSE) // only disable alternate pause not real pause
ENDIF
ENDPROC
// Script entry point.
SCRIPT
SET_MISSION_FLAG(TRUE)
#IF IS_DEBUG_BUILD
g_b_CellDialDebugTextToggle = FALSE
#ENDIF
BOOl bShrinkEnteredVeh, bChoice, bHasPlayerMadeChoice, bDrPrompt, bIntroSetup, bVariationsRequested
structTimer cameraPanTimer, tmrClothingRestore
CAMERA_INDEX introCam1, introCam2
TEXT_LABEL_15 sAudioBlock = "DrfAud"
TEXT_LABEL_15 sBase
//TEXT_LABEL_15 sLine
FLOAT fRejectDelay
BOOL bChaseStarted
BOOL bSkip
BOOL bEventsAllowed
iUpperVariation = PICK_INT(GET_RANDOM_BOOL(), 0, 1)
iUpperTexture = PICK_INT(GET_RANDOM_BOOL(), 0, 1)
iLowerTexture = PICK_INT(GET_RANDOM_BOOL(), 0, 1)
IF HAS_FORCE_CLEANUP_OCCURRED(DEFAULT_FORCE_CLEANUP_FLAGS | FORCE_CLEANUP_FLAG_REPEAT_PLAY)
ENABLE_SELECTOR()
IF bChaseStarted
IF DOES_ENTITY_EXIST(shrinkIGPed) AND IS_PED_INJURED(shrinkIGPed)
SET_MISSION_FLOW_FLAG_STATE(FLOWFLAG_SHRINK_KILLED, TRUE)
STAT_SET_BOOL(SP_KILLED_DR_FRIEDLANDER, TRUE)
ENDIF
MISSION_FLOW_MISSION_PASSED()
ELSE
MISSION_FLOW_MISSION_FORCE_CLEANUP()
ENDIF
SHRINK_OFFICE_CLEANUP(shrinkCSPed, playerVehicle, shrinkMainCam, officeState)
ENDIF
thisSession = SHRINK_GET_CURRENT_MISSION_SESSION()
SHRINK_GET_SESSION_PROPERTIES(sessionProperties, thisSession)
STOP_FIRE_IN_RANGE(<< -1899.75635, -561.36877, 10.78784>>, 100.0)
//Fix for 2300669. Shrink sessions can be auto-completed by the flow. This looks to
//Director Mode like they played and passed the session. Set a saved bit to record when the
//player actually attended a session.
SET_BIT(g_savedGlobals.sFlowCustom.spInitBitset, SP_INIT_SHRINK_SESSION_ATTENDED)
SWITCH SHRINK_GET_CURRENT_MISSION_SESSION()
CASE SHRINKSESSION_OFFICE_CHAOS fRejectDelay = 3.6 BREAK
CASE SHRINKSESSION_OFFICE_EVIL fRejectDelay = 3.6 BREAK
CASE SHRINKSESSION_OFFICE_ABANDONMENT fRejectDelay = 2.5 BREAK
ENDSWITCH
IF NOT IS_PLAYER_DEAD(PLAYER_ID())
AND NOT IS_PED_INJURED(PLAYER_PED_ID())
CLEAR_PLAYER_WANTED_LEVEL(PLAYER_ID())
ENDIF
// Debug mode - force variations
#IF IS_DEBUG_BUILD
INT iCounter, iInnerCounter
IF IS_CONTROL_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_ACCEPT)
AND IS_CONTROL_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_CANCEL)
/*parentWidgets =*/ START_WIDGET_GROUP("DRF")
ADD_WIDGET_BOOL("Run Shrink Session", bLaunchVisit)
/*violenceWidgets =*/ START_WIDGET_GROUP("Violence Variations")
ADD_WIDGET_BOOL("Force DRF_OWR_1", bForceViolence[ 0])
ADD_WIDGET_BOOL("Force DRF_OWR_2", bForceViolence[ 1])
ADD_WIDGET_BOOL("Force DRF_OWR_3", bForceViolence[ 2])
ADD_WIDGET_BOOL("Force DRF_OWR_4_A", bForceViolence[ 3])
ADD_WIDGET_BOOL("Force DRF_OWR_4_B", bForceViolence[ 4])
ADD_WIDGET_BOOL("Force DRF_OWR_4_C", bForceViolence[ 5])
ADD_WIDGET_BOOL("Force DRF_OWR_7_A", bForceViolence[ 6])
ADD_WIDGET_BOOL("Force DRF_OWR_7_B", bForceViolence[ 7])
ADD_WIDGET_BOOL("Force DRF_OWR_7_C", bForceViolence[ 8])
ADD_WIDGET_BOOL("Force DRF_OWR_7_D", bForceViolence[ 9])
ADD_WIDGET_BOOL("Force DRF_OWR_7_E", bForceViolence[10])
ADD_WIDGET_BOOL("Don't force violence variation", bForceViolenceOff)
STOP_WIDGET_GROUP()
/*sexWidgets =*/ START_WIDGET_GROUP("Sex Variations")
ADD_WIDGET_BOOL("Force DRF_PAIR_RESPONSE_1_A", bForceSex[ 0])
ADD_WIDGET_BOOL("Force DRF_PAIR_RESPONSE_1_B", bForceSex[ 1])
ADD_WIDGET_BOOL("Force DRF_PAIR_RESPONSE_1_C", bForceSex[ 2])
ADD_WIDGET_BOOL("Force DRF_PAIR_RESPONSE_1_D", bForceSex[ 3])
ADD_WIDGET_BOOL("Force DRF_PAIR_RESPONSE_1_STRIP_A", bForceSex[ 4])
ADD_WIDGET_BOOL("Force DRF_PAIR_RESPONSE_5_TAKE_01_B", bForceSex[ 5])
ADD_WIDGET_BOOL("Force DRF_PAIR_RESPONSE_5_TAKE_01_C", bForceSex[ 6])
ADD_WIDGET_BOOL("Force DRF_PAIR_RESPONSE_5_PROS_A", bForceSex[ 7])
ADD_WIDGET_BOOL("Force DRF_PAIR_RESPONSE_5_PROS_B", bForceSex[ 8])
ADD_WIDGET_BOOL("Force DRF_PAIR_RESPONSE_5_STRIPPROS_A", bForceSex[ 9])
ADD_WIDGET_BOOL("Force DRF_PAIR_RESPONSE_5_STRIPPROS_B", bForceSex[10])
ADD_WIDGET_BOOL("Force DRF_PAIR_RESPONSE_5_NONE", bForceSex[11])
ADD_WIDGET_BOOL("Don't force sex variation", bForceSexOff)
STOP_WIDGET_GROUP()
STOP_WIDGET_GROUP()
PRINT_STRING_WITH_LITERAL_STRING_NOW("STRING", "Debug Mode: See widgets in Script -> DRF", 60000, 0)
WHILE NOT bLaunchVisit
WAIT(0)
// See if we need to clear violence variations
IF bForceViolenceOff
REPEAT 11 iCounter
bForceViolence[iCounter] = FALSE
bLastForceViolence[iCounter] = FALSE
ENDREPEAT
bForceViolenceOff = FALSE
// Look for newly-selected variations.
ELSE
REPEAT 11 iCounter
IF bForceViolence[iCounter] AND NOT bLastForceViolence[iCounter]
// Turn off all other variations.
REPEAT 11 iInnerCounter
IF iInnerCounter <> iCounter
bForceViolence[iInnerCounter] = FALSE
bLastForceViolence[iInnerCounter] = FALSE
ENDIF
ENDREPEAT
bLastForceViolence[iCounter] = TRUE
iInnerCounter = 11
iCounter = 11
ENDIF
ENDREPEAT
ENDIF
// See if we need to clear sex variations
IF bForceSexOff
REPEAT 12 iCounter
bForceSex[iCounter] = FALSE
bLastForceSex[iCounter] = FALSE
ENDREPEAT
bForceSexOff = FALSE
// Look for newly-selected variations.
ELSE
REPEAT 12 iCounter
IF bForceSex[iCounter] AND NOT bLastForceSex[iCounter]
// Turn off all other variations.
REPEAT 11 iInnerCounter
IF iInnerCounter <> iCounter
bForceSex[iInnerCounter] = FALSE
bLastForceSex[iInnerCounter] = FALSE
ENDIF
ENDREPEAT
bLastForceSex[iCounter] = TRUE
iInnerCounter = 12
iCounter = 12
ENDIF
ENDREPEAT
ENDIF
ENDWHILE
ENDIF
#ENDIF
PRINTLN("Start shrink office")
// Main loop.
WHILE TRUE
WAIT(0)
// Check debug commands.
#IF IS_DEBUG_BUILD
IF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_F)
MISSION_FLOW_MISSION_FAILED()
SHRINK_OFFICE_CLEANUP(shrinkCSPed, playerVehicle, shrinkMainCam, officeState)
ENDIF
#ENDIF
IF officeState <> SHRINKOFFICESTATE_KILL_DR_FRIEDLANDER
AND officeState <> SHRINKOFFICESTATE_KILL_CLEANUP
CLEAR_PLAYER_WANTED_LEVEL(PLAYER_ID())
ENDIF
// Shrink state machine.
SWITCH officeState
// Pre-streaming init.
CASE SHRINKOFFICESTATE_INIT
IF PLAYER_HAS_WEAPON_EQUIPPED()
GIVE_WEAPON_TO_PED(PLAYER_PED_ID(), WEAPONTYPE_UNARMED, INFINITE_AMMO)
ENDIF
REMOVE_PED_HELMET(PLAYER_PED_ID(), TRUE)
SHRINK_OFFICE_INIT(shrinkModels, shrinkCSModelName, shrinkIGModelName, shrinkVehModelName, nextDoorCarModel, chairModel, SHRINK_GET_CURRENT_MISSION_SESSION())
// Turn off UI elements.
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
DISPLAY_HUD(FALSE)
DISPLAY_RADAR(FALSE)
DISABLE_SELECTOR()
WHILE IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID(), TRUE)
WAIT(0)
ENDWHILE
// Player walks toward the office.
TASK_FOLLOW_NAV_MESH_TO_COORD(PLAYER_PED_ID(), <<-1918.9437, -577.8114, 10.8764>>, PEDMOVE_WALK, DEFAULT_TIME_NEVER_WARP)
//WAIT(2000)
introCam1 = CREATE_CAMERA_WITH_PARAMS(CAMTYPE_SCRIPTED, <<-1896.5294, -545.7853, 18.7228>>, <<3.1482, 0.0036, 170.2056>>, 44.9736)
introCam2 = CREATE_CAMERA_WITH_PARAMS(CAMTYPE_SCRIPTED, <<-1896.8657, -547.7337, 18.8316>>, <<4.9529, 0.0036, 170.2056>>, 44.9736)
SET_CAM_ACTIVE_WITH_INTERP(introCam2, introCam1, 5000)
RENDER_SCRIPT_CAMS(TRUE, FALSE)
START_TIMER_NOW(cameraPanTimer)
//LOAD_SHRINK_AUDIO_EVENT(previousAnim)
officeState = SHRINKOFFICESTATE_STREAMING
BREAK
// Wait for streaming, then setup.
CASE SHRINKOFFICESTATE_STREAMING
IF NOT bIntroSetup
IF SHRINK_IS_OFFICE_STREAMING_COMPLETE(shrinkModels)
SHRINK_OFFICE_SETUP_INTRO(shrinkCSPed, shrinkCSModelName, vProcConvShrinkPos, fProcConvShrinkHeading, iUpperVariation, iUpperTexture, iLowerTexture)
SHRINK_OFFICE_REQUEST_INTRO_CUTSCENE(sessionProperties.sIntroConvName, SHRINK_GET_CURRENT_MISSION_SESSION())
START_TIMER_NOW(controlTimer)
bIntroSetup = TRUE
ENDIF
ENDIF
IF bIntroSetup
IF NOT bVariationsRequested
IF CAN_REQUEST_ASSETS_FOR_CUTSCENE_ENTITY()
IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID())
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED_SAFE(sMichaelID, PLAYER_PED_ID())
ENDIF
IF NOT IS_ENTITY_DEAD(shrinkCSPed)
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED_SAFE(sFriedlanderID, shrinkCSPed)
ENDIF
bVariationsRequested = TRUE
ENDIF
ENDIF
ENDIF
// Waiting for setup to complete.
IF GET_TIMER_IN_SECONDS(cameraPanTimer) > 6.0 AND HAS_CUTSCENE_LOADED_WITH_FAILSAFE()
IF (NOT IS_ENTITY_DEAD(PLAYER_PED_ID())) AND (NOT IS_ENTITY_DEAD(shrinkCSPed))
PRINTLN("Register entities for intro cutscene")
REGISTER_ENTITY_FOR_CUTSCENE(PLAYER_PED_ID(), sMichaelID, CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
REGISTER_ENTITY_FOR_CUTSCENE(shrinkCSPed, sFriedlanderID, CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
ENDIF
START_CUTSCENE()
PLAY_STREAM_FRONTEND()
NEW_LOAD_SCENE_STOP()
NEW_LOAD_SCENE_START(<<-1906.8422, -572.3835, 19.1046>>, <<-1.5254, 0.0003, 171.4657>>, 12.0)
CANCEL_TIMER(controlTimer)
CANCEL_TIMER(cameraPanTimer)
officeState = SHRINKOFFICESTATE_INTRO_CUTSCENE
ENDIF
BREAK
// Play the intro cutscene.
CASE SHRINKOFFICESTATE_INTRO_CUTSCENE
IF DOES_CAM_EXIST(introCam1)
DESTROY_CAM(introCam1)
ENDIF
IF DOES_CAM_EXIST(introCam2)
DESTROY_CAM(introCam2)
ENDIF
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY(sMichaelID)
PLAY_IDLE_ANIMS(shrinkCSPed, TRUE, FALSE)
ENDIF
IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY(sFriedlanderID)
PLAY_IDLE_ANIMS(shrinkCSPed, FALSE, TRUE)
ENDIF
IF CAN_SET_EXIT_STATE_FOR_CAMERA()
SHRINK_SETUP_OFFICE_PROC_CONV(shrinkCSPed, shrinkVehicle, playerVehicle, shrinkMainCam, convPeds, vShrinkVehPos, fShrinkVehHeading, shrinkVehModelName)
RELEASE_SHRINK_TRIGGER_ASSETS(SHRINK_GET_CURRENT_MISSION_SESSION())
START_TIMER_NOW(convTimer)
INIT_SIMPLE_USE_CONTEXT(useContext, FALSE, FALSE, FALSE, TRUE)
ADD_SIMPLE_USE_CONTEXT_INPUT(useContext, "SHRINK_ACCEPT", FRONTEND_CONTROL, INPUT_FRONTEND_ACCEPT)
ADD_SIMPLE_USE_CONTEXT_INPUT(useContext, "SHRINK_REJECT", FRONTEND_CONTROL, INPUT_FRONTEND_CANCEL)
bVariationsRequested = FALSE
// This needs to be called again because the cutscene automatically enables controls on exit.
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
officeState = SHRINKOFFICESTATE_PROCEDURAL
IF IS_SCREEN_FADED_OUT()
bSkip = TRUE
ENDIF
ENDIF
BREAK
// Play procedural dialogue.
CASE SHRINKOFFICESTATE_PROCEDURAL
SHRINK_DISABLE_PLAYER_CONTROLS()
IF IS_SCREEN_FADED_OUT() OR bSkip
IF bSkip
DO_SCREEN_FADE_OUT(0)
ENDIF
RESTART_TIMER_NOW(convTimer)
WHILE GET_TIMER_IN_SECONDS(convTimer) < 0.4
WAIT(0)
SHRINK_DISABLE_PLAYER_CONTROLS()
ENDWHILE
WHILE IS_NEW_LOAD_SCENE_ACTIVE() AND NOT IS_NEW_LOAD_SCENE_LOADED()
WAIT(0)
SHRINK_DISABLE_PLAYER_CONTROLS()
ENDWHILE
RESTART_TIMER_NOW(convTimer)
bSkip = FALSE
CERRORLN(DEBUG_MISSION, "Fading in (procedural)")
DO_SCREEN_FADE_IN(400)
ENDIF
IF NOT bHasPlayerMadeChoice
IF (NOT bOutroRequested) AND (NOT IS_CUTSCENE_ACTIVE())
PRINTLN("Requesting cutscene ", sessionProperties.sOutroConvName)
sessionProperties.shrinkDecision = SHRINK_ACCEPT
SHRINK_OFFICE_REQUEST_OUTRO_CUTSCENE(sessionProperties.sOutroConvName, sessionProperties, SHRINK_GET_CURRENT_MISSION_SESSION())
bOutroRequested = TRUE
ENDIF
IF HAS_PLAYER_REACTED_TO_SHRINK_ADVICE_OFFICE(convTimer, useContext, bChoice)
PRINTLN("Player made choice")
IF bChoice
sessionProperties.shrinkDecision = SHRINK_ACCEPT
ELSE
sessionProperties.shrinkDecision = SHRINK_REJECT
IF bOutroRequested
REMOVE_CUTSCENE()
ENDIF
SHRINK_OFFICE_REQUEST_OUTRO_CUTSCENE(sessionProperties.sOutroConvName, sessionProperties, SHRINK_GET_CURRENT_MISSION_SESSION())
bVariationsRequested = FALSE
RESTART_TIMER_NOW(convTimer)
ENDIF
CLEAR_HELP()
bHasPlayerMadeChoice = TRUE
ELSE
IF GET_TIMER_IN_SECONDS(convTimer) >= 14.0
sessionProperties.shrinkDecision = SHRINK_SILENT
bHasPlayerMadeChoice = TRUE
CLEAR_HELP()
ELIF (NOT bDrPrompt) AND GET_TIMER_IN_SECONDS(convTimer) >= 7.0
sBase = "DRF_PROMPT"
// sLine = sBase
// IF thisSession = SHRINKSESSION_OFFICE_CHAOS
// sLine += "_1"
// ELIF thisSession = SHRINKSESSION_OFFICE_EVIL
// sLine += "_2"
// ELIF thisSession = SHRINKSESSION_OFFICE_ABANDONMENT
// sLine += "_3"
// ENDIF
CREATE_CONVERSATION(convPeds, sAudioBlock, sBase, CONV_PRIORITY_VERY_HIGH)
//PLAY_SINGLE_LINE_FROM_CONVERSATION(convPeds, sAudioBlock, sBase, sLine, CONV_PRIORITY_VERY_HIGH, DISPLAY_SUBTITLES, DO_ADD_TO_BRIEF_SCREEN)
bDrPrompt = TRUE
ENDIF
ENDIF
ELSE
IF (GET_TIMER_IN_SECONDS(convTimer) > 5.0 AND HAS_CUTSCENE_LOADED_WITH_FAILSAFE())
OR (HAS_CUTSCENE_LOADED()
AND (sessionProperties.shrinkDecision <> SHRINK_REJECT OR GET_TIMER_IN_SECONDS(convTimer) > fRejectDelay OR PLAY_FILLER_ANIMS(thisSession, shrinkCSPed, shrinkMainCam)))
PRINTLN("Register entities for outro cutscene")
SHRINK_CLEANUP_PROC_CONV()
IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID())
REGISTER_ENTITY_FOR_CUTSCENE(PLAYER_PED_ID(), sMichaelID, CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
ENDIF
IF NOT IS_ENTITY_DEAD(shrinkCSPed)
REGISTER_ENTITY_FOR_CUTSCENE(shrinkCSPed, sFriedlanderID, CU_ANIMATE_EXISTING_SCRIPT_ENTITY)
ENDIF
SET_CUTSCENE_FADE_VALUES(FALSE, FALSE, FALSE, FALSE)
START_CUTSCENE()
SET_MODEL_AS_NO_LONGER_NEEDED(chairModel)
officeState = SHRINKOFFICESTATE_OUTRO_CUTSCENE
ENDIF
ENDIF
IF (NOT bVariationsRequested) AND bOutroRequested
IF CAN_REQUEST_ASSETS_FOR_CUTSCENE_ENTITY()
IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID())
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED_SAFE(sMichaelID, PLAYER_PED_ID())
ENDIF
IF NOT IS_ENTITY_DEAD(shrinkCSPed)
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED_SAFE(sFriedlanderID, shrinkCSPed)
ENDIF
bVariationsRequested = TRUE
ENDIF
ENDIF
BREAK
// Play the outro cutscene.
CASE SHRINKOFFICESTATE_OUTRO_CUTSCENE
IF DOES_CAM_EXIST(shrinkMainCam)
RENDER_SCRIPT_CAMS(FALSE, FALSE)
DESTROY_CAM(shrinkMainCam)
ENDIF
IF IS_CUTSCENE_SKIP_BUTTON_JUST_PRESSED() AND IS_CUTSCENE_PLAYING()
AND NOT IS_SCREEN_FADING_OUT() AND NOT IS_SCREEN_FADED_OUT()
//DO_SCREEN_FADE_OUT(250)
STOP_CUTSCENE()
ENDIF
//
// IF IS_SCREEN_FADED_OUT()
// STOP_CUTSCENE_IMMEDIATELY()
// SET_SCRIPTS_SAFE_FOR_CUTSCENE(FALSE)
// ENDIF
IF CAN_SET_EXIT_STATE_FOR_CAMERA()
IF thisSession = SHRINKSESSION_OFFICE_ABANDONMENT
STOP_STREAM()
IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID())
IF IS_ENTITY_ATTACHED(PLAYER_PED_ID())
DETACH_ENTITY(PLAYER_PED_ID())
ENDIF
SET_ENTITY_COLLISION(PLAYER_PED_ID(), TRUE)
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), FALSE)
ENDIF
SHRINK_SETUP_KILL_SCENARIO()
START_TIMER_NOW(tmrKillControl)
START_TIMER_NOW(tmrPlayerGait)
START_TIMER_NOW(tmrObjective)
//SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
officeState = SHRINKOFFICESTATE_KILL_DR_FRIEDLANDER
ELSE
STOP_STREAM()
IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID())
IF IS_ENTITY_ATTACHED(PLAYER_PED_ID())
DETACH_ENTITY(PLAYER_PED_ID())
ENDIF
SET_ENTITY_HEALTH(PLAYER_PED_ID(), GET_ENTITY_MAX_HEALTH(PLAYER_PED_ID()))
SET_ENTITY_COLLISION(PLAYER_PED_ID(), TRUE)
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), FALSE)
SET_ENTITY_COORDS_GROUNDED(PLAYER_PED_ID(), <<-1902.6094, -559.9267, 10.7916>>)
SET_ENTITY_HEADING(PLAYER_PED_ID(), fPostConvPlayerHeading)
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
SET_SCRIPTS_SAFE_FOR_CUTSCENE(FALSE)
//B*1177720 - Fix for parking large vehicle in front of the office
playerVehicle = GET_PLAYERS_LAST_VEHICLE()
IF DOES_ENTITY_EXIST(playerVehicle)
IF NOT IS_ENTITY_DEAD(playerVehicle)
SET_ENTITY_COORDS(playerVehicle, SHRINK_GET_PLAYER_VEHICLE_POSITION(playerVehicle))
SET_ENTITY_HEADING(playerVehicle, 231.0000)
ENDIF
ENDIF
IF IS_SCREEN_FADED_OUT()
IF NOT bSceneRequested
NEW_LOAD_SCENE_START(<<-1903.8698, -562.9188, 12.8354>>, NORMALISE_VECTOR(<<-1901.3314, -560.0015, 12.8015>> - <<-1903.8698, -562.9188, 12.8354>>), 100)
bSceneRequested = TRUE
WAIT(0)
ENDIF
IF NOT bClothingRestore
bClothingRestore = TRUE
ENDIF
WHILE NOT IS_NEW_LOAD_SCENE_LOADED()
WAIT(0)
ENDWHILE
ENDIF
//TASK_GO_STRAIGHT_TO_COORD(PLAYER_PED_ID(), vPostConvPlayerPos, PEDMOVE_WALK)
FORCE_PED_MOTION_STATE(PLAYER_PED_ID(), MS_ON_FOOT_WALK)
SIMULATE_PLAYER_INPUT_GAIT(PLAYER_ID(), PEDMOVE_WALK)
FORCE_PED_AI_AND_ANIMATION_UPDATE(PLAYER_PED_ID(), TRUE)
ENDIF
officeState = SHRINKOFFICESTATE_CLEANUP
ENDIF
ELSE
IF NOT bSceneRequested
IF GET_CUTSCENE_TIME() > 60000
IF thisSession = SHRINKSESSION_OFFICE_ABANDONMENT
NEW_LOAD_SCENE_START(<<-1905.4998, -557.8768, 12.4125>>, NORMALISE_VECTOR(<<-1903.8552, -560.4745, 11.9712>> - <<-1905.4998, -557.8768, 12.4125>>), 100)
ELSE
NEW_LOAD_SCENE_START(<<-1903.8698, -562.9188, 12.8354>>, NORMALISE_VECTOR(<<-1901.3314, -560.0015, 12.8015>> - <<-1903.8698, -562.9188, 12.8354>>), 100)
ENDIF
bSceneRequested = TRUE
ENDIF
ENDIF
IF NOT bClothingRestore
IF GET_CUTSCENE_CONCAT_SECTION_PLAYING() >= 16
IF NOT IS_TIMER_STARTED(tmrClothingRestore)
START_TIMER_NOW(tmrClothingRestore)
ELIF GET_TIMER_IN_SECONDS(tmrClothingRestore) > SHRINK_GET_ATTIRE_RESTORE_DELAY(SHRINK_GET_CURRENT_MISSION_SESSION())
IF SHRINK_GET_CURRENT_MISSION_SESSION() = SHRINKSESSION_OFFICE_ABANDONMENT
shrinkIGPed = CREATE_PED(PEDTYPE_MISSION, shrinkIGModelName, <<-1899.7000, -562.2000, 10.7945>>, 217.9453)
SET_PED_COMPONENT_VARIATION(shrinkIGPed, PED_COMP_TORSO, iUpperVariation, iUpperTexture)
SET_PED_COMPONENT_VARIATION(shrinkIGPed, PED_COMP_LEG, 0, iLowerTexture)
SET_PED_MONEY(shrinkIGPed, iSHRINK_FEE_ABANDONMENT + GET_RANDOM_INT_IN_RANGE(5, 301))
SET_ENTITY_LOAD_COLLISION_FLAG(shrinkIGPed, TRUE)
ADD_PED_FOR_DIALOGUE(convPeds, 1, shrinkIGPed, "FRIEDLANDER")
ENDIF
bClothingRestore = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
// Kill Dr. Friedlander or let him go.
CASE SHRINKOFFICESTATE_KILL_DR_FRIEDLANDER
IF IS_SCREEN_FADED_OUT() AND NOT IS_SCREEN_FADING_IN()
DO_SCREEN_FADE_IN(500)
ENDIF
// Doctor dead?
IF IS_ENTITY_DEAD(shrinkIGPed)
SET_MISSION_FLOW_FLAG_STATE(FLOWFLAG_SHRINK_KILLED, TRUE)
STAT_SET_BOOL(SP_KILLED_DR_FRIEDLANDER, TRUE)
CREATE_CONVERSATION(convPeds, "DrfAud", "DRF_KILL", CONV_PRIORITY_VERY_HIGH)
IF DOES_BLIP_EXIST(shrinkBlip)
SET_BLIP_COLOUR(shrinkBlip, BLIP_COLOUR_RED)
ENDIF
officeState = SHRINKOFFICESTATE_KILL_CLEANUP
// Doctor escaped?
ELIF (NOT DOES_ENTITY_EXIST(shrinkIGPed))
OR GET_DISTANCE_BETWEEN_ENTITIES(shrinkIGPed, PLAYER_PED_ID()) > 300.0
CREATE_CONVERSATION(convPeds, "DrfAud", "DRF_AWAY", CONV_PRIORITY_VERY_HIGH)
IF DOES_BLIP_EXIST(shrinkBlip)
SET_BLIP_COLOUR(shrinkBlip, BLIP_COLOUR_BLUE)
ENDIF
IF DOES_ENTITY_EXIST(shrinkIGPed)
CLEAR_AREA_OF_PROJECTILES(GET_ENTITY_COORDS(shrinkIGPed), 10.0)
ENDIF
officeState = SHRINKOFFICESTATE_KILL_CLEANUP
// Doctor still alive and fleeing.
ELSE
SHRINK_UPDATE_FLIGHT_DIALOGUE()
SET_PED_CONFIG_FLAG(shrinkIGPed, PCF_DontAllowToBeDraggedOutOfVehicle, TRUE)
IF IS_TIMER_STARTED(tmrPlayerGait)
IF GET_TIMER_IN_SECONDS(tmrPlayerGait) > 2.5
SIMULATE_PLAYER_INPUT_GAIT(PLAYER_ID(), PEDMOVE_RUN, 1000)
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
CANCEL_TIMER(tmrPlayerGait)
ENDIF
ENDIF
IF NOT bPanStarted
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
// Notes:
// The interp to game cam now looks bad because of the camera clipping the wall as Michael
// comes around the corner. This didn't seem to be a problem on last gen. The desired
// end positions have been pre-computed; we'll now lerp to this hard-coded position and
// do a fast lerp to gameplay from there.
IF GET_TIMER_IN_SECONDS(tmrKillControl) > 2.0
VECTOR vCamPos, vCamRot
SWITCH GET_FOLLOW_PED_CAM_VIEW_MODE()
CASE CAM_VIEW_MODE_THIRD_PERSON_NEAR
vCamPos = <<-1905.2889, -560.9047, 12.5379>>
vCamRot = <<-8.9999, -0.0000, -99.8165>>
BREAK
CASE CAM_VIEW_MODE_THIRD_PERSON_MEDIUM
vCamPos = <<-1908.0061, -560.4351, 12.6592>>
vCamRot = <<-3.0000, 0.0000, -99.8148>>
BREAK
CASE CAM_VIEW_MODE_THIRD_PERSON_FAR
vCamPos = <<-1908.7588, -558.6420, 13.4942>>
vCamRot = <<-12.0007, -0.0000, -115.8697>>
BREAK
CASE CAM_VIEW_MODE_FIRST_PERSON
vCamPos = <<-1904.6583, -560.0228, 12.4975>>
vCamRot = <<-10.0948, 0.0099, -128.3421>>
BREAK
DEFAULT
CASSERTLN(DEBUG_MISSION, "Unsupported follow cam view mode! (lerp betw scripted cams)")
vCamPos = <<-1908.0061, -560.4351, 12.6592>>
vCamRot = <<-3.0000, 0.0000, -99.8148>>
BREAK
ENDSWITCH
shrinkMainCam = CREATE_CAMERA_WITH_PARAMS(CAMTYPE_SCRIPTED, vCamPos, vCamRot, 50)
SET_CAM_ACTIVE_WITH_INTERP(shrinkMainCam, shrinkHelperCam, 2660)
IF DOES_ENTITY_EXIST(playerVehicle)
AND NOT IS_ENTITY_DEAD(playerVehicle)
SET_VEHICLE_FIXED(playerVehicle)
SET_ENTITY_INVINCIBLE(playerVehicle, FALSE)
SET_VEHICLE_CAN_BREAK(playerVehicle, TRUE)
ENDIF
RESTART_TIMER_NOW(tmrKillControl)
bPanStarted = TRUE
ENDIF
ELIF NOT bChaseStarted
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
IF GET_TIMER_IN_SECONDS(tmrKillControl) > 2.0
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
DISPLAY_RADAR(TRUE)
DISPLAY_HUD(TRUE)
SET_SCRIPTS_SAFE_FOR_CUTSCENE(FALSE)
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
CLEAR_PED_TASKS(PLAYER_PED_ID())
ENDIF
bChaseStarted = TRUE
ELSE
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
ENDIF
ELSE
IF DOES_CAM_EXIST(shrinkHelperCam)
IF GET_TIMER_IN_SECONDS(tmrKillControl) >= 2.66
SET_GAMEPLAY_CAM_RELATIVE_HEADING(PICK_FLOAT(GET_FOLLOW_PED_CAM_VIEW_MODE() = CAM_VIEW_MODE_THIRD_PERSON_FAR, -16.0000, 0.0))
RENDER_SCRIPT_CAMS(FALSE, TRUE, 340, FALSE)
DESTROY_CAM(shrinkHelperCam)
ELSE
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
ENDIF
ENDIF
ENDIF
IF bEscDlgCleared AND IS_PLAYER_CONTROL_ON(PLAYER_ID())
IF TIMER_DO_ONCE_WHEN_READY(timerBlipFlicker, 0.5)
IF IS_NEW_LOAD_SCENE_ACTIVE()
NEW_LOAD_SCENE_STOP()
ENDIF
IF NOT DOES_BLIP_EXIST(shrinkBlip)
IF NOT IS_ENTITY_DEAD(shrinkIGPed)
shrinkBlip = ADD_BLIP_FOR_ENTITY(shrinkIGPed)
SET_BLIP_COLOUR(shrinkBlip, BLIP_COLOUR_RED)
RESTART_TIMER_NOW(timerBlipFlicker)
ENDIF
ELIF GET_BLIP_COLOUR(shrinkBlip) <> BLIP_COLOUR_BLUE
SET_BLIP_COLOUR(shrinkBlip, BLIP_COLOUR_BLUE)
IF IS_TIMER_STARTED(tmrObjective)
IF GET_TIMER_IN_SECONDS(tmrObjective) < DEFAULT_GOD_TEXT_TIME / 1000.0
PRINT_NOW("SHRINK_KILL_B", DEFAULT_GOD_TEXT_TIME, 1)
ELSE
CLEAR_SMALL_PRINTS()
CANCEL_TIMER(tmrObjective)
ENDIF
ENDIF
ELSE
SET_BLIP_COLOUR(shrinkBlip, BLIP_COLOUR_RED)
IF IS_TIMER_STARTED(tmrObjective)
IF GET_TIMER_IN_SECONDS(tmrObjective) < DEFAULT_GOD_TEXT_TIME / 1000.0
PRINT_NOW("SHRINK_KILL_R", DEFAULT_GOD_TEXT_TIME, 1)
ELSE
CLEAR_SMALL_PRINTS()
CANCEL_TIMER(tmrObjective)
ENDIF
ENDIF
ENDIF
RESTART_TIMER_NOW(timerBlipFlicker)
ENDIF
ELSE
RESTART_TIMER_AT(timerBlipFlicker, 0.3)
ENDIF
// Update fleeing behavior.
IF NOT IS_PED_INJURED(shrinkIGPed)
IF DOES_ENTITY_EXIST(shrinkVehicle)
IF IS_PED_IN_ANY_VEHICLE(shrinkIGPed)
bShrinkEnteredVeh = TRUE //shrink entered vehicle at one point
ENDIF
IF (NOT IS_PED_FLEEING(shrinkIGPed))
IF (NOT IS_VEHICLE_DRIVEABLE(shrinkVehicle))
OR IS_PED_IN_VEHICLE(PLAYER_PED_ID(), shrinkVehicle, TRUE)
OR IS_VEHICLE_STUCK_TIMER_UP(shrinkVehicle, VEH_STUCK_ON_ROOF, 2000)
OR IS_VEHICLE_STUCK_TIMER_UP(shrinkVehicle, VEH_STUCK_ON_SIDE, 2000)
OR IS_VEHICLE_STUCK_TIMER_UP(shrinkVehicle, VEH_STUCK_HUNG_UP, 2000)
OR IS_VEHICLE_STUCK_TIMER_UP(shrinkVehicle, VEH_STUCK_JAMMED, 2000)
OR (bShrinkEnteredVeh AND NOT IS_PED_IN_ANY_VEHICLE(shrinkIGPed)) //shrink was in the vehicle but is no longer, run
OR IS_PLAYER_TOWING_VEHICLE(shrinkVehicle)
OR IS_PLAYER_FLYING_WITH_ATTACHED_VEHICLE(shrinkVehicle)
TASK_SMART_FLEE_PED(shrinkIGPed, PLAYER_PED_ID(), 3000.0, -1)
ENDIF
ENDIF
ELIF NOT IS_PED_FLEEING(shrinkIGPed)
TASK_SMART_FLEE_PED(shrinkIGPed, PLAYER_PED_ID(), 3000.0, -1)
ENDIF
IF NOT bEventsAllowed
AND NOT IS_ENTITY_IN_ANGLED_AREA(shrinkIGPed, <<-1892.13904, -567.19403, 10.5000>>, <<-1904.93494, -556.44226, 13.5000>>, 4.73)
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(shrinkIGPed, FALSE)
bEventsAllowed = TRUE
ENDIF
ENDIF
ENDIF
BREAK
CASE SHRINKOFFICESTATE_CLEANUP
IF NOT IS_TIMER_STARTED(cleanupTimer)
NEW_LOAD_SCENE_STOP()
START_TIMER_NOW(cleanupTimer)
ELIF GET_TIMER_IN_SECONDS(cleanupTimer) > 2.0
#IF IS_DEBUG_BUILD
g_b_CellDialDebugTextToggle = TRUE
#ENDIF
DEBIT_BANK_ACCOUNT(GET_CURRENT_PLAYER_PED_ENUM(), BAAC_SHRINK, SHRINK_GET_SESSION_FEE(thisSession))
ENABLE_SELECTOR()
MISSION_FLOW_MISSION_PASSED()
SHRINK_OFFICE_CLEANUP(shrinkCSPed, playerVehicle, shrinkMainCam, officeState)
ENDIF
IF IS_SCREEN_FADED_OUT()
DO_SCREEN_FADE_IN(500)
ENDIF
BREAK
// Cleanup specific to the kill scenario.
CASE SHRINKOFFICESTATE_KILL_CLEANUP
IF NOT IS_TIMER_STARTED(cleanupTimer)
START_TIMER_NOW(cleanupTimer)
ENDIF
IF GET_TIMER_IN_SECONDS(cleanupTimer) > 4.0
OR IS_SCREEN_FADED_OUT()
REMOVE_BLIP(shrinkBlip)
IF DOES_CAM_EXIST(shrinkMainCam)
DESTROY_CAM(shrinkMainCam)
ENDIF
ENABLE_SELECTOR()
MISSION_FLOW_MISSION_PASSED()
// Delete Dr. F and car if we didn't kill him.
IF NOT GET_MISSION_FLOW_FLAG_STATE(FLOWFLAG_SHRINK_KILLED)
IF DOES_ENTITY_EXIST(shrinkIGPed)
IF DOES_ENTITY_EXIST(shrinkVehicle) AND IS_PED_IN_VEHICLE(shrinkIGPed, shrinkVehicle)
DELETE_VEHICLE(shrinkVehicle)
ENDIF
ENDIF
DELETE_PED(shrinkIGPed)
ENDIF
#IF IS_DEBUG_BUILD
g_b_CellDialDebugTextToggle = TRUE
#ENDIF
// End the script.
TERMINATE_THIS_THREAD()
ENDIF
BREAK
ENDSWITCH
ENDWHILE
ENDSCRIPT