The last track to be released, as part of the Commodore 64 version of Revs+
The Nürburgring track was never released for the BBC Micro. It was only released for the Commodore 64, as part the 1987 Firebird release of Revs+. It has since been ported back to the BBC Micro, which you can read all about in the deep dive on backporting the Nürburgring track.
The track looks like this, if we extract the data from the track data file and draw the results:
The track's elevation profile looks like this:
The track is broken up into 27 sections, as follows:
Number | Shape | Description |
---|---|---|
0 | || | Romer Kurve to Castrol-S (1/2) |
1 | {} | Romer Kurve to Castrol-S (2/2) |
2 | |->| | Castrol-S (1/2) |
3 | <- | Castrol-S (2/2) |
4 | {} | Castrol-S to Ford Kurve (1/4) |
5 | {} | Castrol-S to Ford Kurve (2/4) |
6 | <- | Castrol-S to Ford Kurve (3/4) |
7 | || | Castrol-S to Ford Kurve (4/4) |
8 | -> | Ford Kurve |
9 | || | Ford Kurve top Dunlop Kehre (1/2) |
10 | |<-| | Ford Kurve top Dunlop Kehre (2/2) |
11 | -> | Dunlop Kehre |
12 | {} | Dunlop Kehre to Bit Kurve (1/7) |
13 | <- | Dunlop Kehre to Bit Kurve (2/7) |
14 | || | Dunlop Kehre to Bit Kurve (3/7) |
15 | -> | Dunlop Kehre to Bit Kurve (4/7) |
16 | {} | Dunlop Kehre to Bit Kurve (5/7) |
17 | <- | Dunlop Kehre to Bit Kurve (6/7) |
18 | || | Dunlop Kehre to Bit Kurve (7/7) |
19 | -> | Bit Kurve |
20 | {} | Bit Kurve to Veedol Schikane (1/3) |
21 | -> | Bit Kurve to Veedol Schikane (2/3) |
22 | {} | Bit Kurve to Veedol Schikane (3/3) |
23 | <- | Veedol Schikane (1/2) |
24 | -> | Veedol Schikane (2/2) |
25 | {} | Veedol Schikane to Romer Kurve |
26 | -> | Romer Kurve |
Each section is one of the following shapes:
- || is a straight section that doesn't curve to the left or right, and has the same gradient throughout the whole section
- {} is a straight section in the sense that it doesn't curve to the left or right, but the gradient can differ between sub-sections
- -> consists of sub-sections that all curve to the right
- <- consists of sub-sections that all curve to the left
- |->| consists of sub-sections that are either straight or curve to the right
- |<-| consists of sub-sections that are either straight or curve to the left
- |<->| consists of sub-sections that are either straight or curve to the left or right
See the deep dives on the extra tracks data file format and dynamic track generation in the extra tracks for information on how the extra tracks are constructed, and how the track segment vectors are dynamically generated in the extra tracks. You may also find it useful to read the deep dives on the original track data file format and building a 3D track from sections and segments.
Track generation and shapes
---------------------------
Each track section has lots of associated data, most of which is stored in the two track section data blocks. These are split into part 1 and part 2. See the deep dives on the track data file format and the extra tracks data file format for details.
In the extra track files, track sections are broken up into sub-sections, which are then broken up into segments. Each section therefore has an associated size, given as the number of segments. There is also a track segment vector number, which determines which track segment vectors make up the sections; specifically, it points to the position in the segment vector table where the section's first vector is stored. Note, however, that because the track segment vectors are dynamically generated for this track, the vector number points to the position in the table where the first calculated vector will be stored, rather than pointing to the data itself (as the data is only generated when needed).
Finally, each section has inner and outer coordinates that define the inner and outer track edges at the start of the section. These coordinates share the same y-coordinate, as track sections are level from left to right, so the following table shows the coordinates as (x, z), or longitude and latitude, and the section height is shown separately.
The section data for the Nürburgring track is as follows:
Section | Vector | Size | Segments | Inner coord | Outer coord | Height |
---|---|---|---|---|---|---|
0 | 1 | 83 | 0-82 | (12000, 0) | (11711, 0) | 8000 |
1 | 5 | 84 | 83-166 | (12000, 9960) | (11711, 9960) | 7502 |
2 | 10 | 9 | 167-175 | (12000, 20040) | (11711, 20040) | 6261 |
3 | 20 | 37 | 176-212 | (12776, 20651) | (12713, 20932) | 6009 |
4 | 18 | 45 | 213-257 | (13689, 24372) | (13431, 24242) | 5001 |
5 | 24 | 22 | 258-279 | (11259, 29187) | (11001, 29057) | 4496 |
6 | 7 | 24 | 280-303 | (10071, 31541) | (9813, 31411) | 4086 |
7 | 32 | 16 | 304-319 | (7595, 32449) | (7691, 32177) | 3390 |
8 | 34 | 16 | 320-335 | (5787, 31809) | (5883, 31537) | 2926 |
9 | 11 | 19 | 336-354 | (4741, -32573) | (4464, -32489) | 2462 |
10 | 12 | 90 | 355-444 | (5406, -30388) | (5129, -30304) | 1911 |
11 | 22 | 25 | 445-469 | (5213, -19754) | (4933, -19831) | 247 |
12 | 7 | 61 | 470-530 | (6948, -19647) | (7236, -19650) | 922 |
13 | 28 | 25 | 531-555 | (6887, -26967) | (7175, -26970) | 3577 |
14 | 13 | 6 | 556-561 | (8408, -29381) | (8540, -29124) | 5127 |
15 | 19 | 15 | 562-576 | (9050, -29711) | (9182, -29454) | 5499 |
16 | 34 | 81 | 577-657 | (10268, -30998) | (10525, -30869) | 6309 |
17 | 35 | 15 | 658-672 | (14642, 25871) | (14899, 26000) | 8512 |
18 | 10 | 28 | 673-700 | (16202, 25350) | (16100, 25619) | 8257 |
19 | 38 | 22 | 701-722 | (19338, 26526) | (19236, 26795) | 7781 |
20 | 20 | 69 | 723-791 | (21221, 25231) | (21509, 25255) | 7154 |
21 | 9 | 20 | 792-811 | (21911, 16951) | (22199, 16975) | 4442 |
22 | 29 | 80 | 812-891 | (21359, 14657) | (21609, 14512) | 4292 |
23 | 29 | 12 | 892-903 | (16559, 6337) | (16809, 6192) | 6167 |
24 | 1 | 24 | 904-927 | (16572, 4956) | (16829, 5085) | 6779 |
25 | 25 | 29 | 928-956 | (15944, 2240) | (16189, 2088) | 7703 |
26 | 14 | 25 | 957-981 | (14117, -718) | (14362, -870) | 8051 |
The shape of each track section is also defined in the track data file. Section coordinates are generated on-the-fly, as described in the deep dive on dynamic track generation in the extra tracks, and bit 6 of the track section flags in trackSectionFlag determines the kind of generator that is used (curved or straight).
The shape data for the Nürburgring track is as follows:
Section | Sign | List size | Generator (bit 6) | Shape (bit 0) | Shape |
---|---|---|---|---|---|
0 | 0 | 1 | 1 = Curve | 0 = Straight | || |
1 | 1 | 3 | 1 = Curve | 0 = Straight | {} |
2 | 2 | 2 | 1 = Curve | 1 = Curve | |->| |
3 | 3 | 2 | 1 = Curve | 1 = Curve | <- |
4 | 4 | 1 | 1 = Curve | 0 = Straight | {} |
5 | 5 | 3 | 1 = Curve | 0 = Straight | {} |
6 | 5 | 5 | 1 = Curve | 1 = Curve | <- |
7 | 5 | 5 | 0 = Straight | 0 = Straight | || |
8 | 5 | 5 | 1 = Curve | 1 = Curve | -> |
9 | 6 | 4 | 0 = Straight | 0 = Straight | || |
10 | 6 | 3 | 1 = Curve | 0 = Straight | |<-| |
11 | 7 | 3 | 1 = Curve | 1 = Curve | -> |
12 | 8 | 3 | 1 = Curve | 0 = Straight | {} |
13 | 9 | 3 | 1 = Curve | 1 = Curve | <- |
14 | 9 | 3 | 1 = Curve | 0 = Straight | || |
15 | 9 | 3 | 1 = Curve | 1 = Curve | -> |
16 | 10 | 3 | 1 = Curve | 0 = Straight | {} |
17 | 11 | 3 | 1 = Curve | 1 = Curve | <- |
18 | 12 | 5 | 1 = Curve | 0 = Straight | || |
19 | 12 | 4 | 1 = Curve | 1 = Curve | -> |
20 | 13 | 3 | 1 = Curve | 0 = Straight | {} |
21 | 14 | 3 | 1 = Curve | 1 = Curve | -> |
22 | 14 | 2 | 1 = Curve | 0 = Straight | {} |
23 | 15 | 3 | 1 = Curve | 1 = Curve | <- |
24 | 15 | 3 | 1 = Curve | 1 = Curve | -> |
25 | 15 | 3 | 1 = Curve | 0 = Straight | {} |
26 | 15 | 3 | 1 = Curve | 1 = Curve | -> |
The sign number describes which signs to show when driving around the track (see the next section for details), and the list size determines the size of the track section list in the track verge buffer (see the deep dive on data structures for the track calculations for an explanation).
Road signs
----------
Revs supports up to 16 road signs per track. Each sign's 3D coordinate is stored as a vector (xTrackSignVector, yTrackSignVector, zTrackSignVector) that is scaled down to fit into 8-bit coordinates. This vector describes the sign's coordinate relative to the inner coordinates of a specified track section. Inner section coordinates are stored in part 1 and part 2 of the section data, in the 16-bit variables (xTrackSectionIHi xTrackSectionILo), (yTrackSectionIHi yTrackSectionILo) and (zTrackSectionIHi zTrackSectionILo). We can therefore calculate the 3D coordinate of a sign by scaling the sign vector and adding it to the relevant section coordinate. See the deep dive on road signs for details of this calculation.
The following table shows the sign number, the sign type, the number of the section to which the sign coordinate is relative, the inner section coordinate, the scaled sign vector and the 3D coordinate of the sign that we calculate from all of the preceding data.
Each track section also has an associated sign number in the trackSectionData entry in the first block of track section data. A sign is drawn if this number changes when we drive into a new track section (so it shows the correct sign whether we are driving forwards or backwards into the new section). The sign numbers are shown in the shape table in the previous section.
The road signs for the Nürburgring track are as follows:
Sign | Type | Section | trackSectionI | trackSignVector | Coordinate |
---|---|---|---|---|---|
0 | Start flag | 0 | [ 12000 ] [ 8000 ] [ 0 ] | [ 1 ] [ -8 ] [ 72 ] | [ 12064 ] [ 7872 ] [ 4608 ] |
1 | Straight | 1 | [ 12000 ] [ 7502 ] [ 9960 ] | [ -6 ] [ 6 ] [ 13 ] | [ 11616 ] [ 7598 ] [ 10792 ] |
2 | Right turn | 2 | [ 12000 ] [ 6261 ] [ 20040 ] | [ -5 ] [ 67 ] [ -75 ] | [ 11680 ] [ 7333 ] [ 15240 ] |
3 | Straight | 4 | [ 13689 ] [ 5001 ] [ 24372 ] | [ 9 ] [ 35 ] [ -33 ] | [ 14265 ] [ 5561 ] [ 22260 ] |
4 | Left turn | 6 | [ 10071 ] [ 4086 ] [ 31541 ] | [ 28 ] [ 39 ] [ -54 ] | [ 11863 ] [ 4710 ] [ 28085 ] |
5 | Right turn | 8 | [ 5787 ] [ 2926 ] [ 31809 ] | [ 6 ] [ 12 ] [ -3 ] | [ 6171 ] [ 3118 ] [ 31617 ] |
6 | Hairpin | 11 | [ 5213 ] [ 247 ] [ -19754 ] | [ 9 ] [ 22 ] [ -73 ] | [ 5789 ] [ 599 ] [ -24426 ] |
7 | Straight | 12 | [ 6948 ] [ 922 ] [ -19647 ] | [ -2 ] [ -6 ] [ 20 ] | [ 6820 ] [ 826 ] [ -18367 ] |
8 | Left turn | 13 | [ 6887 ] [ 3577 ] [ -26967 ] | [ 0 ] [ -90 ] [ 61 ] | [ 6887 ] [ 2137 ] [ -23063 ] |
9 | Right turn | 15 | [ 9050 ] [ 5499 ] [ -29711 ] | [ 3 ] [ 9 ] [ 4 ] | [ 9242 ] [ 5643 ] [ -29455 ] |
10 | Left turn | 17 | [ 14642 ] [ 8512 ] [ 25871 ] | [ -33 ] [ -6 ] [ 64 ] | [ 12530 ] [ 8416 ] [ 29967 ] |
11 | Straight | 18 | [ 16202 ] [ 8257 ] [ 25350 ] | [ -5 ] [ 8 ] [ -3 ] | [ 15882 ] [ 8385 ] [ 25158 ] |
12 | Right turn | 19 | [ 19338 ] [ 7781 ] [ 26526 ] | [ -6 ] [ 9 ] [ 3 ] | [ 18954 ] [ 7925 ] [ 26718 ] |
13 | Right turn | 21 | [ 21911 ] [ 4442 ] [ 16951 ] | [ -1 ] [ 93 ] [ 73 ] | [ 21847 ] [ 5930 ] [ 21623 ] |
14 | Left turn | 22 | [ 21359 ] [ 4292 ] [ 14657 ] | [ -39 ] [ 27 ] [ -66 ] | [ 18863 ] [ 4724 ] [ 10433 ] |
15 | Right turn | 26 | [ 14117 ] [ 8051 ] [ -718 ] | [ 31 ] [ -11 ] [ 41 ] | [ 16101 ] [ 7875 ] [ 1906 ] |
Corner markers and verge markings
---------------------------------
Each track section can optionally have a set of corner markers (three markers are shown for each curve when configured, while one marker is shown for each applicable straight). The markers can either be a combination of red and white markers, or just white, according to bit 5 of the track section flags in trackSectionFlag. They can also appear on the left or the right of the track, according to bits 3-4 of the section flags.
Track sections can also have differently coloured verge markings. These are black-and-white by default, but can be configured in bits 1-2 of the section flags to be red-and-white on the left or the right of the track.
See the deep dive on corner markers for details of how corner markers work, and the deep dive on the track verges for more on how the verge markings are implemented.
The corner markers and verge markings for the Nürburgring track are as follows:
Section | Marker colours (bit 5) | Marker positions (bits 3-4) | Verge colours (bits 1-2) |
---|---|---|---|
0 | 0 = White | 00 = None | 01 = Red/white on left |
1 | 1 = Red/white | 10 = Left | 00 = Both black/white |
2 | 1 = Red/white | 01 = Right | 10 = Red/white on right |
3 | 1 = Red/white | 10 = Left | 01 = Red/white on left |
4 | 0 = White | 00 = None | 10 = Red/white on right |
5 | 1 = Red/white | 01 = Right | 00 = Both black/white |
6 | 1 = Red/white | 10 = Left | 01 = Red/white on left |
7 | 1 = Red/white | 10 = Left | 10 = Red/white on right |
8 | 1 = Red/white | 01 = Right | 10 = Red/white on right |
9 | 0 = White | 00 = None | 01 = Red/white on left |
10 | 1 = Red/white | 10 = Left | 00 = Both black/white |
11 | 1 = Red/white | 01 = Right | 10 = Red/white on right |
12 | 1 = Red/white | 01 = Right | 01 = Red/white on left |
13 | 1 = Red/white | 10 = Left | 01 = Red/white on left |
14 | 0 = White | 00 = None | 00 = Both black/white |
15 | 1 = Red/white | 01 = Right | 10 = Red/white on right |
16 | 1 = Red/white | 01 = Right | 01 = Red/white on left |
17 | 1 = Red/white | 10 = Left | 01 = Red/white on left |
18 | 1 = Red/white | 10 = Left | 10 = Red/white on right |
19 | 1 = Red/white | 01 = Right | 10 = Red/white on right |
20 | 1 = Red/white | 10 = Left | 01 = Red/white on left |
21 | 1 = Red/white | 01 = Right | 10 = Red/white on right |
22 | 1 = Red/white | 01 = Right | 01 = Red/white on left |
23 | 1 = Red/white | 10 = Left | 01 = Red/white on left |
24 | 1 = Red/white | 01 = Right | 10 = Red/white on right |
25 | 1 = Red/white | 10 = Left | 00 = Both black/white |
26 | 1 = Red/white | 01 = Right | 10 = Red/white on right |
Driver speeds and approaches
----------------------------
The track data also contains data that influences how the non-player drivers drive (see the deep dive on tactics of the non-player drivers for details). This data latter is not only used to control non-player drivers, but feeds into computer assisted steering (CAS) as well; see the deep dive computer assisted steering (CAS) for more on this.
This data includes the segment number in each section where non-player drivers should start turning (in trackSectionTurn), the optimum speed for each section (in trackSectionSpeed), the optimum steering to apply for this section (in trackSteering), and whether this section has a maximum speed (in bit 7 of trackSectionFlag).
The non-player driver data for the Nürburgring track is as follows:
Section | Turn at segment | Optimum speed | Speed as bit 7:0-6 | Section shape | Optimum steering | Maximum speed |
---|---|---|---|---|---|---|
0 | 255 | 255 | 1:127 | || | <- 6* | - |
1 | 77 | 146 | 1:18 | {} | <- 6* | - |
2 | 14 | 7 | 0:7 | |->| | -> 17 | 146 |
3 | 45 | 34 | 0:34 | <- | <- 18* | - |
4 | 255 | 255 | 1:127 | {} | -> 6* | - |
5 | 16 | 181 | 1:53 | {} | -> 6* | - |
6 | 31 | 15 | 0:15 | <- | <- 14 | 181 |
7 | 12 | 121 | 0:121 | || | <- 12* | - |
8 | 24 | 13 | 0:13 | -> | -> 12 | 121 |
9 | 255 | 255 | 1:127 | || | <- 6* | - |
10 | 88 | 112 | 0:112 | |<-| | <- 6* | - |
11 | 29 | 14 | 0:14 | -> | -> 10 | 112 |
12 | 52 | 255 | 1:127 | {} | -> 6* | - |
13 | 37 | 15 | 0:15 | <- | <- 15* | - |
14 | 0 | 255 | 1:127 | || | <- 0* | - |
15 | 33 | 23 | 0:23 | -> | -> 15* | - |
16 | 75 | 156 | 1:28 | {} | -> 6* | - |
17 | 27 | 15 | 0:15 | <- | <- 14 | 156 |
18 | 23 | 162 | 1:34 | || | <- 20* | - |
19 | 32 | 18 | 0:18 | -> | -> 14 | 162 |
20 | 54 | 255 | 1:127 | {} | <- 6* | - |
21 | 50 | 28 | 0:28 | -> | -> 15* | - |
22 | 71 | 193 | 1:65 | {} | -> 8* | - |
23 | 19 | 7 | 0:7 | <- | <- 18 | 193 |
24 | 39 | 36 | 0:36 | -> | -> 28* | - |
25 | 26 | 127 | 0:127 | {} | <- 6* | - |
26 | 31 | 16 | 0:16 | -> | -> 11 | 127 |
The speed is shown as-is, and with bit 7 split out, which is used in the driver tactic calculations. The optimum steering is shown as a direction and a magnitude, and if there is an asterisk (*), then the magnitude is scaled by the track's base speed for the chosen class.