diff --git a/src/openrct2-ui/interface/ViewportInteraction.cpp b/src/openrct2-ui/interface/ViewportInteraction.cpp index 56eb7e1fbf..510f111d5b 100644 --- a/src/openrct2-ui/interface/ViewportInteraction.cpp +++ b/src/openrct2-ui/interface/ViewportInteraction.cpp @@ -204,7 +204,6 @@ int32_t viewport_interaction_get_item_right(int32_t x, int32_t y, viewport_inter { TileElement* tileElement; rct_scenery_entry* sceneryEntry; - rct_banner* banner; Ride* ride; int32_t i, stationIndex; @@ -325,7 +324,7 @@ int32_t viewport_interaction_get_item_right(int32_t x, int32_t y, viewport_inter sceneryEntry = tileElement->AsWall()->GetEntry(); if (sceneryEntry->wall.scrolling_mode != SCROLLING_MODE_NONE) { - banner = &gBanners[tileElement->AsWall()->GetBannerIndex()]; + auto banner = &gBanners[tileElement->AsWall()->GetBannerIndex()]; set_map_tooltip_format_arg(0, rct_string_id, STR_MAP_TOOLTIP_BANNER_STRINGID_STRINGID); set_map_tooltip_format_arg(2, rct_string_id, banner->string_idx); set_map_tooltip_format_arg(4, rct_string_id, STR_MAP_TOOLTIP_STRINGID_CLICK_TO_MODIFY); @@ -338,7 +337,7 @@ int32_t viewport_interaction_get_item_right(int32_t x, int32_t y, viewport_inter sceneryEntry = tileElement->AsLargeScenery()->GetEntry(); if (sceneryEntry->large_scenery.scrolling_mode != SCROLLING_MODE_NONE) { - banner = &gBanners[tileElement->AsLargeScenery()->GetBannerIndex()]; + auto banner = &gBanners[tileElement->AsLargeScenery()->GetBannerIndex()]; set_map_tooltip_format_arg(0, rct_string_id, STR_MAP_TOOLTIP_BANNER_STRINGID_STRINGID); set_map_tooltip_format_arg(2, rct_string_id, banner->string_idx); set_map_tooltip_format_arg(4, rct_string_id, STR_MAP_TOOLTIP_STRINGID_CLICK_TO_MODIFY); @@ -348,7 +347,8 @@ int32_t viewport_interaction_get_item_right(int32_t x, int32_t y, viewport_inter break; case VIEWPORT_INTERACTION_ITEM_BANNER: - banner = &gBanners[tileElement->AsBanner()->GetIndex()]; + { + auto banner = &gBanners[tileElement->AsBanner()->GetIndex()]; sceneryEntry = get_banner_entry(banner->type); set_map_tooltip_format_arg(0, rct_string_id, STR_MAP_TOOLTIP_BANNER_STRINGID_STRINGID); @@ -361,6 +361,7 @@ int32_t viewport_interaction_get_item_right(int32_t x, int32_t y, viewport_inter set_map_tooltip_format_arg(4, rct_string_id, STR_MAP_TOOLTIP_STRINGID_CLICK_TO_MODIFY); set_map_tooltip_format_arg(6, rct_string_id, sceneryEntry->name); return info->type; + } } if (!(input_test_flag(INPUT_FLAG_6)) || !(input_test_flag(INPUT_FLAG_TOOL_ACTIVE))) diff --git a/src/openrct2-ui/windows/Banner.cpp b/src/openrct2-ui/windows/Banner.cpp index a1597cbe85..e68741f01f 100644 --- a/src/openrct2-ui/windows/Banner.cpp +++ b/src/openrct2-ui/windows/Banner.cpp @@ -170,7 +170,7 @@ rct_window* window_banner_open(rct_windownumber number) */ static void window_banner_mouseup(rct_window* w, rct_widgetindex widgetIndex) { - rct_banner* banner = &gBanners[w->number]; + auto banner = &gBanners[w->number]; int32_t x = banner->x << 5; int32_t y = banner->y << 5; @@ -216,7 +216,7 @@ static void window_banner_mouseup(rct_window* w, rct_widgetindex widgetIndex) */ static void window_banner_mousedown(rct_window* w, rct_widgetindex widgetIndex, rct_widget* widget) { - rct_banner* banner = &gBanners[w->number]; + Banner* banner = &gBanners[w->number]; switch (widgetIndex) { @@ -290,7 +290,7 @@ static void window_banner_textinput(rct_window* w, rct_widgetindex widgetIndex, */ static void window_banner_invalidate(rct_window* w) { - rct_banner* banner = &gBanners[w->number]; + Banner* banner = &gBanners[w->number]; rct_widget* colour_btn = &window_banner_widgets[WIDX_MAIN_COLOUR]; colour_btn->type = WWT_EMPTY; @@ -341,7 +341,7 @@ static void window_banner_viewport_rotate(rct_window* w) view->width = 0; - rct_banner* banner = &gBanners[w->number]; + Banner* banner = &gBanners[w->number]; int32_t view_x = (banner->x << 5) + 16; int32_t view_y = (banner->y << 5) + 16; diff --git a/src/openrct2-ui/windows/Sign.cpp b/src/openrct2-ui/windows/Sign.cpp index 938e0e5ef2..d6a20e158c 100644 --- a/src/openrct2-ui/windows/Sign.cpp +++ b/src/openrct2-ui/windows/Sign.cpp @@ -202,7 +202,7 @@ rct_window* window_sign_open(rct_windownumber number) */ static void window_sign_mouseup(rct_window* w, rct_widgetindex widgetIndex) { - rct_banner* banner = &gBanners[w->number]; + auto banner = &gBanners[w->number]; int32_t x = banner->x << 5; int32_t y = banner->y << 5; @@ -371,7 +371,7 @@ static void window_sign_viewport_rotate(rct_window* w) view->width = 0; - rct_banner* banner = &gBanners[w->number]; + Banner* banner = &gBanners[w->number]; int32_t view_x = (banner->x << 5) + 16; int32_t view_y = (banner->y << 5) + 16; @@ -460,7 +460,7 @@ rct_window* window_sign_small_open(rct_windownumber number) */ static void window_sign_small_mouseup(rct_window* w, rct_widgetindex widgetIndex) { - rct_banner* banner = &gBanners[w->number]; + Banner* banner = &gBanners[w->number]; int32_t x = banner->x << 5; int32_t y = banner->y << 5; diff --git a/src/openrct2-ui/windows/TopToolbar.cpp b/src/openrct2-ui/windows/TopToolbar.cpp index 7c2fd0f2ad..edcb5192cf 100644 --- a/src/openrct2-ui/windows/TopToolbar.cpp +++ b/src/openrct2-ui/windows/TopToolbar.cpp @@ -1080,7 +1080,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->AsBanner()->GetIndex()]; + auto 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) { @@ -1165,7 +1165,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->AsBanner()->GetIndex(); - rct_banner* banner = &gBanners[bannerIndex]; + auto 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 4bc2921f7f..ac0503b484 100644 --- a/src/openrct2/EditorObjectSelectionSession.cpp +++ b/src/openrct2/EditorObjectSelectionSession.cpp @@ -125,7 +125,6 @@ void setup_in_use_selection_flags() do { uint16_t type; - rct_banner* banner; switch (iter.element->GetType()) { @@ -173,11 +172,13 @@ 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->AsBanner()->GetIndex()]; + { + auto 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); break; + } } } while (tile_element_iterator_next(&iter)); diff --git a/src/openrct2/actions/BannerPlaceAction.hpp b/src/openrct2/actions/BannerPlaceAction.hpp index 25354dc617..0ca3813ff6 100644 --- a/src/openrct2/actions/BannerPlaceAction.hpp +++ b/src/openrct2/actions/BannerPlaceAction.hpp @@ -137,7 +137,7 @@ public: TileElement* newTileElement = tile_element_insert(_loc.x / 32, _loc.y / 32, baseHeight, 0); assert(newTileElement != nullptr); - rct_banner* banner = &gBanners[_bannerIndex]; + auto banner = &gBanners[_bannerIndex]; banner->flags = 0; banner->string_idx = STR_DEFAULT_SIGN; diff --git a/src/openrct2/actions/BannerRemoveAction.hpp b/src/openrct2/actions/BannerRemoveAction.hpp index 6ee339b408..e65c5de92c 100644 --- a/src/openrct2/actions/BannerRemoveAction.hpp +++ b/src/openrct2/actions/BannerRemoveAction.hpp @@ -67,7 +67,7 @@ public: return MakeResult(GA_ERROR::INVALID_PARAMETERS, STR_CANT_REMOVE_THIS); } - rct_banner* banner = &gBanners[bannerElement->GetIndex()]; + auto banner = &gBanners[bannerElement->GetIndex()]; if (banner == nullptr) { @@ -107,7 +107,7 @@ public: return MakeResult(GA_ERROR::INVALID_PARAMETERS, STR_CANT_REMOVE_THIS); } - rct_banner* banner = &gBanners[bannerElement->GetIndex()]; + auto banner = &gBanners[bannerElement->GetIndex()]; if (banner == nullptr) { diff --git a/src/openrct2/actions/BannerSetNameAction.hpp b/src/openrct2/actions/BannerSetNameAction.hpp index f58ad620bc..dbc4a55ccf 100644 --- a/src/openrct2/actions/BannerSetNameAction.hpp +++ b/src/openrct2/actions/BannerSetNameAction.hpp @@ -71,7 +71,7 @@ public: GameActionResult::Ptr Execute() const override { - rct_banner* banner = &gBanners[_bannerIndex]; + auto banner = &gBanners[_bannerIndex]; utf8* buffer = gCommonStringFormatBuffer; utf8* dst = buffer; diff --git a/src/openrct2/actions/BannerSetStyleAction.hpp b/src/openrct2/actions/BannerSetStyleAction.hpp index 82488307bf..711980d1c5 100644 --- a/src/openrct2/actions/BannerSetStyleAction.hpp +++ b/src/openrct2/actions/BannerSetStyleAction.hpp @@ -63,7 +63,7 @@ public: return MakeResult(GA_ERROR::INVALID_PARAMETERS, STR_INVALID_SELECTION_OF_OBJECTS); } - rct_banner* banner = &gBanners[_bannerIndex]; + auto banner = &gBanners[_bannerIndex]; res->ExpenditureType = RCT_EXPENDITURE_TYPE_LANDSCAPING; res->Position.x = banner->x * 32 + 16; @@ -113,7 +113,7 @@ public: { auto res = MakeResult(); - rct_banner* banner = &gBanners[_bannerIndex]; + auto banner = &gBanners[_bannerIndex]; res->ExpenditureType = RCT_EXPENDITURE_TYPE_LANDSCAPING; res->Position.x = banner->x * 32 + 16; diff --git a/src/openrct2/actions/LargeSceneryPlaceAction.hpp b/src/openrct2/actions/LargeSceneryPlaceAction.hpp index 4cd296f0a9..24029aeb89 100644 --- a/src/openrct2/actions/LargeSceneryPlaceAction.hpp +++ b/src/openrct2/actions/LargeSceneryPlaceAction.hpp @@ -258,7 +258,7 @@ public: return std::make_unique(GA_ERROR::NO_FREE_ELEMENTS); } - rct_banner* banner = &gBanners[_bannerId]; + auto banner = &gBanners[_bannerId]; banner->string_idx = STR_DEFAULT_SIGN; banner->colour = 2; banner->text_colour = 2; diff --git a/src/openrct2/actions/SignSetNameAction.hpp b/src/openrct2/actions/SignSetNameAction.hpp index 6e0ee08df0..880980fc36 100644 --- a/src/openrct2/actions/SignSetNameAction.hpp +++ b/src/openrct2/actions/SignSetNameAction.hpp @@ -70,7 +70,7 @@ public: GameActionResult::Ptr Execute() const override { - rct_banner* banner = &gBanners[_bannerIndex]; + auto banner = &gBanners[_bannerIndex]; int32_t x = banner->x << 5; int32_t y = banner->y << 5; diff --git a/src/openrct2/actions/SignSetStyleAction.hpp b/src/openrct2/actions/SignSetStyleAction.hpp index 7493d0fc24..0f329a072b 100644 --- a/src/openrct2/actions/SignSetStyleAction.hpp +++ b/src/openrct2/actions/SignSetStyleAction.hpp @@ -57,7 +57,7 @@ public: return MakeResult(GA_ERROR::INVALID_PARAMETERS, STR_NONE); } - rct_banner* banner = &gBanners[_bannerIndex]; + auto banner = &gBanners[_bannerIndex]; CoordsXY coords{ banner->x * 32, banner->y * 32 }; @@ -91,7 +91,7 @@ public: GameActionResult::Ptr Execute() const override { - rct_banner* banner = &gBanners[_bannerIndex]; + auto banner = &gBanners[_bannerIndex]; CoordsXY coords{ banner->x * 32, banner->y * 32 }; diff --git a/src/openrct2/actions/WallPlaceAction.hpp b/src/openrct2/actions/WallPlaceAction.hpp index f8bb95666b..7c5a5d6d95 100644 --- a/src/openrct2/actions/WallPlaceAction.hpp +++ b/src/openrct2/actions/WallPlaceAction.hpp @@ -354,7 +354,7 @@ public: return std::make_unique(GA_ERROR::NO_FREE_ELEMENTS); } - rct_banner* banner = &gBanners[_bannerId]; + auto banner = &gBanners[_bannerId]; banner->string_idx = STR_DEFAULT_SIGN; banner->colour = 2; banner->text_colour = 2; diff --git a/src/openrct2/paint/tile_element/Paint.LargeScenery.cpp b/src/openrct2/paint/tile_element/Paint.LargeScenery.cpp index 3ee465040b..e39eaae1b1 100644 --- a/src/openrct2/paint/tile_element/Paint.LargeScenery.cpp +++ b/src/openrct2/paint/tile_element/Paint.LargeScenery.cpp @@ -310,7 +310,7 @@ void large_scenery_paint(paint_session* session, uint8_t direction, uint16_t hei } textColour = (textColour << 19) | IMAGE_TYPE_REMAP; BannerIndex bannerIndex = tileElement->AsLargeScenery()->GetBannerIndex(); - rct_banner* banner = &gBanners[bannerIndex]; + auto banner = &gBanners[bannerIndex]; rct_string_id stringId = banner->string_idx; if (banner->flags & BANNER_FLAG_LINKED_TO_RIDE) { @@ -429,7 +429,7 @@ void large_scenery_paint(paint_session* session, uint8_t direction, uint16_t hei set_format_arg(7, uint8_t, textColour); BannerIndex bannerIndex = tileElement->AsLargeScenery()->GetBannerIndex(); uint16_t scrollMode = entry->large_scenery.scrolling_mode + ((direction + 1) & 0x3); - rct_banner* banner = &gBanners[bannerIndex]; + auto banner = &gBanners[bannerIndex]; set_format_arg(0, rct_string_id, banner->string_idx); if (banner->flags & BANNER_FLAG_LINKED_TO_RIDE) { diff --git a/src/openrct2/paint/tile_element/Paint.Wall.cpp b/src/openrct2/paint/tile_element/Paint.Wall.cpp index f2ebe4a6df..08bb88c4d0 100644 --- a/src/openrct2/paint/tile_element/Paint.Wall.cpp +++ b/src/openrct2/paint/tile_element/Paint.Wall.cpp @@ -431,7 +431,7 @@ void fence_paint(paint_session* session, uint8_t direction, int32_t height, cons uint16_t scrollingMode = sceneryEntry->wall.scrolling_mode + ((direction + 1) & 0x3); uint8_t bannerIndex = tile_element->AsWall()->GetBannerIndex(); - rct_banner* banner = &gBanners[bannerIndex]; + auto banner = &gBanners[bannerIndex]; set_format_arg(0, rct_string_id, banner->string_idx); if (banner->flags & BANNER_FLAG_LINKED_TO_RIDE) diff --git a/src/openrct2/rct1/RCT1.h b/src/openrct2/rct1/RCT1.h index 372eeef042..d79c662de9 100644 --- a/src/openrct2/rct1/RCT1.h +++ b/src/openrct2/rct1/RCT1.h @@ -27,6 +27,7 @@ #define RCT1_MAX_STAFF 116 #define RCT1_RESEARCH_FLAGS_SEPARATOR 0xFF #define RCT1_MAX_ANIMATED_OBJECTS 1000 +#define RCT1_MAX_BANNERS 100 struct ParkLoadResult; @@ -665,7 +666,7 @@ struct rct1_s4 uint16_t unk_199C9A; rct1_research_item research_items_LL[180]; uint8_t unk_19A020[5468]; - rct_banner banners[100]; + RCT12Banner banners[RCT1_MAX_BANNERS]; char string_table[RCT12_MAX_USER_STRINGS][RCT12_USER_STRING_MAX_LENGTH]; uint32_t game_time_counter; rct1_ride rides[RCT12_MAX_RIDES_IN_PARK]; diff --git a/src/openrct2/rct1/S4Importer.cpp b/src/openrct2/rct1/S4Importer.cpp index b2d946b138..626a4564c4 100644 --- a/src/openrct2/rct1/S4Importer.cpp +++ b/src/openrct2/rct1/S4Importer.cpp @@ -2254,10 +2254,12 @@ private: dst2->SetPosition(src2->GetPosition()); dst2->SetAllowedEdges(src2->GetAllowedEdges()); - rct_banner* srcBanner = &_s4.banners[index]; - rct_banner* dstBanner = &gBanners[index]; - ImportBanner(dstBanner, srcBanner); - + if (index < std::size(_s4.banners)) + { + auto srcBanner = &_s4.banners[index]; + auto dstBanner = &gBanners[index]; + ImportBanner(dstBanner, srcBanner); + } break; } default: @@ -2831,10 +2833,16 @@ private: } } - void ImportBanner(rct_banner* dst, rct_banner* src) + void ImportBanner(Banner* dst, const RCT12Banner* src) { - *dst = *src; - dst->colour = RCT1::GetColour(src->colour); + *dst = {}; + dst->type = src->type; + + dst->flags = 0; + if (src->flags & BANNER_FLAG_NO_ENTRY) + { + dst->flags |= BANNER_FLAG_NO_ENTRY; + } dst->string_idx = STR_DEFAULT_SIGN; if (is_user_string_id(src->string_idx)) @@ -2849,6 +2857,11 @@ private: } } } + + dst->colour = RCT1::GetColour(src->colour); + dst->text_colour = src->text_colour; + dst->x = src->x; + dst->y = src->y; } void FixEntrancePositions() diff --git a/src/openrct2/rct12/RCT12.h b/src/openrct2/rct12/RCT12.h index e93b7f2622..d4a721cacf 100644 --- a/src/openrct2/rct12/RCT12.h +++ b/src/openrct2/rct12/RCT12.h @@ -521,4 +521,20 @@ struct RCT12RideMeasurement }; assert_struct_size(RCT12RideMeasurement, 0x4B0C); +struct RCT12Banner +{ + uint8_t type; + uint8_t flags; // 0x01 + rct_string_id string_idx; // 0x02 + union + { + uint8_t colour; // 0x04 + uint8_t ride_index; // 0x04 + }; + uint8_t text_colour; // 0x05 + uint8_t x; // 0x06 + uint8_t y; // 0x07 +}; +assert_struct_size(RCT12Banner, 8); + #pragma pack(pop) diff --git a/src/openrct2/rct2/S6Importer.cpp b/src/openrct2/rct2/S6Importer.cpp index d6d39eb382..123ff18c22 100644 --- a/src/openrct2/rct2/S6Importer.cpp +++ b/src/openrct2/rct2/S6Importer.cpp @@ -47,6 +47,7 @@ #include "../world/Entrance.h" #include "../world/MapAnimation.h" #include "../world/Park.h" +#include "../world/Scenery.h" #include "../world/Sprite.h" #include "../world/Surface.h" @@ -370,7 +371,6 @@ public: String::Set(gScenarioFileName, sizeof(gScenarioFileName), _s6.scenario_filename); } std::memcpy(gScenarioExpansionPacks, _s6.saved_expansion_pack_names, sizeof(_s6.saved_expansion_pack_names)); - std::memcpy(gBanners, _s6.banners, sizeof(_s6.banners)); // Clear all of the strings, since we will probably have a higher limit on user strings in the future than RCT2. user_string_clear_all(); std::memcpy(gUserStrings, _s6.custom_strings, sizeof(_s6.custom_strings)); @@ -836,6 +836,27 @@ public: std::memcpy(gResearchItems, _s6.research_items, sizeof(_s6.research_items)); } + void ImportBanner(Banner* dst, const RCT12Banner* src) + { + *dst = {}; + dst->type = src->type; + dst->flags = src->flags; + dst->string_idx = src->string_idx; + + if (src->flags & BANNER_FLAG_LINKED_TO_RIDE) + { + dst->ride_index = src->ride_index; + } + else + { + dst->colour = src->colour; + } + + dst->text_colour = src->text_colour; + dst->x = src->x; + dst->y = src->y; + } + void Initialise() { OpenRCT2::GetContext()->GetGameState()->InitAll(_s6.map_size); @@ -1040,6 +1061,22 @@ public: dst2->SetAcrossTrack(src2->IsAcrossTrack()); dst2->SetAnimationIsBackwards(src2->AnimationIsBackwards()); + // Import banner information + auto entry = dst2->GetEntry(); + if (entry != nullptr && entry->wall.scrolling_mode != SCROLLING_MODE_NONE) + { + auto bannerIndex = dst2->GetBannerIndex(); + if (bannerIndex < std::size(_s6.banners)) + { + auto srcBanner = &_s6.banners[bannerIndex]; + auto dstBanner = &gBanners[bannerIndex]; + ImportBanner(dstBanner, srcBanner); + } + else + { + dst2->SetBannerIndex(BANNER_INDEX_NULL); + } + } break; } case TILE_ELEMENT_TYPE_LARGE_SCENERY: @@ -1053,6 +1090,22 @@ public: dst2->SetSecondaryColour(src2->GetSecondaryColour()); dst2->SetBannerIndex(src2->GetBannerIndex()); + // Import banner information + auto entry = dst2->GetEntry(); + if (entry != nullptr && entry->large_scenery.scrolling_mode != SCROLLING_MODE_NONE) + { + auto bannerIndex = dst2->GetBannerIndex(); + if (bannerIndex < std::size(_s6.banners)) + { + auto srcBanner = &_s6.banners[bannerIndex]; + auto dstBanner = &gBanners[bannerIndex]; + ImportBanner(dstBanner, srcBanner); + } + else + { + dst2->SetBannerIndex(BANNER_INDEX_NULL); + } + } break; } case TILE_ELEMENT_TYPE_BANNER: @@ -1064,6 +1117,17 @@ public: dst2->SetPosition(src2->GetPosition()); dst2->SetAllowedEdges(src2->GetAllowedEdges()); + auto bannerIndex = src2->GetIndex(); + if (bannerIndex < std::size(_s6.banners)) + { + auto srcBanner = &_s6.banners[bannerIndex]; + auto dstBanner = &gBanners[bannerIndex]; + ImportBanner(dstBanner, srcBanner); + } + else + { + dst2->SetIndex(BANNER_INDEX_NULL); + } break; } default: diff --git a/src/openrct2/scenario/Scenario.cpp b/src/openrct2/scenario/Scenario.cpp index 390ad47a84..b5b6b8152e 100644 --- a/src/openrct2/scenario/Scenario.cpp +++ b/src/openrct2/scenario/Scenario.cpp @@ -625,7 +625,7 @@ void scenario_fix_ghosts(rct_s6_data* s6) BannerIndex bannerIndex = tile_element_get_banner_index(reinterpret_cast(originalElement)); if (bannerIndex != BANNER_INDEX_NULL) { - rct_banner* banner = &s6->banners[bannerIndex]; + auto banner = &s6->banners[bannerIndex]; if (banner->type != BANNER_NULL) { banner->type = BANNER_NULL; diff --git a/src/openrct2/scenario/Scenario.h b/src/openrct2/scenario/Scenario.h index 6f259956fe..ae37559f92 100644 --- a/src/openrct2/scenario/Scenario.h +++ b/src/openrct2/scenario/Scenario.h @@ -251,7 +251,7 @@ struct rct_s6_data uint8_t park_entrance_direction[RCT12_MAX_PARK_ENTRANCES]; char scenario_filename[256]; uint8_t saved_expansion_pack_names[3256]; - rct_banner banners[RCT2_MAX_BANNERS_IN_PARK]; + RCT12Banner banners[RCT2_MAX_BANNERS_IN_PARK]; char custom_strings[RCT12_MAX_USER_STRINGS][RCT12_USER_STRING_MAX_LENGTH]; uint32_t game_ticks_1; rct2_ride rides[RCT12_MAX_RIDES_IN_PARK]; diff --git a/src/openrct2/world/Banner.cpp b/src/openrct2/world/Banner.cpp index 213e282a67..e4d59befc3 100644 --- a/src/openrct2/world/Banner.cpp +++ b/src/openrct2/world/Banner.cpp @@ -30,7 +30,7 @@ #include #include -rct_banner gBanners[MAX_BANNERS]; +Banner gBanners[MAX_BANNERS]; /** * @@ -103,7 +103,7 @@ BannerIndex create_new_banner(uint8_t flags) if (flags & GAME_COMMAND_FLAG_APPLY) { - rct_banner* banner = &gBanners[bannerIndex]; + auto banner = &gBanners[bannerIndex]; banner->flags = 0; banner->type = 0; @@ -116,7 +116,7 @@ BannerIndex create_new_banner(uint8_t flags) TileElement* banner_get_tile_element(BannerIndex bannerIndex) { - rct_banner* banner = &gBanners[bannerIndex]; + auto banner = &gBanners[bannerIndex]; TileElement* tileElement = map_get_first_element_at(banner->x, banner->y); do { @@ -130,7 +130,7 @@ TileElement* banner_get_tile_element(BannerIndex bannerIndex) WallElement* banner_get_scrolling_wall_tile_element(BannerIndex bannerIndex) { - rct_banner* banner = &gBanners[bannerIndex]; + auto banner = &gBanners[bannerIndex]; TileElement* tileElement = map_get_first_element_at(banner->x, banner->y); if (tileElement == nullptr) @@ -243,7 +243,7 @@ void fix_duplicated_banners() Guard::Assert(!activeBanners[newBannerIndex]); // Copy over the original banner, but update the location - rct_banner& newBanner = gBanners[newBannerIndex]; + auto& newBanner = gBanners[newBannerIndex]; newBanner = gBanners[bannerIndex]; newBanner.x = x; newBanner.y = y; diff --git a/src/openrct2/world/Banner.h b/src/openrct2/world/Banner.h index b504d66a0f..19d7d286ff 100644 --- a/src/openrct2/world/Banner.h +++ b/src/openrct2/world/Banner.h @@ -18,23 +18,17 @@ constexpr BannerIndex BANNER_INDEX_NULL = (BannerIndex)-1; constexpr uint8_t SCROLLING_MODE_NONE = 255; -#pragma pack(push, 1) -struct rct_banner +struct Banner { uint8_t type; - uint8_t flags; // 0x01 - rct_string_id string_idx; // 0x02 - union - { - uint8_t colour; // 0x04 - uint8_t ride_index; // 0x04 - }; - uint8_t text_colour; // 0x05 - uint8_t x; // 0x06 - uint8_t y; // 0x07 + uint8_t flags; + rct_string_id string_idx; + uint8_t colour; + uint8_t ride_index; + uint8_t text_colour; + uint8_t x; + uint8_t y; }; -assert_struct_size(rct_banner, 8); -#pragma pack(pop) enum BANNER_FLAGS { @@ -44,7 +38,7 @@ enum BANNER_FLAGS BANNER_FLAG_IS_WALL = (1 << 3) }; -extern rct_banner gBanners[MAX_BANNERS]; +extern Banner gBanners[MAX_BANNERS]; void banner_init(); BannerIndex create_new_banner(uint8_t flags); diff --git a/src/openrct2/world/TileElement.cpp b/src/openrct2/world/TileElement.cpp index 09172082a8..4a9a2e6d31 100644 --- a/src/openrct2/world/TileElement.cpp +++ b/src/openrct2/world/TileElement.cpp @@ -127,7 +127,7 @@ void tile_element_remove_banner_entry(TileElement* tileElement) if (bannerIndex == BANNER_INDEX_NULL) return; - rct_banner* banner = &gBanners[bannerIndex]; + auto banner = &gBanners[bannerIndex]; if (banner->type != BANNER_NULL) { rct_windownumber windowNumber = bannerIndex; diff --git a/src/openrct2/world/TileInspector.cpp b/src/openrct2/world/TileInspector.cpp index 5278f341ef..a8d753f1d4 100644 --- a/src/openrct2/world/TileInspector.cpp +++ b/src/openrct2/world/TileInspector.cpp @@ -307,7 +307,7 @@ GameActionResult::Ptr tile_inspector_paste_element_at(CoordsXY loc, TileElement { return std::make_unique(GA_ERROR::UNKNOWN, STR_NONE); } - rct_banner& newBanner = gBanners[newBannerIndex]; + auto& newBanner = gBanners[newBannerIndex]; newBanner = gBanners[bannerIndex]; newBanner.x = loc.x / 32; newBanner.y = loc.y / 32;