diff --git a/openrct2.vcxproj b/openrct2.vcxproj
index 2b727d7a99..18045882fd 100644
--- a/openrct2.vcxproj
+++ b/openrct2.vcxproj
@@ -95,6 +95,8 @@
+
+
@@ -268,6 +270,7 @@
+
@@ -403,4 +406,4 @@
-
\ No newline at end of file
+
diff --git a/openrct2.vcxproj.filters b/openrct2.vcxproj.filters
index bf277acd45..867348d741 100644
--- a/openrct2.vcxproj.filters
+++ b/openrct2.vcxproj.filters
@@ -591,6 +591,8 @@
Source\Windows
+
+
@@ -902,6 +904,7 @@
Source\Core
+
Resource Files
diff --git a/src/core/List.hpp b/src/core/List.hpp
index 80fdf724f6..f8e6cc5d25 100644
--- a/src/core/List.hpp
+++ b/src/core/List.hpp
@@ -22,6 +22,8 @@ public:
List() : std::vector() { }
+ List(std::initializer_list initializerList) : std::vector(initializerList) { }
+
List(size_t capacity) : std::vector(capacity) { }
List(const T * items, size_t count) : std::vector(items, items + count) { }
diff --git a/src/rct1/S4Importer.cpp b/src/rct1/S4Importer.cpp
new file mode 100644
index 0000000000..fd2257627f
--- /dev/null
+++ b/src/rct1/S4Importer.cpp
@@ -0,0 +1,224 @@
+#include
+
+#include "../common.h"
+#include "../core/List.hpp"
+#include "../core/Util.hpp"
+#include "import.h"
+
+extern "C"
+{
+ #include "../rct1.h"
+ #include "../util/sawyercoding.h"
+}
+
+/**
+ * Class to import RollerCoaster Tycoon 1 scenarios (*.SC4) and saved games (*.SV4).
+ */
+class S4Importer
+{
+public:
+
+private:
+ rct1_s4 _s4;
+ uint8 _gameVersion;
+
+ // Lists of dynamic object entries
+ List _rideEntries;
+ List _smallSceneryEntries;
+ List _largeSceneryEntries;
+ List _wallEntries;
+ List _sceneryGroupEntries;
+
+ // Lookup tables for converting from RCT1 hard coded types to the new dynamic object entries
+ uint8 _rideTypeToRideEntryMap[96];
+ uint8 _vehicleTypeToRideEntryMap[96];
+ uint8 _smallSceneryTypeToEntryMap[96];
+ uint8 _largeSceneryTypeToEntryMap[96];
+ uint8 _wallSceneryTypeToEntryMap[96];
+ uint8 _sceneryThemeTypeToEntryMap[24];
+
+ void Initialise();
+
+ /**
+ * Scans the map and research list for all the object types used and builds lists and
+ * lookup tables for converting from hard coded RCT1 object types to dynamic object entries.
+ */
+ void CreateAvailableObjectMappings();
+ void AddAvailableEntriesFromResearchList();
+ void AddAvailableEntriesFromMap();
+ void AddAvailableEntriesFromRides();
+
+ void AddEntryForRideType(uint8 rideType);
+ void AddEntryForVehicleType(uint8 rideType, uint8 vehicleType);
+ void AddEntryForSmallScenery(uint8 smallSceneryType);
+ void AddEntriesForSceneryTheme(uint8 sceneryThemeType);
+
+ const rct1_research_item * GetResearchList(size_t * count);
+};
+
+void S4Importer::Initialise()
+{
+ _gameVersion = sawyercoding_detect_rct1_version(_s4.game_version) & FILE_VERSION_MASK;
+
+ Memory::Set(_rideTypeToRideEntryMap, 255, sizeof(_rideTypeToRideEntryMap));
+ Memory::Set(_vehicleTypeToRideEntryMap, 255, sizeof(_vehicleTypeToRideEntryMap));
+ Memory::Set(_smallSceneryTypeToEntryMap, 255, sizeof(_smallSceneryTypeToEntryMap));
+ Memory::Set(_largeSceneryTypeToEntryMap, 255, sizeof(_largeSceneryTypeToEntryMap));
+ Memory::Set(_wallSceneryTypeToEntryMap, 255, sizeof(_wallSceneryTypeToEntryMap));
+ Memory::Set(_sceneryThemeTypeToEntryMap, 255, sizeof(_sceneryThemeTypeToEntryMap));
+}
+
+void S4Importer::CreateAvailableObjectMappings()
+{
+ AddAvailableEntriesFromResearchList();
+ AddAvailableEntriesFromMap();
+ AddAvailableEntriesFromRides();
+}
+
+void S4Importer::AddAvailableEntriesFromResearchList()
+{
+ size_t researchListCount;
+ const rct1_research_item * researchList = GetResearchList(&researchListCount);
+ for (size_t i = 0; i < researchListCount; i++)
+ {
+ const rct1_research_item * researchItem = &researchList[i];
+ if (researchItem->item == RCT1_RESEARCH_END_RESEARCHABLE ||
+ researchItem->item == RCT1_RESEARCH_END)
+ {
+ break;
+ }
+ if (researchItem->item == RCT1_RESEARCH_END_AVAILABLE)
+ {
+ continue;
+ }
+
+ switch (researchItem->category) {
+ case RCT1_RESEARCH_CATEGORY_THEME:
+ AddEntriesForSceneryTheme(researchItem->item);
+ break;
+ case RCT1_RESEARCH_CATEGORY_RIDE:
+ {
+ uint8 rideType = researchItem->item;
+
+ // Add all vehicles for this ride type
+ uint32 numVehicles = 0;
+ for (size_t j = 0; j < researchListCount; j++)
+ {
+ const rct1_research_item *researchItem2 = &researchList[j];
+ if (researchItem2->item == RCT1_RESEARCH_END_RESEARCHABLE ||
+ researchItem2->item == RCT1_RESEARCH_END_AVAILABLE)
+ {
+ break;
+ }
+
+ if (researchItem2->category == RCT1_RESEARCH_CATEGORY_VEHICLE &&
+ researchItem2->related_ride == rideType)
+ {
+ AddEntryForVehicleType(rideType, researchItem2->item);
+ numVehicles++;
+ }
+ }
+
+ // If no vehicles found so just add the default for this ride
+ if (numVehicles == 0)
+ {
+ AddEntryForRideType(rideType);
+ }
+ break;
+ }
+ }
+ }
+}
+
+void S4Importer::AddAvailableEntriesFromMap()
+{
+ size_t maxTiles = 128 * 128;
+ size_t tileIndex = 0;
+ rct_map_element * mapElement = _s4.map_elements;
+
+ while (tileIndex < maxTiles)
+ {
+ switch (map_element_get_type(mapElement)) {
+ case MAP_ELEMENT_TYPE_SCENERY:
+ AddEntryForSmallScenery(mapElement->properties.scenery.type);
+ break;
+ }
+
+ if (map_element_is_last_for_tile(mapElement++))
+ {
+ tileIndex++;
+ }
+ }
+}
+
+void S4Importer::AddAvailableEntriesFromRides()
+{
+ for (size_t i = 0; i < Util::CountOf(_s4.rides); i++)
+ {
+ rct1_ride * ride = &_s4.rides[i];
+
+ // TODO might need to check if ride type has a vehicle type
+ AddEntryForVehicleType(ride->type, ride->vehicle_type);
+ }
+}
+
+void S4Importer::AddEntryForRideType(uint8 rideType)
+{
+ if (_rideTypeToRideEntryMap[rideType] == 255)
+ {
+ const char * entryName = RCT1::Tables::GetRideTypeObject(rideType);
+ _rideEntries.Add(entryName);
+ _rideTypeToRideEntryMap[rideType] = (uint8)_rideEntries.GetCount();
+ }
+}
+
+void S4Importer::AddEntryForVehicleType(uint8 rideType, uint8 vehicleType)
+{
+ if (_vehicleTypeToRideEntryMap[rideType] == 255)
+ {
+ const char * entryName = RCT1::Tables::GetVehicleObject(vehicleType);
+
+ uint8 rideEntryIndex = (uint8)_rideEntries.GetCount();
+ _vehicleTypeToRideEntryMap[vehicleType] = rideEntryIndex;
+ _rideEntries.Add(entryName);
+
+ // Just overwrite this with the vehicle entry for now...
+ _rideTypeToRideEntryMap[rideType] = rideEntryIndex;
+ }
+}
+
+void S4Importer::AddEntryForSmallScenery(uint8 smallSceneryType)
+{
+ if (_smallSceneryTypeToEntryMap[smallSceneryType] == 255)
+ {
+ const char * entryName = RCT1::Tables::GetSmallSceneryObject(smallSceneryType);
+ _smallSceneryEntries.Add(entryName);
+ _smallSceneryTypeToEntryMap[smallSceneryType] = (uint8)_rideEntries.GetCount();
+ }
+}
+
+void S4Importer::AddEntriesForSceneryTheme(uint8 sceneryThemeType)
+{
+ const char * entryName = RCT1::Tables::GetSceneryGroupObject(sceneryThemeType);
+
+ _sceneryThemeTypeToEntryMap[sceneryThemeType] = (uint8)_sceneryGroupEntries.GetCount();
+ _sceneryGroupEntries.Add(entryName);
+
+ // TODO add entries for all scenery items belonging to scenery group
+}
+
+const rct1_research_item * S4Importer::GetResearchList(size_t * count)
+{
+ // Loopy Landscapes stores research items in a different place
+ if (_gameVersion == FILE_VERSION_RCT1_LL)
+ {
+ *count = Util::CountOf(_s4.research_items_LL);
+ return _s4.research_items_LL;
+ }
+ else
+ {
+ *count = Util::CountOf(_s4.research_items);
+ return _s4.research_items;
+ }
+}
+
diff --git a/src/rct1/import.h b/src/rct1/import.h
new file mode 100644
index 0000000000..dd878fc8f4
--- /dev/null
+++ b/src/rct1/import.h
@@ -0,0 +1,14 @@
+#pragma once
+
+namespace RCT1
+{
+ namespace Tables
+ {
+ const char * GetRideTypeObject(uint8 rideType);
+ const char * GetVehicleObject(uint8 vehicleType);
+ const char * GetSmallSceneryObject(uint8 smallSceneryType);
+ const char * GetLargeSceneryObject(uint8 largeSceneryType);
+ const char * GetWallObject(uint8 wallType);
+ const char * GetSceneryGroupObject(uint8 sceneryGroupType);
+ }
+}
diff --git a/src/rct1/tables.cpp b/src/rct1/tables.cpp
new file mode 100644
index 0000000000..bb7670f657
--- /dev/null
+++ b/src/rct1/tables.cpp
@@ -0,0 +1,832 @@
+#include
+
+#include "../common.h"
+#include "../core/List.hpp"
+#include "../ride/ride.h"
+#include "import.h"
+
+namespace RCT1
+{
+ const char * DefaultParkEntranceObject = "PKENT1 ";
+
+ namespace Tables
+ {
+ uint8 GetRideType(uint8 rideType)
+ {
+ static uint8 map[] =
+ {
+ RIDE_TYPE_WOODEN_ROLLER_COASTER,
+ RIDE_TYPE_STAND_UP_ROLLER_COASTER,
+ RIDE_TYPE_SUSPENDED_SWINGING_COASTER,
+ RIDE_TYPE_INVERTED_ROLLER_COASTER,
+ RIDE_TYPE_JUNIOR_ROLLER_COASTER,
+ RIDE_TYPE_MINIATURE_RAILWAY,
+ RIDE_TYPE_MONORAIL,
+ RIDE_TYPE_MINI_SUSPENDED_COASTER,
+ RIDE_TYPE_BOAT_RIDE,
+ RIDE_TYPE_WOODEN_WILD_MOUSE,
+ RIDE_TYPE_STEEPLECHASE,
+ RIDE_TYPE_CAR_RIDE,
+ RIDE_TYPE_LAUNCHED_FREEFALL,
+ RIDE_TYPE_BOBSLEIGH_COASTER,
+ RIDE_TYPE_OBSERVATION_TOWER,
+ RIDE_TYPE_LOOPING_ROLLER_COASTER,
+ RIDE_TYPE_DINGHY_SLIDE,
+ RIDE_TYPE_MINE_TRAIN_COASTER,
+ RIDE_TYPE_CHAIRLIFT,
+ RIDE_TYPE_CORKSCREW_ROLLER_COASTER,
+ RIDE_TYPE_MAZE,
+ RIDE_TYPE_SPIRAL_SLIDE,
+ RIDE_TYPE_GO_KARTS,
+ RIDE_TYPE_LOG_FLUME,
+ RIDE_TYPE_RIVER_RAPIDS,
+ RIDE_TYPE_DODGEMS,
+ RIDE_TYPE_PIRATE_SHIP,
+ RIDE_TYPE_SWINGING_INVERTER_SHIP,
+ RIDE_TYPE_FOOD_STALL,
+ RIDE_TYPE_FOOD_STALL,
+ RIDE_TYPE_DRINK_STALL,
+ RIDE_TYPE_FOOD_STALL,
+ RIDE_TYPE_SHOP,
+ RIDE_TYPE_MERRY_GO_ROUND,
+ RIDE_TYPE_SHOP,
+ RIDE_TYPE_INFORMATION_KIOSK,
+ RIDE_TYPE_TOILETS,
+ RIDE_TYPE_FERRIS_WHEEL,
+ RIDE_TYPE_MOTION_SIMULATOR,
+ RIDE_TYPE_3D_CINEMA,
+ RIDE_TYPE_TOP_SPIN,
+ RIDE_TYPE_SPACE_RINGS,
+ RIDE_TYPE_REVERSE_FREEFALL_COASTER,
+ RIDE_TYPE_SHOP,
+ RIDE_TYPE_VERTICAL_DROP_ROLLER_COASTER,
+ RIDE_TYPE_FOOD_STALL,
+ RIDE_TYPE_TWIST,
+ RIDE_TYPE_HAUNTED_HOUSE,
+ RIDE_TYPE_FOOD_STALL,
+ RIDE_TYPE_CIRCUS_SHOW,
+ RIDE_TYPE_GHOST_TRAIN,
+ RIDE_TYPE_TWISTER_ROLLER_COASTER,
+ RIDE_TYPE_WOODEN_ROLLER_COASTER,
+ RIDE_TYPE_SIDE_FRICTION_ROLLER_COASTER,
+ RIDE_TYPE_WILD_MOUSE,
+ RIDE_TYPE_FOOD_STALL,
+ RIDE_TYPE_FOOD_STALL,
+ RIDE_TYPE_SHOP,
+ RIDE_TYPE_FOOD_STALL,
+ RIDE_TYPE_VIRGINIA_REEL,
+ RIDE_TYPE_SPLASH_BOATS,
+ RIDE_TYPE_MINI_HELICOPTERS,
+ RIDE_TYPE_LAY_DOWN_ROLLER_COASTER,
+ RIDE_TYPE_SUSPENDED_MONORAIL,
+ RIDE_TYPE_NULL,
+ RIDE_TYPE_REVERSER_ROLLER_COASTER,
+ RIDE_TYPE_HEARTLINE_TWISTER_COASTER,
+ RIDE_TYPE_MINI_GOLF,
+ RIDE_TYPE_NULL,
+ RIDE_TYPE_ROTO_DROP,
+ RIDE_TYPE_FLYING_SAUCERS,
+ RIDE_TYPE_CROOKED_HOUSE,
+ RIDE_TYPE_MONORAIL_CYCLES,
+ RIDE_TYPE_COMPACT_INVERTED_COASTER,
+ RIDE_TYPE_WATER_COASTER,
+ RIDE_TYPE_AIR_POWERED_VERTICAL_COASTER,
+ RIDE_TYPE_INVERTED_HAIRPIN_COASTER,
+ RIDE_TYPE_BOAT_RIDE,
+ RIDE_TYPE_SHOP,
+ RIDE_TYPE_RIVER_RAFTS,
+ RIDE_TYPE_FOOD_STALL,
+ RIDE_TYPE_ENTERPRISE,
+ RIDE_TYPE_DRINK_STALL,
+ RIDE_TYPE_FOOD_STALL,
+ RIDE_TYPE_DRINK_STALL
+ };
+ return map[rideType];
+ }
+
+ const char * GetRideTypeObject(uint8 rideType)
+ {
+ static const char * map[] =
+ {
+ "PTCT1 ",
+ "TOGST ",
+ "ARRSW1 ",
+ "NEMT ",
+ "ZLDB ",
+ "NRL ",
+ "MONO2 ",
+ "BATFL ",
+ "RBOAT ",
+ "WMOUSE ",
+ "STEEP1 ",
+ "SPCAR ",
+ "SSC1 ",
+ "BOB1 ",
+ "OBS1 ",
+ "SCHT1 ",
+ "DING1 ",
+ "AMT1 ",
+ "CLIFT1 ",
+ "ARRT1 ",
+ "HMAZE ",
+ "HSKELT ",
+ "KART1 ",
+ "LFB1 ",
+ "RAPBOAT ",
+ "DODG1 ",
+ "SWSH1 ",
+ "SWSH2 ",
+ "ICECR1 ",
+ "CHPSH ",
+ "DRNKS ",
+ "CNDYF ",
+ "BURGB ",
+ "MGR1 ",
+ "BALLN ",
+ "INFOK ",
+ "TLT1 ",
+ "FWH1 ",
+ "SIMPOD ",
+ "C3D ",
+ "TOPSP1 ",
+ "SRINGS ",
+ "REVF1 ",
+ "SOUVS ",
+ "BMVD ",
+ "PIZZS ",
+ "TWIST1 ",
+ "HHBUILD ",
+ "POPCS ",
+ "CIRCUS1 ",
+ "GTC ",
+ "BMSD ",
+ "MFT ",
+ "SFRIC1 ",
+ "SMC1 ",
+ "HOTDS ",
+ "SQDST ",
+ "HATST ",
+ "TOFFS ",
+ "VREEL ",
+ "SPBOAT ",
+ "MONBK ",
+ "BMAIR ",
+ "SMONO ",
+ " ",
+ "REVCAR ",
+ "UTCAR ",
+ "GOLF1 ",
+ " ",
+ "GDROP1 ",
+ "FSAUC ",
+ "CHBUILD ",
+ "HELICAR ",
+ "SLCT ",
+ "CSTBOAT ",
+ "THCAR ",
+ "IVMC1 ",
+ "JSKI ",
+ "TSHRT ",
+ "RFTBOAT ",
+ "DOUGH ",
+ "ENTERP ",
+ "COFFS ",
+ "CHCKS ",
+ "LEMST ",
+ };
+ return map[rideType];
+ }
+
+ const char * GetVehicleObject(uint8 vehicleType)
+ {
+ static const char * map[] =
+ {
+ "PTCT1 ", // RCT1_VEHICLE_TYPE_STEEL_ROLLER_COASTER_TRAIN
+ "TOGST ", // RCT1_VEHICLE_TYPE_STEEL_ROLLER_COASTER_TRAIN_BACKWARDS
+ "ARRSW1 ", // RCT1_VEHICLE_TYPE_WOODEN_ROLLER_COASTER_TRAIN
+ "NEMT ", // RCT1_VEHICLE_TYPE_INVERTED_COASTER_TRAIN (Not in RCT2)
+ "ZLDB ", // RCT1_VEHICLE_TYPE_SUSPENDED_SWINGING_CARS
+ "NRL ", // RCT1_VEHICLE_TYPE_LADYBIRD_CARS
+ "MONO2 ", // RCT1_VEHICLE_TYPE_STANDUP_ROLLER_COASTER_CARS
+ "BATFL ", // RCT1_VEHICLE_TYPE_SPINNING_CARS
+ "RBOAT ", // RCT1_VEHICLE_TYPE_SINGLE_PERSON_SWINGING_CHAIRS
+ "WMOUSE ", // RCT1_VEHICLE_TYPE_SWANS_PEDAL_BOATS
+ "STEEP1 ", // RCT1_VEHICLE_TYPE_LARGE_MONORAIL_TRAIN
+ "SPCAR ", // RCT1_VEHICLE_TYPE_CANOES
+ "SSC1 ", // RCT1_VEHICLE_TYPE_ROWING_BOATS
+ "BOB1 ", // RCT1_VEHICLE_TYPE_STEAM_TRAIN
+ "OBS1 ", // RCT1_VEHICLE_TYPE_WOODEN_MOUSE_CARS
+ "SCHT1 ", // RCT1_VEHICLE_TYPE_BUMPER_BOATS
+ "DING1 ", // RCT1_VEHICLE_TYPE_WOODEN_ROLLER_COASTER_TRAIN_BACKWARDS
+ "AMT1 ", // RCT1_VEHICLE_TYPE_ROCKET_CARS
+ "CLIFT1 ", // RCT1_VEHICLE_TYPE_HORSES // Steeplechase
+ "ARRT1 ", // RCT1_VEHICLE_TYPE_SPORTSCARS
+ "HMAZE ", // RCT1_VEHICLE_TYPE_LYING_DOWN_SWINGING_CARS (Inverted single-rail)
+ "HSKELT ", // RCT1_VEHICLE_TYPE_WOODEN_MINE_CARS
+ "KART1 ", // RCT1_VEHICLE_TYPE_SUSPENDED_SWINGING_AIRPLANE_CARS
+ "LFB1 ", // RCT1_VEHICLE_TYPE_SMALL_MONORAIL_CARS
+ "RAPBOAT ", // RCT1_VEHICLE_TYPE_WATER_TRICYCLES
+ "DODG1 ", // RCT1_VEHICLE_TYPE_LAUNCHED_FREEFALL_CAR
+ "SWSH1 ", // RCT1_VEHICLE_TYPE_BOBSLEIGH_CARS
+ "SWSH2 ", // RCT1_VEHICLE_TYPE_DINGHIES
+ "ICECR1 ", // RCT1_VEHICLE_TYPE_ROTATING_CABIN
+ "CHPSH ", // RCT1_VEHICLE_TYPE_MINE_TRAIN
+ "DRNKS ", // RCT1_VEHICLE_TYPE_CHAIRLIFT_CARS
+ "CNDYF ", // RCT1_VEHICLE_TYPE_CORKSCREW_ROLLER_COASTER_TRAIN
+ "BURGB ", // RCT1_VEHICLE_TYPE_MOTORBIKES
+ "MGR1 ", // RCT1_VEHICLE_TYPE_RACING_CARS
+ "BALLN ", // RCT1_VEHICLE_TYPE_TRUCKS
+ "INFOK ", // RCT1_VEHICLE_TYPE_GO_KARTS
+ "TLT1 ", // RCT1_VEHICLE_TYPE_RAPIDS_BOATS
+ "FWH1 ", // RCT1_VEHICLE_TYPE_LOG_FLUME_BOATS
+ "SIMPOD ", // RCT1_VEHICLE_TYPE_DODGEMS
+ "C3D ", // RCT1_VEHICLE_TYPE_SWINGING_SHIP
+ "TOPSP1 ", // RCT1_VEHICLE_TYPE_SWINGING_INVERTER_SHIP
+ "SRINGS ", // RCT1_VEHICLE_TYPE_MERRY_GO_ROUND
+ "REVF1 ", // RCT1_VEHICLE_TYPE_FERRIS_WHEEL
+ "SOUVS ", // RCT1_VEHICLE_TYPE_SIMULATOR_POD
+ "BMVD ", // RCT1_VEHICLE_TYPE_CINEMA_BUILDING
+ "PIZZS ", // RCT1_VEHICLE_TYPE_TOPSPIN_CAR
+ "TWIST1 ", // RCT1_VEHICLE_TYPE_SPACE_RINGS
+ "HHBUILD ", // RCT1_VEHICLE_TYPE_REVERSE_FREEFALL_ROLLER_COASTER_CAR
+ "POPCS ", // RCT1_VEHICLE_TYPE_VERTICAL_ROLLER_COASTER_CARS
+ "CIRCUS1 ", // RCT1_VEHICLE_TYPE_CAT_CARS
+ "GTC ", // RCT1_VEHICLE_TYPE_TWIST_ARMS_AND_CARS
+ "BMSD ", // RCT1_VEHICLE_TYPE_HAUNTED_HOUSE_BUILDING
+ "MFT ", // RCT1_VEHICLE_TYPE_LOG_CARS
+ "SFRIC1 ", // RCT1_VEHICLE_TYPE_CIRCUS_TENT
+ "SMC1 ", // RCT1_VEHICLE_TYPE_GHOST_TRAIN_CARS
+ "HOTDS ", // RCT1_VEHICLE_TYPE_STEEL_TWISTER_ROLLER_COASTER_TRAIN
+ "SQDST ", // RCT1_VEHICLE_TYPE_WOODEN_TWISTER_ROLLER_COASTER_TRAIN
+ "HATST ", // RCT1_VEHICLE_TYPE_WOODEN_SIDE_FRICTION_CARS
+ "TOFFS ", // RCT1_VEHICLE_TYPE_VINTAGE_CARS
+ "VREEL ", // RCT1_VEHICLE_TYPE_STEAM_TRAIN_COVERED_CARS
+ "SPBOAT ", // RCT1_VEHICLE_TYPE_STAND_UP_STEEL_TWISTER_ROLLER_COASTER_TRAIN
+ "MONBK ", // RCT1_VEHICLE_TYPE_FLOORLESS_STEEL_TWISTER_ROLLER_COASTER_TRAIN
+ "BMAIR ", // RCT1_VEHICLE_TYPE_STEEL_MOUSE_CARS
+ "SMONO ", // RCT1_VEHICLE_TYPE_CHAIRLIFT_CARS_ALTERNATIVE
+ " ", // RCT1_VEHICLE_TYPE_SUSPENDED_MONORAIL_TRAIN
+ "REVCAR ", // RCT1_VEHICLE_TYPE_HELICOPTER_CARS
+ "UTCAR ", // RCT1_VEHICLE_TYPE_VIRGINIA_REEL_TUBS
+ "GOLF1 ", // RCT1_VEHICLE_TYPE_REVERSER_CARS
+ " ", // RCT1_VEHICLE_TYPE_GOLFERS
+ "GDROP1 ", // RCT1_VEHICLE_TYPE_RIVER_RIDE_BOATS
+ "FSAUC ", // RCT1_VEHICLE_TYPE_FLYING_ROLLER_COASTER_TRAIN
+ "CHBUILD ", // RCT1_VEHICLE_TYPE_NON_LOOPING_STEEL_TWISTER_ROLLER_COASTER_TRAIN
+ "HELICAR ", // RCT1_VEHICLE_TYPE_HEARTLINE_TWISTER_CARS
+ "SLCT ", // RCT1_VEHICLE_TYPE_HEARTLINE_TWISTER_CARS_REVERSED
+ "CSTBOAT ", // RCT1_VEHICLE_TYPE_RESERVED
+ "THCAR ", // RCT1_VEHICLE_TYPE_ROTODROP_CAR
+ "IVMC1 ", // RCT1_VEHICLE_TYPE_FLYING_SAUCERS
+ "JSKI ", // RCT1_VEHICLE_TYPE_CROOKED_HOUSE_BUILDING
+ "TSHRT ", // RCT1_VEHICLE_TYPE_BICYCLES
+ "RFTBOAT ", // RCT1_VEHICLE_TYPE_HYPERCOASTER_TRAIN
+ "DOUGH ", // RCT1_VEHICLE_TYPE_4_ACROSS_INVERTED_COASTER_TRAIN
+ "ENTERP ", // RCT1_VEHICLE_TYPE_WATER_COASTER_BOATS
+ "COFFS ", // RCT1_VEHICLE_TYPE_FACEOFF_CARS
+ "CHCKS ", // RCT1_VEHICLE_TYPE_JET_SKIS
+ "LEMST ", // RCT1_VEHICLE_TYPE_RAFT_BOATS
+ "WMSPIN ", // RCT1_VEHICLE_TYPE_AMERICAN_STYLE_STEAM_TRAIN
+ "SWANS ", // RCT1_VEHICLE_TYPE_AIR_POWERED_COASTER_TRAIN
+ "MONO1 ", // RCT1_VEHICLE_TYPE_SUSPENDED_WILD_MOUSE_CARS (Inverted Hairpin in RCT2)
+ "CBOAT ", // RCT1_VEHICLE_TYPE_ENTERPRISE_WHEEL
+ };
+ return map[vehicleType];
+ }
+
+ const char * GetSmallSceneryObject(uint8 smallSceneryType)
+ {
+ static const char * map[] =
+ {
+ "TL0 ",
+ "TL1 ",
+ "TL2 ",
+ "TL3 ",
+ "TM0 ",
+ "TM1 ",
+ "TM2 ",
+ "TM3 ",
+ "TS0 ",
+ "TS1 ",
+ "TS2 ",
+ "TS3 ",
+ "TS4 ",
+ "TS5 ",
+ "TS6 ",
+ "TIC ",
+ "TLC ",
+ "TMC ",
+ "TMP ",
+ "TITC ",
+ "TGHC ",
+ "TAC ",
+ "TGHC2 ",
+ "TCJ ",
+ "TMBJ ",
+ "TCF ",
+ "TCL ",
+ "TRF ",
+ "TRF2 ",
+ "TEL ",
+ "TAP ",
+ "TSP ",
+ "TMZP ",
+ "TCRP ",
+ "TBP ",
+ "TLP ",
+ "TWP ",
+ "TAS ",
+ "TMG ",
+ "TWW ",
+ "TSB ",
+ "TVL ",
+ "TCT ",
+ "TEF ",
+ "TAL ",
+ "TSQ ",
+ "THT ",
+ "TCB ",
+ "TDM ",
+ "TSD ",
+ "TGS ",
+ "TUS ",
+ "TH1 ",
+ "TBC ",
+ "TH2 ",
+ "TPM ",
+ "TSC ",
+ "TG1 ",
+ "TWF ",
+ "TSH0 ",
+ "TSH1 ",
+ "TSH2 ",
+ "TSH3 ",
+ "TSH4 ",
+ "TSH5 ",
+ "TG2 ",
+ "TG3 ",
+ "TG4 ",
+ "TG5 ",
+ "TG6 ",
+ "TG7 ",
+ "TG8 ",
+ "TG9 ",
+ "TG10 ",
+ "TG11 ",
+ "TG12 ",
+ "TG13 ",
+ "TG14 ",
+ "TT1 ",
+ "TDF ",
+ "TSH ",
+ "THRS ",
+ "TSTD ",
+ "TRMS ",
+ "TRWS ",
+ "TRC ",
+ "TQF ",
+ "TES1 ",
+ "TEN ",
+ "TERS ",
+ "TERB ",
+ "TEP ",
+ "TST1 ",
+ "TST2 ",
+ "TMS1 ",
+ "TAS1 ",
+ "TAS2 ",
+ "TAS3 ",
+ "TST3 ",
+ "TST4 ",
+ "TST5 ",
+ "TAS4 ",
+ "TCY ",
+ "TBW ",
+ "TBR1 ",
+ "TBR2 ",
+ "TML ",
+ "TMW ",
+ "TBR3 ",
+ "TBR4 ",
+ "TMJ ",
+ "TBR ",
+ "TMO1 ",
+ "TMO2 ",
+ "TMO3 ",
+ "TMO4 ",
+ "TMO5 ",
+ "TWH1 ",
+ "TWH2 ",
+ "TNS ",
+ "TP1 ",
+ "TP2 ",
+ "TK1 ",
+ "TK2 ",
+ "TR1 ",
+ "TR2 ",
+ "TQ1 ",
+ "TQ2 ",
+ "TWN ",
+ "TCE ",
+ "TCO ",
+ "THL ",
+ "TCC ",
+ "TB1 ",
+ "TB2 ",
+ "TK3 ",
+ "TK4 ",
+ "TBN ",
+ "TBN1 ",
+ "TDT1 ",
+ "TDT2 ",
+ "TDT3 ",
+ "TMM1 ",
+ "TMM2 ",
+ "TMM3 ",
+ "TGS1 ",
+ "TGS2 ",
+ "TGS3 ",
+ "TGS4 ",
+ "TDN4 ",
+ "TDN5 ",
+ "TJT1 ",
+ "TJT2 ",
+ "TJB1 ",
+ "TTF ",
+ "TF1 ",
+ "TF2 ",
+ "TGE1 ",
+ "TJT3 ",
+ "TJT4 ",
+ "TJP1 ",
+ "TJB2 ",
+ "TGE2 ",
+ "TJT5 ",
+ "TJB3 ",
+ "TJB4 ",
+ "TJT6 ",
+ "TJP2 ",
+ "TGE3 ",
+ "TCK ",
+ "TGE4 ",
+ "TGE5 ",
+ "TG15 ",
+ "TG16 ",
+ "TG17 ",
+ "TG18 ",
+ "TG19 ",
+ "TG20 ",
+ "TG21 ",
+ "TSM ",
+ "TIG ",
+ "TCFS ",
+ "TRFS ",
+ "TRF3 ",
+ "TNSS ",
+ "TCT1 ",
+ "TCT2 ",
+ "TSF1 ",
+ "TSF2 ",
+ "TSF3 ",
+ "TCN ",
+ "TTG ",
+ "TSNC ",
+ "TSNB ",
+ "TSCP ",
+ "TCD ",
+ "TSG ",
+ "TSK ",
+ "TGH1 ",
+ "TGH2 ",
+ "TSMP ",
+ "TJF ",
+ "TLY ",
+ "TGC1 ",
+ "TGC2 ",
+ "TGG ",
+ "TSPH ",
+ "TOH1 ",
+ "TOH2 ",
+ "TOT1 ",
+ "TOT2 ",
+ "TOS ",
+ "TOT3 ",
+ "TOT4 ",
+ "TSC2 ",
+ "TSP1 ",
+ "TOH3 ",
+ "TSP2 ",
+ "ROMROOF1",
+ "GEOROOF1",
+ "TNTROOF1",
+ "JNGROOF1",
+ "MINROOF1",
+ "ROMROOF2",
+ "GEOROOF2",
+ "PAGROOF1",
+ "SPCROOF1",
+ "ROOF1 ",
+ "ROOF2 ",
+ "ROOF3 ",
+ "ROOF4 ",
+ "ROOF5 ",
+ "ROOF6 ",
+ "ROOF7 ",
+ "ROOF8 ",
+ "ROOF9 ",
+ "ROOF10 ",
+ "ROOF11 ",
+ "ROOF12 ",
+ "ROOF13 ",
+ "ROOF14 ",
+ "IGROOF ",
+ "CORROOF ",
+ "CORROOF2",
+ };
+ return map[smallSceneryType];
+ }
+
+ const char * GetLargeSceneryObject(uint8 largeSceneryType)
+ {
+ static const char * map[] =
+ {
+ "SCOL ",
+ "SHS1 ",
+ "SSPX ",
+ "SHS2 ",
+ "SCLN ",
+ "SMH1 ",
+ "SMH2 ",
+ "SVLC ",
+ "SPYR ",
+ "SMN1 ",
+ "SMB ",
+ "SSK1 ",
+ "SDN1 ",
+ "SDN2 ",
+ "SDN3 ",
+ "SIP ",
+ "STB1 ",
+ "STB2 ",
+ "STG1 ",
+ "STG2 ",
+ "SCT ",
+ "SOH1 ",
+ "SOH2 ",
+ "SOH3 ",
+ "SGP ",
+ "SSR ",
+ "STH ",
+ "SAH ",
+ "SPS ",
+ "SPG ",
+ "SOB ",
+ "SAH2 ",
+ "SST ",
+ "SSH ",
+ "SAH3 ",
+ "SSIG1 ",
+ "SSIG2 ",
+ "SSIG3 ",
+ "SSIG4 ",
+ };
+ return map[largeSceneryType];
+ }
+
+ const char * GetWallObject(uint8 wallType)
+ {
+ static const char * map[] =
+ {
+ "WMF ",
+ "WMFG ",
+ "WRW ",
+ "WEW ",
+ "WHG ",
+ "WHGG ",
+ "WCW1 ",
+ "WCW2 ",
+ "WSW ",
+ "WSWG ",
+ "WMW ",
+ "WALLGL16",
+ "WFW1 ",
+ "WFWG ",
+ "WPW1 ",
+ "WPW2 ",
+ "WPF ",
+ "WPFG ",
+ "WWTW ",
+ "WMWW ",
+ "WSW1 ",
+ "WSW2 ",
+ "WGW2 ",
+ "WBW ",
+ "WBR1 ",
+ "WBRG ",
+ "WALLCFAR",
+ "WALLPOST",
+ "WBR2 ",
+ "WBR3 ",
+ "WPW3 ",
+ "WJF ",
+ "WCH ",
+ "WCHG ",
+ "WC1 ",
+ "WC2 ",
+ "WC3 ",
+ "WC4 ",
+ "WC5 ",
+ "WC6 ",
+ "WC7 ",
+ "WC8 ",
+ "WC9 ",
+ "WC10 ",
+ "WC11 ",
+ "WC12 ",
+ "WC13 ",
+ "WC14 ",
+ "WC15 ",
+ "WC16 ",
+ "WC17 ",
+ "WC18 ",
+ "WALLBRDR",
+ "WALLBR32",
+ "WALLBR16",
+ "WALLBR8 ",
+ "WALLCF8 ",
+ "WALLCF16",
+ "WALLCF32",
+ "WALLBB8 ",
+ "WALLBB16",
+ "WALLBB32",
+ "WALLRS8 ",
+ "WALLRS16",
+ "WALLRS32",
+ "WALLCB8 ",
+ "WALLCB16",
+ "WALLCB32",
+ "WALLGL8 ",
+ "WALLGL32",
+ "WALLWD8 ",
+ "WALLWD16",
+ "WALLWD32",
+ "WALLTN32",
+ "WALLJN32",
+ "WALLMN32",
+ "WALLSP32",
+ "WALLPG32",
+ "WALLU132",
+ "WALLU232",
+ "WALLCZ32",
+ "WALLCW32",
+ "WALLCY32",
+ "WALLCX32",
+ "WBR1A ",
+ "WBR2A ",
+ "WRWA ",
+ "WWTWA ",
+ "WALLIG16",
+ "WALLIG24",
+ "WALLCO16",
+ "WALLCFDR",
+ "WALLCBDR",
+ "WALLBRWN",
+ "WALLCFWN",
+ "WALLCBWN",
+ };
+ return map[wallType];
+ }
+
+ const char * GetSceneryGroupObject(uint8 sceneryGroupType)
+ {
+ static const char * map[] =
+ {
+ " ", // RCT1_SCENERY_THEME_GENERAL
+ "SCGMINE ", // RCT1_SCENERY_THEME_MINE
+ "SCGCLASS", // RCT1_SCENERY_THEME_CLASSICAL_ROMAN
+ "SCGEGYPT", // RCT1_SCENERY_THEME_EGYPTIAN
+ "SCGMART ", // RCT1_SCENERY_THEME_MARTIAN
+ "SCGWOND ", // RCT1_SCENERY_THEME_TOYLAND
+ "SCGJURAS", // RCT1_SCENERY_THEME_JURASSIC
+ "SCGSPOOK", // RCT1_SCENERY_THEME_GRAVEYARD
+ "SCGJUNGL", // RCT1_SCENERY_THEME_JUNGLE
+ "SCGABSTR", // RCT1_SCENERY_THEME_ABSTRACT
+ "SCGSNOW ", // RCT1_SCENERY_THEME_SNOW_ICE
+ "SCGMEDIE", // RCT1_SCENERY_THEME_MEDIEVAL
+ "SCGSPACE", // RCT1_SCENERY_THEME_SPACE
+ "SCGHALLO", // RCT1_SCENERY_THEME_CREEPY
+ "SCGURBAN", // RCT1_SCENERY_THEME_URBAN
+ "SCGORIEN", // RCT1_SCENERY_THEME_PAGODA
+ };
+ return map[sceneryGroupType];
+ }
+
+ const char * GetWaterObject(uint8 waterType)
+ {
+ static const char * map[] =
+ {
+ "WTRCYAN ",
+ "WTRORNG ",
+ };
+ return map[waterType];
+ }
+
+ const List GetPreferedRideEntryOrder(uint8 rideType)
+ {
+ static const List preferedRideEntryOrder[] =
+ {
+ { "SPDRCR "}, // RIDE_TYPE_SPIRAL_ROLLER_COASTER
+ { "TOGST "}, // RIDE_TYPE_STAND_UP_ROLLER_COASTER
+ { "ARRSW1 ", "VEKVAMP ", "ARRSW2 "}, // RIDE_TYPE_SUSPENDED_SWINGING_COASTER
+ { "NEMT "}, // RIDE_TYPE_INVERTED_ROLLER_COASTER
+ { "ZLDB ", "ZLOG "}, // RIDE_TYPE_JUNIOR_ROLLER_COASTER
+ { "NRL ", "NRL2 ", "AML1 ", "TRAM1 "}, // RIDE_TYPE_MINIATURE_RAILWAY
+ { "MONO1 ", "MONO2 ", "MONO3 "}, // RIDE_TYPE_MONORAIL
+ { "BATFL ", "SKYTR "}, // RIDE_TYPE_MINI_SUSPENDED_COASTER
+ { "RBOAT ", "BBOAT ", "CBOAT ", "SWANS ", "TRIKE ", "JSKI " }, // RIDE_TYPE_BOAT_RIDE
+ { "WMOUSE ", "WMMINE "}, // RIDE_TYPE_WOODEN_WILD_MOUSE
+ { "STEEP1 ", "STEEP2 ", "SBOX "}, // RIDE_TYPE_STEEPLECHASE
+ { "SPCAR ", "RCR ", "TRUCK1 ", "VCR ", "CTCAR " }, // RIDE_TYPE_CAR_RIDE
+ { "SSC1 " }, // RIDE_TYPE_LAUNCHED_FREEFALL
+ { "BOB1 ", "INTBOB " }, // RIDE_TYPE_BOBSLEIGH_COASTER
+ { "OBS1 ", "OBS2 " }, // RIDE_TYPE_OBSERVATION_TOWER
+ { "SCHT1 " }, // RIDE_TYPE_LOOPING_ROLLER_COASTER
+ { "DING1 " }, // RIDE_TYPE_DINGHY_SLIDE
+ { "AMT1 " }, // RIDE_TYPE_MINE_TRAIN_COASTER
+ { "CLIFT1 ", "CLIFT2 " }, // RIDE_TYPE_CHAIRLIFT
+ { "ARRT1 ", "ARRT2 " }, // RIDE_TYPE_CORKSCREW_ROLLER_COASTER
+ { }, // RIDE_TYPE_MAZE
+ { }, // RIDE_TYPE_SPIRAL_SLIDE
+ { "KART1 " }, // RIDE_TYPE_GO_KARTS
+ { "LFB1 " }, // RIDE_TYPE_LOG_FLUME
+ { "RAPBOAT " }, // RIDE_TYPE_RIVER_RAPIDS
+ { }, // RIDE_TYPE_DODGEMS
+ { }, // RIDE_TYPE_PIRATE_SHIP
+ { }, // RIDE_TYPE_SWINGING_INVERTER_SHIP
+ { }, // RIDE_TYPE_FOOD_STALL
+ { }, // RIDE_TYPE_1D
+ { }, // RIDE_TYPE_DRINK_STALL
+ { }, // RIDE_TYPE_1F
+ { }, // RIDE_TYPE_SHOP
+ { }, // RIDE_TYPE_MERRY_GO_ROUND
+ { }, // RIDE_TYPE_22
+ { }, // RIDE_TYPE_INFORMATION_KIOSK
+ { }, // RIDE_TYPE_TOILETS
+ { }, // RIDE_TYPE_FERRIS_WHEEL
+ { }, // RIDE_TYPE_MOTION_SIMULATOR
+ { }, // RIDE_TYPE_3D_CINEMA
+ { }, // RIDE_TYPE_TOP_SPIN
+ { }, // RIDE_TYPE_SPACE_RINGS
+ { "REVF1 " }, // RIDE_TYPE_REVERSE_FREEFALL_COASTER
+ { "LIFT1 " }, // RIDE_TYPE_LIFT
+ { "BMVD " }, // RIDE_TYPE_VERTICAL_DROP_ROLLER_COASTER
+ { }, // RIDE_TYPE_CASH_MACHINE
+ { }, // RIDE_TYPE_TWIST
+ { }, // RIDE_TYPE_HAUNTED_HOUSE
+ { }, // RIDE_TYPE_FIRST_AID
+ { }, // RIDE_TYPE_CIRCUS_SHOW
+ { "GTC ", "HMCAR " }, // RIDE_TYPE_GHOST_TRAIN
+ { "BMSD ", "BMSU ", "BMFL ", "BMRB ", "GOLTR " }, // RIDE_TYPE_TWISTER_ROLLER_COASTER
+ { "PTCT1 ", "MFT ", "PTCT2 " }, // RIDE_TYPE_WOODEN_ROLLER_COASTER
+ { "SFRIC1 " }, // RIDE_TYPE_SIDE_FRICTION_ROLLER_COASTER
+ { "SMC1 ", "SMC2 ", "WMSPIN " }, // RIDE_TYPE_WILD_MOUSE
+ { "ARRX " }, // RIDE_TYPE_MULTI_DIMENSION_ROLLER_COASTER
+ { }, // RIDE_TYPE_38
+ { "BMAIR " }, // RIDE_TYPE_FLYING_ROLLER_COASTER
+ { }, // RIDE_TYPE_3A
+ { "VREEL " }, // RIDE_TYPE_VIRGINIA_REEL
+ { "SPBOAT " }, // RIDE_TYPE_SPLASH_BOATS
+ { "HELICAR " }, // RIDE_TYPE_MINI_HELICOPTERS
+ { "VEKST " }, // RIDE_TYPE_LAY_DOWN_ROLLER_COASTER
+ { "SMONO " }, // RIDE_TYPE_SUSPENDED_MONORAIL
+ { }, // RIDE_TYPE_40
+ { "REVCAR " }, // RIDE_TYPE_REVERSER_ROLLER_COASTER
+ { "UTCAR ", "UTCARR " }, // RIDE_TYPE_HEARTLINE_TWISTER_COASTER
+ { }, // RIDE_TYPE_MINI_GOLF
+ { "INTST " }, // RIDE_TYPE_GIGA_COASTER
+ { "GDROP1 " }, // RIDE_TYPE_ROTO_DROP
+ { }, // RIDE_TYPE_FLYING_SAUCERS
+ { }, // RIDE_TYPE_CROOKED_HOUSE
+ { "MONBK " }, // RIDE_TYPE_MONORAIL_CYCLES
+ { "SLCT ", "SLCFO ", "VEKDV " }, // RIDE_TYPE_COMPACT_INVERTED_COASTER
+ { "CSTBOAT " }, // RIDE_TYPE_WATER_COASTER
+ { "THCAR " }, // RIDE_TYPE_AIR_POWERED_VERTICAL_COASTER
+ { "IVMC1 " }, // RIDE_TYPE_INVERTED_HAIRPIN_COASTER
+ { }, // RIDE_TYPE_MAGIC_CARPET
+ { "SUBMAR " }, // RIDE_TYPE_SUBMARINE_RIDE
+ { "RFTBOAT " }, // RIDE_TYPE_RIVER_RAFTS
+ { }, // RIDE_TYPE_50
+ { }, // RIDE_TYPE_ENTERPRISE
+ { }, // RIDE_TYPE_52
+ { }, // RIDE_TYPE_53
+ { }, // RIDE_TYPE_54
+ { }, // RIDE_TYPE_55
+ { "INTINV " }, // RIDE_TYPE_INVERTED_IMPULSE_COASTER
+ { "WCATC ", "RCKC ", "JSTAR1 " }, // RIDE_TYPE_MINI_ROLLER_COASTER
+ { "PMT1 " }, // RIDE_TYPE_MINE_RIDE
+ { "PREMT1 " }, // RIDE_TYPE_59
+ }; // RIDE_TYPE_LIM_LAUNCHED_ROLLER_COASTER
+ return preferedRideEntryOrder[rideType];
+ }
+ }
+}
diff --git a/src/util/sawyercoding.h b/src/util/sawyercoding.h
index 2b737c6980..46c4d01cdb 100644
--- a/src/util/sawyercoding.h
+++ b/src/util/sawyercoding.h
@@ -21,6 +21,7 @@
#ifndef _SAWYERCODING_H_
#define _SAWYERCODING_H_
+#include
#include "../common.h"
typedef struct {