User:Andrew350/NML:Roadtypes

From GRFSpecs
< User:Andrew350
Revision as of 07:54, 22 December 2019 by Andrew350 (talk | contribs) (Intitial conversion from railtype spec)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigationJump to search
Props, Vars and CBs

Roadtypes can only be defined in OpenTTD Supported by OpenTTD 1.101.10 or later.


Roadtype IDs

Roadtypes and Tramtypes share a pool of 64 IDs. Either feature can use as many IDs as needed (i.e. it is not limited to 32 per type), but both features combined are limited to 64 in total. NewGRF-local IDs may freely be chosen, but must be in the 0..63 range. If other roadtype/tramtype GRFs are loaded, it may be that there are not enough slots available. To prevent your entire NewGRF from being deactivated with the 'Attempt to use invalid ID'-error, you can use the following code:

if (roadtype_available("LABL") || loading_stage == LOADING_STAGE_RESERVE)
    ... item definition ...
} else if (loading_stage == LOADING_STAGE_ACTIVATE) {
    ... warning / error ...
}

The warning / error is optional, but can be used to inform the user about the missing roadtypes.

Vehicle and Roadtype availability

Vehicle and roadtype availability and compatibility is influenced by multiple properties. Generally, the vehicle defines which roadtype it is, and the roadtypes define the compatibility between each other.

  • A vehicle exists, if its roadtype (road vehicle property track_type) is defined. Otherwise the vehicle is disabled.
  • When a vehicle is introduced, it always introduces its roadtype (road vehicle property track_type).
  • A roadtype is introduced, if at least one of the following conditions is met:
    • A vehicle is introduced, that references the roadtype (road vehicle property track_type).
    • Another roadtype is introduced, that references the roadtype via the introduced roadtype list (roadtype property introduces_roadtype_list).
    • The introduction date (roadtype property introduction_date) is passed and all required roadtypes (roadtype property requires_roadtype_list ) are available.

Via roadtype property compatible_roadtype_list multiple roadtypes can be defined, which shall be considered equivalent to a roadtype. This affects the interpretation of road vehicle property track_type. If road vehicle property track_type references an undefined roadtype, then roadtype property compatible_roadtype_list is checked for all defined roadtypes, whether the vehicle can be reassigned to some other roadtype. Otherwise the vehicle is disabled.

Roadtype properties

property value range comment
label 4-byte string names of default road types: "ROAD", "ELRL", "MONO", "MGLV". See the List of roadtype labels in the NewGRF Specs for currently defined custom labels.
introduction_date date(yyyy,mm,dd)

Supported by OpenTTD 1.1 (r21842)1.1 Valid range for yyyy is 0 ... 5000000.

name string Name of this roadtype
toolbar_caption string Supported by OpenTTD 1.2 (23129)1.2 Not supported by TTDPatch Caption of the build road toolbar. In earlier versions this is the same as the 'name'
menu_text string Shown in the dropdown menu for all roadtypes
build_window_caption string Caption of the build vehicle window
autoreplace_text string String for the autoreplace window
new_engine_text string String for the "We have invented a new <road type> engine" news message
compatible_roadtype_list list of roadtype labels Provide a list of road types that road vehicles of this type can also run on. e.g. ["ROAD", "ELRL", "MONO"]
powered_roadtype_list list of roadtype labels Provide a list of road types that road vehicles of this type are powered on.
roadtype_flags bitmask(ROADTYPE_FLAG_XXX, ...) XXX = [CATENARY | NO_LEVEL_CROSSING] Flags enable catenary and/or disable level crossings.
curve_speed_multiplier 0...255 max curve speed is defined as multiple of the base curve speed (see below)
station_graphics ROADTYPE_STATION_NORMAL, ROADTYPE_STATION_MONOROAD, ROADTYPE_STATION_MAGLEV Type of station graphics to use for the default stations
construction_cost 0 ... 65525

Supported by OpenTTD 1.1 (r19307)1.1 per piece of track as multiplier to PR_BUILD_ROAD base cost. Default cost factors are 8, 12, 16 and 24 for ROAD, ELRL, MONO and MGLV.

speed_limit 0 ... 65525 km/h (speed units) A speed limit of 0 means unlimited speed
acceleration_model ACC_MODEL_ROAD, ACC_MODEL_MONOROAD, ACC_MODEL_MAGLEV ACC_MODEL_ROAD and ACC_MODEL_MONOROAD behave the same currently
map_colour 0 ... 255

Supported by OpenTTD 1.1 (r19307)1.1 entry in the colour palette.

requires_roadtype_list list of roadtype labels

Supported by OpenTTD 1.1 (r21842)1.1 List of road types on that need to be available to the company of the player for this road type to be introduced at (or after) the introduction date. This limit does not apply when the road type is introduced by the introduction of a vehicle.

introduces_roadtype_list list of roadtype labels

Supported by OpenTTD 1.1 (r21841)1.1 List of road types that get introduced when this road type is introduced. For example, to make sure that when a fast road type is introduced the slow variant exists.

sort_order 0 ... 255

Supported by OpenTTD 1.1 (r21866)1.1 number which defines the sort order among road types. If this entry is not defined, it gets assigned sort order n*10+7 for the n-th roadtype.

maintenance_cost

Supported by OpenTTD 1.2 (r23415)1.2 Maintenance cost factor for each piece of tracks of this roadtype. Default cost factors are 8, 12, 16 and 24 for ROAD, ELRL, MONO and MGLV.

alternative_roadtype_list list of roadtype labels

Supported by OpenTTD 1.2 (r23758)1.2 List of road types which this road type will act as fallback for, if the corresponding road type is not defined separately

Sort order

The sort_order influences the sort order of the drop down lists with road types. Default values are as follows:

Value Meaning
07 normal road
17 electrified road
27 monoroad
37 maglev
n7 roadtype #n

Thus the road type that (internally) gets index 8 will get a default value of 87. These defaults are to keep the ordering when this property is not supported as they were.

Base speeds for curves

The base speeds relevant for the curve_speed_multiplier are:

curve length base speed [km/h]
0 (90 degree turn) 30
1 44
2 55
3 66
4 75
5 84
6 91
7 98
8 103
9 108
10 111
11 114
12+ 115

Roadtype variables

name value range comment
terrain_type TILETYPE_NORMAL, TILETYPE_DESERT, TILETYPE_RAIN_FOREST, TILETYPE_SNOW
enhanced_tunnels 0 should custom tunnel entrances be modified other values than 0 might be returned
level_crossing_status LEVEL_CROSSING_CLOSED, LEVEL_CROSSING_OPEN
build_date 0 .. 5000000 for depots only: build date of the depot in days since 0
town_zone town zone Town zone of the tile. (Only available for level crossings and depots.)

Roadtype callbacks

For road types a number of callbacks are used to define road type graphics. Each should refer to a sprite set containing the relevant sprites. Refer to the example sprites or the example roadtype grf in the NML repository, for an example on what sprites are needed in what order.

callbacks number of sprites meaning
gui 16 4 road directions, autoroad, depot, tunnel and convert road sprites for road menu.
track_overlay[1] 10 6 flat and 4 slope sprites. Track without landscape. Used in junctions, and also with path signals, if the "Show reserved tracks" option is enabled in the game settings.
underlay[1] 16 6 flat and 4 slope, one crossing WITH track, 5 junction pieces without track. Tracks with ballast but without landscape.
tunnels[1] 4 1 sprite for each direction. Sprite is overlay for track in existing tunnel graphics. The original ground sprite is drawn, then the overlay, then possibly a road vehicle and the original tunnel head is drawn over the top. This keeps compatibility with different landscape types. Sprite order: SW, NW, NE, SE.
catenary_wire 28
catenary_pylons 8
bridge_surfaces[1] 6
level_crossings[1] 10 For each direction: one track sprite and 4 sprites for road lights etc
depots[2] 6 2 sprites for each south-ish, 1 sprite for each north-ish depot. Like original depots.
fences 8 / 16 x, y, vertical, horizontal, SW, SE, NE and NW slopes like original fences at sprite 1301. Supported by OpenTTD 1.6 (r27343)1.6 Not supported by TTDPatch Since OpenTTD r27343 there is also a 16 sprites version, see below.
tunnel_overlay[3] 4 If this callback is defined, tunnels for this roadtype will be drawn differently. First, a grass underlay base sprite is drawn, then the 'tunnels'-sprite. Next, road vehicle sprites if applicable and then a grass overlay and finally the sprite from this type (tunnel_overlay). The grass sprites are defined in the base set and do not contain any parts of the tracks or portal, so these have to be fully provided by the roadtype sprites.
  • getbits(extra_callback_info1, 0, 8): 0 for normal tunnels, without any extra features (like tracks above). All other values are reserved for future extensions.
signals 8 Supported by OpenTTD 1.3 (r24367)1.3 1 sprite for each direction, order is SW(-facing), NE, NW, SE, E, W, S, N. For more information, see below
  1. 1.0 1.1 1.2 1.3 1.4 Either all or none of these sprites should be provided.
  2. Supported by OpenTTD 1.2 (r22854)1.2 In OpenTTD prior to r22854, depot sprites would not be used if the above 'all or none' sprites were not supplied.
  3. Above 'all or none' sprites must be supplied, if these sprites are to be used.

If a callback is not implemented or fails, graphics from the fallback roadtype (picked via the station_graphics property) will be used instead.
Note that there is no "default graphics"-callback.

Example sprites

gui

File:Roadtype gui.png

track_overlay

File:Roadtype overlay.png

underlay

File:Roadtype underlay.png

level_crossings

You can define a special track piece which crosses the road and for each of two directions and each of the corners of the tile a separate sprite for a light, sign, or whatever should go there.

Sprite number for X Sprite number for Y Useage
0    1    Rail overlay
2    3    North light
4    5    East light
6    7    West light
8    9    South light

File:Roadtype levelcrossing.png

depots

Sprite Number Usage
0    NE wall for SE-entry depot.
1    Depot building for SE-entry depot.
2    NW wall for SW-entry depot.
3    Depot building for SW-entry depot.
4    Depot building for NE-entry depot.
5    Depot building for NW-entry depot.

fences

File:Roadtype fences.png

Supported by OpenTTD 1.6 (r27343)1.6 Not supported by TTDPatch Since OpenTTD r27343 there is also a 16 sprites version, this allows to use different sprites resp. offsets for the fences on either track side.

Sprite number Tile slope Track bit Fence position Version
0 flat X NW Supported by OpenTTD 1.0 (r19056)1.0 Not supported by TTDPatch
1 flat Y NE Supported by OpenTTD 1.0 (r19056)1.0 Not supported by TTDPatch
2 flat left E Supported by OpenTTD 1.0 (r19056)1.0 Not supported by TTDPatch
3 flat upper S Supported by OpenTTD 1.0 (r19056)1.0 Not supported by TTDPatch
4 SW X NW Supported by OpenTTD 1.0 (r19056)1.0 Not supported by TTDPatch
5 SE Y NE Supported by OpenTTD 1.0 (r19056)1.0 Not supported by TTDPatch
6 NE X NW Supported by OpenTTD 1.0 (r19056)1.0 Not supported by TTDPatch
7 NW Y NE Supported by OpenTTD 1.0 (r19056)1.0 Not supported by TTDPatch
8 flat X SE Supported by OpenTTD 1.6 (r27343)1.6 Not supported by TTDPatch
9 flat Y SW Supported by OpenTTD 1.6 (r27343)1.6 Not supported by TTDPatch
10 flat left W Supported by OpenTTD 1.6 (r27343)1.6 Not supported by TTDPatch
11 flat upper N Supported by OpenTTD 1.6 (r27343)1.6 Not supported by TTDPatch
12 SW X SE Supported by OpenTTD 1.6 (r27343)1.6 Not supported by TTDPatch
13 SE Y SW Supported by OpenTTD 1.6 (r27343)1.6 Not supported by TTDPatch
14 NE X SE Supported by OpenTTD 1.6 (r27343)1.6 Not supported by TTDPatch
15 NW Y SW Supported by OpenTTD 1.6 (r27343)1.6 Not supported by TTDPatch

tunnel_overlay

If this callback is defined, tunnels for this roadtype will be drawn differently.

First, a grass underlay base sprite is drawn, then the 'tunnels'-sprite. Next, road vehicle sprites if applicable and then a grass overlay and finally the sprite from this callback. The grass sprites are defined in the base set and do not contain any parts of the tracks or portal, so these have to be fully provided by the roadtype sprites.

Illustration: File:RoadtypeTunnelExample.png

signals

This callback can be used to supply custom signal graphics.

The resulting sprite set must consist of 8 sprites, corresponding to the following signal directions: SW-facing, NE-facing, NW-facing, SE-facing, E-facing, W-facing, S-facing, N-facing. If resolving fails or results in an empty sprite group, the matching base set sprite will be used instead.

Variable extra_callback_info2 contains the state, variant and type of the signal. Use the builtin function getbits() in the following fashion to access the information:

  • Signal state: getbits(extra_callback_info2, 0, 8):
    Result Meaning
    00 Red signal
    01 Green signal
    all other values Reserved
  • Signal variant: getbits(extra_callback_info2, 8, 8):
    Result Meaning
    00 Light (electric) signal
    01 Semaphore
    all other values Reserved
  • Signal type: getbits(extra_callback_info2, 16, 8):
    Result Meaning
    00 Normal block signal
    01 Entry pre-signal
    02 Exit pre-signal
    03 Combo pre-signal
    04 Two-way path signal
    05 One-way path signal
    all other values Reserved

Variable extra_callback_info1 contains the drawing context.

  • getbits(extra_callback_info1, 0, 8):
    Result Meaning
    0 Signal is drawn in a viewport, i.e. on the map.
    0x10 Signal is drawn in the signal GUI. The returned sprite set must still have 8 sprites, but OpenTTD will only use the 7th sprite, so all other sprites can be empty.
    all other values Reserved

Example code

A typical implementation for roadtypes can look like:

 item(FEAT_ROADTYPES, elroad, 0x01) {
     property {
         label:                      "SHIN";
         name:                       string(STR_EL_ROAD);
         menu_text:                  string(STR_EL_ROAD);
         build_window_caption:       string(STR_BUILD_CAPTION);
         autoreplace_text:           string(STR_AUTOREPLACE);
         new_engine_text:            string(STR_NEW_ENGINE);
         compatile_roadtype_list:    ["SHIN","ROAD","ELRL"];                   // Tracks of road and electrified road are compatible
         powered_roadtype_list:      ["ELRL","SHIN"];                          // But we got only power when we have electricity
         roadtype_flags:             bitmask(ROADTYPE_FLAG_NO_LEVEL_CROSSING); // High speed tracks should not have level crossings
         curve_speed_multiplier:     1;
         station_graphics:           ROADTYPE_STATION_MAGLEV;                  // We want the most modern stations
         construction_cost:          32;                                       // should be pretty steep
         speed_limit:                500 km/h;
         acceleration_model:         ACC_MODEL_ROAD;                           // This is still road, though
     }
     graphics {
         track_overlay:   ground_switch_overlay;     // defines the sprites drawn as overlay for junctions and highlight
         underlay:        ground_switch_underlay;    // defines the usual tracks and the underlay for junctions
         level_crossings: level_crossing_switch;     // defines level crossings including traffic lights and blocking bars
         tunnels:         tunnel_switch;             // defines the tracks drawn on a funnel tile
         depots:          depot_switch_electric;     // defines the depot sprites
         bridge_surfaces: bridge_terrain_switch;     // defines the overlay drawn over bridges
         fences:          fences_set;                // defines the look of fences
         // we don't define catenery wire and pylons, thus we use the default which comes with the base graphics.
     }
 }

The switches and graphics blocks are defined in the usual way as described in sections switches, random switches and graphics block sections.