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

3523 lines
114 KiB
XML
Executable File

//|=======================================================================================|
//| Author: Lukasz Bogaj Date: 04/08/2011 |
//|=======================================================================================|
//| YOGA.sch |
//| YOGA HEADER FILE |
//| |
//|=======================================================================================|
//|==================================== INCLUDE FILES ====================================|
USING "rage_builtins.sch"
USING "globals.sch"
//Commands
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"
//Script things
USING "script_player.sch"
USING "script_buttons.sch"
USING "script_maths.sch"
USING "script_blips.sch"
//Public files
USING "locates_private.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 "commands_hud.sch"
USING "finance_modifiers_public.sch"
USING "stats_public.sch"
//Debug things
USING "script_debug.sch"
//===================================== ENUMS & STRUCTS ==================================|
/// PURPOSE: Specifies possible yoga moves in yoga minigame.
ENUM YOGAMOVE
YOGAMOVE_WARRIOR = 0,
YOGAMOVE_TRIANGLE,
YOGAMOVE_SUNSALUTATION
ENDENUM
/// PURPOSE: Specifies yoga minigame stages.
ENUM YOGAMINIGAMESTAGES
YOGAMINIGAMESTAGE_SETUP = 0,
YOGAMINIGAMESTAGE_DOMOVE,
YOGAMINIGAMESTAGE_DOFAIL,
YOGAMINIGAMESTAGE_WAITFAIL,
YOGAMINIGAMESTAGE_FAILRESET,
YOGAMINIGAMESTAGE_RESTART,
YOGAMINIGAMESTAGE_PASSED,
YOGAMINIGAMESTAGE_FINISHED
ENDENUM
/// PURPOSE: Specifies yoga move stages.
ENUM YOGAMOVESTAGES
YOGAMOVESTAGE_DOINGPOSES = 0,
YOGAMOVESTAGE_PLAY_POSE_ANIMATION,
YOGAMOVESTAGE_BREATHE,
YOGAMOVESTAGE_WAIT_BETWEEN_POSES,
YOGAMOVESTAGE_PLAY_ENDPOSE_ANIMATION,
YOGAMOVESTAGE_FINISHED,
YOGAMOVESTAGE_FAILED
ENDENUM
/// PURPOSE: Specifies yoga breathing stages.
ENUM YOGABREATHESTAGES
YOGABREATHESTAGES_INHALE = 0,
YOGABREATHESTAGES_EXHALE,
YOGABREATHESTAGES_DISPLAY_HELP,
YOGABREATHESTAGES_START_DELAY
ENDENUM
/// PURPOSE: Specifies the two analogue sticks.
ENUM STICKS
STICK_LEFT = 0,
STICK_RIGHT
ENDENUM
/// PURPOSE: specifies the direction of stick graphic icon rotation.
ENUM STICKROTATIONS
STICKROTATION_CLOCKWISE = 0,
STICKROTATION_COUNTERCLOCKWISE
ENDENUM
/// PURPOSE: Specifies analogue stick directions.
ENUM STICKDIRECTIONS
STICKDIRECTION_UP = 0,
STICKDIRECTION_UPRIGHT = 45,
STICKDIRECTION_RIGHT = 90,
STICKDIRECTION_DOWNRIGHT = 135,
STICKDIRECTION_DOWN = 180,
STICKDIRECTION_DOWNLEFT = 225,
STICKDIRECTION_LEFT = 270,
STICKDIRECTION_UPLEFT = 315
ENDENUM
/// PURPOSE: Specifies analogue sticks position check.
ENUM STICKPOSITIONSCHECKS
STICKPOSITIONCHECK_MOVE = 0, //Sticks need to be moved into position.
STICKPOSITIONCHECK_HOLD //Sticks need to be held in position.
ENDENUM
/// PURPOSE: Specifies a structure storing yoga minigame information.
STRUCT YOGASTRUCT
PED_INDEX PedIndex //Ped Index
VECTOR vPosition //Ped position vector
VECTOR vRotation //Ped rotation vector
YOGAMINIGAMESTAGES eYogaMinigameStage //Current yoga minigame stage
YOGAMOVE eYogaMove //Current yoga move
YOGAMOVESTAGES eYogaMoveStage //Current yoga move stage
YOGABREATHESTAGES eYogaBreatheStage
STRING sYogaAnimDict //Animation dictionary name
BOOL bFailing //
INT iBreathingValue
INT iFailCounter //Number of fails of current yoga move
INT iBreathingCounter //Number of times inhale/exhale cycle was repeated
INT iPosesCompleted //Number of comleted poses for current yoga move
INT iFailedPose
INT iShakeTimer //Number of miliseconds to shake the controller
INT iTimer //timer
INT iInhaleTimer
INT iExhaleTimer
BOOL bInhaleInProgress
BOOL bExhaleInProgress
INT iInhaleSoundID
INT iExhaleSoundID
INT iFailSoundID
INT iLeftStickPosition
INT iRightStickPosition
INT iLeftStickCurrentAngle
INT iRightStickCurrentAngle
BOOL bLeftStickInDeadZone
BOOL bRightStickInDeadZone
FLOAT fMinRange
FLOAT fMaxRange
BOOL bInhaleSoundTriggered
BOOL bExhaleSoundTriggered
BOOL bInhaleCompleted
BOOL bExhaleCompleted
INT iBreatheDelayTime
INT iBreatheDelayTimer
INT iBreathsCompleted
BOOL bBreathCompleted
BOOL bBreathingPassed
BOOL bInhaleFailed
BOOL bExhaleFailed
INT iHelpTextTimer
BOOL bHelpTextDelayDone
FLOAT fValue
BOOL bChangeCamera
FLOAT fModifierStrength
FLOAT fModifierStrengthMax
BOOL bChangePoseFacial
BOOL bAmbientSpeechPlayed
FLOAT fBlushDecalAlpha
INT iHoldBreathTimer
INT iFailCameraCutTimer
ENDSTRUCT
//|======================================= CONSTANTS =====================================|
CONST_INT YCF_CHANGE 0
CONST_INT YCF_INTERP 1
CONST_INT YCF_ACTIVE 2
CONST_INT MAX_YOGAMOVES 3
CONST_INT MAX_ANIMATIONS_IN_YOGAMOVE 15
CONST_INT MAX_POSES_IN_YOGAMOVE 7
CONST_INT MOUSE_SENSITIVITY 4 // Divides mouse values by this, so higher the number = less sensitive.
FLOAT YOGA_BUTTONS_X = 0.5
FLOAT YOGA_BUTTONS_Y = 0.88
FLOAT YOGA_BUTTONS_WIDTH = 0.609375
FLOAT YOGA_BUTTONS_HEIGHT = 0.266666 //0.355555 * 0.75
FLOAT YOGA_BUTTONS_SCALE = 1.2
//|========================================= ARRAYS ======================================|
INT iPoses[MAX_YOGAMOVES] //number of poses for each yoga move
INT iAnimations[MAX_YOGAMOVES] //number of animations for each yoga move
BOOL bScaleformYogaButtonsPressed[2] //yoga button flags used for scaleform
STRING sYogaPosesAnims[MAX_YOGAMOVES][MAX_ANIMATIONS_IN_YOGAMOVE] //animation names for each pose in each yoga move
STICKDIRECTIONS eStickDirections[MAX_YOGAMOVES][MAX_POSES_IN_YOGAMOVE][2] //stick directions for each pose in each yoga move
STICKROTATIONS eStickRotations[MAX_YOGAMOVES][MAX_POSES_IN_YOGAMOVE][2] //stick rotations from each direction to the next
VECTOR vYogaFailCameraPositions[2] //yoga fail camera position vectors 0 - Amanda 1 - Fabien
VECTOR vYogaFailCameraRotations[2] //yoga fail camera rotation vecotrs 0 - Amanda 1 - Fabien
FLOAT vYogaFailCameraFOVs[2] //yoga fail camera FOVs 0 - Amanda 1 - Fabien
VECTOR vYogaCameraPositions[MAX_POSES_IN_YOGAMOVE + 1][2] //yoga custom camera position vectors
VECTOR vYogaCameraRotations[MAX_POSES_IN_YOGAMOVE + 1][2] //yoga custom camera rotation vectors
FLOAT fYogaCameraFOVs[MAX_POSES_IN_YOGAMOVE + 1][2] //yoga custom camera FOVs
INT iYogaCameraInterpTimes[MAX_POSES_IN_YOGAMOVE + 1] //yoga custom camera interp times
INT iYogaCameraFailCutTimes[MAX_POSES_IN_YOGAMOVE + 1] //yoga custom camera fail cut times
BOOL bYogaCameraFlags[MAX_POSES_IN_YOGAMOVE + 1][3] //yoga custom camera flags, sets custom cameras active
//======================================== VARIABLES =====================================|
BOOL HELP_STICKS_TRIGGERED
BOOL HELP_INHALE_TRIGGERED
BOOL HELP_EXHALE_TRIGGERED
BOOL bShowBreathingButtons //flags if scaleform buttons should be rendered
BOOL bBreathingButtonsAdded //flags if scaleform buttons have been added
SCALEFORM_INDEX siYogaScaleform //scaleform buttons movie clip
SCALEFORM_INDEX siYogaScaleformKBM //scaleform keyboard/mouse movie clip
CAMERA_INDEX YogaFailCamera //camera used for fail cuts
CAMERA_INDEX YogaCustomCamera //camera used for custom angles during yoga minigame
FLOAT ShakeIntensity
INT iLeftRed, iLeftGreen, iLeftBlue //RGB value for left stick scaleform image
INT iRightRed, iRightGreen, iRightBlue //RGB value for right stick scaleform image
INT iStickXPrev, iStickYPrev // Previous values for right stick, for PC mouse detection.
BOOL bSouthpaw // Southpaw mouse and keyboard mode for PC controls - swaps the two sets of inputs so they correspond to the users mouse and keyboard layout. Not to be confused with gamepad southpaw.
//================================== FUNCTIONS & PROCEDURES ==============================|
FUNC BOOL IS_ANY_YOGA_HELP_MESSAGE_BEING_DISPLAYED()
IF IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("STICKS")
OR IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("INHALE_NEW")
OR IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("EXHALE_NEW")
RETURN TRUE
ENDIF
// Check PC text separately as it's not included on console.
IF IS_PC_VERSION()
IF IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("STICKS_KM")
RETURN TRUE
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL HAS_YOGA_SCALEFORM_LOADED()
IF IS_PC_VERSION()
IF HAS_SCALEFORM_MOVIE_LOADED(siYogaScaleform)
AND HAS_SCALEFORM_MOVIE_LOADED(siYogaScaleformKBM)
RETURN TRUE
ENDIF
ELSE
IF HAS_SCALEFORM_MOVIE_LOADED(siYogaScaleform)
RETURN TRUE
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
/// PURPOSE:
/// Sets the ped variations for yoga minigame. Works for player ped Michael only.
/// PARAMS:
/// PedIndex - Ped index to set variations on.
/// iPlayerPed - Number indicating which player ped it is (0 - Michael, 1 - Franklin, 2 - Trevor). Works for Michael only.
PROC SET_PLAYER_PED_VARIATIONS_FOR_YOGA(PED_INDEX PedIndex, INT iPlayerPed = 0)
IF DOES_ENTITY_EXIST(PedIndex)
IF NOT IS_ENTITY_DEAD(PedIndex)
SWITCH iPlayerPed
CASE 0 //Michael, the only player ped allowed to do yoga
SET_PED_COMP_ITEM_CURRENT_SP(PedIndex, COMP_TYPE_OUTFIT, OUTFIT_P0_YOGA, FALSE)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": SET_PLAYER_PED_VARIATIONS_FOR_YOGA() - Setting player ped variation to yoga outfit.")
#ENDIF
BREAK
CASE 1 //Franklin, not used for now
BREAK
CASE 2 //Trevor, not used for now
BREAK
ENDSWITCH
ENDIF
ENDIF
ENDPROC
PROC CONVERGE_VALUE(FLOAT &fCurrentValue, FLOAT fDesiredValue, FLOAT fAmountToConverge, BOOL bAdjustForFramerate = FALSE)
IF fCurrentValue != fDesiredValue
FLOAT fConvergeAmountThisFrame = fAmountToConverge
IF bAdjustForFramerate
fConvergeAmountThisFrame = 0.0 +@ (fAmountToConverge * 30.0)
ENDIF
IF fCurrentValue - fDesiredValue > fConvergeAmountThisFrame
fCurrentValue -= fConvergeAmountThisFrame
ELIF fCurrentValue - fDesiredValue < -fConvergeAmountThisFrame
fCurrentValue += fConvergeAmountThisFrame
ELSE
fCurrentValue = fDesiredValue
ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// Returns the lowest float value from two specified float values.
/// PARAMS:
/// fValueA - First float value.
/// fValueB - Second float value.
/// RETURNS:
/// Lowest float value of the two.
FUNC FLOAT GET_MINIMUM_FLOAT(FLOAT fValueA, FLOAT fValueB)
IF (fValueA = fValueB)
RETURN fValueA
ELIF (fValueA > fValueB)
RETURN fValueB
ELIF (fValueA < fValueB)
RETURN fValueA
ENDIF
RETURN fValueA
ENDFUNC
/// PURPOSE:
/// Returns a value how much shoulder2 button is pressed in the range of 0 - 100.
/// PARAMS:
/// iTriggerValue - Shoulder2 button value in the range of 0-255.
/// RETURNS:
/// Returns shoulder2 button in the range of 0 - 100.
FUNC INT GET_SCALED_SHOULDER_VALUE(INT iTriggerValue)
RETURN CEIL((100.0 / 255.0) * TO_FLOAT(iTriggerValue))
ENDFUNC
/// PURPOSE:
/// Returns breathing value calculated from both trigger/shoulder buttons.
/// PARAMS:
/// iLeftTriggerValue - Value of the left trigger (L2).
/// iRightTriggerValue - Value of the right trigger (R2).
/// RETURNS:
/// Exhale value in the range of 0-100.
FUNC INT GET_BREATHING_VALUE(INT iLeftTriggerValue, INT iRightTriggerValue)
RETURN CEIL( ( ( TO_FLOAT(GET_SCALED_SHOULDER_VALUE(iLeftTriggerValue) + GET_SCALED_SHOULDER_VALUE(iRightTriggerValue)) ) / 200.0) * 100.0)
ENDFUNC
FUNC BOOL IS_BREATHING_VALUE_IN_BUTTON_TARGET(INT iValue, INT iMinTarget, INT iMaxTarget)
IF ( iValue >= iMinTarget AND iValue <= iMaxTarget )
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL HAS_TIME_PASSED_ON_TIMER(INT iTimeAmount, INT iTimer)
INT iCurrentTime
INT iTimeDifference
iCurrentTime = GET_GAME_TIMER()
iTimeDifference = iCurrentTime - iTimeAmount
IF iTimeDifference > iTimer
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
/// PURPOSE:
/// Sets up yoga moves information specific to each yoga move: number of poses, buttons, animations.
PROC SETUP_YOGAMOVE(YOGAMOVE eMove, INT iLocation)
//Setup number of poses
iPoses[YOGAMOVE_WARRIOR] = 3
iPoses[YOGAMOVE_TRIANGLE] = 4
iPoses[YOGAMOVE_SUNSALUTATION] = 7
//Setup animation names and animation numbers
iAnimations[YOGAMOVE_WARRIOR] = 7
sYogaPosesAnims[YOGAMOVE_WARRIOR][0] = "start_to_a1"
sYogaPosesAnims[YOGAMOVE_WARRIOR][1] = "a1_pose"
sYogaPosesAnims[YOGAMOVE_WARRIOR][2] = "a1_to_a2"
sYogaPosesAnims[YOGAMOVE_WARRIOR][3] = "a2_pose"
sYogaPosesAnims[YOGAMOVE_WARRIOR][4] = "a2_to_a3"
sYogaPosesAnims[YOGAMOVE_WARRIOR][5] = "a3_pose"
sYogaPosesAnims[YOGAMOVE_WARRIOR][6] = "a3_to_start"
iAnimations[YOGAMOVE_TRIANGLE] = 9
sYogaPosesAnims[YOGAMOVE_TRIANGLE][0] = "start_to_a1"
sYogaPosesAnims[YOGAMOVE_TRIANGLE][1] = "a1_pose"
sYogaPosesAnims[YOGAMOVE_TRIANGLE][2] = "a1_to_a2"
sYogaPosesAnims[YOGAMOVE_TRIANGLE][3] = "a2_pose"
sYogaPosesAnims[YOGAMOVE_TRIANGLE][4] = "a2_to_a3"
sYogaPosesAnims[YOGAMOVE_TRIANGLE][5] = "a3_pose"
sYogaPosesAnims[YOGAMOVE_TRIANGLE][6] = "a3_to_b4"
sYogaPosesAnims[YOGAMOVE_TRIANGLE][7] = "b4_pose"
sYogaPosesAnims[YOGAMOVE_TRIANGLE][8] = "b4_to_start"
iAnimations[YOGAMOVE_SUNSALUTATION] = 15
sYogaPosesAnims[YOGAMOVE_SUNSALUTATION][0] = "start_to_c1"
sYogaPosesAnims[YOGAMOVE_SUNSALUTATION][1] = "c1_pose"
sYogaPosesAnims[YOGAMOVE_SUNSALUTATION][2] = "c1_to_c2"
sYogaPosesAnims[YOGAMOVE_SUNSALUTATION][3] = "c2_pose"
sYogaPosesAnims[YOGAMOVE_SUNSALUTATION][4] = "c2_to_c3"
sYogaPosesAnims[YOGAMOVE_SUNSALUTATION][5] = "c3_pose"
sYogaPosesAnims[YOGAMOVE_SUNSALUTATION][6] = "c3_to_c4"
sYogaPosesAnims[YOGAMOVE_SUNSALUTATION][7] = "c4_pose"
sYogaPosesAnims[YOGAMOVE_SUNSALUTATION][8] = "c4_to_c5"
sYogaPosesAnims[YOGAMOVE_SUNSALUTATION][9] = "c5_pose"
sYogaPosesAnims[YOGAMOVE_SUNSALUTATION][10] = "c5_to_c6"
sYogaPosesAnims[YOGAMOVE_SUNSALUTATION][11] = "c6_pose"
sYogaPosesAnims[YOGAMOVE_SUNSALUTATION][12] = "c6_to_c7"
sYogaPosesAnims[YOGAMOVE_SUNSALUTATION][13] = "c7_pose"
sYogaPosesAnims[YOGAMOVE_SUNSALUTATION][14] = "c7_to_start"
//WARRIOR
eStickDirections[YOGAMOVE_WARRIOR][0][STICK_LEFT] = STICKDIRECTION_DOWN
eStickDirections[YOGAMOVE_WARRIOR][0][STICK_RIGHT] = STICKDIRECTION_DOWN
eStickRotations[YOGAMOVE_WARRIOR][0][STICK_LEFT] = STICKROTATION_CLOCKWISE
eStickRotations[YOGAMOVE_WARRIOR][0][STICK_RIGHT] = STICKROTATION_CLOCKWISE
eStickDirections[YOGAMOVE_WARRIOR][1][STICK_LEFT] = STICKDIRECTION_LEFT
eStickDirections[YOGAMOVE_WARRIOR][1][STICK_RIGHT] = STICKDIRECTION_RIGHT
eStickRotations[YOGAMOVE_WARRIOR][1][STICK_LEFT] = STICKROTATION_CLOCKWISE
eStickRotations[YOGAMOVE_WARRIOR][1][STICK_RIGHT] = STICKROTATION_COUNTERCLOCKWISE
eStickDirections[YOGAMOVE_WARRIOR][2][STICK_LEFT] = STICKDIRECTION_UPLEFT
eStickDirections[YOGAMOVE_WARRIOR][2][STICK_RIGHT] = STICKDIRECTION_DOWNRIGHT
eStickRotations[YOGAMOVE_WARRIOR][2][STICK_LEFT] = STICKROTATION_CLOCKWISE
eStickRotations[YOGAMOVE_WARRIOR][2][STICK_RIGHT] = STICKROTATION_CLOCKWISE
//TRIANGLE
eStickDirections[YOGAMOVE_TRIANGLE][0][STICK_LEFT] = STICKDIRECTION_DOWNLEFT
eStickDirections[YOGAMOVE_TRIANGLE][0][STICK_RIGHT] = STICKDIRECTION_DOWNRIGHT
eStickRotations[YOGAMOVE_TRIANGLE][0][STICK_LEFT] = STICKROTATION_CLOCKWISE
eStickRotations[YOGAMOVE_TRIANGLE][0][STICK_RIGHT] = STICKROTATION_CLOCKWISE
eStickDirections[YOGAMOVE_TRIANGLE][1][STICK_LEFT] = STICKDIRECTION_UPLEFT
eStickDirections[YOGAMOVE_TRIANGLE][1][STICK_RIGHT] = STICKDIRECTION_UPRIGHT
eStickRotations[YOGAMOVE_TRIANGLE][1][STICK_LEFT] = STICKROTATION_CLOCKWISE
eStickRotations[YOGAMOVE_TRIANGLE][1][STICK_RIGHT] = STICKROTATION_COUNTERCLOCKWISE
eStickDirections[YOGAMOVE_TRIANGLE][2][STICK_LEFT] = STICKDIRECTION_LEFT
eStickDirections[YOGAMOVE_TRIANGLE][2][STICK_RIGHT] = STICKDIRECTION_DOWNRIGHT
eStickRotations[YOGAMOVE_TRIANGLE][2][STICK_LEFT] = STICKROTATION_COUNTERCLOCKWISE
eStickRotations[YOGAMOVE_TRIANGLE][2][STICK_RIGHT] = STICKROTATION_CLOCKWISE
eStickDirections[YOGAMOVE_TRIANGLE][3][STICK_LEFT] = STICKDIRECTION_DOWNLEFT
eStickDirections[YOGAMOVE_TRIANGLE][3][STICK_RIGHT] = STICKDIRECTION_UP
eStickRotations[YOGAMOVE_TRIANGLE][3][STICK_LEFT] = STICKROTATION_COUNTERCLOCKWISE
eStickRotations[YOGAMOVE_TRIANGLE][3][STICK_RIGHT] = STICKROTATION_COUNTERCLOCKWISE
//SUNSALUTATION
eStickDirections[YOGAMOVE_SUNSALUTATION][0][STICK_LEFT] = STICKDIRECTION_LEFT
eStickDirections[YOGAMOVE_SUNSALUTATION][0][STICK_RIGHT] = STICKDIRECTION_RIGHT
eStickRotations[YOGAMOVE_SUNSALUTATION][0][STICK_LEFT] = STICKROTATION_CLOCKWISE
eStickRotations[YOGAMOVE_SUNSALUTATION][0][STICK_RIGHT] = STICKROTATION_CLOCKWISE
eStickDirections[YOGAMOVE_SUNSALUTATION][1][STICK_LEFT] = STICKDIRECTION_DOWN
eStickDirections[YOGAMOVE_SUNSALUTATION][1][STICK_RIGHT] = STICKDIRECTION_DOWN
eStickRotations[YOGAMOVE_SUNSALUTATION][1][STICK_LEFT] = STICKROTATION_COUNTERCLOCKWISE
eStickRotations[YOGAMOVE_SUNSALUTATION][1][STICK_RIGHT] = STICKROTATION_CLOCKWISE
eStickDirections[YOGAMOVE_SUNSALUTATION][2][STICK_LEFT] = STICKDIRECTION_DOWNLEFT
eStickDirections[YOGAMOVE_SUNSALUTATION][2][STICK_RIGHT] = STICKDIRECTION_DOWNRIGHT
eStickRotations[YOGAMOVE_SUNSALUTATION][2][STICK_LEFT] = STICKROTATION_CLOCKWISE
eStickRotations[YOGAMOVE_SUNSALUTATION][2][STICK_RIGHT] = STICKROTATION_COUNTERCLOCKWISE
eStickDirections[YOGAMOVE_SUNSALUTATION][3][STICK_LEFT] = STICKDIRECTION_DOWN
eStickDirections[YOGAMOVE_SUNSALUTATION][3][STICK_RIGHT] = STICKDIRECTION_DOWN
eStickRotations[YOGAMOVE_SUNSALUTATION][3][STICK_LEFT] = STICKROTATION_COUNTERCLOCKWISE
eStickRotations[YOGAMOVE_SUNSALUTATION][3][STICK_RIGHT] = STICKROTATION_CLOCKWISE
eStickDirections[YOGAMOVE_SUNSALUTATION][4][STICK_LEFT] = STICKDIRECTION_UP
eStickDirections[YOGAMOVE_SUNSALUTATION][4][STICK_RIGHT] = STICKDIRECTION_UP
eStickRotations[YOGAMOVE_SUNSALUTATION][4][STICK_LEFT] = STICKROTATION_CLOCKWISE
eStickRotations[YOGAMOVE_SUNSALUTATION][4][STICK_RIGHT] = STICKROTATION_COUNTERCLOCKWISE
eStickDirections[YOGAMOVE_SUNSALUTATION][5][STICK_LEFT] = STICKDIRECTION_DOWNLEFT
eStickDirections[YOGAMOVE_SUNSALUTATION][5][STICK_RIGHT] = STICKDIRECTION_DOWNRIGHT
eStickRotations[YOGAMOVE_SUNSALUTATION][5][STICK_LEFT] = STICKROTATION_COUNTERCLOCKWISE
eStickRotations[YOGAMOVE_SUNSALUTATION][5][STICK_RIGHT] = STICKROTATION_CLOCKWISE
eStickDirections[YOGAMOVE_SUNSALUTATION][6][STICK_LEFT] = STICKDIRECTION_UPRIGHT
eStickDirections[YOGAMOVE_SUNSALUTATION][6][STICK_RIGHT] = STICKDIRECTION_UPLEFT
eStickRotations[YOGAMOVE_SUNSALUTATION][6][STICK_LEFT] = STICKROTATION_CLOCKWISE
eStickRotations[YOGAMOVE_SUNSALUTATION][6][STICK_RIGHT] = STICKROTATION_COUNTERCLOCKWISE
//Custom cameras
SWITCH eMove
CASE YOGAMOVE_WARRIOR
SWITCH iLocation
CASE 0 //Michael's house location
//1st pose
vYogaCameraPositions[0][0] = <<-788.328918,187.789871,72.757515>>
vYogaCameraRotations[0][0] = <<-2.995436,0.021138,119.407288>>
fYogaCameraFOVs[0][0] = 38.843723
vYogaCameraPositions[0][1] = <<-788.328918,187.789871,72.757515>>
vYogaCameraRotations[0][1] = <<-2.995436,0.021138,119.407288>>
fYogaCameraFOVs[0][1] = 38.843723
iYogaCameraFailCutTimes[0] = 0
bYogaCameraFlags[0][YCF_CHANGE] = FALSE
bYogaCameraFlags[0][YCF_INTERP] = FALSE
bYogaCameraFlags[0][YCF_ACTIVE] = FALSE
//2nd pose
vYogaCameraPositions[1][0] = <<-777.072632,178.258270,73.161331>>
vYogaCameraRotations[1][0] = <<0.894393,0.026403,59.980026>>
fYogaCameraFOVs[1][0] = 38.472504
vYogaCameraPositions[1][1] = <<-777.072632,178.258270,73.161331>>
vYogaCameraRotations[1][1] = <<0.894393,0.026403,59.980026>>
fYogaCameraFOVs[1][1] = 38.472504
iYogaCameraFailCutTimes[1] = 0
bYogaCameraFlags[1][YCF_CHANGE] = FALSE
bYogaCameraFlags[1][YCF_INTERP] = FALSE
bYogaCameraFlags[1][YCF_ACTIVE] = FALSE
//3rd pose
vYogaCameraPositions[2][0] = <<-789.175659,189.242294,72.391922>>
vYogaCameraRotations[2][0] = <<7.114471,0.027280,162.324341>>
fYogaCameraFOVs[2][0] = 39.136875
vYogaCameraPositions[2][1] = <<-789.175659,189.242294,72.391922>>
vYogaCameraRotations[2][1] = <<7.114471,0.027280,162.324341>>
fYogaCameraFOVs[2][1] = 39.136875
iYogaCameraFailCutTimes[2] = 0
bYogaCameraFlags[2][YCF_CHANGE] = TRUE
bYogaCameraFlags[2][YCF_INTERP] = FALSE
bYogaCameraFlags[2][YCF_ACTIVE] = TRUE
//end pose animation
vYogaCameraPositions[3][0] = <<-789.809937,186.571686,73.313194>>
vYogaCameraRotations[3][0] = <<-4.724632,-0.029824,123.259636>>
fYogaCameraFOVs[3][0] = 36.660973
vYogaCameraPositions[3][1] = <<-789.809937,186.571686,73.313194>>
vYogaCameraRotations[3][1] = <<2.853551,-0.029824,107.239113>>
fYogaCameraFOVs[3][1] = 36.660973
iYogaCameraInterpTimes[3] = 2500
iYogaCameraFailCutTimes[3] = 0
bYogaCameraFlags[3][YCF_CHANGE] = TRUE
bYogaCameraFlags[3][YCF_INTERP] = TRUE
bYogaCameraFlags[3][YCF_ACTIVE] = TRUE
BREAK
CASE 1 //North Coast location
//1st pose
vYogaCameraPositions[0][0] = <<2863.545410,5942.737305,357.634216>>
vYogaCameraRotations[0][0] = <<7.496217,-0.044239,35.309185>>
fYogaCameraFOVs[0][0] = 39.355549
vYogaCameraPositions[0][1] = <<2863.545410,5942.737305,357.634216>>
vYogaCameraRotations[0][1] = <<7.496217,-0.044239,35.309185>>
fYogaCameraFOVs[0][1] = 39.355549
iYogaCameraFailCutTimes[0] = 0
bYogaCameraFlags[0][YCF_CHANGE] = FALSE
bYogaCameraFlags[0][YCF_INTERP] = FALSE
bYogaCameraFlags[0][YCF_ACTIVE] = FALSE
//2nd pose
vYogaCameraPositions[1][0] = <<2863.545410,5942.737305,357.634216>>
vYogaCameraRotations[1][0] = <<7.496217,-0.044239,35.309185>>
fYogaCameraFOVs[1][0] = 39.355549
vYogaCameraPositions[1][1] = <<2863.545410,5942.737305,357.634216>>
vYogaCameraRotations[1][1] = <<7.496217,-0.044239,35.309185>>
fYogaCameraFOVs[1][1] = 39.355549
iYogaCameraFailCutTimes[1] = 0
bYogaCameraFlags[1][YCF_CHANGE] = FALSE
bYogaCameraFlags[1][YCF_INTERP] = FALSE
bYogaCameraFlags[1][YCF_ACTIVE] = FALSE
//3rd pose
vYogaCameraPositions[2][0] = <<2863.545410,5942.737305,357.634216>>
vYogaCameraRotations[2][0] = <<7.496217,-0.044239,35.309185>>
fYogaCameraFOVs[2][0] = 39.355549
vYogaCameraPositions[2][1] = <<2863.545410,5942.737305,357.634216>>
vYogaCameraRotations[2][1] = <<7.496217,-0.044239,35.309185>>
fYogaCameraFOVs[2][1] = 39.355549
iYogaCameraFailCutTimes[2] = 0
bYogaCameraFlags[2][YCF_CHANGE] = TRUE
bYogaCameraFlags[2][YCF_INTERP] = FALSE
bYogaCameraFlags[2][YCF_ACTIVE] = TRUE
//end pose animation
vYogaCameraPositions[3][0] = <<2863.846680,5945.487793,357.874786>>
vYogaCameraRotations[3][0] = <<8.808952,0.000863,79.576752>>
fYogaCameraFOVs[3][0] = 39.355549
vYogaCameraPositions[3][1] = <<2863.368408,5945.402344,357.959564>>
vYogaCameraRotations[3][1] = <<14.608078,0.000863,76.607201>>
fYogaCameraFOVs[3][1] = 39.355549
iYogaCameraInterpTimes[3] = 3500
iYogaCameraFailCutTimes[3] = 0
bYogaCameraFlags[3][YCF_CHANGE] = TRUE
bYogaCameraFlags[3][YCF_INTERP] = TRUE
bYogaCameraFlags[3][YCF_ACTIVE] = TRUE
BREAK
ENDSWITCH
BREAK
CASE YOGAMOVE_TRIANGLE
SWITCH iLocation
CASE 0 //Michael's house location
//1st pose
vYogaCameraPositions[0][0] = <<-780.270569,181.499008,72.134193>>
vYogaCameraRotations[0][0] = <<5.718471,-0.071512,58.085785>>
fYogaCameraFOVs[0][0] = 39.355549
vYogaCameraPositions[0][1] = <<-780.270569,181.499008,72.134193>>
vYogaCameraRotations[0][1] = <<5.718471,-0.071512,58.085785>>
fYogaCameraFOVs[0][1] = 39.355549
iYogaCameraFailCutTimes[0] = 0
bYogaCameraFlags[0][YCF_CHANGE] = TRUE
bYogaCameraFlags[0][YCF_INTERP] = FALSE
bYogaCameraFlags[0][YCF_ACTIVE] = FALSE
//2nd pose
vYogaCameraPositions[1][0] = <<-780.270569,181.499008,72.134193>>
vYogaCameraRotations[1][0] = <<5.718471,-0.071512,58.085785>>
fYogaCameraFOVs[1][0] = 39.355549
vYogaCameraPositions[1][1] = <<-780.270569,181.499008,72.134193>>
vYogaCameraRotations[1][1] = <<5.718471,-0.071512,58.085785>>
fYogaCameraFOVs[1][1] = 39.355549
iYogaCameraFailCutTimes[1] = 0
bYogaCameraFlags[1][YCF_CHANGE] = TRUE
bYogaCameraFlags[1][YCF_INTERP] = FALSE
bYogaCameraFlags[1][YCF_ACTIVE] = TRUE
//3rd pose
vYogaCameraPositions[2][0] = <<-788.851196,184.026611,72.534042>>
vYogaCameraRotations[2][0] = <<4.066512,-0.006667,50.292328>>
fYogaCameraFOVs[2][0] = 35.458775
vYogaCameraPositions[2][1] = <<-788.851196,184.026611,72.534042>>
vYogaCameraRotations[2][1] = <<4.066512,-0.006667,50.292328>>
fYogaCameraFOVs[2][1] = 35.458775
iYogaCameraFailCutTimes[2] = 1500
bYogaCameraFlags[2][YCF_CHANGE] = TRUE
bYogaCameraFlags[2][YCF_INTERP] = FALSE
bYogaCameraFlags[2][YCF_ACTIVE] = TRUE
//4th pose
vYogaCameraPositions[3][0] = <<-789.059692,187.839645,72.443619>>
vYogaCameraRotations[3][0] = <<5.096624,0.047362,143.410507>>
fYogaCameraFOVs[3][0] = 38.767960
vYogaCameraPositions[3][1] = <<-789.059692,187.839645,72.443619>>
vYogaCameraRotations[3][1] = <<5.096624,0.047362,143.410507>>
fYogaCameraFOVs[3][1] = 38.767960
iYogaCameraFailCutTimes[3] = 1500
bYogaCameraFlags[3][YCF_CHANGE] = TRUE
bYogaCameraFlags[3][YCF_INTERP] = FALSE
bYogaCameraFlags[3][YCF_ACTIVE] = TRUE
//end pose animation
vYogaCameraPositions[4][0] = <<-789.059692,187.839645,72.443619>>
vYogaCameraRotations[4][0] = <<5.096624,0.047362,143.410507>>
fYogaCameraFOVs[4][0] = 38.767960
vYogaCameraPositions[4][1] = <<-790.052734,187.877930,73.247765>>
vYogaCameraRotations[4][1] = <<-0.732900,-0.070113,153.777069>>
fYogaCameraFOVs[4][1] = 39.355549
iYogaCameraInterpTimes[4] = 5000
iYogaCameraFailCutTimes[4] = 0
bYogaCameraFlags[4][YCF_CHANGE] = TRUE
bYogaCameraFlags[4][YCF_INTERP] = TRUE
bYogaCameraFlags[4][YCF_ACTIVE] = TRUE
BREAK
CASE 1 //North Coast location
//1st pose
vYogaCameraPositions[0][0] = <<2864.709473,5941.522461,357.441345>>
vYogaCameraRotations[0][0] = <<12.518688,0.000864,32.242397>>
fYogaCameraFOVs[0][0] = 39.355549
vYogaCameraPositions[0][1] = <<2864.709473,5941.522461,357.441345>>
vYogaCameraRotations[0][1] = <<12.518688,0.000864,32.242397>>
fYogaCameraFOVs[0][1] = 39.355549
iYogaCameraFailCutTimes[0] = 0
bYogaCameraFlags[0][YCF_CHANGE] = TRUE
bYogaCameraFlags[0][YCF_INTERP] = FALSE
bYogaCameraFlags[0][YCF_ACTIVE] = FALSE
//2nd pose
vYogaCameraPositions[1][0] = <<2864.709473,5941.522461,357.441345>>
vYogaCameraRotations[1][0] = <<12.518688,0.000864,32.242397>>
fYogaCameraFOVs[1][0] = 39.355549
vYogaCameraPositions[1][1] = <<2864.709473,5941.522461,357.441345>>
vYogaCameraRotations[1][1] = <<12.518688,0.000864,32.242397>>
fYogaCameraFOVs[1][1] = 39.355549
iYogaCameraFailCutTimes[1] = 0
bYogaCameraFlags[1][YCF_CHANGE] = TRUE
bYogaCameraFlags[1][YCF_INTERP] = FALSE
bYogaCameraFlags[1][YCF_ACTIVE] = TRUE
//3rd pose
vYogaCameraPositions[2][0] = <<2867.482422,5947.726074,358.183960>>
vYogaCameraRotations[2][0] = <<2.762805,-0.036948,111.423454>>
fYogaCameraFOVs[2][0] = 39.355549
vYogaCameraPositions[2][1] = <<2867.482422,5947.726074,358.183960>>
vYogaCameraRotations[2][1] = <<2.762805,-0.036948,111.423454>>
fYogaCameraFOVs[2][1] = 39.355549
iYogaCameraFailCutTimes[2] = 1500
bYogaCameraFlags[2][YCF_CHANGE] = TRUE
bYogaCameraFlags[2][YCF_INTERP] = FALSE
bYogaCameraFlags[2][YCF_ACTIVE] = TRUE
//4th pose
vYogaCameraPositions[3][0] = <<2863.663330,5943.964844,357.335999>>
vYogaCameraRotations[3][0] = <<12.750703,0.011422,62.854511>>
fYogaCameraFOVs[3][0] = 39.355549
vYogaCameraPositions[3][1] = <<2863.663330,5943.964844,357.335999>>
vYogaCameraRotations[3][1] = <<12.750703,0.011422,62.854511>>
fYogaCameraFOVs[3][1] = 39.355549
iYogaCameraFailCutTimes[3] = 1500
bYogaCameraFlags[3][YCF_CHANGE] = TRUE
bYogaCameraFlags[3][YCF_INTERP] = FALSE
bYogaCameraFlags[3][YCF_ACTIVE] = TRUE
//end pose animation
vYogaCameraPositions[4][0] = <<2863.663330,5943.964844,357.335999>>
vYogaCameraRotations[4][0] = <<12.750703,0.011422,62.854511>>
fYogaCameraFOVs[4][0] = 39.355549
vYogaCameraPositions[4][1] = <<2863.340820,5944.931152,357.734192>>
vYogaCameraRotations[4][1] = <<19.264002,-0.043584,59.654526>>
fYogaCameraFOVs[4][1] = 39.355549
iYogaCameraInterpTimes[4] = 5000
iYogaCameraFailCutTimes[4] = 0
bYogaCameraFlags[4][YCF_CHANGE] = TRUE
bYogaCameraFlags[4][YCF_INTERP] = TRUE
bYogaCameraFlags[4][YCF_ACTIVE] = TRUE
BREAK
ENDSWITCH
BREAK
CASE YOGAMOVE_SUNSALUTATION
SWITCH iLocation
CASE 0 //Michael's house location
//1st pose
vYogaCameraPositions[0][0] = <<-790.052734,187.877930,73.247765>>
vYogaCameraRotations[0][0] = <<-0.732900,-0.070113,153.777069>>
fYogaCameraFOVs[0][0] = 39.355549
vYogaCameraPositions[0][1] = <<-790.052734,187.877930,73.247765>>
vYogaCameraRotations[0][1] = <<-0.732900,-0.070113,153.777069>>
fYogaCameraFOVs[0][1] = 39.355549
iYogaCameraFailCutTimes[0] = 0
bYogaCameraFlags[0][YCF_CHANGE] = FALSE
bYogaCameraFlags[0][YCF_INTERP] = FALSE
bYogaCameraFlags[0][YCF_ACTIVE] = TRUE
//2nd pose
vYogaCameraPositions[1][0] = <<-789.207397,185.483109,71.911331>>
vYogaCameraRotations[1][0] = <<25.596989,-0.035805,57.893848>>
fYogaCameraFOVs[1][0] = 38.164177
vYogaCameraPositions[1][1] = <<-789.207397,185.483109,71.911331>>
vYogaCameraRotations[1][1] = <<25.596989,-0.035805,57.893848>>
fYogaCameraFOVs[1][1] = 38.164177
iYogaCameraFailCutTimes[1] = 0
bYogaCameraFlags[1][YCF_CHANGE] = TRUE
bYogaCameraFlags[1][YCF_INTERP] = FALSE
bYogaCameraFlags[1][YCF_ACTIVE] = TRUE
//3rd pose
vYogaCameraPositions[2][0] = <<-788.837524,183.624146,71.953735>>
vYogaCameraRotations[2][0] = <<10.657258,-0.032140,28.324736>>
fYogaCameraFOVs[2][0] = 39.141090
vYogaCameraPositions[2][1] = <<-788.837524,183.624146,71.953735>>
vYogaCameraRotations[2][1] = <<10.657258,-0.032140,28.324736>>
fYogaCameraFOVs[2][1] = 39.141090
iYogaCameraFailCutTimes[2] = 1500
bYogaCameraFlags[2][YCF_CHANGE] = TRUE
bYogaCameraFlags[2][YCF_INTERP] = FALSE
bYogaCameraFlags[2][YCF_ACTIVE] = TRUE
//4th pose
vYogaCameraPositions[3][0] = <<-788.998291,186.104187,72.044945>>
vYogaCameraRotations[3][0] = <<5.022902,-0.035508,79.215454>>
fYogaCameraFOVs[3][0] = 29.573942
vYogaCameraPositions[3][1] = <<-788.998291,186.104187,72.044945>>
vYogaCameraRotations[3][1] = <<5.022902,-0.035508,79.215454>>
fYogaCameraFOVs[3][1] = 29.573942
iYogaCameraFailCutTimes[3] = 1500
bYogaCameraFlags[3][YCF_CHANGE] = TRUE
bYogaCameraFlags[3][YCF_INTERP] = FALSE
bYogaCameraFlags[3][YCF_ACTIVE] = TRUE
//5th pose
vYogaCameraPositions[4][0] = <<-790.513062,188.468430,71.985001>>
vYogaCameraRotations[4][0] = <<10.313763,-0.036726,167.249725>>
fYogaCameraFOVs[4][0] = 31.385864
vYogaCameraPositions[4][1] = <<-790.513062,188.468430,71.985001>>
vYogaCameraRotations[4][1] = <<10.313763,-0.036726,167.249725>>
fYogaCameraFOVs[4][1] = 31.385864
iYogaCameraFailCutTimes[4] = 1500
bYogaCameraFlags[4][YCF_CHANGE] = TRUE
bYogaCameraFlags[4][YCF_INTERP] = FALSE
bYogaCameraFlags[4][YCF_ACTIVE] = TRUE
//6th pose
vYogaCameraPositions[5][0] = <<-786.631897,188.014984,72.133530>>
vYogaCameraRotations[5][0] = <<4.104248,-0.020120,115.940872>>
fYogaCameraFOVs[5][0] = 38.674591
vYogaCameraPositions[5][1] = <<-787.841553,187.671570,72.221588>>
vYogaCameraRotations[5][1] = <<4.104248,-0.020120,118.847649>>
fYogaCameraFOVs[5][1] = 38.674591
iYogaCameraInterpTimes[5] = 25000
iYogaCameraFailCutTimes[5] = 1500
bYogaCameraFlags[5][YCF_CHANGE] = TRUE
bYogaCameraFlags[5][YCF_INTERP] = TRUE
bYogaCameraFlags[5][YCF_ACTIVE] = TRUE
//7th pose
vYogaCameraPositions[6][0] = <<-787.474426,188.107056,72.186310>>
vYogaCameraRotations[6][0] = <<4.013949,0.013702,116.109329>>
fYogaCameraFOVs[6][0] = 38.674591
vYogaCameraPositions[6][1] = <<-787.474426,188.107056,72.186310>>
vYogaCameraRotations[6][1] = <<4.013949,0.013702,116.109329>>
fYogaCameraFOVs[6][1] = 38.674591
iYogaCameraFailCutTimes[6] = 1500
bYogaCameraFlags[6][YCF_CHANGE] = FALSE
bYogaCameraFlags[6][YCF_INTERP] = FALSE
bYogaCameraFlags[6][YCF_ACTIVE] = TRUE
//end pose animation
vYogaCameraPositions[7][0] = <<-788.856384,186.746552,72.633980>>
vYogaCameraRotations[7][0] = <<2.036967,0.013663,104.246063>>
fYogaCameraFOVs[7][0] = 38.674591
vYogaCameraPositions[7][1] = <<-788.856384,186.746552,72.633980>>
vYogaCameraRotations[7][1] = <<13.553912,0.013663,104.246063>>
fYogaCameraFOVs[7][1] = 38.674591
iYogaCameraInterpTimes[7] = 3000
iYogaCameraFailCutTimes[7] = 1500
bYogaCameraFlags[7][YCF_CHANGE] = TRUE
bYogaCameraFlags[7][YCF_INTERP] = TRUE
bYogaCameraFlags[7][YCF_ACTIVE] = TRUE
BREAK
CASE 1 //North Coast location
//1st pose
vYogaCameraPositions[0][0] = <<2863.340820,5944.931152,357.734192>>
vYogaCameraRotations[0][0] = <<19.264002,-0.043584,59.654526>>
fYogaCameraFOVs[0][0] = 39.355549
vYogaCameraPositions[0][1] = <<2863.340820,5944.931152,357.734192>>
vYogaCameraRotations[0][1] = <<19.264002,-0.043584,59.654526>>
fYogaCameraFOVs[0][1] = 39.355549
iYogaCameraFailCutTimes[0] = 0
bYogaCameraFlags[0][YCF_CHANGE] = FALSE
bYogaCameraFlags[0][YCF_INTERP] = FALSE
bYogaCameraFlags[0][YCF_ACTIVE] = TRUE
//2nd pose
vYogaCameraPositions[1][0] = <<2864.400635,5936.751953,358.648773>>
vYogaCameraRotations[1][0] = <<-0.869005,-0.043912,16.599710>>
fYogaCameraFOVs[1][0] = 39.355549
vYogaCameraPositions[1][1] = <<2864.400635,5936.751953,358.648773>>
vYogaCameraRotations[1][1] = <<-0.869005,-0.043912,16.599710>>
fYogaCameraFOVs[1][1] = 39.355549
iYogaCameraFailCutTimes[1] = 0
bYogaCameraFlags[1][YCF_CHANGE] = TRUE
bYogaCameraFlags[1][YCF_INTERP] = FALSE
bYogaCameraFlags[1][YCF_ACTIVE] = TRUE
//3rd pose
vYogaCameraPositions[2][0] = <<2862.145996,5943.193359,357.363007>>
vYogaCameraRotations[2][0] = <<9.662308,-0.009141,12.365748>>
fYogaCameraFOVs[2][0] = 39.35554
vYogaCameraPositions[2][1] = <<2862.145996,5943.193359,357.363007>>
vYogaCameraRotations[2][1] = <<9.662308,-0.009141,12.365748>>
fYogaCameraFOVs[2][1] = 39.35554
iYogaCameraFailCutTimes[2] = 1500
bYogaCameraFlags[2][YCF_CHANGE] = TRUE
bYogaCameraFlags[2][YCF_INTERP] = FALSE
bYogaCameraFlags[2][YCF_ACTIVE] = TRUE
//4th pose
vYogaCameraPositions[3][0] = <<2863.212891,5945.368164,357.280640>>
vYogaCameraRotations[3][0] = <<7.742859,-0.009142,73.890060>>
fYogaCameraFOVs[3][0] = 39.355549
vYogaCameraPositions[3][1] = <<2863.212891,5945.368164,357.280640>>
vYogaCameraRotations[3][1] = <<7.742859,-0.009142,73.890060>>
fYogaCameraFOVs[3][1] = 39.355549
iYogaCameraFailCutTimes[3] = 1500
bYogaCameraFlags[3][YCF_CHANGE] = TRUE
bYogaCameraFlags[3][YCF_INTERP] = FALSE
bYogaCameraFlags[3][YCF_ACTIVE] = TRUE
//5th pose
vYogaCameraPositions[4][0] = <<2859.712402,5949.607422,357.362701>>
vYogaCameraRotations[4][0] = <<10.394834,-0.009141,-152.232468>>
fYogaCameraFOVs[4][0] = 39.355549
vYogaCameraPositions[4][1] = <<2859.712402,5949.607422,357.362701>>
vYogaCameraRotations[4][1] = <<10.394834,-0.009141,-152.232468>>
fYogaCameraFOVs[4][1] = 39.355549
iYogaCameraFailCutTimes[4] = 1500
bYogaCameraFlags[4][YCF_CHANGE] = TRUE
bYogaCameraFlags[4][YCF_INTERP] = FALSE
bYogaCameraFlags[4][YCF_ACTIVE] = TRUE
//6th pose
vYogaCameraPositions[5][0] = <<2870.431641,5948.134277,357.557861>>
vYogaCameraRotations[5][0] = <<8.651419,-0.001470,105.720398>>
fYogaCameraFOVs[5][0] = 39.355549
vYogaCameraPositions[5][1] = <<2868.032227,5947.471680,357.798309>>
vYogaCameraRotations[5][1] = <<6.054419,0.025583,108.795082>>
fYogaCameraFOVs[5][1] = 39.355549
iYogaCameraInterpTimes[5] = 25000
iYogaCameraFailCutTimes[5] = 1500
bYogaCameraFlags[5][YCF_CHANGE] = TRUE
bYogaCameraFlags[5][YCF_INTERP] = TRUE
bYogaCameraFlags[5][YCF_ACTIVE] = TRUE
//7th pose
vYogaCameraPositions[6][0] = <<2870.431641,5948.134277,357.557861>>
vYogaCameraRotations[6][0] = <<8.651419,-0.001470,105.720398>>
fYogaCameraFOVs[6][0] = 39.355549
vYogaCameraPositions[6][1] = <<2870.431641,5948.134277,357.557861>>
vYogaCameraRotations[6][1] = <<8.651419,-0.001470,105.720398>>
fYogaCameraFOVs[6][1] = 39.355549
iYogaCameraFailCutTimes[6] = 1500
bYogaCameraFlags[6][YCF_CHANGE] = FALSE
bYogaCameraFlags[6][YCF_INTERP] = FALSE
bYogaCameraFlags[6][YCF_ACTIVE] = TRUE
//end pose animation
vYogaCameraPositions[7][0] = <<2863.628662,5945.854004,357.845642>>
vYogaCameraRotations[7][0] = <<8.768853,-0.026652,91.796844>>
fYogaCameraFOVs[7][0] = 39.355549
vYogaCameraPositions[7][1] = <<2863.184814,5946.305176,358.177734>>
vYogaCameraRotations[7][1] = <<8.008410,-0.026652,105.282730>>
fYogaCameraFOVs[7][1] = 39.355549
iYogaCameraInterpTimes[7] = 3000
iYogaCameraFailCutTimes[7] = 0
bYogaCameraFlags[7][YCF_CHANGE] = TRUE
bYogaCameraFlags[7][YCF_INTERP] = TRUE
bYogaCameraFlags[7][YCF_ACTIVE] = TRUE
BREAK
ENDSWITCH
BREAK
ENDSWITCH
//Fail cameras
SWITCH eMove
CASE YOGAMOVE_WARRIOR
vYogaFailCameraPositions[0] = <<-790.588867,186.564514,72.969917>>
vYogaFailCameraRotations[0] = <<-1.638374,0.042595,-117.007965>>
vYogaFailCameraFOVs[0] = 31.157114
vYogaFailCameraPositions[1] = <<-791.594360,188.758713,72.865608>>
vYogaFailCameraRotations[1] = <<0.094575,0.050610,-126.943497>>
vYogaFailCameraFOVs[1] = 28.413298
BREAK
CASE YOGAMOVE_TRIANGLE
vYogaFailCameraPositions[0] = <<-789.156738,189.344330,72.052315>>
vYogaFailCameraRotations[0] = <<12.437154,-0.037231,-164.074646>>
vYogaFailCameraFOVs[0] = 19.247688
vYogaFailCameraPositions[1] = <<-789.346802,185.261658,72.098404>>
vYogaFailCameraRotations[1] = <<11.946778,-0.005908,19.566986>>
vYogaFailCameraFOVs[1] = 23.454800
BREAK
CASE YOGAMOVE_SUNSALUTATION
vYogaFailCameraPositions[0] = <<-790.521667,187.287933,73.186523>>
vYogaFailCameraRotations[0] = <<-0.678966,-0.045711,-139.551682>>
vYogaFailCameraFOVs[0] = 28.094011
vYogaFailCameraPositions[1] = <<-790.424866,186.153076,73.241264>>
vYogaFailCameraRotations[1] = <<-0.614909,0.001498,-30.896523>>
vYogaFailCameraFOVs[1] = 32.065929
BREAK
ENDSWITCH
ENDPROC
PROC ANIMATE_STICK_DIRECTION_CHANGE(STICKDIRECTIONS eStartDirection, STICKDIRECTIONS eEndDirection, STICKROTATIONS eRotation,
INT &iCurrentDirectionValue, INT iMovementSpeed = 1)
INT iStart = ENUM_TO_INT(eStartDirection)
INT iEnd = ENUM_TO_INT(eEndDirection)
IF ( iStart < iEnd )
IF ( eRotation = STICKROTATION_CLOCKWISE )
iCurrentDirectionValue = CLAMP_INT(iCurrentDirectionValue + iMovementSpeed, iStart, iEnd)
ELIF ( eRotation = STICKROTATION_COUNTERCLOCKWISE )
IF ( iCurrentDirectionValue = iStart )
iCurrentDirectionValue = 360 + iCurrentDirectionValue
ENDIF
iCurrentDirectionValue = CLAMP_INT(iCurrentDirectionValue - iMovementSpeed, iEnd, 360 + iStart)
ENDIF
ELIF ( iStart >= iEnd )
IF ( eRotation = STICKROTATION_CLOCKWISE)
iCurrentDirectionValue = CLAMP_INT(iCurrentDirectionValue + iMovementSpeed, iStart, 360 + iEnd)
IF ( iCurrentDirectionValue = 360 + iEnd )
iCurrentDirectionValue = iEnd
ENDIF
ELIF ( eRotation = STICKROTATION_COUNTERCLOCKWISE )
iCurrentDirectionValue = CLAMP_INT(iCurrentDirectionValue - iMovementSpeed, iEnd, iStart)
ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// Sets all scaleform yoga button flags to FALSE.
PROC CLEAR_SCALEFORM_YOGA_BUTTONS(BOOL &Array[])
INT i = 0
FOR i = 0 TO ( COUNT_OF(Array) - 1 )
Array[i] = FALSE
ENDFOR
ENDPROC
PROC CLEANUP_AND_REMOVE_YOGA_SCALEFORM(SCALEFORM_INDEX &ScaleformIndex)
bShowBreathingButtons = FALSE
bBreathingButtonsAdded = FALSE
iLeftRed = 255
iLeftGreen = 255
iLeftBlue = 255
iRightRed = 255
iRightGreen = 255
iRightBlue = 255
CLEAR_SCALEFORM_YOGA_BUTTONS(bScaleformYogaButtonsPressed)
CALL_SCALEFORM_MOVIE_METHOD(ScaleformIndex, "REMOVE_BUTTONS")
SET_SCALEFORM_MOVIE_AS_NO_LONGER_NEEDED(ScaleformIndex)
ENDPROC
/// PURPOSE:
/// Resets yoga structure variables to default values.
/// PARAMS:
/// Yoga - Yoga struct instance to reset.
PROC RESET_YOGA_STRUCT(YOGASTRUCT& Yoga, BOOL bResetTimecycleModifierValues = FALSE, BOOL bResetBlushDecalAlphaValues = FALSE)
Yoga.PedIndex = NULL
Yoga.vPosition = << 0.0, 0.0, 0.0 >>
Yoga.vRotation = << 0.0, 0.0, 0.0 >>
Yoga.eYogaMinigameStage = YOGAMINIGAMESTAGE_SETUP
Yoga.eYogaMoveStage = YOGAMOVESTAGE_DOINGPOSES
Yoga.iTimer = 0
Yoga.iShakeTimer = 0
Yoga.iFailCounter = 0
Yoga.iPosesCompleted = 0
Yoga.iBreathsCompleted = 0
Yoga.iBreathingCounter = 0
Yoga.bHelpTextDelayDone = FALSE
Yoga.bAmbientSpeechPlayed = FALSE
IF ( bResetTimecycleModifierValues = TRUE )
Yoga.fModifierStrength = 0.0
Yoga.fModifierStrengthMax = 0.0
ENDIF
IF ( bResetBlushDecalAlphaValues = TRUE )
Yoga.fBlushDecalAlpha = 0.0
ENDIF
ENDPROC
/// PURPOSE:
/// Checks if a given ped is at the last stage of their task sequence.
/// Checks if ped's task sequence progress equals number of stages passed - 1.
/// Can be used to determine if ped has finished playing one animation and is ready to play the next one
/// without visible animation popping from one anim to another.
/// PARAMS:
/// aPed - Ped to chek for task sequence progress.
/// iNumberOfTasksInSequence - Number of tasks in the sequence
/// RETURNS:
/// TRUE if ped is at their last task in the sequence. FALSE if otherwise.
FUNC BOOL IS_PED_AT_LAST_STAGE_OF_SEQUENCE(PED_INDEX aPed, INT iNumberOfTasksInSequence)
IF NOT IS_PED_INJURED(aPed)
IF GET_SCRIPT_TASK_STATUS(aPed, SCRIPT_TASK_PERFORM_SEQUENCE) = PERFORMING_TASK
IF iNumberOfTasksInSequence < 2
RETURN TRUE
ENDIF
IF GET_SEQUENCE_PROGRESS(aPed) = iNumberOfTasksInSequence - 1
RETURN TRUE
ENDIF
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
PROC UPDATE_YOGA_FACIAL_ANIMATIONS(YOGASTRUCT &Yoga)
IF NOT IS_PED_INJURED(Yoga.PedIndex)
IF ( Yoga.bChangePoseFacial = TRUE )
IF IS_ENTITY_PLAYING_ANIM(Yoga.PedIndex, Yoga.sYogaAnimDict, "A1_POSE")
OR IS_ENTITY_PLAYING_ANIM(Yoga.PedIndex, Yoga.sYogaAnimDict, "C1_POSE")
SET_FACIAL_IDLE_ANIM_OVERRIDE(Yoga.PedIndex, "A1ANDC1_FACE", Yoga.sYogaAnimDict)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Playing facial animation A1ANDC1_FACE.")
#ENDIF
Yoga.bChangePoseFacial = FALSE
ENDIF
IF IS_ENTITY_PLAYING_ANIM(Yoga.PedIndex, Yoga.sYogaAnimDict, "A2_POSE")
OR IS_ENTITY_PLAYING_ANIM(Yoga.PedIndex, Yoga.sYogaAnimDict, "C2_POSE")
SET_FACIAL_IDLE_ANIM_OVERRIDE(Yoga.PedIndex, "A2ANDC2_FACE", Yoga.sYogaAnimDict)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Playing facial animation A2ANDC2_FACE.")
#ENDIF
Yoga.bChangePoseFacial = FALSE
ENDIF
IF IS_ENTITY_PLAYING_ANIM(Yoga.PedIndex, Yoga.sYogaAnimDict, "A3_POSE")
OR IS_ENTITY_PLAYING_ANIM(Yoga.PedIndex, Yoga.sYogaAnimDict, "C3_POSE")
SET_FACIAL_IDLE_ANIM_OVERRIDE(Yoga.PedIndex, "A3ANDC3_FACE", Yoga.sYogaAnimDict)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Playing facial animation A3ANDC3_FACE.")
#ENDIF
Yoga.bChangePoseFacial = FALSE
ENDIF
IF IS_ENTITY_PLAYING_ANIM(Yoga.PedIndex, Yoga.sYogaAnimDict, "B4_POSE")
OR IS_ENTITY_PLAYING_ANIM(Yoga.PedIndex, Yoga.sYogaAnimDict, "C4_POSE")
SET_FACIAL_IDLE_ANIM_OVERRIDE(Yoga.PedIndex, "B4ANDC4_FACE", Yoga.sYogaAnimDict)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Playing facial animation B4ANDC4_FACE.")
#ENDIF
Yoga.bChangePoseFacial = FALSE
ENDIF
IF IS_ENTITY_PLAYING_ANIM(Yoga.PedIndex, Yoga.sYogaAnimDict, "C5_POSE")
SET_FACIAL_IDLE_ANIM_OVERRIDE(Yoga.PedIndex, "C5_FACE", Yoga.sYogaAnimDict)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Playing facial animation C5_FACE.")
#ENDIF
Yoga.bChangePoseFacial = FALSE
ENDIF
IF IS_ENTITY_PLAYING_ANIM(Yoga.PedIndex, Yoga.sYogaAnimDict, "C6_POSE")
SET_FACIAL_IDLE_ANIM_OVERRIDE(Yoga.PedIndex, "C6_FACE", Yoga.sYogaAnimDict)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Playing facial animation C6_FACE.")
#ENDIF
Yoga.bChangePoseFacial = FALSE
ENDIF
IF IS_ENTITY_PLAYING_ANIM(Yoga.PedIndex, Yoga.sYogaAnimDict, "C7_POSE")
SET_FACIAL_IDLE_ANIM_OVERRIDE(Yoga.PedIndex, "C7_FACE", Yoga.sYogaAnimDict)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Playing facial animation C7_FACE.")
#ENDIF
Yoga.bChangePoseFacial = FALSE
ENDIF
IF IS_ENTITY_PLAYING_ANIM(Yoga.PedIndex, Yoga.sYogaAnimDict, "C8_POSE")
SET_FACIAL_IDLE_ANIM_OVERRIDE(Yoga.PedIndex, "C8_FACE", Yoga.sYogaAnimDict)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Playing facial animation C8_FACE.")
#ENDIF
Yoga.bChangePoseFacial = FALSE
ENDIF
ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// Plays a sequence of animations on given yoga struct.
/// PARAMS:
/// Yoga - Given yoga struct to play animation on.
/// sAnim1 - First animation in the sequence.
/// sAnim2 - Second animation in the sequence.
PROC PLAY_YOGAPOSE_ANIMATION(YOGASTRUCT &Yoga, STRING sAnim1, STRING sAnim2)
IF NOT IS_PED_INJURED(Yoga.PedIndex)
SEQUENCE_INDEX SequenceIndex
CLEAR_SEQUENCE_TASK(SequenceIndex)
OPEN_SEQUENCE_TASK(SequenceIndex)
TASK_PLAY_ANIM_ADVANCED(NULL, Yoga.sYogaAnimDict, sAnim1, Yoga.vPosition, Yoga.vRotation , SLOW_BLEND_IN, SLOW_BLEND_OUT, -1,
AF_EXTRACT_INITIAL_OFFSET | AF_USE_MOVER_EXTRACTION, 0, EULER_YXZ, AIK_DISABLE_LEG_IK)
TASK_PLAY_ANIM_ADVANCED(NULL, Yoga.sYogaAnimDict, sAnim2 , Yoga.vPosition, Yoga.vRotation , SLOW_BLEND_IN, SLOW_BLEND_OUT, -1,
AF_EXTRACT_INITIAL_OFFSET | AF_USE_MOVER_EXTRACTION | AF_LOOPING, 0, EULER_YXZ, AIK_DISABLE_LEG_IK)
CLOSE_SEQUENCE_TASK(SequenceIndex)
TASK_PERFORM_SEQUENCE(Yoga.PedIndex, SequenceIndex)
CLEAR_SEQUENCE_TASK(SequenceIndex)
ENDIF
ENDPROC
/// PURPOSE:
/// Sets speed of currently played animation to a specified value.
/// PARAMS:
/// Yoga - YOGASTRUCT to play animation on.
/// eMove - Currently performed yoga move.
/// fSpeed - Desired speed of the animation.
PROC SET_YOGAPOSE_ANIMATION_SPEED(YOGASTRUCT &Yoga, YOGAMOVE eMove, FLOAT fSpeed)
INT i = 0
FOR i = 0 TO iAnimations[eMove] - 1
IF IS_ENTITY_PLAYING_ANIM(Yoga.PedIndex, Yoga.sYogaAnimDict, sYogaPosesAnims[eMove][i])
SET_ENTITY_ANIM_SPEED(Yoga.PedIndex, Yoga.sYogaAnimDict, sYogaPosesAnims[eMove][i], fSpeed)
ENDIF
ENDFOR
ENDPROC
FUNC INT GET_STICK_ROTATION_ANGLE(STICKS eStick)
INT iLeftStickAngle, iRightStickAngle
INT iLeftX, iLeftY, iRightX, iRightY
INT iTempX, iTempY
GET_CONTROL_VALUE_OF_ANALOGUE_STICKS_UNBOUND(iLeftX, iLeftY, iRightX, iRightY)
// On PC We're using a mouse to replace one of the sticks, and as a mouse doesn't have a 'not pressed' state - it's moving or not moving -
// we need to make the input values 'sticky' so the arrow stays in position when you stop moving the mouse.
//DISPLAY_TEXT_WITH_NUMBER( 0.5, 0.1, "NUMBER", iRightX )
//DISPLAY_TEXT_WITH_NUMBER( 0.5, 0.2, "NUMBER", iRightY )
IF IS_USING_KEYBOARD_AND_MOUSE(FRONTEND_CONTROL)
// DISPLAY_TEXT_WITH_NUMBER( 0.6, 0.1, "NUMBER", iLeftX )
// DISPLAY_TEXT_WITH_NUMBER( 0.6, 0.2, "NUMBER", iLeftY )
//
// DISPLAY_TEXT_WITH_NUMBER( 0.6, 0.1, "NUMBER", iRightX )
// DISPLAY_TEXT_WITH_NUMBER( 0.6, 0.2, "NUMBER", iRightY )
//
// Switch sticks if yoga mouse and keyboard southpaw mode active.
IF bSouthpaw
iTempX = iRightX
iTempY = iRightY
iRightX = iLeftX
iRightY = iLeftY
iLeftX = iTempX
iLeftY = iTempY
iLeftX = iLeftX / MOUSE_SENSITIVITY
iLeftY = iLeftY / MOUSE_SENSITIVITY
// Make input 'sticky' so it doesn't auto-centre.
IF ( iLeftX = 0 OR iLeftY = 0 )
iLeftX = iStickXPrev
iLeftY = iStickYPrev
ENDIF
iStickXPrev = iLeftX
iStickYPrev = iLeftY
ELSE
iRightX = iRightX / MOUSE_SENSITIVITY
iRightY = iRightY / MOUSE_SENSITIVITY
// Make input 'sticky' so it doesn't auto-centre.
IF ( iRightX = 0 OR iRightY = 0 )
iRightX = iStickXPrev
iRightY = iStickYPrev
ENDIF
iStickXPrev = iRightX
iStickYPrev = iRightY
ENDIF
ENDIF
iLeftStickAngle = ROUND(GET_ANGLE_BETWEEN_2D_VECTORS(0, -127, TO_FLOAT(iLeftX), TO_FLOAT(iLeftY)))
iRightStickAngle = ROUND(GET_ANGLE_BETWEEN_2D_VECTORS(0, -127, TO_FLOAT(iRightX), TO_FLOAT(iRightY)))
IF ( iLeftX < 0 )
iLeftStickAngle = 180 + (180 - iLeftStickAngle)
ENDIF
IF ( iRightX < 0 )
iRightStickAngle = 180 + (180 - iRightStickAngle)
ENDIF
SWITCH eStick
CASE STICK_LEFT
#IF IS_DEBUG_BUILD
DRAW_DEBUG_TEXT_2D(GET_STRING_FROM_INT(iLeftStickAngle), << 0.1, 0.1, 0.0 >>)
#ENDIF
RETURN iLeftStickAngle
BREAK
CASE STICK_RIGHT
#IF IS_DEBUG_BUILD
DRAW_DEBUG_TEXT_2D(GET_STRING_FROM_INT(iRightStickAngle), << 0.3, 0.1, 0.0 >>)
#ENDIF
RETURN iRightStickAngle
BREAK
ENDSWITCH
RETURN 0
ENDFUNC
FUNC BOOL IS_STICK_IN_DEAD_ZONE(STICKS eStick)
INT iLeftX, iLeftY, iRightX, iRightY
FLOAT fMagnitude
INT iTempX, iTempY
GET_CONTROL_VALUE_OF_ANALOGUE_STICKS(iLeftX, iLeftY, iRightX, iRightY)
// Switch sticks if yoga southpaw mouse and keyboard mode active.
IF IS_USING_KEYBOARD_AND_MOUSE(PLAYER_CONTROL)
IF bSouthpaw
iTempX = iRightX
iTempY = iRightY
iRightX = iLeftX
iRightY = iLeftY
iLeftX = iTempX
iLeftY = iTempY
ENDIF
ENDIF
SWITCH eStick
CASE STICK_LEFT
// On PC we can't deadzone the left stick in southpaw stick as this is a mouse, and causes problems.
IF IS_USING_KEYBOARD_AND_MOUSE(FRONTEND_CONTROL)
AND iStickXPrev != 0
AND iStickYPrev != 0
AND bSouthpaw = TRUE
RETURN FALSE
ENDIF
fMagnitude = VMAG(<< iLeftX, iLeftY, 0 >>)
#IF IS_DEBUG_BUILD
DRAW_DEBUG_TEXT_2D(GET_STRING_FROM_INT(iLeftX), << 0.1, 0.5, 0.0 >>)
DRAW_DEBUG_TEXT_2D(GET_STRING_FROM_INT(iLeftY), << 0.2, 0.5, 0.0 >>)
DRAW_DEBUG_TEXT_2D(GET_STRING_FROM_FLOAT(fMagnitude), << 0.4, 0.6, 0.0 >>)
#ENDIF
IF fMagnitude < 100.0
#IF IS_DEBUG_BUILD
DRAW_DEBUG_TEXT_2D("DEAD ZONE", << 0.3, 0.5, 0.0 >>)
#ENDIF
RETURN TRUE
ENDIF
BREAK
CASE STICK_RIGHT
// On PC we can't deadzone the right stick as this is a mouse, and causes problems.
IF IS_USING_KEYBOARD_AND_MOUSE(FRONTEND_CONTROL)
AND iStickXPrev != 0
AND iStickYPrev != 0
AND bSouthpaw = FALSE
RETURN FALSE
ENDIF
fMagnitude = VMAG(<< iRightX, iRightY, 0 >>)
#IF IS_DEBUG_BUILD
DRAW_DEBUG_TEXT_2D(GET_STRING_FROM_INT(iRightX), << 0.1, 0.6, 0.0 >>)
DRAW_DEBUG_TEXT_2D(GET_STRING_FROM_INT(iRightY), << 0.2, 0.6, 0.0 >>)
DRAW_DEBUG_TEXT_2D(GET_STRING_FROM_FLOAT(fMagnitude), << 0.4, 0.7, 0.0 >>)
#ENDIF
IF fMagnitude < 100.0
#IF IS_DEBUG_BUILD
DRAW_DEBUG_TEXT_2D("DEAD ZONE", << 0.3, 0.6, 0.0 >>)
#ENDIF
RETURN TRUE
ENDIF
BREAK
ENDSWITCH
RETURN FALSE
ENDFUNC
FUNC BOOL IS_STICK_AT_DIRECTION(INT &iAngle, BOOL &bDeadZone, STICKS eStick, STICKDIRECTIONS eDirection, STICKPOSITIONSCHECKS eStickPositionsCheck)
iAngle = GET_STICK_ROTATION_ANGLE(eStick)
bDeadZone = IS_STICK_IN_DEAD_ZONE(eStick)
IF ( bDeadZone = FALSE )
SWITCH eStickPositionsCheck
CASE STICKPOSITIONCHECK_MOVE
SWITCH eDirection
CASE STICKDIRECTION_UP
IF iAngle >= 345
OR iAngle <= 15
RETURN TRUE
ENDIF
BREAK
CASE STICKDIRECTION_UPRIGHT
IF iAngle >= 30
AND iAngle <= 60
RETURN TRUE
ENDIF
BREAK
CASE STICKDIRECTION_RIGHT
IF iAngle >= 75
AND iAngle <= 105
RETURN TRUE
ENDIF
BREAK
CASE STICKDIRECTION_DOWNRIGHT
IF iAngle >= 120
AND iAngle <= 150
RETURN TRUE
ENDIF
BREAK
CASE STICKDIRECTION_DOWN
IF iAngle >= 165
AND iAngle <= 195
RETURN TRUE
ENDIF
BREAK
CASE STICKDIRECTION_DOWNLEFT
IF iAngle >= 210
AND iAngle <= 240
RETURN TRUE
ENDIF
BREAK
CASE STICKDIRECTION_LEFT
IF iAngle >= 255
AND iAngle <= 285
RETURN TRUE
ENDIF
BREAK
CASE STICKDIRECTION_UPLEFT
IF iAngle >= 300
AND iAngle <= 330
RETURN TRUE
ENDIF
BREAK
ENDSWITCH
BREAK
CASE STICKPOSITIONCHECK_HOLD
SWITCH eDirection
CASE STICKDIRECTION_UP
IF iAngle >= 305
OR iAngle <= 55
RETURN TRUE
ENDIF
BREAK
CASE STICKDIRECTION_UPRIGHT
IF iAngle >= 350
OR iAngle <= 100
RETURN TRUE
ENDIF
BREAK
CASE STICKDIRECTION_RIGHT
IF iAngle >= 35
AND iAngle <= 145
RETURN TRUE
ENDIF
BREAK
CASE STICKDIRECTION_DOWNRIGHT
IF iAngle >= 80
AND iAngle <= 190
RETURN TRUE
ENDIF
BREAK
CASE STICKDIRECTION_DOWN
IF iAngle >= 125
AND iAngle <= 235
RETURN TRUE
ENDIF
BREAK
CASE STICKDIRECTION_DOWNLEFT
IF iAngle >= 170
AND iAngle <= 280
RETURN TRUE
ENDIF
BREAK
CASE STICKDIRECTION_LEFT
IF iAngle >= 215
AND iAngle <= 325
RETURN TRUE
ENDIF
BREAK
CASE STICKDIRECTION_UPLEFT
IF iAngle >= 260
OR iAngle <= 10
RETURN TRUE
ENDIF
BREAK
ENDSWITCH
BREAK
ENDSWITCH
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL ARE_STICKS_IN_CORRECT_POSITION(YOGASTRUCT &Yoga, YOGAMOVE eMove, INT iPoseNumber, STICKPOSITIONSCHECKS eStickPositionsCheck)
INT iAlpha
ShakeIntensity = 0.0
iLeftRed = 255
iLeftGreen = 255
iLeftBlue = 255
iRightRed = 255
iRightGreen = 255
iRightBlue = 255
BOOL bLeftStickOK = FALSE
BOOL bRightStickOK = FALSE
IF IS_STICK_AT_DIRECTION(Yoga.iLeftStickCurrentAngle, Yoga.bLeftStickInDeadZone, STICK_LEFT, eStickDirections[eMove][iPoseNumber][STICK_LEFT], eStickPositionsCheck)
ShakeIntensity = ShakeIntensity + 30
GET_HUD_COLOUR(HUD_COLOUR_YOGA, iLeftRed, iLeftGreen, iLeftBlue, iAlpha)
bLeftStickOK = TRUE
ENDIF
IF IS_STICK_AT_DIRECTION(Yoga.iRightStickCurrentAngle, Yoga.bRightStickInDeadZone, STICK_RIGHT, eStickDirections[eMove][iPoseNumber][STICK_RIGHT], eStickPositionsCheck)
ShakeIntensity = ShakeIntensity + 30
GET_HUD_COLOUR(HUD_COLOUR_YOGA, iRightRed, iRightGreen, iRightBlue, iAlpha)
bRightStickOK = TRUE
ENDIF
ShakeIntensity = GET_MINIMUM_FLOAT(ShakeIntensity, 100.0)
SET_CONTROL_SHAKE(PLAYER_CONTROL, 10, FLOOR(ShakeIntensity))
IF bLeftStickOK
AND bRightStickOK
RETURN TRUE
ELSE
RETURN FALSE
ENDIF
ENDFUNC
PROC DO_SCALEFORM_ICON_UPDATE(YOGASTRUCT &Yoga, YOGAMOVE eMove, SCALEFORM_INDEX &siLocalYogaScaleform)
// PC scaleform
IF IS_USING_KEYBOARD_AND_MOUSE(FRONTEND_CONTROL)
IF bSouthpaw
BEGIN_SCALEFORM_MOVIE_METHOD(siLocalYogaScaleform, "REPLACE_KEYS_WITH_STICK")
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(0)
END_SCALEFORM_MOVIE_METHOD()
BEGIN_SCALEFORM_MOVIE_METHOD(siLocalYogaScaleform, "REPLACE_STICK_WITH_KEYS")
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(1)
END_SCALEFORM_MOVIE_METHOD()
ELSE
BEGIN_SCALEFORM_MOVIE_METHOD(siLocalYogaScaleform, "REPLACE_STICK_WITH_KEYS")
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(0)
END_SCALEFORM_MOVIE_METHOD()
BEGIN_SCALEFORM_MOVIE_METHOD(siLocalYogaScaleform, "REPLACE_KEYS_WITH_STICK")
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(1)
END_SCALEFORM_MOVIE_METHOD()
ENDIF
// Display keyboard and mouse help
IF IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("STICKS")
PRINT_HELP_FOREVER("STICKS_KM")
ENDIF
ELSE
// Display gamepad help
IF IS_PC_VERSION()
IF IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("STICKS_KM")
PRINT_HELP_FOREVER("STICKS")
ENDIF
ENDIF
ENDIF
//left stick rotation
BEGIN_SCALEFORM_MOVIE_METHOD(siLocalYogaScaleform, "SET_STICK_POINTER_ANGLE")
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(0)
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(ENUM_TO_INT(eStickDirections[eMove][Yoga.iPosesCompleted][STICK_LEFT]))
END_SCALEFORM_MOVIE_METHOD()
//right stick rotation
BEGIN_SCALEFORM_MOVIE_METHOD(siLocalYogaScaleform, "SET_STICK_POINTER_ANGLE")
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(1)
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(ENUM_TO_INT(eStickDirections[eMove][Yoga.iPosesCompleted][STICK_RIGHT]))
END_SCALEFORM_MOVIE_METHOD()
//left stick colour
BEGIN_SCALEFORM_MOVIE_METHOD(siLocalYogaScaleform, "SET_STICK_POINTER_RGB")
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(0)
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(iLeftRed)
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(iLeftGreen)
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(iLeftBlue)
END_SCALEFORM_MOVIE_METHOD()
//right stick colour
BEGIN_SCALEFORM_MOVIE_METHOD(siLocalYogaScaleform, "SET_STICK_POINTER_RGB")
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(1)
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(iRightRed)
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(iRightGreen)
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(iRightBlue)
END_SCALEFORM_MOVIE_METHOD()
IF ( Yoga.bLeftStickInDeadZone = TRUE )
BEGIN_SCALEFORM_MOVIE_METHOD(siLocalYogaScaleform, "HIDE_STICK_POINTER")
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(0)
END_SCALEFORM_MOVIE_METHOD()
ELSE
BEGIN_SCALEFORM_MOVIE_METHOD(siLocalYogaScaleform, "SET_STICK_POINTER_HIGHLIGHT_ANGLE")
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(0)
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(Yoga.iLeftStickCurrentAngle)
END_SCALEFORM_MOVIE_METHOD()
ENDIF
IF ( Yoga.bRightStickInDeadZone = TRUE )
BEGIN_SCALEFORM_MOVIE_METHOD(siLocalYogaScaleform, "HIDE_STICK_POINTER")
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(1)
END_SCALEFORM_MOVIE_METHOD()
ELSE
BEGIN_SCALEFORM_MOVIE_METHOD(siLocalYogaScaleform, "SET_STICK_POINTER_HIGHLIGHT_ANGLE")
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(1)
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(Yoga.iRightStickCurrentAngle)
END_SCALEFORM_MOVIE_METHOD()
ENDIF
ENDPROC
PROC DO_SCALEFORM_HIDDEN_INPUT_ICON_UPDATE(YOGASTRUCT &Yoga, SCALEFORM_INDEX &siLocalYogaScaleform)
IF IS_USING_KEYBOARD_AND_MOUSE(FRONTEND_CONTROL)
IF bSouthpaw
BEGIN_SCALEFORM_MOVIE_METHOD(siLocalYogaScaleform, "REPLACE_KEYS_WITH_STICK")
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(0)
END_SCALEFORM_MOVIE_METHOD()
BEGIN_SCALEFORM_MOVIE_METHOD(siLocalYogaScaleform, "REPLACE_STICK_WITH_KEYS")
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(1)
END_SCALEFORM_MOVIE_METHOD()
ELSE
BEGIN_SCALEFORM_MOVIE_METHOD(siLocalYogaScaleform, "REPLACE_STICK_WITH_KEYS")
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(0)
END_SCALEFORM_MOVIE_METHOD()
BEGIN_SCALEFORM_MOVIE_METHOD(siLocalYogaScaleform, "REPLACE_KEYS_WITH_STICK")
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(1)
END_SCALEFORM_MOVIE_METHOD()
ENDIF
ENDIF
//hide player input on left stick
BEGIN_SCALEFORM_MOVIE_METHOD(siLocalYogaScaleform, "HIDE_STICK_POINTER")
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(0)
END_SCALEFORM_MOVIE_METHOD()
//hide player input on right stick
BEGIN_SCALEFORM_MOVIE_METHOD(siLocalYogaScaleform, "HIDE_STICK_POINTER")
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(1)
END_SCALEFORM_MOVIE_METHOD()
//left stick rotation
BEGIN_SCALEFORM_MOVIE_METHOD(siLocalYogaScaleform, "SET_STICK_POINTER_ANGLE")
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(0)
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(Yoga.iLeftStickPosition)
END_SCALEFORM_MOVIE_METHOD()
//right stick rotation
BEGIN_SCALEFORM_MOVIE_METHOD(siLocalYogaScaleform, "SET_STICK_POINTER_ANGLE")
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(1)
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(Yoga.iRightStickPosition)
END_SCALEFORM_MOVIE_METHOD()
//left stick colour
BEGIN_SCALEFORM_MOVIE_METHOD(siLocalYogaScaleform, "SET_STICK_POINTER_RGB")
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(0)
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(iLeftRed)
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(iLeftGreen)
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(iLeftBlue)
END_SCALEFORM_MOVIE_METHOD()
//right stick colour
BEGIN_SCALEFORM_MOVIE_METHOD(siLocalYogaScaleform, "SET_STICK_POINTER_RGB")
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(1)
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(iRightRed)
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(iRightGreen)
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(iRightBlue)
END_SCALEFORM_MOVIE_METHOD()
ENDPROC
PROC DO_SCALEFORM_ADD_BREATHING_BUTTONS(SCALEFORM_INDEX &siLocalYogaScaleform)
CALL_SCALEFORM_MOVIE_METHOD_WITH_NUMBER(siLocalYogaScaleform,"ADD_BUTTON_TO_LIST",TO_FLOAT(ENUM_TO_INT(SCALEFORM_INPUT_EVENT_LEFTSHOULDER2)))
CALL_SCALEFORM_MOVIE_METHOD_WITH_NUMBER(siLocalYogaScaleform,"ADD_BUTTON_TO_LIST",TO_FLOAT(ENUM_TO_INT(SCALEFORM_INPUT_EVENT_RIGHTSHOULDER2)))
CALL_SCALEFORM_MOVIE_METHOD(siLocalYogaScaleform,"DRAW_BUTTONS")
BEGIN_SCALEFORM_MOVIE_METHOD(siLocalYogaScaleform, "SET_PLAYER_INPUT_COLOUR")
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(ENUM_TO_INT(SCALEFORM_INPUT_EVENT_LEFTSHOULDER2))
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(0)
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(0)
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(0)
END_SCALEFORM_MOVIE_METHOD()
BEGIN_SCALEFORM_MOVIE_METHOD(siLocalYogaScaleform, "SET_PLAYER_INPUT_COLOUR")
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(ENUM_TO_INT(SCALEFORM_INPUT_EVENT_RIGHTSHOULDER2))
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(0)
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(0)
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(0)
END_SCALEFORM_MOVIE_METHOD()
ENDPROC
PROC DO_SCALEFORM_BREATHING_UPDATE(YOGASTRUCT &Yoga, SCALEFORM_INDEX &siLocalYogaScaleform, INT iRed, INT iGreen, INT iBlue)
//left trigger button press
IF IS_CONTROL_PRESSED(FRONTEND_CONTROL, INPUT_SCRIPT_LT)
BEGIN_SCALEFORM_MOVIE_METHOD(siLocalYogaScaleform, "BUTTON_PRESSED")
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(ENUM_TO_INT(SCALEFORM_INPUT_EVENT_LEFTSHOULDER2))
END_SCALEFORM_MOVIE_METHOD()
ELSE
BEGIN_SCALEFORM_MOVIE_METHOD(siLocalYogaScaleform, "BUTTON_DEPRESSED")
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(ENUM_TO_INT(SCALEFORM_INPUT_EVENT_LEFTSHOULDER2))
END_SCALEFORM_MOVIE_METHOD()
ENDIF
//right trigger button press
IF IS_CONTROL_PRESSED(FRONTEND_CONTROL, INPUT_SCRIPT_RT)
BEGIN_SCALEFORM_MOVIE_METHOD(siLocalYogaScaleform, "BUTTON_PRESSED")
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(ENUM_TO_INT(SCALEFORM_INPUT_EVENT_RIGHTSHOULDER2))
END_SCALEFORM_MOVIE_METHOD()
ELSE
BEGIN_SCALEFORM_MOVIE_METHOD(siLocalYogaScaleform, "BUTTON_DEPRESSED")
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(ENUM_TO_INT(SCALEFORM_INPUT_EVENT_RIGHTSHOULDER2))
END_SCALEFORM_MOVIE_METHOD()
ENDIF
//left trigger button circle
BEGIN_SCALEFORM_MOVIE_METHOD(siLocalYogaScaleform, "SET_BUTTON_TARGET")
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(ENUM_TO_INT(SCALEFORM_INPUT_EVENT_LEFTSHOULDER2))
SCALEFORM_MOVIE_METHOD_ADD_PARAM_FLOAT(Yoga.fMaxRange) //background circle scale
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(1) //background circle
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(iRed) //red 0-255
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(iGreen) //green 0-255
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(iBlue) //blue 0-255
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(50) //alpha 0-100
END_SCALEFORM_MOVIE_METHOD()
//right trigger button circle
BEGIN_SCALEFORM_MOVIE_METHOD(siLocalYogaScaleform, "SET_BUTTON_TARGET")
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(ENUM_TO_INT(SCALEFORM_INPUT_EVENT_RIGHTSHOULDER2))
SCALEFORM_MOVIE_METHOD_ADD_PARAM_FLOAT(Yoga.fMaxRange) //background circle scale
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(1) //background circle
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(iRed) //red 0-255
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(iGreen) //green 0-255
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(iBlue) //blue 0-255
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(50) //alpha 0-100
END_SCALEFORM_MOVIE_METHOD()
// IF IS_USING_KEYBOARD_AND_MOUSE(PLAYER_CONTROL)
// BEGIN_SCALEFORM_MOVIE_METHOD(siLocalYogaScaleform, "REPLACE_STICK_WITH_KEYS")
// SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(0)
// END_SCALEFORM_MOVIE_METHOD()
//
// BEGIN_SCALEFORM_MOVIE_METHOD(siLocalYogaScaleform, "REPLACE_STICK_WITH_KEYS")
// SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(1)
// END_SCALEFORM_MOVIE_METHOD()
// ENDIF
ENDPROC
PROC DRAW_YOGAMOVE_SCALEFORM(YOGASTRUCT &Yoga, YOGAMOVE eMove)
SET_SCRIPT_GFX_DRAW_BEHIND_PAUSEMENU(FALSE)
SET_WIDESCREEN_FORMAT(WIDESCREEN_FORMAT_CENTRE)
IF ( GET_IS_WIDESCREEN() = FALSE )
OR ( GET_PROFILE_SETTING(PROFILE_DISPLAY_LANGUAGE) = ENUM_TO_INT(LANGUAGE_KOREAN) )
OR ( GET_PROFILE_SETTING(PROFILE_DISPLAY_LANGUAGE) = ENUM_TO_INT(LANGUAGE_CHINESE) )
OR ( GET_PROFILE_SETTING(PROFILE_DISPLAY_LANGUAGE) = ENUM_TO_INT(LANGUAGE_JAPANESE) )
OR ( GET_PROFILE_SETTING(PROFILE_DISPLAY_LANGUAGE) = ENUM_TO_INT(LANGUAGE_CHINESE_SIMPLIFIED))
YOGA_BUTTONS_Y = 0.825
ENDIF
IF NOT IS_PAUSE_MENU_ACTIVE()
IF IS_USING_KEYBOARD_AND_MOUSE(FRONTEND_CONTROL)
DRAW_SCALEFORM_MOVIE(siYogaScaleformKBM, YOGA_BUTTONS_X, YOGA_BUTTONS_Y,
YOGA_BUTTONS_WIDTH * YOGA_BUTTONS_SCALE, YOGA_BUTTONS_HEIGHT * YOGA_BUTTONS_SCALE, 100, 100, 100, 255)
ELSE
DRAW_SCALEFORM_MOVIE(siYogaScaleform, YOGA_BUTTONS_X, YOGA_BUTTONS_Y,
YOGA_BUTTONS_WIDTH * YOGA_BUTTONS_SCALE, YOGA_BUTTONS_HEIGHT * YOGA_BUTTONS_SCALE, 100, 100, 100, 255)
ENDIF
ENDIF
IF ( Yoga.eYogaMoveStage <> YOGAMOVESTAGE_WAIT_BETWEEN_POSES )
IF ( Yoga.iPosesCompleted < iPoses[eMove] )
IF IS_USING_KEYBOARD_AND_MOUSE(FRONTEND_CONTROL)
DO_SCALEFORM_ICON_UPDATE(Yoga, eMove, siYogaScaleformKBM)
ELSE
DO_SCALEFORM_ICON_UPDATE(Yoga, eMove, siYogaScaleform)
ENDIF
ENDIF
ELIF ( Yoga.eYogaMoveStage = YOGAMOVESTAGE_WAIT_BETWEEN_POSES )
iLeftRed = 255
iLeftGreen = 255
iLeftBlue = 255
iRightRed = 255
iRightGreen = 255
iRightBlue = 255
IF IS_USING_KEYBOARD_AND_MOUSE(FRONTEND_CONTROL)
DO_SCALEFORM_HIDDEN_INPUT_ICON_UPDATE(Yoga, siYogaScaleformKBM)
ELSE
DO_SCALEFORM_HIDDEN_INPUT_ICON_UPDATE(Yoga, siYogaScaleform)
ENDIF
ENDIF
IF ( bShowBreathingButtons = TRUE )
IF ( bBreathingButtonsAdded = FALSE )
DO_SCALEFORM_ADD_BREATHING_BUTTONS(siYogaScaleform)
IF IS_PC_VERSION()
DO_SCALEFORM_ADD_BREATHING_BUTTONS(siYogaScaleformKBM)
ENDIF
bBreathingButtonsAdded = TRUE
ENDIF
IF ( Yoga.eYogaMoveStage = YOGAMOVESTAGE_BREATHE )
INT iRed, iGreen, iBlue, iAlpha
GET_HUD_COLOUR(HUD_COLOUR_YOGA, iRed, iGreen, iBlue, iAlpha)
IF IS_USING_KEYBOARD_AND_MOUSE(PLAYER_CONTROL)
DO_SCALEFORM_BREATHING_UPDATE(Yoga, siYogaScaleformKBM, iRed, iGreen, iBlue)
ELSE
DO_SCALEFORM_BREATHING_UPDATE(Yoga, siYogaScaleform, iRed, iGreen, iBlue)
ENDIF
ENDIF
ELSE
CALL_SCALEFORM_MOVIE_METHOD(siYogaScaleform, "REMOVE_BUTTONS")
IF IS_PC_VERSION()
CALL_SCALEFORM_MOVIE_METHOD(siYogaScaleformKBM, "REMOVE_BUTTONS")
ENDIF
CLEAR_SCALEFORM_YOGA_BUTTONS(bScaleformYogaButtonsPressed)
ENDIF
ENDPROC
FUNC BOOL IS_INHALING_COMPLETED(YOGASTRUCT &Yoga, INT iMaxValue, INT iBottomValue, INT iTopValue)
INT iLeftShoulderValue = ROUND(GET_DISABLED_CONTROL_NORMAL(FRONTEND_CONTROL, INPUT_SCRIPT_LT) * 255.0)
INT iRightShoulderValue = ROUND(GET_DISABLED_CONTROL_NORMAL(FRONTEND_CONTROL, INPUT_SCRIPT_RT) * 255.0)
IF ( iLeftShoulderValue > 0 AND iRightShoulderValue > 0 )
Yoga.iBreathingValue = CLAMP_INT(GET_BREATHING_VALUE(iLeftShoulderValue, iRightShoulderValue), iBottomValue, iTopValue)
ELSE
Yoga.iBreathingValue = iBottomValue
ENDIF
IF ( Yoga.bInhaleInProgress = TRUE )
IF ( iMaxValue = iTopValue )
RETURN TRUE
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL IS_EXHALING_COMPLETED(YOGASTRUCT &Yoga, INT iMinValue, INT iMaxValue, INT iBottomValue, INT iTopValue)
INT iLeftShoulderValue = ROUND(GET_DISABLED_CONTROL_NORMAL(FRONTEND_CONTROL, INPUT_SCRIPT_LT) * 255.0)
INT iRightShoulderValue = ROUND(GET_DISABLED_CONTROL_NORMAL(FRONTEND_CONTROL, INPUT_SCRIPT_RT) * 255.0)
IF ( iLeftShoulderValue > 0 AND iRightShoulderValue > 0 )
Yoga.iBreathingValue = CLAMP_INT(GET_BREATHING_VALUE(iLeftShoulderValue, iRightShoulderValue), iBottomValue, iTopValue)
ELSE
Yoga.iBreathingValue = iBottomValue
ENDIF
IF ( Yoga.bExhaleInProgress = TRUE )
IF ( iMaxValue = iBottomValue )
IF IS_BREATHING_VALUE_IN_BUTTON_TARGET(Yoga.iBreathingValue, iMinValue, iMaxValue)
RETURN TRUE
ENDIF
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL IS_YOGAMOVE_COMPLETED(YOGASTRUCT &Yoga, YOGAMOVE eMove, INT iBreathingAttempts = 3, BOOL bPlayEndPoseAnimation = FALSE,
FLOAT fAnimationPlaybackSpeed = 1.0, BOOL bDisplayHelpText = TRUE, BOOL bDelayBreathing = FALSE)
BOOL bIsPCHelpDisplayed = FALSE
SWITCH Yoga.eYogaMoveStage
CASE YOGAMOVESTAGE_DOINGPOSES
IF ARE_STICKS_IN_CORRECT_POSITION(Yoga, eMove, Yoga.iPosesCompleted, STICKPOSITIONCHECK_MOVE)
Yoga.iTimer = GET_GAME_TIMER()
PLAY_YOGAPOSE_ANIMATION(Yoga, sYogaPosesAnims[eMove][Yoga.iPosesCompleted * 2], sYogaPosesAnims[eMove][(Yoga.iPosesCompleted * 2) + 1])
Yoga.bChangeCamera = TRUE
Yoga.bChangePoseFacial = TRUE
Yoga.eYogaMoveStage = YOGAMOVESTAGE_PLAY_POSE_ANIMATION
ELSE
IF ( bDisplayHelpText = TRUE )
// Wrap this to ensure it doesn't fire on console, as PC text isn't included.
IF IS_PC_VERSION()
IF IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("STICKS_KM")
bIsPCHelpDisplayed = TRUE
ENDIF
ENDIF
IF NOT IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("STICKS")
AND bIsPCHelpDisplayed = FALSE
IF IS_SCREEN_FADED_IN() AND NOT IS_SCREEN_FADING_IN()
IF NOT HELP_STICKS_TRIGGERED
IF IS_USING_KEYBOARD_AND_MOUSE(FRONTEND_CONTROL)
PRINT_HELP_FOREVER("STICKS_KM")
ELSE
PRINT_HELP_FOREVER("STICKS")
ENDIF
HELP_STICKS_TRIGGERED = TRUE
HELP_INHALE_TRIGGERED = FALSE
HELP_EXHALE_TRIGGERED = FALSE
ENDIF
ENDIF
ENDIF
ENDIF
bShowBreathingButtons = FALSE
bBreathingButtonsAdded = FALSE
ENDIF
BREAK
CASE YOGAMOVESTAGE_PLAY_POSE_ANIMATION
IF ARE_STICKS_IN_CORRECT_POSITION(Yoga, eMove, Yoga.iPosesCompleted, STICKPOSITIONCHECK_HOLD)
SET_YOGAPOSE_ANIMATION_SPEED(Yoga, eMove, fAnimationPlaybackSpeed)
IF IS_PED_AT_LAST_STAGE_OF_SEQUENCE(Yoga.PedIndex, 2)
SETTIMERA(0)
CLEAR_HELP()
bShowBreathingButtons = TRUE
Yoga.eYogaMoveStage = YOGAMOVESTAGE_BREATHE
Yoga.eYogaBreatheStage = YOGABREATHESTAGES_START_DELAY
Yoga.iHelpTextTimer = GET_GAME_TIMER()
IF ( bDelayBreathing = TRUE AND Yoga.bHelpTextDelayDone = FALSE )
Yoga.eYogaBreatheStage = YOGABREATHESTAGES_DISPLAY_HELP
ENDIF
Yoga.bInhaleSoundTriggered = FALSE
Yoga.bExhaleSoundTriggered = FALSE
Yoga.fMaxRange = 0.0
Yoga.fMinRange = 0.0
Yoga.iInhaleTimer = 0
Yoga.bInhaleInProgress = FALSE
Yoga.iExhaleTimer = 0
Yoga.bExhaleInProgress = FALSE
Yoga.bInhaleCompleted = FALSE
Yoga.bExhaleCompleted = FALSE
Yoga.bBreathCompleted = FALSE
Yoga.bBreathingPassed = FALSE
Yoga.iBreathingCounter = 0
Yoga.iBreathsCompleted = 0
ENDIF
ELSE
Yoga.eYogaMoveStage = YOGAMOVESTAGE_FAILED
ENDIF
BREAK
CASE YOGAMOVESTAGE_BREATHE
IF ARE_STICKS_IN_CORRECT_POSITION(Yoga, eMove, Yoga.iPosesCompleted, STICKPOSITIONCHECK_HOLD)
SWITCH Yoga.eYogaBreatheStage
CASE YOGABREATHESTAGES_DISPLAY_HELP
IF ( TIMERA() > 100 )
IF ( bDisplayHelpText = TRUE )
IF NOT IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("INHALE_NEW")
IF IS_SCREEN_FADED_IN() AND NOT IS_SCREEN_FADING_IN()
IF NOT HELP_INHALE_TRIGGERED
PRINT_HELP_FOREVER("INHALE_NEW")
HELP_STICKS_TRIGGERED = FALSE
HELP_INHALE_TRIGGERED = TRUE
HELP_EXHALE_TRIGGERED = FALSE
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF HAS_TIME_PASSED_ON_TIMER(2000, Yoga.iHelpTextTimer)
Yoga.bHelpTextDelayDone = TRUE
Yoga.eYogaBreatheStage = YOGABREATHESTAGES_INHALE
ENDIF
BREAK
CASE YOGABREATHESTAGES_START_DELAY
IF ( TIMERA() > 100 )
IF ( bDisplayHelpText = TRUE )
IF NOT IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("INHALE_NEW")
IF IS_SCREEN_FADED_IN() AND NOT IS_SCREEN_FADING_IN()
IF NOT HELP_INHALE_TRIGGERED
PRINT_HELP_FOREVER("INHALE_NEW")
HELP_STICKS_TRIGGERED = FALSE
HELP_INHALE_TRIGGERED = TRUE
HELP_EXHALE_TRIGGERED = FALSE
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF HAS_TIME_PASSED_ON_TIMER(500, Yoga.iHelpTextTimer)
Yoga.eYogaBreatheStage = YOGABREATHESTAGES_INHALE
ENDIF
BREAK
CASE YOGABREATHESTAGES_INHALE
IF ( TIMERA() > 100 )
IF ( bDisplayHelpText = TRUE )
IF NOT IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("INHALE_NEW")
IF IS_SCREEN_FADED_IN() AND NOT IS_SCREEN_FADING_IN()
IF NOT HELP_INHALE_TRIGGERED
PRINT_HELP_FOREVER("INHALE_NEW")
HELP_STICKS_TRIGGERED = FALSE
HELP_INHALE_TRIGGERED = TRUE
HELP_EXHALE_TRIGGERED = FALSE
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF ( Yoga.bInhaleSoundTriggered = FALSE )
IF IS_CONTROL_PRESSED(FRONTEND_CONTROL, INPUT_SCRIPT_LT)
AND IS_CONTROL_PRESSED(FRONTEND_CONTROL, INPUT_SCRIPT_RT)
IF HAS_SOUND_FINISHED(Yoga.iInhaleSoundID)
AND HAS_SOUND_FINISHED(Yoga.iExhaleSoundID)
PLAY_FACIAL_ANIM(Yoga.PedIndex, "michael_breathing_face", Yoga.sYogaAnimDict)
PLAY_SOUND_FROM_ENTITY(Yoga.iInhaleSoundID, "YOGA_INHALE", Yoga.PedIndex, "FAMILY_5_SOUNDS")
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Playing sound YOGA_INHALE.")
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Yoga.iInhaleSoundID is ", Yoga.iInhaleSoundID, ".")
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Playing facial animation michael_breathing_face.")
#ENDIF
Yoga.fMaxRange = 40.0
Yoga.fMinRange = 30.0
Yoga.bInhaleSoundTriggered = TRUE
Yoga.bExhaleSoundTriggered = FALSE
Yoga.iBreatheDelayTimer = 0
Yoga.bInhaleCompleted = FALSE
Yoga.bExhaleCompleted = FALSE
Yoga.bBreathCompleted = FALSE
Yoga.bInhaleFailed = FALSE
Yoga.bExhaleFailed = FALSE
Yoga.bInhaleInProgress = TRUE
Yoga.bExhaleInProgress = FALSE
ENDIF
ENDIF
ELSE
Yoga.fMaxRange = CLAMP(Yoga.fMaxRange +@Yoga.fValue, 40.0, 100.0) //slow down the time it takes to
Yoga.fMinRange = CLAMP(Yoga.fMinRange +@Yoga.fValue, 30.0, 90.0) //fill the breathing circle
IF HAS_SOUND_FINISHED(Yoga.iInhaleSoundID)
AND HAS_SOUND_FINISHED(Yoga.iExhaleSoundID)
AND ( Yoga.fMinRange = 90.0 AND Yoga.fMaxRange = 100.0 )
IF ( Yoga.iBreatheDelayTimer = 0 )
Yoga.iBreatheDelayTime = 1200 + GET_RANDOM_INT_IN_RANGE(0, 401) //more time between inhale & exhale
Yoga.iBreatheDelayTimer = GET_GAME_TIMER()
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Yoga.iBreatheDelayTime is ", Yoga.iBreatheDelayTime, ".")
#ENDIF
ELSE
IF HAS_TIME_PASSED_ON_TIMER(Yoga.iBreatheDelayTime, Yoga.iBreatheDelayTimer)
Yoga.eYogaBreatheStage = YOGABREATHESTAGES_EXHALE
Yoga.iExhaleTimer = 0
Yoga.bExhaleInProgress = FALSE
Yoga.iHoldBreathTimer = GET_GAME_TIMER()
IF IS_ANY_YOGA_HELP_MESSAGE_BEING_DISPLAYED()
CLEAR_HELP()
SETTIMERA(0)
HELP_STICKS_TRIGGERED = FALSE
HELP_INHALE_TRIGGERED = FALSE
HELP_EXHALE_TRIGGERED = FALSE
ENDIF
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Moving to YOGABREATHESTAGES_EXHALE.")
#ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF IS_INHALING_COMPLETED(Yoga, FLOOR(Yoga.fMaxRange), 40, 100)
Yoga.bInhaleCompleted = TRUE
ELSE
Yoga.bInhaleCompleted = FALSE
ENDIF
BREAK
CASE YOGABREATHESTAGES_EXHALE
IF ( TIMERA() > 100 )
IF ( bDisplayHelpText = TRUE )
IF NOT IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("EXHALE_NEW")
IF IS_SCREEN_FADED_IN() AND NOT IS_SCREEN_FADING_IN()
IF NOT HELP_EXHALE_TRIGGERED
PRINT_HELP_FOREVER("EXHALE_NEW")
HELP_STICKS_TRIGGERED = FALSE
HELP_INHALE_TRIGGERED = FALSE
HELP_EXHALE_TRIGGERED = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF ( Yoga.bExhaleSoundTriggered = FALSE )
IF NOT IS_CONTROL_PRESSED(FRONTEND_CONTROL, INPUT_SCRIPT_LT)
AND NOT IS_CONTROL_PRESSED(FRONTEND_CONTROL, INPUT_SCRIPT_RT)
IF HAS_SOUND_FINISHED(Yoga.iInhaleSoundID)
AND HAS_SOUND_FINISHED(Yoga.iExhaleSoundID)
INT iExhaleSoundVersion
iExhaleSoundVersion = GET_RANDOM_INT_IN_RANGE(1, 6)
SWITCH iExhaleSoundVersion
CASE 1 //aaaahhh
CASE 4 //aaaahhh
CASE 5 //aaaahhh
PLAY_SOUND_FROM_ENTITY(Yoga.iExhaleSoundID, "YOGA_EXHALE", Yoga.PedIndex, "FAMILY_5_SOUNDS")
SET_VARIABLE_ON_SOUND(Yoga.iExhaleSoundID, "Version", TO_FLOAT(iExhaleSoundVersion))
PLAY_FACIAL_ANIM(Yoga.PedIndex, "michael_breathing_face_exhale", Yoga.sYogaAnimDict)
BREAK
CASE 2 //ooow
CASE 3 //ooow
PLAY_SOUND_FROM_ENTITY(Yoga.iExhaleSoundID, "YOGA_EXHALE", Yoga.PedIndex, "FAMILY_5_SOUNDS")
SET_VARIABLE_ON_SOUND(Yoga.iExhaleSoundID, "Version", TO_FLOAT(iExhaleSoundVersion))
PLAY_FACIAL_ANIM(Yoga.PedIndex, "michael_breathing_face_exhale_oow", Yoga.sYogaAnimDict)
BREAK
ENDSWITCH
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Playing sound YOGA_EXHALE.")
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Yoga.iExhaleSoundID is ", Yoga.iExhaleSoundID, ".")
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Playing facial animation michael_breathing_face_exhale.")
#ENDIF
Yoga.fMaxRange = 100.0
Yoga.fMinRange = 90.0
Yoga.bExhaleSoundTriggered = TRUE
Yoga.bInhaleSoundTriggered = FALSE
Yoga.iBreatheDelayTimer = 0
Yoga.bExhaleCompleted = FALSE
Yoga.bExhaleInProgress = TRUE
Yoga.bExhaleFailed = FALSE
ENDIF
ELSE
IF HAS_TIME_PASSED_ON_TIMER(15000, Yoga.iHoldBreathTimer)
Yoga.eYogaMoveStage = YOGAMOVESTAGE_FAILED
ENDIF
ENDIF
ELSE
Yoga.fMaxRange = CLAMP(Yoga.fMaxRange -@Yoga.fValue, 40.0, 100.0) //slow down the time it takes to
Yoga.fMinRange = CLAMP(Yoga.fMinRange -@Yoga.fValue, 30.0, 90.0) //fill the breathing circle
IF HAS_SOUND_FINISHED(Yoga.iInhaleSoundID)
AND HAS_SOUND_FINISHED(Yoga.iExhaleSoundID)
AND ( Yoga.fMinRange = 30.0 AND Yoga.fMaxRange = 40.0 )
IF ( Yoga.iBreatheDelayTimer = 0 )
Yoga.iBreatheDelayTime = 500 + GET_RANDOM_INT_IN_RANGE(0, 251)
Yoga.iBreatheDelayTimer = GET_GAME_TIMER()
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Yoga.iBreatheDelayTime is ", Yoga.iBreatheDelayTime, ".")
#ENDIF
ELSE
IF HAS_TIME_PASSED_ON_TIMER(Yoga.iBreatheDelayTime, Yoga.iBreatheDelayTimer)
Yoga.iBreathingCounter++
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Incrementing iBreathingCounter. Yoga.iBreathingCounter: ", Yoga.iBreathingCounter, ".")
#ENDIF
Yoga.eYogaBreatheStage = YOGABREATHESTAGES_INHALE
Yoga.iInhaleTimer = 0
Yoga.bInhaleInProgress = FALSE
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Moving to YOGABREATHESTAGES_INHALE.")
#ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF IS_EXHALING_COMPLETED(Yoga, FLOOR(Yoga.fMinRange), FLOOR(Yoga.fMaxRange), 40, 100)
Yoga.bExhaleCompleted = TRUE
IF (Yoga.bInhaleCompleted = TRUE AND Yoga.bExhaleCompleted = TRUE)
IF ( Yoga.bBreathCompleted = FALSE )
Yoga.iBreathsCompleted++
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Incrementing iBreathsCompleted. Yoga.iBreathsCompleted: ", Yoga.iBreathsCompleted, ".")
#ENDIF
Yoga.bBreathCompleted = TRUE
ENDIF
Yoga.bBreathingPassed = TRUE
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Breathing passed for current yoga pose.")
#ENDIF
ENDIF
ENDIF
IF ( Yoga.bBreathingPassed = TRUE )
Yoga.iPosesCompleted++
Yoga.fBlushDecalAlpha = CLAMP(Yoga.fBlushDecalAlpha + 0.035, Yoga.fBlushDecalAlpha, 0.5)
Yoga.fModifierStrengthMax = CLAMP(Yoga.fModifierStrengthMax + 0.01035, Yoga.fModifierStrengthMax , 0.145)
IF NOT IS_PED_INJURED(Yoga.PedIndex)
CLEAR_PED_DAMAGE_DECAL_BY_ZONE(Yoga.PedIndex, PDZ_HEAD, "blushing")
APPLY_PED_DAMAGE_DECAL(Yoga.PedIndex, PDZ_HEAD, 0.50, 0.513, 0.0, 1.0, Yoga.fBlushDecalAlpha, 0, FALSE, "blushing")
ENDIF
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Completed pose ", Yoga.iPosesCompleted, " for current yoga move.")
#ENDIF
Yoga.bInhaleFailed = FALSE //rested flags for next pose
Yoga.bExhaleFailed = FALSE
IF (Yoga.iPosesCompleted = iPoses[eMove]) //if all poses for move are completed
IF ( bPlayEndPoseAnimation = FALSE ) //if endpose animations are not needed (mission minigame)
Yoga.eYogaMoveStage = YOGAMOVESTAGE_FINISHED //go to move finished stage
ELIF ( bPlayEndPoseAnimation = TRUE ) //if endpose animations are needed (off mission minigame)
//play last animation in current move and 'start_pose'
PLAY_YOGAPOSE_ANIMATION(Yoga, sYogaPosesAnims[eMove][iAnimations[eMove] - 1], "START_POSE")
Yoga.bChangeCamera = TRUE
Yoga.eYogaMoveStage = YOGAMOVESTAGE_PLAY_ENDPOSE_ANIMATION
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Playing end pose animation for current yoga move.")
#ENDIF
ENDIF
ELSE
Yoga.iBreathingCounter = 0
Yoga.iBreathsCompleted = 0
bShowBreathingButtons = FALSE //reset the scaleform breathing buttons flags
bBreathingButtonsAdded = FALSE
Yoga.iLeftStickPosition = ENUM_TO_INT(eStickDirections[eMove][Yoga.iPosesCompleted - 1][0])
Yoga.iRightStickPosition = ENUM_TO_INT(eStickDirections[eMove][Yoga.iPosesCompleted - 1][1])
Yoga.eYogaMoveStage = YOGAMOVESTAGE_WAIT_BETWEEN_POSES
ENDIF
ELSE
IF ( Yoga.iBreathingCounter = iBreathingAttempts )
Yoga.eYogaMoveStage = YOGAMOVESTAGE_FAILED
ENDIF
ENDIF
BREAK
ENDSWITCH
ELSE
Yoga.eYogaMoveStage = YOGAMOVESTAGE_FAILED
ENDIF
BREAK
CASE YOGAMOVESTAGE_WAIT_BETWEEN_POSES
IF IS_ANY_YOGA_HELP_MESSAGE_BEING_DISPLAYED()
CLEAR_HELP()
HELP_STICKS_TRIGGERED = FALSE
HELP_INHALE_TRIGGERED = FALSE
HELP_EXHALE_TRIGGERED = FALSE
ENDIF
Yoga.bLeftStickInDeadZone = TRUE
Yoga.bRightStickInDeadZone = TRUE
ANIMATE_STICK_DIRECTION_CHANGE(eStickDirections[eMove][Yoga.iPosesCompleted - 1][STICK_LEFT],
eStickDirections[eMove][Yoga.iPosesCompleted][STICK_LEFT],
eStickRotations[eMove][Yoga.iPosesCompleted][STICK_LEFT], Yoga.iLeftStickPosition, 4)
ANIMATE_STICK_DIRECTION_CHANGE(eStickDirections[eMove][Yoga.iPosesCompleted - 1][STICK_RIGHT],
eStickDirections[eMove][Yoga.iPosesCompleted][STICK_RIGHT],
eStickRotations[eMove][Yoga.iPosesCompleted][STICK_RIGHT], Yoga.iRightStickPosition, 4)
IF ( Yoga.iLeftStickPosition = ENUM_TO_INT(eStickDirections[eMove][Yoga.iPosesCompleted][STICK_LEFT]) )
AND ( Yoga.iRightStickPosition = ENUM_TO_INT(eStickDirections[eMove][Yoga.iPosesCompleted][STICK_RIGHT]) )
Yoga.eYogaMoveStage = YOGAMOVESTAGE_DOINGPOSES
ENDIF
BREAK
CASE YOGAMOVESTAGE_PLAY_ENDPOSE_ANIMATION
IF IS_ANY_YOGA_HELP_MESSAGE_BEING_DISPLAYED()
CLEAR_HELP()
HELP_STICKS_TRIGGERED = FALSE
HELP_INHALE_TRIGGERED = FALSE
HELP_EXHALE_TRIGGERED = FALSE
ENDIF
SET_YOGAPOSE_ANIMATION_SPEED(Yoga, eMove, fAnimationPlaybackSpeed)
IF IS_PED_AT_LAST_STAGE_OF_SEQUENCE(Yoga.PedIndex, 2)
CLEAR_HELP()
Yoga.eYogaMoveStage = YOGAMOVESTAGE_FINISHED
ENDIF
BREAK
CASE YOGAMOVESTAGE_FINISHED
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": All poses for yoga move completed. Yoga move is completed.")
#ENDIF
RETURN TRUE
BREAK
CASE YOGAMOVESTAGE_FAILED
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Yoga move failed.")
#ENDIF
BREAK
ENDSWITCH
RETURN FALSE
ENDFUNC
PROC PLAY_YOGAMOVE_FAIL_ANIMATION(YOGASTRUCT& Yoga)
IF NOT IS_PED_INJURED(Yoga.PedIndex)
STRING sFailAnimationName
IF IS_ENTITY_PLAYING_ANIM(Yoga.PedIndex, Yoga.sYogaAnimDict, "start_to_a1")
OR IS_ENTITY_PLAYING_ANIM(Yoga.PedIndex, Yoga.sYogaAnimDict, "a1_pose")
IF IS_ENTITY_PLAYING_ANIM(Yoga.PedIndex, Yoga.sYogaAnimDict, "start_to_a1")
AND GET_ENTITY_ANIM_CURRENT_TIME(Yoga.PedIndex, Yoga.sYogaAnimDict, "start_to_a1") <= 0.4
sFailAnimationName = "midway_fail_from_a1_to_start"
ELSE
sFailAnimationName = "a1_fail_to_start"
ENDIF
ENDIF
IF IS_ENTITY_PLAYING_ANIM(Yoga.PedIndex, Yoga.sYogaAnimDict, "a1_to_a2")
OR IS_ENTITY_PLAYING_ANIM(Yoga.PedIndex, Yoga.sYogaAnimDict, "a2_pose")
sFailAnimationName = "a2_fail_to_start"
ENDIF
IF IS_ENTITY_PLAYING_ANIM(Yoga.PedIndex, Yoga.sYogaAnimDict, "a2_to_a3")
OR IS_ENTITY_PLAYING_ANIM(Yoga.PedIndex, Yoga.sYogaAnimDict, "a3_pose")
IF IS_ENTITY_PLAYING_ANIM(Yoga.PedIndex, Yoga.sYogaAnimDict, "a2_to_a3")
AND GET_ENTITY_ANIM_CURRENT_TIME(Yoga.PedIndex, Yoga.sYogaAnimDict, "a2_to_a3") <= 0.55
sFailAnimationName = "a2_fail_to_start"
ELSE
sFailAnimationName = "a3_fail_to_start"
ENDIF
ENDIF
IF IS_ENTITY_PLAYING_ANIM(Yoga.PedIndex, Yoga.sYogaAnimDict, "a3_to_b4")
OR IS_ENTITY_PLAYING_ANIM(Yoga.PedIndex, Yoga.sYogaAnimDict, "b4_pose")
IF IS_ENTITY_PLAYING_ANIM(Yoga.PedIndex, Yoga.sYogaAnimDict, "a3_to_b4")
AND GET_ENTITY_ANIM_CURRENT_TIME(Yoga.PedIndex, Yoga.sYogaAnimDict, "a3_to_b4") <= 0.625
sFailAnimationName = "midway_fail_from_a3_to_start"
ELSE
sFailAnimationName = "b4_fail_to_start"
ENDIF
ENDIF
IF IS_ENTITY_PLAYING_ANIM(Yoga.PedIndex, Yoga.sYogaAnimDict, "start_to_c1")
OR IS_ENTITY_PLAYING_ANIM(Yoga.PedIndex, Yoga.sYogaAnimDict, "c1_pose")
sFailAnimationName = "c1_fail_to_start"
ENDIF
IF IS_ENTITY_PLAYING_ANIM(Yoga.PedIndex, Yoga.sYogaAnimDict, "c1_to_c2")
OR IS_ENTITY_PLAYING_ANIM(Yoga.PedIndex, Yoga.sYogaAnimDict, "c2_pose")
IF IS_ENTITY_PLAYING_ANIM(Yoga.PedIndex, Yoga.sYogaAnimDict, "c1_to_c2")
AND GET_ENTITY_ANIM_CURRENT_TIME(Yoga.PedIndex, Yoga.sYogaAnimDict, "c1_to_c2") <= 0.450
sFailAnimationName = "c1_fail_to_start"
ELSE
sFailAnimationName = "c2_fail_to_start"
ENDIF
ENDIF
IF IS_ENTITY_PLAYING_ANIM(Yoga.PedIndex, Yoga.sYogaAnimDict, "c2_to_c3")
OR IS_ENTITY_PLAYING_ANIM(Yoga.PedIndex, Yoga.sYogaAnimDict, "c3_pose")
sFailAnimationName = "c3_fail_to_start"
ENDIF
IF IS_ENTITY_PLAYING_ANIM(Yoga.PedIndex, Yoga.sYogaAnimDict, "c3_to_c4")
OR IS_ENTITY_PLAYING_ANIM(Yoga.PedIndex, Yoga.sYogaAnimDict, "c4_pose")
sFailAnimationName = "c4_fail_to_start"
ENDIF
IF IS_ENTITY_PLAYING_ANIM(Yoga.PedIndex, Yoga.sYogaAnimDict, "c4_to_c5")
OR IS_ENTITY_PLAYING_ANIM(Yoga.PedIndex, Yoga.sYogaAnimDict, "c5_pose")
sFailAnimationName = "c5_fail_to_start"
ENDIF
IF IS_ENTITY_PLAYING_ANIM(Yoga.PedIndex, Yoga.sYogaAnimDict, "c5_to_c6")
OR IS_ENTITY_PLAYING_ANIM(Yoga.PedIndex, Yoga.sYogaAnimDict, "c6_pose")
sFailAnimationName = "c6_fail_to_start"
ENDIF
IF IS_ENTITY_PLAYING_ANIM(Yoga.PedIndex, Yoga.sYogaAnimDict, "c6_to_c7")
OR IS_ENTITY_PLAYING_ANIM(Yoga.PedIndex, Yoga.sYogaAnimDict, "c7_pose")
IF IS_ENTITY_PLAYING_ANIM(Yoga.PedIndex, Yoga.sYogaAnimDict, "c6_to_c7")
AND GET_ENTITY_ANIM_CURRENT_TIME(Yoga.PedIndex, Yoga.sYogaAnimDict, "c6_to_c7") <= 0.65
sFailAnimationName = "c6_fail_to_start"
ELSE
sFailAnimationName = "c2_fail_to_start"
ENDIF
ENDIF
SEQUENCE_INDEX SequenceIndex
CLEAR_SEQUENCE_TASK(SequenceIndex)
OPEN_SEQUENCE_TASK(SequenceIndex)
TASK_PLAY_ANIM_ADVANCED(NULL, Yoga.sYogaAnimDict, sFailAnimationName, Yoga.vPosition, Yoga.vRotation, SLOW_BLEND_IN, SLOW_BLEND_OUT,
-1, AF_EXTRACT_INITIAL_OFFSET | AF_USE_MOVER_EXTRACTION, 0, EULER_YXZ, AIK_DISABLE_LEG_IK)
TASK_PLAY_ANIM_ADVANCED(NULL, Yoga.sYogaAnimDict, "start_pose", Yoga.vPosition, Yoga.vRotation, SLOW_BLEND_IN, NORMAL_BLEND_OUT,
-1, AF_EXTRACT_INITIAL_OFFSET| AF_LOOPING | AF_USE_MOVER_EXTRACTION, 0, EULER_YXZ, AIK_DISABLE_LEG_IK)
CLOSE_SEQUENCE_TASK(SequenceIndex)
TASK_PERFORM_SEQUENCE(Yoga.PedIndex, SequenceIndex)
CLEAR_SEQUENCE_TASK(SequenceIndex)
FORCE_PED_AI_AND_ANIMATION_UPDATE(Yoga.PedIndex)
ENDIF
ENDPROC
PROC PLAY_YOGAMOVE_IDLE_ANIMATION(YOGASTRUCT& Yoga, BOOL bPlayRestartAnimations = FALSE)
IF NOT IS_PED_INJURED(Yoga.PedIndex)
IF NOT IS_ENTITY_PLAYING_ANIM(Yoga.PedIndex, Yoga.sYogaAnimDict, "start_pose")
IF bPlayRestartAnimations = FALSE //if no restart an animations are needed, go to start_pose
TASK_PLAY_ANIM(Yoga.PedIndex, Yoga.sYogaAnimDict, "start_pose", SLOW_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_LOOPING, 0, FALSE, AIK_DISABLE_LEG_IK)
ELSE //if restart animations are needed, play fail_to_start and start_pose animations in sequence
SEQUENCE_INDEX SequenceIndex
CLEAR_SEQUENCE_TASK(SequenceIndex)
OPEN_SEQUENCE_TASK(SequenceIndex)
SWITCH GET_RANDOM_INT_IN_RANGE(0, 3)
CASE 0
TASK_PLAY_ANIM_ADVANCED(NULL, Yoga.sYogaAnimDict, "fail_to_start_a", Yoga.vPosition, Yoga.vRotation,
INSTANT_BLEND_IN, SLOW_BLEND_OUT, -1,
AF_EXTRACT_INITIAL_OFFSET | AF_USE_MOVER_EXTRACTION, 0, EULER_YXZ, AIK_DISABLE_LEG_IK)
BREAK
CASE 1
TASK_PLAY_ANIM_ADVANCED(NULL, Yoga.sYogaAnimDict, "fail_to_start_b", Yoga.vPosition, Yoga.vRotation,
INSTANT_BLEND_IN, SLOW_BLEND_OUT, -1,
AF_EXTRACT_INITIAL_OFFSET | AF_USE_MOVER_EXTRACTION, 0, EULER_YXZ, AIK_DISABLE_LEG_IK)
BREAK
CASE 2
TASK_PLAY_ANIM_ADVANCED(NULL, Yoga.sYogaAnimDict, "fail_to_start_c", Yoga.vPosition, Yoga.vRotation,
INSTANT_BLEND_IN, SLOW_BLEND_OUT, -1,
AF_EXTRACT_INITIAL_OFFSET | AF_USE_MOVER_EXTRACTION, 0, EULER_YXZ, AIK_DISABLE_LEG_IK)
BREAK
ENDSWITCH
TASK_PLAY_ANIM_ADVANCED(NULL, Yoga.sYogaAnimDict, "start_pose", Yoga.vPosition, Yoga.vRotation,
SLOW_BLEND_IN, NORMAL_BLEND_OUT, -1,
AF_EXTRACT_INITIAL_OFFSET| AF_LOOPING | AF_USE_MOVER_EXTRACTION, 0, EULER_YXZ, AIK_DISABLE_LEG_IK)
CLOSE_SEQUENCE_TASK(SequenceIndex)
TASK_PERFORM_SEQUENCE(Yoga.PedIndex, SequenceIndex)
CLEAR_SEQUENCE_TASK(SequenceIndex)
CLEAR_FACIAL_IDLE_ANIM_OVERRIDE(Yoga.PedIndex)
PLAY_FACIAL_ANIM(Yoga.PedIndex, "fail_face", Yoga.sYogaAnimDict) //also play faical animation during the restart animations
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Playing facial animation michael_breathing_face_exhale.")
#ENDIF
FORCE_PED_AI_AND_ANIMATION_UPDATE(Yoga.PedIndex)
ENDIF
ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// Checks if yoga minigame animation dictionary and audio banks have loaded.
/// RETURNS:
/// True if animation dictionary and audio banks have loaded.
FUNC BOOL ARE_YOGA_REQUESTS_LOADED()
REQUEST_ANIM_DICT("missfam5_yoga")
REQUEST_ADDITIONAL_TEXT("YOGA", MINIGAME_TEXT_SLOT)
IF HAS_ANIM_DICT_LOADED("missfam5_yoga")
AND HAS_ADDITIONAL_TEXT_LOADED(MINIGAME_TEXT_SLOT)
AND REQUEST_SCRIPT_AUDIO_BANK("FAM5_YOGA_01")
AND REQUEST_SCRIPT_AUDIO_BANK("FAM5_YOGA_02")
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
PROC RUN_YOGA_FAIL_CAMERA(YOGASTRUCT Yoga, INT i = 0)
SWITCH Yoga.eYogaMinigameStage
CASE YOGAMINIGAMESTAGE_FAILRESET
IF NOT DOES_CAM_EXIST(YogaFailCamera)
YogaFailCamera = CREATE_CAMERA(CAMTYPE_SCRIPTED, TRUE)
SHAKE_CAM(YogaFailCamera, "HAND_SHAKE", 0.1)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Creating yoga fail camera with number ", i, ".")
#ENDIF
SET_CAM_PARAMS(YogaFailCamera, vYogaFailCameraPositions[i], vYogaFailCameraRotations[i], vYogaFailCameraFOVs[i])
SET_ENTITY_VISIBLE(Yoga.PedIndex, FALSE)
ENDIF
BREAK
CASE YOGAMINIGAMESTAGE_DOMOVE
CASE YOGAMINIGAMESTAGE_RESTART
IF DOES_CAM_EXIST(YogaFailCamera)
DESTROY_CAM(YogaFailCamera)
SET_ENTITY_VISIBLE(Yoga.PedIndex, TRUE)
ENDIF
BREAK
ENDSWITCH
ENDPROC
PROC RUN_YOGA_CUSTOM_CAMERA(YOGASTRUCT &Yoga)
SWITCH Yoga.eYogaMinigameStage
CASE YOGAMINIGAMESTAGE_DOMOVE
IF ( Yoga.bChangeCamera = TRUE )
IF ( bYogaCameraFlags[Yoga.iPosesCompleted][YCF_CHANGE] = TRUE )
IF NOT DOES_CAM_EXIST(YogaCustomCamera)
YogaCustomCamera = CREATE_CAMERA(CAMTYPE_SCRIPTED, FALSE)
ENDIF
IF DOES_CAM_EXIST(YogaCustomCamera)
SET_CAM_PARAMS(YogaCustomCamera, vYogaCameraPositions[Yoga.iPosesCompleted][0],
vYogaCameraRotations[Yoga.iPosesCompleted][0],
fYogaCameraFOVs[Yoga.iPosesCompleted][0])
IF ( bYogaCameraFlags[Yoga.iPosesCompleted][YCF_INTERP] = TRUE )
SET_CAM_PARAMS(YogaCustomCamera, vYogaCameraPositions[Yoga.iPosesCompleted][1],
vYogaCameraRotations[Yoga.iPosesCompleted][1],
fYogaCameraFOVs[Yoga.iPosesCompleted][1],
iYogaCameraInterpTimes[Yoga.iPosesCompleted],
GRAPH_TYPE_SIN_ACCEL_DECEL, GRAPH_TYPE_SIN_ACCEL_DECEL)
ENDIF
SHAKE_CAM(YogaCustomCamera, "HAND_SHAKE", 0.1)
SET_CAM_ACTIVE(YogaCustomCamera, bYogaCameraFlags[Yoga.iPosesCompleted][YCF_ACTIVE])
ENDIF
ENDIF
Yoga.bChangeCamera = FALSE
ENDIF
BREAK
//CASE YOGAMINIGAMESTAGE_DOFAIL
CASE YOGAMINIGAMESTAGE_WAITFAIL
CASE YOGAMINIGAMESTAGE_FAILRESET
IF DOES_CAM_EXIST(YogaCustomCamera)
IF IS_CAM_RENDERING(YogaCustomCamera)
OR IS_CAM_INTERPOLATING(YogaCustomCamera)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Yoga.iFailedPose: ", Yoga.iFailedPose, ".")
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Yoga.iFailCameraCutTimer: ", Yoga.iFailCameraCutTimer, ".")
PRINTLN(GET_THIS_SCRIPT_NAME(), ": iYogaCameraFailCutTimes[", Yoga.iFailedPose, "]: ",iYogaCameraFailCutTimes[Yoga.iFailedPose], ".")
#ENDIF
IF ( iYogaCameraFailCutTimes[Yoga.iFailedPose] = 0 )
DESTROY_CAM(YogaCustomCamera)
ELSE
IF ( Yoga.iFailCameraCutTimer = 0 )
Yoga.iFailCameraCutTimer = GET_GAME_TIMER()
ELSE
IF HAS_TIME_PASSED_ON_TIMER(iYogaCameraFailCutTimes[Yoga.iFailedPose], Yoga.iFailCameraCutTimer)
DESTROY_CAM(YogaCustomCamera)
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
CASE YOGAMINIGAMESTAGE_FINISHED
IF DOES_CAM_EXIST(YogaCustomCamera)
SWITCH Yoga.eYogaMove
CASE YOGAMOVE_WARRIOR
SET_CAM_ACTIVE(YogaCustomCamera, FALSE)
BREAK
DEFAULT
//
BREAK
ENDSWITCH
ENDIF
BREAK
ENDSWITCH
ENDPROC
PROC UPDATE_YOGA_TIMECYCLE_MODIFIER(YOGASTRUCT &Yoga, BOOL bMinigameActive = TRUE, FLOAT fDesiredValue = 0.0, FLOAT fDesiredSpeed = 0.001)
IF ( bMinigameActive = TRUE )
SWITCH Yoga.eYogaMinigameStage
CASE YOGAMINIGAMESTAGE_SETUP
SET_TIMECYCLE_MODIFIER("STONED_CUTSCENE")
SET_TIMECYCLE_MODIFIER_STRENGTH(Yoga.fModifierStrength)
BREAK
CASE YOGAMINIGAMESTAGE_DOMOVE
CASE YOGAMINIGAMESTAGE_DOFAIL
CASE YOGAMINIGAMESTAGE_WAITFAIL
CASE YOGAMINIGAMESTAGE_FAILRESET
CASE YOGAMINIGAMESTAGE_RESTART
CASE YOGAMINIGAMESTAGE_PASSED
CASE YOGAMINIGAMESTAGE_FINISHED
CONVERGE_VALUE(Yoga.fModifierStrength, Yoga.fModifierStrengthMax, 0.0001, TRUE)
SET_TIMECYCLE_MODIFIER_STRENGTH(Yoga.fModifierStrength)
BREAK
ENDSWITCH
ELSE
CONVERGE_VALUE(Yoga.fModifierStrength, fDesiredValue, fDesiredSpeed, TRUE)
SET_TIMECYCLE_MODIFIER_STRENGTH(Yoga.fModifierStrength)
ENDIF
ENDPROC
/// PURPOSE:
/// Handles switching mouse and keyboard controls for left handed users.
/// Not the same as gamepad southpaw mode!
PROC UPDATE_MK_SOUTHPAW_MODE()
// Don't do anything if not using keyboard and mouse.
IF NOT IS_USING_KEYBOARD_AND_MOUSE(FRONTEND_CONTROL)
EXIT
ENDIF
// Check for mouse and keyboard southpaw switch
IF IS_CONTROL_JUST_PRESSED( FRONTEND_CONTROL, INPUT_SCRIPT_RDOWN )
IF bSouthPaw = TRUE
bSouthPaw = FALSE
ELSE
bSouthPaw = TRUE
ENDIF
iStickXPrev = 0
iStickYPrev = 0
ENDIF
/* DEBUG
IF bSouthPaw
DISPLAY_TEXT_WITH_NUMBER( 0.6, 0.1, "NUMBER", 1 )
ELSE
DISPLAY_TEXT_WITH_NUMBER( 0.6, 0.1, "NUMBER", 0 )
ENDIF
*/
ENDPROC
/// PURPOSE:
/// Runs yoga minigame for a specified yoga move.
/// PARAMS:
/// Yoga - Struct that holds yoga data.
/// eMove - Yoga move to perform.
/// bPlayEndPoseAnimation - Indicates if end pose animations should be played. FALSE on mission, TRUE on off mission minigame.
/// bDisplayHelpText - Indicates if help text be displyed.
/// bDelayBreathing - Indicates if first breathing should be delayed (to display help text).
/// iPedStatIncrease - Value to increment stats after a passed yoga move.
/// iLocation - Location 0 - Michael's house, 1 - North Coast.
/// bPlayAmbientSpeech - Should ambient speech be played when failing. Used in off mission minigame
/// RETURNS:
/// TRUE when the minigame has has been completed.
FUNC BOOL HAS_PLAYER_COMPLETED_YOGA_MOVE(YOGASTRUCT& Yoga, YOGAMOVE eMove, BOOL bPlayEndPoseAnimation = FALSE, BOOL bDisplayHelpText = TRUE,
BOOL bDelayBreathing = FALSE, INT iPedStatIncrease = 1, INT iLocation = 0, BOOL bPlayAmbientSpeech = FALSE)
Yoga.PedIndex = PLAYER_PED_ID()
Yoga.eYogaMove = eMove
Yoga.sYogaAnimDict = "missfam5_yoga"
UPDATE_YOGA_FACIAL_ANIMATIONS(Yoga)
UPDATE_MK_SOUTHPAW_MODE() // Switch mouse and keyboard controls - not the same as gamepad soutpaw!
SWITCH Yoga.eYogaMinigameStage
CASE YOGAMINIGAMESTAGE_SETUP
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Starting yoga minigame setup.")
#ENDIF
IF NOT IS_PED_INJURED(Yoga.PedIndex)
SET_ENTITY_HEALTH(Yoga.PedIndex, GET_PED_MAX_HEALTH(Yoga.PedIndex)) //restore health to max ped health
HIDE_PED_WEAPON_FOR_SCRIPTED_CUTSCENE(Yoga.PedIndex, TRUE) //hide ped weapon
SET_CURRENT_PED_WEAPON(Yoga.PedIndex, WEAPONTYPE_UNARMED, TRUE) //make ped weapon unarmed
IF ( Yoga.fBlushDecalAlpha = 0.0)
CLEAR_PED_DAMAGE_DECAL_BY_ZONE(Yoga.PedIndex, PDZ_HEAD, "blushing")
APPLY_PED_DAMAGE_DECAL(Yoga.PedIndex, PDZ_HEAD, 0.50, 0.513, 0.0, 1.0, Yoga.fBlushDecalAlpha, 0, TRUE, "blushing")
ENDIF
Yoga.vPosition = GET_ENTITY_COORDS(Yoga.PedIndex)
Yoga.vRotation = GET_ENTITY_ROTATION(Yoga.PedIndex)
siYogaScaleform = REQUEST_SCALEFORM_MOVIE("yoga_buttons")
IF IS_PC_VERSION()
siYogaScaleformKBM = REQUEST_SCALEFORM_MOVIE("yoga_keys")
ENDIF
IF ARE_YOGA_REQUESTS_LOADED()
AND HAS_YOGA_SCALEFORM_LOADED()
SETUP_YOGAMOVE(eMove, iLocation)
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
SET_FORCE_FOOTSTEP_UPDATE(Yoga.PedIndex, TRUE)
PLAY_YOGAMOVE_IDLE_ANIMATION(Yoga)
Yoga.iBreathingValue = 0
Yoga.iShakeTimer = 0
Yoga.iInhaleSoundID = GET_SOUND_ID()
Yoga.iExhaleSoundID = GET_SOUND_ID()
Yoga.iFailSoundID = GET_SOUND_ID()
Yoga.iBreathingCounter = 0
Yoga.iBreathsCompleted = 0
Yoga.iInhaleTimer = 0
Yoga.iExhaleTimer = 0
Yoga.bInhaleInProgress = FALSE
Yoga.bExhaleInProgress = FALSE
Yoga.bInhaleCompleted = FALSE
Yoga.bExhaleCompleted = FALSE
Yoga.bBreathCompleted = FALSE
Yoga.bBreathingPassed = FALSE
Yoga.bInhaleFailed = FALSE
Yoga.bExhaleFailed = FALSE
Yoga.bHelpTextDelayDone = FALSE
Yoga.eYogaMinigameStage = YOGAMINIGAMESTAGE_DOMOVE
Yoga.fValue = 32.0
Yoga.bChangeCamera = FALSE
Yoga.bChangePoseFacial = FALSE
HELP_STICKS_TRIGGERED = FALSE
HELP_INHALE_TRIGGERED = FALSE
HELP_EXHALE_TRIGGERED = FALSE
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Finished yoga minigame setup.")
#ENDIF
ENDIF
ENDIF
BREAK
CASE YOGAMINIGAMESTAGE_DOMOVE
IF IS_YOGAMOVE_COMPLETED(Yoga, eMove, 3, bPlayEndPoseAnimation, 1.15, bDisplayHelpText, bDelayBreathing)
Yoga.eYogaMinigameStage = YOGAMINIGAMESTAGE_PASSED
ELSE
IF ( Yoga.eYogaMoveStage = YOGAMOVESTAGE_FAILED )
Yoga.eYogaMinigameStage = YOGAMINIGAMESTAGE_DOFAIL
ENDIF
ENDIF
IF ( Yoga.eYogaMoveStage <> YOGAMOVESTAGE_PLAY_ENDPOSE_ANIMATION ) //draw scaleform for all move stages
AND ( Yoga.eYogaMoveStage <> YOGAMOVESTAGE_FINISHED ) //apart from playing endpose animation and finished stage
DRAW_YOGAMOVE_SCALEFORM(Yoga, eMove)
ENDIF
BREAK
CASE YOGAMINIGAMESTAGE_DOFAIL
STOP_SOUND(Yoga.iInhaleSoundID)
STOP_SOUND(Yoga.iExhaleSoundID)
PLAY_SOUND_FROM_ENTITY(Yoga.iFailSoundID, "YOGA_FAIL", Yoga.PedIndex, "FAMILY_5_SOUNDS")
Yoga.iFailCounter++
Yoga.bFailing = TRUE
Yoga.iFailedPose = Yoga.iPosesCompleted
Yoga.iFailCameraCutTimer = 0
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Move failed at pose ", Yoga.iFailedPose, ". Number of times failed in this move is ", Yoga.iFailCounter, ".")
#ENDIF
//reset variables used to do yoga moves
Yoga.iBreathingValue = 0
Yoga.iPosesCompleted = 0
Yoga.iBreathingCounter = 0
Yoga.iBreathsCompleted = 0
Yoga.bInhaleInProgress = FALSE
Yoga.bBreathCompleted = FALSE
Yoga.bBreathingPassed = FALSE
Yoga.bInhaleSoundTriggered = FALSE
Yoga.bExhaleSoundTriggered = FALSE
Yoga.bInhaleFailed = FALSE
Yoga.bExhaleFailed = FALSE
Yoga.bChangeCamera = FALSE
Yoga.bChangePoseFacial = FALSE
Yoga.fModifierStrengthMax = 0.0
Yoga.fBlushDecalAlpha = CLAMP(Yoga.fBlushDecalAlpha - 0.08, 0.0, 0.5)
Yoga.bAmbientSpeechPlayed = FALSE
CLEANUP_AND_REMOVE_YOGA_SCALEFORM(siYogaScaleform) //remove yoga scaleform movie and reset the scaleform data
IF IS_PC_VERSION()
CLEANUP_AND_REMOVE_YOGA_SCALEFORM(siYogaScaleformKBM)
ENDIF
CLEAR_PED_SECONDARY_TASK(Yoga.PedIndex)
CLEAR_FACIAL_IDLE_ANIM_OVERRIDE(Yoga.PedIndex)
IF NOT IS_PED_INJURED(Yoga.PedIndex)
CLEAR_PED_DAMAGE_DECAL_BY_ZONE(Yoga.PedIndex, PDZ_HEAD, "blushing")
APPLY_PED_DAMAGE_DECAL(Yoga.PedIndex, PDZ_HEAD, 0.50, 0.513, 0.0, 1.0, Yoga.fBlushDecalAlpha, 0, FALSE, "blushing")
ENDIF
SWITCH GET_RANDOM_INT_IN_RANGE(1, 7)
CASE 1
PLAY_FACIAL_ANIM(Yoga.PedIndex, "pain_1")
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Playing facial animation pain_1.")
#ENDIF
BREAK
CASE 2
PLAY_FACIAL_ANIM(Yoga.PedIndex, "pain_2")
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Playing facial animation pain_2.")
#ENDIF
BREAK
CASE 3
PLAY_FACIAL_ANIM(Yoga.PedIndex, "pain_3")
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Playing facial animation pain_3.")
#ENDIF
BREAK
CASE 4
PLAY_FACIAL_ANIM(Yoga.PedIndex, "pain_4")
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Playing facial animation pain_4.")
#ENDIF
BREAK
CASE 5
PLAY_FACIAL_ANIM(Yoga.PedIndex, "pain_5")
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Playing facial animation pain_5.")
#ENDIF
BREAK
CASE 6
PLAY_FACIAL_ANIM(Yoga.PedIndex, "pain_6")
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Playing facial animation pain_6.")
#ENDIF
BREAK
ENDSWITCH
PLAY_YOGAMOVE_FAIL_ANIMATION(Yoga)
Yoga.iTimer = GET_GAME_TIMER()
Yoga.iShakeTimer = 0
CLEAR_HELP()
HELP_STICKS_TRIGGERED = FALSE
HELP_INHALE_TRIGGERED = FALSE
HELP_EXHALE_TRIGGERED = FALSE
Yoga.eYogaMinigameStage = YOGAMINIGAMESTAGE_WAITFAIL
BREAK
CASE YOGAMINIGAMESTAGE_WAITFAIL
IF HAS_TIME_PASSED_ON_TIMER(1000, Yoga.iTimer)
Yoga.bFailing = FALSE
ENDIF
IF ( bPlayAmbientSpeech = TRUE )
IF HAS_TIME_PASSED_ON_TIMER(1000, Yoga.iTimer)
IF ( Yoga.bAmbientSpeechPlayed = FALSE )
IF NOT IS_AMBIENT_SPEECH_PLAYING(Yoga.PedIndex)
SWITCH GET_RANDOM_INT_IN_RANGE(0, 3)
CASE 0
PLAY_PED_AMBIENT_SPEECH(Yoga.PedIndex, "GENERIC_CURSE_MED", SPEECH_PARAMS_FORCE_NORMAL)
BREAK
ENDSWITCH
Yoga.bAmbientSpeechPlayed = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
IF HAS_TIME_PASSED_ON_TIMER(2500, Yoga.iTimer)
Yoga.iTimer = GET_GAME_TIMER()
Yoga.eYogaMinigameStage = YOGAMINIGAMESTAGE_FAILRESET
ENDIF
BREAK
CASE YOGAMINIGAMESTAGE_FAILRESET
siYogaScaleform = REQUEST_SCALEFORM_MOVIE("yoga_buttons")
IF IS_PC_VERSION()
siYogaScaleformKBM = REQUEST_SCALEFORM_MOVIE("yoga_keys")
ENDIF
IF HAS_YOGA_SCALEFORM_LOADED()
IF NOT DOES_CAM_EXIST(YogaFailCamera)
IF IS_PED_AT_LAST_STAGE_OF_SEQUENCE(Yoga.PedIndex, 2)
PLAY_YOGAMOVE_IDLE_ANIMATION(Yoga)
Yoga.eYogaMoveStage = YOGAMOVESTAGE_DOINGPOSES
Yoga.eYogaMinigameStage = YOGAMINIGAMESTAGE_DOMOVE
ENDIF
ELSE
IF HAS_TIME_PASSED_ON_TIMER(3000, Yoga.iTimer)
IF NOT IS_PED_INJURED(Yoga.PedIndex)
CLEAR_PED_TASKS_IMMEDIATELY(Yoga.PedIndex)
PLAY_YOGAMOVE_IDLE_ANIMATION(Yoga, TRUE)
Yoga.iTimer = GET_GAME_TIMER()
Yoga.eYogaMinigameStage = YOGAMINIGAMESTAGE_RESTART
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
CASE YOGAMINIGAMESTAGE_RESTART
IF IS_PED_AT_LAST_STAGE_OF_SEQUENCE(Yoga.PedIndex, 2)
Yoga.eYogaMoveStage = YOGAMOVESTAGE_DOINGPOSES
Yoga.eYogaMinigameStage = YOGAMINIGAMESTAGE_DOMOVE
ENDIF
BREAK
CASE YOGAMINIGAMESTAGE_PASSED
IF HAS_SOUND_FINISHED(Yoga.iExhaleSoundID) //make sure exhale sound is not playing
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Yoga minigame completed successfully.")
#ENDIF
IF IS_ANY_YOGA_HELP_MESSAGE_BEING_DISPLAYED() //clear any yoga minigame help that is currently displayed
CLEAR_HELP()
HELP_STICKS_TRIGGERED = FALSE
HELP_INHALE_TRIGGERED = FALSE
HELP_EXHALE_TRIGGERED = FALSE
ENDIF
INCREMENT_PLAYER_PED_STAT(GET_PLAYER_PED_ENUM(Yoga.PedIndex), PS_STAMINA, iPedStatIncrease)
INCREMENT_PLAYER_PED_STAT(GET_PLAYER_PED_ENUM(Yoga.PedIndex), PS_STRENGTH, iPedStatIncrease)
INCREMENT_PLAYER_PED_STAT(GET_PLAYER_PED_ENUM(Yoga.PedIndex), PS_LUNG_CAPACITY, iPedStatIncrease)
//BAWSAQ_INCREMENT_MODIFIER(BSMF_YOGATIMES) //inform the game stats that yoga minigame was completed successfully
STOP_SOUND(Yoga.iFailSoundID)
STOP_SOUND(Yoga.iInhaleSoundID)
RELEASE_SOUND_ID(Yoga.iFailSoundID)
RELEASE_SOUND_ID(Yoga.iInhaleSoundID)
RELEASE_SOUND_ID(Yoga.iExhaleSoundID)
CLEAR_PED_SECONDARY_TASK(Yoga.PedIndex)
CLEAR_FACIAL_IDLE_ANIM_OVERRIDE(Yoga.PedIndex)
SET_FORCE_FOOTSTEP_UPDATE(Yoga.PedIndex, FALSE)
CLEANUP_AND_REMOVE_YOGA_SCALEFORM(siYogaScaleform) //remove yoga scaleform movies
IF IS_PC_VERSION()
CLEANUP_AND_REMOVE_YOGA_SCALEFORM(siYogaScaleformKBM)
ENDIF
SET_SCALEFORM_MOVIE_AS_NO_LONGER_NEEDED(siYogaScaleform)
IF IS_PC_VERSION()
SET_SCALEFORM_MOVIE_AS_NO_LONGER_NEEDED(siYogaScaleformKBM)
ENDIF
IF DOES_CAM_EXIST(YogaFailCamera)
SET_CAM_ACTIVE(YogaFailCamera, FALSE)
DESTROY_CAM(YogaFailCamera)
ENDIF
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Yoga.iInhaleSoundID is ", Yoga.iInhaleSoundID, ".")
#ENDIF
Yoga.eYogaMinigameStage = YOGAMINIGAMESTAGE_FINISHED
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ": Yoga minigame finished.")
#ENDIF
ENDIF
BREAK
CASE YOGAMINIGAMESTAGE_FINISHED
BAWSAQ_INCREMENT_MODIFIER(BSMF_SM_YOGA) //stockmarket #1514495
RETURN TRUE
BREAK
ENDSWITCH
RETURN FALSE
ENDFUNC