diff --git a/src/game.c b/src/game.c index f603d93422..1312661de4 100644 --- a/src/game.c +++ b/src/game.c @@ -67,6 +67,7 @@ GAME_COMMAND_CALLBACK_POINTER* game_command_callback_table[] = { game_command_callback_ride_construct_new, game_command_callback_ride_construct_placed_front, game_command_callback_ride_construct_placed_back, + game_command_callback_ride_remove_track_piece, }; int game_command_callback_get_index(GAME_COMMAND_CALLBACK_POINTER* callback) diff --git a/src/ride/ride.c b/src/ride/ride.c index 5f3c4d5c15..9f522dfaf9 100644 --- a/src/ride/ride.c +++ b/src/ride/ride.c @@ -128,6 +128,7 @@ static const int RideInspectionInterval[] = { rct_ride_type **gRideTypeList = RCT2_ADDRESS(RCT2_ADDRESS_RIDE_ENTRIES, rct_ride_type*); rct_ride* g_ride_list = RCT2_ADDRESS(RCT2_ADDRESS_RIDE_LIST, rct_ride); +bool gGotoStartPlacementMode = false; // Static function declarations rct_peep *find_closest_mechanic(int x, int y, int forInspection); @@ -5536,6 +5537,28 @@ void game_command_callback_ride_construct_placed_front(int eax, int ebx, int ecx sub_6C84CE(); } +/** +* +* Network client callback when removing ride pieces +* Client does execute placing the piece on the same tick as mouse_up - waits for server command +* Re-executes function from ride_construction - window_ride_construction_mouseup_demolish() +* Only uses part that deals with construction state +*/ + +void game_command_callback_ride_remove_track_piece(int eax, int ebx, int ecx, int edx, int esi, int edi, int ebp) +{ + int x, y, z, direction, type; + rct_xy_element outputElement; + + x = _currentTrackBeginX; + y = _currentTrackBeginY; + z = _currentTrackBeginZ; + direction = _currentTrackPieceDirection; + type = _currentTrackPieceType; + + window_ride_construction_mouseup_demolish_next_piece(x, y, z, direction, type, outputElement); +} + /** * * rct2: 0x006B49D9 @@ -6287,6 +6310,10 @@ bool ride_select_forwards_from_back() money32 ride_remove_track_piece(int x, int y, int z, int direction, int type) { RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TITLE, rct_string_id) = STR_RIDE_CONSTRUCTION_CANT_REMOVE_THIS; + if (network_get_mode() == NETWORK_MODE_CLIENT) + { + game_command_callback = game_command_callback_ride_remove_track_piece; + } return game_do_command(x, (GAME_COMMAND_FLAG_APPLY) | ((direction & 3) << 8), y, type, GAME_COMMAND_REMOVE_TRACK, z, 0); } diff --git a/src/ride/ride.h b/src/ride/ride.h index 0734fedc7e..5a1e38b154 100644 --- a/src/ride/ride.h +++ b/src/ride/ride.h @@ -876,6 +876,8 @@ extern const uint8 gRideClassifications[255]; #define _currentSeatRotationAngle RCT2_GLOBAL(0x00F440CF, uint8) +extern bool gGotoStartPlacementMode; + int ride_get_count(); int ride_get_total_queue_length(rct_ride *ride); int ride_get_max_queue_time(rct_ride *ride); @@ -929,6 +931,7 @@ void game_command_create_ride(int *eax, int *ebx, int *ecx, int *edx, int *esi, void game_command_callback_ride_construct_new(int eax, int ebx, int ecx, int edx, int esi, int edi, int ebp); void game_command_callback_ride_construct_placed_front(int eax, int ebx, int ecx, int edx, int esi, int edi, int ebp); void game_command_callback_ride_construct_placed_back(int eax, int ebx, int ecx, int edx, int esi, int edi, int ebp); +void game_command_callback_ride_remove_track_piece(int eax, int ebx, int ecx, int edx, int esi, int edi, int ebp); void game_command_demolish_ride(int *eax, int *ebx, int *ecx, int *edx, int *esi, int *edi, int *ebp); void game_command_set_ride_appearance(int *eax, int *ebx, int *ecx, int *edx, int *esi, int *edi, int *ebp); void game_command_set_ride_price(int *eax, int *ebx, int *ecx, int *edx, int *esi, int *edi, int *ebp); @@ -1009,4 +1012,6 @@ bool shop_item_is_souvenir(int shopItem); void ride_reset_all_names(); const uint8* ride_seek_available_modes(rct_ride *ride); +void window_ride_construction_mouseup_demolish_next_piece(int x, int y, int z, int direction, int type, rct_xy_element outputElement); + #endif diff --git a/src/windows/ride_construction.c b/src/windows/ride_construction.c index d81b6e7c0f..ac19ef73b6 100644 --- a/src/windows/ride_construction.c +++ b/src/windows/ride_construction.c @@ -1670,11 +1670,11 @@ static void window_ride_construction_construct(rct_window *w) */ static void window_ride_construction_mouseup_demolish(rct_window* w) { - int x, y, z, direction, type, slope, slopeEnd, b2, bankEnd, bankStart, b5, b4; + int x, y, z, direction, type; rct_map_element *mapElement; rct_xy_element inputElement, outputElement; track_begin_end trackBeginEnd; - bool gotoStartPlacementMode; + //bool gotoStartPlacementMode; _currentTrackPrice = MONEY32_UNDEFINED; sub_6C9627(); @@ -1716,14 +1716,14 @@ static void window_ride_construction_mouseup_demolish(rct_window* w) z = trackBeginEnd.begin_z; direction = trackBeginEnd.begin_direction; type = trackBeginEnd.begin_element->properties.track.type; - gotoStartPlacementMode = false; + gGotoStartPlacementMode = false; } else if (track_block_get_next(&inputElement, &outputElement, &z, &direction)) { x = outputElement.x; y = outputElement.y; direction = outputElement.element->type & MAP_ELEMENT_DIRECTION_MASK; type = outputElement.element->properties.track.type; - gotoStartPlacementMode = false; + gGotoStartPlacementMode = false; } else { x = _currentTrackBeginX; y = _currentTrackBeginY; @@ -1738,7 +1738,7 @@ static void window_ride_construction_mouseup_demolish(rct_window* w) const rct_preview_track *trackBlock = get_track_def_from_ride_index(_currentRideIndex, mapElement->properties.track.type); z = (mapElement->base_height * 8) - trackBlock->z; - gotoStartPlacementMode = true; + gGotoStartPlacementMode = true; } money32 cost = ride_remove_track_piece( @@ -1753,7 +1753,13 @@ static void window_ride_construction_mouseup_demolish(rct_window* w) return; } - if (gotoStartPlacementMode) { + window_ride_construction_mouseup_demolish_next_piece(x, y, z, direction, type, outputElement); +} + +void window_ride_construction_mouseup_demolish_next_piece(int x, int y, int z, int direction, int type, rct_xy_element outputElement) +{ + int slope, slopeEnd, b2, bankEnd, bankStart, b5, b4; + if (gGotoStartPlacementMode) { z &= 0xFFF0; _currentTrackBeginZ = z; _rideConstructionState = RIDE_CONSTRUCTION_STATE_FRONT; @@ -1783,7 +1789,8 @@ static void window_ride_construction_mouseup_demolish(rct_window* w) sub_6C84CE(); } } - } else { + } + else { if (RCT2_GLOBAL(0x00F440B8, uint8) == 3 || RCT2_GLOBAL(0x00F440B8, uint8) == 1) { if (type == TRACK_ELEM_MIDDLE_STATION || type == TRACK_ELEM_BEGIN_STATION) { type = TRACK_ELEM_END_STATION; @@ -1794,6 +1801,11 @@ static void window_ride_construction_mouseup_demolish(rct_window* w) type = TRACK_ELEM_BEGIN_STATION; } } + if (network_get_mode() == NETWORK_MODE_CLIENT) + { + // rideConstructionState needs to be set again to the proper value, this only affects the client + _rideConstructionState = RIDE_CONSTRUCTION_STATE_SELECTED; + } _currentTrackBeginX = x; _currentTrackBeginY = y; _currentTrackBeginZ = z; @@ -1803,7 +1815,8 @@ static void window_ride_construction_mouseup_demolish(rct_window* w) _rideConstructionArrowPulseTime = 0; if (RCT2_GLOBAL(0x00F440B8, uint8) == 1) { ride_select_next_section(); - } else if (RCT2_GLOBAL(0x00F440B8, uint8) == 2) { + } + else if (RCT2_GLOBAL(0x00F440B8, uint8) == 2) { ride_select_previous_section(); } sub_6C84CE();