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