From 512ed6ce98b6709a1a26aa339dd0ae738512f67a Mon Sep 17 00:00:00 2001 From: Ted John Date: Sun, 17 Apr 2016 16:12:58 +0100 Subject: [PATCH] fix compile issues and bugs --- openrct2.vcxproj.filters | 2 ++ src/core/Diagnostics.cpp | 3 +- src/core/List.hpp | 8 +++++ src/core/Path.cpp | 2 +- src/rct1/S4Importer.cpp | 64 ++++++++++++++++++++++++++-------------- src/rct1/tables.cpp | 10 ++++--- 6 files changed, 61 insertions(+), 28 deletions(-) diff --git a/openrct2.vcxproj.filters b/openrct2.vcxproj.filters index 9b8fd741cb..a7dc1e69d1 100644 --- a/openrct2.vcxproj.filters +++ b/openrct2.vcxproj.filters @@ -593,6 +593,8 @@ + + diff --git a/src/core/Diagnostics.cpp b/src/core/Diagnostics.cpp index 644cb59892..210dad85cb 100644 --- a/src/core/Diagnostics.cpp +++ b/src/core/Diagnostics.cpp @@ -13,7 +13,8 @@ namespace Debug { #if DEBUG #if __WINDOWS__ - if (IsDebuggerPresent()) { + if (IsDebuggerPresent()) + { DebugBreak(); } #endif diff --git a/src/core/List.hpp b/src/core/List.hpp index 87d17e4648..14cbb0aad6 100644 --- a/src/core/List.hpp +++ b/src/core/List.hpp @@ -49,6 +49,14 @@ public: this->push_back(item); } + void AddRange(std::initializer_list initializerList) + { + for (T item : initializerList) + { + this->push_back(item); + } + } + void Insert(T item, size_t index) { Guard::ArgumentInRange(index, (size_t)0, this->size()); diff --git a/src/core/Path.cpp b/src/core/Path.cpp index 639d5618ee..21a11a94bc 100644 --- a/src/core/Path.cpp +++ b/src/core/Path.cpp @@ -42,7 +42,7 @@ namespace Path { lastPathSeperator = ch; } -#ifdef _WINDOWS_ +#ifdef __WINDOWS__ // Windows also allows forward slashes in paths else if (*ch == '/') { diff --git a/src/rct1/S4Importer.cpp b/src/rct1/S4Importer.cpp index 2efecc2a2a..798f1eae77 100644 --- a/src/rct1/S4Importer.cpp +++ b/src/rct1/S4Importer.cpp @@ -1,15 +1,13 @@ -#include - #include "S4Importer.h" #include "../core/Exception.hpp" +#include "../core/Guard.hpp" #include "../core/List.hpp" #include "../core/Path.hpp" #include "../core/String.hpp" #include "../core/Util.hpp" #include "import.h" - extern "C" { #include "../audio/audio.h" @@ -107,6 +105,16 @@ void S4Importer::Initialise() void S4Importer::CreateAvailableObjectMappings() { + // Add defaults + _sceneryGroupEntries.AddRange({ + "SCGTREES", + "SCGPATHX", + "SCGSHRUB", + "SCGGARDN", + "SCGFENCE", + "SCGWALLS" + }); + AddAvailableEntriesFromResearchList(); AddAvailableEntriesFromMap(); AddAvailableEntriesFromRides(); @@ -199,9 +207,11 @@ 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); + if (ride->type != RCT1_RIDE_TYPE_NULL) + { + // TODO might need to check if ride type has a vehicle type + AddEntryForVehicleType(ride->type, ride->vehicle_type); + } } } @@ -210,14 +220,14 @@ void S4Importer::AddEntryForRideType(uint8 rideType) if (_rideTypeToRideEntryMap[rideType] == 255) { const char * entryName = RCT1::GetRideTypeObject(rideType); - _rideEntries.Add(entryName); _rideTypeToRideEntryMap[rideType] = (uint8)_rideEntries.GetCount(); + _rideEntries.Add(entryName); } } void S4Importer::AddEntryForVehicleType(uint8 rideType, uint8 vehicleType) { - if (_vehicleTypeToRideEntryMap[rideType] == 255) + if (_vehicleTypeToRideEntryMap[vehicleType] == 255) { const char * entryName = RCT1::GetVehicleObject(vehicleType); @@ -235,8 +245,8 @@ void S4Importer::AddEntryForSmallScenery(uint8 smallSceneryType) if (_smallSceneryTypeToEntryMap[smallSceneryType] == 255) { const char * entryName = RCT1::GetSmallSceneryObject(smallSceneryType); - _smallSceneryEntries.Add(entryName); _smallSceneryTypeToEntryMap[smallSceneryType] = (uint8)_smallSceneryEntries.GetCount(); + _smallSceneryEntries.Add(entryName); } } @@ -245,8 +255,8 @@ void S4Importer::AddEntryForLargeScenery(uint8 largeSceneryType) if (_largeSceneryTypeToEntryMap[largeSceneryType] == 255) { const char * entryName = RCT1::GetLargeSceneryObject(largeSceneryType); - _largeSceneryEntries.Add(entryName); _largeSceneryTypeToEntryMap[largeSceneryType] = (uint8)_largeSceneryEntries.GetCount(); + _largeSceneryEntries.Add(entryName); } } @@ -255,13 +265,15 @@ void S4Importer::AddEntryForWall(uint8 wallType) if (_wallTypeToEntryMap[wallType] == 255) { const char * entryName = RCT1::GetWallObject(wallType); - _wallEntries.Add(entryName); _wallTypeToEntryMap[wallType] = (uint8)_wallEntries.GetCount(); + _wallEntries.Add(entryName); } } void S4Importer::AddEntriesForSceneryTheme(uint8 sceneryThemeType) { + if (sceneryThemeType == RCT1_SCENERY_THEME_GENERAL) return; + const char * entryName = RCT1::GetSceneryGroupObject(sceneryThemeType); _sceneryThemeTypeToEntryMap[sceneryThemeType] = (uint8)_sceneryGroupEntries.GetCount(); @@ -538,10 +550,13 @@ void S4Importer::LoadObjects() })); LoadObjects(OBJECT_TYPE_PARK_ENTRANCE, List({ "PKENT1 " })); LoadObjects(OBJECT_TYPE_WATER, List({ "WTRCYAN " })); + + reset_loaded_objects(); } void S4Importer::LoadObjects(uint8 objectType, List entries) { + uint32 entryIndex = 0; for (const char * objectName : entries) { rct_object_entry entry; @@ -549,11 +564,13 @@ void S4Importer::LoadObjects(uint8 objectType, List entries) Memory::Copy(entry.name, objectName, 8); entry.checksum = 0; - if (!object_load_chunk(objectType, &entry, NULL)) + if (!object_load_chunk(entryIndex, &entry, NULL)) { log_error("Failed to load %s.", objectName); throw Exception("Failed to load object."); } + + entryIndex++; } } @@ -609,34 +626,36 @@ void S4Importer::ImportResearch() case RCT1_RESEARCH_CATEGORY_THEME: { uint8 rct1SceneryTheme = researchItem->item; - uint8 sceneryGroupEntryIndex = _sceneryThemeTypeToEntryMap[rct1SceneryTheme]; - research_insert_scenery_group_entry(sceneryGroupEntryIndex, researched); + if (rct1SceneryTheme != RCT1_SCENERY_THEME_GENERAL) + { + uint8 sceneryGroupEntryIndex = _sceneryThemeTypeToEntryMap[rct1SceneryTheme]; + research_insert_scenery_group_entry(sceneryGroupEntryIndex, researched); + } break; } case RCT1_RESEARCH_CATEGORY_RIDE: { uint8 rct1RideType = researchItem->item; - uint8 rideEntryIndex = rct1RideType; - rct_ride_entry *rideEntry = get_ride_entry(rideEntryIndex); // Add all vehicles for this ride type that are researched or before this research item uint32 numVehicles = 0; for (size_t j = 0; j < researchListCount; j++) { const rct1_research_item *researchItem2 = &researchList[j]; - if (researchItem2->item == RCT1_RESEARCH_END_AVAILABLE) + if (researchItem2->item == RCT1_RESEARCH_END_RESEARCHABLE || + researchItem2->item == RCT1_RESEARCH_END_AVAILABLE) { break; } - if (researchItem->category == RCT1_RESEARCH_CATEGORY_VEHICLE && - researchItem->related_ride == rct1RideType) + if (researchItem2->category == RCT1_RESEARCH_CATEGORY_VEHICLE && + researchItem2->related_ride == rct1RideType) { // Only add the vehicles that were listed before this ride, otherwise we might // change the research order if (j < i) { - InsertResearchVehicle(researchItem, researched); + InsertResearchVehicle(researchItem2, researched); } numVehicles++; } @@ -645,6 +664,9 @@ void S4Importer::ImportResearch() if (numVehicles == 0) { // No vehicles found so just add the default for this ride + uint8 rideEntryIndex = _rideTypeToRideEntryMap[rct1RideType]; + Guard::Assert(rideEntryIndex != 255, "rideEntryIndex was 255"); + if (!_researchRideEntryUsed[rideEntryIndex]) { _researchRideEntryUsed[rideEntryIndex] = true; @@ -672,9 +694,7 @@ void S4Importer::ImportResearch() void S4Importer::InsertResearchVehicle(const rct1_research_item * researchItem, bool researched) { - uint8 rct1RideType = researchItem->related_ride; uint8 vehicle = researchItem->item; - uint8 rideEntryIndex = _vehicleTypeToRideEntryMap[vehicle]; if (!_researchRideEntryUsed[rideEntryIndex]) { diff --git a/src/rct1/tables.cpp b/src/rct1/tables.cpp index ece3ed95da..c503c27e43 100644 --- a/src/rct1/tables.cpp +++ b/src/rct1/tables.cpp @@ -1,11 +1,13 @@ -#include - #include "../common.h" #include "../core/List.hpp" -#include "../interface/colour.h" -#include "../ride/ride.h" #include "import.h" +extern "C" +{ + #include "../interface/colour.h" + #include "../ride/ride.h" +} + namespace RCT1 { const char * DefaultParkEntranceObject = "PKENT1 ";