## 15.x

### 15.0-beta2 (2025-04-13)

- Feature: Snow-covered rocks are now visible (#13627)
- Feature: Generate more rocks on steep slopes during map generation or heightmap import (#13462)
- Feature: Prevent towns from upgrading individually-placed houses (#13270)
- Feature: [Win32] Touchpad two-finger map scrolling (#13172)
- Feature: NewGRF Badges (#13073)
- Add: [NewGRF] Add road-/tram-/rail-type variable 0x45 to get mutual road-/tram-/rail-type on same tile (#13934)
- Add: [Script] Newer Cargo Classes (#13779)
- Add: Show hyperlink destination tooltips in text window (#13742)
- Add: [Script] Saving/loading ScriptList (#13556)
- Add: Press Ctrl to build diagonal canals in game mode (#13432)
- Add: Sandbox settings to Sandbox Options window (#13268)
- Add: Setting to allow placing houses manually in-game (#13266)
- Add: [Script] Event for when a company's president name changes (#13208)
- Add: Ability to toggle visibility of station signs by facility (#13207)
- Add: [Script] ScriptEventCompanyRename (#12878)
- Add: Ukrainian Hryvnia currency (#12877)
- Add: Convert 32bpp-only sprites to 8bpp when needed (#11602)
- Change: [Script] Start GS (but don't run it) when generating world in scenario editor (#13961)
- Change: Make tree placement at world generation look more organic (#13515)
- Change: [MacOS] Put the icon in a rounded rectangle (#13446)
- Change: [Script] GetWaypointID to return the StationID of any waypoint (#13407)
- Change: Draw company manager face jacket after collar (#13390)
- Change: Don't distinguish between bus and truck stops when removing them (#13384)
- Change: [Script] Rename BridgeID to BridgeType in the script API (#13352)
- Change: Add fonts document to help window (#13305)
- Change: Log changes to sandbox settings (#13267)
- Change: When player joins network company, use its name instead of number in chat (#13263)
- Change: [Win32] Draw window title bar according to current Windows light/dark theme (#13196)
- Change: Restore wider spacers in main toolbars (#12039)
- Fix: NewGRF Global variables 0D, 0E and 1E refer to wrong GRFFile (#13986)
- Fix #13980: Allow diagonal selection for road convert (#13983)
- Fix: Validate raw strings from game-scripts, and strip invalid and control characters (#13976)
- Fix: Capitalise "Disabled" for the "maximum non-sticky open windows" setting (#13975)
- Fix: Frame widget with label had incorrect spacing (#13967)
- Fix: StringFilter included quotes in the search and failed (#13965)
- Fix #13955: Make graphs respect RTL (#13957)
- Fix: Numbers were left-aligned for RTL languages in several windows (#13959)
- Fix: MayHaveRoad claimed rail station tiles had road, so the custom stationspec index would be read as roadtype (#13949)
- Fix: [Script] Prevent cloning of API instances (#13947)
- Fix: Reference to the correct section of the README, if a graphics or a sound set is incomplete (#13946)
- Fix: Draw the bevel around the music track name as inset (#13935)
- Fix #13923: Padding in music GUI was asymmetric, so it looked different for LTR and RTL languages (#13933)
- Fix #13928: BuildOilRig did not properly set airport rotation (#13929)
- Fix: SDL2 application name hint was not effective (#13926)
- Fix #13921: [Win32] Don't try close an already closed event handle during destruction (#13924)
- Fix #13921: Don't reject MIDI files with a valid file magic value (#13924)
- Fix #13912: Multitile buildings break apart in house picker (#13914)
- Fix #13908: Require double click on order to change stop location (#13913)
- Fix #13910: Invalidate content of house picker window if language is changed (#13911)
- Fix: [Script] Reset instance when changing running scripts in scenario editor (#13906)
- Fix: [Script] Only run the gamescript GameLoop() in-game (#13896)
- Fix #13893: Reversed all x-axis labels for company related and industry production graphs in wallclock mode (#13894)
- Fix #13842: Close industry production graph if industry is removed (#13890)
- Fix #11528: Starting autorail dragging from existing track tiles resulted in adding non-continuous tracks (#13885)
- Fix: Autoreplace rail/road list only listed buildable types (#13887)
- Fix: [NewGRF] Display an error, if NewGRF reference out-of-bounds string parameters in gender/plural choices (#13881)
- Fix #13849: Settings in old saves could be overridden by defaults (#13874)
- Fix #13562: Removed cost estimation message from money cheat (#13857)
- Fix: [NewGRF] Plurals and genders did not work in strings with cases or substrings (#13853, #13852)
- Fix: [NewGRF] String parameter stack and case selection were not processed for control code 0x81 (#13851)
- Fix #13839: Incorrect colour of first company legend in smallmap window (#13841)
- Fix: i circumflex width in TrueType small font (#13836)
- Fix: Don't show owner of non-existent road (#13824)
- Fix: Error message window timeout doesn't match setting (#13812)
- Fix #13795: Crash in vehicle list of 32-bit platforms (#13796)
- Fix: [Script] Company rename event sometimes had the wrong name (#13794)
- Fix: Improve manager face randomisation (#13776)
- Fix #13740: [Script] Handle implicit orders for jump orders (#13753)
- Fix #13749: Default service intervals were not updated when changing timekeeping unit (#13751)
- Fix #13725: Use proper query strings for changing timetable values (#13737)
- Fix #11226: Don't draw story page elements that won't be visible (#13736)
- Fix: More AI than max_no_competitors could start with competitors_interval=0 (#13670)
- Fix: League table window ignored the minimal size in its widget description (#13629)
- Fix: Incorrect snow density when making rocks snowy (#13626)
- Fix: NewGRF vehicles display loading sprites when not actually loading or unloading (#13554)
- Fix #12925: Prevent cost estimates for settings changes (#13550)
- Fix: [Script] Report errors happening during 'Load()' (#13537)
- Fix: [Script] Improve type checking of parameters (#13522)
- Fix: [Script] Don't set CommandCallback for asynchronous commands (#13501)
- Fix: Missing error messages with sell- and autoreplace-all commands (#13469)
- Fix: Too many trees when generating trees at same height (#13460)
- Fix #12912: Company inaugurated year in wallclock mode was not saved (#13448)
- Fix: [Script] Wrong return value for failed preconditions Vehicle::CloneVehicle (#13445)
- Fix #13140: Scale initial industry production estimate by cargo scale (#13427)
- Fix #13384: Crash when remove bus/truck stop tool used on road waypoints (#13391)
- Fix #12987: Historical houses now always spawn completed (#13332)
- Fix: [Win32] Font detection didn't work for locales not supporting code pages (#13306)
- Fix: Restore ability to disable service interval (#13281)
- Fix: Hide company settings from console commands (#13269)
- Fix: Disable service interval widgets for non-owned vehicles (#13260)
- Fix #13225: Cargo payment graph key toggled wrong data sets (#13226)
- Fix: Rail station tile flags were not set early enough (#13203)
- Fix #13199: -f command line parameter does not need a value (#13200)
- Fix: Missing water region invalidation after flooding a half tile with rail in the highest corner (#13047)
- Fix: Strip control codes before sorting NewGRF names (#13034)
- Fix #12968: Added back ability to create unremovable houses (#12989)
- Remove: Drop support for UCS2/UTF-16 encoded scripts (#13992)
- Remove: Support for SDL1.2 (#13298)


### 15.0-beta1 (2024-12-24)

- Feature: Town, industry and vehicle window zoom with mouse wheel (#12810, #12809, #12797)
- Feature: Show count of towns and industries in their directory window captions (#12800)
- Feature: Toggle for showing industry names in small map (#12770)
- Feature: Manually place town buildings in scenario editor (#12661, #12741)
- Feature: Filter new picker window by all classes, by used types, or by favourites (#12595)
- Feature: New picker window for rail and road stations, rail and road waypoints, and objects (#12595)
- Feature: Road waypoints (#12572)
- Feature: Allow base sounds set to be changed mid-game (#12399)
- Feature: Authorize specific clients to join network, company and remote console without password (#12337, #12326, #12329)
- Feature: Authenticate to the server without sending the password (#12323, #11878)
- Feature: Encrypt the connection between game server and client, and admin (#12300, #11878)
- Feature: Industry production/transported graph (#10541, #13083)
- Feature: Import town data from JSON file (#10409)
- Add: Implement 2D map scrolling under SDL2 (#13169)
- Add: [NewGRF] Callback for custom refit mask for engines/vehicles (#13090)
- Add: [NewGRF] Vehicle prop that allows refittability based on cargo class intersection (#13090)
- Add: Ability to show and filter different datasets on the same graph (#13083)
- Add: Show and toggle follow vehicle state in vehicle view window (#13076)
- Add: Set application name for SDL2 (#13061)
- Add: Support sound effects in Ogg Opus format (#13055)
- Add: Improving town-owned bridges increases company rating (#13036)
- Add: Apply rail/road type conversion when NewGRFs are updated mid-game (#13021)
- Add: Implement missing road type label conversion (#13021)
- Add: [NewGRF] Cargo class bits 13 and 14 now define potable and non-potable (#12979)
- Add: Overlay cargo icon in vehicle/depot list when holding shift+ctrl (#12938)
- Add: [Script] Include number of victims in ScriptEventVehicleCrashed (#12861)
- Add: [Console] Schedule command to execute a script file next in-game month (#12761)
- Add: Setting to disable warning for old vehicles (#12714)
- Add: Use macOS Game Mode identification (#12700)
- Add: Shade button to waypoint picker (#12682)
- Add: [NewGRF] Extended custom waypoint classes (#12653)
- Add: 'Get Content' buttons next to base set dropdowns in Game Options (#12627)
- Add: [NewGRF] Custom road waypoint support (#12572)
- Add: [NewGRF] Allow fixed layout up to 256 tiles per NewGRF rail station (#12554)
- Add: [NewGRF] Station property 1E, extended station tile flags (#12554)
- Add: [SDL2] Driver parameter 'no_mouse_capture' to ease interactive debugging (#12336)
- Add: Basic autocompletion on tab for console commands (#12163)
- Add: Portuguese Escudo currency (#12108)
- Change: Hide buttons in Found Town window that can't be used (#13182)
- Change: Include new cargo classes in dump cargo types console command (#13174)
- Change: Use floats for tracking 2D scrolling to improve smoothness (#13169)
- Change: Improve news window layouts (#13136, #13134)
- Change: Show company finances column if it has any values in it (#13112)
- Change: Treat recolour sprites as regular sprites in the SpriteCache (#13107)
- Change: Determine industry directory width only on visible rows (#13097)
- Change: Add sound memory usage to framerate window (#13055)
- Change: Invalidate build toolbars when NewGRFs are changed (#13046)
- Change: Don't try to flood buoys or dock tiles (#13013)
- Change: Store water tile flooding state in the map (#13013)
- Change: Exclude parent item from directory sort in FiosGetFileList (#12947)
- Change: [NewGRF] Place all 8 bits of station tile layout in var 40/41 (#12890)
- Change: [NewGRF] Install translation tables into overridden NewGRF (#12879)
- Change: [UI] Use scaled sprite sizes and correct matrix padding for content list (#12875)
- Change: [UI] Improved Network server list icon sizing and text positioning (#12874)
- Change: Path signals now show green on junction-less tracks by default (#12857)
- Change: Don't use house construction states in Scenario Editor (#12822)
- Change: Changing zoom no longer stops following vehicle (#12808)
- Change: Allow bribing local authority when other company has exclusive rights (#12763)
- Change: Position caret on left or right of glyph depending on language direction (#12760)
- Change: Do not automatically connect double depots with track (#12752)
- Change: Call custom house name callback in House Picker (#12741)
- Change: [NewGRF] Treat house max year 0xFFFF as MAX_YEAR (#12740)
- Change: [UI] Remove substitution of missing glyph with '?' glyph (#12736)
- Change: [UI] Use SetMinimalTextLines to set label height correctly (#12734)
- Change: Don't use house construction states in Scenario Editor (#12730)
- Change: Ignore min/max years for manual house placer (#12687)
- Change: Use default NewGRF cargo translation table if no custom table is provided (#12646)
- Change: Don't include midi file processing in dedicated server build (#12632)
- Change: [Linkgraph] Improve distance scaling algorithm in demand scaler (#12542)
- Change: Draw group hierarchy tree lines (#12522)
- Change: Display more useful information in sprite aligner than sprite ID (#12439)
- Change: Disallow using Action A to load sprites above the baseset unless reserved (#12435)
- Change: Use aspect ratios for some common widgets and buttons (#12386, #12636)
- Change: Show correct default value and unit for vehicle service interval setting (#12376)
- Change: Use per-company group numbers (#12297)
- Change: [NewGRF] Increase house type limit from 512 to 4096 (#12288)
- Change: Add dividers in vehicle group action dropdown (#12284)
- Change: Use same audio buffer size (and config parameter) for all sound drivers (#12227)
- Change: Allow rail and road depot overbuilding in current orientation in order to connect to rail or road (#12219)
- Change: Show tile index as decimal number in land info window (#12104)
- Change: Increase object/station/roadstop class limit (#12094)
- Change: Disable the insecure admin login by default; replaced by allow list (#11878)
- Fix: [NewGRF] New engines did not have a default cargo type set (#13146)
- Fix: String parameter not set when determining width of smallmap contour labels (#13145)
- Fix #13022: Ensure minimum size of scrollbar slider (#13119)
- Fix #13110: [Script] Convert table keys to string when generating JSON (#13113)
- Fix: Error message not set when unable load an old save (#13106)
- Fix: Network clients incorrectly truncated all strings to NETWORK_COMPANY_NAME_LENGTH (#13102)
- Fix: Don't allow right-click to close world generation progress window (#13084)
- Fix: VF_LOADING_FINISHED and VF_STOP_LOADING flags tested on wrong vehicle part (#13063)
- Fix: X-axis direction of industry production graph (#13062)
- Fix #13053: Payment transfers incorrect for non-passenger cargos (#13054)
- Fix: Invalid data used for height map curves after first run (#13039)
- Fix: SkipGarbage() skipped all multi-byte utf-8 characters (#13032)
- Fix: Don't invalidate water regions on the other side of the map (#13012)
- Fix: ScriptTile::PlantTreeRectangle does not check that the end tile is in bounds (#13004)
- Fix #12973: Don't exclude high score after using sandbox (#12999)
- Fix #12976: Incorrect widget rect scrolling for RTL languages (#12978)
- Fix: Crash when exiting game with end game window open (#12962)
- Fix #12957: 1-in-X proportion of towns being cities is unnecessarily random (#12960)
- Fix: ICUParagraphLayout line wrapping (#12956)
- Fix: Highscore/Endgame window can disappear offscreen if game window is resized (#12951)
- Fix #12940: Use specific error when overbuilding station on signals (#12943)
- Fix #12917: Write to negative array index for some string patterns (#12932)
- Fix: Incorrect truncation in string setting validation (#12924)
- Fix #12914: Fix use of invalidated pointer in viewport drawer (#12918)
- Fix: Train curve detection did not take shortened parts into account (#12910)
- Fix: DepotWindow::GetVehicleFromDepotWndPt not refreshing vehicle list (#12907)
- Fix: DupSprite did not copy the control_flags field (#12906)
- Fix: Excessively fast ships on aqueducts fail to move at correct speed (#12895)
- Fix: Timetable does not show vehicles as early (#12873)
- Fix #12856: Updating network settings does not invalidate data (#12858)
- Fix #12839: Truncated help text dialog on Windows (#12844)
- Fix #12832: Sanitise strings from NewGRF before logging them in Debug output (#12835)
- Fix #12825: Crash when opening road toolbar in scenario editor (#12826)
- Fix #12818: During Hostile Takeover, profit was calculated incorrectly (#12819)
- Fix: Apply widget's internal padding to scrollbar capacity/position (#12801)
- Fix #12365: Company Window now displays proper inauguration year and period while in wallclock mode (#12798)
- Fix #12787: Boostrap doesn't have main vindow (#12788)
- Fix #10239: Use elevated snow height for roads on flat foundations (#12776)
- Fix #12764: Crash when opening Detailed performance rating window with no companies (#12765)
- Fix: Water infrastructure total when changing owner of object on water or using DC_FORCE_CLEAR_TILE (#12757, #12729)
- Fix: Editbox behaved improperly with RTL languages (#12746)
- Fix #12283: Vehicle group dropdown shouldn't have default action (#12727)
- Fix: Reverse left/right keypress when editing RTL text (#12711, #12710)
- Fix: Crash if interface scale or font size changes with chat box present (#12705)
- Fix: Make progress bars obey language direction (#12704)
- Fix #12681: Abstract filetype not set for network client join savegames (#12701)
- Fix: Implement support for secure state coding on macOS (#12698)
- Fix: Add entitlements needed for plugins on macOS (#12697)
- Fix: Allow resolving house parent scope (town) of unbuilt houses (#12695)
- Fix #12685: Nullptr dereference when checking for equal loaded/loading groups (#12686)
- Fix: Unable to choose a font containing hyphen (#12684)
- Fix: [Timetable] Use days as precision in day mode for accurate timetable syncing (#12683)
- Fix #12550: Files were not saved in the right location when binary and configuration are in the same folder (#12679)
- Fix #12591: Give descriptive error when station construction fails due to wrong layout (#12678)
- Fix #12594: Give descriptive error when company takeover fails due to vehicle limit (#12676)
- Fix: Ensure revision mismatch also considers random debugging status (#12673)
- Fix #12411: [Admin] Send Network Welcome Packet to admin port after game creation completed WelcomeAll moved into NetworkOnGameStart (#12672)
- Fix: [MacOS] Memory leak in CoreTextFontCache (#12662)
- Fix: Use widget resize step instead of window resize step (#12659)
- Fix #12563: Race condition setting finish flag in WinHTTP (#12658)
- Fix #12648: Ensure all uses of std::filesystem::path use native encoding (#12650)
- Fix #12643: _is_water_region_valid is not cleared/reset in AllocateWaterRegions (#12649)
- Fix: Console command scrolling did not take account of padding and cursor width (#12642)
- Fix: Allow changing size of default OpenTTD font (#12641)
- Fix: Always allow setting company settings, company/president name/face (#12635)
- Fix: For GUI network servers, name the first company the same as any other company (#12629)
- Fix: Properly test for presence of waypoint in NewGRF resolver (#12579)
- Fix: Inconsistent space between console history and current line (#12528)
- Fix: Build industry window did not take width of count into account (#12476)
- Fix: Draw continuation lines for engine variant hierarchy tree (#12434)
- Fix: Viewport signs assume small font is smaller than normal font (#12422)
- Fix #11345: Use correct default button value for vehicle service interval setting (#12376)
- Fix #7982: Show existing coverage with unambiguous adjacent station (#12346)
- Fix: Off-by-one in EnsureVisibleCaption (#12261)
- Fix #11055: Make saveload failure error messages consistent with others (#12247)
- Fix: Train running sounds should only be produced for engine parts (#12229)
- Fix: Maximum permitted sound volume from NewGRF is 128 (#12222)
- Fix: Relocate main toolbar and statusbar before other windows (#12218)
- Fix: YAPF doesn't check destination for start nodes (#12217)
- Fix: Make link graph node borders scale with GUI (#12167)
- Fix #10490: Allow ships to exit depots if another is not moving at the exit point (#12161)
- Fix: Incorrect padding for text purchase list (#12160)
- Fix: GetNextDecisionNode ignored go to nearest depot when combined with stop at depot (#12130)
- Fix: Aircraft could route to hangars outside their range when stopping at them (#12130)
- Remove: Hidden setting for adjacent stations (#12862)
- Remove: Custom opendir implementation for Windows no longer needed (#12524)
- Remove: Company passwords; replaced by client allow lists (#12337)
- Remove: Autoclean_unprotected settings; all companies will be protected (#12337)
- Remove: NPF and pathfinder change settings (#12209)


