From 40313b1ea3182adbb4586e9c8ca13032a19a0350 Mon Sep 17 00:00:00 2001 From: ZehMatt Date: Tue, 17 Aug 2021 06:20:07 +0300 Subject: [PATCH 01/51] Move network instance into Context --- src/openrct2/Context.cpp | 18 +- src/openrct2/Context.h | 8 +- src/openrct2/network/NetworkBase.cpp | 320 +++++++++++++++------------ src/openrct2/network/NetworkBase.h | 9 +- 4 files changed, 213 insertions(+), 142 deletions(-) diff --git a/src/openrct2/Context.cpp b/src/openrct2/Context.cpp index d0f739970e..620c364caa 100644 --- a/src/openrct2/Context.cpp +++ b/src/openrct2/Context.cpp @@ -46,6 +46,7 @@ #include "localisation/Localisation.h" #include "localisation/LocalisationService.h" #include "network/DiscordService.h" +#include "network/NetworkBase.h" #include "network/network.h" #include "object/ObjectManager.h" #include "object/ObjectRepository.h" @@ -108,6 +109,9 @@ namespace OpenRCT2 #ifdef ENABLE_SCRIPTING ScriptEngine _scriptEngine; #endif +#ifndef DISABLE_NETWORK + NetworkBase _network; +#endif // Game states std::unique_ptr _titleScreen; @@ -149,6 +153,9 @@ namespace OpenRCT2 , _localisationService(std::make_unique(env)) #ifdef ENABLE_SCRIPTING , _scriptEngine(_stdInOutConsole, *env) +#endif +#ifndef DISABLE_NETWORK + , _network(*this) #endif , _painter(std::make_unique(uiContext)) { @@ -164,7 +171,7 @@ namespace OpenRCT2 // If objects use GetContext() in their destructor things won't go well. GameActions::ClearQueue(); - network_close(); + _network.Close(); window_close_all(); // Unload objects after closing all windows, this is to overcome windows like @@ -256,11 +263,18 @@ namespace OpenRCT2 return _drawingEngine.get(); } - virtual Paint::Painter* GetPainter() override + Paint::Painter* GetPainter() override { return _painter.get(); } +#ifndef DISABLE_NETWORK + NetworkBase& GetNetwork() override + { + return _network; + } +#endif + int32_t RunOpenRCT2(int argc, const char** argv) override { if (Initialise()) diff --git a/src/openrct2/Context.h b/src/openrct2/Context.h index 967ac662b7..258f636926 100644 --- a/src/openrct2/Context.h +++ b/src/openrct2/Context.h @@ -1,4 +1,4 @@ -/***************************************************************************** +/***************************************************************************** * Copyright (c) 2014-2020 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md @@ -70,6 +70,8 @@ enum CURSOR_PRESSED = CURSOR_DOWN | CURSOR_CHANGED, }; +class NetworkBase; + namespace OpenRCT2 { class GameState; @@ -131,7 +133,9 @@ namespace OpenRCT2 virtual DrawingEngine GetDrawingEngineType() abstract; virtual Drawing::IDrawingEngine* GetDrawingEngine() abstract; virtual Paint::Painter* GetPainter() abstract; - +#ifndef DISABLE_NETWORK + virtual NetworkBase& GetNetwork() abstract; +#endif virtual int32_t RunOpenRCT2(int argc, const char** argv) abstract; virtual bool Initialise() abstract; diff --git a/src/openrct2/network/NetworkBase.cpp b/src/openrct2/network/NetworkBase.cpp index 7f3578ff38..f028427c9d 100644 --- a/src/openrct2/network/NetworkBase.cpp +++ b/src/openrct2/network/NetworkBase.cpp @@ -105,9 +105,8 @@ static void network_get_keys_directory(utf8* buffer, size_t bufferSize); static void network_get_private_key_path(utf8* buffer, size_t bufferSize, const std::string& playerName); static void network_get_public_key_path(utf8* buffer, size_t bufferSize, const std::string& playerName, const utf8* hash); -static NetworkBase gNetwork; - -NetworkBase::NetworkBase() +NetworkBase::NetworkBase(OpenRCT2::IContext& context) + : _context(context) { wsa_initialized = false; mode = NETWORK_MODE_NONE; @@ -561,7 +560,7 @@ void NetworkBase::UpdateClient() auto intent = Intent(WC_NETWORK_STATUS); intent.putExtra(INTENT_EXTRA_MESSAGE, std::string{ str_resolving }); - intent.putExtra(INTENT_EXTRA_CALLBACK, []() -> void { gNetwork.Close(); }); + intent.putExtra(INTENT_EXTRA_CALLBACK, []() -> void { GetContext()->GetNetwork().Close(); }); context_open_intent(&intent); } break; @@ -576,7 +575,7 @@ void NetworkBase::UpdateClient() auto intent = Intent(WC_NETWORK_STATUS); intent.putExtra(INTENT_EXTRA_MESSAGE, std::string{ str_connecting }); - intent.putExtra(INTENT_EXTRA_CALLBACK, []() -> void { gNetwork.Close(); }); + intent.putExtra(INTENT_EXTRA_CALLBACK, []() -> void { GetContext()->GetNetwork().Close(); }); context_open_intent(&intent); server_connect_time = platform_get_ticks(); @@ -593,7 +592,7 @@ void NetworkBase::UpdateClient() auto intent = Intent(WC_NETWORK_STATUS); intent.putExtra(INTENT_EXTRA_MESSAGE, std::string{ str_authenticating }); - intent.putExtra(INTENT_EXTRA_CALLBACK, []() -> void { gNetwork.Close(); }); + intent.putExtra(INTENT_EXTRA_CALLBACK, []() -> void { GetContext()->GetNetwork().Close(); }); context_open_intent(&intent); break; } @@ -1990,7 +1989,7 @@ void NetworkBase::ServerClientDisconnected(std::unique_ptr& c network_get_current_player_id() }; auto res = GameActions::Execute(&pickupAction); } - gNetwork.Server_Send_EVENT_PLAYER_DISCONNECTED( + Server_Send_EVENT_PLAYER_DISCONNECTED( const_cast(connection_player->Name.c_str()), connection->GetLastDisconnectReason()); // Log player disconnected event @@ -2339,7 +2338,7 @@ void NetworkBase::Client_Handle_OBJECTS_LIST(NetworkConnection& connection, Netw auto intent = Intent(WC_NETWORK_STATUS); intent.putExtra(INTENT_EXTRA_MESSAGE, std::string{ objectListMsg }); - intent.putExtra(INTENT_EXTRA_CALLBACK, []() -> void { gNetwork.Close(); }); + intent.putExtra(INTENT_EXTRA_CALLBACK, []() -> void { GetContext()->GetNetwork().Close(); }); context_open_intent(&intent); char objectName[12]{}; @@ -2665,7 +2664,7 @@ void NetworkBase::Client_Handle_MAP([[maybe_unused]] NetworkConnection& connecti auto intent = Intent(WC_NETWORK_STATUS); intent.putExtra(INTENT_EXTRA_MESSAGE, std::string{ str_downloading_map }); - intent.putExtra(INTENT_EXTRA_CALLBACK, []() -> void { gNetwork.Close(); }); + intent.putExtra(INTENT_EXTRA_CALLBACK, []() -> void { GetContext()->GetNetwork().Close(); }); context_open_intent(&intent); std::memcpy(&chunk_buffer[offset], const_cast(static_cast(packet.Read(chunksize))), chunksize); @@ -3220,137 +3219,143 @@ void NetworkBase::Client_Handle_GAMEINFO([[maybe_unused]] NetworkConnection& con void network_set_env(const std::shared_ptr& env) { - gNetwork.SetEnvironment(env); + OpenRCT2::GetContext()->GetNetwork().SetEnvironment(env); } void network_close() { - gNetwork.Close(); + OpenRCT2::GetContext()->GetNetwork().Close(); } void network_reconnect() { - gNetwork.Reconnect(); + OpenRCT2::GetContext()->GetNetwork().Reconnect(); } void network_shutdown_client() { - gNetwork.ServerClientDisconnected(); + OpenRCT2::GetContext()->GetNetwork().ServerClientDisconnected(); } int32_t network_begin_client(const std::string& host, int32_t port) { - return gNetwork.BeginClient(host, port); + return OpenRCT2::GetContext()->GetNetwork().BeginClient(host, port); } int32_t network_begin_server(int32_t port, const std::string& address) { - return gNetwork.BeginServer(port, address); + return OpenRCT2::GetContext()->GetNetwork().BeginServer(port, address); } void network_update() { - gNetwork.Update(); + OpenRCT2::GetContext()->GetNetwork().Update(); } void network_process_pending() { - gNetwork.ProcessPending(); + OpenRCT2::GetContext()->GetNetwork().ProcessPending(); } void network_flush() { - gNetwork.Flush(); + OpenRCT2::GetContext()->GetNetwork().Flush(); } int32_t network_get_mode() { - return gNetwork.GetMode(); + return OpenRCT2::GetContext()->GetNetwork().GetMode(); } int32_t network_get_status() { - return gNetwork.GetStatus(); + return OpenRCT2::GetContext()->GetNetwork().GetStatus(); } bool network_is_desynchronised() { - return gNetwork.IsDesynchronised(); + return OpenRCT2::GetContext()->GetNetwork().IsDesynchronised(); } bool network_check_desynchronisation() { - return gNetwork.CheckDesynchronizaton(); + return OpenRCT2::GetContext()->GetNetwork().CheckDesynchronizaton(); } void network_request_gamestate_snapshot() { - return gNetwork.RequestStateSnapshot(); + return OpenRCT2::GetContext()->GetNetwork().RequestStateSnapshot(); } void network_send_tick() { - gNetwork.Server_Send_TICK(); + OpenRCT2::GetContext()->GetNetwork().Server_Send_TICK(); } NetworkAuth network_get_authstatus() { - return gNetwork.GetAuthStatus(); + return OpenRCT2::GetContext()->GetNetwork().GetAuthStatus(); } uint32_t network_get_server_tick() { - return gNetwork.GetServerTick(); + return OpenRCT2::GetContext()->GetNetwork().GetServerTick(); } uint8_t network_get_current_player_id() { - return gNetwork.GetPlayerID(); + return OpenRCT2::GetContext()->GetNetwork().GetPlayerID(); } int32_t network_get_num_players() { - return static_cast(gNetwork.player_list.size()); + return static_cast(OpenRCT2::GetContext()->GetNetwork().player_list.size()); } const char* network_get_player_name(uint32_t index) { - Guard::IndexInRange(index, gNetwork.player_list); + auto& network = OpenRCT2::GetContext()->GetNetwork(); + Guard::IndexInRange(index, network.player_list); - return static_cast(gNetwork.player_list[index]->Name.c_str()); + return static_cast(network.player_list[index]->Name.c_str()); } uint32_t network_get_player_flags(uint32_t index) { - Guard::IndexInRange(index, gNetwork.player_list); + auto& network = OpenRCT2::GetContext()->GetNetwork(); + Guard::IndexInRange(index, network.player_list); - return gNetwork.player_list[index]->Flags; + return network.player_list[index]->Flags; } int32_t network_get_player_ping(uint32_t index) { - Guard::IndexInRange(index, gNetwork.player_list); + auto& network = OpenRCT2::GetContext()->GetNetwork(); + Guard::IndexInRange(index, network.player_list); - return gNetwork.player_list[index]->Ping; + return network.player_list[index]->Ping; } int32_t network_get_player_id(uint32_t index) { - Guard::IndexInRange(index, gNetwork.player_list); + auto& network = OpenRCT2::GetContext()->GetNetwork(); + Guard::IndexInRange(index, network.player_list); - return gNetwork.player_list[index]->Id; + return network.player_list[index]->Id; } money32 network_get_player_money_spent(uint32_t index) { - Guard::IndexInRange(index, gNetwork.player_list); + auto& network = OpenRCT2::GetContext()->GetNetwork(); + Guard::IndexInRange(index, network.player_list); - return gNetwork.player_list[index]->MoneySpent; + return network.player_list[index]->MoneySpent; } std::string network_get_player_ip_address(uint32_t id) { - auto conn = gNetwork.GetPlayerConnection(id); + auto& network = OpenRCT2::GetContext()->GetNetwork(); + auto conn = network.GetPlayerConnection(id); if (conn != nullptr && conn->Socket != nullptr) { return conn->Socket->GetIpAddress(); @@ -3360,7 +3365,8 @@ std::string network_get_player_ip_address(uint32_t id) std::string network_get_player_public_key_hash(uint32_t id) { - auto player = gNetwork.GetPlayerByID(id); + auto& network = OpenRCT2::GetContext()->GetNetwork(); + auto player = network.GetPlayerByID(id); if (player != nullptr) { return player->KeyHash; @@ -3370,104 +3376,117 @@ std::string network_get_player_public_key_hash(uint32_t id) void network_add_player_money_spent(uint32_t index, money32 cost) { - Guard::IndexInRange(index, gNetwork.player_list); + auto& network = OpenRCT2::GetContext()->GetNetwork(); + Guard::IndexInRange(index, network.player_list); - gNetwork.player_list[index]->AddMoneySpent(cost); + network.player_list[index]->AddMoneySpent(cost); } int32_t network_get_player_last_action(uint32_t index, int32_t time) { - Guard::IndexInRange(index, gNetwork.player_list); + auto& network = OpenRCT2::GetContext()->GetNetwork(); + Guard::IndexInRange(index, network.player_list); - if (time && platform_get_ticks() > gNetwork.player_list[index]->LastActionTime + time) + if (time && platform_get_ticks() > network.player_list[index]->LastActionTime + time) { return -999; } - return gNetwork.player_list[index]->LastAction; + return network.player_list[index]->LastAction; } void network_set_player_last_action(uint32_t index, GameCommand command) { - Guard::IndexInRange(index, gNetwork.player_list); + auto& network = OpenRCT2::GetContext()->GetNetwork(); + Guard::IndexInRange(index, network.player_list); - gNetwork.player_list[index]->LastAction = static_cast(NetworkActions::FindCommand(command)); - gNetwork.player_list[index]->LastActionTime = platform_get_ticks(); + network.player_list[index]->LastAction = static_cast(NetworkActions::FindCommand(command)); + network.player_list[index]->LastActionTime = platform_get_ticks(); } CoordsXYZ network_get_player_last_action_coord(uint32_t index) { - Guard::IndexInRange(index, gNetwork.player_list); + auto& network = OpenRCT2::GetContext()->GetNetwork(); + Guard::IndexInRange(index, OpenRCT2::GetContext()->GetNetwork().player_list); - return gNetwork.player_list[index]->LastActionCoord; + return network.player_list[index]->LastActionCoord; } void network_set_player_last_action_coord(uint32_t index, const CoordsXYZ& coord) { - Guard::IndexInRange(index, gNetwork.player_list); + auto& network = OpenRCT2::GetContext()->GetNetwork(); + Guard::IndexInRange(index, network.player_list); - if (index < gNetwork.player_list.size()) + if (index < network.player_list.size()) { - gNetwork.player_list[index]->LastActionCoord = coord; + network.player_list[index]->LastActionCoord = coord; } } uint32_t network_get_player_commands_ran(uint32_t index) { - Guard::IndexInRange(index, gNetwork.player_list); + auto& network = OpenRCT2::GetContext()->GetNetwork(); + Guard::IndexInRange(index, OpenRCT2::GetContext()->GetNetwork().player_list); - return gNetwork.player_list[index]->CommandsRan; + return network.player_list[index]->CommandsRan; } int32_t network_get_player_index(uint32_t id) { - auto it = gNetwork.GetPlayerIteratorByID(id); - if (it == gNetwork.player_list.end()) + auto& network = OpenRCT2::GetContext()->GetNetwork(); + auto it = network.GetPlayerIteratorByID(id); + if (it == network.player_list.end()) { return -1; } - return static_cast(gNetwork.GetPlayerIteratorByID(id) - gNetwork.player_list.begin()); + return static_cast(network.GetPlayerIteratorByID(id) - network.player_list.begin()); } uint8_t network_get_player_group(uint32_t index) { - Guard::IndexInRange(index, gNetwork.player_list); + auto& network = OpenRCT2::GetContext()->GetNetwork(); + Guard::IndexInRange(index, network.player_list); - return gNetwork.player_list[index]->Group; + return network.player_list[index]->Group; } void network_set_player_group(uint32_t index, uint32_t groupindex) { - Guard::IndexInRange(index, gNetwork.player_list); - Guard::IndexInRange(groupindex, gNetwork.group_list); + auto& network = OpenRCT2::GetContext()->GetNetwork(); + Guard::IndexInRange(index, network.player_list); + Guard::IndexInRange(groupindex, network.group_list); - gNetwork.player_list[index]->Group = gNetwork.group_list[groupindex]->Id; + network.player_list[index]->Group = network.group_list[groupindex]->Id; } int32_t network_get_group_index(uint8_t id) { - auto it = gNetwork.GetGroupIteratorByID(id); - if (it == gNetwork.group_list.end()) + auto& network = OpenRCT2::GetContext()->GetNetwork(); + auto it = network.GetGroupIteratorByID(id); + if (it == network.group_list.end()) { return -1; } - return static_cast(gNetwork.GetGroupIteratorByID(id) - gNetwork.group_list.begin()); + return static_cast(network.GetGroupIteratorByID(id) - network.group_list.begin()); } uint8_t network_get_group_id(uint32_t index) { - Guard::IndexInRange(index, gNetwork.group_list); + auto& network = OpenRCT2::GetContext()->GetNetwork(); + Guard::IndexInRange(index, network.group_list); - return gNetwork.group_list[index]->Id; + return network.group_list[index]->Id; } int32_t network_get_num_groups() { - return static_cast(gNetwork.group_list.size()); + auto& network = OpenRCT2::GetContext()->GetNetwork(); + return static_cast(network.group_list.size()); } const char* network_get_group_name(uint32_t index) { - return gNetwork.group_list[index]->GetName().c_str(); + auto& network = OpenRCT2::GetContext()->GetNetwork(); + return network.group_list[index]->GetName().c_str(); } void network_chat_show_connected_message() @@ -3501,15 +3520,16 @@ void network_chat_show_server_greeting() GameActions::Result::Ptr network_set_player_group( NetworkPlayerId_t actionPlayerId, NetworkPlayerId_t playerId, uint8_t groupId, bool isExecuting) { - NetworkPlayer* player = gNetwork.GetPlayerByID(playerId); + auto& network = OpenRCT2::GetContext()->GetNetwork(); + NetworkPlayer* player = network.GetPlayerByID(playerId); - NetworkGroup* fromgroup = gNetwork.GetGroupByID(actionPlayerId); + NetworkGroup* fromgroup = network.GetGroupByID(actionPlayerId); if (player == nullptr) { return std::make_unique(GameActions::Status::InvalidParameters, STR_CANT_DO_THIS); } - if (!gNetwork.GetGroupByID(groupId)) + if (!network.GetGroupByID(groupId)) { return std::make_unique(GameActions::Status::InvalidParameters, STR_CANT_DO_THIS); } @@ -3532,18 +3552,18 @@ GameActions::Result::Ptr network_set_player_group( if (network_get_mode() == NETWORK_MODE_SERVER) { // Add or update saved user - NetworkUserManager* userManager = &gNetwork._userManager; - NetworkUser* networkUser = userManager->GetOrAddUser(player->KeyHash); + NetworkUserManager& userManager = network._userManager; + NetworkUser* networkUser = userManager.GetOrAddUser(player->KeyHash); networkUser->GroupId = groupId; networkUser->Name = player->Name; - userManager->Save(); + userManager.Save(); } window_invalidate_by_number(WC_PLAYER, playerId); // Log set player group event - NetworkPlayer* game_command_player = gNetwork.GetPlayerByID(actionPlayerId); - NetworkGroup* new_player_group = gNetwork.GetGroupByID(groupId); + NetworkPlayer* game_command_player = network.GetPlayerByID(actionPlayerId); + NetworkGroup* new_player_group = network.GetGroupByID(groupId); char log_msg[256]; const char* args[3] = { player->Name.c_str(), @@ -3560,13 +3580,14 @@ GameActions::Result::Ptr network_modify_groups( NetworkPlayerId_t actionPlayerId, ModifyGroupType type, uint8_t groupId, const std::string& name, uint32_t permissionIndex, PermissionState permissionState, bool isExecuting) { + auto& network = OpenRCT2::GetContext()->GetNetwork(); switch (type) { case ModifyGroupType::AddGroup: { if (isExecuting) { - NetworkGroup* newgroup = gNetwork.AddGroup(); + NetworkGroup* newgroup = network.AddGroup(); if (newgroup == nullptr) { return std::make_unique(GameActions::Status::Unknown, STR_CANT_DO_THIS); @@ -3581,7 +3602,7 @@ GameActions::Result::Ptr network_modify_groups( return std::make_unique( GameActions::Status::Disallowed, STR_THIS_GROUP_CANNOT_BE_MODIFIED); } - for (const auto& it : gNetwork.player_list) + for (const auto& it : network.player_list) { if ((it.get())->Group == groupId) { @@ -3591,7 +3612,7 @@ GameActions::Result::Ptr network_modify_groups( } if (isExecuting) { - gNetwork.RemoveGroup(groupId); + network.RemoveGroup(groupId); } } break; @@ -3603,11 +3624,11 @@ GameActions::Result::Ptr network_modify_groups( GameActions::Status::Disallowed, STR_THIS_GROUP_CANNOT_BE_MODIFIED); } NetworkGroup* mygroup = nullptr; - NetworkPlayer* player = gNetwork.GetPlayerByID(actionPlayerId); + NetworkPlayer* player = network.GetPlayerByID(actionPlayerId); auto networkPermission = static_cast(permissionIndex); if (player != nullptr && permissionState == PermissionState::Toggle) { - mygroup = gNetwork.GetGroupByID(player->Group); + mygroup = network.GetGroupByID(player->Group); if (mygroup == nullptr || !mygroup->CanPerformAction(networkPermission)) { return std::make_unique( @@ -3616,7 +3637,7 @@ GameActions::Result::Ptr network_modify_groups( } if (isExecuting) { - NetworkGroup* group = gNetwork.GetGroupByID(groupId); + NetworkGroup* group = network.GetGroupByID(groupId); if (group != nullptr) { if (permissionState != PermissionState::Toggle) @@ -3643,7 +3664,7 @@ GameActions::Result::Ptr network_modify_groups( break; case ModifyGroupType::SetName: { - NetworkGroup* group = gNetwork.GetGroupByID(groupId); + NetworkGroup* group = network.GetGroupByID(groupId); const char* oldName = group->GetName().c_str(); if (strcmp(oldName, name.c_str()) == 0) @@ -3674,7 +3695,7 @@ GameActions::Result::Ptr network_modify_groups( } if (isExecuting) { - gNetwork.SetDefaultGroup(groupId); + network.SetDefaultGroup(groupId); } } break; @@ -3683,14 +3704,15 @@ GameActions::Result::Ptr network_modify_groups( return std::make_unique(GameActions::Status::InvalidParameters, STR_NONE); } - gNetwork.SaveGroups(); + network.SaveGroups(); return std::make_unique(); } GameActions::Result::Ptr network_kick_player(NetworkPlayerId_t playerId, bool isExecuting) { - NetworkPlayer* player = gNetwork.GetPlayerByID(playerId); + auto& network = OpenRCT2::GetContext()->GetNetwork(); + NetworkPlayer* player = network.GetPlayerByID(playerId); if (player == nullptr) { // Player might be already removed by the PLAYERLIST command, need to refactor non-game commands executing too @@ -3705,14 +3727,14 @@ GameActions::Result::Ptr network_kick_player(NetworkPlayerId_t playerId, bool is if (isExecuting) { - if (gNetwork.GetMode() == NETWORK_MODE_SERVER) + if (network.GetMode() == NETWORK_MODE_SERVER) { - gNetwork.KickPlayer(playerId); + network.KickPlayer(playerId); - NetworkUserManager* networkUserManager = &gNetwork._userManager; - networkUserManager->Load(); - networkUserManager->RemoveUser(player->KeyHash); - networkUserManager->Save(); + NetworkUserManager& networkUserManager = network._userManager; + networkUserManager.Load(); + networkUserManager.RemoveUser(player->KeyHash); + networkUserManager.Save(); } } return std::make_unique(); @@ -3720,7 +3742,8 @@ GameActions::Result::Ptr network_kick_player(NetworkPlayerId_t playerId, bool is uint8_t network_get_default_group() { - return gNetwork.GetDefaultGroup(); + auto& network = OpenRCT2::GetContext()->GetNetwork(); + return network.GetDefaultGroup(); } int32_t network_get_num_actions() @@ -3742,27 +3765,30 @@ rct_string_id network_get_action_name_string_id(uint32_t index) int32_t network_can_perform_action(uint32_t groupindex, NetworkPermission index) { - Guard::IndexInRange(groupindex, gNetwork.group_list); + auto& network = OpenRCT2::GetContext()->GetNetwork(); + Guard::IndexInRange(groupindex, network.group_list); - return gNetwork.group_list[groupindex]->CanPerformAction(index); + return network.group_list[groupindex]->CanPerformAction(index); } int32_t network_can_perform_command(uint32_t groupindex, int32_t index) { - Guard::IndexInRange(groupindex, gNetwork.group_list); + auto& network = OpenRCT2::GetContext()->GetNetwork(); + Guard::IndexInRange(groupindex, network.group_list); - return gNetwork.group_list[groupindex]->CanPerformCommand(static_cast(index)); // TODO + return network.group_list[groupindex]->CanPerformCommand(static_cast(index)); // TODO } void network_set_pickup_peep(uint8_t playerid, Peep* peep) { - if (gNetwork.GetMode() == NETWORK_MODE_NONE) + auto& network = OpenRCT2::GetContext()->GetNetwork(); + if (network.GetMode() == NETWORK_MODE_NONE) { _pickup_peep = peep; } else { - NetworkPlayer* player = gNetwork.GetPlayerByID(playerid); + NetworkPlayer* player = network.GetPlayerByID(playerid); if (player) { player->PickupPeep = peep; @@ -3772,13 +3798,14 @@ void network_set_pickup_peep(uint8_t playerid, Peep* peep) Peep* network_get_pickup_peep(uint8_t playerid) { - if (gNetwork.GetMode() == NETWORK_MODE_NONE) + auto& network = OpenRCT2::GetContext()->GetNetwork(); + if (network.GetMode() == NETWORK_MODE_NONE) { return _pickup_peep; } else { - NetworkPlayer* player = gNetwork.GetPlayerByID(playerid); + NetworkPlayer* player = network.GetPlayerByID(playerid); if (player) { return player->PickupPeep; @@ -3789,13 +3816,14 @@ Peep* network_get_pickup_peep(uint8_t playerid) void network_set_pickup_peep_old_x(uint8_t playerid, int32_t x) { - if (gNetwork.GetMode() == NETWORK_MODE_NONE) + auto& network = OpenRCT2::GetContext()->GetNetwork(); + if (network.GetMode() == NETWORK_MODE_NONE) { _pickup_peep_old_x = x; } else { - NetworkPlayer* player = gNetwork.GetPlayerByID(playerid); + NetworkPlayer* player = network.GetPlayerByID(playerid); if (player) { player->PickupPeepOldX = x; @@ -3805,13 +3833,14 @@ void network_set_pickup_peep_old_x(uint8_t playerid, int32_t x) int32_t network_get_pickup_peep_old_x(uint8_t playerid) { - if (gNetwork.GetMode() == NETWORK_MODE_NONE) + auto& network = OpenRCT2::GetContext()->GetNetwork(); + if (network.GetMode() == NETWORK_MODE_NONE) { return _pickup_peep_old_x; } else { - NetworkPlayer* player = gNetwork.GetPlayerByID(playerid); + NetworkPlayer* player = network.GetPlayerByID(playerid); if (player) { return player->PickupPeepOldX; @@ -3822,7 +3851,8 @@ int32_t network_get_pickup_peep_old_x(uint8_t playerid) int32_t network_get_current_player_group_index() { - NetworkPlayer* player = gNetwork.GetPlayerByID(gNetwork.GetPlayerID()); + auto& network = OpenRCT2::GetContext()->GetNetwork(); + NetworkPlayer* player = network.GetPlayerByID(network.GetPlayerID()); if (player) { return network_get_group_index(player->Group); @@ -3832,31 +3862,33 @@ int32_t network_get_current_player_group_index() void network_send_map() { - gNetwork.Server_Send_MAP(); + auto& network = OpenRCT2::GetContext()->GetNetwork(); + network.Server_Send_MAP(); } void network_send_chat(const char* text, const std::vector& playerIds) { - if (gNetwork.GetMode() == NETWORK_MODE_CLIENT) + auto& network = OpenRCT2::GetContext()->GetNetwork(); + if (network.GetMode() == NETWORK_MODE_CLIENT) { - gNetwork.Client_Send_CHAT(text); + network.Client_Send_CHAT(text); } - else if (gNetwork.GetMode() == NETWORK_MODE_SERVER) + else if (network.GetMode() == NETWORK_MODE_SERVER) { std::string message = text; - if (ProcessChatMessagePluginHooks(gNetwork.GetPlayerID(), message)) + if (ProcessChatMessagePluginHooks(network.GetPlayerID(), message)) { - auto player = gNetwork.GetPlayerByID(gNetwork.GetPlayerID()); + auto player = network.GetPlayerByID(network.GetPlayerID()); if (player != nullptr) { - auto formatted = gNetwork.FormatChat(player, message.c_str()); + auto formatted = network.FormatChat(player, message.c_str()); if (playerIds.empty() - || std::find(playerIds.begin(), playerIds.end(), gNetwork.GetPlayerID()) != playerIds.end()) + || std::find(playerIds.begin(), playerIds.end(), network.GetPlayerID()) != playerIds.end()) { // Server is one of the recipients chat_history_add(formatted); } - gNetwork.Server_Send_CHAT(formatted, playerIds); + network.Server_Send_CHAT(formatted, playerIds); } } } @@ -3864,19 +3896,21 @@ void network_send_chat(const char* text, const std::vector& playerIds) void network_send_game_action(const GameAction* action) { - switch (gNetwork.GetMode()) + auto& network = OpenRCT2::GetContext()->GetNetwork(); + switch (network.GetMode()) { case NETWORK_MODE_SERVER: - gNetwork.Server_Send_GAME_ACTION(action); + network.Server_Send_GAME_ACTION(action); break; case NETWORK_MODE_CLIENT: - gNetwork.Client_Send_GAME_ACTION(action); + network.Client_Send_GAME_ACTION(action); break; } } void network_send_password(const std::string& password) { + auto& network = OpenRCT2::GetContext()->GetNetwork(); utf8 keyPath[MAX_PATH]; network_get_private_key_path(keyPath, sizeof(keyPath), gConfigNetwork.player_name); if (!Platform::FileExists(keyPath)) @@ -3887,36 +3921,39 @@ void network_send_password(const std::string& password) try { auto fs = FileStream(keyPath, FILE_MODE_OPEN); - gNetwork._key.LoadPrivate(&fs); + network._key.LoadPrivate(&fs); } catch (const std::exception&) { log_error("Error reading private key from %s.", keyPath); return; } - const std::string pubkey = gNetwork._key.PublicKeyString(); + const std::string pubkey = network._key.PublicKeyString(); std::vector signature; - gNetwork._key.Sign(gNetwork._challenge.data(), gNetwork._challenge.size(), signature); + network._key.Sign(network._challenge.data(), network._challenge.size(), signature); // Don't keep private key in memory. There's no need and it may get leaked // when process dump gets collected at some point in future. - gNetwork._key.Unload(); - gNetwork.Client_Send_AUTH(gConfigNetwork.player_name.c_str(), password, pubkey.c_str(), signature); + network._key.Unload(); + network.Client_Send_AUTH(gConfigNetwork.player_name.c_str(), password, pubkey.c_str(), signature); } void network_set_password(const char* password) { - gNetwork.SetPassword(password); + auto& network = OpenRCT2::GetContext()->GetNetwork(); + network.SetPassword(password); } void network_append_chat_log(const utf8* text) { - gNetwork.AppendChatLog(text); + auto& network = OpenRCT2::GetContext()->GetNetwork(); + network.AppendChatLog(text); } void network_append_server_log(const utf8* text) { - gNetwork.AppendServerLog(text); + auto& network = OpenRCT2::GetContext()->GetNetwork(); + network.AppendServerLog(text); } static void network_get_keys_directory(utf8* buffer, size_t bufferSize) @@ -3942,27 +3979,33 @@ static void network_get_public_key_path(utf8* buffer, size_t bufferSize, const s const utf8* network_get_server_name() { - return gNetwork.ServerName.c_str(); + auto& network = OpenRCT2::GetContext()->GetNetwork(); + return network.ServerName.c_str(); } const utf8* network_get_server_description() { - return gNetwork.ServerDescription.c_str(); + auto& network = OpenRCT2::GetContext()->GetNetwork(); + return network.ServerDescription.c_str(); } const utf8* network_get_server_greeting() { - return gNetwork.ServerGreeting.c_str(); + auto& network = OpenRCT2::GetContext()->GetNetwork(); + return network.ServerGreeting.c_str(); } const utf8* network_get_server_provider_name() { - return gNetwork.ServerProviderName.c_str(); + auto& network = OpenRCT2::GetContext()->GetNetwork(); + return network.ServerProviderName.c_str(); } const utf8* network_get_server_provider_email() { - return gNetwork.ServerProviderEmail.c_str(); + auto& network = OpenRCT2::GetContext()->GetNetwork(); + return network.ServerProviderEmail.c_str(); } const utf8* network_get_server_provider_website() { - return gNetwork.ServerProviderWebsite.c_str(); + auto& network = OpenRCT2::GetContext()->GetNetwork(); + return network.ServerProviderWebsite.c_str(); } std::string network_get_version() @@ -3972,12 +4015,14 @@ std::string network_get_version() NetworkStats_t network_get_stats() { - return gNetwork.GetStats(); + auto& network = OpenRCT2::GetContext()->GetNetwork(); + return network.GetStats(); } NetworkServerState_t network_get_server_state() { - return gNetwork.GetServerState(); + auto& network = OpenRCT2::GetContext()->GetNetwork(); + return network.GetServerState(); } bool network_gamestate_snapshots_enabled() @@ -3987,7 +4032,8 @@ bool network_gamestate_snapshots_enabled() json_t network_get_server_info_as_json() { - return gNetwork.GetServerInfoAsJson(); + auto& network = OpenRCT2::GetContext()->GetNetwork(); + return network.GetServerInfoAsJson(); } #else int32_t network_get_mode() diff --git a/src/openrct2/network/NetworkBase.h b/src/openrct2/network/NetworkBase.h index 8981377d9e..7d98f6d1ab 100644 --- a/src/openrct2/network/NetworkBase.h +++ b/src/openrct2/network/NetworkBase.h @@ -12,10 +12,17 @@ #ifndef DISABLE_NETWORK +namespace OpenRCT2 +{ + struct IContext; +} + class NetworkBase { + OpenRCT2::IContext& _context; + public: - NetworkBase(); + NetworkBase(OpenRCT2::IContext& context); public: // Uncategorized bool BeginServer(uint16_t port, const std::string& address); From e440942c545cc0cf2652e661cd90dfe34ae59ac5 Mon Sep 17 00:00:00 2001 From: ZehMatt Date: Tue, 17 Aug 2021 06:25:47 +0300 Subject: [PATCH 02/51] Remove SetEnvironment from NetworkBase and all its other wrappers --- src/openrct2/Context.cpp | 1 - src/openrct2/network/NetworkBase.cpp | 19 ++++--------------- src/openrct2/network/NetworkBase.h | 2 -- src/openrct2/network/network.h | 6 ------ 4 files changed, 4 insertions(+), 24 deletions(-) diff --git a/src/openrct2/Context.cpp b/src/openrct2/Context.cpp index 620c364caa..184ae69bbf 100644 --- a/src/openrct2/Context.cpp +++ b/src/openrct2/Context.cpp @@ -477,7 +477,6 @@ namespace OpenRCT2 gGameSoundsOff = !gConfigSound.master_sound_enabled; } - network_set_env(_env); chat_init(); CopyOriginalUserFilesOver(); diff --git a/src/openrct2/network/NetworkBase.cpp b/src/openrct2/network/NetworkBase.cpp index f028427c9d..7422b9ebcb 100644 --- a/src/openrct2/network/NetworkBase.cpp +++ b/src/openrct2/network/NetworkBase.cpp @@ -147,11 +147,6 @@ NetworkBase::NetworkBase(OpenRCT2::IContext& context) _server_log_fs << std::unitbuf; } -void NetworkBase::SetEnvironment(const std::shared_ptr& env) -{ - _env = env; -} - bool NetworkBase::Init() { status = NETWORK_STATUS_READY; @@ -1101,7 +1096,8 @@ void NetworkBase::AppendLog(std::ostream& fs, const std::string& s) void NetworkBase::BeginChatLog() { - auto directory = _env->GetDirectoryPath(DIRBASE::USER, DIRID::LOG_CHAT); + auto env = _context.GetPlatformEnvironment(); + auto directory = env->GetDirectoryPath(DIRBASE::USER, DIRID::LOG_CHAT); _chatLogPath = BeginLog(directory, "", _chatLogFilenameFormat); # if defined(_WIN32) && !defined(__MINGW32__) @@ -1127,7 +1123,8 @@ void NetworkBase::CloseChatLog() void NetworkBase::BeginServerLog() { - auto directory = _env->GetDirectoryPath(DIRBASE::USER, DIRID::LOG_SERVER); + auto env = _context.GetPlatformEnvironment(); + auto directory = env->GetDirectoryPath(DIRBASE::USER, DIRID::LOG_SERVER); _serverLogPath = BeginLog(directory, ServerName, _serverLogFilenameFormat); # if defined(_WIN32) && !defined(__MINGW32__) @@ -3217,11 +3214,6 @@ void NetworkBase::Client_Handle_GAMEINFO([[maybe_unused]] NetworkConnection& con network_chat_show_server_greeting(); } -void network_set_env(const std::shared_ptr& env) -{ - OpenRCT2::GetContext()->GetNetwork().SetEnvironment(env); -} - void network_close() { OpenRCT2::GetContext()->GetNetwork().Close(); @@ -4237,9 +4229,6 @@ void network_close() void network_reconnect() { } -void network_set_env(const std::shared_ptr&) -{ -} void network_shutdown_client() { } diff --git a/src/openrct2/network/NetworkBase.h b/src/openrct2/network/NetworkBase.h index 7d98f6d1ab..2a67c203d9 100644 --- a/src/openrct2/network/NetworkBase.h +++ b/src/openrct2/network/NetworkBase.h @@ -29,7 +29,6 @@ public: // Uncategorized bool BeginClient(const std::string& host, uint16_t port); public: // Common - void SetEnvironment(const std::shared_ptr& env); bool Init(); void Close(); uint32_t GetServerTick(); @@ -180,7 +179,6 @@ public: // Public common private: // Common Data using CommandHandler = void (NetworkBase::*)(NetworkConnection& connection, NetworkPacket& packet); - std::shared_ptr _env; std::vector chunk_buffer; std::ofstream _chat_log_fs; uint32_t _lastUpdateTime = 0; diff --git a/src/openrct2/network/network.h b/src/openrct2/network/network.h index 2876339f21..716f7bb72a 100644 --- a/src/openrct2/network/network.h +++ b/src/openrct2/network/network.h @@ -35,12 +35,6 @@ enum class ModifyGroupType : uint8_t; enum class PermissionState : uint8_t; enum class NetworkPermission : uint32_t; -namespace OpenRCT2 -{ - struct IPlatformEnvironment; -} - -void network_set_env(const std::shared_ptr& env); void network_close(); void network_reconnect(); void network_shutdown_client(); From 95c2e817f71ec42438cbbd65435fd32fa54e7f82 Mon Sep 17 00:00:00 2001 From: ZehMatt Date: Tue, 17 Aug 2021 06:29:29 +0300 Subject: [PATCH 03/51] Directly call functions in NetworkBase from Context --- src/openrct2/Context.cpp | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/src/openrct2/Context.cpp b/src/openrct2/Context.cpp index 184ae69bbf..a0636e15d9 100644 --- a/src/openrct2/Context.cpp +++ b/src/openrct2/Context.cpp @@ -654,12 +654,12 @@ namespace OpenRCT2 bool sendMap = false; if (info.Type == FILE_TYPE::SAVED_GAME) { - if (network_get_mode() == NETWORK_MODE_CLIENT) + if (_network.GetMode() == NETWORK_MODE_CLIENT) { - network_close(); + _network.Close(); } game_load_init(); - if (network_get_mode() == NETWORK_MODE_SERVER) + if (_network.GetMode() == NETWORK_MODE_SERVER) { sendMap = true; } @@ -667,13 +667,13 @@ namespace OpenRCT2 else { scenario_begin(); - if (network_get_mode() == NETWORK_MODE_SERVER) + if (_network.GetMode() == NETWORK_MODE_SERVER) { sendMap = true; } - if (network_get_mode() == NETWORK_MODE_CLIENT) + if (_network.GetMode() == NETWORK_MODE_CLIENT) { - network_close(); + _network.Close(); } } // This ensures that the newly loaded save reflects the user's @@ -681,10 +681,10 @@ namespace OpenRCT2 peep_update_names(gConfigGeneral.show_real_names_of_guests); if (sendMap) { - network_send_map(); + _network.Server_Send_MAP(); } #ifdef USE_BREAKPAD - if (network_get_mode() == NETWORK_MODE_NONE) + if (_network.GetMode() == NETWORK_MODE_NONE) { start_silent_record(); } @@ -884,13 +884,13 @@ namespace OpenRCT2 if (String::IsNullOrEmpty(gCustomPassword)) { - network_set_password(gConfigNetwork.default_password.c_str()); + _network.SetPassword(gConfigNetwork.default_password.c_str()); } else { - network_set_password(gCustomPassword); + _network.SetPassword(gCustomPassword); } - network_begin_server(gNetworkStartPort, gNetworkStartAddress); + _network.BeginServer(gNetworkStartPort, gNetworkStartAddress); } else #endif // DISABLE_NETWORK @@ -920,7 +920,7 @@ namespace OpenRCT2 { gNetworkStartPort = gConfigNetwork.default_port; } - network_begin_client(gNetworkStartHost, gNetworkStartPort); + _network.BeginClient(gNetworkStartHost, gNetworkStartPort); } #endif // DISABLE_NETWORK From b8a81ae1c7eabecd30b9076a80be1356a9de733f Mon Sep 17 00:00:00 2001 From: ZehMatt Date: Tue, 17 Aug 2021 06:30:16 +0300 Subject: [PATCH 04/51] Remove unused declarations --- src/openrct2/network/network.h | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/openrct2/network/network.h b/src/openrct2/network/network.h index 716f7bb72a..8f521837e8 100644 --- a/src/openrct2/network/network.h +++ b/src/openrct2/network/network.h @@ -96,12 +96,10 @@ int32_t network_get_pickup_peep_old_x(uint8_t playerid); void network_send_map(); void network_send_chat(const char* text, const std::vector& playerIds = {}); void network_send_game_action(const GameAction* action); -void network_enqueue_game_action(const GameAction* action); void network_send_password(const std::string& password); void network_set_password(const char* password); -void network_print_error(); void network_append_chat_log(const utf8* text); void network_append_server_log(const utf8* text); const utf8* network_get_server_name(); From 096041392791a146f62245327a5566ddec7907aa Mon Sep 17 00:00:00 2001 From: ZehMatt Date: Tue, 17 Aug 2021 06:31:12 +0300 Subject: [PATCH 05/51] Remove unused function network_send_map --- src/openrct2/network/NetworkBase.cpp | 9 --------- src/openrct2/network/network.h | 1 - 2 files changed, 10 deletions(-) diff --git a/src/openrct2/network/NetworkBase.cpp b/src/openrct2/network/NetworkBase.cpp index 7422b9ebcb..78ef434d6a 100644 --- a/src/openrct2/network/NetworkBase.cpp +++ b/src/openrct2/network/NetworkBase.cpp @@ -3852,12 +3852,6 @@ int32_t network_get_current_player_group_index() return -1; } -void network_send_map() -{ - auto& network = OpenRCT2::GetContext()->GetNetwork(); - network.Server_Send_MAP(); -} - void network_send_chat(const char* text, const std::vector& playerIds) { auto& network = OpenRCT2::GetContext()->GetNetwork(); @@ -4068,9 +4062,6 @@ void network_request_gamestate_snapshot() void network_send_game_action(const GameAction* action) { } -void network_send_map() -{ -} void network_update() { } diff --git a/src/openrct2/network/network.h b/src/openrct2/network/network.h index 8f521837e8..8a166c5a24 100644 --- a/src/openrct2/network/network.h +++ b/src/openrct2/network/network.h @@ -93,7 +93,6 @@ Peep* network_get_pickup_peep(uint8_t playerid); void network_set_pickup_peep_old_x(uint8_t playerid, int32_t x); int32_t network_get_pickup_peep_old_x(uint8_t playerid); -void network_send_map(); void network_send_chat(const char* text, const std::vector& playerIds = {}); void network_send_game_action(const GameAction* action); void network_send_password(const std::string& password); From 4ece997ff31655e4d270c236b2732dd796381bb4 Mon Sep 17 00:00:00 2001 From: ZehMatt Date: Tue, 17 Aug 2021 06:33:50 +0300 Subject: [PATCH 06/51] Remove unused function network_close --- src/openrct2/network/NetworkBase.cpp | 8 -------- src/openrct2/network/network.h | 1 - src/openrct2/title/TitleScreen.cpp | 3 ++- 3 files changed, 2 insertions(+), 10 deletions(-) diff --git a/src/openrct2/network/NetworkBase.cpp b/src/openrct2/network/NetworkBase.cpp index 78ef434d6a..7b6af5e6af 100644 --- a/src/openrct2/network/NetworkBase.cpp +++ b/src/openrct2/network/NetworkBase.cpp @@ -3214,11 +3214,6 @@ void NetworkBase::Client_Handle_GAMEINFO([[maybe_unused]] NetworkConnection& con network_chat_show_server_greeting(); } -void network_close() -{ - OpenRCT2::GetContext()->GetNetwork().Close(); -} - void network_reconnect() { OpenRCT2::GetContext()->GetNetwork().Reconnect(); @@ -4214,9 +4209,6 @@ void network_send_chat(const char* text, const std::vector& playerIds) void network_send_password(const std::string& password) { } -void network_close() -{ -} void network_reconnect() { } diff --git a/src/openrct2/network/network.h b/src/openrct2/network/network.h index 8a166c5a24..ed06ba1b2f 100644 --- a/src/openrct2/network/network.h +++ b/src/openrct2/network/network.h @@ -35,7 +35,6 @@ enum class ModifyGroupType : uint8_t; enum class PermissionState : uint8_t; enum class NetworkPermission : uint32_t; -void network_close(); void network_reconnect(); void network_shutdown_client(); int32_t network_begin_client(const std::string& host, int32_t port); diff --git a/src/openrct2/title/TitleScreen.cpp b/src/openrct2/title/TitleScreen.cpp index f267ae4891..3fe9f9e2b1 100644 --- a/src/openrct2/title/TitleScreen.cpp +++ b/src/openrct2/title/TitleScreen.cpp @@ -23,6 +23,7 @@ #include "../interface/Viewport.h" #include "../interface/Window.h" #include "../localisation/Localisation.h" +#include "../network/NetworkBase.h" #include "../network/network.h" #include "../scenario/Scenario.h" #include "../scenario/ScenarioRepository.h" @@ -124,7 +125,7 @@ void TitleScreen::Load() gScreenAge = 0; gCurrentLoadedPath = ""; - network_close(); + GetContext()->GetNetwork().Close(); OpenRCT2::Audio::StopAll(); GetContext()->GetGameState()->InitAll(150); viewport_init_all(); From 1cfc933a59f37355ed8f5f614daf7e9429cb65b7 Mon Sep 17 00:00:00 2001 From: ZehMatt Date: Tue, 17 Aug 2021 06:57:29 +0300 Subject: [PATCH 07/51] Introduce a base class for system models --- src/openrct2/System.hpp | 60 ++++++++++++++++++++++++++++++++ src/openrct2/libopenrct2.vcxproj | 1 + 2 files changed, 61 insertions(+) create mode 100644 src/openrct2/System.hpp diff --git a/src/openrct2/System.hpp b/src/openrct2/System.hpp new file mode 100644 index 0000000000..2987df5538 --- /dev/null +++ b/src/openrct2/System.hpp @@ -0,0 +1,60 @@ +/***************************************************************************** + * Copyright (c) 2014-2021 OpenRCT2 developers + * + * For a complete list of all authors, please refer to contributors.md + * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 + * + * OpenRCT2 is licensed under the GNU General Public License version 3. + *****************************************************************************/ + +#pragma once + +namespace OpenRCT2 +{ + struct IContext; + + // Base class for systems that are hosted in the Context. + class System + { + IContext& _context; + + public: + System(IContext& owner) + : _context(owner) + { + } + + virtual ~System() = default; + + // Called before a tick. + virtual void PreTick() + { + } + + // Called every game tick, which by default is 40hz. + virtual void Tick() + { + } + + // Called after a tick. + virtual void PostTick() + { + } + + // Called every frame. + virtual void Update() + { + } + + IContext& GetContext() + { + return _context; + } + + const IContext& GetContext() const + { + return _context; + } + }; + +} // namespace OpenRCT2 diff --git a/src/openrct2/libopenrct2.vcxproj b/src/openrct2/libopenrct2.vcxproj index 7029514897..91c438e8fc 100644 --- a/src/openrct2/libopenrct2.vcxproj +++ b/src/openrct2/libopenrct2.vcxproj @@ -436,6 +436,7 @@ + From b3bb2f5d80765bf383fd60d5bd5b2c79fd0dcbba Mon Sep 17 00:00:00 2001 From: ZehMatt Date: Tue, 17 Aug 2021 06:59:23 +0300 Subject: [PATCH 08/51] Refactor NetworkBase to use the System base class --- src/openrct2/network/NetworkBase.cpp | 47 ++++++++++++++-------------- src/openrct2/network/NetworkBase.h | 10 +++--- 2 files changed, 28 insertions(+), 29 deletions(-) diff --git a/src/openrct2/network/NetworkBase.cpp b/src/openrct2/network/NetworkBase.cpp index 7b6af5e6af..855b50bec8 100644 --- a/src/openrct2/network/NetworkBase.cpp +++ b/src/openrct2/network/NetworkBase.cpp @@ -106,7 +106,7 @@ static void network_get_private_key_path(utf8* buffer, size_t bufferSize, const static void network_get_public_key_path(utf8* buffer, size_t bufferSize, const std::string& playerName, const utf8* hash); NetworkBase::NetworkBase(OpenRCT2::IContext& context) - : _context(context) + : OpenRCT2::System(context) { wsa_initialized = false; mode = NETWORK_MODE_NONE; @@ -555,7 +555,7 @@ void NetworkBase::UpdateClient() auto intent = Intent(WC_NETWORK_STATUS); intent.putExtra(INTENT_EXTRA_MESSAGE, std::string{ str_resolving }); - intent.putExtra(INTENT_EXTRA_CALLBACK, []() -> void { GetContext()->GetNetwork().Close(); }); + intent.putExtra(INTENT_EXTRA_CALLBACK, []() -> void { ::GetContext()->GetNetwork().Close(); }); context_open_intent(&intent); } break; @@ -570,7 +570,7 @@ void NetworkBase::UpdateClient() auto intent = Intent(WC_NETWORK_STATUS); intent.putExtra(INTENT_EXTRA_MESSAGE, std::string{ str_connecting }); - intent.putExtra(INTENT_EXTRA_CALLBACK, []() -> void { GetContext()->GetNetwork().Close(); }); + intent.putExtra(INTENT_EXTRA_CALLBACK, []() -> void { ::GetContext()->GetNetwork().Close(); }); context_open_intent(&intent); server_connect_time = platform_get_ticks(); @@ -587,7 +587,7 @@ void NetworkBase::UpdateClient() auto intent = Intent(WC_NETWORK_STATUS); intent.putExtra(INTENT_EXTRA_MESSAGE, std::string{ str_authenticating }); - intent.putExtra(INTENT_EXTRA_CALLBACK, []() -> void { GetContext()->GetNetwork().Close(); }); + intent.putExtra(INTENT_EXTRA_CALLBACK, []() -> void { ::GetContext()->GetNetwork().Close(); }); context_open_intent(&intent); break; } @@ -1096,7 +1096,7 @@ void NetworkBase::AppendLog(std::ostream& fs, const std::string& s) void NetworkBase::BeginChatLog() { - auto env = _context.GetPlatformEnvironment(); + auto env = GetContext().GetPlatformEnvironment(); auto directory = env->GetDirectoryPath(DIRBASE::USER, DIRID::LOG_CHAT); _chatLogPath = BeginLog(directory, "", _chatLogFilenameFormat); @@ -1123,7 +1123,7 @@ void NetworkBase::CloseChatLog() void NetworkBase::BeginServerLog() { - auto env = _context.GetPlatformEnvironment(); + auto env = GetContext().GetPlatformEnvironment(); auto directory = env->GetDirectoryPath(DIRBASE::USER, DIRID::LOG_SERVER); _serverLogPath = BeginLog(directory, ServerName, _serverLogFilenameFormat); @@ -1270,14 +1270,14 @@ void NetworkBase::Server_Send_OBJECTS_LIST( } } -void NetworkBase::Server_Send_SCRIPTS(NetworkConnection& connection) const +void NetworkBase::Server_Send_SCRIPTS(NetworkConnection& connection) { NetworkPacket packet(NetworkCommand::Scripts); # ifdef ENABLE_SCRIPTING using namespace OpenRCT2::Scripting; - auto& scriptEngine = GetContext()->GetScriptEngine(); + auto& scriptEngine = GetContext().GetScriptEngine(); const auto& plugins = scriptEngine.GetPlugins(); std::vector> pluginsToSend; for (const auto& plugin : plugins) @@ -1366,8 +1366,8 @@ void NetworkBase::Server_Send_MAP(NetworkConnection* connection) { // This will send all custom objects to connected clients // TODO: fix it so custom objects negotiation is performed even in this case. - auto context = GetContext(); - auto& objManager = context->GetObjectManager(); + auto& context = GetContext(); + auto& objManager = context.GetObjectManager(); objects = objManager.GetPackableObjects(); } @@ -2180,7 +2180,7 @@ void NetworkBase::Server_Handle_REQUEST_GAMESTATE(NetworkConnection& connection, return; } - IGameStateSnapshots* snapshots = GetContext()->GetGameStateSnapshots(); + IGameStateSnapshots* snapshots = GetContext().GetGameStateSnapshots(); const GameStateSnapshot_t* snapshot = snapshots->GetLinkedSnapshot(tick); if (snapshot) @@ -2275,8 +2275,8 @@ void NetworkBase::Server_Client_Joined(const char* name, const std::string& keyh format_string(text, 256, STR_MULTIPLAYER_PLAYER_HAS_JOINED_THE_GAME, &player_name); chat_history_add(text); - auto context = GetContext(); - auto& objManager = context->GetObjectManager(); + auto& context = GetContext(); + auto& objManager = context.GetObjectManager(); auto objects = objManager.GetPackableObjects(); Server_Send_OBJECTS_LIST(connection, objects); Server_Send_SCRIPTS(connection); @@ -2304,7 +2304,7 @@ void NetworkBase::Server_Handle_TOKEN(NetworkConnection& connection, [[maybe_unu void NetworkBase::Client_Handle_OBJECTS_LIST(NetworkConnection& connection, NetworkPacket& packet) { - auto& repo = GetContext()->GetObjectRepository(); + auto& repo = GetContext().GetObjectRepository(); uint32_t index = 0; uint32_t totalObjects = 0; @@ -2335,7 +2335,7 @@ void NetworkBase::Client_Handle_OBJECTS_LIST(NetworkConnection& connection, Netw auto intent = Intent(WC_NETWORK_STATUS); intent.putExtra(INTENT_EXTRA_MESSAGE, std::string{ objectListMsg }); - intent.putExtra(INTENT_EXTRA_CALLBACK, []() -> void { GetContext()->GetNetwork().Close(); }); + intent.putExtra(INTENT_EXTRA_CALLBACK, []() -> void { ::GetContext()->GetNetwork().Close(); }); context_open_intent(&intent); char objectName[12]{}; @@ -2375,7 +2375,7 @@ void NetworkBase::Client_Handle_SCRIPTS(NetworkConnection& connection, NetworkPa packet >> numScripts; # ifdef ENABLE_SCRIPTING - auto& scriptEngine = GetContext()->GetScriptEngine(); + auto& scriptEngine = GetContext().GetScriptEngine(); for (uint32_t i = 0; i < numScripts; i++) { uint32_t codeLength{}; @@ -2421,7 +2421,7 @@ void NetworkBase::Client_Handle_GAMESTATE(NetworkConnection& connection, Network _serverGameState.SetPosition(0); DataSerialiser ds(false, _serverGameState); - IGameStateSnapshots* snapshots = GetContext()->GetGameStateSnapshots(); + IGameStateSnapshots* snapshots = GetContext().GetGameStateSnapshots(); GameStateSnapshot_t& serverSnapshot = snapshots->CreateSnapshot(); snapshots->SerialiseSnapshot(serverSnapshot, ds); @@ -2431,8 +2431,7 @@ void NetworkBase::Client_Handle_GAMESTATE(NetworkConnection& connection, Network { GameStateCompareData_t cmpData = snapshots->Compare(serverSnapshot, *desyncSnapshot); - std::string outputPath = GetContext()->GetPlatformEnvironment()->GetDirectoryPath( - DIRBASE::USER, DIRID::LOG_DESYNCS); + std::string outputPath = GetContext().GetPlatformEnvironment()->GetDirectoryPath(DIRBASE::USER, DIRID::LOG_DESYNCS); platform_ensure_directory_exists(outputPath.c_str()); @@ -2480,7 +2479,7 @@ void NetworkBase::Server_Handle_MAPREQUEST(NetworkConnection& connection, Networ return; } log_verbose("Client requested %u objects", size); - auto& repo = GetContext()->GetObjectRepository(); + auto& repo = GetContext().GetObjectRepository(); for (uint32_t i = 0; i < size; i++) { const char* name = reinterpret_cast(packet.Read(8)); @@ -2661,7 +2660,7 @@ void NetworkBase::Client_Handle_MAP([[maybe_unused]] NetworkConnection& connecti auto intent = Intent(WC_NETWORK_STATUS); intent.putExtra(INTENT_EXTRA_MESSAGE, std::string{ str_downloading_map }); - intent.putExtra(INTENT_EXTRA_CALLBACK, []() -> void { GetContext()->GetNetwork().Close(); }); + intent.putExtra(INTENT_EXTRA_CALLBACK, []() -> void { ::GetContext()->GetNetwork().Close(); }); context_open_intent(&intent); std::memcpy(&chunk_buffer[offset], const_cast(static_cast(packet.Read(chunksize))), chunksize); @@ -2733,9 +2732,9 @@ bool NetworkBase::LoadMap(IStream* stream) bool result = false; try { - auto context = GetContext(); - auto& objManager = context->GetObjectManager(); - auto importer = ParkImporter::CreateS6(context->GetObjectRepository()); + auto& context = GetContext(); + auto& objManager = context.GetObjectManager(); + auto importer = ParkImporter::CreateS6(context.GetObjectRepository()); auto loadResult = importer->LoadFromStream(stream, false); objManager.LoadObjects(loadResult.RequiredObjects.data(), loadResult.RequiredObjects.size()); importer->Import(); diff --git a/src/openrct2/network/NetworkBase.h b/src/openrct2/network/NetworkBase.h index 2a67c203d9..73f31cf726 100644 --- a/src/openrct2/network/NetworkBase.h +++ b/src/openrct2/network/NetworkBase.h @@ -1,5 +1,6 @@ #pragma once +#include "../System.hpp" #include "../actions/GameAction.h" #include "NetworkConnection.h" #include "NetworkGroup.h" @@ -17,10 +18,8 @@ namespace OpenRCT2 struct IContext; } -class NetworkBase +class NetworkBase : public OpenRCT2::System { - OpenRCT2::IContext& _context; - public: NetworkBase(OpenRCT2::IContext& context); @@ -32,7 +31,8 @@ public: // Common bool Init(); void Close(); uint32_t GetServerTick(); - void Update(); + // FIXME: This is currently the wrong function to override in System, will be refactored later. + void Update() override final; void Flush(); void ProcessPending(); void ProcessPlayerList(); @@ -96,7 +96,7 @@ public: // Server void Server_Send_EVENT_PLAYER_JOINED(const char* playerName); void Server_Send_EVENT_PLAYER_DISCONNECTED(const char* playerName, const char* reason); void Server_Send_OBJECTS_LIST(NetworkConnection& connection, const std::vector& objects) const; - void Server_Send_SCRIPTS(NetworkConnection& connection) const; + void Server_Send_SCRIPTS(NetworkConnection& connection); // Handlers void Server_Handle_REQUEST_GAMESTATE(NetworkConnection& connection, NetworkPacket& packet); From 72a63735206b36c50d08bd1e10fbba445253445e Mon Sep 17 00:00:00 2001 From: ZehMatt Date: Tue, 17 Aug 2021 10:36:18 +0300 Subject: [PATCH 09/51] Guard code with DISABLE_NETWORK --- src/openrct2/Context.cpp | 13 +++++++++++++ src/openrct2/title/TitleScreen.cpp | 2 ++ 2 files changed, 15 insertions(+) diff --git a/src/openrct2/Context.cpp b/src/openrct2/Context.cpp index a0636e15d9..1a11ca47d5 100644 --- a/src/openrct2/Context.cpp +++ b/src/openrct2/Context.cpp @@ -171,7 +171,9 @@ namespace OpenRCT2 // If objects use GetContext() in their destructor things won't go well. GameActions::ClearQueue(); +#ifndef DISABLE_NETWORK _network.Close(); +#endif window_close_all(); // Unload objects after closing all windows, this is to overcome windows like @@ -651,22 +653,29 @@ namespace OpenRCT2 gScreenAge = 0; gLastAutoSaveUpdate = AUTOSAVE_PAUSE; +#ifndef DISABLE_NETWORK bool sendMap = false; +#endif if (info.Type == FILE_TYPE::SAVED_GAME) { +#ifndef DISABLE_NETWORK if (_network.GetMode() == NETWORK_MODE_CLIENT) { _network.Close(); } +#endif game_load_init(); +#ifndef DISABLE_NETWORK if (_network.GetMode() == NETWORK_MODE_SERVER) { sendMap = true; } +#endif } else { scenario_begin(); +#ifndef DISABLE_NETWORK if (_network.GetMode() == NETWORK_MODE_SERVER) { sendMap = true; @@ -675,14 +684,18 @@ namespace OpenRCT2 { _network.Close(); } +#endif } // This ensures that the newly loaded save reflects the user's // 'show real names of guests' option, now that it's a global setting peep_update_names(gConfigGeneral.show_real_names_of_guests); +#ifndef DISABLE_NETWORK if (sendMap) { _network.Server_Send_MAP(); } +#endif + #ifdef USE_BREAKPAD if (_network.GetMode() == NETWORK_MODE_NONE) { diff --git a/src/openrct2/title/TitleScreen.cpp b/src/openrct2/title/TitleScreen.cpp index 3fe9f9e2b1..02e134ef8f 100644 --- a/src/openrct2/title/TitleScreen.cpp +++ b/src/openrct2/title/TitleScreen.cpp @@ -125,7 +125,9 @@ void TitleScreen::Load() gScreenAge = 0; gCurrentLoadedPath = ""; +#ifndef DISABLE_NETWORK GetContext()->GetNetwork().Close(); +#endif OpenRCT2::Audio::StopAll(); GetContext()->GetGameState()->InitAll(150); viewport_init_all(); From 5c261b6d2ed7acc6f2dad7f6d3a18315161d9938 Mon Sep 17 00:00:00 2001 From: frutiemax Date: Sun, 22 Aug 2021 09:06:58 -0400 Subject: [PATCH 10/51] Part of #13874: TrackElementDescriptor loader --- src/openrct2/Context.cpp | 2 ++ src/openrct2/ride/TrackData.cpp | 39 +++++++++++++++++++++++++++++++++ src/openrct2/ride/TrackData.h | 26 ++++++++++++++++++++++ 3 files changed, 67 insertions(+) diff --git a/src/openrct2/Context.cpp b/src/openrct2/Context.cpp index d0f739970e..2017b60962 100644 --- a/src/openrct2/Context.cpp +++ b/src/openrct2/Context.cpp @@ -53,6 +53,7 @@ #include "platform/Crash.h" #include "platform/Platform2.h" #include "platform/platform.h" +#include "ride/TrackData.h" #include "ride/TrackDesignRepository.h" #include "scenario/Scenario.h" #include "scenario/ScenarioRepository.h" @@ -395,6 +396,7 @@ namespace OpenRCT2 } _env->SetBasePath(DIRBASE::RCT2, rct2InstallPath); } + TrackMetaData::Init(); _objectRepository = CreateObjectRepository(_env); _objectManager = CreateObjectManager(*_objectRepository); diff --git a/src/openrct2/ride/TrackData.cpp b/src/openrct2/ride/TrackData.cpp index 57e88855ca..560258ba2c 100644 --- a/src/openrct2/ride/TrackData.cpp +++ b/src/openrct2/ride/TrackData.cpp @@ -12,6 +12,7 @@ #include "Track.h" #include "TrackPaint.h" +#include #include // clang-format off @@ -5127,3 +5128,41 @@ const uint16_t TrackFlags[TrackElemType::Count] = { /* TrackElemType::FlatTrack3x3 */ 0, }; // clang-format on + +namespace OpenRCT2 +{ + namespace TrackMetaData + { + static std::vector _trackElementDescriptors; + void Init() + { + _trackElementDescriptors.clear(); + _trackElementDescriptors.reserve(TrackElemType::Count); + + TrackElementDescriptor desc; + for (int i = 0; i < TrackElemType::Count; i++) + { + desc.AlternativeType = AlternativeTrackTypes[i]; + desc.Block = const_cast(TrackBlocks[i]); + desc.Coordinates = TrackCoordinates[i]; + desc.CurveChain = gTrackCurveChain[i]; + desc.Flags = TrackFlags[i]; + desc.HeightMarkerPositions = TrackHeightMarkerPositions[i]; + desc.MirrorMap = TrackElementMirrorMap[i]; + desc.PieceLength = TrackPieceLengths[i]; + desc.Pricing = TrackPricing[i]; + + for (uint8_t j = 0; j < MaxSequencesPerPiece; j++) + { + desc.SequenceElementAllowedWallEdges[j] = TrackSequenceElementAllowedWallEdges[i][j]; + desc.TrackSequenceProperties[j] = TrackSequenceProperties[i][j]; + } + _trackElementDescriptors.push_back(desc); + } + } + const TrackElementDescriptor& GetTrackElementDescriptor(const uint32_t& type) + { + return _trackElementDescriptors[type]; + } + } // namespace TrackMetaData +} // namespace OpenRCT2 diff --git a/src/openrct2/ride/TrackData.h b/src/openrct2/ride/TrackData.h index ba1dee8ee6..ff61c6efca 100644 --- a/src/openrct2/ride/TrackData.h +++ b/src/openrct2/ride/TrackData.h @@ -74,3 +74,29 @@ extern const uint32_t TrackHeightMarkerPositions[TrackElemType::Count]; extern const uint8_t TrackSequenceElementAllowedWallEdges[TrackElemType::Count][16]; extern const uint16_t TrackFlags[TrackElemType::Count]; + +struct TrackElementDescriptor +{ + rct_track_coordinates Coordinates; + + rct_preview_track* Block; + uint8_t PieceLength; + track_curve_chain CurveChain; + track_type_t AlternativeType; + money32 Pricing; + track_type_t MirrorMap; + uint32_t HeightMarkerPositions; + uint16_t Flags; + + std::array SequenceElementAllowedWallEdges; + std::array TrackSequenceProperties; +}; + +namespace OpenRCT2 +{ + namespace TrackMetaData + { + void Init(); + const TrackElementDescriptor& GetTrackElementDescriptor(const uint32_t& type); + } // namespace TrackMetaData +} // namespace OpenRCT2 From 80418efafbe34cbf92f2d0db6e86d481f7ccff38 Mon Sep 17 00:00:00 2001 From: frutiemax Date: Sun, 22 Aug 2021 09:42:27 -0400 Subject: [PATCH 11/51] Part of #13874: Replace TrackCoordinates --- src/openrct2-ui/windows/TrackDesignPlace.cpp | 4 +++- src/openrct2/actions/WallPlaceAction.cpp | 13 ++++++++----- src/openrct2/ride/Ride.cpp | 16 +++++++++++----- src/openrct2/ride/TrackData.cpp | 2 +- src/openrct2/ride/TrackData.h | 1 - src/openrct2/ride/TrackDesign.cpp | 13 ++++++++----- src/openrct2/ride/Vehicle.cpp | 7 +++++-- src/openrct2/windows/_legacy.cpp | 7 +++++-- 8 files changed, 41 insertions(+), 22 deletions(-) diff --git a/src/openrct2-ui/windows/TrackDesignPlace.cpp b/src/openrct2-ui/windows/TrackDesignPlace.cpp index 4a3db512f6..2e2b25bbf9 100644 --- a/src/openrct2-ui/windows/TrackDesignPlace.cpp +++ b/src/openrct2-ui/windows/TrackDesignPlace.cpp @@ -594,7 +594,9 @@ static void window_track_place_draw_mini_preview_track( // Change rotation and next position based on track curvature curTrackRotation &= 3; - const rct_track_coordinates* track_coordinate = &TrackCoordinates[trackType]; + using namespace OpenRCT2::TrackMetaData; + const auto& teDescriptor = GetTrackElementDescriptor(trackType); + const rct_track_coordinates* track_coordinate = &teDescriptor.Coordinates; curTrackStart += CoordsXY{ track_coordinate->x, track_coordinate->y }.Rotate(curTrackRotation); curTrackRotation += track_coordinate->rotation_end - track_coordinate->rotation_begin; diff --git a/src/openrct2/actions/WallPlaceAction.cpp b/src/openrct2/actions/WallPlaceAction.cpp index 466f90c252..9c948c9439 100644 --- a/src/openrct2/actions/WallPlaceAction.cpp +++ b/src/openrct2/actions/WallPlaceAction.cpp @@ -405,6 +405,9 @@ bool WallPlaceAction::WallCheckObstructionWithTrack( WallSceneryEntry* wall, int32_t z0, TrackElement* trackElement, bool* wallAcrossTrack) const { track_type_t trackType = trackElement->GetTrackType(); + + using namespace OpenRCT2::TrackMetaData; + const auto& teDescriptor = GetTrackElementDescriptor(trackType); int32_t sequence = trackElement->GetSequenceIndex(); int32_t direction = (_edge - trackElement->GetDirection()) & TILE_ELEMENT_DIRECTION_MASK; auto ride = get_ride(trackElement->GetRideIndex()); @@ -444,13 +447,13 @@ bool WallPlaceAction::WallCheckObstructionWithTrack( if (TrackDefinitions[trackType].bank_start == 0) { - if (!(TrackCoordinates[trackType].rotation_begin & 4)) + if (!(teDescriptor.Coordinates.rotation_begin & 4)) { direction = direction_reverse(trackElement->GetDirection()); if (direction == _edge) { const rct_preview_track* trackBlock = &TrackBlocks[trackType][sequence]; - z = TrackCoordinates[trackType].z_begin; + z = teDescriptor.Coordinates.z_begin; z = trackElement->base_height + ((z - trackBlock->z) * 8); if (z == z0) { @@ -472,20 +475,20 @@ bool WallPlaceAction::WallCheckObstructionWithTrack( return false; } - direction = TrackCoordinates[trackType].rotation_end; + direction = teDescriptor.Coordinates.rotation_end; if (direction & 4) { return false; } - direction = (trackElement->GetDirection() + TrackCoordinates[trackType].rotation_end) & TILE_ELEMENT_DIRECTION_MASK; + direction = (trackElement->GetDirection() + teDescriptor.Coordinates.rotation_end) & TILE_ELEMENT_DIRECTION_MASK; if (direction != _edge) { return false; } trackBlock = &TrackBlocks[trackType][sequence]; - z = TrackCoordinates[trackType].z_end; + z = teDescriptor.Coordinates.z_end; z = trackElement->base_height + ((z - trackBlock->z) * 8); return z == z0; } diff --git a/src/openrct2/ride/Ride.cpp b/src/openrct2/ride/Ride.cpp index 0cc906322d..b6b7ba338a 100644 --- a/src/openrct2/ride/Ride.cpp +++ b/src/openrct2/ride/Ride.cpp @@ -73,6 +73,7 @@ #include using namespace OpenRCT2; +using namespace OpenRCT2::TrackMetaData; RideMode& operator++(RideMode& d, int) { @@ -478,11 +479,12 @@ bool track_block_get_next_from_zero( if (tileElement->IsGhost() != isGhost) continue; + const auto& teDescriptor = GetTrackElementDescriptor(trackElement->GetTrackType()); auto nextTrackBlock = TrackBlocks[trackElement->GetTrackType()]; if (nextTrackBlock == nullptr) continue; - auto nextTrackCoordinate = TrackCoordinates[trackElement->GetTrackType()]; + auto nextTrackCoordinate = teDescriptor.Coordinates; uint8_t nextRotation = tileElement->GetDirectionWithOffset(nextTrackCoordinate.rotation_begin) | (nextTrackCoordinate.rotation_begin & TRACK_BLOCK_2); @@ -519,6 +521,7 @@ bool track_block_get_next(CoordsXYE* input, CoordsXYE* output, int32_t* z, int32 return false; auto inputElement = input->element->AsTrack(); + const auto& teDescriptor = GetTrackElementDescriptor(inputElement->GetTrackType()); if (inputElement == nullptr) return false; @@ -533,7 +536,7 @@ bool track_block_get_next(CoordsXYE* input, CoordsXYE* output, int32_t* z, int32 trackBlock += inputElement->GetSequenceIndex(); - auto trackCoordinate = TrackCoordinates[inputElement->GetTrackType()]; + auto trackCoordinate = teDescriptor.Coordinates; int32_t x = input->x; int32_t y = input->y; @@ -599,7 +602,8 @@ bool track_block_get_previous_from_zero( if (nextTrackBlock == nullptr) continue; - auto nextTrackCoordinate = TrackCoordinates[trackElement->GetTrackType()]; + const auto& teDesc = GetTrackElementDescriptor(trackElement->GetTrackType()); + auto nextTrackCoordinate = teDesc.Coordinates; nextTrackBlock += trackElement->GetSequenceIndex(); if ((nextTrackBlock + 1)->index != 255) @@ -663,6 +667,7 @@ bool track_block_get_previous(const CoordsXYE& trackPos, track_begin_end* outTra return false; auto trackElement = trackPos.element->AsTrack(); + const auto& teDescriptor = GetTrackElementDescriptor(trackElement->GetTrackType()); if (trackElement == nullptr) return false; @@ -677,7 +682,7 @@ bool track_block_get_previous(const CoordsXYE& trackPos, track_begin_end* outTra trackBlock += trackElement->GetSequenceIndex(); - auto trackCoordinate = TrackCoordinates[trackElement->GetTrackType()]; + auto trackCoordinate = teDescriptor.Coordinates; int32_t z = trackElement->GetBaseZ(); @@ -2857,7 +2862,8 @@ static void ride_set_boat_hire_return_point(Ride* ride, CoordsXYE* startElement) }; trackType = returnPos.element->AsTrack()->GetTrackType(); - int32_t elementReturnDirection = TrackCoordinates[trackType].rotation_begin; + const auto& teDescriptor = GetTrackElementDescriptor(trackType); + int32_t elementReturnDirection = teDescriptor.Coordinates.rotation_begin; ride->boat_hire_return_direction = returnPos.element->GetDirectionWithOffset(elementReturnDirection); ride->boat_hire_return_position = TileCoordsXY{ returnPos }; } diff --git a/src/openrct2/ride/TrackData.cpp b/src/openrct2/ride/TrackData.cpp index 560258ba2c..ccb5301b03 100644 --- a/src/openrct2/ride/TrackData.cpp +++ b/src/openrct2/ride/TrackData.cpp @@ -16,7 +16,7 @@ #include // clang-format off -const rct_track_coordinates TrackCoordinates[TrackElemType::Count] = { +const static rct_track_coordinates TrackCoordinates[TrackElemType::Count] = { { 0, 0, 0, 0, 0, 0 }, // ELEM_FLAT { 0, 0, 0, 0, 0, 0 }, // ELEM_END_STATION { 0, 0, 0, 0, 0, 0 }, // ELEM_BEGIN_STATION diff --git a/src/openrct2/ride/TrackData.h b/src/openrct2/ride/TrackData.h index ff61c6efca..dcdaaa1c55 100644 --- a/src/openrct2/ride/TrackData.h +++ b/src/openrct2/ride/TrackData.h @@ -16,7 +16,6 @@ constexpr const uint8_t MaxSequencesPerPiece = 16; // 0x009968BB, 0x009968BC, 0x009968BD, 0x009968BF, 0x009968C1, 0x009968C3 -extern const rct_track_coordinates TrackCoordinates[TrackElemType::Count]; extern const uint8_t TrackSequenceProperties[TrackElemType::Count][MaxSequencesPerPiece]; diff --git a/src/openrct2/ride/TrackDesign.cpp b/src/openrct2/ride/TrackDesign.cpp index 63e9dfc8d2..ef996c45ea 100644 --- a/src/openrct2/ride/TrackDesign.cpp +++ b/src/openrct2/ride/TrackDesign.cpp @@ -65,6 +65,7 @@ using namespace OpenRCT2; using namespace OpenRCT2::Drawing; +using namespace OpenRCT2::TrackMetaData; bool gTrackDesignSceneryToggle; static CoordsXYZ _trackPreviewMin; @@ -182,7 +183,8 @@ rct_string_id TrackDesign::CreateTrackDesignTrack(const Ride& ride) trackElement.y = newCoords->y; z = newCoords->z; - const rct_track_coordinates* trackCoordinates = &TrackCoordinates[trackElement.element->AsTrack()->GetTrackType()]; + const auto& teDescriptor = GetTrackElementDescriptor(trackElement.element->AsTrack()->GetTrackType()); + const rct_track_coordinates* trackCoordinates = &teDescriptor.Coordinates; auto trackBlock = TrackBlocks[trackType]; // Used in the following loop to know when we have // completed all of the elements and are back at the @@ -1519,6 +1521,7 @@ static std::optional track_design_place_ride(TrackDesign* td6, const Co for (const auto& track : td6->track_elements) { auto trackType = track.type; + const auto& teDescriptor = GetTrackElementDescriptor(trackType); track_design_update_max_min_coordinates(newCoords); @@ -1534,7 +1537,7 @@ static std::optional track_design_place_ride(TrackDesign* td6, const Co break; case PTD_OPERATION_REMOVE_GHOST: { - const rct_track_coordinates* trackCoordinates = &TrackCoordinates[trackType]; + const rct_track_coordinates* trackCoordinates = &teDescriptor.Coordinates; const rct_preview_track* trackBlock = TrackBlocks[trackType]; int32_t tempZ = newCoords.z - trackCoordinates->z_begin + trackBlock->z; auto trackRemoveAction = TrackRemoveAction( @@ -1549,7 +1552,7 @@ static std::optional track_design_place_ride(TrackDesign* td6, const Co case PTD_OPERATION_PLACE_GHOST: case PTD_OPERATION_PLACE_TRACK_PREVIEW: { - const rct_track_coordinates* trackCoordinates = &TrackCoordinates[trackType]; + const rct_track_coordinates* trackCoordinates = &teDescriptor.Coordinates; // di int16_t tempZ = newCoords.z - trackCoordinates->z_begin; @@ -1606,7 +1609,7 @@ static std::optional track_design_place_ride(TrackDesign* td6, const Co } case PTD_OPERATION_GET_PLACE_Z: { - int32_t tempZ = newCoords.z - TrackCoordinates[trackType].z_begin; + int32_t tempZ = newCoords.z - teDescriptor.Coordinates.z_begin; for (const rct_preview_track* trackBlock = TrackBlocks[trackType]; trackBlock->index != 0xFF; trackBlock++) { auto tile = CoordsXY{ newCoords } + CoordsXY{ trackBlock->x, trackBlock->y }.Rotate(rotation); @@ -1646,7 +1649,7 @@ static std::optional track_design_place_ride(TrackDesign* td6, const Co } } - const rct_track_coordinates* track_coordinates = &TrackCoordinates[trackType]; + const rct_track_coordinates* track_coordinates = &teDescriptor.Coordinates; auto offsetAndRotatedTrack = CoordsXY{ newCoords } + CoordsXY{ track_coordinates->x, track_coordinates->y }.Rotate(rotation); diff --git a/src/openrct2/ride/Vehicle.cpp b/src/openrct2/ride/Vehicle.cpp index 50f1c0c22d..7b25234d35 100644 --- a/src/openrct2/ride/Vehicle.cpp +++ b/src/openrct2/ride/Vehicle.cpp @@ -50,6 +50,7 @@ #include #include +using namespace OpenRCT2::TrackMetaData; static bool vehicle_boat_is_location_accessible(const CoordsXYZ& location); constexpr int16_t VEHICLE_MAX_SPIN_SPEED = 1536; @@ -7493,12 +7494,13 @@ static void AnimateSceneryDoor(const CoordsXYZD& doorLocation, const CoordsXYZ& void Vehicle::UpdateSceneryDoor() const { auto trackType = GetTrackType(); + const auto& teDescriptor = GetTrackElementDescriptor(trackType); const rct_preview_track* trackBlock = TrackBlocks[trackType]; while ((trackBlock + 1)->index != 255) { trackBlock++; } - const rct_track_coordinates* trackCoordinates = &TrackCoordinates[trackType]; + const rct_track_coordinates* trackCoordinates = &teDescriptor.Coordinates; auto wallCoords = CoordsXYZ{ x, y, TrackLocation.z - trackBlock->z + trackCoordinates->z_end }.ToTileStart(); int32_t direction = (GetTrackDirection() + trackCoordinates->rotation_end) & 3; @@ -7590,8 +7592,9 @@ static void trigger_on_ride_photo(const CoordsXYZ& loc, TileElement* tileElement void Vehicle::UpdateSceneryDoorBackwards() const { auto trackType = GetTrackType(); + const auto& teDescriptor = GetTrackElementDescriptor(trackType); const rct_preview_track* trackBlock = TrackBlocks[trackType]; - const rct_track_coordinates* trackCoordinates = &TrackCoordinates[trackType]; + const rct_track_coordinates* trackCoordinates = &teDescriptor.Coordinates; auto wallCoords = CoordsXYZ{ TrackLocation, TrackLocation.z - trackBlock->z + trackCoordinates->z_begin }; int32_t direction = (GetTrackDirection() + trackCoordinates->rotation_begin) & 3; direction = direction_reverse(direction); diff --git a/src/openrct2/windows/_legacy.cpp b/src/openrct2/windows/_legacy.cpp index bfbcb7da71..9c3691c30a 100644 --- a/src/openrct2/windows/_legacy.cpp +++ b/src/openrct2/windows/_legacy.cpp @@ -27,6 +27,7 @@ #include #include +using namespace OpenRCT2::TrackMetaData; bool gDisableErrorWindowSound = false; uint64_t _enabledRidePieces; @@ -90,7 +91,8 @@ money32 place_provisional_track_piece( return result; int16_t z_begin, z_end; - const rct_track_coordinates& coords = TrackCoordinates[trackType]; + const auto& teDescriptor = GetTrackElementDescriptor(trackType); + const rct_track_coordinates& coords = teDescriptor.Coordinates; if (!ride->GetRideTypeDescriptor().HasFlag(RIDE_TYPE_FLAG_HAS_NO_TRACK)) { z_begin = coords.z_begin; @@ -312,7 +314,8 @@ bool window_ride_construction_update_state( } } - const rct_track_coordinates& trackCoordinates = TrackCoordinates[trackType]; + const auto& teDescriptor = GetTrackElementDescriptor(trackType); + const rct_track_coordinates& trackCoordinates = teDescriptor.Coordinates; x = _currentTrackBegin.x; y = _currentTrackBegin.y; From 5a8cc7c610eb15086ea9530b24b9d6069d0227c2 Mon Sep 17 00:00:00 2001 From: frutiemax Date: Sun, 22 Aug 2021 09:44:36 -0400 Subject: [PATCH 12/51] Part of #13874: Replace alternativeTypes --- src/openrct2/ride/TrackData.cpp | 2 +- src/openrct2/ride/TrackData.h | 2 -- src/openrct2/windows/_legacy.cpp | 3 ++- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/src/openrct2/ride/TrackData.cpp b/src/openrct2/ride/TrackData.cpp index ccb5301b03..7b867db264 100644 --- a/src/openrct2/ride/TrackData.cpp +++ b/src/openrct2/ride/TrackData.cpp @@ -3503,7 +3503,7 @@ const track_descriptor gTrackDescriptors[142] = { }; /** rct2: 0x00993D1C */ -const track_type_t AlternativeTrackTypes[TrackElemType::Count] = { +const static track_type_t AlternativeTrackTypes[TrackElemType::Count] = { TrackElemType::FlatCovered, // TrackElemType::Flat TrackElemType::None, TrackElemType::None, diff --git a/src/openrct2/ride/TrackData.h b/src/openrct2/ride/TrackData.h index dcdaaa1c55..f7ef28b4af 100644 --- a/src/openrct2/ride/TrackData.h +++ b/src/openrct2/ride/TrackData.h @@ -44,8 +44,6 @@ struct track_descriptor extern const track_descriptor gTrackDescriptors[142]; -extern const track_type_t AlternativeTrackTypes[TrackElemType::Count]; - extern const money32 TrackPricing[TrackElemType::Count]; struct dodgems_track_size diff --git a/src/openrct2/windows/_legacy.cpp b/src/openrct2/windows/_legacy.cpp index 9c3691c30a..15ff0447f5 100644 --- a/src/openrct2/windows/_legacy.cpp +++ b/src/openrct2/windows/_legacy.cpp @@ -306,7 +306,8 @@ bool window_ride_construction_update_state( && _currentTrackAlternative & RIDE_TYPE_ALTERNATIVE_TRACK_PIECES) { auto availablePieces = rtd.CoveredTrackPieces; - auto alternativeType = AlternativeTrackTypes[trackType]; + const auto& teDescriptor = GetTrackElementDescriptor(trackType); + auto alternativeType = teDescriptor.AlternativeType; if (alternativeType != TrackElemType::None && (availablePieces & (1ULL << trackType))) { trackType = alternativeType; From 675777efaf8bdfa3c38d95ea436508a041e029b6 Mon Sep 17 00:00:00 2001 From: frutiemax Date: Sun, 22 Aug 2021 09:50:44 -0400 Subject: [PATCH 13/51] Part of #13874: replace curvechain --- src/openrct2/ride/RideConstruction.cpp | 9 +++++++-- src/openrct2/ride/TrackData.cpp | 2 +- src/openrct2/ride/TrackData.h | 2 -- 3 files changed, 8 insertions(+), 5 deletions(-) diff --git a/src/openrct2/ride/RideConstruction.cpp b/src/openrct2/ride/RideConstruction.cpp index 8abc33ef60..de236b4520 100644 --- a/src/openrct2/ride/RideConstruction.cpp +++ b/src/openrct2/ride/RideConstruction.cpp @@ -87,6 +87,7 @@ RideConstructionState gRideEntranceExitPlacePreviousRideConstructionState; Direction gRideEntranceExitPlaceDirection; using namespace OpenRCT2; +using namespace OpenRCT2::TrackMetaData; static int32_t ride_check_if_construction_allowed(Ride* ride) { @@ -626,6 +627,8 @@ void ride_construction_set_default_next_piece() CoordsXYE xyElement; TileElement* tileElement; _currentTrackPrice = MONEY32_UNDEFINED; + + TrackElementDescriptor teDescriptor; switch (_rideConstructionState) { case RideConstructionState::Front: @@ -654,7 +657,8 @@ void ride_construction_set_default_next_piece() } } - curve = gTrackCurveChain[trackType].next; + teDescriptor = GetTrackElementDescriptor(trackType); + curve = teDescriptor.CurveChain.next; bank = TrackDefinitions[trackType].bank_end; slope = TrackDefinitions[trackType].vangle_end; @@ -699,7 +703,8 @@ void ride_construction_set_default_next_piece() } } - curve = gTrackCurveChain[trackType].previous; + teDescriptor = GetTrackElementDescriptor(trackType); + curve = teDescriptor.CurveChain.previous; bank = TrackDefinitions[trackType].bank_start; slope = TrackDefinitions[trackType].vangle_start; diff --git a/src/openrct2/ride/TrackData.cpp b/src/openrct2/ride/TrackData.cpp index 7b867db264..ce4d221e2d 100644 --- a/src/openrct2/ride/TrackData.cpp +++ b/src/openrct2/ride/TrackData.cpp @@ -3087,7 +3087,7 @@ const uint8_t TrackPieceLengths[TrackElemType::Count] = { }; // rct2: 0x00998C95 -const track_curve_chain gTrackCurveChain[TrackElemType::Count] = { +const static track_curve_chain gTrackCurveChain[TrackElemType::Count] = { { TRACK_CURVE_NONE, TRACK_CURVE_NONE }, { RideConstructionSpecialPieceSelected | TrackElemType::EndStation, RideConstructionSpecialPieceSelected | TrackElemType::EndStation }, { RideConstructionSpecialPieceSelected | TrackElemType::EndStation, RideConstructionSpecialPieceSelected | TrackElemType::EndStation }, diff --git a/src/openrct2/ride/TrackData.h b/src/openrct2/ride/TrackData.h index f7ef28b4af..4f819deeb3 100644 --- a/src/openrct2/ride/TrackData.h +++ b/src/openrct2/ride/TrackData.h @@ -29,8 +29,6 @@ struct track_curve_chain int32_t previous; }; -extern const track_curve_chain gTrackCurveChain[TrackElemType::Count]; - struct track_descriptor { bool starts_diagonal; From 1bfa26e4c5ba2a4150a1d88fb7502c840a4fd0cf Mon Sep 17 00:00:00 2001 From: frutiemax Date: Sun, 22 Aug 2021 09:59:09 -0400 Subject: [PATCH 14/51] Part of #13874: replace flags table --- src/openrct2/actions/TrackPlaceAction.cpp | 12 ++++++++---- src/openrct2/ride/Ride.cpp | 6 ++++-- src/openrct2/ride/TrackData.cpp | 2 +- src/openrct2/ride/TrackData.h | 2 -- src/openrct2/ride/Vehicle.cpp | 6 ++++-- src/openrct2/windows/_legacy.cpp | 4 ++-- 6 files changed, 19 insertions(+), 13 deletions(-) diff --git a/src/openrct2/actions/TrackPlaceAction.cpp b/src/openrct2/actions/TrackPlaceAction.cpp index ec4ce6cb29..b961f6ffda 100644 --- a/src/openrct2/actions/TrackPlaceAction.cpp +++ b/src/openrct2/actions/TrackPlaceAction.cpp @@ -19,6 +19,7 @@ #include "../world/Surface.h" #include "RideSetSettingAction.h" +using namespace OpenRCT2::TrackMetaData; TrackPlaceActionResult::TrackPlaceActionResult() : GameActions::Result(GameActions::Status::Ok, STR_RIDE_CONSTRUCTION_CANT_CONSTRUCT_THIS_HERE) { @@ -146,7 +147,8 @@ GameActions::Result::Ptr TrackPlaceAction::Query() const if ((_trackPlaceFlags & CONSTRUCTION_LIFT_HILL_SELECTED) && !ride->GetRideTypeDescriptor().SupportsTrackPiece(TRACK_LIFT_HILL_STEEP) && !gCheatsEnableChainLiftOnAllTrack) { - if (TrackFlags[_trackType] & TRACK_ELEM_FLAG_IS_STEEP_UP) + const auto& teDescriptor = GetTrackElementDescriptor(_trackType); + if (teDescriptor.Flags & TRACK_ELEM_FLAG_IS_STEEP_UP) { return std::make_unique(GameActions::Status::Disallowed, STR_TOO_STEEP_FOR_LIFT_HILL); } @@ -176,7 +178,8 @@ GameActions::Result::Ptr TrackPlaceAction::Query() const } if (!gCheatsAllowTrackPlaceInvalidHeights) { - if (TrackFlags[_trackType] & TRACK_ELEM_FLAG_STARTS_AT_HALF_HEIGHT) + const auto& teDescriptor = GetTrackElementDescriptor(_trackType); + if (teDescriptor.Flags & TRACK_ELEM_FLAG_STARTS_AT_HALF_HEIGHT) { if ((_origin.z & 0x0F) != 8) { @@ -260,7 +263,8 @@ GameActions::Result::Ptr TrackPlaceAction::Query() const res->GroundFlags = mapGroundFlags; - if (TrackFlags[_trackType] & TRACK_ELEM_FLAG_ONLY_ABOVE_GROUND) + const auto& teDescriptor = GetTrackElementDescriptor(_trackType); + if (teDescriptor.Flags & TRACK_ELEM_FLAG_ONLY_ABOVE_GROUND) { if (res->GroundFlags & ELEMENT_IS_UNDERGROUND) { @@ -269,7 +273,7 @@ GameActions::Result::Ptr TrackPlaceAction::Query() const } } - if (TrackFlags[_trackType] & TRACK_ELEM_FLAG_ONLY_UNDERWATER) + if (teDescriptor.Flags & TRACK_ELEM_FLAG_ONLY_UNDERWATER) { // No element has this flag if (canBuild->GroundFlags & ELEMENT_IS_UNDERWATER) { diff --git a/src/openrct2/ride/Ride.cpp b/src/openrct2/ride/Ride.cpp index b6b7ba338a..3bbf94cb01 100644 --- a/src/openrct2/ride/Ride.cpp +++ b/src/openrct2/ride/Ride.cpp @@ -2663,7 +2663,8 @@ static bool ride_check_track_contains_inversions(CoordsXYE* input, CoordsXYE* ou while (track_circuit_iterator_next(&it)) { auto trackType = it.current.element->AsTrack()->GetTrackType(); - if (TrackFlags[trackType] & TRACK_ELEM_FLAG_INVERSION_TO_NORMAL) + const auto& teDescriptor = GetTrackElementDescriptor(trackType); + if (teDescriptor.Flags & TRACK_ELEM_FLAG_INVERSION_TO_NORMAL) { *output = it.current; return true; @@ -2721,7 +2722,8 @@ static bool ride_check_track_contains_banked(CoordsXYE* input, CoordsXYE* output while (track_circuit_iterator_next(&it)) { auto trackType = output->element->AsTrack()->GetTrackType(); - if (TrackFlags[trackType] & TRACK_ELEM_FLAG_BANKED) + const auto& teDescriptor = GetTrackElementDescriptor(trackType); + if (teDescriptor.Flags & TRACK_ELEM_FLAG_BANKED) { *output = it.current; return true; diff --git a/src/openrct2/ride/TrackData.cpp b/src/openrct2/ride/TrackData.cpp index ce4d221e2d..068f01035a 100644 --- a/src/openrct2/ride/TrackData.cpp +++ b/src/openrct2/ride/TrackData.cpp @@ -4858,7 +4858,7 @@ const uint8_t TrackSequenceElementAllowedWallEdges[TrackElemType::Count][MaxSequ }; /** rct2: 0x0099423C */ -const uint16_t TrackFlags[TrackElemType::Count] = { +const static uint16_t TrackFlags[TrackElemType::Count] = { /* TrackElemType::Flat */ TRACK_ELEM_FLAG_ALLOW_LIFT_HILL, /* TrackElemType::EndStation */ 0, /* TrackElemType::BeginStation */ 0, diff --git a/src/openrct2/ride/TrackData.h b/src/openrct2/ride/TrackData.h index 4f819deeb3..d96d777677 100644 --- a/src/openrct2/ride/TrackData.h +++ b/src/openrct2/ride/TrackData.h @@ -68,8 +68,6 @@ extern const uint32_t TrackHeightMarkerPositions[TrackElemType::Count]; extern const uint8_t TrackSequenceElementAllowedWallEdges[TrackElemType::Count][16]; -extern const uint16_t TrackFlags[TrackElemType::Count]; - struct TrackElementDescriptor { rct_track_coordinates Coordinates; diff --git a/src/openrct2/ride/Vehicle.cpp b/src/openrct2/ride/Vehicle.cpp index 7b25234d35..aaa9e37770 100644 --- a/src/openrct2/ride/Vehicle.cpp +++ b/src/openrct2/ride/Vehicle.cpp @@ -1707,7 +1707,8 @@ void Vehicle::UpdateMeasurements() } } - uint16_t trackFlags = TrackFlags[trackElemType]; + const auto& teDescriptor = GetTrackElementDescriptor(trackElemType); + uint16_t trackFlags = teDescriptor.Flags; uint32_t testingFlags = curRide->testing_flags; if (testingFlags & RIDE_TESTING_TURN_LEFT && trackFlags & TRACK_ELEM_FLAG_TURN_LEFT) @@ -8545,7 +8546,8 @@ bool Vehicle::UpdateTrackMotionBackwardsGetNewTrack(uint16_t trackType, Ride* cu if (next_vehicle_on_train == SPRITE_INDEX_NULL) { trackType = tileElement->AsTrack()->GetTrackType(); - if (!(TrackFlags[trackType] & TRACK_ELEM_FLAG_DOWN)) + const auto& teDescriptor = GetTrackElementDescriptor(trackType); + if (!(teDescriptor.Flags & TRACK_ELEM_FLAG_DOWN)) { _vehicleMotionTrackFlags |= VEHICLE_UPDATE_MOTION_TRACK_FLAG_9; } diff --git a/src/openrct2/windows/_legacy.cpp b/src/openrct2/windows/_legacy.cpp index 15ff0447f5..dd0313d2fb 100644 --- a/src/openrct2/windows/_legacy.cpp +++ b/src/openrct2/windows/_legacy.cpp @@ -349,13 +349,13 @@ bool window_ride_construction_update_state( bool turnOffLiftHill = false; if (!(_enabledRidePieces & (1ULL << TRACK_LIFT_HILL_CURVE))) { - if (TrackFlags[trackType] & TRACK_ELEM_FLAG_CURVE_ALLOWS_LIFT) + if (teDescriptor.Flags & TRACK_ELEM_FLAG_CURVE_ALLOWS_LIFT) { turnOffLiftHill = true; } } - if (!(TrackFlags[trackType] & TRACK_ELEM_FLAG_ALLOW_LIFT_HILL)) + if (!(teDescriptor.Flags & TRACK_ELEM_FLAG_ALLOW_LIFT_HILL)) { turnOffLiftHill = true; } From 72e6f9a69481c913ffc19ea325674f93d405e288 Mon Sep 17 00:00:00 2001 From: frutiemax Date: Sun, 22 Aug 2021 10:01:30 -0400 Subject: [PATCH 15/51] Part of #13874: replace height markers positions tables --- src/openrct2/ride/TrackData.cpp | 2 +- src/openrct2/ride/TrackData.h | 2 -- src/openrct2/ride/TrackPaint.cpp | 5 ++++- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/openrct2/ride/TrackData.cpp b/src/openrct2/ride/TrackData.cpp index 068f01035a..cce0d3f73b 100644 --- a/src/openrct2/ride/TrackData.cpp +++ b/src/openrct2/ride/TrackData.cpp @@ -4316,7 +4316,7 @@ const track_type_t TrackElementMirrorMap[TrackElemType::Count] = { }; /** rct2: 0x00999694 */ -const uint32_t TrackHeightMarkerPositions[TrackElemType::Count] = { +const static uint32_t TrackHeightMarkerPositions[TrackElemType::Count] = { (1 << 0), // TrackElemType::Flat (1 << 0), // TrackElemType::EndStation (1 << 0), // TrackElemType::BeginStation diff --git a/src/openrct2/ride/TrackData.h b/src/openrct2/ride/TrackData.h index d96d777677..60cb33e6e2 100644 --- a/src/openrct2/ride/TrackData.h +++ b/src/openrct2/ride/TrackData.h @@ -64,8 +64,6 @@ constexpr const dodgems_track_size DodgemsTrackSize(track_type_t type) } extern const track_type_t TrackElementMirrorMap[TrackElemType::Count]; -extern const uint32_t TrackHeightMarkerPositions[TrackElemType::Count]; - extern const uint8_t TrackSequenceElementAllowedWallEdges[TrackElemType::Count][16]; struct TrackElementDescriptor diff --git a/src/openrct2/ride/TrackPaint.cpp b/src/openrct2/ride/TrackPaint.cpp index bde96b1845..875506f6ed 100644 --- a/src/openrct2/ride/TrackPaint.cpp +++ b/src/openrct2/ride/TrackPaint.cpp @@ -27,6 +27,8 @@ #include "TrackData.h" #include "TrackDesign.h" +using namespace OpenRCT2::TrackMetaData; + // clang-format off /* rct2: 0x007667AC */ static constexpr TileCoordsXY EntranceOffsetEdgeNE[] = { @@ -2202,7 +2204,8 @@ void PaintTrack(paint_session* session, Direction direction, int32_t height, con if (PaintShouldShowHeightMarkers(session, VIEWPORT_FLAG_TRACK_HEIGHTS)) { session->InteractionType = ViewportInteractionItem::None; - if (TrackHeightMarkerPositions[trackType] & (1 << trackSequence)) + const auto& teDescriptor = GetTrackElementDescriptor(trackType); + if (teDescriptor.HeightMarkerPositions & (1 << trackSequence)) { uint16_t ax = ride->GetRideTypeDescriptor().Heights.VehicleZOffset; // 0x1689 represents 0 height there are -127 to 128 heights above and below it From 716dd3dcb622a1fc438b2f56e775c6b017d940b8 Mon Sep 17 00:00:00 2001 From: frutiemax Date: Sun, 22 Aug 2021 10:09:23 -0400 Subject: [PATCH 16/51] Part of #13874: Replace mirror maps --- src/openrct2/ride/TrackData.cpp | 2 +- src/openrct2/ride/TrackData.h | 1 - src/openrct2/ride/TrackDesign.cpp | 3 ++- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/openrct2/ride/TrackData.cpp b/src/openrct2/ride/TrackData.cpp index cce0d3f73b..af506c423b 100644 --- a/src/openrct2/ride/TrackData.cpp +++ b/src/openrct2/ride/TrackData.cpp @@ -4045,7 +4045,7 @@ const money32 TrackPricing[TrackElemType::Count] = { }; /** rct2: 0x0099EA1C */ -const track_type_t TrackElementMirrorMap[TrackElemType::Count] = { +const static track_type_t TrackElementMirrorMap[TrackElemType::Count] = { TrackElemType::Flat, TrackElemType::EndStation, TrackElemType::BeginStation, diff --git a/src/openrct2/ride/TrackData.h b/src/openrct2/ride/TrackData.h index 60cb33e6e2..2a6dcf5bb7 100644 --- a/src/openrct2/ride/TrackData.h +++ b/src/openrct2/ride/TrackData.h @@ -62,7 +62,6 @@ constexpr const dodgems_track_size DodgemsTrackSize(track_type_t type) return { 4, 4, 59, 123 }; return { 0, 0, 0, 0 }; } -extern const track_type_t TrackElementMirrorMap[TrackElemType::Count]; extern const uint8_t TrackSequenceElementAllowedWallEdges[TrackElemType::Count][16]; diff --git a/src/openrct2/ride/TrackDesign.cpp b/src/openrct2/ride/TrackDesign.cpp index ef996c45ea..be6835567d 100644 --- a/src/openrct2/ride/TrackDesign.cpp +++ b/src/openrct2/ride/TrackDesign.cpp @@ -770,7 +770,8 @@ static void track_design_mirror_ride(TrackDesign* td6) { for (auto& track : td6->track_elements) { - track.type = TrackElementMirrorMap[track.type]; + const auto& teDescriptor = GetTrackElementDescriptor(track.type); + track.type = teDescriptor.MirrorMap; } for (auto& entrance : td6->entrance_elements) From 780eb4f287673bb47febe76d482b8e5505b994bc Mon Sep 17 00:00:00 2001 From: frutiemax Date: Sun, 22 Aug 2021 10:11:52 -0400 Subject: [PATCH 17/51] Part of #13874: Replace piece lengths --- src/openrct2/ride/Ride.cpp | 3 ++- src/openrct2/ride/TrackData.cpp | 2 +- src/openrct2/ride/TrackData.h | 2 -- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/src/openrct2/ride/Ride.cpp b/src/openrct2/ride/Ride.cpp index 3bbf94cb01..75522a46d4 100644 --- a/src/openrct2/ride/Ride.cpp +++ b/src/openrct2/ride/Ride.cpp @@ -4909,7 +4909,8 @@ static int32_t ride_get_track_length(Ride* ride) while (track_circuit_iterator_next(&it)) { trackType = it.current.element->AsTrack()->GetTrackType(); - result += TrackPieceLengths[trackType]; + const auto& teDescriptor = GetTrackElementDescriptor(trackType); + result += teDescriptor.PieceLength; moveSlowIt = !moveSlowIt; if (moveSlowIt) diff --git a/src/openrct2/ride/TrackData.cpp b/src/openrct2/ride/TrackData.cpp index af506c423b..061f4077d2 100644 --- a/src/openrct2/ride/TrackData.cpp +++ b/src/openrct2/ride/TrackData.cpp @@ -2816,7 +2816,7 @@ const rct_preview_track *TrackBlocks[TrackElemType::Count] = { TrackBlocksFlatTrack3x3, }; -const uint8_t TrackPieceLengths[TrackElemType::Count] = { +const static uint8_t TrackPieceLengths[TrackElemType::Count] = { 32, // TrackElemType::Flat 32, // TrackElemType::EndStation 32, // TrackElemType::BeginStation diff --git a/src/openrct2/ride/TrackData.h b/src/openrct2/ride/TrackData.h index 2a6dcf5bb7..e507487fa5 100644 --- a/src/openrct2/ride/TrackData.h +++ b/src/openrct2/ride/TrackData.h @@ -21,8 +21,6 @@ extern const uint8_t TrackSequenceProperties[TrackElemType::Count][MaxSequencesP extern const rct_preview_track* TrackBlocks[TrackElemType::Count]; -extern const uint8_t TrackPieceLengths[TrackElemType::Count]; - struct track_curve_chain { int32_t next; From b5219d76d879db999940059888220c026a86f4a2 Mon Sep 17 00:00:00 2001 From: frutiemax Date: Sun, 22 Aug 2021 10:18:37 -0400 Subject: [PATCH 18/51] Part of #13874: Replace pricing tables --- src/openrct2-ui/windows/NewRide.cpp | 5 ++++- src/openrct2/actions/MazePlaceTrackAction.cpp | 8 ++++++-- src/openrct2/actions/MazeSetTrackAction.cpp | 8 ++++++-- src/openrct2/actions/TrackPlaceAction.cpp | 6 ++++-- src/openrct2/actions/TrackRemoveAction.cpp | 8 ++++++-- src/openrct2/ride/TrackData.cpp | 2 +- src/openrct2/ride/TrackData.h | 2 -- 7 files changed, 27 insertions(+), 12 deletions(-) diff --git a/src/openrct2-ui/windows/NewRide.cpp b/src/openrct2-ui/windows/NewRide.cpp index 6bdcc02b25..0e4868a487 100644 --- a/src/openrct2-ui/windows/NewRide.cpp +++ b/src/openrct2-ui/windows/NewRide.cpp @@ -33,6 +33,8 @@ #include #include +using namespace OpenRCT2::TrackMetaData; + static constexpr const rct_string_id WINDOW_TITLE = STR_NONE; constexpr size_t AVAILABILITY_STRING_SIZE = 256; static constexpr const int32_t WH = 382; @@ -943,7 +945,8 @@ static void window_new_ride_paint_ride_information( // Get price of ride int32_t unk2 = GetRideTypeDescriptor(item.Type).StartTrackPiece; money64 price = GetRideTypeDescriptor(item.Type).BuildCosts.TrackPrice; - price *= TrackPricing[unk2]; + const auto& teDescriptor = GetTrackElementDescriptor(unk2); + price *= teDescriptor.Pricing; price = (price >> 17) * 10 * GetRideTypeDescriptor(item.Type).BuildCosts.PriceEstimateMultiplier; // diff --git a/src/openrct2/actions/MazePlaceTrackAction.cpp b/src/openrct2/actions/MazePlaceTrackAction.cpp index aa394ea0ea..8e049bcd13 100644 --- a/src/openrct2/actions/MazePlaceTrackAction.cpp +++ b/src/openrct2/actions/MazePlaceTrackAction.cpp @@ -12,6 +12,8 @@ #include "../ride/RideData.h" #include "../ride/TrackData.h" +using namespace OpenRCT2::TrackMetaData; + MazePlaceTrackAction::MazePlaceTrackAction(const CoordsXYZ& location, NetworkRideId_t rideIndex, uint16_t mazeEntry) : _loc(location) , _rideIndex(rideIndex) @@ -113,7 +115,8 @@ GameActions::Result::Ptr MazePlaceTrackAction::Query() const return res; } - money32 price = (((ride->GetRideTypeDescriptor().BuildCosts.TrackPrice * TrackPricing[TrackElemType::Maze]) >> 16)); + const auto& teDescriptor = GetTrackElementDescriptor(TrackElemType::Maze); + money32 price = (((ride->GetRideTypeDescriptor().BuildCosts.TrackPrice * teDescriptor.Pricing) >> 16)); res->Cost = canBuild->Cost + price / 2 * 10; return res; @@ -154,7 +157,8 @@ GameActions::Result::Ptr MazePlaceTrackAction::Execute() const return canBuild; } - money32 price = (((ride->GetRideTypeDescriptor().BuildCosts.TrackPrice * TrackPricing[TrackElemType::Maze]) >> 16)); + const auto& teDescriptor = GetTrackElementDescriptor(TrackElemType::Maze); + money32 price = (((ride->GetRideTypeDescriptor().BuildCosts.TrackPrice * teDescriptor.Pricing) >> 16)); res->Cost = canBuild->Cost + price / 2 * 10; auto startLoc = _loc.ToTileStart(); diff --git a/src/openrct2/actions/MazeSetTrackAction.cpp b/src/openrct2/actions/MazeSetTrackAction.cpp index d2755adb1c..f7f78114c3 100644 --- a/src/openrct2/actions/MazeSetTrackAction.cpp +++ b/src/openrct2/actions/MazeSetTrackAction.cpp @@ -21,6 +21,8 @@ #include "../world/Footpath.h" #include "../world/Park.h" +using namespace OpenRCT2::TrackMetaData; + MazeSetTrackAction::MazeSetTrackAction( const CoordsXYZD& location, bool initialPlacement, NetworkRideId_t rideIndex, uint8_t mode) : _loc(location) @@ -134,7 +136,8 @@ GameActions::Result::Ptr MazeSetTrackAction::Query() const return res; } - money32 price = (((ride->GetRideTypeDescriptor().BuildCosts.TrackPrice * TrackPricing[TrackElemType::Maze]) >> 16)); + const auto& teDescriptor = GetTrackElementDescriptor(TrackElemType::Maze); + money32 price = (((ride->GetRideTypeDescriptor().BuildCosts.TrackPrice * teDescriptor.Pricing) >> 16)); res->Cost = price / 2 * 10; return res; @@ -169,7 +172,8 @@ GameActions::Result::Ptr MazeSetTrackAction::Execute() const auto tileElement = map_get_track_element_at_of_type_from_ride(_loc, TrackElemType::Maze, _rideIndex); if (tileElement == nullptr) { - money32 price = (((ride->GetRideTypeDescriptor().BuildCosts.TrackPrice * TrackPricing[TrackElemType::Maze]) >> 16)); + const auto& teDescriptor = GetTrackElementDescriptor(TrackElemType::Maze); + money32 price = (((ride->GetRideTypeDescriptor().BuildCosts.TrackPrice * teDescriptor.Pricing) >> 16)); res->Cost = price / 2 * 10; auto startLoc = _loc.ToTileStart(); diff --git a/src/openrct2/actions/TrackPlaceAction.cpp b/src/openrct2/actions/TrackPlaceAction.cpp index b961f6ffda..5e335fd6ed 100644 --- a/src/openrct2/actions/TrackPlaceAction.cpp +++ b/src/openrct2/actions/TrackPlaceAction.cpp @@ -368,7 +368,8 @@ GameActions::Result::Ptr TrackPlaceAction::Query() const } money32 price = ride->GetRideTypeDescriptor().BuildCosts.TrackPrice; - price *= TrackPricing[_trackType]; + const auto& teDescriptor = GetTrackElementDescriptor(_trackType); + price *= teDescriptor.Pricing; price >>= 16; res->Cost = cost + ((price / 2) * 10); @@ -656,7 +657,8 @@ GameActions::Result::Ptr TrackPlaceAction::Execute() const } money32 price = ride->GetRideTypeDescriptor().BuildCosts.TrackPrice; - price *= TrackPricing[_trackType]; + const auto& teDescriptor = GetTrackElementDescriptor(_trackType); + price *= teDescriptor.Pricing; price >>= 16; res->Cost = cost + ((price / 2) * 10); diff --git a/src/openrct2/actions/TrackRemoveAction.cpp b/src/openrct2/actions/TrackRemoveAction.cpp index 0165bb721f..aa20954400 100644 --- a/src/openrct2/actions/TrackRemoveAction.cpp +++ b/src/openrct2/actions/TrackRemoveAction.cpp @@ -19,6 +19,8 @@ #include "../world/Surface.h" #include "RideSetSettingAction.h" +using namespace OpenRCT2::TrackMetaData; + TrackRemoveAction::TrackRemoveAction(track_type_t trackType, int32_t sequence, const CoordsXYZD& origin) : _trackType(trackType) , _sequence(sequence) @@ -226,7 +228,8 @@ GameActions::Result::Ptr TrackRemoveAction::Query() const } money32 price = ride->GetRideTypeDescriptor().BuildCosts.TrackPrice; - price *= TrackPricing[trackType]; + const auto& teDescriptor = GetTrackElementDescriptor(trackType); + price *= teDescriptor.Pricing; price >>= 16; price = (price + cost) / 2; if (ride->lifecycle_flags & RIDE_LIFECYCLE_EVER_BEEN_OPENED) @@ -473,7 +476,8 @@ GameActions::Result::Ptr TrackRemoveAction::Execute() const } money32 price = ride->GetRideTypeDescriptor().BuildCosts.TrackPrice; - price *= TrackPricing[trackType]; + const auto& teDescriptor = GetTrackElementDescriptor(trackType); + price *= teDescriptor.Pricing; price >>= 16; price = (price + cost) / 2; if (ride->lifecycle_flags & RIDE_LIFECYCLE_EVER_BEEN_OPENED) diff --git a/src/openrct2/ride/TrackData.cpp b/src/openrct2/ride/TrackData.cpp index 061f4077d2..4a49ddc40c 100644 --- a/src/openrct2/ride/TrackData.cpp +++ b/src/openrct2/ride/TrackData.cpp @@ -3774,7 +3774,7 @@ const static track_type_t AlternativeTrackTypes[TrackElemType::Count] = { }; /** rct2: 0x0099DA34 */ -const money32 TrackPricing[TrackElemType::Count] = { +const static money32 TrackPricing[TrackElemType::Count] = { 65536, // TrackElemType::Flat 98304, // TrackElemType::EndStation 98304, // TrackElemType::BeginStation diff --git a/src/openrct2/ride/TrackData.h b/src/openrct2/ride/TrackData.h index e507487fa5..2664b8fc61 100644 --- a/src/openrct2/ride/TrackData.h +++ b/src/openrct2/ride/TrackData.h @@ -40,8 +40,6 @@ struct track_descriptor extern const track_descriptor gTrackDescriptors[142]; -extern const money32 TrackPricing[TrackElemType::Count]; - struct dodgems_track_size { uint8_t left; From 382315b2c3c20f94fa24665b5e5d3c5626d04716 Mon Sep 17 00:00:00 2001 From: frutiemax Date: Sun, 22 Aug 2021 10:44:17 -0400 Subject: [PATCH 19/51] Part of #13874: Replace block tables --- src/openrct2-ui/windows/RideConstruction.cpp | 20 ++++++++++++++------ src/openrct2-ui/windows/TrackDesignPlace.cpp | 7 ++++--- src/openrct2/actions/TrackPlaceAction.cpp | 19 ++++++++----------- src/openrct2/actions/TrackRemoveAction.cpp | 16 ++++++++-------- src/openrct2/actions/WallPlaceAction.cpp | 6 +++--- src/openrct2/ride/Ride.cpp | 14 +++++++------- src/openrct2/ride/RideConstruction.cpp | 6 ++++-- src/openrct2/ride/TrackData.cpp | 2 +- src/openrct2/ride/TrackData.h | 2 -- src/openrct2/ride/TrackDesign.cpp | 8 ++++---- src/openrct2/ride/Vehicle.cpp | 4 ++-- src/openrct2/world/TileInspector.cpp | 11 +++++++---- 12 files changed, 62 insertions(+), 53 deletions(-) diff --git a/src/openrct2-ui/windows/RideConstruction.cpp b/src/openrct2-ui/windows/RideConstruction.cpp index b5e470b26a..36530f15be 100644 --- a/src/openrct2-ui/windows/RideConstruction.cpp +++ b/src/openrct2-ui/windows/RideConstruction.cpp @@ -42,6 +42,8 @@ static constexpr const int32_t WH = 394; static constexpr const int32_t WW = 166; static constexpr const uint16_t ARROW_PULSE_DURATION = 200; +using namespace OpenRCT2::TrackMetaData; + #pragma region Widgets // clang-format off @@ -1924,7 +1926,8 @@ static void window_ride_construction_mouseup_demolish(rct_window* w) return; } - const rct_preview_track* trackBlock = TrackBlocks[tileElement->AsTrack()->GetTrackType()]; + const auto& teDescriptor = GetTrackElementDescriptor(tileElement->AsTrack()->GetTrackType()); + const rct_preview_track* trackBlock = teDescriptor.Block; newCoords->z = (tileElement->GetBaseZ()) - trackBlock->z; gGotoStartPlacementMode = true; } @@ -2345,7 +2348,8 @@ static void window_ride_construction_draw_track_piece( if (ride == nullptr) return; - auto trackBlock = TrackBlocks[trackType]; + const auto& teDescriptor = GetTrackElementDescriptor(trackType); + auto trackBlock = teDescriptor.Block; while ((trackBlock + 1)->index != 0xFF) trackBlock++; @@ -2399,7 +2403,8 @@ static void sub_6CBCE2( gMapSize = MAXIMUM_MAP_SIZE_TECHNICAL; - auto trackBlock = TrackBlocks[trackType]; + const auto& teDescriptor = GetTrackElementDescriptor(trackType); + auto trackBlock = teDescriptor.Block; while (trackBlock->index != 255) { auto quarterTile = trackBlock->var_08.Rotate(trackDirection); @@ -3292,7 +3297,8 @@ static void window_ride_construction_select_map_tiles( const rct_preview_track* trackBlock; - trackBlock = TrackBlocks[trackType]; + const auto& teDescriptor = GetTrackElementDescriptor(trackType); + trackBlock = teDescriptor.Block; trackDirection &= 3; gMapSelectionTiles.clear(); while (trackBlock->index != 255) @@ -3469,7 +3475,8 @@ void ride_construction_toolupdate_construct(const ScreenCoordsXY& screenCoords) // z = map_get_highest_z(x >> 5, y >> 5); } // loc_6CC91B: - trackBlock = TrackBlocks[trackType]; + const auto& teDescriptor = GetTrackElementDescriptor(trackType); + trackBlock = teDescriptor.Block; int32_t bx = 0; do { @@ -3699,7 +3706,8 @@ void ride_construction_tooldown_construct(const ScreenCoordsXY& screenCoords) if (_trackPlaceZ == 0) { - const rct_preview_track* trackBlock = TrackBlocks[_currentTrackPieceType]; + const auto& teDescriptor = GetTrackElementDescriptor(_currentTrackPieceType); + const rct_preview_track* trackBlock = teDescriptor.Block; int32_t bx = 0; do { diff --git a/src/openrct2-ui/windows/TrackDesignPlace.cpp b/src/openrct2-ui/windows/TrackDesignPlace.cpp index 2e2b25bbf9..5896be7fe1 100644 --- a/src/openrct2-ui/windows/TrackDesignPlace.cpp +++ b/src/openrct2-ui/windows/TrackDesignPlace.cpp @@ -32,6 +32,7 @@ #include using namespace OpenRCT2; +using namespace OpenRCT2::TrackMetaData; static constexpr const rct_string_id WINDOW_TITLE = STR_STRING; static constexpr const int32_t WH = 124; @@ -550,7 +551,8 @@ static void window_track_place_draw_mini_preview_track( } // Follow a single track piece shape - const rct_preview_track* trackBlock = TrackBlocks[trackType]; + const auto& teDescriptor = GetTrackElementDescriptor(trackType); + const rct_preview_track* trackBlock = teDescriptor.Block; while (trackBlock->index != 255) { auto rotatedAndOffsetTrackBlock = curTrackStart + CoordsXY{ trackBlock->x, trackBlock->y }.Rotate(curTrackRotation); @@ -594,8 +596,7 @@ static void window_track_place_draw_mini_preview_track( // Change rotation and next position based on track curvature curTrackRotation &= 3; - using namespace OpenRCT2::TrackMetaData; - const auto& teDescriptor = GetTrackElementDescriptor(trackType); + const rct_track_coordinates* track_coordinate = &teDescriptor.Coordinates; curTrackStart += CoordsXY{ track_coordinate->x, track_coordinate->y }.Rotate(curTrackRotation); diff --git a/src/openrct2/actions/TrackPlaceAction.cpp b/src/openrct2/actions/TrackPlaceAction.cpp index 5e335fd6ed..abc26b7e26 100644 --- a/src/openrct2/actions/TrackPlaceAction.cpp +++ b/src/openrct2/actions/TrackPlaceAction.cpp @@ -156,7 +156,8 @@ GameActions::Result::Ptr TrackPlaceAction::Query() const } money32 cost = 0; - const rct_preview_track* trackBlock = TrackBlocks[_trackType]; + const auto& teDescriptor = GetTrackElementDescriptor(_trackType); + const rct_preview_track* trackBlock = teDescriptor.Block; uint32_t numElements = 0; // First check if any of the track pieces are outside the park for (; trackBlock->index != 0xFF; trackBlock++) @@ -176,9 +177,9 @@ GameActions::Result::Ptr TrackPlaceAction::Query() const log_warning("Not enough free map elements to place track."); return std::make_unique(GameActions::Status::NoFreeElements, STR_TILE_ELEMENT_LIMIT_REACHED); } + if (!gCheatsAllowTrackPlaceInvalidHeights) { - const auto& teDescriptor = GetTrackElementDescriptor(_trackType); if (teDescriptor.Flags & TRACK_ELEM_FLAG_STARTS_AT_HALF_HEIGHT) { if ((_origin.z & 0x0F) != 8) @@ -198,7 +199,7 @@ GameActions::Result::Ptr TrackPlaceAction::Query() const } // If that is not the case, then perform the remaining checks - trackBlock = TrackBlocks[_trackType]; + trackBlock = teDescriptor.Block; for (int32_t blockIndex = 0; trackBlock->index != 0xFF; trackBlock++, blockIndex++) { @@ -262,8 +263,6 @@ GameActions::Result::Ptr TrackPlaceAction::Query() const } res->GroundFlags = mapGroundFlags; - - const auto& teDescriptor = GetTrackElementDescriptor(_trackType); if (teDescriptor.Flags & TRACK_ELEM_FLAG_ONLY_ABOVE_GROUND) { if (res->GroundFlags & ELEMENT_IS_UNDERGROUND) @@ -368,7 +367,6 @@ GameActions::Result::Ptr TrackPlaceAction::Query() const } money32 price = ride->GetRideTypeDescriptor().BuildCosts.TrackPrice; - const auto& teDescriptor = GetTrackElementDescriptor(_trackType); price *= teDescriptor.Pricing; price >>= 16; @@ -406,9 +404,8 @@ GameActions::Result::Ptr TrackPlaceAction::Execute() const wallEdges = &TrackSequenceElementAllowedWallEdges[_trackType]; money32 cost = 0; - const rct_preview_track* trackBlock = TrackBlocks[_trackType]; - - trackBlock = TrackBlocks[_trackType]; + const auto& teDescriptor = GetTrackElementDescriptor(_trackType); + const rct_preview_track* trackBlock = teDescriptor.Block; for (int32_t blockIndex = 0; trackBlock->index != 0xFF; trackBlock++, blockIndex++) { auto rotatedTrack = CoordsXYZ{ CoordsXY{ trackBlock->x, trackBlock->y }.Rotate(_origin.direction), trackBlock->z }; @@ -657,7 +654,6 @@ GameActions::Result::Ptr TrackPlaceAction::Execute() const } money32 price = ride->GetRideTypeDescriptor().BuildCosts.TrackPrice; - const auto& teDescriptor = GetTrackElementDescriptor(_trackType); price *= teDescriptor.Pricing; price >>= 16; @@ -667,7 +663,8 @@ GameActions::Result::Ptr TrackPlaceAction::Execute() const bool TrackPlaceAction::CheckMapCapacity(int16_t numTiles) const { - for (const rct_preview_track* trackBlock = TrackBlocks[_trackType]; trackBlock->index != 0xFF; trackBlock++) + const auto& teDescriptor = GetTrackElementDescriptor(_trackType); + for (const rct_preview_track* trackBlock = teDescriptor.Block; trackBlock->index != 0xFF; trackBlock++) { auto rotatedTrack = CoordsXY{ trackBlock->x, trackBlock->y }.Rotate(_origin.direction); diff --git a/src/openrct2/actions/TrackRemoveAction.cpp b/src/openrct2/actions/TrackRemoveAction.cpp index aa20954400..5db867f52b 100644 --- a/src/openrct2/actions/TrackRemoveAction.cpp +++ b/src/openrct2/actions/TrackRemoveAction.cpp @@ -122,7 +122,7 @@ GameActions::Result::Ptr TrackRemoveAction::Query() const } ride_id_t rideIndex = tileElement->AsTrack()->GetRideIndex(); - auto trackType = tileElement->AsTrack()->GetTrackType(); + const auto trackType = tileElement->AsTrack()->GetTrackType(); auto ride = get_ride(rideIndex); if (ride == nullptr) @@ -136,7 +136,8 @@ GameActions::Result::Ptr TrackRemoveAction::Query() const log_warning("Ride type not found. ride type = %d.", ride->type); return MakeResult(GameActions::Status::InvalidParameters, STR_RIDE_CONSTRUCTION_CANT_REMOVE_THIS); } - const rct_preview_track* trackBlock = TrackBlocks[trackType]; + const auto& teDescriptor = GetTrackElementDescriptor(trackType); + const rct_preview_track* trackBlock = teDescriptor.Block; trackBlock += tileElement->AsTrack()->GetSequenceIndex(); auto startLoc = _origin; @@ -152,7 +153,7 @@ GameActions::Result::Ptr TrackRemoveAction::Query() const money32 cost = 0; - trackBlock = TrackBlocks[trackType]; + trackBlock = teDescriptor.Block; for (; trackBlock->index != 255; trackBlock++) { rotatedTrack = CoordsXYZ{ CoordsXY{ trackBlock->x, trackBlock->y }.Rotate(startLoc.direction), trackBlock->z }; @@ -228,7 +229,6 @@ GameActions::Result::Ptr TrackRemoveAction::Query() const } money32 price = ride->GetRideTypeDescriptor().BuildCosts.TrackPrice; - const auto& teDescriptor = GetTrackElementDescriptor(trackType); price *= teDescriptor.Pricing; price >>= 16; price = (price + cost) / 2; @@ -308,7 +308,7 @@ GameActions::Result::Ptr TrackRemoveAction::Execute() const } ride_id_t rideIndex = tileElement->AsTrack()->GetRideIndex(); - auto trackType = tileElement->AsTrack()->GetTrackType(); + const auto trackType = tileElement->AsTrack()->GetTrackType(); bool isLiftHill = tileElement->AsTrack()->HasChain(); auto ride = get_ride(rideIndex); @@ -317,7 +317,8 @@ GameActions::Result::Ptr TrackRemoveAction::Execute() const log_warning("Ride not found. ride index = %d.", rideIndex); return MakeResult(GameActions::Status::InvalidParameters, STR_RIDE_CONSTRUCTION_CANT_REMOVE_THIS); } - const rct_preview_track* trackBlock = TrackBlocks[trackType]; + const auto& teDescriptor = GetTrackElementDescriptor(trackType); + const rct_preview_track* trackBlock = teDescriptor.Block; trackBlock += tileElement->AsTrack()->GetSequenceIndex(); auto startLoc = _origin; @@ -332,7 +333,7 @@ GameActions::Result::Ptr TrackRemoveAction::Execute() const res->Position.z = startLoc.z; money32 cost = 0; - trackBlock = TrackBlocks[trackType]; + trackBlock = teDescriptor.Block; for (; trackBlock->index != 255; trackBlock++) { rotatedTrackLoc = CoordsXYZ{ CoordsXY{ trackBlock->x, trackBlock->y }.Rotate(startLoc.direction), trackBlock->z }; @@ -476,7 +477,6 @@ GameActions::Result::Ptr TrackRemoveAction::Execute() const } money32 price = ride->GetRideTypeDescriptor().BuildCosts.TrackPrice; - const auto& teDescriptor = GetTrackElementDescriptor(trackType); price *= teDescriptor.Pricing; price >>= 16; price = (price + cost) / 2; diff --git a/src/openrct2/actions/WallPlaceAction.cpp b/src/openrct2/actions/WallPlaceAction.cpp index 9c948c9439..a81bff4968 100644 --- a/src/openrct2/actions/WallPlaceAction.cpp +++ b/src/openrct2/actions/WallPlaceAction.cpp @@ -452,7 +452,7 @@ bool WallPlaceAction::WallCheckObstructionWithTrack( direction = direction_reverse(trackElement->GetDirection()); if (direction == _edge) { - const rct_preview_track* trackBlock = &TrackBlocks[trackType][sequence]; + const rct_preview_track* trackBlock = &teDescriptor.Block[sequence]; z = teDescriptor.Coordinates.z_begin; z = trackElement->base_height + ((z - trackBlock->z) * 8); if (z == z0) @@ -464,7 +464,7 @@ bool WallPlaceAction::WallCheckObstructionWithTrack( } } - const rct_preview_track* trackBlock = &TrackBlocks[trackType][sequence + 1]; + const rct_preview_track* trackBlock = &teDescriptor.Block[sequence + 1]; if (trackBlock->index != 0xFF) { return false; @@ -487,7 +487,7 @@ bool WallPlaceAction::WallCheckObstructionWithTrack( return false; } - trackBlock = &TrackBlocks[trackType][sequence]; + trackBlock = &teDescriptor.Block[sequence]; z = teDescriptor.Coordinates.z_end; z = trackElement->base_height + ((z - trackBlock->z) * 8); return z == z0; diff --git a/src/openrct2/ride/Ride.cpp b/src/openrct2/ride/Ride.cpp index 75522a46d4..c6dd1930de 100644 --- a/src/openrct2/ride/Ride.cpp +++ b/src/openrct2/ride/Ride.cpp @@ -480,7 +480,7 @@ bool track_block_get_next_from_zero( continue; const auto& teDescriptor = GetTrackElementDescriptor(trackElement->GetTrackType()); - auto nextTrackBlock = TrackBlocks[trackElement->GetTrackType()]; + auto nextTrackBlock = teDescriptor.Block; if (nextTrackBlock == nullptr) continue; @@ -530,7 +530,7 @@ bool track_block_get_next(CoordsXYE* input, CoordsXYE* output, int32_t* z, int32 if (ride == nullptr) return false; - auto trackBlock = TrackBlocks[inputElement->GetTrackType()]; + auto trackBlock = teDescriptor.Block; if (trackBlock == nullptr) return false; @@ -598,11 +598,10 @@ bool track_block_get_previous_from_zero( if (trackElement->GetRideIndex() != ride->id) continue; - auto nextTrackBlock = TrackBlocks[trackElement->GetTrackType()]; + const auto& teDesc = GetTrackElementDescriptor(trackElement->GetTrackType()); + auto nextTrackBlock = teDesc.Block; if (nextTrackBlock == nullptr) continue; - - const auto& teDesc = GetTrackElementDescriptor(trackElement->GetTrackType()); auto nextTrackCoordinate = teDesc.Coordinates; nextTrackBlock += trackElement->GetSequenceIndex(); @@ -635,7 +634,8 @@ bool track_block_get_previous_from_zero( outTrackBeginEnd->begin_z = tileElement->GetBaseZ(); - auto nextTrackBlock2 = TrackBlocks[trackElement->GetTrackType()]; + const auto& teDescriptor = GetTrackElementDescriptor(trackElement->GetTrackType()); + auto nextTrackBlock2 = teDescriptor.Block; if (nextTrackBlock2 == nullptr) continue; @@ -676,7 +676,7 @@ bool track_block_get_previous(const CoordsXYE& trackPos, track_begin_end* outTra if (ride == nullptr) return false; - auto trackBlock = TrackBlocks[trackElement->GetTrackType()]; + auto trackBlock = teDescriptor.Block; if (trackBlock == nullptr) return false; diff --git a/src/openrct2/ride/RideConstruction.cpp b/src/openrct2/ride/RideConstruction.cpp index de236b4520..8f0a5975f5 100644 --- a/src/openrct2/ride/RideConstruction.cpp +++ b/src/openrct2/ride/RideConstruction.cpp @@ -393,7 +393,8 @@ std::optional sub_6C683D( } // Possibly z should be & 0xF8 - auto trackBlock = TrackBlocks[type]; + const auto& teDescriptor = GetTrackElementDescriptor(type); + auto trackBlock = teDescriptor.Block; if (trackBlock == nullptr) return std::nullopt; @@ -1499,7 +1500,8 @@ void sub_6CB945(Ride* ride) continue; } - const rct_preview_track* trackBlock = TrackBlocks[tileElement->AsTrack()->GetTrackType()]; + const auto& teDescriptor = GetTrackElementDescriptor(tileElement->AsTrack()->GetTrackType()); + const rct_preview_track* trackBlock = teDescriptor.Block; while ((++trackBlock)->index != 0xFF) { CoordsXYZ blockLocation = location + CoordsXYZ{ CoordsXY{ trackBlock->x, trackBlock->y }.Rotate(direction), 0 }; diff --git a/src/openrct2/ride/TrackData.cpp b/src/openrct2/ride/TrackData.cpp index 4a49ddc40c..e6dacd20f8 100644 --- a/src/openrct2/ride/TrackData.cpp +++ b/src/openrct2/ride/TrackData.cpp @@ -2545,7 +2545,7 @@ static constexpr const rct_preview_track TrackBlocksFlatTrack3x3[] = { }; // rct2: 0x00994638 -const rct_preview_track *TrackBlocks[TrackElemType::Count] = { +const static rct_preview_track *TrackBlocks[TrackElemType::Count] = { TrackBlocks000, TrackBlocks001, TrackBlocks002, diff --git a/src/openrct2/ride/TrackData.h b/src/openrct2/ride/TrackData.h index 2664b8fc61..e3c38f20fe 100644 --- a/src/openrct2/ride/TrackData.h +++ b/src/openrct2/ride/TrackData.h @@ -19,8 +19,6 @@ constexpr const uint8_t MaxSequencesPerPiece = 16; extern const uint8_t TrackSequenceProperties[TrackElemType::Count][MaxSequencesPerPiece]; -extern const rct_preview_track* TrackBlocks[TrackElemType::Count]; - struct track_curve_chain { int32_t next; diff --git a/src/openrct2/ride/TrackDesign.cpp b/src/openrct2/ride/TrackDesign.cpp index be6835567d..5c22e095aa 100644 --- a/src/openrct2/ride/TrackDesign.cpp +++ b/src/openrct2/ride/TrackDesign.cpp @@ -185,7 +185,7 @@ rct_string_id TrackDesign::CreateTrackDesignTrack(const Ride& ride) const auto& teDescriptor = GetTrackElementDescriptor(trackElement.element->AsTrack()->GetTrackType()); const rct_track_coordinates* trackCoordinates = &teDescriptor.Coordinates; - auto trackBlock = TrackBlocks[trackType]; + auto trackBlock = teDescriptor.Block; // Used in the following loop to know when we have // completed all of the elements and are back at the // start. @@ -1529,7 +1529,7 @@ static std::optional track_design_place_ride(TrackDesign* td6, const Co switch (_trackDesignPlaceOperation) { case PTD_OPERATION_DRAW_OUTLINES: - for (const rct_preview_track* trackBlock = TrackBlocks[trackType]; trackBlock->index != 0xFF; trackBlock++) + for (const rct_preview_track* trackBlock = teDescriptor.Block; trackBlock->index != 0xFF; trackBlock++) { auto tile = CoordsXY{ newCoords } + CoordsXY{ trackBlock->x, trackBlock->y }.Rotate(rotation); track_design_update_max_min_coordinates({ tile, newCoords.z }); @@ -1539,7 +1539,7 @@ static std::optional track_design_place_ride(TrackDesign* td6, const Co case PTD_OPERATION_REMOVE_GHOST: { const rct_track_coordinates* trackCoordinates = &teDescriptor.Coordinates; - const rct_preview_track* trackBlock = TrackBlocks[trackType]; + const rct_preview_track* trackBlock = teDescriptor.Block; int32_t tempZ = newCoords.z - trackCoordinates->z_begin + trackBlock->z; auto trackRemoveAction = TrackRemoveAction( trackType, 0, { newCoords, tempZ, static_cast(rotation & 3) }); @@ -1611,7 +1611,7 @@ static std::optional track_design_place_ride(TrackDesign* td6, const Co case PTD_OPERATION_GET_PLACE_Z: { int32_t tempZ = newCoords.z - teDescriptor.Coordinates.z_begin; - for (const rct_preview_track* trackBlock = TrackBlocks[trackType]; trackBlock->index != 0xFF; trackBlock++) + for (const rct_preview_track* trackBlock = teDescriptor.Block; trackBlock->index != 0xFF; trackBlock++) { auto tile = CoordsXY{ newCoords } + CoordsXY{ trackBlock->x, trackBlock->y }.Rotate(rotation); if (!map_is_location_valid(tile)) diff --git a/src/openrct2/ride/Vehicle.cpp b/src/openrct2/ride/Vehicle.cpp index aaa9e37770..6d50508bb5 100644 --- a/src/openrct2/ride/Vehicle.cpp +++ b/src/openrct2/ride/Vehicle.cpp @@ -7496,7 +7496,7 @@ void Vehicle::UpdateSceneryDoor() const { auto trackType = GetTrackType(); const auto& teDescriptor = GetTrackElementDescriptor(trackType); - const rct_preview_track* trackBlock = TrackBlocks[trackType]; + const rct_preview_track* trackBlock = teDescriptor.Block; while ((trackBlock + 1)->index != 255) { trackBlock++; @@ -7594,7 +7594,7 @@ void Vehicle::UpdateSceneryDoorBackwards() const { auto trackType = GetTrackType(); const auto& teDescriptor = GetTrackElementDescriptor(trackType); - const rct_preview_track* trackBlock = TrackBlocks[trackType]; + const rct_preview_track* trackBlock = teDescriptor.Block; const rct_track_coordinates* trackCoordinates = &teDescriptor.Coordinates; auto wallCoords = CoordsXYZ{ TrackLocation, TrackLocation.z - trackBlock->z + trackCoordinates->z_begin }; int32_t direction = (GetTrackDirection() + trackCoordinates->rotation_begin) & 3; diff --git a/src/openrct2/world/TileInspector.cpp b/src/openrct2/world/TileInspector.cpp index e4599bbbd5..f5e2632bce 100644 --- a/src/openrct2/world/TileInspector.cpp +++ b/src/openrct2/world/TileInspector.cpp @@ -37,6 +37,7 @@ TileCoordsXY windowTileInspectorTile; int32_t windowTileInspectorElementCount = 0; int32_t windowTileInspectorSelectedIndex; +using namespace OpenRCT2::TrackMetaData; namespace OpenRCT2::TileInspector { static bool SwapTileElements(const CoordsXY& loc, int16_t first, int16_t second) @@ -854,7 +855,8 @@ namespace OpenRCT2::TileInspector if (ride == nullptr) return std::make_unique(GameActions::Status::Unknown, STR_NONE); - auto trackBlock = TrackBlocks[type]; + const auto& teDescriptor = GetTrackElementDescriptor(type); + auto trackBlock = teDescriptor.Block; trackBlock += trackElement->AsTrack()->GetSequenceIndex(); uint8_t originDirection = trackElement->GetDirection(); @@ -866,7 +868,7 @@ namespace OpenRCT2::TileInspector originY = static_cast(coords.y); originZ -= trackBlock->z; - trackBlock = TrackBlocks[type]; + trackBlock = teDescriptor.Block; for (; trackBlock->index != 255; trackBlock++) { CoordsXYZD elem = { originX, originY, originZ + trackBlock->z, rotation }; @@ -937,7 +939,8 @@ namespace OpenRCT2::TileInspector if (ride == nullptr) return std::make_unique(GameActions::Status::Unknown, STR_NONE); - auto trackBlock = TrackBlocks[type]; + const auto& teDescriptor = GetTrackElementDescriptor(type); + auto trackBlock = teDescriptor.Block; trackBlock += trackElement->AsTrack()->GetSequenceIndex(); uint8_t originDirection = trackElement->GetDirection(); @@ -949,7 +952,7 @@ namespace OpenRCT2::TileInspector originY = static_cast(coords.y); originZ -= trackBlock->z; - trackBlock = TrackBlocks[type]; + trackBlock = teDescriptor.Block; for (; trackBlock->index != 255; trackBlock++) { CoordsXYZD elem = { originX, originY, originZ + trackBlock->z, rotation }; From a29b369ff8f21e7a3a1881d3d070db0566ef60b6 Mon Sep 17 00:00:00 2001 From: frutiemax Date: Sun, 22 Aug 2021 10:52:38 -0400 Subject: [PATCH 20/51] Part of #13874: Replace Sequence Element Wall table --- src/openrct2/actions/TrackPlaceAction.cpp | 7 +++---- src/openrct2/actions/WallPlaceAction.cpp | 4 +++- src/openrct2/ride/TrackData.cpp | 2 +- src/openrct2/ride/TrackData.h | 2 -- 4 files changed, 7 insertions(+), 8 deletions(-) diff --git a/src/openrct2/actions/TrackPlaceAction.cpp b/src/openrct2/actions/TrackPlaceAction.cpp index abc26b7e26..e6948a5619 100644 --- a/src/openrct2/actions/TrackPlaceAction.cpp +++ b/src/openrct2/actions/TrackPlaceAction.cpp @@ -400,11 +400,10 @@ GameActions::Result::Ptr TrackPlaceAction::Execute() const uint32_t rideTypeFlags = ride->GetRideTypeDescriptor().Flags; - const uint8_t(*wallEdges)[16]; - wallEdges = &TrackSequenceElementAllowedWallEdges[_trackType]; + const auto& teDescriptor = GetTrackElementDescriptor(_trackType); + auto wallEdges = teDescriptor.SequenceElementAllowedWallEdges; money32 cost = 0; - const auto& teDescriptor = GetTrackElementDescriptor(_trackType); const rct_preview_track* trackBlock = teDescriptor.Block; for (int32_t blockIndex = 0; trackBlock->index != 0xFF; trackBlock++, blockIndex++) { @@ -452,7 +451,7 @@ GameActions::Result::Ptr TrackPlaceAction::Execute() const else { // Remove walls in the directions this track intersects - uint8_t intersectingDirections = (*wallEdges)[blockIndex]; + uint8_t intersectingDirections = wallEdges[blockIndex]; intersectingDirections ^= 0x0F; intersectingDirections = rol4(intersectingDirections, _origin.direction); for (int32_t i = 0; i < NumOrthogonalDirections; i++) diff --git a/src/openrct2/actions/WallPlaceAction.cpp b/src/openrct2/actions/WallPlaceAction.cpp index a81bff4968..ed78773c68 100644 --- a/src/openrct2/actions/WallPlaceAction.cpp +++ b/src/openrct2/actions/WallPlaceAction.cpp @@ -20,6 +20,7 @@ #include "../world/Surface.h" #include "../world/Wall.h" +using namespace OpenRCT2::TrackMetaData; WallPlaceActionResult::WallPlaceActionResult() : GameActions::Result(GameActions::Status::Ok, STR_CANT_BUILD_THIS_HERE) { @@ -592,7 +593,8 @@ bool WallPlaceAction::TrackIsAllowedWallEdges( { if (!GetRideTypeDescriptor(rideType).HasFlag(RIDE_TYPE_FLAG_TRACK_NO_WALLS)) { - if (TrackSequenceElementAllowedWallEdges[trackType][trackSequence] & (1 << direction)) + const auto& teDescriptor = GetTrackElementDescriptor(trackType); + if (teDescriptor.SequenceElementAllowedWallEdges[trackSequence] & (1 << direction)) { return true; } diff --git a/src/openrct2/ride/TrackData.cpp b/src/openrct2/ride/TrackData.cpp index e6dacd20f8..256db9beaa 100644 --- a/src/openrct2/ride/TrackData.cpp +++ b/src/openrct2/ride/TrackData.cpp @@ -4587,7 +4587,7 @@ const static uint32_t TrackHeightMarkerPositions[TrackElemType::Count] = { }; /** rct2: 0x00999A94 */ -const uint8_t TrackSequenceElementAllowedWallEdges[TrackElemType::Count][MaxSequencesPerPiece] = { +const static uint8_t TrackSequenceElementAllowedWallEdges[TrackElemType::Count][MaxSequencesPerPiece] = { { 0b1010, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // TrackElemType::Flat { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // TrackElemType::EndStation { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // TrackElemType::BeginStation diff --git a/src/openrct2/ride/TrackData.h b/src/openrct2/ride/TrackData.h index e3c38f20fe..f95adeb9e2 100644 --- a/src/openrct2/ride/TrackData.h +++ b/src/openrct2/ride/TrackData.h @@ -57,8 +57,6 @@ constexpr const dodgems_track_size DodgemsTrackSize(track_type_t type) return { 0, 0, 0, 0 }; } -extern const uint8_t TrackSequenceElementAllowedWallEdges[TrackElemType::Count][16]; - struct TrackElementDescriptor { rct_track_coordinates Coordinates; From 046c060e7497218df9c484c8122c04492f6da05b Mon Sep 17 00:00:00 2001 From: frutiemax Date: Sun, 22 Aug 2021 11:18:38 -0400 Subject: [PATCH 21/51] Part of #13874: Replace Track Sequence properties --- src/openrct2-ui/windows/Ride.cpp | 4 +++- src/openrct2-ui/windows/TrackDesignPlace.cpp | 2 +- src/openrct2/actions/TrackPlaceAction.cpp | 6 ++--- src/openrct2/actions/TrackRemoveAction.cpp | 4 ++-- src/openrct2/actions/WallPlaceAction.cpp | 2 +- src/openrct2/ride/Ride.cpp | 25 +++++++++++++------- src/openrct2/ride/RideConstruction.cpp | 24 ++++++++++++------- src/openrct2/ride/TrackData.cpp | 2 +- src/openrct2/ride/TrackData.h | 2 -- src/openrct2/ride/Vehicle.cpp | 6 +++-- src/openrct2/world/Footpath.cpp | 17 ++++++++----- 11 files changed, 57 insertions(+), 37 deletions(-) diff --git a/src/openrct2-ui/windows/Ride.cpp b/src/openrct2-ui/windows/Ride.cpp index 352c565272..5fc066517d 100644 --- a/src/openrct2-ui/windows/Ride.cpp +++ b/src/openrct2-ui/windows/Ride.cpp @@ -59,6 +59,7 @@ #include using namespace OpenRCT2; +using namespace OpenRCT2::TrackMetaData; static constexpr const rct_string_id WINDOW_TITLE = STR_RIDE_WINDOW_TITLE; static constexpr const int32_t WH = 207; @@ -1368,7 +1369,8 @@ rct_window* window_ride_open_track(TileElement* tileElement) // Open ride window in station view auto trackElement = tileElement->AsTrack(); auto trackType = trackElement->GetTrackType(); - if (TrackSequenceProperties[trackType][0] & TRACK_SEQUENCE_FLAG_ORIGIN) + const auto& teDescriptor = GetTrackElementDescriptor(trackType); + if (teDescriptor.TrackSequenceProperties[0] & TRACK_SEQUENCE_FLAG_ORIGIN) { auto stationIndex = trackElement->GetStationIndex(); return window_ride_open_station(ride, stationIndex); diff --git a/src/openrct2-ui/windows/TrackDesignPlace.cpp b/src/openrct2-ui/windows/TrackDesignPlace.cpp index 5896be7fe1..3ca11449c2 100644 --- a/src/openrct2-ui/windows/TrackDesignPlace.cpp +++ b/src/openrct2-ui/windows/TrackDesignPlace.cpp @@ -574,7 +574,7 @@ static void window_track_place_draw_mini_preview_track( auto bits = trackBlock->var_08.Rotate(curTrackRotation & 3).GetBaseQuarterOccupied(); // Station track is a lighter colour - uint8_t colour = (TrackSequenceProperties[trackType][0] & TRACK_SEQUENCE_FLAG_ORIGIN) + uint8_t colour = (teDescriptor.TrackSequenceProperties[0] & TRACK_SEQUENCE_FLAG_ORIGIN) ? _PaletteIndexColourStation : _PaletteIndexColourTrack; diff --git a/src/openrct2/actions/TrackPlaceAction.cpp b/src/openrct2/actions/TrackPlaceAction.cpp index e6948a5619..21131a1c3c 100644 --- a/src/openrct2/actions/TrackPlaceAction.cpp +++ b/src/openrct2/actions/TrackPlaceAction.cpp @@ -318,7 +318,7 @@ GameActions::Result::Ptr TrackPlaceAction::Query() const } } - int32_t entranceDirections = TrackSequenceProperties[_trackType][0]; + int32_t entranceDirections = teDescriptor.TrackSequenceProperties[0]; if ((entranceDirections & TRACK_SEQUENCE_FLAG_ORIGIN) && trackBlock->index == 0) { if (!track_add_station_element({ mapLoc, baseZ, _origin.direction }, _rideIndex, 0, _fromTrackDesign)) @@ -538,7 +538,7 @@ GameActions::Result::Ptr TrackPlaceAction::Execute() const { if (!(GetFlags() & GAME_COMMAND_FLAG_NO_SPEND)) { - entranceDirections = TrackSequenceProperties[_trackType][0]; + entranceDirections = teDescriptor.TrackSequenceProperties[0]; } } @@ -597,7 +597,7 @@ GameActions::Result::Ptr TrackPlaceAction::Execute() const } trackElement->SetColourScheme(_colour); - entranceDirections = TrackSequenceProperties[_trackType][0]; + entranceDirections = teDescriptor.TrackSequenceProperties[0]; if (entranceDirections & TRACK_SEQUENCE_FLAG_CONNECTS_TO_PATH) { uint8_t availableDirections = entranceDirections & 0x0F; diff --git a/src/openrct2/actions/TrackRemoveAction.cpp b/src/openrct2/actions/TrackRemoveAction.cpp index 5db867f52b..5e084b109d 100644 --- a/src/openrct2/actions/TrackRemoveAction.cpp +++ b/src/openrct2/actions/TrackRemoveAction.cpp @@ -203,7 +203,7 @@ GameActions::Result::Ptr TrackRemoveAction::Query() const return MakeResult(GameActions::Status::Unknown, STR_RIDE_CONSTRUCTION_CANT_REMOVE_THIS); } - int32_t entranceDirections = TrackSequenceProperties[trackType][0]; + int32_t entranceDirections = teDescriptor.TrackSequenceProperties[0]; if (entranceDirections & TRACK_SEQUENCE_FLAG_ORIGIN && (tileElement->AsTrack()->GetSequenceIndex() == 0)) { if (!track_remove_station_element({ mapLoc, _origin.direction }, rideIndex, 0)) @@ -378,7 +378,7 @@ GameActions::Result::Ptr TrackRemoveAction::Execute() const return MakeResult(GameActions::Status::Unknown, STR_RIDE_CONSTRUCTION_CANT_REMOVE_THIS); } - int32_t entranceDirections = TrackSequenceProperties[trackType][0]; + int32_t entranceDirections = teDescriptor.TrackSequenceProperties[0]; if (entranceDirections & TRACK_SEQUENCE_FLAG_ORIGIN && (tileElement->AsTrack()->GetSequenceIndex() == 0)) { if (!track_remove_station_element({ mapLoc, _origin.direction }, rideIndex, 0)) diff --git a/src/openrct2/actions/WallPlaceAction.cpp b/src/openrct2/actions/WallPlaceAction.cpp index ed78773c68..7aa2244383 100644 --- a/src/openrct2/actions/WallPlaceAction.cpp +++ b/src/openrct2/actions/WallPlaceAction.cpp @@ -441,7 +441,7 @@ bool WallPlaceAction::WallCheckObstructionWithTrack( int32_t z; if (sequence == 0) { - if (TrackSequenceProperties[trackType][0] & TRACK_SEQUENCE_FLAG_DISALLOW_DOORS) + if (teDescriptor.TrackSequenceProperties[0] & TRACK_SEQUENCE_FLAG_DISALLOW_DOORS) { return false; } diff --git a/src/openrct2/ride/Ride.cpp b/src/openrct2/ride/Ride.cpp index c6dd1930de..b55da43d9e 100644 --- a/src/openrct2/ride/Ride.cpp +++ b/src/openrct2/ride/Ride.cpp @@ -410,10 +410,11 @@ bool ride_try_get_origin_element(const Ride* ride, CoordsXYE* output) // Found a track piece for target ride // Check if it's not the station or ??? (but allow end piece of station) + const auto& teDescriptor = GetTrackElementDescriptor(it.element->AsTrack()->GetTrackType()); bool specialTrackPiece = (it.element->AsTrack()->GetTrackType() != TrackElemType::BeginStation && it.element->AsTrack()->GetTrackType() != TrackElemType::MiddleStation - && (TrackSequenceProperties[it.element->AsTrack()->GetTrackType()][0] & TRACK_SEQUENCE_FLAG_ORIGIN)); + && (teDescriptor.TrackSequenceProperties[0] & TRACK_SEQUENCE_FLAG_ORIGIN)); // Set result tile to this track piece if first found track or a ??? if (resultTileElement == nullptr || specialTrackPiece) @@ -2228,7 +2229,8 @@ static void ride_shop_connected(Ride* ride) return; } - uint8_t entrance_directions = TrackSequenceProperties[track_type][0] & 0xF; + const auto& teDescriptor = GetTrackElementDescriptor(track_type); + uint8_t entrance_directions = teDescriptor.TrackSequenceProperties[0] & 0xF; uint8_t tile_direction = trackElement->GetDirection(); entrance_directions = rol4(entrance_directions, tile_direction); @@ -2772,7 +2774,8 @@ static int32_t ride_check_station_length(CoordsXYE* input, CoordsXYE* output) do { - if (TrackSequenceProperties[output->element->AsTrack()->GetTrackType()][0] & TRACK_SEQUENCE_FLAG_ORIGIN) + const auto& teDescriptor = GetTrackElementDescriptor(output->element->AsTrack()->GetTrackType()); + if (teDescriptor.TrackSequenceProperties[0] & TRACK_SEQUENCE_FLAG_ORIGIN) { num_station_elements++; last_good_station = *output; @@ -2819,7 +2822,8 @@ static bool ride_check_start_and_end_is_station(CoordsXYE* input) // Check back of the track track_get_back(input, &trackBack); auto trackType = trackBack.element->AsTrack()->GetTrackType(); - if (!(TrackSequenceProperties[trackType][0] & TRACK_SEQUENCE_FLAG_ORIGIN)) + auto teDescriptor = GetTrackElementDescriptor(trackType); + if (!(teDescriptor.TrackSequenceProperties[0] & TRACK_SEQUENCE_FLAG_ORIGIN)) { return false; } @@ -2828,7 +2832,8 @@ static bool ride_check_start_and_end_is_station(CoordsXYE* input) // Check front of the track track_get_front(input, &trackFront); trackType = trackFront.element->AsTrack()->GetTrackType(); - if (!(TrackSequenceProperties[trackType][0] & TRACK_SEQUENCE_FLAG_ORIGIN)) + teDescriptor = GetTrackElementDescriptor(trackType); + if (!(teDescriptor.TrackSequenceProperties[0] & TRACK_SEQUENCE_FLAG_ORIGIN)) { return false; } @@ -3539,7 +3544,8 @@ static bool ride_initialise_cable_lift_track(Ride* ride, bool isApplying) if (tileElement->GetBaseZ() != location.z) continue; - if (!(TrackSequenceProperties[tileElement->AsTrack()->GetTrackType()][0] & TRACK_SEQUENCE_FLAG_ORIGIN)) + const auto& teDescriptor = GetTrackElementDescriptor(tileElement->AsTrack()->GetTrackType()); + if (!(teDescriptor.TrackSequenceProperties[0] & TRACK_SEQUENCE_FLAG_ORIGIN)) { continue; } @@ -3771,8 +3777,8 @@ TrackElement* Ride::GetOriginElement(StationIndex stationIndex) const continue; auto* trackElement = tileElement->AsTrack(); - - if (!(TrackSequenceProperties[trackElement->GetTrackType()][0] & TRACK_SEQUENCE_FLAG_ORIGIN)) + const auto& teDescriptor = GetTrackElementDescriptor(trackElement->GetTrackType()); + if (!(teDescriptor.TrackSequenceProperties[0] & TRACK_SEQUENCE_FLAG_ORIGIN)) continue; if (trackElement->GetRideIndex() == id) @@ -4878,7 +4884,8 @@ static int32_t ride_get_track_length(Ride* ride) continue; trackType = tileElement->AsTrack()->GetTrackType(); - if (!(TrackSequenceProperties[trackType][0] & TRACK_SEQUENCE_FLAG_ORIGIN)) + const auto& teDescriptor = GetTrackElementDescriptor(trackType); + if (!(teDescriptor.TrackSequenceProperties[0] & TRACK_SEQUENCE_FLAG_ORIGIN)) continue; if (tileElement->GetBaseZ() != trackStart.z) diff --git a/src/openrct2/ride/RideConstruction.cpp b/src/openrct2/ride/RideConstruction.cpp index 8f0a5975f5..5b3bb6a432 100644 --- a/src/openrct2/ride/RideConstruction.cpp +++ b/src/openrct2/ride/RideConstruction.cpp @@ -43,6 +43,7 @@ #include "TrainManager.h" #include "Vehicle.h" +using namespace OpenRCT2::TrackMetaData; bool gGotoStartPlacementMode = false; money16 gTotalRideValueForMoney; @@ -1253,7 +1254,8 @@ CoordsXYZD ride_get_entrance_or_exit_position_from_screen_position(const ScreenC { if (info.Element->AsTrack()->GetRideIndex() == gRideEntranceExitPlaceRideIndex) { - if (TrackSequenceProperties[info.Element->AsTrack()->GetTrackType()][0] & TRACK_SEQUENCE_FLAG_ORIGIN) + const auto& teDescriptor = GetTrackElementDescriptor(info.Element->AsTrack()->GetTrackType()); + if (teDescriptor.TrackSequenceProperties[0] & TRACK_SEQUENCE_FLAG_ORIGIN) { if (info.Element->AsTrack()->GetTrackType() == TrackElemType::Maze) { @@ -1343,9 +1345,8 @@ CoordsXYZD ride_get_entrance_or_exit_position_from_screen_position(const ScreenC int32_t eax = (entranceExitCoords.direction + 2 - tileElement->GetDirection()) & TILE_ELEMENT_DIRECTION_MASK; - if (TrackSequenceProperties[tileElement->AsTrack()->GetTrackType()] - [tileElement->AsTrack()->GetSequenceIndex()] - & (1 << eax)) + const auto& teDescriptor = GetTrackElementDescriptor(tileElement->AsTrack()->GetTrackType()); + if (teDescriptor.TrackSequenceProperties[tileElement->AsTrack()->GetSequenceIndex()] & (1 << eax)) { entranceExitCoords.direction = direction_reverse(entranceExitCoords.direction); gRideEntranceExitPlaceDirection = entranceExitCoords.direction; @@ -1438,6 +1439,7 @@ CoordsXYZD ride_get_entrance_or_exit_position_from_screen_position(const ScreenC */ void sub_6CB945(Ride* ride) { + TrackElementDescriptor teDescriptor; if (ride->type != RIDE_TYPE_MAZE) { for (StationIndex stationId = 0; stationId < MAX_STATIONS; ++stationId) @@ -1450,7 +1452,6 @@ void sub_6CB945(Ride* ride) bool specialTrack = false; TileElement* tileElement = nullptr; - while (true) { if (direction != INVALID_DIRECTION) @@ -1473,7 +1474,9 @@ void sub_6CB945(Ride* ride) continue; if (tileElement->AsTrack()->GetSequenceIndex() != 0) continue; - if (!(TrackSequenceProperties[tileElement->AsTrack()->GetTrackType()][0] & TRACK_SEQUENCE_FLAG_ORIGIN)) + + teDescriptor = GetTrackElementDescriptor(tileElement->AsTrack()->GetTrackType()); + if (!(teDescriptor.TrackSequenceProperties[0] & TRACK_SEQUENCE_FLAG_ORIGIN)) continue; trackFound = true; @@ -1500,7 +1503,7 @@ void sub_6CB945(Ride* ride) continue; } - const auto& teDescriptor = GetTrackElementDescriptor(tileElement->AsTrack()->GetTrackType()); + teDescriptor = GetTrackElementDescriptor(tileElement->AsTrack()->GetTrackType()); const rct_preview_track* trackBlock = teDescriptor.Block; while ((++trackBlock)->index != 0xFF) { @@ -1516,7 +1519,9 @@ void sub_6CB945(Ride* ride) continue; if (tileElement->GetType() != TILE_ELEMENT_TYPE_TRACK) continue; - if (!(TrackSequenceProperties[tileElement->AsTrack()->GetTrackType()][0] & TRACK_SEQUENCE_FLAG_ORIGIN)) + + teDescriptor = GetTrackElementDescriptor(tileElement->AsTrack()->GetTrackType()); + if (!(teDescriptor.TrackSequenceProperties[0] & TRACK_SEQUENCE_FLAG_ORIGIN)) continue; trackFound = true; @@ -1611,7 +1616,8 @@ void sub_6CB945(Ride* ride) Direction direction = (tileElement->GetDirection() - direction_reverse(trackElement->GetDirection())) & 3; - if (!(TrackSequenceProperties[trackType][trackSequence] & (1 << direction))) + teDescriptor = GetTrackElementDescriptor(trackType); + if (!(teDescriptor.TrackSequenceProperties[trackSequence] & (1 << direction))) { continue; } diff --git a/src/openrct2/ride/TrackData.cpp b/src/openrct2/ride/TrackData.cpp index 256db9beaa..0ab32b5984 100644 --- a/src/openrct2/ride/TrackData.cpp +++ b/src/openrct2/ride/TrackData.cpp @@ -287,7 +287,7 @@ const static rct_track_coordinates TrackCoordinates[TrackElemType::Count] = { }; /** rct2: 0x0099BA64 */ -const uint8_t TrackSequenceProperties[][MaxSequencesPerPiece] = { +const static uint8_t TrackSequenceProperties[][MaxSequencesPerPiece] = { { 0 }, /* TrackElemType::EndStation */ { TRACK_SEQUENCE_FLAG_DIRECTION_1 | TRACK_SEQUENCE_FLAG_DIRECTION_3 | TRACK_SEQUENCE_FLAG_ORIGIN | TRACK_SEQUENCE_FLAG_DISALLOW_DOORS, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, /* TrackElemType::BeginStation */ { TRACK_SEQUENCE_FLAG_DIRECTION_1 | TRACK_SEQUENCE_FLAG_DIRECTION_3 | TRACK_SEQUENCE_FLAG_ORIGIN | TRACK_SEQUENCE_FLAG_DISALLOW_DOORS, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, diff --git a/src/openrct2/ride/TrackData.h b/src/openrct2/ride/TrackData.h index f95adeb9e2..9e41660b5c 100644 --- a/src/openrct2/ride/TrackData.h +++ b/src/openrct2/ride/TrackData.h @@ -17,8 +17,6 @@ constexpr const uint8_t MaxSequencesPerPiece = 16; // 0x009968BB, 0x009968BC, 0x009968BD, 0x009968BF, 0x009968C1, 0x009968C3 -extern const uint8_t TrackSequenceProperties[TrackElemType::Count][MaxSequencesPerPiece]; - struct track_curve_chain { int32_t next; diff --git a/src/openrct2/ride/Vehicle.cpp b/src/openrct2/ride/Vehicle.cpp index 6d50508bb5..e4258fe342 100644 --- a/src/openrct2/ride/Vehicle.cpp +++ b/src/openrct2/ride/Vehicle.cpp @@ -7933,7 +7933,8 @@ void Vehicle::Sub6DBF3E() } auto trackType = GetTrackType(); - if (!(TrackSequenceProperties[trackType][0] & TRACK_SEQUENCE_FLAG_ORIGIN)) + const auto& teDescriptor = GetTrackElementDescriptor(trackType); + if (!(teDescriptor.TrackSequenceProperties[0] & TRACK_SEQUENCE_FLAG_ORIGIN)) { return; } @@ -9208,7 +9209,8 @@ loc_6DCE02: } { auto trackType = GetTrackType(); - if (!(TrackSequenceProperties[trackType][0] & TRACK_SEQUENCE_FLAG_ORIGIN)) + const auto& teDescriptor = GetTrackElementDescriptor(trackType); + if (!(teDescriptor.TrackSequenceProperties[0] & TRACK_SEQUENCE_FLAG_ORIGIN)) { return; } diff --git a/src/openrct2/world/Footpath.cpp b/src/openrct2/world/Footpath.cpp index c155e3cc7d..33c520a3e6 100644 --- a/src/openrct2/world/Footpath.cpp +++ b/src/openrct2/world/Footpath.cpp @@ -38,6 +38,7 @@ #include #include +using namespace OpenRCT2::TrackMetaData; void footpath_update_queue_entrance_banner(const CoordsXY& footpathPos, TileElement* tileElement); ProvisionalFootpath gProvisionalFootpath; @@ -880,13 +881,15 @@ static void loc_6A6D7E( const auto trackType = tileElement->AsTrack()->GetTrackType(); const uint8_t trackSequence = tileElement->AsTrack()->GetSequenceIndex(); - if (!(TrackSequenceProperties[trackType][trackSequence] & TRACK_SEQUENCE_FLAG_CONNECTS_TO_PATH)) + const auto& teDescriptor = GetTrackElementDescriptor(trackType); + if (!(teDescriptor.TrackSequenceProperties[trackSequence] & TRACK_SEQUENCE_FLAG_CONNECTS_TO_PATH)) { return; } uint16_t dx = direction_reverse( (direction - tileElement->GetDirection()) & TILE_ELEMENT_DIRECTION_MASK); - if (!(TrackSequenceProperties[trackType][trackSequence] & (1 << dx))) + + if (!(teDescriptor.TrackSequenceProperties[trackSequence] & (1 << dx))) { return; } @@ -962,12 +965,13 @@ static void loc_6A6C85( const auto trackType = tileElementPos.element->AsTrack()->GetTrackType(); const uint8_t trackSequence = tileElementPos.element->AsTrack()->GetSequenceIndex(); - if (!(TrackSequenceProperties[trackType][trackSequence] & TRACK_SEQUENCE_FLAG_CONNECTS_TO_PATH)) + const auto& teDescriptor = GetTrackElementDescriptor(trackType); + if (!(teDescriptor.TrackSequenceProperties[trackSequence] & TRACK_SEQUENCE_FLAG_CONNECTS_TO_PATH)) { return; } uint16_t dx = (direction - tileElementPos.element->GetDirection()) & TILE_ELEMENT_DIRECTION_MASK; - if (!(TrackSequenceProperties[trackType][trackSequence] & (1 << dx))) + if (!(teDescriptor.TrackSequenceProperties[trackSequence] & (1 << dx))) { return; } @@ -2103,10 +2107,11 @@ bool tile_element_wants_path_connection_towards(const TileCoordsXYZD& coords, co const auto trackType = tileElement->AsTrack()->GetTrackType(); const uint8_t trackSequence = tileElement->AsTrack()->GetSequenceIndex(); - if (TrackSequenceProperties[trackType][trackSequence] & TRACK_SEQUENCE_FLAG_CONNECTS_TO_PATH) + const auto& teDescriptor = GetTrackElementDescriptor(trackType); + if (teDescriptor.TrackSequenceProperties[trackSequence] & TRACK_SEQUENCE_FLAG_CONNECTS_TO_PATH) { uint16_t dx = ((coords.direction - tileElement->GetDirection()) & TILE_ELEMENT_DIRECTION_MASK); - if (TrackSequenceProperties[trackType][trackSequence] & (1 << dx)) + if (teDescriptor.TrackSequenceProperties[trackSequence] & (1 << dx)) { // Track element has the flags required for the given direction return true; From cdf1c3b1b81d49bd76f5a43ebb56141d2b20f1c2 Mon Sep 17 00:00:00 2001 From: duncanspumpkin Date: Thu, 26 Aug 2021 12:44:26 +0100 Subject: [PATCH 22/51] Move s6 into rct2 header --- src/openrct2/rct2/RCT2.h | 251 +++++++++++++++++++++++++++++ src/openrct2/rct2/S6Exporter.cpp | 96 +++++++++++ src/openrct2/scenario/Scenario.cpp | 96 ----------- src/openrct2/scenario/Scenario.h | 249 ---------------------------- 4 files changed, 347 insertions(+), 345 deletions(-) diff --git a/src/openrct2/rct2/RCT2.h b/src/openrct2/rct2/RCT2.h index 85b4999605..14becf9d7d 100644 --- a/src/openrct2/rct2/RCT2.h +++ b/src/openrct2/rct2/RCT2.h @@ -15,6 +15,7 @@ #include "../rct12/RCT12.h" #include "../ride/RideRatings.h" #include "../ride/VehicleColour.h" +#include "../world/EntityList.h" #include @@ -37,6 +38,8 @@ constexpr const uint8_t RCT2_MAX_RESEARCHED_RIDE_ENTRY_QUADS = 8; // With 32 bit constexpr const uint8_t RCT2_MAX_RESEARCHED_SCENERY_ITEM_QUADS = 56; constexpr const uint16_t RCT2_MAX_RESEARCHED_SCENERY_ITEMS = (RCT2_MAX_RESEARCHED_SCENERY_ITEM_QUADS * 32); // There are 32 bits // per quad. +constexpr const uint16_t RCT2_MAX_RESEARCH_ITEMS = 500; + constexpr uint16_t TD6MaxTrackElements = 8192; constexpr const uint8_t RCT2_MAX_SMALL_SCENERY_OBJECTS = 252; @@ -786,6 +789,254 @@ struct RCT2RideRatingCalculationData }; assert_struct_size(RCT2RideRatingCalculationData, 76); +/** + * SV6/SC6 header chunk + * size: 0x20 + */ +struct rct_s6_header +{ + uint8_t type; // 0x00 + uint8_t classic_flag; // 0x01 + uint16_t num_packed_objects; // 0x02 + uint32_t version; // 0x04 + uint32_t magic_number; // 0x08 + uint8_t pad_0C[0x14]; +}; +assert_struct_size(rct_s6_header, 0x20); + +enum class EditorStep : uint8_t; + +/** + * SC6 information chunk + * size: 0x198 + */ +struct rct_s6_info +{ + EditorStep editor_step; + uint8_t category; // 0x01 + uint8_t objective_type; // 0x02 + uint8_t objective_arg_1; // 0x03 + int32_t objective_arg_2; // 0x04 + int16_t objective_arg_3; // 0x08 + uint8_t pad_00A[0x3E]; + char name[64]; // 0x48 + char details[256]; // 0x88 + rct_object_entry entry; // 0x188 +}; +assert_struct_size(rct_s6_info, 0x198); + +struct rct_s6_data +{ + // SC6[0] + rct_s6_header header; + + // SC6[1] + rct_s6_info info; + + // SC6[2] + // packed objects + + // SC6[3] + rct_object_entry objects[RCT2_OBJECT_ENTRY_COUNT]; + + // SC6[4] + uint16_t elapsed_months; + uint16_t current_day; + uint32_t scenario_ticks; + uint32_t scenario_srand_0; + uint32_t scenario_srand_1; + + // SC6[5] + RCT12TileElement tile_elements[RCT2_MAX_TILE_ELEMENTS]; + + // SC6[6] + uint32_t next_free_tile_element_pointer_index; + RCT2Sprite sprites[RCT2_MAX_SPRITES]; + uint16_t sprite_lists_head[static_cast(EntityListId::Count)]; + uint16_t sprite_lists_count[static_cast(EntityListId::Count)]; + rct_string_id park_name; + uint8_t pad_013573D6[2]; + uint32_t park_name_args; + money32 initial_cash; + money32 current_loan; + uint32_t park_flags; + money16 park_entrance_fee; + uint16_t rct1_park_entrance_x; + uint16_t rct1_park_entrance_y; + uint8_t pad_013573EE[2]; + uint8_t rct1_park_entrance_z; + uint8_t pad_013573F1; + rct12_peep_spawn peep_spawns[RCT12_MAX_PEEP_SPAWNS]; + uint8_t guest_count_change_modifier; + uint8_t current_research_level; + uint8_t pad_01357400[4]; + uint32_t researched_ride_types[RCT2_MAX_RESEARCHED_RIDE_TYPE_QUADS]; + uint32_t researched_ride_entries[RCT2_MAX_RESEARCHED_RIDE_ENTRY_QUADS]; + uint32_t researched_track_types_a[128]; + uint32_t researched_track_types_b[128]; + + // SC6[7] + uint16_t guests_in_park; + uint16_t guests_heading_for_park; + + // Ignored in scenario + money32 expenditure_table[RCT12_EXPENDITURE_TABLE_MONTH_COUNT][RCT12_EXPENDITURE_TYPE_COUNT]; + + // SC6[8] + uint16_t last_guests_in_park; + uint8_t pad_01357BCA[3]; + uint8_t handyman_colour; + uint8_t mechanic_colour; + uint8_t security_colour; + + // Ignored in scenario + uint32_t researched_scenery_items[RCT2_MAX_RESEARCHED_SCENERY_ITEM_QUADS]; + + // SC6[9] + uint16_t park_rating; + + // Ignored in scenario + uint8_t park_rating_history[32]; + uint8_t guests_in_park_history[32]; + + // SC6[10] + uint8_t active_research_types; + uint8_t research_progress_stage; + uint32_t last_researched_item_subject; + uint8_t pad_01357CF8[1000]; + uint32_t next_research_item; + uint16_t research_progress; + uint8_t next_research_category; + uint8_t next_research_expected_day; + uint8_t next_research_expected_month; + uint8_t guest_initial_happiness; + uint16_t park_size; + uint16_t guest_generation_probability; + uint16_t total_ride_value_for_money; + money32 maximum_loan; + money16 guest_initial_cash; + uint8_t guest_initial_hunger; + uint8_t guest_initial_thirst; + uint8_t objective_type; + uint8_t objective_year; + uint8_t pad_013580FA[2]; + money32 objective_currency; + uint16_t objective_guests; + uint8_t campaign_weeks_left[20]; + uint8_t campaign_ride_index[22]; + + // Ignored in scenario + money32 balance_history[RCT12_FINANCE_GRAPH_SIZE]; + + // SC6[11] + money32 current_expenditure; + money32 current_profit; + money32 weekly_profit_average_dividend; + uint16_t weekly_profit_average_divisor; + uint8_t pad_0135833A[2]; + + // Ignored in scenario + money32 weekly_profit_history[RCT12_FINANCE_GRAPH_SIZE]; + + // SC6[12] + money32 park_value; + + // Ignored in scenario + money32 park_value_history[RCT12_FINANCE_GRAPH_SIZE]; + + // SC6[13] + money32 completed_company_value; + uint32_t total_admissions; + money32 income_from_admissions; + money32 company_value; + uint8_t peep_warning_throttle[16]; + rct12_award awards[RCT12_MAX_AWARDS]; + money16 land_price; + money16 construction_rights_price; + uint16_t word_01358774; + uint8_t pad_01358776[2]; + uint32_t cd_key; + uint8_t pad_0135877C[64]; + uint32_t game_version_number; + money32 completed_company_value_record; + uint32_t loan_hash; + uint16_t ride_count; + uint8_t pad_013587CA[6]; + money32 historical_profit; + uint8_t pad_013587D4[4]; + char scenario_completed_name[32]; + money32 cash; + uint8_t pad_013587FC[50]; + uint16_t park_rating_casualty_penalty; + uint16_t map_size_units; + uint16_t map_size_minus_2; + uint16_t map_size; + uint16_t map_max_xy; + uint32_t same_price_throughout; + uint16_t suggested_max_guests; + uint16_t park_rating_warning_days; + uint8_t last_entrance_style; + uint8_t rct1_water_colour; + uint8_t pad_01358842[2]; + RCT12ResearchItem research_items[RCT2_MAX_RESEARCH_ITEMS]; + uint16_t map_base_z; + char scenario_name[64]; + char scenario_description[256]; + uint8_t current_interest_rate; + uint8_t pad_0135934B; + uint32_t same_price_throughout_extended; + int16_t park_entrance_x[RCT12_MAX_PARK_ENTRANCES]; + int16_t park_entrance_y[RCT12_MAX_PARK_ENTRANCES]; + int16_t park_entrance_z[RCT12_MAX_PARK_ENTRANCES]; + uint8_t park_entrance_direction[RCT12_MAX_PARK_ENTRANCES]; + char scenario_filename[256]; + uint8_t saved_expansion_pack_names[3256]; + 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]; + uint16_t saved_age; + int16_t saved_view_x; + int16_t saved_view_y; + uint8_t saved_view_zoom; + uint8_t saved_view_rotation; + RCT12MapAnimation map_animations[RCT2_MAX_ANIMATED_OBJECTS]; + uint16_t num_map_animations; + uint8_t pad_0138B582[2]; + RCT2RideRatingCalculationData ride_ratings_calc_data; + uint8_t pad_0138B5D0[60]; + RCT12RideMeasurement ride_measurements[8]; + uint32_t next_guest_index; + uint16_t grass_and_scenery_tilepos; + uint32_t patrol_areas[(RCT2_MAX_STAFF + RCT12_STAFF_TYPE_COUNT) * RCT12_PATROL_AREA_SIZE]; + uint8_t staff_modes[RCT2_MAX_STAFF + RCT12_STAFF_TYPE_COUNT]; + uint8_t pad_13CA73E; + uint8_t pad_13CA73F; + uint8_t byte_13CA740; + uint8_t pad_13CA741; + uint8_t byte_13CA742[4]; // unused + uint8_t climate; + uint8_t pad_013CA747; + uint16_t climate_update_timer; + uint8_t current_weather; + uint8_t next_weather; + uint8_t temperature; + uint8_t next_temperature; + uint8_t current_weather_effect; + uint8_t next_weather_effect; + uint8_t current_weather_gloom; + uint8_t next_weather_gloom; + uint8_t current_weather_level; + uint8_t next_weather_level; + rct12_news_item news_items[RCT12_MAX_NEWS_ITEMS]; + char rct1_scenario_name[62]; // Unused in RCT2 + uint16_t rct1_scenario_slot_index; // Unused in RCT2 + uint32_t rct1_scenario_flags; // Unused in RCT2 + uint16_t wide_path_tile_loop_x; + uint16_t wide_path_tile_loop_y; + uint8_t pad_13CE778[434]; +}; +assert_struct_size(rct_s6_data, 0x46b44a); #pragma pack(pop) std::vector DecryptSea(const fs::path& path); diff --git a/src/openrct2/rct2/S6Exporter.cpp b/src/openrct2/rct2/S6Exporter.cpp index 0639cde023..0f3dbd1aef 100644 --- a/src/openrct2/rct2/S6Exporter.cpp +++ b/src/openrct2/rct2/S6Exporter.cpp @@ -159,6 +159,102 @@ void S6Exporter::Save(OpenRCT2::IStream* stream, bool isScenario) stream->WriteValue(checksum); } +static void ride_all_has_any_track_elements(std::array& rideIndexArray) +{ + tile_element_iterator it; + tile_element_iterator_begin(&it); + while (tile_element_iterator_next(&it)) + { + if (it.element->GetType() != TILE_ELEMENT_TYPE_TRACK) + continue; + if (it.element->IsGhost()) + continue; + + rideIndexArray[it.element->AsTrack()->GetRideIndex()] = true; + } +} + +static void scenario_remove_trackless_rides(rct_s6_data* s6) +{ + std::array rideHasTrack{}; + ride_all_has_any_track_elements(rideHasTrack); + for (int32_t i = 0; i < RCT12_MAX_RIDES_IN_PARK; i++) + { + auto ride = &s6->rides[i]; + if (rideHasTrack[i] || ride->type == RIDE_TYPE_NULL) + { + continue; + } + + ride->type = RIDE_TYPE_NULL; + if (is_user_string_id(ride->name)) + { + s6->custom_strings[(ride->name % RCT12_MAX_USER_STRINGS)][0] = 0; + } + } +} + +/** + * Modifies the given S6 data so that ghost elements, rides with no track elements or unused banners / user strings are saved. + */ +static void scenario_fix_ghosts(rct_s6_data* s6) +{ + // Build tile pointer cache (needed to get the first element at a certain location) + RCT12TileElement* tilePointers[MAX_TILE_TILE_ELEMENT_POINTERS]; + for (size_t i = 0; i < MAX_TILE_TILE_ELEMENT_POINTERS; i++) + { + tilePointers[i] = TILE_UNDEFINED_TILE_ELEMENT; + } + + RCT12TileElement* tileElement = s6->tile_elements; + RCT12TileElement** tile = tilePointers; + for (size_t y = 0; y < MAXIMUM_MAP_SIZE_TECHNICAL; y++) + { + for (size_t x = 0; x < MAXIMUM_MAP_SIZE_TECHNICAL; x++) + { + *tile++ = tileElement; + while (!(tileElement++)->IsLastForTile()) + ; + } + } + + // Remove all ghost elements + RCT12TileElement* destinationElement = s6->tile_elements; + + for (int32_t y = 0; y < MAXIMUM_MAP_SIZE_TECHNICAL; y++) + { + for (int32_t x = 0; x < MAXIMUM_MAP_SIZE_TECHNICAL; x++) + { + // This is the equivalent of map_get_first_element_at(x, y), but on S6 data. + RCT12TileElement* originalElement = tilePointers[x + y * MAXIMUM_MAP_SIZE_TECHNICAL]; + do + { + if (originalElement->IsGhost()) + { + uint8_t bannerIndex = originalElement->GetBannerIndex(); + if (bannerIndex != RCT12_BANNER_INDEX_NULL) + { + auto banner = &s6->banners[bannerIndex]; + if (banner->type != RCT12_OBJECT_ENTRY_INDEX_NULL) + { + banner->type = RCT12_OBJECT_ENTRY_INDEX_NULL; + if (is_user_string_id(banner->string_idx)) + s6->custom_strings[(banner->string_idx % RCT12_MAX_USER_STRINGS)][0] = 0; + } + } + } + else + { + *destinationElement++ = *originalElement; + } + } while (!(originalElement++)->IsLastForTile()); + + // Set last element flag in case the original last element was never added + (destinationElement - 1)->flags |= TILE_ELEMENT_FLAG_LAST_TILE; + } + } +} + void S6Exporter::Export() { _s6.info = {}; diff --git a/src/openrct2/scenario/Scenario.cpp b/src/openrct2/scenario/Scenario.cpp index 8f840df3f9..c6ce4644e7 100644 --- a/src/openrct2/scenario/Scenario.cpp +++ b/src/openrct2/scenario/Scenario.cpp @@ -598,102 +598,6 @@ bool scenario_prepare_for_save() return true; } -/** - * Modifies the given S6 data so that ghost elements, rides with no track elements or unused banners / user strings are saved. - */ -void scenario_fix_ghosts(rct_s6_data* s6) -{ - // Build tile pointer cache (needed to get the first element at a certain location) - RCT12TileElement* tilePointers[MAX_TILE_TILE_ELEMENT_POINTERS]; - for (size_t i = 0; i < MAX_TILE_TILE_ELEMENT_POINTERS; i++) - { - tilePointers[i] = TILE_UNDEFINED_TILE_ELEMENT; - } - - RCT12TileElement* tileElement = s6->tile_elements; - RCT12TileElement** tile = tilePointers; - for (size_t y = 0; y < MAXIMUM_MAP_SIZE_TECHNICAL; y++) - { - for (size_t x = 0; x < MAXIMUM_MAP_SIZE_TECHNICAL; x++) - { - *tile++ = tileElement; - while (!(tileElement++)->IsLastForTile()) - ; - } - } - - // Remove all ghost elements - RCT12TileElement* destinationElement = s6->tile_elements; - - for (int32_t y = 0; y < MAXIMUM_MAP_SIZE_TECHNICAL; y++) - { - for (int32_t x = 0; x < MAXIMUM_MAP_SIZE_TECHNICAL; x++) - { - // This is the equivalent of map_get_first_element_at(x, y), but on S6 data. - RCT12TileElement* originalElement = tilePointers[x + y * MAXIMUM_MAP_SIZE_TECHNICAL]; - do - { - if (originalElement->IsGhost()) - { - uint8_t bannerIndex = originalElement->GetBannerIndex(); - if (bannerIndex != RCT12_BANNER_INDEX_NULL) - { - auto banner = &s6->banners[bannerIndex]; - if (banner->type != RCT12_OBJECT_ENTRY_INDEX_NULL) - { - banner->type = RCT12_OBJECT_ENTRY_INDEX_NULL; - if (is_user_string_id(banner->string_idx)) - s6->custom_strings[(banner->string_idx % RCT12_MAX_USER_STRINGS)][0] = 0; - } - } - } - else - { - *destinationElement++ = *originalElement; - } - } while (!(originalElement++)->IsLastForTile()); - - // Set last element flag in case the original last element was never added - (destinationElement - 1)->flags |= TILE_ELEMENT_FLAG_LAST_TILE; - } - } -} - -static void ride_all_has_any_track_elements(std::array& rideIndexArray) -{ - tile_element_iterator it; - tile_element_iterator_begin(&it); - while (tile_element_iterator_next(&it)) - { - if (it.element->GetType() != TILE_ELEMENT_TYPE_TRACK) - continue; - if (it.element->IsGhost()) - continue; - - rideIndexArray[it.element->AsTrack()->GetRideIndex()] = true; - } -} - -void scenario_remove_trackless_rides(rct_s6_data* s6) -{ - std::array rideHasTrack{}; - ride_all_has_any_track_elements(rideHasTrack); - for (int32_t i = 0; i < RCT12_MAX_RIDES_IN_PARK; i++) - { - auto ride = &s6->rides[i]; - if (rideHasTrack[i] || ride->type == RIDE_TYPE_NULL) - { - continue; - } - - ride->type = RIDE_TYPE_NULL; - if (is_user_string_id(ride->name)) - { - s6->custom_strings[(ride->name % RCT12_MAX_USER_STRINGS)][0] = 0; - } - } -} - ObjectiveStatus Objective::CheckGuestsBy() const { auto parkRating = gParkRating; diff --git a/src/openrct2/scenario/Scenario.h b/src/openrct2/scenario/Scenario.h index d350236d5d..1c6727146e 100644 --- a/src/openrct2/scenario/Scenario.h +++ b/src/openrct2/scenario/Scenario.h @@ -31,39 +31,6 @@ enum class EditorStep : uint8_t; struct ParkLoadResult; #pragma pack(push, 1) -/** - * SV6/SC6 header chunk - * size: 0x20 - */ -struct rct_s6_header -{ - uint8_t type; // 0x00 - uint8_t classic_flag; // 0x01 - uint16_t num_packed_objects; // 0x02 - uint32_t version; // 0x04 - uint32_t magic_number; // 0x08 - uint8_t pad_0C[0x14]; -}; -assert_struct_size(rct_s6_header, 0x20); - -/** - * SC6 information chunk - * size: 0x198 - */ -struct rct_s6_info -{ - EditorStep editor_step; - uint8_t category; // 0x01 - uint8_t objective_type; // 0x02 - uint8_t objective_arg_1; // 0x03 - int32_t objective_arg_2; // 0x04 - int16_t objective_arg_3; // 0x08 - uint8_t pad_00A[0x3E]; - char name[64]; // 0x48 - char details[256]; // 0x88 - rct_object_entry entry; // 0x188 -}; -assert_struct_size(rct_s6_info, 0x198); enum class ScenarioSource : uint8_t { @@ -85,220 +52,6 @@ struct rct_stex_entry uint8_t var_06; }; assert_struct_size(rct_stex_entry, 7); - -// This will be useful for backwards compatibility -struct rct_s6_data -{ - // SC6[0] - rct_s6_header header; - - // SC6[1] - rct_s6_info info; - - // SC6[2] - // packed objects - - // SC6[3] - rct_object_entry objects[RCT2_OBJECT_ENTRY_COUNT]; - - // SC6[4] - uint16_t elapsed_months; - uint16_t current_day; - uint32_t scenario_ticks; - uint32_t scenario_srand_0; - uint32_t scenario_srand_1; - - // SC6[5] - RCT12TileElement tile_elements[RCT2_MAX_TILE_ELEMENTS]; - - // SC6[6] - uint32_t next_free_tile_element_pointer_index; - RCT2Sprite sprites[RCT2_MAX_SPRITES]; - uint16_t sprite_lists_head[static_cast(EntityListId::Count)]; - uint16_t sprite_lists_count[static_cast(EntityListId::Count)]; - rct_string_id park_name; - uint8_t pad_013573D6[2]; - uint32_t park_name_args; - money32 initial_cash; - money32 current_loan; - uint32_t park_flags; - money16 park_entrance_fee; - uint16_t rct1_park_entrance_x; - uint16_t rct1_park_entrance_y; - uint8_t pad_013573EE[2]; - uint8_t rct1_park_entrance_z; - uint8_t pad_013573F1; - rct12_peep_spawn peep_spawns[RCT12_MAX_PEEP_SPAWNS]; - uint8_t guest_count_change_modifier; - uint8_t current_research_level; - uint8_t pad_01357400[4]; - uint32_t researched_ride_types[RCT2_MAX_RESEARCHED_RIDE_TYPE_QUADS]; - uint32_t researched_ride_entries[RCT2_MAX_RESEARCHED_RIDE_ENTRY_QUADS]; - uint32_t researched_track_types_a[128]; - uint32_t researched_track_types_b[128]; - - // SC6[7] - uint16_t guests_in_park; - uint16_t guests_heading_for_park; - - // Ignored in scenario - money32 expenditure_table[RCT12_EXPENDITURE_TABLE_MONTH_COUNT][RCT12_EXPENDITURE_TYPE_COUNT]; - - // SC6[8] - uint16_t last_guests_in_park; - uint8_t pad_01357BCA[3]; - uint8_t handyman_colour; - uint8_t mechanic_colour; - uint8_t security_colour; - - // Ignored in scenario - uint32_t researched_scenery_items[RCT2_MAX_RESEARCHED_SCENERY_ITEM_QUADS]; - - // SC6[9] - uint16_t park_rating; - - // Ignored in scenario - uint8_t park_rating_history[32]; - uint8_t guests_in_park_history[32]; - - // SC6[10] - uint8_t active_research_types; - uint8_t research_progress_stage; - uint32_t last_researched_item_subject; - uint8_t pad_01357CF8[1000]; - uint32_t next_research_item; - uint16_t research_progress; - uint8_t next_research_category; - uint8_t next_research_expected_day; - uint8_t next_research_expected_month; - uint8_t guest_initial_happiness; - uint16_t park_size; - uint16_t guest_generation_probability; - uint16_t total_ride_value_for_money; - money32 maximum_loan; - money16 guest_initial_cash; - uint8_t guest_initial_hunger; - uint8_t guest_initial_thirst; - uint8_t objective_type; - uint8_t objective_year; - uint8_t pad_013580FA[2]; - money32 objective_currency; - uint16_t objective_guests; - uint8_t campaign_weeks_left[20]; - uint8_t campaign_ride_index[22]; - - // Ignored in scenario - money32 balance_history[RCT12_FINANCE_GRAPH_SIZE]; - - // SC6[11] - money32 current_expenditure; - money32 current_profit; - money32 weekly_profit_average_dividend; - uint16_t weekly_profit_average_divisor; - uint8_t pad_0135833A[2]; - - // Ignored in scenario - money32 weekly_profit_history[RCT12_FINANCE_GRAPH_SIZE]; - - // SC6[12] - money32 park_value; - - // Ignored in scenario - money32 park_value_history[RCT12_FINANCE_GRAPH_SIZE]; - - // SC6[13] - money32 completed_company_value; - uint32_t total_admissions; - money32 income_from_admissions; - money32 company_value; - uint8_t peep_warning_throttle[16]; - rct12_award awards[RCT12_MAX_AWARDS]; - money16 land_price; - money16 construction_rights_price; - uint16_t word_01358774; - uint8_t pad_01358776[2]; - uint32_t cd_key; - uint8_t pad_0135877C[64]; - uint32_t game_version_number; - money32 completed_company_value_record; - uint32_t loan_hash; - uint16_t ride_count; - uint8_t pad_013587CA[6]; - money32 historical_profit; - uint8_t pad_013587D4[4]; - char scenario_completed_name[32]; - money32 cash; - uint8_t pad_013587FC[50]; - uint16_t park_rating_casualty_penalty; - uint16_t map_size_units; - uint16_t map_size_minus_2; - uint16_t map_size; - uint16_t map_max_xy; - uint32_t same_price_throughout; - uint16_t suggested_max_guests; - uint16_t park_rating_warning_days; - uint8_t last_entrance_style; - uint8_t rct1_water_colour; - uint8_t pad_01358842[2]; - RCT12ResearchItem research_items[MAX_RESEARCH_ITEMS]; - uint16_t map_base_z; - char scenario_name[64]; - char scenario_description[256]; - uint8_t current_interest_rate; - uint8_t pad_0135934B; - uint32_t same_price_throughout_extended; - int16_t park_entrance_x[RCT12_MAX_PARK_ENTRANCES]; - int16_t park_entrance_y[RCT12_MAX_PARK_ENTRANCES]; - int16_t park_entrance_z[RCT12_MAX_PARK_ENTRANCES]; - uint8_t park_entrance_direction[RCT12_MAX_PARK_ENTRANCES]; - char scenario_filename[256]; - uint8_t saved_expansion_pack_names[3256]; - 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]; - uint16_t saved_age; - int16_t saved_view_x; - int16_t saved_view_y; - uint8_t saved_view_zoom; - uint8_t saved_view_rotation; - RCT12MapAnimation map_animations[RCT2_MAX_ANIMATED_OBJECTS]; - uint16_t num_map_animations; - uint8_t pad_0138B582[2]; - RCT2RideRatingCalculationData ride_ratings_calc_data; - uint8_t pad_0138B5D0[60]; - RCT12RideMeasurement ride_measurements[8]; - uint32_t next_guest_index; - uint16_t grass_and_scenery_tilepos; - uint32_t patrol_areas[(RCT2_MAX_STAFF + RCT12_STAFF_TYPE_COUNT) * RCT12_PATROL_AREA_SIZE]; - uint8_t staff_modes[RCT2_MAX_STAFF + RCT12_STAFF_TYPE_COUNT]; - uint8_t pad_13CA73E; - uint8_t pad_13CA73F; - uint8_t byte_13CA740; - uint8_t pad_13CA741; - uint8_t byte_13CA742[4]; // unused - uint8_t climate; - uint8_t pad_013CA747; - uint16_t climate_update_timer; - uint8_t current_weather; - uint8_t next_weather; - uint8_t temperature; - uint8_t next_temperature; - uint8_t current_weather_effect; - uint8_t next_weather_effect; - uint8_t current_weather_gloom; - uint8_t next_weather_gloom; - uint8_t current_weather_level; - uint8_t next_weather_level; - rct12_news_item news_items[RCT12_MAX_NEWS_ITEMS]; - char rct1_scenario_name[62]; // Unused in RCT2 - uint16_t rct1_scenario_slot_index; // Unused in RCT2 - uint32_t rct1_scenario_flags; // Unused in RCT2 - uint16_t wide_path_tile_loop_x; - uint16_t wide_path_tile_loop_y; - uint8_t pad_13CE778[434]; -}; -assert_struct_size(rct_s6_data, 0x46b44a); #pragma pack(pop) enum @@ -460,8 +213,6 @@ uint32_t scenario_rand_max(uint32_t max); bool scenario_prepare_for_save(); int32_t scenario_save(const utf8* path, int32_t flags); -void scenario_remove_trackless_rides(rct_s6_data* s6); -void scenario_fix_ghosts(rct_s6_data* s6); void scenario_failure(); void scenario_success(); void scenario_success_submit_name(const char* name); From 9c53fe252d8b645cdc6a095fc5314ea8faa38051 Mon Sep 17 00:00:00 2001 From: frutiemax Date: Fri, 27 Aug 2021 17:44:33 -0400 Subject: [PATCH 23/51] Part of #13874: ZehMatt review changes --- src/openrct2-ui/windows/RideConstruction.cpp | 4 +-- src/openrct2/ride/Ride.cpp | 8 +++--- src/openrct2/ride/RideConstruction.cpp | 2 +- src/openrct2/ride/TrackData.cpp | 26 ++++++++++---------- src/openrct2/ride/TrackData.h | 2 +- src/openrct2/ride/TrackDesign.cpp | 12 ++++----- src/openrct2/world/TileInspector.cpp | 2 +- 7 files changed, 28 insertions(+), 28 deletions(-) diff --git a/src/openrct2-ui/windows/RideConstruction.cpp b/src/openrct2-ui/windows/RideConstruction.cpp index 36530f15be..660e44d6b9 100644 --- a/src/openrct2-ui/windows/RideConstruction.cpp +++ b/src/openrct2-ui/windows/RideConstruction.cpp @@ -2349,7 +2349,7 @@ static void window_ride_construction_draw_track_piece( return; const auto& teDescriptor = GetTrackElementDescriptor(trackType); - auto trackBlock = teDescriptor.Block; + const auto* trackBlock = teDescriptor.Block; while ((trackBlock + 1)->index != 0xFF) trackBlock++; @@ -2404,7 +2404,7 @@ static void sub_6CBCE2( gMapSize = MAXIMUM_MAP_SIZE_TECHNICAL; const auto& teDescriptor = GetTrackElementDescriptor(trackType); - auto trackBlock = teDescriptor.Block; + const auto* trackBlock = teDescriptor.Block; while (trackBlock->index != 255) { auto quarterTile = trackBlock->var_08.Rotate(trackDirection); diff --git a/src/openrct2/ride/Ride.cpp b/src/openrct2/ride/Ride.cpp index b55da43d9e..b3df84e1bc 100644 --- a/src/openrct2/ride/Ride.cpp +++ b/src/openrct2/ride/Ride.cpp @@ -531,7 +531,7 @@ bool track_block_get_next(CoordsXYE* input, CoordsXYE* output, int32_t* z, int32 if (ride == nullptr) return false; - auto trackBlock = teDescriptor.Block; + const auto* trackBlock = teDescriptor.Block; if (trackBlock == nullptr) return false; @@ -600,7 +600,7 @@ bool track_block_get_previous_from_zero( continue; const auto& teDesc = GetTrackElementDescriptor(trackElement->GetTrackType()); - auto nextTrackBlock = teDesc.Block; + const auto* nextTrackBlock = teDesc.Block; if (nextTrackBlock == nullptr) continue; auto nextTrackCoordinate = teDesc.Coordinates; @@ -636,7 +636,7 @@ bool track_block_get_previous_from_zero( outTrackBeginEnd->begin_z = tileElement->GetBaseZ(); const auto& teDescriptor = GetTrackElementDescriptor(trackElement->GetTrackType()); - auto nextTrackBlock2 = teDescriptor.Block; + const auto* nextTrackBlock2 = teDescriptor.Block; if (nextTrackBlock2 == nullptr) continue; @@ -677,7 +677,7 @@ bool track_block_get_previous(const CoordsXYE& trackPos, track_begin_end* outTra if (ride == nullptr) return false; - auto trackBlock = teDescriptor.Block; + const auto* trackBlock = teDescriptor.Block; if (trackBlock == nullptr) return false; diff --git a/src/openrct2/ride/RideConstruction.cpp b/src/openrct2/ride/RideConstruction.cpp index 5b3bb6a432..980b0412c4 100644 --- a/src/openrct2/ride/RideConstruction.cpp +++ b/src/openrct2/ride/RideConstruction.cpp @@ -395,7 +395,7 @@ std::optional sub_6C683D( // Possibly z should be & 0xF8 const auto& teDescriptor = GetTrackElementDescriptor(type); - auto trackBlock = teDescriptor.Block; + const auto* trackBlock = teDescriptor.Block; if (trackBlock == nullptr) return std::nullopt; diff --git a/src/openrct2/ride/TrackData.cpp b/src/openrct2/ride/TrackData.cpp index 0ab32b5984..4777b5faf9 100644 --- a/src/openrct2/ride/TrackData.cpp +++ b/src/openrct2/ride/TrackData.cpp @@ -16,7 +16,7 @@ #include // clang-format off -const static rct_track_coordinates TrackCoordinates[TrackElemType::Count] = { +static constexpr rct_track_coordinates TrackCoordinates[TrackElemType::Count] = { { 0, 0, 0, 0, 0, 0 }, // ELEM_FLAT { 0, 0, 0, 0, 0, 0 }, // ELEM_END_STATION { 0, 0, 0, 0, 0, 0 }, // ELEM_BEGIN_STATION @@ -287,7 +287,7 @@ const static rct_track_coordinates TrackCoordinates[TrackElemType::Count] = { }; /** rct2: 0x0099BA64 */ -const static uint8_t TrackSequenceProperties[][MaxSequencesPerPiece] = { +static constexpr uint8_t TrackSequenceProperties[][MaxSequencesPerPiece] = { { 0 }, /* TrackElemType::EndStation */ { TRACK_SEQUENCE_FLAG_DIRECTION_1 | TRACK_SEQUENCE_FLAG_DIRECTION_3 | TRACK_SEQUENCE_FLAG_ORIGIN | TRACK_SEQUENCE_FLAG_DISALLOW_DOORS, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, /* TrackElemType::BeginStation */ { TRACK_SEQUENCE_FLAG_DIRECTION_1 | TRACK_SEQUENCE_FLAG_DIRECTION_3 | TRACK_SEQUENCE_FLAG_ORIGIN | TRACK_SEQUENCE_FLAG_DISALLOW_DOORS, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, @@ -559,7 +559,7 @@ const static uint8_t TrackSequenceProperties[][MaxSequencesPerPiece] = { #define TRACK_BLOCK_END { 255, 255, 255, 255, 255, {255, 255}, 255 } -static constexpr const rct_preview_track TrackBlocks000[] = { +static constexpr rct_preview_track TrackBlocks000[] = { { 0, 0, 0, 0, 0, { 0b1111, 0 }, 0 }, TRACK_BLOCK_END }; @@ -2545,7 +2545,7 @@ static constexpr const rct_preview_track TrackBlocksFlatTrack3x3[] = { }; // rct2: 0x00994638 -const static rct_preview_track *TrackBlocks[TrackElemType::Count] = { +static constexpr std::array TrackBlocks = { TrackBlocks000, TrackBlocks001, TrackBlocks002, @@ -2816,7 +2816,7 @@ const static rct_preview_track *TrackBlocks[TrackElemType::Count] = { TrackBlocksFlatTrack3x3, }; -const static uint8_t TrackPieceLengths[TrackElemType::Count] = { +static constexpr uint8_t TrackPieceLengths[TrackElemType::Count] = { 32, // TrackElemType::Flat 32, // TrackElemType::EndStation 32, // TrackElemType::BeginStation @@ -3087,7 +3087,7 @@ const static uint8_t TrackPieceLengths[TrackElemType::Count] = { }; // rct2: 0x00998C95 -const static track_curve_chain gTrackCurveChain[TrackElemType::Count] = { +static constexpr track_curve_chain gTrackCurveChain[TrackElemType::Count] = { { TRACK_CURVE_NONE, TRACK_CURVE_NONE }, { RideConstructionSpecialPieceSelected | TrackElemType::EndStation, RideConstructionSpecialPieceSelected | TrackElemType::EndStation }, { RideConstructionSpecialPieceSelected | TrackElemType::EndStation, RideConstructionSpecialPieceSelected | TrackElemType::EndStation }, @@ -3503,7 +3503,7 @@ const track_descriptor gTrackDescriptors[142] = { }; /** rct2: 0x00993D1C */ -const static track_type_t AlternativeTrackTypes[TrackElemType::Count] = { +static constexpr track_type_t AlternativeTrackTypes[TrackElemType::Count] = { TrackElemType::FlatCovered, // TrackElemType::Flat TrackElemType::None, TrackElemType::None, @@ -3774,7 +3774,7 @@ const static track_type_t AlternativeTrackTypes[TrackElemType::Count] = { }; /** rct2: 0x0099DA34 */ -const static money32 TrackPricing[TrackElemType::Count] = { +static constexpr money32 TrackPricing[TrackElemType::Count] = { 65536, // TrackElemType::Flat 98304, // TrackElemType::EndStation 98304, // TrackElemType::BeginStation @@ -4045,7 +4045,7 @@ const static money32 TrackPricing[TrackElemType::Count] = { }; /** rct2: 0x0099EA1C */ -const static track_type_t TrackElementMirrorMap[TrackElemType::Count] = { +static constexpr track_type_t TrackElementMirrorMap[TrackElemType::Count] = { TrackElemType::Flat, TrackElemType::EndStation, TrackElemType::BeginStation, @@ -4316,7 +4316,7 @@ const static track_type_t TrackElementMirrorMap[TrackElemType::Count] = { }; /** rct2: 0x00999694 */ -const static uint32_t TrackHeightMarkerPositions[TrackElemType::Count] = { +static constexpr uint32_t TrackHeightMarkerPositions[TrackElemType::Count] = { (1 << 0), // TrackElemType::Flat (1 << 0), // TrackElemType::EndStation (1 << 0), // TrackElemType::BeginStation @@ -4587,7 +4587,7 @@ const static uint32_t TrackHeightMarkerPositions[TrackElemType::Count] = { }; /** rct2: 0x00999A94 */ -const static uint8_t TrackSequenceElementAllowedWallEdges[TrackElemType::Count][MaxSequencesPerPiece] = { +static constexpr uint8_t TrackSequenceElementAllowedWallEdges[TrackElemType::Count][MaxSequencesPerPiece] = { { 0b1010, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // TrackElemType::Flat { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // TrackElemType::EndStation { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // TrackElemType::BeginStation @@ -4858,7 +4858,7 @@ const static uint8_t TrackSequenceElementAllowedWallEdges[TrackElemType::Count][ }; /** rct2: 0x0099423C */ -const static uint16_t TrackFlags[TrackElemType::Count] = { +static constexpr uint16_t TrackFlags[TrackElemType::Count] = { /* TrackElemType::Flat */ TRACK_ELEM_FLAG_ALLOW_LIFT_HILL, /* TrackElemType::EndStation */ 0, /* TrackElemType::BeginStation */ 0, @@ -5160,7 +5160,7 @@ namespace OpenRCT2 _trackElementDescriptors.push_back(desc); } } - const TrackElementDescriptor& GetTrackElementDescriptor(const uint32_t& type) + const TrackElementDescriptor& GetTrackElementDescriptor(const uint32_t type) { return _trackElementDescriptors[type]; } diff --git a/src/openrct2/ride/TrackData.h b/src/openrct2/ride/TrackData.h index 9e41660b5c..0b43a74426 100644 --- a/src/openrct2/ride/TrackData.h +++ b/src/openrct2/ride/TrackData.h @@ -77,6 +77,6 @@ namespace OpenRCT2 namespace TrackMetaData { void Init(); - const TrackElementDescriptor& GetTrackElementDescriptor(const uint32_t& type); + const TrackElementDescriptor& GetTrackElementDescriptor(const uint32_t type); } // namespace TrackMetaData } // namespace OpenRCT2 diff --git a/src/openrct2/ride/TrackDesign.cpp b/src/openrct2/ride/TrackDesign.cpp index 5c22e095aa..a8d51989ed 100644 --- a/src/openrct2/ride/TrackDesign.cpp +++ b/src/openrct2/ride/TrackDesign.cpp @@ -185,7 +185,7 @@ rct_string_id TrackDesign::CreateTrackDesignTrack(const Ride& ride) const auto& teDescriptor = GetTrackElementDescriptor(trackElement.element->AsTrack()->GetTrackType()); const rct_track_coordinates* trackCoordinates = &teDescriptor.Coordinates; - auto trackBlock = teDescriptor.Block; + const auto* trackBlock = teDescriptor.Block; // Used in the following loop to know when we have // completed all of the elements and are back at the // start. @@ -1650,13 +1650,13 @@ static std::optional track_design_place_ride(TrackDesign* td6, const Co } } - const rct_track_coordinates* track_coordinates = &teDescriptor.Coordinates; + const rct_track_coordinates& track_coordinates = teDescriptor.Coordinates; auto offsetAndRotatedTrack = CoordsXY{ newCoords } - + CoordsXY{ track_coordinates->x, track_coordinates->y }.Rotate(rotation); + + CoordsXY{ track_coordinates.x, track_coordinates.y }.Rotate(rotation); - newCoords = { offsetAndRotatedTrack, newCoords.z - track_coordinates->z_begin + track_coordinates->z_end }; - rotation = (rotation + track_coordinates->rotation_end - track_coordinates->rotation_begin) & 3; - if (track_coordinates->rotation_end & (1 << 2)) + newCoords = { offsetAndRotatedTrack, newCoords.z - track_coordinates.z_begin + track_coordinates.z_end }; + rotation = (rotation + track_coordinates.rotation_end - track_coordinates.rotation_begin) & 3; + if (track_coordinates.rotation_end & (1 << 2)) { rotation |= (1 << 2); } diff --git a/src/openrct2/world/TileInspector.cpp b/src/openrct2/world/TileInspector.cpp index f5e2632bce..cf1a998b22 100644 --- a/src/openrct2/world/TileInspector.cpp +++ b/src/openrct2/world/TileInspector.cpp @@ -856,7 +856,7 @@ namespace OpenRCT2::TileInspector return std::make_unique(GameActions::Status::Unknown, STR_NONE); const auto& teDescriptor = GetTrackElementDescriptor(type); - auto trackBlock = teDescriptor.Block; + const auto* trackBlock = teDescriptor.Block; trackBlock += trackElement->AsTrack()->GetSequenceIndex(); uint8_t originDirection = trackElement->GetDirection(); From 5f438535adc468170d2c59c9cbb41eade47ec61b Mon Sep 17 00:00:00 2001 From: frutiemax Date: Fri, 27 Aug 2021 17:49:32 -0400 Subject: [PATCH 24/51] Part of #13874: Gymnasiast review --- src/openrct2-ui/windows/NewRide.cpp | 6 +- src/openrct2-ui/windows/Ride.cpp | 4 +- src/openrct2-ui/windows/RideConstruction.cpp | 24 +++---- src/openrct2-ui/windows/TrackDesignPlace.cpp | 11 ++- src/openrct2/actions/MazePlaceTrackAction.cpp | 8 +-- src/openrct2/actions/MazeSetTrackAction.cpp | 8 +-- src/openrct2/actions/TrackPlaceAction.cpp | 36 +++++----- src/openrct2/actions/TrackRemoveAction.cpp | 20 +++--- src/openrct2/actions/WallPlaceAction.cpp | 24 +++---- src/openrct2/ride/Ride.cpp | 70 +++++++++---------- src/openrct2/ride/RideConstruction.cpp | 40 +++++------ src/openrct2/ride/TrackDesign.cpp | 26 +++---- src/openrct2/ride/TrackPaint.cpp | 4 +- src/openrct2/ride/Vehicle.cpp | 28 ++++---- src/openrct2/windows/_legacy.cpp | 16 ++--- src/openrct2/world/Footpath.cpp | 18 ++--- src/openrct2/world/TileInspector.cpp | 12 ++-- 17 files changed, 177 insertions(+), 178 deletions(-) diff --git a/src/openrct2-ui/windows/NewRide.cpp b/src/openrct2-ui/windows/NewRide.cpp index 0e4868a487..dff60eaa81 100644 --- a/src/openrct2-ui/windows/NewRide.cpp +++ b/src/openrct2-ui/windows/NewRide.cpp @@ -943,10 +943,10 @@ static void window_new_ride_paint_ride_information( if (!(gParkFlags & PARK_FLAGS_NO_MONEY)) { // Get price of ride - int32_t unk2 = GetRideTypeDescriptor(item.Type).StartTrackPiece; + int32_t startPieceId = GetRideTypeDescriptor(item.Type).StartTrackPiece; money64 price = GetRideTypeDescriptor(item.Type).BuildCosts.TrackPrice; - const auto& teDescriptor = GetTrackElementDescriptor(unk2); - price *= teDescriptor.Pricing; + const auto& ted = GetTrackElementDescriptor(startPieceId); + price *= ted.Pricing; price = (price >> 17) * 10 * GetRideTypeDescriptor(item.Type).BuildCosts.PriceEstimateMultiplier; // diff --git a/src/openrct2-ui/windows/Ride.cpp b/src/openrct2-ui/windows/Ride.cpp index 5fc066517d..7469bce3dc 100644 --- a/src/openrct2-ui/windows/Ride.cpp +++ b/src/openrct2-ui/windows/Ride.cpp @@ -1369,8 +1369,8 @@ rct_window* window_ride_open_track(TileElement* tileElement) // Open ride window in station view auto trackElement = tileElement->AsTrack(); auto trackType = trackElement->GetTrackType(); - const auto& teDescriptor = GetTrackElementDescriptor(trackType); - if (teDescriptor.TrackSequenceProperties[0] & TRACK_SEQUENCE_FLAG_ORIGIN) + const auto& ted = GetTrackElementDescriptor(trackType); + if (ted.TrackSequenceProperties[0] & TRACK_SEQUENCE_FLAG_ORIGIN) { auto stationIndex = trackElement->GetStationIndex(); return window_ride_open_station(ride, stationIndex); diff --git a/src/openrct2-ui/windows/RideConstruction.cpp b/src/openrct2-ui/windows/RideConstruction.cpp index 660e44d6b9..00f1eaa72b 100644 --- a/src/openrct2-ui/windows/RideConstruction.cpp +++ b/src/openrct2-ui/windows/RideConstruction.cpp @@ -1926,8 +1926,8 @@ static void window_ride_construction_mouseup_demolish(rct_window* w) return; } - const auto& teDescriptor = GetTrackElementDescriptor(tileElement->AsTrack()->GetTrackType()); - const rct_preview_track* trackBlock = teDescriptor.Block; + const auto& ted = GetTrackElementDescriptor(tileElement->AsTrack()->GetTrackType()); + const rct_preview_track* trackBlock = ted.Block; newCoords->z = (tileElement->GetBaseZ()) - trackBlock->z; gGotoStartPlacementMode = true; } @@ -2348,8 +2348,8 @@ static void window_ride_construction_draw_track_piece( if (ride == nullptr) return; - const auto& teDescriptor = GetTrackElementDescriptor(trackType); - const auto* trackBlock = teDescriptor.Block; + const auto& ted = GetTrackElementDescriptor(trackType); + const auto* trackBlock = ted.Block; while ((trackBlock + 1)->index != 0xFF) trackBlock++; @@ -2403,8 +2403,8 @@ static void sub_6CBCE2( gMapSize = MAXIMUM_MAP_SIZE_TECHNICAL; - const auto& teDescriptor = GetTrackElementDescriptor(trackType); - const auto* trackBlock = teDescriptor.Block; + const auto& ted = GetTrackElementDescriptor(trackType); + const auto* trackBlock = ted.Block; while (trackBlock->index != 255) { auto quarterTile = trackBlock->var_08.Rotate(trackDirection); @@ -3297,8 +3297,8 @@ static void window_ride_construction_select_map_tiles( const rct_preview_track* trackBlock; - const auto& teDescriptor = GetTrackElementDescriptor(trackType); - trackBlock = teDescriptor.Block; + const auto& ted = GetTrackElementDescriptor(trackType); + trackBlock = ted.Block; trackDirection &= 3; gMapSelectionTiles.clear(); while (trackBlock->index != 255) @@ -3475,8 +3475,8 @@ void ride_construction_toolupdate_construct(const ScreenCoordsXY& screenCoords) // z = map_get_highest_z(x >> 5, y >> 5); } // loc_6CC91B: - const auto& teDescriptor = GetTrackElementDescriptor(trackType); - trackBlock = teDescriptor.Block; + const auto& ted = GetTrackElementDescriptor(trackType); + trackBlock = ted.Block; int32_t bx = 0; do { @@ -3706,8 +3706,8 @@ void ride_construction_tooldown_construct(const ScreenCoordsXY& screenCoords) if (_trackPlaceZ == 0) { - const auto& teDescriptor = GetTrackElementDescriptor(_currentTrackPieceType); - const rct_preview_track* trackBlock = teDescriptor.Block; + const auto& ted = GetTrackElementDescriptor(_currentTrackPieceType); + const rct_preview_track* trackBlock = ted.Block; int32_t bx = 0; do { diff --git a/src/openrct2-ui/windows/TrackDesignPlace.cpp b/src/openrct2-ui/windows/TrackDesignPlace.cpp index 3ca11449c2..26d46164af 100644 --- a/src/openrct2-ui/windows/TrackDesignPlace.cpp +++ b/src/openrct2-ui/windows/TrackDesignPlace.cpp @@ -551,8 +551,8 @@ static void window_track_place_draw_mini_preview_track( } // Follow a single track piece shape - const auto& teDescriptor = GetTrackElementDescriptor(trackType); - const rct_preview_track* trackBlock = teDescriptor.Block; + const auto& ted = GetTrackElementDescriptor(trackType); + const rct_preview_track* trackBlock = ted.Block; while (trackBlock->index != 255) { auto rotatedAndOffsetTrackBlock = curTrackStart + CoordsXY{ trackBlock->x, trackBlock->y }.Rotate(curTrackRotation); @@ -574,9 +574,8 @@ static void window_track_place_draw_mini_preview_track( auto bits = trackBlock->var_08.Rotate(curTrackRotation & 3).GetBaseQuarterOccupied(); // Station track is a lighter colour - uint8_t colour = (teDescriptor.TrackSequenceProperties[0] & TRACK_SEQUENCE_FLAG_ORIGIN) - ? _PaletteIndexColourStation - : _PaletteIndexColourTrack; + uint8_t colour = (ted.TrackSequenceProperties[0] & TRACK_SEQUENCE_FLAG_ORIGIN) ? _PaletteIndexColourStation + : _PaletteIndexColourTrack; for (int32_t i = 0; i < 4; i++) { @@ -597,7 +596,7 @@ static void window_track_place_draw_mini_preview_track( // Change rotation and next position based on track curvature curTrackRotation &= 3; - const rct_track_coordinates* track_coordinate = &teDescriptor.Coordinates; + const rct_track_coordinates* track_coordinate = &ted.Coordinates; curTrackStart += CoordsXY{ track_coordinate->x, track_coordinate->y }.Rotate(curTrackRotation); curTrackRotation += track_coordinate->rotation_end - track_coordinate->rotation_begin; diff --git a/src/openrct2/actions/MazePlaceTrackAction.cpp b/src/openrct2/actions/MazePlaceTrackAction.cpp index 8e049bcd13..c39f19a21b 100644 --- a/src/openrct2/actions/MazePlaceTrackAction.cpp +++ b/src/openrct2/actions/MazePlaceTrackAction.cpp @@ -115,8 +115,8 @@ GameActions::Result::Ptr MazePlaceTrackAction::Query() const return res; } - const auto& teDescriptor = GetTrackElementDescriptor(TrackElemType::Maze); - money32 price = (((ride->GetRideTypeDescriptor().BuildCosts.TrackPrice * teDescriptor.Pricing) >> 16)); + const auto& ted = GetTrackElementDescriptor(TrackElemType::Maze); + money32 price = (((ride->GetRideTypeDescriptor().BuildCosts.TrackPrice * ted.Pricing) >> 16)); res->Cost = canBuild->Cost + price / 2 * 10; return res; @@ -157,8 +157,8 @@ GameActions::Result::Ptr MazePlaceTrackAction::Execute() const return canBuild; } - const auto& teDescriptor = GetTrackElementDescriptor(TrackElemType::Maze); - money32 price = (((ride->GetRideTypeDescriptor().BuildCosts.TrackPrice * teDescriptor.Pricing) >> 16)); + const auto& ted = GetTrackElementDescriptor(TrackElemType::Maze); + money32 price = (((ride->GetRideTypeDescriptor().BuildCosts.TrackPrice * ted.Pricing) >> 16)); res->Cost = canBuild->Cost + price / 2 * 10; auto startLoc = _loc.ToTileStart(); diff --git a/src/openrct2/actions/MazeSetTrackAction.cpp b/src/openrct2/actions/MazeSetTrackAction.cpp index f7f78114c3..167f67e1fd 100644 --- a/src/openrct2/actions/MazeSetTrackAction.cpp +++ b/src/openrct2/actions/MazeSetTrackAction.cpp @@ -136,8 +136,8 @@ GameActions::Result::Ptr MazeSetTrackAction::Query() const return res; } - const auto& teDescriptor = GetTrackElementDescriptor(TrackElemType::Maze); - money32 price = (((ride->GetRideTypeDescriptor().BuildCosts.TrackPrice * teDescriptor.Pricing) >> 16)); + const auto& ted = GetTrackElementDescriptor(TrackElemType::Maze); + money32 price = (((ride->GetRideTypeDescriptor().BuildCosts.TrackPrice * ted.Pricing) >> 16)); res->Cost = price / 2 * 10; return res; @@ -172,8 +172,8 @@ GameActions::Result::Ptr MazeSetTrackAction::Execute() const auto tileElement = map_get_track_element_at_of_type_from_ride(_loc, TrackElemType::Maze, _rideIndex); if (tileElement == nullptr) { - const auto& teDescriptor = GetTrackElementDescriptor(TrackElemType::Maze); - money32 price = (((ride->GetRideTypeDescriptor().BuildCosts.TrackPrice * teDescriptor.Pricing) >> 16)); + const auto& ted = GetTrackElementDescriptor(TrackElemType::Maze); + money32 price = (((ride->GetRideTypeDescriptor().BuildCosts.TrackPrice * ted.Pricing) >> 16)); res->Cost = price / 2 * 10; auto startLoc = _loc.ToTileStart(); diff --git a/src/openrct2/actions/TrackPlaceAction.cpp b/src/openrct2/actions/TrackPlaceAction.cpp index 21131a1c3c..96aab983f4 100644 --- a/src/openrct2/actions/TrackPlaceAction.cpp +++ b/src/openrct2/actions/TrackPlaceAction.cpp @@ -147,8 +147,8 @@ GameActions::Result::Ptr TrackPlaceAction::Query() const if ((_trackPlaceFlags & CONSTRUCTION_LIFT_HILL_SELECTED) && !ride->GetRideTypeDescriptor().SupportsTrackPiece(TRACK_LIFT_HILL_STEEP) && !gCheatsEnableChainLiftOnAllTrack) { - const auto& teDescriptor = GetTrackElementDescriptor(_trackType); - if (teDescriptor.Flags & TRACK_ELEM_FLAG_IS_STEEP_UP) + const auto& ted = GetTrackElementDescriptor(_trackType); + if (ted.Flags & TRACK_ELEM_FLAG_IS_STEEP_UP) { return std::make_unique(GameActions::Status::Disallowed, STR_TOO_STEEP_FOR_LIFT_HILL); } @@ -156,8 +156,8 @@ GameActions::Result::Ptr TrackPlaceAction::Query() const } money32 cost = 0; - const auto& teDescriptor = GetTrackElementDescriptor(_trackType); - const rct_preview_track* trackBlock = teDescriptor.Block; + const auto& ted = GetTrackElementDescriptor(_trackType); + const rct_preview_track* trackBlock = ted.Block; uint32_t numElements = 0; // First check if any of the track pieces are outside the park for (; trackBlock->index != 0xFF; trackBlock++) @@ -180,7 +180,7 @@ GameActions::Result::Ptr TrackPlaceAction::Query() const if (!gCheatsAllowTrackPlaceInvalidHeights) { - if (teDescriptor.Flags & TRACK_ELEM_FLAG_STARTS_AT_HALF_HEIGHT) + if (ted.Flags & TRACK_ELEM_FLAG_STARTS_AT_HALF_HEIGHT) { if ((_origin.z & 0x0F) != 8) { @@ -199,7 +199,7 @@ GameActions::Result::Ptr TrackPlaceAction::Query() const } // If that is not the case, then perform the remaining checks - trackBlock = teDescriptor.Block; + trackBlock = ted.Block; for (int32_t blockIndex = 0; trackBlock->index != 0xFF; trackBlock++, blockIndex++) { @@ -263,7 +263,7 @@ GameActions::Result::Ptr TrackPlaceAction::Query() const } res->GroundFlags = mapGroundFlags; - if (teDescriptor.Flags & TRACK_ELEM_FLAG_ONLY_ABOVE_GROUND) + if (ted.Flags & TRACK_ELEM_FLAG_ONLY_ABOVE_GROUND) { if (res->GroundFlags & ELEMENT_IS_UNDERGROUND) { @@ -272,7 +272,7 @@ GameActions::Result::Ptr TrackPlaceAction::Query() const } } - if (teDescriptor.Flags & TRACK_ELEM_FLAG_ONLY_UNDERWATER) + if (ted.Flags & TRACK_ELEM_FLAG_ONLY_UNDERWATER) { // No element has this flag if (canBuild->GroundFlags & ELEMENT_IS_UNDERWATER) { @@ -318,7 +318,7 @@ GameActions::Result::Ptr TrackPlaceAction::Query() const } } - int32_t entranceDirections = teDescriptor.TrackSequenceProperties[0]; + int32_t entranceDirections = ted.TrackSequenceProperties[0]; if ((entranceDirections & TRACK_SEQUENCE_FLAG_ORIGIN) && trackBlock->index == 0) { if (!track_add_station_element({ mapLoc, baseZ, _origin.direction }, _rideIndex, 0, _fromTrackDesign)) @@ -367,7 +367,7 @@ GameActions::Result::Ptr TrackPlaceAction::Query() const } money32 price = ride->GetRideTypeDescriptor().BuildCosts.TrackPrice; - price *= teDescriptor.Pricing; + price *= ted.Pricing; price >>= 16; res->Cost = cost + ((price / 2) * 10); @@ -400,11 +400,11 @@ GameActions::Result::Ptr TrackPlaceAction::Execute() const uint32_t rideTypeFlags = ride->GetRideTypeDescriptor().Flags; - const auto& teDescriptor = GetTrackElementDescriptor(_trackType); - auto wallEdges = teDescriptor.SequenceElementAllowedWallEdges; + const auto& ted = GetTrackElementDescriptor(_trackType); + auto wallEdges = ted.SequenceElementAllowedWallEdges; money32 cost = 0; - const rct_preview_track* trackBlock = teDescriptor.Block; + const rct_preview_track* trackBlock = ted.Block; for (int32_t blockIndex = 0; trackBlock->index != 0xFF; trackBlock++, blockIndex++) { auto rotatedTrack = CoordsXYZ{ CoordsXY{ trackBlock->x, trackBlock->y }.Rotate(_origin.direction), trackBlock->z }; @@ -538,7 +538,7 @@ GameActions::Result::Ptr TrackPlaceAction::Execute() const { if (!(GetFlags() & GAME_COMMAND_FLAG_NO_SPEND)) { - entranceDirections = teDescriptor.TrackSequenceProperties[0]; + entranceDirections = ted.TrackSequenceProperties[0]; } } @@ -597,7 +597,7 @@ GameActions::Result::Ptr TrackPlaceAction::Execute() const } trackElement->SetColourScheme(_colour); - entranceDirections = teDescriptor.TrackSequenceProperties[0]; + entranceDirections = ted.TrackSequenceProperties[0]; if (entranceDirections & TRACK_SEQUENCE_FLAG_CONNECTS_TO_PATH) { uint8_t availableDirections = entranceDirections & 0x0F; @@ -653,7 +653,7 @@ GameActions::Result::Ptr TrackPlaceAction::Execute() const } money32 price = ride->GetRideTypeDescriptor().BuildCosts.TrackPrice; - price *= teDescriptor.Pricing; + price *= ted.Pricing; price >>= 16; res->Cost = cost + ((price / 2) * 10); @@ -662,8 +662,8 @@ GameActions::Result::Ptr TrackPlaceAction::Execute() const bool TrackPlaceAction::CheckMapCapacity(int16_t numTiles) const { - const auto& teDescriptor = GetTrackElementDescriptor(_trackType); - for (const rct_preview_track* trackBlock = teDescriptor.Block; trackBlock->index != 0xFF; trackBlock++) + const auto& ted = GetTrackElementDescriptor(_trackType); + for (const rct_preview_track* trackBlock = ted.Block; trackBlock->index != 0xFF; trackBlock++) { auto rotatedTrack = CoordsXY{ trackBlock->x, trackBlock->y }.Rotate(_origin.direction); diff --git a/src/openrct2/actions/TrackRemoveAction.cpp b/src/openrct2/actions/TrackRemoveAction.cpp index 5e084b109d..49e9967d05 100644 --- a/src/openrct2/actions/TrackRemoveAction.cpp +++ b/src/openrct2/actions/TrackRemoveAction.cpp @@ -136,8 +136,8 @@ GameActions::Result::Ptr TrackRemoveAction::Query() const log_warning("Ride type not found. ride type = %d.", ride->type); return MakeResult(GameActions::Status::InvalidParameters, STR_RIDE_CONSTRUCTION_CANT_REMOVE_THIS); } - const auto& teDescriptor = GetTrackElementDescriptor(trackType); - const rct_preview_track* trackBlock = teDescriptor.Block; + const auto& ted = GetTrackElementDescriptor(trackType); + const rct_preview_track* trackBlock = ted.Block; trackBlock += tileElement->AsTrack()->GetSequenceIndex(); auto startLoc = _origin; @@ -153,7 +153,7 @@ GameActions::Result::Ptr TrackRemoveAction::Query() const money32 cost = 0; - trackBlock = teDescriptor.Block; + trackBlock = ted.Block; for (; trackBlock->index != 255; trackBlock++) { rotatedTrack = CoordsXYZ{ CoordsXY{ trackBlock->x, trackBlock->y }.Rotate(startLoc.direction), trackBlock->z }; @@ -203,7 +203,7 @@ GameActions::Result::Ptr TrackRemoveAction::Query() const return MakeResult(GameActions::Status::Unknown, STR_RIDE_CONSTRUCTION_CANT_REMOVE_THIS); } - int32_t entranceDirections = teDescriptor.TrackSequenceProperties[0]; + int32_t entranceDirections = ted.TrackSequenceProperties[0]; if (entranceDirections & TRACK_SEQUENCE_FLAG_ORIGIN && (tileElement->AsTrack()->GetSequenceIndex() == 0)) { if (!track_remove_station_element({ mapLoc, _origin.direction }, rideIndex, 0)) @@ -229,7 +229,7 @@ GameActions::Result::Ptr TrackRemoveAction::Query() const } money32 price = ride->GetRideTypeDescriptor().BuildCosts.TrackPrice; - price *= teDescriptor.Pricing; + price *= ted.Pricing; price >>= 16; price = (price + cost) / 2; if (ride->lifecycle_flags & RIDE_LIFECYCLE_EVER_BEEN_OPENED) @@ -317,8 +317,8 @@ GameActions::Result::Ptr TrackRemoveAction::Execute() const log_warning("Ride not found. ride index = %d.", rideIndex); return MakeResult(GameActions::Status::InvalidParameters, STR_RIDE_CONSTRUCTION_CANT_REMOVE_THIS); } - const auto& teDescriptor = GetTrackElementDescriptor(trackType); - const rct_preview_track* trackBlock = teDescriptor.Block; + const auto& ted = GetTrackElementDescriptor(trackType); + const rct_preview_track* trackBlock = ted.Block; trackBlock += tileElement->AsTrack()->GetSequenceIndex(); auto startLoc = _origin; @@ -333,7 +333,7 @@ GameActions::Result::Ptr TrackRemoveAction::Execute() const res->Position.z = startLoc.z; money32 cost = 0; - trackBlock = teDescriptor.Block; + trackBlock = ted.Block; for (; trackBlock->index != 255; trackBlock++) { rotatedTrackLoc = CoordsXYZ{ CoordsXY{ trackBlock->x, trackBlock->y }.Rotate(startLoc.direction), trackBlock->z }; @@ -378,7 +378,7 @@ GameActions::Result::Ptr TrackRemoveAction::Execute() const return MakeResult(GameActions::Status::Unknown, STR_RIDE_CONSTRUCTION_CANT_REMOVE_THIS); } - int32_t entranceDirections = teDescriptor.TrackSequenceProperties[0]; + int32_t entranceDirections = ted.TrackSequenceProperties[0]; if (entranceDirections & TRACK_SEQUENCE_FLAG_ORIGIN && (tileElement->AsTrack()->GetSequenceIndex() == 0)) { if (!track_remove_station_element({ mapLoc, _origin.direction }, rideIndex, 0)) @@ -477,7 +477,7 @@ GameActions::Result::Ptr TrackRemoveAction::Execute() const } money32 price = ride->GetRideTypeDescriptor().BuildCosts.TrackPrice; - price *= teDescriptor.Pricing; + price *= ted.Pricing; price >>= 16; price = (price + cost) / 2; if (ride->lifecycle_flags & RIDE_LIFECYCLE_EVER_BEEN_OPENED) diff --git a/src/openrct2/actions/WallPlaceAction.cpp b/src/openrct2/actions/WallPlaceAction.cpp index 7aa2244383..2f660ea596 100644 --- a/src/openrct2/actions/WallPlaceAction.cpp +++ b/src/openrct2/actions/WallPlaceAction.cpp @@ -408,7 +408,7 @@ bool WallPlaceAction::WallCheckObstructionWithTrack( track_type_t trackType = trackElement->GetTrackType(); using namespace OpenRCT2::TrackMetaData; - const auto& teDescriptor = GetTrackElementDescriptor(trackType); + const auto& ted = GetTrackElementDescriptor(trackType); int32_t sequence = trackElement->GetSequenceIndex(); int32_t direction = (_edge - trackElement->GetDirection()) & TILE_ELEMENT_DIRECTION_MASK; auto ride = get_ride(trackElement->GetRideIndex()); @@ -441,20 +441,20 @@ bool WallPlaceAction::WallCheckObstructionWithTrack( int32_t z; if (sequence == 0) { - if (teDescriptor.TrackSequenceProperties[0] & TRACK_SEQUENCE_FLAG_DISALLOW_DOORS) + if (ted.TrackSequenceProperties[0] & TRACK_SEQUENCE_FLAG_DISALLOW_DOORS) { return false; } if (TrackDefinitions[trackType].bank_start == 0) { - if (!(teDescriptor.Coordinates.rotation_begin & 4)) + if (!(ted.Coordinates.rotation_begin & 4)) { direction = direction_reverse(trackElement->GetDirection()); if (direction == _edge) { - const rct_preview_track* trackBlock = &teDescriptor.Block[sequence]; - z = teDescriptor.Coordinates.z_begin; + const rct_preview_track* trackBlock = &ted.Block[sequence]; + z = ted.Coordinates.z_begin; z = trackElement->base_height + ((z - trackBlock->z) * 8); if (z == z0) { @@ -465,7 +465,7 @@ bool WallPlaceAction::WallCheckObstructionWithTrack( } } - const rct_preview_track* trackBlock = &teDescriptor.Block[sequence + 1]; + const rct_preview_track* trackBlock = &ted.Block[sequence + 1]; if (trackBlock->index != 0xFF) { return false; @@ -476,20 +476,20 @@ bool WallPlaceAction::WallCheckObstructionWithTrack( return false; } - direction = teDescriptor.Coordinates.rotation_end; + direction = ted.Coordinates.rotation_end; if (direction & 4) { return false; } - direction = (trackElement->GetDirection() + teDescriptor.Coordinates.rotation_end) & TILE_ELEMENT_DIRECTION_MASK; + direction = (trackElement->GetDirection() + ted.Coordinates.rotation_end) & TILE_ELEMENT_DIRECTION_MASK; if (direction != _edge) { return false; } - trackBlock = &teDescriptor.Block[sequence]; - z = teDescriptor.Coordinates.z_end; + trackBlock = &ted.Block[sequence]; + z = ted.Coordinates.z_end; z = trackElement->base_height + ((z - trackBlock->z) * 8); return z == z0; } @@ -593,8 +593,8 @@ bool WallPlaceAction::TrackIsAllowedWallEdges( { if (!GetRideTypeDescriptor(rideType).HasFlag(RIDE_TYPE_FLAG_TRACK_NO_WALLS)) { - const auto& teDescriptor = GetTrackElementDescriptor(trackType); - if (teDescriptor.SequenceElementAllowedWallEdges[trackSequence] & (1 << direction)) + const auto& ted = GetTrackElementDescriptor(trackType); + if (ted.SequenceElementAllowedWallEdges[trackSequence] & (1 << direction)) { return true; } diff --git a/src/openrct2/ride/Ride.cpp b/src/openrct2/ride/Ride.cpp index b3df84e1bc..877be528eb 100644 --- a/src/openrct2/ride/Ride.cpp +++ b/src/openrct2/ride/Ride.cpp @@ -410,11 +410,11 @@ bool ride_try_get_origin_element(const Ride* ride, CoordsXYE* output) // Found a track piece for target ride // Check if it's not the station or ??? (but allow end piece of station) - const auto& teDescriptor = GetTrackElementDescriptor(it.element->AsTrack()->GetTrackType()); + const auto& ted = GetTrackElementDescriptor(it.element->AsTrack()->GetTrackType()); bool specialTrackPiece = (it.element->AsTrack()->GetTrackType() != TrackElemType::BeginStation && it.element->AsTrack()->GetTrackType() != TrackElemType::MiddleStation - && (teDescriptor.TrackSequenceProperties[0] & TRACK_SEQUENCE_FLAG_ORIGIN)); + && (ted.TrackSequenceProperties[0] & TRACK_SEQUENCE_FLAG_ORIGIN)); // Set result tile to this track piece if first found track or a ??? if (resultTileElement == nullptr || specialTrackPiece) @@ -480,12 +480,12 @@ bool track_block_get_next_from_zero( if (tileElement->IsGhost() != isGhost) continue; - const auto& teDescriptor = GetTrackElementDescriptor(trackElement->GetTrackType()); - auto nextTrackBlock = teDescriptor.Block; + const auto& ted = GetTrackElementDescriptor(trackElement->GetTrackType()); + auto nextTrackBlock = ted.Block; if (nextTrackBlock == nullptr) continue; - auto nextTrackCoordinate = teDescriptor.Coordinates; + auto nextTrackCoordinate = ted.Coordinates; uint8_t nextRotation = tileElement->GetDirectionWithOffset(nextTrackCoordinate.rotation_begin) | (nextTrackCoordinate.rotation_begin & TRACK_BLOCK_2); @@ -522,7 +522,7 @@ bool track_block_get_next(CoordsXYE* input, CoordsXYE* output, int32_t* z, int32 return false; auto inputElement = input->element->AsTrack(); - const auto& teDescriptor = GetTrackElementDescriptor(inputElement->GetTrackType()); + const auto& ted = GetTrackElementDescriptor(inputElement->GetTrackType()); if (inputElement == nullptr) return false; @@ -531,13 +531,13 @@ bool track_block_get_next(CoordsXYE* input, CoordsXYE* output, int32_t* z, int32 if (ride == nullptr) return false; - const auto* trackBlock = teDescriptor.Block; + const auto* trackBlock = ted.Block; if (trackBlock == nullptr) return false; trackBlock += inputElement->GetSequenceIndex(); - auto trackCoordinate = teDescriptor.Coordinates; + auto trackCoordinate = ted.Coordinates; int32_t x = input->x; int32_t y = input->y; @@ -635,8 +635,8 @@ bool track_block_get_previous_from_zero( outTrackBeginEnd->begin_z = tileElement->GetBaseZ(); - const auto& teDescriptor = GetTrackElementDescriptor(trackElement->GetTrackType()); - const auto* nextTrackBlock2 = teDescriptor.Block; + const auto& ted = GetTrackElementDescriptor(trackElement->GetTrackType()); + const auto* nextTrackBlock2 = ted.Block; if (nextTrackBlock2 == nullptr) continue; @@ -668,7 +668,7 @@ bool track_block_get_previous(const CoordsXYE& trackPos, track_begin_end* outTra return false; auto trackElement = trackPos.element->AsTrack(); - const auto& teDescriptor = GetTrackElementDescriptor(trackElement->GetTrackType()); + const auto& ted = GetTrackElementDescriptor(trackElement->GetTrackType()); if (trackElement == nullptr) return false; @@ -677,13 +677,13 @@ bool track_block_get_previous(const CoordsXYE& trackPos, track_begin_end* outTra if (ride == nullptr) return false; - const auto* trackBlock = teDescriptor.Block; + const auto* trackBlock = ted.Block; if (trackBlock == nullptr) return false; trackBlock += trackElement->GetSequenceIndex(); - auto trackCoordinate = teDescriptor.Coordinates; + auto trackCoordinate = ted.Coordinates; int32_t z = trackElement->GetBaseZ(); @@ -2229,8 +2229,8 @@ static void ride_shop_connected(Ride* ride) return; } - const auto& teDescriptor = GetTrackElementDescriptor(track_type); - uint8_t entrance_directions = teDescriptor.TrackSequenceProperties[0] & 0xF; + const auto& ted = GetTrackElementDescriptor(track_type); + uint8_t entrance_directions = ted.TrackSequenceProperties[0] & 0xF; uint8_t tile_direction = trackElement->GetDirection(); entrance_directions = rol4(entrance_directions, tile_direction); @@ -2665,8 +2665,8 @@ static bool ride_check_track_contains_inversions(CoordsXYE* input, CoordsXYE* ou while (track_circuit_iterator_next(&it)) { auto trackType = it.current.element->AsTrack()->GetTrackType(); - const auto& teDescriptor = GetTrackElementDescriptor(trackType); - if (teDescriptor.Flags & TRACK_ELEM_FLAG_INVERSION_TO_NORMAL) + const auto& ted = GetTrackElementDescriptor(trackType); + if (ted.Flags & TRACK_ELEM_FLAG_INVERSION_TO_NORMAL) { *output = it.current; return true; @@ -2724,8 +2724,8 @@ static bool ride_check_track_contains_banked(CoordsXYE* input, CoordsXYE* output while (track_circuit_iterator_next(&it)) { auto trackType = output->element->AsTrack()->GetTrackType(); - const auto& teDescriptor = GetTrackElementDescriptor(trackType); - if (teDescriptor.Flags & TRACK_ELEM_FLAG_BANKED) + const auto& ted = GetTrackElementDescriptor(trackType); + if (ted.Flags & TRACK_ELEM_FLAG_BANKED) { *output = it.current; return true; @@ -2774,8 +2774,8 @@ static int32_t ride_check_station_length(CoordsXYE* input, CoordsXYE* output) do { - const auto& teDescriptor = GetTrackElementDescriptor(output->element->AsTrack()->GetTrackType()); - if (teDescriptor.TrackSequenceProperties[0] & TRACK_SEQUENCE_FLAG_ORIGIN) + const auto& ted = GetTrackElementDescriptor(output->element->AsTrack()->GetTrackType()); + if (ted.TrackSequenceProperties[0] & TRACK_SEQUENCE_FLAG_ORIGIN) { num_station_elements++; last_good_station = *output; @@ -2822,8 +2822,8 @@ static bool ride_check_start_and_end_is_station(CoordsXYE* input) // Check back of the track track_get_back(input, &trackBack); auto trackType = trackBack.element->AsTrack()->GetTrackType(); - auto teDescriptor = GetTrackElementDescriptor(trackType); - if (!(teDescriptor.TrackSequenceProperties[0] & TRACK_SEQUENCE_FLAG_ORIGIN)) + auto ted = GetTrackElementDescriptor(trackType); + if (!(ted.TrackSequenceProperties[0] & TRACK_SEQUENCE_FLAG_ORIGIN)) { return false; } @@ -2832,8 +2832,8 @@ static bool ride_check_start_and_end_is_station(CoordsXYE* input) // Check front of the track track_get_front(input, &trackFront); trackType = trackFront.element->AsTrack()->GetTrackType(); - teDescriptor = GetTrackElementDescriptor(trackType); - if (!(teDescriptor.TrackSequenceProperties[0] & TRACK_SEQUENCE_FLAG_ORIGIN)) + ted = GetTrackElementDescriptor(trackType); + if (!(ted.TrackSequenceProperties[0] & TRACK_SEQUENCE_FLAG_ORIGIN)) { return false; } @@ -2869,8 +2869,8 @@ static void ride_set_boat_hire_return_point(Ride* ride, CoordsXYE* startElement) }; trackType = returnPos.element->AsTrack()->GetTrackType(); - const auto& teDescriptor = GetTrackElementDescriptor(trackType); - int32_t elementReturnDirection = teDescriptor.Coordinates.rotation_begin; + const auto& ted = GetTrackElementDescriptor(trackType); + int32_t elementReturnDirection = ted.Coordinates.rotation_begin; ride->boat_hire_return_direction = returnPos.element->GetDirectionWithOffset(elementReturnDirection); ride->boat_hire_return_position = TileCoordsXY{ returnPos }; } @@ -3544,8 +3544,8 @@ static bool ride_initialise_cable_lift_track(Ride* ride, bool isApplying) if (tileElement->GetBaseZ() != location.z) continue; - const auto& teDescriptor = GetTrackElementDescriptor(tileElement->AsTrack()->GetTrackType()); - if (!(teDescriptor.TrackSequenceProperties[0] & TRACK_SEQUENCE_FLAG_ORIGIN)) + const auto& ted = GetTrackElementDescriptor(tileElement->AsTrack()->GetTrackType()); + if (!(ted.TrackSequenceProperties[0] & TRACK_SEQUENCE_FLAG_ORIGIN)) { continue; } @@ -3777,8 +3777,8 @@ TrackElement* Ride::GetOriginElement(StationIndex stationIndex) const continue; auto* trackElement = tileElement->AsTrack(); - const auto& teDescriptor = GetTrackElementDescriptor(trackElement->GetTrackType()); - if (!(teDescriptor.TrackSequenceProperties[0] & TRACK_SEQUENCE_FLAG_ORIGIN)) + const auto& ted = GetTrackElementDescriptor(trackElement->GetTrackType()); + if (!(ted.TrackSequenceProperties[0] & TRACK_SEQUENCE_FLAG_ORIGIN)) continue; if (trackElement->GetRideIndex() == id) @@ -4884,8 +4884,8 @@ static int32_t ride_get_track_length(Ride* ride) continue; trackType = tileElement->AsTrack()->GetTrackType(); - const auto& teDescriptor = GetTrackElementDescriptor(trackType); - if (!(teDescriptor.TrackSequenceProperties[0] & TRACK_SEQUENCE_FLAG_ORIGIN)) + const auto& ted = GetTrackElementDescriptor(trackType); + if (!(ted.TrackSequenceProperties[0] & TRACK_SEQUENCE_FLAG_ORIGIN)) continue; if (tileElement->GetBaseZ() != trackStart.z) @@ -4916,8 +4916,8 @@ static int32_t ride_get_track_length(Ride* ride) while (track_circuit_iterator_next(&it)) { trackType = it.current.element->AsTrack()->GetTrackType(); - const auto& teDescriptor = GetTrackElementDescriptor(trackType); - result += teDescriptor.PieceLength; + const auto& ted = GetTrackElementDescriptor(trackType); + result += ted.PieceLength; moveSlowIt = !moveSlowIt; if (moveSlowIt) diff --git a/src/openrct2/ride/RideConstruction.cpp b/src/openrct2/ride/RideConstruction.cpp index 980b0412c4..620761a8b4 100644 --- a/src/openrct2/ride/RideConstruction.cpp +++ b/src/openrct2/ride/RideConstruction.cpp @@ -394,8 +394,8 @@ std::optional sub_6C683D( } // Possibly z should be & 0xF8 - const auto& teDescriptor = GetTrackElementDescriptor(type); - const auto* trackBlock = teDescriptor.Block; + const auto& ted = GetTrackElementDescriptor(type); + const auto* trackBlock = ted.Block; if (trackBlock == nullptr) return std::nullopt; @@ -630,7 +630,7 @@ void ride_construction_set_default_next_piece() TileElement* tileElement; _currentTrackPrice = MONEY32_UNDEFINED; - TrackElementDescriptor teDescriptor; + TrackElementDescriptor ted; switch (_rideConstructionState) { case RideConstructionState::Front: @@ -659,8 +659,8 @@ void ride_construction_set_default_next_piece() } } - teDescriptor = GetTrackElementDescriptor(trackType); - curve = teDescriptor.CurveChain.next; + ted = GetTrackElementDescriptor(trackType); + curve = ted.CurveChain.next; bank = TrackDefinitions[trackType].bank_end; slope = TrackDefinitions[trackType].vangle_end; @@ -705,8 +705,8 @@ void ride_construction_set_default_next_piece() } } - teDescriptor = GetTrackElementDescriptor(trackType); - curve = teDescriptor.CurveChain.previous; + ted = GetTrackElementDescriptor(trackType); + curve = ted.CurveChain.previous; bank = TrackDefinitions[trackType].bank_start; slope = TrackDefinitions[trackType].vangle_start; @@ -1254,8 +1254,8 @@ CoordsXYZD ride_get_entrance_or_exit_position_from_screen_position(const ScreenC { if (info.Element->AsTrack()->GetRideIndex() == gRideEntranceExitPlaceRideIndex) { - const auto& teDescriptor = GetTrackElementDescriptor(info.Element->AsTrack()->GetTrackType()); - if (teDescriptor.TrackSequenceProperties[0] & TRACK_SEQUENCE_FLAG_ORIGIN) + const auto& ted = GetTrackElementDescriptor(info.Element->AsTrack()->GetTrackType()); + if (ted.TrackSequenceProperties[0] & TRACK_SEQUENCE_FLAG_ORIGIN) { if (info.Element->AsTrack()->GetTrackType() == TrackElemType::Maze) { @@ -1345,8 +1345,8 @@ CoordsXYZD ride_get_entrance_or_exit_position_from_screen_position(const ScreenC int32_t eax = (entranceExitCoords.direction + 2 - tileElement->GetDirection()) & TILE_ELEMENT_DIRECTION_MASK; - const auto& teDescriptor = GetTrackElementDescriptor(tileElement->AsTrack()->GetTrackType()); - if (teDescriptor.TrackSequenceProperties[tileElement->AsTrack()->GetSequenceIndex()] & (1 << eax)) + const auto& ted = GetTrackElementDescriptor(tileElement->AsTrack()->GetTrackType()); + if (ted.TrackSequenceProperties[tileElement->AsTrack()->GetSequenceIndex()] & (1 << eax)) { entranceExitCoords.direction = direction_reverse(entranceExitCoords.direction); gRideEntranceExitPlaceDirection = entranceExitCoords.direction; @@ -1439,7 +1439,7 @@ CoordsXYZD ride_get_entrance_or_exit_position_from_screen_position(const ScreenC */ void sub_6CB945(Ride* ride) { - TrackElementDescriptor teDescriptor; + TrackElementDescriptor ted; if (ride->type != RIDE_TYPE_MAZE) { for (StationIndex stationId = 0; stationId < MAX_STATIONS; ++stationId) @@ -1475,8 +1475,8 @@ void sub_6CB945(Ride* ride) if (tileElement->AsTrack()->GetSequenceIndex() != 0) continue; - teDescriptor = GetTrackElementDescriptor(tileElement->AsTrack()->GetTrackType()); - if (!(teDescriptor.TrackSequenceProperties[0] & TRACK_SEQUENCE_FLAG_ORIGIN)) + ted = GetTrackElementDescriptor(tileElement->AsTrack()->GetTrackType()); + if (!(ted.TrackSequenceProperties[0] & TRACK_SEQUENCE_FLAG_ORIGIN)) continue; trackFound = true; @@ -1503,8 +1503,8 @@ void sub_6CB945(Ride* ride) continue; } - teDescriptor = GetTrackElementDescriptor(tileElement->AsTrack()->GetTrackType()); - const rct_preview_track* trackBlock = teDescriptor.Block; + ted = GetTrackElementDescriptor(tileElement->AsTrack()->GetTrackType()); + const rct_preview_track* trackBlock = ted.Block; while ((++trackBlock)->index != 0xFF) { CoordsXYZ blockLocation = location + CoordsXYZ{ CoordsXY{ trackBlock->x, trackBlock->y }.Rotate(direction), 0 }; @@ -1520,8 +1520,8 @@ void sub_6CB945(Ride* ride) if (tileElement->GetType() != TILE_ELEMENT_TYPE_TRACK) continue; - teDescriptor = GetTrackElementDescriptor(tileElement->AsTrack()->GetTrackType()); - if (!(teDescriptor.TrackSequenceProperties[0] & TRACK_SEQUENCE_FLAG_ORIGIN)) + ted = GetTrackElementDescriptor(tileElement->AsTrack()->GetTrackType()); + if (!(ted.TrackSequenceProperties[0] & TRACK_SEQUENCE_FLAG_ORIGIN)) continue; trackFound = true; @@ -1616,8 +1616,8 @@ void sub_6CB945(Ride* ride) Direction direction = (tileElement->GetDirection() - direction_reverse(trackElement->GetDirection())) & 3; - teDescriptor = GetTrackElementDescriptor(trackType); - if (!(teDescriptor.TrackSequenceProperties[trackSequence] & (1 << direction))) + ted = GetTrackElementDescriptor(trackType); + if (!(ted.TrackSequenceProperties[trackSequence] & (1 << direction))) { continue; } diff --git a/src/openrct2/ride/TrackDesign.cpp b/src/openrct2/ride/TrackDesign.cpp index a8d51989ed..e2144e571e 100644 --- a/src/openrct2/ride/TrackDesign.cpp +++ b/src/openrct2/ride/TrackDesign.cpp @@ -183,9 +183,9 @@ rct_string_id TrackDesign::CreateTrackDesignTrack(const Ride& ride) trackElement.y = newCoords->y; z = newCoords->z; - const auto& teDescriptor = GetTrackElementDescriptor(trackElement.element->AsTrack()->GetTrackType()); - const rct_track_coordinates* trackCoordinates = &teDescriptor.Coordinates; - const auto* trackBlock = teDescriptor.Block; + const auto& ted = GetTrackElementDescriptor(trackElement.element->AsTrack()->GetTrackType()); + const rct_track_coordinates* trackCoordinates = &ted.Coordinates; + const auto* trackBlock = ted.Block; // Used in the following loop to know when we have // completed all of the elements and are back at the // start. @@ -770,8 +770,8 @@ static void track_design_mirror_ride(TrackDesign* td6) { for (auto& track : td6->track_elements) { - const auto& teDescriptor = GetTrackElementDescriptor(track.type); - track.type = teDescriptor.MirrorMap; + const auto& ted = GetTrackElementDescriptor(track.type); + track.type = ted.MirrorMap; } for (auto& entrance : td6->entrance_elements) @@ -1522,14 +1522,14 @@ static std::optional track_design_place_ride(TrackDesign* td6, const Co for (const auto& track : td6->track_elements) { auto trackType = track.type; - const auto& teDescriptor = GetTrackElementDescriptor(trackType); + const auto& ted = GetTrackElementDescriptor(trackType); track_design_update_max_min_coordinates(newCoords); switch (_trackDesignPlaceOperation) { case PTD_OPERATION_DRAW_OUTLINES: - for (const rct_preview_track* trackBlock = teDescriptor.Block; trackBlock->index != 0xFF; trackBlock++) + for (const rct_preview_track* trackBlock = ted.Block; trackBlock->index != 0xFF; trackBlock++) { auto tile = CoordsXY{ newCoords } + CoordsXY{ trackBlock->x, trackBlock->y }.Rotate(rotation); track_design_update_max_min_coordinates({ tile, newCoords.z }); @@ -1538,8 +1538,8 @@ static std::optional track_design_place_ride(TrackDesign* td6, const Co break; case PTD_OPERATION_REMOVE_GHOST: { - const rct_track_coordinates* trackCoordinates = &teDescriptor.Coordinates; - const rct_preview_track* trackBlock = teDescriptor.Block; + const rct_track_coordinates* trackCoordinates = &ted.Coordinates; + const rct_preview_track* trackBlock = ted.Block; int32_t tempZ = newCoords.z - trackCoordinates->z_begin + trackBlock->z; auto trackRemoveAction = TrackRemoveAction( trackType, 0, { newCoords, tempZ, static_cast(rotation & 3) }); @@ -1553,7 +1553,7 @@ static std::optional track_design_place_ride(TrackDesign* td6, const Co case PTD_OPERATION_PLACE_GHOST: case PTD_OPERATION_PLACE_TRACK_PREVIEW: { - const rct_track_coordinates* trackCoordinates = &teDescriptor.Coordinates; + const rct_track_coordinates* trackCoordinates = &ted.Coordinates; // di int16_t tempZ = newCoords.z - trackCoordinates->z_begin; @@ -1610,8 +1610,8 @@ static std::optional track_design_place_ride(TrackDesign* td6, const Co } case PTD_OPERATION_GET_PLACE_Z: { - int32_t tempZ = newCoords.z - teDescriptor.Coordinates.z_begin; - for (const rct_preview_track* trackBlock = teDescriptor.Block; trackBlock->index != 0xFF; trackBlock++) + int32_t tempZ = newCoords.z - ted.Coordinates.z_begin; + for (const rct_preview_track* trackBlock = ted.Block; trackBlock->index != 0xFF; trackBlock++) { auto tile = CoordsXY{ newCoords } + CoordsXY{ trackBlock->x, trackBlock->y }.Rotate(rotation); if (!map_is_location_valid(tile)) @@ -1650,7 +1650,7 @@ static std::optional track_design_place_ride(TrackDesign* td6, const Co } } - const rct_track_coordinates& track_coordinates = teDescriptor.Coordinates; + const rct_track_coordinates& track_coordinates = ted.Coordinates; auto offsetAndRotatedTrack = CoordsXY{ newCoords } + CoordsXY{ track_coordinates.x, track_coordinates.y }.Rotate(rotation); diff --git a/src/openrct2/ride/TrackPaint.cpp b/src/openrct2/ride/TrackPaint.cpp index 875506f6ed..cfe01185e1 100644 --- a/src/openrct2/ride/TrackPaint.cpp +++ b/src/openrct2/ride/TrackPaint.cpp @@ -2204,8 +2204,8 @@ void PaintTrack(paint_session* session, Direction direction, int32_t height, con if (PaintShouldShowHeightMarkers(session, VIEWPORT_FLAG_TRACK_HEIGHTS)) { session->InteractionType = ViewportInteractionItem::None; - const auto& teDescriptor = GetTrackElementDescriptor(trackType); - if (teDescriptor.HeightMarkerPositions & (1 << trackSequence)) + const auto& ted = GetTrackElementDescriptor(trackType); + if (ted.HeightMarkerPositions & (1 << trackSequence)) { uint16_t ax = ride->GetRideTypeDescriptor().Heights.VehicleZOffset; // 0x1689 represents 0 height there are -127 to 128 heights above and below it diff --git a/src/openrct2/ride/Vehicle.cpp b/src/openrct2/ride/Vehicle.cpp index e4258fe342..4c9057d2d3 100644 --- a/src/openrct2/ride/Vehicle.cpp +++ b/src/openrct2/ride/Vehicle.cpp @@ -1707,8 +1707,8 @@ void Vehicle::UpdateMeasurements() } } - const auto& teDescriptor = GetTrackElementDescriptor(trackElemType); - uint16_t trackFlags = teDescriptor.Flags; + const auto& ted = GetTrackElementDescriptor(trackElemType); + uint16_t trackFlags = ted.Flags; uint32_t testingFlags = curRide->testing_flags; if (testingFlags & RIDE_TESTING_TURN_LEFT && trackFlags & TRACK_ELEM_FLAG_TURN_LEFT) @@ -7495,13 +7495,13 @@ static void AnimateSceneryDoor(const CoordsXYZD& doorLocation, const CoordsXYZ& void Vehicle::UpdateSceneryDoor() const { auto trackType = GetTrackType(); - const auto& teDescriptor = GetTrackElementDescriptor(trackType); - const rct_preview_track* trackBlock = teDescriptor.Block; + const auto& ted = GetTrackElementDescriptor(trackType); + const rct_preview_track* trackBlock = ted.Block; while ((trackBlock + 1)->index != 255) { trackBlock++; } - const rct_track_coordinates* trackCoordinates = &teDescriptor.Coordinates; + const rct_track_coordinates* trackCoordinates = &ted.Coordinates; auto wallCoords = CoordsXYZ{ x, y, TrackLocation.z - trackBlock->z + trackCoordinates->z_end }.ToTileStart(); int32_t direction = (GetTrackDirection() + trackCoordinates->rotation_end) & 3; @@ -7593,9 +7593,9 @@ static void trigger_on_ride_photo(const CoordsXYZ& loc, TileElement* tileElement void Vehicle::UpdateSceneryDoorBackwards() const { auto trackType = GetTrackType(); - const auto& teDescriptor = GetTrackElementDescriptor(trackType); - const rct_preview_track* trackBlock = teDescriptor.Block; - const rct_track_coordinates* trackCoordinates = &teDescriptor.Coordinates; + const auto& ted = GetTrackElementDescriptor(trackType); + const rct_preview_track* trackBlock = ted.Block; + const rct_track_coordinates* trackCoordinates = &ted.Coordinates; auto wallCoords = CoordsXYZ{ TrackLocation, TrackLocation.z - trackBlock->z + trackCoordinates->z_begin }; int32_t direction = (GetTrackDirection() + trackCoordinates->rotation_begin) & 3; direction = direction_reverse(direction); @@ -7933,8 +7933,8 @@ void Vehicle::Sub6DBF3E() } auto trackType = GetTrackType(); - const auto& teDescriptor = GetTrackElementDescriptor(trackType); - if (!(teDescriptor.TrackSequenceProperties[0] & TRACK_SEQUENCE_FLAG_ORIGIN)) + const auto& ted = GetTrackElementDescriptor(trackType); + if (!(ted.TrackSequenceProperties[0] & TRACK_SEQUENCE_FLAG_ORIGIN)) { return; } @@ -8547,8 +8547,8 @@ bool Vehicle::UpdateTrackMotionBackwardsGetNewTrack(uint16_t trackType, Ride* cu if (next_vehicle_on_train == SPRITE_INDEX_NULL) { trackType = tileElement->AsTrack()->GetTrackType(); - const auto& teDescriptor = GetTrackElementDescriptor(trackType); - if (!(teDescriptor.Flags & TRACK_ELEM_FLAG_DOWN)) + const auto& ted = GetTrackElementDescriptor(trackType); + if (!(ted.Flags & TRACK_ELEM_FLAG_DOWN)) { _vehicleMotionTrackFlags |= VEHICLE_UPDATE_MOTION_TRACK_FLAG_9; } @@ -9209,8 +9209,8 @@ loc_6DCE02: } { auto trackType = GetTrackType(); - const auto& teDescriptor = GetTrackElementDescriptor(trackType); - if (!(teDescriptor.TrackSequenceProperties[0] & TRACK_SEQUENCE_FLAG_ORIGIN)) + const auto& ted = GetTrackElementDescriptor(trackType); + if (!(ted.TrackSequenceProperties[0] & TRACK_SEQUENCE_FLAG_ORIGIN)) { return; } diff --git a/src/openrct2/windows/_legacy.cpp b/src/openrct2/windows/_legacy.cpp index dd0313d2fb..2fb047ac62 100644 --- a/src/openrct2/windows/_legacy.cpp +++ b/src/openrct2/windows/_legacy.cpp @@ -91,8 +91,8 @@ money32 place_provisional_track_piece( return result; int16_t z_begin, z_end; - const auto& teDescriptor = GetTrackElementDescriptor(trackType); - const rct_track_coordinates& coords = teDescriptor.Coordinates; + const auto& ted = GetTrackElementDescriptor(trackType); + const rct_track_coordinates& coords = ted.Coordinates; if (!ride->GetRideTypeDescriptor().HasFlag(RIDE_TYPE_FLAG_HAS_NO_TRACK)) { z_begin = coords.z_begin; @@ -306,8 +306,8 @@ bool window_ride_construction_update_state( && _currentTrackAlternative & RIDE_TYPE_ALTERNATIVE_TRACK_PIECES) { auto availablePieces = rtd.CoveredTrackPieces; - const auto& teDescriptor = GetTrackElementDescriptor(trackType); - auto alternativeType = teDescriptor.AlternativeType; + const auto& ted = GetTrackElementDescriptor(trackType); + auto alternativeType = ted.AlternativeType; if (alternativeType != TrackElemType::None && (availablePieces & (1ULL << trackType))) { trackType = alternativeType; @@ -315,8 +315,8 @@ bool window_ride_construction_update_state( } } - const auto& teDescriptor = GetTrackElementDescriptor(trackType); - const rct_track_coordinates& trackCoordinates = teDescriptor.Coordinates; + const auto& ted = GetTrackElementDescriptor(trackType); + const rct_track_coordinates& trackCoordinates = ted.Coordinates; x = _currentTrackBegin.x; y = _currentTrackBegin.y; @@ -349,13 +349,13 @@ bool window_ride_construction_update_state( bool turnOffLiftHill = false; if (!(_enabledRidePieces & (1ULL << TRACK_LIFT_HILL_CURVE))) { - if (teDescriptor.Flags & TRACK_ELEM_FLAG_CURVE_ALLOWS_LIFT) + if (ted.Flags & TRACK_ELEM_FLAG_CURVE_ALLOWS_LIFT) { turnOffLiftHill = true; } } - if (!(teDescriptor.Flags & TRACK_ELEM_FLAG_ALLOW_LIFT_HILL)) + if (!(ted.Flags & TRACK_ELEM_FLAG_ALLOW_LIFT_HILL)) { turnOffLiftHill = true; } diff --git a/src/openrct2/world/Footpath.cpp b/src/openrct2/world/Footpath.cpp index 33c520a3e6..92bf23ead8 100644 --- a/src/openrct2/world/Footpath.cpp +++ b/src/openrct2/world/Footpath.cpp @@ -881,15 +881,15 @@ static void loc_6A6D7E( const auto trackType = tileElement->AsTrack()->GetTrackType(); const uint8_t trackSequence = tileElement->AsTrack()->GetSequenceIndex(); - const auto& teDescriptor = GetTrackElementDescriptor(trackType); - if (!(teDescriptor.TrackSequenceProperties[trackSequence] & TRACK_SEQUENCE_FLAG_CONNECTS_TO_PATH)) + const auto& ted = GetTrackElementDescriptor(trackType); + if (!(ted.TrackSequenceProperties[trackSequence] & TRACK_SEQUENCE_FLAG_CONNECTS_TO_PATH)) { return; } uint16_t dx = direction_reverse( (direction - tileElement->GetDirection()) & TILE_ELEMENT_DIRECTION_MASK); - if (!(teDescriptor.TrackSequenceProperties[trackSequence] & (1 << dx))) + if (!(ted.TrackSequenceProperties[trackSequence] & (1 << dx))) { return; } @@ -965,13 +965,13 @@ static void loc_6A6C85( const auto trackType = tileElementPos.element->AsTrack()->GetTrackType(); const uint8_t trackSequence = tileElementPos.element->AsTrack()->GetSequenceIndex(); - const auto& teDescriptor = GetTrackElementDescriptor(trackType); - if (!(teDescriptor.TrackSequenceProperties[trackSequence] & TRACK_SEQUENCE_FLAG_CONNECTS_TO_PATH)) + const auto& ted = GetTrackElementDescriptor(trackType); + if (!(ted.TrackSequenceProperties[trackSequence] & TRACK_SEQUENCE_FLAG_CONNECTS_TO_PATH)) { return; } uint16_t dx = (direction - tileElementPos.element->GetDirection()) & TILE_ELEMENT_DIRECTION_MASK; - if (!(teDescriptor.TrackSequenceProperties[trackSequence] & (1 << dx))) + if (!(ted.TrackSequenceProperties[trackSequence] & (1 << dx))) { return; } @@ -2107,11 +2107,11 @@ bool tile_element_wants_path_connection_towards(const TileCoordsXYZD& coords, co const auto trackType = tileElement->AsTrack()->GetTrackType(); const uint8_t trackSequence = tileElement->AsTrack()->GetSequenceIndex(); - const auto& teDescriptor = GetTrackElementDescriptor(trackType); - if (teDescriptor.TrackSequenceProperties[trackSequence] & TRACK_SEQUENCE_FLAG_CONNECTS_TO_PATH) + const auto& ted = GetTrackElementDescriptor(trackType); + if (ted.TrackSequenceProperties[trackSequence] & TRACK_SEQUENCE_FLAG_CONNECTS_TO_PATH) { uint16_t dx = ((coords.direction - tileElement->GetDirection()) & TILE_ELEMENT_DIRECTION_MASK); - if (teDescriptor.TrackSequenceProperties[trackSequence] & (1 << dx)) + if (ted.TrackSequenceProperties[trackSequence] & (1 << dx)) { // Track element has the flags required for the given direction return true; diff --git a/src/openrct2/world/TileInspector.cpp b/src/openrct2/world/TileInspector.cpp index cf1a998b22..3520dcfcd4 100644 --- a/src/openrct2/world/TileInspector.cpp +++ b/src/openrct2/world/TileInspector.cpp @@ -855,8 +855,8 @@ namespace OpenRCT2::TileInspector if (ride == nullptr) return std::make_unique(GameActions::Status::Unknown, STR_NONE); - const auto& teDescriptor = GetTrackElementDescriptor(type); - const auto* trackBlock = teDescriptor.Block; + const auto& ted = GetTrackElementDescriptor(type); + const auto* trackBlock = ted.Block; trackBlock += trackElement->AsTrack()->GetSequenceIndex(); uint8_t originDirection = trackElement->GetDirection(); @@ -868,7 +868,7 @@ namespace OpenRCT2::TileInspector originY = static_cast(coords.y); originZ -= trackBlock->z; - trackBlock = teDescriptor.Block; + trackBlock = ted.Block; for (; trackBlock->index != 255; trackBlock++) { CoordsXYZD elem = { originX, originY, originZ + trackBlock->z, rotation }; @@ -939,8 +939,8 @@ namespace OpenRCT2::TileInspector if (ride == nullptr) return std::make_unique(GameActions::Status::Unknown, STR_NONE); - const auto& teDescriptor = GetTrackElementDescriptor(type); - auto trackBlock = teDescriptor.Block; + const auto& ted = GetTrackElementDescriptor(type); + auto trackBlock = ted.Block; trackBlock += trackElement->AsTrack()->GetSequenceIndex(); uint8_t originDirection = trackElement->GetDirection(); @@ -952,7 +952,7 @@ namespace OpenRCT2::TileInspector originY = static_cast(coords.y); originZ -= trackBlock->z; - trackBlock = teDescriptor.Block; + trackBlock = ted.Block; for (; trackBlock->index != 255; trackBlock++) { CoordsXYZD elem = { originX, originY, originZ + trackBlock->z, rotation }; From b3744f129f56c5aaa80cd0bdc874af7492ac062e Mon Sep 17 00:00:00 2001 From: frutiemax Date: Sat, 28 Aug 2021 18:57:46 -0400 Subject: [PATCH 25/51] Part of #13874: Avoid copies of ted --- src/openrct2/actions/TrackPlaceAction.cpp | 2 +- src/openrct2/ride/Ride.cpp | 24 +++++++++---------- src/openrct2/ride/RideConstruction.cpp | 28 +++++++++++------------ 3 files changed, 27 insertions(+), 27 deletions(-) diff --git a/src/openrct2/actions/TrackPlaceAction.cpp b/src/openrct2/actions/TrackPlaceAction.cpp index 96aab983f4..1763aba396 100644 --- a/src/openrct2/actions/TrackPlaceAction.cpp +++ b/src/openrct2/actions/TrackPlaceAction.cpp @@ -401,7 +401,7 @@ GameActions::Result::Ptr TrackPlaceAction::Execute() const uint32_t rideTypeFlags = ride->GetRideTypeDescriptor().Flags; const auto& ted = GetTrackElementDescriptor(_trackType); - auto wallEdges = ted.SequenceElementAllowedWallEdges; + const auto& wallEdges = ted.SequenceElementAllowedWallEdges; money32 cost = 0; const rct_preview_track* trackBlock = ted.Block; diff --git a/src/openrct2/ride/Ride.cpp b/src/openrct2/ride/Ride.cpp index 877be528eb..7774faf789 100644 --- a/src/openrct2/ride/Ride.cpp +++ b/src/openrct2/ride/Ride.cpp @@ -481,11 +481,11 @@ bool track_block_get_next_from_zero( continue; const auto& ted = GetTrackElementDescriptor(trackElement->GetTrackType()); - auto nextTrackBlock = ted.Block; + const auto* nextTrackBlock = ted.Block; if (nextTrackBlock == nullptr) continue; - auto nextTrackCoordinate = ted.Coordinates; + const auto& nextTrackCoordinate = ted.Coordinates; uint8_t nextRotation = tileElement->GetDirectionWithOffset(nextTrackCoordinate.rotation_begin) | (nextTrackCoordinate.rotation_begin & TRACK_BLOCK_2); @@ -537,7 +537,7 @@ bool track_block_get_next(CoordsXYE* input, CoordsXYE* output, int32_t* z, int32 trackBlock += inputElement->GetSequenceIndex(); - auto trackCoordinate = ted.Coordinates; + const auto& trackCoordinate = ted.Coordinates; int32_t x = input->x; int32_t y = input->y; @@ -599,11 +599,11 @@ bool track_block_get_previous_from_zero( if (trackElement->GetRideIndex() != ride->id) continue; - const auto& teDesc = GetTrackElementDescriptor(trackElement->GetTrackType()); - const auto* nextTrackBlock = teDesc.Block; + const auto* ted = &GetTrackElementDescriptor(trackElement->GetTrackType()); + const auto* nextTrackBlock = ted->Block; if (nextTrackBlock == nullptr) continue; - auto nextTrackCoordinate = teDesc.Coordinates; + const auto& nextTrackCoordinate = ted->Coordinates; nextTrackBlock += trackElement->GetSequenceIndex(); if ((nextTrackBlock + 1)->index != 255) @@ -635,8 +635,8 @@ bool track_block_get_previous_from_zero( outTrackBeginEnd->begin_z = tileElement->GetBaseZ(); - const auto& ted = GetTrackElementDescriptor(trackElement->GetTrackType()); - const auto* nextTrackBlock2 = ted.Block; + ted = &GetTrackElementDescriptor(trackElement->GetTrackType()); + const auto* nextTrackBlock2 = ted->Block; if (nextTrackBlock2 == nullptr) continue; @@ -2822,8 +2822,8 @@ static bool ride_check_start_and_end_is_station(CoordsXYE* input) // Check back of the track track_get_back(input, &trackBack); auto trackType = trackBack.element->AsTrack()->GetTrackType(); - auto ted = GetTrackElementDescriptor(trackType); - if (!(ted.TrackSequenceProperties[0] & TRACK_SEQUENCE_FLAG_ORIGIN)) + const auto* ted = &GetTrackElementDescriptor(trackType); + if (!(ted->TrackSequenceProperties[0] & TRACK_SEQUENCE_FLAG_ORIGIN)) { return false; } @@ -2832,8 +2832,8 @@ static bool ride_check_start_and_end_is_station(CoordsXYE* input) // Check front of the track track_get_front(input, &trackFront); trackType = trackFront.element->AsTrack()->GetTrackType(); - ted = GetTrackElementDescriptor(trackType); - if (!(ted.TrackSequenceProperties[0] & TRACK_SEQUENCE_FLAG_ORIGIN)) + ted = &GetTrackElementDescriptor(trackType); + if (!(ted->TrackSequenceProperties[0] & TRACK_SEQUENCE_FLAG_ORIGIN)) { return false; } diff --git a/src/openrct2/ride/RideConstruction.cpp b/src/openrct2/ride/RideConstruction.cpp index 620761a8b4..0eae6e5656 100644 --- a/src/openrct2/ride/RideConstruction.cpp +++ b/src/openrct2/ride/RideConstruction.cpp @@ -630,7 +630,7 @@ void ride_construction_set_default_next_piece() TileElement* tileElement; _currentTrackPrice = MONEY32_UNDEFINED; - TrackElementDescriptor ted; + const TrackElementDescriptor* ted; switch (_rideConstructionState) { case RideConstructionState::Front: @@ -659,8 +659,8 @@ void ride_construction_set_default_next_piece() } } - ted = GetTrackElementDescriptor(trackType); - curve = ted.CurveChain.next; + ted = &GetTrackElementDescriptor(trackType); + curve = ted->CurveChain.next; bank = TrackDefinitions[trackType].bank_end; slope = TrackDefinitions[trackType].vangle_end; @@ -705,8 +705,8 @@ void ride_construction_set_default_next_piece() } } - ted = GetTrackElementDescriptor(trackType); - curve = ted.CurveChain.previous; + ted = &GetTrackElementDescriptor(trackType); + curve = ted->CurveChain.previous; bank = TrackDefinitions[trackType].bank_start; slope = TrackDefinitions[trackType].vangle_start; @@ -1439,7 +1439,7 @@ CoordsXYZD ride_get_entrance_or_exit_position_from_screen_position(const ScreenC */ void sub_6CB945(Ride* ride) { - TrackElementDescriptor ted; + const TrackElementDescriptor* ted; if (ride->type != RIDE_TYPE_MAZE) { for (StationIndex stationId = 0; stationId < MAX_STATIONS; ++stationId) @@ -1475,8 +1475,8 @@ void sub_6CB945(Ride* ride) if (tileElement->AsTrack()->GetSequenceIndex() != 0) continue; - ted = GetTrackElementDescriptor(tileElement->AsTrack()->GetTrackType()); - if (!(ted.TrackSequenceProperties[0] & TRACK_SEQUENCE_FLAG_ORIGIN)) + ted = &GetTrackElementDescriptor(tileElement->AsTrack()->GetTrackType()); + if (!(ted->TrackSequenceProperties[0] & TRACK_SEQUENCE_FLAG_ORIGIN)) continue; trackFound = true; @@ -1503,8 +1503,8 @@ void sub_6CB945(Ride* ride) continue; } - ted = GetTrackElementDescriptor(tileElement->AsTrack()->GetTrackType()); - const rct_preview_track* trackBlock = ted.Block; + ted = &GetTrackElementDescriptor(tileElement->AsTrack()->GetTrackType()); + const rct_preview_track* trackBlock = ted->Block; while ((++trackBlock)->index != 0xFF) { CoordsXYZ blockLocation = location + CoordsXYZ{ CoordsXY{ trackBlock->x, trackBlock->y }.Rotate(direction), 0 }; @@ -1520,8 +1520,8 @@ void sub_6CB945(Ride* ride) if (tileElement->GetType() != TILE_ELEMENT_TYPE_TRACK) continue; - ted = GetTrackElementDescriptor(tileElement->AsTrack()->GetTrackType()); - if (!(ted.TrackSequenceProperties[0] & TRACK_SEQUENCE_FLAG_ORIGIN)) + ted = &GetTrackElementDescriptor(tileElement->AsTrack()->GetTrackType()); + if (!(ted->TrackSequenceProperties[0] & TRACK_SEQUENCE_FLAG_ORIGIN)) continue; trackFound = true; @@ -1616,8 +1616,8 @@ void sub_6CB945(Ride* ride) Direction direction = (tileElement->GetDirection() - direction_reverse(trackElement->GetDirection())) & 3; - ted = GetTrackElementDescriptor(trackType); - if (!(ted.TrackSequenceProperties[trackSequence] & (1 << direction))) + ted = &GetTrackElementDescriptor(trackType); + if (!(ted->TrackSequenceProperties[trackSequence] & (1 << direction))) { continue; } From 4ada04c7ca3487ee60b270cdc761836b38a76dd7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=CE=B6eh=20Matt?= <5415177+ZehMatt@users.noreply.github.com> Date: Sun, 29 Aug 2021 12:20:17 +0300 Subject: [PATCH 26/51] Fix #15289: Duplicated banner correction using the wrong index --- src/openrct2/world/Banner.cpp | 80 ++++++++++++++++------------------- 1 file changed, 37 insertions(+), 43 deletions(-) diff --git a/src/openrct2/world/Banner.cpp b/src/openrct2/world/Banner.cpp index f51937f5bf..1d276df688 100644 --- a/src/openrct2/world/Banner.cpp +++ b/src/openrct2/world/Banner.cpp @@ -21,6 +21,7 @@ #include "../ride/RideData.h" #include "../ride/Track.h" #include "../windows/Intent.h" +#include "../world/TileElementsView.h" #include "Map.h" #include "MapAnimation.h" #include "Park.h" @@ -253,57 +254,50 @@ void fix_duplicated_banners() { // For each banner in the map, check if the banner index is in use already, and if so, create a new entry for it std::vector activeBanners; + activeBanners.resize(MAX_BANNERS); + for (int y = 0; y < MAXIMUM_MAP_SIZE_TECHNICAL; y++) { for (int x = 0; x < MAXIMUM_MAP_SIZE_TECHNICAL; x++) { - auto tileElement = map_get_first_element_at(TileCoordsXY{ x, y }.ToCoordsXY()); - if (tileElement != nullptr) + const auto bannerPos = TileCoordsXY{ x, y }.ToCoordsXY(); + for (auto* bannerElement : OpenRCT2::TileElementsView(bannerPos)) { - do + auto bannerIndex = bannerElement->GetIndex(); + if (bannerIndex == BANNER_INDEX_NULL) + continue; + + if (activeBanners[bannerIndex]) { - // TODO: Handle walls and large-scenery that use banner indices too. Large scenery can be tricky, as they - // occupy multiple tiles that should both refer to the same banner index. - if (tileElement->GetType() == TILE_ELEMENT_TYPE_BANNER) + log_info( + "Duplicated banner with index %d found at x = %d, y = %d and z = %d.", bannerIndex, x, y, + bannerElement->base_height); + + // Banner index is already in use by another banner, so duplicate it + auto newBanner = CreateBanner(); + if (newBanner == nullptr) { - auto bannerIndex = tileElement->AsBanner()->GetIndex(); - if (bannerIndex == BANNER_INDEX_NULL) - continue; - - if (activeBanners.size() <= bannerIndex) - { - activeBanners.resize(bannerIndex + 1); - } - if (activeBanners[bannerIndex]) - { - log_info( - "Duplicated banner with index %d found at x = %d, y = %d and z = %d.", bannerIndex, x, y, - tileElement->base_height); - - // Banner index is already in use by another banner, so duplicate it - auto newBanner = CreateBanner(); - if (newBanner == nullptr) - { - log_error("Failed to create new banner."); - continue; - } - Guard::Assert(!activeBanners[newBanner->id]); - - // Copy over the original banner, but update the location - auto oldBanner = GetBanner(bannerIndex); - if (oldBanner != nullptr) - { - *newBanner = *oldBanner; - newBanner->position = { x, y }; - } - - tileElement->AsBanner()->SetIndex(newBanner->id); - } - - // Mark banner index as in-use - activeBanners[bannerIndex] = true; + log_error("Failed to create new banner."); + continue; } - } while (!(tileElement++)->IsLastForTile()); + Guard::Assert(!activeBanners[newBanner->id]); + + // Copy over the original banner, but update the location + const auto* oldBanner = GetBanner(bannerIndex); + if (oldBanner != nullptr) + { + auto newBannerId = newBanner->id; + + *newBanner = *oldBanner; + newBanner->id = newBannerId; + newBanner->position = { x, y }; + } + + bannerElement->SetIndex(newBanner->id); + } + + // Mark banner index as in-use + activeBanners[bannerIndex] = true; } } } From 763d086c8557901cfc98a784dfd402ade7951fba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=CE=B6eh=20Matt?= <5415177+ZehMatt@users.noreply.github.com> Date: Sun, 29 Aug 2021 12:23:48 +0300 Subject: [PATCH 27/51] Update changelog.txt --- distribution/changelog.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/distribution/changelog.txt b/distribution/changelog.txt index 0c91d3c290..f54c97bb06 100644 --- a/distribution/changelog.txt +++ b/distribution/changelog.txt @@ -16,6 +16,7 @@ - Fix: [#15184] Crash when hovering over water types in Object Selection. - Fix: [#15193] Crash when rides/stalls are demolished. - Fix: [#15255] Tile Inspector shows banner information on walls that do not contain one. +- Fix: [#15289] Unexpected behavior with duplicated banners which also caused desyncs in multiplayer. - Improved: [#3417] Crash dumps are now placed in their own folder. - Change: [#8601] Revert ToonTower base block fix to re-enable support blocking. - Change: [#15174] [Plugin] Deprecate the type "peep" and add support to target a specific scripting api version. From b6b792f874fd61b1eb4c1e8987578bca580f34fc Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Sun, 29 Aug 2021 16:22:51 +0200 Subject: [PATCH 28/51] Add GetImage() method to rct_footpath_entry --- src/openrct2/object/FootpathObject.cpp | 10 +++++----- src/openrct2/world/Footpath.h | 17 +++++++++++++++++ 2 files changed, 22 insertions(+), 5 deletions(-) diff --git a/src/openrct2/object/FootpathObject.cpp b/src/openrct2/object/FootpathObject.cpp index 6de138b344..827c3527c9 100644 --- a/src/openrct2/object/FootpathObject.cpp +++ b/src/openrct2/object/FootpathObject.cpp @@ -42,21 +42,21 @@ void FootpathObject::Load() _pathSurfaceEntry.string_idx = _legacyType.string_idx; _pathSurfaceEntry.image = _legacyType.image; - _pathSurfaceEntry.preview = _legacyType.image + 71; + _pathSurfaceEntry.preview = _legacyType.GetPreviewImage(); _pathSurfaceEntry.flags = _legacyType.flags; _queueEntry.string_idx = _legacyType.string_idx; - _queueEntry.image = _legacyType.image + 51; - _queueEntry.preview = _legacyType.image + 72; + _queueEntry.image = _legacyType.GetQueueImage(); + _queueEntry.preview = _legacyType.GetQueuePreviewImage(); _queueEntry.flags = _legacyType.flags | FOOTPATH_ENTRY_FLAG_IS_QUEUE; _pathRailingsEntry.string_idx = _legacyType.string_idx; _pathRailingsEntry.bridge_image = _legacyType.bridge_image; - _pathRailingsEntry.preview = _legacyType.image + 71; + _pathRailingsEntry.preview = _legacyType.GetPreviewImage(); _pathRailingsEntry.flags = _legacyType.flags; _pathRailingsEntry.scrolling_mode = _legacyType.scrolling_mode; _pathRailingsEntry.support_type = _legacyType.support_type; - _pathRailingsEntry.railings_image = _legacyType.image + 73; + _pathRailingsEntry.railings_image = _legacyType.GetRailingsImage(); } void FootpathObject::Unload() diff --git a/src/openrct2/world/Footpath.h b/src/openrct2/world/Footpath.h index 3f45837433..532b40f95f 100644 --- a/src/openrct2/world/Footpath.h +++ b/src/openrct2/world/Footpath.h @@ -49,6 +49,23 @@ struct rct_footpath_entry RailingEntrySupportType support_type; // 0x0A uint8_t flags; // 0x0B uint8_t scrolling_mode; // 0x0C + + constexpr uint32_t GetQueueImage() const + { + return image + 51; + } + constexpr uint32_t GetPreviewImage() const + { + return image + 71; + } + constexpr uint32_t GetQueuePreviewImage() const + { + return image + 72; + } + constexpr uint32_t GetRailingsImage() const + { + return image + 73; + } }; assert_struct_size(rct_footpath_entry, 13); #pragma pack(pop) From 450bf61ee4f19fb8a986c0194406773544274f7a Mon Sep 17 00:00:00 2001 From: frutiemax Date: Sun, 29 Aug 2021 10:08:54 -0400 Subject: [PATCH 29/51] Part of #13874: TrackSequenceProperties, Pricing and MirrorMap renamed --- src/openrct2-ui/windows/NewRide.cpp | 2 +- src/openrct2-ui/windows/Ride.cpp | 2 +- src/openrct2-ui/windows/TrackDesignPlace.cpp | 4 ++-- src/openrct2/actions/MazePlaceTrackAction.cpp | 4 ++-- src/openrct2/actions/MazeSetTrackAction.cpp | 4 ++-- src/openrct2/actions/TrackPlaceAction.cpp | 10 +++++----- src/openrct2/actions/TrackRemoveAction.cpp | 8 ++++---- src/openrct2/actions/WallPlaceAction.cpp | 2 +- src/openrct2/ride/Ride.cpp | 16 ++++++++-------- src/openrct2/ride/RideConstruction.cpp | 10 +++++----- src/openrct2/ride/TrackData.cpp | 6 +++--- src/openrct2/ride/TrackData.h | 6 +++--- src/openrct2/ride/TrackDesign.cpp | 2 +- src/openrct2/ride/Vehicle.cpp | 4 ++-- src/openrct2/world/Footpath.cpp | 12 ++++++------ 15 files changed, 46 insertions(+), 46 deletions(-) diff --git a/src/openrct2-ui/windows/NewRide.cpp b/src/openrct2-ui/windows/NewRide.cpp index dff60eaa81..c601b19dba 100644 --- a/src/openrct2-ui/windows/NewRide.cpp +++ b/src/openrct2-ui/windows/NewRide.cpp @@ -946,7 +946,7 @@ static void window_new_ride_paint_ride_information( int32_t startPieceId = GetRideTypeDescriptor(item.Type).StartTrackPiece; money64 price = GetRideTypeDescriptor(item.Type).BuildCosts.TrackPrice; const auto& ted = GetTrackElementDescriptor(startPieceId); - price *= ted.Pricing; + price *= ted.Price; price = (price >> 17) * 10 * GetRideTypeDescriptor(item.Type).BuildCosts.PriceEstimateMultiplier; // diff --git a/src/openrct2-ui/windows/Ride.cpp b/src/openrct2-ui/windows/Ride.cpp index 7469bce3dc..1e42580432 100644 --- a/src/openrct2-ui/windows/Ride.cpp +++ b/src/openrct2-ui/windows/Ride.cpp @@ -1370,7 +1370,7 @@ rct_window* window_ride_open_track(TileElement* tileElement) auto trackElement = tileElement->AsTrack(); auto trackType = trackElement->GetTrackType(); const auto& ted = GetTrackElementDescriptor(trackType); - if (ted.TrackSequenceProperties[0] & TRACK_SEQUENCE_FLAG_ORIGIN) + if (ted.SequenceProperties[0] & TRACK_SEQUENCE_FLAG_ORIGIN) { auto stationIndex = trackElement->GetStationIndex(); return window_ride_open_station(ride, stationIndex); diff --git a/src/openrct2-ui/windows/TrackDesignPlace.cpp b/src/openrct2-ui/windows/TrackDesignPlace.cpp index 26d46164af..58da05f5bd 100644 --- a/src/openrct2-ui/windows/TrackDesignPlace.cpp +++ b/src/openrct2-ui/windows/TrackDesignPlace.cpp @@ -574,8 +574,8 @@ static void window_track_place_draw_mini_preview_track( auto bits = trackBlock->var_08.Rotate(curTrackRotation & 3).GetBaseQuarterOccupied(); // Station track is a lighter colour - uint8_t colour = (ted.TrackSequenceProperties[0] & TRACK_SEQUENCE_FLAG_ORIGIN) ? _PaletteIndexColourStation - : _PaletteIndexColourTrack; + uint8_t colour = (ted.SequenceProperties[0] & TRACK_SEQUENCE_FLAG_ORIGIN) ? _PaletteIndexColourStation + : _PaletteIndexColourTrack; for (int32_t i = 0; i < 4; i++) { diff --git a/src/openrct2/actions/MazePlaceTrackAction.cpp b/src/openrct2/actions/MazePlaceTrackAction.cpp index c39f19a21b..c62e469524 100644 --- a/src/openrct2/actions/MazePlaceTrackAction.cpp +++ b/src/openrct2/actions/MazePlaceTrackAction.cpp @@ -116,7 +116,7 @@ GameActions::Result::Ptr MazePlaceTrackAction::Query() const } const auto& ted = GetTrackElementDescriptor(TrackElemType::Maze); - money32 price = (((ride->GetRideTypeDescriptor().BuildCosts.TrackPrice * ted.Pricing) >> 16)); + money32 price = (((ride->GetRideTypeDescriptor().BuildCosts.TrackPrice * ted.Price) >> 16)); res->Cost = canBuild->Cost + price / 2 * 10; return res; @@ -158,7 +158,7 @@ GameActions::Result::Ptr MazePlaceTrackAction::Execute() const } const auto& ted = GetTrackElementDescriptor(TrackElemType::Maze); - money32 price = (((ride->GetRideTypeDescriptor().BuildCosts.TrackPrice * ted.Pricing) >> 16)); + money32 price = (((ride->GetRideTypeDescriptor().BuildCosts.TrackPrice * ted.Price) >> 16)); res->Cost = canBuild->Cost + price / 2 * 10; auto startLoc = _loc.ToTileStart(); diff --git a/src/openrct2/actions/MazeSetTrackAction.cpp b/src/openrct2/actions/MazeSetTrackAction.cpp index 167f67e1fd..f0dd07396f 100644 --- a/src/openrct2/actions/MazeSetTrackAction.cpp +++ b/src/openrct2/actions/MazeSetTrackAction.cpp @@ -137,7 +137,7 @@ GameActions::Result::Ptr MazeSetTrackAction::Query() const } const auto& ted = GetTrackElementDescriptor(TrackElemType::Maze); - money32 price = (((ride->GetRideTypeDescriptor().BuildCosts.TrackPrice * ted.Pricing) >> 16)); + money32 price = (((ride->GetRideTypeDescriptor().BuildCosts.TrackPrice * ted.Price) >> 16)); res->Cost = price / 2 * 10; return res; @@ -173,7 +173,7 @@ GameActions::Result::Ptr MazeSetTrackAction::Execute() const if (tileElement == nullptr) { const auto& ted = GetTrackElementDescriptor(TrackElemType::Maze); - money32 price = (((ride->GetRideTypeDescriptor().BuildCosts.TrackPrice * ted.Pricing) >> 16)); + money32 price = (((ride->GetRideTypeDescriptor().BuildCosts.TrackPrice * ted.Price) >> 16)); res->Cost = price / 2 * 10; auto startLoc = _loc.ToTileStart(); diff --git a/src/openrct2/actions/TrackPlaceAction.cpp b/src/openrct2/actions/TrackPlaceAction.cpp index 1763aba396..2f36dfc5c8 100644 --- a/src/openrct2/actions/TrackPlaceAction.cpp +++ b/src/openrct2/actions/TrackPlaceAction.cpp @@ -318,7 +318,7 @@ GameActions::Result::Ptr TrackPlaceAction::Query() const } } - int32_t entranceDirections = ted.TrackSequenceProperties[0]; + int32_t entranceDirections = ted.SequenceProperties[0]; if ((entranceDirections & TRACK_SEQUENCE_FLAG_ORIGIN) && trackBlock->index == 0) { if (!track_add_station_element({ mapLoc, baseZ, _origin.direction }, _rideIndex, 0, _fromTrackDesign)) @@ -367,7 +367,7 @@ GameActions::Result::Ptr TrackPlaceAction::Query() const } money32 price = ride->GetRideTypeDescriptor().BuildCosts.TrackPrice; - price *= ted.Pricing; + price *= ted.Price; price >>= 16; res->Cost = cost + ((price / 2) * 10); @@ -538,7 +538,7 @@ GameActions::Result::Ptr TrackPlaceAction::Execute() const { if (!(GetFlags() & GAME_COMMAND_FLAG_NO_SPEND)) { - entranceDirections = ted.TrackSequenceProperties[0]; + entranceDirections = ted.SequenceProperties[0]; } } @@ -597,7 +597,7 @@ GameActions::Result::Ptr TrackPlaceAction::Execute() const } trackElement->SetColourScheme(_colour); - entranceDirections = ted.TrackSequenceProperties[0]; + entranceDirections = ted.SequenceProperties[0]; if (entranceDirections & TRACK_SEQUENCE_FLAG_CONNECTS_TO_PATH) { uint8_t availableDirections = entranceDirections & 0x0F; @@ -653,7 +653,7 @@ GameActions::Result::Ptr TrackPlaceAction::Execute() const } money32 price = ride->GetRideTypeDescriptor().BuildCosts.TrackPrice; - price *= ted.Pricing; + price *= ted.Price; price >>= 16; res->Cost = cost + ((price / 2) * 10); diff --git a/src/openrct2/actions/TrackRemoveAction.cpp b/src/openrct2/actions/TrackRemoveAction.cpp index 49e9967d05..8e1bf2b942 100644 --- a/src/openrct2/actions/TrackRemoveAction.cpp +++ b/src/openrct2/actions/TrackRemoveAction.cpp @@ -203,7 +203,7 @@ GameActions::Result::Ptr TrackRemoveAction::Query() const return MakeResult(GameActions::Status::Unknown, STR_RIDE_CONSTRUCTION_CANT_REMOVE_THIS); } - int32_t entranceDirections = ted.TrackSequenceProperties[0]; + int32_t entranceDirections = ted.SequenceProperties[0]; if (entranceDirections & TRACK_SEQUENCE_FLAG_ORIGIN && (tileElement->AsTrack()->GetSequenceIndex() == 0)) { if (!track_remove_station_element({ mapLoc, _origin.direction }, rideIndex, 0)) @@ -229,7 +229,7 @@ GameActions::Result::Ptr TrackRemoveAction::Query() const } money32 price = ride->GetRideTypeDescriptor().BuildCosts.TrackPrice; - price *= ted.Pricing; + price *= ted.Price; price >>= 16; price = (price + cost) / 2; if (ride->lifecycle_flags & RIDE_LIFECYCLE_EVER_BEEN_OPENED) @@ -378,7 +378,7 @@ GameActions::Result::Ptr TrackRemoveAction::Execute() const return MakeResult(GameActions::Status::Unknown, STR_RIDE_CONSTRUCTION_CANT_REMOVE_THIS); } - int32_t entranceDirections = ted.TrackSequenceProperties[0]; + int32_t entranceDirections = ted.SequenceProperties[0]; if (entranceDirections & TRACK_SEQUENCE_FLAG_ORIGIN && (tileElement->AsTrack()->GetSequenceIndex() == 0)) { if (!track_remove_station_element({ mapLoc, _origin.direction }, rideIndex, 0)) @@ -477,7 +477,7 @@ GameActions::Result::Ptr TrackRemoveAction::Execute() const } money32 price = ride->GetRideTypeDescriptor().BuildCosts.TrackPrice; - price *= ted.Pricing; + price *= ted.Price; price >>= 16; price = (price + cost) / 2; if (ride->lifecycle_flags & RIDE_LIFECYCLE_EVER_BEEN_OPENED) diff --git a/src/openrct2/actions/WallPlaceAction.cpp b/src/openrct2/actions/WallPlaceAction.cpp index 2f660ea596..d50b922c65 100644 --- a/src/openrct2/actions/WallPlaceAction.cpp +++ b/src/openrct2/actions/WallPlaceAction.cpp @@ -441,7 +441,7 @@ bool WallPlaceAction::WallCheckObstructionWithTrack( int32_t z; if (sequence == 0) { - if (ted.TrackSequenceProperties[0] & TRACK_SEQUENCE_FLAG_DISALLOW_DOORS) + if (ted.SequenceProperties[0] & TRACK_SEQUENCE_FLAG_DISALLOW_DOORS) { return false; } diff --git a/src/openrct2/ride/Ride.cpp b/src/openrct2/ride/Ride.cpp index 7774faf789..ee659c2023 100644 --- a/src/openrct2/ride/Ride.cpp +++ b/src/openrct2/ride/Ride.cpp @@ -414,7 +414,7 @@ bool ride_try_get_origin_element(const Ride* ride, CoordsXYE* output) bool specialTrackPiece = (it.element->AsTrack()->GetTrackType() != TrackElemType::BeginStation && it.element->AsTrack()->GetTrackType() != TrackElemType::MiddleStation - && (ted.TrackSequenceProperties[0] & TRACK_SEQUENCE_FLAG_ORIGIN)); + && (ted.SequenceProperties[0] & TRACK_SEQUENCE_FLAG_ORIGIN)); // Set result tile to this track piece if first found track or a ??? if (resultTileElement == nullptr || specialTrackPiece) @@ -2230,7 +2230,7 @@ static void ride_shop_connected(Ride* ride) } const auto& ted = GetTrackElementDescriptor(track_type); - uint8_t entrance_directions = ted.TrackSequenceProperties[0] & 0xF; + uint8_t entrance_directions = ted.SequenceProperties[0] & 0xF; uint8_t tile_direction = trackElement->GetDirection(); entrance_directions = rol4(entrance_directions, tile_direction); @@ -2775,7 +2775,7 @@ static int32_t ride_check_station_length(CoordsXYE* input, CoordsXYE* output) do { const auto& ted = GetTrackElementDescriptor(output->element->AsTrack()->GetTrackType()); - if (ted.TrackSequenceProperties[0] & TRACK_SEQUENCE_FLAG_ORIGIN) + if (ted.SequenceProperties[0] & TRACK_SEQUENCE_FLAG_ORIGIN) { num_station_elements++; last_good_station = *output; @@ -2823,7 +2823,7 @@ static bool ride_check_start_and_end_is_station(CoordsXYE* input) track_get_back(input, &trackBack); auto trackType = trackBack.element->AsTrack()->GetTrackType(); const auto* ted = &GetTrackElementDescriptor(trackType); - if (!(ted->TrackSequenceProperties[0] & TRACK_SEQUENCE_FLAG_ORIGIN)) + if (!(ted->SequenceProperties[0] & TRACK_SEQUENCE_FLAG_ORIGIN)) { return false; } @@ -2833,7 +2833,7 @@ static bool ride_check_start_and_end_is_station(CoordsXYE* input) track_get_front(input, &trackFront); trackType = trackFront.element->AsTrack()->GetTrackType(); ted = &GetTrackElementDescriptor(trackType); - if (!(ted->TrackSequenceProperties[0] & TRACK_SEQUENCE_FLAG_ORIGIN)) + if (!(ted->SequenceProperties[0] & TRACK_SEQUENCE_FLAG_ORIGIN)) { return false; } @@ -3545,7 +3545,7 @@ static bool ride_initialise_cable_lift_track(Ride* ride, bool isApplying) continue; const auto& ted = GetTrackElementDescriptor(tileElement->AsTrack()->GetTrackType()); - if (!(ted.TrackSequenceProperties[0] & TRACK_SEQUENCE_FLAG_ORIGIN)) + if (!(ted.SequenceProperties[0] & TRACK_SEQUENCE_FLAG_ORIGIN)) { continue; } @@ -3778,7 +3778,7 @@ TrackElement* Ride::GetOriginElement(StationIndex stationIndex) const auto* trackElement = tileElement->AsTrack(); const auto& ted = GetTrackElementDescriptor(trackElement->GetTrackType()); - if (!(ted.TrackSequenceProperties[0] & TRACK_SEQUENCE_FLAG_ORIGIN)) + if (!(ted.SequenceProperties[0] & TRACK_SEQUENCE_FLAG_ORIGIN)) continue; if (trackElement->GetRideIndex() == id) @@ -4885,7 +4885,7 @@ static int32_t ride_get_track_length(Ride* ride) trackType = tileElement->AsTrack()->GetTrackType(); const auto& ted = GetTrackElementDescriptor(trackType); - if (!(ted.TrackSequenceProperties[0] & TRACK_SEQUENCE_FLAG_ORIGIN)) + if (!(ted.SequenceProperties[0] & TRACK_SEQUENCE_FLAG_ORIGIN)) continue; if (tileElement->GetBaseZ() != trackStart.z) diff --git a/src/openrct2/ride/RideConstruction.cpp b/src/openrct2/ride/RideConstruction.cpp index 0eae6e5656..de5f99dfd3 100644 --- a/src/openrct2/ride/RideConstruction.cpp +++ b/src/openrct2/ride/RideConstruction.cpp @@ -1255,7 +1255,7 @@ CoordsXYZD ride_get_entrance_or_exit_position_from_screen_position(const ScreenC if (info.Element->AsTrack()->GetRideIndex() == gRideEntranceExitPlaceRideIndex) { const auto& ted = GetTrackElementDescriptor(info.Element->AsTrack()->GetTrackType()); - if (ted.TrackSequenceProperties[0] & TRACK_SEQUENCE_FLAG_ORIGIN) + if (ted.SequenceProperties[0] & TRACK_SEQUENCE_FLAG_ORIGIN) { if (info.Element->AsTrack()->GetTrackType() == TrackElemType::Maze) { @@ -1346,7 +1346,7 @@ CoordsXYZD ride_get_entrance_or_exit_position_from_screen_position(const ScreenC int32_t eax = (entranceExitCoords.direction + 2 - tileElement->GetDirection()) & TILE_ELEMENT_DIRECTION_MASK; const auto& ted = GetTrackElementDescriptor(tileElement->AsTrack()->GetTrackType()); - if (ted.TrackSequenceProperties[tileElement->AsTrack()->GetSequenceIndex()] & (1 << eax)) + if (ted.SequenceProperties[tileElement->AsTrack()->GetSequenceIndex()] & (1 << eax)) { entranceExitCoords.direction = direction_reverse(entranceExitCoords.direction); gRideEntranceExitPlaceDirection = entranceExitCoords.direction; @@ -1476,7 +1476,7 @@ void sub_6CB945(Ride* ride) continue; ted = &GetTrackElementDescriptor(tileElement->AsTrack()->GetTrackType()); - if (!(ted->TrackSequenceProperties[0] & TRACK_SEQUENCE_FLAG_ORIGIN)) + if (!(ted->SequenceProperties[0] & TRACK_SEQUENCE_FLAG_ORIGIN)) continue; trackFound = true; @@ -1521,7 +1521,7 @@ void sub_6CB945(Ride* ride) continue; ted = &GetTrackElementDescriptor(tileElement->AsTrack()->GetTrackType()); - if (!(ted->TrackSequenceProperties[0] & TRACK_SEQUENCE_FLAG_ORIGIN)) + if (!(ted->SequenceProperties[0] & TRACK_SEQUENCE_FLAG_ORIGIN)) continue; trackFound = true; @@ -1617,7 +1617,7 @@ void sub_6CB945(Ride* ride) Direction direction = (tileElement->GetDirection() - direction_reverse(trackElement->GetDirection())) & 3; ted = &GetTrackElementDescriptor(trackType); - if (!(ted->TrackSequenceProperties[trackSequence] & (1 << direction))) + if (!(ted->SequenceProperties[trackSequence] & (1 << direction))) { continue; } diff --git a/src/openrct2/ride/TrackData.cpp b/src/openrct2/ride/TrackData.cpp index 4777b5faf9..f30a130642 100644 --- a/src/openrct2/ride/TrackData.cpp +++ b/src/openrct2/ride/TrackData.cpp @@ -5148,14 +5148,14 @@ namespace OpenRCT2 desc.CurveChain = gTrackCurveChain[i]; desc.Flags = TrackFlags[i]; desc.HeightMarkerPositions = TrackHeightMarkerPositions[i]; - desc.MirrorMap = TrackElementMirrorMap[i]; + desc.MirrorElement = TrackElementMirrorMap[i]; desc.PieceLength = TrackPieceLengths[i]; - desc.Pricing = TrackPricing[i]; + desc.Price = TrackPricing[i]; for (uint8_t j = 0; j < MaxSequencesPerPiece; j++) { desc.SequenceElementAllowedWallEdges[j] = TrackSequenceElementAllowedWallEdges[i][j]; - desc.TrackSequenceProperties[j] = TrackSequenceProperties[i][j]; + desc.SequenceProperties[j] = TrackSequenceProperties[i][j]; } _trackElementDescriptors.push_back(desc); } diff --git a/src/openrct2/ride/TrackData.h b/src/openrct2/ride/TrackData.h index 0b43a74426..4cd3705355 100644 --- a/src/openrct2/ride/TrackData.h +++ b/src/openrct2/ride/TrackData.h @@ -63,13 +63,13 @@ struct TrackElementDescriptor uint8_t PieceLength; track_curve_chain CurveChain; track_type_t AlternativeType; - money32 Pricing; - track_type_t MirrorMap; + money32 Price; + track_type_t MirrorElement; uint32_t HeightMarkerPositions; uint16_t Flags; std::array SequenceElementAllowedWallEdges; - std::array TrackSequenceProperties; + std::array SequenceProperties; }; namespace OpenRCT2 diff --git a/src/openrct2/ride/TrackDesign.cpp b/src/openrct2/ride/TrackDesign.cpp index e2144e571e..e6394da8fb 100644 --- a/src/openrct2/ride/TrackDesign.cpp +++ b/src/openrct2/ride/TrackDesign.cpp @@ -771,7 +771,7 @@ static void track_design_mirror_ride(TrackDesign* td6) for (auto& track : td6->track_elements) { const auto& ted = GetTrackElementDescriptor(track.type); - track.type = ted.MirrorMap; + track.type = ted.MirrorElement; } for (auto& entrance : td6->entrance_elements) diff --git a/src/openrct2/ride/Vehicle.cpp b/src/openrct2/ride/Vehicle.cpp index 4c9057d2d3..e1cbfce103 100644 --- a/src/openrct2/ride/Vehicle.cpp +++ b/src/openrct2/ride/Vehicle.cpp @@ -7934,7 +7934,7 @@ void Vehicle::Sub6DBF3E() auto trackType = GetTrackType(); const auto& ted = GetTrackElementDescriptor(trackType); - if (!(ted.TrackSequenceProperties[0] & TRACK_SEQUENCE_FLAG_ORIGIN)) + if (!(ted.SequenceProperties[0] & TRACK_SEQUENCE_FLAG_ORIGIN)) { return; } @@ -9210,7 +9210,7 @@ loc_6DCE02: { auto trackType = GetTrackType(); const auto& ted = GetTrackElementDescriptor(trackType); - if (!(ted.TrackSequenceProperties[0] & TRACK_SEQUENCE_FLAG_ORIGIN)) + if (!(ted.SequenceProperties[0] & TRACK_SEQUENCE_FLAG_ORIGIN)) { return; } diff --git a/src/openrct2/world/Footpath.cpp b/src/openrct2/world/Footpath.cpp index 92bf23ead8..1dceddad05 100644 --- a/src/openrct2/world/Footpath.cpp +++ b/src/openrct2/world/Footpath.cpp @@ -882,14 +882,14 @@ static void loc_6A6D7E( const auto trackType = tileElement->AsTrack()->GetTrackType(); const uint8_t trackSequence = tileElement->AsTrack()->GetSequenceIndex(); const auto& ted = GetTrackElementDescriptor(trackType); - if (!(ted.TrackSequenceProperties[trackSequence] & TRACK_SEQUENCE_FLAG_CONNECTS_TO_PATH)) + if (!(ted.SequenceProperties[trackSequence] & TRACK_SEQUENCE_FLAG_CONNECTS_TO_PATH)) { return; } uint16_t dx = direction_reverse( (direction - tileElement->GetDirection()) & TILE_ELEMENT_DIRECTION_MASK); - if (!(ted.TrackSequenceProperties[trackSequence] & (1 << dx))) + if (!(ted.SequenceProperties[trackSequence] & (1 << dx))) { return; } @@ -966,12 +966,12 @@ static void loc_6A6C85( const auto trackType = tileElementPos.element->AsTrack()->GetTrackType(); const uint8_t trackSequence = tileElementPos.element->AsTrack()->GetSequenceIndex(); const auto& ted = GetTrackElementDescriptor(trackType); - if (!(ted.TrackSequenceProperties[trackSequence] & TRACK_SEQUENCE_FLAG_CONNECTS_TO_PATH)) + if (!(ted.SequenceProperties[trackSequence] & TRACK_SEQUENCE_FLAG_CONNECTS_TO_PATH)) { return; } uint16_t dx = (direction - tileElementPos.element->GetDirection()) & TILE_ELEMENT_DIRECTION_MASK; - if (!(ted.TrackSequenceProperties[trackSequence] & (1 << dx))) + if (!(ted.SequenceProperties[trackSequence] & (1 << dx))) { return; } @@ -2108,10 +2108,10 @@ bool tile_element_wants_path_connection_towards(const TileCoordsXYZD& coords, co const auto trackType = tileElement->AsTrack()->GetTrackType(); const uint8_t trackSequence = tileElement->AsTrack()->GetSequenceIndex(); const auto& ted = GetTrackElementDescriptor(trackType); - if (ted.TrackSequenceProperties[trackSequence] & TRACK_SEQUENCE_FLAG_CONNECTS_TO_PATH) + if (ted.SequenceProperties[trackSequence] & TRACK_SEQUENCE_FLAG_CONNECTS_TO_PATH) { uint16_t dx = ((coords.direction - tileElement->GetDirection()) & TILE_ELEMENT_DIRECTION_MASK); - if (ted.TrackSequenceProperties[trackSequence] & (1 << dx)) + if (ted.SequenceProperties[trackSequence] & (1 << dx)) { // Track element has the flags required for the given direction return true; From bcba227430f0b669077c6ddac769a945177d2321 Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Sun, 29 Aug 2021 17:07:38 +0200 Subject: [PATCH 30/51] Add footpath surface and railings objects from NSF --- OpenRCT2.xcodeproj/project.pbxproj | 12 +++ src/openrct2/interface/Colour.h | 4 +- src/openrct2/libopenrct2.vcxproj | 6 +- .../object/FootpathRailingsObject.cpp | 94 +++++++++++++++++++ src/openrct2/object/FootpathRailingsObject.h | 41 ++++++++ src/openrct2/object/FootpathSurfaceObject.cpp | 69 ++++++++++++++ src/openrct2/object/FootpathSurfaceObject.h | 36 +++++++ src/openrct2/object/Object.h | 2 + src/openrct2/object/ObjectFactory.cpp | 12 +++ src/openrct2/object/ObjectRepository.h | 4 + src/openrct2/world/Footpath.h | 1 + 11 files changed, 279 insertions(+), 2 deletions(-) create mode 100644 src/openrct2/object/FootpathRailingsObject.cpp create mode 100644 src/openrct2/object/FootpathRailingsObject.h create mode 100644 src/openrct2/object/FootpathSurfaceObject.cpp create mode 100644 src/openrct2/object/FootpathSurfaceObject.h diff --git a/OpenRCT2.xcodeproj/project.pbxproj b/OpenRCT2.xcodeproj/project.pbxproj index 5733a6f091..f0fdda19f7 100644 --- a/OpenRCT2.xcodeproj/project.pbxproj +++ b/OpenRCT2.xcodeproj/project.pbxproj @@ -60,6 +60,8 @@ 4C8BB68525533DB9005C8830 /* ZoomLevel.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4C8BB68425533DB9005C8830 /* ZoomLevel.cpp */; }; 4C91FD5F25AE476700CA5DA4 /* MusicObject.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4C91FD5D25AE476700CA5DA4 /* MusicObject.cpp */; }; 4C91FD6225AE483700CA5DA4 /* RideAudio.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4C91FD6025AE483600CA5DA4 /* RideAudio.cpp */; }; + 4C976BC5263976F0002DEBD5 /* FootpathSurfaceObject.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4C976BC1263976F0002DEBD5 /* FootpathSurfaceObject.cpp */; }; + 4C976BC6263976F0002DEBD5 /* FootpathRailingsObject.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4C976BC2263976F0002DEBD5 /* FootpathRailingsObject.cpp */; }; 4CA23D64263C91D800077AA1 /* ChecksumStream.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4CA23D62263C91D700077AA1 /* ChecksumStream.cpp */; }; 4CA23DB2263C920900077AA1 /* Entity.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4CA23DB1263C920900077AA1 /* Entity.cpp */; }; 4CA39E512513F8A00094066B /* RTL.ICU.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4CA39E4E2513F8A00094066B /* RTL.ICU.cpp */; }; @@ -1189,6 +1191,10 @@ 4C93F1B71F8E185600A9330D /* NewsItem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NewsItem.h; sourceTree = ""; }; 4C93F1B81F8E185600A9330D /* Research.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Research.cpp; sourceTree = ""; }; 4C93F1B91F8E185600A9330D /* Research.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Research.h; sourceTree = ""; }; + 4C976BC1263976F0002DEBD5 /* FootpathSurfaceObject.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = FootpathSurfaceObject.cpp; sourceTree = ""; }; + 4C976BC2263976F0002DEBD5 /* FootpathRailingsObject.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = FootpathRailingsObject.cpp; sourceTree = ""; }; + 4C976BC3263976F0002DEBD5 /* FootpathRailingsObject.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FootpathRailingsObject.h; sourceTree = ""; }; + 4C976BC4263976F0002DEBD5 /* FootpathSurfaceObject.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FootpathSurfaceObject.h; sourceTree = ""; }; 4CA23D62263C91D700077AA1 /* ChecksumStream.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ChecksumStream.cpp; sourceTree = ""; }; 4CA23D63263C91D700077AA1 /* ChecksumStream.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ChecksumStream.h; sourceTree = ""; }; 4CA23DAF263C920900077AA1 /* Entity.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Entity.h; sourceTree = ""; }; @@ -2739,6 +2745,10 @@ F76C84171EC4E7CC00FA49E2 /* FootpathItemObject.h */, F76C84181EC4E7CC00FA49E2 /* FootpathObject.cpp */, F76C84191EC4E7CC00FA49E2 /* FootpathObject.h */, + 4C976BC2263976F0002DEBD5 /* FootpathRailingsObject.cpp */, + 4C976BC3263976F0002DEBD5 /* FootpathRailingsObject.h */, + 4C976BC1263976F0002DEBD5 /* FootpathSurfaceObject.cpp */, + 4C976BC4263976F0002DEBD5 /* FootpathSurfaceObject.h */, F76C841A1EC4E7CC00FA49E2 /* ImageTable.cpp */, F76C841B1EC4E7CC00FA49E2 /* ImageTable.h */, F76C841C1EC4E7CC00FA49E2 /* LargeSceneryObject.cpp */, @@ -3980,6 +3990,7 @@ 4CA23DB2263C920900077AA1 /* Entity.cpp in Sources */, C64644F91F3FA4120026AC2D /* EditorInventionsList.cpp in Sources */, C68878C720289B710084B384 /* OpenGLShaderProgram.cpp in Sources */, + 4C976BC5263976F0002DEBD5 /* FootpathSurfaceObject.cpp in Sources */, 4CA39E512513F8A00094066B /* RTL.ICU.cpp in Sources */, 93CBA4C420A7502E00867D56 /* Imaging.cpp in Sources */, C6D2BEE61F9BAACE008B557C /* TrackList.cpp in Sources */, @@ -3993,6 +4004,7 @@ C68878C520289B710084B384 /* OpenGLDrawingEngine.cpp in Sources */, C6D2BEE71F9BAACE008B557C /* MapTooltip.cpp in Sources */, C666EE7B1F37ACB10061AA04 /* TitleExit.cpp in Sources */, + 4C976BC6263976F0002DEBD5 /* FootpathRailingsObject.cpp in Sources */, F7D7747F1EC61E5100BE6EBC /* UiContext.macOS.mm in Sources */, F76C887E1EC5324E00FA49E2 /* CursorRepository.cpp in Sources */, C654DF331F69C0430040F43D /* LoadSave.cpp in Sources */, diff --git a/src/openrct2/interface/Colour.h b/src/openrct2/interface/Colour.h index 3dab46bc72..e4f79b65dc 100644 --- a/src/openrct2/interface/Colour.h +++ b/src/openrct2/interface/Colour.h @@ -51,7 +51,9 @@ enum : colour_t COLOUR_BRIGHT_PINK, COLOUR_LIGHT_PINK, - COLOUR_COUNT + COLOUR_COUNT, + + COLOUR_NULL = 255, }; /** diff --git a/src/openrct2/libopenrct2.vcxproj b/src/openrct2/libopenrct2.vcxproj index 8d336d6de6..344bada47a 100644 --- a/src/openrct2/libopenrct2.vcxproj +++ b/src/openrct2/libopenrct2.vcxproj @@ -256,6 +256,8 @@ + + @@ -696,6 +698,8 @@ + + @@ -918,4 +922,4 @@ - \ No newline at end of file + diff --git a/src/openrct2/object/FootpathRailingsObject.cpp b/src/openrct2/object/FootpathRailingsObject.cpp new file mode 100644 index 0000000000..ee16825968 --- /dev/null +++ b/src/openrct2/object/FootpathRailingsObject.cpp @@ -0,0 +1,94 @@ +/***************************************************************************** + * Copyright (c) 2014-2021 OpenRCT2 developers + * + * For a complete list of all authors, please refer to contributors.md + * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 + * + * OpenRCT2 is licensed under the GNU General Public License version 3. + *****************************************************************************/ + +#include "FootpathRailingsObject.h" + +#include "../core/IStream.hpp" +#include "../core/Json.hpp" + +void FootpathRailingsObject::Load() +{ + GetStringTable().Sort(); + NameStringId = language_allocate_object_string(GetName()); + + auto numImages = GetImageTable().GetCount(); + if (numImages != 0) + { + PreviewImageId = gfx_object_allocate_images(GetImageTable().GetImages(), GetImageTable().GetCount()); + BridgeImageId = PreviewImageId + 37; + RailingsImageId = PreviewImageId + 1; + } +} + +void FootpathRailingsObject::Unload() +{ + language_free_object_string(NameStringId); + gfx_object_free_images(PreviewImageId, GetImageTable().GetCount()); + + NameStringId = 0; + PreviewImageId = 0; + BridgeImageId = 0; + RailingsImageId = 0; +} + +void FootpathRailingsObject::DrawPreview(rct_drawpixelinfo* dpi, int32_t width, int32_t height) const +{ + auto x = width / 2; + auto y = height / 2; + if (SupportType == RailingEntrySupportType::Pole) + { + auto img = ImageId(BridgeImageId + 20 + 15, Colour); + for (int i = 0; i < 2; i++) + { + auto h = i * 16; + gfx_draw_sprite(dpi, img, { x - 8, y + 8 + h }); + gfx_draw_sprite(dpi, img, { x + 8, y + 16 + h }); + } + + gfx_draw_sprite(dpi, BridgeImageId + 5, { x, y - 17 }, 0); + gfx_draw_sprite(dpi, RailingsImageId + 1, { x + 4, y - 14 }, 0); + gfx_draw_sprite(dpi, RailingsImageId + 1, { x + 27, y - 2 }, 0); + } + else + { + gfx_draw_sprite(dpi, BridgeImageId + 22, { x + 0, y + 16 }, 0); + gfx_draw_sprite(dpi, BridgeImageId + 49, { x, y - 17 }, 0); + gfx_draw_sprite(dpi, RailingsImageId + 1, { x + 4, y - 14 }, 0); + gfx_draw_sprite(dpi, RailingsImageId + 1, { x + 27, y - 3 }, 0); + } +} + +void FootpathRailingsObject::ReadJson(IReadObjectContext* context, json_t& root) +{ + Guard::Assert(root.is_object(), "FootpathObject::ReadJson expects parameter root to be object"); + + auto properties = root["properties"]; + if (properties.is_object()) + { + SupportType = ParseSupportType(Json::GetString(properties["supportType"])); + ScrollingMode = Json::GetNumber(properties["scrollingMode"]); + Colour = Colour::FromString(Json::GetString(properties["colour"]), COLOUR_NULL); + Flags = Json::GetFlags( + properties, + { + { "hasSupportImages", RAILING_ENTRY_FLAG_HAS_SUPPORT_BASE_SPRITE }, + { "hasElevatedPathImages", RAILING_ENTRY_FLAG_DRAW_PATH_OVER_SUPPORTS }, + }); + } + + PopulateTablesFromJson(context, root); +} + +RailingEntrySupportType FootpathRailingsObject::ParseSupportType(std::string_view s) +{ + if (s == "pole") + return RailingEntrySupportType::Pole; + else /* if (s == "box") */ + return RailingEntrySupportType::Box; +} diff --git a/src/openrct2/object/FootpathRailingsObject.h b/src/openrct2/object/FootpathRailingsObject.h new file mode 100644 index 0000000000..2b61ec9255 --- /dev/null +++ b/src/openrct2/object/FootpathRailingsObject.h @@ -0,0 +1,41 @@ +/***************************************************************************** + * Copyright (c) 2014-2021 OpenRCT2 developers + * + * For a complete list of all authors, please refer to contributors.md + * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 + * + * OpenRCT2 is licensed under the GNU General Public License version 3. + *****************************************************************************/ + +#pragma once + +#include "../world/Footpath.h" +#include "Object.h" + +class FootpathRailingsObject final : public Object +{ +public: + rct_string_id NameStringId{}; + uint32_t PreviewImageId{}; + uint32_t BridgeImageId{}; + uint32_t RailingsImageId{}; + RailingEntrySupportType SupportType{}; + uint8_t Flags{}; + uint8_t ScrollingMode{}; + colour_t Colour{}; + +public: + explicit FootpathRailingsObject(const rct_object_entry& entry) + : Object(entry) + { + } + + void ReadJson(IReadObjectContext* context, json_t& root) override; + void Load() override; + void Unload() override; + + void DrawPreview(rct_drawpixelinfo* dpi, int32_t width, int32_t height) const override; + +private: + RailingEntrySupportType ParseSupportType(std::string_view s); +}; diff --git a/src/openrct2/object/FootpathSurfaceObject.cpp b/src/openrct2/object/FootpathSurfaceObject.cpp new file mode 100644 index 0000000000..66b89b6727 --- /dev/null +++ b/src/openrct2/object/FootpathSurfaceObject.cpp @@ -0,0 +1,69 @@ +/***************************************************************************** + * Copyright (c) 2014-2021 OpenRCT2 developers + * + * For a complete list of all authors, please refer to contributors.md + * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 + * + * OpenRCT2 is licensed under the GNU General Public License version 3. + *****************************************************************************/ + +#include "FootpathSurfaceObject.h" + +#include "../core/IStream.hpp" +#include "../core/Json.hpp" +#include "../object/ObjectRepository.h" + +void FootpathSurfaceObject::Load() +{ + GetStringTable().Sort(); + NameStringId = language_allocate_object_string(GetName()); + + auto numImages = GetImageTable().GetCount(); + if (numImages != 0) + { + PreviewImageId = gfx_object_allocate_images(GetImageTable().GetImages(), GetImageTable().GetCount()); + BaseImageId = PreviewImageId + 1; + } +} + +void FootpathSurfaceObject::Unload() +{ + language_free_object_string(NameStringId); + gfx_object_free_images(PreviewImageId, GetImageTable().GetCount()); + + NameStringId = 0; + PreviewImageId = 0; + BaseImageId = 0; +} + +void FootpathSurfaceObject::DrawPreview(rct_drawpixelinfo* dpi, int32_t width, int32_t height) const +{ + auto screenCoords = ScreenCoordsXY{ width / 2 - 16, height / 2 }; + gfx_draw_sprite(dpi, BaseImageId + 3, screenCoords, 0); + gfx_draw_sprite(dpi, BaseImageId + 16, { screenCoords.x + 32, screenCoords.y - 16 }, 0); + gfx_draw_sprite(dpi, BaseImageId + 8, { screenCoords.x + 32, screenCoords.y + 16 }, 0); +} + +void FootpathSurfaceObject::ReadJson(IReadObjectContext* context, json_t& root) +{ + Guard::Assert(root.is_object(), "FootpathSurfaceObject::ReadJson expects parameter root to be object"); + + auto properties = root["properties"]; + if (properties.is_object()) + { + Flags = Json::GetFlags( + properties, + { + { "editorOnly", FOOTPATH_ENTRY_FLAG_SHOW_ONLY_IN_SCENARIO_EDITOR }, + { "isQueue", FOOTPATH_ENTRY_FLAG_IS_QUEUE }, + { "noSlopeRailings", FOOTPATH_ENTRY_FLAG_NO_SLOPE_RAILINGS }, + }); + } + + PopulateTablesFromJson(context, root); +} + +void FootpathSurfaceObject::SetRepositoryItem(ObjectRepositoryItem* item) const +{ + item->FootpathSurfaceInfo.Flags = Flags; +} diff --git a/src/openrct2/object/FootpathSurfaceObject.h b/src/openrct2/object/FootpathSurfaceObject.h new file mode 100644 index 0000000000..7d5ca8c6d7 --- /dev/null +++ b/src/openrct2/object/FootpathSurfaceObject.h @@ -0,0 +1,36 @@ +/***************************************************************************** + * Copyright (c) 2014-2021 OpenRCT2 developers + * + * For a complete list of all authors, please refer to contributors.md + * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 + * + * OpenRCT2 is licensed under the GNU General Public License version 3. + *****************************************************************************/ + +#pragma once + +#include "../world/Footpath.h" +#include "Object.h" + +class FootpathSurfaceObject final : public Object +{ +public: + rct_string_id NameStringId{}; + uint32_t PreviewImageId{}; + uint32_t BaseImageId{}; + uint8_t Flags{}; + +public: + explicit FootpathSurfaceObject(const rct_object_entry& entry) + : Object(entry) + { + } + + void ReadJson(IReadObjectContext* context, json_t& root) override; + void Load() override; + void Unload() override; + + void DrawPreview(rct_drawpixelinfo* dpi, int32_t width, int32_t height) const override; + + void SetRepositoryItem(ObjectRepositoryItem* item) const override; +}; diff --git a/src/openrct2/object/Object.h b/src/openrct2/object/Object.h index 4f7ca3f8cf..6d961edba4 100644 --- a/src/openrct2/object/Object.h +++ b/src/openrct2/object/Object.h @@ -42,6 +42,8 @@ enum class ObjectType : uint8_t TerrainEdge, Station, Music, + FootpathSurface, + FootpathRailings, Count, None = 255 diff --git a/src/openrct2/object/ObjectFactory.cpp b/src/openrct2/object/ObjectFactory.cpp index db5865e54a..854d3ed70b 100644 --- a/src/openrct2/object/ObjectFactory.cpp +++ b/src/openrct2/object/ObjectFactory.cpp @@ -24,6 +24,8 @@ #include "EntranceObject.h" #include "FootpathItemObject.h" #include "FootpathObject.h" +#include "FootpathRailingsObject.h" +#include "FootpathSurfaceObject.h" #include "LargeSceneryObject.h" #include "MusicObject.h" #include "Object.h" @@ -356,6 +358,12 @@ namespace ObjectFactory case ObjectType::Music: result = std::make_unique(entry); break; + case ObjectType::FootpathSurface: + result = std::make_unique(entry); + break; + case ObjectType::FootpathRailings: + result = std::make_unique(entry); + break; default: throw std::runtime_error("Invalid object type"); } @@ -392,6 +400,10 @@ namespace ObjectFactory return ObjectType::Station; if (s == "music") return ObjectType::Music; + if (s == "footpath_surface") + return ObjectType::FootpathSurface; + if (s == "footpath_railings") + return ObjectType::FootpathRailings; return ObjectType::None; } diff --git a/src/openrct2/object/ObjectRepository.h b/src/openrct2/object/ObjectRepository.h index 6fa5555f8d..049fb54fe0 100644 --- a/src/openrct2/object/ObjectRepository.h +++ b/src/openrct2/object/ObjectRepository.h @@ -54,6 +54,10 @@ struct ObjectRepositoryItem { std::vector Entries; } SceneryGroupInfo; + struct + { + uint8_t Flags{}; + } FootpathSurfaceInfo; [[nodiscard]] ObjectSourceGame GetFirstSourceGame() const { diff --git a/src/openrct2/world/Footpath.h b/src/openrct2/world/Footpath.h index 532b40f95f..f31d4fea8f 100644 --- a/src/openrct2/world/Footpath.h +++ b/src/openrct2/world/Footpath.h @@ -134,6 +134,7 @@ enum { FOOTPATH_ENTRY_FLAG_SHOW_ONLY_IN_SCENARIO_EDITOR = (1 << 2), FOOTPATH_ENTRY_FLAG_IS_QUEUE = (1 << 3), + FOOTPATH_ENTRY_FLAG_NO_SLOPE_RAILINGS = (1 << 4), }; enum From b367f74496139db85b181c0118e01444c098fbda Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=CE=B6eh=20Matt?= <5415177+ZehMatt@users.noreply.github.com> Date: Sun, 29 Aug 2021 13:20:30 -0700 Subject: [PATCH 31/51] Fix #15199: Construction window is not closed when a ride gets demolished --- distribution/changelog.txt | 1 + src/openrct2/actions/RideDemolishAction.cpp | 5 +---- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/distribution/changelog.txt b/distribution/changelog.txt index b512a644dc..564b7fc02b 100644 --- a/distribution/changelog.txt +++ b/distribution/changelog.txt @@ -16,6 +16,7 @@ - Fix: [#15170] Plugin: incorrect label text alignment. - Fix: [#15184] Crash when hovering over water types in Object Selection. - Fix: [#15193] Crash when rides/stalls are demolished. +- Fix: [#15199] Construction window is not closed when a ride gets demolished. - Fix: [#15255] Tile Inspector shows banner information on walls that do not contain one. - Fix: [#15289] Unexpected behavior with duplicated banners which also caused desyncs in multiplayer. - Improved: [#3417] Crash dumps are now placed in their own folder. diff --git a/src/openrct2/actions/RideDemolishAction.cpp b/src/openrct2/actions/RideDemolishAction.cpp index 3add2042dc..ecc24ea6ce 100644 --- a/src/openrct2/actions/RideDemolishAction.cpp +++ b/src/openrct2/actions/RideDemolishAction.cpp @@ -157,10 +157,7 @@ GameActions::Result::Ptr RideDemolishAction::DemolishRide(Ride* ride) const gParkValue = GetContext()->GetGameState()->GetPark().CalculateParkValue(); // Close windows related to the demolished ride - if (!(GetFlags() & GAME_COMMAND_FLAG_ALLOW_DURING_PAUSED)) - { - window_close_by_number(WC_RIDE_CONSTRUCTION, _rideIndex); - } + window_close_by_number(WC_RIDE_CONSTRUCTION, _rideIndex); window_close_by_number(WC_RIDE, _rideIndex); window_close_by_number(WC_DEMOLISH_RIDE_PROMPT, _rideIndex); window_close_by_class(WC_NEW_CAMPAIGN); From 51ad88c25d8f80925f8df6c489e1935c480a47e5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=CE=B6eh=20Matt?= <5415177+ZehMatt@users.noreply.github.com> Date: Sun, 29 Aug 2021 23:43:59 +0300 Subject: [PATCH 32/51] Fix #15306: Fix track paint using the wrong bounding box offsets --- src/openrct2/ride/TrackPaint.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/openrct2/ride/TrackPaint.cpp b/src/openrct2/ride/TrackPaint.cpp index 99daa1465a..ce0df6247d 100644 --- a/src/openrct2/ride/TrackPaint.cpp +++ b/src/openrct2/ride/TrackPaint.cpp @@ -1042,7 +1042,9 @@ void track_paint_util_right_helix_up_small_quarter_tiles_paint( CoordsXY boundsLength = boundsLengths[direction][index][1]; CoordsXYZ boundsOffset = (boundsOffsets == nullptr ? CoordsXYZ(offset, 0) : boundsOffsets[direction][index][1]); - PaintAddImageAsParent(session, imageId, { offset, height }, { boundsLength, thickness[1] }, boundsOffset); + PaintAddImageAsParent( + session, imageId, { offset, height }, { boundsLength, thickness[1] }, + { boundsOffset.x, boundsOffset.y, height + boundsOffset.z }); } } @@ -1479,7 +1481,7 @@ void track_paint_util_right_quarter_turn_5_tiles_paint_2( const sprite_bb* spriteBB = &sprites[direction][sprite]; const uint32_t imageId = spriteBB->sprite_id | colourFlags; const auto& offset = spriteBB->offset; - const auto& bbOffset = spriteBB->offset; + const auto& bbOffset = spriteBB->bb_offset; PaintAddImageAsParent( session, imageId, { offset.x, offset.y, height + offset.z }, spriteBB->bb_size, { bbOffset.x, bbOffset.y, height + bbOffset.z }); From 6d7fd57f5bb4672546f8461959d41de76285bf82 Mon Sep 17 00:00:00 2001 From: spacek531 Date: Sat, 21 Aug 2021 21:44:24 -0700 Subject: [PATCH 33/51] remove var_CA --- src/openrct2/GameStateSnapshots.cpp | 1 - src/openrct2/rct1/RCT1.h | 3 +-- src/openrct2/rct1/S4Importer.cpp | 1 - src/openrct2/rct2/RCT2.h | 3 +-- src/openrct2/rct2/S6Exporter.cpp | 1 - src/openrct2/rct2/S6Importer.cpp | 1 - src/openrct2/ride/CableLift.cpp | 1 - src/openrct2/ride/Vehicle.cpp | 3 +-- src/openrct2/ride/Vehicle.h | 3 +-- src/openrct2/world/Entity.cpp | 1 - 10 files changed, 4 insertions(+), 14 deletions(-) diff --git a/src/openrct2/GameStateSnapshots.cpp b/src/openrct2/GameStateSnapshots.cpp index a3bc1e024f..f6e1f53d19 100644 --- a/src/openrct2/GameStateSnapshots.cpp +++ b/src/openrct2/GameStateSnapshots.cpp @@ -425,7 +425,6 @@ struct GameStateSnapshots final : public IGameStateSnapshots COMPARE_FIELD(Vehicle, pad_C6[i]); } COMPARE_FIELD(Vehicle, animationState); - COMPARE_FIELD(Vehicle, var_CA); COMPARE_FIELD(Vehicle, scream_sound_id); COMPARE_FIELD(Vehicle, TrackSubposition); COMPARE_FIELD(Vehicle, num_laps); diff --git a/src/openrct2/rct1/RCT1.h b/src/openrct2/rct1/RCT1.h index e2b0293b91..95df48338d 100644 --- a/src/openrct2/rct1/RCT1.h +++ b/src/openrct2/rct1/RCT1.h @@ -300,8 +300,7 @@ namespace RCT1 uint8_t var_C4; uint8_t animation_frame; uint8_t pad_C6[0x2]; - uint16_t animationState; - uint16_t var_CA; + uint32_t animationState; uint8_t scream_sound_id; // 0xCC uint8_t TrackSubposition; union diff --git a/src/openrct2/rct1/S4Importer.cpp b/src/openrct2/rct1/S4Importer.cpp index 794bb48311..d1cd3b312a 100644 --- a/src/openrct2/rct1/S4Importer.cpp +++ b/src/openrct2/rct1/S4Importer.cpp @@ -2722,7 +2722,6 @@ namespace RCT1 dst->var_C4 = src->var_C4; dst->animation_frame = src->animation_frame; dst->animationState = src->animationState; - dst->var_CA = src->var_CA; dst->var_CE = src->var_CE; dst->var_D3 = src->var_D3; dst->scream_sound_id = OpenRCT2::Audio::SoundId::Null; diff --git a/src/openrct2/rct2/RCT2.h b/src/openrct2/rct2/RCT2.h index 85b4999605..32d5cb5f6d 100644 --- a/src/openrct2/rct2/RCT2.h +++ b/src/openrct2/rct2/RCT2.h @@ -537,8 +537,7 @@ struct RCT2SpriteVehicle : RCT12SpriteBase }; uint8_t animation_frame; // 0xC5 uint8_t pad_C6[0x2]; - uint16_t animationState; - uint16_t var_CA; + uint32_t animationState; uint8_t scream_sound_id; // 0xCC uint8_t TrackSubposition; union diff --git a/src/openrct2/rct2/S6Exporter.cpp b/src/openrct2/rct2/S6Exporter.cpp index 2d6ca37d9a..602af47bdd 100644 --- a/src/openrct2/rct2/S6Exporter.cpp +++ b/src/openrct2/rct2/S6Exporter.cpp @@ -1180,7 +1180,6 @@ template<> void S6Exporter::ExportEntity(RCT2SpriteVehicle* dst, const Vehicle* dst->dodgems_collision_direction = src->dodgems_collision_direction; dst->animation_frame = src->animation_frame; dst->animationState = src->animationState; - dst->var_CA = src->var_CA; dst->scream_sound_id = static_cast(src->scream_sound_id); dst->TrackSubposition = static_cast(src->TrackSubposition); dst->var_CE = src->var_CE; diff --git a/src/openrct2/rct2/S6Importer.cpp b/src/openrct2/rct2/S6Importer.cpp index 114ccc6ef2..d331e309ad 100644 --- a/src/openrct2/rct2/S6Importer.cpp +++ b/src/openrct2/rct2/S6Importer.cpp @@ -1664,7 +1664,6 @@ template<> void S6Importer::ImportEntity(const RCT12SpriteBase& baseSrc dst->dodgems_collision_direction = src->dodgems_collision_direction; dst->animation_frame = src->animation_frame; dst->animationState = src->animationState; - dst->var_CA = src->var_CA; dst->scream_sound_id = static_cast(src->scream_sound_id); dst->TrackSubposition = VehicleTrackSubposition{ src->TrackSubposition }; dst->var_CE = src->var_CE; diff --git a/src/openrct2/ride/CableLift.cpp b/src/openrct2/ride/CableLift.cpp index 3432ed6b92..92d9bc43a2 100644 --- a/src/openrct2/ride/CableLift.cpp +++ b/src/openrct2/ride/CableLift.cpp @@ -55,7 +55,6 @@ Vehicle* cable_lift_segment_create( current->var_C4 = 0; current->animation_frame = 0; current->animationState = 0; - current->var_CA = 0; current->scream_sound_id = OpenRCT2::Audio::SoundId::Null; current->Pitch = 0; current->bank_rotation = 0; diff --git a/src/openrct2/ride/Vehicle.cpp b/src/openrct2/ride/Vehicle.cpp index bbbdef5358..e33d53788a 100644 --- a/src/openrct2/ride/Vehicle.cpp +++ b/src/openrct2/ride/Vehicle.cpp @@ -3647,9 +3647,8 @@ void Vehicle::UpdateCollisionSetup() train->IsCrashedVehicle = true; train->animationState = scenario_rand(); - train->var_CA = scenario_rand(); - train->animation_frame = train->var_CA & 0x7; + train->animation_frame = (train->animationState >> 16) & 0x7; train->sprite_width = 13; train->sprite_height_negative = 45; train->sprite_height_positive = 5; diff --git a/src/openrct2/ride/Vehicle.h b/src/openrct2/ride/Vehicle.h index 8963fb379d..bc04b53ddf 100644 --- a/src/openrct2/ride/Vehicle.h +++ b/src/openrct2/ride/Vehicle.h @@ -182,8 +182,7 @@ struct Vehicle : EntityBase }; uint8_t animation_frame; uint8_t pad_C6[0x2]; - uint16_t animationState; - uint16_t var_CA; + uint32_t animationState; OpenRCT2::Audio::SoundId scream_sound_id; VehicleTrackSubposition TrackSubposition; union diff --git a/src/openrct2/world/Entity.cpp b/src/openrct2/world/Entity.cpp index bc1b1e0859..7d45216925 100644 --- a/src/openrct2/world/Entity.cpp +++ b/src/openrct2/world/Entity.cpp @@ -279,7 +279,6 @@ void Vehicle::Serialise(DataSerialiser& stream) stream << dodgems_collision_direction; stream << animation_frame; stream << animationState; - stream << var_CA; stream << scream_sound_id; stream << TrackSubposition; stream << var_CE; From 199de52afede08e35c9ce17b4699f90fad543ba3 Mon Sep 17 00:00:00 2001 From: spacek531 Date: Sat, 21 Aug 2021 21:53:29 -0700 Subject: [PATCH 34/51] quick removing this --- src/openrct2/ride/Vehicle.cpp | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/src/openrct2/ride/Vehicle.cpp b/src/openrct2/ride/Vehicle.cpp index e33d53788a..9302ff8c28 100644 --- a/src/openrct2/ride/Vehicle.cpp +++ b/src/openrct2/ride/Vehicle.cpp @@ -5520,6 +5520,7 @@ void Vehicle::UpdateCrash() curVehicle->Invalidate(); } curVehicle->animationState += 7281; + curVehicle->animationState &= 0xFFFF; continue; } @@ -7318,7 +7319,6 @@ void Vehicle::UpdateAdditionalAnimation() uint8_t curFrame{}; uint32_t eax{}; - uint32_t* curAnimationState = reinterpret_cast(&animationState); auto vehicleEntry = Entry(); if (vehicleEntry == nullptr) { @@ -7327,8 +7327,8 @@ void Vehicle::UpdateAdditionalAnimation() switch (vehicleEntry->animation) { case VEHICLE_ENTRY_ANIMATION_MINITURE_RAILWAY_LOCOMOTIVE: // loc_6D652B - *curAnimationState += _vehicleVelocityF64E08; - targetFrame = (*curAnimationState >> 20) & 3; + animationState += _vehicleVelocityF64E08; + targetFrame = (animationState >> 20) & 3; if (animation_frame != targetFrame) { curFrame = animation_frame; @@ -7366,8 +7366,8 @@ void Vehicle::UpdateAdditionalAnimation() } break; case VEHICLE_ENTRY_ANIMATION_SWAN: // loc_6D6424 - *curAnimationState += _vehicleVelocityF64E08; - targetFrame = (*curAnimationState >> 18) & 2; + animationState += _vehicleVelocityF64E08; + targetFrame = (animationState >> 18) & 2; if (animation_frame != targetFrame) { animation_frame = targetFrame; @@ -7375,8 +7375,8 @@ void Vehicle::UpdateAdditionalAnimation() } break; case VEHICLE_ENTRY_ANIMATION_CANOES: // loc_6D6482 - *curAnimationState += _vehicleVelocityF64E08; - eax = ((*curAnimationState >> 13) & 0xFF) * 6; + animationState += _vehicleVelocityF64E08; + eax = ((animationState >> 13) & 0xFF) * 6; targetFrame = (eax >> 8) & 0xFF; if (animation_frame != targetFrame) { @@ -7385,8 +7385,8 @@ void Vehicle::UpdateAdditionalAnimation() } break; case VEHICLE_ENTRY_ANIMATION_ROW_BOATS: // loc_6D64F7 - *curAnimationState += _vehicleVelocityF64E08; - eax = ((*curAnimationState >> 13) & 0xFF) * 7; + animationState += _vehicleVelocityF64E08; + eax = ((animationState >> 13) & 0xFF) * 7; targetFrame = (eax >> 8) & 0xFF; if (animation_frame != targetFrame) { @@ -7395,8 +7395,8 @@ void Vehicle::UpdateAdditionalAnimation() } break; case VEHICLE_ENTRY_ANIMATION_WATER_TRICYCLES: // loc_6D6453 - *curAnimationState += _vehicleVelocityF64E08; - targetFrame = (*curAnimationState >> 19) & 1; + animationState += _vehicleVelocityF64E08; + targetFrame = (animationState >> 19) & 1; if (animation_frame != targetFrame) { animation_frame = targetFrame; @@ -7417,8 +7417,8 @@ void Vehicle::UpdateAdditionalAnimation() } break; case VEHICLE_ENTRY_ANIMATION_HELICARS: // loc_6D63F5 - *curAnimationState += _vehicleVelocityF64E08; - targetFrame = (*curAnimationState >> 18) & 3; + animationState += _vehicleVelocityF64E08; + targetFrame = (animationState >> 18) & 3; if (animation_frame != targetFrame) { animation_frame = targetFrame; @@ -7428,8 +7428,8 @@ void Vehicle::UpdateAdditionalAnimation() case VEHICLE_ENTRY_ANIMATION_MONORAIL_CYCLES: // loc_6D64B6 if (num_peeps != 0) { - *curAnimationState += _vehicleVelocityF64E08; - eax = ((*curAnimationState >> 13) & 0xFF) << 2; + animationState += _vehicleVelocityF64E08; + eax = ((animationState >> 13) & 0xFF) << 2; targetFrame = (eax >> 8) & 0xFF; if (animation_frame != targetFrame) { From 315070faaa0d157698eab0619c00995fa1b42c76 Mon Sep 17 00:00:00 2001 From: spacek531 Date: Sun, 22 Aug 2021 21:44:04 -0700 Subject: [PATCH 35/51] set value to 0 --- src/openrct2/ride/Vehicle.cpp | 25 ++++++++++++++----------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/src/openrct2/ride/Vehicle.cpp b/src/openrct2/ride/Vehicle.cpp index 9302ff8c28..1991d873e2 100644 --- a/src/openrct2/ride/Vehicle.cpp +++ b/src/openrct2/ride/Vehicle.cpp @@ -1522,16 +1522,16 @@ bool Vehicle::OpenRestraints() } if (vehicleEntry->animation == VEHICLE_ENTRY_ANIMATION_OBSERVATION_TOWER && vehicle->animation_frame != 0) { - if (vehicle->animationState + 0x3333 < 0xFFFF) + if (vehicle->animationState <= 0xCCCC) { - vehicle->animationState = vehicle->animationState + 0x3333 - 0xFFFF; - vehicle->animation_frame++; - vehicle->animation_frame &= 7; - vehicle->Invalidate(); + vehicle->animationState += 0x3333; } else { - vehicle->animationState += 0x3333; + vehicle->animationState = 0; + vehicle->animation_frame++; + vehicle->animation_frame &= 7; + vehicle->Invalidate(); } restraintsOpen = false; continue; @@ -5512,15 +5512,18 @@ void Vehicle::UpdateCrash() ExplosionCloud::Create({ curVehicle->x + xOffset, curVehicle->y + yOffset, curVehicle->z }); } } - if (curVehicle->animationState + 7281 > 0xFFFF) + if (curVehicle->animationState <= 58248) { + curVehicle->animationState += 7281; + } + else + { + curVehicle->animationState = 0; curVehicle->animation_frame++; if (curVehicle->animation_frame >= 8) curVehicle->animation_frame = 0; curVehicle->Invalidate(); } - curVehicle->animationState += 7281; - curVehicle->animationState &= 0xFFFF; continue; } @@ -7410,7 +7413,7 @@ void Vehicle::UpdateAdditionalAnimation() } else { - animationState += 0x3333; + animationState = 0; animation_frame += 1; animation_frame &= 7; Invalidate(); @@ -7447,7 +7450,7 @@ void Vehicle::UpdateAdditionalAnimation() } else { - animationState += 0x3333; + animationState = 0; if (seat_rotation >= target_seat_rotation) seat_rotation--; From 0f5075f0244bd444b2bc1feb68f1488331a488a3 Mon Sep 17 00:00:00 2001 From: spacek531 Date: Tue, 24 Aug 2021 11:28:30 -0700 Subject: [PATCH 36/51] fix triggers --- src/openrct2/ride/Vehicle.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/openrct2/ride/Vehicle.cpp b/src/openrct2/ride/Vehicle.cpp index 1991d873e2..d635bcae89 100644 --- a/src/openrct2/ride/Vehicle.cpp +++ b/src/openrct2/ride/Vehicle.cpp @@ -3646,9 +3646,9 @@ void Vehicle::UpdateCollisionSetup() } train->IsCrashedVehicle = true; - train->animationState = scenario_rand(); + train->animationState = scenario_rand() & 0xFFFF; - train->animation_frame = (train->animationState >> 16) & 0x7; + train->animation_frame = scenario_rand() & 0x7; train->sprite_width = 13; train->sprite_height_negative = 45; train->sprite_height_positive = 5; @@ -5512,9 +5512,9 @@ void Vehicle::UpdateCrash() ExplosionCloud::Create({ curVehicle->x + xOffset, curVehicle->y + yOffset, curVehicle->z }); } } - if (curVehicle->animationState <= 58248) + if (curVehicle->animationState <= 0xe388) { - curVehicle->animationState += 7281; + curVehicle->animationState += 0x1c71; } else { From 54bff59d901e4836bc7befb51b19cfa5df121f28 Mon Sep 17 00:00:00 2001 From: duncanspumpkin Date: Thu, 26 Aug 2021 07:42:02 +0100 Subject: [PATCH 37/51] Update replays --- CMakeLists.txt | 4 ++-- openrct2.proj | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index b2a742f306..c4b1b1df2c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -50,9 +50,9 @@ set(OBJECTS_VERSION "1.0.21") set(OBJECTS_URL "https://github.com/OpenRCT2/objects/releases/download/v${OBJECTS_VERSION}/objects.zip") set(OBJECTS_SHA1 "c38af45d51a6e440386180feacf76c64720b6ac5") -set(REPLAYS_VERSION "0.0.47") +set(REPLAYS_VERSION "0.0.48") set(REPLAYS_URL "https://github.com/OpenRCT2/replays/releases/download/v${REPLAYS_VERSION}/replays.zip") -set(REPLAYS_SHA1 "61CAB8A0AD0B057B13B003DF32748977C2B5975F") +set(REPLAYS_SHA1 "6ED73C32BD62B9C6DA09FCE3426EC8E30CA59762") option(FORCE32 "Force 32-bit build. It will add `-m32` to compiler flags.") option(WITH_TESTS "Build tests") diff --git a/openrct2.proj b/openrct2.proj index 710f325bd9..51fd1c75ac 100644 --- a/openrct2.proj +++ b/openrct2.proj @@ -48,8 +48,8 @@ 304d13a126c15bf2c86ff13b81a2f2cc1856ac8d https://github.com/OpenRCT2/objects/releases/download/v1.0.21/objects.zip c38af45d51a6e440386180feacf76c64720b6ac5 - https://github.com/OpenRCT2/replays/releases/download/v0.0.47/replays.zip - 61CAB8A0AD0B057B13B003DF32748977C2B5975F + https://github.com/OpenRCT2/replays/releases/download/v0.0.48/replays.zip + 6ED73C32BD62B9C6DA09FCE3426EC8E30CA59762 From 91099429c8c67baf6c4e2b28f820d7c392ac2f3f Mon Sep 17 00:00:00 2001 From: spacek531 Date: Sun, 29 Aug 2021 14:52:20 -0700 Subject: [PATCH 38/51] bump network --- src/openrct2/network/NetworkBase.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/openrct2/network/NetworkBase.cpp b/src/openrct2/network/NetworkBase.cpp index bd09ca6b0b..55891f3b28 100644 --- a/src/openrct2/network/NetworkBase.cpp +++ b/src/openrct2/network/NetworkBase.cpp @@ -37,7 +37,7 @@ // This string specifies which version of network stream current build uses. // It is used for making sure only compatible builds get connected, even within // single OpenRCT2 version. -#define NETWORK_STREAM_VERSION "6" +#define NETWORK_STREAM_VERSION "7" #define NETWORK_STREAM_ID OPENRCT2_VERSION "-" NETWORK_STREAM_VERSION static Peep* _pickup_peep = nullptr; From 39b762aa785f90907b296f423536c786d36efd98 Mon Sep 17 00:00:00 2001 From: spacek531 Date: Sun, 29 Aug 2021 15:00:47 -0700 Subject: [PATCH 39/51] fix sign error --- src/openrct2/ride/Vehicle.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/openrct2/ride/Vehicle.cpp b/src/openrct2/ride/Vehicle.cpp index d635bcae89..fca333a112 100644 --- a/src/openrct2/ride/Vehicle.cpp +++ b/src/openrct2/ride/Vehicle.cpp @@ -7467,7 +7467,7 @@ void Vehicle::UpdateAdditionalAnimation() UpdateAnimationAnimalFlying(); // makes animation play faster with vehicle speed targetFrame = abs(_vehicleVelocityF64E08) >> 24; - animationState = std::max(animationState - targetFrame, 0); + animationState = std::max(animationState - targetFrame, 0u); break; } } From 8cc833f905184f6f53e9784a5f4e66abf9c1c0a5 Mon Sep 17 00:00:00 2001 From: Duncan Date: Mon, 30 Aug 2021 11:28:50 +0100 Subject: [PATCH 40/51] Strip RCT1 out of RCT1 struct names in namespace (#15284) * Strip RCT1 out of struct names in namespace * Remove RCT1:: where not required --- src/openrct2/rct1/RCT1.h | 52 ++++++------ src/openrct2/rct1/S4Importer.cpp | 134 +++++++++++++++---------------- src/openrct2/rct1/T4Importer.cpp | 12 +-- src/openrct2/rct1/Tables.cpp | 4 +- src/openrct2/rct1/Tables.h | 4 +- 5 files changed, 102 insertions(+), 104 deletions(-) diff --git a/src/openrct2/rct1/RCT1.h b/src/openrct2/rct1/RCT1.h index e2b0293b91..ca25483938 100644 --- a/src/openrct2/rct1/RCT1.h +++ b/src/openrct2/rct1/RCT1.h @@ -35,20 +35,20 @@ namespace RCT1 constexpr const uint32_t RCT1_NUM_TERRAIN_EDGES = 15; #pragma pack(push, 1) - struct rct1_entrance + struct Entrance { uint16_t x; uint16_t y; uint16_t z; uint8_t direction; }; - assert_struct_size(rct1_entrance, 7); + assert_struct_size(Entrance, 7); /** * RCT1 ride structure * size: 0x260 */ - struct rct1_ride + struct Ride { uint8_t type; // 0x000 uint8_t vehicle_type; // 0x001 @@ -207,9 +207,9 @@ namespace RCT1 uint8_t entrance_style; // 0x179 uint8_t unk_17A[230]; // 0x17A }; - assert_struct_size(rct1_ride, 0x260); + assert_struct_size(Ride, 0x260); - struct rct1_unk_sprite : RCT12SpriteBase + struct UnkEntity : RCT12SpriteBase { uint8_t pad_1F[3]; // 0x1f rct_string_id name_string_idx; // 0x22 @@ -221,7 +221,7 @@ namespace RCT1 uint8_t var_71; }; - struct rct1_vehicle : RCT12SpriteBase + struct Vehicle : RCT12SpriteBase { uint8_t Pitch; // 0x1F uint8_t bank_rotation; // 0x20 @@ -333,7 +333,7 @@ namespace RCT1 } }; - struct rct1_peep : RCT12SpriteBase + struct Peep : RCT12SpriteBase { uint8_t pad_1F[3]; rct_string_id name_string_idx; // 0x22 @@ -477,7 +477,7 @@ namespace RCT1 return item_standard_flags; } }; - assert_struct_size(rct1_peep, 0x100); + assert_struct_size(Peep, 0x100); enum RCT1_PEEP_SPRITE_TYPE { @@ -511,12 +511,12 @@ namespace RCT1 RCT1_PEEP_SPRITE_TYPE_TOFFEE_APPLE = 30 }; - union rct1_sprite + union Entity { uint8_t pad_00[0x100]; - rct1_unk_sprite unknown; - rct1_vehicle vehicle; - rct1_peep peep; + UnkEntity unknown; + Vehicle vehicle; + Peep peep; RCT12SpriteLitter litter; RCT12SpriteBalloon balloon; RCT12SpriteDuck duck; @@ -526,9 +526,9 @@ namespace RCT1 RCT12SpriteCrashSplash crash_splash; RCT12SpriteSteamParticle steam_particle; }; - assert_struct_size(rct1_sprite, 0x100); + assert_struct_size(Entity, 0x100); - struct rct1_research_item + struct ResearchItem { uint8_t item; uint8_t related_ride; @@ -536,13 +536,13 @@ namespace RCT1 uint8_t flags; uint8_t category; }; - assert_struct_size(rct1_research_item, 5); + assert_struct_size(ResearchItem, 5); /** * RCT1,AA,LL scenario / saved game structure. * size: 0x1F850C */ - struct rct1_s4 + struct S4 { uint16_t month; uint16_t day; @@ -551,7 +551,7 @@ namespace RCT1 uint32_t random_b; RCT12TileElement tile_elements[RCT1_MAX_TILE_ELEMENTS]; uint32_t unk_counter; - rct1_sprite sprites[RCT1_MAX_SPRITES]; + Entity sprites[RCT1_MAX_SPRITES]; uint16_t next_sprite_index; uint16_t first_vehicle_sprite_index; uint16_t first_peep_sprite_index; @@ -570,7 +570,7 @@ namespace RCT1 money32 loan; uint32_t park_flags; money16 park_entrance_fee; - rct1_entrance park_entrance; + Entrance park_entrance; uint8_t unk_198849; rct12_peep_spawn peep_spawn[RCT12_MAX_PEEP_SPAWNS]; uint8_t unk_198856; @@ -600,7 +600,7 @@ namespace RCT1 uint8_t last_research_ride; uint8_t last_research_type; uint8_t last_research_flags; - rct1_research_item research_items[200]; + ResearchItem research_items[200]; uint8_t next_research_item; uint8_t next_research_ride; uint8_t next_research_type; @@ -668,12 +668,12 @@ namespace RCT1 uint8_t unk_199C96[3]; uint8_t water_colour; uint16_t unk_199C9A; - rct1_research_item research_items_LL[180]; + ResearchItem research_items_LL[180]; uint8_t unk_19A020[5468]; 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]; + Ride rides[RCT12_MAX_RIDES_IN_PARK]; uint16_t unk_game_time_counter; int16_t view_x; int16_t view_y; @@ -713,13 +713,13 @@ namespace RCT1 uint8_t unk_1F8358[432]; uint32_t expansion_pack_checksum; }; - assert_struct_size(rct1_s4, 0x1F850C); + assert_struct_size(S4, 0x1F850C); /** * Track design structure. Only for base RCT1 * size: 0x2006 */ - struct rct_track_td4 + struct TD4 { uint8_t type; // 0x00 uint8_t vehicle_type; @@ -761,13 +761,13 @@ namespace RCT1 money16 upkeep_cost; // 0x36 }; - assert_struct_size(rct_track_td4, 0x38); + assert_struct_size(TD4, 0x38); /** * Track design structure for Added Attractions / Loopy Landscapes * size: 0x2006 */ - struct rct_track_td4_aa : public rct_track_td4 + struct TD4AA : public TD4 { uint8_t track_spine_colour[RCT12_NUM_COLOUR_SCHEMES]; // 0x38 uint8_t track_rail_colour[RCT12_NUM_COLOUR_SCHEMES]; // 0x3C @@ -777,7 +777,7 @@ namespace RCT1 uint8_t pad_45[0x7F]; // 0x45 }; - assert_struct_size(rct_track_td4_aa, 0xC4); + assert_struct_size(TD4AA, 0xC4); #pragma pack(pop) enum diff --git a/src/openrct2/rct1/S4Importer.cpp b/src/openrct2/rct1/S4Importer.cpp index 794bb48311..003ab50e48 100644 --- a/src/openrct2/rct1/S4Importer.cpp +++ b/src/openrct2/rct1/S4Importer.cpp @@ -117,7 +117,7 @@ namespace RCT1 { private: std::string _s4Path; - rct1_s4 _s4 = {}; + S4 _s4 = {}; uint8_t _gameVersion = 0; uint8_t _parkValueConversionFactor = 0; bool _isScenario = false; @@ -310,27 +310,27 @@ namespace RCT1 } private: - std::unique_ptr ReadAndDecodeS4(IStream* stream, bool isScenario) + std::unique_ptr ReadAndDecodeS4(IStream* stream, bool isScenario) { - auto s4 = std::make_unique(); + auto s4 = std::make_unique(); size_t dataSize = stream->GetLength() - stream->GetPosition(); auto data = stream->ReadArray(dataSize); - auto decodedData = std::make_unique(sizeof(rct1_s4)); + auto decodedData = std::make_unique(sizeof(S4)); size_t decodedSize; int32_t fileType = sawyercoding_detect_file_type(data.get(), dataSize); if (isScenario && (fileType & FILE_VERSION_MASK) != FILE_VERSION_RCT1) { - decodedSize = sawyercoding_decode_sc4(data.get(), decodedData.get(), dataSize, sizeof(rct1_s4)); + decodedSize = sawyercoding_decode_sc4(data.get(), decodedData.get(), dataSize, sizeof(S4)); } else { - decodedSize = sawyercoding_decode_sv4(data.get(), decodedData.get(), dataSize, sizeof(rct1_s4)); + decodedSize = sawyercoding_decode_sv4(data.get(), decodedData.get(), dataSize, sizeof(S4)); } - if (decodedSize == sizeof(rct1_s4)) + if (decodedSize == sizeof(S4)) { - std::memcpy(s4.get(), decodedData.get(), sizeof(rct1_s4)); + std::memcpy(s4.get(), decodedData.get(), sizeof(S4)); return s4; } else @@ -424,12 +424,12 @@ namespace RCT1 void AddAvailableEntriesFromResearchList() { size_t researchListCount; - const rct1_research_item* researchList = GetResearchList(&researchListCount); + const ResearchItem* researchList = GetResearchList(&researchListCount); std::bitset rideTypeInResearch = GetRideTypesPresentInResearchList( researchList, researchListCount); for (size_t i = 0; i < researchListCount; i++) { - const rct1_research_item* researchItem = &researchList[i]; + const ResearchItem* researchItem = &researchList[i]; if (researchItem->flags == RCT1_RESEARCH_FLAGS_SEPARATOR) { @@ -719,7 +719,7 @@ namespace RCT1 } } - void ImportRide(Ride* dst, rct1_ride* src, ride_id_t rideIndex) + void ImportRide(::Ride* dst, RCT1::Ride* src, ride_id_t rideIndex) { *dst = {}; dst->id = rideIndex; @@ -986,7 +986,7 @@ namespace RCT1 dst->music_tune_id = 255; } - void SetRideColourScheme(Ride* dst, rct1_ride* src) + void SetRideColourScheme(::Ride* dst, RCT1::Ride* src) { // Colours dst->colour_scheme_type = src->colour_scheme; @@ -1029,8 +1029,7 @@ namespace RCT1 for (int i = 0; i < RCT1_MAX_TRAINS_PER_RIDE; i++) { // RCT1 had no third colour - RCT1::RCT1VehicleColourSchemeCopyDescriptor colourSchemeCopyDescriptor = RCT1:: - GetColourSchemeCopyDescriptor(src->vehicle_type); + const auto colourSchemeCopyDescriptor = GetColourSchemeCopyDescriptor(src->vehicle_type); if (colourSchemeCopyDescriptor.colour1 == COPY_COLOUR_1) { dst->vehicle_colours[i].Body = RCT1::GetColour(src->vehicle_colours[i].body); @@ -1128,11 +1127,11 @@ namespace RCT1 FixImportStaff(); } - void SetVehicleColours(Vehicle* dst, const rct1_vehicle* src) + void SetVehicleColours(::Vehicle* dst, const RCT1::Vehicle* src) { - rct1_ride* srcRide = &_s4.rides[src->ride]; - uint8_t vehicleTypeIndex = srcRide->vehicle_type; - RCT1::RCT1VehicleColourSchemeCopyDescriptor colourSchemeCopyDescriptor = RCT1::GetColourSchemeCopyDescriptor( + const auto& srcRide = _s4.rides[src->ride]; + uint8_t vehicleTypeIndex = srcRide.vehicle_type; + RCT1::VehicleColourSchemeCopyDescriptor colourSchemeCopyDescriptor = RCT1::GetColourSchemeCopyDescriptor( vehicleTypeIndex); // RCT1 had no third colour @@ -1195,7 +1194,7 @@ namespace RCT1 staff_update_greyed_patrol_areas(); } - void ImportPeep(Peep* dst, const rct1_peep* src) + void ImportPeep(::Peep* dst, const RCT1::Peep* src) { // Peep vs. staff (including which kind) dst->SpriteType = RCT1::GetPeepSpriteType(src->sprite_type); @@ -1851,7 +1850,7 @@ namespace RCT1 research_reset_items(); size_t researchListCount; - const rct1_research_item* researchList = GetResearchList(&researchListCount); + const RCT1::ResearchItem* researchList = GetResearchList(&researchListCount); // Initialise the "seen" tables _researchRideEntryUsed.reset(); @@ -1866,29 +1865,29 @@ namespace RCT1 bool researched = true; std::bitset rideTypeInResearch = GetRideTypesPresentInResearchList( researchList, researchListCount); - std::vector vehiclesWithMissingRideTypes; + std::vector vehiclesWithMissingRideTypes; for (size_t i = 0; i < researchListCount; i++) { - const rct1_research_item* researchItem = &researchList[i]; - if (researchItem->flags == RCT1_RESEARCH_FLAGS_SEPARATOR) + const auto& researchItem = researchList[i]; + if (researchItem.flags == RCT1_RESEARCH_FLAGS_SEPARATOR) { - if (researchItem->item == RCT1_RESEARCH_END_AVAILABLE) + if (researchItem.item == RCT1_RESEARCH_END_AVAILABLE) { researched = false; continue; } // We don't import the random items yet. - else if (researchItem->item == RCT1_RESEARCH_END_RESEARCHABLE || researchItem->item == RCT1_RESEARCH_END) + else if (researchItem.item == RCT1_RESEARCH_END_RESEARCHABLE || researchItem.item == RCT1_RESEARCH_END) { break; } } - switch (researchItem->type) + switch (researchItem.type) { case RCT1_RESEARCH_TYPE_THEME: { - uint8_t rct1SceneryTheme = researchItem->item; + uint8_t rct1SceneryTheme = researchItem.item; auto sceneryGroupEntryIndex = _sceneryThemeTypeToEntryMap[rct1SceneryTheme]; if (sceneryGroupEntryIndex != OBJECT_ENTRY_INDEX_IGNORE && sceneryGroupEntryIndex != OBJECT_ENTRY_INDEX_NULL) @@ -1899,7 +1898,7 @@ namespace RCT1 } case RCT1_RESEARCH_TYPE_RIDE: { - uint8_t rct1RideType = researchItem->item; + uint8_t rct1RideType = researchItem.item; _researchRideTypeUsed[rct1RideType] = true; auto ownRideEntryIndex = _rideTypeToRideEntryMap[rct1RideType]; @@ -1913,11 +1912,11 @@ namespace RCT1 // Add all vehicles for this ride type that are researched or before this research item for (size_t j = 0; j < researchListCount; j++) { - const rct1_research_item* researchItem2 = &researchList[j]; - if (researchItem2->flags == RCT1_RESEARCH_FLAGS_SEPARATOR) + const auto& researchItem2 = researchList[j]; + if (researchItem2.flags == RCT1_RESEARCH_FLAGS_SEPARATOR) { - if (researchItem2->item == RCT1_RESEARCH_END_RESEARCHABLE - || researchItem2->item == RCT1_RESEARCH_END) + if (researchItem2.item == RCT1_RESEARCH_END_RESEARCHABLE + || researchItem2.item == RCT1_RESEARCH_END) { break; } @@ -1925,10 +1924,10 @@ namespace RCT1 continue; } - if (researchItem2->type == RCT1_RESEARCH_TYPE_VEHICLE - && researchItem2->related_ride == rct1RideType) + if (researchItem2.type == RCT1_RESEARCH_TYPE_VEHICLE + && researchItem2.related_ride == rct1RideType) { - auto rideEntryIndex2 = _vehicleTypeToRideEntryMap[researchItem2->item]; + auto rideEntryIndex2 = _vehicleTypeToRideEntryMap[researchItem2.item]; bool isOwnType = (ownRideEntryIndex == rideEntryIndex2); if (isOwnType) { @@ -1961,13 +1960,13 @@ namespace RCT1 // Only add vehicle if the related ride has been seen, this to make sure that vehicles // are researched only after the ride has been researched. Otherwise, remove them from the research // list, so that they are automatically co-invented when their master ride is invented. - if (_researchRideTypeUsed[researchItem->related_ride]) + if (_researchRideTypeUsed[researchItem.related_ride]) { InsertResearchVehicle(researchItem, researched); } - else if (!rideTypeInResearch[researchItem->related_ride] && _gameVersion == FILE_VERSION_RCT1_LL) + else if (!rideTypeInResearch[researchItem.related_ride] && _gameVersion == FILE_VERSION_RCT1_LL) { - vehiclesWithMissingRideTypes.push_back(*researchItem); + vehiclesWithMissingRideTypes.push_back(researchItem); } break; @@ -1977,9 +1976,9 @@ namespace RCT1 break; } } - for (const rct1_research_item& researchItem : vehiclesWithMissingRideTypes) + for (const auto& researchItem : vehiclesWithMissingRideTypes) { - InsertResearchVehicle(&researchItem, false); + InsertResearchVehicle(researchItem, false); } // Research funding / priority @@ -2025,7 +2024,7 @@ namespace RCT1 } else { - ResearchItem researchItem = {}; + ::ResearchItem researchItem = {}; ConvertResearchEntry(&researchItem, _s4.last_research_item, _s4.last_research_type); gResearchLastItem = researchItem; } @@ -2038,45 +2037,44 @@ namespace RCT1 } else { - ResearchItem researchItem = {}; + ::ResearchItem researchItem = {}; ConvertResearchEntry(&researchItem, _s4.next_research_item, _s4.next_research_type); gResearchNextItem = researchItem; } } static std::bitset GetRideTypesPresentInResearchList( - const rct1_research_item* researchList, size_t researchListCount) + const RCT1::ResearchItem* researchList, size_t researchListCount) { std::bitset ret = {}; for (size_t i = 0; i < researchListCount; i++) { - const rct1_research_item* researchItem = &researchList[i]; - if (researchItem->flags == RCT1_RESEARCH_FLAGS_SEPARATOR) + const auto& researchItem = researchList[i]; + if (researchItem.flags == RCT1_RESEARCH_FLAGS_SEPARATOR) { - if (researchItem->item == RCT1_RESEARCH_END_AVAILABLE - || researchItem->item == RCT1_RESEARCH_END_RESEARCHABLE) + if (researchItem.item == RCT1_RESEARCH_END_AVAILABLE || researchItem.item == RCT1_RESEARCH_END_RESEARCHABLE) { continue; } - else if (researchItem->item == RCT1_RESEARCH_END) + else if (researchItem.item == RCT1_RESEARCH_END) { break; } } - if (researchItem->type == RCT1_RESEARCH_TYPE_RIDE) + if (researchItem.type == RCT1_RESEARCH_TYPE_RIDE) { - ret[researchItem->item] = true; + ret[researchItem.item] = true; } } return ret; } - void InsertResearchVehicle(const rct1_research_item* researchItem, bool researched) + void InsertResearchVehicle(const ResearchItem& researchItem, bool researched) { - uint8_t vehicle = researchItem->item; + uint8_t vehicle = researchItem.item; auto rideEntryIndex = _vehicleTypeToRideEntryMap[vehicle]; if (!_researchRideEntryUsed[rideEntryIndex]) @@ -2150,7 +2148,7 @@ namespace RCT1 uint8_t researchItem = src->Assoc & 0x000000FF; uint8_t researchType = (src->Assoc & 0x00FF0000) >> 16; - ResearchItem tmpResearchItem = {}; + ::ResearchItem tmpResearchItem = {}; ConvertResearchEntry(&tmpResearchItem, researchItem, researchType); dst->Assoc = tmpResearchItem.rawValue; } @@ -2194,7 +2192,7 @@ namespace RCT1 gTotalRideValueForMoney = _s4.total_ride_value_for_money; } - void ConvertResearchEntry(ResearchItem* dst, uint8_t srcItem, uint8_t srcType) + void ConvertResearchEntry(::ResearchItem* dst, uint8_t srcItem, uint8_t srcType) { dst->SetNull(); if (srcType == RCT1_RESEARCH_TYPE_RIDE) @@ -2426,7 +2424,7 @@ namespace RCT1 return nullptr; } - const rct1_research_item* GetResearchList(size_t* count) + const RCT1::ResearchItem* GetResearchList(size_t* count) { // Loopy Landscapes stores research items in a different place if (_gameVersion == FILE_VERSION_RCT1_LL) @@ -2589,7 +2587,7 @@ namespace RCT1 ObjectEntryIndex GetBuildTheBestRideId() { size_t researchListCount; - const rct1_research_item* researchList = GetResearchList(&researchListCount); + const RCT1::ResearchItem* researchList = GetResearchList(&researchListCount); for (size_t i = 0; i < researchListCount; i++) { if (researchList[i].flags == 0xFF) @@ -2617,7 +2615,7 @@ namespace RCT1 output = EntityType::Vehicle; break; case RCT12SpriteIdentifier::Peep: - if (RCT12PeepType(static_cast(&src)->type) == RCT12PeepType::Guest) + if (RCT12PeepType(static_cast(&src)->type) == RCT12PeepType::Guest) { output = EntityType::Guest; } @@ -2671,10 +2669,10 @@ namespace RCT1 return output; } - template<> void S4Importer::ImportEntity(const RCT12SpriteBase& srcBase) + template<> void S4Importer::ImportEntity<::Vehicle>(const RCT12SpriteBase& srcBase) { - auto* dst = CreateEntityAt(srcBase.sprite_index); - auto* src = static_cast(&srcBase); + auto* dst = CreateEntityAt<::Vehicle>(srcBase.sprite_index); + auto* src = static_cast(&srcBase); const auto* ride = get_ride(src->ride); if (ride == nullptr) return; @@ -2685,7 +2683,7 @@ namespace RCT1 dst->ride_subtype = RCTEntryIndexToOpenRCT2EntryIndex(ride->subtype); dst->vehicle_type = vehicleEntryIndex; - dst->SubType = Vehicle::Type(src->type); + dst->SubType = ::Vehicle::Type(src->type); dst->var_44 = src->var_44; dst->remaining_distance = src->remaining_distance; @@ -2749,16 +2747,16 @@ namespace RCT1 } } - Vehicle::Status statusSrc = Vehicle::Status::MovingToEndOfStation; - if (src->status <= static_cast(Vehicle::Status::StoppedByBlockBrakes)) + ::Vehicle::Status statusSrc = ::Vehicle::Status::MovingToEndOfStation; + if (src->status <= static_cast(::Vehicle::Status::StoppedByBlockBrakes)) { - statusSrc = static_cast(src->status); + statusSrc = static_cast<::Vehicle::Status>(src->status); } dst->status = statusSrc; dst->TrackSubposition = VehicleTrackSubposition{ src->TrackSubposition }; dst->TrackLocation = { src->track_x, src->track_y, src->track_z }; dst->current_station = src->current_station; - if (src->boat_location.isNull() || ride->mode != RideMode::BoatHire || statusSrc != Vehicle::Status::TravellingBoat) + if (src->boat_location.isNull() || ride->mode != RideMode::BoatHire || statusSrc != ::Vehicle::Status::TravellingBoat) { dst->BoatLocation.setNull(); dst->SetTrackDirection(src->GetTrackDirection()); @@ -2790,7 +2788,7 @@ namespace RCT1 template<> void S4Importer::ImportEntity(const RCT12SpriteBase& srcBase) { auto* dst = CreateEntityAt(srcBase.sprite_index); - auto* src = static_cast(&srcBase); + auto* src = static_cast(&srcBase); ImportPeep(dst, src); dst->OutsideOfPark = static_cast(src->outside_of_park); @@ -2887,7 +2885,7 @@ namespace RCT1 template<> void S4Importer::ImportEntity(const RCT12SpriteBase& srcBase) { auto* dst = CreateEntityAt(srcBase.sprite_index); - auto* src = static_cast(&srcBase); + auto* src = static_cast(&srcBase); ImportPeep(dst, src); dst->AssignedStaffType = StaffType(src->staff_type); dst->MechanicTimeSinceCall = src->mechanic_time_since_call; @@ -3005,7 +3003,7 @@ namespace RCT1 switch (GetEntityTypeFromRCT1Sprite(src)) { case EntityType::Vehicle: - ImportEntity(src); + ImportEntity<::Vehicle>(src); break; case EntityType::Guest: ImportEntity(src); diff --git a/src/openrct2/rct1/T4Importer.cpp b/src/openrct2/rct1/T4Importer.cpp index d704c09083..3974f41aea 100644 --- a/src/openrct2/rct1/T4Importer.cpp +++ b/src/openrct2/rct1/T4Importer.cpp @@ -95,8 +95,8 @@ namespace RCT1 std::unique_ptr ImportAA() { std::unique_ptr td = std::make_unique(); - rct_track_td4_aa td4aa{}; - _stream.Read(&td4aa, sizeof(rct_track_td4_aa)); + TD4AA td4aa{}; + _stream.Read(&td4aa, sizeof(TD4AA)); for (int32_t i = 0; i < RCT12_NUM_COLOUR_SCHEMES; i++) { @@ -113,8 +113,8 @@ namespace RCT1 std::unique_ptr ImportTD4() { std::unique_ptr td = std::make_unique(); - rct_track_td4 td4{}; - _stream.Read(&td4, sizeof(rct_track_td4)); + TD4 td4{}; + _stream.Read(&td4, sizeof(TD4)); for (int32_t i = 0; i < NUM_COLOUR_SCHEMES; i++) { td->track_spine_colour[i] = RCT1::GetColour(td4.track_spine_colour_v0); @@ -137,7 +137,7 @@ namespace RCT1 return ImportTD4Base(std::move(td), td4); } - std::unique_ptr ImportTD4Base(std::unique_ptr td, rct_track_td4& td4Base) + std::unique_ptr ImportTD4Base(std::unique_ptr td, TD4& td4Base) { td->type = RCT1::GetRideType(td4Base.type, td4Base.vehicle_type); @@ -172,7 +172,7 @@ namespace RCT1 for (int32_t i = 0; i < RCT1_MAX_TRAINS_PER_RIDE; i++) { // RCT1 had no third colour - RCT1::RCT1VehicleColourSchemeCopyDescriptor colourSchemeCopyDescriptor = RCT1::GetColourSchemeCopyDescriptor( + RCT1::VehicleColourSchemeCopyDescriptor colourSchemeCopyDescriptor = RCT1::GetColourSchemeCopyDescriptor( td4Base.vehicle_type); if (colourSchemeCopyDescriptor.colour1 == COPY_COLOUR_1) { diff --git a/src/openrct2/rct1/Tables.cpp b/src/openrct2/rct1/Tables.cpp index 4fd6c5f436..af7c7fe6ef 100644 --- a/src/openrct2/rct1/Tables.cpp +++ b/src/openrct2/rct1/Tables.cpp @@ -275,9 +275,9 @@ namespace RCT1 return map[rideType]; } - RCT1VehicleColourSchemeCopyDescriptor GetColourSchemeCopyDescriptor(uint8_t vehicleType) + VehicleColourSchemeCopyDescriptor GetColourSchemeCopyDescriptor(uint8_t vehicleType) { - static RCT1VehicleColourSchemeCopyDescriptor map[89] = + static VehicleColourSchemeCopyDescriptor map[89] = { { COPY_COLOUR_1, COPY_COLOUR_2, COLOUR_BLACK }, // RCT1_VEHICLE_TYPE_STEEL_ROLLER_COASTER_TRAIN = 0, { COPY_COLOUR_1, COPY_COLOUR_2, COLOUR_BLACK }, // RCT1_VEHICLE_TYPE_STEEL_ROLLER_COASTER_TRAIN_BACKWARDS, diff --git a/src/openrct2/rct1/Tables.h b/src/openrct2/rct1/Tables.h index acb0db2006..ac263bd822 100644 --- a/src/openrct2/rct1/Tables.h +++ b/src/openrct2/rct1/Tables.h @@ -16,7 +16,7 @@ namespace RCT1 { - struct RCT1VehicleColourSchemeCopyDescriptor + struct VehicleColourSchemeCopyDescriptor { int8_t colour1, colour2, colour3; }; @@ -27,7 +27,7 @@ namespace RCT1 ObjectEntryIndex GetTerrainEdge(uint8_t terrainEdge); uint8_t GetRideType(uint8_t rideType, uint8_t vehicleType); - RCT1VehicleColourSchemeCopyDescriptor GetColourSchemeCopyDescriptor(uint8_t vehicleType); + VehicleColourSchemeCopyDescriptor GetColourSchemeCopyDescriptor(uint8_t vehicleType); bool RideTypeUsesVehicles(uint8_t rideType); bool PathIsQueue(uint8_t pathType); uint8_t NormalisePathAddition(uint8_t pathAdditionType); From 2f9e9e853e2292c4fb50a850e0f0129559745629 Mon Sep 17 00:00:00 2001 From: duncanspumpkin Date: Thu, 26 Aug 2021 12:54:38 +0100 Subject: [PATCH 41/51] Move further structs into correct headers --- src/openrct2/rct2/RCT2.h | 9 +++++++ src/openrct2/scenario/Scenario.h | 30 ---------------------- src/openrct2/scenario/ScenarioRepository.h | 12 +++++++++ src/openrct2/scenario/ScenarioSources.cpp | 1 + 4 files changed, 22 insertions(+), 30 deletions(-) diff --git a/src/openrct2/rct2/RCT2.h b/src/openrct2/rct2/RCT2.h index 14becf9d7d..dbb2cfadaa 100644 --- a/src/openrct2/rct2/RCT2.h +++ b/src/openrct2/rct2/RCT2.h @@ -1037,6 +1037,15 @@ struct rct_s6_data uint8_t pad_13CE778[434]; }; assert_struct_size(rct_s6_data, 0x46b44a); + +struct rct_stex_entry +{ + rct_string_id scenario_name; // 0x00 + rct_string_id park_name; // 0x02 + rct_string_id details; // 0x04 + uint8_t var_06; +}; +assert_struct_size(rct_stex_entry, 7); #pragma pack(pop) std::vector DecryptSea(const fs::path& path); diff --git a/src/openrct2/scenario/Scenario.h b/src/openrct2/scenario/Scenario.h index 1c6727146e..3d63931f9b 100644 --- a/src/openrct2/scenario/Scenario.h +++ b/src/openrct2/scenario/Scenario.h @@ -14,8 +14,6 @@ #include "../management/Finance.h" #include "../management/Research.h" #include "../object/Object.h" -#include "../rct12/RCT12.h" -#include "../rct2/RCT2.h" #include "../ride/Ride.h" #include "../ride/RideRatings.h" #include "../world/Banner.h" @@ -26,34 +24,6 @@ using random_engine_t = Random::Rct2::Engine; -enum class EditorStep : uint8_t; - -struct ParkLoadResult; - -#pragma pack(push, 1) - -enum class ScenarioSource : uint8_t -{ - RCT1, - RCT1_AA, - RCT1_LL, - RCT2, - RCT2_WW, - RCT2_TT, - Real, - Other -}; - -struct rct_stex_entry -{ - rct_string_id scenario_name; // 0x00 - rct_string_id park_name; // 0x02 - rct_string_id details; // 0x04 - uint8_t var_06; -}; -assert_struct_size(rct_stex_entry, 7); -#pragma pack(pop) - enum { SCENARIO_FLAGS_VISIBLE = (1 << 0), diff --git a/src/openrct2/scenario/ScenarioRepository.h b/src/openrct2/scenario/ScenarioRepository.h index 8d6898d464..c9ff1e12c7 100644 --- a/src/openrct2/scenario/ScenarioRepository.h +++ b/src/openrct2/scenario/ScenarioRepository.h @@ -24,6 +24,18 @@ struct scenario_highscore_entry datetime64 timestamp; }; +enum class ScenarioSource : uint8_t +{ + RCT1, + RCT1_AA, + RCT1_LL, + RCT2, + RCT2_WW, + RCT2_TT, + Real, + Other +}; + struct scenario_index_entry { utf8 path[MAX_PATH]; diff --git a/src/openrct2/scenario/ScenarioSources.cpp b/src/openrct2/scenario/ScenarioSources.cpp index 38f50f4c5a..584a1517b8 100644 --- a/src/openrct2/scenario/ScenarioSources.cpp +++ b/src/openrct2/scenario/ScenarioSources.cpp @@ -12,6 +12,7 @@ #include "../core/Guard.hpp" #include "../core/String.hpp" #include "Scenario.h" +#include "ScenarioRepository.h" #include From b97ebc745f929688ab0e3c900871584d2659aa1b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=CE=B6eh=20Matt?= <5415177+ZehMatt@users.noreply.github.com> Date: Fri, 27 Aug 2021 23:17:47 +0300 Subject: [PATCH 42/51] Rename rct_peep_thought to PeepThought --- src/openrct2/core/DataSerialiserTraits.h | 10 +++++----- src/openrct2/peep/Guest.cpp | 12 ++++++------ src/openrct2/peep/Peep.cpp | 3 +-- src/openrct2/peep/Peep.h | 6 +++--- 4 files changed, 15 insertions(+), 16 deletions(-) diff --git a/src/openrct2/core/DataSerialiserTraits.h b/src/openrct2/core/DataSerialiserTraits.h index 3953709582..bb4b638724 100644 --- a/src/openrct2/core/DataSerialiserTraits.h +++ b/src/openrct2/core/DataSerialiserTraits.h @@ -814,27 +814,27 @@ template<> struct DataSerializerTraits_t } }; -template<> struct DataSerializerTraits_t +template<> struct DataSerializerTraits_t { - static void encode(OpenRCT2::IStream* stream, const rct_peep_thought& val) + static void encode(OpenRCT2::IStream* stream, const PeepThought& val) { stream->Write(&val.type); stream->Write(&val.item); stream->Write(&val.freshness); stream->Write(&val.fresh_timeout); } - static void decode(OpenRCT2::IStream* stream, rct_peep_thought& val) + static void decode(OpenRCT2::IStream* stream, PeepThought& val) { stream->Read(&val.type); stream->Read(&val.item); stream->Read(&val.freshness); stream->Read(&val.fresh_timeout); } - static void log(OpenRCT2::IStream* stream, const rct_peep_thought& val) + static void log(OpenRCT2::IStream* stream, const PeepThought& val) { char msg[128] = {}; snprintf( - msg, sizeof(msg), "rct_peep_thought(type = %d, item = %d, freshness = %d, freshtimeout = %d)", + msg, sizeof(msg), "PeepThought(type = %d, item = %d, freshness = %d, freshtimeout = %d)", static_cast(val.type), val.item, val.freshness, val.fresh_timeout); stream->Write(msg, strlen(msg)); } diff --git a/src/openrct2/peep/Guest.cpp b/src/openrct2/peep/Guest.cpp index f85ef7f0b1..53e4792b08 100644 --- a/src/openrct2/peep/Guest.cpp +++ b/src/openrct2/peep/Guest.cpp @@ -3232,7 +3232,7 @@ void Guest::StopPurchaseThought(uint8_t ride_type) // Remove the related thought for (int32_t i = 0; i < PEEP_MAX_THOUGHTS; ++i) { - rct_peep_thought* thought = &Thoughts[i]; + PeepThought* thought = &Thoughts[i]; if (thought->type == PeepThoughtType::None) break; @@ -3242,7 +3242,7 @@ void Guest::StopPurchaseThought(uint8_t ride_type) if (i < PEEP_MAX_THOUGHTS - 1) { - memmove(thought, thought + 1, sizeof(rct_peep_thought) * (PEEP_MAX_THOUGHTS - i - 1)); + memmove(thought, thought + 1, sizeof(PeepThought) * (PEEP_MAX_THOUGHTS - i - 1)); } Thoughts[PEEP_MAX_THOUGHTS - 1].type = PeepThoughtType::None; @@ -6774,7 +6774,7 @@ bool Guest::HeadingForRideOrParkExit() const * argument_1 (esi & ebx) * argument_2 (esi+2) */ -void peep_thought_set_format_args(const rct_peep_thought* thought, Formatter& ft) +void peep_thought_set_format_args(const PeepThought* thought, Formatter& ft) { ft.Add(PeepThoughts[EnumValue(thought->type)]); @@ -6821,7 +6821,7 @@ void Guest::InsertNewThought(PeepThoughtType thoughtType, uint8_t thoughtArgumen for (int32_t i = 0; i < PEEP_MAX_THOUGHTS; ++i) { - rct_peep_thought* thought = &Thoughts[i]; + PeepThought* thought = &Thoughts[i]; // Remove the oldest thought by setting it to NONE. if (thought->type == PeepThoughtType::None) break; @@ -6833,13 +6833,13 @@ void Guest::InsertNewThought(PeepThoughtType thoughtType, uint8_t thoughtArgumen // existing thought and placing it at the top. if (i < PEEP_MAX_THOUGHTS - 2) { - memmove(thought, thought + 1, sizeof(rct_peep_thought) * (PEEP_MAX_THOUGHTS - i - 1)); + memmove(thought, thought + 1, sizeof(PeepThought) * (PEEP_MAX_THOUGHTS - i - 1)); } break; } } - memmove(&Thoughts[1], &Thoughts[0], sizeof(rct_peep_thought) * (PEEP_MAX_THOUGHTS - 1)); + memmove(&Thoughts[1], &Thoughts[0], sizeof(PeepThought) * (PEEP_MAX_THOUGHTS - 1)); Thoughts[0].type = thoughtType; Thoughts[0].item = thoughtArguments; diff --git a/src/openrct2/peep/Peep.cpp b/src/openrct2/peep/Peep.cpp index 48d9e7e7e8..5b1ff8ff82 100644 --- a/src/openrct2/peep/Peep.cpp +++ b/src/openrct2/peep/Peep.cpp @@ -887,8 +887,7 @@ static void peep_update_thoughts(Guest* peep) // Clear top thought, push others up if (i < PEEP_MAX_THOUGHTS - 2) { - memmove( - &peep->Thoughts[i], &peep->Thoughts[i + 1], sizeof(rct_peep_thought) * (PEEP_MAX_THOUGHTS - i - 1)); + memmove(&peep->Thoughts[i], &peep->Thoughts[i + 1], sizeof(PeepThought) * (PEEP_MAX_THOUGHTS - i - 1)); } peep->Thoughts[PEEP_MAX_THOUGHTS - 1].type = PeepThoughtType::None; } diff --git a/src/openrct2/peep/Peep.h b/src/openrct2/peep/Peep.h index ceab4cbde7..3a4a446898 100644 --- a/src/openrct2/peep/Peep.h +++ b/src/openrct2/peep/Peep.h @@ -485,7 +485,7 @@ enum PeepRideDecision PEEP_RIDE_DECISION_THINKING = 1 << 2, }; -struct rct_peep_thought +struct PeepThought { PeepThoughtType type; // 0 uint8_t item; // 1 @@ -703,7 +703,7 @@ public: int8_t RejoinQueueTimeout; // whilst waiting for a free vehicle (or pair) in the entrance ride_id_t PreviousRide; uint16_t PreviousRideTimeOut; - std::array Thoughts; + std::array Thoughts; // 0x3F Litter Count split into lots of 3 with time, 0xC0 Time since last recalc uint8_t LitterCount; // 0x3F Sick Count split into lots of 3 with time, 0xC0 Time since last recalc @@ -1002,7 +1002,7 @@ void peep_stop_crowd_noise(); void peep_update_crowd_noise(); void peep_update_days_in_queue(); void peep_applause(); -void peep_thought_set_format_args(const rct_peep_thought* thought, Formatter& ft); +void peep_thought_set_format_args(const PeepThought* thought, Formatter& ft); int32_t get_peep_face_sprite_small(Guest* peep); int32_t get_peep_face_sprite_large(Guest* peep); void peep_sprite_remove(Peep* peep); From 1555a4da9f33dd9b1955aea06599c04e459f9f71 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=CE=B6eh=20Matt?= <5415177+ZehMatt@users.noreply.github.com> Date: Sat, 28 Aug 2021 00:02:09 +0300 Subject: [PATCH 43/51] Modify storage of PeepThought items to 16 bit for rides and shop items --- src/openrct2/peep/Peep.h | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/src/openrct2/peep/Peep.h b/src/openrct2/peep/Peep.h index 3a4a446898..2d07b5847c 100644 --- a/src/openrct2/peep/Peep.h +++ b/src/openrct2/peep/Peep.h @@ -485,12 +485,19 @@ enum PeepRideDecision PEEP_RIDE_DECISION_THINKING = 1 << 2, }; +static constexpr uint16_t PeepThoughtItemNone = std::numeric_limits::max(); + struct PeepThought { - PeepThoughtType type; // 0 - uint8_t item; // 1 - uint8_t freshness; // 2 larger is less fresh - uint8_t fresh_timeout; // 3 updates every tick + PeepThoughtType type; + union + { + ride_id_t rideId; + ShopItem shopItem; + uint16_t item; + }; + uint8_t freshness; // larger is less fresh + uint8_t fresh_timeout; // updates every tick }; struct Guest; From 483fb173f5bd0304fe4defb16df6b49cf36cda8d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=CE=B6eh=20Matt?= <5415177+ZehMatt@users.noreply.github.com> Date: Sat, 28 Aug 2021 00:06:29 +0300 Subject: [PATCH 44/51] Adjust S6 import/export for different thought item type --- src/openrct2/rct2/S6Exporter.cpp | 2 +- src/openrct2/rct2/S6Importer.cpp | 5 ++++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/openrct2/rct2/S6Exporter.cpp b/src/openrct2/rct2/S6Exporter.cpp index be4005d824..99649fcd5b 100644 --- a/src/openrct2/rct2/S6Exporter.cpp +++ b/src/openrct2/rct2/S6Exporter.cpp @@ -1342,7 +1342,7 @@ template<> void S6Exporter::ExportEntity(RCT2SpritePeep* dst, const Guest* src) auto srcThought = &src->Thoughts[i]; auto dstThought = &dst->thoughts[i]; dstThought->type = static_cast(srcThought->type); - dstThought->item = srcThought->item; + dstThought->item = static_cast(srcThought->item); dstThought->freshness = srcThought->freshness; dstThought->fresh_timeout = srcThought->fresh_timeout; } diff --git a/src/openrct2/rct2/S6Importer.cpp b/src/openrct2/rct2/S6Importer.cpp index d331e309ad..0bf43eb635 100644 --- a/src/openrct2/rct2/S6Importer.cpp +++ b/src/openrct2/rct2/S6Importer.cpp @@ -1721,7 +1721,10 @@ template<> void S6Importer::ImportEntity(const RCT12SpriteBase& baseSrc) auto srcThought = &src->thoughts[i]; auto dstThought = &dst->Thoughts[i]; dstThought->type = static_cast(srcThought->type); - dstThought->item = srcThought->item; + if (srcThought->item == 0xFF) + dstThought->item = PeepThoughtItemNone; + else + dstThought->item = srcThought->item; dstThought->freshness = srcThought->freshness; dstThought->fresh_timeout = srcThought->fresh_timeout; } From a5931921bf9278adeea68192f456010ea82621d4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=CE=B6eh=20Matt?= <5415177+ZehMatt@users.noreply.github.com> Date: Sat, 28 Aug 2021 00:07:22 +0300 Subject: [PATCH 45/51] Small clean up --- src/openrct2/peep/Guest.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/openrct2/peep/Guest.cpp b/src/openrct2/peep/Guest.cpp index 53e4792b08..aeb76dc25f 100644 --- a/src/openrct2/peep/Guest.cpp +++ b/src/openrct2/peep/Guest.cpp @@ -6781,7 +6781,7 @@ void peep_thought_set_format_args(const PeepThought* thought, Formatter& ft) PeepThoughtToActionFlag flags = PeepThoughtToActionMap[EnumValue(thought->type)].flags; if (flags & PEEP_THOUGHT_ACTION_FLAG_RIDE) { - auto ride = get_ride(thought->item); + auto ride = get_ride(thought->rideId); if (ride != nullptr) { ride->FormatNameTo(ft); @@ -6793,11 +6793,11 @@ void peep_thought_set_format_args(const PeepThought* thought, Formatter& ft) } else if (flags & PEEP_THOUGHT_ACTION_FLAG_SHOP_ITEM_SINGULAR) { - ft.Add(GetShopItemDescriptor(ShopItem(thought->item)).Naming.Singular); + ft.Add(GetShopItemDescriptor(thought->shopItem).Naming.Singular); } else if (flags & PEEP_THOUGHT_ACTION_FLAG_SHOP_ITEM_INDEFINITE) { - ft.Add(GetShopItemDescriptor(ShopItem(thought->item)).Naming.Indefinite); + ft.Add(GetShopItemDescriptor(thought->shopItem).Naming.Indefinite); } } From bab646de6e365b890fe8b17622462626ffaec24a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=CE=B6eh=20Matt?= <5415177+ZehMatt@users.noreply.github.com> Date: Sat, 28 Aug 2021 15:12:32 +0300 Subject: [PATCH 46/51] Add RCT12PeepThoughtItemNone constant --- src/openrct2/rct12/RCT12.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/openrct2/rct12/RCT12.h b/src/openrct2/rct12/RCT12.h index 4652c88625..53982f8e18 100644 --- a/src/openrct2/rct12/RCT12.h +++ b/src/openrct2/rct12/RCT12.h @@ -88,6 +88,8 @@ constexpr const uint16_t RCT12_PEEP_SPAWN_UNDEFINED = 0xFFFF; constexpr const uint16_t RCT12VehicleTrackDirectionMask = 0b0000000000000011; constexpr const uint16_t RCT12VehicleTrackTypeMask = 0b1111111111111100; +constexpr const uint8_t RCT12PeepThoughtItemNone = std::numeric_limits::max(); + enum class RCT12TrackDesignVersion : uint8_t { TD4, From 77dccb995c8c737474ad65feec05f04e83093118 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=CE=B6eh=20Matt?= <5415177+ZehMatt@users.noreply.github.com> Date: Sat, 28 Aug 2021 15:13:07 +0300 Subject: [PATCH 47/51] Use RCT12PeepThoughtItemNone for importers --- src/openrct2/rct1/S4Importer.cpp | 5 ++++- src/openrct2/rct2/S6Importer.cpp | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/openrct2/rct1/S4Importer.cpp b/src/openrct2/rct1/S4Importer.cpp index 7e24d90b54..dcdca4c08e 100644 --- a/src/openrct2/rct1/S4Importer.cpp +++ b/src/openrct2/rct1/S4Importer.cpp @@ -2846,7 +2846,10 @@ namespace RCT1 auto srcThought = &src->thoughts[i]; auto dstThought = &dst->Thoughts[i]; dstThought->type = static_cast(srcThought->type); - dstThought->item = srcThought->item; + if (srcThought->item == RCT12PeepThoughtItemNone) + dstThought->item = PeepThoughtItemNone; + else + dstThought->item = srcThought->item; dstThought->freshness = srcThought->freshness; dstThought->fresh_timeout = srcThought->fresh_timeout; } diff --git a/src/openrct2/rct2/S6Importer.cpp b/src/openrct2/rct2/S6Importer.cpp index 0bf43eb635..ae440fa402 100644 --- a/src/openrct2/rct2/S6Importer.cpp +++ b/src/openrct2/rct2/S6Importer.cpp @@ -1721,7 +1721,7 @@ template<> void S6Importer::ImportEntity(const RCT12SpriteBase& baseSrc) auto srcThought = &src->thoughts[i]; auto dstThought = &dst->Thoughts[i]; dstThought->type = static_cast(srcThought->type); - if (srcThought->item == 0xFF) + if (srcThought->item == RCT12PeepThoughtItemNone) dstThought->item = PeepThoughtItemNone; else dstThought->item = srcThought->item; From e9c959b187dca896c9cfa20bc8112afca0e418e3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=CE=B6eh=20Matt?= <5415177+ZehMatt@users.noreply.github.com> Date: Mon, 30 Aug 2021 18:33:48 +0300 Subject: [PATCH 48/51] Test correct fields in the gamestate snapshot --- src/openrct2/GameStateSnapshots.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/openrct2/GameStateSnapshots.cpp b/src/openrct2/GameStateSnapshots.cpp index f6e1f53d19..0090e08e09 100644 --- a/src/openrct2/GameStateSnapshots.cpp +++ b/src/openrct2/GameStateSnapshots.cpp @@ -337,7 +337,10 @@ struct GameStateSnapshots final : public IGameStateSnapshots COMPARE_FIELD(Guest, PreviousRideTimeOut); for (int i = 0; i < PEEP_MAX_THOUGHTS; i++) { - COMPARE_FIELD(Guest, Thoughts[i]); + COMPARE_FIELD(Guest, Thoughts[i].type); + COMPARE_FIELD(Guest, Thoughts[i].item); + COMPARE_FIELD(Guest, Thoughts[i].freshness); + COMPARE_FIELD(Guest, Thoughts[i].fresh_timeout); } COMPARE_FIELD(Guest, GuestHeadingToRideId); COMPARE_FIELD(Guest, GuestIsLostCountdown); From 336372c7beb659d8d76907e22c12b22947ab3620 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=CE=B6eh=20Matt?= <5415177+ZehMatt@users.noreply.github.com> Date: Mon, 30 Aug 2021 19:42:23 +0300 Subject: [PATCH 49/51] Adjust InsertThought overloads to use correct constants --- src/openrct2-ui/windows/Guest.cpp | 2 +- src/openrct2/peep/Guest.cpp | 46 +++++++++++++++++++------------ src/openrct2/peep/Peep.cpp | 12 ++++---- src/openrct2/peep/Peep.h | 4 ++- 4 files changed, 38 insertions(+), 26 deletions(-) diff --git a/src/openrct2-ui/windows/Guest.cpp b/src/openrct2-ui/windows/Guest.cpp index 52da711226..a52a0ee43c 100644 --- a/src/openrct2-ui/windows/Guest.cpp +++ b/src/openrct2-ui/windows/Guest.cpp @@ -1100,7 +1100,7 @@ void window_guest_overview_update(rct_window* w) int32_t random = util_rand() & 0xFFFF; if (random <= 0x2AAA) { - peep->InsertNewThought(PeepThoughtType::Watched, PEEP_THOUGHT_ITEM_NONE); + peep->InsertNewThought(PeepThoughtType::Watched); } } } diff --git a/src/openrct2/peep/Guest.cpp b/src/openrct2/peep/Guest.cpp index aeb76dc25f..bcb958d5bc 100644 --- a/src/openrct2/peep/Guest.cpp +++ b/src/openrct2/peep/Guest.cpp @@ -889,7 +889,7 @@ void Guest::Tick128UpdateGuest(int32_t index) PeepThoughtType thought_type = crowded_thoughts[scenario_rand() & 0xF]; if (thought_type != PeepThoughtType::None) { - InsertNewThought(thought_type, PEEP_THOUGHT_ITEM_NONE); + InsertNewThought(thought_type); } } @@ -950,7 +950,7 @@ void Guest::Tick128UpdateGuest(int32_t index) if (thought_type != PeepThoughtType::None) { - InsertNewThought(thought_type, PEEP_THOUGHT_ITEM_NONE); + InsertNewThought(thought_type); HappinessTarget = std::min(PEEP_MAX_HAPPINESS, HappinessTarget + 45); } } @@ -965,7 +965,7 @@ void Guest::Tick128UpdateGuest(int32_t index) if (PeepFlags & PEEP_FLAGS_WOW) { - InsertNewThought(PeepThoughtType::Wow2, PEEP_THOUGHT_ITEM_NONE); + InsertNewThought(PeepThoughtType::Wow2); } if (GuestTimeOnRide > 15) @@ -1070,7 +1070,7 @@ void Guest::Tick128UpdateGuest(int32_t index) { PeepThoughtType chosen_thought = possible_thoughts[scenario_rand() % num_thoughts]; - InsertNewThought(chosen_thought, PEEP_THOUGHT_ITEM_NONE); + InsertNewThought(chosen_thought); switch (chosen_thought) { @@ -1106,7 +1106,7 @@ void Guest::Tick128UpdateGuest(int32_t index) thought_type = PeepThoughtType::VerySick; peep_head_for_nearest_ride_type(this, RIDE_TYPE_FIRST_AID); } - InsertNewThought(thought_type, PEEP_THOUGHT_ITEM_NONE); + InsertNewThought(thought_type); } } @@ -1379,7 +1379,7 @@ void Guest::CheckIfLost() return; TimeLost = 230; } - InsertNewThought(PeepThoughtType::Lost, PEEP_THOUGHT_ITEM_NONE); + InsertNewThought(PeepThoughtType::Lost); HappinessTarget = std::max(HappinessTarget - 30, 0); } @@ -1429,7 +1429,7 @@ void Guest::CheckCantFindExit() // Peeps who can't find the park exit will continue to get less happy until they find it. if (GuestIsLostCountdown == 1) { - InsertNewThought(PeepThoughtType::CantFindExit, PEEP_THOUGHT_ITEM_NONE); + InsertNewThought(PeepThoughtType::CantFindExit); HappinessTarget = std::max(HappinessTarget - 30, 0); } @@ -1495,13 +1495,13 @@ bool Guest::DecideAndBuyItem(Ride* ride, ShopItem shopItem, money32 price) if (GetShopItemDescriptor(shopItem).IsFood() && (Hunger > 75)) { - InsertNewThought(PeepThoughtType::NotHungry, PEEP_THOUGHT_ITEM_NONE); + InsertNewThought(PeepThoughtType::NotHungry); return false; } if (GetShopItemDescriptor(shopItem).IsDrink() && (Thirst > 75)) { - InsertNewThought(PeepThoughtType::NotThirsty, PEEP_THOUGHT_ITEM_NONE); + InsertNewThought(PeepThoughtType::NotThirsty); return false; } @@ -1517,7 +1517,7 @@ bool Guest::DecideAndBuyItem(Ride* ride, ShopItem shopItem, money32 price) { if (CashInPocket == 0) { - InsertNewThought(PeepThoughtType::SpentMoney, PEEP_THOUGHT_ITEM_NONE); + InsertNewThought(PeepThoughtType::SpentMoney); return false; } if (price > CashInPocket) @@ -1991,7 +1991,7 @@ bool Guest::ShouldGoOnRide(Ride* ride, int32_t entranceNum, bool atQueue, bool t { if (CashInPocket <= 0) { - InsertNewThought(PeepThoughtType::SpentMoney, PEEP_THOUGHT_ITEM_NONE); + InsertNewThought(PeepThoughtType::SpentMoney); } else { @@ -2235,7 +2235,7 @@ bool Guest::ShouldGoToShop(Ride* ride, bool peepAtShop) { if (CashInPocket <= 0) { - InsertNewThought(PeepThoughtType::SpentMoney, PEEP_THOUGHT_ITEM_NONE); + InsertNewThought(PeepThoughtType::SpentMoney); } else { @@ -2584,7 +2584,7 @@ static bool peep_check_ride_price_at_entrance(Guest* peep, Ride* ride, money32 r if (peep->CashInPocket <= 0 && !(gParkFlags & PARK_FLAGS_NO_MONEY)) { - peep->InsertNewThought(PeepThoughtType::SpentMoney, PEEP_THOUGHT_ITEM_NONE); + peep->InsertNewThought(PeepThoughtType::SpentMoney); peep_update_ride_at_entrance_try_leave(peep); return false; } @@ -3070,7 +3070,7 @@ static void peep_leave_park(Guest* peep) peep->PeepFlags &= ~PEEP_FLAGS_PARK_ENTRANCE_CHOSEN; } - peep->InsertNewThought(PeepThoughtType::GoHome, PEEP_THOUGHT_ITEM_NONE); + peep->InsertNewThought(PeepThoughtType::GoHome); rct_window* w = window_find_by_number(WC_PEEP, peep->sprite_index); if (w != nullptr) @@ -5425,11 +5425,11 @@ void Guest::UpdateWalking() if (CurrentSeat & 1) { - InsertNewThought(PeepThoughtType::NewRide, PEEP_THOUGHT_ITEM_NONE); + InsertNewThought(PeepThoughtType::NewRide); } if (CurrentRide == RIDE_ID_NULL) { - InsertNewThought(PeepThoughtType::Scenery, PEEP_THOUGHT_ITEM_NONE); + InsertNewThought(PeepThoughtType::Scenery); } } @@ -6801,6 +6801,16 @@ void peep_thought_set_format_args(const PeepThought* thought, Formatter& ft) } } +void Guest::InsertNewThought(PeepThoughtType thought_type) +{ + InsertNewThought(thought_type, PeepThoughtItemNone); +} + +void Guest::InsertNewThought(PeepThoughtType thought_type, ShopItem shopItem) +{ + InsertNewThought(thought_type, static_cast(shopItem)); +} + /** * * rct2: 0x699F5A @@ -6808,7 +6818,7 @@ void peep_thought_set_format_args(const PeepThought* thought, Formatter& ft) * ah:thoughtArguments * esi: peep */ -void Guest::InsertNewThought(PeepThoughtType thoughtType, uint8_t thoughtArguments) +void Guest::InsertNewThought(PeepThoughtType thoughtType, uint16_t thoughtArguments) { PeepActionType newAction = PeepThoughtToActionMap[EnumValue(thoughtType)].action; if (newAction != PeepActionType::Walking && IsActionInterruptable()) @@ -7459,6 +7469,6 @@ void Guest::RemoveRideFromMemory(ride_id_t rideId) // Last slot is now free. auto& lastEntry = Thoughts.back(); lastEntry.type = PeepThoughtType::None; - lastEntry.item = PEEP_THOUGHT_ITEM_NONE; + lastEntry.item = PeepThoughtItemNone; } } diff --git a/src/openrct2/peep/Peep.cpp b/src/openrct2/peep/Peep.cpp index 5b1ff8ff82..7b1d0e5b3e 100644 --- a/src/openrct2/peep/Peep.cpp +++ b/src/openrct2/peep/Peep.cpp @@ -752,7 +752,7 @@ void Peep::UpdateFalling() { // Drop balloon if held peep_release_balloon(guest, height); - guest->InsertNewThought(PeepThoughtType::Drowning, PEEP_THOUGHT_ITEM_NONE); + guest->InsertNewThought(PeepThoughtType::Drowning); } Action = PeepActionType::Drowning; @@ -844,7 +844,7 @@ void Peep::UpdatePicked() auto* guest = As(); if (SubState == 13 && guest != nullptr) { - guest->InsertNewThought(PeepThoughtType::Help, PEEP_THOUGHT_ITEM_NONE); + guest->InsertNewThought(PeepThoughtType::Help); } } @@ -1934,7 +1934,7 @@ static void peep_footpath_move_forward(Peep* peep, const CoordsXYE& coords, bool { if ((scenario_rand() & 0xFFFF) <= 10922) { - guest->InsertNewThought(PeepThoughtType::Vandalism, PEEP_THOUGHT_ITEM_NONE); + guest->InsertNewThought(PeepThoughtType::Vandalism); guest->HappinessTarget = std::max(0, guest->HappinessTarget - 17); } vandalThoughtTimeout = 3; @@ -1979,7 +1979,7 @@ static void peep_footpath_move_forward(Peep* peep, const CoordsXYE& coords, bool if (crowded >= 10 && guest->State == PeepState::Walking && (scenario_rand() & 0xFFFF) <= 21845) { - guest->InsertNewThought(PeepThoughtType::Crowded, PEEP_THOUGHT_ITEM_NONE); + guest->InsertNewThought(PeepThoughtType::Crowded); guest->HappinessTarget = std::max(0, guest->HappinessTarget - 14); } @@ -2005,7 +2005,7 @@ static void peep_footpath_move_forward(Peep* peep, const CoordsXYE& coords, bool if (total_sick >= 3 && (scenario_rand() & 0xFFFF) <= 10922) { - guest->InsertNewThought(PeepThoughtType::PathDisgusting, PEEP_THOUGHT_ITEM_NONE); + guest->InsertNewThought(PeepThoughtType::PathDisgusting); guest->HappinessTarget = std::max(0, guest->HappinessTarget - 17); // Reset disgusting time guest->DisgustingCount |= 0xC0; @@ -2031,7 +2031,7 @@ static void peep_footpath_move_forward(Peep* peep, const CoordsXYE& coords, bool if (total_litter >= 3 && (scenario_rand() & 0xFFFF) <= 10922) { - guest->InsertNewThought(PeepThoughtType::BadLitter, PEEP_THOUGHT_ITEM_NONE); + guest->InsertNewThought(PeepThoughtType::BadLitter); guest->HappinessTarget = std::max(0, guest->HappinessTarget - 17); // Reset litter time guest->LitterCount |= 0xC0; diff --git a/src/openrct2/peep/Peep.h b/src/openrct2/peep/Peep.h index 2d07b5847c..08968345c1 100644 --- a/src/openrct2/peep/Peep.h +++ b/src/openrct2/peep/Peep.h @@ -773,7 +773,9 @@ public: void HandleEasterEggName(); int32_t GetEasterEggNameId() const; void UpdateEasterEggInteractions(); - void InsertNewThought(PeepThoughtType thought_type, uint8_t thought_arguments); + void InsertNewThought(PeepThoughtType thought_type); + void InsertNewThought(PeepThoughtType thought_type, ShopItem thought_arguments); + void InsertNewThought(PeepThoughtType thought_type, uint16_t thought_arguments); static Guest* Generate(const CoordsXYZ& coords); bool UpdateQueuePosition(PeepActionType previous_action); void RemoveFromQueue(); From 9be3a39ddd3eb2a7d5887d55ec398ab1d9d7d2b8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=CE=B6eh=20Matt?= <5415177+ZehMatt@users.noreply.github.com> Date: Mon, 30 Aug 2021 19:42:44 +0300 Subject: [PATCH 50/51] Remove old constant PEEP_THOUGHT_ITEM_NONE --- src/openrct2/peep/Peep.h | 1 - 1 file changed, 1 deletion(-) diff --git a/src/openrct2/peep/Peep.h b/src/openrct2/peep/Peep.h index 08968345c1..5165766865 100644 --- a/src/openrct2/peep/Peep.h +++ b/src/openrct2/peep/Peep.h @@ -24,7 +24,6 @@ #include #define PEEP_MAX_THOUGHTS 5 -#define PEEP_THOUGHT_ITEM_NONE 255 #define PEEP_HUNGER_WARNING_THRESHOLD 25 #define PEEP_THIRST_WARNING_THRESHOLD 25 From a2827dc50ed6956d2c92b4129e03b872f80156bc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=CE=B6eh=20Matt?= <5415177+ZehMatt@users.noreply.github.com> Date: Mon, 30 Aug 2021 21:23:47 +0300 Subject: [PATCH 51/51] Update replays --- CMakeLists.txt | 4 ++-- openrct2.proj | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index c4b1b1df2c..d7e6e4d0bd 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -50,9 +50,9 @@ set(OBJECTS_VERSION "1.0.21") set(OBJECTS_URL "https://github.com/OpenRCT2/objects/releases/download/v${OBJECTS_VERSION}/objects.zip") set(OBJECTS_SHA1 "c38af45d51a6e440386180feacf76c64720b6ac5") -set(REPLAYS_VERSION "0.0.48") +set(REPLAYS_VERSION "0.0.49") set(REPLAYS_URL "https://github.com/OpenRCT2/replays/releases/download/v${REPLAYS_VERSION}/replays.zip") -set(REPLAYS_SHA1 "6ED73C32BD62B9C6DA09FCE3426EC8E30CA59762") +set(REPLAYS_SHA1 "004AE4D38D1326913AF5DE7A90E8AF31DD31BF94") option(FORCE32 "Force 32-bit build. It will add `-m32` to compiler flags.") option(WITH_TESTS "Build tests") diff --git a/openrct2.proj b/openrct2.proj index 51fd1c75ac..294fb087f3 100644 --- a/openrct2.proj +++ b/openrct2.proj @@ -48,8 +48,8 @@ 304d13a126c15bf2c86ff13b81a2f2cc1856ac8d https://github.com/OpenRCT2/objects/releases/download/v1.0.21/objects.zip c38af45d51a6e440386180feacf76c64720b6ac5 - https://github.com/OpenRCT2/replays/releases/download/v0.0.48/replays.zip - 6ED73C32BD62B9C6DA09FCE3426EC8E30CA59762 + https://github.com/OpenRCT2/replays/releases/download/v0.0.49/replays.zip + 004AE4D38D1326913AF5DE7A90E8AF31DD31BF94