Overview
This genre pack targets driving and racing games in the Forza / Gran Turismo / arcade-kart mould: a vehicle defined by drivetrain and chassis attributes, track surfaces and tuning parts that modify performance, signature driver abilities (nitro, drift), and — at its core — a traction pipeline that has to stay coherent as surfaces, upgrades, and physics all push on grip at once.
It is the practical, copy-and-extend companion to the Racing (Forza-style) case study in
the core specification (Section 15.2). Where the case study sketches the
vehicle attribute set, biome surface effects, and the traction ExecutionCalculation, this pack
ships the matching schema-conformant Attributes, Tags, Abilities, and Effects in entities/, plus
a worked vehicle in entities/gameplay_controller.yaml.
Relationship to the core specification
This document is additive. It defines genre-specific Attributes, Tags, Abilities, and Effects on top of the core Universal Gameplay Ability System specification.
-
It MUST NOT redefine, override, or contradict any concept in the core spec.
-
All entities in
entities/validate against the sameschemas/*.jsonas the core. -
It reuses core state tags (
State.Alive,State.Combat, …) by reference where relevant — it never re-declares them. -
The grip stacking it relies on is the core modifier
Channelmechanism (core spec §5.3 and §15.2), and the non-linear physics coupling is a coreExecutionCalculation— neither is a new construct.
Genre Attributes
Defined in entities/attribute_set.yaml as the VehiclePerformanceSet set.
| Attribute | Category | Role |
|---|---|---|
|
Statistic |
Drive torque (Nm); raised by tuning upgrades. |
|
Statistic |
Top speed (km/h); lowered by low-grip surfaces, raised by boost. |
|
Statistic |
Downforce coefficient; scales effective traction with speed. |
|
Statistic |
The aggregated grip stat targeted by the traction channels. |
|
Statistic |
Tire core temperature (°C), clamped to |
|
Statistic / Resource |
|
|
Meta |
Runtime telemetry written each frame by the physics simulation and the traction calc. |
The traction pipeline (the core racing mechanic)
Grip in a racing game is pushed on from several directions at once — the surface under the tires,
the parts bolted to the car, downforce that grows with speed, and tire temperature. UGAS expresses
this in two complementary layers, both landing on TireGripMultiplier / AvailableTraction.
Declarative grip channels
Surface and upgrade modifiers stack through named channels: additive within a channel, multiplicative across channels — exactly the damage-bucket mechanism from §15.3, reused for grip.
| Channel | What goes in it | Stacking |
|---|---|---|
|
The current track surface (asphalt, mud, gravel, ice, wet) |
Additive within |
|
Tuning parts and tire compounds |
Additive within, multiplied across the others |
Because channels are part of the core modifier pipeline, surface and tuning effects stack declaratively in Effect YAML — no custom calculation code is needed for them.
entities/gameplay_controller.yaml)A Sport-class car with the sport tuning package fitted, driving on mud:
-
Surfacefactor (mud, \(-0.6\)): \(1 + (-0.6) = 0.40\) -
Upgradesfactor (tuning, \(+0.10\)): \(1 + 0.10 = 1.10\) -
Final
TireGripMultiplier: \(1.0 \times 0.40 \times 1.10 = 0.44\)
The same two effects add flat drivetrain changes: EngineTorque \(400 + 80 = 480\) and
MaxSpeed \(250 + 20 - 30 = 240\). These are exactly the CurrentValue entries recorded
for the example vehicle.
Physics coupling via ExecutionCalculation
Downforce scaling (\(\propto \text{speed}^2\)) and the tire-temperature window are
non-linear, so they live in an ExecutionCalculation rather than a channel. GE_Traction_Update
(entities/effect_traction_update.yaml) invokes ExecCalc_VehicleTraction, which reads the
aggregated TireGripMultiplier, AeroDownforce, TireTemperature, and CurrentSpeed and writes
AvailableTraction. The simulation re-applies this instant effect each physics step. See §15.2 for
the reference calculation body.
Genre Tags
Defined in entities/tag_registry.yaml (additive only):
-
Surfaces —
Surface.Asphalt|Mud|Gravel|Ice|Wet. -
Vehicle classification — the base
Vehicletag (required by surface effects),Vehicle.Class.Sport|Kart|Formula, andVehicle.Tuned. -
Vehicle states —
Vehicle.State.Boosting|Drifting|SpunOut. -
Ability types —
Ability.Type.Boost|Handling. -
Race progression —
Race.Phase.Countdown|Racing|Finished,Race.Status.FinalLap.
Genre Abilities
-
entities/ability_nitro_boost.yaml—GA_NitroBoost: spends theBoostresource (Cost: GE_NitroCost) on a cooldown (GE_NitroCooldown) and appliesGE_NitroBoostto the vehicle. Blocked whileVehicle.State.SpunOut; requiresRace.Phase.Racing. -
entities/ability_drift.yaml—GA_Drift: hold-to-slide handling technique. GrantsVehicle.State.Driftingwhile active and applies the periodicGE_DriftCharge, trading cornering grip for boost charge. Ends on input release (WaitInputRelease).
Genre Effects
-
entities/effect_tuning_sport.yaml—GE_Tuning_Sport: infinite upgrade; flat+EngineTorque/+MaxSpeedand+10%grip in theUpgradeschannel; grantsVehicle.Tuned. -
entities/effect_biome_mud.yaml—GE_Biome_Mud: infinite surface;-60%grip in theSurfacechannel and-30MaxSpeed; grantsSurface.Mud. Requires theVehicletag. -
entities/effect_biome_asphalt.yaml—GE_Biome_Asphalt: infinite surface;Override`s the `Surface-channel grip back to the1.0baseline; grantsSurface.Asphalt. -
entities/effect_nitro_boost.yaml—GE_NitroBoost:HasDurationburst; flat+EngineTorque/+MaxSpeed; grantsVehicle.State.Boosting. -
entities/effect_drift_charge.yaml—GE_DriftCharge:HasDuration+Period; restoresBoostevery half-second; grantsVehicle.State.Drifting. -
entities/effect_traction_update.yaml—GE_Traction_Update: instant; runs theExecCalc_VehicleTractionExecutionCalculationto recomputeAvailableTraction.
Using this pack
-
Copy
genres/racing/into your project (or loadentities/directly via theugas-schema-authorskill). -
Keep, rename, or extend the
VehiclePerformanceSet; add vehicle classes/parts as new Effects, and driver techniques as new Abilities. -
Author new grip modifiers by choosing the right
Channel— surface conditions go inSurface, parts and compounds inUpgrades; reserve `ExecutionCalculation`s for non-linear physics coupling. -
Validate with
python scripts/validate_schema_examples.pybefore committing.