From b896f0768740889a69f3184dd3b98a93d2212dd0 Mon Sep 17 00:00:00 2001 From: duncanspumpkin Date: Sun, 9 Jun 2019 16:54:12 +0100 Subject: [PATCH 1/4] Add PeepPickupAction Move Guest and Staff pickup to the new game action. Rework the game action so that only one game action is required for the two game commands. Remove the final game command with a callback. --- src/openrct2-ui/windows/Guest.cpp | 35 +++- src/openrct2-ui/windows/Staff.cpp | 37 +++- src/openrct2/Game.cpp | 8 +- src/openrct2/Game.h | 26 +-- .../actions/GameActionRegistration.cpp | 2 + src/openrct2/actions/PeepPickupAction.hpp | 189 ++++++++++++++++++ src/openrct2/interface/Window.h | 5 - src/openrct2/network/Network.cpp | 11 +- src/openrct2/peep/Peep.cpp | 93 --------- src/openrct2/peep/Peep.h | 1 - src/openrct2/peep/Staff.cpp | 18 -- src/openrct2/peep/Staff.h | 3 - src/openrct2/windows/_legacy.cpp | 52 ----- 13 files changed, 270 insertions(+), 210 deletions(-) create mode 100644 src/openrct2/actions/PeepPickupAction.hpp diff --git a/src/openrct2-ui/windows/Guest.cpp b/src/openrct2-ui/windows/Guest.cpp index ea051bee58..67f9c4997b 100644 --- a/src/openrct2-ui/windows/Guest.cpp +++ b/src/openrct2-ui/windows/Guest.cpp @@ -14,6 +14,7 @@ #include #include #include +#include #include #include #include @@ -692,14 +693,25 @@ void window_guest_overview_mouse_up(rct_window* w, rct_widgetindex widgetIndex) window_guest_set_page(w, widgetIndex - WIDX_TAB_1); break; case WIDX_PICKUP: + { if (!peep_can_be_picked_up(peep)) { return; } w->picked_peep_old_x = peep->x; - game_command_callback = game_command_callback_pickup_guest; - game_do_command(w->number, GAME_COMMAND_FLAG_APPLY, 0, 0, GAME_COMMAND_PICKUP_GUEST, 0, 0); - break; + PeepPickupAction pickupAction{ PeepPickupType::Pickup, w->number, {}, network_get_current_player_id() }; + pickupAction.SetCallback([peepnum = w->number](const GameAction* ga, const GameActionResult* result) { + if (result->Error != GA_ERROR::OK) + return; + rct_window* wind = window_find_by_number(WC_PEEP, peepnum); + if (wind) + { + tool_set(wind, WC_PEEP__WIDX_PICKUP, TOOL_PICKER); + } + }); + GameActions::Execute(&pickupAction); + } + break; case WIDX_RENAME: window_text_input_open( w, widgetIndex, STR_GUEST_RENAME_TITLE, STR_GUEST_RENAME_PROMPT, peep->name_string_idx, peep->id, 32); @@ -1275,8 +1287,16 @@ void window_guest_overview_tool_down(rct_window* w, rct_widgetindex widgetIndex, if (dest_x == LOCATION_NULL) return; - game_command_callback = game_command_callback_pickup_guest; - game_do_command(w->number, GAME_COMMAND_FLAG_APPLY, 2, tileElement->base_height, GAME_COMMAND_PICKUP_GUEST, dest_x, dest_y); + PeepPickupAction pickupAction{ + PeepPickupType::Place, w->number, { dest_x, dest_y, tileElement->base_height }, network_get_current_player_id() + }; + pickupAction.SetCallback([](const GameAction* ga, const GameActionResult* result) { + if (result->Error != GA_ERROR::OK) + return; + tool_cancel(); + gPickupPeepImage = UINT32_MAX; + }); + GameActions::Execute(&pickupAction); } /** @@ -1288,7 +1308,10 @@ void window_guest_overview_tool_abort(rct_window* w, rct_widgetindex widgetIndex if (widgetIndex != WIDX_PICKUP) return; - game_do_command(w->number, GAME_COMMAND_FLAG_APPLY, 1, 0, GAME_COMMAND_PICKUP_GUEST, w->picked_peep_old_x, 0); + PeepPickupAction pickupAction{ + PeepPickupType::Cancel, w->number, { w->picked_peep_old_x, 0, 0 }, network_get_current_player_id() + }; + GameActions::Execute(&pickupAction); } /** diff --git a/src/openrct2-ui/windows/Staff.cpp b/src/openrct2-ui/windows/Staff.cpp index a6e47a306c..cd11b31c85 100644 --- a/src/openrct2-ui/windows/Staff.cpp +++ b/src/openrct2-ui/windows/Staff.cpp @@ -16,6 +16,7 @@ #include #include #include +#include #include #include #include @@ -462,13 +463,19 @@ void window_staff_overview_mouseup(rct_window* w, rct_widgetindex widgetIndex) break; case WIDX_PICKUP: { - // this is called in callback when hiring staff, setting nestlevel to 0 so that command is sent separately - int32_t oldNestLevel = gGameCommandNestLevel; - gGameCommandNestLevel = 0; - game_command_callback = game_command_callback_pickup_staff; w->picked_peep_old_x = peep->x; - game_do_command(w->number, GAME_COMMAND_FLAG_APPLY, 0, 0, GAME_COMMAND_PICKUP_STAFF, 0, 0); - gGameCommandNestLevel = oldNestLevel; + + PeepPickupAction pickupAction{ PeepPickupType::Pickup, w->number, {}, network_get_current_player_id() }; + pickupAction.SetCallback([peepnum = w->number](const GameAction* ga, const GameActionResult* result) { + if (result->Error != GA_ERROR::OK) + return; + rct_window* wind = window_find_by_number(WC_PEEP, peepnum); + if (wind) + { + tool_set(wind, WC_STAFF__WIDX_PICKUP, TOOL_PICKER); + } + }); + GameActions::Execute(&pickupAction); } break; case WIDX_FIRE: @@ -1198,9 +1205,16 @@ void window_staff_overview_tool_down(rct_window* w, rct_widgetindex widgetIndex, if (dest_x == LOCATION_NULL) return; - game_command_callback = game_command_callback_pickup_staff; - game_do_command( - w->number, GAME_COMMAND_FLAG_APPLY, 2, tileElement->base_height, GAME_COMMAND_PICKUP_STAFF, dest_x, dest_y); + PeepPickupAction pickupAction{ + PeepPickupType::Place, w->number, { dest_x, dest_y, tileElement->base_height }, network_get_current_player_id() + }; + pickupAction.SetCallback([](const GameAction* ga, const GameActionResult* result) { + if (result->Error != GA_ERROR::OK) + return; + tool_cancel(); + gPickupPeepImage = UINT32_MAX; + }); + GameActions::Execute(&pickupAction); } else if (widgetIndex == WIDX_PATROL) { @@ -1285,7 +1299,10 @@ void window_staff_overview_tool_abort(rct_window* w, rct_widgetindex widgetIndex { if (widgetIndex == WIDX_PICKUP) { - game_do_command(w->number, GAME_COMMAND_FLAG_APPLY, 1, 0, GAME_COMMAND_PICKUP_STAFF, w->picked_peep_old_x, 0); + PeepPickupAction pickupAction{ + PeepPickupType::Cancel, w->number, { w->picked_peep_old_x, 0, 0 }, network_get_current_player_id() + }; + GameActions::Execute(&pickupAction); } else if (widgetIndex == WIDX_PATROL) { diff --git a/src/openrct2/Game.cpp b/src/openrct2/Game.cpp index 90f388f0f5..235a88968a 100644 --- a/src/openrct2/Game.cpp +++ b/src/openrct2/Game.cpp @@ -96,8 +96,8 @@ static GAME_COMMAND_CALLBACK_POINTER * const game_command_callback_table[] = { nullptr, nullptr, nullptr, - game_command_callback_pickup_guest, - game_command_callback_pickup_staff + nullptr, + nullptr }; // clang-format on int32_t game_command_playerid = -1; @@ -1222,8 +1222,8 @@ GAME_COMMAND_POINTER* new_game_command_table[GAME_COMMAND_COUNT] = { nullptr, nullptr, nullptr, - game_command_pickup_guest, - game_command_pickup_staff, + nullptr, + nullptr, nullptr, nullptr, nullptr, diff --git a/src/openrct2/Game.h b/src/openrct2/Game.h index d29f0f06b3..12e733ad51 100644 --- a/src/openrct2/Game.h +++ b/src/openrct2/Game.h @@ -85,19 +85,19 @@ enum GAME_COMMAND GAME_COMMAND_MODIFY_GROUPS, // GA GAME_COMMAND_KICK_PLAYER, // GA GAME_COMMAND_CHEAT, // GA - GAME_COMMAND_PICKUP_GUEST, - GAME_COMMAND_PICKUP_STAFF, - GAME_COMMAND_BALLOON_PRESS, // GA - GAME_COMMAND_MODIFY_TILE, // GA - GAME_COMMAND_EDIT_SCENARIO_OPTIONS, // GA - GAME_COMMAND_PLACE_PEEP_SPAWN, // GA, TODO: refactor to separate array for just game actions - GAME_COMMAND_SET_CLIMATE, // GA - GAME_COMMAND_SET_COLOUR_SCHEME, // GA - GAME_COMMAND_SET_STAFF_COSTUME, // GA - GAME_COMMAND_PLACE_FOOTPATH_SCENERY, // GA - GAME_COMMAND_REMOVE_FOOTPATH_SCENERY, // GA - GAME_COMMAND_GUEST_SET_FLAGS, // GA - GAME_COMMAND_SET_DATE, // GA + GAME_COMMAND_PICKUP_GUEST, // GA + GAME_COMMAND_PICKUP_STAFF, // GA + GAME_COMMAND_BALLOON_PRESS, // GA + GAME_COMMAND_MODIFY_TILE, // GA + GAME_COMMAND_EDIT_SCENARIO_OPTIONS, // GA + GAME_COMMAND_PLACE_PEEP_SPAWN, // GA, TODO: refactor to separate array for just game actions + GAME_COMMAND_SET_CLIMATE, // GA + GAME_COMMAND_SET_COLOUR_SCHEME, // GA + GAME_COMMAND_SET_STAFF_COSTUME, // GA + GAME_COMMAND_PLACE_FOOTPATH_SCENERY, // GA + GAME_COMMAND_REMOVE_FOOTPATH_SCENERY, // GA + GAME_COMMAND_GUEST_SET_FLAGS, // GA + GAME_COMMAND_SET_DATE, // GA GAME_COMMAND_COUNT, }; diff --git a/src/openrct2/actions/GameActionRegistration.cpp b/src/openrct2/actions/GameActionRegistration.cpp index 25f0601b9a..2caa6cdff5 100644 --- a/src/openrct2/actions/GameActionRegistration.cpp +++ b/src/openrct2/actions/GameActionRegistration.cpp @@ -43,6 +43,7 @@ #include "ParkSetParameterAction.hpp" #include "ParkSetResearchFundingAction.hpp" #include "PauseToggleAction.hpp" +#include "PeepPickupAction.hpp" #include "PlaceParkEntranceAction.hpp" #include "PlacePeepSpawnAction.hpp" #include "PlayerKickAction.hpp" @@ -110,6 +111,7 @@ namespace GameActions Register(); Register(); Register(); + Register(); Register(); Register(); Register(); diff --git a/src/openrct2/actions/PeepPickupAction.hpp b/src/openrct2/actions/PeepPickupAction.hpp new file mode 100644 index 0000000000..68ff20dd6e --- /dev/null +++ b/src/openrct2/actions/PeepPickupAction.hpp @@ -0,0 +1,189 @@ +/***************************************************************************** + * Copyright (c) 2014-2019 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 "../Input.h" +#include "../network/network.h" +#include "../world/Sprite.h" +#include "GameAction.h" + +enum class PeepPickupType : uint8_t +{ + Pickup, + Cancel, + Place, + Count +}; + +DEFINE_GAME_ACTION(PeepPickupAction, GAME_COMMAND_PICKUP_GUEST, GameActionResult) +{ +private: + uint8_t _type = static_cast(PeepPickupType::Count); + uint32_t _spriteId = SPRITE_INDEX_NULL; + CoordsXYZ _loc; + NetworkPlayerId_t _owner = { -1 }; + +public: + PeepPickupAction() = default; + PeepPickupAction(PeepPickupType type, uint32_t spriteId, CoordsXYZ loc, NetworkPlayerId_t owner) + : _type(static_cast(type)) + , _spriteId(spriteId) + , _loc(loc) + , _owner(owner) + { + } + + uint16_t GetActionFlags() const override + { + return GameAction::GetActionFlags() | GA_FLAGS::ALLOW_WHILE_PAUSED; + } + + void Serialise(DataSerialiser & stream) override + { + GameAction::Serialise(stream); + + stream << DS_TAG(_type) << DS_TAG(_spriteId) << DS_TAG(_loc) << DS_TAG(_owner); + } + + GameActionResult::Ptr Query() const override + { + if (_spriteId >= MAX_SPRITES || _spriteId == SPRITE_INDEX_NULL) + { + log_error("Failed to pick up peep for sprite %d", _spriteId); + return MakeResult(GA_ERROR::INVALID_PARAMETERS, STR_ERR_CANT_PLACE_PERSON_HERE); + } + + Peep* const peep = GET_PEEP(_spriteId); + if (!peep || peep->sprite_identifier != SPRITE_IDENTIFIER_PEEP) + { + log_error("Failed to pick up peep for sprite %d", _spriteId); + return MakeResult(GA_ERROR::INVALID_PARAMETERS, STR_ERR_CANT_PLACE_PERSON_HERE); + } + + auto res = MakeResult(); + + switch (static_cast(_type)) + { + case PeepPickupType::Pickup: + { + res->Position = { peep->x, peep->y, peep->z }; + if (!peep_can_be_picked_up(peep)) + { + return MakeResult(GA_ERROR::DISALLOWED, STR_ERR_CANT_PLACE_PERSON_HERE); + } + Peep* existing = network_get_pickup_peep(_owner); + if (existing) + { + // already picking up a peep + PeepPickupAction existingPickupAction{ + PeepPickupType::Cancel, existing->sprite_index, { network_get_pickup_peep_old_x(_owner), 0, 0 }, _owner + }; + auto result = GameActions::QueryNested(&existingPickupAction); + + if (existing == peep) + { + return result; + } + } + } + break; + case PeepPickupType::Cancel: + res->Position = { peep->x, peep->y, peep->z }; + break; + case PeepPickupType::Place: + res->Position = _loc; + if (network_get_pickup_peep(_owner) != peep) + { + return MakeResult(GA_ERROR::UNKNOWN, STR_ERR_CANT_PLACE_PERSON_HERE); + } + + if (!peep->Place({ _loc.x / 32, _loc.y / 32, _loc.z }, false)) + { + return MakeResult(GA_ERROR::UNKNOWN, STR_ERR_CANT_PLACE_PERSON_HERE, gGameCommandErrorText); + } + break; + default: + log_error("Invalid pickup type: %u", _type); + return MakeResult(GA_ERROR::INVALID_PARAMETERS, STR_ERR_CANT_PLACE_PERSON_HERE); + break; + } + return res; + } + + GameActionResult::Ptr Execute() const override + { + Peep* const peep = GET_PEEP(_spriteId); + if (!peep || peep->sprite_identifier != SPRITE_IDENTIFIER_PEEP) + { + log_error("Failed to pick up peep for sprite %d", _spriteId); + return MakeResult(GA_ERROR::INVALID_PARAMETERS, STR_ERR_CANT_PLACE_PERSON_HERE); + } + + auto res = MakeResult(); + + switch (static_cast(_type)) + { + case PeepPickupType::Pickup: + { + res->Position = { peep->x, peep->y, peep->z }; + + Peep* existing = network_get_pickup_peep(_owner); + if (existing) + { + // already picking up a peep + PeepPickupAction existingPickupAction{ + PeepPickupType::Cancel, existing->sprite_index, { network_get_pickup_peep_old_x(_owner), 0, 0 }, _owner + }; + auto result = GameActions::ExecuteNested(&existingPickupAction); + + if (existing == peep) + { + return result; + } + if (_owner == network_get_current_player_id()) + { + // prevent tool_cancel() + input_set_flag(INPUT_FLAG_TOOL_ACTIVE, false); + } + } + + network_set_pickup_peep(_owner, peep); + network_set_pickup_peep_old_x(_owner, peep->x); + peep->Pickup(); + } + break; + case PeepPickupType::Cancel: + { + res->Position = { peep->x, peep->y, peep->z }; + + Peep* const pickedUpPeep = network_get_pickup_peep(_owner); + if (pickedUpPeep) + { + pickedUpPeep->PickupAbort(_loc.x); + } + + network_set_pickup_peep(_owner, nullptr); + } + break; + case PeepPickupType::Place: + res->Position = _loc; + if (!peep->Place({ _loc.x / 32, _loc.y / 32, _loc.z }, true)) + { + return MakeResult(GA_ERROR::UNKNOWN, STR_ERR_CANT_PLACE_PERSON_HERE, gGameCommandErrorText); + } + break; + default: + log_error("Invalid pickup type: %u", _type); + return MakeResult(GA_ERROR::INVALID_PARAMETERS, STR_ERR_CANT_PLACE_PERSON_HERE); + break; + } + return res; + } +}; diff --git a/src/openrct2/interface/Window.h b/src/openrct2/interface/Window.h index 780b42e312..7c6384dd21 100644 --- a/src/openrct2/interface/Window.h +++ b/src/openrct2/interface/Window.h @@ -677,11 +677,6 @@ void window_align_tabs(rct_window* w, rct_widgetindex start_tab_id, rct_widgetin void window_staff_list_init_vars(); -void game_command_callback_pickup_guest( - int32_t eax, int32_t ebx, int32_t ecx, int32_t edx, int32_t esi, int32_t edi, int32_t ebp); -void game_command_callback_pickup_staff( - int32_t eax, int32_t ebx, int32_t ecx, int32_t edx, int32_t esi, int32_t edi, int32_t ebp); - void window_event_close_call(rct_window* w); void window_event_mouse_up_call(rct_window* w, rct_widgetindex widgetIndex); void window_event_resize_call(rct_window* w); diff --git a/src/openrct2/network/Network.cpp b/src/openrct2/network/Network.cpp index 20d496191e..351aa3a559 100644 --- a/src/openrct2/network/Network.cpp +++ b/src/openrct2/network/Network.cpp @@ -16,6 +16,7 @@ #include "../PlatformEnvironment.h" #include "../actions/LoadOrQuitAction.hpp" #include "../actions/NetworkModifyGroupAction.hpp" +#include "../actions/PeepPickupAction.hpp" #include "../core/Guard.hpp" #include "../platform/platform.h" #include "../ui/UiContext.h" @@ -2246,11 +2247,11 @@ void Network::ServerClientDisconnected(std::unique_ptr& conne Peep* pickup_peep = network_get_pickup_peep(connection_player->Id); if (pickup_peep) { - game_command_playerid = connection_player->Id; - game_do_command( - pickup_peep->sprite_index, GAME_COMMAND_FLAG_APPLY, 1, 0, - pickup_peep->type == PEEP_TYPE_GUEST ? GAME_COMMAND_PICKUP_GUEST : GAME_COMMAND_PICKUP_STAFF, - network_get_pickup_peep_old_x(connection_player->Id), 0); + PeepPickupAction pickupAction{ PeepPickupType::Cancel, + pickup_peep->sprite_index, + { network_get_pickup_peep_old_x(connection_player->Id), 0, 0 }, + network_get_current_player_id() }; + auto res = GameActions::Execute(&pickupAction); } gNetwork.Server_Send_EVENT_PLAYER_DISCONNECTED( (char*)connection_player->Name.c_str(), connection->GetLastDisconnectReason()); diff --git a/src/openrct2/peep/Peep.cpp b/src/openrct2/peep/Peep.cpp index 85c3d4284a..7caed0ca57 100644 --- a/src/openrct2/peep/Peep.cpp +++ b/src/openrct2/peep/Peep.cpp @@ -853,99 +853,6 @@ bool Peep::Place(TileCoordsXYZ location, bool apply) return true; } -bool peep_pickup_command(uint32_t peepnum, int32_t x, int32_t y, int32_t z, int32_t action, bool apply) -{ - if (peepnum >= MAX_SPRITES) - { - log_error("Failed to pick up peep for sprite %d", peepnum); - return false; - } - - Peep* const peep = GET_PEEP(peepnum); - if (!peep || peep->sprite_identifier != SPRITE_IDENTIFIER_PEEP) - { - return false; - } - - switch (action) - { - case 0: // pickup - { - if (!peep_can_be_picked_up(peep)) - { - return false; - } - Peep* existing = network_get_pickup_peep(game_command_playerid); - if (existing) - { - // already picking up a peep - bool result = peep_pickup_command( - existing->sprite_index, network_get_pickup_peep_old_x(game_command_playerid), 0, 0, 1, apply); - if (existing == peep) - { - return result; - } - if (game_command_playerid == network_get_current_player_id()) - { - // prevent tool_cancel() - input_set_flag(INPUT_FLAG_TOOL_ACTIVE, false); - } - } - - if (apply) - { - network_set_pickup_peep(game_command_playerid, peep); - network_set_pickup_peep_old_x(game_command_playerid, peep->x); - peep->Pickup(); - } - } - break; - case 1: // cancel - if (apply) - { - // TODO: Verify if this is really needed or that we can use `peep` instead - Peep* const pickedUpPeep = network_get_pickup_peep(game_command_playerid); - if (pickedUpPeep) - { - pickedUpPeep->PickupAbort(x); - } - - network_set_pickup_peep(game_command_playerid, nullptr); - } - break; - case 2: // place - if (network_get_pickup_peep(game_command_playerid) != peep) - { - return false; - } - - if (!peep->Place({ x / 32, y / 32, z }, apply)) - { - return false; - } - break; - } - return true; -} - -void game_command_pickup_guest( - int32_t* eax, int32_t* ebx, int32_t* ecx, int32_t* edx, [[maybe_unused]] int32_t* esi, int32_t* edi, int32_t* ebp) -{ - int32_t peepnum = *eax; - int32_t x = *edi; - int32_t y = *ebp; - int32_t z = *edx; - int32_t action = *ecx; - if (peep_pickup_command(peepnum, x, y, z, action, *ebx & GAME_COMMAND_FLAG_APPLY)) - { - *ebx = 0; - } - else - { - *ebx = MONEY32_UNDEFINED; - } -} - /** * * rct2: 0x0069A535 diff --git a/src/openrct2/peep/Peep.h b/src/openrct2/peep/Peep.h index 56c8336cba..5ce95b4dde 100644 --- a/src/openrct2/peep/Peep.h +++ b/src/openrct2/peep/Peep.h @@ -953,7 +953,6 @@ int32_t get_peep_face_sprite_small(Peep* peep); int32_t get_peep_face_sprite_large(Peep* peep); int32_t peep_check_easteregg_name(int32_t index, Peep* peep); int32_t peep_get_easteregg_name_id(Peep* peep); -bool peep_pickup_command(uint32_t peepnum, int32_t x, int32_t y, int32_t z, int32_t action, bool apply); void game_command_pickup_guest( int32_t* eax, int32_t* ebx, int32_t* ecx, int32_t* edx, int32_t* esi, int32_t* edi, int32_t* ebp); void peep_sprite_remove(Peep* peep); diff --git a/src/openrct2/peep/Staff.cpp b/src/openrct2/peep/Staff.cpp index daaccae5dc..ae167fd612 100644 --- a/src/openrct2/peep/Staff.cpp +++ b/src/openrct2/peep/Staff.cpp @@ -1089,24 +1089,6 @@ int32_t staff_path_finding(Staff* peep) } } -void game_command_pickup_staff( - int32_t* eax, int32_t* ebx, int32_t* ecx, int32_t* edx, [[maybe_unused]] int32_t* esi, int32_t* edi, int32_t* ebp) -{ - int32_t peepnum = *eax; - int32_t x = *edi; - int32_t y = *ebp; - int32_t z = *edx; - int32_t action = *ecx; - if (peep_pickup_command(peepnum, x, y, z, action, *ebx & GAME_COMMAND_FLAG_APPLY)) - { - *ebx = 0; - } - else - { - *ebx = MONEY32_UNDEFINED; - } -} - colour_t staff_get_colour(uint8_t staffType) { switch (staffType) diff --git a/src/openrct2/peep/Staff.h b/src/openrct2/peep/Staff.h index 05c214797d..775ec75e1d 100644 --- a/src/openrct2/peep/Staff.h +++ b/src/openrct2/peep/Staff.h @@ -71,9 +71,6 @@ extern colour_t gStaffHandymanColour; extern colour_t gStaffMechanicColour; extern colour_t gStaffSecurityColour; -void game_command_pickup_staff( - int32_t* eax, int32_t* ebx, int32_t* ecx, int32_t* edx, int32_t* esi, int32_t* edi, int32_t* ebp); - void staff_reset_modes(); void staff_set_name(uint16_t spriteIndex, const char* name); bool staff_hire_new_member(STAFF_TYPE staffType, ENTERTAINER_COSTUME entertainerType); diff --git a/src/openrct2/windows/_legacy.cpp b/src/openrct2/windows/_legacy.cpp index 1576eee659..c4ed2920ff 100644 --- a/src/openrct2/windows/_legacy.cpp +++ b/src/openrct2/windows/_legacy.cpp @@ -29,58 +29,6 @@ bool gDisableErrorWindowSound = false; -void game_command_callback_pickup_guest( - int32_t eax, int32_t ebx, int32_t ecx, [[maybe_unused]] int32_t edx, [[maybe_unused]] int32_t esi, - [[maybe_unused]] int32_t edi, [[maybe_unused]] int32_t ebp) -{ - switch (ecx) - { - case 0: - { - int32_t peepnum = eax; - rct_window* w = window_find_by_number(WC_PEEP, peepnum); - if (w) - { - tool_set(w, WC_PEEP__WIDX_PICKUP, TOOL_PICKER); - } - } - break; - case 2: - if (ebx == 0) - { - tool_cancel(); - gPickupPeepImage = UINT32_MAX; - } - break; - } -} - -void game_command_callback_pickup_staff( - int32_t eax, int32_t ebx, int32_t ecx, [[maybe_unused]] int32_t edx, [[maybe_unused]] int32_t esi, - [[maybe_unused]] int32_t edi, [[maybe_unused]] int32_t ebp) -{ - switch (ecx) - { - case 0: - { - int32_t peepnum = eax; - rct_window* w = window_find_by_number(WC_PEEP, peepnum); - if (w) - { - tool_set(w, WC_STAFF__WIDX_PICKUP, TOOL_PICKER); - } - } - break; - case 2: - if (ebx == 0) - { - tool_cancel(); - gPickupPeepImage = UINT32_MAX; - } - break; - } -} - uint64_t _enabledRidePieces; uint8_t _rideConstructionState2; From 6bd09f6b98ed5d647544ef42c8153ce3f12a466e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=CE=B6eh=20Matt?= Date: Thu, 20 Jun 2019 19:58:56 +0200 Subject: [PATCH 2/4] Cancel concurrent peep pickups on placement (#29) --- src/openrct2/actions/PeepPickupAction.hpp | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/src/openrct2/actions/PeepPickupAction.hpp b/src/openrct2/actions/PeepPickupAction.hpp index 68ff20dd6e..dcabc0784b 100644 --- a/src/openrct2/actions/PeepPickupAction.hpp +++ b/src/openrct2/actions/PeepPickupAction.hpp @@ -178,6 +178,7 @@ public: { return MakeResult(GA_ERROR::UNKNOWN, STR_ERR_CANT_PLACE_PERSON_HERE, gGameCommandErrorText); } + CancelConcurrentPickups(peep); break; default: log_error("Invalid pickup type: %u", _type); @@ -186,4 +187,26 @@ public: } return res; } + +private: + void CancelConcurrentPickups(Peep * pickedPeep) const + { + // This part is only relevant in multiplayer games. + if (network_get_mode() == NETWORK_MODE_NONE) + return; + + // Not relevant for owner, owner gets to place it normally. + NetworkPlayerId_t currentPlayerId = network_get_current_player_id(); + if (currentPlayerId == _owner) + return; + + Peep* peep = network_get_pickup_peep(network_get_current_player_id()); + if (peep != pickedPeep) + return; + + // By assigning the peep to null before calling tool_cancel we can avoid + // resetting the peep to the initial position. + network_set_pickup_peep(currentPlayerId, nullptr); + tool_cancel(); + } }; From 27e958fe2b059d7f28da63135df5d4efefdbe5eb Mon Sep 17 00:00:00 2001 From: duncanspumpkin Date: Thu, 20 Jun 2019 19:23:31 +0100 Subject: [PATCH 3/4] Increment network version --- src/openrct2/network/Network.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/openrct2/network/Network.cpp b/src/openrct2/network/Network.cpp index 351aa3a559..5de2b63865 100644 --- a/src/openrct2/network/Network.cpp +++ b/src/openrct2/network/Network.cpp @@ -34,7 +34,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 "44" +#define NETWORK_STREAM_VERSION "45" #define NETWORK_STREAM_ID OPENRCT2_VERSION "-" NETWORK_STREAM_VERSION static Peep* _pickup_peep = nullptr; From 2de9430bd3d5676834c0b758110f36c11dd6538b Mon Sep 17 00:00:00 2001 From: duncanspumpkin Date: Thu, 20 Jun 2019 20:13:23 +0100 Subject: [PATCH 4/4] Remove incorrect code that resets picked peep The game command owner is never set for game actions so this would be incorrect --- src/openrct2/peep/Peep.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/openrct2/peep/Peep.cpp b/src/openrct2/peep/Peep.cpp index 7caed0ca57..09f09e69cb 100644 --- a/src/openrct2/peep/Peep.cpp +++ b/src/openrct2/peep/Peep.cpp @@ -846,8 +846,6 @@ bool Peep::Place(TileCoordsXYZ location, bool apply) happiness_target = std::max(happiness_target - 10, 0); UpdateCurrentActionSpriteType(); } - - network_set_pickup_peep(game_command_playerid, nullptr); } return true;