//|=======================================================================================| //| 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