1
0
mirror of https://github.com/OpenRCT2/OpenRCT2 synced 2026-01-24 15:24:30 +01:00

Clean up more direct access to tile elements

This commit is contained in:
Michael Steenbeek
2018-03-08 14:14:44 +01:00
parent 44524d1e6f
commit 5411c77358
5 changed files with 103 additions and 61 deletions

View File

@@ -247,7 +247,7 @@ static void window_sign_mouseup(rct_window *w, rct_widgetindex widgetIndex)
}
game_do_command(
x,
1 | ((tile_element->type&0x3) << 8),
1 | ((tile_element->type & TILE_ELEMENT_DIRECTION_MASK) << 8),
y,
tile_element->base_height | (scenery_large_get_sequence(tile_element) << 8),
GAME_COMMAND_REMOVE_LARGE_SCENERY,
@@ -510,9 +510,9 @@ static void window_sign_small_mouseup(rct_window *w, rct_widgetindex widgetIndex
gGameCommandErrorTitle = STR_CANT_REMOVE_THIS;
game_do_command(
x,
1 | ((tile_element->type & 0x3) << 8),
1 | ((tile_element->type & TILE_ELEMENT_DIRECTION_MASK) << 8),
y,
(tile_element->base_height << 8) | (tile_element->type & 0x3),
(tile_element->base_height << 8) | (tile_element->type & TILE_ELEMENT_DIRECTION_MASK),
GAME_COMMAND_REMOVE_WALL,
0,
0);

View File

@@ -1222,6 +1222,17 @@ enum {
RCT1_WATER_ORANGE
};
enum {
RCT1_SCENERY_TULIPS_1 = 65,
RCT1_SCENERY_TULIPS_2 = 68,
RCT1_SCENERY_GEOMETRIC_SCULPTURE_1 = 157, // TGE1
RCT1_SCENERY_GEOMETRIC_SCULPTURE_2 = 162, // TGE2
RCT1_SCENERY_GEOMETRIC_SCULPTURE_3 = 168, // TGE3
RCT1_SCENERY_GEOMETRIC_SCULPTURE_4 = 170, // TGE4
RCT1_SCENERY_GEOMETRIC_SCULPTURE_5 = 171, // TGE5
};
ParkLoadResult * load_from_sv4(const char *path);
ParkLoadResult * load_from_sc4(const char *path);

View File

@@ -62,6 +62,10 @@
#include "../world/Scenery.h"
#include "../world/SmallScenery.h"
static uint8 GetPathType(rct_tile_element * tileElement);
static sint32 GetWallType(rct_tile_element * tileElement, sint32 edge);
static uint8 GetWallColour(rct_tile_element * tileElement);
class EntryList
{
private:
@@ -481,10 +485,7 @@ private:
switch (tile_element_get_type(tileElement)) {
case TILE_ELEMENT_TYPE_PATH:
{
uint8 pathColour = tile_element_get_direction(tileElement);
uint8 pathType = footpath_element_get_type(tileElement);
pathType = (pathType << 2) | pathColour;
uint8 pathType = GetPathType(tileElement);
uint8 pathAdditionsType = tileElement->properties.path.additions & 0x0F;
AddEntryForPath(pathType);
@@ -499,17 +500,12 @@ private:
break;
case TILE_ELEMENT_TYPE_WALL:
{
uint8 var_05 = tileElement->properties.wall.colour_3;
uint16 var_06 = tileElement->properties.wall.colour_1 |
(tileElement->properties.wall.animation << 8);
for (sint32 edge = 0; edge < 4; edge++)
{
sint32 typeA = (var_05 >> (edge * 2)) & 3;
sint32 typeB = (var_06 >> (edge * 4)) & 0x0F;
if (typeB != 0x0F)
sint32 type = GetWallType(tileElement, edge);
if (type != -1)
{
uint8 type = typeA | (typeB << 2);
AddEntryForWall(type);
}
}
@@ -1916,7 +1912,7 @@ private:
{
rct_object_entry entry;
entry.flags = 0x00008000 + objectType;
std::copy_n(objectName, 8, entry.name);
std::copy_n(objectName, DAT_NAME_LENGTH, entry.name);
entry.checksum = 0;
const ObjectRepositoryItem * ori = objectRepository->FindObject(&entry);
@@ -2428,36 +2424,28 @@ private:
{
if (tileElement->base_height != 255)
{
switch (tile_element_get_type(tileElement)) {
// This skips walls, which are fixed later.
switch (tile_element_get_type(tileElement))
{
case TILE_ELEMENT_TYPE_SMALL_SCENERY:
colour = RCT1::GetColour(scenery_small_get_primary_colour(tileElement));
scenery_small_set_primary_colour(tileElement, colour);
// Copied from [rct2: 0x006A2956]
switch (tileElement->properties.scenery.type) {
case 157: // TGE1 (Geometric Sculpture)
case 162: // TGE2 (Geometric Sculpture)
case 168: // TGE3 (Geometric Sculpture)
case 170: // TGE4 (Geometric Sculpture)
case 171: // TGE5 (Geometric Sculpture)
case RCT1_SCENERY_GEOMETRIC_SCULPTURE_1:
case RCT1_SCENERY_GEOMETRIC_SCULPTURE_2:
case RCT1_SCENERY_GEOMETRIC_SCULPTURE_3:
case RCT1_SCENERY_GEOMETRIC_SCULPTURE_4:
case RCT1_SCENERY_GEOMETRIC_SCULPTURE_5:
scenery_small_set_secondary_colour(tileElement, COLOUR_WHITE);
break;
case 65:
case 68:
case RCT1_SCENERY_TULIPS_1:
case RCT1_SCENERY_TULIPS_2:
scenery_small_set_primary_colour(tileElement, COLOUR_BRIGHT_RED);
scenery_small_set_secondary_colour(tileElement, COLOUR_YELLOW);
}
break;
case TILE_ELEMENT_TYPE_WALL:
colour = ((tileElement->type & 0xC0) >> 3) |
((tileElement->properties.wall.type & 0xE0) >> 5);
colour = RCT1::GetColour(colour);
tileElement->type &= 0x3F;
tileElement->properties.wall.type &= 0x1F;
tileElement->type |= (colour & 0x18) << 3;
tileElement->properties.wall.type |= (colour & 7) << 5;
break;
case TILE_ELEMENT_TYPE_LARGE_SCENERY:
colour = RCT1::GetColour(scenery_large_get_primary_colour(tileElement));
scenery_large_set_primary_colour(tileElement, colour);
@@ -2496,22 +2484,19 @@ private:
case TILE_ELEMENT_TYPE_PATH:
{
// Type
uint8 pathColour = tileElement->type & 3;
uint8 pathType = footpath_element_get_type(tileElement);
pathType = (pathType << 2) | pathColour;
uint8 pathType = GetPathType(tileElement);
uint8 entryIndex = _pathTypeToEntryMap[pathType];
tileElement->type &= 0xFC;
tileElement->flags &= ~0x60;
tileElement->flags &= ~TILE_ELEMENT_FLAG_BROKEN;
tileElement->properties.path.type &= 0x0F;
footpath_scenery_set_is_ghost(tileElement, false);
tileElement->type &= ~TILE_ELEMENT_DIRECTION_MASK;
tileElement->flags &= ~(TILE_ELEMENT_FLAG_BROKEN | TILE_ELEMENT_FLAG_INDESTRUCTIBLE_TRACK_PIECE);
footpath_element_set_type(tileElement, entryIndex);
if (RCT1::PathIsQueue(pathType))
{
tileElement->type |= 1;
footpath_element_set_queue(tileElement);
}
tileElement->properties.path.type |= entryIndex << 4;
footpath_scenery_set_is_ghost(tileElement, false);
// Additions
uint8 additionType = footpath_element_get_path_scenery(tileElement);
@@ -2563,25 +2548,25 @@ private:
rct_tile_element originalTileElement = *tileElement;
tile_element_remove(tileElement);
uint8 var_05 = originalTileElement.properties.wall.colour_3;
uint16 var_06 = originalTileElement.properties.wall.colour_1 |
(originalTileElement.properties.wall.animation << 8);
for (sint32 edge = 0; edge < 4; edge++)
{
sint32 typeA = (var_05 >> (edge * 2)) & 3;
sint32 typeB = (var_06 >> (edge * 4)) & 0x0F;
if (typeB != 0x0F)
sint32 type = GetWallType(&originalTileElement, edge);
if (type != -1)
{
sint32 type = typeA | (typeB << 2);
sint32 colourA = ((originalTileElement.type & 0xC0) >> 3) |
(originalTileElement.properties.wall.type >> 5);
sint32 colourA = RCT1::GetColour(GetWallColour(&originalTileElement));
sint32 colourB = 0;
sint32 colourC = 0;
ConvertWall(&type, &colourA, &colourB, &colourC);
type = _wallTypeToEntryMap[type];
wall_place(type, x * 32, y * 32, 0, edge, colourA, colourB, colourC, 169);
const uint8 flags =
GAME_COMMAND_FLAG_APPLY |
GAME_COMMAND_FLAG_ALLOW_DURING_PAUSED |
GAME_COMMAND_FLAG_5 |
GAME_COMMAND_FLAG_PATH_SCENERY;
wall_place(type, x * 32, y * 32, 0, edge, colourA, colourB, colourC, flags);
}
}
break;
@@ -2889,3 +2874,34 @@ ParkLoadResult * load_from_sc4(const utf8 * path)
return result;
}
static uint8 GetPathType(rct_tile_element * tileElement)
{
uint8 pathColour = tileElement->type & 3;
uint8 pathType = (tileElement->properties.path.type & FOOTPATH_PROPERTIES_TYPE_MASK) >> 2;
pathType = pathType | pathColour;
return pathType;
}
static sint32 GetWallType(rct_tile_element * tileElement, sint32 edge)
{
uint8 var_05 = tileElement->properties.wall.colour_3;
uint16 var_06 = tileElement->properties.wall.colour_1 | (tileElement->properties.wall.animation << 8);
sint32 typeA = (var_05 >> (edge * 2)) & 3;
sint32 typeB = (var_06 >> (edge * 4)) & 0x0F;
if (typeB != 0x0F)
{
return typeA | (typeB << 2);
}
else
{
return -1;
}
}
static uint8 GetWallColour(rct_tile_element * tileElement)
{
return ((tileElement->type & 0xC0) >> 3) | ((tileElement->properties.wall.type & 0xE0) >> 5);
}

View File

@@ -213,7 +213,7 @@ static money32 footpath_element_insert(sint32 type, sint32 x, sint32 y, sint32 z
}
// Do not attempt to build a crossing with a queue or a sloped.
uint8 crossingMode = (type & 0x80) || (slope != TILE_ELEMENT_SLOPE_FLAT) ? CREATE_CROSSING_MODE_NONE : CREATE_CROSSING_MODE_PATH_OVER_TRACK;
uint8 crossingMode = (type & FOOTPATH_ELEMENT_INSERT_QUEUE) || (slope != TILE_ELEMENT_SLOPE_FLAT) ? CREATE_CROSSING_MODE_NONE : CREATE_CROSSING_MODE_PATH_OVER_TRACK;
if (!entrancePath && !gCheatsDisableClearanceChecks && !map_can_construct_with_clear_at(x, y, z, zHigh, &map_place_non_scenery_clear_func, bl, flags, &gFootpathPrice, crossingMode))
return MONEY32_UNDEFINED;
@@ -246,7 +246,8 @@ static money32 footpath_element_insert(sint32 type, sint32 x, sint32 y, sint32 z
tileElement->clearance_height = z + 4 + ((slope & TILE_ELEMENT_SLOPE_NE_SIDE_UP) ? 2 : 0);
footpath_element_set_type(tileElement, type);
tileElement->properties.path.type |= (slope & TILE_ELEMENT_SLOPE_W_CORNER_DN);
tileElement->type |= type >> 7;
if (type & FOOTPATH_ELEMENT_INSERT_QUEUE)
footpath_element_set_queue(tileElement);
tileElement->properties.path.additions = pathItemType;
tileElement->properties.path.addition_status = 255;
tileElement->flags &= ~TILE_ELEMENT_FLAG_BROKEN;
@@ -622,7 +623,7 @@ static money32 footpath_place_from_track(sint32 type, sint32 x, sint32 y, sint32
}
// Do not attempt to build a crossing with a queue or a sloped.
uint8 crossingMode = (type & 0x80) || (slope != TILE_ELEMENT_SLOPE_FLAT) ? CREATE_CROSSING_MODE_NONE : CREATE_CROSSING_MODE_PATH_OVER_TRACK;
uint8 crossingMode = (type & FOOTPATH_ELEMENT_INSERT_QUEUE) || (slope != TILE_ELEMENT_SLOPE_FLAT) ? CREATE_CROSSING_MODE_NONE : CREATE_CROSSING_MODE_PATH_OVER_TRACK;
if (!entrancePath && !gCheatsDisableClearanceChecks && !map_can_construct_with_clear_at(x, y, z, zHigh, &map_place_non_scenery_clear_func, bl, flags, &gFootpathPrice, crossingMode))
return MONEY32_UNDEFINED;
@@ -1381,7 +1382,7 @@ static void loc_6A6C85(
return;
if (tile_element_get_type(tileElement) == TILE_ELEMENT_TYPE_ENTRANCE) {
if (!entrance_has_direction(tileElement, (direction - tileElement->type) & 3)) {
if (!entrance_has_direction(tileElement, (direction - tile_element_get_direction(tileElement)) & 3)) {
return;
}
}
@@ -1561,7 +1562,7 @@ void footpath_chain_ride_queue(sint32 rideIndex, sint32 entranceIndex, sint32 x,
if (rideIndex != 255 && lastPathElement != nullptr) {
if (footpath_element_is_queue(lastPathElement)) {
lastPathElement->properties.path.type |= (1 << 3); // Set the ride sign flag
lastPathElement->properties.path.type |= FOOTPATH_PROPERTIES_FLAG_HAS_QUEUE_BANNER;
lastPathElement->type &= 0x3F; // Clear the ride sign direction
footpath_element_set_direction(lastPathElement, lastPathDirection); // set the ride sign direction
@@ -1820,6 +1821,16 @@ bool footpath_element_is_queue(const rct_tile_element * tileElement)
return (tileElement->type & FOOTPATH_ELEMENT_TYPE_FLAG_IS_QUEUE) != 0;
}
void footpath_element_set_queue(rct_tile_element * tileElement)
{
tileElement->type |= FOOTPATH_ELEMENT_TYPE_FLAG_IS_QUEUE;
}
void footpath_element_clear_queue(rct_tile_element * tileElement)
{
tileElement->type &= ~FOOTPATH_ELEMENT_TYPE_FLAG_IS_QUEUE;
}
bool footpath_element_has_queue_banner(const rct_tile_element * tileElement)
{
return (tileElement->properties.path.type & FOOTPATH_PROPERTIES_FLAG_HAS_QUEUE_BANNER) != 0;

View File

@@ -28,6 +28,8 @@ enum
PROVISIONAL_PATH_FLAG_2 = (1 << 2),
};
#define FOOTPATH_ELEMENT_INSERT_QUEUE 0x80
#pragma pack(push, 1)
struct rct_footpath_entry {
rct_string_id string_idx; // 0x00
@@ -150,6 +152,8 @@ bool footpath_element_is_sloped(const rct_tile_element * tileElement);
void footpath_element_set_sloped(rct_tile_element * tileElement, bool isSloped);
uint8 footpath_element_get_slope_direction(const rct_tile_element * tileElement);
bool footpath_element_is_queue(const rct_tile_element * tileElement);
void footpath_element_set_queue(rct_tile_element * tileElement);
void footpath_element_clear_queue(rct_tile_element * tileElement);
bool footpath_element_has_queue_banner(const rct_tile_element * tileElement);
bool footpath_element_is_wide(const rct_tile_element * tileElement);
uint8 footpath_element_get_type(const rct_tile_element * tileElement);