Merge branch 'openttd'

This commit is contained in:
dP
2025-09-01 23:28:07 +05:00
900 changed files with 37553 additions and 26734 deletions

View File

@@ -11,6 +11,7 @@ add_files(
build_industry.h
cargo_const.h
clear_land.h
company_face.h
control_codes.h
elrail_data.h
engines.h

View File

@@ -22,11 +22,6 @@
*/
#define MK(x, y, m) {{x, y}, m}
/**
* Terminator of airport tiles layout definition
*/
#define MKEND {{-0x80, 0}, 0}
/** Tiles for Country Airfield (small) */
static const std::initializer_list<AirportTileTable> _tile_table_country_0 = {
MK(0, 0, APT_SMALL_BUILDING_1),
@@ -41,7 +36,6 @@ static const std::initializer_list<AirportTileTable> _tile_table_country_0 = {
MK(1, 2, APT_RUNWAY_SMALL_MIDDLE),
MK(2, 2, APT_RUNWAY_SMALL_MIDDLE),
MK(3, 2, APT_RUNWAY_SMALL_NEAR_END),
MKEND
};
static const std::initializer_list<AirportTileLayout> _tile_table_country = {
@@ -70,7 +64,6 @@ static const std::initializer_list<AirportTileTable> _tile_table_commuter_0 = {
MK(2, 3, APT_RUNWAY_2),
MK(3, 3, APT_RUNWAY_2),
MK(4, 3, APT_RUNWAY_END_FENCE_SE),
MKEND
};
static const std::initializer_list<AirportTileLayout> _tile_table_commuter = {
@@ -115,14 +108,13 @@ static const std::initializer_list<AirportTileTable> _tile_table_city_0 = {
MK(3, 5, APT_RUNWAY_3),
MK(4, 5, APT_RUNWAY_4),
MK(5, 5, APT_RUNWAY_END_FENCE_SE),
MKEND
};
static const std::initializer_list<AirportTileLayout> _tile_table_city = {
{ _tile_table_city_0, DIR_N },
};
/** Tiles for Metropolitain Airport (large) - 2 runways */
/** Tiles for Metropolitan Airport (large) - 2 runways */
static const std::initializer_list<AirportTileTable> _tile_table_metropolitan_0 = {
MK(0, 0, APT_BUILDING_1),
MK(1, 0, APT_APRON_FENCE_NW),
@@ -160,7 +152,6 @@ static const std::initializer_list<AirportTileTable> _tile_table_metropolitan_0
MK(3, 5, APT_RUNWAY_2),
MK(4, 5, APT_RUNWAY_2),
MK(5, 5, APT_RUNWAY_END_FENCE_SE),
MKEND
};
static const std::initializer_list<AirportTileLayout> _tile_table_metropolitan = {
@@ -218,7 +209,6 @@ static const std::initializer_list<AirportTileTable> _tile_table_international_0
MK(4, 6, APT_RUNWAY_2),
MK(5, 6, APT_RUNWAY_2),
MK(6, 6, APT_RUNWAY_END_FENCE_SE),
MKEND
};
static const std::initializer_list<AirportTileLayout> _tile_table_international = {
@@ -326,7 +316,6 @@ static const std::initializer_list<AirportTileTable> _tile_table_intercontinenta
MK(6, 10, APT_RUNWAY_2),
MK(7, 10, APT_RUNWAY_END_FENCE_SE_SW),
MK(8, 10, APT_EMPTY),
MKEND
};
static const std::initializer_list<AirportTileLayout> _tile_table_intercontinental = {
@@ -336,7 +325,6 @@ static const std::initializer_list<AirportTileLayout> _tile_table_intercontinent
/** Tiles for Heliport */
static const std::initializer_list<AirportTileTable> _tile_table_heliport_0 = {
MK(0, 0, APT_HELIPORT),
MKEND
};
static const std::initializer_list<AirportTileLayout> _tile_table_heliport = {
@@ -349,7 +337,6 @@ static const std::initializer_list<AirportTileTable> _tile_table_helidepot_0 = {
MK(1, 0, APT_DEPOT_SE),
MK(0, 1, APT_HELIPAD_2_FENCE_NE_SE),
MK(1, 1, APT_APRON_FENCE_SE_SW),
MKEND
};
static const std::initializer_list<AirportTileLayout> _tile_table_helidepot = {
@@ -366,7 +353,6 @@ static const std::initializer_list<AirportTileTable> _tile_table_helistation_0 =
MK(1, 1, APT_APRON_FENCE_SE),
MK(2, 1, APT_APRON_FENCE_SE),
MK(3, 1, APT_HELIPAD_3_FENCE_SE_SW),
MKEND
};
static const std::initializer_list<AirportTileLayout> _tile_table_helistation = {
@@ -374,11 +360,10 @@ static const std::initializer_list<AirportTileLayout> _tile_table_helistation =
};
#undef MK
#undef MKEND
/** General AirportSpec definition. */
#define AS_GENERIC(fsm, layouts, depots, size_x, size_y, noise, catchment, min_year, max_year, maint_cost, ttdpatch_type, class_id, name, preview, enabled) \
{{class_id, 0}, fsm, layouts, depots, size_x, size_y, noise, catchment, TimerGameCalendar::Year{min_year}, TimerGameCalendar::Year{max_year}, name, ttdpatch_type, preview, maint_cost, enabled, GRFFileProps(AT_INVALID), {}}
{{class_id, 0}, fsm, layouts, depots, size_x, size_y, noise, catchment, TimerGameCalendar::Year{min_year}, TimerGameCalendar::Year{max_year}, name, ttdpatch_type, preview, maint_cost, enabled, SubstituteGRFFileProps(AT_INVALID), {}}
/** AirportSpec definition for airports without any depot. */
#define AS_ND(ap_name, size_x, size_y, min_year, max_year, catchment, noise, maint_cost, ttdpatch_type, class_id, name, preview) \

View File

@@ -10,10 +10,12 @@
#ifndef AIRPORTTILES_H
#define AIRPORTTILES_H
#include "table/strings.h"
/** Writes all airport tile properties in the AirportTile struct */
#define AT(num_frames, anim_speed) {{num_frames, ANIM_STATUS_LOOPING, anim_speed, 0}, STR_NULL, AirportTileCallbackMasks{}, 0, true, GRFFileProps(INVALID_AIRPORTTILE), {}}
#define AT(num_frames, anim_speed) {{num_frames, AnimationStatus::Looping, anim_speed, {}}, STR_NULL, AirportTileCallbackMasks{}, 0, true, SubstituteGRFFileProps(INVALID_AIRPORTTILE), {}}
/** Writes an airport tile without animation in the AirportTile struct */
#define AT_NOANIM {{0, ANIM_STATUS_NO_ANIMATION, 2, 0}, STR_NULL, AirportTileCallbackMasks{}, 0, true, GRFFileProps(INVALID_AIRPORTTILE), {}}
#define AT_NOANIM {AnimationInfo<AirportAnimationTriggers>{}, STR_NULL, AirportTileCallbackMasks{}, 0, true, SubstituteGRFFileProps(INVALID_AIRPORTTILE), {}}
/**
* All default airport tiles.

View File

@@ -5,6 +5,8 @@
* See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see <http://www.gnu.org/licenses/>.
*/
#include "table/strings.h"
/**
* @file bridge_land.h This file contains all the sprites for bridges
* It consists of a number of arrays.
@@ -34,13 +36,18 @@
# define MW(a) {a, PALETTE_TO_STRUCT_WHITE}
# define MC(a) {a, PALETTE_TO_STRUCT_CONCRETE}
static const PalSpriteID _aqueduct_sprites[] = {
{ SPR_AQUEDUCT_MIDDLE_X, PAL_NONE }, { 0x0, PAL_NONE }, { SPR_AQUEDUCT_PILLAR_X, PAL_NONE }, { 0x0, PAL_NONE },
{ SPR_AQUEDUCT_MIDDLE_Y, PAL_NONE }, { 0x0, PAL_NONE }, { SPR_AQUEDUCT_PILLAR_Y, PAL_NONE }, { 0x0, PAL_NONE },
{ SPR_AQUEDUCT_RAMP_SW, PAL_NONE }, { SPR_AQUEDUCT_RAMP_SE, PAL_NONE }, { SPR_AQUEDUCT_RAMP_NE, PAL_NONE }, { SPR_AQUEDUCT_RAMP_NW, PAL_NONE },
/* Sprite table for middle part of aqueduct. */
static const PalSpriteID _aqueduct_sprite_table_middle[] = {
{SPR_AQUEDUCT_MIDDLE_X, PAL_NONE}, {0x0, PAL_NONE}, {SPR_AQUEDUCT_PILLAR_X, PAL_NONE}, {0x0, PAL_NONE}, // AXIS_X
{SPR_AQUEDUCT_MIDDLE_Y, PAL_NONE}, {0x0, PAL_NONE}, {SPR_AQUEDUCT_PILLAR_Y, PAL_NONE}, {0x0, PAL_NONE}, // AIXS_Y
};
static const PalSpriteID _bridge_sprite_table_4_0[] = {
/* Sprite table for head part of aqueduct. */
static const PalSpriteID _aqueduct_sprite_table_heads[] = {
{SPR_AQUEDUCT_RAMP_SW, PAL_NONE}, {SPR_AQUEDUCT_RAMP_SE, PAL_NONE}, {SPR_AQUEDUCT_RAMP_NE, PAL_NONE}, {SPR_AQUEDUCT_RAMP_NW, PAL_NONE},
};
static const PalSpriteID _bridge_sprite_table_suspension_oxide_north[] = {
{ 0x9A9, PAL_NONE }, { 0x99F, PAL_NONE }, { 0x9B1, PAL_NONE }, { 0x0, PAL_NONE },
{ 0x9A5, PAL_NONE }, { 0x997, PAL_NONE }, { 0x9AD, PAL_NONE }, { 0x0, PAL_NONE },
{ 0x99D, PAL_NONE }, { 0x99F, PAL_NONE }, { 0x9B1, PAL_NONE }, { 0x0, PAL_NONE },
@@ -51,7 +58,7 @@ static const PalSpriteID _bridge_sprite_table_4_0[] = {
{ 0x1116, PAL_NONE }, { 0x997, PAL_NONE }, { 0x9AD, PAL_NONE }, { 0x0, PAL_NONE },
};
static const PalSpriteID _bridge_sprite_table_4_1[] = {
static const PalSpriteID _bridge_sprite_table_suspension_oxide_south[] = {
{ 0x9AA, PAL_NONE }, { 0x9A0, PAL_NONE }, { 0x9B2, PAL_NONE }, { 0x0, PAL_NONE },
{ 0x9A6, PAL_NONE }, { 0x998, PAL_NONE }, { 0x9AE, PAL_NONE }, { 0x0, PAL_NONE },
{ 0x99E, PAL_NONE }, { 0x9A0, PAL_NONE }, { 0x9B2, PAL_NONE }, { 0x0, PAL_NONE },
@@ -62,7 +69,7 @@ static const PalSpriteID _bridge_sprite_table_4_1[] = {
{ 0x1117, PAL_NONE }, { 0x998, PAL_NONE }, { 0x9AE, PAL_NONE }, { 0x0, PAL_NONE },
};
static const PalSpriteID _bridge_sprite_table_4_2[] = {
static const PalSpriteID _bridge_sprite_table_suspension_oxide_inner_north[] = {
{ 0x9AC, PAL_NONE }, { 0x9A4, PAL_NONE }, { 0x9B4, PAL_NONE }, { 0x0, PAL_NONE },
{ 0x9A8, PAL_NONE }, { 0x99C, PAL_NONE }, { 0x9B0, PAL_NONE }, { 0x0, PAL_NONE },
{ 0x9A2, PAL_NONE }, { 0x9A4, PAL_NONE }, { 0x9B4, PAL_NONE }, { 0x0, PAL_NONE },
@@ -73,7 +80,7 @@ static const PalSpriteID _bridge_sprite_table_4_2[] = {
{ 0x1119, PAL_NONE }, { 0x99C, PAL_NONE }, { 0x9B0, PAL_NONE }, { 0x0, PAL_NONE },
};
static const PalSpriteID _bridge_sprite_table_4_3[] = {
static const PalSpriteID _bridge_sprite_table_suspension_oxide_inner_south[] = {
{ 0x9AB, PAL_NONE }, { 0x9A3, PAL_NONE }, { 0x9B3, PAL_NONE }, { 0x0, PAL_NONE },
{ 0x9A7, PAL_NONE }, { 0x99B, PAL_NONE }, { 0x9AF, PAL_NONE }, { 0x0, PAL_NONE },
{ 0x9A1, PAL_NONE }, { 0x9A3, PAL_NONE }, { 0x9B3, PAL_NONE }, { 0x0, PAL_NONE },
@@ -84,7 +91,7 @@ static const PalSpriteID _bridge_sprite_table_4_3[] = {
{ 0x1118, PAL_NONE }, { 0x99B, PAL_NONE }, { 0x9AF, PAL_NONE }, { 0x0, PAL_NONE },
};
static const PalSpriteID _bridge_sprite_table_4_4[] = {
static const PalSpriteID _bridge_sprite_table_suspension_oxide_middle_odd[] = {
{ 0x9B6, PAL_NONE }, { 0x9BA, PAL_NONE }, { 0x9BC, PAL_NONE }, { 0x0, PAL_NONE },
{ 0x9B5, PAL_NONE }, { 0x9B9, PAL_NONE }, { 0x9BB, PAL_NONE }, { 0x0, PAL_NONE },
{ 0x9B8, PAL_NONE }, { 0x9BA, PAL_NONE }, { 0x9BC, PAL_NONE }, { 0x0, PAL_NONE },
@@ -95,7 +102,7 @@ static const PalSpriteID _bridge_sprite_table_4_4[] = {
{ 0x111E, PAL_NONE }, { 0x9B9, PAL_NONE }, { 0x9BB, PAL_NONE }, { 0x0, PAL_NONE },
};
static const PalSpriteID _bridge_sprite_table_4_5[] = {
static const PalSpriteID _bridge_sprite_table_suspension_middle_even[] = {
{ 0x9BD, PAL_NONE }, { 0x9C1, PAL_NONE }, { 0x0, PAL_NONE }, { 0x0, PAL_NONE },
{ 0x9BE, PAL_NONE }, { 0x9C2, PAL_NONE }, { 0x0, PAL_NONE }, { 0x0, PAL_NONE },
{ 0x9BF, PAL_NONE }, { 0x9C1, PAL_NONE }, { 0x0, PAL_NONE }, { 0x0, PAL_NONE },
@@ -106,7 +113,7 @@ static const PalSpriteID _bridge_sprite_table_4_5[] = {
{ 0x1121, PAL_NONE }, { 0x9C2, PAL_NONE }, { 0x0, PAL_NONE }, { 0x0, PAL_NONE },
};
static const PalSpriteID _bridge_sprite_table_4_6[] = {
static const PalSpriteID _bridge_sprite_table_generic_oxide_heads[] = {
{ 0x986, PAL_NONE }, { 0x988, PAL_NONE }, { 0x985, PAL_NONE }, { 0x987, PAL_NONE },
{ 0x98A, PAL_NONE }, { 0x98C, PAL_NONE }, { 0x989, PAL_NONE }, { 0x98B, PAL_NONE },
{ 0x98E, PAL_NONE }, { 0x990, PAL_NONE }, { 0x98D, PAL_NONE }, { 0x98F, PAL_NONE },
@@ -117,7 +124,7 @@ static const PalSpriteID _bridge_sprite_table_4_6[] = {
{ 0x1113, PAL_NONE }, { 0x1115, PAL_NONE }, { 0x1112, PAL_NONE }, { 0x1114, PAL_NONE },
};
static const PalSpriteID _bridge_sprite_table_5_0[] = {
static const PalSpriteID _bridge_sprite_table_suspension_yellow_north[] = {
{ 0x9A9, PALETTE_TO_STRUCT_YELLOW }, { 0x99F, PALETTE_TO_STRUCT_YELLOW }, { 0x9B1, PALETTE_TO_STRUCT_YELLOW }, { 0x0, PAL_NONE },
{ 0x9A5, PALETTE_TO_STRUCT_YELLOW }, { 0x997, PALETTE_TO_STRUCT_YELLOW }, { 0x9AD, PALETTE_TO_STRUCT_YELLOW }, { 0x0, PAL_NONE },
{ 0x99D, PALETTE_TO_STRUCT_YELLOW }, { 0x99F, PALETTE_TO_STRUCT_YELLOW }, { 0x9B1, PALETTE_TO_STRUCT_YELLOW }, { 0x0, PAL_NONE },
@@ -128,7 +135,7 @@ static const PalSpriteID _bridge_sprite_table_5_0[] = {
{ 0x1116, PALETTE_TO_STRUCT_YELLOW }, { 0x997, PALETTE_TO_STRUCT_YELLOW }, { 0x9AD, PALETTE_TO_STRUCT_YELLOW }, { 0x0, PAL_NONE },
};
static const PalSpriteID _bridge_sprite_table_5_1[] = {
static const PalSpriteID _bridge_sprite_table_suspension_yellow_south[] = {
{ 0x9AA, PALETTE_TO_STRUCT_YELLOW }, { 0x9A0, PALETTE_TO_STRUCT_YELLOW }, { 0x9B2, PALETTE_TO_STRUCT_YELLOW }, { 0x0, PAL_NONE },
{ 0x9A6, PALETTE_TO_STRUCT_YELLOW }, { 0x998, PALETTE_TO_STRUCT_YELLOW }, { 0x9AE, PALETTE_TO_STRUCT_YELLOW }, { 0x0, PAL_NONE },
{ 0x99E, PALETTE_TO_STRUCT_YELLOW }, { 0x9A0, PALETTE_TO_STRUCT_YELLOW }, { 0x9B2, PALETTE_TO_STRUCT_YELLOW }, { 0x0, PAL_NONE },
@@ -139,7 +146,7 @@ static const PalSpriteID _bridge_sprite_table_5_1[] = {
{ 0x1117, PALETTE_TO_STRUCT_YELLOW }, { 0x998, PALETTE_TO_STRUCT_YELLOW }, { 0x9AE, PALETTE_TO_STRUCT_YELLOW }, { 0x0, PAL_NONE },
};
static const PalSpriteID _bridge_sprite_table_5_2[] = {
static const PalSpriteID _bridge_sprite_table_suspension_yellow_inner_north[] = {
{ 0x9AC, PALETTE_TO_STRUCT_YELLOW }, { 0x9A4, PALETTE_TO_STRUCT_YELLOW }, { 0x9B4, PALETTE_TO_STRUCT_YELLOW }, { 0x0, PAL_NONE },
{ 0x9A8, PALETTE_TO_STRUCT_YELLOW }, { 0x99C, PALETTE_TO_STRUCT_YELLOW }, { 0x9B0, PALETTE_TO_STRUCT_YELLOW }, { 0x0, PAL_NONE },
{ 0x9A2, PALETTE_TO_STRUCT_YELLOW }, { 0x9A4, PALETTE_TO_STRUCT_YELLOW }, { 0x9B4, PALETTE_TO_STRUCT_YELLOW }, { 0x0, PAL_NONE },
@@ -150,7 +157,7 @@ static const PalSpriteID _bridge_sprite_table_5_2[] = {
{ 0x1119, PALETTE_TO_STRUCT_YELLOW }, { 0x99C, PALETTE_TO_STRUCT_YELLOW }, { 0x9B0, PALETTE_TO_STRUCT_YELLOW }, { 0x0, PAL_NONE },
};
static const PalSpriteID _bridge_sprite_table_5_3[] = {
static const PalSpriteID _bridge_sprite_table_suspension_yellow_inner_south[] = {
{ 0x9AB, PALETTE_TO_STRUCT_YELLOW }, { 0x9A3, PALETTE_TO_STRUCT_YELLOW }, { 0x9B3, PALETTE_TO_STRUCT_YELLOW }, { 0x0, PAL_NONE },
{ 0x9A7, PALETTE_TO_STRUCT_YELLOW }, { 0x99B, PALETTE_TO_STRUCT_YELLOW }, { 0x9AF, PALETTE_TO_STRUCT_YELLOW }, { 0x0, PAL_NONE },
{ 0x9A1, PALETTE_TO_STRUCT_YELLOW }, { 0x9A3, PALETTE_TO_STRUCT_YELLOW }, { 0x9B3, PALETTE_TO_STRUCT_YELLOW }, { 0x0, PAL_NONE },
@@ -161,7 +168,7 @@ static const PalSpriteID _bridge_sprite_table_5_3[] = {
{ 0x1118, PALETTE_TO_STRUCT_YELLOW }, { 0x99B, PALETTE_TO_STRUCT_YELLOW }, { 0x9AF, PALETTE_TO_STRUCT_YELLOW }, { 0x0, PAL_NONE },
};
static const PalSpriteID _bridge_sprite_table_5_4[] = {
static const PalSpriteID _bridge_sprite_table_suspension_yellow_middle_odd[] = {
{ 0x9B6, PALETTE_TO_STRUCT_YELLOW }, { 0x9BA, PALETTE_TO_STRUCT_YELLOW }, { 0x9BC, PALETTE_TO_STRUCT_YELLOW }, { 0x0, PAL_NONE },
{ 0x9B5, PALETTE_TO_STRUCT_YELLOW }, { 0x9B9, PALETTE_TO_STRUCT_YELLOW }, { 0x9BB, PALETTE_TO_STRUCT_YELLOW }, { 0x0, PAL_NONE },
{ 0x9B8, PALETTE_TO_STRUCT_YELLOW }, { 0x9BA, PALETTE_TO_STRUCT_YELLOW }, { 0x9BC, PALETTE_TO_STRUCT_YELLOW }, { 0x0, PAL_NONE },
@@ -172,7 +179,7 @@ static const PalSpriteID _bridge_sprite_table_5_4[] = {
{ 0x111E, PALETTE_TO_STRUCT_YELLOW }, { 0x9B9, PALETTE_TO_STRUCT_YELLOW }, { 0x9BB, PALETTE_TO_STRUCT_YELLOW }, { 0x0, PAL_NONE },
};
static const PalSpriteID _bridge_sprite_table_5_5[] = {
static const PalSpriteID _bridge_sprite_table_suspension_yellow_middle_even[] = {
{ 0x9BD, PALETTE_TO_STRUCT_YELLOW }, { 0x9C1, PALETTE_TO_STRUCT_YELLOW }, { 0x0, PAL_NONE }, { 0x0, PAL_NONE },
{ 0x9BE, PALETTE_TO_STRUCT_YELLOW }, { 0x9C2, PALETTE_TO_STRUCT_YELLOW }, { 0x0, PAL_NONE }, { 0x0, PAL_NONE },
{ 0x9BF, PALETTE_TO_STRUCT_YELLOW }, { 0x9C1, PALETTE_TO_STRUCT_YELLOW }, { 0x0, PAL_NONE }, { 0x0, PAL_NONE },
@@ -183,7 +190,7 @@ static const PalSpriteID _bridge_sprite_table_5_5[] = {
{ 0x1121, PALETTE_TO_STRUCT_YELLOW }, { 0x9C2, PALETTE_TO_STRUCT_YELLOW }, { 0x0, PAL_NONE }, { 0x0, PAL_NONE },
};
static const PalSpriteID _bridge_sprite_table_5_6[] = {
static const PalSpriteID _bridge_sprite_table_generic_yellow_heads[] = {
{ 0x986, PAL_NONE }, { 0x988, PAL_NONE }, { 0x985, PAL_NONE }, { 0x987, PAL_NONE },
{ 0x98A, PAL_NONE }, { 0x98C, PAL_NONE }, { 0x989, PAL_NONE }, { 0x98B, PAL_NONE },
{ 0x98E, PALETTE_TO_STRUCT_YELLOW }, { 0x990, PALETTE_TO_STRUCT_YELLOW }, { 0x98D, PALETTE_TO_STRUCT_YELLOW }, { 0x98F, PALETTE_TO_STRUCT_YELLOW },
@@ -194,7 +201,7 @@ static const PalSpriteID _bridge_sprite_table_5_6[] = {
{ 0x1113, PALETTE_TO_STRUCT_YELLOW }, { 0x1115, PALETTE_TO_STRUCT_YELLOW }, { 0x1112, PALETTE_TO_STRUCT_YELLOW }, { 0x1114, PALETTE_TO_STRUCT_YELLOW },
};
static const PalSpriteID _bridge_sprite_table_6_0[] = {
static const PalSpriteID _bridge_sprite_table_cantilever_oxide_north[] = {
{ 0x9CD, PAL_NONE }, { 0x9D9, PAL_NONE }, { 0x0, PAL_NONE }, { 0x0, PAL_NONE },
{ 0x9CE, PAL_NONE }, { 0x9DA, PAL_NONE }, { 0x0, PAL_NONE }, { 0x0, PAL_NONE },
{ 0x9D3, PAL_NONE }, { 0x9D9, PAL_NONE }, { 0x0, PAL_NONE }, { 0x0, PAL_NONE },
@@ -205,7 +212,7 @@ static const PalSpriteID _bridge_sprite_table_6_0[] = {
{ 0x1125, PAL_NONE }, { 0x9DA, PAL_NONE }, { 0x0, PAL_NONE }, { 0x0, PAL_NONE },
};
static const PalSpriteID _bridge_sprite_table_6_1[] = {
static const PalSpriteID _bridge_sprite_table_cantilever_oxide_south[] = {
{ 0x9CB, PAL_NONE }, { 0x9D7, PAL_NONE }, { 0x9DD, PAL_NONE }, { 0x0, PAL_NONE },
{ 0x9D0, PAL_NONE }, { 0x9DC, PAL_NONE }, { 0x9E0, PAL_NONE }, { 0x0, PAL_NONE },
{ 0x9D1, PAL_NONE }, { 0x9D7, PAL_NONE }, { 0x9DD, PAL_NONE }, { 0x0, PAL_NONE },
@@ -216,7 +223,7 @@ static const PalSpriteID _bridge_sprite_table_6_1[] = {
{ 0x1127, PAL_NONE }, { 0x9DC, PAL_NONE }, { 0x9E0, PAL_NONE }, { 0x0, PAL_NONE },
};
static const PalSpriteID _bridge_sprite_table_6_2[] = {
static const PalSpriteID _bridge_sprite_table_cantilever_oxide_middle[] = {
{ 0x9CC, PAL_NONE }, { 0x9D8, PAL_NONE }, { 0x9DE, PAL_NONE }, { 0x0, PAL_NONE },
{ 0x9CF, PAL_NONE }, { 0x9DB, PAL_NONE }, { 0x9DF, PAL_NONE }, { 0x0, PAL_NONE },
{ 0x9D2, PAL_NONE }, { 0x9D8, PAL_NONE }, { 0x9DE, PAL_NONE }, { 0x0, PAL_NONE },
@@ -227,7 +234,7 @@ static const PalSpriteID _bridge_sprite_table_6_2[] = {
{ 0x1126, PAL_NONE }, { 0x9DB, PAL_NONE }, { 0x9DF, PAL_NONE }, { 0x0, PAL_NONE },
};
static const PalSpriteID _bridge_sprite_table_6_3[] = {
static const PalSpriteID _bridge_sprite_table_cantilever_oxide_heads[] = {
{ 0x986, PAL_NONE }, { 0x988, PAL_NONE }, { 0x985, PAL_NONE }, { 0x987, PAL_NONE },
{ 0x98A, PAL_NONE }, { 0x98C, PAL_NONE }, { 0x989, PAL_NONE }, { 0x98B, PAL_NONE },
{ 0x98E, PAL_NONE }, { 0x990, PAL_NONE }, { 0x98D, PAL_NONE }, { 0x98F, PAL_NONE },
@@ -238,7 +245,7 @@ static const PalSpriteID _bridge_sprite_table_6_3[] = {
{ 0x1113, PAL_NONE }, { 0x1115, PAL_NONE }, { 0x1112, PAL_NONE }, { 0x1114, PAL_NONE },
};
static const PalSpriteID _bridge_sprite_table_7_0[] = {
static const PalSpriteID _bridge_sprite_table_cantilever_brown_north[] = {
{ 0x9CD, PALETTE_TO_STRUCT_BROWN }, { 0x9D9, PALETTE_TO_STRUCT_BROWN }, { 0x0, PAL_NONE }, { 0x0, PAL_NONE },
{ 0x9CE, PALETTE_TO_STRUCT_BROWN }, { 0x9DA, PALETTE_TO_STRUCT_BROWN }, { 0x0, PAL_NONE }, { 0x0, PAL_NONE },
{ 0x9D3, PALETTE_TO_STRUCT_BROWN }, { 0x9D9, PALETTE_TO_STRUCT_BROWN }, { 0x0, PAL_NONE }, { 0x0, PAL_NONE },
@@ -249,7 +256,7 @@ static const PalSpriteID _bridge_sprite_table_7_0[] = {
{ 0x1125, PALETTE_TO_STRUCT_BROWN }, { 0x9DA, PALETTE_TO_STRUCT_BROWN }, { 0x0, PAL_NONE }, { 0x0, PAL_NONE },
};
static const PalSpriteID _bridge_sprite_table_7_1[] = {
static const PalSpriteID _bridge_sprite_table_cantilever_brown_south[] = {
{ 0x9CB, PALETTE_TO_STRUCT_BROWN }, { 0x9D7, PALETTE_TO_STRUCT_BROWN }, { 0x9DD, PALETTE_TO_STRUCT_BROWN }, { 0x0, PAL_NONE },
{ 0x9D0, PALETTE_TO_STRUCT_BROWN }, { 0x9DC, PALETTE_TO_STRUCT_BROWN }, { 0x9E0, PALETTE_TO_STRUCT_BROWN }, { 0x0, PAL_NONE },
{ 0x9D1, PALETTE_TO_STRUCT_BROWN }, { 0x9D7, PALETTE_TO_STRUCT_BROWN }, { 0x9DD, PALETTE_TO_STRUCT_BROWN }, { 0x0, PAL_NONE },
@@ -260,7 +267,7 @@ static const PalSpriteID _bridge_sprite_table_7_1[] = {
{ 0x1127, PALETTE_TO_STRUCT_BROWN }, { 0x9DC, PALETTE_TO_STRUCT_BROWN }, { 0x9E0, PALETTE_TO_STRUCT_BROWN }, { 0x0, PAL_NONE },
};
static const PalSpriteID _bridge_sprite_table_7_2[] = {
static const PalSpriteID _bridge_sprite_table_cantilever_brown_middle[] = {
{ 0x9CC, PALETTE_TO_STRUCT_BROWN }, { 0x9D8, PALETTE_TO_STRUCT_BROWN }, { 0x9DE, PALETTE_TO_STRUCT_BROWN }, { 0x0, PAL_NONE },
{ 0x9CF, PALETTE_TO_STRUCT_BROWN }, { 0x9DB, PALETTE_TO_STRUCT_BROWN }, { 0x9DF, PALETTE_TO_STRUCT_BROWN }, { 0x0, PAL_NONE },
{ 0x9D2, PALETTE_TO_STRUCT_BROWN }, { 0x9D8, PALETTE_TO_STRUCT_BROWN }, { 0x9DE, PALETTE_TO_STRUCT_BROWN }, { 0x0, PAL_NONE },
@@ -271,7 +278,7 @@ static const PalSpriteID _bridge_sprite_table_7_2[] = {
{ 0x1126, PALETTE_TO_STRUCT_BROWN }, { 0x9DB, PALETTE_TO_STRUCT_BROWN }, { 0x9DF, PALETTE_TO_STRUCT_BROWN }, { 0x0, PAL_NONE },
};
static const PalSpriteID _bridge_sprite_table_7_3[] = {
static const PalSpriteID _bridge_sprite_table_cantilever_brown_heads[] = {
{ 0x986, PAL_NONE }, { 0x988, PAL_NONE }, { 0x985, PAL_NONE }, { 0x987, PAL_NONE },
{ 0x98A, PAL_NONE }, { 0x98C, PAL_NONE }, { 0x989, PAL_NONE }, { 0x98B, PAL_NONE },
{ 0x98E, PALETTE_TO_STRUCT_BROWN }, { 0x990, PALETTE_TO_STRUCT_BROWN }, { 0x98D, PALETTE_TO_STRUCT_BROWN }, { 0x98F, PALETTE_TO_STRUCT_BROWN },
@@ -282,7 +289,7 @@ static const PalSpriteID _bridge_sprite_table_7_3[] = {
{ 0x1113, PALETTE_TO_STRUCT_BROWN }, { 0x1115, PALETTE_TO_STRUCT_BROWN }, { 0x1112, PALETTE_TO_STRUCT_BROWN }, { 0x1114, PALETTE_TO_STRUCT_BROWN },
};
static const PalSpriteID _bridge_sprite_table_8_0[] = {
static const PalSpriteID _bridge_sprite_table_cantilever_red_north[] = {
{ 0x9CD, PALETTE_TO_STRUCT_RED }, { 0x9D9, PALETTE_TO_STRUCT_RED }, { 0x0, PAL_NONE }, { 0x0, PAL_NONE },
{ 0x9CE, PALETTE_TO_STRUCT_RED }, { 0x9DA, PALETTE_TO_STRUCT_RED }, { 0x0, PAL_NONE }, { 0x0, PAL_NONE },
{ 0x9D3, PALETTE_TO_STRUCT_RED }, { 0x9D9, PALETTE_TO_STRUCT_RED }, { 0x0, PAL_NONE }, { 0x0, PAL_NONE },
@@ -293,7 +300,7 @@ static const PalSpriteID _bridge_sprite_table_8_0[] = {
{ 0x1125, PALETTE_TO_STRUCT_RED }, { 0x9DA, PALETTE_TO_STRUCT_RED }, { 0x0, PAL_NONE }, { 0x0, PAL_NONE },
};
static const PalSpriteID _bridge_sprite_table_8_1[] = {
static const PalSpriteID _bridge_sprite_table_cantilever_red_south[] = {
{ 0x9CB, PALETTE_TO_STRUCT_RED }, { 0x9D7, PALETTE_TO_STRUCT_RED }, { 0x9DD, PALETTE_TO_STRUCT_RED }, { 0x0, PAL_NONE },
{ 0x9D0, PALETTE_TO_STRUCT_RED }, { 0x9DC, PALETTE_TO_STRUCT_RED }, { 0x9E0, PALETTE_TO_STRUCT_RED }, { 0x0, PAL_NONE },
{ 0x9D1, PALETTE_TO_STRUCT_RED }, { 0x9D7, PALETTE_TO_STRUCT_RED }, { 0x9DD, PALETTE_TO_STRUCT_RED }, { 0x0, PAL_NONE },
@@ -304,7 +311,7 @@ static const PalSpriteID _bridge_sprite_table_8_1[] = {
{ 0x1127, PALETTE_TO_STRUCT_RED }, { 0x9DC, PALETTE_TO_STRUCT_RED }, { 0x9E0, PALETTE_TO_STRUCT_RED }, { 0x0, PAL_NONE },
};
static const PalSpriteID _bridge_sprite_table_8_2[] = {
static const PalSpriteID _bridge_sprite_table_cantilever_red_middle[] = {
{ 0x9CC, PALETTE_TO_STRUCT_RED }, { 0x9D8, PALETTE_TO_STRUCT_RED }, { 0x9DE, PALETTE_TO_STRUCT_RED }, { 0x0, PAL_NONE },
{ 0x9CF, PALETTE_TO_STRUCT_RED }, { 0x9DB, PALETTE_TO_STRUCT_RED }, { 0x9DF, PALETTE_TO_STRUCT_RED }, { 0x0, PAL_NONE },
{ 0x9D2, PALETTE_TO_STRUCT_RED }, { 0x9D8, PALETTE_TO_STRUCT_RED }, { 0x9DE, PALETTE_TO_STRUCT_RED }, { 0x0, PAL_NONE },
@@ -315,7 +322,7 @@ static const PalSpriteID _bridge_sprite_table_8_2[] = {
{ 0x1126, PALETTE_TO_STRUCT_RED }, { 0x9DB, PALETTE_TO_STRUCT_RED }, { 0x9DF, PALETTE_TO_STRUCT_RED }, { 0x0, PAL_NONE },
};
static const PalSpriteID _bridge_sprite_table_8_3[] = {
static const PalSpriteID _bridge_sprite_table_cantilever_red_heads[] = {
{ 0x986, PAL_NONE }, { 0x988, PAL_NONE }, { 0x985, PAL_NONE }, { 0x987, PAL_NONE },
{ 0x98A, PAL_NONE }, { 0x98C, PAL_NONE }, { 0x989, PAL_NONE }, { 0x98B, PAL_NONE },
{ 0x98E, PALETTE_TO_STRUCT_RED }, { 0x990, PALETTE_TO_STRUCT_RED }, { 0x98D, PALETTE_TO_STRUCT_RED }, { 0x98F, PALETTE_TO_STRUCT_RED },
@@ -392,7 +399,7 @@ static const PalSpriteID _bridge_sprite_table_archgirder_heads[] = {
MW( SPR_BTGEN_MGLV_RAMP_X_DOWN ), MW( SPR_BTGEN_MGLV_RAMP_Y_DOWN ), MW( SPR_BTGEN_MGLV_RAMP_X_UP ), MW( SPR_BTGEN_MGLV_RAMP_Y_UP ),
};
static const PalSpriteID _bridge_sprite_table_concrete_suspended_A[] = {
static const PalSpriteID _bridge_sprite_table_suspension_concrete_north[] = {
MC( SPR_BTSUS_RAIL_X_REAR_TILE_A ), MC( SPR_BTSUS_X_FRONT_TILE_A ), MC( SPR_BTSUS_X_PILLAR_TILE_A ), MN( 0x0 ),
MC( SPR_BTSUS_RAIL_Y_REAR_TILE_A ), MC( SPR_BTSUS_Y_FRONT_TILE_A ), MC( SPR_BTSUS_Y_PILLAR_TILE_A ), MN( 0x0 ),
MC( SPR_BTSUS_ROAD_X_REAR_TILE_A ), MC( SPR_BTSUS_X_FRONT_TILE_A ), MC( SPR_BTSUS_X_PILLAR_TILE_A ), MN( 0x0 ),
@@ -403,7 +410,7 @@ static const PalSpriteID _bridge_sprite_table_concrete_suspended_A[] = {
MC( SPR_BTSUS_MGLV_Y_REAR_TILE_A ), MC( SPR_BTSUS_Y_FRONT_TILE_A ), MC( SPR_BTSUS_Y_PILLAR_TILE_A ), MN( 0x0 ),
};
static const PalSpriteID _bridge_sprite_table_concrete_suspended_B[] = {
static const PalSpriteID _bridge_sprite_table_suspension_concrete_south[] = {
MC( SPR_BTSUS_RAIL_X_REAR_TILE_B ), MC( SPR_BTSUS_X_FRONT_TILE_B ), MC( SPR_BTSUS_X_PILLAR_TILE_B ), MN( 0x0 ),
MC( SPR_BTSUS_RAIL_Y_REAR_TILE_B ), MC( SPR_BTSUS_Y_FRONT_TILE_B ), MC( SPR_BTSUS_Y_PILLAR_TILE_B ), MN( 0x0 ),
MC( SPR_BTSUS_ROAD_X_REAR_TILE_B ), MC( SPR_BTSUS_X_FRONT_TILE_B ), MC( SPR_BTSUS_X_PILLAR_TILE_B ), MN( 0x0 ),
@@ -414,7 +421,7 @@ static const PalSpriteID _bridge_sprite_table_concrete_suspended_B[] = {
MC( SPR_BTSUS_MGLV_Y_REAR_TILE_B ), MC( SPR_BTSUS_Y_FRONT_TILE_B ), MC( SPR_BTSUS_Y_PILLAR_TILE_B ), MN( 0x0 ),
};
static const PalSpriteID _bridge_sprite_table_concrete_suspended_C[] = {
static const PalSpriteID _bridge_sprite_table_suspension_concrete_inner_north[] = {
MC( SPR_BTSUS_RAIL_X_REAR_TILE_C ), MC( SPR_BTSUS_X_FRONT_TILE_C ), MC( SPR_BTSUS_X_PILLAR_TILE_C ), MN( 0x0 ),
MC( SPR_BTSUS_RAIL_Y_REAR_TILE_C ), MC( SPR_BTSUS_Y_FRONT_TILE_C ), MC( SPR_BTSUS_Y_PILLAR_TILE_C ), MN( 0x0 ),
MC( SPR_BTSUS_ROAD_X_REAR_TILE_C ), MC( SPR_BTSUS_X_FRONT_TILE_C ), MC( SPR_BTSUS_X_PILLAR_TILE_C ), MN( 0x0 ),
@@ -425,7 +432,7 @@ static const PalSpriteID _bridge_sprite_table_concrete_suspended_C[] = {
MC( SPR_BTSUS_MGLV_Y_REAR_TILE_C ), MC( SPR_BTSUS_Y_FRONT_TILE_C ), MC( SPR_BTSUS_Y_PILLAR_TILE_C ), MN( 0x0 ),
};
static const PalSpriteID _bridge_sprite_table_concrete_suspended_D[] = {
static const PalSpriteID _bridge_sprite_table_suspension_concrete_inner_south[] = {
MC( SPR_BTSUS_RAIL_X_REAR_TILE_D ), MC( SPR_BTSUS_X_FRONT_TILE_D ), MC( SPR_BTSUS_X_PILLAR_TILE_D ), MN( 0x0 ),
MC( SPR_BTSUS_RAIL_Y_REAR_TILE_D ), MC( SPR_BTSUS_Y_FRONT_TILE_D ), MC( SPR_BTSUS_Y_PILLAR_TILE_D ), MN( 0x0 ),
MC( SPR_BTSUS_ROAD_X_REAR_TILE_D ), MC( SPR_BTSUS_X_FRONT_TILE_D ), MC( SPR_BTSUS_X_PILLAR_TILE_D ), MN( 0x0 ),
@@ -436,7 +443,7 @@ static const PalSpriteID _bridge_sprite_table_concrete_suspended_D[] = {
MC( SPR_BTSUS_MGLV_Y_REAR_TILE_D ), MC( SPR_BTSUS_Y_FRONT_TILE_D ), MC( SPR_BTSUS_Y_PILLAR_TILE_D ), MN( 0x0 ),
};
static const PalSpriteID _bridge_sprite_table_concrete_suspended_E[] = {
static const PalSpriteID _bridge_sprite_table_suspension_concrete_middle_odd[] = {
MC( SPR_BTSUS_RAIL_X_REAR_TILE_E ), MC( SPR_BTSUS_X_FRONT_TILE_E ), MC( SPR_BTSUS_X_PILLAR_TILE_E ), MN( 0x0 ),
MC( SPR_BTSUS_RAIL_Y_REAR_TILE_E ), MC( SPR_BTSUS_Y_FRONT_TILE_E ), MC( SPR_BTSUS_Y_PILLAR_TILE_E ), MN( 0x0 ),
MC( SPR_BTSUS_ROAD_X_REAR_TILE_E ), MC( SPR_BTSUS_X_FRONT_TILE_E ), MC( SPR_BTSUS_X_PILLAR_TILE_E ), MN( 0x0 ),
@@ -447,7 +454,7 @@ static const PalSpriteID _bridge_sprite_table_concrete_suspended_E[] = {
MC( SPR_BTSUS_MGLV_Y_REAR_TILE_E ), MC( SPR_BTSUS_Y_FRONT_TILE_E ), MC( SPR_BTSUS_Y_PILLAR_TILE_E ), MN( 0x0 ),
};
static const PalSpriteID _bridge_sprite_table_concrete_suspended_F[] = {
static const PalSpriteID _bridge_sprite_table_suspension_concrete_middle_even[] = {
MC( SPR_BTSUS_RAIL_X_REAR_TILE_F ), MC( SPR_BTSUS_X_FRONT ), MN( 0x0 ), MN( 0x0 ),
MC( SPR_BTSUS_RAIL_Y_REAR_TILE_F ), MC( SPR_BTSUS_Y_FRONT ), MN( 0x0 ), MN( 0x0 ),
MC( SPR_BTSUS_ROAD_X_REAR_TILE_F ), MC( SPR_BTSUS_X_FRONT ), MN( 0x0 ), MN( 0x0 ),
@@ -458,7 +465,7 @@ static const PalSpriteID _bridge_sprite_table_concrete_suspended_F[] = {
MC( SPR_BTSUS_MGLV_Y_REAR_TILE_F ), MC( SPR_BTSUS_Y_FRONT ), MN( 0x0 ), MN( 0x0 ),
};
static const PalSpriteID _bridge_sprite_table_concrete_suspended_heads[] = {
static const PalSpriteID _bridge_sprite_table_generic_concrete_heads[] = {
MN( SPR_BTGEN_RAIL_X_SLOPE_UP ), MN( SPR_BTGEN_RAIL_Y_SLOPE_UP ), MN( SPR_BTGEN_RAIL_X_SLOPE_DOWN ), MN( SPR_BTGEN_RAIL_Y_SLOPE_DOWN ),
MN( SPR_BTGEN_RAIL_RAMP_X_DOWN ), MN( SPR_BTGEN_RAIL_RAMP_Y_DOWN ), MN( SPR_BTGEN_RAIL_RAMP_X_UP ), MN( SPR_BTGEN_RAIL_RAMP_Y_UP ),
MC( SPR_BTGEN_ROAD_X_SLOPE_UP ), MC( SPR_BTGEN_ROAD_Y_SLOPE_UP ), MC( SPR_BTGEN_ROAD_X_SLOPE_DOWN ), MC( SPR_BTGEN_ROAD_Y_SLOPE_DOWN ),
@@ -469,7 +476,7 @@ static const PalSpriteID _bridge_sprite_table_concrete_suspended_heads[] = {
MC( SPR_BTGEN_MGLV_RAMP_X_DOWN ), MC( SPR_BTGEN_MGLV_RAMP_Y_DOWN ), MC( SPR_BTGEN_MGLV_RAMP_X_UP ), MC( SPR_BTGEN_MGLV_RAMP_Y_UP ),
};
static const PalSpriteID _bridge_sprite_table_9_0[] = {
static const PalSpriteID _bridge_sprite_table_girder_middle[] = {
{ 0x9F9, PAL_NONE }, { 0x9FD, PAL_NONE }, { 0x9C9, PAL_NONE }, { 0x0, PAL_NONE },
{ 0x9FA, PAL_NONE }, { 0x9FE, PAL_NONE }, { 0x9CA, PAL_NONE }, { 0x0, PAL_NONE },
{ 0x9FB, PAL_NONE }, { 0x9FD, PAL_NONE }, { 0x9C9, PAL_NONE }, { 0x0, PAL_NONE },
@@ -480,7 +487,7 @@ static const PalSpriteID _bridge_sprite_table_9_0[] = {
{ 0x1133, PAL_NONE }, { 0x9FE, PAL_NONE }, { 0x9CA, PAL_NONE }, { 0x0, PAL_NONE },
};
static const PalSpriteID _bridge_sprite_table_10_0[] = {
static const PalSpriteID _bridge_sprite_table_tubular_oxide_north[] = {
{ 0xA0B, PAL_NONE }, { 0xA01, PAL_NONE }, { 0x0, PAL_NONE }, { 0x0, PAL_NONE },
{ 0xA0C, PAL_NONE }, { 0xA02, PAL_NONE }, { 0x0, PAL_NONE }, { 0x0, PAL_NONE },
{ 0xA11, PAL_NONE }, { 0xA01, PAL_NONE }, { 0x0, PAL_NONE }, { 0x0, PAL_NONE },
@@ -491,7 +498,7 @@ static const PalSpriteID _bridge_sprite_table_10_0[] = {
{ 0xA1E, PAL_NONE }, { 0xA02, PAL_NONE }, { 0x0, PAL_NONE }, { 0x0, PAL_NONE },
};
static const PalSpriteID _bridge_sprite_table_10_1[] = {
static const PalSpriteID _bridge_sprite_table_tubular_oxide_south[] = {
{ 0xA09, PAL_NONE }, { 0x9FF, PAL_NONE }, { 0xA05, PAL_NONE }, { 0x0, PAL_NONE },
{ 0xA0E, PAL_NONE }, { 0xA04, PAL_NONE }, { 0xA08, PAL_NONE }, { 0x0, PAL_NONE },
{ 0xA0F, PAL_NONE }, { 0x9FF, PAL_NONE }, { 0xA05, PAL_NONE }, { 0x0, PAL_NONE },
@@ -502,7 +509,7 @@ static const PalSpriteID _bridge_sprite_table_10_1[] = {
{ 0xA20, PAL_NONE }, { 0xA04, PAL_NONE }, { 0xA08, PAL_NONE }, { 0x0, PAL_NONE },
};
static const PalSpriteID _bridge_sprite_table_10_2[] = {
static const PalSpriteID _bridge_sprite_table_tubular_oxide_middle[] = {
{ 0xA0A, PAL_NONE }, { 0xA00, PAL_NONE }, { 0xA06, PAL_NONE }, { 0x0, PAL_NONE },
{ 0xA0D, PAL_NONE }, { 0xA03, PAL_NONE }, { 0xA07, PAL_NONE }, { 0x0, PAL_NONE },
{ 0xA10, PAL_NONE }, { 0xA00, PAL_NONE }, { 0xA06, PAL_NONE }, { 0x0, PAL_NONE },
@@ -513,7 +520,7 @@ static const PalSpriteID _bridge_sprite_table_10_2[] = {
{ 0xA1F, PAL_NONE }, { 0xA03, PAL_NONE }, { 0xA07, PAL_NONE }, { 0x0, PAL_NONE },
};
static const PalSpriteID _bridge_sprite_table_11_0[] = {
static const PalSpriteID _bridge_sprite_table_tubular_yellow_north[] = {
{ 0xA0B, PALETTE_TO_STRUCT_YELLOW }, { 0xA01, PALETTE_TO_STRUCT_YELLOW }, { 0x0, PAL_NONE }, { 0x0, PAL_NONE },
{ 0xA0C, PALETTE_TO_STRUCT_YELLOW }, { 0xA02, PALETTE_TO_STRUCT_YELLOW }, { 0x0, PAL_NONE }, { 0x0, PAL_NONE },
{ 0xA11, PALETTE_TO_STRUCT_YELLOW }, { 0xA01, PALETTE_TO_STRUCT_YELLOW }, { 0x0, PAL_NONE }, { 0x0, PAL_NONE },
@@ -524,7 +531,7 @@ static const PalSpriteID _bridge_sprite_table_11_0[] = {
{ 0xA1E, PALETTE_TO_STRUCT_YELLOW }, { 0xA02, PALETTE_TO_STRUCT_YELLOW }, { 0x0, PAL_NONE }, { 0x0, PAL_NONE },
};
static const PalSpriteID _bridge_sprite_table_11_1[] = {
static const PalSpriteID _bridge_sprite_table_tubular_yellow_south[] = {
{ 0xA09, PALETTE_TO_STRUCT_YELLOW }, { 0x9FF, PALETTE_TO_STRUCT_YELLOW }, { 0xA05, PALETTE_TO_STRUCT_YELLOW }, { 0x0, PAL_NONE },
{ 0xA0E, PALETTE_TO_STRUCT_YELLOW }, { 0xA04, PALETTE_TO_STRUCT_YELLOW }, { 0xA08, PALETTE_TO_STRUCT_YELLOW }, { 0x0, PAL_NONE },
{ 0xA0F, PALETTE_TO_STRUCT_YELLOW }, { 0x9FF, PALETTE_TO_STRUCT_YELLOW }, { 0xA05, PALETTE_TO_STRUCT_YELLOW }, { 0x0, PAL_NONE },
@@ -535,7 +542,7 @@ static const PalSpriteID _bridge_sprite_table_11_1[] = {
{ 0xA20, PALETTE_TO_STRUCT_YELLOW }, { 0xA04, PALETTE_TO_STRUCT_YELLOW }, { 0xA08, PALETTE_TO_STRUCT_YELLOW }, { 0x0, PAL_NONE },
};
static const PalSpriteID _bridge_sprite_table_11_2[] = {
static const PalSpriteID _bridge_sprite_table_tubular_yellow_middle[] = {
{ 0xA0A, PALETTE_TO_STRUCT_YELLOW }, { 0xA00, PALETTE_TO_STRUCT_YELLOW }, { 0xA06, PALETTE_TO_STRUCT_YELLOW }, { 0x0, PAL_NONE },
{ 0xA0D, PALETTE_TO_STRUCT_YELLOW }, { 0xA03, PALETTE_TO_STRUCT_YELLOW }, { 0xA07, PALETTE_TO_STRUCT_YELLOW }, { 0x0, PAL_NONE },
{ 0xA10, PALETTE_TO_STRUCT_YELLOW }, { 0xA00, PALETTE_TO_STRUCT_YELLOW }, { 0xA06, PALETTE_TO_STRUCT_YELLOW }, { 0x0, PAL_NONE },
@@ -546,7 +553,7 @@ static const PalSpriteID _bridge_sprite_table_11_2[] = {
{ 0xA1F, PALETTE_TO_STRUCT_YELLOW }, { 0xA03, PALETTE_TO_STRUCT_YELLOW }, { 0xA07, PALETTE_TO_STRUCT_YELLOW }, { 0x0, PAL_NONE },
};
static const PalSpriteID _bridge_sprite_table_12_0[] = {
static const PalSpriteID _bridge_sprite_table_tubular_silicon_north[] = {
{ 0xA0B, PALETTE_TO_STRUCT_CONCRETE }, { 0xA01, PALETTE_TO_STRUCT_CONCRETE }, { 0x0, PAL_NONE }, { 0x0, PAL_NONE },
{ 0xA0C, PALETTE_TO_STRUCT_CONCRETE }, { 0xA02, PALETTE_TO_STRUCT_CONCRETE }, { 0x0, PAL_NONE }, { 0x0, PAL_NONE },
{ 0xA11, PALETTE_TO_STRUCT_CONCRETE }, { 0xA01, PALETTE_TO_STRUCT_CONCRETE }, { 0x0, PAL_NONE }, { 0x0, PAL_NONE },
@@ -557,7 +564,7 @@ static const PalSpriteID _bridge_sprite_table_12_0[] = {
{ 0xA1E, PALETTE_TO_STRUCT_CONCRETE }, { 0xA02, PALETTE_TO_STRUCT_CONCRETE }, { 0x0, PAL_NONE }, { 0x0, PAL_NONE },
};
static const PalSpriteID _bridge_sprite_table_12_1[] = {
static const PalSpriteID _bridge_sprite_table_tubular_silicon_south[] = {
{ 0xA09, PALETTE_TO_STRUCT_CONCRETE }, { 0x9FF, PALETTE_TO_STRUCT_CONCRETE }, { 0xA05, PALETTE_TO_STRUCT_CONCRETE }, { 0x0, PAL_NONE },
{ 0xA0E, PALETTE_TO_STRUCT_CONCRETE }, { 0xA04, PALETTE_TO_STRUCT_CONCRETE }, { 0xA08, PALETTE_TO_STRUCT_CONCRETE }, { 0x0, PAL_NONE },
{ 0xA0F, PALETTE_TO_STRUCT_CONCRETE }, { 0x9FF, PALETTE_TO_STRUCT_CONCRETE }, { 0xA05, PALETTE_TO_STRUCT_CONCRETE }, { 0x0, PAL_NONE },
@@ -568,7 +575,7 @@ static const PalSpriteID _bridge_sprite_table_12_1[] = {
{ 0xA20, PALETTE_TO_STRUCT_CONCRETE }, { 0xA04, PALETTE_TO_STRUCT_CONCRETE }, { 0xA08, PALETTE_TO_STRUCT_CONCRETE }, { 0x0, PAL_NONE },
};
static const PalSpriteID _bridge_sprite_table_12_2[] = {
static const PalSpriteID _bridge_sprite_table_tubular_silicon_middle[] = {
{ 0xA0A, PALETTE_TO_STRUCT_CONCRETE }, { 0xA00, PALETTE_TO_STRUCT_CONCRETE }, { 0xA06, PALETTE_TO_STRUCT_CONCRETE }, { 0x0, PAL_NONE },
{ 0xA0D, PALETTE_TO_STRUCT_CONCRETE }, { 0xA03, PALETTE_TO_STRUCT_CONCRETE }, { 0xA07, PALETTE_TO_STRUCT_CONCRETE }, { 0x0, PAL_NONE },
{ 0xA10, PALETTE_TO_STRUCT_CONCRETE }, { 0xA00, PALETTE_TO_STRUCT_CONCRETE }, { 0xA06, PALETTE_TO_STRUCT_CONCRETE }, { 0x0, PAL_NONE },
@@ -589,64 +596,64 @@ static const std::span<const PalSpriteID> _bridge_sprite_table_archgirder[] = {
_bridge_sprite_table_archgirder_heads,
};
static const std::span<const PalSpriteID> _bridge_sprite_table_4[] = {
_bridge_sprite_table_4_0,
_bridge_sprite_table_4_1,
_bridge_sprite_table_4_2,
_bridge_sprite_table_4_3,
_bridge_sprite_table_4_4,
_bridge_sprite_table_4_5,
_bridge_sprite_table_4_6,
static const std::span<const PalSpriteID> _bridge_sprite_table_suspension_oxide[] = {
_bridge_sprite_table_suspension_oxide_north,
_bridge_sprite_table_suspension_oxide_south,
_bridge_sprite_table_suspension_oxide_inner_north,
_bridge_sprite_table_suspension_oxide_inner_south,
_bridge_sprite_table_suspension_oxide_middle_odd,
_bridge_sprite_table_suspension_middle_even,
_bridge_sprite_table_generic_oxide_heads,
};
static const std::span<const PalSpriteID> _bridge_sprite_table_5[] = {
_bridge_sprite_table_5_0,
_bridge_sprite_table_5_1,
_bridge_sprite_table_5_2,
_bridge_sprite_table_5_3,
_bridge_sprite_table_5_4,
_bridge_sprite_table_5_5,
_bridge_sprite_table_5_6,
static const std::span<const PalSpriteID> _bridge_sprite_table_suspension_yellow[] = {
_bridge_sprite_table_suspension_yellow_north,
_bridge_sprite_table_suspension_yellow_south,
_bridge_sprite_table_suspension_yellow_inner_north,
_bridge_sprite_table_suspension_yellow_inner_south,
_bridge_sprite_table_suspension_yellow_middle_odd,
_bridge_sprite_table_suspension_yellow_middle_even,
_bridge_sprite_table_generic_yellow_heads,
};
static const std::span<const PalSpriteID> _bridge_sprite_table_concrete_suspended[] = {
_bridge_sprite_table_concrete_suspended_A,
_bridge_sprite_table_concrete_suspended_B,
_bridge_sprite_table_concrete_suspended_C,
_bridge_sprite_table_concrete_suspended_D,
_bridge_sprite_table_concrete_suspended_E,
_bridge_sprite_table_concrete_suspended_F,
_bridge_sprite_table_concrete_suspended_heads,
static const std::span<const PalSpriteID> _bridge_sprite_table_suspension_concrete[] = {
_bridge_sprite_table_suspension_concrete_north,
_bridge_sprite_table_suspension_concrete_south,
_bridge_sprite_table_suspension_concrete_inner_north,
_bridge_sprite_table_suspension_concrete_inner_south,
_bridge_sprite_table_suspension_concrete_middle_odd,
_bridge_sprite_table_suspension_concrete_middle_even,
_bridge_sprite_table_generic_concrete_heads,
};
static const std::span<const PalSpriteID> _bridge_sprite_table_6[] = {
_bridge_sprite_table_6_0,
_bridge_sprite_table_6_1,
_bridge_sprite_table_6_2,
_bridge_sprite_table_6_2,
_bridge_sprite_table_6_2,
_bridge_sprite_table_6_2,
_bridge_sprite_table_6_3,
static const std::span<const PalSpriteID> _bridge_sprite_table_cantilever_oxide[] = {
_bridge_sprite_table_cantilever_oxide_north,
_bridge_sprite_table_cantilever_oxide_south,
_bridge_sprite_table_cantilever_oxide_middle,
_bridge_sprite_table_cantilever_oxide_middle,
_bridge_sprite_table_cantilever_oxide_middle,
_bridge_sprite_table_cantilever_oxide_middle,
_bridge_sprite_table_cantilever_oxide_heads,
};
static const std::span<const PalSpriteID> _bridge_sprite_table_7[] = {
_bridge_sprite_table_7_0,
_bridge_sprite_table_7_1,
_bridge_sprite_table_7_2,
_bridge_sprite_table_7_2,
_bridge_sprite_table_7_2,
_bridge_sprite_table_7_2,
_bridge_sprite_table_7_3,
static const std::span<const PalSpriteID> _bridge_sprite_table_cantilever_brown[] = {
_bridge_sprite_table_cantilever_brown_north,
_bridge_sprite_table_cantilever_brown_south,
_bridge_sprite_table_cantilever_brown_middle,
_bridge_sprite_table_cantilever_brown_middle,
_bridge_sprite_table_cantilever_brown_middle,
_bridge_sprite_table_cantilever_brown_middle,
_bridge_sprite_table_cantilever_brown_heads,
};
static const std::span<const PalSpriteID> _bridge_sprite_table_8[] = {
_bridge_sprite_table_8_0,
_bridge_sprite_table_8_1,
_bridge_sprite_table_8_2,
_bridge_sprite_table_8_2,
_bridge_sprite_table_8_2,
_bridge_sprite_table_8_2,
_bridge_sprite_table_8_3,
static const std::span<const PalSpriteID> _bridge_sprite_table_cantilever_red[] = {
_bridge_sprite_table_cantilever_red_north,
_bridge_sprite_table_cantilever_red_south,
_bridge_sprite_table_cantilever_red_middle,
_bridge_sprite_table_cantilever_red_middle,
_bridge_sprite_table_cantilever_red_middle,
_bridge_sprite_table_cantilever_red_middle,
_bridge_sprite_table_cantilever_red_heads,
};
static const std::span<const PalSpriteID> _bridge_sprite_table_wood[] = {
@@ -669,60 +676,60 @@ static const std::span<const PalSpriteID> _bridge_sprite_table_concrete[] = {
_bridge_sprite_table_concrete_heads,
};
static const std::span<const PalSpriteID> _bridge_sprite_table_9[] = {
_bridge_sprite_table_9_0,
_bridge_sprite_table_9_0,
_bridge_sprite_table_9_0,
_bridge_sprite_table_9_0,
_bridge_sprite_table_9_0,
_bridge_sprite_table_9_0,
_bridge_sprite_table_4_6,
static const std::span<const PalSpriteID> _bridge_sprite_table_girder[] = {
_bridge_sprite_table_girder_middle,
_bridge_sprite_table_girder_middle,
_bridge_sprite_table_girder_middle,
_bridge_sprite_table_girder_middle,
_bridge_sprite_table_girder_middle,
_bridge_sprite_table_girder_middle,
_bridge_sprite_table_generic_oxide_heads,
};
static const std::span<const PalSpriteID> _bridge_sprite_table_10[] = {
_bridge_sprite_table_10_0,
_bridge_sprite_table_10_1,
_bridge_sprite_table_10_2,
_bridge_sprite_table_10_2,
_bridge_sprite_table_10_2,
_bridge_sprite_table_10_2,
_bridge_sprite_table_4_6,
static const std::span<const PalSpriteID> _bridge_sprite_table_tubular_oxide[] = {
_bridge_sprite_table_tubular_oxide_north,
_bridge_sprite_table_tubular_oxide_south,
_bridge_sprite_table_tubular_oxide_middle,
_bridge_sprite_table_tubular_oxide_middle,
_bridge_sprite_table_tubular_oxide_middle,
_bridge_sprite_table_tubular_oxide_middle,
_bridge_sprite_table_generic_oxide_heads,
};
static const std::span<const PalSpriteID> _bridge_sprite_table_11[] = {
_bridge_sprite_table_11_0,
_bridge_sprite_table_11_1,
_bridge_sprite_table_11_2,
_bridge_sprite_table_11_2,
_bridge_sprite_table_11_2,
_bridge_sprite_table_11_2,
_bridge_sprite_table_5_6,
static const std::span<const PalSpriteID> _bridge_sprite_table_tubular_yellow[] = {
_bridge_sprite_table_tubular_yellow_north,
_bridge_sprite_table_tubular_yellow_south,
_bridge_sprite_table_tubular_yellow_middle,
_bridge_sprite_table_tubular_yellow_middle,
_bridge_sprite_table_tubular_yellow_middle,
_bridge_sprite_table_tubular_yellow_middle,
_bridge_sprite_table_generic_yellow_heads,
};
static const std::span<const PalSpriteID> _bridge_sprite_table_12[] = {
_bridge_sprite_table_12_0,
_bridge_sprite_table_12_1,
_bridge_sprite_table_12_2,
_bridge_sprite_table_12_2,
_bridge_sprite_table_12_2,
_bridge_sprite_table_12_2,
_bridge_sprite_table_concrete_suspended_heads,
static const std::span<const PalSpriteID> _bridge_sprite_table_tubular_silicon[] = {
_bridge_sprite_table_tubular_silicon_north,
_bridge_sprite_table_tubular_silicon_south,
_bridge_sprite_table_tubular_silicon_middle,
_bridge_sprite_table_tubular_silicon_middle,
_bridge_sprite_table_tubular_silicon_middle,
_bridge_sprite_table_tubular_silicon_middle,
_bridge_sprite_table_generic_concrete_heads,
};
static const std::span<const std::span<const PalSpriteID>> _bridge_sprite_table[MAX_BRIDGES] = {
_bridge_sprite_table_wood,
_bridge_sprite_table_concrete,
_bridge_sprite_table_archgirder,
_bridge_sprite_table_concrete_suspended,
_bridge_sprite_table_4,
_bridge_sprite_table_5,
_bridge_sprite_table_6,
_bridge_sprite_table_7,
_bridge_sprite_table_8,
_bridge_sprite_table_9,
_bridge_sprite_table_10,
_bridge_sprite_table_11,
_bridge_sprite_table_12
_bridge_sprite_table_suspension_concrete,
_bridge_sprite_table_suspension_oxide,
_bridge_sprite_table_suspension_yellow,
_bridge_sprite_table_cantilever_oxide,
_bridge_sprite_table_cantilever_brown,
_bridge_sprite_table_cantilever_red,
_bridge_sprite_table_girder,
_bridge_sprite_table_tubular_oxide,
_bridge_sprite_table_tubular_yellow,
_bridge_sprite_table_tubular_silicon,
};
/**
@@ -738,8 +745,42 @@ static const std::span<const std::span<const PalSpriteID>> _bridge_sprite_table[
* @param nrl description of the rail bridge in query tool
* @param nrd description of the road bridge in query tool
*/
#define MBR(y, mnl, mxl, p, mxs, spr, plt, dsc, nrl, nrd) \
{TimerGameCalendar::Year{y}, mnl, mxl, p, mxs, spr, plt, dsc, { nrl, nrd }, {}, 0}
#define MBR(y, mnl, mxl, p, mxs, spr, plt, dsc, nrl, nrd, pillars) \
{TimerGameCalendar::Year{y}, mnl, mxl, p, mxs, spr, plt, dsc, { nrl, nrd }, {}, 0, {}, pillars}
static constexpr BridgePillarFlags BRIDGEPILLARFLAGS_ALL_CORNERS = {
BridgePillarFlag::CornerW, BridgePillarFlag::CornerS, BridgePillarFlag::CornerE, BridgePillarFlag::CornerN
};
/** Pillar flags for bridges which have pillars on the all corners on each piece. */
static const BridgeMiddlePillarFlags ALL_PILLARS = {{
{{BRIDGEPILLARFLAGS_ALL_CORNERS, BRIDGEPILLARFLAGS_ALL_CORNERS}},
{{BRIDGEPILLARFLAGS_ALL_CORNERS, BRIDGEPILLARFLAGS_ALL_CORNERS}},
{{BRIDGEPILLARFLAGS_ALL_CORNERS, BRIDGEPILLARFLAGS_ALL_CORNERS}},
{{BRIDGEPILLARFLAGS_ALL_CORNERS, BRIDGEPILLARFLAGS_ALL_CORNERS}},
{{BRIDGEPILLARFLAGS_ALL_CORNERS, BRIDGEPILLARFLAGS_ALL_CORNERS}},
{{BRIDGEPILLARFLAGS_ALL_CORNERS, BRIDGEPILLARFLAGS_ALL_CORNERS}},
}};
/** Pillar flags for suspension style bridges. */
static const BridgeMiddlePillarFlags SUSPENSION_PILLARS = {{
{{{BridgePillarFlag::CornerW, BridgePillarFlag::CornerS}, {BridgePillarFlag::CornerS, BridgePillarFlag::CornerE}}},
{{{BridgePillarFlag::CornerE, BridgePillarFlag::CornerN}, {BridgePillarFlag::CornerW, BridgePillarFlag::CornerN}}},
{{{BridgePillarFlag::CornerE, BridgePillarFlag::CornerN}, {BridgePillarFlag::CornerW, BridgePillarFlag::CornerN}}},
{{{BridgePillarFlag::CornerW, BridgePillarFlag::CornerS}, {BridgePillarFlag::CornerS, BridgePillarFlag::CornerE}}},
{{BRIDGEPILLARFLAGS_ALL_CORNERS, BRIDGEPILLARFLAGS_ALL_CORNERS}},
{{{}, {}}},
}};
/** Pillar flags for cantilever style bridges. */
static const BridgeMiddlePillarFlags CANTILEVER_PILLARS = {{
{{{}, {}}},
{{{BridgePillarFlag::CornerE, BridgePillarFlag::CornerN}, {BridgePillarFlag::CornerW, BridgePillarFlag::CornerN}}},
{{{BridgePillarFlag::CornerE, BridgePillarFlag::CornerN}, {BridgePillarFlag::CornerW, BridgePillarFlag::CornerN}}},
{{{BridgePillarFlag::CornerE, BridgePillarFlag::CornerN}, {BridgePillarFlag::CornerW, BridgePillarFlag::CornerN}}},
{{{BridgePillarFlag::CornerE, BridgePillarFlag::CornerN}, {BridgePillarFlag::CornerW, BridgePillarFlag::CornerN}}},
{{{BridgePillarFlag::CornerE, BridgePillarFlag::CornerN}, {BridgePillarFlag::CornerW, BridgePillarFlag::CornerN}}},
}};
const BridgeSpec _orig_bridge[] = {
/*
@@ -753,43 +794,43 @@ const BridgeSpec _orig_bridge[] = {
string with description name on rail name on road
| | | | */
MBR( 0, 0, 0xFFFF, 80, 32, 0xA24, PAL_NONE,
STR_BRIDGE_NAME_WOODEN, STR_LAI_BRIDGE_DESCRIPTION_RAIL_WOODEN, STR_LAI_BRIDGE_DESCRIPTION_ROAD_WOODEN),
STR_BRIDGE_NAME_WOODEN, STR_LAI_BRIDGE_DESCRIPTION_RAIL_WOODEN, STR_LAI_BRIDGE_DESCRIPTION_ROAD_WOODEN, ALL_PILLARS),
MBR( 0, 0, 2, 112, 48, 0xA26, PALETTE_TO_STRUCT_RED,
STR_BRIDGE_NAME_CONCRETE, STR_LAI_BRIDGE_DESCRIPTION_RAIL_CONCRETE, STR_LAI_BRIDGE_DESCRIPTION_ROAD_CONCRETE),
STR_BRIDGE_NAME_CONCRETE, STR_LAI_BRIDGE_DESCRIPTION_RAIL_CONCRETE, STR_LAI_BRIDGE_DESCRIPTION_ROAD_CONCRETE, ALL_PILLARS),
MBR(1930, 0, 5, 144, 64, 0xA25, PAL_NONE,
STR_BRIDGE_NAME_GIRDER_STEEL, STR_LAI_BRIDGE_DESCRIPTION_RAIL_GIRDER_STEEL, STR_LAI_BRIDGE_DESCRIPTION_ROAD_GIRDER_STEEL),
STR_BRIDGE_NAME_GIRDER_STEEL, STR_LAI_BRIDGE_DESCRIPTION_RAIL_GIRDER_STEEL, STR_LAI_BRIDGE_DESCRIPTION_ROAD_GIRDER_STEEL, ALL_PILLARS),
MBR( 0, 2, 10, 168, 80, 0xA22, PALETTE_TO_STRUCT_CONCRETE,
STR_BRIDGE_NAME_SUSPENSION_CONCRETE, STR_LAI_BRIDGE_DESCRIPTION_RAIL_SUSPENSION_CONCRETE, STR_LAI_BRIDGE_DESCRIPTION_ROAD_SUSPENSION_CONCRETE),
STR_BRIDGE_NAME_SUSPENSION_CONCRETE, STR_LAI_BRIDGE_DESCRIPTION_RAIL_SUSPENSION_CONCRETE, STR_LAI_BRIDGE_DESCRIPTION_ROAD_SUSPENSION_CONCRETE, SUSPENSION_PILLARS),
MBR(1930, 3, 0xFFFF, 185, 96, 0xA22, PAL_NONE,
STR_BRIDGE_NAME_SUSPENSION_STEEL, STR_LAI_BRIDGE_DESCRIPTION_RAIL_SUSPENSION_STEEL, STR_LAI_BRIDGE_DESCRIPTION_ROAD_SUSPENSION_STEEL),
STR_BRIDGE_NAME_SUSPENSION_STEEL, STR_LAI_BRIDGE_DESCRIPTION_RAIL_SUSPENSION_STEEL, STR_LAI_BRIDGE_DESCRIPTION_ROAD_SUSPENSION_STEEL, SUSPENSION_PILLARS),
MBR(1930, 3, 0xFFFF, 192, 112, 0xA22, PALETTE_TO_STRUCT_YELLOW,
STR_BRIDGE_NAME_SUSPENSION_STEEL, STR_LAI_BRIDGE_DESCRIPTION_RAIL_SUSPENSION_STEEL, STR_LAI_BRIDGE_DESCRIPTION_ROAD_SUSPENSION_STEEL),
STR_BRIDGE_NAME_SUSPENSION_STEEL, STR_LAI_BRIDGE_DESCRIPTION_RAIL_SUSPENSION_STEEL, STR_LAI_BRIDGE_DESCRIPTION_ROAD_SUSPENSION_STEEL, SUSPENSION_PILLARS),
MBR(1930, 3, 7, 224, 160, 0xA23, PAL_NONE,
STR_BRIDGE_NAME_CANTILEVER_STEEL, STR_LAI_BRIDGE_DESCRIPTION_RAIL_CANTILEVER_STEEL, STR_LAI_BRIDGE_DESCRIPTION_ROAD_CANTILEVER_STEEL),
STR_BRIDGE_NAME_CANTILEVER_STEEL, STR_LAI_BRIDGE_DESCRIPTION_RAIL_CANTILEVER_STEEL, STR_LAI_BRIDGE_DESCRIPTION_ROAD_CANTILEVER_STEEL, CANTILEVER_PILLARS),
MBR(1930, 3, 8, 232, 208, 0xA23, PALETTE_TO_STRUCT_BROWN,
STR_BRIDGE_NAME_CANTILEVER_STEEL, STR_LAI_BRIDGE_DESCRIPTION_RAIL_CANTILEVER_STEEL, STR_LAI_BRIDGE_DESCRIPTION_ROAD_CANTILEVER_STEEL),
STR_BRIDGE_NAME_CANTILEVER_STEEL, STR_LAI_BRIDGE_DESCRIPTION_RAIL_CANTILEVER_STEEL, STR_LAI_BRIDGE_DESCRIPTION_ROAD_CANTILEVER_STEEL, CANTILEVER_PILLARS),
MBR(1930, 3, 9, 248, 240, 0xA23, PALETTE_TO_STRUCT_RED,
STR_BRIDGE_NAME_CANTILEVER_STEEL, STR_LAI_BRIDGE_DESCRIPTION_RAIL_CANTILEVER_STEEL, STR_LAI_BRIDGE_DESCRIPTION_ROAD_CANTILEVER_STEEL),
STR_BRIDGE_NAME_CANTILEVER_STEEL, STR_LAI_BRIDGE_DESCRIPTION_RAIL_CANTILEVER_STEEL, STR_LAI_BRIDGE_DESCRIPTION_ROAD_CANTILEVER_STEEL, CANTILEVER_PILLARS),
MBR(1930, 0, 2, 240, 256, 0xA27, PAL_NONE,
STR_BRIDGE_NAME_GIRDER_STEEL, STR_LAI_BRIDGE_DESCRIPTION_RAIL_GIRDER_STEEL, STR_LAI_BRIDGE_DESCRIPTION_ROAD_GIRDER_STEEL),
STR_BRIDGE_NAME_GIRDER_STEEL, STR_LAI_BRIDGE_DESCRIPTION_RAIL_GIRDER_STEEL, STR_LAI_BRIDGE_DESCRIPTION_ROAD_GIRDER_STEEL, ALL_PILLARS),
MBR(1995, 2, 0xFFFF, 255, 320, 0xA28, PAL_NONE,
STR_BRIDGE_NAME_TUBULAR_STEEL, STR_LAI_BRIDGE_DESCRIPTION_RAIL_TUBULAR_STEEL, STR_LAI_BRIDGE_DESCRIPTION_ROAD_TUBULAR_STEEL),
STR_BRIDGE_NAME_TUBULAR_STEEL, STR_LAI_BRIDGE_DESCRIPTION_RAIL_TUBULAR_STEEL, STR_LAI_BRIDGE_DESCRIPTION_ROAD_TUBULAR_STEEL, CANTILEVER_PILLARS),
MBR(2005, 2, 0xFFFF, 380, 512, 0xA28, PALETTE_TO_STRUCT_YELLOW,
STR_BRIDGE_NAME_TUBULAR_STEEL, STR_LAI_BRIDGE_DESCRIPTION_RAIL_TUBULAR_STEEL, STR_LAI_BRIDGE_DESCRIPTION_ROAD_TUBULAR_STEEL),
STR_BRIDGE_NAME_TUBULAR_STEEL, STR_LAI_BRIDGE_DESCRIPTION_RAIL_TUBULAR_STEEL, STR_LAI_BRIDGE_DESCRIPTION_ROAD_TUBULAR_STEEL, CANTILEVER_PILLARS),
MBR(2010, 2, 0xFFFF, 510, 608, 0xA28, PALETTE_TO_STRUCT_CONCRETE,
STR_BRIDGE_TUBULAR_SILICON, STR_LAI_BRIDGE_DESCRIPTION_RAIL_TUBULAR_STEEL, STR_LAI_BRIDGE_DESCRIPTION_ROAD_TUBULAR_STEEL)
STR_BRIDGE_TUBULAR_SILICON, STR_LAI_BRIDGE_DESCRIPTION_RAIL_TUBULAR_STEEL, STR_LAI_BRIDGE_DESCRIPTION_ROAD_TUBULAR_STEEL, CANTILEVER_PILLARS),
};
#undef MBR

View File

@@ -10,6 +10,8 @@
#ifndef BUILD_INDUSTRY_H
#define BUILD_INDUSTRY_H
#include "table/strings.h"
/**
* Definition of an industry tiles layout.
* @param x offset x of this tile
@@ -1132,8 +1134,8 @@ enum IndustryTypes : uint8_t {
{r1, r2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, m, \
{INVALID_CARGO, INVALID_CARGO, INVALID_CARGO, INVALID_CARGO, INVALID_CARGO, INVALID_CARGO, INVALID_CARGO, INVALID_CARGO, INVALID_CARGO, INVALID_CARGO, INVALID_CARGO, INVALID_CARGO, INVALID_CARGO, INVALID_CARGO, INVALID_CARGO, INVALID_CARGO}, \
{{im1, 0}, {im2, 0}, {im3, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}}, \
pr, clim, bev, col, in, intx, s1, s2, s3, STR_UNDEFINED, {ai1, ai2, ai3, ai4}, {ag1, ag2, ag3, ag4}, \
IndustryCallbackMasks{}, true, GRFFileProps(IT_INVALID), snd, {}, \
pr, clim, bev, PixelColour{col}, in, intx, s1, s2, s3, STR_UNDEFINED, {ai1, ai2, ai3, ai4}, {ag1, ag2, ag3, ag4}, \
IndustryCallbackMasks{}, true, SubstituteGRFFileProps(IT_INVALID), snd, {}, \
{{p1, p2}}, {{a1, a2, a3}}}
/* Format:
tile table count and sounds table
@@ -1529,11 +1531,11 @@ static const IndustrySpec _origin_industry_specs[NEW_INDUSTRYOFFSET] = {
* @param sl slope refused upon choosing a place to build
* @param a1 animation frame on production
* @param a2 next frame of animation
* @param a3 chooses between animation or construction state
* @param a3 chooses between animation or construction stage
*/
#define MT(ca1, c1, ca2, c2, ca3, c3, sl, a1, a2, a3) { \
{INVALID_CARGO, INVALID_CARGO, INVALID_CARGO, INVALID_CARGO, INVALID_CARGO, INVALID_CARGO, INVALID_CARGO, INVALID_CARGO, INVALID_CARGO, INVALID_CARGO, INVALID_CARGO, INVALID_CARGO, INVALID_CARGO, INVALID_CARGO, INVALID_CARGO, INVALID_CARGO}, \
{ca1, ca2, ca3}, sl, a1, a2, a3, IndustryTileCallbackMasks{}, {0, ANIM_STATUS_NO_ANIMATION, 2, 0}, IndustryTileSpecialFlags{}, true, GRFFileProps(INVALID_INDUSTRYTILE), {}, {c1, c2, c3} \
{ca1, ca2, ca3}, sl, a1, a2, a3, IndustryTileCallbackMasks{}, AnimationInfo<IndustryAnimationTriggers>{}, IndustryTileSpecialFlags{}, true, SubstituteGRFFileProps(INVALID_INDUSTRYTILE), {}, {c1, c2, c3} \
}
static const IndustryTileSpec _origin_industry_tile_specs[NEW_INDUSTRYTILEOFFSET] = {
/* Coal Mine */

View File

@@ -7,6 +7,11 @@
/** @file cargo_const.h Table of all default cargo types */
#include "../table/sprites.h"
#ifndef CHECK_UNUSED_STRINGS
#include "table/strings.h"
#endif
/** Construction macros for the #CargoSpec StringID entries. */
#define MK_STR_CARGO_PLURAL(label_plural) STR_CARGO_PLURAL_ ## label_plural
#define MK_STR_CARGO_SINGULAR(label_singular) STR_CARGO_SINGULAR_ ## label_singular
@@ -44,7 +49,7 @@
* @param classes Classes of this cargo type. @see CargoClass
*/
#define MK(bt, label, colour, weight, mult, ip, td1, td2, freight, tae, str_plural, str_singular, str_volume, classes) \
{label, bt, colour, colour, weight, mult, classes, ip, {td1, td2}, freight, tae, INVALID_TPE, TOWN_PRODUCTION_DIVISOR, CargoCallbackMasks{}, \
{label, bt, PixelColour{colour}, PixelColour{colour}, weight, mult, classes, ip, {td1, td2}, freight, tae, INVALID_TPE, TOWN_PRODUCTION_DIVISOR, CargoCallbackMasks{}, \
MK_STR_CARGO_PLURAL(str_plural), MK_STR_CARGO_SINGULAR(str_singular), str_volume, MK_STR_QUANTITY(str_plural), MK_STR_ABBREV(str_plural), \
MK_SPRITE(str_plural), nullptr, nullptr, 0}

View File

@@ -7,6 +7,8 @@
/** @file clear_land.h Tables with sprites for clear land and fences. */
#include "sprites.h"
static const SpriteID _landscape_clear_sprites_rough[8] = {
SPR_FLAT_ROUGH_LAND,
SPR_FLAT_ROUGH_LAND_1,

98
src/table/company_face.h Normal file
View File

@@ -0,0 +1,98 @@
/*
* This file is part of OpenTTD.
* OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2.
* OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see <http://www.gnu.org/licenses/>.
*/
/**
* @file table/company_face.h
* This file contains all definitions for default company faces.
*/
#ifndef TABLE_COMPANY_FACE_H
#define TABLE_COMPANY_FACE_H
#include "../company_manager_face.h"
/* Definitions for default face variables.
* Faces are drawn in the listed order, so sprite layers must be ordered
* according to how the face should be rendered. */
/** Variables of first masculine face. */
static constexpr FaceVar _face_style_1[] = {
{FaceVarType::Toggle, 3, 3, 1, 2, std::pair{1ULL << 6, 1ULL << 7 | 1ULL << 8}, STR_FACE_MOUSTACHE},
{FaceVarType::Toggle, 11, 4, 1, 2, std::pair{1ULL << 13, 0ULL}, STR_FACE_GLASSES},
{FaceVarType::Palette, 2, 5, 2, 3, uint64_t{1ULL << 5}, STR_FACE_EYECOLOUR},
{FaceVarType::Sprite, 0, 0, 0, 1, SpriteID{0x325}},
{FaceVarType::Sprite, 7, 7, 2, 4, SpriteID{0x327}, STR_FACE_CHIN},
{FaceVarType::Sprite, 1, 9, 4, 12, SpriteID{0x32B}, STR_FACE_EYEBROWS},
{FaceVarType::Sprite, 4, 13, 2, 3, SpriteID{0x367}, STR_FACE_MOUSTACHE},
{FaceVarType::Sprite, 6, 13, 4, 12, SpriteID{0x35B}, STR_FACE_LIPS},
{FaceVarType::Sprite, 5, 17, 3, 8, SpriteID{0x349}, STR_FACE_NOSE},
{FaceVarType::Sprite, 0, 20, 4, 9, SpriteID{0x382}, STR_FACE_HAIR},
{FaceVarType::Sprite, 9, 26, 2, 4, SpriteID{0x36E}, STR_FACE_COLLAR},
{FaceVarType::Sprite, 8, 24, 2, 3, SpriteID{0x36B}, STR_FACE_JACKET},
{FaceVarType::Sprite, 10, 28, 3, 6, SpriteID{0x372}, STR_FACE_TIE},
{FaceVarType::Sprite, 12, 31, 1, 2, SpriteID{0x347}, STR_FACE_GLASSES},
};
/** Variables of first feminine face. */
static constexpr FaceVar _face_style_2[] = {
{FaceVarType::Toggle, 9, 3, 1, 2, std::pair{1ULL << 11, 0}, STR_FACE_EARRING},
{FaceVarType::Toggle, 7, 4, 1, 2, std::pair{1ULL << 12, 0}, STR_FACE_GLASSES},
{FaceVarType::Palette, 2, 5, 2, 3, uint64_t{1ULL << 5}, STR_FACE_EYECOLOUR},
{FaceVarType::Sprite, 0, 0, 0, 1, SpriteID{0x326}},
{FaceVarType::Sprite, 0, 0, 0, 1, SpriteID{0x327}},
{FaceVarType::Sprite, 1, 9, 4, 16, SpriteID{0x337}, STR_FACE_EYEBROWS},
{FaceVarType::Sprite, 4, 13, 4, 10, SpriteID{0x351}, STR_FACE_LIPS},
{FaceVarType::Sprite, 3, 17, 3, 4, SpriteID{0x34C}, STR_FACE_NOSE},
{FaceVarType::Sprite, 0, 20, 4, 5, SpriteID{0x38B}, STR_FACE_HAIR},
{FaceVarType::Sprite, 6, 26, 2, 4, SpriteID{0x37B}, STR_FACE_COLLAR},
{FaceVarType::Sprite, 5, 24, 2, 3, SpriteID{0x378}, STR_FACE_JACKET},
{FaceVarType::Sprite, 10, 28, 3, 3, SpriteID{0x37F}, STR_FACE_EARRING},
{FaceVarType::Sprite, 8, 31, 1, 2, SpriteID{0x347}, STR_FACE_GLASSES},
};
/** Variables of second masculine face. */
static constexpr FaceVar _face_style_3[] = {
{FaceVarType::Toggle, 2, 3, 1, 2, std::pair{1ULL << 5, 1ULL << 6 | 1ULL << 7}, STR_FACE_MOUSTACHE},
{FaceVarType::Toggle, 10, 4, 1, 2, std::pair{1ULL << 12, 0ULL}, STR_FACE_GLASSES},
{FaceVarType::Sprite, 0, 0, 0, 1, SpriteID{0x390}},
{FaceVarType::Sprite, 6, 7, 2, 2, SpriteID{0x391}, STR_FACE_CHIN},
{FaceVarType::Sprite, 1, 9, 4, 11, SpriteID{0x39A}, STR_FACE_EYEBROWS},
{FaceVarType::Sprite, 3, 13, 2, 3, SpriteID{0x397}, STR_FACE_MOUSTACHE},
{FaceVarType::Sprite, 5, 13, 4, 9, SpriteID{0x3A5}, STR_FACE_LIPS},
{FaceVarType::Sprite, 4, 17, 3, 4, SpriteID{0x393}, STR_FACE_NOSE},
{FaceVarType::Sprite, 0, 20, 4, 5, SpriteID{0x3D4}, STR_FACE_HAIR},
{FaceVarType::Sprite, 8, 26, 2, 4, SpriteID{0x36E}, STR_FACE_COLLAR},
{FaceVarType::Sprite, 7, 24, 2, 3, SpriteID{0x36B}, STR_FACE_JACKET},
{FaceVarType::Sprite, 9, 28, 3, 6, SpriteID{0x372}, STR_FACE_TIE},
{FaceVarType::Sprite, 11, 31, 1, 2, SpriteID{0x3AE}, STR_FACE_GLASSES},
};
/** Variables of second feminine face. */
static constexpr FaceVar _face_style_4[] = {
{FaceVarType::Toggle, 9, 3, 1, 2, std::pair{1ULL << 10, 0ULL}, STR_FACE_EARRING},
{FaceVarType::Toggle, 7, 4, 1, 2, std::pair{1ULL << 11, 0ULL}, STR_FACE_GLASSES},
{FaceVarType::Sprite, 0, 0, 0, 1, SpriteID{0x3B0}},
{FaceVarType::Sprite, 4, 7, 2, 2, SpriteID{0x3B1}, STR_FACE_CHIN},
{FaceVarType::Sprite, 1, 9, 4, 16, SpriteID{0x3B8}, STR_FACE_EYEBROWS},
{FaceVarType::Sprite, 3, 13, 4, 9, SpriteID{0x3C8}, STR_FACE_LIPS},
{FaceVarType::Sprite, 2, 17, 3, 5, SpriteID{0x3B3}, STR_FACE_NOSE},
{FaceVarType::Sprite, 0, 20, 4, 5, SpriteID{0x3D9}, STR_FACE_HAIR},
{FaceVarType::Sprite, 6, 26, 2, 4, SpriteID{0x37B}, STR_FACE_COLLAR},
{FaceVarType::Sprite, 5, 24, 2, 3, SpriteID{0x378}, STR_FACE_JACKET},
{FaceVarType::Sprite, 10, 28, 3, 3, SpriteID{0x3D1}, STR_FACE_EARRING},
{FaceVarType::Sprite, 8, 31, 1, 2, SpriteID{0x3AE}, STR_FACE_GLASSES},
};
/** Original face styles. */
static FaceSpec _original_faces[] = {
{"default/face1", _face_style_1},
{"default/face2", _face_style_2},
{"default/face3", _face_style_3},
{"default/face4", _face_style_4},
};
#endif /* TABLE_COMPANY_FACE_H */

View File

@@ -171,6 +171,9 @@ enum StringControlCode : uint16_t {
* These are mapped to the original glyphs */
SCC_LESS_THAN = SCC_SPRITE_START + 0x3C,
SCC_GREATER_THAN = SCC_SPRITE_START + 0x3E,
SCC_TOWN = SCC_SPRITE_START + 0x9B,
SCC_CITY = SCC_SPRITE_START + 0x9C,
SCC_LEFT_ARROW = SCC_SPRITE_START + 0x9D,
SCC_UP_ARROW = SCC_SPRITE_START + 0xA0,
SCC_DOWN_ARROW = SCC_SPRITE_START + 0xAA,
SCC_CHECKMARK = SCC_SPRITE_START + 0xAC,

View File

@@ -17,7 +17,7 @@
* Tile Location group.
* This defines whether the X and or Y coordinate of a tile is even
*/
enum TLG : uint8_t {
enum TileLocationGroup : uint8_t {
XEVEN_YEVEN = 0,
XEVEN_YODD = 1,
XODD_YEVEN = 2,
@@ -40,11 +40,11 @@ enum TileSource : uint8_t {
static const uint NUM_TRACKS_AT_PCP = 6;
/** Which PPPs are possible at all on a given PCP */
static const uint8_t AllowedPPPonPCP[DIAGDIR_END] = {
1 << DIR_N | 1 << DIR_E | 1 << DIR_SE | 1 << DIR_S | 1 << DIR_W | 1 << DIR_NW,
1 << DIR_N | 1 << DIR_NE | 1 << DIR_E | 1 << DIR_S | 1 << DIR_SW | 1 << DIR_W,
1 << DIR_N | 1 << DIR_E | 1 << DIR_SE | 1 << DIR_S | 1 << DIR_W | 1 << DIR_NW,
1 << DIR_N | 1 << DIR_NE | 1 << DIR_E | 1 << DIR_S | 1 << DIR_SW | 1 << DIR_W,
static const Directions _allowed_ppp_on_pcp[DIAGDIR_END] = {
{DIR_N, DIR_E, DIR_SE, DIR_S, DIR_W, DIR_NW},
{DIR_N, DIR_NE, DIR_E, DIR_S, DIR_SW, DIR_W},
{DIR_N, DIR_E, DIR_SE, DIR_S, DIR_W, DIR_NW},
{DIR_N, DIR_NE, DIR_E, DIR_S, DIR_SW, DIR_W},
};
/**
@@ -52,15 +52,15 @@ static const uint8_t AllowedPPPonPCP[DIAGDIR_END] = {
* the following system is used: if you rotate the PCP so that it is in the
* north, the eastern PPP belongs to the tile.
*/
static const uint8_t OwnedPPPonPCP[DIAGDIR_END] = {
1 << DIR_SE | 1 << DIR_S | 1 << DIR_SW | 1 << DIR_W,
1 << DIR_N | 1 << DIR_SW | 1 << DIR_W | 1 << DIR_NW,
1 << DIR_N | 1 << DIR_NE | 1 << DIR_E | 1 << DIR_NW,
1 << DIR_NE | 1 << DIR_E | 1 << DIR_SE | 1 << DIR_S
static const Directions _owned_ppp_on_pcp[DIAGDIR_END] = {
{DIR_SE, DIR_S, DIR_SW, DIR_W},
{DIR_N, DIR_SW, DIR_W, DIR_NW},
{DIR_N, DIR_NE, DIR_E, DIR_NW},
{DIR_NE, DIR_E, DIR_SE, DIR_S},
};
/** Maps a track bit onto two PCP positions */
static const DiagDirection PCPpositions[TRACK_END][2] = {
static const DiagDirection _pcp_positions[TRACK_END][2] = {
{DIAGDIR_NE, DIAGDIR_SW}, // X
{DIAGDIR_SE, DIAGDIR_NW}, // Y
{DIAGDIR_NW, DIAGDIR_NE}, // UPPER
@@ -69,142 +69,141 @@ static const DiagDirection PCPpositions[TRACK_END][2] = {
{DIAGDIR_NE, DIAGDIR_SE}, // RIGHT
};
#define PCP_NOT_ON_TRACK 0xFF
/**
* Preferred points of each trackbit. Those are the ones perpendicular to the
* track, plus the point in extension of the track (to mark end-of-track). PCPs
* which are not on either end of the track are fully preferred.
* @see PCPpositions
*/
static const uint8_t PreferredPPPofTrackAtPCP[TRACK_END][DIAGDIR_END] = {
{ // X
1 << DIR_NE | 1 << DIR_SE | 1 << DIR_NW, // NE
PCP_NOT_ON_TRACK, // SE
1 << DIR_SE | 1 << DIR_SW | 1 << DIR_NW, // SW
PCP_NOT_ON_TRACK // NE
}, { // Y
PCP_NOT_ON_TRACK,
1 << DIR_NE | 1 << DIR_SE | 1 << DIR_SW,
PCP_NOT_ON_TRACK,
1 << DIR_SW | 1 << DIR_NW | 1 << DIR_NE
}, { // UPPER
1 << DIR_E | 1 << DIR_N | 1 << DIR_S,
PCP_NOT_ON_TRACK,
PCP_NOT_ON_TRACK,
1 << DIR_W | 1 << DIR_N | 1 << DIR_S
}, { // LOWER
PCP_NOT_ON_TRACK,
1 << DIR_E | 1 << DIR_N | 1 << DIR_S,
1 << DIR_W | 1 << DIR_N | 1 << DIR_S,
PCP_NOT_ON_TRACK
}, { // LEFT
PCP_NOT_ON_TRACK,
PCP_NOT_ON_TRACK,
1 << DIR_S | 1 << DIR_E | 1 << DIR_W,
1 << DIR_N | 1 << DIR_E | 1 << DIR_W
}, { // RIGHT
1 << DIR_N | 1 << DIR_E | 1 << DIR_W,
1 << DIR_S | 1 << DIR_E | 1 << DIR_W,
PCP_NOT_ON_TRACK,
PCP_NOT_ON_TRACK
}
static const Directions _preferred_ppp_of_track_at_pcp[TRACK_END][DIAGDIR_END] = {
{ // X
{DIR_NE, DIR_SE, DIR_NW}, // NE
DIRECTIONS_ALL, // SE
{DIR_SE, DIR_SW, DIR_NW}, // SW
DIRECTIONS_ALL // NE
},
{ // Y
DIRECTIONS_ALL,
{DIR_NE, DIR_SE, DIR_SW},
DIRECTIONS_ALL,
{DIR_SW, DIR_NW, DIR_NE},
},
{ // UPPER
{DIR_E, DIR_N, DIR_S},
DIRECTIONS_ALL,
DIRECTIONS_ALL,
{DIR_W, DIR_N, DIR_S},
},
{ // LOWER
DIRECTIONS_ALL,
{DIR_E, DIR_N, DIR_S},
{DIR_W, DIR_N, DIR_S},
DIRECTIONS_ALL,
},
{ // LEFT
DIRECTIONS_ALL,
DIRECTIONS_ALL,
{DIR_S, DIR_E, DIR_W},
{DIR_N, DIR_E, DIR_W},
},
{ // RIGHT
{DIR_N, DIR_E, DIR_W},
{DIR_S, DIR_E, DIR_W},
DIRECTIONS_ALL,
DIRECTIONS_ALL,
},
};
#undef PCP_NOT_ON_TRACK
#define NUM_IGNORE_GROUPS 3
#define IGNORE_NONE 0xFF
/**
* In case we have a straight line, we place pylon only every two tiles,
* so there are certain tiles which we ignore. A straight line is found if
* we have exactly two PPPs.
*/
static const uint8_t IgnoredPCP[NUM_IGNORE_GROUPS][TLG_END][DIAGDIR_END] = {
static const Directions _ignored_pcp[NUM_IGNORE_GROUPS][TLG_END][DIAGDIR_END] = {
{ // Ignore group 1, X and Y tracks
{ // X even, Y even
IGNORE_NONE,
1 << DIR_NE | 1 << DIR_SW,
1 << DIR_NW | 1 << DIR_SE,
IGNORE_NONE
DIRECTIONS_ALL,
{DIR_NE, DIR_SW},
{DIR_NW, DIR_SE},
DIRECTIONS_ALL,
}, { // X even, Y odd
IGNORE_NONE,
IGNORE_NONE,
1 << DIR_NW | 1 << DIR_SE,
1 << DIR_NE | 1 << DIR_SW
DIRECTIONS_ALL,
DIRECTIONS_ALL,
{DIR_NW, DIR_SE},
{DIR_NE, DIR_SW},
}, { // X odd, Y even
1 << DIR_NW | 1 << DIR_SE,
1 << DIR_NE | 1 << DIR_SW,
IGNORE_NONE,
IGNORE_NONE
{DIR_NW, DIR_SE},
{DIR_NE, DIR_SW},
DIRECTIONS_ALL,
DIRECTIONS_ALL,
}, { // X odd, Y odd
1 << DIR_NW | 1 << DIR_SE,
IGNORE_NONE,
IGNORE_NONE,
1 << DIR_NE | 1 << DIR_SW
{DIR_NW, DIR_SE},
DIRECTIONS_ALL,
DIRECTIONS_ALL,
{DIR_NE, DIR_SW},
}
},
{ // Ignore group 2, LEFT and RIGHT tracks
{
1 << DIR_E | 1 << DIR_W,
IGNORE_NONE,
IGNORE_NONE,
1 << DIR_E | 1 << DIR_W
{DIR_E, DIR_W},
DIRECTIONS_ALL,
DIRECTIONS_ALL,
{DIR_E, DIR_W},
}, {
IGNORE_NONE,
1 << DIR_E | 1 << DIR_W,
1 << DIR_E | 1 << DIR_W,
IGNORE_NONE
DIRECTIONS_ALL,
{DIR_E, DIR_W},
{DIR_E, DIR_W},
DIRECTIONS_ALL,
}, {
IGNORE_NONE,
1 << DIR_E | 1 << DIR_W,
1 << DIR_E | 1 << DIR_W,
IGNORE_NONE
DIRECTIONS_ALL,
{DIR_E, DIR_W},
{DIR_E, DIR_W},
DIRECTIONS_ALL,
}, {
1 << DIR_E | 1 << DIR_W,
IGNORE_NONE,
IGNORE_NONE,
1 << DIR_E | 1 << DIR_W
{DIR_E, DIR_W},
DIRECTIONS_ALL,
DIRECTIONS_ALL,
{DIR_E, DIR_W},
}
},
{ // Ignore group 3, UPPER and LOWER tracks
{
1 << DIR_N | 1 << DIR_S,
1 << DIR_N | 1 << DIR_S,
IGNORE_NONE,
IGNORE_NONE
{DIR_N, DIR_S},
{DIR_N, DIR_S},
DIRECTIONS_ALL,
DIRECTIONS_ALL,
}, {
IGNORE_NONE,
IGNORE_NONE,
1 << DIR_N | 1 << DIR_S,
1 << DIR_N | 1 << DIR_S
DIRECTIONS_ALL,
DIRECTIONS_ALL,
{DIR_N, DIR_S},
{DIR_N, DIR_S},
}, {
IGNORE_NONE,
IGNORE_NONE,
1 << DIR_N | 1 << DIR_S ,
1 << DIR_N | 1 << DIR_S
DIRECTIONS_ALL,
DIRECTIONS_ALL,
{DIR_N, DIR_S},
{DIR_N, DIR_S},
}, {
1 << DIR_N | 1 << DIR_S,
1 << DIR_N | 1 << DIR_S,
IGNORE_NONE,
IGNORE_NONE
{DIR_N, DIR_S},
{DIR_N, DIR_S},
DIRECTIONS_ALL,
DIRECTIONS_ALL,
}
}
};
#undef NO_IGNORE
/** Which pylons can definitely NOT be built */
static const uint8_t DisallowedPPPofTrackAtPCP[TRACK_END][DIAGDIR_END] = {
{1 << DIR_SW | 1 << DIR_NE, 0, 1 << DIR_SW | 1 << DIR_NE, 0 }, // X
{0, 1 << DIR_NW | 1 << DIR_SE, 0, 1 << DIR_NW | 1 << DIR_SE}, // Y
{1 << DIR_W | 1 << DIR_E, 0, 0, 1 << DIR_W | 1 << DIR_E }, // UPPER
{0, 1 << DIR_W | 1 << DIR_E, 1 << DIR_W | 1 << DIR_E, 0 }, // LOWER
{0, 0, 1 << DIR_S | 1 << DIR_N, 1 << DIR_N | 1 << DIR_S }, // LEFT
{1 << DIR_S | 1 << DIR_N, 1 << DIR_S | 1 << DIR_N, 0, 0, }, // RIGHT
static const Directions _disallowed_ppp_of_track_at_pcp[TRACK_END][DIAGDIR_END] = {
{{DIR_SW, DIR_NE}, {}, {DIR_SW, DIR_NE}, {} }, // X
{{}, {DIR_NW, DIR_SE}, {}, {DIR_NW, DIR_SE}}, // Y
{{DIR_W, DIR_E}, {}, {}, {DIR_W, DIR_E} }, // UPPER
{{}, {DIR_W, DIR_E}, {DIR_W, DIR_E}, {} }, // LOWER
{{}, {}, {DIR_S, DIR_N}, {DIR_N, DIR_S} }, // LEFT
{{DIR_S, DIR_N}, {DIR_S, DIR_N}, {}, {}, }, // RIGHT
};
/* This array stores which track bits can meet at a tile edge */
static const Track TracksAtPCP[DIAGDIR_END][NUM_TRACKS_AT_PCP] = {
static const Track _tracks_at_pcp[DIAGDIR_END][NUM_TRACKS_AT_PCP] = {
{TRACK_X, TRACK_X, TRACK_UPPER, TRACK_LOWER, TRACK_LEFT, TRACK_RIGHT},
{TRACK_Y, TRACK_Y, TRACK_UPPER, TRACK_LOWER, TRACK_LEFT, TRACK_RIGHT},
{TRACK_X, TRACK_X, TRACK_UPPER, TRACK_LOWER, TRACK_LEFT, TRACK_RIGHT},
@@ -213,7 +212,7 @@ static const Track TracksAtPCP[DIAGDIR_END][NUM_TRACKS_AT_PCP] = {
/* takes each of the 6 track bits from the array above and
* assigns it to the home tile or neighbour tile */
static const TileSource TrackSourceTile[DIAGDIR_END][NUM_TRACKS_AT_PCP] = {
static const TileSource _track_source_tile[DIAGDIR_END][NUM_TRACKS_AT_PCP] = {
{TS_HOME, TS_NEIGHBOUR, TS_HOME , TS_NEIGHBOUR, TS_NEIGHBOUR, TS_HOME },
{TS_HOME, TS_NEIGHBOUR, TS_NEIGHBOUR, TS_HOME , TS_NEIGHBOUR, TS_HOME },
{TS_HOME, TS_NEIGHBOUR, TS_NEIGHBOUR, TS_HOME , TS_HOME , TS_NEIGHBOUR},
@@ -221,7 +220,7 @@ static const TileSource TrackSourceTile[DIAGDIR_END][NUM_TRACKS_AT_PCP] = {
};
/* Several PPPs maybe exist, here they are sorted in order of preference. */
static const Direction PPPorder[DIAGDIR_END][TLG_END][DIR_END] = { // X - Y
static const Direction _ppp_order[DIAGDIR_END][TLG_END][DIR_END] = { // X - Y
{ // PCP 0
{DIR_NE, DIR_NW, DIR_SE, DIR_SW, DIR_N, DIR_E, DIR_S, DIR_W}, // evn - evn
{DIR_NE, DIR_SE, DIR_SW, DIR_NW, DIR_S, DIR_W, DIR_N, DIR_E}, // evn - odd
@@ -245,11 +244,11 @@ static const Direction PPPorder[DIAGDIR_END][TLG_END][DIR_END] = { // X -
}
};
/* Geometric placement of the PCP relative to the tile origin */
static const int8_t x_pcp_offsets[DIAGDIR_END] = {0, 8, 16, 8};
static const int8_t y_pcp_offsets[DIAGDIR_END] = {8, 16, 8, 0};
static const int8_t _x_pcp_offsets[DIAGDIR_END] = {0, 8, 16, 8};
static const int8_t _y_pcp_offsets[DIAGDIR_END] = {8, 16, 8, 0};
/* Geometric placement of the PPP relative to the PCP*/
static const int8_t x_ppp_offsets[DIR_END] = {-2, -4, -2, 0, 2, 4, 2, 0};
static const int8_t y_ppp_offsets[DIR_END] = {-2, 0, 2, 4, 2, 0, -2, -4};
static const int8_t _x_ppp_offsets[DIR_END] = {-2, -4, -2, 0, 2, 4, 2, 0};
static const int8_t _y_ppp_offsets[DIR_END] = {-2, 0, 2, 4, 2, 0, -2, -4};
/**
* Offset for pylon sprites from the base pylon sprite.
@@ -266,7 +265,7 @@ enum PylonSpriteOffset : uint8_t {
};
/* The type of pylon to draw at each PPP */
static const uint8_t pylon_sprites[] = {
static const uint8_t _pylon_sprites[] = {
PSO_EW_N,
PSO_Y_NE,
PSO_NS_E,
@@ -314,14 +313,12 @@ enum WireSpriteOffset : uint8_t {
WSO_ENTRANCE_SE,
};
struct SortableSpriteStruct {
struct SortableSpriteStruct : SpriteBounds {
uint8_t image_offset;
int8_t x_offset;
int8_t y_offset;
int8_t x_size;
int8_t y_size;
int8_t z_size;
int8_t z_offset;
constexpr SortableSpriteStruct(uint8_t image_offset, const SpriteBounds &bounds) : SpriteBounds(bounds), image_offset(image_offset) {}
constexpr SortableSpriteStruct(uint8_t image_offset, int8_t x_offset, int8_t y_offset, uint8_t x_size, uint8_t y_size, uint8_t z_size, int8_t z_offset) :
SpriteBounds({x_offset, y_offset, z_offset}, {x_size, y_size, z_size}, {}), image_offset(image_offset) {}
};
/** Distance between wire and rail */
@@ -331,7 +328,7 @@ static const uint ELRAIL_ELEVRAISE = ELRAIL_ELEVATION + TILE_HEIGHT + 1;
/** Wires that a draw one level lower than the north corner. */
static const uint ELRAIL_ELEVLOWER = ELRAIL_ELEVATION - 1;
static const SortableSpriteStruct RailCatenarySpriteData[] = {
static const SortableSpriteStruct _rail_catenary_sprite_data[] = {
/* X direction
* Flat tiles:
* Wires */
@@ -392,18 +389,24 @@ static const SortableSpriteStruct RailCatenarySpriteData[] = {
{ WSO_EW_E, 15, 8, 3, 3, 1, ELRAIL_ELEVATION } //!33: LOWER trackbit wire, pylon on both ends
};
static const SortableSpriteStruct RailCatenarySpriteData_Depot[] = {
static const SortableSpriteStruct _rail_catenary_sprite_data_depot[] = {
{ WSO_ENTRANCE_NE, 0, 7, 15, 1, 1, ELRAIL_ELEVATION }, //! Wire for NE depot exit
{ WSO_ENTRANCE_SE, 7, 0, 1, 15, 1, ELRAIL_ELEVATION }, //! Wire for SE depot exit
{ WSO_ENTRANCE_SW, 0, 7, 15, 1, 1, ELRAIL_ELEVATION }, //! Wire for SW depot exit
{ WSO_ENTRANCE_NW, 7, 0, 1, 15, 1, ELRAIL_ELEVATION } //! Wire for NW depot exit
};
static const SortableSpriteStruct RailCatenarySpriteData_Tunnel[] = {
{ WSO_ENTRANCE_SW, 0, 7, 15, 1, 1, ELRAIL_ELEVATION }, //! Wire for NE tunnel (SW facing exit)
{ WSO_ENTRANCE_NW, 7, 0, 1, 15, 1, ELRAIL_ELEVATION }, //! Wire for SE tunnel (NW facing exit)
{ WSO_ENTRANCE_NE, 0, 7, 15, 1, 1, ELRAIL_ELEVATION }, //! Wire for SW tunnel (NE facing exit)
{ WSO_ENTRANCE_SE, 7, 0, 1, 15, 1, ELRAIL_ELEVATION } //! Wire for NW tunnel (SE facing exit)
/**
* In tunnelheads, the bounding box for wires covers nearly the full tile, and is lowered a bit.
* ELRAIL_TUNNEL_OFFSET is the difference between visual position and bounding box.
*/
static const int8_t ELRAIL_TUNNEL_OFFSET = ELRAIL_ELEVATION - BB_Z_SEPARATOR;
static const SortableSpriteStruct _rail_catenary_sprite_data_tunnel[] = {
{ WSO_ENTRANCE_SW, {{0, 0, BB_Z_SEPARATOR}, {16, 15, 1}, {0, 7, ELRAIL_TUNNEL_OFFSET}} }, //! Wire for NE tunnel (SW facing exit)
{ WSO_ENTRANCE_NW, {{0, 0, BB_Z_SEPARATOR}, {15, 16, 1}, {7, 0, ELRAIL_TUNNEL_OFFSET}} }, //! Wire for SE tunnel (NW facing exit)
{ WSO_ENTRANCE_NE, {{0, 0, BB_Z_SEPARATOR}, {16, 15, 1}, {0, 7, ELRAIL_TUNNEL_OFFSET}} }, //! Wire for SW tunnel (NE facing exit)
{ WSO_ENTRANCE_SE, {{0, 0, BB_Z_SEPARATOR}, {15, 16, 1}, {7, 0, ELRAIL_TUNNEL_OFFSET}} } //! Wire for NW tunnel (SE facing exit)
};
@@ -471,7 +474,7 @@ enum RailCatenarySprite : uint8_t {
* c) the second
* d) both
* PCP exists.*/
static const RailCatenarySprite Wires[5][TRACK_END][4] = {
static const RailCatenarySprite _rail_wires[5][TRACK_END][4] = {
{ // Tileh == 0
{INVALID_CATENARY, WIRE_X_FLAT_NE, WIRE_X_FLAT_SW, WIRE_X_FLAT_BOTH},
{INVALID_CATENARY, WIRE_Y_FLAT_SE, WIRE_Y_FLAT_NW, WIRE_Y_FLAT_BOTH},

View File

@@ -13,6 +13,8 @@
#ifndef ENGINES_H
#define ENGINES_H
#include "table/strings.h"
/**
* Writes the properties of a train into the EngineInfo struct.
* @see EngineInfo

View File

@@ -37,15 +37,15 @@ struct DrawIndustryCoordinates {
* @param p1 palette ID of ground sprite
* @param s2 sprite ID of building sprite
* @param p2 palette ID of building sprite
* @param sx coordinate x of the sprite
* @param sy coordinate y of the sprite
* @param w width of the sprite
* @param h height of the sprite
* @param dz virtual height of the sprite
* @param dx The x-position of the sprite within the tile.
* @param dy the y-position of the sprite within the tile.
* @param sx the x-extent of the sprite.
* @param sy the y-extent of the sprite.
* @param sz the z-extent of the sprite.
* @param p this allows to specify a special drawing procedure.
* @see DrawBuildingsTileStruct
*/
#define M(s1, p1, s2, p2, sx, sy, w, h, dz, p) { { s1, p1 }, { s2, p2 }, sx, sy, w, h, dz, p }
#define M(s1, p1, s2, p2, dx, dy, sx, sy, sz, p) { {{dx, dy, 0}, {sx, sy, sz}, {}}, { s1, p1 }, { s2, p2 }, p}
/** Structure for industry tiles drawing */
static const DrawBuildingsTileStruct _industry_draw_tile_data[NEW_INDUSTRYTILEOFFSET * 4] = {

View File

@@ -13,10 +13,10 @@
#include "../newgrf_roadstop.h"
/* Helper for filling property tables */
#define NIP(prop, base, variable, type, name) { name, [] (const void *b) -> const void * { return std::addressof(static_cast<const base *>(b)->variable); }, cpp_sizeof(base, variable), prop, type }
#define NIP(prop, base_class, variable, type, name) { name, [] (const void *b) -> uint32_t { return static_cast<const base_class *>(b)->variable; }, prop, type }
/* Helper for filling callback tables */
#define NIC(cb_id, base, variable, bit) { #cb_id, [] (const void *b) -> const void * { return std::addressof(static_cast<const base *>(b)->variable); }, cpp_sizeof(base, variable), bit, cb_id }
#define NIC(cb_id, base_class, variable, bit) { #cb_id, [] (const void *b) -> uint32_t { return static_cast<const base_class *>(b)->variable.base(); }, bit, cb_id }
/* Helper for filling variable tables */
#define NIV(var, name) { name, var }
@@ -60,7 +60,7 @@ static const NIVariable _niv_vehicles[] = {
NIV(0x4C, "current max speed"),
NIV(0x4D, "position in articulated vehicle"),
NIV(0x60, "count vehicle id occurrences"),
// 0x61 not useful, since it requires register 0x10F
/* 0x61 not useful, since it requires register 0x10F */
NIV(0x62, "curvature/position difference to other vehicle"),
NIV(0x63, "tile compatibility wrt. track-type"),
};
@@ -97,8 +97,8 @@ static const NICallback _nic_stations[] = {
NICS(CBID_STATION_AVAILABILITY, StationCallbackMask::Avail),
NICS(CBID_STATION_DRAW_TILE_LAYOUT, StationCallbackMask::DrawTileLayout),
NICS(CBID_STATION_BUILD_TILE_LAYOUT,std::monostate{}),
NICS(CBID_STATION_ANIM_START_STOP, std::monostate{}),
NICS(CBID_STATION_ANIM_NEXT_FRAME, StationCallbackMask::AnimationNextFrame),
NICS(CBID_STATION_ANIMATION_TRIGGER, std::monostate{}),
NICS(CBID_STATION_ANIMATION_NEXT_FRAME, StationCallbackMask::AnimationNextFrame),
NICS(CBID_STATION_ANIMATION_SPEED, StationCallbackMask::AnimationSpeed),
NICS(CBID_STATION_LAND_SLOPE_CHECK, StationCallbackMask::SlopeCheck),
};
@@ -160,8 +160,8 @@ static const NIFeature _nif_station = {
static const NICallback _nic_house[] = {
NICH(CBID_HOUSE_ALLOW_CONSTRUCTION, HouseCallbackMask::AllowConstruction),
NICH(CBID_HOUSE_ANIMATION_NEXT_FRAME, HouseCallbackMask::AnimationNextFrame),
NICH(CBID_HOUSE_ANIMATION_START_STOP, HouseCallbackMask::AnimationStartStop),
NICH(CBID_HOUSE_CONSTRUCTION_STATE_CHANGE, HouseCallbackMask::ConstructionStateChange),
NICH(CBID_HOUSE_ANIMATION_TRIGGER_TILE_LOOP, HouseCallbackMask::AnimationTriggerTileLoop),
NICH(CBID_HOUSE_ANIMATION_TRIGGER_CONSTRUCTION_STAGE_CHANGED, HouseCallbackMask::AnimationTriggerConstructionStageChanged),
NICH(CBID_HOUSE_COLOUR, HouseCallbackMask::Colour),
NICH(CBID_HOUSE_CARGO_ACCEPTANCE, HouseCallbackMask::CargoAcceptance),
NICH(CBID_HOUSE_ANIMATION_SPEED, HouseCallbackMask::AnimationSpeed),
@@ -169,14 +169,14 @@ static const NICallback _nic_house[] = {
NICH(CBID_HOUSE_ACCEPT_CARGO, HouseCallbackMask::AcceptCargo),
NICH(CBID_HOUSE_PRODUCE_CARGO, HouseCallbackMask::ProduceCargo),
NICH(CBID_HOUSE_DENY_DESTRUCTION, HouseCallbackMask::DenyDestruction),
NICH(CBID_HOUSE_WATCHED_CARGO_ACCEPTED, std::monostate{}),
NICH(CBID_HOUSE_ANIMATION_TRIGGER_WATCHED_CARGO_ACCEPTED, std::monostate{}),
NICH(CBID_HOUSE_CUSTOM_NAME, std::monostate{}),
NICH(CBID_HOUSE_DRAW_FOUNDATIONS, HouseCallbackMask::DrawFoundations),
NICH(CBID_HOUSE_AUTOSLOPE, HouseCallbackMask::Autoslope),
};
static const NIVariable _niv_house[] = {
NIV(0x40, "construction state of tile and pseudo-random value"),
NIV(0x40, "construction stage of tile and pseudo-random value"),
NIV(0x41, "age of building in years"),
NIV(0x42, "town zone"),
NIV(0x43, "terrain type"),
@@ -223,8 +223,8 @@ static const NIFeature _nif_house = {
#define NICIT(cb_id, bit) NIC(cb_id, IndustryTileSpec, callback_mask, bit)
static const NICallback _nic_industrytiles[] = {
NICIT(CBID_INDTILE_ANIM_START_STOP, std::monostate{}),
NICIT(CBID_INDTILE_ANIM_NEXT_FRAME, IndustryTileCallbackMask::AnimationNextFrame),
NICIT(CBID_INDTILE_ANIMATION_TRIGGER, std::monostate{}),
NICIT(CBID_INDTILE_ANIMATION_NEXT_FRAME, IndustryTileCallbackMask::AnimationNextFrame),
NICIT(CBID_INDTILE_ANIMATION_SPEED, IndustryTileCallbackMask::AnimationSpeed),
NICIT(CBID_INDTILE_CARGO_ACCEPTANCE, IndustryTileCallbackMask::CargoAcceptance),
NICIT(CBID_INDTILE_ACCEPT_CARGO, IndustryTileCallbackMask::AcceptCargo),
@@ -234,7 +234,7 @@ static const NICallback _nic_industrytiles[] = {
};
static const NIVariable _niv_industrytiles[] = {
NIV(0x40, "construction state of tile"),
NIV(0x40, "construction stage of tile"),
NIV(0x41, "ground type"),
NIV(0x42, "current town zone in nearest town"),
NIV(0x43, "relative position"),
@@ -270,8 +270,8 @@ static const NIFeature _nif_industrytile = {
/*** NewGRF industries ***/
#define NIP_PRODUCED_CARGO(prop, base, slot, type, name) { name, [] (const void *b) -> const void * { return std::addressof(static_cast<const base *>(b)->GetProduced(slot).cargo); }, sizeof(CargoType), prop, type }
#define NIP_ACCEPTED_CARGO(prop, base, slot, type, name) { name, [] (const void *b) -> const void * { return std::addressof(static_cast<const base *>(b)->GetAccepted(slot).cargo); }, sizeof(CargoType), prop, type }
#define NIP_PRODUCED_CARGO(prop, base_class, slot, type, name) { name, [] (const void *b) -> uint32_t { return static_cast<const base_class *>(b)->GetProduced(slot).cargo; }, prop, type }
#define NIP_ACCEPTED_CARGO(prop, base_class, slot, type, name) { name, [] (const void *b) -> uint32_t { return static_cast<const base_class *>(b)->GetAccepted(slot).cargo; }, prop, type }
static const NIProperty _nip_industries[] = {
NIP_PRODUCED_CARGO(0x25, Industry, 0, NIT_CARGO, "produced cargo 0"),
@@ -394,7 +394,7 @@ static const NIFeature _nif_industry = {
static const NICallback _nic_objects[] = {
NICO(CBID_OBJECT_LAND_SLOPE_CHECK, ObjectCallbackMask::SlopeCheck),
NICO(CBID_OBJECT_ANIMATION_NEXT_FRAME, ObjectCallbackMask::AnimationNextFrame),
NICO(CBID_OBJECT_ANIMATION_START_STOP, std::monostate{}),
NICO(CBID_OBJECT_ANIMATION_TRIGGER, std::monostate{}),
NICO(CBID_OBJECT_ANIMATION_SPEED, ObjectCallbackMask::AnimationSpeed),
NICO(CBID_OBJECT_COLOUR, ObjectCallbackMask::Colour),
NICO(CBID_OBJECT_FUND_MORE_TEXT, ObjectCallbackMask::FundMoreText),
@@ -485,8 +485,8 @@ static const NIFeature _nif_railtype = {
#define NICAT(cb_id, bit) NIC(cb_id, AirportTileSpec, callback_mask, bit)
static const NICallback _nic_airporttiles[] = {
NICAT(CBID_AIRPTILE_DRAW_FOUNDATIONS, AirportTileCallbackMask::DrawFoundations),
NICAT(CBID_AIRPTILE_ANIM_START_STOP, std::monostate{}),
NICAT(CBID_AIRPTILE_ANIM_NEXT_FRAME, AirportTileCallbackMask::AnimationNextFrame),
NICAT(CBID_AIRPTILE_ANIMATION_TRIGGER, std::monostate{}),
NICAT(CBID_AIRPTILE_ANIMATION_NEXT_FRAME, AirportTileCallbackMask::AnimationNextFrame),
NICAT(CBID_AIRPTILE_ANIMATION_SPEED, AirportTileCallbackMask::AnimationSpeed),
};
@@ -665,8 +665,8 @@ static const NIFeature _nif_tramtype = {
#define NICRS(cb_id, bit) NIC(cb_id, RoadStopSpec, callback_mask, bit)
static const NICallback _nic_roadstops[] = {
NICRS(CBID_STATION_AVAILABILITY, RoadStopCallbackMask::Avail),
NICRS(CBID_STATION_ANIM_START_STOP, std::monostate{}),
NICRS(CBID_STATION_ANIM_NEXT_FRAME, RoadStopCallbackMask::AnimationNextFrame),
NICRS(CBID_STATION_ANIMATION_TRIGGER, std::monostate{}),
NICRS(CBID_STATION_ANIMATION_NEXT_FRAME, RoadStopCallbackMask::AnimationNextFrame),
NICRS(CBID_STATION_ANIMATION_SPEED, RoadStopCallbackMask::AnimationSpeed),
};

View File

@@ -7,6 +7,8 @@
/** @file object_land.h Sprites to use and how to display them for object tiles. */
#include "table/strings.h"
#define TILE_SEQ_LINE(sz, img) { 0, 0, 0, 16, 16, sz, {img, PAL_NONE} },
static const DrawTileSeqStruct _object_transmitter_seq[] = {
@@ -104,7 +106,7 @@ static const DrawTileSpriteSpan _object_hq[] = {
#undef TILE_SPRITE_LINE
#undef TILE_SPRITE_LINE_NOTHING
#define M(name, size, build_cost_multiplier, clear_cost_multiplier, height, climate, gen_amount, flags) {{INVALID_OBJECT_CLASS, 0}, FixedGRFFileProps<2>{}, {0, 0, 0, 0}, name, climate, size, build_cost_multiplier, clear_cost_multiplier, TimerGameCalendar::Date{}, CalendarTime::MAX_DATE + 1, flags, ObjectCallbackMasks{}, height, 1, gen_amount, {}}
#define M(name, size, build_cost_multiplier, clear_cost_multiplier, height, climate, gen_amount, flags) {{INVALID_OBJECT_CLASS, 0}, StandardGRFFileProps{}, AnimationInfo<ObjectAnimationTriggers>{}, name, climate, size, build_cost_multiplier, clear_cost_multiplier, TimerGameCalendar::Date{}, CalendarTime::MAX_DATE + 1, flags, ObjectCallbackMasks{}, height, 1, gen_amount, {}}
/* Climates
* T = Temperate

View File

@@ -13,6 +13,8 @@
#ifndef RAILTYPES_H
#define RAILTYPES_H
#include "table/strings.h"
/**
* Global Railtype definition
*/
@@ -96,7 +98,7 @@ static const RailTypeInfo _original_railtypes[] = {
RailTypeLabelList(),
/* map colour */
0x0A,
PC_GREY,
/* introduction date */
CalendarTime::INVALID_DATE,
@@ -198,7 +200,7 @@ static const RailTypeInfo _original_railtypes[] = {
RailTypeLabelList(),
/* map colour */
0x0A,
PC_GREY,
/* introduction date */
CalendarTime::INVALID_DATE,
@@ -296,7 +298,7 @@ static const RailTypeInfo _original_railtypes[] = {
RailTypeLabelList(),
/* map colour */
0x0A,
PC_GREY,
/* introduction date */
CalendarTime::INVALID_DATE,
@@ -394,7 +396,7 @@ static const RailTypeInfo _original_railtypes[] = {
RailTypeLabelList(),
/* map colour */
0x0A,
PC_GREY,
/* introduction date */
CalendarTime::INVALID_DATE,

View File

@@ -13,6 +13,8 @@
#ifndef ROADTYPES_H
#define ROADTYPES_H
#include "table/strings.h"
/**
* Global Roadtype definition
*/
@@ -79,7 +81,7 @@ static const RoadTypeInfo _original_roadtypes[] = {
RoadTypeLabelList(),
/* map colour */
0x01,
PC_BLACK,
/* introduction date */
CalendarTime::MIN_DATE,
@@ -160,7 +162,7 @@ static const RoadTypeInfo _original_roadtypes[] = {
RoadTypeLabelList(),
/* map colour */
0x01,
PC_BLACK,
/* introduction date */
CalendarTime::INVALID_DATE,

View File

@@ -7,8 +7,10 @@
/** @file table/settings.h Settings to save in the savegame and config file. */
#include "table/strings.h"
/* Callback function used in _settings[] as well as _company_settings[] */
static size_t ConvertLandscape(const char *value);
static std::optional<uint32_t> ConvertLandscape(std::string_view value);
static StringID SettingTitleWallclock(const IntSettingDesc &sd);
static StringID SettingHelpWallclock(const IntSettingDesc &sd);

View File

@@ -61,7 +61,7 @@ max = CalendarTime::MAX_YEAR
[SDT_SSTR]
var = prefix
type = SLE_STRQ
def = nullptr
def = """"
[SDT_SSTR]
var = suffix

View File

@@ -10,7 +10,7 @@
[pre-amble]
const std::array<std::string, GAME_DIFFICULTY_NUM> _old_diff_settings{"max_no_competitors", "competitor_start_time", "number_towns", "industry_density", "max_loan", "initial_interest", "vehicle_costs", "competitor_speed", "competitor_intelligence", "vehicle_breakdowns", "subsidy_multiplier", "construction_cost", "terrain_type", "quantity_sea_lakes", "economy", "line_reverse_mode", "disasters", "town_council_tolerance"};
uint16_t _old_diff_custom[GAME_DIFFICULTY_NUM];
std::array<uint16_t, GAME_DIFFICULTY_NUM> _old_diff_custom;
uint8_t _old_diff_level; ///< Old difficulty level from old savegames
static void DifficultyNoiseChange(int32_t new_value);
@@ -145,7 +145,7 @@ max = 2
interval = 1
str = STR_CONFIG_SETTING_RUNNING_COSTS
strhelp = STR_CONFIG_SETTING_RUNNING_COSTS_HELPTEXT
strval = STR_SEA_LEVEL_LOW
strval = STR_CONFIG_SETTING_RUNNING_COSTS_LOW
cat = SC_BASIC
[SDT_VAR]
@@ -223,7 +223,7 @@ max = 2
interval = 1
str = STR_CONFIG_SETTING_CONSTRUCTION_COSTS
strhelp = STR_CONFIG_SETTING_CONSTRUCTION_COSTS_HELPTEXT
strval = STR_SEA_LEVEL_LOW
strval = STR_CONFIG_SETTING_CONSTRUCTION_COSTS_LOW
cat = SC_BASIC
[SDT_VAR]

View File

@@ -11,8 +11,9 @@
static void TownFoundingChanged(int32_t new_value);
static void ChangeTimekeepingUnits(int32_t new_value);
static void ChangeMinutesPerYear(int32_t new_value);
static std::tuple<int32_t, uint32_t> GetMinutesPerYearRange(const IntSettingDesc &sd);
static constexpr std::initializer_list<const char*> _place_houses{"forbidden", "allowed", "fully constructed"};
static constexpr std::initializer_list<std::string_view> _place_houses{"forbidden"sv, "allowed"sv, "fully constructed"sv};
static const SettingVariant _economy_settings_table[] = {
[post-amble]
@@ -332,6 +333,7 @@ strhelp = STR_CONFIG_SETTING_MINUTES_PER_YEAR_HELPTEXT
strval = STR_CONFIG_SETTING_MINUTES_PER_YEAR_VALUE
pre_cb = [](auto) { return _game_mode == GM_MENU || _settings_game.economy.timekeeping_units == 1; }
post_cb = ChangeMinutesPerYear
range_cb = GetMinutesPerYearRange
cat = SC_BASIC
[SDT_VAR]

View File

@@ -9,7 +9,7 @@
; Game settings are everything related to vehicles, stations, orders, etc.
[pre-amble]
static constexpr std::initializer_list<const char*> _roadsides{"left", "right"};
static constexpr std::initializer_list<std::string_view> _roadsides{"left"sv, "right"sv};
static void StationSpreadChanged(int32_t new_value);
static void UpdateConsists(int32_t new_value);

View File

@@ -17,9 +17,9 @@ static void InvalidateNewGRFChangeWindows(int32_t new_value);
static void ZoomMinMaxChanged(int32_t new_value);
static void SpriteZoomMinChanged(int32_t new_value);
static constexpr std::initializer_list<const char*> _osk_activation{"disabled", "double", "single", "immediately"};
static constexpr std::initializer_list<const char*> _savegame_date{"long", "short", "iso"};
static constexpr std::initializer_list<const char*> _right_click_close{"no", "yes", "except sticky"};
static constexpr std::initializer_list<std::string_view> _osk_activation{"disabled"sv, "double"sv, "single"sv, "immediately"sv};
static constexpr std::initializer_list<std::string_view> _savegame_date{"long"sv, "short"sv, "iso"sv};
static constexpr std::initializer_list<std::string_view> _right_click_close{"no"sv, "yes"sv, "except sticky"sv};
static const SettingVariant _gui_settings_table[] = {
[post-amble]
@@ -147,6 +147,14 @@ strhelp = STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE_HELPTEXT
strval = STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE_NO
cat = SC_BASIC
[SDTC_BOOL]
var = gui.toolbar_dropdown_autoselect
flags = SettingFlag::NotInSave, SettingFlag::NoNetworkSync
def = false
str = STR_CONFIG_SETTING_TOOLBAR_DROPDOWN_AUTOSELECT
strhelp = STR_CONFIG_SETTING_TOOLBAR_DROPDOWN_AUTOSELECT_HELPTEXT
cat = SC_BASIC
; We might need to emulate a right mouse button on mac
[SDTC_VAR]
ifdef = __APPLE__
@@ -260,9 +268,9 @@ cat = SC_EXPERT
var = gui.zoom_min
type = SLE_UINT8
flags = SettingFlag::NotInSave, SettingFlag::NoNetworkSync, SettingFlag::GuiDropdown
def = ZOOM_LVL_MIN
min = ZOOM_LVL_MIN
max = ZOOM_LVL_NORMAL
def = to_underlying(ZoomLevel::Min)
min = to_underlying(ZoomLevel::Min)
max = to_underlying(ZoomLevel::Normal)
str = STR_CONFIG_SETTING_ZOOM_MIN
strhelp = STR_CONFIG_SETTING_ZOOM_MIN_HELPTEXT
strval = STR_CONFIG_SETTING_ZOOM_LVL_MIN
@@ -273,9 +281,9 @@ startup = true
var = gui.zoom_max
type = SLE_UINT8
flags = SettingFlag::NotInSave, SettingFlag::NoNetworkSync, SettingFlag::GuiDropdown
def = ZOOM_LVL_MAX
min = ZOOM_LVL_OUT_2X
max = ZOOM_LVL_MAX
def = to_underlying(ZoomLevel::Max)
min = to_underlying(ZoomLevel::Out2x)
max = to_underlying(ZoomLevel::Max)
str = STR_CONFIG_SETTING_ZOOM_MAX
strhelp = STR_CONFIG_SETTING_ZOOM_MAX_HELPTEXT
strval = STR_CONFIG_SETTING_ZOOM_LVL_OUT_2X
@@ -286,9 +294,9 @@ startup = true
var = gui.sprite_zoom_min
type = SLE_UINT8
flags = SettingFlag::NotInSave, SettingFlag::NoNetworkSync, SettingFlag::GuiDropdown
def = ZOOM_LVL_MIN
min = ZOOM_LVL_MIN
max = ZOOM_LVL_NORMAL
def = to_underlying(ZoomLevel::Min)
min = to_underlying(ZoomLevel::Min)
max = to_underlying(ZoomLevel::Normal)
str = STR_CONFIG_SETTING_SPRITE_ZOOM_MIN
strhelp = STR_CONFIG_SETTING_SPRITE_ZOOM_MIN_HELPTEXT
strval = STR_CONFIG_SETTING_SPRITE_ZOOM_LVL_MIN

View File

@@ -5,15 +5,15 @@
;
; Locale settings as stored in the main configuration file ("openttd.cfg") and
; in the savegame PATS chunk. These settings are not sync'd over the network.
; in the savegame PATS chunk. These settings are not synced over the network.
[pre-amble]
static std::pair<StringParameter, StringParameter> SettingsValueVelocityUnit(const IntSettingDesc &sd, int32_t value);
uint8_t _old_units; ///< Old units from old savegames
static constexpr std::initializer_list<const char*> _locale_currencies{"GBP", "USD", "EUR", "JPY", "ATS", "BEF", "CHF", "CZK", "DEM", "DKK", "ESP", "FIM", "FRF", "GRD", "HUF", "ISK", "ITL", "NLG", "NOK", "PLN", "RON", "RUR", "SIT", "SEK", "TRY", "SKK", "BRL", "EEK", "LTL", "KRW", "ZAR", "custom", "GEL", "IRR", "RUB", "MXN", "NTD", "CNY", "HKD", "INR", "IDR", "MYR", "LVL", "PTE", "UAH"};
static constexpr std::initializer_list<const char*> _locale_units{"imperial", "metric", "si", "gameunits", "knots"};
static constexpr std::initializer_list<std::string_view> _locale_currencies{"GBP"sv, "USD"sv, "EUR"sv, "JPY"sv, "ATS"sv, "BEF"sv, "CHF"sv, "CZK"sv, "DEM"sv, "DKK"sv, "ESP"sv, "FIM"sv, "FRF"sv, "GRD"sv, "HUF"sv, "ISK"sv, "ITL"sv, "NLG"sv, "NOK"sv, "PLN"sv, "RON"sv, "RUR"sv, "SIT"sv, "SEK"sv, "TRY"sv, "SKK"sv, "BRL"sv, "EEK"sv, "LTL"sv, "KRW"sv, "ZAR"sv, "custom"sv, "GEL"sv, "IRR"sv, "RUB"sv, "MXN"sv, "NTD"sv, "CNY"sv, "HKD"sv, "INR"sv, "IDR"sv, "MYR"sv, "LVL"sv, "PTE"sv, "UAH"sv, "VND"sv};
static constexpr std::initializer_list<std::string_view> _locale_units{"imperial"sv, "metric"sv, "si"sv, "gameunits"sv, "knots"sv};
static_assert(_locale_currencies.size() == CURRENCY_END);
@@ -176,7 +176,7 @@ var = locale.digit_group_separator
type = SLE_STRQ
from = SLV_118
flags = SettingFlag::NoNetworkSync
def = nullptr
def = """"
post_cb = [](auto) { MarkWholeScreenDirty(); }
cat = SC_BASIC
@@ -185,7 +185,7 @@ var = locale.digit_group_separator_currency
type = SLE_STRQ
from = SLV_118
flags = SettingFlag::NoNetworkSync
def = nullptr
def = """"
post_cb = [](auto) { MarkWholeScreenDirty(); }
cat = SC_BASIC
@@ -194,6 +194,6 @@ var = locale.digit_decimal_separator
type = SLE_STRQ
from = SLV_126
flags = SettingFlag::NoNetworkSync
def = nullptr
def = """"
post_cb = [](auto) { MarkWholeScreenDirty(); }
cat = SC_BASIC

View File

@@ -10,9 +10,9 @@
[pre-amble]
extern std::string _config_language_file;
static constexpr std::initializer_list<const char*> _support8bppmodes{"no", "system", "hardware"};
static constexpr std::initializer_list<const char*> _display_opt_modes{"SHOW_TOWN_NAMES", "SHOW_STATION_NAMES", "SHOW_SIGNS", "FULL_ANIMATION", "", "FULL_DETAIL", "WAYPOINTS", "SHOW_COMPETITOR_SIGNS"};
static constexpr std::initializer_list<const char*> _facility_display_opt_modes{"TRAIN", "TRUCK_STOP", "BUS_STOP", "AIRPORT", "DOCK", "", "GHOST"};
static constexpr std::initializer_list<std::string_view> _support8bppmodes{"no"sv, "system"sv, "hardware"sv};
static constexpr std::initializer_list<std::string_view> _display_opt_modes{"SHOW_TOWN_NAMES"sv, "SHOW_STATION_NAMES"sv, "SHOW_SIGNS"sv, "FULL_ANIMATION"sv, ""sv, "FULL_DETAIL"sv, "WAYPOINTS"sv, "SHOW_COMPETITOR_SIGNS"sv};
static constexpr std::initializer_list<std::string_view> _facility_display_opt_modes{"TRAIN"sv, "TRUCK_STOP"sv, "BUS_STOP"sv, "AIRPORT"sv, "DOCK"sv, ""sv, "GHOST"sv};
#ifdef WITH_COCOA
extern bool _allow_hidpi_window;
@@ -111,48 +111,48 @@ cat = SC_BASIC
name = ""soundsset""
type = SLE_STRQ
var = BaseSounds::ini_set
def = nullptr
def = """"
cat = SC_BASIC
[SDTG_SSTR]
name = ""musicset""
type = SLE_STRQ
var = BaseMusic::ini_set
def = nullptr
def = """"
cat = SC_BASIC
[SDTG_SSTR]
name = ""videodriver""
type = SLE_STRQ
var = _ini_videodriver
def = nullptr
def = """"
cat = SC_EXPERT
[SDTG_SSTR]
name = ""musicdriver""
type = SLE_STRQ
var = _ini_musicdriver
def = nullptr
def = """"
cat = SC_EXPERT
[SDTG_SSTR]
name = ""sounddriver""
type = SLE_STRQ
var = _ini_sounddriver
def = nullptr
def = """"
cat = SC_EXPERT
[SDTG_SSTR]
name = ""blitter""
type = SLE_STRQ
var = _ini_blitter
def = nullptr
def = """"
[SDTG_SSTR]
name = ""language""
type = SLE_STR
var = _config_language_file
def = nullptr
def = """"
cat = SC_BASIC
; workaround for implicit lengthof() in SDTG_LIST
@@ -168,14 +168,14 @@ cat = SC_BASIC
name = ""screenshot_format""
type = SLE_STR
var = _screenshot_format_name
def = nullptr
def = """"
cat = SC_EXPERT
[SDTG_SSTR]
name = ""savegame_format""
type = SLE_STR
var = _savegame_format
def = nullptr
def = """"
cat = SC_EXPERT
[SDTG_BOOL]
@@ -188,28 +188,28 @@ ifdef = HAS_TRUETYPE_FONT
name = ""small_font""
type = SLE_STR
var = _fcsettings.small.font
def = nullptr
def = """"
[SDTG_SSTR]
ifdef = HAS_TRUETYPE_FONT
name = ""medium_font""
type = SLE_STR
var = _fcsettings.medium.font
def = nullptr
def = """"
[SDTG_SSTR]
ifdef = HAS_TRUETYPE_FONT
name = ""large_font""
type = SLE_STR
var = _fcsettings.large.font
def = nullptr
def = """"
[SDTG_SSTR]
ifdef = HAS_TRUETYPE_FONT
name = ""mono_font""
type = SLE_STR
var = _fcsettings.mono.font
def = nullptr
def = """"
[SDTG_VAR]
ifdef = HAS_TRUETYPE_FONT
@@ -268,13 +268,11 @@ min = 1
max = 512
cat = SC_EXPERT
[SDTG_VAR]
[SDTG_SSTR]
name = ""player_face""
type = SLE_UINT32
type = SLE_STR
var = _company_manager_face
def = 0
min = 0
max = 0xFFFFFFFF
def = """"
cat = SC_BASIC
[SDTG_VAR]
@@ -308,14 +306,14 @@ cat = SC_BASIC
name = ""keyboard""
type = SLE_STR
var = _keyboard_opt[0]
def = nullptr
def = """"
cat = SC_EXPERT
[SDTG_SSTR]
name = ""keyboard_caps""
type = SLE_STR
var = _keyboard_opt[1]
def = nullptr
def = """"
cat = SC_EXPERT
[SDTG_VAR]

View File

@@ -132,14 +132,14 @@ cat = SC_BASIC
var = music.custom_1
type = SLE_UINT8
flags = SettingFlag::NotInSave, SettingFlag::NoNetworkSync
def = nullptr
def = """"
cat = SC_BASIC
[SDTC_LIST]
var = music.custom_2
type = SLE_UINT8
flags = SettingFlag::NotInSave, SettingFlag::NoNetworkSync
def = nullptr
def = """"
cat = SC_BASIC
[SDTC_BOOL]

View File

@@ -7,8 +7,8 @@
; Network settings as stored in the private configuration file ("private.cfg").
[pre-amble]
static constexpr std::initializer_list<const char*> _use_relay_service{"never", "ask", "allow"};
static constexpr std::initializer_list<const char*> _participate_survey{"ask", "no", "yes"};
static constexpr std::initializer_list<std::string_view> _use_relay_service{"never"sv, "ask"sv, "allow"sv};
static constexpr std::initializer_list<std::string_view> _participate_survey{"ask"sv, "no"sv, "yes"sv};
static const SettingVariant _network_private_settings_table[] = {
[post-amble]
@@ -47,7 +47,7 @@ var = network.client_name
type = SLE_STR
length = NETWORK_CLIENT_NAME_LENGTH
flags = SettingFlag::NotInSave, SettingFlag::NoNetworkSync
def = nullptr
def = """"
pre_cb = NetworkValidateClientName
post_cb = NetworkUpdateClientName
cat = SC_BASIC
@@ -57,7 +57,7 @@ var = network.server_name
type = SLE_STR
length = NETWORK_NAME_LENGTH
flags = SettingFlag::NotInSave, SettingFlag::NoNetworkSync, SettingFlag::NetworkOnly
def = nullptr
def = """"
pre_cb = NetworkValidateServerName
post_cb = [](auto) { UpdateClientConfigValues(); }
cat = SC_BASIC
@@ -67,7 +67,7 @@ var = network.connect_to_ip
type = SLE_STR
length = 0
flags = SettingFlag::NotInSave, SettingFlag::NoNetworkSync
def = nullptr
def = """"
[SDTC_SSTR]
var = network.last_joined

View File

@@ -39,7 +39,7 @@ var = network.server_password
type = SLE_STR
length = NETWORK_PASSWORD_LENGTH
flags = SettingFlag::NotInSave, SettingFlag::NoNetworkSync, SettingFlag::NetworkOnly
def = nullptr
def = """"
pre_cb = ReplaceAsteriskWithEmptyPassword
post_cb = [](auto) { NetworkServerUpdateGameInfo(); }
cat = SC_BASIC
@@ -49,7 +49,7 @@ var = network.rcon_password
type = SLE_STR
length = NETWORK_PASSWORD_LENGTH
flags = SettingFlag::NotInSave, SettingFlag::NoNetworkSync, SettingFlag::NetworkOnly
def = nullptr
def = """"
pre_cb = ReplaceAsteriskWithEmptyPassword
cat = SC_BASIC
@@ -58,7 +58,7 @@ var = network.admin_password
type = SLE_STR
length = NETWORK_PASSWORD_LENGTH
flags = SettingFlag::NotInSave, SettingFlag::NoNetworkSync, SettingFlag::NetworkOnly
def = nullptr
def = """"
cat = SC_BASIC
[SDTC_SSTR]
@@ -66,7 +66,7 @@ var = network.client_secret_key
type = SLE_STR
length = NETWORK_SECRET_KEY_LENGTH
flags = SettingFlag::NotInSave, SettingFlag::NoNetworkSync
def = nullptr
def = """"
; Prevent the user from setting the secret key from the console using 'setting'
pre_cb = [](auto) { return false; }
@@ -75,7 +75,7 @@ var = network.client_public_key
type = SLE_STR
length = NETWORK_SECRET_KEY_LENGTH
flags = SettingFlag::NotInSave, SettingFlag::NoNetworkSync
def = nullptr
def = """"
; Prevent the user from setting the public key from the console using 'setting'
pre_cb = [](auto) { return false; }
@@ -84,11 +84,11 @@ var = network.server_invite_code
type = SLE_STR
length = NETWORK_INVITE_CODE_LENGTH
flags = SettingFlag::NotInSave, SettingFlag::NoNetworkSync, SettingFlag::NetworkOnly
def = nullptr
def = """"
[SDTC_SSTR]
var = network.server_invite_code_secret
type = SLE_STR
length = NETWORK_INVITE_CODE_SECRET_LENGTH
flags = SettingFlag::NotInSave, SettingFlag::NoNetworkSync, SettingFlag::NetworkOnly
def = nullptr
def = """"

View File

@@ -10,7 +10,7 @@
static void UpdateClientConfigValues();
void ChangeNetworkRestartTime(bool reset);
static constexpr std::initializer_list<const char*> _server_game_type{"local", "public", "invite-only"};
static constexpr std::initializer_list<std::string_view> _server_game_type{"local"sv, "public"sv, "invite-only"sv};
static const SettingVariant _network_settings_table[] = {
[post-amble]

View File

@@ -7,7 +7,7 @@
; News display settings as stored in the main configuration file ("openttd.cfg").
[pre-amble]
static constexpr std::initializer_list<const char*> _news_display{ "off", "summarized", "full"};
static constexpr std::initializer_list<std::string_view> _news_display{"off"sv, "summarized"sv, "full"sv};
static const SettingVariant _news_display_settings_table[] = {
[post-amble]

View File

@@ -14,8 +14,8 @@
; be saved in their new place.
[pre-amble]
static constexpr std::initializer_list<const char*> _town_names{"english", "french", "german", "american", "latin", "silly", "swedish", "dutch", "finnish", "polish", "slovak", "norwegian", "hungarian", "austrian", "romanian", "czech", "swiss", "danish", "turkish", "italian", "catalan"};
static constexpr std::initializer_list<const char*> _climates{"temperate", "arctic", "tropic", "toyland"};
static constexpr std::initializer_list<std::string_view> _town_names{"english"sv, "french"sv, "german"sv, "american"sv, "latin"sv, "silly"sv, "swedish"sv, "dutch"sv, "finnish"sv, "polish"sv, "slovak"sv, "norwegian"sv, "hungarian"sv, "austrian"sv, "romanian"sv, "czech"sv, "swiss"sv, "danish"sv, "turkish"sv, "italian"sv, "catalan"sv};
static constexpr std::initializer_list<std::string_view> _climates{"temperate"sv, "arctic"sv, "tropic"sv, "toyland"sv};
static const SettingVariant _old_gameopt_settings_table[] = {
/* In version 4 a new difficulty setting has been added to the difficulty settings,
@@ -75,7 +75,7 @@ type = SLE_FILE_I16 | SLE_VAR_U16
flags = SettingFlag::NotInConfig
var = _old_diff_custom
length = 17
def = nullptr
def = """"
to = SLV_4
[SDTG_LIST]
@@ -86,7 +86,7 @@ type = SLE_UINT16
flags = SettingFlag::NotInConfig
var = _old_diff_custom
length = 18
def = nullptr
def = """"
full = nullptr
from = SLV_4

View File

@@ -54,7 +54,7 @@ static const SpriteID SPR_LARGE_SMALL_WINDOW = 682;
/** Extra graphic spritenumbers */
static const SpriteID SPR_OPENTTD_BASE = 4896;
static const uint16_t OPENTTD_SPRITE_COUNT = 191;
static const uint16_t OPENTTD_SPRITE_COUNT = 192;
/* Halftile-selection sprites */
static const SpriteID SPR_HALFTILE_SELECTION_FLAT = SPR_OPENTTD_BASE;
@@ -153,7 +153,7 @@ static const SpriteID SPR_GROUP_LIVERY_SHIP = SPR_OPENTTD_BASE + 177;
static const SpriteID SPR_GROUP_LIVERY_AIRCRAFT = SPR_OPENTTD_BASE + 178;
static const SpriteID SPR_TOWN_RATING_NA = SPR_OPENTTD_BASE + 162;
static const SpriteID SPR_TOWN_RATING_APALLING = SPR_OPENTTD_BASE + 163;
static const SpriteID SPR_TOWN_RATING_APPALLING = SPR_OPENTTD_BASE + 163;
static const SpriteID SPR_TOWN_RATING_MEDIOCRE = SPR_OPENTTD_BASE + 164;
static const SpriteID SPR_TOWN_RATING_GOOD = SPR_OPENTTD_BASE + 165;
@@ -172,6 +172,8 @@ static const SpriteID SPR_JOIN = SPR_OPENTTD_BASE + 188;
static const SpriteID SPR_PLAYER_SELF = SPR_OPENTTD_BASE + 189;
static const SpriteID SPR_PLAYER_HOST = SPR_OPENTTD_BASE + 190;
static const SpriteID SPR_EXTRA_MENU = SPR_OPENTTD_BASE + 191;
static const SpriteID SPR_IMG_CARGOFLOW = SPR_OPENTTD_BASE + 174;
static const SpriteID SPR_SIGNALS_BASE = SPR_OPENTTD_BASE + OPENTTD_SPRITE_COUNT;

View File

@@ -657,13 +657,13 @@ static const DrawTileSeqStruct _station_display_datas_road_waypoint_Y[] = {
};
static const DrawTileSeqStruct _station_display_datas_waypoint_X[] = {
TILE_SEQ_LINE( 0, 0, 0, 16, 5, 23, SPR_WAYPOINT_X_1 | (1U << PALETTE_MODIFIER_COLOUR))
TILE_SEQ_LINE( 0, 11, 0, 16, 5, 23, SPR_WAYPOINT_X_2 | (1U << PALETTE_MODIFIER_COLOUR))
TILE_SEQ_LINE( 0, 0, 0, 16, 5, 16, SPR_WAYPOINT_X_1 | (1U << PALETTE_MODIFIER_COLOUR))
TILE_SEQ_LINE( 0, 11, 0, 16, 5, 16, SPR_WAYPOINT_X_2 | (1U << PALETTE_MODIFIER_COLOUR))
};
static const DrawTileSeqStruct _station_display_datas_waypoint_Y[] = {
TILE_SEQ_LINE( 0, 0, 0, 5, 16, 23, SPR_WAYPOINT_Y_1 | (1U << PALETTE_MODIFIER_COLOUR))
TILE_SEQ_LINE(11, 0, 0, 5, 16, 23, SPR_WAYPOINT_Y_2 | (1U << PALETTE_MODIFIER_COLOUR))
TILE_SEQ_LINE( 0, 0, 0, 5, 16, 16, SPR_WAYPOINT_Y_1 | (1U << PALETTE_MODIFIER_COLOUR))
TILE_SEQ_LINE(11, 0, 0, 5, 16, 16, SPR_WAYPOINT_Y_2 | (1U << PALETTE_MODIFIER_COLOUR))
};
#undef TILE_SEQ_LINE
@@ -902,3 +902,53 @@ static const std::array<std::span<const DrawTileSpriteSpan>, to_underlying(Stati
_station_display_datas_waypoint,
_station_display_datas_road_waypoint,
}};
static const BridgeableTileInfo _station_bridgeable_info_rail[] = {
{2, {BridgePillarFlag::EdgeSW, BridgePillarFlag::EdgeNE}}, // X-axis empty platform.
{2, {BridgePillarFlag::EdgeNW, BridgePillarFlag::EdgeSE}}, // Y-axis empty platform.
{2, {BridgePillarFlag::EdgeSW, BridgePillarFlag::EdgeNE}}, // X-axis small building.
{2, {BridgePillarFlag::EdgeNW, BridgePillarFlag::EdgeSE}}, // Y-axis small building.
{5, {BridgePillarFlag::EdgeSW, BridgePillarFlag::EdgeNE, BridgePillarFlag::EdgeSE, BridgePillarFlag::CornerE, BridgePillarFlag::CornerS}}, // X large building north.
{5, {BridgePillarFlag::EdgeNW, BridgePillarFlag::EdgeSE, BridgePillarFlag::EdgeSW, BridgePillarFlag::CornerS, BridgePillarFlag::CornerW}}, // Y large building north.
{5, {BridgePillarFlag::EdgeSW, BridgePillarFlag::EdgeNE, BridgePillarFlag::EdgeNW, BridgePillarFlag::CornerN, BridgePillarFlag::CornerW}}, // X large building south.
{5, {BridgePillarFlag::EdgeNW, BridgePillarFlag::EdgeSE, BridgePillarFlag::EdgeNE, BridgePillarFlag::CornerN, BridgePillarFlag::CornerE}}, // Y large building south.
};
static const BridgeableTileInfo _station_bridgeable_info_waypoint[] = {
{2, {BridgePillarFlag::EdgeSW, BridgePillarFlag::EdgeNE}}, // X-axis waypoint.
{2, {BridgePillarFlag::EdgeNW, BridgePillarFlag::EdgeSE}}, // Y-axis waypoint.
};
static const BridgeableTileInfo _station_bridgeable_info_buoy[] = {
{1, {}},
};
static const BridgeableTileInfo _station_bridgeable_info_roadstop[] = {
{2, {BridgePillarFlag::EdgeNE}}, // NE bay.
{2, {BridgePillarFlag::EdgeSE}}, // SE bay.
{2, {BridgePillarFlag::EdgeSW}}, // SW bay.
{2, {BridgePillarFlag::EdgeNW}}, // NW bay.
{2, {BridgePillarFlag::EdgeSW, BridgePillarFlag::EdgeNE}}, // X-axis drive-through.
{2, {BridgePillarFlag::EdgeNW, BridgePillarFlag::EdgeSE}}, // Y-axis drive-through.
};
static const BridgeableTileInfo _station_bridgeable_info_road_waypoint[] = {
{}, // NE bay (unused)
{}, // SE bay (unused)
{}, // SW bay (unused)
{}, // NW bay (unused)
{2, {BridgePillarFlag::EdgeSW, BridgePillarFlag::EdgeNE}}, // X-axis waypoint.
{2, {BridgePillarFlag::EdgeNW, BridgePillarFlag::EdgeSE}}, // Y-axis waypoint.
};
static const std::array<std::span<const BridgeableTileInfo>, to_underlying(StationType::End)> _station_bridgeable_info = {{
_station_bridgeable_info_rail, // Rail
{}, // Airport
_station_bridgeable_info_roadstop, // Truck
_station_bridgeable_info_roadstop, // Bus
{}, // Oilrig
{}, // Dock
_station_bridgeable_info_buoy, // Buoy
_station_bridgeable_info_waypoint, // RailWaypoint
_station_bridgeable_info_road_waypoint, // RoadWaypoint
}};

View File

@@ -17,7 +17,7 @@ enum class CmdFlag : uint8_t {
using CmdFlags = EnumBitSet<CmdFlag, uint8_t>;
class StringBuilder;
typedef void (*ParseCmdProc)(StringBuilder &builder, const char *buf, char32_t value);
typedef void (*ParseCmdProc)(StringBuilder &builder, std::string_view param, char32_t value);
struct CmdStruct {
std::string_view cmd;
@@ -28,9 +28,9 @@ struct CmdStruct {
CmdFlags flags;
};
extern void EmitSingleChar(StringBuilder &builder, const char *buf, char32_t value);
extern void EmitPlural(StringBuilder &builder, const char *buf, char32_t value);
extern void EmitGender(StringBuilder &builder, const char *buf, char32_t value);
extern void EmitSingleChar(StringBuilder &builder, std::string_view param, char32_t value);
extern void EmitPlural(StringBuilder &builder, std::string_view param, char32_t value);
extern void EmitGender(StringBuilder &builder, std::string_view param, char32_t value);
static const CmdStruct _cmd_structs[] = {
/* Font size */
@@ -142,9 +142,12 @@ static const CmdStruct _cmd_structs[] = {
{"DOWN_ARROW", EmitSingleChar, SCC_DOWN_ARROW, 0, std::nullopt, {CmdFlag::DontCount}},
{"CHECKMARK", EmitSingleChar, SCC_CHECKMARK, 0, std::nullopt, {CmdFlag::DontCount}},
{"CROSS", EmitSingleChar, SCC_CROSS, 0, std::nullopt, {CmdFlag::DontCount}},
{"LEFT_ARROW", EmitSingleChar, SCC_LEFT_ARROW, 0, std::nullopt, {CmdFlag::DontCount}},
{"RIGHT_ARROW", EmitSingleChar, SCC_RIGHT_ARROW, 0, std::nullopt, {CmdFlag::DontCount}},
{"SMALL_LEFT_ARROW", EmitSingleChar, SCC_LESS_THAN, 0, std::nullopt, {CmdFlag::DontCount}},
{"SMALL_RIGHT_ARROW", EmitSingleChar, SCC_GREATER_THAN, 0, std::nullopt, {CmdFlag::DontCount}},
{"TOWN_ICON", EmitSingleChar, SCC_TOWN, 0, std::nullopt, {CmdFlag::DontCount}},
{"CITY_ICON", EmitSingleChar, SCC_CITY, 0, std::nullopt, {CmdFlag::DontCount}},
/* The following are directional formatting codes used to get the RTL strings right:
* http://www.unicode.org/unicode/reports/tr9/#Directional_Formatting_Codes */
@@ -160,8 +163,8 @@ static const CmdStruct _cmd_structs[] = {
/** Description of a plural form */
struct PluralForm {
size_t plural_count; ///< The number of plural forms
const char *description; ///< Human readable description of the form
const char *names; ///< Plural names
std::string_view description; ///< Human readable description of the form
std::string_view names; ///< Plural names
};
/** The maximum number of plurals. */
@@ -199,7 +202,7 @@ static const PluralForm _plural_forms[] = {
* a = array, i.e. list of strings
*/
/** All pragmas used */
static const char * const _pragmas[][4] = {
static const std::string_view _pragmas[][4] = {
/* name flags default description */
{ "name", "0", "", "English name for the language" },
{ "ownname", "t", "", "Localised name for the language" },

View File

@@ -8,22 +8,22 @@
/** @file string_colours.h The colour translation of GRF's strings. */
/** Colour mapping for #TextColour. */
static const uint8_t _string_colourmap[17] = {
150, // TC_BLUE
12, // TC_SILVER
189, // TC_GOLD
184, // TC_RED
174, // TC_PURPLE
30, // TC_LIGHT_BROWN
195, // TC_ORANGE
209, // TC_GREEN
68, // TC_YELLOW
95, // TC_DARK_GREEN
79, // TC_CREAM
116, // TC_BROWN
15, // TC_WHITE
152, // TC_LIGHT_BLUE
6, // TC_GREY
133, // TC_DARK_BLUE
1, // TC_BLACK
static constexpr PixelColour _string_colourmap[17] = {
PixelColour{150}, // TC_BLUE
PixelColour{ 12}, // TC_SILVER
PixelColour{189}, // TC_GOLD
PixelColour{184}, // TC_RED
PixelColour{174}, // TC_PURPLE
PixelColour{ 30}, // TC_LIGHT_BROWN
PixelColour{195}, // TC_ORANGE
PixelColour{209}, // TC_GREEN
PixelColour{ 68}, // TC_YELLOW
PixelColour{ 95}, // TC_DARK_GREEN
PixelColour{ 79}, // TC_CREAM
PixelColour{116}, // TC_BROWN
PixelColour{ 15}, // TC_WHITE
PixelColour{152}, // TC_LIGHT_BLUE
PixelColour{ 6}, // TC_GREY
PixelColour{133}, // TC_DARK_BLUE
PixelColour{ 1}, // TC_BLACK
};

View File

@@ -13,15 +13,15 @@
* @param p1 The first sprite's palette of the building, mostly the ground sprite
* @param s2 The second sprite of the building.
* @param p2 The second sprite's palette of the building.
* @param sx The x-position of the sprite within the tile
* @param sy the y-position of the sprite within the tile
* @param w the width of the sprite
* @param h the height of the sprite
* @param dz the virtual height of the sprite
* @param dx The x-position of the sprite within the tile.
* @param dy the y-position of the sprite within the tile.
* @param sx the x-extent of the sprite.
* @param sy the y-extent of the sprite.
* @param sz the z-extent of the sprite.
* @param p set to 1 if a lift is present ()
* @see DrawBuildingsTileStruct
*/
#define M(s1, p1, s2, p2, sx, sy, w, h, dz, p) { { s1, p1 }, { s2, p2 }, sx, sy, w, h, dz, p}
#define M(s1, p1, s2, p2, dx, dy, sx, sy, sz, p) { {{dx, dy, 0}, {sx, sy, sz}, {}}, { s1, p1 }, { s2, p2 }, p}
/** structure of houses graphics*/
extern const DrawBuildingsTileStruct _town_draw_tile_data[] = {
@@ -1813,8 +1813,8 @@ static_assert(lengthof(_town_draw_tile_data) == (NEW_HOUSE_OFFSET) * 4 * 4);
{TimerGameCalendar::Year{mnd}, TimerGameCalendar::Year{mxd}, p, rc, bn, rr, mg, \
{ca1, ca2, ca3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, \
{INVALID_CARGO, INVALID_CARGO, INVALID_CARGO, INVALID_CARGO, INVALID_CARGO, INVALID_CARGO, INVALID_CARGO, INVALID_CARGO, INVALID_CARGO, INVALID_CARGO, INVALID_CARGO, INVALID_CARGO, INVALID_CARGO, INVALID_CARGO, INVALID_CARGO, INVALID_CARGO}, \
bf, ba, true, GRFFileProps(INVALID_HOUSE_ID), HouseCallbackMasks{}, {COLOUR_BEGIN, COLOUR_BEGIN, COLOUR_BEGIN, COLOUR_BEGIN}, \
16, HouseExtraFlags{}, HOUSE_NO_CLASS, {0, 2, 0, 0}, 0, 0, 0, {}, {cg1, cg2, cg3}, }
bf, ba, true, SubstituteGRFFileProps(INVALID_HOUSE_ID), HouseCallbackMasks{}, {COLOUR_BEGIN, COLOUR_BEGIN, COLOUR_BEGIN, COLOUR_BEGIN}, \
16, HouseExtraFlags{}, HOUSE_NO_CLASS, AnimationInfo<void>{}, 0, 0, 0, {}, {cg1, cg2, cg3}, }
/** House specifications from original data */
extern const HouseSpec _original_house_specs[NEW_HOUSE_OFFSET] = {
/**
@@ -1834,443 +1834,443 @@ extern const HouseSpec _original_house_specs[NEW_HOUSE_OFFSET] = {
*/
MS(1963, CalendarTime::MAX_YEAR, 187, 150, STR_TOWN_BUILDING_NAME_TALL_OFFICE_BLOCK_1, 140, 70, 8, 3, 4,
BuildingFlag::Size1x1,
HZ_TEMP | HZ_ZON5,
HouseZones({HouseZone::ClimateTemperate, HouseZone::TownCentre}),
CT_PASSENGERS, CT_MAIL, CT_GOODS), // 00
MS(1957, CalendarTime::MAX_YEAR, 85, 140, STR_TOWN_BUILDING_NAME_OFFICE_BLOCK_1, 130, 55, 8, 3, 4,
BuildingFlag::Size1x1,
HZ_TEMP | HZ_ZON5 | HZ_ZON4,
HouseZones({HouseZone::ClimateTemperate, HouseZone::TownCentre, HouseZone::TownInnerSuburb}),
CT_PASSENGERS, CT_MAIL, CT_GOODS), // 01
MS(1968, CalendarTime::MAX_YEAR, 40, 100, STR_TOWN_BUILDING_NAME_SMALL_BLOCK_OF_FLATS_1, 90, 20, 8, 3, 1,
BuildingFlag::Size1x1,
HZ_TEMP | HZ_ZON4 | HZ_ZON3 | HZ_ZON2,
HouseZones({HouseZone::ClimateTemperate, HouseZone::TownInnerSuburb, HouseZone::TownOuterSuburb, HouseZone::TownOutskirt}),
CT_PASSENGERS, CT_MAIL, CT_GOODS), // 02
MS( 0, CalendarTime::MAX_YEAR, 5, 90, STR_TOWN_BUILDING_NAME_CHURCH_1, 230, 2, 2, 0, 0,
BuildingFlags({BuildingFlag::IsChurch, BuildingFlag::Size1x1}),
HZ_TEMP | HZ_ZON4 | HZ_ZON3 | HZ_ZON2 | HZ_ZON1,
HouseZones({HouseZone::ClimateTemperate, HouseZone::TownInnerSuburb, HouseZone::TownOuterSuburb, HouseZone::TownOutskirt, HouseZone::TownEdge}),
CT_PASSENGERS, CT_MAIL, CT_GOODS), // 03
MS(1975, CalendarTime::MAX_YEAR, 220, 160, STR_TOWN_BUILDING_NAME_LARGE_OFFICE_BLOCK_1, 160, 85, 10, 4, 6,
BuildingFlags({BuildingFlag::IsAnimated, BuildingFlag::Size1x1}),
HZ_TEMP | HZ_SUBARTC_BELOW | HZ_SUBTROPIC | HZ_ZON5,
HouseZones({HouseZone::ClimateTemperate, HouseZone::ClimateSubarcticBelowSnow, HouseZone::ClimateSubtropic, HouseZone::TownCentre}),
CT_PASSENGERS, CT_MAIL, CT_GOODS), // 04
MS(1975, CalendarTime::MAX_YEAR, 220, 160, STR_TOWN_BUILDING_NAME_LARGE_OFFICE_BLOCK_1, 160, 85, 10, 4, 6,
BuildingFlags({BuildingFlag::IsAnimated, BuildingFlag::Size1x1}),
HZ_SUBARTC_ABOVE | HZ_ZON5,
HouseZones({HouseZone::ClimateSubarcticAboveSnow, HouseZone::TownCentre}),
CT_PASSENGERS, CT_MAIL, CT_GOODS), // 05
MS( 0, CalendarTime::MAX_YEAR, 30, 80, STR_TOWN_BUILDING_NAME_TOWN_HOUSES_1, 80, 12, 4, 1, 0,
BuildingFlag::Size1x1,
HZ_TEMP | HZ_ZON4 | HZ_ZON3 | HZ_ZON2 | HZ_ZON1,
HouseZones({HouseZone::ClimateTemperate, HouseZone::TownInnerSuburb, HouseZone::TownOuterSuburb, HouseZone::TownOutskirt, HouseZone::TownEdge}),
CT_PASSENGERS, CT_MAIL, CT_GOODS), // 06
MS(1959, CalendarTime::MAX_YEAR, 140, 180, STR_TOWN_BUILDING_NAME_HOTEL_1, 150, 22, 6, 1, 2,
BuildingFlag::Size1x2,
HZ_TEMP | HZ_ZON5 | HZ_ZON3,
HouseZones({HouseZone::ClimateTemperate, HouseZone::TownCentre, HouseZone::TownOuterSuburb}),
CT_PASSENGERS, CT_MAIL, CT_GOODS), // 07
MS(1959, CalendarTime::MAX_YEAR, 0, 180, STR_TOWN_BUILDING_NAME_HOTEL_1, 150, 22, 6, 1, 2,
{},
HZ_NOZNS,
{},
CT_PASSENGERS, CT_MAIL, CT_GOODS), // 08
MS(1945, CalendarTime::MAX_YEAR, 0, 65, STR_TOWN_BUILDING_NAME_STATUE_1, 40, 0, 2, 0, 0,
BuildingFlag::Size1x1,
HZ_TEMP | HZ_SUBARTC_BELOW | HZ_SUBTROPIC | HZ_ZON5 | HZ_ZON4,
HouseZones({HouseZone::ClimateTemperate, HouseZone::ClimateSubarcticBelowSnow, HouseZone::ClimateSubtropic, HouseZone::TownCentre, HouseZone::TownInnerSuburb}),
CT_PASSENGERS, CT_MAIL, CT_GOODS), // 09
MS(1945, CalendarTime::MAX_YEAR, 0, 65, STR_TOWN_BUILDING_NAME_FOUNTAIN_1, 40, 0, 2, 0, 0,
BuildingFlag::Size1x1,
HZ_TEMP | HZ_SUBARTC_BELOW | HZ_SUBTROPIC | HZ_ZON5,
HouseZones({HouseZone::ClimateTemperate, HouseZone::ClimateSubarcticBelowSnow, HouseZone::ClimateSubtropic, HouseZone::TownCentre}),
CT_PASSENGERS, CT_MAIL, CT_GOODS), // 0A
MS( 0, CalendarTime::MAX_YEAR, 0, 60, STR_TOWN_BUILDING_NAME_PARK_1, 75, 0, 2, 0, 0,
BuildingFlag::Size1x1,
HZ_TEMP | HZ_ZON3,
HouseZones({HouseZone::ClimateTemperate, HouseZone::TownOuterSuburb}),
CT_PASSENGERS, CT_MAIL, CT_GOODS), // 0B
MS(1935, CalendarTime::MAX_YEAR, 0, 60, STR_TOWN_BUILDING_NAME_PARK_1, 75, 0, 2, 0, 0,
BuildingFlag::Size1x1,
HZ_TEMP | HZ_ZON4,
HouseZones({HouseZone::ClimateTemperate, HouseZone::TownInnerSuburb}),
CT_PASSENGERS, CT_MAIL, CT_GOODS), // 0C
MS(1951, CalendarTime::MAX_YEAR, 150, 130, STR_TOWN_BUILDING_NAME_OFFICE_BLOCK_2, 110, 65, 8, 2, 4,
BuildingFlag::Size1x1,
HZ_TEMP | HZ_ZON5 | HZ_ZON4,
HouseZones({HouseZone::ClimateTemperate, HouseZone::TownCentre, HouseZone::TownInnerSuburb}),
CT_PASSENGERS, CT_MAIL, CT_GOODS), // 0D
MS(1930, 1960, 95, 110, STR_TOWN_BUILDING_NAME_SHOPS_AND_OFFICES_1, 100, 48, 6, 2, 3,
BuildingFlag::Size1x1,
HZ_TEMP | HZ_ZON5 | HZ_ZON4 | HZ_ZON3,
HouseZones({HouseZone::ClimateTemperate, HouseZone::TownCentre, HouseZone::TownInnerSuburb, HouseZone::TownOuterSuburb}),
CT_PASSENGERS, CT_MAIL, CT_GOODS), // 0E
MS(1930, 1960, 95, 105, STR_TOWN_BUILDING_NAME_SHOPS_AND_OFFICES_1, 100, 48, 6, 2, 3,
BuildingFlag::Size1x1,
HZ_TEMP | HZ_ZON5 | HZ_ZON4 | HZ_ZON3,
HouseZones({HouseZone::ClimateTemperate, HouseZone::TownCentre, HouseZone::TownInnerSuburb, HouseZone::TownOuterSuburb}),
CT_PASSENGERS, CT_MAIL, CT_GOODS), // 0F
MS(1930, 1960, 95, 107, STR_TOWN_BUILDING_NAME_SHOPS_AND_OFFICES_1, 100, 48, 6, 2, 3,
BuildingFlag::Size1x1,
HZ_TEMP | HZ_ZON5 | HZ_ZON4 | HZ_ZON3,
HouseZones({HouseZone::ClimateTemperate, HouseZone::TownCentre, HouseZone::TownInnerSuburb, HouseZone::TownOuterSuburb}),
CT_PASSENGERS, CT_MAIL, CT_GOODS), // 10
MS(1977, CalendarTime::MAX_YEAR, 130, 200, STR_TOWN_BUILDING_NAME_MODERN_OFFICE_BUILDING_1, 150, 50, 10, 3, 6,
BuildingFlag::Size1x1,
HZ_TEMP | HZ_SUBARTC_BELOW | HZ_SUBTROPIC | HZ_ZON5,
HouseZones({HouseZone::ClimateTemperate, HouseZone::ClimateSubarcticBelowSnow, HouseZone::ClimateSubtropic, HouseZone::TownCentre}),
CT_PASSENGERS, CT_MAIL, CT_GOODS), // 11
MS(1983, CalendarTime::MAX_YEAR, 6, 145, STR_TOWN_BUILDING_NAME_WAREHOUSE_1, 110, 10, 6, 3, 8,
BuildingFlag::Size1x1,
HZ_TEMP | HZ_ZON5,
HouseZones({HouseZone::ClimateTemperate, HouseZone::TownCentre}),
CT_PASSENGERS, CT_MAIL, CT_GOODS), // 12
MS(1985, CalendarTime::MAX_YEAR, 110, 155, STR_TOWN_BUILDING_NAME_OFFICE_BLOCK_3, 110, 55, 6, 2, 6,
BuildingFlag::Size1x1,
HZ_TEMP | HZ_ZON5,
HouseZones({HouseZone::ClimateTemperate, HouseZone::TownCentre}),
CT_PASSENGERS, CT_MAIL, CT_GOODS), // 13
MS( 0, CalendarTime::MAX_YEAR, 65, 250, STR_TOWN_BUILDING_NAME_STADIUM_1, 300, 5, 4, 0, 0,
BuildingFlags({BuildingFlag::IsStadium, BuildingFlag::Size2x2}),
HZ_TEMP | HZ_ZON4 | HZ_ZON3 | HZ_ZON2 | HZ_ZON1,
HouseZones({HouseZone::ClimateTemperate, HouseZone::TownInnerSuburb, HouseZone::TownOuterSuburb, HouseZone::TownOutskirt, HouseZone::TownEdge}),
CT_PASSENGERS, CT_MAIL, CT_GOODS), // 14
MS( 0, CalendarTime::MAX_YEAR, 0, 250, STR_TOWN_BUILDING_NAME_STADIUM_1, 300, 5, 4, 0, 0,
{},
HZ_NOZNS,
{},
CT_PASSENGERS, CT_MAIL, CT_GOODS), // 15
MS( 0, CalendarTime::MAX_YEAR, 0, 250, STR_TOWN_BUILDING_NAME_STADIUM_1, 300, 5, 4, 0, 0,
{},
HZ_NOZNS,
{},
CT_PASSENGERS, CT_MAIL, CT_GOODS), // 16
MS( 0, CalendarTime::MAX_YEAR, 0, 250, STR_TOWN_BUILDING_NAME_STADIUM_1, 300, 5, 4, 0, 0,
{},
HZ_NOZNS,
{},
CT_PASSENGERS, CT_MAIL, CT_GOODS), // 17
MS( 0, 1951, 15, 70, STR_TOWN_BUILDING_NAME_OLD_HOUSES_1, 75, 6, 3, 1, 0,
BuildingFlag::Size1x1,
HZ_TEMP | HZ_ZON2 | HZ_ZON1,
HouseZones({HouseZone::ClimateTemperate, HouseZone::TownOutskirt, HouseZone::TownEdge}),
CT_PASSENGERS, CT_MAIL, CT_GOODS), // 18
MS( 0, 1952, 12, 75, STR_TOWN_BUILDING_NAME_COTTAGES_1, 75, 7, 3, 1, 0,
BuildingFlag::Size1x1,
HZ_TEMP | HZ_ZON1,
HouseZones({HouseZone::ClimateTemperate, HouseZone::TownEdge}),
CT_PASSENGERS, CT_MAIL, CT_GOODS), // 19
MS(1931, CalendarTime::MAX_YEAR, 13, 71, STR_TOWN_BUILDING_NAME_HOUSES_1, 75, 8, 3, 1, 0,
BuildingFlag::Size1x1,
HZ_TEMP | HZ_ZON4 | HZ_ZON3 | HZ_ZON2 | HZ_ZON1,
HouseZones({HouseZone::ClimateTemperate, HouseZone::TownInnerSuburb, HouseZone::TownOuterSuburb, HouseZone::TownOutskirt, HouseZone::TownEdge}),
CT_PASSENGERS, CT_MAIL, CT_GOODS), // 1A
MS(1935, CalendarTime::MAX_YEAR, 100, 135, STR_TOWN_BUILDING_NAME_FLATS_1, 100, 35, 7, 2, 2,
BuildingFlag::Size1x1,
HZ_TEMP | HZ_ZON5 | HZ_ZON4 | HZ_ZON3,
HouseZones({HouseZone::ClimateTemperate, HouseZone::TownCentre, HouseZone::TownInnerSuburb, HouseZone::TownOuterSuburb}),
CT_PASSENGERS, CT_MAIL, CT_GOODS), // 1B
MS(1963, CalendarTime::MAX_YEAR, 170, 145, STR_TOWN_BUILDING_NAME_TALL_OFFICE_BLOCK_2, 170, 50, 8, 3, 3,
BuildingFlag::Size1x1,
HZ_TEMP | HZ_ZON5 | HZ_ZON4 | HZ_ZON3,
HouseZones({HouseZone::ClimateTemperate, HouseZone::TownCentre, HouseZone::TownInnerSuburb, HouseZone::TownOuterSuburb}),
CT_PASSENGERS, CT_MAIL, CT_GOODS), // 1C
MS( 0, 1955, 100, 132, STR_TOWN_BUILDING_NAME_SHOPS_AND_OFFICES_2, 135, 40, 6, 2, 3,
BuildingFlag::Size1x1,
HZ_TEMP | HZ_ZON5 | HZ_ZON4 | HZ_ZON3,
HouseZones({HouseZone::ClimateTemperate, HouseZone::TownCentre, HouseZone::TownInnerSuburb, HouseZone::TownOuterSuburb}),
CT_PASSENGERS, CT_MAIL, CT_GOODS), // 1D
MS(1973, CalendarTime::MAX_YEAR, 180, 155, STR_TOWN_BUILDING_NAME_SHOPS_AND_OFFICES_3, 180, 64, 8, 3, 3,
BuildingFlag::Size1x1,
HZ_TEMP | HZ_SUBTROPIC | HZ_ZON5 | HZ_ZON3,
HouseZones({HouseZone::ClimateTemperate, HouseZone::ClimateSubtropic, HouseZone::TownCentre, HouseZone::TownOuterSuburb}),
CT_PASSENGERS, CT_MAIL, CT_GOODS), // 1E
MS( 0, CalendarTime::MAX_YEAR, 35, 220, STR_TOWN_BUILDING_NAME_THEATER_1, 230, 23, 8, 2, 2,
BuildingFlag::Size1x1,
HZ_TEMP | HZ_ZON5 | HZ_ZON4,
HouseZones({HouseZone::ClimateTemperate, HouseZone::TownCentre, HouseZone::TownInnerSuburb}),
CT_PASSENGERS, CT_MAIL, CT_GOODS), // 1F
MS(1958, CalendarTime::MAX_YEAR, 65, 250, STR_TOWN_BUILDING_NAME_STADIUM_2, 300, 5, 4, 0, 0,
BuildingFlags({BuildingFlag::IsStadium, BuildingFlag::Size2x2}),
HZ_TEMP | HZ_SUBARTC_BELOW | HZ_SUBTROPIC | HZ_ZON4 | HZ_ZON3 | HZ_ZON2 | HZ_ZON1,
HouseZones({HouseZone::ClimateTemperate, HouseZone::ClimateSubarcticBelowSnow, HouseZone::ClimateSubtropic, HouseZone::TownInnerSuburb, HouseZone::TownOuterSuburb, HouseZone::TownOutskirt, HouseZone::TownEdge}),
CT_PASSENGERS, CT_MAIL, CT_GOODS), // 20
MS(1958, CalendarTime::MAX_YEAR, 0, 250, STR_TOWN_BUILDING_NAME_STADIUM_2, 300, 5, 4, 0, 0,
{},
HZ_NOZNS,
{},
CT_PASSENGERS, CT_MAIL, CT_GOODS), // 21
MS(1958, CalendarTime::MAX_YEAR, 0, 250, STR_TOWN_BUILDING_NAME_STADIUM_2, 300, 5, 4, 0, 0,
{},
HZ_NOZNS,
{},
CT_PASSENGERS, CT_MAIL, CT_GOODS), // 22
MS(1958, CalendarTime::MAX_YEAR, 0, 250, STR_TOWN_BUILDING_NAME_STADIUM_2, 300, 5, 4, 0, 0,
{},
HZ_NOZNS,
{},
CT_PASSENGERS, CT_MAIL, CT_GOODS), // 23
MS(2000, CalendarTime::MAX_YEAR, 140, 170, STR_TOWN_BUILDING_NAME_OFFICES_1, 250, 65, 8, 3, 2,
BuildingFlag::Size1x1,
HZ_TEMP | HZ_SUBARTC_BELOW | HZ_SUBTROPIC | HZ_ZON5 | HZ_ZON4,
HouseZones({HouseZone::ClimateTemperate, HouseZone::ClimateSubarcticBelowSnow, HouseZone::ClimateSubtropic, HouseZone::TownCentre, HouseZone::TownInnerSuburb}),
CT_PASSENGERS, CT_MAIL, CT_GOODS), // 24
MS( 0, 1960, 15, 70, STR_TOWN_BUILDING_NAME_HOUSES_2, 75, 6, 3, 1, 1,
BuildingFlag::Size1x1,
HZ_SUBARTC_BELOW | HZ_ZON2 | HZ_ZON1,
HouseZones({HouseZone::ClimateSubarcticBelowSnow, HouseZone::TownOutskirt, HouseZone::TownEdge}),
CT_PASSENGERS, CT_MAIL, CT_FOOD), // 25
MS( 0, 1960, 15, 70, STR_TOWN_BUILDING_NAME_HOUSES_2, 75, 6, 3, 1, 1,
BuildingFlag::Size1x1,
HZ_SUBARTC_ABOVE | HZ_ZON2 | HZ_ZON1,
HouseZones({HouseZone::ClimateSubarcticAboveSnow, HouseZone::TownOutskirt, HouseZone::TownEdge}),
CT_PASSENGERS, CT_MAIL, CT_FOOD), // 26
MS(1945, CalendarTime::MAX_YEAR, 35, 210, STR_TOWN_BUILDING_NAME_CINEMA_1, 230, 23, 8, 2, 2,
BuildingFlag::Size1x1,
HZ_TEMP | HZ_ZON5 | HZ_ZON4 | HZ_ZON3,
HouseZones({HouseZone::ClimateTemperate, HouseZone::TownCentre, HouseZone::TownInnerSuburb, HouseZone::TownOuterSuburb}),
CT_PASSENGERS, CT_MAIL, CT_GOODS), // 27
MS(1983, CalendarTime::MAX_YEAR, 180, 250, STR_TOWN_BUILDING_NAME_SHOPPING_MALL_1, 300, 5, 8, 2, 3,
BuildingFlag::Size2x2,
HZ_TEMP | HZ_ZON5 | HZ_ZON4 | HZ_ZON3 |HZ_ZON2,
HouseZones({HouseZone::ClimateTemperate, HouseZone::TownCentre, HouseZone::TownInnerSuburb, HouseZone::TownOuterSuburb,HouseZone::TownOutskirt}),
CT_PASSENGERS, CT_MAIL, CT_GOODS), // 28
MS(1983, CalendarTime::MAX_YEAR, 0, 250, STR_TOWN_BUILDING_NAME_SHOPPING_MALL_1, 300, 5, 8, 2, 3,
{},
HZ_NOZNS,
{},
CT_PASSENGERS, CT_MAIL, CT_GOODS), // 29
MS(1983, CalendarTime::MAX_YEAR, 0, 250, STR_TOWN_BUILDING_NAME_SHOPPING_MALL_1, 300, 5, 8, 2, 3,
{},
HZ_NOZNS,
{},
CT_PASSENGERS, CT_MAIL, CT_GOODS), // 2A
MS(1983, CalendarTime::MAX_YEAR, 0, 250, STR_TOWN_BUILDING_NAME_SHOPPING_MALL_1, 300, 5, 8, 2, 3,
{},
HZ_NOZNS,
{},
CT_PASSENGERS, CT_MAIL, CT_GOODS), // 2B
MS( 0, CalendarTime::MAX_YEAR, 80, 100, STR_TOWN_BUILDING_NAME_FLATS_1, 90, 20, 5, 2, 2,
BuildingFlag::Size1x1,
HZ_SUBARTC_BELOW | HZ_ZON5 | HZ_ZON4 | HZ_ZON3,
HouseZones({HouseZone::ClimateSubarcticBelowSnow, HouseZone::TownCentre, HouseZone::TownInnerSuburb, HouseZone::TownOuterSuburb}),
CT_PASSENGERS, CT_MAIL, CT_FOOD), // 2C
MS( 0, CalendarTime::MAX_YEAR, 80, 100, STR_TOWN_BUILDING_NAME_FLATS_1, 90, 20, 5, 2, 2,
BuildingFlag::Size1x1,
HZ_SUBARTC_ABOVE | HZ_ZON5 | HZ_ZON4 | HZ_ZON3,
HouseZones({HouseZone::ClimateSubarcticAboveSnow, HouseZone::TownCentre, HouseZone::TownInnerSuburb, HouseZone::TownOuterSuburb}),
CT_PASSENGERS, CT_MAIL, CT_FOOD), // 2D
MS( 0, CalendarTime::MAX_YEAR, 16, 70, STR_TOWN_BUILDING_NAME_HOUSES_2, 70, 6, 3, 1, 2,
BuildingFlag::Size1x1,
HZ_SUBARTC_BELOW | HZ_ZON4 | HZ_ZON3 | HZ_ZON2 | HZ_ZON1,
HouseZones({HouseZone::ClimateSubarcticBelowSnow, HouseZone::TownInnerSuburb, HouseZone::TownOuterSuburb, HouseZone::TownOutskirt, HouseZone::TownEdge}),
CT_PASSENGERS, CT_MAIL, CT_FOOD), // 2E
MS( 0, CalendarTime::MAX_YEAR, 16, 70, STR_TOWN_BUILDING_NAME_HOUSES_2, 70, 6, 3, 1, 2,
BuildingFlag::Size1x1,
HZ_SUBARTC_ABOVE | HZ_ZON4 | HZ_ZON3 | HZ_ZON2 | HZ_ZON1,
HouseZones({HouseZone::ClimateSubarcticAboveSnow, HouseZone::TownInnerSuburb, HouseZone::TownOuterSuburb, HouseZone::TownOutskirt, HouseZone::TownEdge}),
CT_PASSENGERS, CT_MAIL, CT_FOOD), // 2F
MS( 0, 1963, 14, 80, STR_TOWN_BUILDING_NAME_HOUSES_2, 70, 6, 3, 1, 2,
BuildingFlag::Size1x1,
HZ_SUBARTC_BELOW | HZ_ZON3 | HZ_ZON2 | HZ_ZON1,
HouseZones({HouseZone::ClimateSubarcticBelowSnow, HouseZone::TownOuterSuburb, HouseZone::TownOutskirt, HouseZone::TownEdge}),
CT_PASSENGERS, CT_MAIL, CT_FOOD), // 30
MS( 0, 1963, 14, 80, STR_TOWN_BUILDING_NAME_HOUSES_2, 70, 6, 3, 1, 2,
BuildingFlag::Size1x1,
HZ_SUBARTC_ABOVE | HZ_ZON3 | HZ_ZON2 | HZ_ZON1,
HouseZones({HouseZone::ClimateSubarcticAboveSnow, HouseZone::TownOuterSuburb, HouseZone::TownOutskirt, HouseZone::TownEdge}),
CT_PASSENGERS, CT_MAIL, CT_FOOD), // 31
MS(1966, CalendarTime::MAX_YEAR, 135, 150, STR_TOWN_BUILDING_NAME_TALL_OFFICE_BLOCK_1, 120, 60, 8, 3, 4,
BuildingFlag::Size1x1,
HZ_SUBARTC_BELOW | HZ_SUBTROPIC | HZ_ZON5 | HZ_ZON4,
HouseZones({HouseZone::ClimateSubarcticBelowSnow, HouseZone::ClimateSubtropic, HouseZone::TownCentre, HouseZone::TownInnerSuburb}),
CT_PASSENGERS, CT_MAIL, CT_GOODS), // 32
MS(1966, CalendarTime::MAX_YEAR, 135, 150, STR_TOWN_BUILDING_NAME_TALL_OFFICE_BLOCK_1, 120, 60, 8, 3, 4,
BuildingFlag::Size1x1,
HZ_SUBARTC_ABOVE | HZ_ZON5 | HZ_ZON4,
HouseZones({HouseZone::ClimateSubarcticAboveSnow, HouseZone::TownCentre, HouseZone::TownInnerSuburb}),
CT_PASSENGERS, CT_MAIL, CT_GOODS), // 33
MS(1970, CalendarTime::MAX_YEAR, 170, 170, STR_TOWN_BUILDING_NAME_TALL_OFFICE_BLOCK_1, 130, 70, 9, 3, 4,
BuildingFlag::Size1x1,
HZ_SUBARTC_BELOW | HZ_ZON5 | HZ_ZON4,
HouseZones({HouseZone::ClimateSubarcticBelowSnow, HouseZone::TownCentre, HouseZone::TownInnerSuburb}),
CT_PASSENGERS, CT_MAIL, CT_GOODS), // 34
MS(1970, CalendarTime::MAX_YEAR, 170, 170, STR_TOWN_BUILDING_NAME_TALL_OFFICE_BLOCK_1, 130, 70, 9, 3, 4,
BuildingFlag::Size1x1,
HZ_SUBARTC_ABOVE | HZ_ZON5 | HZ_ZON4,
HouseZones({HouseZone::ClimateSubarcticAboveSnow, HouseZone::TownCentre, HouseZone::TownInnerSuburb}),
CT_PASSENGERS, CT_MAIL, CT_GOODS), // 35
MS(1974, CalendarTime::MAX_YEAR, 210, 200, STR_TOWN_BUILDING_NAME_TALL_OFFICE_BLOCK_1, 140, 80, 10, 3, 5,
BuildingFlag::Size1x1,
HZ_SUBARTC_BELOW | HZ_SUBTROPIC | HZ_ZON5 | HZ_ZON4,
HouseZones({HouseZone::ClimateSubarcticBelowSnow, HouseZone::ClimateSubtropic, HouseZone::TownCentre, HouseZone::TownInnerSuburb}),
CT_PASSENGERS, CT_MAIL, CT_GOODS), // 36
MS(1974, CalendarTime::MAX_YEAR, 210, 200, STR_TOWN_BUILDING_NAME_TALL_OFFICE_BLOCK_1, 140, 80, 10, 3, 5,
BuildingFlag::Size1x1,
HZ_SUBARTC_ABOVE | HZ_ZON5 | HZ_ZON4,
HouseZones({HouseZone::ClimateSubarcticAboveSnow, HouseZone::TownCentre, HouseZone::TownInnerSuburb}),
CT_PASSENGERS, CT_MAIL, CT_GOODS), // 37
MS( 0, CalendarTime::MAX_YEAR, 10, 60, STR_TOWN_BUILDING_NAME_HOUSES_2, 60, 5, 2, 1, 1,
BuildingFlag::Size1x1,
HZ_SUBARTC_BELOW | HZ_ZON1,
HouseZones({HouseZone::ClimateSubarcticBelowSnow, HouseZone::TownEdge}),
CT_PASSENGERS, CT_MAIL, CT_FOOD), // 38
MS( 0, CalendarTime::MAX_YEAR, 10, 60, STR_TOWN_BUILDING_NAME_HOUSES_2, 60, 5, 2, 1, 1,
BuildingFlag::Size1x1,
HZ_SUBARTC_ABOVE | HZ_ZON1,
HouseZones({HouseZone::ClimateSubarcticAboveSnow, HouseZone::TownEdge}),
CT_PASSENGERS, CT_MAIL, CT_FOOD), // 39
MS( 0, CalendarTime::MAX_YEAR, 25, 100, STR_TOWN_BUILDING_NAME_SHOPS_AND_OFFICES_1, 80, 20, 3, 1, 1,
BuildingFlag::Size1x1,
HZ_SUBARTC_BELOW | HZ_ZON5 | HZ_ZON4 | HZ_ZON3 | HZ_ZON2,
HouseZones({HouseZone::ClimateSubarcticBelowSnow, HouseZone::TownCentre, HouseZone::TownInnerSuburb, HouseZone::TownOuterSuburb, HouseZone::TownOutskirt}),
CT_PASSENGERS, CT_MAIL, CT_FOOD), // 3A
MS( 0, CalendarTime::MAX_YEAR, 25, 100, STR_TOWN_BUILDING_NAME_SHOPS_AND_OFFICES_1, 80, 20, 3, 1, 1,
BuildingFlag::Size1x1,
HZ_SUBARTC_ABOVE | HZ_ZON5 | HZ_ZON4 | HZ_ZON3 | HZ_ZON2,
HouseZones({HouseZone::ClimateSubarcticAboveSnow, HouseZone::TownCentre, HouseZone::TownInnerSuburb, HouseZone::TownOuterSuburb, HouseZone::TownOutskirt}),
CT_PASSENGERS, CT_MAIL, CT_FOOD), // 3B
MS( 0, CalendarTime::MAX_YEAR, 6, 85, STR_TOWN_BUILDING_NAME_CHURCH_1, 230, 2, 2, 0, 0,
BuildingFlags({BuildingFlag::IsChurch, BuildingFlag::Size1x1}),
HZ_SUBARTC_BELOW | HZ_ZON4 | HZ_ZON3 | HZ_ZON2 | HZ_ZON1,
HouseZones({HouseZone::ClimateSubarcticBelowSnow, HouseZone::TownInnerSuburb, HouseZone::TownOuterSuburb, HouseZone::TownOutskirt, HouseZone::TownEdge}),
CT_PASSENGERS, CT_MAIL, CT_GOODS), // 3C
MS( 0, CalendarTime::MAX_YEAR, 6, 85, STR_TOWN_BUILDING_NAME_CHURCH_1, 230, 2, 2, 0, 0,
BuildingFlags({BuildingFlag::IsChurch, BuildingFlag::Size1x1}),
HZ_SUBARTC_ABOVE | HZ_ZON4 | HZ_ZON3 | HZ_ZON2 | HZ_ZON1,
HouseZones({HouseZone::ClimateSubarcticAboveSnow, HouseZone::TownInnerSuburb, HouseZone::TownOuterSuburb, HouseZone::TownOutskirt, HouseZone::TownEdge}),
CT_PASSENGERS, CT_MAIL, CT_GOODS), // 3D
MS( 0, CalendarTime::MAX_YEAR, 17, 80, STR_TOWN_BUILDING_NAME_HOUSES_2, 80, 7, 3, 1, 1,
BuildingFlag::Size1x1,
HZ_SUBARTC_BELOW | HZ_ZON3 | HZ_ZON2 | HZ_ZON1,
HouseZones({HouseZone::ClimateSubarcticBelowSnow, HouseZone::TownOuterSuburb, HouseZone::TownOutskirt, HouseZone::TownEdge}),
CT_PASSENGERS, CT_MAIL, CT_FOOD), // 3E
MS( 0, CalendarTime::MAX_YEAR, 17, 80, STR_TOWN_BUILDING_NAME_HOUSES_2, 80, 7, 3, 1, 1,
BuildingFlag::Size1x1,
HZ_SUBARTC_ABOVE | HZ_ZON3 | HZ_ZON2 | HZ_ZON1,
HouseZones({HouseZone::ClimateSubarcticAboveSnow, HouseZone::TownOuterSuburb, HouseZone::TownOutskirt, HouseZone::TownEdge}),
CT_PASSENGERS, CT_MAIL, CT_FOOD), // 3F
MS( 0, 1960, 90, 140, STR_TOWN_BUILDING_NAME_SHOPS_AND_OFFICES_1, 110, 45, 6, 2, 3,
BuildingFlag::Size1x1,
HZ_SUBARTC_BELOW| HZ_ZON5 | HZ_ZON4 | HZ_ZON3,
HouseZones({HouseZone::ClimateSubarcticBelowSnow, HouseZone::TownCentre, HouseZone::TownInnerSuburb, HouseZone::TownOuterSuburb}),
CT_PASSENGERS, CT_MAIL, CT_GOODS), // 40
MS( 0, 1960, 90, 140, STR_TOWN_BUILDING_NAME_SHOPS_AND_OFFICES_1, 110, 45, 6, 2, 3,
BuildingFlag::Size1x1,
HZ_SUBARTC_ABOVE| HZ_ZON5 | HZ_ZON4 | HZ_ZON3,
HouseZones({HouseZone::ClimateSubarcticAboveSnow, HouseZone::TownCentre, HouseZone::TownInnerSuburb, HouseZone::TownOuterSuburb}),
CT_PASSENGERS, CT_MAIL, CT_GOODS), // 41
MS(1972, CalendarTime::MAX_YEAR, 140, 160, STR_TOWN_BUILDING_NAME_HOTEL_1, 160, 25, 6, 1, 3,
BuildingFlag::Size1x2,
HZ_SUBARTC_BELOW| HZ_ZON5 | HZ_ZON4 | HZ_ZON3,
HouseZones({HouseZone::ClimateSubarcticBelowSnow, HouseZone::TownCentre, HouseZone::TownInnerSuburb, HouseZone::TownOuterSuburb}),
CT_PASSENGERS, CT_MAIL, CT_FOOD), // 42
MS(1972, CalendarTime::MAX_YEAR, 0, 160, STR_TOWN_BUILDING_NAME_HOTEL_1, 160, 25, 6, 1, 2,
{},
HZ_NOZNS,
{},
CT_PASSENGERS, CT_MAIL, CT_GOODS), // 43
MS(1972, CalendarTime::MAX_YEAR, 140, 160, STR_TOWN_BUILDING_NAME_HOTEL_1, 160, 25, 6, 1, 3,
BuildingFlag::Size1x2,
HZ_SUBARTC_ABOVE| HZ_ZON5 | HZ_ZON4 | HZ_ZON3,
HouseZones({HouseZone::ClimateSubarcticAboveSnow, HouseZone::TownCentre, HouseZone::TownInnerSuburb, HouseZone::TownOuterSuburb}),
CT_PASSENGERS, CT_MAIL, CT_FOOD), // 44
MS(1972, CalendarTime::MAX_YEAR, 0, 160, STR_TOWN_BUILDING_NAME_HOTEL_1, 160, 25, 6, 1, 2,
{},
HZ_NOZNS,
{},
CT_PASSENGERS, CT_MAIL, CT_GOODS), // 45
MS(1963, CalendarTime::MAX_YEAR, 105, 130, STR_TOWN_BUILDING_NAME_SHOPS_AND_OFFICES_1, 105, 50, 7, 2, 3,
BuildingFlag::Size1x1,
HZ_SUBARTC_BELOW | HZ_SUBTROPIC | HZ_ZON5 | HZ_ZON4 | HZ_ZON3,
HouseZones({HouseZone::ClimateSubarcticBelowSnow, HouseZone::ClimateSubtropic, HouseZone::TownCentre, HouseZone::TownInnerSuburb, HouseZone::TownOuterSuburb}),
CT_PASSENGERS, CT_MAIL, CT_GOODS), // 46
MS(1963, CalendarTime::MAX_YEAR, 105, 130, STR_TOWN_BUILDING_NAME_SHOPS_AND_OFFICES_1, 105, 50, 7, 2, 3,
BuildingFlag::Size1x1,
HZ_SUBARTC_ABOVE| HZ_ZON5 | HZ_ZON4 | HZ_ZON3,
HouseZones({HouseZone::ClimateSubarcticAboveSnow, HouseZone::TownCentre, HouseZone::TownInnerSuburb, HouseZone::TownOuterSuburb}),
CT_PASSENGERS, CT_MAIL, CT_GOODS), // 47
MS(1978, CalendarTime::MAX_YEAR, 190, 190, STR_TOWN_BUILDING_NAME_TALL_OFFICE_BLOCK_1, 135, 75, 9, 3, 4,
BuildingFlag::Size1x1,
HZ_SUBARTC_BELOW | HZ_ZON5 | HZ_ZON4,
HouseZones({HouseZone::ClimateSubarcticBelowSnow, HouseZone::TownCentre, HouseZone::TownInnerSuburb}),
CT_PASSENGERS, CT_MAIL, CT_GOODS), // 48
MS(1978, CalendarTime::MAX_YEAR, 190, 190, STR_TOWN_BUILDING_NAME_TALL_OFFICE_BLOCK_1, 135, 75, 9, 3, 4,
BuildingFlag::Size1x1,
HZ_SUBARTC_ABOVE | HZ_ZON5 | HZ_ZON4,
HouseZones({HouseZone::ClimateSubarcticAboveSnow, HouseZone::TownCentre, HouseZone::TownInnerSuburb}),
CT_PASSENGERS, CT_MAIL, CT_GOODS), // 49
MS(1967, CalendarTime::MAX_YEAR, 250, 140, STR_TOWN_BUILDING_NAME_TALL_OFFICE_BLOCK_1, 200, 60, 7, 2, 2,
BuildingFlag::Size2x1,
HZ_SUBARTC_BELOW| HZ_ZON5 | HZ_ZON4 | HZ_ZON3,
HouseZones({HouseZone::ClimateSubarcticBelowSnow, HouseZone::TownCentre, HouseZone::TownInnerSuburb, HouseZone::TownOuterSuburb}),
CT_PASSENGERS, CT_MAIL, CT_GOODS), // 4A
MS(1967, CalendarTime::MAX_YEAR, 0, 140, STR_TOWN_BUILDING_NAME_TALL_OFFICE_BLOCK_1, 200, 60, 7, 2, 2,
{},
HZ_NOZNS,
{},
CT_PASSENGERS, CT_MAIL, CT_GOODS), // 4B
MS(1967, CalendarTime::MAX_YEAR, 250, 140, STR_TOWN_BUILDING_NAME_TALL_OFFICE_BLOCK_1, 200, 60, 7, 2, 2,
BuildingFlag::Size2x1,
HZ_SUBARTC_ABOVE | HZ_ZON5 | HZ_ZON4 | HZ_ZON3,
HouseZones({HouseZone::ClimateSubarcticAboveSnow, HouseZone::TownCentre, HouseZone::TownInnerSuburb, HouseZone::TownOuterSuburb}),
CT_PASSENGERS, CT_MAIL, CT_GOODS), // 4C
MS(1967, CalendarTime::MAX_YEAR, 0, 140, STR_TOWN_BUILDING_NAME_TALL_OFFICE_BLOCK_1, 200, 60, 7, 2, 2,
{},
HZ_NOZNS,
{},
CT_PASSENGERS, CT_MAIL, CT_GOODS), // 4D
MS( 0, CalendarTime::MAX_YEAR, 16, 80, STR_TOWN_BUILDING_NAME_HOUSES_2, 80, 6, 3, 1, 2,
BuildingFlag::Size1x1,
HZ_SUBTROPIC | HZ_ZON5 | HZ_ZON4 | HZ_ZON3 | HZ_ZON2,
HouseZones({HouseZone::ClimateSubtropic, HouseZone::TownCentre, HouseZone::TownInnerSuburb, HouseZone::TownOuterSuburb, HouseZone::TownOutskirt}),
CT_PASSENGERS, CT_MAIL, CT_FOOD), // 4E
MS( 0, CalendarTime::MAX_YEAR, 16, 80, STR_TOWN_BUILDING_NAME_HOUSES_2, 80, 6, 3, 1, 2,
BuildingFlag::Size1x1,
HZ_SUBTROPIC | HZ_ZON5 | HZ_ZON4 | HZ_ZON3 | HZ_ZON2,
HouseZones({HouseZone::ClimateSubtropic, HouseZone::TownCentre, HouseZone::TownInnerSuburb, HouseZone::TownOuterSuburb, HouseZone::TownOutskirt}),
CT_PASSENGERS, CT_MAIL, CT_FOOD), // 4F
MS( 0, CalendarTime::MAX_YEAR, 16, 80, STR_TOWN_BUILDING_NAME_HOUSES_2, 80, 5, 3, 1, 2,
BuildingFlag::Size1x1,
HZ_SUBTROPIC | HZ_ZON5 | HZ_ZON4 | HZ_ZON3 | HZ_ZON2,
HouseZones({HouseZone::ClimateSubtropic, HouseZone::TownCentre, HouseZone::TownInnerSuburb, HouseZone::TownOuterSuburb, HouseZone::TownOutskirt}),
CT_PASSENGERS, CT_MAIL, CT_FOOD), // 50
MS( 0, CalendarTime::MAX_YEAR, 7, 30, STR_TOWN_BUILDING_NAME_HOUSES_2, 30, 4, 3, 1, 1,
BuildingFlag::Size1x1,
HZ_SUBTROPIC | HZ_ZON1,
HouseZones({HouseZone::ClimateSubtropic, HouseZone::TownEdge}),
CT_PASSENGERS, CT_MAIL, CT_FOOD), // 51
MS( 0, CalendarTime::MAX_YEAR, 45, 130, STR_TOWN_BUILDING_NAME_FLATS_1, 95, 15, 6, 2, 1,
BuildingFlag::Size1x1,
HZ_SUBTROPIC | HZ_ZON5 | HZ_ZON4 | HZ_ZON3,
HouseZones({HouseZone::ClimateSubtropic, HouseZone::TownCentre, HouseZone::TownInnerSuburb, HouseZone::TownOuterSuburb}),
CT_PASSENGERS, CT_MAIL, CT_GOODS), // 52
MS( 0, CalendarTime::MAX_YEAR, 8, 90, STR_TOWN_BUILDING_NAME_CHURCH_1, 200, 3, 2, 0, 0,
BuildingFlags({BuildingFlag::IsChurch, BuildingFlag::Size1x1}),
HZ_SUBTROPIC | HZ_ZON4 | HZ_ZON3 | HZ_ZON2,
HouseZones({HouseZone::ClimateSubtropic, HouseZone::TownInnerSuburb, HouseZone::TownOuterSuburb, HouseZone::TownOutskirt}),
CT_PASSENGERS, CT_MAIL, CT_GOODS), // 53
MS( 0, CalendarTime::MAX_YEAR, 18, 80, STR_TOWN_BUILDING_NAME_HOUSES_2, 80, 7, 3, 1, 2,
BuildingFlag::Size1x1,
HZ_SUBTROPIC | HZ_ZON5 | HZ_ZON4 | HZ_ZON3 | HZ_ZON2,
HouseZones({HouseZone::ClimateSubtropic, HouseZone::TownCentre, HouseZone::TownInnerSuburb, HouseZone::TownOuterSuburb, HouseZone::TownOutskirt}),
CT_PASSENGERS, CT_MAIL, CT_FOOD), // 54
MS(1973, CalendarTime::MAX_YEAR, 90, 110, STR_TOWN_BUILDING_NAME_FLATS_1, 95, 24, 6, 2, 1,
BuildingFlag::Size1x1,
HZ_SUBTROPIC | HZ_ZON5 | HZ_ZON4 | HZ_ZON3,
HouseZones({HouseZone::ClimateSubtropic, HouseZone::TownCentre, HouseZone::TownInnerSuburb, HouseZone::TownOuterSuburb}),
CT_PASSENGERS, CT_MAIL, CT_GOODS), // 55
MS(1962, CalendarTime::MAX_YEAR, 120, 120, STR_TOWN_BUILDING_NAME_FLATS_1, 95, 25, 6, 2, 1,
BuildingFlag::Size1x1,
HZ_SUBTROPIC | HZ_ZON5 | HZ_ZON4 | HZ_ZON3,
HouseZones({HouseZone::ClimateSubtropic, HouseZone::TownCentre, HouseZone::TownInnerSuburb, HouseZone::TownOuterSuburb}),
CT_PASSENGERS, CT_MAIL, CT_GOODS), // 56
MS(1984, CalendarTime::MAX_YEAR, 250, 190, STR_TOWN_BUILDING_NAME_TALL_OFFICE_BLOCK_1, 140, 80, 8, 3, 4,
BuildingFlag::Size2x1,
HZ_SUBTROPIC | HZ_ZON5 | HZ_ZON4,
HouseZones({HouseZone::ClimateSubtropic, HouseZone::TownCentre, HouseZone::TownInnerSuburb}),
CT_PASSENGERS, CT_MAIL, CT_GOODS), // 57
MS(1984, CalendarTime::MAX_YEAR, 0, 190, STR_TOWN_BUILDING_NAME_TALL_OFFICE_BLOCK_1, 140, 80, 8, 3, 4,
{},
HZ_SUBTROPIC,
HouseZones({HouseZone::ClimateSubtropic}),
CT_PASSENGERS, CT_MAIL, CT_GOODS), // 58
MS( 0, CalendarTime::MAX_YEAR, 80, 110, STR_TOWN_BUILDING_NAME_FLATS_1, 95, 23, 6, 2, 1,
BuildingFlag::Size1x1,
HZ_SUBTROPIC | HZ_ZON5 | HZ_ZON4 | HZ_ZON3,
HouseZones({HouseZone::ClimateSubtropic, HouseZone::TownCentre, HouseZone::TownInnerSuburb, HouseZone::TownOuterSuburb}),
CT_PASSENGERS, CT_MAIL, CT_GOODS), // 59
MS(1993, CalendarTime::MAX_YEAR, 180, 180, STR_TOWN_BUILDING_NAME_TALL_OFFICE_BLOCK_1, 150, 90, 8, 3, 4,
BuildingFlag::Size1x1,
HZ_SUBTROPIC | HZ_ZON5 | HZ_ZON4 | HZ_ZON3,
HouseZones({HouseZone::ClimateSubtropic, HouseZone::TownCentre, HouseZone::TownInnerSuburb, HouseZone::TownOuterSuburb}),
CT_PASSENGERS, CT_MAIL, CT_GOODS), // 5A
MS( 0, CalendarTime::MAX_YEAR, 8, 90, STR_TOWN_BUILDING_NAME_CHURCH_1, 200, 3, 2, 0, 0,
BuildingFlags({BuildingFlag::IsChurch, BuildingFlag::Size1x1}),
HZ_TOYLND | HZ_ZON5 | HZ_ZON4 | HZ_ZON3 | HZ_ZON2 | HZ_ZON1,
HouseZones({HouseZone::ClimateToyland, HouseZone::TownCentre, HouseZone::TownInnerSuburb, HouseZone::TownOuterSuburb, HouseZone::TownOutskirt, HouseZone::TownEdge}),
CT_PASSENGERS, CT_MAIL, CT_CANDY), // 5B
MS( 0, CalendarTime::MAX_YEAR, 18, 90, STR_TOWN_BUILDING_NAME_HOUSES_2, 90, 5, 6, 2, 2,
BuildingFlag::Size1x1,
HZ_TOYLND | HZ_ZON5 | HZ_ZON4 | HZ_ZON3 | HZ_ZON2 | HZ_ZON1,
HouseZones({HouseZone::ClimateToyland, HouseZone::TownCentre, HouseZone::TownInnerSuburb, HouseZone::TownOuterSuburb, HouseZone::TownOutskirt, HouseZone::TownEdge}),
CT_PASSENGERS, CT_MAIL, CT_CANDY), // 5C
MS( 0, CalendarTime::MAX_YEAR, 7, 70, STR_TOWN_BUILDING_NAME_HOUSES_2, 50, 3, 3, 1, 1,
BuildingFlag::Size1x1,
HZ_TOYLND | HZ_ZON2 | HZ_ZON1,
HouseZones({HouseZone::ClimateToyland, HouseZone::TownOutskirt, HouseZone::TownEdge}),
CT_PASSENGERS, CT_MAIL, CT_CANDY), // 5D
MS( 0, CalendarTime::MAX_YEAR, 15, 80, STR_TOWN_BUILDING_NAME_HOUSES_2, 75, 6, 3, 1, 2,
BuildingFlag::Size1x1,
HZ_TOYLND | HZ_ZON4 | HZ_ZON3 | HZ_ZON2 | HZ_ZON1,
HouseZones({HouseZone::ClimateToyland, HouseZone::TownInnerSuburb, HouseZone::TownOuterSuburb, HouseZone::TownOutskirt, HouseZone::TownEdge}),
CT_PASSENGERS, CT_MAIL, CT_CANDY), // 5E
MS( 0, CalendarTime::MAX_YEAR, 17, 80, STR_TOWN_BUILDING_NAME_HOUSES_2, 75, 6, 3, 1, 2,
BuildingFlag::Size1x1,
HZ_TOYLND | HZ_ZON4 | HZ_ZON3 | HZ_ZON2 | HZ_ZON1,
HouseZones({HouseZone::ClimateToyland, HouseZone::TownInnerSuburb, HouseZone::TownOuterSuburb, HouseZone::TownOutskirt, HouseZone::TownEdge}),
CT_PASSENGERS, CT_MAIL, CT_CANDY), // 5F
MS( 0, CalendarTime::MAX_YEAR, 19, 80, STR_TOWN_BUILDING_NAME_HOUSES_2, 75, 6, 3, 1, 2,
BuildingFlag::Size1x1,
HZ_TOYLND | HZ_ZON4 | HZ_ZON3 | HZ_ZON2 | HZ_ZON1,
HouseZones({HouseZone::ClimateToyland, HouseZone::TownInnerSuburb, HouseZone::TownOuterSuburb, HouseZone::TownOutskirt, HouseZone::TownEdge}),
CT_PASSENGERS, CT_MAIL, CT_CANDY), // 60
MS( 0, CalendarTime::MAX_YEAR, 21, 80, STR_TOWN_BUILDING_NAME_HOUSES_2, 75, 6, 3, 1, 2,
BuildingFlag::Size1x1,
HZ_TOYLND | HZ_ZON4 | HZ_ZON3 | HZ_ZON2 | HZ_ZON1,
HouseZones({HouseZone::ClimateToyland, HouseZone::TownInnerSuburb, HouseZone::TownOuterSuburb, HouseZone::TownOutskirt, HouseZone::TownEdge}),
CT_PASSENGERS, CT_MAIL, CT_CANDY), // 61
MS( 0, CalendarTime::MAX_YEAR, 75, 160, STR_TOWN_BUILDING_NAME_TALL_OFFICE_BLOCK_1, 130, 20, 8, 4, 2,
BuildingFlag::Size1x1,
HZ_TOYLND | HZ_ZON5 | HZ_ZON4 | HZ_ZON3,
HouseZones({HouseZone::ClimateToyland, HouseZone::TownCentre, HouseZone::TownInnerSuburb, HouseZone::TownOuterSuburb}),
CT_PASSENGERS, CT_MAIL, CT_CANDY), // 62
MS( 0, CalendarTime::MAX_YEAR, 35, 90, STR_TOWN_BUILDING_NAME_HOUSES_2, 80, 9, 4, 1, 2,
BuildingFlag::Size1x2,
HZ_TOYLND | HZ_ZON5 | HZ_ZON4 | HZ_ZON3 | HZ_ZON2 | HZ_ZON1,
HouseZones({HouseZone::ClimateToyland, HouseZone::TownCentre, HouseZone::TownInnerSuburb, HouseZone::TownOuterSuburb, HouseZone::TownOutskirt, HouseZone::TownEdge}),
CT_PASSENGERS, CT_MAIL, CT_CANDY), // 63
MS( 0, CalendarTime::MAX_YEAR, 0, 90, STR_TOWN_BUILDING_NAME_HOUSES_2, 80, 0, 4, 1, 2,
{},
HZ_NOZNS,
{},
CT_PASSENGERS, CT_MAIL, CT_CANDY), // 64
MS( 0, CalendarTime::MAX_YEAR, 85, 150, STR_TOWN_BUILDING_NAME_TALL_OFFICE_BLOCK_1, 130, 18, 8, 4, 2,
BuildingFlag::Size1x1,
HZ_TOYLND | HZ_ZON5 | HZ_ZON4 | HZ_ZON3,
HouseZones({HouseZone::ClimateToyland, HouseZone::TownCentre, HouseZone::TownInnerSuburb, HouseZone::TownOuterSuburb}),
CT_PASSENGERS, CT_MAIL, CT_CANDY), // 65
MS( 0, CalendarTime::MAX_YEAR, 11, 60, STR_TOWN_BUILDING_NAME_IGLOO_1, 45, 3, 3, 1, 1,
BuildingFlag::Size1x1,
HZ_TOYLND | HZ_ZON1,
HouseZones({HouseZone::ClimateToyland, HouseZone::TownEdge}),
CT_PASSENGERS, CT_MAIL, CT_CANDY), // 66
MS( 0, CalendarTime::MAX_YEAR, 10, 60, STR_TOWN_BUILDING_NAME_TEPEES_1, 45, 3, 3, 1, 1,
BuildingFlag::Size1x1,
HZ_TOYLND | HZ_ZON1,
HouseZones({HouseZone::ClimateToyland, HouseZone::TownEdge}),
CT_PASSENGERS, CT_MAIL, CT_CANDY), // 67
MS( 0, CalendarTime::MAX_YEAR, 67, 140, STR_TOWN_BUILDING_NAME_SHOPS_AND_OFFICES_1, 130, 22, 8, 4, 4,
BuildingFlag::Size1x1,
HZ_TOYLND | HZ_ZON5 | HZ_ZON4 | HZ_ZON3,
HouseZones({HouseZone::ClimateToyland, HouseZone::TownCentre, HouseZone::TownInnerSuburb, HouseZone::TownOuterSuburb}),
CT_PASSENGERS, CT_MAIL, CT_FIZZY_DRINKS), // 68
MS( 0, CalendarTime::MAX_YEAR, 86, 145, STR_TOWN_BUILDING_NAME_SHOPS_AND_OFFICES_1, 130, 23, 8, 4, 4,
BuildingFlag::Size1x1,
HZ_TOYLND | HZ_ZON5 | HZ_ZON4 | HZ_ZON3,
HouseZones({HouseZone::ClimateToyland, HouseZone::TownCentre, HouseZone::TownInnerSuburb, HouseZone::TownOuterSuburb}),
CT_PASSENGERS, CT_MAIL, CT_FIZZY_DRINKS), // 69
MS( 0, CalendarTime::MAX_YEAR, 95, 165, STR_TOWN_BUILDING_NAME_TALL_OFFICE_BLOCK_1, 130, 28, 8, 4, 2,
BuildingFlag::Size1x1,
HZ_TOYLND | HZ_ZON5 | HZ_ZON4 | HZ_ZON3,
HouseZones({HouseZone::ClimateToyland, HouseZone::TownCentre, HouseZone::TownInnerSuburb, HouseZone::TownOuterSuburb}),
CT_PASSENGERS, CT_MAIL, CT_CANDY), // 6A
MS( 0, CalendarTime::MAX_YEAR, 30, 90, STR_TOWN_BUILDING_NAME_STATUE_1, 70, 10, 4, 1, 2,
BuildingFlag::Size1x1,
HZ_TOYLND | HZ_ZON5 | HZ_ZON4 | HZ_ZON3,
HouseZones({HouseZone::ClimateToyland, HouseZone::TownCentre, HouseZone::TownInnerSuburb, HouseZone::TownOuterSuburb}),
CT_PASSENGERS, CT_MAIL, CT_CANDY), // 6B
MS( 0, CalendarTime::MAX_YEAR, 25, 75, STR_TOWN_BUILDING_NAME_TEAPOT_HOUSE_1, 65, 8, 3, 1, 2,
BuildingFlag::Size1x1,
HZ_TOYLND | HZ_ZON5 | HZ_ZON4 | HZ_ZON3 | HZ_ZON2 | HZ_ZON1,
HouseZones({HouseZone::ClimateToyland, HouseZone::TownCentre, HouseZone::TownInnerSuburb, HouseZone::TownOuterSuburb, HouseZone::TownOutskirt, HouseZone::TownEdge}),
CT_PASSENGERS, CT_MAIL, CT_CANDY), // 6C
MS( 0, CalendarTime::MAX_YEAR, 18, 85, STR_TOWN_BUILDING_NAME_PIGGY_BANK_1, 95, 7, 3, 2, 4,
BuildingFlag::Size1x1,
HZ_TOYLND | HZ_ZON5 | HZ_ZON4 | HZ_ZON3 | HZ_ZON2 | HZ_ZON1,
HouseZones({HouseZone::ClimateToyland, HouseZone::TownCentre, HouseZone::TownInnerSuburb, HouseZone::TownOuterSuburb, HouseZone::TownOutskirt, HouseZone::TownEdge}),
CT_PASSENGERS, CT_MAIL, CT_FIZZY_DRINKS), // 6D
};
#undef MS

File diff suppressed because it is too large Load Diff