USING "globals.sch" USING "tennis_mp.sch" USING "Net_XP_func.sch" USING "tennis_ui.sch" // The client broadcast data // Everyone can read this data, only the local player only the server can update it STRUCT TENNIS_CLIENT_BD TENNIS_MP_STATE eMPState TENNIS_GAME_STATE_ENUM eGameState TENNIS_GAME_STATE_ENUM ePrevGameState PLAYER_INDEX piCurPlayerID enumActivityResult eResult TENNIS_HEADSET_ENUM eMyHeadset VECTOR vPredBallPos, vPredBallVel TENNIS_BALL_SPIN ePredSpin INT iControlFlags INT iFrameStamp INT iRallyCounter INT iWaitStamp INT iOutroStamp // INT iBallUpdateStamp INT iBallCatchupTime LAUNCH_DETAIL_ENUM eServeGrade FMMC_EOM_DETAILS sEndOfMission VECTOR vForward, vRight TENNIS_PLAYER_ID eCourtside PED_INDEX pedClones[TENNIS_PLAYERS] ENDSTRUCT FUNC STRING GET_STRING_FROM_TENNIS_ACTIVITY_RESULT( enumActivityResult eResult ) SWITCH eResult CASE AR_playerWon RETURN "AR_playerWon" CASE AR_playerQuit RETURN "AR_playerQuit" CASE AR_buddyA_won RETURN "AR_buddyA_won" ENDSWITCH RETURN "unknown result" ENDFUNC PROC SET_TENNIS_CLIENT_OUTRO_STAMP(TENNIS_CLIENT_BD &clientBD, INT iNewStamp) CDEBUG2LN(DEBUG_TENNIS, "SET_TENNIS_CLIENT_OUTRO_STAMP :: clientBD.iOutroStamp =, ", iNewStamp) clientBD.iOutroStamp = iNewStamp ENDPROC FUNC INT GET_TENNIS_CLIENT_OUTRO_STAMP(TENNIS_CLIENT_BD &clientBD) RETURN clientBD.iOutroStamp ENDFUNC //PROC SET_TENNIS_CLIENT_BALL_UPDATE_STAMP(TENNIS_CLIENT_BD &clientBD, INT iNewStamp) // CDEBUG2LN(DEBUG_TENNIS, "SET_TENNIS_CLIENT_BALL_UPDATE_STAMP :: iNewStamp=", iNewStamp) // clientBD.iBallUpdateStamp = iNewStamp //ENDPROC // //FUNC INT GET_TENNIS_CLIENT_BALL_UPDATE_STAMP(TENNIS_CLIENT_BD &clientBD) // RETURN clientBD.iBallUpdateStamp //ENDFUNC PROC SET_TENNIS_CLIENT_BALL_CATCHUP_TIME(TENNIS_CLIENT_BD &clientBD, INT iNewTime) CDEBUG2LN(DEBUG_TENNIS, "SET_TENNIS_CLIENT_BALL_CATCHUP_TIME :: iNewTime=", iNewTime) clientBD.iBallCatchupTime = iNewTime ENDPROC FUNC INT GET_TENNIS_CLIENT_BALL_CATCHUP_TIME(TENNIS_CLIENT_BD &clientBD) RETURN clientBD.iBallCatchupTime ENDFUNC PROC SET_TENNIS_CLIENT_PRED_BALL_SPIN(TENNIS_CLIENT_BD & clientBD, TENNIS_BALL_SPIN eNewSpin) clientBD.ePredSpin = eNewSpin ENDPROC FUNC TENNIS_BALL_SPIN GET_TENNIS_CLIENT_PRED_BALL_SPIN(TENNIS_CLIENT_BD & clientBD) RETURN clientBD.ePredSpin ENDFUNC PROC SET_TENNIS_CLIENT_PRED_BALL_POS(TENNIS_CLIENT_BD & clientBD, VECTOR vNewPos) CDEBUG2LN(DEBUG_TENNIS, "SET_TENNIS_CLIENT_PRED_BALL_POS vNewPos=", vNewPos) clientBD.vPredBallPos = vNewPos ENDPROC FUNC VECTOR GET_TENNIS_CLIENT_PRED_BALL_POS(TENNIS_CLIENT_BD & clientBD) RETURN clientBD.vPredBallPos ENDFUNC PROC SET_TENNIS_CLIENT_PRED_BALL_VEL(TENNIS_CLIENT_BD & clientBD, VECTOR vNewVel) CDEBUG2LN(DEBUG_TENNIS, "SET_TENNIS_CLIENT_PRED_BALL_POS vNewVel=", vNewVel) clientBD.vPredBallVel = vNewVel ENDPROC FUNC VECTOR GET_TENNIS_CLIENT_PRED_BALL_VEL(TENNIS_CLIENT_BD & clientBD) RETURN clientBD.vPredBallVel ENDFUNC PROC SET_TENNIS_CLIENT_WAIT_STAMP(TENNIS_CLIENT_BD &clientBD, INT iNewStamp) CPRINTLN(DEBUG_TENNIS, "SET_TENNIS_CLIENT_WAIT_STAMP iNewStamp=", iNewStamp) clientBD.iWaitStamp = iNewStamp ENDPROC FUNC INT GET_TENNIS_CLIENT_WAIT_STAMP(TENNIS_CLIENT_BD &clientBD) RETURN clientBD.iWaitStamp ENDFUNC FUNC TENNIS_HEADSET_ENUM GET_TENNIS_CLIENT_HEADSET_STATE(TENNIS_CLIENT_BD &clientBD) RETURN clientBD.eMyHeadset ENDFUNC PROC SET_TENNIS_CLIENT_HEADSET_STATE(TENNIS_CLIENT_BD &clientBD, TENNIS_HEADSET_ENUM eHeadset) CDEBUG2LN( DEBUG_TENNIS, "SET_TENNIS_CLIENT_HEADSET_STATE :: setting to ", GET_STRING_FROM_TENNIS_HEADSET_ENUM( eHeadset ), " for player ", NATIVE_TO_INT( clientBD.piCurPlayerID ) ) clientBD.eMyHeadset = eHeadset ENDPROC PROC SET_TENNIS_CLIENT_FLAG(TENNIS_CLIENT_BD &clientBD, TENNIS_MP_CLIENT_FLAGS eFlag) CDEBUG2LN(DEBUG_TENNIS, "SET_TENNIS_CLIENT_FLAG :: Setting ", GET_STRING_FROM_TENNIS_CLIENT_FLAG(eFlag)) SET_BITMASK_AS_ENUM(clientBD.iControlFlags, eFlag) ENDPROC PROC CLEAR_TENNIS_CLIENT_FLAG(TENNIS_CLIENT_BD &clientBD, TENNIS_MP_CLIENT_FLAGS eFlag) CDEBUG2LN(DEBUG_TENNIS, "CLEAR_TENNIS_CLIENT_FLAG :: Clearing ", GET_STRING_FROM_TENNIS_CLIENT_FLAG(eFlag)) CLEAR_BITMASK_AS_ENUM(clientBD.iControlFlags, eFlag) ENDPROC FUNC BOOL IS_TENNIS_CLIENT_FLAG_SET(TENNIS_CLIENT_BD &clientBD, TENNIS_MP_CLIENT_FLAGS eFlag) RETURN IS_BITMASK_AS_ENUM_SET(clientBD.iControlFlags, eFlag) ENDFUNC /// PURPOSE: /// Increase the client's rally counter by 1. /// PARAMS: /// clientBD - PROC INCREASE_TENNIS_CLIENT_RALLY_COUNTER(TENNIS_CLIENT_BD &clientBD) clientBD.iRallyCounter++ CPRINTLN( DEBUG_TENNIS, "INCREASE_TENNIS_CLIENT_RALLY_COUNTER called, iRallyCounter=", clientBD.iRallyCounter ) ENDPROC /// PURPOSE: /// Tells us whether to award bonus XP or not /// PARAMS: /// clientBD - /// RETURNS: /// TRUE If the rally counter is >= RALLY_XP_THRESHOLD FUNC BOOL SHOULD_TENNIS_CLIENT_GET_RALLY_XP_BONUS(TENNIS_CLIENT_BD &clientBD) RETURN clientBD.iRallyCounter >= RALLY_XP_THRESHOLD ENDFUNC /// PURPOSE: /// Reset the player's rally counter to 0 /// PARAMS: /// clientBD - PROC RESET_TENNIS_CLIENT_RALLY_COUNTER(TENNIS_CLIENT_BD &clientBD) CDEBUG2LN( DEBUG_TENNIS, "RESET_TENNIS_CLIENT_RALLY_COUNTER called" ) clientBD.iRallyCounter = 0 ENDPROC /// PURPOSE: /// Award the local player RALLY_XP_BONUS PROC AWARD_TENNIS_CLIENT_RALLY_XP_BONUS() INT iXPToGive = ROUND(RALLY_XP_BONUS * g_sMPTunables.fxp_tunable_Minigames_Tennis_Rally) CPRINTLN(DEBUG_TENNIS, "AWARD_TENNIS_CLIENT_RALLY_XP_BONUS given, make sure this doesn't happen every frame, iXPToGive=", iXPToGive) GIVE_LOCAL_PLAYER_XP(eXPTYPE_CO_OP_JOBFM, "XPT_TENNIS",XPTYPE_SKILL, XPCATEGORY_SKILL_TENNIS_RALLY, iXPToGive) ENDPROC PROC SET_TENNIS_CLIENT_SERVE_GRADE(TENNIS_CLIENT_BD &clientBD, LAUNCH_DETAIL_ENUM eServe) clientBD.eServeGrade = eServe ENDPROC FUNC LAUNCH_DETAIL_ENUM GET_TENNIS_CLIENT_SERVE_GRADE(TENNIS_CLIENT_BD &clientBD) RETURN clientBD.eServeGrade ENDFUNC PROC SET_TENNIS_CLIENT_ACTIVITY_RESULT(TENNIS_CLIENT_BD &clientBD, enumActivityResult eNewResult) CDEBUG2LN(DEBUG_TENNIS, "SET_TENNIS_CLIENT_ACTIVITY_RESULT set to ", GET_STRING_FROM_TENNIS_ACTIVITY_RESULT( eNewResult ) ) clientBD.eResult = eNewResult ENDPROC FUNC enumActivityResult GET_TENNIS_CLIENT_ACTIVITY_RESULT(TENNIS_CLIENT_BD &clientBD) CDEBUG2LN(DEBUG_TENNIS, "GET_TENNIS_CLIENT_ACTIVITY_RESULT returning ", GET_STRING_FROM_TENNIS_ACTIVITY_RESULT( clientBD.eResult ) ) RETURN clientBD.eResult ENDFUNC PROC SET_TENNIS_CLIENT_FRAME_STAMP(TENNIS_CLIENT_BD &thisBD, INT iNewFrameStamp) CPRINTLN(DEBUG_TENNIS, "SET_TENNIS_CLIENT_FRAME_STAMP iNewFrameStamp=", iNewFrameStamp) thisBD.iFrameStamp = iNewFrameStamp ENDPROC FUNC INT GET_TENNIS_CLIENT_FRAME_STAMP(TENNIS_CLIENT_BD &thisBD) RETURN thisBD.iFrameStamp ENDFUNC /// PURPOSE: /// accessor /// PARAMS: /// thisBD - /// RETURNS: /// FUNC PLAYER_INDEX GET_TENNIS_MP_PI_CUR_PLAYER_ID(TENNIS_CLIENT_BD &thisBD) RETURN thisBD.piCurPlayerID ENDFUNC /// PURPOSE: /// mutator /// PARAMS: /// thisBD - /// piID - PROC SET_TENNIS_PI_CUR_PLAYER_ID(TENNIS_CLIENT_BD &thisBD, PLAYER_INDEX piID) thisBD.piCurPlayerID = piID ENDPROC /// PURPOSE: /// accessor /// PARAMS: /// thisBD - /// RETURNS: /// FUNC TENNIS_MP_STATE GET_TENNIS_CLIENT_MP_STATE(TENNIS_CLIENT_BD &thisBD) RETURN thisBD.eMPState ENDFUNC /// PURPOSE: /// mutator /// PARAMS: /// thisBD - /// newMPState - PROC SET_TENNIS_CLIENT_MP_STATE(TENNIS_CLIENT_BD &thisBD, TENNIS_MP_STATE newTMPS) IF thisBD.eMPState <> newTMPS thisBD.eMPState = newTMPS SET_TENNIS_CLIENT_WAIT_STAMP(thisBD, GET_GAME_TIMER() + ROUND(DESYNC_THRESHOLD * 1000)) CPRINTLN(DEBUG_TENNIS, "Game Timer: ", GET_GAME_TIMER(), " SET_TENNIS_CLIENT_MP_STATE: Client Set to MP State: ", GET_STRING_FROM_TENNIS_MP_STATE(newTMPS), ", ", thisBD.eMPState) ELSE CPRINTLN(DEBUG_TENNIS, "Game Timer: ", GET_GAME_TIMER(), " SET_TENNIS_CLIENT_MP_STATE: Client Already Set to MP State: ", GET_STRING_FROM_TENNIS_MP_STATE(thisBD.eMPState)) ENDIF ENDPROC /// PURPOSE: /// accessor /// PARAMS: /// thisBD - /// RETURNS: /// FUNC TENNIS_GAME_STATE_ENUM GET_TENNIS_CLIENT_GAME_STATE(TENNIS_CLIENT_BD &thisBD) RETURN thisBD.eGameState ENDFUNC /// PURPOSE: /// accessor /// PARAMS: /// thisBD - /// RETURNS: /// FUNC TENNIS_GAME_STATE_ENUM GET_TENNIS_CLIENT_PREV_GAME_STATE(TENNIS_CLIENT_BD &thisBD) RETURN thisBD.ePrevGameState ENDFUNC /// PURPOSE: /// Sets the clientBD game state and changes the MP state to lockstep /// Will not go to lockstep if it's trying to set the state to one it already wants to go to. /// PARAMS: /// thisBD - /// newTGSE - PROC SET_TENNIS_CLIENT_GAME_STATE(TENNIS_CLIENT_BD &thisBD, TENNIS_GAME_STATE_ENUM newTGSE) IF thisBD.eGameState <> newTGSE thisBD.ePrevGameState = thisBD.eGameState thisBD.eGameState = newTGSE CPRINTLN(DEBUG_TENNIS, "Game Timer: ", GET_GAME_TIMER(), " SET_TENNIS_CLIENT_GAME_STATE: Client Requesting to go to ", GET_STRING_FROM_TENNIS_GAME_STATE(newTGSE), ", ", newTGSE) ELSE CPRINTLN(DEBUG_TENNIS, "Game Timer: ", GET_GAME_TIMER(), " SET_TENNIS_CLIENT_GAME_STATE: Trying to request ", GET_STRING_FROM_TENNIS_GAME_STATE(newTGSE), ". State already requested") ENDIF ENDPROC