static money32 BannerRemove(sint16 x, sint16 y, uint8 baseHeight, uint8 direction, uint8 flags) { sint32 z = baseHeight * 8; gCommandExpenditureType = RCT_EXPENDITURE_TYPE_LANDSCAPING; gCommandPosition.x = x + 16; gCommandPosition.y = y + 16; gCommandPosition.z = z; if (!(flags & GAME_COMMAND_FLAG_GHOST) && game_is_paused() && !gCheatsBuildInPauseMode) { gGameCommandErrorText = STR_CONSTRUCTION_NOT_POSSIBLE_WHILE_GAME_IS_PAUSED; return MONEY32_UNDEFINED; } if (!map_can_build_at(x, y, z - 16)) { return MONEY32_UNDEFINED; } // Slight modification to the code so that it now checks height as well // This was causing a bug with banners on two paths stacked. rct_tile_element* tileElement = map_get_banner_element_at(x / 32, y / 32, baseHeight, direction); if (tileElement == nullptr) { return MONEY32_UNDEFINED; } rct_banner *banner = &gBanners[tileElement->properties.banner.index]; rct_scenery_entry *bannerEntry = get_banner_entry(banner->type); money32 refund = 0; if (bannerEntry != nullptr) { refund = -((bannerEntry->banner.price * 3) / 4); } 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); } tile_element_remove_banner_entry(tileElement); map_invalidate_tile_zoom1(x, y, z, z + 32); tile_element_remove(tileElement); } if (gParkFlags & PARK_FLAGS_NO_MONEY) { refund = 0; } return refund; }
void scenery_increase_age(int x, int y, rct_map_element *mapElement) { if (mapElement->flags & SMALL_SCENERY_FLAG_ANIMATED) return; if (mapElement->properties.scenery.age < 255) { mapElement->properties.scenery.age++; map_invalidate_tile_zoom1(x, y, mapElement->base_height * 8, mapElement->clearance_height * 8); } }
/** * * rct2: 0x006E33D9 */ void scenery_update_age(int x, int y, rct_map_element *mapElement) { rct_map_element *mapElementAbove; rct_scenery_entry *sceneryEntry; sceneryEntry = g_smallSceneryEntries[mapElement->properties.scenery.type]; if ( !(sceneryEntry->small_scenery.flags & SMALL_SCENERY_FLAG_CAN_BE_WATERED) || (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_WEATHER, uint8) < WEATHER_RAIN) || (mapElement->properties.scenery.age < 5) ) { scenery_increase_age(x, y, mapElement); return; } // Check map elements above, presumebly to see if map element is blocked from rain mapElementAbove = mapElement; while (!(mapElementAbove->flags & 7)) { mapElementAbove++; switch (map_element_get_type(mapElementAbove)) { case MAP_ELEMENT_TYPE_SCENERY_MULTIPLE: case MAP_ELEMENT_TYPE_ENTRANCE: case MAP_ELEMENT_TYPE_PATH: map_invalidate_tile_zoom1(x, y, mapElementAbove->base_height * 8, mapElementAbove->clearance_height * 8); scenery_increase_age(x, y, mapElement); return; case MAP_ELEMENT_TYPE_SCENERY: sceneryEntry = g_smallSceneryEntries[mapElementAbove->properties.scenery.type]; if (sceneryEntry->small_scenery.flags & SMALL_SCENERY_FLAG_VOFFSET_CENTRE) { scenery_increase_age(x, y, mapElement); return; } break; } } // Reset age / water plant mapElement->properties.scenery.age = 0; map_invalidate_tile_zoom1(x, y, mapElement->base_height * 8, mapElement->clearance_height * 8); }
static money32 BannerSetColour(sint16 x, sint16 y, uint8 baseHeight, uint8 direction, uint8 colour, uint8 flags) { gCommandExpenditureType = RCT_EXPENDITURE_TYPE_LANDSCAPING; sint32 z = (baseHeight * 8); gCommandPosition.x = x + 16; gCommandPosition.y = y + 16; gCommandPosition.z = z; if (!map_can_build_at(x, y, z - 16)) { return MONEY32_UNDEFINED; } if (flags & GAME_COMMAND_FLAG_APPLY) { rct_tile_element* tileElement = map_get_first_element_at(x / 32, y / 32); bool found = false; do { if (tile_element_get_type(tileElement) != TILE_ELEMENT_TYPE_BANNER) continue; if (tileElement->properties.banner.position != direction) continue; found = true; break; } while (!tile_element_is_last_for_tile(tileElement++)); if (!found) { return MONEY32_UNDEFINED; } auto intent = Intent(INTENT_ACTION_UPDATE_BANNER); intent.putExtra(INTENT_EXTRA_BANNER_INDEX, tileElement->properties.banner.index); context_broadcast_intent(&intent); gBanners[tileElement->properties.banner.index].colour = colour; map_invalidate_tile_zoom1(x, y, z, z + 32); } return 0; }