The nfo/grf Technical Reference

Action 5

Defining TTDPatch specific graphics sets


Introduction

Action 5 is used to define graphics in connection with certain new features in TTDPatch, like additional signals, catenary, canals, tram tracks, etc.


Format

The data looks as follows:

<sprite-number> * <length> 05 <type> <num-sprites>

ElementSizeDescription
<sprite-number>decA sequential sprite number
<length>decThe total number of bytes used in this action
05BDefines action 05
<type>BWhat type of graphics follow
<num-sprites>B*How many regular sprites follow
<offset>B*Offset in the Action 5 assignable block of sprites

The following num-sprites sprites in the .nfo file have to be RealSprites that will be used as graphics for the given TTDPatch feature, except for type 0A, which requires RecolorSprites.

Action 5 entries in a .grf file which has a regular GRF ID (not FFFFFFFF) will always override those from .grf files with a GRF ID of FFFFFFFF (starting from 2.0.1 alpha 19).


Description

<sprite-number>


This is just the number you are at.

<length>


Count the number of bytes in this action.

<type>


This sets the type of feature that the graphics are for. If bit 7 is set, the offset variable needs to be set. Bit 7 may only be set if the type supports it. The type can be one of:

Type Feature num-sprites (decimal) Minimum version
TTDPatch OTTD
04Pre-signal graphics48
04 Pre-signal and semaphore graphics 112
04, 84[*] Pre-signal, semaphore, and PBS graphics 2402.0.1 alpha 41  
05, 85[*] Overhead wires and pylon graphics48
06Foundations (retaining walls) for BuildOnSlopes 74
06, 86[*]Foundations for BuildOnSlopes and half tiles (NS and EW foundations) 90n/a r11321
07[a]GUI sprites93 2.0.1 alpha 43  
08[b], 88[*] Canals652.0.1 alpha 17  
09, 89[*] One-way road arrows 6 2.0.1 alpha 58  
0A, 8A[*] Two company color translation maps 256 2.0.1 alpha 67  
0B, 8B[*] Tram tracks 1132.0.1 alpha 68  
0C Snowy temperate trees1332.0.1 alpha 74 n/a
0D Coast Tile graphics 16 (18) 2.5 beta 5r11726
0E New Signals Any2.6 alpha 0 r1247 n/a
0F, 8F[*] Sprites for marking tracks on slopes (for track reservation systems like PBS or YAPP) 122.6 alpha 0 r1487 r13469
10, 90[*] Additional airport graphics 15n/a r9645
11, 91[*] Road stop graphics 82.6 alpha 0 r1589 r9645
12, 92[*] Aqueduct graphics 82.6 alpha 0 r1498 r13464
13, 93[*] Autorail sprites 55n/a r11433
14, 94Flag spritesUp to 36n/a r11433
15, 95OpenTTD GUI spritesUp to 160n/a r11433
16, 96 Airport preview spritesUp to 9 n/a r20370
17, 97 Railtype tunnel base sprites16 n/a r23952
18, 98 Extra all black palette ('for more height levels')1 n/a OpenTTD 1.5

[*] Offset allowed since OpenTTD 1.2.
[a] Type 07 only requires 73 sprites in the stable (2.5 branch); the extra sprites are the clone train and build canal cursors.
[b] TTDPatch supported canals via Action5 from 2.0.1 alpha 17 up to alpha 25. In alpha 26 it was removed again in favour of an action1/2/3 method; see Action3. The method via Action5 is no longer supported by TTDPatch 2.0.1 alpha 26 and newer.

04 Signal graphics

Signal graphics come in groups of 16. These groups contain sprites in the same order as sprites 1275-1290 in trg1[r].grf; red, then green, for each of: SW-facing, NE-facing, NW-facing, SE-facing, E-facing, W-facing, S-facing, N-facing.

Group(s)Contents
0lighted entrance signals
1lighted exit signals
2lighted combo signals
3standard (non-pre-signal) semaphore signals
4 .. 6repeat 0 .. 2 for semaphores
7standard lighted PBS signals
8 .. 14repeat 0 .. 6 for PBS signals

0C Snowy temperate trees

If the temperate snow line is enabled, you can use this to specify the snowy versions of temperate trees. The sprites must be the snowy versions of sprites 1576 .. 1708 from trg1[r].grf, in the same order as they appear there.

0D Coast tile sprites

If diagonal flooding is enabled due to the new corner coasts feature, you can use this to give a complete set of replacement coast tile sprites. There are 16 in total, 8 original Transport Tycoon Deluxe sprites and 8 for the corner slopes. Order of the sprites (numbers according to trg1[r].grf) is as follows:
3997, 4063, 4064, 4068, 4062, 3998, 4066, 3988,
4065, 4069, 3996, 3992, 4067, 3994, 3995, 3999. 

Additionally, OpenTTD since r11726 supports another method of supplying all additional coast tile sprites, but this is only allowed in the extra NewGRF of Base Graphic Sets. In this, only 10 sprites are supplied in the same order as the 16 sprites above, but without the coast sprites already in trg1[r].grf. Note that the 10 sprites version supplies two additional slopes, but they are not used, and are currently unlikely to be ever used.


In OpenTTD 10 sprites for type 0D is enough in base graphic sets. The 16 sprites version should not be used for base graphics.

The reason for the existence of a 10 sprite version is to remove the need for including original graphics, and to keep compatibility with old NewGRFs that replace the original shore graphics using Action A without adding new shores using Action 5: When a NewGRF uses the 16 sprites version it takes precedence above any NewGRF replacing the shore graphics using Action A; when a NewGRF uses Action A to replace shore graphics it takes precedence above a 10-sprite Action 5, effectively disabling diagonal flooding. Also due to compatibility the 10 sprites version is invalid for normal NewGRFs, which are not the "extra" NewGRF of some Base Graphics Set.

0E New Signals

Any number of real and recolour sprites can be specified in the action in any order.
Sprites are referenced by their offset into the action5 block by a VarAction2NewSignals, hence a logically easily calculable order is advised.

As of 2.6 alpha 0 r1346, the action 5 block defined in the same GRF file as the varaction2, will be used as the base sprite block for the offsets returned by the callback even if it is overridden by a higher priority GRF action 5 definition of the same feature (0E).

0F Tracks for Slopes

This should be in the same order as sprites 1031 .. 1035 (Sprite numbers from trg1[r].grf). These should only be the rails, basically the same format as sprites 1005 to 1010. There should be 3 groups of these sprites, one for each rail type (railroad, monorail, maglev).

11 Road stop graphics

Road stop graphics consist of 2 groups of 4 sprites. The first group contains graphics for bus stops, second for truck stops. In each group, the sprites are in the following order: SW, NE, NW, SE. SW and NE sprites are used with road going along the Y axis ( .\' ), NW and SE with road along the X axis( '/. ).

Internally, the stations are defined using the following station layouts:

\d1313
\b13 \b0 \b0 \b3 \b16 \b16 <SW sprite>
\b0 \b0 \b0 \b3 \b16 \b16 <NE sprite>
80

and

\d1314
\b0 \b0 \b0 \b16 \b3 \b16 <NW sprite>
\b0 \b13 \b0 \b16 \b3 \b16 <SE sprite>
80

where 1313 and 1314 are city road sprites.

Reference sprites can be found in ttdpbase(w).grf (TTDPatch) and in roadstops.grf (OpenTTD).

Note: As of OpenTTD r10185, the behaviour of this feature is identical in both games.

12 Aqueducts

8 real sprites should be given. Firstly: 4 bridge end sprites in the order: SW, SE, NE, NW, where the direction is that heading onto the aqueduct. Then 2 middle part sprites for the X and Y directions. Followed by two pillar sprites for the X and Y directions.

For examples of where the division between middle sprites and pillars should be made see sprites 2437 to 2592 (trgr1[r].pcx), or an existing aqueduct GRF. Note, that for higher bridges to work effectively, pillars should be approximately 8px in height.

15 / 95 OpenTTD GUI sprites

OpenTTD defines 162 GUI sprites. Additional sprites not needed by an OpenTTD are simply ignored, so that new(er) base sets can be used by old OpenTTD versions. One can (re-)define a subset of the GUI sprites by giving an offset into the GUI sprites. The sprites are:

OffsetMeaning
0 .. 11Halftile selections
12 .. 13Title screen letters E and D
14 .. 37Bridge piers colours 1 .. 4
38Square indicating NewGRF compatibility
39Blob indicating server compatibility
40Lock icon
41Empty check box
42Checked check box
43Warning sign
44Window resize right
45 .. 48Arrows
49House
50Shared orders
51 .. 52Pin / pinned
53 .. 62Rail build icons and cursors
63 .. 68Monorail build icons and cursors
69 .. 74Maglev build icons and cursors
75??
76 .. 77Waypoint toolbar and cursor icon
78 .. 81Waypoint buildings
82 .. 85Autoroad toobar and cursor for road and trams
86Helipad
87Build ship lift cursor
88 .. 89Build canal toolbar and cursor
90Fast forward
91 .. 92Level land toolbar and cursor
93 .. 96Sell vehicle
97 .. 100Sell all vehicles
101 .. 104Replace vehicle
105Sell chain of rail vehicles
106 .. 113Clone vehicles button and cursors
114 .. 117Create vehicle group button
118 .. 121Delete vehicle group button
122 .. 125Rename vehicle group button
126 .. 133Group replace on / off button
134Road toolbar: build one-way roads
135Signal toolbar: convert signals
136 .. 137Build rivers toolbar and cursor
138 .. 143OSK
144Switch toolbar
145 .. 146Build aqueduct toolbar and cursor
147 .. 148(+) and (-) icon
149Window resize left
150Play music right-to-left languages
151 .. 152Shade / unshade
153Debug
154 .. 157Vehicle profit icons
158Unread news
159Exclusive transport rights
160Autoreplace protection
161Autoreplace defined

<num-sprites>

The number of sprites that follow.

Since TTDPatch 2.0.1 alpha 49, this value is an extended byte. Note that it is not generally an error to provide more sprites than required, but this does expend sprite slots unnecessarily.

<offset>

The offset in the Action 5 assignable block of sprites. This term is only read when bit 7 of the type has been set. It can be used to only replace a subset of sprites from a set.

Note: When creating a TTDPatch compatible grf, you have to skip the OpenTTD specific Action 05's using an Action 09 rather than an Action 07. Using the latter will result in an error on your Action 05 when using the grf in TTDPatch.

Note: NFORenum distinguishes Action5 with no offset and Action5 with offset 0. While they have technically the same effect, NFORenum assumes an Action5 with no offset has the intention to replace all sprites and checks the number of sprites accordingly. An Action5 with offset is considered to only replace a subset of the sprites, so the sprites are not checked for completeness.

Example

Something to go here