mirror of
https://github.com/OpenRCT2/OpenRCT2
synced 2026-01-20 13:33:02 +01:00
Implement game action
This commit is contained in:
@@ -124,11 +124,6 @@ TileElement* map_get_footpath_element(int32_t x, int32_t y, int32_t z)
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
/** rct2: 0x0098D7EC */
|
||||
static constexpr const QuarterTile SlopedFootpathQuarterTiles[] = {
|
||||
{ 0b1111, 0b1100 }, { 0b1111, 0b1001 }, { 0b1111, 0b0011 }, { 0b1111, 0b0110 }
|
||||
};
|
||||
|
||||
/**
|
||||
*
|
||||
* rct2: 0x006BA23E
|
||||
@@ -148,171 +143,6 @@ void remove_banners_at_element(int32_t x, int32_t y, TileElement* tileElement)
|
||||
}
|
||||
}
|
||||
|
||||
static money32 footpath_place_from_track(
|
||||
int32_t type, int32_t x, int32_t y, int32_t z, int32_t slope, int32_t edges, int32_t flags)
|
||||
{
|
||||
TileElement* tileElement;
|
||||
EntranceElement* entranceElement;
|
||||
bool entrancePath = false, entranceIsSamePath = false;
|
||||
|
||||
gCommandExpenditureType = RCT_EXPENDITURE_TYPE_LANDSCAPING;
|
||||
gCommandPosition.x = x + 16;
|
||||
gCommandPosition.y = y + 16;
|
||||
gCommandPosition.z = z * 8;
|
||||
|
||||
if (!(flags & GAME_COMMAND_FLAG_ALLOW_DURING_PAUSED) && game_is_paused() && !gCheatsBuildInPauseMode)
|
||||
{
|
||||
gGameCommandErrorText = STR_CONSTRUCTION_NOT_POSSIBLE_WHILE_GAME_IS_PAUSED;
|
||||
return MONEY32_UNDEFINED;
|
||||
}
|
||||
|
||||
if ((flags & GAME_COMMAND_FLAG_APPLY) && !(flags & GAME_COMMAND_FLAG_GHOST))
|
||||
footpath_interrupt_peeps(x, y, z * 8);
|
||||
|
||||
gFootpathPrice = 0;
|
||||
gFootpathGroundFlags = 0;
|
||||
|
||||
if (!map_is_location_owned(x, y, z * 8) && !gCheatsSandboxMode)
|
||||
{
|
||||
return MONEY32_UNDEFINED;
|
||||
}
|
||||
|
||||
if (!((gScreenFlags & SCREEN_FLAGS_SCENARIO_EDITOR) || gCheatsSandboxMode) && !map_is_location_owned(x, y, z * 8))
|
||||
return MONEY32_UNDEFINED;
|
||||
|
||||
if (z < 2)
|
||||
{
|
||||
gGameCommandErrorText = STR_TOO_LOW;
|
||||
return MONEY32_UNDEFINED;
|
||||
}
|
||||
|
||||
if (z > 248)
|
||||
{
|
||||
gGameCommandErrorText = STR_TOO_HIGH;
|
||||
return MONEY32_UNDEFINED;
|
||||
}
|
||||
|
||||
if (flags & GAME_COMMAND_FLAG_APPLY)
|
||||
{
|
||||
if (!(flags & (GAME_COMMAND_FLAG_ALLOW_DURING_PAUSED | GAME_COMMAND_FLAG_GHOST)))
|
||||
{
|
||||
footpath_remove_litter(x, y, z * 8);
|
||||
}
|
||||
}
|
||||
|
||||
gFootpathPrice += 120;
|
||||
QuarterTile quarterTile = { 0b1111, 0 };
|
||||
int32_t zHigh = z + 4;
|
||||
if (slope & TILE_ELEMENT_SLOPE_S_CORNER_UP)
|
||||
{
|
||||
quarterTile = SlopedFootpathQuarterTiles[slope & TILE_ELEMENT_SLOPE_NE_SIDE_UP];
|
||||
zHigh += 2;
|
||||
}
|
||||
|
||||
entranceElement = map_get_park_entrance_element_at(x, y, z, false);
|
||||
// Make sure the entrance part is the middle
|
||||
if (entranceElement != nullptr && (entranceElement->GetSequenceIndex()) == 0)
|
||||
{
|
||||
entrancePath = true;
|
||||
// Make the price the same as replacing a path
|
||||
if (entranceElement->GetPathType() == (type & 0xF))
|
||||
entranceIsSamePath = true;
|
||||
else
|
||||
gFootpathPrice -= MONEY(6, 00);
|
||||
}
|
||||
|
||||
// Do not attempt to build a crossing with a queue or a sloped.
|
||||
uint8_t crossingMode = (type & FOOTPATH_ELEMENT_INSERT_QUEUE) || (slope != TILE_ELEMENT_SLOPE_FLAT)
|
||||
? CREATE_CROSSING_MODE_NONE
|
||||
: CREATE_CROSSING_MODE_PATH_OVER_TRACK;
|
||||
if (!entrancePath
|
||||
&& !map_can_construct_with_clear_at(
|
||||
x, y, z, zHigh, &map_place_non_scenery_clear_func, quarterTile, flags, &gFootpathPrice, crossingMode))
|
||||
return MONEY32_UNDEFINED;
|
||||
|
||||
gFootpathGroundFlags = gMapGroundFlags;
|
||||
if (!gCheatsDisableClearanceChecks && (gMapGroundFlags & ELEMENT_IS_UNDERWATER))
|
||||
{
|
||||
gGameCommandErrorText = STR_CANT_BUILD_THIS_UNDERWATER;
|
||||
return MONEY32_UNDEFINED;
|
||||
}
|
||||
|
||||
tileElement = map_get_surface_element_at({ x, y });
|
||||
|
||||
int32_t supportHeight = z - tileElement->base_height;
|
||||
gFootpathPrice += supportHeight < 0 ? MONEY(20, 00) : (supportHeight / 2) * MONEY(5, 00);
|
||||
|
||||
if (flags & GAME_COMMAND_FLAG_APPLY)
|
||||
{
|
||||
if (gGameCommandNestLevel == 1 && !(flags & GAME_COMMAND_FLAG_GHOST))
|
||||
{
|
||||
LocationXYZ16 coord;
|
||||
coord.x = x + 16;
|
||||
coord.y = y + 16;
|
||||
coord.z = tile_element_height(coord.x, coord.y);
|
||||
network_set_player_last_action_coord(network_get_player_index(game_command_playerid), coord);
|
||||
}
|
||||
|
||||
if (entrancePath)
|
||||
{
|
||||
if (!(flags & GAME_COMMAND_FLAG_GHOST) && !entranceIsSamePath)
|
||||
{
|
||||
// Set the path type but make sure it's not a queue as that will not show up
|
||||
entranceElement->SetPathType(type & 0x7F);
|
||||
map_invalidate_tile_full(x, y);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
tileElement = tile_element_insert(x / 32, y / 32, z, 0x0F);
|
||||
assert(tileElement != nullptr);
|
||||
tileElement->SetType(TILE_ELEMENT_TYPE_PATH);
|
||||
PathElement* pathElement = tileElement->AsPath();
|
||||
// This can NEVER happen, but GCC does not want to believe that...
|
||||
if (pathElement == nullptr)
|
||||
{
|
||||
assert(false);
|
||||
return MONEY32_UNDEFINED;
|
||||
}
|
||||
pathElement->clearance_height = z + 4 + ((slope & FOOTPATH_PROPERTIES_FLAG_IS_SLOPED) ? 2 : 0);
|
||||
pathElement->SetPathEntryIndex(type & 0xF);
|
||||
pathElement->SetSlopeDirection(slope & FOOTPATH_PROPERTIES_SLOPE_DIRECTION_MASK);
|
||||
if (slope & FOOTPATH_PROPERTIES_FLAG_IS_SLOPED)
|
||||
pathElement->SetSloped(true);
|
||||
if (type & (1 << 7))
|
||||
pathElement->SetIsQueue(true);
|
||||
pathElement->SetAddition(0);
|
||||
pathElement->SetRideIndex(RIDE_ID_NULL);
|
||||
pathElement->SetAdditionStatus(255);
|
||||
pathElement->SetEdges(edges);
|
||||
pathElement->SetCorners(0);
|
||||
pathElement->SetIsBroken(false);
|
||||
if (flags & (1 << 6))
|
||||
pathElement->SetGhost(true);
|
||||
|
||||
map_invalidate_tile_full(x, y);
|
||||
}
|
||||
}
|
||||
|
||||
if (entranceIsSamePath)
|
||||
gFootpathPrice = 0;
|
||||
|
||||
return gParkFlags & PARK_FLAGS_NO_MONEY ? 0 : gFootpathPrice;
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* rct2: 0x006A68AE
|
||||
*/
|
||||
void game_command_place_footpath_from_track(
|
||||
int32_t* eax, int32_t* ebx, int32_t* ecx, int32_t* edx, [[maybe_unused]] int32_t* esi, [[maybe_unused]] int32_t* edi,
|
||||
[[maybe_unused]] int32_t* ebp)
|
||||
{
|
||||
*ebx = footpath_place_from_track(
|
||||
(*edx >> 8) & 0xFF, *eax & 0xFFFF, *ecx & 0xFFFF, *edx & 0xFF, ((*ebx >> 13) & 0x3) | ((*ebx >> 10) & 0x4),
|
||||
(*ebx >> 8) & 0xF, *ebx & 0xFF);
|
||||
}
|
||||
|
||||
money32 footpath_remove(int32_t x, int32_t y, int32_t z, int32_t flags)
|
||||
{
|
||||
auto action = FootpathRemoveAction(x, y, z);
|
||||
|
||||
Reference in New Issue
Block a user