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

141 lines
5.7 KiB
Scheme
Executable File

//////////////////////////////////////////////////////////////////////////////////////////
// //
// SCRIPT NAME : trains_control_public.sch //
// AUTHOR : Rob Bray //
// DESCRIPTION : Script functions to control trains //
// //
//////////////////////////////////////////////////////////////////////////////////////////
USING "commands_vehicle.sch"
USING "commands_script.sch"
USING "globals.sch"
CONST_INT EXILE3_LAST_CARRIAGE 40
CONST_INT EXILE3_NUMBER_CRASHED_CARRIAGES 10
CONST_INT EXILE3_NUMBER_CONTAINERS 1
ENUM TRAIN_LINE_ENUM
TRAIN_LINE_MAIN = 0,
TRAIN_LINE_QUARRY,
TRAIN_LINE_CAR_STEAL_SETPIECE,
TRAIN_LINE_METRO,
TRAIN_LINE_FIRST_HOOD_SETPIECE,
TRAIN_LINE_SECOND_HOOD_SETPIECE,
TRAIN_LINE_SECOND_FAME_OR_SHAME_SETPIECE,
TRAIN_LINE_DOWNTOWN_SETPIECE,
TRAIN_LINE_THIRD_HOOD_SETPIECE,
TRAIN_LINE_PROLOGUE,
TRAIN_LINE_JEWEL_HEIST_SETPIECE,
TRAIN_LINE_PROLOGUE_2,
TRAIN_LINE_COUNT
ENDENUM
#IF IS_DEBUG_BUILD
FUNC STRING GET_TRAIN_LINE_DEBUG_STRING_FROM_ID(TRAIN_LINE_ENUM trainLine)
SWITCH trainLine
CASE TRAIN_LINE_MAIN RETURN "MAIN" BREAK
CASE TRAIN_LINE_QUARRY RETURN "QUARRY" BREAK
CASE TRAIN_LINE_CAR_STEAL_SETPIECE RETURN "CAR_STEAL_SETPIECE" BREAK
CASE TRAIN_LINE_METRO RETURN "METRO" BREAK
CASE TRAIN_LINE_FIRST_HOOD_SETPIECE RETURN "FIRST_HOOD_SETPIECE" BREAK
CASE TRAIN_LINE_SECOND_HOOD_SETPIECE RETURN "SECOND_HOOD_SETPIECE" BREAK
CASE TRAIN_LINE_SECOND_FAME_OR_SHAME_SETPIECE RETURN "SECOND_FAME_OR_SHAME_SETPIECE" BREAK
CASE TRAIN_LINE_DOWNTOWN_SETPIECE RETURN "DOWNTOWN_SETPIECE" BREAK
CASE TRAIN_LINE_THIRD_HOOD_SETPIECE RETURN "THIRD_HOOD_SETPIECE" BREAK
CASE TRAIN_LINE_PROLOGUE RETURN "PROLOGUE" BREAK
CASE TRAIN_LINE_JEWEL_HEIST_SETPIECE RETURN "JEWEL_HEIST_SETPIECE" BREAK
CASE TRAIN_LINE_PROLOGUE_2 RETURN "TRAIN_LINE_PROLOGUE_2" BREAK
ENDSWITCH
SCRIPT_ASSERT("GET_TRAIN_LINE_DEBUG_STRING_FROM_ID: Missing debug string for train line enum.")
RETURN "NULL"
ENDFUNC
#ENDIF
//Request a line changes state.
PROC SCRIPT_SET_TRAIN_LINE_ACTIVE(TRAIN_LINE_ENUM trainLine, BOOL bActive)
CPRINTLN(DEBUG_SYSTEM, "<TRAINS> Script ", GET_THIS_SCRIPT_NAME(), " requested line ", GET_TRAIN_LINE_DEBUG_STRING_FROM_ID(trainLine), " be set to ", PICK_STRING(bActive, "ACTIVE", "NOT-ACTIVE"), ".")
IF bActive
SET_BIT(g_iTrainLineActiveBitset, ENUM_TO_INT(trainLine))
ELSE
CLEAR_BIT(g_iTrainLineActiveBitset, ENUM_TO_INT(trainLine))
ENDIF
g_bTrainLinesChangedFlag = TRUE
ENDPROC
//Set the state of a specific line this frame and log the change.
PROC SET_TRAIN_LINE_ACTIVE(INT iTrainLine, BOOL bActive)
SWITCH_TRAIN_TRACK(iTrainLine, bActive)
CPRINTLN(DEBUG_SYSTEM, "<TRAINS> Line ", GET_TRAIN_LINE_DEBUG_STRING_FROM_ID(INT_TO_ENUM(TRAIN_LINE_ENUM, iTrainLine)), " changed state to ", PICK_STRING(bActive, "ACTIVE", "NOT-ACTIVE"), ".")
ENDPROC
//Maintain requests to change train line states.
PROC MAINTAIN_TRAIN_LINE_ACTIVATION()
IF GET_INDEX_OF_CURRENT_LEVEL() = LEVEL_GTA5
IF g_bTrainLinesChangedFlag
INT i
REPEAT TRAIN_LINE_COUNT i
SET_TRAIN_LINE_ACTIVE(i, IS_BIT_SET(g_iTrainLineActiveBitset, i))
ENDREPEAT
g_bTrainLinesChangedFlag = FALSE
ENDIF
ENDIF
ENDPROC
//Setup default train line states as SP starts.
PROC Initialise_Train_Lines_On_SP_Startup()
IF GET_INDEX_OF_CURRENT_LEVEL() = LEVEL_GTA5
CPRINTLN(DEBUG_SYSTEM, "<TRAINS> Initialising base train lines states SP startup.")
DELETE_ALL_TRAINS()
SCRIPT_SET_TRAIN_LINE_ACTIVE(TRAIN_LINE_MAIN, TRUE)
SCRIPT_SET_TRAIN_LINE_ACTIVE(TRAIN_LINE_QUARRY, FALSE)
SCRIPT_SET_TRAIN_LINE_ACTIVE(TRAIN_LINE_CAR_STEAL_SETPIECE, FALSE)
SCRIPT_SET_TRAIN_LINE_ACTIVE(TRAIN_LINE_METRO, TRUE)
SCRIPT_SET_TRAIN_LINE_ACTIVE(TRAIN_LINE_FIRST_HOOD_SETPIECE, FALSE)
SCRIPT_SET_TRAIN_LINE_ACTIVE(TRAIN_LINE_SECOND_HOOD_SETPIECE, FALSE)
SCRIPT_SET_TRAIN_LINE_ACTIVE(TRAIN_LINE_SECOND_FAME_OR_SHAME_SETPIECE, FALSE)
SCRIPT_SET_TRAIN_LINE_ACTIVE(TRAIN_LINE_DOWNTOWN_SETPIECE, FALSE)
SCRIPT_SET_TRAIN_LINE_ACTIVE(TRAIN_LINE_THIRD_HOOD_SETPIECE, FALSE)
SCRIPT_SET_TRAIN_LINE_ACTIVE(TRAIN_LINE_PROLOGUE, FALSE)
SCRIPT_SET_TRAIN_LINE_ACTIVE(TRAIN_LINE_JEWEL_HEIST_SETPIECE, FALSE)
SCRIPT_SET_TRAIN_LINE_ACTIVE(TRAIN_LINE_PROLOGUE_2, FALSE)
SET_TRAIN_TRACK_SPAWN_FREQUENCY(0, 120000)
SET_RANDOM_TRAINS(TRUE)
ENDIF
ENDPROC
//Cleanup train line states as SP ends.
PROC Cleanup_Train_Lines_On_SP_End()
IF GET_INDEX_OF_CURRENT_LEVEL() = LEVEL_GTA5
CPRINTLN(DEBUG_SYSTEM, "<TRAINS> Clearing all train line states on SP cleanup.")
DELETE_ALL_TRAINS()
SCRIPT_SET_TRAIN_LINE_ACTIVE(TRAIN_LINE_MAIN, TRUE)
SCRIPT_SET_TRAIN_LINE_ACTIVE(TRAIN_LINE_QUARRY, FALSE)
SCRIPT_SET_TRAIN_LINE_ACTIVE(TRAIN_LINE_CAR_STEAL_SETPIECE, FALSE)
SCRIPT_SET_TRAIN_LINE_ACTIVE(TRAIN_LINE_METRO, TRUE)
SCRIPT_SET_TRAIN_LINE_ACTIVE(TRAIN_LINE_FIRST_HOOD_SETPIECE, FALSE)
SCRIPT_SET_TRAIN_LINE_ACTIVE(TRAIN_LINE_SECOND_HOOD_SETPIECE, FALSE)
SCRIPT_SET_TRAIN_LINE_ACTIVE(TRAIN_LINE_SECOND_FAME_OR_SHAME_SETPIECE, FALSE)
SCRIPT_SET_TRAIN_LINE_ACTIVE(TRAIN_LINE_DOWNTOWN_SETPIECE, FALSE)
SCRIPT_SET_TRAIN_LINE_ACTIVE(TRAIN_LINE_THIRD_HOOD_SETPIECE, FALSE)
SCRIPT_SET_TRAIN_LINE_ACTIVE(TRAIN_LINE_PROLOGUE, FALSE)
SCRIPT_SET_TRAIN_LINE_ACTIVE(TRAIN_LINE_JEWEL_HEIST_SETPIECE, FALSE)
SCRIPT_SET_TRAIN_LINE_ACTIVE(TRAIN_LINE_PROLOGUE_2, FALSE)
ENDIF
ENDPROC