2410 lines
67 KiB
Python
Executable File
2410 lines
67 KiB
Python
Executable File
//|=======================================================================================|
|
|
//| Author: Lukasz Bogaj Date: 09/02/2012 |
|
|
//|=======================================================================================|
|
|
//| YOGA.sc |
|
|
//| SINGLEPLAYER YOGA MINIGAME |
|
|
//| |
|
|
//|=======================================================================================|
|
|
|
|
|
|
//Compile out Title Update changes to header functions.
|
|
//Must be before includes.
|
|
//CONST_INT USE_TU_CHANGES 0 // Removed by Kenneth R.
|
|
|
|
|
|
USING "rage_builtins.sch"
|
|
USING "globals.sch"
|
|
|
|
//Commands headers
|
|
USING "commands_ped.sch"
|
|
USING "commands_script.sch"
|
|
USING "commands_pad.sch"
|
|
USING "commands_misc.sch"
|
|
USING "commands_player.sch"
|
|
USING "commands_camera.sch"
|
|
USING "commands_object.sch"
|
|
USING "commands_interiors.sch"
|
|
USING "commands_streaming.sch"
|
|
USING "commands_fire.sch"
|
|
USING "commands_graphics.sch"
|
|
USING "commands_path.sch"
|
|
USING "commands_audio.sch"
|
|
USING "commands_entity.sch"
|
|
|
|
//Script headers
|
|
USING "script_player.sch"
|
|
USING "script_ped.sch"
|
|
USING "script_buttons.sch"
|
|
USING "script_maths.sch"
|
|
USING "script_blips.sch"
|
|
//USING "script_oddjob_funcs.sch"
|
|
|
|
//Public files
|
|
USING "flow_public_core_override.sch"
|
|
USING "cellphone_public.sch"
|
|
USING "selector_public.sch"
|
|
USING "player_ped_public.sch"
|
|
USING "locates_public.sch"
|
|
USING "building_control_public.sch"
|
|
USING "dialogue_public.sch"
|
|
USING "replay_public.sch"
|
|
USING "commands_cutscene.sch"
|
|
USING "cutscene_public.sch"
|
|
USING "clearmissionarea.sch"
|
|
USING "mission_stat_public.sch"
|
|
USING "yoga.sch"
|
|
USING "mp_scaleform_functions.sch"
|
|
USING "fake_cellphone_public.sch"
|
|
|
|
// Includes for Quit UI.
|
|
USING "minigame_uiinputs.sch"
|
|
USING "hud_drawing.sch"
|
|
USING "screens_header.sch"
|
|
USING "UIUtil.sch"
|
|
USING "script_usecontext.sch"
|
|
|
|
//Debug headers
|
|
#IF IS_DEBUG_BUILD
|
|
USING "script_debug.sch"
|
|
USING "select_mission_stage.sch"
|
|
#ENDIF
|
|
|
|
//===================================== ENUMS & STRUCTS ==================================|
|
|
|
|
/// PURPOSE: Specifies location of the minigame
|
|
ENUM MINIGAME_LOCATIONS
|
|
MINIGAME_LOCATION_MICHAELS_HOUSE = 0,
|
|
MINIGAME_LOCATION_NORTH_COAST = 1
|
|
ENDENUM
|
|
|
|
/// PURPOSE: Specifies stages of the minigame.
|
|
ENUM MINIGAME_STAGES
|
|
MINIGAME_STAGE_SETUP = 0, //Setup
|
|
MINIGAME_STAGE_CUTSCENE_INTRO = 1, //Intro cutscene
|
|
MINIGAME_STAGE_YOGA_WARRIOR = 2, //First yoga move - Warrior
|
|
MINIGAME_STAGE_YOGA_TRIANGLE = 3, //Second yoga move - Triangle
|
|
MINIGAME_STAGE_YOGA_SUNSALUTATION = 4, //Third yoga move - Sun Salutation
|
|
MINIGAME_STAGE_PASSED_CUTSCENE_END = 5, //Passed end cutscene
|
|
MINIGAME_STAGE_FAILED_CUTSCENE_END = 6, //Passed end cutscene
|
|
MINIGAME_STAGE_PASSED, //Minigame passed
|
|
MINIGAME_STAGE_FAILED //Minigame failed
|
|
ENDENUM
|
|
|
|
/// PURPOSE: Specifies minigame fail reasons.
|
|
ENUM MINIGAME_FAILS
|
|
MINIGAME_FAIL_YOGA_NOT_FAILED = 0,
|
|
MINIGAME_FAIL_YOGA_FAILED = 1, //Player failed yoga minigame
|
|
MINIGAME_FAIL_FORCE_FAIL = 2, //Debug forced fail
|
|
|
|
MAX_MINIGAME_FAILS
|
|
ENDENUM
|
|
|
|
/// PURPOSE: Specifies outfits for the minigame.
|
|
ENUM MINIGAME_OUTFITS
|
|
MINIGAME_OUTFIT_DEFAULT = 0, //Default outfit in which player starts the minigame
|
|
MINIGAME_OUTFIT_YOGA = 1 //Outfit for yoga
|
|
ENDENUM
|
|
|
|
/// PURPOSE: Specifies details of minigame specific objects.
|
|
STRUCT OBJECT_STRUCT
|
|
OBJECT_INDEX ObjectIndex //Object index
|
|
MODEL_NAMES ModelName //Object model
|
|
VECTOR vPosition //Object postion
|
|
VECTOR vRotation //Object rotation
|
|
ENDSTRUCT
|
|
|
|
/// PURPOSE: Contains player postion and heading.
|
|
STRUCT LOCATION_STRUCT
|
|
VECTOR vPosition //Position
|
|
FLOAT fHeading //Heading
|
|
ENDSTRUCT
|
|
|
|
/// PURPOSE: Stores player position, heading and got coords for the end of the game.
|
|
STRUCT PLAYER_ENDGAME_STRUCT
|
|
VECTOR vWarpPosition // Player warp position
|
|
FLOAT fWarpHeading // Player warp heading
|
|
VECTOR vGotoPosition // Player goto position
|
|
FLOAT fGotoHeading // Player final heading
|
|
ENDSTRUCT
|
|
|
|
/// PURPOSE: Stores player vehicle safe position and heading
|
|
STRUCT PLAYER_VEHICLE_STRUCT
|
|
VECTOR vPosition //Position
|
|
FLOAT fHeading //Heading
|
|
VECTOR vAngledAreaPos1 // Vector for angled area check
|
|
VECTOR vAngledAreaPos2 // Vector for angled area check
|
|
FLOAT fAngledAreaWidth // Width for angled area check.
|
|
ENDSTRUCT
|
|
|
|
|
|
|
|
//|======================================= CONSTANTS =====================================|
|
|
|
|
CONST_INT END_CUTSCENE_SUCCESS 10
|
|
CONST_INT END_CUTSCENE_FAILURE 20
|
|
CONST_INT END_CUTSCENE_QUIT 30
|
|
CONST_INT END_CUTSCENE_FINISH 40
|
|
|
|
//======================================== VARIABLES =====================================|
|
|
|
|
//VECTOR vMinigameTriggerPosition
|
|
|
|
MINIGAME_STAGES eMinigameStage
|
|
MINIGAME_FAILS eMinigameFail
|
|
MINIGAME_LOCATIONS eMinigameLocation
|
|
|
|
LOCATION_STRUCT sMinigamePosition
|
|
YOGASTRUCT sYogaPlayer
|
|
OBJECT_STRUCT sYogaMat
|
|
OBJECT_STRUCT sDock
|
|
OBJECT_STRUCT sCandle04
|
|
OBJECT_STRUCT sCandle05
|
|
OBJECT_STRUCT sCandle06
|
|
OBJECT_STRUCT sCellphone
|
|
PLAYER_ENDGAME_STRUCT sPlayerEndgame
|
|
PLAYER_VEHICLE_STRUCT sPlayerVehicleSafe
|
|
|
|
FAKE_CELLPHONE_DATA sFakeCellphoneData
|
|
|
|
INT iStageSetupProgress
|
|
INT iMinigameStageProgress
|
|
BOOL bLoadingFlag
|
|
BOOL bSkipFlag
|
|
BOOL bReplayFlag
|
|
|
|
//INT iTimer
|
|
//INT iCutsceneDelayTimer
|
|
|
|
BOOL bOutfitYoga
|
|
BOOL bMusicEventPositionCompleteTriggered
|
|
BOOL bHasQuit
|
|
|
|
FLOAT fKharma
|
|
|
|
CAMERA_INDEX ScriptedCamera, AnimatedCamera
|
|
|
|
INT iMinigameIntroSceneID = -1
|
|
INT iMinigameOutroScene1ID = -1
|
|
INT iMinigameOutroScene2ID = -1
|
|
|
|
// UI Quit vars & consts
|
|
BOOL bIsQuitMenuActive = FALSE
|
|
|
|
VECTOR vIntroScenePosition, vIntroSceneRotation
|
|
VECTOR vOutro1ScenePosition, vOutro1SceneRotation
|
|
VECTOR vOutro2ScenePosition, vOutro2SceneRotation
|
|
VECTOR vLoadSceneCamPosition, vLoadSceneCamDirection
|
|
|
|
SCALEFORM_INSTRUCTIONAL_BUTTONS instructionalButtons
|
|
SPRITE_PLACEMENT aSpriteYogaControls
|
|
SCALEFORM_INDEX scaleformYogaControls
|
|
BOOL bUpdateYogaControls = FALSE
|
|
|
|
|
|
//|========================================= ARRAYS ======================================|
|
|
|
|
//fail flags
|
|
BOOL FailFlags[MAX_MINIGAME_FAILS]
|
|
|
|
//text printing
|
|
INT iTriggeredTextHashes[20]
|
|
|
|
|
|
//|================================ MISC PROCEDURES & FUNCTIONS ==========================|
|
|
|
|
|
|
/// PURPOSE: Display the Yoga quit button
|
|
///
|
|
PROC DISPLAY_INSTRUCTIONAL_BUTTONS()
|
|
|
|
IF HAS_SCALEFORM_MOVIE_LOADED(scaleformYogaControls)
|
|
|
|
IF bUpdateYogaControls
|
|
REFRESH_SCALEFORM_INSTRUCTIONAL_BUTTONS(instructionalButtons)
|
|
ADD_SCALEFORM_INSTRUCTIONAL_BUTTON(GET_CONTROL_INSTRUCTIONAL_BUTTONS_STRING(FRONTEND_CONTROL, INPUT_CONTEXT), "H_YOGA_QUIT", instructionalButtons)
|
|
ENDIF
|
|
|
|
RUN_SCALEFORM_INSTRUCTIONAL_BUTTONS(scaleformYogaControls, aSpriteYogaControls, instructionalButtons, SHOULD_REFRESH_SCALEFORM_INSTRUCTIONAL_BUTTONS(instructionalButtons))
|
|
|
|
ELSE
|
|
scaleformYogaControls = REQUEST_SCALEFORM_MOVIE("instructional_buttons")
|
|
bUpdateYogaControls = TRUE
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
PROC RESET_MINIGAME_FLAGS()
|
|
|
|
//reset setup progress to 1, so that iSetupProgress = 0 only runs once, on initial minigame load.
|
|
iStageSetupProgress = 1
|
|
|
|
iMinigameStageProgress = 0
|
|
|
|
bMusicEventPositionCompleteTriggered = FALSE
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Minigame flags and progress counters are reset.")
|
|
#ENDIF
|
|
|
|
ENDPROC
|
|
|
|
|
|
PROC YOGA_MANAGE_QUIT_UI()
|
|
|
|
IF IS_SCREEN_FADED_IN() AND NOT IS_PAUSE_MENU_ACTIVE()
|
|
|
|
IF bIsQuitMenuActive = FALSE
|
|
|
|
IF eMinigameStage = MINIGAME_STAGE_CUTSCENE_INTRO
|
|
OR eMinigameStage = MINIGAME_STAGE_YOGA_WARRIOR
|
|
OR eMinigameStage = MINIGAME_STAGE_YOGA_TRIANGLE
|
|
OR eMinigameStage = MINIGAME_STAGE_YOGA_SUNSALUTATION
|
|
|
|
IF IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_CONTEXT)
|
|
|
|
SET_GAME_PAUSED(TRUE)
|
|
|
|
bIsQuitMenuActive = TRUE
|
|
|
|
ENDIF
|
|
|
|
DISPLAY_INSTRUCTIONAL_BUTTONS()
|
|
|
|
ENDIF
|
|
|
|
ELSE
|
|
|
|
SET_WARNING_MESSAGE_WITH_HEADER("YOGA_QUIT", "YOGA_QUIT_INST", (FE_WARNING_YES | FE_WARNING_NO))
|
|
|
|
IF IS_MESSAGE_BEING_DISPLAYED()
|
|
CLEAR_PRINTS()
|
|
ENDIF
|
|
|
|
IF IS_HELP_MESSAGE_BEING_DISPLAYED()
|
|
CLEAR_HELP()
|
|
ENDIF
|
|
|
|
|
|
IF IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_ACCEPT)
|
|
|
|
DO_SCREEN_FADE_OUT(0)
|
|
|
|
bIsQuitMenuActive = FALSE
|
|
SET_GAME_PAUSED(FALSE)
|
|
|
|
CLEAR_PRINTS()
|
|
CLEAR_HELP()
|
|
|
|
CLEAR_PED_TASKS_IMMEDIATELY(PLAYER_PED_ID())
|
|
|
|
eMinigameStage = MINIGAME_STAGE_FAILED_CUTSCENE_END
|
|
|
|
bHasQuit = TRUE
|
|
|
|
RESET_MINIGAME_FLAGS()
|
|
|
|
ELIF IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_CANCEL)
|
|
|
|
bIsQuitMenuActive = FALSE
|
|
SET_GAME_PAUSED(FALSE)
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/// PURPOSE:
|
|
/// Sets all fail flags to specified boolean value.
|
|
/// PARAMS:
|
|
/// bNewBool - Boolean value to set all flags to TRUE or FALSE.
|
|
PROC SET_FAIL_FLAGS(BOOL bNewBool)
|
|
|
|
INT i = 0
|
|
|
|
FOR i = 0 TO ( COUNT_OF(FailFlags) - 1 )
|
|
|
|
FailFlags[i] = bNewBool
|
|
|
|
ENDFOR
|
|
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Gets next minigame stage for specified minigame stage
|
|
/// PARAMS:
|
|
/// eStage - Minigame stage to get next minigame stage for
|
|
/// RETURNS:
|
|
/// Next stage for the specified minigame stage.
|
|
FUNC MINIGAME_STAGES GET_NEXT_MINIGAME_STAGE(MINIGAME_STAGES eStage)
|
|
|
|
IF eStage = MINIGAME_STAGE_PASSED_CUTSCENE_END
|
|
RETURN MINIGAME_STAGE_PASSED_CUTSCENE_END
|
|
ENDIF
|
|
|
|
IF eStage = MINIGAME_STAGE_FAILED_CUTSCENE_END
|
|
RETURN MINIGAME_STAGE_FAILED_CUTSCENE_END
|
|
ENDIF
|
|
|
|
MINIGAME_STAGES eNextStage
|
|
|
|
INT iNextStage = ENUM_TO_INT(eStage) + 1
|
|
|
|
eNextStage = INT_TO_ENUM(MINIGAME_STAGES, iNextStage)
|
|
|
|
RETURN eNextStage
|
|
|
|
ENDFUNC
|
|
|
|
/// PURPOSE:
|
|
/// Performs a screen fade in with a wait for a specified time.
|
|
/// PARAMS:
|
|
/// iTime - Duration of the fade in miliseconds.
|
|
PROC DO_SAFE_SCREEN_FADE_IN(INT iTime)
|
|
|
|
IF NOT IS_SCREEN_FADED_IN()
|
|
|
|
DO_SCREEN_FADE_IN(iTime)
|
|
|
|
WHILE NOT IS_SCREEN_FADED_IN()
|
|
WAIT(0)
|
|
ENDWHILE
|
|
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Performs a screen fade out with a wait for a specified time.
|
|
/// PARAMS:
|
|
/// iTime - Duration of the fade in miliseconds.
|
|
PROC DO_SAFE_SCREEN_FADE_OUT(INT iTime)
|
|
|
|
IF NOT IS_SCREEN_FADED_OUT()
|
|
|
|
DO_SCREEN_FADE_OUT(iTime)
|
|
|
|
WHILE NOT IS_SCREEN_FADED_OUT()
|
|
WAIT(0)
|
|
ENDWHILE
|
|
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
FUNC BOOL HAS_LABEL_BEEN_TRIGGERED(STRING strLabel)
|
|
INT iHash = GET_HASH_KEY(strLabel)
|
|
INT iNumHashes = COUNT_OF(iTriggeredTextHashes)
|
|
INT i = 0
|
|
|
|
REPEAT iNumHashes i
|
|
IF iTriggeredTextHashes[i] = iHash
|
|
RETURN TRUE
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
PROC SET_LABEL_AS_TRIGGERED(STRING strLabel, BOOL bIsTriggered)
|
|
INT iHash = GET_HASH_KEY(strLabel)
|
|
INT iNumHashes = COUNT_OF(iTriggeredTextHashes)
|
|
INT i = 0
|
|
BOOL bQuitLoop = FALSE
|
|
|
|
WHILE i < iNumHashes AND NOT bQuitLoop
|
|
IF bIsTriggered
|
|
IF iTriggeredTextHashes[i] = 0
|
|
iTriggeredTextHashes[i] = iHash
|
|
bQuitLoop = TRUE
|
|
ENDIF
|
|
ELSE
|
|
IF iTriggeredTextHashes[i] = iHash
|
|
iTriggeredTextHashes[i] = 0
|
|
bQuitLoop = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
i++
|
|
ENDWHILE
|
|
ENDPROC
|
|
|
|
PROC CLEAR_TRIGGERED_LABELS()
|
|
INT iNumHashes = COUNT_OF(iTriggeredTextHashes)
|
|
INT i = 0
|
|
|
|
REPEAT iNumHashes i
|
|
iTriggeredTextHashes[i] = 0
|
|
ENDREPEAT
|
|
ENDPROC
|
|
|
|
PROC PRINT_GOD_TEXT_ADVANCED(STRING sLabel, INT iDuration = DEFAULT_GOD_TEXT_TIME, BOOL bOnce = TRUE)
|
|
IF NOT HAS_LABEL_BEEN_TRIGGERED(sLabel)
|
|
PRINT(sLabel, iDuration, 1)
|
|
SET_LABEL_AS_TRIGGERED(sLabel, bOnce)
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Printing god text advanced ", sLabel, ".")
|
|
#ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC SET_PLAYER_PED_OUTFIT(MINIGAME_OUTFITS eOutfit)
|
|
|
|
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
|
|
|
|
SWITCH eOutfit
|
|
|
|
CASE MINIGAME_OUTFIT_DEFAULT
|
|
|
|
RESTORE_PLAYER_PED_VARIATIONS(PLAYER_PED_ID())
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Restoring default player ped variation.")
|
|
#ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE MINIGAME_OUTFIT_YOGA
|
|
|
|
SET_PLAYER_PED_VARIATIONS_FOR_YOGA(PLAYER_PED_ID())
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Setting player ped variation to yoga outfit.")
|
|
#ENDIF
|
|
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Warps specified ped to new coordinates and sets specified ped's new heading.
|
|
/// PARAMS:
|
|
/// ped - PED_INDEX to warp.
|
|
/// vNewPosition - VECTOR coordinates specifying new ped's position.
|
|
/// fNewHeading - FLOAT specifying new ped's heading.
|
|
/// bKeepVehicle - Specifies if ped should keep vehicle they are currently in.
|
|
/// bResetGameplayCamera - Specifies if gameplay camera should be positioned behind player's back. Works only for PLAYER_PED_ID().
|
|
/// bLoadScene - Specifies if scene at new provided coordinates should be loaded. Works only for PLAYER_PED_ID().
|
|
PROC WARP_PED(PED_INDEX ped, VECTOR vNewPosition, FLOAT fNewHeading, BOOL bKeepVehicle, BOOL bResetGameplayCamera, BOOL bLoadScene)
|
|
|
|
IF NOT IS_PED_INJURED(ped)
|
|
|
|
IF ( bKeepVehicle = TRUE )
|
|
SET_PED_COORDS_KEEP_VEHICLE(ped, vNewPosition)
|
|
ELIF ( bKeepVehicle = FALSE )
|
|
SET_ENTITY_COORDS(ped, vNewPosition)
|
|
ENDIF
|
|
|
|
SET_ENTITY_HEADING(ped, fNewHeading)
|
|
|
|
IF ( ped = PLAYER_PED_ID())
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Warping player ped to coordinates ", vNewPosition, " and heading ", fNewHeading, ".")
|
|
#ENDIF
|
|
|
|
IF ( bResetGameplayCamera = TRUE)
|
|
|
|
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0)
|
|
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0)
|
|
|
|
ENDIF
|
|
|
|
IF ( bLoadScene = TRUE )
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Calling LOAD_SCENE() at coordinates ", vNewPosition, ". This might take a while to load.")
|
|
#ENDIF
|
|
|
|
LOAD_SCENE(vNewPosition)
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Creates an object and returns TRUE if such object was created successfully.
|
|
/// PARAMS:
|
|
/// osObject - OBJECT_STRUCT containing model, position and rotation of the object.
|
|
/// bFreezeObject - Specify if this object's position should be frozen.
|
|
/// RETURNS:
|
|
/// TRUE if object was created, FALSE if otherwise.
|
|
FUNC BOOL HAS_MINIGAME_OBJECT_BEEN_CREATED(OBJECT_STRUCT &osObject, BOOL bFreezeObject = FALSE)
|
|
|
|
IF NOT DOES_ENTITY_EXIST(osObject.ObjectIndex)
|
|
|
|
REQUEST_MODEL(osObject.ModelName)
|
|
|
|
IF HAS_MODEL_LOADED(osObject.ModelName)
|
|
|
|
osObject.ObjectIndex = CREATE_OBJECT(osObject.ModelName, osObject.vPosition)
|
|
SET_ENTITY_COORDS_NO_OFFSET(osObject.ObjectIndex, osObject.vPosition)
|
|
SET_ENTITY_ROTATION(osObject.ObjectIndex, osObject.vRotation)
|
|
FREEZE_ENTITY_POSITION(osObject.ObjectIndex, bFreezeObject)
|
|
|
|
SET_ENTITY_INVINCIBLE(osObject.ObjectIndex, TRUE)
|
|
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(osObject.ModelName)
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Created object with model ", GET_MODEL_NAME_FOR_DEBUG(osObject.ModelName), " at coordinates ", osObject.vPosition, ".")
|
|
#ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
IF DOES_ENTITY_EXIST(osObject.ObjectIndex)
|
|
|
|
RETURN TRUE
|
|
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
|
|
ENDFUNC
|
|
|
|
/// PURPOSE:
|
|
/// Checks for various minigame fail conditions. Redirects minigame flow to MINIGAME_STAGE_FAILED when one of fail conditions is true.
|
|
/// PARAMS:
|
|
/// eStage - Current minigame stage.
|
|
/// eFail - Minigame fail reason.
|
|
PROC RUN_FAIL_CHECKS(MINIGAME_STAGES &eStage, MINIGAME_FAILS &eFail)
|
|
|
|
IF eStage <> MINIGAME_STAGE_PASSED
|
|
IF eStage <> MINIGAME_STAGE_FAILED
|
|
|
|
IF eStage = MINIGAME_STAGE_YOGA_WARRIOR
|
|
OR eStage = MINIGAME_STAGE_YOGA_TRIANGLE
|
|
OR eStage = MINIGAME_STAGE_YOGA_SUNSALUTATION
|
|
|
|
IF ( FailFlags[MINIGAME_FAIL_YOGA_FAILED] = TRUE )
|
|
|
|
IF ( sYogaPlayer.iFailCounter = 3 )
|
|
|
|
IF sYogaPlayer.eYogaMinigameStage = YOGAMINIGAMESTAGE_FAILRESET
|
|
|
|
IF IS_PED_AT_LAST_STAGE_OF_SEQUENCE(sYogaPlayer.PedIndex, 2)
|
|
|
|
RESET_MINIGAME_FLAGS()
|
|
|
|
eFail = MINIGAME_FAIL_YOGA_FAILED
|
|
eStage = MINIGAME_STAGE_FAILED_CUTSCENE_END
|
|
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Reduces Kharma based on the number of fails. Kharma value is used to replenish the special ability meter.
|
|
PROC CHECK_DECREASE_KHARMA()
|
|
|
|
IF sYogaPlayer.iFailCounter > 0
|
|
|
|
fKharma = fKharma - (0.125 * TO_FLOAT(sYogaPlayer.iFailCounter))
|
|
|
|
IF fKharma < 0.0
|
|
fKharma = 0.0
|
|
ENDIF
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Yoga Kharma decreased to ", fKharma)
|
|
#ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
//|============================== END MISC PROCEDURES & FUNCTIONS ========================|
|
|
|
|
//|============================== CLEANUP PROCEDURES & FUNCTIONS =========================|
|
|
|
|
PROC CLEANUP_OBJECT(OBJECT_INDEX &ObjectIndex, BOOL bDelete = FALSE)
|
|
|
|
IF DOES_ENTITY_EXIST(ObjectIndex)
|
|
|
|
IF IS_ENTITY_ATTACHED(ObjectIndex)
|
|
DETACH_ENTITY(ObjectIndex)
|
|
ENDIF
|
|
|
|
IF ( bDelete = TRUE )
|
|
DELETE_OBJECT(ObjectIndex)
|
|
ELSE
|
|
SET_OBJECT_AS_NO_LONGER_NEEDED(ObjectIndex)
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
PROC RUN_MINIGAME_STAGE_CLEANUP()
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Starting minigame stage cleanup.")
|
|
#ENDIF
|
|
|
|
IF DOES_CAM_EXIST(ScriptedCamera)
|
|
SET_CAM_ACTIVE(ScriptedCamera, FALSE)
|
|
RENDER_SCRIPT_CAMS(FALSE, FALSE)
|
|
DESTROY_CAM(ScriptedCamera)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
|
|
CLEAR_PED_TASKS_IMMEDIATELY(PLAYER_PED_ID())
|
|
ENDIF
|
|
|
|
RESET_YOGA_STRUCT(sYogaPlayer, TRUE, TRUE)
|
|
|
|
KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE()
|
|
|
|
//turn off the audio scenes
|
|
IF IS_AUDIO_SCENE_ACTIVE("YOGA_MINIGAME_TRANQUIL")
|
|
STOP_AUDIO_SCENE("YOGA_MINIGAME_TRANQUIL")
|
|
ENDIF
|
|
|
|
RENDER_SCRIPT_CAMS(FALSE, FALSE)
|
|
|
|
CLEAR_TRIGGERED_LABELS()
|
|
|
|
CLEANUP_OBJECT(sDock.ObjectIndex, TRUE)
|
|
CLEANUP_OBJECT(sYogaMat.ObjectIndex, TRUE)
|
|
CLEANUP_OBJECT(sCandle04.ObjectIndex, TRUE)
|
|
CLEANUP_OBJECT(sCandle05.ObjectIndex, TRUE)
|
|
CLEANUP_OBJECT(sCandle06.ObjectIndex, TRUE)
|
|
CLEANUP_OBJECT(sCellphone.ObjectIndex, TRUE)
|
|
|
|
IF TRIGGER_MUSIC_EVENT("MGYG_END")
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Triggered music event MGYG_END.")
|
|
#ENDIF
|
|
ENDIF
|
|
|
|
CLEAR_TIMECYCLE_MODIFIER()
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Finished minigame stage cleanup.")
|
|
#ENDIF
|
|
|
|
ENDPROC
|
|
|
|
PROC MINIGAME_CLEANUP()
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Starting minigame cleanup.")
|
|
#ENDIF
|
|
|
|
IF DOES_CAM_EXIST(ScriptedCamera)
|
|
SET_CAM_ACTIVE(ScriptedCamera, FALSE)
|
|
RENDER_SCRIPT_CAMS(FALSE, FALSE)
|
|
DESTROY_CAM(ScriptedCamera)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
|
|
SET_FORCE_FOOTSTEP_UPDATE(PLAYER_PED_ID(), FALSE)
|
|
CLEAR_PED_DAMAGE_DECAL_BY_ZONE(PLAYER_PED_ID(), PDZ_HEAD, "blushing") //clear blushing decal
|
|
ENDIF
|
|
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
|
|
|
|
CLEANUP_OBJECT(sDock.ObjectIndex, TRUE)
|
|
CLEANUP_OBJECT(sYogaMat.ObjectIndex, TRUE)
|
|
CLEANUP_OBJECT(sCandle04.ObjectIndex, TRUE)
|
|
CLEANUP_OBJECT(sCandle05.ObjectIndex, TRUE)
|
|
CLEANUP_OBJECT(sCandle06.ObjectIndex, TRUE)
|
|
CLEANUP_OBJECT(sCellphone.ObjectIndex, TRUE)
|
|
|
|
RELEASE_FAKE_CELLPHONE_MOVIE(sFakeCellphoneData)
|
|
//RELEASE_NPC_PHONE_RENDERTARGET()
|
|
|
|
KillAllConversations()
|
|
|
|
SET_MAX_WANTED_LEVEL(5) //set max wanted level back up
|
|
SET_WANTED_LEVEL_MULTIPLIER(1.0)
|
|
|
|
//enable the phone
|
|
DISABLE_CELLPHONE(FALSE)
|
|
ENABLE_SELECTOR()
|
|
DISPLAY_RADAR(TRUE)
|
|
DISPLAY_HUD(TRUE)
|
|
|
|
SET_SCENARIO_TYPE_ENABLED("WORLD_MOUNTAIN_LION_WANDER",TRUE)
|
|
SET_PED_MODEL_IS_SUPPRESSED(A_C_MTLION,FALSE)
|
|
|
|
IF IS_AUDIO_SCENE_ACTIVE("YOGA_MINIGAME_TRANQUIL")
|
|
STOP_AUDIO_SCENE("YOGA_MINIGAME_TRANQUIL")
|
|
ENDIF
|
|
|
|
RELEASE_SCRIPT_AUDIO_BANK()
|
|
|
|
UNREGISTER_SCRIPT_WITH_AUDIO()
|
|
|
|
IF ( bOutfitYoga = TRUE )
|
|
SET_PLAYER_PED_OUTFIT(MINIGAME_OUTFIT_DEFAULT)
|
|
bOutfitYoga = FALSE
|
|
ENDIF
|
|
|
|
SET_SCALEFORM_MOVIE_AS_NO_LONGER_NEEDED(scaleformYogaControls)
|
|
|
|
IF TRIGGER_MUSIC_EVENT("MGYG_END")
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Triggered music event MGYG_END.")
|
|
#ENDIF
|
|
ENDIF
|
|
|
|
PAUSE_CLOCK(FALSE)
|
|
CLEAR_TIMECYCLE_MODIFIER()
|
|
|
|
SHUTDOWN_PC_SCRIPTED_CONTROLS()
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Finished minigame cleanup.")
|
|
#ENDIF
|
|
|
|
ENDPROC
|
|
|
|
//|============================ END CLEANUP PROCEDURES & FUNCTIONS =======================|
|
|
|
|
//|========================== DEBUG VARIABLES, PROCEDURES & FUNCTIONS ====================|
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
|
|
//mission skip menu variables
|
|
MissionStageMenuTextStruct SkipMenu[6]
|
|
INT iReturnStage
|
|
BOOL bStageResetFlag
|
|
|
|
//debug widgets variables
|
|
WIDGET_GROUP_ID YogaWidgets
|
|
BOOL bPositionMat
|
|
|
|
/// PURPOSE:
|
|
/// Returns string name of the specified minigame stage.
|
|
/// PARAMS:
|
|
/// eStage - Minigame stage to get string name for.
|
|
/// RETURNS:
|
|
/// String name of the specified minigame stage.
|
|
FUNC STRING GET_MINIGAME_STAGE_NAME_FOR_DEBUG(MINIGAME_STAGES eStage)
|
|
|
|
SWITCH eStage
|
|
|
|
CASE MINIGAME_STAGE_SETUP
|
|
RETURN "MINIGAME_STAGE_SETUP"
|
|
BREAK
|
|
CASE MINIGAME_STAGE_CUTSCENE_INTRO
|
|
RETURN "MINIGAME_STAGE_CUTSCENE_INTRO"
|
|
BREAK
|
|
CASE MINIGAME_STAGE_YOGA_WARRIOR
|
|
RETURN "MINIGAME_STAGE_YOGA_WARRIOR"
|
|
BREAK
|
|
CASE MINIGAME_STAGE_YOGA_TRIANGLE
|
|
RETURN "MINIGAME_STAGE_YOGA_TRIANGLE"
|
|
BREAK
|
|
CASE MINIGAME_STAGE_YOGA_SUNSALUTATION
|
|
RETURN "MINIGAME_STAGE_YOGA_SUNSALUTATION"
|
|
BREAK
|
|
CASE MINIGAME_STAGE_PASSED_CUTSCENE_END
|
|
RETURN "MINIGAME_STAGE_PASSED_CUTSCENE_END"
|
|
BREAK
|
|
CASE MINIGAME_STAGE_FAILED_CUTSCENE_END
|
|
RETURN "MINIGAME_STAGE_FAILED_CUTSCENE_END"
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
RETURN "INCORRECT_MINIGAME_STAGE"
|
|
|
|
ENDFUNC
|
|
|
|
PROC CREATE_DEBUG_WIDGETS()
|
|
|
|
YogaWidgets = START_WIDGET_GROUP("Mission: Yoga Minigame")
|
|
|
|
ADD_WIDGET_BOOL("Can fail yoga?", FailFlags[MINIGAME_FAIL_YOGA_FAILED])
|
|
|
|
START_WIDGET_GROUP("Yoga mat position")
|
|
|
|
ADD_WIDGET_BOOL("Enable positioning", bPositionMat)
|
|
ADD_WIDGET_STRING("Yoga Mat 01")
|
|
ADD_WIDGET_VECTOR_SLIDER("Position: ", sYogaMat.vPosition, -7000.0, 7000.0, 0.01)
|
|
ADD_WIDGET_VECTOR_SLIDER("Rotation: ", sYogaMat.vRotation, -7000.0, 7000.0, 0.01)
|
|
|
|
STOP_WIDGET_GROUP()
|
|
|
|
STOP_WIDGET_GROUP()
|
|
|
|
ENDPROC
|
|
|
|
PROC DELETE_DEBUG_WIDGETS()
|
|
IF DOES_WIDGET_GROUP_EXIST(YogaWidgets)
|
|
DELETE_WIDGET_GROUP(YogaWidgets)
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC CREATE_DEBUG_MINIGAME_STAGE_MENU()
|
|
|
|
SkipMenu[0].sTxtLabel = "SETUP"
|
|
SkipMenu[0].bSelectable = FALSE
|
|
SkipMenu[1].sTxtLabel = "CUTSCENE - INTRO"
|
|
SkipMenu[2].sTxtLabel = "YOGA WARRIOR"
|
|
SkipMenu[3].sTxtLabel = "YOGA TRIANGLE"
|
|
SkipMenu[4].sTxtLabel = "YOGA SUN SALUTATION"
|
|
SkipMenu[5].sTxtLabel = "CUTSCENE - END"
|
|
|
|
ENDPROC
|
|
|
|
PROC RUN_DEBUG_PASS_AND_FAIL_CHECK(MINIGAME_STAGES &eStage, MINIGAME_FAILS &eFailReason)
|
|
|
|
IF IS_KEYBOARD_KEY_PRESSED (KEY_S)
|
|
eStage = MINIGAME_STAGE_PASSED
|
|
ENDIF
|
|
|
|
IF IS_KEYBOARD_KEY_PRESSED (KEY_F)
|
|
CLEAR_PED_TASKS_IMMEDIATELY(PLAYER_PED_ID())
|
|
eStage = MINIGAME_STAGE_FAILED
|
|
eFailReason = MINIGAME_FAIL_FORCE_FAIL
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
PROC RUN_DEBUG_MINIGAME_STAGE_MENU(INT &iSelectedStage, MINIGAME_STAGES &eStage, BOOL &bSkipActive, BOOL &bResetStage)
|
|
|
|
IF LAUNCH_MISSION_STAGE_MENU(SkipMenu, iSelectedStage, ENUM_TO_INT(eStage), FALSE, "YOGA MINIGAME")
|
|
|
|
DO_SAFE_SCREEN_FADE_OUT(500)
|
|
|
|
CLEAR_PRINTS()
|
|
|
|
CLEAR_HELP()
|
|
|
|
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
|
|
CLEAR_PED_TASKS_IMMEDIATELY(PLAYER_PED_ID())
|
|
ENDIF
|
|
|
|
RUN_MINIGAME_STAGE_CLEANUP()
|
|
|
|
eStage = INT_TO_ENUM(MINIGAME_STAGES, iSelectedStage)
|
|
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Current minigame stage changed to ", GET_MINIGAME_STAGE_NAME_FOR_DEBUG(eStage), " via mission stage menu.")
|
|
|
|
//reset the debug stage reset flag
|
|
bResetStage = FALSE
|
|
|
|
bSkipActive = TRUE
|
|
|
|
RESET_MINIGAME_FLAGS()
|
|
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
PROC RUN_DEBUG_SKIPS(MINIGAME_STAGES &eStage, BOOL &bSkipActive, BOOL &bResetStage)
|
|
|
|
INT iCurrentStage = ENUM_TO_INT(eStage)
|
|
|
|
IF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_J)
|
|
|
|
IF eStage <> MINIGAME_STAGE_PASSED_CUTSCENE_END
|
|
AND eStage <> MINIGAME_STAGE_FAILED_CUTSCENE_END
|
|
|
|
DO_SAFE_SCREEN_FADE_OUT(500)
|
|
|
|
CLEAR_PRINTS()
|
|
|
|
CLEAR_HELP()
|
|
|
|
CLEAR_PED_TASKS_IMMEDIATELY(PLAYER_PED_ID())
|
|
|
|
RUN_MINIGAME_STAGE_CLEANUP()
|
|
|
|
iCurrentStage++
|
|
|
|
eStage = INT_TO_ENUM(MINIGAME_STAGES, iCurrentStage)
|
|
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Current minigame stage changed to ", GET_MINIGAME_STAGE_NAME_FOR_DEBUG(eStage), " via J skip.")
|
|
|
|
//reset the debug stage reset flag
|
|
bResetStage = FALSE
|
|
|
|
bSkipActive = TRUE
|
|
|
|
RESET_MINIGAME_FLAGS()
|
|
|
|
ENDIF
|
|
|
|
ELIF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_P)
|
|
|
|
IF eStage <> MINIGAME_STAGE_CUTSCENE_INTRO
|
|
|
|
DO_SAFE_SCREEN_FADE_OUT(500)
|
|
|
|
CLEAR_PRINTS()
|
|
|
|
CLEAR_HELP()
|
|
|
|
CLEAR_PED_TASKS_IMMEDIATELY(PLAYER_PED_ID())
|
|
|
|
RUN_MINIGAME_STAGE_CLEANUP()
|
|
|
|
IF ( bResetStage = FALSE )
|
|
|
|
iCurrentStage--
|
|
|
|
eStage = INT_TO_ENUM(MINIGAME_STAGES, iCurrentStage)
|
|
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Current minigame stage changed to ", GET_MINIGAME_STAGE_NAME_FOR_DEBUG(eStage), " via P skip.")
|
|
|
|
ELIF ( bResetStage = TRUE )
|
|
|
|
eStage = INT_TO_ENUM(MINIGAME_STAGES, iCurrentStage)
|
|
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Current minigame stage ", GET_MINIGAME_STAGE_NAME_FOR_DEBUG(eStage), " reset via P skip.")
|
|
|
|
ENDIF
|
|
|
|
//reset the debug stage reset flag
|
|
bResetStage = FALSE
|
|
|
|
bSkipActive = TRUE
|
|
|
|
RESET_MINIGAME_FLAGS()
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
PROC RUN_DEBUG_WIDGETS()
|
|
|
|
IF ( bPositionMat = TRUE )
|
|
|
|
IF DOES_ENTITY_EXIST(sYogaMat.ObjectIndex)
|
|
IF NOT IS_ENTITY_DEAD(sYogaMat.ObjectIndex)
|
|
SET_ENTITY_COORDS(sYogaMat.ObjectIndex, sYogaMat.vPosition)
|
|
SET_ENTITY_ROTATION(sYogaMat.ObjectIndex, sYogaMat.vRotation)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
#ENDIF
|
|
|
|
//|===================== END DEBUG VARIABLES, PROCEDURES & FUNCTIONS =====================|
|
|
|
|
//|=============================== MINIGAME STAGES FUNCTIONS =============================|
|
|
|
|
|
|
/// PURPOSE: Checks the player position and sets the player's location
|
|
///
|
|
PROC CHECK_MINIGAME_LOCATION(MINIGAME_STAGES eStage)
|
|
|
|
VECTOR vPlayerPos
|
|
IF IS_PLAYER_PLAYING(PLAYER_ID())
|
|
vPlayerPos = GET_ENTITY_COORDS(GET_PLAYER_PED(PLAYER_ID()))
|
|
ENDIF
|
|
|
|
IF ARE_VECTORS_ALMOST_EQUAL(vPlayerPos, <<-790.906, 186.293, 71.835>>, 15.0)
|
|
|
|
eMinigameLocation = MINIGAME_LOCATION_MICHAELS_HOUSE
|
|
|
|
//vMinigameTriggerPosition = << -790.906, 186.293, 71.8351 >>
|
|
sPlayerVehicleSafe.vPosition = <<-786.077393,193.253357,55.168709>>
|
|
sPlayerVehicleSafe.fHeading = 88.5632
|
|
|
|
sPlayerVehicleSafe.vAngledAreaPos1 = <<-783.845642,173.658768,75.979942>>
|
|
sPlayerVehicleSafe.vAngledAreaPos2 = << -793.906, 189.293, 71.8351 >>
|
|
sPlayerVehicleSafe.fAngledAreaWidth = 29.500000
|
|
|
|
sPlayerEndgame.vWarpPosition = << -791.5933, 188.4993, 71.8352 >>
|
|
sPlayerEndgame.fWarpHeading = 223.3349
|
|
|
|
sPlayerEndgame.vGotoPosition = << -788.8267, 185.6219, 71.8352 >>
|
|
sPlayerEndgame.fGotoHeading = 223.7161
|
|
|
|
sMinigamePosition.vPosition = << -790.906, 186.293, 71.8351 >>
|
|
sMinigamePosition.fHeading = 275.074219
|
|
|
|
vIntroScenePosition = << -790.271, 185.760, 71.842 >>
|
|
vIntroSceneRotation = << -0.000, 0.000, -65.000 >>
|
|
|
|
vOutro1ScenePosition = << -790.271, 185.760, 71.842 >>
|
|
vOutro1SceneRotation = << -0.000, 0.000, -65.000 >>
|
|
|
|
vOutro2ScenePosition = << -793.750, 172.200, 71.555 >>
|
|
vOutro2SceneRotation = << 0.000, 0.000, -162.240 >>
|
|
|
|
SWITCH eStage
|
|
|
|
CASE MINIGAME_STAGE_SETUP
|
|
CASE MINIGAME_STAGE_YOGA_WARRIOR
|
|
CASE MINIGAME_STAGE_YOGA_TRIANGLE
|
|
|
|
sYogaMat.vPosition = <<-791.0036, 186.3552, 71.8295>>
|
|
sYogaMat.vRotation = << 0.0, 0.0, -87.1403>>
|
|
sYogaMat.ModelName = PROP_YOGA_MAT_03
|
|
|
|
BREAK
|
|
|
|
CASE MINIGAME_STAGE_YOGA_SUNSALUTATION
|
|
CASE MINIGAME_STAGE_PASSED_CUTSCENE_END
|
|
|
|
sYogaMat.vPosition = << -791.480, 186.325, 71.835 >>
|
|
sYogaMat.vRotation = << 0.0, 0.0, 0.0 >>
|
|
sYogaMat.ModelName = PROP_YOGA_MAT_03
|
|
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
sCandle04.vPosition = <<-789.4000, 187.8659, 71.8349>>
|
|
sCandle04.vRotation = <<0.0000, 0.0000, 105.4800>>
|
|
sCandle04.ModelName = PROP_MEM_CANDLE_04
|
|
|
|
sCandle05.vPosition = <<-789.4700, 187.5759, 71.8349>>
|
|
sCandle05.vRotation = <<-0.0000, 0.0000, -37.4400>>
|
|
sCandle05.ModelName = PROP_MEM_CANDLE_05
|
|
|
|
sCandle06.vPosition = <<-789.7500, 187.7759, 71.8349>>
|
|
sCandle06.vRotation = <<0.0000, 0.0000, 52.2000>>
|
|
sCandle06.ModelName = PROP_MEM_CANDLE_06
|
|
|
|
sDock.vPosition = <<-790.6470, 188.6160, 71.9080>>
|
|
sDock.vRotation = <<0.0000, 0.0000, -17.0000>>
|
|
sDock.ModelName = PROP_MP3_DOCK
|
|
|
|
sCellphone.vPosition = <<-790.6667, 188.5546, 71.9111>>
|
|
sCellphone.vRotation = <<0.3273, -0.4297, -18.2587>>
|
|
sCellphone.ModelName = PROP_PHONE_ING
|
|
|
|
vLoadSceneCamPosition = << -793.52, 174.39, 73.20 >>
|
|
vLoadSceneCamDirection = << 0.26, -0.97, 0.03 >>
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Setting up Yoga at Michael's house.")
|
|
#ENDIF
|
|
|
|
ELIF ARE_VECTORS_ALMOST_EQUAL(vPlayerPos, <<2862.15, 5945.49, 357.11>>, 15.0)
|
|
|
|
eMinigameLocation = MINIGAME_LOCATION_NORTH_COAST
|
|
|
|
//vMinigameTriggerPosition = <<2861.4500, 5945.9048, 357.0988>>
|
|
sPlayerVehicleSafe.vPosition = <<2840.0188, 5955.4077, 353.0921>>
|
|
sPlayerVehicleSafe.fHeading = 225.4881
|
|
|
|
sPlayerVehicleSafe.vAngledAreaPos1 = <<2893.812500,5906.262695,368.200012>>//<<2882.842041,5959.318848,361.058990>>
|
|
sPlayerVehicleSafe.vAngledAreaPos2 = <<2833.079102,5967.083984,346.331116>>//<<2839.791992,5952.963867,336.083954>>
|
|
sPlayerVehicleSafe.fAngledAreaWidth = 63.500000//35.500000
|
|
|
|
sPlayerEndgame.vWarpPosition = <<2861.3835, 5945.8013, 357.0977>>
|
|
sPlayerEndgame.fWarpHeading = 75.9740
|
|
|
|
sPlayerEndgame.vGotoPosition = <<2857.6204, 5946.8945, 356.6815>>
|
|
sPlayerEndgame.fGotoHeading = 74.0123
|
|
|
|
sMinigamePosition.vPosition = <<2861.4485, 5945.8584, 357.0606>> //<<2861.4500, 5945.9048, 357.0988>>
|
|
sMinigamePosition.fHeading = 255.0873 //74.0086
|
|
|
|
vIntroScenePosition = << 2862.325, 5944.692, 357.070 >>
|
|
vIntroSceneRotation = << -0.000, 0.000, -85.000 >>
|
|
|
|
vOutro1ScenePosition = << 2862.325, 5944.692, 357.070 >>
|
|
vOutro1SceneRotation = << -0.000, 0.000, -85.000 >>
|
|
|
|
vOutro2ScenePosition = << 2859.625, 5946.542, 357.050 >>
|
|
vOutro2SceneRotation = << -0.000, 0.000, 82.800 >>
|
|
|
|
SWITCH eStage
|
|
|
|
CASE MINIGAME_STAGE_SETUP
|
|
CASE MINIGAME_STAGE_YOGA_WARRIOR
|
|
CASE MINIGAME_STAGE_YOGA_TRIANGLE
|
|
|
|
sYogaMat.vPosition = << 2861.47, 5945.90, 357.06 >>
|
|
sYogaMat.vRotation = << 0.0, -0.5, 70.0 >>
|
|
sYogaMat.ModelName = PROP_YOGA_MAT_03
|
|
|
|
BREAK
|
|
|
|
CASE MINIGAME_STAGE_YOGA_SUNSALUTATION
|
|
CASE MINIGAME_STAGE_PASSED_CUTSCENE_END
|
|
|
|
sYogaMat.vPosition = << 2860.900, 5946.040, 357.060 >>
|
|
sYogaMat.vRotation = << 0.0, -0.5, -20.00 >>
|
|
sYogaMat.ModelName = PROP_YOGA_MAT_03
|
|
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
sCandle04.vPosition = <<2864.1760, 5943.6089, 357.0612>>
|
|
sCandle04.vRotation = <<-0.0000, 0.0000, 0.0000>>
|
|
sCandle04.ModelName = PROP_MEM_CANDLE_04
|
|
|
|
sCandle05.vPosition = <<2863.9309, 5943.6650, 357.0606>>
|
|
sCandle05.vRotation = <<-0.0000, 0.0000, 142.9200>>
|
|
sCandle05.ModelName = PROP_MEM_CANDLE_05
|
|
|
|
sCandle06.vPosition = <<2864.0840, 5943.8691, 357.0550>>
|
|
sCandle06.vRotation = <<-0.0000, 0.0000, -95.7600>>
|
|
sCandle06.ModelName = PROP_MEM_CANDLE_06
|
|
|
|
sDock.vPosition = <<2862.946, 5947.504, 357.1310>>
|
|
sDock.vRotation = <<-0.0000, 0.0000, -38.5000>>
|
|
sDock.ModelName = PROP_MP3_DOCK
|
|
|
|
sCellphone.vPosition = <<2862.9082, 5947.4536, 357.1394>>
|
|
sCellphone.vRotation = <<0.2939, -0.4187, -38.2439>>
|
|
sCellphone.ModelName = PROP_PHONE_ING
|
|
|
|
vLoadSceneCamPosition = << 2861.51, 5945.42, 358.69 >>
|
|
vLoadSceneCamDirection = << -0.98, 0.17, 0.03 >>
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Setting up Yoga at North Coast.")
|
|
#ENDIF
|
|
ELSE
|
|
SCRIPT_ASSERT("YOGA: Invalid location!")
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
FUNC BOOL IS_MINIGAME_STAGE_LOADED(MINIGAME_STAGES eStage, INT &iSetupProgress, BOOL &bStageLoaded, BOOL &bStageSkippedTo, BOOL &bStageReplayed)
|
|
|
|
//handle initial minigame setup
|
|
//only run this IF block once, when the minigame first loads
|
|
IF ( iSetupProgress = 0 )
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Starting initial minigame loading.")
|
|
#ENDIF
|
|
|
|
//clear the screen of any text displayed before minigame started
|
|
CLEAR_PRINTS()
|
|
CLEAR_HELP()
|
|
|
|
REGISTER_SCRIPT_WITH_AUDIO(TRUE)
|
|
|
|
IF IS_PLAYER_PLAYING(PLAYER_ID())
|
|
SET_PLAYER_WANTED_LEVEL(PLAYER_ID(),0)
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
|
|
STORE_PLAYER_PED_VARIATIONS(PLAYER_PED_ID(), TRUE)
|
|
ENDIF
|
|
|
|
PAUSE_CLOCK(TRUE)
|
|
CLEAR_TIMECYCLE_MODIFIER()
|
|
|
|
CHECK_MINIGAME_LOCATION(eStage)
|
|
RESET_YOGA_STRUCT(sYogaPlayer, TRUE)
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Finished initial minigame loading.")
|
|
#ENDIF
|
|
|
|
iSetupProgress++
|
|
|
|
ENDIF
|
|
|
|
//run this each time new minigame stage needs to be loaded
|
|
IF ( iSetupProgress = 1 )
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Started minigame stage loading for ", GET_MINIGAME_STAGE_NAME_FOR_DEBUG(eStage), ".")
|
|
#ENDIF
|
|
|
|
bStageLoaded = FALSE
|
|
|
|
CHECK_MINIGAME_LOCATION(eStage)
|
|
|
|
//clear triggered text labels
|
|
CLEAR_TRIGGERED_LABELS()
|
|
|
|
iSetupProgress++
|
|
|
|
ENDIF
|
|
|
|
//handle player positioning when current stage is being skipped to or played normally
|
|
//fade in the screen if it was faded out due to skipping
|
|
IF ( iSetupProgress = 2 )
|
|
|
|
//stage was skipped to or is being replayed
|
|
IF ( bStageSkippedTo = TRUE )
|
|
OR ( bStageReplayed = TRUE )
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Warping player ped to new position for minigame stage being loaded due to skipping or replay.")
|
|
#ENDIF
|
|
|
|
WARP_PED(PLAYER_PED_ID(), sMinigamePosition.vPosition, sMinigamePosition.fHeading, FALSE, TRUE, FALSE)
|
|
|
|
ENDIF
|
|
|
|
iSetupProgress++
|
|
|
|
ENDIF
|
|
|
|
|
|
//handle creating vehicles/peds and setting up fail flags
|
|
//run this each time new minigame stage needs to be loaded
|
|
//THIS SETUP SECTION ASSUMES THAT ALL REQUIRED ASSETS HAVE BEEN ALREADY LOADED TO MEMORY IN PREVIOUS SETUP SECTIONS
|
|
IF ( iSetupProgress = 3 )
|
|
|
|
SET_FAIL_FLAGS(FALSE)
|
|
|
|
SWITCH eStage
|
|
|
|
CASE MINIGAME_STAGE_YOGA_WARRIOR
|
|
CASE MINIGAME_STAGE_YOGA_TRIANGLE
|
|
CASE MINIGAME_STAGE_YOGA_SUNSALUTATION
|
|
CASE MINIGAME_STAGE_PASSED_CUTSCENE_END
|
|
CASE MINIGAME_STAGE_FAILED_CUTSCENE_END
|
|
|
|
IF NOT IS_AUDIO_SCENE_ACTIVE("YOGA_MINIGAME_TRANQUIL")
|
|
|
|
START_AUDIO_SCENE("YOGA_MINIGAME_TRANQUIL")
|
|
|
|
IF TRIGGER_MUSIC_EVENT("MGYG_START")
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Triggered music event MGYG_START.")
|
|
#ENDIF
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
IF ( bOutfitYoga = FALSE )
|
|
SET_PLAYER_PED_OUTFIT(MINIGAME_OUTFIT_YOGA)
|
|
bOutfitYoga = TRUE
|
|
ENDIF
|
|
|
|
IF HAS_MINIGAME_OBJECT_BEEN_CREATED(sYogaMat)
|
|
AND HAS_MINIGAME_OBJECT_BEEN_CREATED(sCandle04, TRUE)
|
|
AND HAS_MINIGAME_OBJECT_BEEN_CREATED(sCandle05, TRUE)
|
|
AND HAS_MINIGAME_OBJECT_BEEN_CREATED(sCandle06, TRUE)
|
|
|
|
SET_ENTITY_COORDS_NO_OFFSET(sYogaMat.ObjectIndex, sYogaMat.vPosition)
|
|
SET_ENTITY_ROTATION(sYogaMat.ObjectIndex, sYogaMat.vRotation)
|
|
FREEZE_ENTITY_POSITION(sYogaMat.ObjectIndex, TRUE)
|
|
|
|
FailFlags[MINIGAME_FAIL_YOGA_FAILED] = TRUE
|
|
|
|
iSetupProgress++
|
|
ENDIF
|
|
|
|
|
|
BREAK
|
|
|
|
DEFAULT
|
|
iSetupProgress++
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
ENDIF
|
|
|
|
//handle player positioning when current stage is being skipped to or played normally
|
|
//fade in the screen if it was faded out due to skipping
|
|
IF ( iSetupProgress = 4 )
|
|
|
|
//stage was skipped to or is being replayed
|
|
IF ( bStageSkippedTo = TRUE )
|
|
OR ( bStageReplayed = TRUE )
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Calling LOAD_SCENE() at coordinates ", sMinigamePosition.vPosition, " for minigame replay or stage skip. This might take a while to load.")
|
|
#ENDIF
|
|
|
|
LOAD_SCENE(sMinigamePosition.vPosition)
|
|
|
|
CLEAR_AREA(sMinigamePosition.vPosition, 15.0, TRUE)
|
|
CLEAR_AREA_OF_PEDS(sMinigamePosition.vPosition, 20.0, TRUE)
|
|
CLEAR_AREA_OF_VEHICLES(sMinigamePosition.vPosition, 15.0)
|
|
REMOVE_PARTICLE_FX_IN_RANGE(sMinigamePosition.vPosition, 20.0)
|
|
|
|
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0)
|
|
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0)
|
|
|
|
bStageSkippedTo = FALSE
|
|
bStageReplayed = FALSE
|
|
|
|
IF IS_SCREEN_FADED_OUT()
|
|
DO_SAFE_SCREEN_FADE_IN(500)
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
iSetupProgress++
|
|
|
|
ENDIF
|
|
|
|
//print the message only once per minigame stage
|
|
//handle fades
|
|
IF ( iSetupProgress = 5 )
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Finished minigame stage loading for ", GET_MINIGAME_STAGE_NAME_FOR_DEBUG(eStage), ".")
|
|
#ENDIF
|
|
|
|
bStageLoaded = TRUE
|
|
|
|
iSetupProgress++
|
|
|
|
ENDIF
|
|
|
|
IF ( iSetupProgress = 6 )
|
|
|
|
RETURN TRUE
|
|
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
|
|
ENDFUNC
|
|
|
|
FUNC BOOL IS_MINIGAME_STAGE_CUTSCENE_INTRO_COMPLETED(INT &iStageProgress)
|
|
|
|
SWITCH iStageProgress
|
|
|
|
CASE 0 //request animations and models
|
|
|
|
REQUEST_ANIM_DICT("mini@yoga")
|
|
REQUEST_MODEL(sDock.ModelName)
|
|
REQUEST_MODEL(sCellphone.ModelName)
|
|
REQUEST_FAKE_CELLPHONE_MOVIE(sFakeCellphoneData)
|
|
|
|
IF HAS_ANIM_DICT_LOADED("mini@yoga")
|
|
AND HAS_MODEL_LOADED(sDock.ModelName)
|
|
AND HAS_MODEL_LOADED(sCellphone.ModelName)
|
|
AND HAS_FAKE_CELLPHONE_MOVIE_LOADED(sFakeCellphoneData)
|
|
|
|
iStageProgress++
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE 1
|
|
|
|
IF NOT IS_SYNCHRONIZED_SCENE_RUNNING(iMinigameIntroSceneID)
|
|
|
|
RESOLVE_VEHICLES_INSIDE_ANGLED_AREA(sPlayerVehicleSafe.vAngledAreaPos1,
|
|
sPlayerVehicleSafe.vAngledAreaPos2,
|
|
sPlayerVehicleSafe.fAngledAreaWidth,
|
|
sPlayerVehicleSafe.vPosition,
|
|
sPlayerVehicleSafe.fHeading,
|
|
FALSE, FALSE, TRUE)
|
|
|
|
CLEAR_AREA(sMinigamePosition.vPosition, 15.0, TRUE)
|
|
CLEAR_AREA_OF_PEDS(sMinigamePosition.vPosition, 20.0)
|
|
CLEAR_AREA_OF_OBJECTS(sMinigamePosition.vPosition, 20.0)
|
|
CLEAR_AREA_OF_PROJECTILES(sMinigamePosition.vPosition, 20.0)
|
|
|
|
STOP_FIRE_IN_RANGE(sMinigamePosition.vPosition, 20.0)
|
|
REMOVE_DECALS_IN_RANGE(sMinigamePosition.vPosition, 20.0)
|
|
REMOVE_PARTICLE_FX_IN_RANGE(sMinigamePosition.vPosition, 20.0)
|
|
|
|
|
|
iMinigameIntroSceneID = CREATE_SYNCHRONIZED_SCENE(vIntroScenePosition, vIntroSceneRotation)
|
|
|
|
SET_SYNCHRONIZED_SCENE_HOLD_LAST_FRAME(iMinigameIntroSceneID, TRUE)
|
|
|
|
IF HAS_MINIGAME_OBJECT_BEEN_CREATED(sDock, TRUE)
|
|
//
|
|
ENDIF
|
|
|
|
IF HAS_MINIGAME_OBJECT_BEEN_CREATED(sCellphone)
|
|
IF DOES_ENTITY_EXIST(sCellphone.ObjectIndex) AND NOT IS_ENTITY_DEAD(sCellphone.ObjectIndex)
|
|
DRAW_FAKE_CELLPHONE_SCREEN(sFakeCellphoneData, TRUE, FAKE_CELLPHONE_SCREEN_GENERIC_MENU)
|
|
ATTACH_ENTITY_TO_ENTITY(sCellphone.ObjectIndex, PLAYER_PED_ID(), GET_PED_BONE_INDEX(PLAYER_PED_ID(), BONETAG_PH_R_HAND),
|
|
<< 0.0, 0.0, 0.0 >>, << 0.0, 0.0, 0.0 >>)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
CLEAR_PED_WETNESS(PLAYER_PED_ID())
|
|
CLEAR_PED_TASKS_IMMEDIATELY(PLAYER_PED_ID())
|
|
SET_CURRENT_PED_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_UNARMED)
|
|
HIDE_PED_WEAPON_FOR_SCRIPTED_CUTSCENE(PLAYER_PED_ID(), TRUE)
|
|
|
|
SET_FORCE_FOOTSTEP_UPDATE(PLAYER_PED_ID(), TRUE)
|
|
TASK_SYNCHRONIZED_SCENE(PLAYER_PED_ID(), iMinigameIntroSceneID, "mini@yoga", "intro", INSTANT_BLEND_IN, INSTANT_BLEND_OUT)
|
|
FORCE_PED_AI_AND_ANIMATION_UPDATE(PLAYER_PED_ID())
|
|
|
|
DESTROY_ALL_CAMS()
|
|
|
|
AnimatedCamera = CREATE_CAMERA(CAMTYPE_ANIMATED, TRUE)
|
|
PLAY_SYNCHRONIZED_CAM_ANIM(AnimatedCamera, iMinigameIntroSceneID, "intro_cam", "mini@yoga")
|
|
|
|
CLEAR_HELP()
|
|
CLEAR_PRINTS()
|
|
|
|
DISPLAY_HUD(FALSE)
|
|
DISPLAY_RADAR(FALSE)
|
|
RENDER_SCRIPT_CAMS(TRUE, FALSE)
|
|
|
|
CLEAR_TIMECYCLE_MODIFIER()
|
|
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(sDock.ModelName)
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(sCellphone.ModelName)
|
|
|
|
iStageProgress++
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE 2
|
|
|
|
IF IS_SYNCHRONIZED_SCENE_RUNNING(iMinigameIntroSceneID)
|
|
|
|
IF IS_SCREEN_FADED_OUT()
|
|
DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME)
|
|
ENDIF
|
|
|
|
IF NOT IS_AUDIO_SCENE_ACTIVE("YOGA_MINIGAME_TRANQUIL")
|
|
TRIGGER_MUSIC_EVENT("MGYG_START")
|
|
START_AUDIO_SCENE("YOGA_MINIGAME_TRANQUIL")
|
|
ENDIF
|
|
|
|
IF DOES_ENTITY_EXIST(sCellphone.ObjectIndex) AND NOT IS_ENTITY_DEAD(sCellphone.ObjectIndex)
|
|
IF IS_ENTITY_ATTACHED_TO_ANY_PED(sCellphone.ObjectIndex)
|
|
IF GET_SYNCHRONIZED_SCENE_PHASE(iMinigameIntroSceneID) >= 0.395
|
|
DETACH_ENTITY(sCellphone.ObjectIndex, FALSE)
|
|
SET_ENTITY_COORDS_NO_OFFSET(sCellphone.ObjectIndex, sCellphone.vPosition)
|
|
SET_ENTITY_ROTATION(sCellphone.ObjectIndex, sCellphone.vRotation)
|
|
FREEZE_ENTITY_POSITION(sCellphone.ObjectIndex, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF ( bOutfitYoga = FALSE )
|
|
IF GET_SYNCHRONIZED_SCENE_PHASE(iMinigameIntroSceneID) >= 0.80
|
|
SET_PLAYER_PED_OUTFIT(MINIGAME_OUTFIT_YOGA)
|
|
bOutfitYoga = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF HAS_MINIGAME_OBJECT_BEEN_CREATED(sYogaMat, TRUE)
|
|
AND HAS_MINIGAME_OBJECT_BEEN_CREATED(sCandle04, TRUE)
|
|
AND HAS_MINIGAME_OBJECT_BEEN_CREATED(sCandle05, TRUE)
|
|
AND HAS_MINIGAME_OBJECT_BEEN_CREATED(sCandle06, TRUE)
|
|
|
|
IF ( bOutfitYoga = TRUE )
|
|
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
|
|
IF HAVE_ALL_STREAMING_REQUESTS_COMPLETED(PLAYER_PED_ID())
|
|
iStageProgress++
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE 3
|
|
|
|
IF IS_SYNCHRONIZED_SCENE_RUNNING(iMinigameIntroSceneID)
|
|
IF GET_SYNCHRONIZED_SCENE_PHASE(iMinigameIntroSceneID) >= 1.0
|
|
|
|
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
|
|
CLEAR_PED_TASKS_IMMEDIATELY(PLAYER_PED_ID())
|
|
SET_CURRENT_PED_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_UNARMED, TRUE)
|
|
HIDE_PED_WEAPON_FOR_SCRIPTED_CUTSCENE(PLAYER_PED_ID(), TRUE)
|
|
ENDIF
|
|
|
|
WARP_PED(PLAYER_PED_ID(), sMinigamePosition.vPosition, sMinigamePosition.fHeading, FALSE, FALSE, FALSE)
|
|
TASK_PLAY_ANIM(PLAYER_PED_ID(), "missfam5_yoga", "start_pose", INSTANT_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_LOOPING, 0, FALSE, AIK_DISABLE_LEG_IK)
|
|
|
|
iStageProgress++
|
|
|
|
ENDIF
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE 4
|
|
|
|
IF IS_SYNCHRONIZED_SCENE_RUNNING(iMinigameIntroSceneID)
|
|
|
|
IF eMinigameLocation = MINIGAME_LOCATION_MICHAELS_HOUSE
|
|
|
|
ScriptedCamera = CREATE_CAMERA(CAMTYPE_SCRIPTED, TRUE)
|
|
SET_CAM_PARAMS(ScriptedCamera, << -782.802368, 187.4389, 73.326614>>, << -3.540541, 0.000000, 99.799942>>, 39.355549)
|
|
|
|
ELIF eMinigameLocation = MINIGAME_LOCATION_NORTH_COAST
|
|
|
|
ScriptedCamera = CREATE_CAMERA(CAMTYPE_SCRIPTED, TRUE)
|
|
SET_CAM_PARAMS(ScriptedCamera, <<2870.826172,5943.484863,356.912140>>, <<11.166323,0.034383,76.034073>>, 39.355549)
|
|
|
|
ENDIF
|
|
|
|
DESTROY_CAM(AnimatedCamera)
|
|
|
|
REMOVE_ANIM_DICT("mini@yoga")
|
|
|
|
RETURN TRUE
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
RETURN FALSE
|
|
|
|
ENDFUNC
|
|
|
|
FUNC BOOL IS_MINIGAME_STAGE_YOGA_WARRIOR_COMPLETED(INT &iStageProgress)
|
|
|
|
SWITCH iStageProgress
|
|
|
|
CASE 0
|
|
|
|
IF NOT DOES_CAM_EXIST(ScriptedCamera)
|
|
|
|
ScriptedCamera = CREATE_CAMERA(CAMTYPE_SCRIPTED, TRUE)
|
|
|
|
IF eMinigameLocation = MINIGAME_LOCATION_MICHAELS_HOUSE
|
|
|
|
SET_CAM_PARAMS(ScriptedCamera, << -782.802368, 187.4389, 73.326614>>, << -3.540541, 0.000000, 99.799942>>, 39.355549)
|
|
SET_CAM_PARAMS(ScriptedCamera, << -787.032959, 186.882339, 73.063408 >>, << -3.376375, 0.000000, 97.665771 >>, 39.355549,
|
|
25000, GRAPH_TYPE_SIN_ACCEL_DECEL, GRAPH_TYPE_SIN_ACCEL_DECEL)
|
|
|
|
ELIF eMinigameLocation = MINIGAME_LOCATION_NORTH_COAST
|
|
|
|
SET_CAM_PARAMS(ScriptedCamera, <<2870.826172,5943.484863,356.912140>>, <<11.166323,0.034383,76.034073>>, 39.355549) // CAM 2
|
|
SET_CAM_PARAMS(ScriptedCamera, <<2867.668213,5944.266113,357.554688>>,<<9.696003,0.034384,75.404343>>,39.355549,
|
|
25000, GRAPH_TYPE_SIN_ACCEL_DECEL, GRAPH_TYPE_SIN_ACCEL_DECEL) // CAM3
|
|
|
|
ENDIF
|
|
|
|
SHAKE_CAM(ScriptedCamera, "HAND_SHAKE", 0.25)
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Created scripted camera.")
|
|
#ENDIF
|
|
|
|
DISPLAY_RADAR(FALSE)
|
|
DISPLAY_HUD(FALSE)
|
|
|
|
SET_CAM_FAR_CLIP(ScriptedCamera, 500)
|
|
|
|
ENDIF
|
|
|
|
IF DOES_CAM_EXIST(ScriptedCamera)
|
|
|
|
IF eMinigameLocation = MINIGAME_LOCATION_MICHAELS_HOUSE
|
|
|
|
SET_CAM_PARAMS(ScriptedCamera, << -782.802368, 187.4389, 73.326614>>, << -3.540541, 0.000000, 99.799942>>, 39.355549)
|
|
SET_CAM_PARAMS(ScriptedCamera, << -787.032959, 186.882339, 73.063408 >>, << -3.376375, 0.000000, 97.665771 >>, 39.355549,
|
|
25000, GRAPH_TYPE_SIN_ACCEL_DECEL, GRAPH_TYPE_SIN_ACCEL_DECEL)
|
|
|
|
ELIF eMinigameLocation = MINIGAME_LOCATION_NORTH_COAST
|
|
|
|
SET_CAM_PARAMS(ScriptedCamera, <<2870.826172,5943.484863,356.912140>>, <<11.166323,0.034383,76.034073>>, 39.355549) // CAM 2
|
|
SET_CAM_PARAMS(ScriptedCamera, <<2867.668213,5944.266113,357.554688>>,<<9.696003,0.034384,75.404343>>,39.355549,
|
|
25000, GRAPH_TYPE_SIN_ACCEL_DECEL, GRAPH_TYPE_SIN_ACCEL_DECEL) // CAM3
|
|
|
|
ENDIF
|
|
|
|
SHAKE_CAM(ScriptedCamera, "HAND_SHAKE", 0.25)
|
|
|
|
RENDER_SCRIPT_CAMS(TRUE, FALSE)
|
|
|
|
ENDIF
|
|
|
|
iStageProgress++
|
|
|
|
BREAK
|
|
|
|
CASE 1
|
|
|
|
//trigger music event for completed pose
|
|
IF ( bMusicEventPositionCompleteTriggered = FALSE )
|
|
IF ( sYogaPlayer.eYogaMinigameStage = YOGAMINIGAMESTAGE_DOMOVE ) //when player is doing yoga moves and when
|
|
IF ( sYogaPlayer.eYogaMoveStage = YOGAMOVESTAGE_PLAY_ENDPOSE_ANIMATION ) //player has completed pose is playing end pose animation
|
|
IF PREPARE_MUSIC_EVENT("MGYG_POSITION_COMPLETE")
|
|
IF TRIGGER_MUSIC_EVENT("MGYG_POSITION_COMPLETE")
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Triggered music event MGYG_POSITION_COMPLETE.")
|
|
#ENDIF
|
|
bMusicEventPositionCompleteTriggered = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF bIsQuitMenuActive = FALSE
|
|
|
|
RUN_YOGA_CUSTOM_CAMERA(sYogaPlayer)
|
|
UPDATE_YOGA_TIMECYCLE_MODIFIER(sYogaPlayer, TRUE)
|
|
|
|
IF HAS_PLAYER_COMPLETED_YOGA_MOVE(sYogaPlayer, YOGAMOVE_WARRIOR, TRUE, TRUE, FALSE, DEFAULT, ENUM_TO_INT(eMinigameLocation), TRUE)
|
|
|
|
CHECK_DECREASE_KHARMA()
|
|
RESET_YOGA_STRUCT(sYogaPlayer, FALSE)
|
|
|
|
bMusicEventPositionCompleteTriggered = FALSE
|
|
|
|
iStageProgress++
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE 2
|
|
RETURN TRUE
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
RETURN FALSE
|
|
|
|
ENDFUNC
|
|
|
|
FUNC BOOL IS_MINIGAME_STAGE_YOGA_TRIANGLE_COMPLETED(INT &iStageProgress)
|
|
|
|
SWITCH iStageProgress
|
|
|
|
CASE 0
|
|
|
|
IF NOT DOES_CAM_EXIST(ScriptedCamera)
|
|
|
|
ScriptedCamera = CREATE_CAMERA(CAMTYPE_SCRIPTED, TRUE)
|
|
|
|
IF eMinigameLocation = MINIGAME_LOCATION_MICHAELS_HOUSE
|
|
|
|
SET_CAM_PARAMS(ScriptedCamera, << -782.802368, 187.4389, 73.326614>>, << -3.540541, 0.000000, 99.799942>>, 39.355549)
|
|
SET_CAM_PARAMS(ScriptedCamera, << -787.032959, 186.882339, 73.063408 >>, << -3.376375, 0.000000, 97.665771 >>, 39.355549,
|
|
25000, GRAPH_TYPE_SIN_ACCEL_DECEL, GRAPH_TYPE_SIN_ACCEL_DECEL)
|
|
|
|
ELIF eMinigameLocation = MINIGAME_LOCATION_NORTH_COAST
|
|
|
|
SET_CAM_PARAMS(ScriptedCamera, <<2870.826172,5943.484863,356.912140>>, <<11.166323,0.034383,76.034073>>, 39.355549) // CAM 2
|
|
SET_CAM_PARAMS(ScriptedCamera, <<2867.668213,5944.266113,357.554688>>,<<9.696003,0.034384,75.404343>>,39.355549,
|
|
25000, GRAPH_TYPE_SIN_ACCEL_DECEL, GRAPH_TYPE_SIN_ACCEL_DECEL) // CAM3
|
|
|
|
ENDIF
|
|
|
|
SHAKE_CAM(ScriptedCamera, "HAND_SHAKE", 0.25)
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Created scripted camera.")
|
|
#ENDIF
|
|
|
|
DISPLAY_RADAR(FALSE)
|
|
DISPLAY_HUD(FALSE)
|
|
|
|
RENDER_SCRIPT_CAMS(TRUE, FALSE)
|
|
|
|
SET_CAM_FAR_CLIP(ScriptedCamera, 500)
|
|
|
|
ENDIF
|
|
|
|
iStageProgress++
|
|
|
|
BREAK
|
|
|
|
CASE 1
|
|
|
|
//trigger music event for completed pose
|
|
IF ( bMusicEventPositionCompleteTriggered = FALSE )
|
|
IF ( sYogaPlayer.eYogaMinigameStage = YOGAMINIGAMESTAGE_DOMOVE ) //when player is doing yoga moves and when
|
|
IF ( sYogaPlayer.eYogaMoveStage = YOGAMOVESTAGE_PLAY_ENDPOSE_ANIMATION ) //player has completed pose is playing end pose animation
|
|
IF PREPARE_MUSIC_EVENT("MGYG_POSITION_COMPLETE")
|
|
IF TRIGGER_MUSIC_EVENT("MGYG_POSITION_COMPLETE")
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Triggered music event MGYG_POSITION_COMPLETE.")
|
|
#ENDIF
|
|
bMusicEventPositionCompleteTriggered = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF bIsQuitMenuActive = FALSE
|
|
|
|
RUN_YOGA_CUSTOM_CAMERA(sYogaPlayer)
|
|
UPDATE_YOGA_TIMECYCLE_MODIFIER(sYogaPlayer, TRUE)
|
|
|
|
IF HAS_PLAYER_COMPLETED_YOGA_MOVE(sYogaPlayer, YOGAMOVE_TRIANGLE, TRUE, FALSE, FALSE, DEFAULT, ENUM_TO_INT(eMinigameLocation), TRUE)
|
|
|
|
CHECK_DECREASE_KHARMA()
|
|
RESET_YOGA_STRUCT(sYogaPlayer, FALSE)
|
|
|
|
bMusicEventPositionCompleteTriggered = FALSE
|
|
|
|
iStageProgress++
|
|
|
|
ENDIF
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE 2
|
|
RETURN TRUE
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
RETURN FALSE
|
|
|
|
ENDFUNC
|
|
|
|
FUNC BOOL IS_MINIGAME_STAGE_YOGA_SUNSALUTATION_COMPLETED(INT &iStageProgress)
|
|
|
|
SWITCH iStageProgress
|
|
|
|
CASE 0
|
|
|
|
IF NOT DOES_CAM_EXIST(ScriptedCamera)
|
|
|
|
ScriptedCamera = CREATE_CAMERA(CAMTYPE_SCRIPTED, TRUE)
|
|
|
|
IF eMinigameLocation = MINIGAME_LOCATION_MICHAELS_HOUSE
|
|
|
|
SET_CAM_PARAMS(ScriptedCamera, << -782.802368, 187.4389, 73.326614>>, << -3.540541, 0.000000, 99.799942>>, 39.355549)
|
|
SET_CAM_PARAMS(ScriptedCamera, << -787.032959, 186.882339, 73.063408 >>, << -3.376375, 0.000000, 97.665771 >>, 39.355549,
|
|
25000, GRAPH_TYPE_SIN_ACCEL_DECEL, GRAPH_TYPE_SIN_ACCEL_DECEL)
|
|
|
|
ELIF eMinigameLocation = MINIGAME_LOCATION_NORTH_COAST
|
|
|
|
SET_CAM_PARAMS(ScriptedCamera, <<2870.826172,5943.484863,356.912140>>, <<11.166323,0.034383,76.034073>>, 39.355549) // CAM 2
|
|
SET_CAM_PARAMS(ScriptedCamera, <<2867.668213,5944.266113,357.554688>>,<<9.696003,0.034384,75.404343>>,39.355549,
|
|
25000, GRAPH_TYPE_SIN_ACCEL_DECEL, GRAPH_TYPE_SIN_ACCEL_DECEL) // CAM3
|
|
|
|
ENDIF
|
|
|
|
SHAKE_CAM(ScriptedCamera, "HAND_SHAKE", 0.25)
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Created scripted camera.")
|
|
#ENDIF
|
|
|
|
DISPLAY_RADAR(FALSE)
|
|
DISPLAY_HUD(FALSE)
|
|
|
|
RENDER_SCRIPT_CAMS(TRUE, FALSE)
|
|
|
|
SET_CAM_FAR_CLIP(ScriptedCamera, 500)
|
|
|
|
|
|
ENDIF
|
|
|
|
iStageProgress++
|
|
|
|
BREAK
|
|
|
|
CASE 1
|
|
|
|
//trigger music event for completed pose
|
|
IF ( bMusicEventPositionCompleteTriggered = FALSE )
|
|
IF ( sYogaPlayer.eYogaMinigameStage = YOGAMINIGAMESTAGE_DOMOVE ) //when player is doing yoga moves and when
|
|
IF ( sYogaPlayer.eYogaMoveStage = YOGAMOVESTAGE_PLAY_ENDPOSE_ANIMATION ) //player has completed pose is playing end pose animation
|
|
IF PREPARE_MUSIC_EVENT("MGYG_POSITION_COMPLETE")
|
|
IF TRIGGER_MUSIC_EVENT("MGYG_POSITION_COMPLETE")
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Triggered music event MGYG_POSITION_COMPLETE.")
|
|
#ENDIF
|
|
bMusicEventPositionCompleteTriggered = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF bIsQuitMenuActive = FALSE
|
|
|
|
RUN_YOGA_CUSTOM_CAMERA(sYogaPlayer)
|
|
UPDATE_YOGA_TIMECYCLE_MODIFIER(sYogaPlayer, TRUE)
|
|
|
|
IF HAS_PLAYER_COMPLETED_YOGA_MOVE(sYogaPlayer, YOGAMOVE_SUNSALUTATION, TRUE, FALSE, FALSE, DEFAULT, ENUM_TO_INT(eMinigameLocation), TRUE)
|
|
|
|
CHECK_DECREASE_KHARMA()
|
|
RESET_YOGA_STRUCT(sYogaPlayer, FALSE)
|
|
|
|
bMusicEventPositionCompleteTriggered = FALSE
|
|
|
|
iStageProgress++
|
|
|
|
ENDIF
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE 2
|
|
RETURN TRUE
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
RETURN FALSE
|
|
|
|
ENDFUNC
|
|
|
|
FUNC BOOL IS_MINIGAME_STAGE_CUTSCENE_END_COMPLETED(INT &iStageProgress)
|
|
|
|
SWITCH iStageProgress
|
|
|
|
CASE 0
|
|
|
|
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
|
|
ENDIF
|
|
|
|
iStageProgress++
|
|
|
|
BREAK
|
|
|
|
CASE 1
|
|
|
|
IF NOT bHasQuit
|
|
|
|
REQUEST_ANIM_DICT("mini@yoga")
|
|
REQUEST_MODEL(sDock.ModelName)
|
|
REQUEST_MODEL(sCellphone.ModelName)
|
|
REQUEST_ANIM_DICT("move_p_m_zero_idles@generic")
|
|
REQUEST_FAKE_CELLPHONE_MOVIE(sFakeCellphoneData)
|
|
|
|
IF HAS_ANIM_DICT_LOADED("mini@yoga")
|
|
AND HAS_MODEL_LOADED(sDock.ModelName)
|
|
AND HAS_MODEL_LOADED(sCellphone.ModelName)
|
|
AND HAS_ANIM_DICT_LOADED("move_p_m_zero_idles@generic")
|
|
AND HAS_FAKE_CELLPHONE_MOVIE_LOADED(sFakeCellphoneData)
|
|
|
|
iStageProgress++
|
|
|
|
ENDIF
|
|
|
|
ELSE
|
|
|
|
IF IS_SCREEN_FADED_IN()
|
|
DO_SCREEN_FADE_OUT(DEFAULT_FADE_TIME)
|
|
ENDIF
|
|
|
|
IF IS_SCREEN_FADED_OUT() AND NOT IS_SCREEN_FADING_OUT()
|
|
|
|
iStageProgress = END_CUTSCENE_QUIT
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE 2
|
|
|
|
IF NOT IS_SYNCHRONIZED_SCENE_RUNNING(iMinigameOutroScene1ID)
|
|
|
|
iMinigameOutroScene1ID = CREATE_SYNCHRONIZED_SCENE(vOutro1ScenePosition, vOutro1SceneRotation)
|
|
|
|
SET_SYNCHRONIZED_SCENE_HOLD_LAST_FRAME(iMinigameOutroScene1ID, TRUE)
|
|
|
|
|
|
IF HAS_MINIGAME_OBJECT_BEEN_CREATED(sDock, TRUE)
|
|
//
|
|
ENDIF
|
|
|
|
IF HAS_MINIGAME_OBJECT_BEEN_CREATED(sCellphone, TRUE)
|
|
DRAW_FAKE_CELLPHONE_SCREEN(sFakeCellphoneData, TRUE, FAKE_CELLPHONE_SCREEN_GENERIC_MENU)
|
|
ENDIF
|
|
|
|
CLEAR_PED_WETNESS(PLAYER_PED_ID())
|
|
CLEAR_PED_TASKS_IMMEDIATELY(PLAYER_PED_ID())
|
|
SET_CURRENT_PED_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_UNARMED)
|
|
HIDE_PED_WEAPON_FOR_SCRIPTED_CUTSCENE(PLAYER_PED_ID(), TRUE)
|
|
|
|
SET_FORCE_FOOTSTEP_UPDATE(PLAYER_PED_ID(), TRUE)
|
|
TASK_SYNCHRONIZED_SCENE(PLAYER_PED_ID(), iMinigameOutroScene1ID, "mini@yoga", "outro_1", INSTANT_BLEND_IN, INSTANT_BLEND_OUT)
|
|
FORCE_PED_AI_AND_ANIMATION_UPDATE(PLAYER_PED_ID())
|
|
|
|
AnimatedCamera = CREATE_CAMERA(CAMTYPE_ANIMATED, TRUE)
|
|
PLAY_SYNCHRONIZED_CAM_ANIM(AnimatedCamera, iMinigameOutroScene1ID, "outro_1_cam", "mini@yoga")
|
|
|
|
DISPLAY_HUD(FALSE)
|
|
DISPLAY_RADAR(FALSE)
|
|
RENDER_SCRIPT_CAMS(TRUE, FALSE)
|
|
|
|
IF eMinigameFail = MINIGAME_FAIL_YOGA_FAILED
|
|
IF TRIGGER_MUSIC_EVENT("MGYG_END")
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Triggered music event MGYG_END.")
|
|
#ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(sDock.ModelName)
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(sCellphone.ModelName)
|
|
|
|
NEW_LOAD_SCENE_START(vLoadSceneCamPosition, vLoadSceneCamDirection, 200.0)
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Calling NEW_LOAD_SCENE_START().")
|
|
#ENDIF
|
|
|
|
iStageProgress++
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE 3
|
|
|
|
IF IS_SYNCHRONIZED_SCENE_RUNNING(iMinigameOutroScene1ID)
|
|
|
|
IF IS_SCREEN_FADED_OUT()
|
|
DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME)
|
|
ENDIF
|
|
|
|
IF DOES_ENTITY_EXIST(sCellphone.ObjectIndex) AND NOT IS_ENTITY_DEAD(sCellphone.ObjectIndex)
|
|
IF NOT IS_ENTITY_ATTACHED_TO_ANY_PED(sCellphone.ObjectIndex)
|
|
IF GET_SYNCHRONIZED_SCENE_PHASE(iMinigameOutroScene1ID) >= 0.305
|
|
FREEZE_ENTITY_POSITION(sCellphone.ObjectIndex, FALSE)
|
|
ATTACH_ENTITY_TO_ENTITY(sCellphone.ObjectIndex, PLAYER_PED_ID(), GET_PED_BONE_INDEX(PLAYER_PED_ID(), BONETAG_PH_R_HAND),
|
|
<< 0.0, 0.0, 0.0 >>, << 0.0, 0.0, 0.0 >>)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF GET_SYNCHRONIZED_SCENE_PHASE(iMinigameOutroScene1ID) >= 1.0
|
|
|
|
IF eMinigameFail = MINIGAME_FAIL_YOGA_FAILED
|
|
|
|
SET_PLAYER_PED_OUTFIT(MINIGAME_OUTFIT_DEFAULT)
|
|
|
|
IF NOT IS_PED_INJURED(PLAYER_PED_ID()) AND HAVE_ALL_STREAMING_REQUESTS_COMPLETED(PLAYER_PED_ID())
|
|
|
|
CLEAR_PED_TASKS_IMMEDIATELY(PLAYER_PED_ID())
|
|
SET_ENTITY_COORDS(PLAYER_PED_ID(), sPlayerEndgame.vGotoPosition)
|
|
SET_ENTITY_HEADING(PLAYER_PED_ID(), sPlayerEndgame.fGotoHeading)
|
|
TASK_PLAY_ANIM(PLAYER_PED_ID(), "move_p_m_zero_idles@generic", "fidget_impatient",
|
|
INSTANT_BLEND_IN, WALK_BLEND_OUT, -1, AF_HOLD_LAST_FRAME, 0.445)
|
|
FORCE_PED_AI_AND_ANIMATION_UPDATE(PLAYER_PED_ID())
|
|
|
|
DESTROY_ALL_CAMS()
|
|
RENDER_SCRIPT_CAMS(FALSE, FALSE)
|
|
|
|
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0)
|
|
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0)
|
|
|
|
CLEANUP_OBJECT(sCellphone.ObjectIndex, TRUE)
|
|
|
|
iStageProgress = END_CUTSCENE_FAILURE
|
|
|
|
ENDIF
|
|
|
|
ELSE
|
|
|
|
IF NOT IS_SYNCHRONIZED_SCENE_RUNNING(iMinigameOutroScene2ID)
|
|
|
|
iMinigameOutroScene2ID = CREATE_SYNCHRONIZED_SCENE(vOutro2ScenePosition, vOutro2SceneRotation)
|
|
|
|
TASK_SYNCHRONIZED_SCENE(PLAYER_PED_ID(), iMinigameOutroScene2ID, "mini@yoga", "outro_2", INSTANT_BLEND_IN, SLOW_BLEND_OUT)
|
|
FORCE_PED_AI_AND_ANIMATION_UPDATE(PLAYER_PED_ID())
|
|
|
|
PLAY_SYNCHRONIZED_CAM_ANIM(AnimatedCamera, iMinigameOutroScene2ID, "outro_2_cam", "mini@yoga")
|
|
|
|
IF TRIGGER_MUSIC_EVENT("MGYG_END")
|
|
#IF IS_DEBUG_BUILD
|
|
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Triggered music event MGYG_END.")
|
|
#ENDIF
|
|
ENDIF
|
|
|
|
iStageProgress = END_CUTSCENE_SUCCESS
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE END_CUTSCENE_SUCCESS
|
|
|
|
IF IS_SYNCHRONIZED_SCENE_RUNNING(iMinigameOutroScene2ID)
|
|
|
|
IF ( bOutfitYoga = TRUE )
|
|
SET_PLAYER_PED_OUTFIT(MINIGAME_OUTFIT_DEFAULT)
|
|
bOutfitYoga = FALSE
|
|
ENDIF
|
|
|
|
CLEANUP_OBJECT(sDock.ObjectIndex, TRUE)
|
|
CLEANUP_OBJECT(sCellphone.ObjectIndex, TRUE)
|
|
|
|
IF GET_SYNCHRONIZED_SCENE_PHASE(iMinigameOutroScene2ID) >= 0.95
|
|
IF GET_SCRIPT_TASK_STATUS(PLAYER_PED_ID(), SCRIPT_TASK_SYNCHRONIZED_SCENE) = PERFORMING_TASK
|
|
CLEAR_PED_TASKS(PLAYER_PED_ID())
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF GET_SYNCHRONIZED_SCENE_PHASE(iMinigameOutroScene2ID) >= 1.0
|
|
|
|
STOP_RENDERING_SCRIPT_CAMS_USING_CATCH_UP()
|
|
DESTROY_ALL_CAMS()
|
|
|
|
NEW_LOAD_SCENE_STOP()
|
|
|
|
REMOVE_ANIM_DICT("mini@yoga")
|
|
|
|
iStageProgress = END_CUTSCENE_FINISH
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE END_CUTSCENE_FAILURE
|
|
|
|
CLEANUP_OBJECT(sDock.ObjectIndex, TRUE)
|
|
|
|
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
|
|
IF IS_ENTITY_PLAYING_ANIM(PLAYER_PED_ID(), "move_p_m_zero_idles@generic", "fidget_impatient")
|
|
IF GET_ENTITY_ANIM_CURRENT_TIME(PLAYER_PED_ID(), "move_p_m_zero_idles@generic", "fidget_impatient") >= 0.99
|
|
|
|
CLEAR_PED_TASKS(PLAYER_PED_ID())
|
|
|
|
iStageProgress = END_CUTSCENE_FINISH
|
|
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE END_CUTSCENE_QUIT
|
|
|
|
IF bHasQuit = TRUE
|
|
|
|
DESTROY_ALL_CAMS()
|
|
RENDER_SCRIPT_CAMS(FALSE, FALSE)
|
|
|
|
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
|
|
CLEAR_PED_TASKS_IMMEDIATELY(PLAYER_PED_ID())
|
|
SET_ENTITY_COORDS(PLAYER_PED_ID(), sPlayerEndgame.vGotoPosition)
|
|
SET_ENTITY_HEADING(PLAYER_PED_ID(), sPlayerEndgame.fGotoHeading)
|
|
ENDIF
|
|
|
|
CLEAR_TIMECYCLE_MODIFIER()
|
|
|
|
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0)
|
|
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0)
|
|
|
|
CLEANUP_OBJECT(sDock.ObjectIndex, TRUE)
|
|
CLEANUP_OBJECT(sCellphone.ObjectIndex, TRUE)
|
|
|
|
IF ( bOutfitYoga = TRUE )
|
|
SET_PLAYER_PED_OUTFIT(MINIGAME_OUTFIT_DEFAULT)
|
|
bOutfitYoga = FALSE
|
|
ENDIF
|
|
|
|
iStageProgress = END_CUTSCENE_FINISH
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE END_CUTSCENE_FINISH
|
|
|
|
IF IS_SCREEN_FADED_OUT()
|
|
IF NOT IS_PED_INJURED(PLAYER_PED_ID()) AND HAVE_ALL_STREAMING_REQUESTS_COMPLETED(PLAYER_PED_ID())
|
|
DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF IS_SCREEN_FADED_IN() AND NOT IS_SCREEN_FADING_IN()
|
|
|
|
DISPLAY_HUD(TRUE)
|
|
DISPLAY_RADAR(TRUE)
|
|
|
|
NEW_LOAD_SCENE_STOP()
|
|
CLEAR_TIMECYCLE_MODIFIER()
|
|
REMOVE_ANIM_DICT("mini@yoga")
|
|
|
|
IF IS_PLAYER_PLAYING(PLAYER_ID())
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
|
|
ENDIF
|
|
|
|
RETURN TRUE
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
IF IS_SYNCHRONIZED_SCENE_RUNNING(iMinigameOutroScene1ID)
|
|
OR IS_SYNCHRONIZED_SCENE_RUNNING(iMinigameOutroScene2ID)
|
|
UPDATE_YOGA_TIMECYCLE_MODIFIER(sYogaPlayer, FALSE, 0.0, 0.0005)
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
|
|
ENDFUNC
|
|
|
|
//|============================= END MINIGAME STAGES FUNCTIONS ===========================|
|
|
|
|
//|==================================== MAIN SCRIPT LOOP =================================|
|
|
|
|
SCRIPT
|
|
|
|
SET_MINIGAME_IN_PROGRESS(TRUE)
|
|
|
|
DISABLE_CELLPHONE(TRUE)
|
|
|
|
DISABLE_SELECTOR()
|
|
|
|
INIT_PC_SCRIPTED_CONTROLS("Yoga")
|
|
bSouthpaw = FALSE
|
|
|
|
//check for death or arrest
|
|
IF HAS_FORCE_CLEANUP_OCCURRED(DEFAULT_FORCE_CLEANUP_FLAGS | FORCE_CLEANUP_FLAG_REPEAT_PLAY)
|
|
|
|
MINIGAME_CLEANUP()
|
|
|
|
TERMINATE_THIS_THREAD()
|
|
|
|
ENDIF
|
|
|
|
SET_MAX_WANTED_LEVEL(0) //disable wanted levels for this mini game.
|
|
|
|
STOP_SMOKE_GRENADE_EXPLOSION_SOUNDS()
|
|
|
|
// Turn off player control immediately to stop the player doing silly things like detonating stickybombs underneath themselves.
|
|
IF NOT IS_PED_INJURED( PLAYER_PED_ID())
|
|
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
|
|
ENDIF
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
CREATE_DEBUG_MINIGAME_STAGE_MENU()
|
|
CREATE_DEBUG_WIDGETS()
|
|
#ENDIF
|
|
|
|
//load the minigame text scaleform UI and other assets
|
|
//scaleformQuitUI = REQUEST_QUIT_UI()
|
|
WHILE NOT ARE_YOGA_REQUESTS_LOADED()
|
|
WAIT(0)
|
|
ENDWHILE
|
|
|
|
//WHILE NOT HAS_SCALEFORM_MOVIE_LOADED(scaleformQuitUI)
|
|
// WAIT(0)
|
|
//ENDWHILE
|
|
|
|
bHasQuit = FALSE
|
|
fKharma = 1.0
|
|
|
|
WHILE (TRUE)
|
|
|
|
//check each frame if minigame is failed due to fail conditions
|
|
//check only if minigame stage loading has finished
|
|
IF ( bLoadingFlag = TRUE )
|
|
RUN_FAIL_CHECKS(eMinigameStage, eMinigameFail)
|
|
ENDIF
|
|
|
|
// This is a kludge to force player control off for the duration of the mission as something keeps turning it back on again.
|
|
//IF NOT IS_PED_INJURED(PLAYER_PED_ID())
|
|
// SET_PLAYER_CONTROL(PLAYER_ID(), FALSE )
|
|
//ENDIF
|
|
|
|
YOGA_MANAGE_QUIT_UI()
|
|
|
|
SET_SCENARIO_TYPE_ENABLED("WORLD_MOUNTAIN_LION_WANDER",FALSE)
|
|
SET_PED_MODEL_IS_SUPPRESSED(A_C_MTLION,TRUE)
|
|
|
|
SWITCH eMinigameStage
|
|
|
|
CASE MINIGAME_STAGE_SETUP
|
|
|
|
IF IS_MINIGAME_STAGE_LOADED(eMinigameStage, iStageSetupProgress, bLoadingFlag, bSkipFlag, bReplayFlag)
|
|
|
|
RESET_MINIGAME_FLAGS()
|
|
|
|
eMinigameStage = MINIGAME_STAGE_CUTSCENE_INTRO
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE MINIGAME_STAGE_CUTSCENE_INTRO
|
|
|
|
IF IS_MINIGAME_STAGE_LOADED(eMinigameStage, iStageSetupProgress, bLoadingFlag, bSkipFlag, bReplayFlag)
|
|
|
|
IF IS_MINIGAME_STAGE_CUTSCENE_INTRO_COMPLETED(iMinigameStageProgress)
|
|
|
|
RESET_MINIGAME_FLAGS()
|
|
|
|
eMinigameStage = MINIGAME_STAGE_YOGA_WARRIOR
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE MINIGAME_STAGE_YOGA_WARRIOR
|
|
|
|
IF IS_MINIGAME_STAGE_LOADED(eMinigameStage, iStageSetupProgress, bLoadingFlag, bSkipFlag, bReplayFlag)
|
|
|
|
IF IS_MINIGAME_STAGE_YOGA_WARRIOR_COMPLETED(iMinigameStageProgress)
|
|
|
|
RESET_MINIGAME_FLAGS()
|
|
|
|
eMinigameStage = MINIGAME_STAGE_YOGA_TRIANGLE
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE MINIGAME_STAGE_YOGA_TRIANGLE
|
|
|
|
IF IS_MINIGAME_STAGE_LOADED(eMinigameStage, iStageSetupProgress, bLoadingFlag, bSkipFlag, bReplayFlag)
|
|
|
|
IF IS_MINIGAME_STAGE_YOGA_TRIANGLE_COMPLETED(iMinigameStageProgress)
|
|
|
|
RESET_MINIGAME_FLAGS()
|
|
|
|
eMinigameStage = MINIGAME_STAGE_YOGA_SUNSALUTATION
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE MINIGAME_STAGE_YOGA_SUNSALUTATION
|
|
|
|
IF IS_MINIGAME_STAGE_LOADED(eMinigameStage, iStageSetupProgress, bLoadingFlag, bSkipFlag, bReplayFlag)
|
|
|
|
IF IS_MINIGAME_STAGE_YOGA_SUNSALUTATION_COMPLETED(iMinigameStageProgress)
|
|
|
|
RESET_MINIGAME_FLAGS()
|
|
|
|
eMinigameStage = MINIGAME_STAGE_PASSED_CUTSCENE_END
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
CASE MINIGAME_STAGE_PASSED_CUTSCENE_END
|
|
CASE MINIGAME_STAGE_FAILED_CUTSCENE_END
|
|
|
|
IF IS_MINIGAME_STAGE_LOADED(eMinigameStage, iStageSetupProgress, bLoadingFlag, bSkipFlag, bReplayFlag)
|
|
|
|
IF IS_MINIGAME_STAGE_CUTSCENE_END_COMPLETED(iMinigameStageProgress)
|
|
|
|
RESET_MINIGAME_FLAGS()
|
|
|
|
SWITCH eMinigameStage
|
|
|
|
CASE MINIGAME_STAGE_PASSED_CUTSCENE_END
|
|
eMinigameStage = MINIGAME_STAGE_PASSED
|
|
BREAK
|
|
|
|
CASE MINIGAME_STAGE_FAILED_CUTSCENE_END
|
|
eMinigameStage = MINIGAME_STAGE_FAILED
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
BREAK
|
|
|
|
|
|
CASE MINIGAME_STAGE_PASSED
|
|
|
|
//IF NOT IS_PED_INJURED(PLAYER_PED_ID())
|
|
// RESTORE_PLAYER_PED_HEALTH(PLAYER_PED_ID()) //restore player's health
|
|
//ENDIF
|
|
|
|
//IF IS_PLAYER_PLAYING(PLAYER_ID())
|
|
// SPECIAL_ABILITY_FILL_METER(PLAYER_ID(), TRUE) //restore player's special ability
|
|
//ENDIF
|
|
|
|
IF IS_PLAYER_PLAYING(PLAYER_ID())
|
|
SPECIAL_ABILITY_CHARGE_NORMALIZED(PLAYER_ID(), fKharma, TRUE) // Special ability bar refilled depending on Kharma
|
|
ENDIF
|
|
|
|
REGISTER_SCRIPT_IN_COMPLETION_PERCENTAGE_TOTAL (CP_YOGA)
|
|
|
|
MAKE_AUTOSAVE_REQUEST()
|
|
|
|
MINIGAME_CLEANUP()
|
|
|
|
TERMINATE_THIS_THREAD()
|
|
|
|
BREAK
|
|
|
|
CASE MINIGAME_STAGE_FAILED
|
|
|
|
MINIGAME_CLEANUP()
|
|
|
|
TERMINATE_THIS_THREAD()
|
|
|
|
BREAK
|
|
|
|
ENDSWITCH
|
|
|
|
//handle debug functionality
|
|
#IF IS_DEBUG_BUILD
|
|
|
|
//handle key_f and key_s presses
|
|
RUN_DEBUG_PASS_AND_FAIL_CHECK(eMinigameStage, eMinigameFail)
|
|
|
|
//handle z-skip menu
|
|
RUN_DEBUG_MINIGAME_STAGE_MENU(iReturnStage, eMinigameStage, bSkipFlag, bStageResetFlag)
|
|
|
|
//handle j-skip and p-skip
|
|
RUN_DEBUG_SKIPS(eMinigameStage, bSkipFlag, bStageResetFlag)
|
|
|
|
//handle rag widgets
|
|
RUN_DEBUG_WIDGETS()
|
|
|
|
#ENDIF
|
|
|
|
WAIT(0)
|
|
|
|
ENDWHILE
|
|
|
|
ENDSCRIPT
|
|
|
|
//|================================= END MAIN SCRIPT LOOP ================================|
|