1
0
mirror of https://github.com/OpenRCT2/OpenRCT2 synced 2026-01-19 13:03:11 +01:00

Count block sections when importing an SC4/SV4 file

This commit is contained in:
Gymnasiast
2017-01-26 21:50:22 +01:00
committed by Ted John
parent a7e91ad556
commit 6d8a617712
2 changed files with 53 additions and 7 deletions

View File

@@ -1185,6 +1185,8 @@ enum {
#define RCT1_MAX_STATIONS 4
#define RCT1_MAX_TRAINS_PER_RIDE 12
#define RCT1_MAX_MAP_SIZE 128
#define RCT1_MAX_RIDES_IN_PARK 128
extern const uint8 gRideCategories[0x60];

View File

@@ -44,6 +44,7 @@ extern "C"
#include "../peep/peep.h"
#include "../peep/staff.h"
#include "../rct1.h"
#include "../ride/track.h"
#include "../util/sawyercoding.h"
#include "../util/util.h"
#include "../world/climate.h"
@@ -159,6 +160,7 @@ public:
ImportScenarioObjective();
ImportSavedView();
FixLandOwnership();
CountBlockSections();
// Importing the strings is done later on, although that approach needs looking at.
//game_convert_strings_to_utf8();
@@ -1928,17 +1930,17 @@ private:
rct_map_element * * tilePointer = gMapElementTilePointers;
// 128 rows of map data from RCT1 map
for (sint32 x = 0; x < 128; x++)
for (sint32 x = 0; x < RCT1_MAX_MAP_SIZE; x++)
{
// Assign the first half of this row
for (sint32 y = 0; y < 128; y++)
for (sint32 y = 0; y < RCT1_MAX_MAP_SIZE; y++)
{
*tilePointer++ = mapElement;
do { } while (!map_element_is_last_for_tile(mapElement++));
}
// Fill the rest of the row with blank tiles
for (sint32 y = 0; y < 128; y++)
for (sint32 y = 0; y < RCT1_MAX_MAP_SIZE; y++)
{
nextFreeMapElement->type = MAP_ELEMENT_TYPE_SURFACE;
nextFreeMapElement->flags = MAP_ELEMENT_FLAG_LAST_TILE;
@@ -2119,9 +2121,9 @@ private:
void FixWalls()
{
for (sint32 x = 0; x < 128; x++)
for (sint32 x = 0; x < RCT1_MAX_MAP_SIZE; x++)
{
for (sint32 y = 0; y < 128; y++)
for (sint32 y = 0; y < RCT1_MAX_MAP_SIZE; y++)
{
rct_map_element * mapElement = map_get_first_element_at(x, y);
do
@@ -2198,9 +2200,9 @@ private:
void FixBanners()
{
for (sint32 x = 0; x < 128; x++)
for (sint32 x = 0; x < RCT1_MAX_MAP_SIZE; x++)
{
for (sint32 y = 0; y < 128; y++)
for (sint32 y = 0; y < RCT1_MAX_MAP_SIZE; y++)
{
rct_map_element * mapElement = map_get_first_element_at(x, y);
do
@@ -2360,6 +2362,48 @@ private:
break;
}
}
/**
* Counts the block sections. The reason this iterates over the map is to avoid getting into infinite loops,
* which can happen with hacked parks.
*/
void CountBlockSections()
{
for (sint32 x = 0; x < RCT1_MAX_MAP_SIZE; x++)
{
for (sint32 y = 0; y < RCT1_MAX_MAP_SIZE; y++)
{
rct_map_element * mapElement = map_get_first_element_at(x, y);
do
{
if (map_element_get_type(mapElement) == MAP_ELEMENT_TYPE_TRACK)
{
// Lift hill tops are the only pieces present in RCT1 that can count as a block brake.
if (!track_element_is_lift_hill(mapElement))
continue;
uint8 trackType = mapElement->properties.track.type;
switch (trackType)
{
case TRACK_ELEM_25_DEG_UP_TO_FLAT:
case TRACK_ELEM_60_DEG_UP_TO_FLAT:
case TRACK_ELEM_DIAG_25_DEG_UP_TO_FLAT:
case TRACK_ELEM_DIAG_60_DEG_UP_TO_FLAT:
break;
default:
continue;
}
uint8 rideIndex = mapElement->properties.track.ride_index;
rct_ride * ride = get_ride(rideIndex);
ride->num_block_brakes++;
}
}
while (!map_element_is_last_for_tile(mapElement++));
}
}
}
};
IS4Importer * CreateS4Importer()