From d74efb23fe723863a60474b73402ee0324d46b93 Mon Sep 17 00:00:00 2001 From: zsilencer Date: Mon, 17 Oct 2016 14:26:19 -0600 Subject: [PATCH 1/6] Add picking up peeps/staff as game command --- src/game.c | 6 +- src/game.h | 4 +- src/interface/window.h | 3 + src/network/NetworkAction.cpp | 6 +- src/network/NetworkPlayer.h | 3 + src/network/network.cpp | 32 +++++++ src/network/network.h | 4 + src/peep/peep.c | 152 ++++++++++++++++++++++++++++++++++ src/peep/peep.h | 5 ++ src/peep/staff.c | 15 ++++ src/peep/staff.h | 1 + src/windows/guest.c | 118 +++++++------------------- src/windows/staff.c | 104 +++++++---------------- 13 files changed, 285 insertions(+), 168 deletions(-) diff --git a/src/game.c b/src/game.c index 3c4d6f3f48..656c687efe 100644 --- a/src/game.c +++ b/src/game.c @@ -83,6 +83,8 @@ GAME_COMMAND_CALLBACK_POINTER* game_command_callback_table[] = { game_command_callback_place_banner, game_command_callback_place_ride_entrance_or_exit, game_command_callback_hire_new_staff_member, + game_command_callback_pickup_guest, + game_command_callback_pickup_staff, }; int game_command_playerid = -1; @@ -1098,7 +1100,7 @@ void game_load_or_quit_no_save_prompt() } } -GAME_COMMAND_POINTER* new_game_command_table[68] = { +GAME_COMMAND_POINTER* new_game_command_table[69] = { game_command_set_ride_appearance, game_command_set_land_height, game_pause_toggle, @@ -1166,4 +1168,6 @@ GAME_COMMAND_POINTER* new_game_command_table[68] = { game_command_modify_groups, game_command_kick_player, game_command_cheat, + game_command_pickup_guest, + game_command_pickup_staff, }; diff --git a/src/game.h b/src/game.h index c8733abe9a..5a3304a9db 100644 --- a/src/game.h +++ b/src/game.h @@ -90,6 +90,8 @@ enum GAME_COMMAND { GAME_COMMAND_MODIFY_GROUPS, GAME_COMMAND_KICK_PLAYER, GAME_COMMAND_CHEAT, + GAME_COMMAND_PICKUP_GUEST, + GAME_COMMAND_PICKUP_STAFF, }; enum { @@ -129,7 +131,7 @@ extern rct_string_id gGameCommandErrorText; extern uint8 gErrorType; extern rct_string_id gErrorStringId; -extern GAME_COMMAND_POINTER* new_game_command_table[68]; +extern GAME_COMMAND_POINTER* new_game_command_table[69]; #ifndef NO_RCT2 #define gCurrentTicks RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_TICKS, uint32) diff --git a/src/interface/window.h b/src/interface/window.h index c0587b3ef2..bd90a61630 100644 --- a/src/interface/window.h +++ b/src/interface/window.h @@ -734,6 +734,9 @@ void window_map_tooltip_update_visibility(); void window_staff_list_init_vars(); +void game_command_callback_pickup_guest(int eax, int ebx, int ecx, int edx, int esi, int edi, int ebp); +void game_command_callback_pickup_staff(int eax, int ebx, int ecx, int edx, int esi, int edi, int ebp); + void window_event_close_call(rct_window* w); void window_event_mouse_up_call(rct_window* w, int widgetIndex); void window_event_resize_call(rct_window* w); diff --git a/src/network/NetworkAction.cpp b/src/network/NetworkAction.cpp index 5100549073..3c1870fd2a 100644 --- a/src/network/NetworkAction.cpp +++ b/src/network/NetworkAction.cpp @@ -158,7 +158,8 @@ const std::vector NetworkActions::Actions = }, { STR_ACTION_GUEST, "PERMISSION_GUEST", { - GAME_COMMAND_SET_GUEST_NAME + GAME_COMMAND_SET_GUEST_NAME, + GAME_COMMAND_PICKUP_GUEST } }, { STR_ACTION_STAFF, "PERMISSION_STAFF", @@ -168,7 +169,8 @@ const std::vector NetworkActions::Actions = GAME_COMMAND_FIRE_STAFF_MEMBER, GAME_COMMAND_SET_STAFF_ORDER, GAME_COMMAND_SET_STAFF_COLOUR, - GAME_COMMAND_SET_STAFF_NAME + GAME_COMMAND_SET_STAFF_NAME, + GAME_COMMAND_PICKUP_STAFF } }, { STR_ACTION_PARK_PROPERTIES, "PERMISSION_PARK_PROPERTIES", diff --git a/src/network/NetworkPlayer.h b/src/network/NetworkPlayer.h index bb4dba194f..05b821ad57 100644 --- a/src/network/NetworkPlayer.h +++ b/src/network/NetworkPlayer.h @@ -21,6 +21,7 @@ extern "C" { + #include "../peep/peep.h" #include "../world/map.h" } @@ -39,6 +40,8 @@ public: int last_action = -999; uint32 last_action_time = 0; rct_xyz16 last_action_coord = { 0 }; + rct_peep* pickup_peep = 0; + int pickup_peep_old_x = SPRITE_LOCATION_NULL; std::string keyhash; NetworkPlayer() = default; diff --git a/src/network/network.cpp b/src/network/network.cpp index 26a80e51a1..35884e7ab2 100644 --- a/src/network/network.cpp +++ b/src/network/network.cpp @@ -33,6 +33,9 @@ extern "C" { extern "C" { } +rct_peep* _pickup_peep = 0; +int _pickup_peep_old_x = SPRITE_LOCATION_NULL; + #ifndef DISABLE_NETWORK #include @@ -1222,6 +1225,11 @@ void Network::RemoveClient(std::unique_ptr& connection) } chat_history_add(text); + rct_peep* pickup_peep = network_get_pickup_peep(connection_player->id); + if(pickup_peep) { + game_command_playerid = connection_player->id; + game_do_command(0, GAME_COMMAND_FLAG_APPLY, 1, 0, pickup_peep->type == PEEP_TYPE_GUEST ? GAME_COMMAND_PICKUP_GUEST : GAME_COMMAND_PICKUP_STAFF, 0, 0); + } gNetwork.Server_Send_EVENT_PLAYER_DISCONNECTED((char*)connection_player->name.c_str(), connection->GetLastDisconnectReason()); } player_list.erase(std::remove_if(player_list.begin(), player_list.end(), [connection_player](std::unique_ptr& player){ @@ -2280,6 +2288,26 @@ int network_can_perform_command(unsigned int groupindex, unsigned int index) return gNetwork.group_list[groupindex]->CanPerformCommand(index); } +void network_set_pickup_peep(uint8 playerid, rct_peep* peep) +{ + gNetwork.GetMode() == NETWORK_MODE_NONE ? _pickup_peep = peep : gNetwork.GetPlayerByID(playerid)->pickup_peep = peep; +} + +rct_peep* network_get_pickup_peep(uint8 playerid) +{ + return gNetwork.GetMode() == NETWORK_MODE_NONE ? _pickup_peep : gNetwork.GetPlayerByID(playerid)->pickup_peep; +} + +void network_set_pickup_peep_old_x(uint8 playerid, int x) +{ + gNetwork.GetMode() == NETWORK_MODE_NONE ? _pickup_peep_old_x = x : gNetwork.GetPlayerByID(playerid)->pickup_peep_old_x = x; +} + +int network_get_pickup_peep_old_x(uint8 playerid) +{ + return gNetwork.GetMode() == NETWORK_MODE_NONE ? _pickup_peep_old_x : gNetwork.GetPlayerByID(playerid)->pickup_peep_old_x; +} + int network_get_current_player_group_index() { return network_get_group_index(gNetwork.GetPlayerByID(gNetwork.GetPlayerID())->group); @@ -2417,6 +2445,10 @@ int network_get_num_actions() { return 0; } rct_string_id network_get_action_name_string_id(unsigned int index) { return -1; } int network_can_perform_action(unsigned int groupindex, unsigned int index) { return 0; } int network_can_perform_command(unsigned int groupindex, unsigned int index) { return 0; } +void network_set_pickup_peep(uint8 playerid, rct_peep* peep) { _pickup_peep = peep; } +rct_peep* network_get_pickup_peep(uint8 playerid) { return _pickup_peep; } +void network_set_pickup_peep_old_x(uint8 playerid, int x) { _pickup_peep_old_x = x; } +int network_get_pickup_peep_old_x(uint8 playerid) { return _pickup_peep_old_x; } void network_send_chat(const char* text) {} void network_send_password(const char* password) {} void network_close() {} diff --git a/src/network/network.h b/src/network/network.h index da25dfe391..4e5bbc325c 100644 --- a/src/network/network.h +++ b/src/network/network.h @@ -292,6 +292,10 @@ int network_get_num_actions(); rct_string_id network_get_action_name_string_id(unsigned int index); int network_can_perform_action(unsigned int groupindex, unsigned int index); int network_can_perform_command(unsigned int groupindex, unsigned int index); +void network_set_pickup_peep(uint8 playerid, rct_peep* peep); +rct_peep* network_get_pickup_peep(uint8 playerid); +void network_set_pickup_peep_old_x(uint8 playerid, int x); +int network_get_pickup_peep_old_x(uint8 playerid); void network_send_map(); void network_send_chat(const char* text); diff --git a/src/peep/peep.c b/src/peep/peep.c index 8cc68b13b6..6064617414 100644 --- a/src/peep/peep.c +++ b/src/peep/peep.c @@ -25,6 +25,7 @@ #include "../management/marketing.h" #include "../management/news_item.h" #include "../openrct2.h" +#include "../network/network.h" #include "../ride/ride.h" #include "../ride/ride_data.h" #include "../ride/track.h" @@ -1842,6 +1843,157 @@ void peep_window_state_update(rct_peep* peep) } } +void peep_pickup(rct_peep* peep) +{ + remove_peep_from_ride(peep); + invalidate_sprite_2((rct_sprite*)peep); + + sprite_move(SPRITE_LOCATION_NULL, peep->y, peep->z, (rct_sprite*)peep); + peep_decrement_num_riders(peep); + peep->state = PEEP_STATE_PICKED; + peep->sub_state = 0; + peep_window_state_update(peep); +} + +void peep_pickup_abort(rct_peep* peep, int old_x) +{ + if (!peep) + return; + + if (peep->state != PEEP_STATE_PICKED) + return; + + sprite_move(old_x, peep->y, peep->z + 8, (rct_sprite*)peep); + invalidate_sprite_2((rct_sprite*)peep); + + if (peep->x != (sint16)SPRITE_LOCATION_NULL){ + peep_decrement_num_riders(peep); + peep->state = 0; + peep_window_state_update(peep); + peep->action = 0xFF; + peep->special_sprite = 0; + peep->action_sprite_image_offset = 0; + peep->action_sprite_type = 0; + peep->var_C4 = 0; + } + + gPickupPeepImage = UINT32_MAX; +} + +bool peep_pickup_place(rct_peep* peep, int x, int y, bool apply) +{ + if (!peep) + return false; + + int dest_x, dest_y; + rct_map_element *mapElement; + footpath_get_coordinates_from_pos(x, y + 16, &dest_x, &dest_y, NULL, &mapElement); + + if (dest_x == (sint16)SPRITE_LOCATION_NULL) { + gGameCommandErrorTitle = STR_ERR_CANT_PLACE_PERSON_HERE; + return false; + } + + // Set the coordinate of destination to be exactly + // in the middle of a tile. + dest_x += 16; + dest_y += 16; + // Set the tile coordinate to top left of tile + int tile_y = dest_y & 0xFFE0; + int tile_x = dest_x & 0xFFE0; + + int dest_z = mapElement->base_height * 8 + 16; + + if (!map_is_location_owned(tile_x, tile_y, dest_z)){ + gGameCommandErrorTitle = STR_ERR_CANT_PLACE_PERSON_HERE; + return false; + } + + if (!map_can_construct_at(tile_x, tile_y, dest_z / 8, (dest_z / 8) + 1, 15)){ + if (gGameCommandErrorText != STR_RAISE_OR_LOWER_LAND_FIRST) { + if (gGameCommandErrorText != STR_FOOTPATH_IN_THE_WAY) { + gGameCommandErrorTitle = STR_ERR_CANT_PLACE_PERSON_HERE; + return false; + } + } + } + + if (apply) { + sprite_move(dest_x, dest_y, dest_z, (rct_sprite*)peep); + invalidate_sprite_2((rct_sprite*)peep); + peep_decrement_num_riders(peep); + peep->state = 0; + peep_window_state_update(peep); + peep->action = 0xFF; + peep->special_sprite = 0; + peep->action_sprite_image_offset = 0; + peep->action_sprite_type = 0; + peep->var_C4 = 0; + openrct2_reset_object_tween_locations(); + + if (peep->type == PEEP_TYPE_GUEST) { + peep->action_sprite_type = 0xFF; + peep->happiness_growth_rate = max(peep->happiness_growth_rate - 10, 0); + sub_693B58(peep); + } + + network_set_pickup_peep(game_command_playerid, 0); + } + + return true; +} + +bool peep_pickup_command(int peepnum, int x, int y, int action, bool apply) +{ + rct_peep* peep; + switch (action) { + case 0: // pickup + peep = GET_PEEP(peepnum); + if (!peep) { + return false; + } + if (!peep_can_be_picked_up(peep)) { + return false; + } + if (network_get_pickup_peep(game_command_playerid)) { + // already picking up a peep + return false; + } + if (apply) { + peep_pickup(peep); + network_set_pickup_peep(game_command_playerid, peep); + network_set_pickup_peep_old_x(game_command_playerid, peep->x); + } + break; + case 1: // cancel + if (apply) { + peep_pickup_abort(network_get_pickup_peep(game_command_playerid), network_get_pickup_peep_old_x(game_command_playerid)); + network_set_pickup_peep(game_command_playerid, 0); + } + break; + case 2: // place + if (!peep_pickup_place(network_get_pickup_peep(game_command_playerid), x, y, apply)) { + return false; + } + break; + } + return true; +} + +void game_command_pickup_guest(int* eax, int* ebx, int* ecx, int* edx, int* esi, int* edi, int* ebp) +{ + int peepnum = *eax; + int x = *edi; + int y = *ebp; + if (peep_pickup_command(peepnum, x, y, *ecx, *ebx & GAME_COMMAND_FLAG_APPLY)) { + *ebx = 0; + } + else + { + *ebx = MONEY32_UNDEFINED; + } +} + /** * * rct2: 0x0069A535 diff --git a/src/peep/peep.h b/src/peep/peep.h index c8f85c5989..027b6287bc 100644 --- a/src/peep/peep.h +++ b/src/peep/peep.h @@ -652,6 +652,11 @@ int peep_get_easteregg_name_id(rct_peep *peep); int peep_is_mechanic(rct_peep *peep); bool peep_has_item(rct_peep *peep, int peepItem); int peep_has_food(rct_peep* peep); +void peep_pickup(rct_peep* peep); +void peep_pickup_abort(rct_peep* peep, int old_x); +bool peep_pickup_place(rct_peep* peep, int x, int y, bool apply); +bool peep_pickup_command(int peepnum, int x, int y, int action, bool apply); +void game_command_pickup_guest(int* eax, int* ebx, int* ecx, int* edx, int* esi, int* edi, int* ebp); void peep_sprite_remove(rct_peep* peep); void peep_remove(rct_peep* peep); void peep_update_sprite_type(rct_peep* peep); diff --git a/src/peep/staff.c b/src/peep/staff.c index c8e87feb97..5332a6b450 100644 --- a/src/peep/staff.c +++ b/src/peep/staff.c @@ -22,6 +22,7 @@ #include "../localisation/string_ids.h" #include "../localisation/localisation.h" #include "../management/finance.h" +#include "../network/network.h" #include "../util/util.h" #include "../world/sprite.h" #include "../world/footpath.h" @@ -1360,6 +1361,20 @@ void game_command_set_staff_name(int *eax, int *ebx, int *ecx, int *edx, int *es ); } +void game_command_pickup_staff(int* eax, int* ebx, int* ecx, int* edx, int* esi, int* edi, int* ebp) +{ + int peepnum = *eax; + int x = *edi; + int y = *ebp; + if (peep_pickup_command(peepnum, x, y, *ecx, *ebx & GAME_COMMAND_FLAG_APPLY)) { + *ebx = 0; + } + else + { + *ebx = MONEY32_UNDEFINED; + } +} + colour_t staff_get_colour(uint8 staffType) { switch (staffType) { diff --git a/src/peep/staff.h b/src/peep/staff.h index f6d64c9119..acf16bd10e 100644 --- a/src/peep/staff.h +++ b/src/peep/staff.h @@ -74,6 +74,7 @@ void game_command_set_staff_order(int *eax, int *ebx, int *ecx, int *edx, int *e void game_command_set_staff_patrol(int *eax, int *ebx, int *ecx, int *edx, int *esi, int *edi, int *ebp); void game_command_fire_staff_member(int *eax, int *ebx, int *ecx, int *edx, int *esi, int *edi, int *ebp); void game_command_set_staff_name(int *eax, int *ebx, int *ecx, int *edx, int *esi, int *edi, int *ebp); +void game_command_pickup_staff(int* eax, int* ebx, int* ecx, int* edx, int* esi, int* edi, int* ebp); void staff_reset_modes(); void update_staff_colour(uint8 staffType, uint16 colour); diff --git a/src/windows/guest.c b/src/windows/guest.c index 1acd8c98dc..10abc7c4dc 100644 --- a/src/windows/guest.c +++ b/src/windows/guest.c @@ -592,6 +592,30 @@ void window_guest_overview_resize(rct_window *w){ window_guest_viewport_init(w); } +void game_command_callback_pickup_guest(int eax, int ebx, int ecx, int edx, int esi, int edi, int ebp) +{ + switch(ecx){ + case 0:{ + int peepnum = eax; + rct_window* w = window_find_by_number(WC_PEEP, peepnum); + if (w) { + tool_set(w, WIDX_PICKUP, 7); + } + else + { + tool_cancel(); + gPickupPeepImage = UINT32_MAX; + } + }break; + case 2: + if (ebx == 0) { + tool_cancel(); + gPickupPeepImage = UINT32_MAX; + } + break; + } +} + /** * * rct2: 0x00696A06 @@ -613,32 +637,11 @@ void window_guest_overview_mouse_up(rct_window *w, int widgetIndex) window_guest_set_page(w, widgetIndex - WIDX_TAB_1); break; case WIDX_PICKUP: - { // remove this block when peep pick up is finally converted to a game command - int player = network_get_player_index(network_get_current_player_id()); - if (player != -1) { - if (!network_can_perform_action(network_get_group_index(network_get_player_group(player)), 11/*Guest action*/)) { - window_error_open(STR_CANT_DO_THIS, STR_PERMISSION_DENIED); - return; - } - } - } // if (!peep_can_be_picked_up(peep)) { return; } - if (tool_set(w, widgetIndex, 7)) { - return; - } - - w->picked_peep_old_x = peep->x; - - remove_peep_from_ride(peep); - invalidate_sprite_2((rct_sprite*)peep); - - sprite_move(0x8000, peep->y, peep->z, (rct_sprite*)peep); - peep_decrement_num_riders(peep); - peep->state = PEEP_STATE_PICKED; - peep->sub_state = 0; - peep_window_state_update(peep); + 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; case WIDX_RENAME: window_text_input_open(w, widgetIndex, STR_GUEST_RENAME_TITLE, STR_GUEST_RENAME_PROMPT, peep->name_string_idx, peep->id, 32); @@ -1214,53 +1217,8 @@ void window_guest_overview_tool_down(rct_window* w, int widgetIndex, int x, int if (widgetIndex != WIDX_PICKUP) return; - int dest_x, dest_y; - rct_map_element *mapElement; - footpath_get_coordinates_from_pos(x, y + 16, &dest_x, &dest_y, NULL, &mapElement); - - if (dest_x == (sint16)0x8000)return; - - // Set the coordinate of destination to be exactly - // in the middle of a tile. - dest_x += 16; - dest_y += 16; - // Set the tile coordinate to top left of tile - int tile_y = dest_y & 0xFFE0; - int tile_x = dest_x & 0xFFE0; - - int dest_z = mapElement->base_height * 8 + 16; - - if (!map_is_location_owned(tile_x, tile_y, dest_z)){ - window_error_open(STR_ERR_CANT_PLACE_PERSON_HERE, STR_NONE); - return; - } - - if (!map_can_construct_at(tile_x, tile_y, dest_z / 8, (dest_z / 8) + 1, 15)){ - if (gGameCommandErrorText != STR_RAISE_OR_LOWER_LAND_FIRST) { - if (gGameCommandErrorText != STR_FOOTPATH_IN_THE_WAY) { - window_error_open(STR_ERR_CANT_PLACE_PERSON_HERE, STR_NONE); - return; - } - } - } - - rct_peep* peep = GET_PEEP(w->number); - sprite_move(dest_x, dest_y, dest_z, (rct_sprite*)peep); - invalidate_sprite_2((rct_sprite*)peep); - peep_decrement_num_riders(peep); - peep->state = 0; - peep_window_state_update(peep); - peep->action = 0xFF; - peep->special_sprite = 0; - peep->action_sprite_image_offset = 0; - peep->action_sprite_type = 0xFF; - peep->var_C4 = 0; - - peep->happiness_growth_rate = max(peep->happiness_growth_rate - 10, 0); - - sub_693B58(peep); - tool_cancel(); - gPickupPeepImage = UINT32_MAX; + game_command_callback = game_command_callback_pickup_guest; + game_do_command(0, GAME_COMMAND_FLAG_APPLY, 2, 0, GAME_COMMAND_PICKUP_GUEST, x, y); } /** @@ -1272,25 +1230,7 @@ void window_guest_overview_tool_abort(rct_window *w, int widgetIndex) if (widgetIndex != WIDX_PICKUP) return; - rct_peep* peep = GET_PEEP(w->number); - if (peep->state != PEEP_STATE_PICKED) - return; - - sprite_move(w->picked_peep_old_x, peep->y, peep->z + 8, (rct_sprite*)peep); - invalidate_sprite_2((rct_sprite*)peep); - - if (peep->x != (sint16)0x8000){ - peep_decrement_num_riders(peep); - peep->state = 0; - peep_window_state_update(peep); - peep->action = 0xFF; - peep->special_sprite = 0; - peep->action_sprite_image_offset = 0; - peep->action_sprite_type = 0; - peep->var_C4 = 0; - } - - gPickupPeepImage = UINT32_MAX; + game_do_command(0, GAME_COMMAND_FLAG_APPLY, 1, 0, GAME_COMMAND_PICKUP_GUEST, 0, 0); } /** diff --git a/src/windows/staff.c b/src/windows/staff.c index 2658071afa..4d8bf8b419 100644 --- a/src/windows/staff.c +++ b/src/windows/staff.c @@ -433,6 +433,30 @@ void window_staff_set_page(rct_window* w, int page) if (listen && w->viewport) w->viewport->flags |= VIEWPORT_FLAG_SOUND_ON; } +void game_command_callback_pickup_staff(int eax, int ebx, int ecx, int edx, int esi, int edi, int ebp) +{ + switch(ecx){ + case 0:{ + int peepnum = eax; + rct_window* w = window_find_by_number(WC_PEEP, peepnum); + if (w) { + tool_set(w, WIDX_PICKUP, 7); + } + else + { + tool_cancel(); + gPickupPeepImage = UINT32_MAX; + } + }break; + case 2: + if (ebx == 0) { + tool_cancel(); + gPickupPeepImage = UINT32_MAX; + } + break; + } +} + /** * * rct2: 0x006BDF55 @@ -454,19 +478,8 @@ void window_staff_overview_mouseup(rct_window *w, int widgetIndex) window_scroll_to_viewport(w); break; case WIDX_PICKUP: - if (tool_set(w, widgetIndex, 7)) { - return; - } - - w->picked_peep_old_x = peep->x; - - remove_peep_from_ride(peep); - invalidate_sprite_2((rct_sprite*)peep); - - sprite_move( 0x8000, peep->y, peep->z, (rct_sprite*)peep); - peep_decrement_num_riders(peep); - peep->state = PEEP_STATE_PICKED; - peep_window_state_update(peep); + game_command_callback = game_command_callback_pickup_staff; + game_do_command(w->number, GAME_COMMAND_FLAG_APPLY, 0, 0, GAME_COMMAND_PICKUP_STAFF, 0, 0); break; case WIDX_FIRE: window_staff_fire_prompt_open(peep); @@ -1143,50 +1156,8 @@ void window_staff_overview_tool_update(rct_window* w, int widgetIndex, int x, in void window_staff_overview_tool_down(rct_window* w, int widgetIndex, int x, int y) { if (widgetIndex == WIDX_PICKUP) { - int dest_x, dest_y; - rct_map_element *mapElement; - footpath_get_coordinates_from_pos(x, y + 16, &dest_x, &dest_y, NULL, &mapElement); - - if (dest_x == (sint16)0x8000)return; - - // Set the coordinate of destination to be exactly - // in the middle of a tile. - dest_x += 16; - dest_y += 16; - // Set the tile coordinate to top left of tile - int tile_y = dest_y & 0xFFE0; - int tile_x = dest_x & 0xFFE0; - - int dest_z = mapElement->base_height * 8 + 16; - - if (!map_is_location_owned(tile_x, tile_y, dest_z)){ - window_error_open(STR_ERR_CANT_PLACE_PERSON_HERE, STR_NONE); - return; - } - - if (!map_can_construct_at(tile_x, tile_y, dest_z / 8, (dest_z / 8) + 1, 15)){ - if (gGameCommandErrorText != STR_RAISE_OR_LOWER_LAND_FIRST){ - if (gGameCommandErrorText != STR_FOOTPATH_IN_THE_WAY){ - window_error_open(STR_ERR_CANT_PLACE_PERSON_HERE, STR_NONE); - return; - } - } - } - - rct_peep* peep = GET_PEEP(w->number); - sprite_move(dest_x, dest_y, dest_z, (rct_sprite*)peep); - invalidate_sprite_2((rct_sprite*)peep); - peep_decrement_num_riders(peep); - peep->state = PEEP_STATE_FALLING; - peep_window_state_update(peep); - peep->action = 0xFF; - peep->special_sprite = 0; - peep->action_sprite_image_offset = 0; - peep->action_sprite_type = 0; - peep->var_C4 = 0; - - tool_cancel(); - gPickupPeepImage = UINT32_MAX; + game_command_callback = game_command_callback_pickup_staff; + game_do_command(0, GAME_COMMAND_FLAG_APPLY, 2, 0, GAME_COMMAND_PICKUP_STAFF, x, y); } else if (widgetIndex == WIDX_PATROL){ int dest_x, dest_y; @@ -1205,24 +1176,7 @@ void window_staff_overview_tool_down(rct_window* w, int widgetIndex, int x, int void window_staff_overview_tool_abort(rct_window *w, int widgetIndex) { if (widgetIndex == WIDX_PICKUP) { - rct_peep* peep = GET_PEEP(w->number); - if (peep->state != PEEP_STATE_PICKED) return; - - sprite_move(w->picked_peep_old_x, peep->y, peep->z + 8, (rct_sprite*)peep); - invalidate_sprite_2((rct_sprite*)peep); - - if (peep->x != (sint16)0x8000){ - peep_decrement_num_riders(peep); - peep->state = PEEP_STATE_FALLING; - peep_window_state_update(peep); - peep->action = 0xFF; - peep->special_sprite = 0; - peep->action_sprite_image_offset = 0; - peep->action_sprite_type = 0; - peep->var_C4 = 0; - } - - gPickupPeepImage = UINT32_MAX; + game_do_command(w->number, GAME_COMMAND_FLAG_APPLY, 1, w->picked_peep_old_x, GAME_COMMAND_PICKUP_STAFF, 0, 0); } else if (widgetIndex == WIDX_PATROL){ hide_gridlines(); From db3aa2b656689687b0f1b907c8c28f4c0b1c7a93 Mon Sep 17 00:00:00 2001 From: zsilencer Date: Mon, 17 Oct 2016 14:59:08 -0600 Subject: [PATCH 2/6] Add balloon popping as game command --- src/game.c | 4 ++-- src/game.h | 3 ++- src/interface/viewport_interaction.c | 2 +- src/network/NetworkAction.cpp | 3 ++- src/network/NetworkPlayer.h | 1 + src/world/balloon.c | 22 ++++++++++++++++++---- src/world/sprite.h | 2 +- 7 files changed, 27 insertions(+), 10 deletions(-) diff --git a/src/game.c b/src/game.c index 656c687efe..810d782ed0 100644 --- a/src/game.c +++ b/src/game.c @@ -311,7 +311,6 @@ void game_update() // Always perform autosave check, even when paused scenario_autosave_check(); - network_update(); window_dispatch_update_all(); gGameCommandNestLevel = 0; @@ -1100,7 +1099,7 @@ void game_load_or_quit_no_save_prompt() } } -GAME_COMMAND_POINTER* new_game_command_table[69] = { +GAME_COMMAND_POINTER* new_game_command_table[70] = { game_command_set_ride_appearance, game_command_set_land_height, game_pause_toggle, @@ -1170,4 +1169,5 @@ GAME_COMMAND_POINTER* new_game_command_table[69] = { game_command_cheat, game_command_pickup_guest, game_command_pickup_staff, + game_command_balloon_press, }; diff --git a/src/game.h b/src/game.h index 5a3304a9db..ab189b5359 100644 --- a/src/game.h +++ b/src/game.h @@ -92,6 +92,7 @@ enum GAME_COMMAND { GAME_COMMAND_CHEAT, GAME_COMMAND_PICKUP_GUEST, GAME_COMMAND_PICKUP_STAFF, + GAME_COMMAND_BALLOON_PRESS, }; enum { @@ -131,7 +132,7 @@ extern rct_string_id gGameCommandErrorText; extern uint8 gErrorType; extern rct_string_id gErrorStringId; -extern GAME_COMMAND_POINTER* new_game_command_table[69]; +extern GAME_COMMAND_POINTER* new_game_command_table[70]; #ifndef NO_RCT2 #define gCurrentTicks RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_TICKS, uint32) diff --git a/src/interface/viewport_interaction.c b/src/interface/viewport_interaction.c index 0655272b55..6f8f8a857e 100644 --- a/src/interface/viewport_interaction.c +++ b/src/interface/viewport_interaction.c @@ -135,7 +135,7 @@ int viewport_interaction_left_click(int x, int y) if (game_is_not_paused()) { switch (info.sprite->unknown.misc_identifier) { case SPRITE_MISC_BALLOON: - balloon_press(&info.sprite->balloon); + game_do_command(info.sprite->balloon.sprite_index, GAME_COMMAND_FLAG_APPLY, 0, 0, GAME_COMMAND_BALLOON_PRESS, 0, 0); break; case SPRITE_MISC_DUCK: duck_press(&info.sprite->duck); diff --git a/src/network/NetworkAction.cpp b/src/network/NetworkAction.cpp index 3c1870fd2a..4ea911294d 100644 --- a/src/network/NetworkAction.cpp +++ b/src/network/NetworkAction.cpp @@ -159,7 +159,8 @@ const std::vector NetworkActions::Actions = STR_ACTION_GUEST, "PERMISSION_GUEST", { GAME_COMMAND_SET_GUEST_NAME, - GAME_COMMAND_PICKUP_GUEST + GAME_COMMAND_PICKUP_GUEST, + GAME_COMMAND_BALLOON_PRESS } }, { STR_ACTION_STAFF, "PERMISSION_STAFF", diff --git a/src/network/NetworkPlayer.h b/src/network/NetworkPlayer.h index 05b821ad57..3f477edecb 100644 --- a/src/network/NetworkPlayer.h +++ b/src/network/NetworkPlayer.h @@ -23,6 +23,7 @@ extern "C" { #include "../peep/peep.h" #include "../world/map.h" + #include "../world/sprite.h" } class NetworkPacket; diff --git a/src/world/balloon.c b/src/world/balloon.c index f4c0cdc8a8..604723f1be 100644 --- a/src/world/balloon.c +++ b/src/world/balloon.c @@ -83,13 +83,10 @@ void balloon_update(rct_balloon *balloon) */ void balloon_press(rct_balloon *balloon) { - if (network_get_mode() != NETWORK_MODE_NONE) { - return; - } if (balloon->popped == 1) return; - uint32 random = util_rand(); + uint32 random = scenario_rand(); if ((balloon->sprite_index & 7) || (random & 0xFFFF) < 0x2000) { balloon_pop(balloon); return; @@ -102,3 +99,20 @@ void balloon_press(rct_balloon *balloon) (rct_sprite*)balloon ); } + +void game_command_balloon_press(int* eax, int* ebx, int* ecx, int* edx, int* esi, int* edi, int* ebp) +{ + int balloon_num = *eax; + int flags = *ebx; + *ebx = 0; + if (!(flags & GAME_COMMAND_FLAG_APPLY)) { + return; + } + rct_sprite* sprite = get_sprite(balloon_num); + if (!sprite) { + return; + } + if (sprite->balloon.sprite_identifier == SPRITE_IDENTIFIER_MISC && sprite->balloon.misc_identifier == SPRITE_MISC_BALLOON) { + balloon_press(&sprite->balloon); + } +} diff --git a/src/world/sprite.h b/src/world/sprite.h index e7d453d5c5..cf411c2bdb 100644 --- a/src/world/sprite.h +++ b/src/world/sprite.h @@ -438,7 +438,7 @@ uint16 sprite_get_first_in_quadrant(int x, int y); /////////////////////////////////////////////////////////////// void create_balloon(int x, int y, int z, int colour, uint8 bl); void balloon_update(rct_balloon *balloon); -void balloon_press(rct_balloon *balloon); +void game_command_balloon_press(int* eax, int* ebx, int* ecx, int* edx, int* esi, int* edi, int* ebp); /////////////////////////////////////////////////////////////// // Duck From 541ae91d6732f590a581f6be66eb9256c1df697e Mon Sep 17 00:00:00 2001 From: zsilencer Date: Mon, 17 Oct 2016 23:13:39 -0600 Subject: [PATCH 3/6] fix pickup commands to work with hiring staff --- src/network/network.cpp | 2 +- src/peep/peep.c | 14 ++++++++------ src/peep/staff.c | 3 ++- src/windows/guest.c | 10 +++------- src/windows/staff.c | 16 +++++++++------- 5 files changed, 23 insertions(+), 22 deletions(-) diff --git a/src/network/network.cpp b/src/network/network.cpp index 35884e7ab2..cc9df35ad4 100644 --- a/src/network/network.cpp +++ b/src/network/network.cpp @@ -1228,7 +1228,7 @@ void Network::RemoveClient(std::unique_ptr& connection) rct_peep* pickup_peep = network_get_pickup_peep(connection_player->id); if(pickup_peep) { game_command_playerid = connection_player->id; - game_do_command(0, GAME_COMMAND_FLAG_APPLY, 1, 0, pickup_peep->type == PEEP_TYPE_GUEST ? GAME_COMMAND_PICKUP_GUEST : GAME_COMMAND_PICKUP_STAFF, 0, 0); + game_do_command(0, 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); } gNetwork.Server_Send_EVENT_PLAYER_DISCONNECTED((char*)connection_player->name.c_str(), connection->GetLastDisconnectReason()); } diff --git a/src/peep/peep.c b/src/peep/peep.c index 6064617414..8973f90c2c 100644 --- a/src/peep/peep.c +++ b/src/peep/peep.c @@ -1868,7 +1868,7 @@ void peep_pickup_abort(rct_peep* peep, int old_x) if (peep->x != (sint16)SPRITE_LOCATION_NULL){ peep_decrement_num_riders(peep); - peep->state = 0; + peep->state = PEEP_STATE_FALLING; peep_window_state_update(peep); peep->action = 0xFF; peep->special_sprite = 0; @@ -1945,10 +1945,9 @@ bool peep_pickup_place(rct_peep* peep, int x, int y, bool apply) bool peep_pickup_command(int peepnum, int x, int y, int action, bool apply) { - rct_peep* peep; + rct_peep* peep = GET_PEEP(peepnum); switch (action) { case 0: // pickup - peep = GET_PEEP(peepnum); if (!peep) { return false; } @@ -1960,19 +1959,22 @@ bool peep_pickup_command(int peepnum, int x, int y, int action, bool apply) return false; } if (apply) { - peep_pickup(peep); network_set_pickup_peep(game_command_playerid, peep); network_set_pickup_peep_old_x(game_command_playerid, peep->x); + peep_pickup(peep); } break; case 1: // cancel if (apply) { - peep_pickup_abort(network_get_pickup_peep(game_command_playerid), network_get_pickup_peep_old_x(game_command_playerid)); + peep_pickup_abort(network_get_pickup_peep(game_command_playerid), x); network_set_pickup_peep(game_command_playerid, 0); } break; case 2: // place - if (!peep_pickup_place(network_get_pickup_peep(game_command_playerid), x, y, apply)) { + if (network_get_pickup_peep(game_command_playerid) != peep) { + return false; + } + if (!peep_pickup_place(peep, x, y, apply)) { return false; } break; diff --git a/src/peep/staff.c b/src/peep/staff.c index 5332a6b450..1754db250f 100644 --- a/src/peep/staff.c +++ b/src/peep/staff.c @@ -269,7 +269,8 @@ static money32 staff_hire_new_staff_member(uint8 staff_type, uint8 flags, sint16 newPeep->sprite_height_negative = spriteBounds->sprite_height_negative; newPeep->sprite_height_positive = spriteBounds->sprite_height_positive; - if (gConfigGeneral.auto_staff_placement != ((SDL_GetModState() & KMOD_SHIFT) != 0)) { + // gConfigGeneral.auto_staff_placement is client specific so we need to force this + if (network_get_mode() == NETWORK_MODE_NONE && gConfigGeneral.auto_staff_placement != ((SDL_GetModState() & KMOD_SHIFT) != 0)) { staff_autoposition_new_staff_member(newPeep); } else { newPeep->state = PEEP_STATE_PICKED; diff --git a/src/windows/guest.c b/src/windows/guest.c index 10abc7c4dc..ad7f07611f 100644 --- a/src/windows/guest.c +++ b/src/windows/guest.c @@ -601,11 +601,6 @@ void game_command_callback_pickup_guest(int eax, int ebx, int ecx, int edx, int if (w) { tool_set(w, WIDX_PICKUP, 7); } - else - { - tool_cancel(); - gPickupPeepImage = UINT32_MAX; - } }break; case 2: if (ebx == 0) { @@ -640,6 +635,7 @@ void window_guest_overview_mouse_up(rct_window *w, int widgetIndex) 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; @@ -1218,7 +1214,7 @@ void window_guest_overview_tool_down(rct_window* w, int widgetIndex, int x, int return; game_command_callback = game_command_callback_pickup_guest; - game_do_command(0, GAME_COMMAND_FLAG_APPLY, 2, 0, GAME_COMMAND_PICKUP_GUEST, x, y); + game_do_command(w->number, GAME_COMMAND_FLAG_APPLY, 2, 0, GAME_COMMAND_PICKUP_GUEST, x, y); } /** @@ -1230,7 +1226,7 @@ void window_guest_overview_tool_abort(rct_window *w, int widgetIndex) if (widgetIndex != WIDX_PICKUP) return; - game_do_command(0, GAME_COMMAND_FLAG_APPLY, 1, 0, GAME_COMMAND_PICKUP_GUEST, 0, 0); + game_do_command(w->number, GAME_COMMAND_FLAG_APPLY, 1, 0, GAME_COMMAND_PICKUP_GUEST, w->picked_peep_old_x, 0); } /** diff --git a/src/windows/staff.c b/src/windows/staff.c index 4d8bf8b419..e1d98bf35c 100644 --- a/src/windows/staff.c +++ b/src/windows/staff.c @@ -442,11 +442,6 @@ void game_command_callback_pickup_staff(int eax, int ebx, int ecx, int edx, int if (w) { tool_set(w, WIDX_PICKUP, 7); } - else - { - tool_cancel(); - gPickupPeepImage = UINT32_MAX; - } }break; case 2: if (ebx == 0) { @@ -478,8 +473,15 @@ void window_staff_overview_mouseup(rct_window *w, int widgetIndex) window_scroll_to_viewport(w); break; case WIDX_PICKUP: + { + // this is called in callback when hiring staff, setting nestlevel to 0 so that command is sent separately + int 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; + } break; case WIDX_FIRE: window_staff_fire_prompt_open(peep); @@ -1157,7 +1159,7 @@ void window_staff_overview_tool_down(rct_window* w, int widgetIndex, int x, int { if (widgetIndex == WIDX_PICKUP) { game_command_callback = game_command_callback_pickup_staff; - game_do_command(0, GAME_COMMAND_FLAG_APPLY, 2, 0, GAME_COMMAND_PICKUP_STAFF, x, y); + game_do_command(w->number, GAME_COMMAND_FLAG_APPLY, 2, 0, GAME_COMMAND_PICKUP_STAFF, x, y); } else if (widgetIndex == WIDX_PATROL){ int dest_x, dest_y; @@ -1176,7 +1178,7 @@ void window_staff_overview_tool_down(rct_window* w, int widgetIndex, int x, int void window_staff_overview_tool_abort(rct_window *w, int widgetIndex) { if (widgetIndex == WIDX_PICKUP) { - game_do_command(w->number, GAME_COMMAND_FLAG_APPLY, 1, w->picked_peep_old_x, GAME_COMMAND_PICKUP_STAFF, 0, 0); + game_do_command(w->number, GAME_COMMAND_FLAG_APPLY, 1, 0, GAME_COMMAND_PICKUP_STAFF, w->picked_peep_old_x, 0); } else if (widgetIndex == WIDX_PATROL){ hide_gridlines(); From 986c2ab97e833f290f8730d8094d73c549483837 Mon Sep 17 00:00:00 2001 From: zsilencer Date: Tue, 18 Oct 2016 13:20:45 -0600 Subject: [PATCH 4/6] Fix bug - prevent firing of staff while being picked up --- src/peep/staff.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/peep/staff.c b/src/peep/staff.c index 1754db250f..40568c1dea 100644 --- a/src/peep/staff.c +++ b/src/peep/staff.c @@ -474,6 +474,10 @@ void game_command_fire_staff_member(int *eax, int *ebx, int *ecx, int *edx, int *ebx = MONEY32_UNDEFINED; return; } + if (peep->state == PEEP_STATE_PICKED) { + *ebx = MONEY32_UNDEFINED; + return; + } remove_peep_from_ride(peep); peep_sprite_remove(peep); } From 3617c2cb934bddb486bf1332e87ea5c4692266e5 Mon Sep 17 00:00:00 2001 From: zsilencer Date: Tue, 18 Oct 2016 13:33:43 -0600 Subject: [PATCH 5/6] Code review --- src/game.c | 2 +- src/game.h | 3 ++- src/peep/peep.c | 25 +++++++++++++++---------- src/peep/peep.h | 4 ++-- src/peep/staff.c | 4 +++- src/windows/guest.c | 9 ++++++++- src/windows/staff.c | 9 ++++++++- src/world/balloon.c | 2 +- 8 files changed, 40 insertions(+), 18 deletions(-) diff --git a/src/game.c b/src/game.c index 810d782ed0..5a56eefcfd 100644 --- a/src/game.c +++ b/src/game.c @@ -1099,7 +1099,7 @@ void game_load_or_quit_no_save_prompt() } } -GAME_COMMAND_POINTER* new_game_command_table[70] = { +GAME_COMMAND_POINTER* new_game_command_table[GAME_COMMAND_COUNT] = { game_command_set_ride_appearance, game_command_set_land_height, game_pause_toggle, diff --git a/src/game.h b/src/game.h index ab189b5359..c02a67835c 100644 --- a/src/game.h +++ b/src/game.h @@ -93,6 +93,7 @@ enum GAME_COMMAND { GAME_COMMAND_PICKUP_GUEST, GAME_COMMAND_PICKUP_STAFF, GAME_COMMAND_BALLOON_PRESS, + GAME_COMMAND_COUNT }; enum { @@ -132,7 +133,7 @@ extern rct_string_id gGameCommandErrorText; extern uint8 gErrorType; extern rct_string_id gErrorStringId; -extern GAME_COMMAND_POINTER* new_game_command_table[70]; +extern GAME_COMMAND_POINTER* new_game_command_table[GAME_COMMAND_COUNT]; #ifndef NO_RCT2 #define gCurrentTicks RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_TICKS, uint32) diff --git a/src/peep/peep.c b/src/peep/peep.c index 8973f90c2c..9b3e502381 100644 --- a/src/peep/peep.c +++ b/src/peep/peep.c @@ -1880,20 +1880,23 @@ void peep_pickup_abort(rct_peep* peep, int old_x) gPickupPeepImage = UINT32_MAX; } -bool peep_pickup_place(rct_peep* peep, int x, int y, bool apply) +bool peep_pickup_place(rct_peep* peep, int x, int y, int z, bool apply) { if (!peep) return false; - int dest_x, dest_y; - rct_map_element *mapElement; - footpath_get_coordinates_from_pos(x, y + 16, &dest_x, &dest_y, NULL, &mapElement); + rct_map_element *mapElement = map_get_path_element_at(x / 32, y / 32, z); - if (dest_x == (sint16)SPRITE_LOCATION_NULL) { - gGameCommandErrorTitle = STR_ERR_CANT_PLACE_PERSON_HERE; - return false; + if (!mapElement) { + mapElement = map_get_surface_element_at(x / 32, y / 32); } + if (!mapElement) + return false; + + int dest_x = x & 0xFFE0; + int dest_y = y & 0xFFE0; + // Set the coordinate of destination to be exactly // in the middle of a tile. dest_x += 16; @@ -1943,7 +1946,7 @@ bool peep_pickup_place(rct_peep* peep, int x, int y, bool apply) return true; } -bool peep_pickup_command(int peepnum, int x, int y, int action, bool apply) +bool peep_pickup_command(int peepnum, int x, int y, int z, int action, bool apply) { rct_peep* peep = GET_PEEP(peepnum); switch (action) { @@ -1974,7 +1977,7 @@ bool peep_pickup_command(int peepnum, int x, int y, int action, bool apply) if (network_get_pickup_peep(game_command_playerid) != peep) { return false; } - if (!peep_pickup_place(peep, x, y, apply)) { + if (!peep_pickup_place(peep, x, y, z, apply)) { return false; } break; @@ -1987,7 +1990,9 @@ void game_command_pickup_guest(int* eax, int* ebx, int* ecx, int* edx, int* esi, int peepnum = *eax; int x = *edi; int y = *ebp; - if (peep_pickup_command(peepnum, x, y, *ecx, *ebx & GAME_COMMAND_FLAG_APPLY)) { + int z = *edx; + int action = *ecx; + if (peep_pickup_command(peepnum, x, y, z, action, *ebx & GAME_COMMAND_FLAG_APPLY)) { *ebx = 0; } else diff --git a/src/peep/peep.h b/src/peep/peep.h index 027b6287bc..c1bd61d592 100644 --- a/src/peep/peep.h +++ b/src/peep/peep.h @@ -654,8 +654,8 @@ bool peep_has_item(rct_peep *peep, int peepItem); int peep_has_food(rct_peep* peep); void peep_pickup(rct_peep* peep); void peep_pickup_abort(rct_peep* peep, int old_x); -bool peep_pickup_place(rct_peep* peep, int x, int y, bool apply); -bool peep_pickup_command(int peepnum, int x, int y, int action, bool apply); +bool peep_pickup_place(rct_peep* peep, int x, int y, int z, bool apply); +bool peep_pickup_command(int peepnum, int x, int y, int z, int action, bool apply); void game_command_pickup_guest(int* eax, int* ebx, int* ecx, int* edx, int* esi, int* edi, int* ebp); void peep_sprite_remove(rct_peep* peep); void peep_remove(rct_peep* peep); diff --git a/src/peep/staff.c b/src/peep/staff.c index 40568c1dea..6e8cbaaa2b 100644 --- a/src/peep/staff.c +++ b/src/peep/staff.c @@ -1371,7 +1371,9 @@ void game_command_pickup_staff(int* eax, int* ebx, int* ecx, int* edx, int* esi, int peepnum = *eax; int x = *edi; int y = *ebp; - if (peep_pickup_command(peepnum, x, y, *ecx, *ebx & GAME_COMMAND_FLAG_APPLY)) { + int z = *edx; + int action = *ecx; + if (peep_pickup_command(peepnum, x, y, z, action, *ebx & GAME_COMMAND_FLAG_APPLY)) { *ebx = 0; } else diff --git a/src/windows/guest.c b/src/windows/guest.c index ad7f07611f..17467cf82b 100644 --- a/src/windows/guest.c +++ b/src/windows/guest.c @@ -1213,8 +1213,15 @@ void window_guest_overview_tool_down(rct_window* w, int widgetIndex, int x, int if (widgetIndex != WIDX_PICKUP) return; + int dest_x, dest_y; + rct_map_element* mapElement; + footpath_get_coordinates_from_pos(x, y + 16, &dest_x, &dest_y, NULL, &mapElement); + + if (x == (sint16)0x8000) + return; + game_command_callback = game_command_callback_pickup_guest; - game_do_command(w->number, GAME_COMMAND_FLAG_APPLY, 2, 0, GAME_COMMAND_PICKUP_GUEST, x, y); + game_do_command(w->number, GAME_COMMAND_FLAG_APPLY, 2, mapElement->base_height, GAME_COMMAND_PICKUP_GUEST, dest_x, dest_y); } /** diff --git a/src/windows/staff.c b/src/windows/staff.c index e1d98bf35c..5b54d8ffc2 100644 --- a/src/windows/staff.c +++ b/src/windows/staff.c @@ -1158,8 +1158,15 @@ void window_staff_overview_tool_update(rct_window* w, int widgetIndex, int x, in void window_staff_overview_tool_down(rct_window* w, int widgetIndex, int x, int y) { if (widgetIndex == WIDX_PICKUP) { + int dest_x, dest_y; + rct_map_element* mapElement; + footpath_get_coordinates_from_pos(x, y + 16, &dest_x, &dest_y, NULL, &mapElement); + + if (x == (sint16)0x8000) + return; + game_command_callback = game_command_callback_pickup_staff; - game_do_command(w->number, GAME_COMMAND_FLAG_APPLY, 2, 0, GAME_COMMAND_PICKUP_STAFF, x, y); + game_do_command(w->number, GAME_COMMAND_FLAG_APPLY, 2, mapElement->base_height, GAME_COMMAND_PICKUP_STAFF, dest_x, dest_y); } else if (widgetIndex == WIDX_PATROL){ int dest_x, dest_y; diff --git a/src/world/balloon.c b/src/world/balloon.c index 604723f1be..0cff7ed7cb 100644 --- a/src/world/balloon.c +++ b/src/world/balloon.c @@ -81,7 +81,7 @@ void balloon_update(rct_balloon *balloon) * * rct2: 0x006E88ED */ -void balloon_press(rct_balloon *balloon) +static void balloon_press(rct_balloon *balloon) { if (balloon->popped == 1) return; From d83df63acfc1c04768a86bdbe971216dc61acae8 Mon Sep 17 00:00:00 2001 From: zsilencer Date: Wed, 19 Oct 2016 16:24:14 -0600 Subject: [PATCH 6/6] Increment network version --- src/network/network.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/network/network.h b/src/network/network.h index 4e5bbc325c..2ef7ee687a 100644 --- a/src/network/network.h +++ b/src/network/network.h @@ -55,7 +55,7 @@ extern "C" { // This define 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 "14" +#define NETWORK_STREAM_VERSION "15" #define NETWORK_STREAM_ID OPENRCT2_VERSION "-" NETWORK_STREAM_VERSION #ifdef __cplusplus