1819 lines
89 KiB
XML
Executable File
1819 lines
89 KiB
XML
Executable File
USING "minigames_helpers.sch"
|
|
USING "minigame_UIInputs.sch"
|
|
USING "friendActivity_public.sch"
|
|
//USING "family_scene_private.sch"
|
|
|
|
USING "tennis.sch"
|
|
USING "tennis_player.sch"
|
|
USING "tennis_player_lib.sch"
|
|
USING "tennis_court.sch"
|
|
USING "tennis_court_lib.sch"
|
|
USING "tennis_ball_lib.sch"
|
|
USING "tennis_cameras.sch"
|
|
USING "tennis_cameras_lib.sch"
|
|
USING "fmmc_mp_setup_mission.sch"
|
|
USING "socialclub_leaderboard.sch"
|
|
USING "stats_private.sch"
|
|
USING "tennis_leaderboard_lib.sch"
|
|
USING "family_scene_private.sch"
|
|
USING "cheat_controller_public.sch"
|
|
|
|
|
|
|
|
/// ************************************************************* PROCEDURES *************************************************************
|
|
//#IF IS_DEBUG_BUILD
|
|
// PROC INIT_OFFSETS(TENNIS_GAME_PROPERTIES &thisProps)
|
|
// thisProps.xRacketOff = thisProps.RacketOffX
|
|
// thisProps.yRacketOff = thisProps.RacketOffY
|
|
// thisProps.zRacketOff = thisProps.RacketOffZ
|
|
// thisProps.xRacketRot = thisProps.RacketRotX
|
|
// thisProps.yRacketRot = thisProps.RacketRotY
|
|
// thisProps.zRacketRot = thisProps.RacketRotZ
|
|
// ENDPROC
|
|
//#ENDIF
|
|
|
|
PROC INITIALIZE_TENNIS_SWING_STATE_PHASES(TENNIS_GAME_PROPERTIES &thisProps)
|
|
CPRINTLN(DEBUG_TENNIS, "INITIALIZE_TENNIS_SWING_STATE_PHASES called")
|
|
thisProps.phasesArray[TSS_BACKHAND_BS_HI].fInit = 0.0
|
|
thisProps.phasesArray[TSS_BACKHAND_BS_HI].fActive = 0.167
|
|
thisProps.phasesArray[TSS_BACKHAND_BS_HI].fEnd = 0.633
|
|
thisProps.phasesArray[TSS_BACKHAND_BS_HI].iFrameTot = 48
|
|
thisProps.phasesArray[TSS_BACKHAND_BS_HI].sAnimName = "backhand_bs_hi"
|
|
|
|
thisProps.phasesArray[TSS_BACKHAND_BS_LOW].fInit = 0.0
|
|
thisProps.phasesArray[TSS_BACKHAND_BS_LOW].fActive = 0.143
|
|
thisProps.phasesArray[TSS_BACKHAND_BS_LOW].fEnd = 0.633
|
|
thisProps.phasesArray[TSS_BACKHAND_BS_LOW].iFrameTot = 56
|
|
thisProps.phasesArray[TSS_BACKHAND_BS_LOW].sAnimName = "backhand_bs_lo"
|
|
|
|
thisProps.phasesArray[TSS_BACKHAND_BS_MID].fInit = 0.0
|
|
thisProps.phasesArray[TSS_BACKHAND_BS_MID].fActive = 0.150
|
|
thisProps.phasesArray[TSS_BACKHAND_BS_MID].fEnd = 0.633
|
|
thisProps.phasesArray[TSS_BACKHAND_BS_MID].iFrameTot = 46
|
|
thisProps.phasesArray[TSS_BACKHAND_BS_MID].sAnimName = "backhand_bs_md"
|
|
|
|
thisProps.phasesArray[TSS_BACKHAND_TS_HI].fInit = 0.0
|
|
thisProps.phasesArray[TSS_BACKHAND_TS_HI].fActive = 0.140
|
|
thisProps.phasesArray[TSS_BACKHAND_TS_HI].fEnd = 0.530
|
|
thisProps.phasesArray[TSS_BACKHAND_TS_HI].iFrameTot = 58
|
|
thisProps.phasesArray[TSS_BACKHAND_TS_HI].sAnimName = "backhand_ts_hi"
|
|
|
|
thisProps.phasesArray[TSS_BACKHAND_TS_LOW].fInit = 0.0
|
|
thisProps.phasesArray[TSS_BACKHAND_TS_LOW].fActive = 0.150
|
|
thisProps.phasesArray[TSS_BACKHAND_TS_LOW].fEnd = 0.535
|
|
thisProps.phasesArray[TSS_BACKHAND_TS_LOW].iFrameTot = 54
|
|
thisProps.phasesArray[TSS_BACKHAND_TS_LOW].sAnimName = "backhand_ts_lo"
|
|
|
|
thisProps.phasesArray[TSS_BACKHAND_TS_MID].fInit = 0.0
|
|
thisProps.phasesArray[TSS_BACKHAND_TS_MID].fActive = 0.170
|
|
thisProps.phasesArray[TSS_BACKHAND_TS_MID].fEnd = 0.665
|
|
thisProps.phasesArray[TSS_BACKHAND_TS_MID].iFrameTot = 46
|
|
thisProps.phasesArray[TSS_BACKHAND_TS_MID].sAnimName = "backhand_ts_md"
|
|
|
|
thisProps.phasesArray[TSS_BACKHAND_BS_HI_SKIP].fInit = 0.125
|
|
thisProps.phasesArray[TSS_BACKHAND_BS_HI_SKIP].fActive = 0.167
|
|
thisProps.phasesArray[TSS_BACKHAND_BS_HI_SKIP].fEnd = 0.633
|
|
thisProps.phasesArray[TSS_BACKHAND_BS_HI_SKIP].iFrameTot = 48
|
|
thisProps.phasesArray[TSS_BACKHAND_BS_HI_SKIP].sAnimName = "backhand_bs_hi"
|
|
|
|
thisProps.phasesArray[TSS_BACKHAND_BS_LOW_SKIP].fInit = 0.089
|
|
thisProps.phasesArray[TSS_BACKHAND_BS_LOW_SKIP].fActive = 0.143
|
|
thisProps.phasesArray[TSS_BACKHAND_BS_LOW_SKIP].fEnd = 0.633
|
|
thisProps.phasesArray[TSS_BACKHAND_BS_LOW_SKIP].iFrameTot = 56
|
|
thisProps.phasesArray[TSS_BACKHAND_BS_LOW_SKIP].sAnimName = "backhand_bs_lo"
|
|
|
|
thisProps.phasesArray[TSS_BACKHAND_BS_MID_SKIP].fInit = 0.108
|
|
thisProps.phasesArray[TSS_BACKHAND_BS_MID_SKIP].fActive = 0.150
|
|
thisProps.phasesArray[TSS_BACKHAND_BS_MID_SKIP].fEnd = 0.633
|
|
thisProps.phasesArray[TSS_BACKHAND_BS_MID_SKIP].iFrameTot = 46
|
|
thisProps.phasesArray[TSS_BACKHAND_BS_MID_SKIP].sAnimName = "backhand_bs_md"
|
|
|
|
thisProps.phasesArray[TSS_BACKHAND_TS_HI_SKIP].fInit = 0.086
|
|
thisProps.phasesArray[TSS_BACKHAND_TS_HI_SKIP].fActive = 0.120
|
|
thisProps.phasesArray[TSS_BACKHAND_TS_HI_SKIP].fEnd = 0.530
|
|
thisProps.phasesArray[TSS_BACKHAND_TS_HI_SKIP].iFrameTot = 58
|
|
thisProps.phasesArray[TSS_BACKHAND_TS_HI_SKIP].sAnimName = "backhand_ts_hi"
|
|
|
|
thisProps.phasesArray[TSS_BACKHAND_TS_LOW_SKIP].fInit = 0.0925
|
|
thisProps.phasesArray[TSS_BACKHAND_TS_LOW_SKIP].fActive = 0.150
|
|
thisProps.phasesArray[TSS_BACKHAND_TS_LOW_SKIP].fEnd = 0.535
|
|
thisProps.phasesArray[TSS_BACKHAND_TS_LOW_SKIP].iFrameTot = 54
|
|
thisProps.phasesArray[TSS_BACKHAND_TS_LOW_SKIP].sAnimName = "backhand_ts_lo"
|
|
|
|
thisProps.phasesArray[TSS_BACKHAND_TS_MID_SKIP].fInit = 0.108
|
|
thisProps.phasesArray[TSS_BACKHAND_TS_MID_SKIP].fActive = 0.160
|
|
thisProps.phasesArray[TSS_BACKHAND_TS_MID_SKIP].fEnd = 0.665
|
|
thisProps.phasesArray[TSS_BACKHAND_TS_MID_SKIP].iFrameTot = 46
|
|
thisProps.phasesArray[TSS_BACKHAND_TS_MID_SKIP].sAnimName = "backhand_ts_md"
|
|
|
|
thisProps.phasesArray[TSS_CLOSE_BH_BS_LOW].fInit = 0.0
|
|
thisProps.phasesArray[TSS_CLOSE_BH_BS_LOW].fActive = 0.300
|
|
thisProps.phasesArray[TSS_CLOSE_BH_BS_LOW].fEnd = 0.580
|
|
thisProps.phasesArray[TSS_CLOSE_BH_BS_LOW].iFrameTot = 46
|
|
thisProps.phasesArray[TSS_CLOSE_BH_BS_LOW].sAnimName = "close_bh_bs_lo"
|
|
|
|
thisProps.phasesArray[TSS_CLOSE_BH_BS_MID].fInit = 0.0
|
|
thisProps.phasesArray[TSS_CLOSE_BH_BS_MID].fActive = 0.300
|
|
thisProps.phasesArray[TSS_CLOSE_BH_BS_MID].fEnd = 0.585
|
|
thisProps.phasesArray[TSS_CLOSE_BH_BS_MID].iFrameTot = 46
|
|
thisProps.phasesArray[TSS_CLOSE_BH_BS_MID].sAnimName = "close_bh_bs_md"
|
|
|
|
thisProps.phasesArray[TSS_CLOSE_BH_BS_HI].fInit = 0.0
|
|
thisProps.phasesArray[TSS_CLOSE_BH_BS_HI].fActive = 0.290
|
|
thisProps.phasesArray[TSS_CLOSE_BH_BS_HI].fEnd = 0.630
|
|
thisProps.phasesArray[TSS_CLOSE_BH_BS_HI].iFrameTot = 48
|
|
thisProps.phasesArray[TSS_CLOSE_BH_BS_HI].sAnimName = "close_bh_bs_hi"
|
|
|
|
thisProps.phasesArray[TSS_CLOSE_BH_TS_LOW].fInit = 0.0
|
|
thisProps.phasesArray[TSS_CLOSE_BH_TS_LOW].fActive = 0.280
|
|
thisProps.phasesArray[TSS_CLOSE_BH_TS_LOW].fEnd = 0.708
|
|
thisProps.phasesArray[TSS_CLOSE_BH_TS_LOW].iFrameTot = 50
|
|
thisProps.phasesArray[TSS_CLOSE_BH_TS_LOW].sAnimName = "close_bh_ts_lo"
|
|
|
|
thisProps.phasesArray[TSS_CLOSE_BH_TS_MID].fInit = 0.0
|
|
thisProps.phasesArray[TSS_CLOSE_BH_TS_MID].fActive = 0.260
|
|
thisProps.phasesArray[TSS_CLOSE_BH_TS_MID].fEnd = 0.710
|
|
thisProps.phasesArray[TSS_CLOSE_BH_TS_MID].iFrameTot = 54
|
|
thisProps.phasesArray[TSS_CLOSE_BH_TS_MID].sAnimName = "close_bh_ts_md"
|
|
|
|
thisProps.phasesArray[TSS_CLOSE_BH_TS_HI].fInit = 0.0
|
|
thisProps.phasesArray[TSS_CLOSE_BH_TS_HI].fActive = 0.260
|
|
thisProps.phasesArray[TSS_CLOSE_BH_TS_HI].fEnd = 0.643
|
|
thisProps.phasesArray[TSS_CLOSE_BH_TS_HI].iFrameTot = 54
|
|
thisProps.phasesArray[TSS_CLOSE_BH_TS_HI].sAnimName = "close_bh_ts_hi"
|
|
|
|
thisProps.phasesArray[TSS_CLOSE_BH_BS_LOW_SKIP].fInit = 0.174
|
|
thisProps.phasesArray[TSS_CLOSE_BH_BS_LOW_SKIP].fActive = thisProps.phasesArray[TSS_CLOSE_BH_BS_LOW].fActive
|
|
thisProps.phasesArray[TSS_CLOSE_BH_BS_LOW_SKIP].fEnd = thisProps.phasesArray[TSS_CLOSE_BH_BS_LOW].fEnd
|
|
thisProps.phasesArray[TSS_CLOSE_BH_BS_LOW_SKIP].iFrameTot = thisProps.phasesArray[TSS_CLOSE_BH_BS_LOW].iFrameTot
|
|
thisProps.phasesArray[TSS_CLOSE_BH_BS_LOW_SKIP].sAnimName = "close_bh_bs_lo"
|
|
|
|
thisProps.phasesArray[TSS_CLOSE_BH_BS_MID_SKIP].fInit = 0.217
|
|
thisProps.phasesArray[TSS_CLOSE_BH_BS_MID_SKIP].fActive = thisProps.phasesArray[TSS_CLOSE_BH_BS_MID].fActive
|
|
thisProps.phasesArray[TSS_CLOSE_BH_BS_MID_SKIP].fEnd = thisProps.phasesArray[TSS_CLOSE_BH_BS_MID].fEnd
|
|
thisProps.phasesArray[TSS_CLOSE_BH_BS_MID_SKIP].iFrameTot = thisProps.phasesArray[TSS_CLOSE_BH_BS_MID].iFrameTot
|
|
thisProps.phasesArray[TSS_CLOSE_BH_BS_MID_SKIP].sAnimName = "close_bh_bs_md"
|
|
|
|
thisProps.phasesArray[TSS_CLOSE_BH_BS_HI_SKIP].fInit = 0.208
|
|
thisProps.phasesArray[TSS_CLOSE_BH_BS_HI_SKIP].fActive = thisProps.phasesArray[TSS_CLOSE_BH_BS_HI].fActive
|
|
thisProps.phasesArray[TSS_CLOSE_BH_BS_HI_SKIP].fEnd = thisProps.phasesArray[TSS_CLOSE_BH_BS_HI].fEnd
|
|
thisProps.phasesArray[TSS_CLOSE_BH_BS_HI_SKIP].iFrameTot = thisProps.phasesArray[TSS_CLOSE_BH_BS_HI].iFrameTot
|
|
thisProps.phasesArray[TSS_CLOSE_BH_BS_HI_SKIP].sAnimName = "close_bh_bs_hi"
|
|
|
|
thisProps.phasesArray[TSS_CLOSE_BH_TS_LOW_SKIP].fInit = 0.120
|
|
thisProps.phasesArray[TSS_CLOSE_BH_TS_LOW_SKIP].fActive = thisProps.phasesArray[TSS_CLOSE_BH_TS_LOW].fActive
|
|
thisProps.phasesArray[TSS_CLOSE_BH_TS_LOW_SKIP].fEnd = thisProps.phasesArray[TSS_CLOSE_BH_TS_LOW].fEnd
|
|
thisProps.phasesArray[TSS_CLOSE_BH_TS_LOW_SKIP].iFrameTot = thisProps.phasesArray[TSS_CLOSE_BH_TS_LOW].iFrameTot
|
|
thisProps.phasesArray[TSS_CLOSE_BH_TS_LOW_SKIP].sAnimName = "close_bh_ts_lo"
|
|
|
|
thisProps.phasesArray[TSS_CLOSE_BH_TS_MID_SKIP].fInit = 0.148
|
|
thisProps.phasesArray[TSS_CLOSE_BH_TS_MID_SKIP].fActive = thisProps.phasesArray[TSS_CLOSE_BH_TS_MID].fActive
|
|
thisProps.phasesArray[TSS_CLOSE_BH_TS_MID_SKIP].fEnd = thisProps.phasesArray[TSS_CLOSE_BH_TS_MID].fEnd
|
|
thisProps.phasesArray[TSS_CLOSE_BH_TS_MID_SKIP].iFrameTot = thisProps.phasesArray[TSS_CLOSE_BH_TS_MID].iFrameTot
|
|
thisProps.phasesArray[TSS_CLOSE_BH_TS_MID_SKIP].sAnimName = "close_bh_ts_md"
|
|
|
|
thisProps.phasesArray[TSS_CLOSE_BH_TS_HI_SKIP].fInit = 0.090
|
|
thisProps.phasesArray[TSS_CLOSE_BH_TS_HI_SKIP].fActive = thisProps.phasesArray[TSS_CLOSE_BH_TS_HI].fActive
|
|
thisProps.phasesArray[TSS_CLOSE_BH_TS_HI_SKIP].fEnd = thisProps.phasesArray[TSS_CLOSE_BH_TS_HI].fEnd
|
|
thisProps.phasesArray[TSS_CLOSE_BH_TS_HI_SKIP].iFrameTot = thisProps.phasesArray[TSS_CLOSE_BH_TS_HI].iFrameTot
|
|
thisProps.phasesArray[TSS_CLOSE_BH_TS_HI_SKIP].sAnimName = "close_bh_ts_hi"
|
|
|
|
thisProps.phasesArray[TSS_CLOSE_FH_BS_LOW].fInit = 0.0
|
|
thisProps.phasesArray[TSS_CLOSE_FH_BS_LOW].fActive = 0.270
|
|
thisProps.phasesArray[TSS_CLOSE_FH_BS_LOW].fEnd = 0.613
|
|
thisProps.phasesArray[TSS_CLOSE_FH_BS_LOW].iFrameTot = 56
|
|
thisProps.phasesArray[TSS_CLOSE_FH_BS_LOW].sAnimName = "close_fh_bs_lo"
|
|
|
|
thisProps.phasesArray[TSS_CLOSE_FH_BS_MID].fInit = 0.0
|
|
thisProps.phasesArray[TSS_CLOSE_FH_BS_MID].fActive = 0.270
|
|
thisProps.phasesArray[TSS_CLOSE_FH_BS_MID].fEnd = 0.533
|
|
thisProps.phasesArray[TSS_CLOSE_FH_BS_MID].iFrameTot = 57
|
|
thisProps.phasesArray[TSS_CLOSE_FH_BS_MID].sAnimName = "close_fh_bs_md"
|
|
|
|
thisProps.phasesArray[TSS_CLOSE_FH_BS_HI].fInit = 0.0
|
|
thisProps.phasesArray[TSS_CLOSE_FH_BS_HI].fActive = 0.280
|
|
thisProps.phasesArray[TSS_CLOSE_FH_BS_HI].fEnd = 0.690
|
|
thisProps.phasesArray[TSS_CLOSE_FH_BS_HI].iFrameTot = 53
|
|
thisProps.phasesArray[TSS_CLOSE_FH_BS_HI].sAnimName = "close_fh_bs_hi"
|
|
|
|
thisProps.phasesArray[TSS_CLOSE_FH_TS_LOW].fInit = 0.0
|
|
thisProps.phasesArray[TSS_CLOSE_FH_TS_LOW].fActive = 0.260
|
|
thisProps.phasesArray[TSS_CLOSE_FH_TS_LOW].fEnd = 0.665
|
|
thisProps.phasesArray[TSS_CLOSE_FH_TS_LOW].iFrameTot = 57
|
|
thisProps.phasesArray[TSS_CLOSE_FH_TS_LOW].sAnimName = "close_fh_ts_lo"
|
|
|
|
thisProps.phasesArray[TSS_CLOSE_FH_TS_MID].fInit = 0.0
|
|
thisProps.phasesArray[TSS_CLOSE_FH_TS_MID].fActive = 0.280
|
|
thisProps.phasesArray[TSS_CLOSE_FH_TS_MID].fEnd = 0.782
|
|
thisProps.phasesArray[TSS_CLOSE_FH_TS_MID].iFrameTot = 55
|
|
thisProps.phasesArray[TSS_CLOSE_FH_TS_MID].sAnimName = "close_fh_ts_md"
|
|
|
|
thisProps.phasesArray[TSS_CLOSE_FH_TS_HI].fInit = 0.0
|
|
thisProps.phasesArray[TSS_CLOSE_FH_TS_HI].fActive = 0.240
|
|
thisProps.phasesArray[TSS_CLOSE_FH_TS_HI].fEnd = 0.698
|
|
thisProps.phasesArray[TSS_CLOSE_FH_TS_HI].iFrameTot = 62
|
|
thisProps.phasesArray[TSS_CLOSE_FH_TS_HI].sAnimName = "close_fh_ts_hi"
|
|
|
|
thisProps.phasesArray[TSS_CLOSE_FH_BS_LOW_SKIP].fInit = 0.135
|
|
thisProps.phasesArray[TSS_CLOSE_FH_BS_LOW_SKIP].fActive = thisProps.phasesArray[TSS_CLOSE_FH_BS_LOW].fActive
|
|
thisProps.phasesArray[TSS_CLOSE_FH_BS_LOW_SKIP].fEnd = thisProps.phasesArray[TSS_CLOSE_FH_BS_LOW].fEnd
|
|
thisProps.phasesArray[TSS_CLOSE_FH_BS_LOW_SKIP].iFrameTot = thisProps.phasesArray[TSS_CLOSE_FH_BS_LOW].iFrameTot
|
|
thisProps.phasesArray[TSS_CLOSE_FH_BS_LOW_SKIP].sAnimName = "close_fh_bs_lo"
|
|
|
|
thisProps.phasesArray[TSS_CLOSE_FH_BS_MID_SKIP].fInit = 0.173
|
|
thisProps.phasesArray[TSS_CLOSE_FH_BS_MID_SKIP].fActive = thisProps.phasesArray[TSS_CLOSE_FH_BS_MID].fActive
|
|
thisProps.phasesArray[TSS_CLOSE_FH_BS_MID_SKIP].fEnd = thisProps.phasesArray[TSS_CLOSE_FH_BS_MID].fEnd
|
|
thisProps.phasesArray[TSS_CLOSE_FH_BS_MID_SKIP].iFrameTot = thisProps.phasesArray[TSS_CLOSE_FH_BS_MID].iFrameTot
|
|
thisProps.phasesArray[TSS_CLOSE_FH_BS_MID_SKIP].sAnimName = "close_fh_bs_md"
|
|
|
|
thisProps.phasesArray[TSS_CLOSE_FH_BS_HI_SKIP].fInit = 0.120
|
|
thisProps.phasesArray[TSS_CLOSE_FH_BS_HI_SKIP].fActive = thisProps.phasesArray[TSS_CLOSE_FH_BS_HI].fActive
|
|
thisProps.phasesArray[TSS_CLOSE_FH_BS_HI_SKIP].fEnd = thisProps.phasesArray[TSS_CLOSE_FH_BS_HI].fEnd
|
|
thisProps.phasesArray[TSS_CLOSE_FH_BS_HI_SKIP].iFrameTot = thisProps.phasesArray[TSS_CLOSE_FH_BS_HI].iFrameTot
|
|
thisProps.phasesArray[TSS_CLOSE_FH_BS_HI_SKIP].sAnimName = "close_fh_bs_hi"
|
|
|
|
thisProps.phasesArray[TSS_CLOSE_FH_TS_LOW_SKIP].fInit = 0.148
|
|
thisProps.phasesArray[TSS_CLOSE_FH_TS_LOW_SKIP].fActive = thisProps.phasesArray[TSS_CLOSE_FH_TS_LOW].fActive
|
|
thisProps.phasesArray[TSS_CLOSE_FH_TS_LOW_SKIP].fEnd = thisProps.phasesArray[TSS_CLOSE_FH_TS_LOW].fEnd
|
|
thisProps.phasesArray[TSS_CLOSE_FH_TS_LOW_SKIP].iFrameTot = thisProps.phasesArray[TSS_CLOSE_FH_TS_LOW].iFrameTot
|
|
thisProps.phasesArray[TSS_CLOSE_FH_TS_LOW_SKIP].sAnimName = "close_fh_ts_lo"
|
|
|
|
thisProps.phasesArray[TSS_CLOSE_FH_TS_MID_SKIP].fInit = 0.160
|
|
thisProps.phasesArray[TSS_CLOSE_FH_TS_MID_SKIP].fActive = thisProps.phasesArray[TSS_CLOSE_FH_TS_MID].fActive
|
|
thisProps.phasesArray[TSS_CLOSE_FH_TS_MID_SKIP].fEnd = thisProps.phasesArray[TSS_CLOSE_FH_TS_MID].fEnd
|
|
thisProps.phasesArray[TSS_CLOSE_FH_TS_MID_SKIP].iFrameTot = thisProps.phasesArray[TSS_CLOSE_FH_TS_MID].iFrameTot
|
|
thisProps.phasesArray[TSS_CLOSE_FH_TS_MID_SKIP].sAnimName = "close_fh_ts_md"
|
|
|
|
thisProps.phasesArray[TSS_CLOSE_FH_TS_HI_SKIP].fInit = 0.155
|
|
thisProps.phasesArray[TSS_CLOSE_FH_TS_HI_SKIP].fActive = thisProps.phasesArray[TSS_CLOSE_FH_TS_HI].fActive
|
|
thisProps.phasesArray[TSS_CLOSE_FH_TS_HI_SKIP].fEnd = thisProps.phasesArray[TSS_CLOSE_FH_TS_HI].fEnd
|
|
thisProps.phasesArray[TSS_CLOSE_FH_TS_HI_SKIP].iFrameTot = thisProps.phasesArray[TSS_CLOSE_FH_TS_HI].iFrameTot
|
|
thisProps.phasesArray[TSS_CLOSE_FH_TS_HI_SKIP].sAnimName = "close_fh_ts_hi"
|
|
|
|
thisProps.phasesArray[TSS_FOREHAND_BS_HI].fInit = 0.0
|
|
thisProps.phasesArray[TSS_FOREHAND_BS_HI].fActive = 0.210
|
|
thisProps.phasesArray[TSS_FOREHAND_BS_HI].fEnd = 0.700
|
|
thisProps.phasesArray[TSS_FOREHAND_BS_HI].iFrameTot = 43
|
|
thisProps.phasesArray[TSS_FOREHAND_BS_HI].sAnimName = "forehand_bs_hi"
|
|
|
|
thisProps.phasesArray[TSS_FOREHAND_BS_LOW].fInit = 0.0
|
|
thisProps.phasesArray[TSS_FOREHAND_BS_LOW].fActive = 0.160
|
|
thisProps.phasesArray[TSS_FOREHAND_BS_LOW].fEnd = 0.670
|
|
thisProps.phasesArray[TSS_FOREHAND_BS_LOW].iFrameTot = 46
|
|
thisProps.phasesArray[TSS_FOREHAND_BS_LOW].sAnimName = "forehand_bs_lo"
|
|
|
|
thisProps.phasesArray[TSS_FOREHAND_BS_MID].fInit = 0.0
|
|
thisProps.phasesArray[TSS_FOREHAND_BS_MID].fActive = 0.180
|
|
thisProps.phasesArray[TSS_FOREHAND_BS_MID].fEnd = 0.600
|
|
thisProps.phasesArray[TSS_FOREHAND_BS_MID].iFrameTot = 46
|
|
thisProps.phasesArray[TSS_FOREHAND_BS_MID].sAnimName = "forehand_bs_md"
|
|
|
|
thisProps.phasesArray[TSS_FOREHAND_BS_HI_SKIP].fInit = 0.136
|
|
thisProps.phasesArray[TSS_FOREHAND_BS_HI_SKIP].fActive = 0.210
|
|
thisProps.phasesArray[TSS_FOREHAND_BS_HI_SKIP].fEnd = 0.700
|
|
thisProps.phasesArray[TSS_FOREHAND_BS_HI_SKIP].iFrameTot = 43
|
|
thisProps.phasesArray[TSS_FOREHAND_BS_HI_SKIP].sAnimName = "forehand_bs_hi"
|
|
|
|
thisProps.phasesArray[TSS_FOREHAND_BS_LOW_SKIP].fInit = 0.108
|
|
thisProps.phasesArray[TSS_FOREHAND_BS_LOW_SKIP].fActive = 0.160
|
|
thisProps.phasesArray[TSS_FOREHAND_BS_LOW_SKIP].fEnd = 0.670
|
|
thisProps.phasesArray[TSS_FOREHAND_BS_LOW_SKIP].iFrameTot = 46
|
|
thisProps.phasesArray[TSS_FOREHAND_BS_LOW_SKIP].sAnimName = "forehand_bs_lo"
|
|
|
|
thisProps.phasesArray[TSS_FOREHAND_BS_MID_SKIP].fInit = 0.108
|
|
thisProps.phasesArray[TSS_FOREHAND_BS_MID_SKIP].fActive = 0.180
|
|
thisProps.phasesArray[TSS_FOREHAND_BS_MID_SKIP].fEnd = 0.600
|
|
thisProps.phasesArray[TSS_FOREHAND_BS_MID_SKIP].iFrameTot = 46
|
|
thisProps.phasesArray[TSS_FOREHAND_BS_MID_SKIP].sAnimName = "forehand_bs_md"
|
|
|
|
thisProps.phasesArray[TSS_FOREHAND_SMASH].fInit = 0.0
|
|
thisProps.phasesArray[TSS_FOREHAND_SMASH].fActive = 0.170
|
|
thisProps.phasesArray[TSS_FOREHAND_SMASH].fEnd = 0.722
|
|
thisProps.phasesArray[TSS_FOREHAND_SMASH].iFrameTot = 46
|
|
thisProps.phasesArray[TSS_FOREHAND_SMASH].sAnimName = "forehand_smash"
|
|
|
|
thisProps.phasesArray[TSS_FOREHAND_SMASH_LEFT].fInit = 0.0
|
|
thisProps.phasesArray[TSS_FOREHAND_SMASH_LEFT].fActive = 0.170
|
|
thisProps.phasesArray[TSS_FOREHAND_SMASH_LEFT].fEnd = 0.614
|
|
thisProps.phasesArray[TSS_FOREHAND_SMASH_LEFT].iFrameTot = 46
|
|
thisProps.phasesArray[TSS_FOREHAND_SMASH_LEFT].sAnimName = "forehand_smash_lt"
|
|
|
|
thisProps.phasesArray[TSS_FOREHAND_SMASH_RIGHT].fInit = 0.0
|
|
thisProps.phasesArray[TSS_FOREHAND_SMASH_RIGHT].fActive = 0.170
|
|
thisProps.phasesArray[TSS_FOREHAND_SMASH_RIGHT].fEnd = 0.700
|
|
thisProps.phasesArray[TSS_FOREHAND_SMASH_RIGHT].iFrameTot = 46
|
|
thisProps.phasesArray[TSS_FOREHAND_SMASH_RIGHT].sAnimName = "forehand_smash_rt"
|
|
|
|
thisProps.phasesArray[TSS_FOREHAND_SMASH_SKIP].fInit = 0.108
|
|
thisProps.phasesArray[TSS_FOREHAND_SMASH_SKIP].fActive = 0.170
|
|
thisProps.phasesArray[TSS_FOREHAND_SMASH_SKIP].fEnd = 0.722
|
|
thisProps.phasesArray[TSS_FOREHAND_SMASH_SKIP].iFrameTot = 46
|
|
thisProps.phasesArray[TSS_FOREHAND_SMASH_SKIP].sAnimName = "forehand_smash"
|
|
|
|
thisProps.phasesArray[TSS_FOREHAND_SMASH_LEFT_SKIP].fInit = 0.108
|
|
thisProps.phasesArray[TSS_FOREHAND_SMASH_LEFT_SKIP].fActive = 0.170
|
|
thisProps.phasesArray[TSS_FOREHAND_SMASH_LEFT_SKIP].fEnd = 0.614
|
|
thisProps.phasesArray[TSS_FOREHAND_SMASH_LEFT_SKIP].iFrameTot = 46
|
|
thisProps.phasesArray[TSS_FOREHAND_SMASH_LEFT_SKIP].sAnimName = "forehand_smash_lt"
|
|
|
|
thisProps.phasesArray[TSS_FOREHAND_SMASH_RIGHT_SKIP].fInit = 0.108
|
|
thisProps.phasesArray[TSS_FOREHAND_SMASH_RIGHT_SKIP].fActive = 0.170
|
|
thisProps.phasesArray[TSS_FOREHAND_SMASH_RIGHT_SKIP].fEnd = 0.700
|
|
thisProps.phasesArray[TSS_FOREHAND_SMASH_RIGHT_SKIP].iFrameTot = 46
|
|
thisProps.phasesArray[TSS_FOREHAND_SMASH_RIGHT_SKIP].sAnimName = "forehand_smash_rt"
|
|
|
|
thisProps.phasesArray[TSS_FOREHAND_TS_HI].fInit = 0.0
|
|
thisProps.phasesArray[TSS_FOREHAND_TS_HI].fActive = 0.140
|
|
thisProps.phasesArray[TSS_FOREHAND_TS_HI].fEnd = 0.615
|
|
thisProps.phasesArray[TSS_FOREHAND_TS_HI].iFrameTot = 62
|
|
thisProps.phasesArray[TSS_FOREHAND_TS_HI].sAnimName = "forehand_ts_hi"
|
|
|
|
thisProps.phasesArray[TSS_FOREHAND_TS_LOW].fInit = 0.0
|
|
thisProps.phasesArray[TSS_FOREHAND_TS_LOW].fActive = 0.160
|
|
thisProps.phasesArray[TSS_FOREHAND_TS_LOW].fEnd = 0.643
|
|
thisProps.phasesArray[TSS_FOREHAND_TS_LOW].iFrameTot = 52
|
|
thisProps.phasesArray[TSS_FOREHAND_TS_LOW].sAnimName = "forehand_ts_lo"
|
|
|
|
thisProps.phasesArray[TSS_FOREHAND_TS_MID].fInit = 0.0
|
|
thisProps.phasesArray[TSS_FOREHAND_TS_MID].fActive = 0.180
|
|
thisProps.phasesArray[TSS_FOREHAND_TS_MID].fEnd = 0.779
|
|
thisProps.phasesArray[TSS_FOREHAND_TS_MID].iFrameTot = 45
|
|
thisProps.phasesArray[TSS_FOREHAND_TS_MID].sAnimName = "forehand_ts_md"
|
|
|
|
thisProps.phasesArray[TSS_FOREHAND_TS_HI_SKIP].fInit = 0.080
|
|
thisProps.phasesArray[TSS_FOREHAND_TS_HI_SKIP].fActive = 0.140
|
|
thisProps.phasesArray[TSS_FOREHAND_TS_HI_SKIP].fEnd = 0.615
|
|
thisProps.phasesArray[TSS_FOREHAND_TS_HI_SKIP].iFrameTot = 62
|
|
thisProps.phasesArray[TSS_FOREHAND_TS_HI_SKIP].sAnimName = "forehand_ts_hi"
|
|
|
|
thisProps.phasesArray[TSS_FOREHAND_TS_LOW_SKIP].fInit = 0.094
|
|
thisProps.phasesArray[TSS_FOREHAND_TS_LOW_SKIP].fActive = 0.160
|
|
thisProps.phasesArray[TSS_FOREHAND_TS_LOW_SKIP].fEnd = 0.643
|
|
thisProps.phasesArray[TSS_FOREHAND_TS_LOW_SKIP].iFrameTot = 52
|
|
thisProps.phasesArray[TSS_FOREHAND_TS_LOW_SKIP].sAnimName = "forehand_ts_lo"
|
|
|
|
thisProps.phasesArray[TSS_FOREHAND_TS_MID_SKIP].fInit = 0.108
|
|
thisProps.phasesArray[TSS_FOREHAND_TS_MID_SKIP].fActive = 0.180
|
|
thisProps.phasesArray[TSS_FOREHAND_TS_MID_SKIP].fEnd = 0.779
|
|
thisProps.phasesArray[TSS_FOREHAND_TS_MID_SKIP].iFrameTot = 45
|
|
thisProps.phasesArray[TSS_FOREHAND_TS_MID_SKIP].sAnimName = "forehand_ts_md"
|
|
|
|
thisProps.phasesArray[TSS_LUNGE_BACKHAND_HI].fInit = 0.280
|
|
thisProps.phasesArray[TSS_LUNGE_BACKHAND_HI].fActive = 0.370
|
|
thisProps.phasesArray[TSS_LUNGE_BACKHAND_HI].fEnd = 0.708
|
|
thisProps.phasesArray[TSS_LUNGE_BACKHAND_HI].iFrameTot = 57
|
|
thisProps.phasesArray[TSS_LUNGE_BACKHAND_HI].sAnimName = "lunge_bh_hi"
|
|
|
|
thisProps.phasesArray[TSS_LUNGE_BACKHAND_LOW].fInit = 0.275
|
|
thisProps.phasesArray[TSS_LUNGE_BACKHAND_LOW].fActive = 0.370
|
|
thisProps.phasesArray[TSS_LUNGE_BACKHAND_LOW].fEnd = 0.695
|
|
thisProps.phasesArray[TSS_LUNGE_BACKHAND_LOW].iFrameTot = 58
|
|
thisProps.phasesArray[TSS_LUNGE_BACKHAND_LOW].sAnimName = "lunge_bh_lo"
|
|
|
|
thisProps.phasesArray[TSS_LUNGE_BACKHAND_MID].fInit = 0.270
|
|
thisProps.phasesArray[TSS_LUNGE_BACKHAND_MID].fActive = 0.370
|
|
thisProps.phasesArray[TSS_LUNGE_BACKHAND_MID].fEnd = 0.688
|
|
thisProps.phasesArray[TSS_LUNGE_BACKHAND_MID].iFrameTot = 58
|
|
thisProps.phasesArray[TSS_LUNGE_BACKHAND_MID].sAnimName = "lunge_bh_mid"
|
|
|
|
thisProps.phasesArray[TSS_LUNGE_FOREHAND_HI].fInit = 0.260
|
|
thisProps.phasesArray[TSS_LUNGE_FOREHAND_HI].fActive = 0.410
|
|
thisProps.phasesArray[TSS_LUNGE_FOREHAND_HI].fEnd = 0.705
|
|
thisProps.phasesArray[TSS_LUNGE_FOREHAND_HI].iFrameTot = 54
|
|
thisProps.phasesArray[TSS_LUNGE_FOREHAND_HI].sAnimName = "lunge_fh_hi"
|
|
|
|
thisProps.phasesArray[TSS_LUNGE_FOREHAND_LOW].fInit = 0.260
|
|
thisProps.phasesArray[TSS_LUNGE_FOREHAND_LOW].fActive = 0.420
|
|
thisProps.phasesArray[TSS_LUNGE_FOREHAND_LOW].fEnd = 0.738
|
|
thisProps.phasesArray[TSS_LUNGE_FOREHAND_LOW].iFrameTot = 52
|
|
thisProps.phasesArray[TSS_LUNGE_FOREHAND_LOW].sAnimName = "lunge_fh_lo"
|
|
|
|
thisProps.phasesArray[TSS_LUNGE_FOREHAND_MID].fInit = 0.263
|
|
thisProps.phasesArray[TSS_LUNGE_FOREHAND_MID].fActive = 0.430
|
|
thisProps.phasesArray[TSS_LUNGE_FOREHAND_MID].fEnd = 0.695
|
|
thisProps.phasesArray[TSS_LUNGE_FOREHAND_MID].iFrameTot = 50
|
|
thisProps.phasesArray[TSS_LUNGE_FOREHAND_MID].sAnimName = "lunge_fh_mid"
|
|
|
|
thisProps.phasesArray[TSS_DIVE_BACKHAND].fInit = 0.073
|
|
thisProps.phasesArray[TSS_DIVE_BACKHAND].fActive = 0.170
|
|
thisProps.phasesArray[TSS_DIVE_BACKHAND].fEnd = 0.770
|
|
thisProps.phasesArray[TSS_DIVE_BACKHAND].iFrameTot = 102
|
|
thisProps.phasesArray[TSS_DIVE_BACKHAND].sAnimName = "dive_bh"
|
|
|
|
thisProps.phasesArray[TSS_DIVE_FOREHAND].fInit = 0.053
|
|
thisProps.phasesArray[TSS_DIVE_FOREHAND].fActive = 0.170
|
|
thisProps.phasesArray[TSS_DIVE_FOREHAND].fEnd = 0.781
|
|
thisProps.phasesArray[TSS_DIVE_FOREHAND].iFrameTot = 102
|
|
thisProps.phasesArray[TSS_DIVE_FOREHAND].sAnimName = "dive_fh"
|
|
|
|
thisProps.phasesArray[TSS_FOREHAND_TS_LO_FAR].fInit = 0.0
|
|
thisProps.phasesArray[TSS_FOREHAND_TS_LO_FAR].fActive = 0.15
|
|
thisProps.phasesArray[TSS_FOREHAND_TS_LO_FAR].fEnd = 0.95
|
|
thisProps.phasesArray[TSS_FOREHAND_TS_LO_FAR].iFrameTot = 65
|
|
thisProps.phasesArray[TSS_FOREHAND_TS_LO_FAR].sAnimName = "forehand_ts_lo_far"
|
|
|
|
thisProps.phasesArray[TSS_FOREHAND_TS_MID_FAR].fInit = 0.0
|
|
thisProps.phasesArray[TSS_FOREHAND_TS_MID_FAR].fActive = 0.17
|
|
thisProps.phasesArray[TSS_FOREHAND_TS_MID_FAR].fEnd = 0.95
|
|
thisProps.phasesArray[TSS_FOREHAND_TS_MID_FAR].iFrameTot = 58
|
|
thisProps.phasesArray[TSS_FOREHAND_TS_MID_FAR].sAnimName = "forehand_ts_md_far"
|
|
|
|
thisProps.phasesArray[TSS_FOREHAND_TS_HI_FAR].fInit = 0.0
|
|
thisProps.phasesArray[TSS_FOREHAND_TS_HI_FAR].fActive = 0.13
|
|
thisProps.phasesArray[TSS_FOREHAND_TS_HI_FAR].fEnd = 0.95
|
|
thisProps.phasesArray[TSS_FOREHAND_TS_HI_FAR].iFrameTot = 74
|
|
thisProps.phasesArray[TSS_FOREHAND_TS_HI_FAR].sAnimName = "forehand_ts_hi_far"
|
|
|
|
thisProps.phasesArray[TSS_CLOSE_BH_LO].fInit = 0.0
|
|
thisProps.phasesArray[TSS_CLOSE_BH_LO].fActive = 0.2
|
|
thisProps.phasesArray[TSS_CLOSE_BH_LO].fEnd = 0.95
|
|
thisProps.phasesArray[TSS_CLOSE_BH_LO].iFrameTot = 40
|
|
thisProps.phasesArray[TSS_CLOSE_BH_LO].sAnimName = "close_bh_lo"
|
|
|
|
thisProps.phasesArray[TSS_CLOSE_BH_MID].fInit = 0.0
|
|
thisProps.phasesArray[TSS_CLOSE_BH_MID].fActive = 0.2
|
|
thisProps.phasesArray[TSS_CLOSE_BH_MID].fEnd = 0.95
|
|
thisProps.phasesArray[TSS_CLOSE_BH_MID].iFrameTot = 40
|
|
thisProps.phasesArray[TSS_CLOSE_BH_MID].sAnimName = "close_bh_md"
|
|
|
|
thisProps.phasesArray[TSS_CLOSE_BH_HI].fInit = 0.0
|
|
thisProps.phasesArray[TSS_CLOSE_BH_HI].fActive = 0.2
|
|
thisProps.phasesArray[TSS_CLOSE_BH_HI].fEnd = 0.95
|
|
thisProps.phasesArray[TSS_CLOSE_BH_HI].iFrameTot = 40
|
|
thisProps.phasesArray[TSS_CLOSE_BH_HI].sAnimName = "close_bh_hi"
|
|
|
|
thisProps.phasesArray[TSS_CLOSE_FH_LO].fInit = 0.0
|
|
thisProps.phasesArray[TSS_CLOSE_FH_LO].fActive = 0.174
|
|
thisProps.phasesArray[TSS_CLOSE_FH_LO].fEnd = 0.95
|
|
thisProps.phasesArray[TSS_CLOSE_FH_LO].iFrameTot = 46
|
|
thisProps.phasesArray[TSS_CLOSE_FH_LO].sAnimName = "close_fh_lo"
|
|
|
|
thisProps.phasesArray[TSS_CLOSE_FH_MID].fInit = 0.0
|
|
thisProps.phasesArray[TSS_CLOSE_FH_MID].fActive = 0.174
|
|
thisProps.phasesArray[TSS_CLOSE_FH_MID].fEnd = 0.95
|
|
thisProps.phasesArray[TSS_CLOSE_FH_MID].iFrameTot = 46
|
|
thisProps.phasesArray[TSS_CLOSE_FH_MID].sAnimName = "close_fh_md"
|
|
|
|
thisProps.phasesArray[TSS_CLOSE_FH_HI].fInit = 0.0
|
|
thisProps.phasesArray[TSS_CLOSE_FH_HI].fActive = 0.174
|
|
thisProps.phasesArray[TSS_CLOSE_FH_HI].fEnd = 0.95
|
|
thisProps.phasesArray[TSS_CLOSE_FH_HI].iFrameTot = 46
|
|
thisProps.phasesArray[TSS_CLOSE_FH_HI].sAnimName = "close_fh_hi"
|
|
|
|
thisProps.phasesArray[TSS_MID_BH_LO].fInit = 0.0
|
|
thisProps.phasesArray[TSS_MID_BH_LO].fActive = 0.250
|
|
thisProps.phasesArray[TSS_MID_BH_LO].fEnd = 0.95
|
|
thisProps.phasesArray[TSS_MID_BH_LO].iFrameTot = 48
|
|
thisProps.phasesArray[TSS_MID_BH_LO].sAnimName = "mid_bh_lo"
|
|
|
|
thisProps.phasesArray[TSS_MID_BH_MID].fInit = 0.0
|
|
thisProps.phasesArray[TSS_MID_BH_MID].fActive = 0.231
|
|
thisProps.phasesArray[TSS_MID_BH_MID].fEnd = 0.95
|
|
thisProps.phasesArray[TSS_MID_BH_MID].iFrameTot = 52
|
|
thisProps.phasesArray[TSS_MID_BH_MID].sAnimName = "mid_bh_md"
|
|
|
|
thisProps.phasesArray[TSS_MID_BH_HI].fInit = 0.0
|
|
thisProps.phasesArray[TSS_MID_BH_HI].fActive = 0.231
|
|
thisProps.phasesArray[TSS_MID_BH_HI].fEnd = 0.95
|
|
thisProps.phasesArray[TSS_MID_BH_HI].iFrameTot = 52
|
|
thisProps.phasesArray[TSS_MID_BH_HI].sAnimName = "mid_bh_hi"
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Initializes the array offsets given to us by Mark Tennant
|
|
/// PARAMS:
|
|
/// thisProps -
|
|
PROC INITIALIZE_TENNIS_SWING_STATE_OFFSETS(TENNIS_GAME_PROPERTIES &thisProps)
|
|
CPRINTLN(DEBUG_TENNIS, "INITIALIZE_TENNIS_SWING_STATE_OFFSETS called")
|
|
thisProps.vSwingStateOffsets[TSS_BACKHAND_BS_LOW] = <<-0.8036, 0.6726, -0.6097>>
|
|
thisProps.vSwingStateOffsets[TSS_BACKHAND_BS_MID] = <<-0.8147, 0.6746, -0.0154>>
|
|
thisProps.vSwingStateOffsets[TSS_BACKHAND_BS_HI] = <<-0.8298, 0.6483, 0.615>>
|
|
thisProps.vSwingStateOffsets[TSS_BACKHAND_TS_LOW] = <<-0.8254, 0.6648, -0.6352>>
|
|
thisProps.vSwingStateOffsets[TSS_BACKHAND_TS_MID] = <<-0.8217, 0.6774, -0.012>>
|
|
thisProps.vSwingStateOffsets[TSS_BACKHAND_TS_HI] = <<-0.8072, 0.6576, 0.5741>>
|
|
|
|
thisProps.vSwingStateOffsets[TSS_FOREHAND_BS_LOW] = <<0.813, 0.6795, -0.5939>>
|
|
thisProps.vSwingStateOffsets[TSS_FOREHAND_BS_MID] = <<0.8651, 0.6928, 0.0177>>
|
|
thisProps.vSwingStateOffsets[TSS_FOREHAND_BS_HI] = <<0.8592, 0.6398, 0.585>>
|
|
thisProps.vSwingStateOffsets[TSS_FOREHAND_TS_LOW] = <<0.8073, 0.6708, -0.5718>>
|
|
thisProps.vSwingStateOffsets[TSS_FOREHAND_TS_MID] = <<0.831, 0.6645, 0.0059>>
|
|
thisProps.vSwingStateOffsets[TSS_FOREHAND_TS_HI] = <<0.8462, 0.6823, 0.6137>>
|
|
thisProps.vSwingStateOffsets[TSS_FOREHAND_SMASH] = <<0.0038, 0.571, 1.4844>>
|
|
thisProps.vSwingStateOffsets[TSS_FOREHAND_SMASH_LEFT] = <<-0.6106, 0.6003, 1.4926>>
|
|
thisProps.vSwingStateOffsets[TSS_FOREHAND_SMASH_RIGHT] = <<0.5791, 0.6003, 1.4524>>
|
|
|
|
thisProps.vSwingStateOffsets[TSS_CLOSE_BH_BS_LOW] = <<-0.1276, 0.6496, -0.6081>>
|
|
thisProps.vSwingStateOffsets[TSS_CLOSE_BH_BS_MID] = <<-0.1219, 0.6858, -0.0039>>
|
|
thisProps.vSwingStateOffsets[TSS_CLOSE_BH_BS_HI] = <<-0.158, 0.6565, 0.5989>>
|
|
thisProps.vSwingStateOffsets[TSS_CLOSE_BH_TS_LOW] = <<-0.1302, 0.6646, -0.6002>>
|
|
thisProps.vSwingStateOffsets[TSS_CLOSE_BH_TS_MID] = <<-0.1243, 0.6686, 0.0104>>
|
|
thisProps.vSwingStateOffsets[TSS_CLOSE_BH_TS_HI] = <<-0.1614, 0.6659, 0.6349>>
|
|
|
|
thisProps.vSwingStateOffsets[TSS_CLOSE_FH_BS_LOW] = <<0.2654, 0.7156, -0.6474>>
|
|
thisProps.vSwingStateOffsets[TSS_CLOSE_FH_BS_MID] = <<0.2594, 0.6587, -0.0193>>
|
|
thisProps.vSwingStateOffsets[TSS_CLOSE_FH_BS_HI] = <<0.2755, 0.6588, 0.5959>>
|
|
thisProps.vSwingStateOffsets[TSS_CLOSE_FH_TS_LOW] = <<0.2617, 0.701, -0.6222>>
|
|
thisProps.vSwingStateOffsets[TSS_CLOSE_FH_TS_MID] = <<0.2718, 0.6637, -0.0077>>
|
|
thisProps.vSwingStateOffsets[TSS_CLOSE_FH_TS_HI] = <<0.269, 0.6677, 0.6025>>
|
|
|
|
thisProps.vSwingStateOffsets[TSS_BACKHAND_BS_LOW_SKIP] = <<-0.7118, 0.5888, -0.6097>>
|
|
thisProps.vSwingStateOffsets[TSS_BACKHAND_BS_MID_SKIP] = <<-0.7944, 0.5983, -0.0154>>
|
|
thisProps.vSwingStateOffsets[TSS_BACKHAND_BS_HI_SKIP] = <<-0.7291, 0.5708, 0.615>>
|
|
thisProps.vSwingStateOffsets[TSS_BACKHAND_TS_LOW_SKIP] = <<-0.6591, 0.4535, -0.6352>>
|
|
thisProps.vSwingStateOffsets[TSS_BACKHAND_TS_MID_SKIP] = <<-0.7722, 0.6042, -0.012>>
|
|
thisProps.vSwingStateOffsets[TSS_BACKHAND_TS_HI_SKIP] = <<-0.8057, 0.6484, 0.5741>>
|
|
|
|
thisProps.vSwingStateOffsets[TSS_FOREHAND_BS_LOW_SKIP] = <<0.7679, 0.5793, -0.5939>>
|
|
thisProps.vSwingStateOffsets[TSS_FOREHAND_BS_MID_SKIP] = <<0.7837, 0.616, 0.0177>>
|
|
thisProps.vSwingStateOffsets[TSS_FOREHAND_BS_HI_SKIP] = <<0.6994, 0.5786, 0.585>>
|
|
thisProps.vSwingStateOffsets[TSS_FOREHAND_TS_LOW_SKIP] = <<0.8024, 0.5107, -0.5718>>
|
|
thisProps.vSwingStateOffsets[TSS_FOREHAND_TS_MID_SKIP] = <<0.8475, 0.4297, 0.0059>>
|
|
thisProps.vSwingStateOffsets[TSS_FOREHAND_TS_HI_SKIP] = <<0.8012, 0.6051, 0.6137>>
|
|
thisProps.vSwingStateOffsets[TSS_FOREHAND_SMASH_SKIP] = <<-0.0045, 0.4354, 1.4844>>
|
|
thisProps.vSwingStateOffsets[TSS_FOREHAND_SMASH_LEFT_SKIP] = <<-0.5737, 0.4354, 1.4926>>
|
|
thisProps.vSwingStateOffsets[TSS_FOREHAND_SMASH_RIGHT_SKIP] = <<0.5691, 0.4354, 1.4524>>
|
|
|
|
thisProps.vSwingStateOffsets[TSS_CLOSE_BH_BS_LOW_SKIP] = <<-0.4511, 0.4966, -0.6081>>
|
|
thisProps.vSwingStateOffsets[TSS_CLOSE_BH_BS_MID_SKIP] = <<-0.5103, 0.51, -0.0039>>
|
|
thisProps.vSwingStateOffsets[TSS_CLOSE_BH_BS_HI_SKIP] = <<-0.4779, 0.3857, 0.5989>>
|
|
thisProps.vSwingStateOffsets[TSS_CLOSE_BH_TS_LOW_SKIP] = <<-0.3778, 0.5049, -0.6002>>
|
|
thisProps.vSwingStateOffsets[TSS_CLOSE_BH_TS_MID_SKIP] = <<-0.3224, 0.5942, 0.0104>>
|
|
thisProps.vSwingStateOffsets[TSS_CLOSE_BH_TS_HI_SKIP] = <<-0.3764, 0.6902, 0.6349>>
|
|
|
|
thisProps.vSwingStateOffsets[TSS_CLOSE_FH_BS_LOW_SKIP] = <<0.4805, 0.7156, -0.6474>>
|
|
thisProps.vSwingStateOffsets[TSS_CLOSE_FH_BS_MID_SKIP] = <<0.7625, 0.6532, -0.0193>>
|
|
thisProps.vSwingStateOffsets[TSS_CLOSE_FH_BS_HI_SKIP] = <<0.6043, 0.6588, 0.5959>>
|
|
thisProps.vSwingStateOffsets[TSS_CLOSE_FH_TS_LOW_SKIP] = <<0.473, 0.6992, -0.6222>>
|
|
thisProps.vSwingStateOffsets[TSS_CLOSE_FH_TS_MID_SKIP] = <<0.5413, 0.6353, -0.0077>>
|
|
thisProps.vSwingStateOffsets[TSS_CLOSE_FH_TS_HI_SKIP] = <<0.714, 0.6593, 0.6025>>
|
|
|
|
thisProps.vSwingStateOffsets[TSS_LUNGE_BACKHAND_LOW] = <<-1.3525, 0.6005, -0.7221>>
|
|
thisProps.vSwingStateOffsets[TSS_LUNGE_BACKHAND_MID] = <<-1.5755, 0.4699, -0.0379>>
|
|
thisProps.vSwingStateOffsets[TSS_LUNGE_BACKHAND_HI] = <<-1.318, 0.4631, 0.7024>>
|
|
thisProps.vSwingStateOffsets[TSS_LUNGE_FOREHAND_LOW] = <<1.9622, 0.2122, -0.6432>>
|
|
thisProps.vSwingStateOffsets[TSS_LUNGE_FOREHAND_MID] = <<1.9598, 0.5945, -0.0585>>
|
|
thisProps.vSwingStateOffsets[TSS_LUNGE_FOREHAND_HI] = <<1.8166, 0.3588, 0.7322>>
|
|
|
|
thisProps.vSwingStateOffsets[TSS_DIVE_FOREHAND] = <<2.2269, -0.0119, 0.0417 >>
|
|
thisProps.vSwingStateOffsets[TSS_DIVE_BACKHAND] = <<-2.2644, -0.1467, 0.0997 >>
|
|
|
|
thisProps.vSwingStateOffsets[TSS_FOREHAND_TS_LO_FAR] = <<1.4174, 0.6731, -0.5824>>
|
|
thisProps.vSwingStateOffsets[TSS_FOREHAND_TS_MID_FAR] = <<1.4134, 0.6671, 0.0059>>
|
|
thisProps.vSwingStateOffsets[TSS_FOREHAND_TS_HI_FAR] = <<1.4031, 0.6845, 0.6133>>
|
|
|
|
thisProps.vSwingStateOffsets[TSS_CLOSE_BH_LO] = <<-0.1726, 0.6642, -0.6095>>
|
|
thisProps.vSwingStateOffsets[TSS_CLOSE_BH_MID] = <<-0.2261, 0.7049, 0.0018>>
|
|
thisProps.vSwingStateOffsets[TSS_CLOSE_BH_HI] = <<-0.1558, 0.6787, 0.6703>>
|
|
thisProps.vSwingStateOffsets[TSS_CLOSE_FH_LO] = <<0.2443, 0.6567, -0.5885>>
|
|
thisProps.vSwingStateOffsets[TSS_CLOSE_FH_MID] = <<0.2594, 0.6587, -0.0193>>
|
|
thisProps.vSwingStateOffsets[TSS_CLOSE_FH_HI] = <<0.2594, 0.6387, 0.6221>>
|
|
|
|
thisProps.vSwingStateOffsets[TSS_MID_BH_LO] = <<-0.4975, 0.6646, -0.6002>>
|
|
thisProps.vSwingStateOffsets[TSS_MID_BH_MID] = <<-0.4998, 0.6686, 0.0104>>
|
|
thisProps.vSwingStateOffsets[TSS_MID_BH_HI] = <<-0.4952, 0.6659, 0.6349>>
|
|
|
|
// Make these offsets very large so we never use them
|
|
thisProps.vSwingStateOffsets[TSS_SERVE_TOSS] = <<1000, 1000, 1000>>
|
|
thisProps.vSwingStateOffsets[TSS_WAITING] = <<1000, 1000, 1000>>
|
|
thisProps.vSwingStateOffsets[TSS_NO_SWING] = <<1000, 1000, 1000>>
|
|
|
|
thisProps.swingBucketSteps[0] = -2.2644
|
|
thisProps.swingBucketSteps[1] = -0.8260
|
|
thisProps.swingBucketSteps[2] = -0.6969
|
|
thisProps.swingBucketSteps[3] = -0.4494
|
|
thisProps.swingBucketSteps[4] = -0.2019
|
|
thisProps.swingBucketSteps[5] = 0.0456
|
|
thisProps.swingBucketSteps[6] = 0.2931
|
|
thisProps.swingBucketSteps[7] = 0.5406
|
|
thisProps.swingBucketSteps[8] = 0.7881
|
|
thisProps.swingBucketSteps[9] = 1.0356
|
|
thisProps.swingBucketSteps[10] = 2.6669
|
|
|
|
// Prime the sorted matrix of swings
|
|
INT iBucket, iBucketSwing
|
|
REPEAT MAX_SWING_BUCKETS iBucket
|
|
REPEAT MAX_SWINGS_PER_BUCKET iBucketSwing
|
|
thisProps.swingBuckets[iBucket][iBucketSwing] = TSS_NO_SWING
|
|
ENDREPEAT
|
|
ENDREPEAT
|
|
|
|
//Populate the sorted matrix of swings
|
|
thisProps.swingBuckets[0][0] = TSS_BACKHAND_BS_HI
|
|
thisProps.swingBuckets[0][1] = TSS_LUNGE_BACKHAND_HI
|
|
thisProps.swingBuckets[0][2] = TSS_LUNGE_BACKHAND_MID
|
|
thisProps.swingBuckets[0][3] = TSS_LUNGE_BACKHAND_LOW
|
|
thisProps.swingBuckets[0][4] = TSS_DIVE_BACKHAND
|
|
|
|
thisProps.swingBuckets[1][0] = TSS_BACKHAND_TS_HI
|
|
thisProps.swingBuckets[1][1] = TSS_BACKHAND_TS_MID
|
|
thisProps.swingBuckets[1][2] = TSS_BACKHAND_TS_LOW
|
|
thisProps.swingBuckets[1][3] = TSS_BACKHAND_BS_MID
|
|
thisProps.swingBuckets[1][4] = TSS_BACKHAND_BS_LOW
|
|
thisProps.swingBuckets[1][5] = TSS_BACKHAND_TS_HI_SKIP
|
|
thisProps.swingBuckets[1][6] = TSS_BACKHAND_TS_MID_SKIP
|
|
thisProps.swingBuckets[1][7] = TSS_BACKHAND_BS_HI_SKIP
|
|
thisProps.swingBuckets[1][8] = TSS_BACKHAND_BS_MID_SKIP
|
|
thisProps.swingBuckets[1][9] = TSS_BACKHAND_BS_LOW_SKIP
|
|
|
|
thisProps.swingBuckets[2][0] = TSS_BACKHAND_TS_LOW_SKIP
|
|
thisProps.swingBuckets[2][1] = TSS_FOREHAND_SMASH_LEFT
|
|
thisProps.swingBuckets[2][2] = TSS_FOREHAND_SMASH_LEFT_SKIP
|
|
thisProps.swingBuckets[2][3] = TSS_CLOSE_BH_BS_HI_SKIP
|
|
thisProps.swingBuckets[2][4] = TSS_CLOSE_BH_BS_MID_SKIP
|
|
thisProps.swingBuckets[2][5] = TSS_CLOSE_BH_BS_LOW_SKIP
|
|
thisProps.swingBuckets[2][6] = TSS_MID_BH_LO
|
|
thisProps.swingBuckets[2][7] = TSS_MID_BH_MID
|
|
thisProps.swingBuckets[2][8] = TSS_MID_BH_HI
|
|
|
|
thisProps.swingBuckets[3][0] = TSS_CLOSE_BH_TS_HI_SKIP
|
|
thisProps.swingBuckets[3][1] = TSS_CLOSE_BH_TS_MID_SKIP
|
|
thisProps.swingBuckets[3][2] = TSS_CLOSE_BH_TS_LOW_SKIP
|
|
thisProps.swingBuckets[3][3] = TSS_CLOSE_BH_MID
|
|
|
|
thisProps.swingBuckets[4][0] = TSS_FOREHAND_SMASH
|
|
thisProps.swingBuckets[4][1] = TSS_FOREHAND_SMASH_SKIP
|
|
thisProps.swingBuckets[4][2] = TSS_CLOSE_BH_TS_HI
|
|
thisProps.swingBuckets[4][3] = TSS_CLOSE_BH_TS_MID
|
|
thisProps.swingBuckets[4][4] = TSS_CLOSE_BH_TS_LOW
|
|
thisProps.swingBuckets[4][5] = TSS_CLOSE_BH_BS_HI
|
|
thisProps.swingBuckets[4][6] = TSS_CLOSE_BH_BS_MID
|
|
thisProps.swingBuckets[4][7] = TSS_CLOSE_BH_BS_LOW
|
|
thisProps.swingBuckets[4][8] = TSS_CLOSE_BH_LO
|
|
thisProps.swingBuckets[4][9] = TSS_CLOSE_BH_HI
|
|
|
|
thisProps.swingBuckets[5][0] = TSS_CLOSE_FH_TS_HI
|
|
thisProps.swingBuckets[5][1] = TSS_CLOSE_FH_TS_MID
|
|
thisProps.swingBuckets[5][2] = TSS_CLOSE_FH_TS_LOW
|
|
thisProps.swingBuckets[5][3] = TSS_CLOSE_FH_BS_HI
|
|
thisProps.swingBuckets[5][4] = TSS_CLOSE_FH_BS_MID
|
|
thisProps.swingBuckets[5][5] = TSS_CLOSE_FH_BS_LOW
|
|
thisProps.swingBuckets[5][6] = TSS_CLOSE_FH_LO
|
|
thisProps.swingBuckets[5][7] = TSS_CLOSE_FH_MID
|
|
thisProps.swingBuckets[5][8] = TSS_CLOSE_FH_HI
|
|
|
|
thisProps.swingBuckets[6][0] = TSS_CLOSE_FH_TS_LOW_SKIP
|
|
thisProps.swingBuckets[6][1] = TSS_CLOSE_FH_BS_LOW_SKIP
|
|
|
|
thisProps.swingBuckets[7][0] = TSS_FOREHAND_SMASH_RIGHT
|
|
thisProps.swingBuckets[7][1] = TSS_FOREHAND_BS_HI_SKIP
|
|
thisProps.swingBuckets[7][2] = TSS_FOREHAND_BS_MID_SKIP
|
|
thisProps.swingBuckets[7][3] = TSS_FOREHAND_BS_LOW_SKIP
|
|
thisProps.swingBuckets[7][4] = TSS_FOREHAND_SMASH_RIGHT_SKIP
|
|
thisProps.swingBuckets[7][5] = TSS_CLOSE_FH_TS_HI_SKIP
|
|
thisProps.swingBuckets[7][6] = TSS_CLOSE_FH_TS_MID_SKIP
|
|
thisProps.swingBuckets[7][7] = TSS_CLOSE_FH_BS_HI_SKIP
|
|
thisProps.swingBuckets[7][8] = TSS_CLOSE_FH_BS_MID_SKIP
|
|
|
|
thisProps.swingBuckets[8][0] = TSS_FOREHAND_TS_HI
|
|
thisProps.swingBuckets[8][1] = TSS_FOREHAND_TS_MID
|
|
thisProps.swingBuckets[8][2] = TSS_FOREHAND_TS_LOW
|
|
thisProps.swingBuckets[8][3] = TSS_FOREHAND_BS_HI
|
|
thisProps.swingBuckets[8][4] = TSS_FOREHAND_BS_MID
|
|
thisProps.swingBuckets[8][5] = TSS_FOREHAND_BS_LOW
|
|
thisProps.swingBuckets[8][6] = TSS_FOREHAND_TS_HI_SKIP
|
|
thisProps.swingBuckets[8][7] = TSS_FOREHAND_TS_MID_SKIP
|
|
thisProps.swingBuckets[8][8] = TSS_FOREHAND_TS_LOW_SKIP
|
|
|
|
thisProps.swingBuckets[9][0] = TSS_LUNGE_FOREHAND_HI
|
|
thisProps.swingBuckets[9][1] = TSS_LUNGE_FOREHAND_MID
|
|
thisProps.swingBuckets[9][2] = TSS_LUNGE_FOREHAND_LOW
|
|
thisProps.swingBuckets[9][3] = TSS_FOREHAND_TS_LO_FAR
|
|
thisProps.swingBuckets[9][4] = TSS_FOREHAND_TS_MID_FAR
|
|
thisProps.swingBuckets[9][5] = TSS_FOREHAND_TS_HI_FAR
|
|
thisProps.swingBuckets[9][6] = TSS_DIVE_FOREHAND
|
|
ENDPROC
|
|
|
|
PROC SET_TENNIS_PAUSED(BOOL bTennisPaused, TENNIS_BALL &thisBall)
|
|
SET_GAME_PAUSED(bTennisPaused)
|
|
IF bTennisPaused
|
|
SET_TENNIS_BALL_FLAG(thisBall, TBF_PAUSE_UPDATE)
|
|
ELSE
|
|
CLEAR_TENNIS_BALL_FLAG(thisBall, TBF_PAUSE_UPDATE)
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Should only be called in TA_PLAYER_VS_AI games, registers completion percentage if it has not yet been registered
|
|
/// PARAMS:
|
|
/// iNumSets -
|
|
PROC HANDLE_TENNIS_COMPLETION_PERCENTAGE()
|
|
IF NOT IS_TENNIS_SAVED_GLOBAL_FLAG_SET(g_savedGlobals.sTennisData, TGF_ONE_SET_FINISHED)
|
|
REGISTER_SCRIPT_IN_COMPLETION_PERCENTAGE_TOTAL(CP_MG_TENNIS)
|
|
SET_TENNIS_SAVED_GLOBAL_FLAG(g_savedGlobals.sTennisData, TGF_ONE_SET_FINISHED)
|
|
CPRINTLN(DEBUG_TENNIS, "Registering Completion Percentage for Tennis")
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC INITIALIZE_TENNIS_LAUNCH_DETAILS(TENNIS_GAME_PROPERTIES &thisProps)
|
|
thisProps.grades[LD_SERVE_S_PLUS].iForce = 45 //S+ shot at 2.929
|
|
thisProps.grades[LD_SERVE_S].iForce = 40 //S
|
|
thisProps.grades[LD_SERVE_A].iForce = 35 //A
|
|
thisProps.grades[LD_SERVE_B].iForce = 30 //B
|
|
thisProps.grades[LD_SERVE_C].iForce = 25 //C
|
|
thisProps.grades[LD_SERVE_D].iForce = 20 //D
|
|
thisProps.grades[LD_SERVE_FAULT].iForce = 30 //Fault
|
|
thisProps.grades[LD_SERVE_OOB].iForce = 35 //Fault
|
|
thisProps.grades[LD_MID].iForce = 24 //Mid Level shot at MID_HEIGHT
|
|
thisProps.grades[LD_OVERHEAD].iForce = 27 //Overhead shot at OVERHEAD_HEIGHT
|
|
|
|
thisProps.grades[LD_SERVE_S_PLUS].iAngle = 355 //S+ shot at 2.929
|
|
thisProps.grades[LD_SERVE_S].iAngle = 356 //S
|
|
thisProps.grades[LD_SERVE_A].iAngle = 358 //A
|
|
thisProps.grades[LD_SERVE_B].iAngle = 2 //B
|
|
thisProps.grades[LD_SERVE_C].iAngle = 5 //C
|
|
thisProps.grades[LD_SERVE_D].iAngle = 9 //D
|
|
thisProps.grades[LD_SERVE_FAULT].iAngle = 354 //Fault
|
|
thisProps.grades[LD_SERVE_OOB].iAngle = 2 //Fault
|
|
thisProps.grades[LD_MID].iAngle = 15 //Mid Level shot at MID_HEIGHT
|
|
thisProps.grades[LD_OVERHEAD].iAngle = 4 //Overhead shot at OVERHEAD_HEIGHT
|
|
ENDPROC
|
|
|
|
PROC INITIALIZE_FAMILY_PED_TENNIS(TENNIS_GAME_PROPERTIES &thisProps, TENNIS_GAME_STATUS &thisStatus, TENNIS_ACTIVITY thisTA, TENNIS_PLAYER_ID eSelfID, TENNIS_PLAYER_ID eOtherID)
|
|
INITIALIZE_TENNIS_COURT(thisProps.tennisCourt, thisProps)
|
|
INITIALIZE_TENNIS_PLAYER(thisProps.tennisPlayers[eSelfID], eSelfID, COMPUTER, thisProps.vForward, thisProps.vRight)
|
|
INITIALIZE_TENNIS_PLAYER(thisProps.tennisPlayers[eOtherID], eOtherID, COMPUTER, -thisProps.vForward, -thisProps.vRight)
|
|
INITIALIZE_BALL(thisProps.tennisBall)
|
|
|
|
thisProps.texIdleEvent = "Idle1"
|
|
|
|
thisStatus.eGameState = TGSE_INIT
|
|
thisProps.eTennisActivity = thisTA
|
|
|
|
thisProps.tennisPlayers[eSelfID].playerAI.eDifficulty = AD_NORMAL
|
|
thisProps.tennisPlayers[eOtherID].playerAI.eDifficulty = AD_NORMAL
|
|
|
|
INITIALIZE_TENNIS_LAUNCH_DETAILS(thisProps)
|
|
INITIALIZE_TENNIS_SWING_STATE_OFFSETS(thisProps)
|
|
INITIALIZE_TENNIS_SWING_STATE_PHASES(thisProps)
|
|
|
|
//SET_WIND(0)
|
|
ENDPROC
|
|
|
|
PROC MAKE_TENNIS_AUTOSAVE_REQUEST()
|
|
CPRINTLN(DEBUG_TENNIS, "MAKE_TENNIS_AUTOSAVE_REQUEST just called.")
|
|
SET_AUTOSAVE_IGNORES_ON_MISSION_FLAG(TRUE)
|
|
MAKE_AUTOSAVE_REQUEST()
|
|
ENDPROC
|
|
|
|
PROC SET_FAMILY_TENNIS_PEDS_GROUP_AND_UNTARGETTABLE(TENNIS_PLAYER &tennisPlayers[])
|
|
PRIVATE_SetDefaultFamilyMemberAttributes(tennisPlayers[0].pIndex, RELGROUPHASH_PLAYER)
|
|
PRIVATE_SetDefaultFamilyMemberAttributes(tennisPlayers[1].pIndex, RELGROUPHASH_PLAYER)
|
|
// SET_PED_CAN_BE_TARGETTED(tennisPlayers[0].pIndex, FALSE)
|
|
// SET_PED_RELATIONSHIP_GROUP_HASH(tennisPlayers[0].pIndex, RELGROUPHASH_PLAYER)
|
|
// SET_PED_CAN_BE_TARGETTED(tennisPlayers[1].pIndex, FALSE)
|
|
// SET_PED_RELATIONSHIP_GROUP_HASH(tennisPlayers[1].pIndex, RELGROUPHASH_PLAYER)
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
///
|
|
/// PARAMS:
|
|
/// thisProps -
|
|
/// thisTA -
|
|
/// eloc -
|
|
PROC INITIALIZE_AMBIENT_TENNIS(TENNIS_GAME_PROPERTIES &thisProps, TENNIS_GAME_STATUS &thisStatus, TENNIS_ACTIVITY thisTA, TENNIS_PLAYER_ID eSelfID, TENNIS_PLAYER_ID eOtherID, TennisLaunchData &launchData, MODEL_NAMES mOpponent=A_F_Y_Tennis_01, MODEL_NAMES mPlayerAI=A_M_M_TENNIS_01)
|
|
thisProps.eTennisActivity = thisTA
|
|
INITIALIZE_TENNIS_COURT(thisProps.tennisCourt, thisProps, launchData.eCourtToLaunch)
|
|
VECTOR vTempForward, vTempRight
|
|
IF eSelfID = (TENNIS_PLAYER_AWAY)
|
|
vTempForward = thisProps.vForward
|
|
vTempRight = thisProps.vRight
|
|
ELIF eSelfID = (TENNIS_PLAYER_HOME)
|
|
vTempForward = -thisProps.vForward
|
|
vTempRight = -thisProps.vRight
|
|
ENDIF
|
|
|
|
thisProps.texIdleEvent = "Idle1"
|
|
|
|
INITIALIZE_TENNIS_PLAYER(thisProps.tennisPlayers[eSelfID], eSelfID, COMPUTER, vTempForward, vTempRight)
|
|
INITIALIZE_TENNIS_PLAYER(thisProps.tennisPlayers[eOtherID], eOtherID, COMPUTER, -vTempForward, -vTempRight)
|
|
INITIALIZE_BALL(thisProps.tennisBall)
|
|
INITIALIZE_TENNIS_LAUNCH_DETAILS(thisProps)
|
|
INITIALIZE_TENNIS_SWING_STATE_OFFSETS(thisProps)
|
|
INITIALIZE_TENNIS_SWING_STATE_PHASES(thisProps)
|
|
|
|
INITIALIZE_AI_HOME_POSITIONS(thisProps.tennisPlayers[eSelfID].playerAI, thisProps.tennisCourt.vCourtCorners[0], thisProps.tennisPlayers[eSelfID].vMyForward, thisProps.tennisPlayers[eSelfID].vMyRight, thisProps.tennisCourt.vServiceCorners[0])
|
|
INITIALIZE_AI_HOME_POSITIONS(thisProps.tennisPlayers[eOtherID].playerAI, thisProps.tennisCourt.vCourtCorners[2], thisProps.tennisPlayers[eOtherID].vMyForward, thisProps.tennisPlayers[eOtherID].vMyRight, thisProps.tennisCourt.vServiceCorners[2])
|
|
|
|
SET_TENNIS_STATUS_AI_WAIT(thisStatus, PICK_INT(launchData.bFreemodeIntro, launchData.iStartDelay, GET_RANDOM_INT_IN_RANGE(500,3000)))
|
|
|
|
SET_TENNIS_GAME_STATE(thisStatus, TGSE_INIT)
|
|
thisProps.mTheOpponentModel = mOpponent
|
|
thisProps.mThePlayerAIModel = mPlayerAI
|
|
AI_DIFFICULTY eDiff
|
|
IF launchData.bFreemodeIntro
|
|
eDiff = AD_EASY
|
|
thisProps.bCheckPredictionFlag = TRUE
|
|
ELSE
|
|
eDiff = AD_NORMAL
|
|
ENDIF
|
|
thisProps.tennisPlayers[eSelfID].playerAI.eDifficulty = eDiff
|
|
thisProps.tennisPlayers[eOtherID].playerAI.eDifficulty = eDiff
|
|
|
|
REQUEST_MODEL(PROP_TENNIS_BALL)
|
|
REQUEST_MODEL(mOpponent)
|
|
REQUEST_MODEL(mPlayerAI)
|
|
REQUEST_MODEL(PROP_TENNIS_RACK_01B)
|
|
REQUEST_ANIM_DICT("mini@tennis")
|
|
REQUEST_ANIM_DICT("mini@tennis@female")
|
|
REQUEST_ANIM_DICT("weapons@tennis@male")
|
|
ENDPROC
|
|
|
|
PROC INITIALIZE_TENNIS_GAME_SP_DATA(TENNIS_GAME_SP_DATA &thisSPData, TENNIS_GAME_PROPERTIES &thisProps)
|
|
thisSPData.fAbuseTimer = GET_RANDOM_FLOAT_IN_RANGE(120.0, 240.0)
|
|
SET_TENNIS_SP_FLAG(thisSPData, TSP_GUARANTEE_FIRST_ABUSE)
|
|
CDEBUG2LN(DEBUG_TENNIS, "INITIALIZE_TENNIS_GAME_SP_DATA :: thisSPData.fAbuseTimer=", thisSPData.fAbuseTimer)
|
|
|
|
#IF NOT IS_TENNIS_MULTIPLAYER
|
|
thisSPData.vQuitPoint = <<0,0,0>>
|
|
#ENDIF
|
|
|
|
IF (thisProps.thisLocation = ALOC_tennis_michaelHouse)
|
|
thisSPData.vBlockingArea[0] = <<-766.24, 167.38, 66.00>>
|
|
thisSPData.vBlockingArea[1] = <<-779.41, 140.22, 70.00>>
|
|
SET_PED_PATHS_IN_AREA(thisSPData.vBlockingArea[0], thisSPData.vBlockingArea[1], FALSE)
|
|
// thisSPData.blockingArea[0] = PREVENT_PEDS_FROM_BEING_IN_AREA(thisSPData.vBlockingArea[0], thisSPData.vBlockingArea[1])
|
|
CPRINTLN(DEBUG_TENNIS, "INITIALIZE_TENNIS_COURT :: Preventing peds from being around ALOC_tennis_michaelHouse")
|
|
|
|
#IF NOT IS_TENNIS_MULTIPLAYER
|
|
thisSPData.vQuitPoint = <<-785.65, 155.18, 67.28>>
|
|
#ENDIF
|
|
ELIF (thisProps.thisLocation = ALOC_tennis_beachCourt)
|
|
// These calls disable navmesh in small amounts, create small blocking areas, and create small non creation areas
|
|
thisSPData.vBlockingArea[0] = <<-1173.058, -1600.912, 3.000>>
|
|
thisSPData.vBlockingArea[1] = <<-1171.258, -1599.212, 7.100>>
|
|
|
|
thisSPData.vBlockingArea[2] = <<-1181.387, -1630.644, 3.000>>
|
|
thisSPData.vBlockingArea[3] = <<-1158.462, -1603.669, 7.000>>
|
|
|
|
// Larger, overlapping, non_creation area
|
|
thisSPData.vNonCreationArea[0] = <<-1229.030, -1597.280, 7.140>>
|
|
thisSPData.vNonCreationArea[1] = <<-1139.230, -1685.360, 3.000>>
|
|
|
|
SET_PED_PATHS_IN_AREA(thisSPData.vBlockingArea[2], thisSPData.vBlockingArea[3], FALSE)
|
|
|
|
SET_PED_NON_CREATION_AREA(thisSPData.vBlockingArea[2], thisSPData.vBlockingArea[3])
|
|
|
|
// Larger, overlapping, blocking area
|
|
thisSPData.blockingArea[3] = ADD_SCENARIO_BLOCKING_AREA(thisSPData.vNonCreationArea[0], thisSPData.vNonCreationArea[1])
|
|
CPRINTLN(DEBUG_TENNIS, "INITIALIZE_TENNIS_COURT :: Preventing peds from being around ALOC_tennis_beachCourt")
|
|
ELSE
|
|
thisSPData.vBlockingArea[0] = thisProps.tennisCourt.vCourtCorners[0]
|
|
thisSPData.vBlockingArea[1] = thisProps.tennisCourt.vCourtCorners[2]
|
|
thisSPData.blockingArea[0] = PREVENT_PEDS_FROM_BEING_IN_AREA(thisSPData.vBlockingArea[0], thisSPData.vBlockingArea[1])
|
|
|
|
IF thisProps.thisLocation = ALOC_tennis_chumashHotel
|
|
CPRINTLN(DEBUG_TENNIS, "Blocking chumash locations")
|
|
thisSPData.vBlockingArea[2] = <<-2840.66382, -39.25038, 1.88216>>
|
|
thisSPData.vBlockingArea[3] = <<-2842.75024, -42.03827, 2.46897>>
|
|
thisSPData.blockingArea[1] = PREVENT_PEDS_FROM_BEING_IN_AREA(thisSPData.vBlockingArea[2], thisSPData.vBlockingArea[3])
|
|
ENDIF
|
|
IF thisProps.thisLocation = ALOC_tennis_vespucciHotel
|
|
CPRINTLN(DEBUG_TENNIS, "Blocking vespucciHotel locations")
|
|
thisSPData.vBlockingArea[2] = <<-963.646606,-1250.219971,6.967079>>
|
|
thisSPData.vBlockingArea[3] = <<-906.628662,-1278.933105,7.967287>>
|
|
thisSPData.blockingArea[1] = PREVENT_PEDS_FROM_BEING_IN_AREA(thisSPData.vBlockingArea[2], thisSPData.vBlockingArea[3])
|
|
ENDIF
|
|
|
|
CPRINTLN(DEBUG_TENNIS, "INITIALIZE_TENNIS_COURT :: Preventing peds from being around ", GET_STRING_FROM_TENNIS_ALOC(thisProps.thisLocation))
|
|
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
FUNC AI_DIFFICULTY CALCULATE_TENNIS_FRIEND_DIFFICULTY(TENNIS_GAME_UI_DATA &thisUIData, TENNIS_PLAYER_ID eOtherID)
|
|
SWITCH thisUIData.playerChars[eOtherID]
|
|
CASE CHAR_MICHAEL
|
|
RETURN AD_NORMAL
|
|
BREAK
|
|
CASE CHAR_FRANKLIN
|
|
RETURN AD_HARD
|
|
BREAK
|
|
CASE CHAR_TREVOR
|
|
RETURN AD_EASY
|
|
BREAK
|
|
CASE CHAR_LAMAR
|
|
RETURN AD_NORMAL
|
|
BREAK
|
|
CASE CHAR_JIMMY
|
|
RETURN AD_EASY
|
|
BREAK
|
|
CASE CHAR_AMANDA
|
|
RETURN AD_NORMAL
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
RETURN AD_NORMAL
|
|
ENDFUNC
|
|
|
|
PROC REQUEST_PRESTREAM_TENNIS_ASSETS(TENNIS_GAME_PROPERTIES &thisProps, MODEL_NAMES eOpponentModel, BOOL bTutorial)
|
|
CDEBUG2LN(DEBUG_TENNIS, "REQUEST_PRESTREAM_TENNIS_ASSETS called, eOpponentModel=", eOpponentModel)
|
|
REQUEST_MODEL(eOpponentModel)
|
|
thisProps.mTheOpponentModel = eOpponentModel
|
|
|
|
REQUEST_MODEL(PROP_TENNIS_RACK_01B)
|
|
REQUEST_ANIM_DICT("mini@tennis")
|
|
REQUEST_ADDITIONAL_TEXT("TENNIS", MINIGAME_TEXT_SLOT)
|
|
|
|
IF bTutorial
|
|
REQUEST_ANIM_DICT("mini@tennisintro")
|
|
ELSE
|
|
REQUEST_ANIM_DICT("mini@tennisintro_alt1")
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
FUNC BOOL HAVE_PRESTREAM_TENNIS_ASSETS_LOADED(TENNIS_GAME_PROPERTIES &thisProps, BOOL bTutorial)
|
|
IF NOT HAS_MODEL_LOADED(thisProps.mTheOpponentModel)
|
|
IF thisProps.eTennisActivity <> TA_AI_VS_AI
|
|
CPRINTLN(DEBUG_TENNIS, "Waiting for mTheOpponentModel")
|
|
ENDIF
|
|
RETURN FALSE
|
|
ENDIF
|
|
|
|
IF NOT HAS_MODEL_LOADED(PROP_TENNIS_RACK_01B)
|
|
IF thisProps.eTennisActivity <> TA_AI_VS_AI
|
|
CPRINTLN(DEBUG_TENNIS, "Waiting for PROP_TENNIS_RACK_01B")
|
|
ENDIF
|
|
RETURN FALSE
|
|
ENDIF
|
|
|
|
IF NOT HAS_ANIM_DICT_LOADED("mini@tennis")
|
|
IF thisProps.eTennisActivity <> TA_AI_VS_AI
|
|
CPRINTLN(DEBUG_TENNIS, "Waiting for mini@tennisintro")
|
|
ENDIF
|
|
RETURN FALSE
|
|
ENDIF
|
|
|
|
IF NOT HAS_ADDITIONAL_TEXT_LOADED(MINIGAME_TEXT_SLOT)
|
|
CPRINTLN(DEBUG_TENNIS, "Waiting for MINIGAME_TEXT_SLOT")
|
|
RETURN FALSE
|
|
ENDIF
|
|
|
|
IF bTutorial
|
|
IF NOT HAS_ANIM_DICT_LOADED("mini@tennisintro")
|
|
RETURN FALSE
|
|
ENDIF
|
|
ELSE
|
|
IF NOT HAS_ANIM_DICT_LOADED("mini@tennisintro_alt1")
|
|
RETURN FALSE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
RETURN TRUE
|
|
ENDFUNC
|
|
|
|
/// PURPOSE:
|
|
///
|
|
/// PARAMS:
|
|
/// thisProps - The game to initialize
|
|
PROC INITIALIZE_TENNIS_GAME(TENNIS_GAME_PROPERTIES &thisProps, TENNIS_GAME_STATUS &thisStatus, TENNIS_ACTIVITY thisTA, TENNIS_PLAYER_ID eSelfID, TENNIS_PLAYER_ID eOtherID, MODEL_NAMES mOpponent=A_F_Y_Tennis_01, MODEL_NAMES mPlayerAI=A_M_M_TENNIS_01) //A_F_Y_Hipster_02
|
|
//Disable unwanted functions
|
|
DISABLE_SELECTOR()
|
|
|
|
INITIALIZE_TENNIS_COURT(thisProps.tennisCourt, thisProps)
|
|
|
|
thisProps.texIdleEvent = "Idle1"
|
|
|
|
IF thisTA <> TA_FRIEND_ACTIVITY AND thisProps.tennisCourt.eTennisCourt = TENNIS_COURT_MichaelHouse
|
|
CPRINTLN(DEBUG_TENNIS, "Setting Amanda as the opponent")
|
|
SET_TENNIS_GLOBAL_FLAG(TGF_AMANDA_IS_OPP)
|
|
ENDIF
|
|
|
|
VECTOR vTempForward, vTempRight
|
|
IF eSelfID = TENNIS_PLAYER_AWAY
|
|
vTempForward = thisProps.vForward
|
|
vTempRight = thisProps.vRight
|
|
ELIF eSelfID = TENNIS_PLAYER_HOME
|
|
vTempForward = -thisProps.vForward
|
|
vTempRight = -thisProps.vRight
|
|
ENDIF
|
|
|
|
INITIALIZE_BALL(thisProps.tennisBall)
|
|
INITIALIZE_TENNIS_LAUNCH_DETAILS(thisProps)
|
|
INITIALIZE_TENNIS_SWING_STATE_OFFSETS(thisProps)
|
|
INITIALIZE_TENNIS_SWING_STATE_PHASES(thisProps)
|
|
INITIALIZE_TENNIS_PLAYER(thisProps.tennisPlayers[eSelfID], eSelfID, HUMAN_LOCAL, vTempForward, vTempRight)
|
|
INITIALIZE_TENNIS_PLAYER(thisProps.tennisPlayers[eOtherID], eOtherID, COMPUTER, -vTempForward, -vTempRight)
|
|
|
|
thisStatus.eGameState = TGSE_PRE_INIT
|
|
|
|
IF IS_TENNIS_GLOBAL_FLAG_SET(TGF_AMANDA_IS_OPP)
|
|
mOpponent = GET_NPC_PED_MODEL(CHAR_AMANDA)
|
|
CDEBUG2LN(DEBUG_TENNIS, "TGF_AMANDA_IS_OPP is set, setting model to Amanda, mOpponent=", mOpponent)
|
|
ELIF VALIDATE_PICK_DEFAULT_TENNIS_OPPONENT(thisTA)
|
|
mOpponent = A_F_Y_Tennis_01
|
|
ELIF GET_RANDOM_FLOAT_IN_RANGE() < 0.5
|
|
mOpponent = A_M_M_TENNIS_01
|
|
CDEBUG2LN(DEBUG_TENNIS, "setting model to A_M_M_TENNIS_01, mOpponent=", mOpponent)
|
|
ENDIF
|
|
|
|
thisProps.mTheOpponentModel = mOpponent
|
|
thisProps.mThePlayerAIModel = mPlayerAI
|
|
thisStatus.iNumSets = 1
|
|
|
|
INT p=1
|
|
REPEAT MAX_SETS p
|
|
thisStatus.playerScores[0].iGamesWon[p] = -1
|
|
thisStatus.playerScores[1].iGamesWon[p] = -1
|
|
ENDREPEAT
|
|
thisStatus.playerScores[0].iGamesWon[0] = 0
|
|
thisStatus.playerScores[1].iGamesWon[0] = 0
|
|
|
|
SWITCH thisTA
|
|
CASE TA_PLAYER_VS_AI
|
|
//Tennis is currently set up for this
|
|
//("Tennis starting a Player vs AI game.")
|
|
SET_TENNIS_PLAYER_INDEX(thisProps.tennisPlayers[eSelfID],PLAYER_PED_ID())
|
|
thisProps.eTennisActivity = thisTA
|
|
DISPLAY_RADAR(FALSE)
|
|
BREAK
|
|
CASE TA_AI_VS_AI
|
|
//Set tennisPlayers[eSelfID] to AI and init their AI
|
|
//("Tennis starting an AI vs AI game.")
|
|
INITIALIZE_TENNIS_PLAYER(thisProps.tennisPlayers[eSelfID], eSelfID, COMPUTER, thisProps.vForward, thisProps.vRight)
|
|
REQUEST_MODEL(thisProps.mThePlayerAIModel)
|
|
thisProps.eTennisActivity = thisTA
|
|
SET_TENNIS_STATUS_AI_WAIT(thisStatus, GET_RANDOM_INT_IN_RANGE(500,3000))
|
|
BREAK
|
|
CASE TA_FRIEND_ACTIVITY
|
|
//No current settings
|
|
//("Tennis starting a Player vs AI Friend Activity game.")
|
|
SET_TENNIS_PLAYER_INDEX(thisProps.tennisPlayers[eSelfID],PLAYER_PED_ID())
|
|
thisProps.eTennisActivity = thisTA
|
|
DISPLAY_RADAR(FALSE)
|
|
BREAK
|
|
CASE TA_FAMILY_ACTIVITY
|
|
//No Current Settings
|
|
//("Tennis starting a Player vs AI Family Activity game.")
|
|
SET_TENNIS_PLAYER_INDEX(thisProps.tennisPlayers[eSelfID],PLAYER_PED_ID())
|
|
thisProps.eTennisActivity = thisTA
|
|
DISPLAY_RADAR(FALSE)
|
|
BREAK
|
|
CASE TA_MULTIPLAYER
|
|
//No Current Settings
|
|
//("Tennis starting a Player vs Player game across a network.")
|
|
//SET_TENNIS_PLAYER_INDEX(thisProps.tennisPlayers[eSelfID],PLAYER_PED_ID())
|
|
thisProps.eTennisActivity = thisTA
|
|
DISPLAY_RADAR(FALSE)
|
|
INITIALIZE_TENNIS_COURT(thisProps.tennisCourt, thisProps, TC_VENICE_1)
|
|
BREAK
|
|
DEFAULT
|
|
SCRIPT_ASSERT("TENNIS STARTED WITHOUT A VALID TA ENUM, PLEASE CONTACT ROB PEARSALL")
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
IF GET_TENNIS_GAME_STATE(thisStatus) >= TGSE_INIT
|
|
UPDATE_TENNIS_PLAYER_MOVER(thisProps.tennisPlayers[eSelfID], thisProps, GET_TENNIS_SERVING_SIDE(thisStatus), eSelfID, FALSE, FALSE)
|
|
ENDIF
|
|
|
|
//Gets the friend for a friend activity
|
|
IF NOT IS_ENTITY_DEAD(FRIEND_A_PED_ID())
|
|
thisProps.eTennisActivity = TA_FRIEND_ACTIVITY
|
|
PRINTSTRING("starting friend activity\n")
|
|
ELSE
|
|
PRINTSTRING("friend not valid, using normal opponent\n")
|
|
SET_MISSION_FLAG(TRUE)
|
|
ENDIF
|
|
|
|
// These are high-priority assets for getting the intro sync scene running.
|
|
REQUEST_PRESTREAM_TENNIS_ASSETS(thisProps, thisProps.mTheOpponentModel, NOT HAS_TENNIS_CHARACTER_SEEN_TUTORIAL())
|
|
WHILE NOT HAVE_PRESTREAM_TENNIS_ASSETS_LOADED(thisProps, NOT HAS_TENNIS_CHARACTER_SEEN_TUTORIAL())
|
|
WAIT(0)
|
|
ENDWHILE
|
|
IF IS_TENNIS_GLOBAL_FLAG_SET(TGF_AMANDA_IS_OPP)
|
|
CDEBUG2LN(DEBUG_TENNIS, "Preloading Amanda's Variations")
|
|
VECTOR vOffset = << -1284.62, -126.71, 44.74>> // random place away from the court.
|
|
SET_TENNIS_PLAYER_INDEX(thisProps.tennisPlayers[eOtherID], CREATE_PED(PEDTYPE_PLAYER2, thisProps.mTheOpponentModel, vOffset, GET_HEADING_FROM_VECTOR_2D(-thisProps.vForward.x,-thisProps.vForward.y)))
|
|
PED_INDEX ped = GET_TENNIS_PLAYER_INDEX(thisProps.tennisPlayers[eOtherID])
|
|
SET_PED_PRELOAD_VARIATION_DATA(ped, INT_TO_ENUM(PED_COMPONENT,0), 0, 0)
|
|
SET_PED_PRELOAD_VARIATION_DATA(ped, INT_TO_ENUM(PED_COMPONENT,1), 0, 0)
|
|
SET_PED_PRELOAD_VARIATION_DATA(ped, INT_TO_ENUM(PED_COMPONENT,2), 0, 0)
|
|
SET_PED_PRELOAD_VARIATION_DATA(ped, INT_TO_ENUM(PED_COMPONENT,3), 0, 0)
|
|
SET_PED_PRELOAD_VARIATION_DATA(ped, INT_TO_ENUM(PED_COMPONENT,4), 0, 0)
|
|
SET_PED_PRELOAD_VARIATION_DATA(ped, INT_TO_ENUM(PED_COMPONENT,5), 0, 0)
|
|
SET_PED_PRELOAD_VARIATION_DATA(ped, INT_TO_ENUM(PED_COMPONENT,7), 0, 0)
|
|
SET_PED_PRELOAD_VARIATION_DATA(ped, INT_TO_ENUM(PED_COMPONENT,8), 0, 0)
|
|
SET_PED_PRELOAD_VARIATION_DATA(ped, INT_TO_ENUM(PED_COMPONENT,10), 0, 0)
|
|
|
|
WHILE NOT IS_PED_INJURED(ped) AND NOT HAS_PED_PRELOAD_VARIATION_DATA_FINISHED(ped)
|
|
CDEBUG2LN(DEBUG_TENNIS, "Waiting for Amanda's Variations to load")
|
|
WAIT(0)
|
|
ENDWHILE
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC SET_TENNIS_DIALOGUE_STRUCT(structPedsForConversation &convos, enumCharacterList char, enumCharacterList char2, TENNIS_PLAYER &player1, TENNIS_PLAYER &player2)
|
|
CPRINTLN(DEBUG_TENNIS, "SET_TENNIS_DIALOGUE_STRUCT called")
|
|
SWITCH char
|
|
CASE CHAR_MICHAEL
|
|
ADD_PED_FOR_DIALOGUE(convos,0,GET_TENNIS_PLAYER_INDEX(player1),"MICHAEL")
|
|
SET_TENNIS_PLAYER_VOICE(player1, "MICHAEL_NORMAL")
|
|
BREAK
|
|
CASE CHAR_FRANKLIN
|
|
ADD_PED_FOR_DIALOGUE(convos,1,GET_TENNIS_PLAYER_INDEX(player1),"FRANKLIN")
|
|
SET_TENNIS_PLAYER_VOICE(player1, "FRANKLIN_NORMAL")
|
|
BREAK
|
|
CASE CHAR_TREVOR
|
|
ADD_PED_FOR_DIALOGUE(convos,2,GET_TENNIS_PLAYER_INDEX(player1),"TREVOR")
|
|
SET_TENNIS_PLAYER_VOICE(player1, "TREVOR_NORMAL")
|
|
BREAK
|
|
ENDSWITCH
|
|
SWITCH char2
|
|
CASE CHAR_MICHAEL
|
|
ADD_PED_FOR_DIALOGUE(convos,0,GET_TENNIS_PLAYER_INDEX(player2),"MICHAEL")
|
|
SET_TENNIS_PLAYER_VOICE(player2, "MICHAEL_NORMAL")
|
|
BREAK
|
|
CASE CHAR_FRANKLIN
|
|
ADD_PED_FOR_DIALOGUE(convos,1,GET_TENNIS_PLAYER_INDEX(player2),"FRANKLIN")
|
|
SET_TENNIS_PLAYER_VOICE(player2, "FRANKLIN_NORMAL")
|
|
BREAK
|
|
CASE CHAR_TREVOR
|
|
ADD_PED_FOR_DIALOGUE(convos,2,GET_TENNIS_PLAYER_INDEX(player2),"TREVOR")
|
|
SET_TENNIS_PLAYER_VOICE(player2, "TREVOR_NORMAL")
|
|
BREAK
|
|
CASE CHAR_LAMAR
|
|
ADD_PED_FOR_DIALOGUE(convos,3,GET_TENNIS_PLAYER_INDEX(player2),"LAMAR")
|
|
SET_TENNIS_PLAYER_VOICE(player2, "LAMAR_NORMAL")
|
|
BREAK
|
|
CASE CHAR_AMANDA
|
|
ADD_PED_FOR_DIALOGUE(convos,4,GET_TENNIS_PLAYER_INDEX(player2),"AMANDA")
|
|
SET_TENNIS_PLAYER_VOICE(player2, "AMANDA_NORMAL")
|
|
BREAK
|
|
CASE CHAR_JIMMY
|
|
ADD_PED_FOR_DIALOGUE(convos,6,GET_TENNIS_PLAYER_INDEX(player2),"JIMMY")
|
|
SET_TENNIS_PLAYER_VOICE(player2, "JIMMY_NORMAL")
|
|
BREAK
|
|
DEFAULT
|
|
STRING sPed
|
|
BOOL bVariationCheck
|
|
IF NOT IS_PED_INJURED( GET_TENNIS_PLAYER_INDEX(player2) )
|
|
bVariationCheck = IS_PED_COMPONENT_VARIATION_VALID(GET_TENNIS_PLAYER_INDEX(player2),INT_TO_ENUM(PED_COMPONENT,0),1,0)
|
|
ENDIF
|
|
IF IS_TENNIS_PED_MALE((player2))
|
|
sPed = PICK_STRING(bVariationCheck, "TENNISPLAYER3", "TENNISPLAYER4")
|
|
SET_TENNIS_PLAYER_VOICE(player2, PICK_STRING(bVariationCheck, "A_M_M_TENNIS_01_BLACK_MINI_01", "A_M_M_TENNIS_01_WHITE_MINI_01"))
|
|
ELSE
|
|
sPed = PICK_STRING(bVariationCheck, "TENNISPLAYER2", "TENNISPLAYER1")
|
|
SET_TENNIS_PLAYER_VOICE(player2, PICK_STRING(bVariationCheck, "A_F_Y_TENNIS_01_BLACK_MINI_01", "A_F_Y_TENNIS_01_WHITE_MINI_01"))
|
|
ENDIF
|
|
ADD_PED_FOR_DIALOGUE(convos,3,GET_TENNIS_PLAYER_INDEX(player2),sPed)
|
|
BREAK
|
|
ENDSWITCH
|
|
ENDPROC
|
|
|
|
PROC INITIALIZE_TENNIS_GAME_UI_DATA(TENNIS_GAME_UI_DATA &thisUIData, TENNIS_GAME_PROPERTIES &thisProps, TENNIS_PLAYER_ID eSelfID, TENNIS_PLAYER_ID eOtherID)
|
|
INITIALIZE_TENNIS_CAMERAS(thisProps, thisUIData, thisUIData.tennisCameras, eSelfID)
|
|
REQUEST_TENNIS_UI_SF(thisUIData.tennisUI)
|
|
REQUEST_ADDITIONAL_TEXT("TENNIS", MINIGAME_TEXT_SLOT)
|
|
thisUIData.iUtilFlags = 0
|
|
SET_BITMASK_AS_ENUM(thisUIData.iUtilFlags, TD_UPDATE_SCORES)
|
|
SET_BITMASK_AS_ENUM(thisUIData.iUtilFlags, TD_FIRST_SERVE)
|
|
thisUIData.sSubtitleGroupID = "mgtnaud"
|
|
thisUIData.fMessageTimer = 0
|
|
thisUIData.fInterstitialTime = 0
|
|
SET_TENNIS_UI_STATE(thisUIData, TENNIS_UI_SET_INIT)
|
|
|
|
START_TIMER_NOW(thisUIData.interstitialTimer)
|
|
TENNIS_PAUSE_TIMER(thisUIData.interstitialTimer)
|
|
|
|
//Set the playerChars[eSelfID] as either
|
|
// CHAR_MICHAEL, //0
|
|
// CHAR_FRANKLIN, //1
|
|
// CHAR_TREVOR, //2
|
|
thisUIData.playerChars[eSelfID] = GET_CURRENT_PLAYER_PED_ENUM()
|
|
SET_TENNIS_PLAYER_NAME_OFF_ENUM(thisUIData, eSelfID)
|
|
//Set the playerChars[eOtherID] here too
|
|
|
|
IF thisProps.eTennisActivity = TA_FRIEND_ACTIVITY
|
|
thisUIData.playerChars[eOtherID] = GET_PLAYER_PED_ENUM(FRIEND_A_PED_ID())
|
|
IF (thisUIData.playerChars[eOtherID] = NO_CHARACTER)
|
|
thisUIData.playerChars[eOtherID] = GET_NPC_PED_ENUM(FRIEND_A_PED_ID())
|
|
CPRINTLN(DEBUG_TENNIS, "Ped Enum was NO_CHARACTER, setting off NPC Ped Enum")
|
|
ENDIF
|
|
|
|
SET_TENNIS_PLAYER_NAME_OFF_ENUM(thisUIData, eOtherID)
|
|
ELIF thisProps.eTennisActivity = TA_PLAYER_VS_AI AND NOT IS_TENNIS_GLOBAL_FLAG_SET(TGF_AMANDA_IS_OPP)
|
|
thisUIData.playerChars[eOtherID] = NO_CHARACTER
|
|
ELIF IS_TENNIS_GLOBAL_FLAG_SET(TGF_AMANDA_IS_OPP)
|
|
thisUIData.playerChars[eOtherID] = CHAR_AMANDA
|
|
SET_TENNIS_PLAYER_NAME_OFF_ENUM(thisUIData, eOtherID)
|
|
ENDIF
|
|
|
|
SETTIMERB(0) // Used for UI
|
|
|
|
REQUEST_PTFX_ASSET()
|
|
REQUEST_STREAMED_TEXTURE_DICT("ShopUI_Title_Tennis")
|
|
|
|
// Set the player ready for the game as long as it isn't AI vs AI.
|
|
IF thisProps.eTennisActivity <> TA_AI_VS_AI
|
|
IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID())
|
|
CLEAR_PED_TASKS(PLAYER_PED_ID())
|
|
#IF NOT IS_TENNIS_MULTIPLAYER
|
|
SET_PLAYER_CONTROL(GET_PLAYER_INDEX(),FALSE)
|
|
#ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
#IF NOT IS_TENNIS_MULTIPLAYER
|
|
SET_PLAYER_PORTRAITS(thisUIData.tennisUI, thisProps, eSelfID, eOtherID)
|
|
#ENDIF
|
|
ENDPROC
|
|
|
|
PROC ADJUST_TENNIS_PLAYER_ON_STATS(enumCharacterList eCharFromUIData, TENNIS_PLAYER &thisPlayer)
|
|
INT iStrength = GET_SP_PLAYER_PED_STAT_VALUE(eCharFromUIData, PS_STRENGTH)
|
|
INT iStamina = GET_SP_PLAYER_PED_STAT_VALUE(eCharFromUIData, PS_STAMINA)
|
|
#IF IS_TENNIS_MULTIPLAYER
|
|
iStrength = GET_MP_INT_CHARACTER_STAT(MP_STAT_STRENGTH) // MP is only based on strength right now, both values are off the stength stat.
|
|
iStamina = GET_MP_INT_CHARACTER_STAT(MP_STAT_STRENGTH)
|
|
#ENDIF
|
|
FLOAT fAlpha = TO_FLOAT(iStrength + iStamina) / 200
|
|
SET_TENNIS_PLAYER_STRENGTH_BOOST(thisPlayer, LERP_FLOAT(1.0, MAX_STRENGTH_BOOST, fAlpha))
|
|
#IF IS_DEBUG_BUILD
|
|
IF PLAYER_STAT_OVERRIDE_STR
|
|
thisPlayer.fStrengthBoost = MAX_STRENGTH_BOOST
|
|
ENDIF
|
|
#ENDIF
|
|
ENDPROC
|
|
|
|
PROC TENNIS_AMBIENT_CLEANUP(TENNIS_GAME_PROPERTIES &thisProps)
|
|
// DELETE_OBJECT(thisProps.tennisBall.oBall)
|
|
// DELETE_OBJECT(thisProps.tennisPlayers[0].oTennisRacket)
|
|
// DELETE_OBJECT(thisProps.tennisPlayers[1].oTennisRacket)
|
|
IF DOES_ENTITY_EXIST(thisProps.tennisPlayers[0].oTennisRacket)
|
|
DETACH_ENTITY(thisProps.tennisPlayers[0].oTennisRacket)
|
|
SET_OBJECT_AS_NO_LONGER_NEEDED(thisProps.tennisPlayers[0].oTennisRacket)
|
|
ENDIF
|
|
IF DOES_ENTITY_EXIST(thisProps.tennisBall.oBall)
|
|
DETACH_ENTITY(thisProps.tennisBall.oBall)
|
|
SET_OBJECT_AS_NO_LONGER_NEEDED(thisProps.tennisBall.oBall)
|
|
ENDIF
|
|
IF DOES_ENTITY_EXIST(thisProps.tennisPlayers[1].oTennisRacket)
|
|
DETACH_ENTITY(thisProps.tennisPlayers[1].oTennisRacket)
|
|
SET_OBJECT_AS_NO_LONGER_NEEDED(thisProps.tennisPlayers[1].oTennisRacket)
|
|
ENDIF
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(PROP_TENNIS_BALL)
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(thisProps.mTheOpponentModel)
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(thisProps.mThePlayerAIModel)
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(PROP_TENNIS_RACK_01B)
|
|
REMOVE_ANIM_DICT("mini@tennis")
|
|
REMOVE_ANIM_DICT("mini@tennis@female")
|
|
IF IS_TENNIS_GLOBAL_FLAG_SET(TGF_READY_FOR_FM_INTRO)
|
|
CLEAR_TENNIS_GLOBAL_FLAG(TGF_READY_FOR_FM_INTRO)
|
|
ENDIF
|
|
IF IS_TENNIS_GLOBAL_FLAG_SET(TGF_START_AMBIENT_TENNIS)
|
|
CLEAR_TENNIS_GLOBAL_FLAG(TGF_START_AMBIENT_TENNIS)
|
|
ENDIF
|
|
|
|
IF NOT TENNIS_IS_PLAYER_SPECTATING()
|
|
SET_PLAYER_LEAVE_PED_BEHIND(PLAYER_ID(), TRUE)
|
|
NET_NL()NET_PRINT("TENNIS_AMBIENT_CLEANUP: SET_PLAYER_LEAVE_PED_BEHIND(PLAYER_ID(),TRUE)")
|
|
ELSE
|
|
SET_PLAYER_LEAVE_PED_BEHIND(PLAYER_ID(), FALSE)
|
|
NET_NL()NET_PRINT("TENNIS_AMBIENT_CLEANUP: SET_PLAYER_LEAVE_PED_BEHIND(PLAYER_ID(),FALSE)")
|
|
ENDIF
|
|
|
|
|
|
IF NOT IS_ENTITY_DEAD(thisProps.tennisPlayers[TENNIS_PLAYER_AWAY].pIndex) AND NOT IS_PED_BEING_STEALTH_KILLED(thisProps.tennisPlayers[TENNIS_PLAYER_AWAY].pIndex)
|
|
CLEAR_TENNIS_PED_TASKS(thisProps.tennisPlayers, TENNIS_PLAYER_AWAY)
|
|
ENDIF
|
|
IF NOT IS_ENTITY_DEAD(thisProps.tennisPlayers[TENNIS_PLAYER_HOME].pIndex) AND NOT IS_PED_BEING_STEALTH_KILLED(thisProps.tennisPlayers[TENNIS_PLAYER_HOME].pIndex)
|
|
CLEAR_TENNIS_PED_TASKS(thisProps.tennisPlayers, TENNIS_PLAYER_HOME)
|
|
ENDIF
|
|
|
|
CPRINTLN(DEBUG_TENNIS, "******************************** Ambient Tennis Last Post *********************************")
|
|
TERMINATE_THIS_THREAD()
|
|
ENDPROC
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
PROC TENNIS_PRINT_CURRENT_GLOBAL_VALUES()
|
|
CPRINTLN(DEBUG_TENNIS, "Current Tennis Globals below:")
|
|
CPRINTLN(DEBUG_TENNIS, "iTotalAces : ", g_savedGlobals.sTennisData.iTotalAces)
|
|
CPRINTLN(DEBUG_TENNIS, "iTotalAced : ", g_savedGlobals.sTennisData.iTotalAced)
|
|
CPRINTLN(DEBUG_TENNIS, "iTotalPoints : ", g_savedGlobals.sTennisData.iTotalPoints)
|
|
CPRINTLN(DEBUG_TENNIS, "iHighestDeuce : ", g_savedGlobals.sTennisData.iHighestDeuce)
|
|
CPRINTLN(DEBUG_TENNIS, "iGamesWon : ", g_savedGlobals.sTennisData.iGamesWon)
|
|
CPRINTLN(DEBUG_TENNIS, "iGamesLost : ", g_savedGlobals.sTennisData.iGamesLost)
|
|
CPRINTLN(DEBUG_TENNIS, "iSetsWon : ", g_savedGlobals.sTennisData.iSetsWon)
|
|
CPRINTLN(DEBUG_TENNIS, "iSetsLost : ", g_savedGlobals.sTennisData.iSetsLost)
|
|
CPRINTLN(DEBUG_TENNIS, "iMatchesWon : ", g_savedGlobals.sTennisData.iMatchesWon)
|
|
CPRINTLN(DEBUG_TENNIS, "iMatchesLost : ", g_savedGlobals.sTennisData.iMatchesLost)
|
|
CPRINTLN(DEBUG_TENNIS, "iTotalOOB : ", g_savedGlobals.sTennisData.iTotalOOB)
|
|
CPRINTLN(DEBUG_TENNIS, "iTotalFaults : ", g_savedGlobals.sTennisData.iTotalFaults)
|
|
ENDPROC
|
|
#ENDIF
|
|
|
|
PROC TENNIS_SCRIPT_CLEANUP(TENNIS_GAME_PROPERTIES &thisProps, TENNIS_GAME_UI_DATA &thisUIData, TENNIS_PLAYER_ID eSelfID, TENNIS_PLAYER_ID eOtherID #IF NOT IS_TENNIS_MULTIPLAYER, TENNIS_GAME_SP_DATA &thisSPData #ENDIF , enumActivityResult eResult, #IF IS_TENNIS_MULTIPLAYER INT iMatchHistoryID, INT missionVariation, #ENDIF BOOL bClearHelp=FALSE, BOOL bSeamless=FALSE)
|
|
CPRINTLN(DEBUG_TENNIS, "Tennis Cleanup Initiated!")
|
|
|
|
IF thisProps.tennisCourt.eTennisCourt = TENNIS_COURT_WeazelCourt1
|
|
IF IS_NEW_LOAD_SCENE_ACTIVE()
|
|
CDEBUG2LN(DEBUG_TENNIS, "TENNIS_SCRIPT_CLEANUP :: Stopping new load scene")
|
|
NEW_LOAD_SCENE_STOP()
|
|
ENDIF
|
|
ENDIF
|
|
|
|
// STATIC_BLIP_MINIGAME_TENNIS
|
|
|
|
CLEAR_RANK_REDICTION_DETAILS()
|
|
TENNIS_CLEANUP_SOCIAL_CLUB_LEADERBOARD()
|
|
|
|
MISSION_FLOW_CLEAR_DISPLAY_MISSION_TITLE()
|
|
|
|
CLEAR_PED_NON_CREATION_AREA()
|
|
|
|
CLEAR_WEATHER_TYPE_PERSIST()
|
|
|
|
STOP_AUDIO_SCENE("TENNIS_SCENE")
|
|
|
|
DESTROY_TENNIS_BLIP(thisUIData.tennisUI.oppBlip)
|
|
|
|
CASCADE_SHADOWS_INIT_SESSION()
|
|
|
|
RESET_HUD_COMPONENT_VALUES(NEW_HUD_SUBTITLE_TEXT)
|
|
|
|
// Allow Awards to show in other minigames (currently only used in Tennis MP and Shooting Range MP)
|
|
MPGlobals.sMinigameMPGlobals.bHideMPAwards = FALSE
|
|
|
|
REMOVE_PTFX_ASSET()
|
|
|
|
IF ANIMPOSTFX_IS_RUNNING("MinigameTransitionIn")
|
|
ANIMPOSTFX_STOP("MinigameTransitionIn")
|
|
ENDIF
|
|
|
|
IF ANIMPOSTFX_IS_RUNNING("MinigameTransitionOut")
|
|
ANIMPOSTFX_STOP("MinigameTransitionOut")
|
|
ENDIF
|
|
|
|
// CLEANUP_MG_BIG_MESSAGE()
|
|
|
|
TRIGGER_MUSIC_EVENT("MGTN_END")
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
TENNIS_PRINT_CURRENT_GLOBAL_VALUES()
|
|
IF GET_COMMANDLINE_PARAM_EXISTS("DR_tennis")
|
|
DEBUG_RECORD_END()
|
|
CDEBUG1LN(DEBUG_TENNIS, "DEBUG_RECORD_END(DR_tennis)")
|
|
ENDIF
|
|
#ENDIF
|
|
|
|
#IF IS_TENNIS_MULTIPLAYER
|
|
MAKE_TENNIS_AUTOSAVE_REQUEST()
|
|
//gdisablerankupmessage = FALSE
|
|
SET_DISABLE_RANK_UP_MESSAGE(FALSE)
|
|
#ENDIF
|
|
|
|
SET_AUTOSAVE_IGNORES_ON_MISSION_FLAG(FALSE)
|
|
|
|
// Remove custom PC keyboard and mouse control scheme
|
|
SHUTDOWN_PC_SCRIPTED_CONTROLS()
|
|
|
|
ENABLE_SELECTOR()
|
|
|
|
IF g_bResultScreenDisplaying
|
|
SET_RESULT_SCREEN_DISPLAYING_STATE(FALSE)
|
|
ENDIF
|
|
|
|
IF DOES_ENTITY_EXIST(thisProps.tennisPlayers[0].oTennisRacket)
|
|
DELETE_OBJECT(thisProps.tennisPlayers[0].oTennisRacket)
|
|
ENDIF
|
|
IF DOES_ENTITY_EXIST(thisProps.tennisPlayers[1].oTennisRacket)
|
|
DELETE_OBJECT(thisProps.tennisPlayers[1].oTennisRacket)
|
|
ENDIF
|
|
|
|
CPRINTLN(DEBUG_TENNIS, "Cleaning up cams and ending Tennis")
|
|
|
|
SET_MINIGAME_IN_PROGRESS(FALSE)
|
|
|
|
DISPLAY_RADAR(TRUE)
|
|
IF NOT bSeamless
|
|
RENDER_SCRIPT_CAMS(FALSE, FALSE)
|
|
ENDIF
|
|
DESTROY_CAM(thisUIData.tennisCameras.tennisCamFar)
|
|
DESTROY_CAM(thisUIData.tennisCameras.tennisCamFarOtherSide)
|
|
DESTROY_CAM(thisUIData.tennisCameras.tennisCamDyna)
|
|
DESTROY_CAM(thisUIData.tennisCameras.tennisCamTut, TRUE)
|
|
DELETE_OBJECT(thisProps.tennisBall.oBall)
|
|
DELETE_OBJECT(thisProps.tennisPlayers[0].oTennisRacket)
|
|
DELETE_OBJECT(thisProps.tennisPlayers[1].oTennisRacket)
|
|
CLEANUP_SIMPLE_USE_CONTEXT(thisUIData.tennisUI.useContext)
|
|
REMOVE_ANIM_DICT("mini@tennis")
|
|
REMOVE_ANIM_DICT("mini@tennis@female")
|
|
REMOVE_ANIM_DICT("mini@triathlon")
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(PROP_TENNIS_BALL)
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(PROP_TENNIS_RACK_01B)
|
|
CLEAR_ADDITIONAL_TEXT(MINIGAME_TEXT_SLOT, TRUE)
|
|
|
|
BEGIN_SCALEFORM_MOVIE_METHOD(thisUIData.tennisUI.scorePanelSF, "SET_SCOREPANEL")
|
|
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(0)
|
|
END_SCALEFORM_MOVIE_METHOD()
|
|
|
|
BEGIN_SCALEFORM_MOVIE_METHOD(thisUIData.tennisUI.scorePanelSF, "SET_SCOREBOARD")
|
|
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(0)
|
|
END_SCALEFORM_MOVIE_METHOD()
|
|
|
|
SET_SCALEFORM_MOVIE_AS_NO_LONGER_NEEDED(thisUIData.tennisUI.scorePanelSF)
|
|
SET_SCALEFORM_MOVIE_AS_NO_LONGER_NEEDED(thisUIData.tennisUI.matchUI.siMovie)
|
|
// #IF IS_TENNIS_MULTIPLAYER
|
|
SET_SCALEFORM_MOVIE_AS_NO_LONGER_NEEDED(thisUIData.tennisUI.uiShardMS.siMovie)
|
|
// #ENDIF
|
|
CLEANUP_SC_LEADERBOARD_UI(thisUIData.tennisUI.leaderboardUI)
|
|
|
|
#IF IS_TENNIS_MULTIPLAYER
|
|
CLEAR_OVERRIDE_WEATHER()
|
|
//Clean up freemode variables
|
|
IF GET_CURRENT_GAMEMODE() = GAMEMODE_FM
|
|
INT iFMMCValue
|
|
IF eResult = AR_playerWon
|
|
iFMMCValue = ciFMMC_END_OF_MISSION_STATUS_PASSED
|
|
ELIF eResult = AR_buddyA_won
|
|
iFMMCValue = ciFMMC_END_OF_MISSION_STATUS_FAILED
|
|
ELIF eResult = AR_playerQuit
|
|
iFMMCValue = ciFMMC_END_OF_MISSION_STATUS_CANCELLED
|
|
ELSE
|
|
CPRINTLN(DEBUG_TENNIS, "TENNIS_SCRIPT_CLEANUP: eResult is unaccounted for enum: ", eResult)
|
|
iFMMCValue = ciFMMC_END_OF_MISSION_STATUS_NOT_SET
|
|
ENDIF
|
|
IF NETWORK_IS_GAME_IN_PROGRESS()
|
|
DEAL_WITH_FM_MATCH_END(FMMC_TYPE_MG_TENNIS, iMatchHistoryID, missionVariation)
|
|
ENDIF
|
|
CPRINTLN(DEBUG_TENNIS, "Resetting Variables with calculated value")
|
|
RESET_FMMC_MISSION_VARIABLES(TRUE, FALSE, iFMMCValue)
|
|
ENDIF
|
|
IF NOT IS_PLAYER_SCTV( PLAYER_ID() )
|
|
SET_PED_VARIATIONS(GET_TENNIS_PLAYER_INDEX(thisProps.tennisPlayers[eSelfID]), sMPVars)
|
|
SET_PED_COMP_ITEM_CURRENT_MP(PLAYER_PED_ID(), COMP_TYPE_PROPS, m_eHeadProp, FALSE)
|
|
FINALIZE_HEAD_BLEND(GET_TENNIS_PLAYER_INDEX(thisProps.tennisPlayers[eSelfID]))
|
|
ENDIF
|
|
#IF IS_DEBUG_BUILD
|
|
CPRINTLN(DEBUG_TENNIS, "PRINT_PED_VARIATIONS below (cleanup):")
|
|
PRINT_PED_VARIATIONS(GET_TENNIS_PLAYER_INDEX(thisProps.tennisPlayers[eSelfID]))
|
|
#ENDIF
|
|
IF HAS_CELEBRATION_SCREEN_LOADED(thisUIData.sCelebData)
|
|
SET_CELEBRATION_SCREEN_AS_ACTIVE(FALSE)
|
|
CLEANUP_CELEBRATION_SCREEN(thisUIData.sCelebData)
|
|
ENDIF
|
|
#ENDIF
|
|
|
|
IF NOT bClearHelp AND NOT IS_BITMASK_AS_ENUM_SET(thisUIData.iUtilFlags, TD_QUIT_BIT)
|
|
CLEAR_HELP()
|
|
ENDIF
|
|
|
|
IF NOT IS_PED_INJURED(GET_TENNIS_PLAYER_INDEX(thisProps.tennisPlayers[eSelfID]))
|
|
RESET_PED_STRAFE_CLIPSET(GET_TENNIS_PLAYER_INDEX(thisProps.tennisPlayers[eSelfID]))
|
|
ENDIF
|
|
IF NOT IS_ENTITY_DEAD(thisProps.tennisPlayers[eSelfID].pIndex)
|
|
CLEAR_TENNIS_PED_TASKS(thisProps.tennisPlayers, eSelfID, FALSE)
|
|
ENDIF
|
|
|
|
#IF NOT IS_TENNIS_MULTIPLAYER
|
|
|
|
IF DOES_ENTITY_EXIST(thisSPData.oBottle) AND IS_ENTITY_ATTACHED(thisSPData.oBottle)
|
|
CDEBUG2LN(DEBUG_TENNIS, "Detaching water bottle, failsafe cleanup")
|
|
DETACH_ENTITY(thisSPData.oBottle)
|
|
SET_OBJECT_AS_NO_LONGER_NEEDED(thisSPData.oBottle)
|
|
ENDIF
|
|
|
|
SET_PED_PATHS_BACK_TO_ORIGINAL(thisSPData.vBlockingArea[2], thisSPData.vBlockingArea[3])
|
|
IF thisProps.eTennisActivity <> TA_AI_VS_AI
|
|
CPRINTLN(DEBUG_TENNIS, "Unlocking outfits, reenabling cheats, reenabling special ability, unrequesting audio banks")
|
|
IF NOT IS_PED_INJURED(GET_TENNIS_PLAYER_INDEX(thisProps.tennisPlayers[eOtherID]))
|
|
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(GET_TENNIS_PLAYER_INDEX(thisProps.tennisPlayers[eOtherID]), FALSE)
|
|
ENDIF
|
|
IF thisUIData.playerChars[eSelfID] = CHAR_MICHAEL
|
|
SET_PED_COMP_ITEM_ACQUIRED_SP(PLAYER_ZERO, COMP_TYPE_OUTFIT, OUTFIT_P0_TENNIS, TRUE)
|
|
SET_PED_COMP_ITEM_AVAILABLE_SP(PLAYER_ZERO, COMP_TYPE_OUTFIT, OUTFIT_P0_TENNIS, TRUE)
|
|
ELIF thisUIData.playerChars[eSelfID] = CHAR_TREVOR
|
|
SET_PED_COMP_ITEM_ACQUIRED_SP(PLAYER_TWO, COMP_TYPE_OUTFIT, OUTFIT_P2_TENNIS, TRUE)
|
|
SET_PED_COMP_ITEM_AVAILABLE_SP(PLAYER_TWO, COMP_TYPE_OUTFIT, OUTFIT_P2_TENNIS, TRUE)
|
|
ENDIF
|
|
ENABLE_SPECIAL_ABILITY(PLAYER_ID(), TRUE)
|
|
UNREQUEST_TENNIS_BANKS()
|
|
ODDJOB_EXIT_CUTSCENE()
|
|
IF NOT IS_PED_INJURED(GET_TENNIS_PLAYER_INDEX(thisProps.tennisPlayers[eOtherID]))
|
|
SET_PED_CONFIG_FLAG(GET_TENNIS_PLAYER_INDEX(thisProps.tennisPlayers[eOtherID]), PCF_ForceNoTimesliceIntelligenceUpdate, FALSE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
DELETE_OBJECT(thisSPData.oCollBox[0])
|
|
DELETE_OBJECT(thisSPData.oCollBox[1])
|
|
DELETE_OBJECT(thisSPData.oCollBox[2])
|
|
DELETE_OBJECT(thisSPData.oCollBox[3])
|
|
IF IS_SCREEN_FADED_OUT()
|
|
DO_SCREEN_FADE_IN(100)
|
|
ENDIF
|
|
|
|
IF DOES_ENTITY_EXIST(thisSPData.pedAbuser)
|
|
SET_PED_AS_NO_LONGER_NEEDED(thisSPData.pedAbuser)
|
|
ENDIF
|
|
REMOVE_ANIM_DICT("misscommon@response")
|
|
|
|
IF NOT IS_TENNIS_GLOBAL_FLAG_SET(TGF_AMANDA_IS_OPP)
|
|
IF NOT IS_PED_INJURED(GET_TENNIS_PLAYER_INDEX(thisProps.tennisPlayers[eOtherID]))
|
|
RESET_PED_STRAFE_CLIPSET(GET_TENNIS_PLAYER_INDEX(thisProps.tennisPlayers[eOtherID]))
|
|
ENDIF
|
|
IF NOT IS_ENTITY_DEAD(thisProps.tennisPlayers[eOtherID].pIndex)
|
|
CLEAR_TENNIS_PED_TASKS(thisProps.tennisPlayers, eOtherID, FALSE)
|
|
ENDIF
|
|
ELIF thisProps.eTennisActivity <> TA_FRIEND_ACTIVITY
|
|
IF NOT IS_PED_INJURED(GET_TENNIS_PLAYER_INDEX(thisProps.tennisPlayers[eOtherID]))
|
|
DELETE_PED(thisProps.tennisPlayers[eOtherID].pIndex)
|
|
ENDIF
|
|
IF thisUIData.playerChars[eSelfID] = CHAR_MICHAEL
|
|
RESET_FRIEND_LAST_CONTACT_TIMER(CHAR_MICHAEL, CHAR_AMANDA, FRIEND_CONTACT_FACE)
|
|
ENDIF
|
|
PRIVATE_Set_Current_Family_Member_Event(FM_MICHAEL_WIFE, FE_M7_WIFE_sunbathing)
|
|
ENDIF
|
|
CLEAR_TENNIS_GLOBAL_FLAG(TGF_AMANDA_IS_OPP)
|
|
|
|
// Resetting last known info to be consistent with missions, B*909265
|
|
ResetLastKnownPedInfo(g_savedGlobals.sPlayerData.sInfo, SP_MISSION_NONE)
|
|
CLEANUP_MENU_ASSETS()
|
|
IF DOES_ENTITY_EXIST(thisSPData.oLighting)
|
|
DELETE_OBJECT(thisSPData.oLighting)
|
|
ENDIF
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(Prop_VB_34_tencrt_lighting)
|
|
#ENDIF
|
|
|
|
SET_DISABLE_AMBIENT_MELEE_MOVE(GET_PLAYER_INDEX(), FALSE)
|
|
|
|
DISABLE_CELLPHONE(FALSE)
|
|
|
|
IF NOT bSeamless
|
|
SET_TENNIS_PLAYER_TO_TENNIS_MODE(PLAYER_PED_ID(),FALSE)
|
|
ENDIF
|
|
|
|
#IF NOT IS_TENNIS_MULTIPLAYER
|
|
IF thisProps.eTennisActivity <> TA_AI_VS_AI
|
|
SET_TENNIS_PLAYER_TO_TENNIS_MODE(GET_TENNIS_PLAYER_INDEX(thisProps.tennisPlayers[eOtherID]),FALSE)
|
|
ENDIF
|
|
|
|
ALLOW_PEDS_TO_BE_IN_AREA(thisSPData.blockingArea[0], thisSPData.vBlockingArea[0], thisSPData.vBlockingArea[1])
|
|
|
|
IF thisProps.tennisCourt.eTennisCourt = TENNIS_COURT_chumashHotel
|
|
ALLOW_PEDS_TO_BE_IN_AREA(thisSPData.blockingArea[1], thisSPData.vBlockingArea[2], thisSPData.vBlockingArea[3])
|
|
ENDIF
|
|
|
|
IF thisProps.tennisCourt.eTennisCourt = TENNIS_COURT_CountryClub
|
|
// ALLOW_PEDS_TO_BE_IN_AREA(thisSPData.blockingArea[1], thisSPData.vBlockingArea[2], thisSPData.vBlockingArea[3])
|
|
// ALLOW_PEDS_TO_BE_IN_AREA(thisSPData.blockingArea[2], thisSPData.vBlockingArea[4], thisSPData.vBlockingArea[5])
|
|
REMOVE_SCENARIO_BLOCKING_AREA(thisSPData.blockingArea[3])
|
|
ENDIF
|
|
#ENDIF
|
|
|
|
SET_DEBUG_LINES_AND_SPHERES_DRAWING_ACTIVE(FALSE)
|
|
|
|
SET_TENNIS_PAUSED(FALSE, thisProps.tennisBall)
|
|
|
|
FORCE_PED_AI_AND_ANIMATION_UPDATE(GET_TENNIS_PLAYER_INDEX(thisProps.tennisPlayers[eSelfID]))
|
|
|
|
CPRINTLN(DEBUG_TENNIS, "************************* Tennis Last Post **************************")
|
|
|
|
#IF NOT IS_TENNIS_MULTIPLAYER
|
|
|
|
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
|
|
SET_PLAYER_CONTROL(GET_PLAYER_INDEX(),TRUE)
|
|
ENDIF
|
|
|
|
IF (thisProps.eTennisActivity = TA_FRIEND_ACTIVITY)
|
|
// If peds are ok, put buddy back in players group
|
|
IF DOES_ENTITY_EXIST(PLAYER_PED_ID()) AND NOT IS_PED_INJURED(PLAYER_PED_ID())
|
|
IF DOES_ENTITY_EXIST(FRIEND_A_PED_ID()) AND NOT IS_PED_INJURED(FRIEND_A_PED_ID())
|
|
IF NOT IS_PED_GROUP_MEMBER(FRIEND_A_PED_ID(), PLAYER_GROUP_ID())
|
|
SET_PED_AS_GROUP_MEMBER(FRIEND_A_PED_ID(), PLAYER_GROUP_ID())
|
|
SET_PED_GROUP_MEMBER_PASSENGER_INDEX(FRIEND_A_PED_ID(), VS_FRONT_RIGHT)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT DOES_ENTITY_EXIST(FRIEND_A_PED_ID()) ORELSE IS_ENTITY_DEAD(FRIEND_A_PED_ID()) ORELSE IS_PED_INJURED(FRIEND_A_PED_ID())
|
|
finishActivity(thisProps.thisLocation, AR_buddy_injured)
|
|
ELIF NOT DOES_ENTITY_EXIST(PLAYER_PED_ID()) ORELSE IS_ENTITY_DEAD(PLAYER_PED_ID()) ORELSE IS_PLAYER_WANTED_LEVEL_GREATER(GET_PLAYER_INDEX(), 0)
|
|
finishActivity(thisProps.thisLocation, AR_deatharrest)
|
|
ELSE
|
|
TASK_PAUSE(FRIEND_A_PED_ID(), -1)
|
|
CLEAR_PED_TASKS_IMMEDIATELY(FRIEND_A_PED_ID())
|
|
finishActivity(thisProps.thisLocation, eResult)
|
|
CPRINTLN(DEBUG_TENNIS, "finishing friend activity, eResult=", eResult)
|
|
ENDIF
|
|
ENDIF
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(thisProps.mTheOpponentModel)
|
|
|
|
IF IS_SCREEN_FADED_OUT()
|
|
DO_SCREEN_FADE_IN(200)
|
|
ENDIF
|
|
TERMINATE_THIS_THREAD()
|
|
#ENDIF
|
|
|
|
#IF IS_TENNIS_MULTIPLAYER
|
|
SET_LOADING_ICON_INACTIVE()
|
|
CPRINTLN(DEBUG_TENNIS, "FMMC_TYPE_MG_TENNIS=", FMMC_TYPE_MG_TENNIS, ", iMatchHistoryID=", iMatchHistoryID, ", missionVariation=", missionVariation)
|
|
SET_TIME_OF_DAY(TIME_OFF, TRUE)
|
|
ENABLE_ALL_MP_HUD()
|
|
DISABLE_SCRIPT_HUD(HUDPART_ALL_OVERHEADS, FALSE)
|
|
DISABLE_SCRIPT_HUD(HUDPART_RANKBAR, FALSE)
|
|
SET_TENNIS_PLAYER_TO_TENNIS_MODE(GET_TENNIS_PLAYER_INDEX(thisProps.tennisPlayers[eOtherID]), FALSE)
|
|
TERMINATE_THIS_MULTIPLAYER_THREAD_NO_ARGS()
|
|
#ENDIF
|
|
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
///
|
|
PROC PROCESS_REWARDS(TENNIS_GAME_PROPERTIES &thisProps, TENNIS_GAME_UI_DATA &thisUIData, TENNIS_GAME_SP_DATA &thisSPData, TENNIS_PLAYER_ID eOpponentID)
|
|
FLOAT fMoneyMod = 1.0
|
|
SWITCH thisSPData.eDifficulty
|
|
CASE AD_EASY
|
|
fMoneyMod *= 0.5
|
|
BREAK
|
|
CASE AD_HARD
|
|
fMoneyMod *= 1.5
|
|
BREAK
|
|
ENDSWITCH
|
|
FLOAT fRewardMoney = fBaseRewardMoney * fMoneyMod
|
|
|
|
IF thisProps.eTennisActivity = TA_FRIEND_ACTIVITY AND (thisUIData.playerChars[eOpponentID] = CHAR_MICHAEL OR thisUIData.playerChars[eOpponentID] = CHAR_FRANKLIN OR thisUIData.playerChars[eOpponentID] = CHAR_TREVOR)
|
|
DEBIT_BANK_ACCOUNT(thisUIData.playerChars[eOpponentID], BAAC_UNLOGGED_SMALL_ACTION, FLOOR(fRewardMoney))
|
|
fRewardMoney = CLAMP(fRewardMoney, 0, TO_FLOAT(GET_TOTAL_CASH(thisUIData.playerChars[eOpponentID])))
|
|
CPRINTLN(DEBUG_TENNIS, "Should have subtracted $", fRewardMoney, " from friend ped")
|
|
ENDIF
|
|
|
|
CREDIT_BANK_ACCOUNT(GET_CURRENT_PLAYER_PED_ENUM(), BAAC_UNLOGGED_SMALL_ACTION, FLOOR(fRewardMoney))
|
|
CPRINTLN(DEBUG_TENNIS, "Processing awards in Tennis, adding $", fRewardMoney)
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
///
|
|
PROC SCRIPT_PASSED(TENNIS_GAME_PROPERTIES &thisProps, TENNIS_GAME_SP_DATA &thisSPData, TENNIS_GAME_UI_DATA &thisUIData, enumActivityResult result, TENNIS_PLAYER_ID eSelfID, TENNIS_PLAYER_ID eOtherID, BOOL bSeamless = FALSE)
|
|
PROCESS_REWARDS(thisProps, thisUIData, thisSPData, eOtherID)
|
|
TENNIS_SCRIPT_CLEANUP(thisProps, thisUIData, eSelfID, eOtherID, thisSPData, result, bSeamless)
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
///
|
|
PROC SCRIPT_FAILED(TENNIS_GAME_PROPERTIES &thisProps, TENNIS_GAME_SP_DATA &thisSPData, TENNIS_GAME_UI_DATA &thisUIData, enumActivityResult result, TENNIS_PLAYER_ID eSelfID, TENNIS_PLAYER_ID eOtherID, BOOL bSeamless = FALSE)
|
|
TENNIS_SCRIPT_CLEANUP(thisProps, thisUIData, eSelfID, eOtherID, thisSPData, result, bSeamless)
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Turns on the TD_PAUSE_THE_CUT and TD_PAUSE_DIALOGUE
|
|
/// PARAMS:
|
|
/// bitmask -
|
|
PROC PAUSE_TENNIS_INTERSTITIAL_AND_DIALOGUE(INT &bitmask)
|
|
SET_BITMASK_AS_ENUM(bitmask, TD_PAUSE_THE_CUT)
|
|
SET_BITMASK_AS_ENUM(bitmask, TD_PAUSE_DIALOGUE)
|
|
CPRINTLN(DEBUG_TENNIS, "Pausing dialogue and the interstitial cut")
|
|
ENDPROC
|
|
|
|
PROC TENNIS_ACTIVATE_SIDE_CHANGE_PART_1(TENNIS_GAME_PROPERTIES &thisProps)
|
|
CPRINTLN(DEBUG_TENNIS, "TENNIS_ACTIVATE_SIDE_CHANGE_PART_1 called")
|
|
IF thisProps.tennisPlayers[0].eCourtSide = TENNIS_PLAYER_AWAY
|
|
thisProps.tennisPlayers[0].eCourtside = TENNIS_PLAYER_HOME
|
|
thisProps.tennisPlayers[1].eCourtside = TENNIS_PLAYER_AWAY
|
|
CPRINTLN(DEBUG_TENNIS, "Away player now on eCourtSide TENNIS_PLAYER_HOME")
|
|
ELSE
|
|
thisProps.tennisPlayers[0].eCourtside = TENNIS_PLAYER_AWAY
|
|
thisProps.tennisPlayers[1].eCourtside = TENNIS_PLAYER_HOME
|
|
CPRINTLN(DEBUG_TENNIS, "Away player now on eCourtSide TENNIS_PLAYER_AWAY")
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC TENNIS_ACTIVATE_SIDE_CHANGE_PART_2(TENNIS_GAME_PROPERTIES &thisProps, TENNIS_CAMERAS &thisCams)
|
|
thisProps.tennisPlayers[0].vMyRight = thisProps.tennisPlayers[0].vMyRight * -1.0
|
|
thisProps.tennisPlayers[0].vMyForward = thisProps.tennisPlayers[0].vMyForward * -1.0
|
|
thisProps.tennisPlayers[1].vMyRight = thisProps.tennisPlayers[1].vMyRight * -1.0
|
|
thisProps.tennisPlayers[1].vMyForward = thisProps.tennisPlayers[1].vMyForward * -1.0
|
|
|
|
CPRINTLN(DEBUG_TENNIS, "TENNIS_ACTIVATE_SIDE_CHANGE_PART_2 called")
|
|
IF thisCams.eChosenCam = TENNIS_CAMERA_FAR
|
|
thisCams.eChosenCam = TENNIS_CAMERA_FAR_OTHER_SIDE
|
|
CPRINTLN(DEBUG_TENNIS, "ePrevCam = TENNIS_CAMERA_FAR_OTHER_SIDE")
|
|
ELIF thisCams.eChosenCam = TENNIS_CAMERA_FAR_OTHER_SIDE
|
|
thisCams.eChosenCam = TENNIS_CAMERA_FAR
|
|
CPRINTLN(DEBUG_TENNIS, "ePrevCam = TENNIS_CAMERA_FAR")
|
|
ELSE
|
|
CPRINTLN(DEBUG_TENNIS, "eChosenCam not changing during side change, eChosenCam = ", thisCams.eChosenCam)
|
|
ENDIF
|
|
|
|
IF thisCams.eTennisCam = TENNIS_CAMERA_FAR
|
|
thisCams.eTennisCam = TENNIS_CAMERA_FAR_OTHER_SIDE
|
|
CPRINTLN(DEBUG_TENNIS, "eTennisCam = TENNIS_CAMERA_FAR_OTHER_SIDE")
|
|
ELIF thisCams.eTennisCam = TENNIS_CAMERA_FAR_OTHER_SIDE
|
|
thisCams.eTennisCam = TENNIS_CAMERA_FAR
|
|
CPRINTLN(DEBUG_TENNIS, "eTennisCam = TENNIS_CAMERA_FAR")
|
|
ELSE
|
|
CPRINTLN(DEBUG_TENNIS, "eTennisCam not changing during side change, eTennisCam = ", thisCams.eTennisCam)
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// Switching players' forward and right vectors and their eCourtSide
|
|
/// PARAMS:
|
|
/// thisProps -
|
|
/// thisCams - uses ePrevCam, make sure that this is called after the appropriate SET_TENNIS_CAMERA_ENUM calls
|
|
PROC TENNIS_ACTIVATE_SIDE_CHANGE(TENNIS_GAME_PROPERTIES &thisProps, TENNIS_CAMERAS &thisCams)
|
|
CPRINTLN(DEBUG_TENNIS, "Swapping player sides, switching eCourtSide enum and vMyRight/vMyForward vectors. Potentially swapping ePrevCam.")
|
|
TENNIS_ACTIVATE_SIDE_CHANGE_PART_1(thisProps)
|
|
TENNIS_ACTIVATE_SIDE_CHANGE_PART_2(thisProps, thisCams)
|
|
ENDPROC
|
|
|
|
PROC READY_TENNIS_FOR_REMATCH(TENNIS_GAME_PROPERTIES &thisProps, TENNIS_GAME_UI_DATA &thisUIData, TENNIS_GAME_STATUS &thisStatus, TENNIS_PLAYER_ID eSelfID, TENNIS_PLAYER_ID eOtherID)
|
|
CPRINTLN(DEBUG_TENNIS, "***************************** Readying Tennis for a rematch *****************************")
|
|
thisUIData.iCurrentOption = 0
|
|
RESET_TENNIS_DEUCE_COUNT(thisUIData)
|
|
SET_TENNIS_UI_STATE(thisUIData, TENNIS_UI_SET_INIT)
|
|
thisUIData.ePrevUIState = TENNIS_UI_SET_INIT
|
|
CLEAR_BITMASK_AS_ENUM(thisUIData.iUtilFlags, TD_MATCH_POINT_DSTAR)
|
|
CLEAR_BITMASK_AS_ENUM(thisUIData.iUtilFlags, TD_PLR_SAD)
|
|
CLEAR_BITMASK_AS_ENUM(thisUIData.iUtilFlags, TD_PLR_HAPPY)
|
|
CLEAR_BITMASK_AS_ENUM(thisUIData.iUtilFlags, TD_OPP_SAD)
|
|
CLEAR_BITMASK_AS_ENUM(thisUIData.iUtilFlags, TD_OPP_HAPPY)
|
|
CLEAR_BITMASK_AS_ENUM(thisUIData.iUtilFlags, TD_GAME_DONE_STISH)
|
|
CLEAR_BITMASK_AS_ENUM(thisUIData.iUtilFlags, TD_ANIM_PLAYING)
|
|
CLEAR_BITMASK_AS_ENUM(thisUIData.iUtilFlags, TD_GAME_LOST)
|
|
CLEAR_BITMASK_AS_ENUM(thisUIData.iUtilFlags, TD_GAME_WON)
|
|
CLEAR_BITMASK_AS_ENUM(thisUIData.iUtilFlags, TD_POINT_LOST)
|
|
CLEAR_BITMASK_AS_ENUM(thisUIData.iUtilFlags, TD_POINT_WON)
|
|
CLEAR_BITMASK_AS_ENUM(thisUIData.iUtilFlags, TD_PAUSE_DIALOGUE)
|
|
CLEAR_BITMASK_AS_ENUM(thisUIData.iUtilFlags, TD_PAUSE_THE_CUT)
|
|
CLEAR_BITMASK_AS_ENUM(thisUIData.iUtilFlags, TD_POINT_W_DSTAR)
|
|
CLEAR_BITMASK_AS_ENUM(thisUIData.iUtilFlags, TD_PAUSE_THE_CUT)
|
|
SET_BITMASK_AS_ENUM(thisUIData.iUtilFlags, TD_UPDATE_SCORES)
|
|
SET_BITMASK_AS_ENUM(thisUIData.iUtilFlags, TD_FIRST_SERVE)
|
|
CLEAR_TENNIS_FLOW_FLAG(thisProps, TFF_WALKING_TO_POSITION)
|
|
SET_TENNIS_CUTSCENE_STATE(thisUIData.tennisCameras, CUT_INIT)
|
|
CLEAR_TENNIS_CONVO_FLAG(thisUIData, TCVF_AMANDA_GETS_LAST_WORD)
|
|
|
|
SET_TENNIS_STATUS_WHO_IS_SERVING(thisStatus, eSelfID)
|
|
SET_TENNIS_SERVING_SIDE(thisStatus, SERVING_FROM_RIGHT)
|
|
SET_TENNIS_GAME_STATE(thisStatus, TGSE_OPTION_MENU)
|
|
thisStatus.iServeCount = 0
|
|
thisStatus.iCurrentSet = 0
|
|
|
|
IF thisProps.tennisPlayers[eSelfID].eCourtSide <> eSelfID
|
|
TENNIS_ACTIVATE_SIDE_CHANGE(thisProps, thisUIData.tennisCameras)
|
|
ENDIF
|
|
|
|
INT p=0
|
|
WHILE p < GET_TENNIS_STATUS_NUM_SETS(thisStatus)
|
|
thisStatus.playerScores[eSelfID].iGamesWon[p] = 0
|
|
thisStatus.playerScores[eOtherID].iGamesWon[p] = 0
|
|
p++
|
|
ENDWHILE
|
|
thisStatus.playerScores[eSelfID].iPointsWon = 0
|
|
thisStatus.playerScores[eSelfID].iSetsWon = 0
|
|
thisStatus.playerScores[eOtherID].iPointsWon = 0
|
|
thisStatus.playerScores[eOtherID].iSetsWon = 0
|
|
|
|
IF ANIMPOSTFX_IS_RUNNING("MinigameTransitionIn")
|
|
ANIMPOSTFX_STOP("MinigameTransitionIn")
|
|
ENDIF
|
|
ANIMPOSTFX_PLAY("MinigameTransitionOut", 0, FALSE)
|
|
|
|
SETUP_TENNIS_COURT_SHADOWS()
|
|
ATTACH_TENNIS_RACKETS_TO_PLAYERS(thisProps, eSelfID, eOtherID)
|
|
SET_ENTITY_COORDS(GET_TENNIS_PLAYER_INDEX(thisProps.tennisPlayers[eOtherID]),
|
|
GET_TENNIS_SERVICE_POSITION(thisProps.tennisCourt, SERVING_FROM_RIGHT, thisProps.vRight, thisProps.vForward, TRUE, eOtherID))
|
|
thisProps.tennisPlayers[eOtherID].vPos = GET_ENTITY_COORDS(GET_TENNIS_PLAYER_INDEX(thisProps.tennisPlayers[eOtherID]))
|
|
SET_ENTITY_HEADING(thisProps.tennisPlayers[eOtherID].pIndex, GET_HEADING_FROM_VECTOR_2D(thisProps.tennisPlayers[eOtherID].vMyForward.x,thisProps.tennisPlayers[eOtherID].vMyForward.y))
|
|
SET_ENTITY_COORDS(GET_TENNIS_PLAYER_INDEX(thisProps.tennisPlayers[eSelfID]),
|
|
GET_TENNIS_SERVICE_POSITION(thisProps.tennisCourt, SERVING_FROM_RIGHT, thisProps.vRight, thisProps.vForward, FALSE, eSelfID)) //, TRUE, TRUE, TRUE)
|
|
thisProps.tennisPlayers[eSelfID].vPos = GET_ENTITY_COORDS(GET_TENNIS_PLAYER_INDEX(thisProps.tennisPlayers[eSelfID]))
|
|
SET_ENTITY_HEADING(thisProps.tennisPlayers[eSelfID].pIndex, GET_HEADING_FROM_VECTOR_2D(thisProps.tennisPlayers[eSelfID].vMyForward.x,thisProps.tennisPlayers[eSelfID].vMyForward.y))
|
|
STRING sDict = PICK_STRING(IS_TENNIS_PED_MALE(thisProps.tennisPlayers[eSelfID]), "mini@tennis", "mini@tennis@female")
|
|
IF NOT IS_ENTITY_PLAYING_ANIM(GET_TENNIS_PLAYER_INDEX(thisProps.tennisPlayers[eSelfID]), sDict, "intro_a")
|
|
TASK_PLAY_ANIM(GET_TENNIS_PLAYER_INDEX(thisProps.tennisPlayers[eSelfID]), sDict, "intro_a", default, default, default, AF_LOOPING)
|
|
FORCE_PED_AI_AND_ANIMATION_UPDATE(GET_TENNIS_PLAYER_INDEX(thisProps.tennisPlayers[eSelfID]), TRUE)
|
|
ENDIF
|
|
sDict = PICK_STRING(IS_TENNIS_PED_MALE(thisProps.tennisPlayers[eOtherID]), "mini@tennis", "mini@tennis@female")
|
|
IF NOT IS_ENTITY_PLAYING_ANIM(GET_TENNIS_PLAYER_INDEX(thisProps.tennisPlayers[eOtherID]), sDict, "intro_b")
|
|
TASK_PLAY_ANIM(GET_TENNIS_PLAYER_INDEX(thisProps.tennisPlayers[eOtherID]), sDict, "intro_b", default, default, default, AF_LOOPING)
|
|
FORCE_PED_AI_AND_ANIMATION_UPDATE(GET_TENNIS_PLAYER_INDEX(thisProps.tennisPlayers[eOtherID]), TRUE)
|
|
ENDIF
|
|
|
|
SET_TENNIS_STATUS_REMATCH(thisStatus, TRUE)
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
///
|
|
/// PARAMS:
|
|
/// thisScores -
|
|
/// iCurrentSet -
|
|
/// RETURNS:
|
|
///
|
|
FUNC BOOL TENNIS_SHOULD_SIDES_CHANGE(TENNIS_SCORES &thisScores[], INT iCurrentSet)
|
|
INT iTotalGamesPlayed = 0
|
|
INT p = 0
|
|
|
|
WHILE p < iCurrentSet + 1
|
|
iTotalGamesPlayed += thisScores[0].iGamesWon[p]
|
|
iTotalGamesPlayed += thisScores[1].iGamesWon[p]
|
|
p++
|
|
ENDWHILE
|
|
|
|
IF iTotalGamesPlayed % 2 = 0
|
|
RETURN FALSE
|
|
ELSE
|
|
RETURN TRUE
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|