OpenTTD Landscape Internals
Author: Marcin Grzegorczyk
Description: Structure of OpenTTD (OTTD) landscape arrays

### Landscape

Five arrays are used to encode the information of the contents of each tile. These arrays are referred to as "map_owner", "map2", "map3_lo|_hi", "map_type_and_height" and "map5". The known encodings are listed in the table below. The most important value is the class of a tile, stored in the upper 4 bits of the type_and_height array. The lower 4 bits are used to encode the height and slope data. For a graphical represenation of the tile-layout have a look at Landscape grid page.

OTTD's class-specific periodic tile processing routine is called once every +256 ticks for each tile.

Class | Meaning & details of encoding
--- | ---
- `0` | map5 bits 4..0: tile type:
  `00` | bare land
  `01` | 1/3 grass
  `02` | 2/3 grass
  `03` | full grass
  `07` | rough land
  `0B` | rocks
  `0F` | fields; type of fields in map3_lo bits 3..0 (legal values: 0 through 9)
  `10` | 1/4 snow
  `11` | 2/4 snow
  `12` | 3/4 snow
  `13` | full snow
  `15` | partial desert
  `17` | full desert
map5 bits 7..6: update counter, incremented on every periodic processing for tile types other than `03`, `07`, `0B` and `10` and above, on wraparound the tile is updated (for fields, the type of fields in map3_lo is increased, for other types the tile type in map5 is increased) (for snow and desert, these bits are not used, tile is updated on every periodic processing) map_owner: owner of the tile (normally `10`) map3_hi bits 7..5: type of hedge on the SW border of the tile (1 through 6, or 0=none); bits 4..2: same for the SE border
- `1` | map5 bit 7 clear: railway track map5 bits 0..5: track layout: bit set = track present:
  bit 0: | in the X direction
  bit 1: | in the Y direction
  bit 2: | in the north corner (direction W-E)
  bit 3: | in the south corner (direction W-E)
  bit 4: | in the west corner (direction N-S)
  bit 5: | in the east corner (direction N-S)
- - - map5 bit 6 set = with signals: map3_lo bits 7..4: bit set = signal present: For track in the X direction:
      bit 6: | signal in the SW direction
      bit 7: | signal in the NE direction
    - For track in the Y direction:
      bit 6: | signal in the NW direction
      bit 7: | signal in the SE direction
    - For tracks in the W-E direction:
      bit 4: | signal in the W direction on the track in the S corner
      bit 5: | signal in the E direction on the track in the S corner
      bit 6: | signal in the W direction on the track in the N corner
      bit 7: | signal in the E direction on the track in the N corner
    - For tracks in the N-S direction:
      bit 4: | signal in the S direction on the track in the E corner
      bit 5: | signal in the N direction on the track in the E corner
      bit 6: | signal in the S direction on the track in the W corner
      bit 7: | signal in the N direction on the track in the W corner
  - map2 bits 7..4: bit clear = signal shows red; same bits as in map3_lo OpenTTD bits in map3_hi:
    bits 1..0: | type of signal:
    `00`: | normal signals
    `01`: | pre-signals
    `10`: | exit-signals
    `11`: | combo-signals
    bit 2: | set = semaphore signals, clear = light signals
- map_owner: owner of the track map2 bits 0..3:
  `0` | on bare land
  `1` | on grass, no fences
  `2` | fence on the NW side
  `3` | fence on the SE side
  `4` | fences on the NW and SE sides
  `5` | fence on the NE side
  `6` | fence on the SW side
  `7` | fences on the NE and SW sides
  `8` | fence on the E side (track in the W corner)
  `9` | fence on the W side (track in the E corner)
  `A` | fence on the S side (track in the N corner)
  `B` | fence on the N side (track in the S corner)
  `C` | on snow or desert
map3_lo bits 0..3 = track type: `0` - conventional railway, `1` - monorail, `2` - maglev map5 bits 7 and 6 set: railway depot / checkpoints map5 value C0..C3: railway depot map5 bits 1..0 - direction: exit towards: `00` = NE, `01` = SE, `02` = SW, `03` = NW map5 value C4..C5: checkpoint bit 0: clear = in X direction, set = in Y direction map_owner: owner of the depot / checkpoint map3_lo bits 0..3 = track type map3_lo bit 4 = use custom sprite (valid only for the checkpoint) map3_hi = custom station id
- `2` | map5 bits 7..4 clear: road map5 bits 3..0: road layout: bit set = road piece present:
  bit 0: | NW piece
  bit 1: | SW piece
  bit 2: | SE piece
  bit 3: | NE piece
map_owner: owner of the road map2: Index into the array of towns, 0 for non-town roads map3_hi bits 0..3: counter for the roadworks map3_hi bits 4..6: `0` - on bare land, `1` - on grass, `2` - paved, `3` - with streetlights, `5` - tree-lined, `6` - on grass with road works, `7` - paved with road works map3_hi bit 7 set = on snow or desert map5 bit 4 set, bits 7..5 clear: level crossing map5 bit 3: clear - road in the X direction, set - road in the Y direction (railway track always perpendicular) map5 bit 2: set if crossing lights are on map_owner: owner of the railway track map2: Index into the array of towns, 0 for non-town roads map3_lo bits 0..7: owner of the road map3_hi bits 3..0: track type map3_hi bits 4..6: `0` - on bare land, `1` - on grass, `2` or higher - paved map3_hi bit 7 set = on snow or desert map5 bit 5 set: road depot map5 bits 3..0 - direction: exit towards: `0` = NE, `1` = SE, `2` = SW, `3` = NW map_owner: owner of the depot map3_hi bit 7 set = on snow or desert (not displayed, but set internally)
- `3` | Town building map2: Index into the array of towns map3_hi: town building type: Note: In the climate list, 'sub-arctic' means below the snow line, and 'snow' means above the snow line in the sub-arctic climate.
  Type | Size | Climates | Description
  --- | --- | --- | ---
  `00` | 1×1 | temperate | tall office block
  `01` | 1×1 | temperate | office block
  `02` | 1×1 | temperate | small block of flats
  `03` | 1×1 | temperate | church
  `04` | 1×1 | temperate, sub-arctic, sub-tropical | large office block
  `05` | 1×1 | snow | large office block
  `06` | 1×1 | temperate | town houses
  `07`..`08` | 1×2 | temperate | hotel
  `09` | 1×1 | temperate, sub-arctic, sub-tropical | statue
  `0A` | 1×1 | temperate, sub-arctic, sub-tropical | fountain
  `0B` | 1×1 | temperate | park (with a pond)
  `0C` | 1×1 | temperate | park (with an alley)
  `0D` | 1×1 | temperate | office block
  `0E`..`10` | 1×1 | temperate | various types of shops and offices
  `11` | 1×1 | temperate, sub-arctic, sub-tropical | modern office building
  `12` | 1×1 | temperate | warehouse
  `13` | 1×1 | temperate | office block (with spiral stairway on the side)
  `14`..`17` | 2×2 | temperate | stadium
  `18` | 1×1 | temperate | old houses
  `19` | 1×1 | temperate | cottages
  `1A` | 1×1 | temperate | houses
  `1B` | 1×1 | temperate | flats
  `1C` | 1×1 | temperate | tall office block
  `1D` | 1×1 | temperate | shops and offices
  `1E` | 1×1 | temperate, sub-tropical | shops and offices
  `1F` | 1×1 | temperate | theatre
  `20`..`23` | 2×2 | temperate, sub-arctic, sub-tropical | stadium (modern style)
  `24` | 1×1 | temperate, sub-arctic, sub-tropical | offices (the modern 'vertical tube' style)
  `25` | 1×1 | sub-arctic | houses
  `26` | 1×1 | snow | houses
  `27` | 1×1 | temperate | cinema
  `28`..`2B` | 2×2 | temperate | shopping mall
  `2C` | 1×1 | sub-arctic | flats
  `2D` | 1×1 | snow | flats
  `2E` | 1×1 | sub-arctic | houses
  `2F` | 1×1 | snow | houses
  `30` | 1×1 | sub-arctic | houses
  `31` | 1×1 | snow | houses
  `32` | 1×1 | sub-arctic, sub-tropical | tall office block
  `33` | 1×1 | snow | tall office block
  `34` | 1×1 | sub-arctic | tall office block
  `35` | 1×1 | snow | tall office block
  `36` | 1×1 | sub-arctic, sub-tropical | tall office block
  `37` | 1×1 | snow | tall office block
  `38` | 1×1 | sub-arctic | houses
  `39` | 1×1 | snow | houses
  `3A` | 1×1 | sub-arctic | shops and offices
  `3B` | 1×1 | snow | shops and offices
  `3C` | 1×1 | sub-arctic | church
  `3D` | 1×1 | snow | church
  `3E` | 1×1 | sub-arctic | houses
  `3F` | 1×1 | snow | houses
  `40` | 1×1 | sub-arctic | shops and offices
  `41` | 1×1 | snow | shops and offices
  `42`..`43` | 1×2 | sub-arctic | hotel
  `44`..`45` | 1×2 | snow | hotel
  `46` | 1×1 | sub-arctic, sub-tropical | shops and offices
  `47` | 1×1 | snow | shops and offices
  `48` | 1×1 | sub-arctic | tall office block
  `49` | 1×1 | snow | tall office block
  `4A`..`4B` | 2×1 | sub-arctic | tall office block
  `4C`..`4D` | 2×1 | snow | tall office block
  `4E` | 1×1 | sub-tropical | houses (with a tree in a corner)
  `4F`, `50` | 1×1 | sub-tropical | houses
  `51` | 1×1 | sub-tropical | houses (suburb-type)
  `52` | 1×1 | sub-tropical | flats
  `53` | 1×1 | sub-tropical | church
  `54` | 1×1 | sub-tropical | houses (with two trees in front)
  `55`, `56` | 1×1 | sub-tropical | flats
  `57`..`58` | 2×1 | sub-tropical | tall office block
  `59` | 1×1 | sub-tropical | flats
  `5A` | 1×1 | sub-tropical | tall office block
  `5B` | 1×1 | toyland | church
  `5C`..`61` | 1×1 | toyland | various types of toyland houses
  `62` | 1×1 | toyland | tall office block
  `63`..`64` | 1×2 | toyland | houses ('shoe' style)
  `65` | 1×1 | toyland | tall office block
  `66` | 1×1 | toyland | igloo
  `67` | 1×1 | toyland | tepees
  `68`, `69` | 1×1 | toyland | shops and offices
  `6A` | 1×1 | toyland | tall office block
  `6B` | 1×1 | toyland | statue
  `6C` | 1×1 | toyland | teapot-house
  `6D` | 1×1 | toyland | piggy-bank
map3_lo bits 7..6: stage of construction (`3` = completed) map5 bits 2..0: construction counter, for buildings under construction incremented on every periodic tile processing, on wraparound the stage of construction in map3_lo is increased for large office blocks (types `04` and `05`): map_owner bits 6..0: position of the lift map_owner bit 7: if set the lift is moving map5 bit 7: if set then map5 bits 5..0 hold the final position of the lift divided by 6 (valid values 0..6 except 1)
- `4` | Trees map5 bits 7..6: number of trees minus one map5 bits 2..0: growth status: `0`..`2` - one of trees is growing, `3` - all trees are fully grown, `4`..`6` - one of trees is withering map3_lo bits 7..0: type of trees:
  `00`..`0B` | temperate climate trees
  `0C`..`13` | sub-arctic climate trees
  `14`..`1A` | rainforest trees
  `1B` | cactus plants
  `1C`..`1F` | sub-tropical climate, non-rainforest, non-desert trees
  `20`..`28` | toyland trees
- (note: the actually displayed set of trees depends on both type and number of trees) map3_hi bits 7..5: type of hedge on the SW border of the tile (1 through 6, or 0=none) map3_hi bits 4..2: type of hedge on the SE border of the tile (1 through 6, or 0=none) map2 bits 5..4:
  `0` | on grass
  `1` | on rough land
  `2` | on snow or desert; map2 bits 7..6 - amount of snow or desert (for desert always set to 3 in TTD)
map2 bits 3..0: update counter, incremented on every periodic processing, on wraparound the growth status is updated (or, if it's `3`, a random action is taken) map_owner: owner (normally `10`)
- `5` | Station tile map5: tile type:
  `00`..`07` | railway station `00`..`01` - open platform, `02`..`03` - open platform with station building, `04`....`07` - roofed platform bit 0: clear = in X direction, set = in Y direction
  `08`..`33` | large airport
  `0B` | pad 1
  `16`..`19` | runway middle
  `1A` | runway ending
  `1C` | control tower
  `20` | hangar
  `21` | pad 3
  `22` | pad 2
  `27`..`32` | radar (animated)
  `33` | transmitter
  The initial layout of a large airport is (rows in Y direction, columns in X direction):
      1F 1B 1E 33 26 1A
      09 24 0B 0C 0D 16
      21 1D 23 0E 0F 17
      09 22 0D 11 10 18
      09 08 14 13 12 19
      20 0A 15 1C 27 1A
  `34`..`41` | small airport
  `3A`..`3D` | field with the wind meter (animated)
  `3E` | runway south ending
  `3F` | runway middle
  `40` | runway north ending
  `41` | hangar
  The initial layout of a small airport is (rows in Y direction, columns in X direction):
      36 3A 40
      35 39 3F
      34 38 3F
      41 37 3E
  `42` | heliport
  `43`..`46` | lorry loading area; exit towards: `43` - NE, `44` - SE, `45` - SW, `46` - NW
  `47`..`4A` | bus station; exit towards: `47` - NE, `48` - SE, `49` - SW, `4A` - NW
  `4B` | oilfield
  `4C`..`51` | ship dock; `4C` - SW coast part, `4D` - NW coast part, `4E` - NE coast part, `4F` - SE coast part, `50` - X direction water part, `51` - Y direction water part
  `52` | buoy

- map_owner: owner of the station
- map2: index into the array of stations
- map3_lo bits 0..3: track type for railway stations, must be 0 for all the other stations
- map3_lo bit 4 = use custom sprite (valid only railway stations FOR NOW)
- map3_hi = custom station id
`6`

- map5: tile type:

  `00` | water
  `01` | coast or riverbank
  `10`..`1B` | canal locks
  `10` | middle part, (SW-NE direction)
  `11` | middle part, (NW-SE direction)
  `12` | middle part, (NE-SW direction)
  `13` | middle part, (SE-NW direction)
  `14` | lower part, (SW-NE direction)
  `15` | lower part, (NW-SE direction)
  `16` | lower part, (NE-SW direction)
  `17` | lower part, (SE-NW direction)
  `18` | upper part, (SW-NE direction)
  `19` | upper part, (NW-SE direction)
  `1A` | upper part, (NE-SW direction)
  `1B` | upper part, (SE-NW direction)
  `80`..`83` | ship depots
  `80` | ship depot, NE part (X direction)
  `81` | ship depot, SW part (X direction)
  `82` | ship depot, NW part (Y direction)
  `83` | ship depot, SE part (Y direction)

- map_owner: owner (for water and coasts normally `11`)

`7` Void

Tiles of this class form an invisible, one tile wide border at the south (bottom) edges of the map, so as to protect several algorithms from the consequences of a wraparound at the edges.

`8` Industry tile

- map5: type:
  (note: this is not the same as the industry type stored in the array of industries)

  `00`..`06` | coal mine
  `00` | wheel tower when not animated
  `01` | wheel tower when animated; animation state in map_owner bits 5..0; map_owner bit 6 set = sound already generated
  `07`..`0A` | power station
  `08` | chimney
  `0A` | transformer; animation progress in map_owner bits 5..2 (valid range `0`..`7`)
  `0B`..`0F` | sawmill
  `10`..`11` | forest
  `11` | trees cut down
  `12`..`17` | oil refinery
  `18`..`1C` | oil rig
  `1D`..`20` | oil wells
  `1D` | not animated
  `1E`..`20` | various stages of animation; progress of animation in map_owner bits 1..0
  `21`..`26` | farm
  `27`..`2A` | factory (temperate climate)
  `2B`..`2E` | printing works
  `2F`..`33` | copper ore mine
  `2F` | wheel tower when not animated
  `30` | wheel tower when animated; animation state in map_owner bits 5..0; map_owner bit 6 set = sound already generated
  `31` | chimney
  `34`..`39` | steel mill
  `3A`..`3B` | bank (temperate climate)
  `3C`..`3F` | food processing plant
  `40`..`47` | paper mill
  `48`..`58` | gold mine
  `4F` | wheel tower when not animated
  `58` | wheel tower when animated; animation state in map_owner bits 5..0; map_owner bit 6 set = sound already generated
  `59`..`5A` | bank (sub-arctic or sub-tropical climate)
  `5B`..`63` | diamond mine
  `64`..`73` | iron ore mine
  `74` | fruit plantation
  `75` | rubber plantation
  `76`..`77` | water supply
  `78` | water tower
  `79`..`7C` | factory (sub-tropical climate)
  `7D`..`80` | lumber mill
  `81`..`82` | candyfloss forest
  `82` | candyfloss 'trees' cut down
  `83`..`86` | sweet factory
  `87`..`88` | battery farm
  `88` | batteries 'reaped'
  `89` | cola wells
  `8A`..`8D` | toy shop
  `8E`..`93` | toy factory
  `8F` | animated part; animation state in map3_lo (valid range `00`..`31`) tile animation is started (map3_hi zeroed) on the periodic processing if field `2C` in the corresponding industry array entry is nonzero while the animation is in progress (see the array at `04328`) map3_hi holds the number of animation cycles that have already taken place; when this number reaches 8 the animation is stopped
  `94`..`9B` | plastic fountains (various stages of cyclic animation)
  `9C`..`9F` | fizzy drink factory
  `A0`..`A3` | bubble generator
  `A1` | generators
  `A2` | bubble capture facility; animation state in map3_lo (valid range `00`..`27`)
  `A4`..`A6` | toffee quarry
  `A5` | animated part; animation state in map3_lo (valid range `00`..`45`)
  `A7`..`AE` | sugar mine
  `AE` | animated part; animation state in map3_lo (valid range `00`..`5F`)

- map2: index into the array of industries
- map_owner bit 7: clear = under construction
  - map_owner bits 4..2: construction counter, for buildings under construction incremented on every periodic tile processing
- map_owner bits 1..0: stage of construction (`3` = completed), incremented when the construction counter wraps around
  the meaning is different for some animated tiles which are never under construction (types `01`, `1E`..`20`, `30`, `58`; see above)

`9` map5 bits 7..4 clear: tunnel entrance/exit

- map5 bits 3..2: `0` - railway tunnel, `1` - road tunnel
- map5 bits 1..0 - direction: entrance towards: `0` = NE, `1` = SE, `2` = SW, `3` = NW
- map_owner: owner of the tunnel
- map3_lo bits 3..0 = track type for railway tunnel, must be 0 for road tunnel
- map3_hi bit 7 set = on snow or desert

map5 bit 7 set: bridge

- map5 bit 6 clear: bridge ending
  - map5 bit 5: clear - northern, set - southern ending
  - map3_lo bits 3..0 = type of track on the bridge, must be 0 for road bridge
  - map_owner: owner of the bridge
  map5 bit 6 set: bridge middle part
  - map5 bit 5 clear:
    - map5 bits 4..3: land under bridge: `0` - grass, snow or desert, `1` - water
    map5 bit 5 set:
    - map5 bits 4..3: transport route under bridge: `0` - railway, `1` - road
  - map3_lo bits 7..4 = type of track on the bridge, must be 0 for road bridge
  - map3_lo bits 3..0 = type of track under the bridge, if any
  - map2 bits 3..0: bridge piece (`0`..`5`)
  - map_owner: owner of the land under bridge
- map5 bits 2..1: `0` - railway bridge, `1` - road bridge
- map5 bit 0: clear - bridge in the X direction, set - bridge in the Y direction
- map2 bits 7..4: bridge type:

  Type | Max. speed (mph) | Description
  --- | --- | ---
  `0` | 20 | wooden
  `1` | 30 | concrete
  `2` | 40 | girder, steel
  `3` | 50 | suspension, concrete
  `4` | 60 | suspension, steel
  `5` | 70 | suspension, steel
  `6` | 100 | cantilever, steel
  `7` | 130 | cantilever, steel
  `8` | 150 | cantilever, steel
  `9` | 160 | girder, steel
  `A` | 200 | tubular, steel

- map3_hi bit 7 set = on snow or desert

`A`

- map5: tile type:

  `00` | transmitter
  `01` | lighthouse
  `02` | company statue
  `03` | company-owned land
  `80`..`93` | company headquarters (5 sets of 4 tiles each, updated quarterly depending on the company performance)

- map_owner: owner of the object (for lighthouses and transmitters normally `10`)

Classes `B` through `F` are reserved. The presence of a tile in one of the reserved classes will crash OTTD.

Original Copyright © 2003 by Marcin Grzegorczyk for TTDLX.
Transport Tycoon and Transport Tycoon Deluxe are Copyright © by Chris Sawyer. All the other trademarks are the property of their respective owners.