From d01b21a1ac727efb33cc1b48295c495d6b176509 Mon Sep 17 00:00:00 2001 From: Michael Steenbeek Date: Wed, 26 Sep 2018 14:07:04 +0200 Subject: [PATCH] Port banner index --- .../interface/ViewportInteraction.cpp | 4 ++-- src/openrct2-ui/windows/Banner.cpp | 4 ++-- src/openrct2-ui/windows/TileInspector.cpp | 4 ++-- src/openrct2-ui/windows/TopToolbar.cpp | 4 ++-- src/openrct2/EditorObjectSelectionSession.cpp | 2 +- .../paint/tile_element/Paint.Banner.cpp | 8 +++---- src/openrct2/rct1/S4Importer.cpp | 2 +- src/openrct2/world/Banner.cpp | 22 ++++++++++++++----- src/openrct2/world/TileElement.cpp | 4 ++-- src/openrct2/world/TileElement.h | 12 +++++++++- 10 files changed, 43 insertions(+), 23 deletions(-) diff --git a/src/openrct2-ui/interface/ViewportInteraction.cpp b/src/openrct2-ui/interface/ViewportInteraction.cpp index 37ee5ffd19..f652f1854f 100644 --- a/src/openrct2-ui/interface/ViewportInteraction.cpp +++ b/src/openrct2-ui/interface/ViewportInteraction.cpp @@ -330,7 +330,7 @@ int32_t viewport_interaction_get_item_right(int32_t x, int32_t y, viewport_inter break; case VIEWPORT_INTERACTION_ITEM_BANNER: - banner = &gBanners[tileElement->properties.banner.index]; + banner = &gBanners[tileElement->AsBanner()->GetIndex()]; sceneryEntry = get_banner_entry(banner->type); set_map_tooltip_format_arg(0, rct_string_id, STR_MAP_TOOLTIP_STRINGID_CLICK_TO_MODIFY); @@ -452,7 +452,7 @@ int32_t viewport_interaction_right_click(int32_t x, int32_t y) viewport_interaction_remove_large_scenery(info.tileElement, info.x, info.y); break; case VIEWPORT_INTERACTION_ITEM_BANNER: - context_open_detail_window(WD_BANNER, info.tileElement->properties.banner.index); + context_open_detail_window(WD_BANNER, info.tileElement->AsBanner()->GetIndex()); break; } diff --git a/src/openrct2-ui/windows/Banner.cpp b/src/openrct2-ui/windows/Banner.cpp index a42f252960..d204380bab 100644 --- a/src/openrct2-ui/windows/Banner.cpp +++ b/src/openrct2-ui/windows/Banner.cpp @@ -135,7 +135,7 @@ rct_window* window_banner_open(rct_windownumber number) rct_tile_element* tile_element = map_get_first_element_at(view_x / 32, view_y / 32); while (1) { - if ((tile_element->GetType() == TILE_ELEMENT_TYPE_BANNER) && (tile_element->properties.banner.index == w->number)) + if ((tile_element->GetType() == TILE_ELEMENT_TYPE_BANNER) && (tile_element->AsBanner()->GetIndex() == w->number)) { break; } @@ -175,7 +175,7 @@ static void window_banner_mouseup(rct_window* w, rct_widgetindex widgetIndex) while (1) { - if ((tile_element->GetType() == TILE_ELEMENT_TYPE_BANNER) && (tile_element->properties.banner.index == w->number)) + if ((tile_element->GetType() == TILE_ELEMENT_TYPE_BANNER) && (tile_element->AsBanner()->GetIndex() == w->number)) break; tile_element++; } diff --git a/src/openrct2-ui/windows/TileInspector.cpp b/src/openrct2-ui/windows/TileInspector.cpp index 32a2e49952..c6394db628 100644 --- a/src/openrct2-ui/windows/TileInspector.cpp +++ b/src/openrct2-ui/windows/TileInspector.cpp @@ -2051,7 +2051,7 @@ static void window_tile_inspector_paint(rct_window* w, rct_drawpixelinfo* dpi) { // Details // Banner info - const uint8_t bannerIndex = tileElement->properties.banner.index; + const uint8_t bannerIndex = tileElement->AsBanner()->GetIndex(); if (gBanners[bannerIndex].flags & BANNER_FLAG_NO_ENTRY) { rct_string_id noEntryStringIdx = STR_NO_ENTRY; @@ -2166,7 +2166,7 @@ static void window_tile_inspector_scrollpaint(rct_window* w, rct_drawpixelinfo* case TILE_ELEMENT_TYPE_BANNER: snprintf( buffer, sizeof(buffer), "%s (%d)", language_get_string(STR_BANNER_WINDOW_TITLE), - tileElement->properties.banner.index); + tileElement->AsBanner()->GetIndex()); typeName = buffer; break; case TILE_ELEMENT_TYPE_CORRUPT: diff --git a/src/openrct2-ui/windows/TopToolbar.cpp b/src/openrct2-ui/windows/TopToolbar.cpp index eb4bdf6b9c..c267d92042 100644 --- a/src/openrct2-ui/windows/TopToolbar.cpp +++ b/src/openrct2-ui/windows/TopToolbar.cpp @@ -1031,7 +1031,7 @@ static void repaint_scenery_tool_down(int16_t x, int16_t y, rct_widgetindex widg } case VIEWPORT_INTERACTION_ITEM_BANNER: { - rct_banner* banner = &gBanners[tile_element->properties.banner.index]; + rct_banner* banner = &gBanners[tile_element->AsBanner()->GetIndex()]; rct_scenery_entry* scenery_entry = get_banner_entry(banner->type); if (scenery_entry->banner.flags & BANNER_ENTRY_FLAG_HAS_PRIMARY_COLOUR) { @@ -1114,7 +1114,7 @@ static void scenery_eyedropper_tool_down(int16_t x, int16_t y, rct_widgetindex w } case VIEWPORT_INTERACTION_ITEM_BANNER: { - int32_t bannerIndex = tileElement->properties.banner.index; + int32_t bannerIndex = tileElement->AsBanner()->GetIndex(); rct_banner* banner = &gBanners[bannerIndex]; rct_scenery_entry* sceneryEntry = get_banner_entry(banner->type); if (sceneryEntry != nullptr) diff --git a/src/openrct2/EditorObjectSelectionSession.cpp b/src/openrct2/EditorObjectSelectionSession.cpp index e70c572a46..dbeff817b8 100644 --- a/src/openrct2/EditorObjectSelectionSession.cpp +++ b/src/openrct2/EditorObjectSelectionSession.cpp @@ -171,7 +171,7 @@ void setup_in_use_selection_flags() Editor::SetSelectedObject(OBJECT_TYPE_LARGE_SCENERY, type, OBJECT_SELECTION_FLAG_SELECTED); break; case TILE_ELEMENT_TYPE_BANNER: - banner = &gBanners[iter.element->properties.banner.index]; + banner = &gBanners[iter.element->AsBanner()->GetIndex()]; type = banner->type; assert(type < object_entry_group_counts[OBJECT_TYPE_BANNERS]); Editor::SetSelectedObject(OBJECT_TYPE_BANNERS, type, OBJECT_SELECTION_FLAG_SELECTED); diff --git a/src/openrct2/paint/tile_element/Paint.Banner.cpp b/src/openrct2/paint/tile_element/Paint.Banner.cpp index 48f5700dd6..f6e08eae59 100644 --- a/src/openrct2/paint/tile_element/Paint.Banner.cpp +++ b/src/openrct2/paint/tile_element/Paint.Banner.cpp @@ -43,7 +43,7 @@ void banner_paint(paint_session* session, uint8_t direction, int32_t height, con height -= 16; - rct_scenery_entry* banner_scenery = get_banner_entry(gBanners[tile_element->properties.banner.index].type); + rct_scenery_entry* banner_scenery = get_banner_entry(gBanners[tile_element->AsBanner()->GetIndex()].type); if (banner_scenery == nullptr) { @@ -67,7 +67,7 @@ void banner_paint(paint_session* session, uint8_t direction, int32_t height, con } else { - image_id |= (gBanners[tile_element->properties.banner.index].colour << 19) | IMAGE_TYPE_REMAP; + image_id |= (gBanners[tile_element->AsBanner()->GetIndex()].colour << 19) | IMAGE_TYPE_REMAP; } sub_98197C(session, image_id, 0, 0, 1, 1, 0x15, height, boundBoxOffsetX, boundBoxOffsetY, boundBoxOffsetZ); @@ -96,9 +96,9 @@ void banner_paint(paint_session* session, uint8_t direction, int32_t height, con set_format_arg(4, uint32_t, 0); rct_string_id string_id = STR_NO_ENTRY; - if (!(gBanners[tile_element->properties.banner.index].flags & BANNER_FLAG_NO_ENTRY)) + if (!(gBanners[tile_element->AsBanner()->GetIndex()].flags & BANNER_FLAG_NO_ENTRY)) { - set_format_arg(0, rct_string_id, gBanners[tile_element->properties.banner.index].string_idx); + set_format_arg(0, rct_string_id, gBanners[tile_element->AsBanner()->GetIndex()].string_idx); string_id = STR_BANNER_TEXT_FORMAT; } if (gConfigGeneral.upper_case_banners) diff --git a/src/openrct2/rct1/S4Importer.cpp b/src/openrct2/rct1/S4Importer.cpp index 1d3f6c688b..4d02b92907 100644 --- a/src/openrct2/rct1/S4Importer.cpp +++ b/src/openrct2/rct1/S4Importer.cpp @@ -2646,7 +2646,7 @@ private: { if (tileElement->GetType() == TILE_ELEMENT_TYPE_BANNER) { - uint8_t index = tileElement->properties.banner.index; + uint8_t index = tileElement->AsBanner()->GetIndex(); rct_banner* src = &_s4.banners[index]; rct_banner* dst = &gBanners[index]; ImportBanner(dst, src); diff --git a/src/openrct2/world/Banner.cpp b/src/openrct2/world/Banner.cpp index 7f182492d3..e30153ea90 100644 --- a/src/openrct2/world/Banner.cpp +++ b/src/openrct2/world/Banner.cpp @@ -86,7 +86,7 @@ static money32 BannerRemove(int16_t x, int16_t y, uint8_t baseHeight, uint8_t di return MONEY32_UNDEFINED; } - rct_banner* banner = &gBanners[tileElement->properties.banner.index]; + rct_banner* banner = &gBanners[tileElement->AsBanner()->GetIndex()]; rct_scenery_entry* bannerEntry = get_banner_entry(banner->type); money32 refund = 0; if (bannerEntry != nullptr) @@ -153,10 +153,10 @@ static money32 BannerSetColour(int16_t x, int16_t y, uint8_t baseHeight, uint8_t } auto intent = Intent(INTENT_ACTION_UPDATE_BANNER); - intent.putExtra(INTENT_EXTRA_BANNER_INDEX, tileElement->properties.banner.index); + intent.putExtra(INTENT_EXTRA_BANNER_INDEX, tileElement->AsBanner()->GetIndex()); context_broadcast_intent(&intent); - gBanners[tileElement->properties.banner.index].colour = colour; + gBanners[tileElement->AsBanner()->GetIndex()].colour = colour; map_invalidate_tile_zoom1(x, y, z, z + 32); } @@ -252,7 +252,7 @@ static money32 BannerPlace( newTileElement->properties.banner.position = direction; newTileElement->properties.banner.flags = 0xFF; newTileElement->properties.banner.unused = 0; - newTileElement->properties.banner.index = *bannerIndex; + newTileElement->AsBanner()->SetIndex(*bannerIndex); if (flags & GAME_COMMAND_FLAG_GHOST) { newTileElement->flags |= TILE_ELEMENT_FLAG_GHOST; @@ -481,7 +481,7 @@ void fix_duplicated_banners() // multiple tiles that should both refer to the same banner index. if (tileElement->GetType() == TILE_ELEMENT_TYPE_BANNER) { - uint8_t bannerIndex = tileElement->properties.banner.index; + uint8_t bannerIndex = tileElement->AsBanner()->GetIndex(); if (activeBanners[bannerIndex]) { log_info( @@ -518,7 +518,7 @@ void fix_duplicated_banners() newBanner.string_idx = newStringIdx; } - tileElement->properties.banner.index = newBannerIndex; + tileElement->AsBanner()->SetIndex(newBannerIndex); } // Mark banner index as in-use @@ -569,3 +569,13 @@ void game_command_set_banner_style( { *ebx = BannerSetStyle(*ecx & 0xFF, *edx & 0xFF, *edi & 0xFF, *ebp & 0xFF, *ebx & 0xFF); } + +BannerIndex BannerElement::GetIndex() const +{ + return index; +} + +void BannerElement::SetIndex(BannerIndex newIndex) +{ + index = newIndex; +} diff --git a/src/openrct2/world/TileElement.cpp b/src/openrct2/world/TileElement.cpp index 36a1920260..b9b4c01440 100644 --- a/src/openrct2/world/TileElement.cpp +++ b/src/openrct2/world/TileElement.cpp @@ -84,7 +84,7 @@ BannerIndex tile_element_get_banner_index(rct_tile_element* tileElement) return tileElement->AsWall()->GetBannerIndex(); case TILE_ELEMENT_TYPE_BANNER: - return tileElement->properties.banner.index; + return tileElement->AsBanner()->GetIndex(); default: return BANNER_INDEX_NULL; } @@ -101,7 +101,7 @@ void tile_element_set_banner_index(rct_tile_element* tileElement, BannerIndex ba tileElement->AsLargeScenery()->SetBannerIndex(bannerIndex); break; case TILE_ELEMENT_TYPE_BANNER: - tileElement->properties.banner.index = bannerIndex; + tileElement->AsBanner()->SetIndex(bannerIndex); break; default: log_error("Tried to set banner index on unsuitable tile element!"); diff --git a/src/openrct2/world/TileElement.h b/src/openrct2/world/TileElement.h index aae072b587..92841ead40 100644 --- a/src/openrct2/world/TileElement.h +++ b/src/openrct2/world/TileElement.h @@ -391,7 +391,17 @@ assert_struct_size(EntranceElement, 8); struct BannerElement : TileElementBase { - rct_tile_element_banner_properties temp; +private: + BannerIndex index; // 4 +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wunused-private-field" + uint8_t position; // 5 + uint8_t flags; // 6 + uint8_t unused; // 7 +#pragma clang diagnostic pop +public: + BannerIndex GetIndex() const; + void SetIndex(BannerIndex newIndex); }; assert_struct_size(BannerElement, 8);