/** * * rct2: 0x006CFF2D */ static void window_track_place_toolupdate(rct_window* w, rct_widgetindex widgetIndex, sint32 x, sint32 y) { sint16 mapX, mapY, mapZ; map_invalidate_map_selection_tiles(); gMapSelectFlags &= ~MAP_SELECT_FLAG_ENABLE; gMapSelectFlags &= ~MAP_SELECT_FLAG_ENABLE_CONSTRUCT; gMapSelectFlags &= ~MAP_SELECT_FLAG_ENABLE_ARROW; // Get the tool map position sub_68A15E(x, y, &mapX, &mapY, nullptr, nullptr); if (mapX == LOCATION_NULL) { window_track_place_clear_provisional(); return; } // Check if tool map position has changed since last update if (mapX == _window_track_place_last_x && mapY == _window_track_place_last_y) { place_virtual_track(_trackDesign, PTD_OPERATION_DRAW_OUTLINES, true, 0, mapX, mapY, 0); return; } money32 cost = MONEY32_UNDEFINED; // Get base Z position mapZ = window_track_place_get_base_z(mapX, mapY); if (game_is_not_paused() || gCheatsBuildInPauseMode) { window_track_place_clear_provisional(); // Try increasing Z until a feasible placement is found for (sint32 i = 0; i < 7; i++) { uint8 rideIndex; window_track_place_attempt_placement(_trackDesign, mapX, mapY, mapZ, 105, &cost, &rideIndex); if (cost != MONEY32_UNDEFINED) { _window_track_place_ride_index = rideIndex; _window_track_place_last_valid_x = mapX; _window_track_place_last_valid_y = mapY; _window_track_place_last_valid_z = mapZ; _window_track_place_last_was_valid = true; break; } mapZ += 8; } } _window_track_place_last_x = mapX; _window_track_place_last_y = mapY; if (cost != _window_track_place_last_cost) { _window_track_place_last_cost = cost; widget_invalidate(w, WIDX_PRICE); } place_virtual_track(_trackDesign, PTD_OPERATION_DRAW_OUTLINES, true, 0, mapX, mapY, mapZ); }
sint32 viewport_interaction_left_click(sint32 x, sint32 y) { viewport_interaction_info info; switch (viewport_interaction_get_item_left(x, y, &info)) { case VIEWPORT_INTERACTION_ITEM_SPRITE: switch (info.sprite->unknown.sprite_identifier) { case SPRITE_IDENTIFIER_VEHICLE: { auto intent = Intent(WD_VEHICLE); intent.putExtra(INTENT_EXTRA_VEHICLE, info.vehicle); context_open_intent(&intent); break; } case SPRITE_IDENTIFIER_PEEP: { auto intent = Intent(WC_PEEP); intent.putExtra(INTENT_EXTRA_PEEP, info.peep); context_open_intent(&intent); break; } case SPRITE_IDENTIFIER_MISC: if (game_is_not_paused()) { switch (info.sprite->unknown.misc_identifier) { case SPRITE_MISC_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); break; } } break; } return 1; case VIEWPORT_INTERACTION_ITEM_RIDE: { auto intent = Intent(WD_TRACK); intent.putExtra(INTENT_EXTRA_TILE_ELEMENT, info.tileElement); context_open_intent(&intent); return true; } case VIEWPORT_INTERACTION_ITEM_PARK: context_open_window(WC_PARK_INFORMATION); return 1; default: return 0; } }