API ReferenceGE ExtensionsgameplaymissionsproceduralMissionGenerators
Time Trial Missions
Reference for the time trial procedural mission generator that converts quickrace tracks into playable time trial missions.
Reference for the time trial procedural mission generator that converts quickrace tracks into playable time trial missions.
Module Exports (M)
| Function | Signature | Description |
|---|---|---|
generate | () → table | Generates time trial missions from quickrace data |
How It Works
local function generate()
-- 1. Load quickrace track list via scenario_quickRaceLoader
local data = scenario_quickRaceLoader.getQuickraceList()
for _, level in ipairs(data) do
for _, race in ipairs(level.tracks) do
if not race.ignoreAsMission then
-- 2. Get race file (or convert from track editor format via cache)
local raceFile = race.raceFile
if not raceFile and not race.isTrackEditorTrack then
race, raceFile = getCachedRacefile(level, race)
end
-- 3. Build mission from race data
mission.id = "timeTrials/"..levelName..'/'..trackName.."-procedural"
mission.missionType = "generatedTimeTrial"
mission.missionTypeData = {
raceFile = raceFile,
closed = race.closed,
reversible = race.reversible,
allowRollingStart = race.allowRollingStart,
defaultLaps = race.defaultLaps,
prefabs = race.prefabs, -- always loaded
reversePrefabs = race.reversePrefabs, -- reverse direction only
forwardPrefabs = race.forwardPrefabs, -- forward direction only
}
-- 4. Set start trigger from default start position
for _, sp in ipairs(race.startPositions) do
if sp.oldId == race.defaultStartPosition then
mission.startTrigger.pos = sp.pos
mission.startTrigger.rot = sp.rot
end
end
end
end
end
endRace File Caching
Tracks without .race.json files are converted and cached:
local cachePath = "gameplay/temp/timeTrials/"
local function getCachedRacefile(level, race)
-- 1. Check cache at cachePath/id.json
-- 2. If missing, convert via race path:fromTrack()
-- 3. Save to cache (or mark as {invalid=true})
-- 4. Return cached data + cache file path
endPrefab Auto-Discovery
For each prefab list (prefabs, reversePrefabs, forwardPrefabs):
- Check if file exists as-is
- Try
levels/{level}/{name}.prefaband.prefab.jsonextensions - Auto-discover
levels/{level}/quickrace/{trackName}.prefaband variants (_reverse,_forward)
Generated Mission Structure
| Field | Value |
|---|---|
missionType | "generatedTimeTrial" |
retryBehaviour | "infiniteRetries" |
careerSetup.defaultStarKeys | {'justFinish'} |
careerSetup.showInCareer | false |
careerSetup.showInFreeroam | true |
startCondition | {type = "vehicleDriven"} |
M.generate | () |
Key Behaviors
- Tracks with
ignoreAsMission = trueare skipped - Tracks hidden by real (file-based) missions via
hidesOriginalTimeTrialFileare filtered out - Preview images searched with
.jpg,.png,.jpegextensions inlevels/{level}/quickrace/ - Invalid race conversions are cached as
{invalid=true}to avoid repeated failures - Contains WIP conversion code (disabled) to save procedural missions as real file-based missions
- Official status determined by
isOfficialContentVPath(raceFile)
See Also
- proceduralMissionGenerators/busModeMissions - Bus Route Mission Generator - Related reference
- Gameplay Systems Guide - Guide