Files
gtav-src/script/dev_ng/singleplayer/include/globals/triathlon_globals.sch
T
2025-09-29 00:52:08 +02:00

142 lines
5.4 KiB
Scheme
Executable File

// *****************************************************************************************
// *****************************************************************************************
// *****************************************************************************************
//
// SCRIPT NAME : triathlon_globals.sch
// AUTHOR : Carlos Mijares (CM)
// DESCRIPTION : Global functionality for Triathlon.
//
// *****************************************************************************************
// *****************************************************************************************
// *****************************************************************************************
CONST_INT TRI_RACE_MAX 8
/// PURPOSE:
/// Indeces for each Tri race.
ENUM TRIATHLON_RACE_INDEX
TRIATHLON_RACE_NONE = -1,
TRIATHLON_RACE_VESPUCCI = 0, // Muscle beach. Vespucci Beach
TRIATHLON_RACE_ALAMO_SEA, // Trailer park. Alamo Sea
TRIATHLON_RACE_IRONMAN, // Mountain. Los Santos Iron Man
NUM_TRIATHLON_RACES
ENDENUM
ENUM TRIATHLON_BITFLAGS
TRIATHLON_WonRace = BIT0
ENDENUM
/// PURPOSE:
/// Encapsulates launch data for Tri races.
STRUCT TRIATHLON_LAUNCH_DATA
TRIATHLON_RACE_INDEX raceToLaunch
VECTOR raceStartLocation
OBJECT_INDEX oTable
PED_INDEX pedStartPed
OBJECT_INDEX oClipboard
OBJECT_INDEX oPencil
ENDSTRUCT
STRUCT TriathlonDataSaved
INT iBestRank[NUM_TRIATHLON_RACES]
FLOAT fBestTime[NUM_TRIATHLON_RACES]
TRIATHLON_RACE_INDEX eCurrentRaceUnlocked
INT iBitFlags
ENDSTRUCT
/// PURPOSE:
/// Get the position of a Triathlon race by its index.
FUNC VECTOR GET_TRIATHLON_RACE_POSITION_BY_RACE_INDEX(TRIATHLON_RACE_INDEX eRaceIndex)
PRINTLN("[triathlon_globals.sch->GET_TRIATHLON_RACE_POSITION_BY_RACE_INDEX] Function started.")
// Ensure the race index is valid.
IF (eRaceIndex >= NUM_TRIATHLON_RACES) OR (eRaceIndex <= TRIATHLON_RACE_NONE)
PRINTLN("[triathlon_globals.sch->GET_TRIATHLON_RACE_POSITION_BY_RACE_INDEX] Race index is outside of range. Invalid.")
RETURN << 0.0, 0.0, 0.0 >>
ENDIF
// Get the position of the race by its index.
SWITCH (eRaceIndex)
CASE TRIATHLON_RACE_ALAMO_SEA
PRINTLN("[triathlon_globals.sch->GET_TRIATHLON_RACE_POSITION_BY_RACE_INDEX] Race index is 1!.")
RETURN <<2434.4146, 4284.2495, 35.5059>>
CASE TRIATHLON_RACE_VESPUCCI
PRINTLN("[triathlon_globals.sch->GET_TRIATHLON_RACE_POSITION_BY_RACE_INDEX] Race index is 2!.")
RETURN <<-1230.6222, -2049.9700, 12.8882>>
CASE TRIATHLON_RACE_IRONMAN
PRINTLN("[triathlon_globals.sch->GET_TRIATHLON_RACE_POSITION_BY_RACE_INDEX] Race index is 3!.")
RETURN <<1591.6860, 3813.4014, 33.3371>>
BREAK
ENDSWITCH
PRINTLN("[triathlon_globals.sch->GET_TRIATHLON_RACE_POSITION_BY_RACE_INDEX] lol, how did we get here?")
RETURN << 0.0, 0.0, 0.0 >>
ENDFUNC
/// PURPOSE:
/// Calculate the TRIATHLON_RACE_INDEX closest to a given position vector.
///
/// PARAMS:
/// vCoord - Position to check against each race index.
/// vRaceStartLoc - Reference to the closest race position, to be set here.
///
/// RETURNS:
/// TRIATHLON_RACE_INDEX closest to the position given.
FUNC TRIATHLON_RACE_INDEX GET_TRIATHLON_RACE_INDEX_BY_COORDS(VECTOR vCoord, VECTOR & vRaceStartLoc)
PRINTLN("[triathlon_globals.sch->GET_TRIATHLON_RACE_INDEX_BY_COORDS] Function started.")
// Initialize the race we'll be returning, for protection.
TRIATHLON_RACE_INDEX eClosestRaceToPlayer = TRIATHLON_RACE_VESPUCCI
// Temporarily store all race locations here to check against.
VECTOR vTriRaceLocations[NUM_TRIATHLON_RACES]
vTriRaceLocations[TRIATHLON_RACE_ALAMO_SEA] = GET_TRIATHLON_RACE_POSITION_BY_RACE_INDEX(TRIATHLON_RACE_ALAMO_SEA)
vTriRaceLocations[TRIATHLON_RACE_VESPUCCI] = GET_TRIATHLON_RACE_POSITION_BY_RACE_INDEX(TRIATHLON_RACE_VESPUCCI)
vTriRaceLocations[TRIATHLON_RACE_IRONMAN] = GET_TRIATHLON_RACE_POSITION_BY_RACE_INDEX(TRIATHLON_RACE_IRONMAN)
// Let's initialize the closest distance, for protection.
FLOAT fClosestDistanceFromCoordToRacePosition = VDIST2(vTriRaceLocations[TRIATHLON_RACE_VESPUCCI], vCoord)
INT iLoopCounter
FLOAT fDistanceToCheck = 0.0
FOR iLoopCounter = 1 TO (ENUM_TO_INT(NUM_TRIATHLON_RACES) - 1)
fDistanceToCheck = VDIST2(vCoord, vTriRaceLocations[iLoopCounter])
IF (fDistanceToCheck < fClosestDistanceFromCoordToRacePosition)
eClosestRaceToPlayer = INT_TO_ENUM(TRIATHLON_RACE_INDEX, iLoopCounter)
fClosestDistanceFromCoordToRacePosition = fDistanceToCheck
ENDIF
ENDFOR
PRINTLN("[triathlon_globals.sch->GET_TRIATHLON_RACE_INDEX_BY_COORDS] Closest race is ", ENUM_TO_INT(eClosestRaceToPlayer))
// Return the closest race to the coord by index.
vRaceStartLoc = vTriRaceLocations[eClosestRaceToPlayer]
RETURN eClosestRaceToPlayer
ENDFUNC
// *****************************************************************************************
// *****************************************************************************************
// *****************************************************************************************
//
// END OF FILE - DO NOT ADD ANYTHING BELOW THIS BLOCK!
//
// *****************************************************************************************
// *****************************************************************************************
// *****************************************************************************************