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

695 lines
25 KiB
Scheme
Executable File

// Range_Round.sch
USING "Range_Score.sch"
CONST_FLOAT CONST_GraceResetTime 1.0
TWEAK_INT k_RANGE_TARGET_HIT_BUFFER 30 // in milliseconds
/// PURPOSE: Used to store data related to our grace period for auto weapons.
STRUCT Range_Grace
BOOL bGraceUsed // Single shot grace period when firing automatic weapons, so he doens't lose multiplier right away.
structTimer tGraceResetTimer // Eventually reset the grace period timer.
ENDSTRUCT
ENUM ROUND_INFO_FLAGS
ROUND_SHOT_FIRED = BIT0,
ROUND_TARGET_HIT = BIT1,
ROUND_PASS_NOISE_PLAYED = BIT5,
ROUND_WIPE_CAM = BIT6,
ROUND_CAN_DISPLAY_TARGET_HELP = BIT7,
// You set these.
ROUND_USE_FRAGGABLE_TARGETS = BIT9,
ROUND_USE_METAL_TARGETS = BIT10,
ROUND_USE_BACK_RANGE = BIT11,
ROUND_NO_TIME_BONUS = BIT16,
ROUND_TARGETS_ARE_INFINITE = BIT20,
ROUND_ALLOW_TIME_EXPIRY = BIT21,
ROUND_AWARDED_PERCENTAGE = BIT22,
// Don't set these.
ROUND_PLAYER_OWNS_WEAPON = BIT12,
ROUND_TIME_IS_UP = BIT13,
ROUND_PLAYED_10_SEC_WARNING = BIT14,
ROUND_PLAYED_5_SEC_WARNING = BIT15,
ROUND_FAIL_TARGET_CLEANUP = BIT17,
ROUND_PLAYER_OWNS_HG_FLASHLIGHT = BIT18,
ROUND_PLAYER_OWNS_AR_FLASHLIGHT = BIT19,
// Or this.
ROUND_HVY3_FLOAT_HELP = BIT30
ENDENUM
/// PURPOSE: This struct tends to track things on a per-loop basis.
/// There's a few things in here that aren't, like total shots.
STRUCT Range_RoundInfo
INT iTotalShots
INT iZ1Hits
INT iZ2Hits
INT iZ3Hits
INT iZ4Hits
INT iTargetsDestroyed
INT iMaxTargets
INT iStoredAmmoCount
INT iMaxActions
INT iTargetsHitThisExplosion = 0
INT iRoundFlags
INT iSFX_Warning = -1
INT iBeepTimeStamp
RANGE_ROUND_TYPE eRoundType
RANGE_WEAPON_CATEGORY eWeaponCat
RANGE_WEAPON_TYPE eWeaponType
RANGE_WEAPON_CHALLENGES eChallengeType
FLOAT fCurrentBulletDamage
FLOAT fCurrentRoundLength
FLOAT fTotalTime // I tihnk this is the total time taken...
FLOAT fStartTime
FLOAT fNoAmmoStamp // No clue what this is.
FLOAT fTotalPauseTime
FLOAT fCurrentPauseTime
structTimer sTimeLeft
structTimer sGenTimer // "Use to control misc things."
Range_Grace sGraceInfo
Range_MultiplierData sMPData
Range_ScoreData sScoreData
INT iTargetHitsCached
INT iTargetHitsBuffer
ENDSTRUCT
/// PURPOSE: Contains info on a specific challenge.
STRUCT Range_Challenge
RANGE_ROUND_TYPE eRndType
RANGE_ROUND_TYPE eUnlockReq
ROUND_SCORING_STYLE eScoringStyle
INT iZ1Hits
INT iZ2Hits
INT iZ3Hits
INT iZ4Hits
INT iBronzeReq
INT iSilverReq
INT iGoldReq
ENDSTRUCT
/// PURPOSE: This is the info associated with all rounds:
/// - If it's unlocked
/// - Round type
/// - Unlock Req
/// - Medal thresholds
/// This is meant to be init once, and then only the bUnlock will really change.
STRUCT Range_WeaponRounds
Range_Challenge sChallenges[NUM_WEAPON_CHALLS]
ENDSTRUCT
PROC PLAY_RANGE_SOUND(STRING sSound, BOOL bHUDDefaultSet = FALSE)
CDEBUG2LN(DEBUG_SHOOTRANGE, "PLAY_RANGE_SOUND :: called, playing ", sSound)
IF bHUDDefaultSet
PLAY_SOUND_FRONTEND(-1, sSound, "HUD_FRONTEND_DEFAULT_SOUNDSET")
ELSE
PLAY_SOUND_FRONTEND(-1, sSound, "HUD_MINI_GAME_SOUNDSET")
ENDIF
ENDPROC
PROC RANGE_INCREMENT_ZONE_HITS(Range_RoundInfo & sRndInfo, INT iZone)
enumCharacterList ePed = GET_CURRENT_PLAYER_PED_ENUM()
STATSENUM eStat
IF ePed = CHAR_MICHAEL
eStat = SP0_HITS_PEDS_VEHICLES
ELIF ePed = CHAR_FRANKLIN
eStat = SP1_HITS_PEDS_VEHICLES
ELIF ePed = CHAR_TREVOR
eStat = SP2_HITS_PEDS_VEHICLES
ENDIF
SWITCH iZone
CASE 1
sRndInfo.iZ1Hits++
STAT_INCREMENT(eStat, 1.0)
CDEBUG2LN(DEBUG_SHOOTRANGE, "RANGE_INCREMENT_ZONE_HITS: Incrementing zone ", iZone, " hits to ", sRndInfo.iZ1Hits, ", ePed=", ePed, ", eStat=", eStat)
BREAK
CASE 2
sRndInfo.iZ2Hits++
STAT_INCREMENT(eStat, 1.0)
CDEBUG2LN(DEBUG_SHOOTRANGE, "RANGE_INCREMENT_ZONE_HITS: Incrementing zone ", iZone, " hits to ", sRndInfo.iZ2Hits, ", ePed=", ePed, ", eStat=", eStat)
BREAK
CASE 3
sRndInfo.iZ3Hits++
STAT_INCREMENT(eStat, 1.0)
CDEBUG2LN(DEBUG_SHOOTRANGE, "RANGE_INCREMENT_ZONE_HITS: Incrementing zone ", iZone, " hits to ", sRndInfo.iZ3Hits, ", ePed=", ePed, ", eStat=", eStat)
BREAK
CASE 4
sRndInfo.iZ4Hits++
STAT_INCREMENT(eStat, 1.0)
CDEBUG2LN(DEBUG_SHOOTRANGE, "RANGE_INCREMENT_ZONE_HITS: Incrementing zone ", iZone, " hits to ", sRndInfo.iZ4Hits, ", ePed=", ePed, ", eStat=", eStat)
BREAK
DEFAULT
CDEBUG2LN(DEBUG_SHOOTRANGE, "Passing an invalid Zone to RANGE_INCREMENT_ZONE_HITS :: ", iZone)
BREAK
ENDSWITCH
ENDPROC
FUNC ROUND_SCORING_STYLE GET_ROUND_SCORE_STYLE(Range_RoundInfo & sCurRoundInfo)
RETURN sCurRoundInfo.sScoreData.eScoreStyle
ENDFUNC
/// PURPOSE:
/// Sets a round type to unlocked
/// PARAMS:
/// eRoundType - The round type to be unlocked
PROC SET_ROUND_UNLOCKED(RANGE_ROUND_TYPE eRoundType, BOOL bUnlocked = TRUE)
g_savedGlobals.sRangeData[ePlayerChar].sRounds[eRoundType].bUnlocked = bUnlocked
ENDPROC
/// PURPOSE:
/// Sets a round type to unlocked
/// PARAMS:
/// eRoundType - The round type to be unlocked
PROC SET_ROUND_PASSED(RANGE_ROUND_TYPE eRoundType, BOOL bPassed = TRUE)
g_savedGlobals.sRangeData[ePlayerChar].sRounds[eRoundType].bPassed = bPassed
ENDPROC
/// PURPOSE:
/// STores zone hits for a round, but only if they surpass the zone hits from a previous round.
PROC SET_ROUND_ZONE_HITS(RANGE_ROUND_TYPE eRoundType, INT iScore, INT iZ1, INT iZ2, INT iZ3, INT iZ4)
CDEBUG2LN(DEBUG_SHOOTRANGE, "SET_ROUND_ZONE_HITS :: Called")
IF (iScore > GET_RANGE_SP_HIGH_SCORE(ePlayerChar, eRoundType))
CDEBUG2LN(DEBUG_SHOOTRANGE, "SET_ROUND_ZONE_HITS :: Higher Score")
g_savedGlobals.sRangeData[ePlayerChar].sRounds[eRoundType].iZone1Hit = iZ1
g_savedGlobals.sRangeData[ePlayerChar].sRounds[eRoundType].iZone2Hit = iZ2
g_savedGlobals.sRangeData[ePlayerChar].sRounds[eRoundType].iZone3Hit = iZ3
g_savedGlobals.sRangeData[ePlayerChar].sRounds[eRoundType].iZone4Hit = iZ4
CDEBUG2LN(DEBUG_SHOOTRANGE, "g_savedGlobals.sRangeData[ePlayerChar].sRounds[", eRoundType, "].iZone1Hit= ", g_savedGlobals.sRangeData[ePlayerChar].sRounds[eRoundType].iZone1Hit, ", iZ1=", iZ1)
CDEBUG2LN(DEBUG_SHOOTRANGE, "g_savedGlobals.sRangeData[ePlayerChar].sRounds[", eRoundType, "].iZone2Hit= ", g_savedGlobals.sRangeData[ePlayerChar].sRounds[eRoundType].iZone2Hit, ", iZ2=", iZ2)
CDEBUG2LN(DEBUG_SHOOTRANGE, "g_savedGlobals.sRangeData[ePlayerChar].sRounds[", eRoundType, "].iZone3Hit= ", g_savedGlobals.sRangeData[ePlayerChar].sRounds[eRoundType].iZone3Hit, ", iZ3=", iZ3)
CDEBUG2LN(DEBUG_SHOOTRANGE, "g_savedGlobals.sRangeData[ePlayerChar].sRounds[", eRoundType, "].iZone4Hit= ", g_savedGlobals.sRangeData[ePlayerChar].sRounds[eRoundType].iZone4Hit, ", iZ4=", iZ4)
ENDIF
ENDPROC
/// PURPOSE:
/// Checks if the certain round is passed (CheckRoundPassed)
/// RETURNS:
/// True if this round is passed
FUNC BOOL IS_ROUND_PASSED(RANGE_ROUND_TYPE eRoundType)
// Check our saved globals
RETURN g_savedGlobals.sRangeData[ePlayerChar].sRounds[eRoundType].bPassed
ENDFUNC
/// PURPOSE:
/// Checks if the certain round is unlocked
/// RETURNS:
/// True if this round is unlocked (met previous requirements)
FUNC BOOL IS_ROUND_UNLOCKED(RANGE_ROUND_TYPE eRoundType)
// Check our saved globals
RETURN g_savedGlobals.sRangeData[ePlayerChar].sRounds[eRoundType].bUnlocked
ENDFUNC
/// PURPOSE:
/// Checks if all the range rounds have been passed
/// RETURNS:
///
FUNC BOOL HANDLE_RANGE_ROUND_COMPLETION_PERCENTAGES()
BOOL bPistolPassed = IS_ROUND_PASSED(RT_PISTOL_CHAL_1) AND IS_ROUND_PASSED(RT_PISTOL_CHAL_2) AND IS_ROUND_PASSED(RT_PISTOL_CHAL_3)
BOOL bSMGPassed = IS_ROUND_PASSED(RT_SMG_CHAL_1) AND IS_ROUND_PASSED(RT_SMG_CHAL_2) AND IS_ROUND_PASSED(RT_SMG_CHAL_3)
BOOL bARPassed = IS_ROUND_PASSED(RT_AR_CHAL_1) AND IS_ROUND_PASSED(RT_AR_CHAL_2) AND IS_ROUND_PASSED(RT_AR_CHAL_3)
BOOL bShotgunPassed = IS_ROUND_PASSED(RT_SHOTGUN_CHAL_1) AND IS_ROUND_PASSED(RT_SHOTGUN_CHAL_2) AND IS_ROUND_PASSED(RT_SHOTGUN_CHAL_3)
BOOL bLMGPassed = IS_ROUND_PASSED(RT_LMG_CHAL_1) AND IS_ROUND_PASSED(RT_LMG_CHAL_2) AND IS_ROUND_PASSED(RT_LMG_CHAL_3)
BOOL bHeavyPassed = IS_ROUND_PASSED(RT_MINIGUN_CHAL_1) AND IS_ROUND_PASSED(RT_MINIGUN_CHAL_2) AND IS_ROUND_PASSED(RT_MINIGUN_CHAL_3)
IF bPistolPassed REGISTER_SCRIPT_IN_COMPLETION_PERCENTAGE_TOTAL (CP_MG_SHHAN) ENDIF
IF bSMGPassed REGISTER_SCRIPT_IN_COMPLETION_PERCENTAGE_TOTAL (CP_MG_SHSUB) ENDIF
IF bARPassed REGISTER_SCRIPT_IN_COMPLETION_PERCENTAGE_TOTAL (CP_MG_SHRIF) ENDIF
IF bShotgunPassed REGISTER_SCRIPT_IN_COMPLETION_PERCENTAGE_TOTAL (CP_MG_SHSHO) ENDIF
IF bLMGPassed REGISTER_SCRIPT_IN_COMPLETION_PERCENTAGE_TOTAL (CP_MG_SHLMG) ENDIF
IF bHeavyPassed REGISTER_SCRIPT_IN_COMPLETION_PERCENTAGE_TOTAL (CP_MG_SHHVY) ENDIF
RETURN bPistolPassed AND bSMGPassed AND bARPassed AND bShotgunPassed AND bLMGPassed AND bHeavyPassed
ENDFUNC
/// PURPOSE:
/// Returns the current highest medal for the specified round
/// PARAMS:
/// eRoundType - Which round type we are inquiring about
/// RETURNS:
/// The highest medal the player has earned in this round
FUNC RANGE_ROUND_MEDAL GET_ROUND_MEDAL(RANGE_ROUND_TYPE eRoundType)
RETURN g_savedGlobals.sRangeData[ePlayerChar].sRounds[eRoundType].eTopMedal
ENDFUNC
/// PURPOSE:
/// Sets our save data to store the medal for the specified round
/// PARAMS:
/// eRoundType - The round type
/// eMedal - The medal we are awarding
PROC SET_ROUND_MEDAL(RANGE_ROUND_TYPE eRoundType, RANGE_ROUND_MEDAL eMedal)
g_savedGlobals.sRangeData[ePlayerChar].sRounds[eRoundType].eTopMedal = eMedal
SET_ROUND_UNLOCKED(eRoundType, TRUE)
SET_ROUND_PASSED(eRoundType, TRUE)
PLAY_RANGE_SOUND("MEDAL_UP")
CPRINTLN( DEBUG_SHOOTRANGE, "SET_ROUND_MEDAL -- Awarding ", GET_STRING_FROM_RANGE_ROUND_MEDAL( eMedal ), " medal, ePlayerChar=", ePlayerChar, ", eRoundType=", GET_STRING_FROM_RANGE_ROUND_TYPE( eRoundType ) )
ENDPROC
/// PURPOSE:
/// Returns whether or not the player earned a bronze on the challenge passed in.
/// RETURNS:
/// TRUE if the player earned a bronze or better.
FUNC BOOL WAS_CHALLENGE_BRONZED(RANGE_ROUND_TYPE eRoundType)
RETURN (g_savedGlobals.sRangeData[ePlayerChar].sRounds[eRoundType].eTopMedal = RRM_GOLD)
OR (g_savedGlobals.sRangeData[ePlayerChar].sRounds[eRoundType].eTopMedal = RRM_SILVER)
OR(g_savedGlobals.sRangeData[ePlayerChar].sRounds[eRoundType].eTopMedal = RRM_BRONZE)
ENDFUNC
/// PURPOSE:
/// Returns whether or not the player earned a silver on the challenge passed in.
/// RETURNS:
/// TRUE if the player earned a silver or better.
FUNC BOOL WAS_CHALLENGE_SILVERED(RANGE_ROUND_TYPE eRoundType)
RETURN (g_savedGlobals.sRangeData[ePlayerChar].sRounds[eRoundType].eTopMedal = RRM_GOLD)
OR (g_savedGlobals.sRangeData[ePlayerChar].sRounds[eRoundType].eTopMedal = RRM_SILVER)
ENDFUNC
/// PURPOSE:
/// Returns whether or not the player earned a gold on the challenge passed in.
/// RETURNS:
/// TRUE if the player earned a gold.
FUNC BOOL WAS_CHALLENGE_GOLDED(RANGE_ROUND_TYPE eRoundType)
RETURN (g_savedGlobals.sRangeData[ePlayerChar].sRounds[eRoundType].eTopMedal = RRM_GOLD)
ENDFUNC
/// PURPOSE:
/// Checks if all the range rounds have bronze medals or better
/// RETURNS:
///
FUNC BOOL ARE_ALL_RANGE_ROUNDS_BRONZED()
BOOL bPistol = WAS_CHALLENGE_BRONZED(RT_PISTOL_CHAL_1) AND WAS_CHALLENGE_BRONZED(RT_PISTOL_CHAL_2) AND WAS_CHALLENGE_BRONZED(RT_PISTOL_CHAL_3)
BOOL bSMG = WAS_CHALLENGE_BRONZED(RT_SMG_CHAL_1) AND WAS_CHALLENGE_BRONZED(RT_SMG_CHAL_2) AND WAS_CHALLENGE_BRONZED(RT_SMG_CHAL_3)
BOOL bAR = WAS_CHALLENGE_BRONZED(RT_AR_CHAL_1) AND WAS_CHALLENGE_BRONZED(RT_AR_CHAL_2) AND WAS_CHALLENGE_BRONZED(RT_AR_CHAL_3)
BOOL bShotgun = WAS_CHALLENGE_BRONZED(RT_SHOTGUN_CHAL_1) AND WAS_CHALLENGE_BRONZED(RT_SHOTGUN_CHAL_2) AND WAS_CHALLENGE_BRONZED(RT_SHOTGUN_CHAL_3)
BOOL bLMG = WAS_CHALLENGE_BRONZED(RT_LMG_CHAL_1) AND WAS_CHALLENGE_BRONZED(RT_LMG_CHAL_2) AND WAS_CHALLENGE_BRONZED(RT_LMG_CHAL_3)
BOOL bHeavy = WAS_CHALLENGE_BRONZED(RT_MINIGUN_CHAL_1) AND WAS_CHALLENGE_BRONZED(RT_MINIGUN_CHAL_2) AND WAS_CHALLENGE_BRONZED(RT_MINIGUN_CHAL_3)
RETURN bPistol AND bSMG AND bAR AND bShotgun AND bLMG AND bHeavy
ENDFUNC
/// PURPOSE:
/// Checks if all the range rounds have been silver medals or better
/// RETURNS:
///
FUNC BOOL ARE_ALL_RANGE_ROUNDS_SILVERED()
BOOL bPistol = WAS_CHALLENGE_SILVERED(RT_PISTOL_CHAL_1) AND WAS_CHALLENGE_SILVERED(RT_PISTOL_CHAL_2) AND WAS_CHALLENGE_SILVERED(RT_PISTOL_CHAL_3)
BOOL bSMG = WAS_CHALLENGE_SILVERED(RT_SMG_CHAL_1) AND WAS_CHALLENGE_SILVERED(RT_SMG_CHAL_2) AND WAS_CHALLENGE_SILVERED(RT_SMG_CHAL_3)
BOOL bAR = WAS_CHALLENGE_SILVERED(RT_AR_CHAL_1) AND WAS_CHALLENGE_SILVERED(RT_AR_CHAL_2) AND WAS_CHALLENGE_SILVERED(RT_AR_CHAL_3)
BOOL bShotgun = WAS_CHALLENGE_SILVERED(RT_SHOTGUN_CHAL_1) AND WAS_CHALLENGE_SILVERED(RT_SHOTGUN_CHAL_2) AND WAS_CHALLENGE_SILVERED(RT_SHOTGUN_CHAL_3)
BOOL bLMG = WAS_CHALLENGE_SILVERED(RT_LMG_CHAL_1) AND WAS_CHALLENGE_SILVERED(RT_LMG_CHAL_2) AND WAS_CHALLENGE_SILVERED(RT_LMG_CHAL_3)
BOOL bHeavy = WAS_CHALLENGE_SILVERED(RT_MINIGUN_CHAL_1) AND WAS_CHALLENGE_SILVERED(RT_MINIGUN_CHAL_2) AND WAS_CHALLENGE_SILVERED(RT_MINIGUN_CHAL_3)
RETURN bPistol AND bSMG AND bAR AND bShotgun AND bLMG AND bHeavy
ENDFUNC
/// PURPOSE:
/// Checks if all the range rounds have been passed
/// RETURNS:
///
FUNC BOOL ARE_ALL_RANGE_ROUNDS_GOLDED()
BOOL bPistol = WAS_CHALLENGE_GOLDED(RT_PISTOL_CHAL_1) AND WAS_CHALLENGE_GOLDED(RT_PISTOL_CHAL_2) AND WAS_CHALLENGE_GOLDED(RT_PISTOL_CHAL_3)
BOOL bSMG = WAS_CHALLENGE_GOLDED(RT_SMG_CHAL_1) AND WAS_CHALLENGE_GOLDED(RT_SMG_CHAL_2) AND WAS_CHALLENGE_GOLDED(RT_SMG_CHAL_3)
BOOL bAR = WAS_CHALLENGE_GOLDED(RT_AR_CHAL_1) AND WAS_CHALLENGE_GOLDED(RT_AR_CHAL_2) AND WAS_CHALLENGE_GOLDED(RT_AR_CHAL_3)
BOOL bShotgun = WAS_CHALLENGE_GOLDED(RT_SHOTGUN_CHAL_1) AND WAS_CHALLENGE_GOLDED(RT_SHOTGUN_CHAL_2) AND WAS_CHALLENGE_GOLDED(RT_SHOTGUN_CHAL_3)
BOOL bLMG = WAS_CHALLENGE_GOLDED(RT_LMG_CHAL_1) AND WAS_CHALLENGE_GOLDED(RT_LMG_CHAL_2) AND WAS_CHALLENGE_GOLDED(RT_LMG_CHAL_3)
BOOL bHeavy = WAS_CHALLENGE_GOLDED(RT_MINIGUN_CHAL_1) AND WAS_CHALLENGE_GOLDED(RT_MINIGUN_CHAL_2) AND WAS_CHALLENGE_GOLDED(RT_MINIGUN_CHAL_3)
RETURN bPistol AND bSMG AND bAR AND bShotgun AND bLMG AND bHeavy
ENDFUNC
/// PURPOSE:
/// Set all range rounds to a specific medal
/// RETURNS:
///
PROC SET_ALL_RANGE_ROUNDS_MEDAL(RANGE_ROUND_MEDAL newMedal)
SET_ROUND_MEDAL(RT_PISTOL_CHAL_1, newMedal)
SET_ROUND_MEDAL(RT_PISTOL_CHAL_2, newMedal)
SET_ROUND_MEDAL(RT_PISTOL_CHAL_3, newMedal)
SET_ROUND_MEDAL(RT_SMG_CHAL_1, newMedal)
SET_ROUND_MEDAL(RT_SMG_CHAL_2, newMedal)
SET_ROUND_MEDAL(RT_SMG_CHAL_3, newMedal)
SET_ROUND_MEDAL(RT_AR_CHAL_1, newMedal)
SET_ROUND_MEDAL(RT_AR_CHAL_2, newMedal)
SET_ROUND_MEDAL(RT_AR_CHAL_3, newMedal)
SET_ROUND_MEDAL(RT_SHOTGUN_CHAL_1, newMedal)
SET_ROUND_MEDAL(RT_SHOTGUN_CHAL_2, newMedal)
SET_ROUND_MEDAL(RT_SHOTGUN_CHAL_3, newMedal)
SET_ROUND_MEDAL(RT_LMG_CHAL_1, newMedal)
SET_ROUND_MEDAL(RT_LMG_CHAL_2, newMedal)
SET_ROUND_MEDAL(RT_LMG_CHAL_3, newMedal)
SET_ROUND_MEDAL(RT_MINIGUN_CHAL_1, newMedal)
SET_ROUND_MEDAL(RT_MINIGUN_CHAL_2, newMedal)
SET_ROUND_MEDAL(RT_MINIGUN_CHAL_3, newMedal)
//NG Current gen owners only
SET_ROUND_MEDAL(RT_RAILGUN_CHAL_1, newMedal)
SET_ROUND_MEDAL(RT_RAILGUN_CHAL_2, newMedal)
SET_ROUND_MEDAL(RT_RAILGUN_CHAL_3, newMedal)
SET_ROUND_MEDAL(RT_RAILGUN_CHAL_4, newMedal)
ENDPROC
PROC SET_ALL_RANGE_ROUNDS_SPECIFIC()
// SET_ROUND_MEDAL(RT_PISTOL_CHAL_1, newMedal)
SET_ROUND_MEDAL(RT_PISTOL_CHAL_2, RRM_SILVER)
SET_ROUND_MEDAL(RT_PISTOL_CHAL_3, RRM_GOLD)
SET_ROUND_MEDAL(RT_SMG_CHAL_1, RRM_GOLD)
SET_ROUND_MEDAL(RT_SMG_CHAL_2, RRM_GOLD)
SET_ROUND_MEDAL(RT_SMG_CHAL_3, RRM_GOLD)
SET_ROUND_MEDAL(RT_AR_CHAL_1, RRM_GOLD)
SET_ROUND_MEDAL(RT_AR_CHAL_2, RRM_GOLD)
SET_ROUND_MEDAL(RT_AR_CHAL_3, RRM_GOLD)
SET_ROUND_MEDAL(RT_SHOTGUN_CHAL_1, RRM_GOLD)
SET_ROUND_MEDAL(RT_SHOTGUN_CHAL_2, RRM_GOLD)
SET_ROUND_MEDAL(RT_SHOTGUN_CHAL_3, RRM_GOLD)
SET_ROUND_MEDAL(RT_LMG_CHAL_1, RRM_GOLD)
SET_ROUND_MEDAL(RT_LMG_CHAL_2, RRM_GOLD)
SET_ROUND_MEDAL(RT_LMG_CHAL_3, RRM_GOLD)
SET_ROUND_MEDAL(RT_MINIGUN_CHAL_1, RRM_GOLD)
SET_ROUND_MEDAL(RT_MINIGUN_CHAL_2, RRM_GOLD)
SET_ROUND_MEDAL(RT_MINIGUN_CHAL_3, RRM_GOLD)
//NG Current gen owners only
SET_ROUND_MEDAL(RT_RAILGUN_CHAL_1, RRM_GOLD)
SET_ROUND_MEDAL(RT_RAILGUN_CHAL_2, RRM_GOLD)
SET_ROUND_MEDAL(RT_RAILGUN_CHAL_3, RRM_GOLD)
SET_ROUND_MEDAL(RT_RAILGUN_CHAL_4, RRM_GOLD)
ENDPROC
/// PURPOSE:
/// Sets all range rounds to bronze
/// RETURNS:
///
PROC SET_ALL_RANGE_ROUNDS_BRONZED()
SET_ALL_RANGE_ROUNDS_MEDAL(RRM_BRONZE)
ENDPROC
/// PURPOSE:
/// Sets all range rounds to silver
/// RETURNS:
///
PROC SET_ALL_RANGE_ROUNDS_SILVERED()
SET_ALL_RANGE_ROUNDS_MEDAL(RRM_SILVER)
ENDPROC
/// PURPOSE:
/// Sets all range rounds to gold
/// RETURNS:
///
PROC SET_ALL_RANGE_ROUNDS_GOLDED()
SET_ALL_RANGE_ROUNDS_MEDAL(RRM_GOLD)
ENDPROC
/// PURPOSE:
/// Quick wrapper to let us know if the player passed or not.
/// If his score is higher then the goal score, then he has
/// RETURNS:
/// TRUE if the players score is higher then the goal score
FUNC BOOL IS_ROUND_CLEARED(Range_RoundInfo & sCurRoundInfo, Range_Challenge & sRoundChallenge)
RETURN (sCurRoundInfo.sScoreData.iP1Score >= sRoundChallenge.iBronzeReq)
ENDFUNC
/// PURPOSE:
/// Checks if we passed this round, and if we need to unlock the next round
PROC CHECK_UNLOCK_NEXT_ROUND(Range_RoundInfo & sCurRoundInfo, Range_Challenge & sRoundChallenge)
// Did we clear the round
IF IS_ROUND_CLEARED(sCurRoundInfo, sRoundChallenge)
CDEBUG2LN(DEBUG_SHOOTRANGE, "CheckUnlockNextRound -- Round passed.")
SET_ROUND_PASSED(sCurRoundInfo.eRoundType)
CDEBUG2LN(DEBUG_SHOOTRANGE, "m_RoundChoice is: ", ENUM_TO_INT(sCurRoundInfo.eRoundType))
ENDIF
ENDPROC
/// PURPOSE:
/// Checks to see if the challenge requirement for this round is met. (IsChallengeReqMet)
/// RETURNS:
/// TRUE if it is.
FUNC BOOL IS_ROUND_CHALLENGE_REQ_MET(RANGE_ROUND_TYPE eUnlockReq, BOOL bIgnoreUnlockReq = FALSE)
IF (eUnlockReq = RT_INVALID) AND NOT bIgnoreUnlockReq
RETURN TRUE
ELIF IS_ROUND_PASSED(eUnlockReq)
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
/// PURPOSE:
/// Returns the high score for a certain round
/// PARAMS:
/// roundType - Which round we want to get our high score
/// RETURNS:
/// Returns the INT value of the high score for the passed in round
FUNC INT GET_ROUND_HIGH_SCORE(RANGE_ROUND_TYPE roundType)
RETURN GET_RANGE_SP_HIGH_SCORE(ePlayerChar, roundType)
ENDFUNC
/// PURPOSE:
/// Returns the high score for a certain round
/// PARAMS:
/// roundType - Which round we want to get our high score
/// RETURNS:
/// Returns the INT value of the high score for the passed in round
FUNC INT GET_ROUND_LAST_SCORE(RANGE_ROUND_TYPE roundType)
RETURN g_savedGlobals.sRangeData[ePlayerChar].sRounds[roundType].iLastScore
ENDFUNC
/// PURPOSE:
/// Given a challenge, returns the medal requirement.
/// RETURNS:
/// Score value needed for the medal.
FUNC INT GET_MEDAL_SCORE_REQUIREMENT(Range_Challenge & sTheChallenge, RANGE_ROUND_MEDAL eForMedal)
IF (eForMedal = RRM_GOLD)
RETURN sTheChallenge.iGoldReq
ELIF (eForMedal = RRM_SILVER)
RETURN sTheChallenge.iSilverReq
ENDIF
RETURN sTheChallenge.iBronzeReq
ENDFUNC
/// PURPOSE:
/// Given a score, returns the medal earned with that score.
FUNC RANGE_ROUND_MEDAL GET_MEDAL_FOR_SCORE(Range_Challenge & sTheChallenge, INT iScore)
IF (iScore >= sTheChallenge.iGoldReq)
RETURN RRM_GOLD
ELIF (iScore >= sTheChallenge.iSilverReq)
RETURN RRM_SILVER
ELIF (iScore >= sTheChallenge.iBronzeReq)
RETURN RRM_BRONZE
ENDIF
RETURN RRM_NONE
ENDFUNC
/// PURPOSE:
/// Sets a flag for the given round.
PROC SET_ROUND_FLAG(Range_RoundInfo & sCurRoundInfo, ROUND_INFO_FLAGS eFlagToSet)
sCurRoundInfo.iRoundFlags |= ENUM_TO_INT(eFlagToSet)
ENDPROC
/// PURPOSE:
/// Clears a flag in the given round's data.
PROC CLEAR_ROUND_FLAG(Range_RoundInfo & sCurRoundInfo, ROUND_INFO_FLAGS eFlagToClear)
CLEAR_BITMASK_AS_ENUM(sCurRoundInfo.iRoundFlags, eFlagToClear)
ENDPROC
/// PURPOSE:
/// Checks to see if a flag is set for the given round.
FUNC BOOL IS_ROUND_FLAG_SET(Range_RoundInfo & sCurRoundInfo, ROUND_INFO_FLAGS eFlagToChk)
RETURN (sCurRoundInfo.iRoundFlags & ENUM_TO_INT(eFlagToChk)) <> 0
ENDFUNC
/// PURPOSE:
/// Finds the medal requirement for a round. Takes in a round and medal.
/// PARAMS:
/// eRoundType - The round type you're inquiring about
/// eMedal - The Medal you're checking the requirement for
/// RETURNS:
/// The medal requirement of eMedal. -1 if it fails to find an entry.
FUNC INT RANGE_GET_MEDAL_REQUIREMENT_OFF_ROUND_TYPE(RANGE_ROUND_TYPE eRoundType, RANGE_ROUND_MEDAL eMedal)
CDEBUG3LN(DEBUG_SHOOTRANGE, "RANGE_GET_MEDAL_REQUIREMENT_OFF_ROUND_TYPE called with ", GET_STRING_FROM_RANGE_ROUND_TYPE(eRoundType), " and ", GET_STRING_FROM_RANGE_ROUND_MEDAL(eMedal) )
SWITCH eRoundType
CASE RT_PISTOL_CHAL_1
SWITCH eMedal
CASE RRM_BRONZE RETURN 1400
CASE RRM_SILVER RETURN 2000
CASE RRM_GOLD RETURN 2800
ENDSWITCH
BREAK
CASE RT_PISTOL_CHAL_2
SWITCH eMedal
CASE RRM_BRONZE RETURN 2000
CASE RRM_SILVER RETURN 10000
CASE RRM_GOLD RETURN 20000
ENDSWITCH
BREAK
CASE RT_PISTOL_CHAL_3
SWITCH eMedal
CASE RRM_BRONZE RETURN 650
CASE RRM_SILVER RETURN 3000
CASE RRM_GOLD RETURN 15000
ENDSWITCH
BREAK
CASE RT_SMG_CHAL_1
SWITCH eMedal
CASE RRM_BRONZE RETURN 4000
CASE RRM_SILVER RETURN 6000
CASE RRM_GOLD RETURN 12000
ENDSWITCH
BREAK
CASE RT_SMG_CHAL_2
SWITCH eMedal
CASE RRM_BRONZE RETURN 1250
CASE RRM_SILVER RETURN 2500
CASE RRM_GOLD RETURN 7500
ENDSWITCH
BREAK
CASE RT_SMG_CHAL_3
SWITCH eMedal
CASE RRM_BRONZE RETURN 3000
CASE RRM_SILVER RETURN 5000
CASE RRM_GOLD RETURN 10000
ENDSWITCH
BREAK
CASE RT_SHOTGUN_CHAL_1
SWITCH eMedal
CASE RRM_BRONZE RETURN 22
CASE RRM_SILVER RETURN 32
CASE RRM_GOLD RETURN 46
ENDSWITCH
BREAK
CASE RT_SHOTGUN_CHAL_2
SWITCH eMedal
CASE RRM_BRONZE RETURN 290
CASE RRM_SILVER RETURN 590
CASE RRM_GOLD RETURN 700
ENDSWITCH
BREAK
CASE RT_SHOTGUN_CHAL_3
SWITCH eMedal
CASE RRM_BRONZE RETURN 14
CASE RRM_SILVER RETURN 18
CASE RRM_GOLD RETURN 23
ENDSWITCH
BREAK
CASE RT_AR_CHAL_1
SWITCH eMedal
CASE RRM_BRONZE RETURN 2500
CASE RRM_SILVER RETURN 3550
CASE RRM_GOLD RETURN 7550
ENDSWITCH
BREAK
CASE RT_AR_CHAL_2
SWITCH eMedal
CASE RRM_BRONZE RETURN 4750
CASE RRM_SILVER RETURN 7500
CASE RRM_GOLD RETURN 17500
ENDSWITCH
BREAK
CASE RT_AR_CHAL_3
SWITCH eMedal
CASE RRM_BRONZE RETURN 1000
CASE RRM_SILVER RETURN 3000
CASE RRM_GOLD RETURN 5000
ENDSWITCH
BREAK
CASE RT_LMG_CHAL_1
SWITCH eMedal
CASE RRM_BRONZE RETURN 4500
CASE RRM_SILVER RETURN 5500
CASE RRM_GOLD RETURN 7500
ENDSWITCH
BREAK
CASE RT_LMG_CHAL_2
SWITCH eMedal
CASE RRM_BRONZE RETURN 5500
CASE RRM_SILVER RETURN 12000
CASE RRM_GOLD RETURN 40000
ENDSWITCH
BREAK
CASE RT_LMG_CHAL_3
SWITCH eMedal
CASE RRM_BRONZE RETURN 7500
CASE RRM_SILVER RETURN 19000
CASE RRM_GOLD RETURN 32000
ENDSWITCH
BREAK
CASE RT_MINIGUN_CHAL_1
SWITCH eMedal
CASE RRM_BRONZE RETURN 10000
CASE RRM_SILVER RETURN 25000
CASE RRM_GOLD RETURN 50000
ENDSWITCH
BREAK
CASE RT_MINIGUN_CHAL_2
SWITCH eMedal
CASE RRM_BRONZE RETURN 15000
CASE RRM_SILVER RETURN 30000
CASE RRM_GOLD RETURN 45000
ENDSWITCH
BREAK
CASE RT_MINIGUN_CHAL_3
SWITCH eMedal
CASE RRM_BRONZE RETURN 20000
CASE RRM_SILVER RETURN 40000
CASE RRM_GOLD RETURN 70000
ENDSWITCH
BREAK
CASE RT_RAILGUN_CHAL_1
SWITCH eMedal
CASE RRM_BRONZE RETURN 20
CASE RRM_SILVER RETURN 22
CASE RRM_GOLD RETURN 24
ENDSWITCH
BREAK
CASE RT_RAILGUN_CHAL_2
SWITCH eMedal
CASE RRM_BRONZE RETURN 16
CASE RRM_SILVER RETURN 20
CASE RRM_GOLD RETURN 24
ENDSWITCH
BREAK
CASE RT_RAILGUN_CHAL_3
SWITCH eMedal
CASE RRM_BRONZE RETURN 20
CASE RRM_SILVER RETURN 26
CASE RRM_GOLD RETURN 32
ENDSWITCH
BREAK
CASE RT_RAILGUN_CHAL_4
SWITCH eMedal
CASE RRM_BRONZE RETURN 26
CASE RRM_SILVER RETURN 31
CASE RRM_GOLD RETURN 35
ENDSWITCH
BREAK
ENDSWITCH
CASSERTLN(DEBUG_SHOOTRANGE, "RANGE_GET_MEDAL_REQUIREMENT_OFF_ROUND_TYPE no case created! eRoundType=", GET_STRING_FROM_RANGE_ROUND_TYPE(eRoundType), " and eMedal=", GET_STRING_FROM_RANGE_ROUND_MEDAL(eMedal) )
RETURN -1
ENDFUNC