Skip to content
zrowny edited this page May 26, 2021 · 1 revision

Terrain Surface Properties

The first image is the (43x32) preview image of this surface type, with the edges faded.

Then there are 6 images (64x63) that are used for terrain smoothing. These are basically crops of the repeated tile for 6 different slopes:

  • Slope facing left
  • Slope facing front left
  • Flat
  • Slope facing the camera
  • Slopo facing front right
  • Slop facing right

See this image for the portion that is cropped:

4 views of an isometric tile grid with different angles and portions highlighted

Next are the main surface images. They come in what I'm going to call "image sets", where each set is a group of 19 images that show the 19 possible slopes. Each set is one of the visual variations for this surface object.

For each set, the images are in this order:

  • All flat
  • L up
  • F up
  • L and F up
  • R up
  • L and R up (the crease runs from F to B, so the sides are "folded up")
  • R and F up
  • B down
  • B up
  • L and B up
  • F and B up (or L and R down) (same shape as L and R up, rotated 90degs, so the crease runs from L to R)
  • R down
  • B and R up
  • F down
  • L down
  • B up and F down
  • F up and B down (presumably, since this is just blank)
  • L up and R down
  • L down and R up

There are 3 sets as default. First is the normal surface. Next is the surface when gridlines are enabled (basically the edges are darkened), and last is the surface when underground view is enabled. For some surfaces, they use more than these 3 default sets. This is what the special array is for. Each entry gives the game an index for the set to use instead of the default, when certain condition(s) are true.

The checkerboard surface, for example, is not symmetrical, so it repeats all three default sets at a 90deg rotation, and tells the game to use these sets when the view is rotated 90 degrees.

Additionally, there are 3 sizes of surface sprites. A quarter size, a half size, and the full size. For reference, the flat tiles for these sizes are 16x7, 32x15, and 64x31 pixels, respectively. At the moment, the locations of these smaller sizes seems to be hardcoded at the start of g1.dat.

colour : enum (of string)

The color of the surface, if it uses remappable colors in the images. This is only used for the colored grid surface styles. (i.e., there's only one group of images for the 4 colored grid styles, and they use this field to specify what color those images are remapped to)

Must be one of: "black", "grey", "white", "dark_purple", "light_purple", "bright_purple", "dark_blue", "light_blue", "icy_blue", "teal", "aquamarine", "saturated_green", "dark_green", "moss_green", "bright_green", "olive_green", "dark_olive_green", "bright_yellow", "yellow", "dark_yellow", "light_orange", "dark_orange", "light_brown", "saturated_brown", "dark_brown", "salmon_pink", "bordeaux_red", "saturated_red", "bright_red", "dark_pink", "bright_pink", "light_pink",

rotations : integer
Unused field.
price : integer
The cost of building this surface style.
smoothWithSelf : boolean
If true, when Landscape Smoothing is enabled, smooth this surface with connected surfaces of the same style. This only affects surfaces that are connected with different slopes.
smoothWithOther : boolean
If true, when Landscape Smoothing is enabled, smooth this surface with connected surfaces of other styles.
canGrow : boolean
If true, this surface acts as grass, and "grows" over time, and can be mowed by staff. See length down below for more details.
default : object

No surface objects currently use this, but this can be used to specify the index of the default normal, gridded, and underground sets for this surface, if they aren't in positions 0, 1, and 2.

normal : integer
The index of the regular version of this surface. Normally 0
grid : integer
The index of the grid version of this surface. Normally 1
underground : integer
The index of the underground version of this surface. Normally 2
special : array

This is a list of special sets that should be used instead of the default sets, with condition(s) that tell the game when to use a special set instead of the default.

items : object
index : integer
This is the index of this special set, in the list of all surface sets for this surface object.
length : integer
If this is set, this image set will be used when the grass length is at this value. From 0 to 7. The grass length starts at 1. If canGrow is true, it will slowly increase over time, and when it is above 1, staff will mow it (if set to) down to a length of 0.
rotation : integer
If this is set, this image set will be used when the view direction is at this value, from 0 to 3.
variation : integer
This is a value from 0 to 3 that changes for each tile position. Can be used for a pseudo-random choice of image set.
grid : boolean
This is true if this image set should be used when gridlines are enabled.
underground : boolean
This is true if this image set should be used when the underground view is enabled.

rct2.terrain_surface.dirt (Dirt)

"properties": {
    "price": 80,
    "smoothWithSelf": true,
    "smoothWithOther": true
}

rct2.terrain_surface.chequerboard (Checkerboard)

"properties": {
    "price": 100,
    "special": [
        { "rotation": 1, "index": 3 },
        { "rotation": 1, "grid": true, "index": 4 },
        { "rotation": 1, "underground": true, "index": 5 },
        { "rotation": 3, "index": 3 },
        { "rotation": 3, "grid": true, "index": 4 },
        { "rotation": 3, "underground": true, "index": 5 }
    ]
}

rct2.terrain_surface.grass (Grass)

"properties": {
    "price": 300,
    "smoothWithSelf": true,
    "smoothWithOther": true,
    "canGrow": true,
    "special": [
        { "length": 0, "rotation": 0, "index": 5 },
        { "length": 0, "rotation": 2, "index": 5 },
        { "length": 0, "rotation": 0, "grid": true, "index": 6 },
        { "length": 0, "rotation": 2, "grid": true, "index": 6 },
        { "length": 0, "rotation": 1, "index": 3 },
        { "length": 0, "rotation": 3, "index": 3 },
        { "length": 0, "rotation": 1, "grid": true, "index": 4 },
        { "length": 0, "rotation": 3, "grid": true, "index": 4 },

        { "length": 4, "variation": 0, "index": 7 },
        { "length": 4, "variation": 0, "grid": true, "index": 8 },
        { "length": 4, "variation": 1, "index": 9 },
        { "length": 4, "variation": 1, "grid": true, "index": 10 },
        { "length": 4, "variation": 2, "index": 11 },
        { "length": 4, "variation": 2, "grid": true, "index": 12 },
        { "length": 4, "variation": 3, "index": 13 },
        { "length": 4, "variation": 3, "grid": true, "index": 14 },
        { "length": 5, "variation": 0, "index": 7 },
        { "length": 5, "variation": 0, "grid": true, "index": 8 },
        { "length": 5, "variation": 1, "index": 9 },
        { "length": 5, "variation": 1, "grid": true, "index": 10 },
        { "length": 5, "variation": 2, "index": 11 },
        { "length": 5, "variation": 2, "grid": true, "index": 12 },
        { "length": 5, "variation": 3, "index": 13 },
        { "length": 5, "variation": 3, "grid": true, "index": 14 },

        { "length": 6, "variation": 0, "index": 15 },
        { "length": 6, "variation": 0, "grid": true, "index": 16 },
        { "length": 6, "variation": 1, "index": 17 },
        { "length": 6, "variation": 1, "grid": true, "index": 18 },
        { "length": 6, "variation": 2, "index": 19 },
        { "length": 6, "variation": 2, "grid": true, "index": 20 },
        { "length": 6, "variation": 3, "index": 21 },
        { "length": 6, "variation": 3, "grid": true, "index": 22 }
    ]
}