* * rct2: 0x006D2189 * ebx = ride_id * cost = edi */
| 1890 | * cost = edi |
| 1891 | */ |
| 1892 | static bool TrackDesignPlacePreview( |
| 1893 | TrackDesignState& tds, const TrackDesign& td, Ride** outRide, TrackDesignGameStateData& gameStateData, bool placeScenery) |
| 1894 | { |
| 1895 | *outRide = nullptr; |
| 1896 | gameStateData.flags = 0; |
| 1897 | |
| 1898 | auto& gameState = getGameState(); |
| 1899 | auto& objManager = GetContext()->GetObjectManager(); |
| 1900 | auto entry_index = objManager.GetLoadedObjectEntryIndex(td.trackAndVehicle.vehicleObject); |
| 1901 | |
| 1902 | RideId rideIndex; |
| 1903 | CommandFlags rideCreateFlags = { CommandFlag::apply, CommandFlag::allowDuringPaused, CommandFlag::noSpend }; |
| 1904 | if (TrackDesignCreateRide(td.trackAndVehicle.rtdIndex, entry_index, rideCreateFlags, &rideIndex) == kMoney64Undefined) |
| 1905 | { |
| 1906 | return false; |
| 1907 | } |
| 1908 | |
| 1909 | auto ride = GetRide(rideIndex); |
| 1910 | if (ride == nullptr) |
| 1911 | return false; |
| 1912 | |
| 1913 | ride->customName = {}; |
| 1914 | |
| 1915 | ride->entranceStyle = objManager.GetLoadedObjectEntryIndex(td.appearance.stationObjectIdentifier); |
| 1916 | if (ride->entranceStyle == kObjectEntryIndexNull) |
| 1917 | { |
| 1918 | ride->entranceStyle = gameState.lastEntranceStyle; |
| 1919 | } |
| 1920 | |
| 1921 | for (size_t i = 0; i < std::min(std::size(ride->trackColours), std::size(td.appearance.trackColours)); i++) |
| 1922 | { |
| 1923 | ride->trackColours[i] = td.appearance.trackColours[i]; |
| 1924 | } |
| 1925 | |
| 1926 | // Flat rides need their vehicle colours loaded for display |
| 1927 | // in the preview window |
| 1928 | if (!GetRideTypeDescriptor(td.trackAndVehicle.rtdIndex).flags.has(RtdFlag::hasTrack)) |
| 1929 | { |
| 1930 | for (size_t i = 0; i < std::size(ride->vehicleColours); i++) |
| 1931 | { |
| 1932 | ride->vehicleColours[i] = td.appearance.vehicleColours[i]; |
| 1933 | } |
| 1934 | } |
| 1935 | |
| 1936 | _trackDesignDrawingPreview = true; |
| 1937 | uint8_t backup_rotation = _currentTrackPieceDirection; |
| 1938 | uint32_t backup_park_flags = gameState.park.flags; |
| 1939 | gameState.park.flags &= ~PARK_FLAGS_FORBID_HIGH_CONSTRUCTION; |
| 1940 | auto mapSize = TileCoordsXY{ gameState.mapSize.x * 16, gameState.mapSize.y * 16 }; |
| 1941 | |
| 1942 | _currentTrackPieceDirection = 0; |
| 1943 | const CoordsXYZD coords = { mapSize.x, mapSize.y, kMinimumLandZ, _currentTrackPieceDirection }; |
| 1944 | const int32_t z = kMinimumLandZ + TrackDesignGetZPlacement(tds, td, RideGetTemporaryForPreview(), coords); |
| 1945 | |
| 1946 | if (tds.hasScenery) |
| 1947 | { |
| 1948 | gameStateData.setFlag(TrackDesignGameStateFlag::HasScenery, true); |
| 1949 | } |
no test coverage detected