Compare commits

...

1000 Commits

Author SHA1 Message Date
Peter Nelson e4620d5832 Doc: Update changelog for 16.0-beta2 (#15844) 2026-07-12 13:51:23 +01:00
translators cf48f866eb Update: Translations from eints
english (au): 6 changes by krysclarke
swedish: 20 changes by joeax910
chinese (traditional): 6 changes by KogentaSan
greek: 6 changes by gh658804
maori (new zealand): 10 changes by Kyle-McDangersword
portuguese: 6 changes by jcteotonio
portuguese (brazilian): 6 changes by pasantoro
polish: 4 changes by Rito13
2026-07-12 07:07:44 +00:00
Peter Nelson 3c30f962d4 Fix: Use meaningful tooltips for graph range toggle buttons (#15842)
Previously the tooltip only mentioned toggling the cargo, which is only correct for the cargo toggle buttons.
2026-07-11 13:51:01 +01:00
translators 3fb3006dff Update: Translations from eints
english (au): 4 changes by krysclarke
chinese (traditional): 4 changes by KogentaSan
english (us): 4 changes by 2TallTyler
greek: 4 changes by gh658804
russian: 4 changes by Ln-Wolf
danish: 15 changes by bscargo
portuguese: 4 changes by jcteotonio
portuguese (brazilian): 3 changes by pasantoro, 1 change by jcteotonio
2026-07-11 06:34:16 +00:00
Charles Pigott 0ab5b6df1b Feature: Increase maximum number of vehicles per type to 10,000 (#15810) 2026-07-10 12:11:36 +01:00
mmtunligit a961e64928 Add: Adding and removing whole classes to collections (#15808) 2026-07-10 06:54:50 -04:00
translators 9f8ac2aaa1 Update: Translations from eints
indonesian: 86 changes by q1t0
2026-07-10 07:59:11 +00:00
Rubidium 0c6de46b4c Codechange: unify logging of GrfIDs 2026-07-10 09:51:02 +02:00
Peter Nelson 83f20c3375 Doc: Changelog for 16.0-beta1 was missing Markdown formatting (#15840) 2026-07-10 00:00:53 +01:00
Peter Nelson 85e6f020f9 Change: Use "bridge ... too low" message for bridgeable objects (#15838) 2026-07-09 19:56:06 +01:00
Peter Nelson 83ce49f6cb Feature: Allow bridges over depots (#15836)
Depots are somewhat tall, so bridges must be at least 3 height levels above them.
2026-07-09 18:26:13 +01:00
translators 44b51a94c5 Update: Translations from eints
estonian: 417 changes by JooReb
2026-07-09 07:59:14 +00:00
Peter Nelson f5e4bd1ed7 Fix #15826: Exclude allow any/all options for AI companies (#15834) 2026-07-09 00:20:07 +00:00
Rubidium 5303aa6516 Codechange: use const for writing savegame data 2026-07-09 02:01:13 +02:00
Peter Nelson 5403257dca Codechange: Don't calculate bridge height difference twice (#15831) 2026-07-08 22:23:55 +01:00
Rubidium 05e596661e Codechange: move VarType constants into 'VarTypes' 2026-07-08 17:51:45 +02:00
Tyler Trahan e95f43a720 Codechange: Use sprite table instead of magic number when drawing ground sprite (#15828) 2026-07-08 08:46:21 -04:00
translators 51af63cc9f Update: Translations from eints
english (us): 4 changes by 2TallTyler
estonian: 182 changes by JooReb
maori (new zealand): 2 changes by Kyle-McDangersword
2026-07-08 06:45:25 +00:00
Cyprian Klimaszewski 8e89414d9e Codechange: Add regression tests for terraforming and its costs (#15820) 2026-07-07 16:19:14 -04:00
Tyler Trahan 24333d76a9 Codefix: Clean up rocky ground placement in Editor (#15819) 2026-07-07 16:17:19 -04:00
verbosecodes ac51eab537 Fix #7992: Fix for catenary road and tram catenary sprites not being drawn on bridges 2026-07-07 21:27:52 +02:00
translators 0f09b4b371 Update: Translations from eints
swedish: 8 changes by Brickblock1
korean: 3 changes by telk5093
maori (new zealand): 5 changes by Kyle-McDangersword
2026-07-07 07:58:44 +00:00
Rubidium bf7bb3efaf Codechange: add missing documentation 2026-07-06 16:41:08 +02:00
Rubidium 9ba2e386ac Codechange: use GrfID over uint32_t for NewGRF IDs 2026-07-06 16:41:08 +02:00
translators 21d9af637a Update: Translations from eints
swedish: 3 changes by Brickblock1
2026-07-06 08:46:35 +00:00
translators 788e112be1 Update: Translations from eints
english (au): 4 changes by krysclarke
swedish: 4 changes by Brickblock1
chinese (traditional): 5 changes by KogentaSan
greek: 4 changes by gh658804
russian: 1 change by Ln-Wolf
finnish: 4 changes by hpiirai
maori (new zealand): 16 changes by Kyle-McDangersword
portuguese: 4 changes by jcteotonio
portuguese (brazilian): 4 changes by pasantoro
polish: 4 changes by pAter-exe
2026-07-05 07:45:33 +00:00
translators bf70c61fb8 Update: Translations from eints
maori (new zealand): 24 changes by Kyle-McDangersword
2026-07-04 07:21:48 +00:00
livingBEEF c18b3a8a04 Fix traffic side inconsistencies (#15661)
* Update: change wording for driving side setting

* Fix: [NewGRF] Make 'signals on traffic side' consistent with explicit settings

Previously this TTDPatchFlag returned 'true' when the 'train signal side'
setting was 'road vehicle driving side'. Now it will also return 'true' when
both the settings are the same, i.e. both are 'left' or both are 'right'.
2026-07-03 08:21:23 -04:00
translators 8e08f1a3c5 Update: Translations from eints
hungarian: 1 change by vargaviktor
maori (new zealand): 14 changes by Kyle-McDangersword
2026-07-03 07:46:16 +00:00
Rubidium 8303b2d694 Codechange: document gamelog_internal.h 2026-07-02 14:40:52 +02:00
translators 4d7e1385f9 Update: Translations from eints
indonesian: 75 changes by q1t0
maori (new zealand): 11 changes by Kyle-McDangersword
2026-07-02 05:49:00 +00:00
Rubidium d2a3f52257 Codechange: improve documentation by removing unneeded constructors/operators 2026-07-01 21:05:56 +02:00
translators 01919af55b Update: Translations from eints
maori (new zealand): 68 changes by Kyle-McDangersword
2026-07-01 06:02:27 +00:00
translators 9c3f5bc375 Update: Translations from eints
indonesian: 29 changes by q1t0
2026-06-30 05:55:38 +00:00
Rubidium 0a9aa3d20b Codechange: make VarMemType scoped 2026-06-30 00:19:27 +02:00
Rubidium 8db7db5569 Codechange: make VarFileType scoped 2026-06-30 00:19:27 +02:00
Rubidium d9d7f441db Codechange: make SLRefType scoped 2026-06-30 00:19:27 +02:00
Rubidium 76265b8451 Codechange: replace SaveLoadFlags with StringValidationSettings 2026-06-29 23:33:13 +02:00
Rubidium 1310531139 Codechange: replace GetVarFileType with just direct member access 2026-06-29 19:56:06 +02:00
Rubidium 0bd12558d4 Codechange: replace GetVarMemType with just direct struct member access 2026-06-29 19:56:06 +02:00
Rubidium bdbe305771 Codechange: make SlVarSize, ReadValue and WriteValue use VarMemType 2026-06-29 19:56:06 +02:00
Rubidium 71ca79c6d5 Codechange: split up VarTypes in separate enumerations and recombine as struct 2026-06-29 19:56:06 +02:00
Rubidium afbe2d3070 Codechange: unify order of file and variable saveload configuration 2026-06-29 19:56:06 +02:00
Rubidium f72a239b97 Codechange: make SaveFileType clearly distinct from VarType 2026-06-29 19:56:06 +02:00
Rubidium df20fed464 Codechange: replace GRFBaseLanguages with an EnumBitSet 2026-06-29 09:09:28 +02:00
Rubidium af1e9864a0 Codechange: replace GRFExtendedLanguages with scoped enum GRFLanguage 2026-06-29 09:09:28 +02:00
Peter Nelson 3f557fb673 Codechange: make NeedLength a scoped enum. 2026-06-29 07:41:41 +01:00
Peter Nelson 36551ba6b5 Codechange: make SaveLoadAction a scoped enum 2026-06-29 07:41:25 +01:00
Peter Nelson 11f46bc5f4 Fix: explicitly initialize COM in Win32 video driver (#15553) 2026-06-29 07:40:03 +01:00
Peter Nelson 099df1054e Codechange: make TileContext a scoped enum 2026-06-29 07:35:19 +01:00
Peter Nelson d3d1de822d Codechange: make Action5BlockType a scoped enum 2026-06-29 07:30:02 +01:00
Rubidium ef0d26f9f7 Codechange: properly decode VarType to determine whether the maximum value fits in the type 2026-06-29 08:11:12 +02:00
Rubidium 8a8ece49ec Codechange: simplify/shrink SaveLoadCompat
Remove the unneeded null_type and change the name to std::string_view
2026-06-29 08:10:02 +02:00
Rubidium a01a2f8401 Codechange: remove essentially pointless 'shortcut values' 2026-06-29 08:09:31 +02:00
Rubidium d0dcd1b134 Codechange: use SLE_INT8 instead of SLE_CHAR 2026-06-29 08:09:31 +02:00
Rubidium a5430717b1 Codechange: prefer SLE_INT32 over SLE_INT 2026-06-29 08:09:31 +02:00
Rubidium c367b10bde Codechange: prefer SLE_UINT32 over SLE_UINT 2026-06-29 08:09:31 +02:00
Peter Nelson 2934eca24a Codechange: make TownCargoGenMode a scoped enum 2026-06-28 20:48:11 +01:00
Peter Nelson 02becd50c5 Codechange: make TownFounding a scoped enum 2026-06-28 20:48:11 +01:00
Peter Nelson 3ba0706a5c Codechange: make TownLayout a scoped enum 2026-06-28 20:48:11 +01:00
Peter Nelson 1acbb1c654 Codechange: make TownSize a scoped enum 2026-06-28 20:48:11 +01:00
Peter Nelson 6f6551c08d Codechange: Use general Alignment for intro game viewport commands 2026-06-28 20:43:36 +01:00
Peter Nelson b4d16d319f Codechange: Replace Alignment enum with struct
Alignment struct contains separate horizontal and vertical alignment members.
2026-06-28 20:43:36 +01:00
Peter Nelson 8e637cefed Codechange: Rename StringAlignment to Alignment
Alignment is also used things other than strings.
2026-06-28 20:43:36 +01:00
Peter Nelson 5923d105ec Revert: "Fix: [NewGRF] Ensure Act2 read error replaces current set id (#15782)" (#15795)
This reverts commit f9e6b8b7dd.
2026-06-28 19:35:09 +00:00
Rubidium a76ba0d3d4 Codechange: make ChunkType scoped 2026-06-28 21:07:12 +02:00
Rubidium b7d07252e7 Codechange: make SaveLoadType scoped 2026-06-28 19:26:21 +02:00
Rubidium f8af6bbc2f Codechange: make OpenGLSprite::Texture scoped 2026-06-28 19:25:45 +02:00
Rubidium 8b83bac31f Codechange: make SavegameType scoped 2026-06-28 17:49:19 +02:00
Peter Nelson b02242d5fc Codechange: make RandomizedSpriteGroupCompareMode a scoped enum 2026-06-28 16:21:01 +01:00
Peter Nelson 4344ffb7a0 Codechange: make DeterministicSpriteGroupAdjustOperation a scoped enum 2026-06-28 16:21:01 +01:00
Peter Nelson 4e9645e9d0 Codechange: make DeterministicSpriteGroupAdjustType a scoped enum 2026-06-28 16:21:01 +01:00
Peter Nelson 947767a2ff Codechange: make DeterministicSpriteGroupSize a scoped enum 2026-06-28 16:21:01 +01:00
Peter Nelson 4b93bd74ef Codechange: make VarSpriteGroupScope a scoped enum 2026-06-28 16:21:01 +01:00
Rubidium 061e5c9cd3 Codechange: use helper for common mappings using PerformanceElement::AI0 2026-06-28 16:55:28 +02:00
Rubidium 5b3b7995bb Codechange: make PerformanceElement scoped 2026-06-28 16:55:28 +02:00
Peter Nelson 3666eb23a1 Fix #15784: Do close and reopen road build toolbar when switching road tram types (#15789) 2026-06-28 07:08:13 +00:00
Peter Nelson f9e6b8b7dd Fix: [NewGRF] Ensure Act2 read error replaces current set id (#15782) 2026-06-28 08:07:09 +01:00
translators 2a6a65662d Update: Translations from eints
indonesian: 117 changes by q1t0
2026-06-28 05:59:00 +00:00
Peter Nelson b7e693ced6 Codechange: no need to pre-declare local variables (#15781) 2026-06-27 18:31:50 +01:00
rubidium42 b9986cdadf Change: upgrade emscripten from 3.1.57 to 6.0.1 (#15780) 2026-06-27 16:00:51 +01:00
Cyprian Klimaszewski dc87cd3d7a Codechange: Use more helper functions for slopes. (#15722) 2026-06-27 10:17:48 -04:00
Rubidium 8ca99f96ee Codechange: remove macros for SDLVkMapping 2026-06-27 16:14:27 +02:00
Rubidium 790a6903af Codechange: document several SDL members 2026-06-27 16:14:16 +02:00
mmtunligit 98dfc7376c Codechange: Split long single line loop to match #15589 2026-06-26 18:26:01 +02:00
Rubidium cc92e3d421 Codechange: make 32bpp blitter enumerations scoped 2026-06-26 17:33:15 +02:00
Rubidium 42fe1133ad Doc: make obvious what the numbers in SaveLoadVersion mean, especially in the generated doxygen 2026-06-26 13:04:33 +02:00
Rubidium fc0ad4bb0a Codechange: remove unneeded spaces 2026-06-26 13:04:33 +02:00
Rubidium 5bb87d39b7 Codechange: make SaveLoadVersion a scoped enum 2026-06-26 13:04:33 +02:00
translators f8ad1a4999 Update: Translations from eints
polish: 17 changes by pAter-exe
2026-06-26 05:55:39 +00:00
Rubidium f0a1b507fe Codechange: make ClientID a scoped enumeration 2026-06-26 06:26:52 +02:00
Rubidium 2f4ae80226 Codechange: use ClientID for the 'user' of OrderBackup 2026-06-25 23:57:45 +02:00
Peter Nelson 11e713ce9a Add: Station list can be filtered by name (#15772) 2026-06-25 22:28:21 +01:00
Peter Nelson c77a363d68 Doc: update changelog (#15673) 2026-06-25 08:16:08 -04:00
Peter Nelson a713b15183 Codefix: No need to cast a TextColour to TextColour (#15770) 2026-06-25 09:16:04 +01:00
translators 7c4781c333 Update: Translations from eints
maori (new zealand): 10 changes by Kyle-McDangersword
2026-06-25 05:53:11 +00:00
translators 69dce301e7 Update: Translations from eints
polish: 1 change by pAter-exe
2026-06-24 05:52:40 +00:00
mmtunligit 1a00026929 Change: selecting Rail/Roadtype updates build toolbar instead of closing and reopening (#15589) 2026-06-23 22:31:54 +00:00
rubidium42 578ec33556 Codechange: use proper names for SLV_145 - SLV_198 (#15767)
* Codechange: rename SLV_145 to SLV_NEWGRF_AIRPORT_SMOKE
* Codechange: rename SLV_146 to SLV_UNIFY_WATER_CLASS
* Codechange: rename SLV_147 to SLV_UNIFY_ANIMATION_FRAME
* Codechange: rename SLV_148 to SLV_INDUSTRY_PLATFORM
* Codechange: rename SLV_149 to SLV_CUSTOM_SEA_LEVEL
* Codechange: rename SLV_150 to SLV_FRACTIONAL_CARGO_DELIVERY
* Codechange: rename SLV_151 to SLV_STORE_NEWGRF_VERSION
* Codechange: rename SLV_152 to SLV_INDUSTRY_MANAGEMENT
* Codechange: rename SLV_153 to SLV_LEAVE_ROAD_STOP_SEPARATELY
* Codechange: rename SLV_154 to SLV_PAUSE_LEVEL
* Codechange: rename SLV_155 to SLV_NEWGRF_OBJECT_VIEW
* Codechange: rename SLV_156 to SLV_TERRAFORM_LIMITS
* Codechange: rename SLV_157 to SLV_UNIFY_GROUND_VEHICLES
* Codechange: rename SLV_158 to SLV_TRACK_REAL_AND_AUTO_ORDERS
* Codechange: rename SLV_159 to SLV_MAX_LENGTH_AND_REVERSE_SIGNALS
* Codechange: rename SLV_160 to SLV_DISALLOW_ROAD_RECONSTRUCTION
* Codechange: rename SLV_161 to SLV_PERSISTENT_STORAGE_POOL
* Codechange: rename SLV_162 to SLV_NEWGRF_CUSTOM_CARGO_AGING
* Codechange: rename SLV_163 to SLV_RIVERS
* Codechange: rename SLV_164 to SLV_VEHICLE_CENTRE_AND_Z_POS
* Codechange: rename SLV_165 to SLV_SCRIPT_TOWN_GROWTH
* Codechange: rename SLV_166 to SLV_INFRASTRUCTURE_MAINTENANCE_COSTS
* Codechange: rename SLV_167 to SLV_NEWGRF_AIRCRAFT_RANGE
* Codechange: rename SLV_168 to SLV_SCRIPT_TOWN_TEXT
* Codechange: rename SLV_169 to SLV_MOVE_SCC_ENCODED
* Codechange: rename SLV_170 to SLV_COUNT_INDIVIDUAL_CARGOES
* Codechange: rename SLV_171 to SLV_SCENARIO_DEITY_SIGNS
* Codechange: rename SLV_172 to SLV_ORDER_MAX_SPEED
* Codechange: rename SLV_173 to SLV_FIX_ROAD_OWNERSHIP
* Codechange: rename SLV_174 to SLV_CURRENT_ORDER_MAX_SPEED
* Codechange: rename SLV_175 to SLV_AUTOREPLACE_WHEN_OLD_TREE_LIMIT
* Codechange: rename SLV_176 to SLV_BACKUP_ORDER_STATE
* Codechange: rename SLV_177 to SLV_MONTHLY_BANKRUPTCY_CHECK
* Codechange: rename SLV_178 to SLV_SCRIPT_SETTINGS_PROFILE
* Codechange: rename SLV_179 to SLV_ROBUST_ENGINE_PREVIEW
* Codechange: rename SLV_180 to SLV_SERVICE_INTERVAL_PERCENT
* Codechange: rename SLV_181 to SLV_CARGO_RESERVATION
* Codechange: rename SLV_182 to SLV_GOAL_PROGRESS_PLANE_ACCELERATION
* Codechange: rename SLV_183 to SLV_CARGODIST
* Codechange: rename SLV_184 to SLV_SEPARATE_LOCALE_UNITS
* Codechange: rename SLV_185 to SLV_STORYBOOKS
* Codechange: rename SLV_186 to SLV_OBJECT_TYPE_TO_POOL
* Codechange: rename SLV_187 to SLV_LINKGRAPH_RESTRICTED_FLOW
* Codechange: rename SLV_188 to SLV_UNIFY_RV_TRAVEL_TIME
* Codechange: rename SLV_189 to SLV_GROUP_HIERARCHY
* Codechange: rename SLV_190 to SLV_SEPARATE_ORDER_TRAVEL_WAIT_TIME
* Codechange: rename SLV_191 to SLV_LINKGRAPH_LOCATION_DISASTER_STORE
* Codechange: rename SLV_192 to SLV_FIX_ORDER_BACKUP
* Codechange: rename SLV_193 to SLV_HIDE_ENGINES_FOR_COMPANY
* Codechange: rename SLV_194 to SLV_MAX_BRIDGE_MAP_HEIGHT
* Codechange: rename SLV_195 to SLV_DISTINGUISH_1_6
* Codechange: rename SLV_196 to SLV_DISTINGUISH_1_7
* Codechange: rename SLV_197 to SLV_STORE_MAP_VARIETY
* Codechange: rename SLV_198 to SLV_TOWN_GROWTH_IN_GAME_TICKS
2026-06-23 22:01:31 +00:00
rubidium42 0833396cdf Codechange: use proper names for SLV_115 - SLV_144 (#15766)
* Codechange: rename SLV_115 to SLV_CUSTOM_TOWN_NUMBER
* Codechange: rename SLV_116 to SLV_GAMELOG_EMERGENCY
* Codechange: rename SLV_117 to SLV_PLATFORM_STOP_LOCATION
* Codechange: rename SLV_118 to SLV_DIGIT_GROUP_SEPARATOR
* Codechange: rename SLV_119 to SLV_PAUSE_MODES
* Codechange: rename SLV_120 to SLV_COMPANY_SERVICE_INTERVALS
* Codechange: rename SLV_121 to SLV_CARGO_PAYMENTS
* Codechange: rename SLV_122 to SLV_WAYPOINT_MORE_LIKE_STATION
* Codechange: rename SLV_123 to SLV_UNIFY_WAYPOINT_AND_STATION
* Codechange: rename SLV_124 to SLV_MULTI_TILE_WAYPOINTS
* Codechange: rename SLV_125 to SLV_REMOVE_SUBSIDY_STATION_BINDING
* Codechange: rename SLV_126 to SLV_CUMULATED_INFLATION
* Codechange: rename SLV_127 to SLV_TOWN_ACCEPTANCE
* Codechange: rename SLV_128 to SLV_FOUND_TOWN
* Codechange: rename SLV_129 to SLV_TIMETABLE_START
* Codechange: rename SLV_130 to SLV_ROAD_STOP_OCCUPANCY_PENALTY
* Codechange: rename SLV_131 to SLV_MAXIMUM_DEPOT_PENALTY
* Codechange: rename SLV_132 to SLV_DISALLOW_TREE_BUILDING
* Codechange: rename SLV_133 to SLV_TRAIN_SLOPE_STEEPNESS
* Codechange: rename SLV_134 to SLV_VIRTUAL_FEEDER_SHARE_PAYMENT
* Codechange: rename SLV_135 to SLV_ROCKS_STAY_UNDER_SNOW
* Codechange: rename SLV_136 to SLV_SPLIT_LOAD_WAIT_COUNTERS
* Codechange: rename SLV_137 to SLV_AIRPORT_ANIMATION_FRAMES
* Codechange: rename SLV_138 to SLV_REDUCE_PLANE_CRASHES
* Codechange: rename SLV_139 to SLV_RV_REALISTIC_ACCELERATION
* Codechange: rename SLV_140 to SLV_STORE_AIRPORT_SIZE
* Codechange: rename SLV_141 to SLV_UNIQUE_DEPOT_NAMES
* Codechange: rename SLV_142 to SLV_NEWGRF_DEPOT_BUILD_DATE
* Codechange: rename SLV_143 to SLV_DISABLE_TOWN_LEVEL_CROSSING
* Codechange: rename SLV_144 to SLV_REORDER_UNMOVABLE_REMOVE_RESERVED
2026-06-23 23:17:14 +02:00
rubidium42 2a5607d373 Codechange: use proper names for SLV_90 - SLV_114 (#15765)
* Codechange: rename SLV_90 to SLV_PLANE_SPEED_FACTOR
* Codechange: rename SLV_91 to SLV_MORE_HOUSE_ANIMATION_FRAMES
* Codechange: rename SLV_92 to SLV_REMOVE_HOUSE_COUNT
* Codechange: rename SLV_93 to SLV_IMPROVED_ORDERS
* Codechange: rename SLV_94 to SLV_FIX_COMPANY_CARGO_TYPES
* Codechange: rename SLV_95 to SLV_MORE_ENGINE_TYPES
* Codechange: rename SLV_96 to SLV_AIRPORT_NOISE
* Codechange: rename SLV_97 to SLV_MERGE_OPTS_PATS
* Codechange: rename SLV_98 to SLV_GAMELOG
* Codechange: rename SLV_99 to SLV_INDUSTRY_TILE_WATER_CLASS
* Codechange: rename SLV_100 to SLV_YAPP
* Codechange: rename SLV_101 to SLV_NEWGRF_PALETTE
* Codechange: rename SLV_102 to SLV_SPREAD_INDUSTRY_PRODUCTION_CHANGES
* Codechange: rename SLV_103 to SLV_NEWGRF_SUPPLIED_STATION_NAME
* Codechange: rename SLV_104 to SLV_MORE_COMPANIES
* Codechange: rename SLV_105 to SLV_ORDER_LIST
* Codechange: rename SLV_106 to SLV_DISTANT_STATION_JOINING
* Codechange: rename SLV_107 to SLV_NOAI
* Codechange: rename SLV_108 to SLV_STORE_AI_VERSION
* Codechange: rename SLV_109 to SLV_NEXT_COMPETITOR_START_OVERFLOW
* Codechange: rename SLV_110 to SLV_REMOVE_OLD_AI_SETTINGS
* Codechange: rename SLV_111 to SLV_FREEFORM_EDGES
* Codechange: rename SLV_112 to SLV_SPLIT_HQ
* Codechange: rename SLV_113 to SLV_ROAD_LAYOUT_PER_TOWN
* Codechange: rename SLV_114 to SLV_SEPARATE_ROAD_OWNERS
2026-06-23 13:56:17 +02:00
translators ba9d673518 Update: Translations from eints
maori (new zealand): 19 changes by Kyle-McDangersword
2026-06-23 05:52:57 +00:00
rubidium42 23b3efdae8 Codechange: use proper names for SLV_65 - SLV_89 (#15764)
* Codechange: rename SLV_65 to SLV_UNIFY_CURRENCY
* Codechange: rename SLV_66 to SLV_NEWGRF_TOWN_NAMES
* Codechange: rename SLV_67 to SLV_TIMETABLES
* Codechange: rename SLV_68 to SLV_CARGO_PACKETS
* Codechange: rename SLV_69 to SLV_MORE_CARGO_PACKETS
* Codechange: rename SLV_70 to SLV_CARGO_PAYMENT_OVERFLOW
* Codechange: rename SLV_71 to SLV_UNGROUPED_VEHICLES
* Codechange: rename SLV_72 to SLV_SPLIT_STATION_TYPE_FROM_GFXID
* Codechange: rename SLV_73 to SLV_NEWGRF_INDUSTRY_LAYOUT
* Codechange: rename SLV_74 to SLV_FIX_STATION_PICKUP_ACCOUNTING
* Codechange: rename SLV_75 to SLV_AUTOSLOPE
* Codechange: rename SLV_76 to SLV_NEWGRF_PERSISTENT_STORAGE
* Codechange: rename SLV_77 to SLV_CLEANUP_UNCONNECTED_ROADS
* Codechange: rename SLV_78 to SLV_STORE_INDUSTRY_CARGO
* Codechange: rename SLV_79 to SLV_FAIR_PLAY_SETTINGS
* Codechange: rename SLV_80 to SLV_NEWGRF_MORE_ANIMATION
* Codechange: rename SLV_81 to SLV_FIX_TREE_GROUND
* Codechange: rename SLV_82 to SLV_NEWGRF_INDUSTRY_RANDOM_TRIGGERS
* Codechange: rename SLV_83 to SLV_DEPOT_WATER_OWNERS
* Codechange: rename SLV_84 to SLV_REPLACE_CUSTOM_NAME_ARRAY
* Codechange: rename SLV_85 to SLV_MAGLEV_MONORAIL_PAX_WAGON_LIVERY
* Codechange: rename SLV_86 to SLV_WATER_CLASS
* Codechange: rename SLV_87 to SLV_SIMPLIFY_PATHFINDER_SETTINGS
* Codechange: rename SLV_88 to SLV_FRACTION_PROFIT_RUNNING_TICKS
* Codechange: rename SLV_89 to SLV_MORE_WAYPOINTS_PER_TOWN
2026-06-23 06:53:27 +02:00
rubidium42 3763e338c0 Codechange: use proper names for SLV_40 - SLV_64 (#15763)
* Codechange: rename SLV_40 to SLV_GRADUAL_LOADING
* Codechange: rename SLV_41 to SLV_NEWGRF_SETTINGS
* Codechange: rename SLV_42 to SLV_BRIDGE_WORMHOLE
* Codechange: rename SLV_43 to SLV_UNIFY_ANIMATION_STATE
* Codechange: rename SLV_44 to SLV_CARGO_SOURCE_TILE
* Codechange: rename SLV_45 to SLV_COUNT_PAID_FOR_CARGO
* Codechange: rename SLV_46 to SLV_MORE_AIRPORT_BLOCKS
* Codechange: rename SLV_47 to SLV_DRIVE_THROUGH_ROAD_STOPS
* Codechange: rename SLV_48 to SLV_RAIL_TRACK_TYPE_UNIFICATION
* Codechange: rename SLV_49 to SLV_SIMPLIFY_PLAYER_FACE
* Codechange: rename SLV_50 to SLV_AIRCRAFT_SPEED_HOLDING
* Codechange: rename SLV_51 to SLV_FEEDER_SHARE
* Codechange: rename SLV_52 to SLV_STATUE_OWNER
* Codechange: rename SLV_53 to SLV_NEWGRF_HOUSES
* Codechange: rename SLV_54 to SLV_TOWN_GROWTH_CONTROL
* Codechange: rename SLV_55 to SLV_NEWGRF_CARGO
* Codechange: rename SLV_56 to SLV_CITIES
* Codechange: rename SLV_57 to SLV_FIFO_LOADING
* Codechange: rename SLV_58 to SLV_VERY_LOW_TOWN_INDUSTRY_NUMBER
* Codechange: rename SLV_59 to SLV_TOWN_LAYOUT
* Codechange: rename SLV_60 to SLV_VEHICLE_GROUPS
* Codechange: rename SLV_61 to SLV_MULTIPLE_ROAD_TYPES
* Codechange: rename SLV_62 to SLV_ADJACENT_STATIONS
* Codechange: rename SLV_63 to SLV_TRAM_LIVERY
* Codechange: rename SLV_64 to SLV_MULTIPLE_SIGNAL_TYPES
2026-06-22 16:08:18 +02:00
rubidium42 366ec786f1 Codechange: use proper names for SLV_20 - SLV_39 (#15762)
* Codechange: rename SLV_20 to SLV_NO_MULTIHEAD_REFERENCE
* Codechange: rename SLV_21 to SLV_REMOVE_OLD_PBS
* Codechange: rename SLV_22 to SLV_SAVE_PATCHES
* Codechange: rename SLV_23 to SLV_REMOVE_AUTOSAVE_INTERVAL
* Codechange: rename SLV_24 to SLV_ELRAIL
* Codechange: rename SLV_25 to SLV_IMPROVE_MULTISTOP
* Codechange: rename SLV_26 to SLV_LAST_VEHICLE_TYPE
* Codechange: rename SLV_27 to SLV_NEWGRF_STATIONS
* Codechange: rename SLV_28 to SLV_YAPF
* Codechange: rename SLV_29 to SLV_MORE_UNDER_BRIDGES
* Codechange: rename SLV_30 to SLV_TGP
* Codechange: rename SLV_31 to SLV_BIG_DATES
* Codechange: rename SLV_32 to SLV_LINK_FARM_FIELD_TO_INDUSTRY
* Codechange: rename SLV_33 to SLV_SAVE_YAPF_SETTINGS
* Codechange: rename SLV_34 to SLV_LIVERIES
* Codechange: rename SLV_35 to SLV_LIVERY_REFIT
* Codechange: rename SLV_36 to SLV_REFIT_ORDERS
* Codechange: rename SLV_37 to SLV_UTF8
* Codechange: rename SLV_38 to SLV_DISABLE_ELRAIL_SETTING
* Codechange: rename SLV_39 to SLV_FREIGHT_WEIGHT
2026-06-22 12:57:49 +00:00
Rito12 e763d1b2ec Cleanup: Remove duplicated doxygen comment for ShowMacDialog. 2026-06-22 12:02:36 +02:00
Rito12 fa6152d91f Update: doxygen version to 1.17.0. 2026-06-22 12:02:36 +02:00
Cyprian Klimaszewski 1a59742990 Codechange: Create cursor_sprites doxygen group from comments 2026-06-22 12:02:09 +02:00
Cyprian Klimaszewski 867326094a Codechange: Create water_sprites doxygen group from comments 2026-06-22 12:02:09 +02:00
Cyprian Klimaszewski 27d2792ef0 Codechange: Create rail_sprites doxygen group from comments 2026-06-22 12:02:09 +02:00
Cyprian Klimaszewski a1d6ac57e2 Codechange: Create bridge_type_sprites doxygen group from comments 2026-06-22 12:02:09 +02:00
Cyprian Klimaszewski 03a6767874 Codechange: Create doxygen disaster_sprites group from comments 2026-06-22 12:02:09 +02:00
Cyprian Klimaszewski 3e166ca4d0 Codechange: Create doxygen town_house_sprites group from comments 2026-06-22 12:02:09 +02:00
Cyprian Klimaszewski 20c25df71e Codechange: Make comments for multiple sprites doxygen ones 2026-06-22 12:02:09 +02:00
Cyprian Klimaszewski 4bcdc09934 Codechange: Make comments for single sprites doxygen ones 2026-06-22 12:02:09 +02:00
Cyprian Klimaszewski 0766bed833 Codechange: use named functions for RoadBits in LookupWithBuildOnSlopes. 2026-06-22 12:01:42 +02:00
Cyprian Klimaszewski af51914427 Codechange: remove base_slopes lookup table from LookupWithBuildOnSlopes. 2026-06-22 12:01:42 +02:00
Peter Nelson f7d17082d1 Codechange: make GamelogChangeType a scoped enum 2026-06-22 11:59:51 +02:00
Peter Nelson 50847bf88e Codechange: make GamelogActionType a scoped enum 2026-06-22 11:59:51 +02:00
Peter Nelson a55bd4e041 Codechange: make TransportType a scoped enum 2026-06-22 11:59:24 +02:00
translators 26e5e38761 Update: Translations from eints
indonesian: 84 changes by q1t0
maori (new zealand): 3 changes by Kyle-McDangersword
2026-06-22 06:19:05 +00:00
rubidium42 d81eefcdc8 Codechange: use proper names for SLV_1 - SLV_19 (#15750)
* Codechange: rename SLV_1 to SLV_BIG_CURRENCY
* Codechange: rename SLV_2 to SLV_VEHICLE_CURRENCY_STATION_CHANGES
* Codechange: rename SLV_3 to SLV_BIGGER_STATION_VARIABLES
* Codechange: rename SLV_4 to SLV_TOWN_TOLERANCE_PAUSE_MODE
* Codechange: rename SLV_5 to SLV_BIG_MAP
* Codechange: rename SLV_6 to SLV_MULTIPLE_ROAD_STOPS
* Codechange: rename SLV_7 to SLV_LARGER_CARGO_SOURCE
* Codechange: rename SLV_8 to SLV_LARGER_UNIT_NUMBER
* Codechange: rename SLV_9 to SLV_LARGER_TOWN_CARGO_STATISTICS
* Codechange: rename SLV_10 to SLV_LARGER_TOWN_COUNTER
* Codechange: rename SLV_11 to SLV_LARGER_TOWN_ITERATOR
* Codechange: rename SLV_12 to SLV_LINK_WAYPOINT_TO_TOWN
* Codechange: rename SLV_13 to SLV_LARGER_AI_STATE_COUNTER
* Codechange: rename SLV_14 to SLV_TRANSFER_ORDER
* Codechange: rename SLV_15 to SLV_MOVE_SEMAPHORE_BITS
* Codechange: rename SLV_16 to SLV_ENGINE_RENEW
* Codechange: rename SLV_17 to SLV_STORE_WAYPOINT_ID_IN_MAP
* Codechange: rename SLV_18 to SLV_REMOVE_MINOR_VERSION
* Codechange: rename SLV_19 to SLV_ENGINE_RENEW_POOL
2026-06-21 19:27:53 +02:00
Rubidium ec727fe440 Codechange: make ViewportScrollTarget scoped 2026-06-21 18:10:27 +02:00
Rubidium 32f9e4df6c Codechange: make Currency scoped 2026-06-21 17:14:53 +02:00
Peter Nelson 2ca3623670 Codechange: make PlaylistChoice a scoped enum (#15758) 2026-06-21 15:14:38 +01:00
Rubidium 8b49441b6b Codechange: make currency setting field use Currency enumeration 2026-06-21 16:06:17 +02:00
Rubidium 487971bffb Codechange: use Currency for GetNewgrfCurrencyIdConverted 2026-06-21 16:06:17 +02:00
Peter Nelson 495bc37dc3 Codechange: extract function to look up fontsize by name (#15760) 2026-06-21 12:50:44 +00:00
Peter Nelson 1f0fd6dfab Codechange: make AccelerationModel a scoped enum (#15757) 2026-06-21 10:01:34 +01:00
Peter Nelson 9f49ea4177 Codechange: make EngineImageType a scoped enum (#15755) 2026-06-21 08:05:41 +00:00
Peter Nelson a57eb70e05 Codechange: make GroundVehicleFlag(s) a scoped enum/EnumBitSet (#15754) 2026-06-21 08:50:45 +01:00
Rubidium 7bd9fbc733 Codechange: make VehicleListType scoped 2026-06-21 09:31:42 +02:00
translators 720d10536d Update: Translations from eints
chinese (traditional): 2 changes by KogentaSan
vietnamese: 1 change by KhoiCanDev
2026-06-21 06:14:44 +00:00
Peter Nelson 71536313ba Codechange: make LevelMode a scoped enum (#15753) 2026-06-20 23:44:57 +01:00
Rubidium 437d93b6fc Codechange: replace symbol_pos magic numbers with scoped enum and EnumBitSet 2026-06-20 23:17:00 +02:00
Rubidium 5756bcc721 Codechange: use EnumBitSet for mask of currencies 2026-06-20 17:37:12 +02:00
Rubidium bf67ba9a3b Codechange: rename Currencies to Currency 2026-06-20 17:37:12 +02:00
Loïc Guilloux 3efe107a6f Fix #15742, c9cf141: unexpected pylons and catenary on shared diagonal tiles (#15748) 2026-06-20 14:22:11 +02:00
translators 27e8312d21 Update: Translations from eints
chinese (traditional): 6 changes by KogentaSan
maori (new zealand): 1 change by Kyle-McDangersword
2026-06-20 05:59:36 +00:00
translators 4a4ed2da22 Update: Translations from eints
maori (new zealand): 26 changes by Kyle-McDangersword
2026-06-19 06:17:42 +00:00
Rubidium 3b8b089dd4 Codechange: split currency.h to _type.h and _func.h 2026-06-18 19:32:16 +02:00
translators 45065fb6d5 Update: Translations from eints
indonesian: 17 changes by q1t0
latvian: 7 changes by lexuslatvia
2026-06-18 06:10:21 +00:00
Cyprian Klimaszewski 9e85e23cbc Codefix 21bee91: Doxygen copied documentation wrongly (#15739) 2026-06-17 11:39:25 -04:00
Peter Nelson b2c9e33e0f Codechange: make FoundationPart a scoped enum (#15738) 2026-06-17 07:55:04 +01:00
Peter Nelson 10cad52ebb Codechange: make SpriteCombineMode a scoped enum (#15737) 2026-06-17 07:54:40 +01:00
Peter Nelson 185e942b44 Codechange: make TileHighlightType a scoped enum (#15736) 2026-06-17 07:54:21 +01:00
translators fdc5ef30de Update: Translations from eints
chinese (simplified): 1 change by wensimehrp
korean: 1 change by telk5093
indonesian: 180 changes by q1t0
finnish: 1 change by hpiirai
maori (new zealand): 18 changes by Kyle-McDangersword
2026-06-17 06:16:42 +00:00
Rubidium 3fc52e758d Codechange: make GraphicsFileType scoped 2026-06-17 05:32:58 +02:00
Rubidium 33ae037aaa Codechange: make SpecialMouseMode scoped 2026-06-17 05:32:34 +02:00
Tyler Trahan 3aa3113033 Change: Default setting to review orders excludes stopped vehicles (#15565) 2026-06-16 14:49:12 -04:00
Peter Nelson f8c8fedad7 Codefix: avoid mixing C and C++ style arrays 2026-06-16 19:11:38 +02:00
mmtunligit 2d5c1a9af8 Codechange: Build rail station highlight updates only as needed 2026-06-16 19:11:25 +02:00
dependabot[bot] d938292243 Upgrade: Bump the actions group across 1 directory with 4 updates
Bumps the actions group with 4 updates in the / directory: [actions/upload-artifact](https://github.com/actions/upload-artifact), [actions/download-artifact](https://github.com/actions/download-artifact), [Apple-Actions/import-codesign-certs](https://github.com/apple-actions/import-codesign-certs) and [microsoft/microsoft-store-apppublisher](https://github.com/microsoft/microsoft-store-apppublisher).


Updates `actions/upload-artifact` from 6 to 7
- [Release notes](https://github.com/actions/upload-artifact/releases)
- [Commits](https://github.com/actions/upload-artifact/compare/v6...v7)

Updates `actions/download-artifact` from 6 to 8
- [Release notes](https://github.com/actions/download-artifact/releases)
- [Commits](https://github.com/actions/download-artifact/compare/v6...v8)

Updates `Apple-Actions/import-codesign-certs` from 6 to 7
- [Release notes](https://github.com/apple-actions/import-codesign-certs/releases)
- [Commits](https://github.com/apple-actions/import-codesign-certs/compare/v6...v7)

Updates `microsoft/microsoft-store-apppublisher` from 1.1 to 1.3
- [Release notes](https://github.com/microsoft/microsoft-store-apppublisher/releases)
- [Commits](https://github.com/microsoft/microsoft-store-apppublisher/compare/v1.1...v1.3)

---
updated-dependencies:
- dependency-name: actions/upload-artifact
  dependency-version: '7'
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: actions
- dependency-name: actions/download-artifact
  dependency-version: '8'
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: actions
- dependency-name: Apple-Actions/import-codesign-certs
  dependency-version: '7'
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: actions
- dependency-name: microsoft/microsoft-store-apppublisher
  dependency-version: '1.3'
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: actions
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-06-16 19:08:26 +02:00
translators 34a419ca24 Update: Translations from eints
swedish: 6 changes by joeax910
maori (new zealand): 7 changes by Kyle-McDangersword
2026-06-16 06:20:22 +00:00
Rubidium 04c1af9902 Codechange: make NIType a scoped enum 2026-06-16 07:03:32 +02:00
Rubidium c76cfc7dfb Codechange: make TextEffectMode scoped 2026-06-16 07:03:10 +02:00
Peter Nelson f0ce749025 Codechange: make ZoomLevelChange a scoped enum (#15726) 2026-06-15 20:22:01 +01:00
Rubidium 5a6469ad6f Codechange: make EventState a scoped enum 2026-06-15 11:20:52 +02:00
translators 2df98643ad Update: Translations from eints
indonesian: 121 changes by q1t0
2026-06-15 06:19:04 +00:00
Rubidium 760cd803c5 Codechange: make TooltipCloseCondition scoped 2026-06-14 21:27:32 +02:00
Peter Nelson 52793c0e8b Codechange: make SmallMapType a scoped enum (#15721) 2026-06-14 19:35:23 +01:00
Rubidium d519cad60f Codechange: remove unused path in DrawSortButton and simplify calling 2026-06-14 20:30:16 +02:00
Peter Nelson fcd33b25a7 Codechange: add GoalQuestionButton scoped enum and EnumBitSet (#15723) 2026-06-14 17:32:27 +01:00
Peter Nelson ff055aa1ce Codechange: make IniGroupType a scoped enum 2026-06-14 15:24:04 +01:00
Peter Nelson 1a2a527530 Codechange: make AdminCompanyRemoveReason a scoped enum 2026-06-14 15:23:45 +01:00
Peter Nelson d6c6ca2879 Codechange: make NewGRFSerializationType a scoped enum 2026-06-14 15:23:45 +01:00
Peter Nelson 3008ffa9d2 Codechange: make NetworkRecvStatus a scoped enum 2026-06-14 15:23:45 +01:00
Peter Nelson 2365f1e525 Codechange: make ServerAddressType a scoped enum 2026-06-14 15:23:45 +01:00
Peter Nelson fe989c3dc4 Codechange: make NetworkGameStatus a scoped enum 2026-06-14 15:23:45 +01:00
Peter Nelson 62d71bd43f Codechange: make SendPacketsState a scoped enum 2026-06-14 15:23:45 +01:00
Peter Nelson 412c692afe Codechange: make AdminUpdateType a scoped enum 2026-06-14 15:23:45 +01:00
Rubidium bd86fe69c0 Codechange: make KeyStateBits an EnumBitset with scoped enum 2026-06-14 15:03:59 +02:00
Peter Nelson 457275a87c Fix 0149e4a349: incorrect logic when excluding 90 degree turns (#15719) 2026-06-14 12:15:35 +01:00
Peter Nelson 9c71a0c925 Fix #15715, 0149e4a349: ships unable to move due to inverted test (#15716) 2026-06-14 10:21:49 +01:00
translators 1baea6b0fb Update: Translations from eints
swedish: 4 changes by joeax910
norwegian (bokmal): 6 changes by eriksorngard
english (us): 1 change by 2TallTyler
esperanto: 1 change by slashdevslashurandom
2026-06-14 06:07:29 +00:00
Rubidium 0af287511f Codechange: make CanalFeature a scoped enum 2026-06-13 23:40:48 +02:00
Peter Nelson eb789ed3da Codechange: make PickerFilterMode(s) a scoped enum and EnumBitSet (#15714) 2026-06-13 21:40:10 +00:00
Peter Nelson d4f03f3c61 Codechange: remove increment/decrement operators for many enums 2026-06-13 21:54:42 +01:00
Peter Nelson c3b0d71973 Codechange: use EnumRange over many enum loops 2026-06-13 21:54:42 +01:00
Peter Nelson c991564e12 Codechange: add EnumRange iterator to handle enum values 2026-06-13 21:54:42 +01:00
Peter Nelson 02792d8332 Codechange: add doxygen comments for all EnumBitSet definitions (#15713) 2026-06-13 19:48:55 +00:00
Peter Nelson 3aee9889c2 Doc: synchronise changelog from 15.3 release (#15712) 2026-06-13 17:56:50 +01:00
Peter Nelson ed1817897a Codechange: make ErrorCode a scoped enum and document it (#15711) 2026-06-13 14:18:26 +01:00
translators 23ed6cd3c4 Update: Translations from eints
english (au): 1 change by krysclarke
czech: 34 changes by vladoschreiner
greek: 1 change by gh658804
russian: 1 change by Ln-Wolf
portuguese: 1 change by jcteotonio
portuguese (brazilian): 1 change by pasantoro
2026-06-13 06:01:06 +00:00
Rubidium 234b022d75 Codechange: split decoding of language off to a separate AddGRFString 2026-06-13 06:42:26 +02:00
Peter Nelson 8335479c07 Codechange: make AdminStatus a scoped enum 2026-06-12 22:18:32 +01:00
Peter Nelson f022017461 Codechange: make NetworkCoordinatorErrorType a scoped enum 2026-06-12 22:18:32 +01:00
Peter Nelson 146d499d0b Codechange: make ConnectionType a scoped enum 2026-06-12 22:18:32 +01:00
Peter Nelson 8453494170 Fix: ignore blocked waypoint tiles (#15620) 2026-06-12 22:11:21 +01:00
Cyprian Klimaszewski 6e9a5cee2a Codechange: Use IsValidCorner more. (#15697) 2026-06-12 22:09:29 +01:00
Rubidium 6da4aa8648 Codechange: make MouseClick scoped 2026-06-12 23:03:16 +02:00
Rubidium bba260e300 Codechange: make PreventHideDirection scoped 2026-06-12 22:52:34 +02:00
Rubidium 85ca2c20cd Codechange: make ViewportAutoscrolling scoped 2026-06-12 22:44:01 +02:00
Rubidium a268f99f3f Codechange: make CanalFeatureFlag a scoped enum and use EnumBitSet for flags 2026-06-12 20:16:06 +02:00
glx22 f4cad11b40 Change: [CMake] Use FindICU module provided by CMake 2026-06-12 16:51:59 +02:00
glx22 d92cd26a1f Codefix 9356748: Missing dependency to build OpenSSL 2026-06-12 16:51:59 +02:00
translators acbbea4238 Update: Translations from eints
vietnamese: 8 changes by KhoiCanDev
hungarian: 7 changes by vargaviktor
2026-06-12 06:04:50 +00:00
Rubidium f5ee6a5ec3 Codechange: use reference over pointer for RemoveFirstTrack(dir) 2026-06-11 21:24:10 +02:00
Peter Nelson 0149e4a349 Codechange: make Trackdir a scoped enum and TrackdirBits an EnumBitSet (#15696) 2026-06-11 14:40:15 +01:00
Matt C 09a475f30a Codechange: Calculate most used rail type using company infrastructure records (#15598) 2026-06-11 08:56:03 -04:00
Péter Siklós 61a8c9fd55 Fix: Typo in Hungarian town name suffix ("kak" -> "lak") (#15421) 2026-06-11 08:55:09 -04:00
Tad Hardesty eb54cbcd97 Add: Allow precisely erasing rocks in scenario editor (#15463) 2026-06-11 08:53:08 -04:00
translators 1766f17609 Update: Translations from eints
swedish: 4 changes by joeax910
korean: 5 changes by telk5093
2026-06-11 06:07:25 +00:00
Peter Nelson 4e6a5ca362 Codechange: make GoalType a scoped enum 2026-06-10 23:51:54 +01:00
Peter Nelson 3e880e8cd4 Codechange: make GoalQuestionType a scoped enum
Ensure ScriptGoal::QuestionType values match GoalQuestionType.
2026-06-10 23:51:54 +01:00
Rubidium 0021d5d6bd Fix: error message language incorrectly decoded.
Both the GRF version <7 and >=7 are supported, but the decoding assumes the
latter version. This means that for decoding custom errors a GRF version <7
with German will be using the Spanish plural/cases.
2026-06-10 23:38:31 +02:00
glx22 30fe17a49c Codefix: narrowing conversion warning for MSVC x86 2026-06-10 22:43:15 +02:00
glx22 9356748003 Update: vcpkg baseline 2026-06-10 22:43:15 +02:00
Rubidium 33d9b82c0c Fix: town name language incorrectly decoded
Both the GRF version < 7 and >= 7 are supported, but the debug message assumes
the latter. Also, use the same 'default' language for decoding the string as
is done for the part name later in the function.
2026-06-10 18:22:18 +02:00
Rubidium 4b3d621569 Codechange: directly use _current_language->newgrflangid instead of maintaining a separate variable for two functions 2026-06-10 18:21:58 +02:00
translators 31f8d76754 Update: Translations from eints
esperanto: 5 changes by slashdevslashurandom
polish: 5 changes by Rito13
2026-06-10 06:01:27 +00:00
Peter Nelson 2effec96e8 Codechange: simplify drawing of smallmap legends (#15690)
Replace convoluted cascasing switches with helper function.
2026-06-09 18:16:52 +00:00
translators dbb8096a52 Update: Translations from eints
english (us): 5 changes by 2TallTyler
2026-06-09 05:54:15 +00:00
Rubidium 8ac4112aba Codechange: introduce enums for TrainSignalSide and RoadVehicleDrivingSide 2026-06-09 05:39:15 +02:00
Peter Nelson c9cf141813 Codechange: make Track a scoped enum and TrackBits an EnumBitSet (#15684)
Helper methods to convert Track to TrackBits are removed as they are no longer necessary.
2026-06-08 23:05:51 +01:00
Peter Nelson 7e2bcaf792 Codechange: avoid magic numbers and generic types when drawing autorail (#15689) 2026-06-08 22:22:15 +01:00
Peter Nelson 0ff5f81319 Codechange: make SigSegState a scoped enum (#15687) 2026-06-08 20:05:47 +01:00
translators 0eb9a47a96 Update: Translations from eints
english (au): 15 changes by krysclarke
czech: 69 changes by adamek0202
greek: 5 changes by gh658804
russian: 5 changes by Ln-Wolf
finnish: 5 changes by hpiirai
portuguese: 5 changes by jcteotonio
portuguese (brazilian): 5 changes by pasantoro
2026-06-08 06:08:41 +00:00
Peter Nelson 8d0a0b5e16 Fix #15606: undefined behaviour may cause buttons to be invisible (#15686)
Set widget aspect ratio based on unscaled sizes, as scaled sizes are no longer available.
2026-06-07 06:23:48 +00:00
translators ba582b88ed Update: Translations from eints 2026-06-07 06:02:31 +00:00
Cyprian Klimaszewski 9d233c441d Codechange: Use CornerIndexArray instead of C-style arrays. (#15685) 2026-06-06 21:55:11 +01:00
Peter Nelson fa02d7aecb Codechange: make LinkType a scoped enum (#15683) 2026-06-06 21:54:37 +01:00
Jonathan G Rennison 552ad919a8 Fix #15679: Train reversing when partially in a depot (#15680)
Defer UpdateStatusAfterSwap until after all swaps done.
Replace previous fix in #15662.
2026-06-06 18:53:28 +01:00
Peter Nelson b5ae563df1 Codechange: make IConsoleMode a scoped enum (#15682) 2026-06-06 18:52:31 +01:00
Peter Nelson 14be71cb5f Codechange: make SignalState a scoped enum 2026-06-06 18:52:10 +01:00
Peter Nelson 231d946624 Codechange: make SignalType a scoped enum 2026-06-06 18:52:10 +01:00
Peter Nelson e97e182630 Codechange: make SignalVariant a scoped enum 2026-06-06 18:52:10 +01:00
Peter Nelson ebb77e592c Codechange: use EnumIndexArray for signal sprite and string tables 2026-06-06 18:52:10 +01:00
Cyprian Klimaszewski 549f357a19 Codechange: Make Foundation a scoped enum. (#15676) 2026-06-06 18:51:53 +01:00
Peter Nelson e41d4a0243 Codefix: clean up confusion between Track and Trackdir (#15678) 2026-06-06 14:28:49 +01:00
Matt C 6bc486a578 Feature: Add default road and tram selection (#15585)
- Merged with the existing default rail type selection
2026-06-06 09:23:08 -04:00
Peter Nelson a85d10bf7c Codechange: use IsValidTrack to test for valid track in more places (#15677) 2026-06-06 11:33:46 +01:00
Rubidium a49dc81082 Codefix: make scoped-named enum actually scoped 2026-06-06 10:07:40 +02:00
translators a894ddf665 Update: Translations from eints
french: 24 changes by glx22
2026-06-06 05:48:56 +00:00
Peter Nelson a892d8e848 Codechange: rename and make StationVehicleType a scoped enum (#15674)
StatiionHadVehicleOfType renamed to StationVehicleTypes and turned into an EnumBitSet
2026-06-04 23:16:23 +01:00
Jonathan G Rennison 2ef1623c05 Fix: Train reversing when partially in a depot (#15662) 2026-06-03 18:48:43 -04:00
Cyprian Klimaszewski 4175aee782 Fix #14975: Show correct tile for tunnel error message (#15660) 2026-06-03 18:47:55 -04:00
Peter Nelson 37983cf2d0 Codechange: use TrackBitsToTrackdirBits instead of magic number (#15670) 2026-06-03 07:48:40 +01:00
Rubidium 4c2d4ec73e Codechange: rename InitializeRailGUI to InitializeSignalGui 2026-06-03 07:20:55 +02:00
Rubidium a8606613a4 Codechange: use single path for calling SetDefaultRailGui 2026-06-03 07:20:55 +02:00
Rubidium 55be58a31d Codefix: do not update just closed construction toolbar when changing company 2026-06-03 07:20:55 +02:00
Peter Nelson dbf56751b7 Codechange: simplify iteration of track bits (#15668) 2026-06-02 18:19:40 +00:00
Peter Nelson 3314f4955b Codechange: simplify test for building stations over existing rail (#15667) 2026-06-02 18:11:03 +00:00
Peter Nelson dcb3810840 Codechange: additional TrackdirIndexArray conversion 2026-06-02 18:58:10 +01:00
Peter Nelson ef48503276 Codechange: add helper method to get other Trackdir piece 2026-06-02 18:58:10 +01:00
Peter Nelson a51dd8e053 Codechange: make StoryPageButtonCursor a scoped enum 2026-06-01 22:08:46 +01:00
Peter Nelson 06af27d52e Codechange: make StoryPageElementType a scoped enum 2026-06-01 22:08:46 +01:00
Peter Nelson f9dfbd59a3 Codechange: make StoryPageButtonFlag(s) a scoped enum/EnumBitSet 2026-06-01 22:08:46 +01:00
Peter Nelson 40a29ebc67 Fix #15664, 568c7bb2: regression in aircraft movement (#15665) 2026-06-01 22:08:31 +01:00
Peter Nelson 2aa2b340eb Codefix: use correct type for array holding Trackdirs (#15658) 2026-06-01 19:30:31 +01:00
Peter Nelson 0e951f3528 Codechange: make TransparencyOption a scoped enum 2026-05-31 18:59:51 +01:00
Peter Nelson a144bf2f8b Codechange: make TransparencyOptions an EnumBitSet 2026-05-31 18:59:51 +01:00
Peter Nelson 28cd6a3d33 Codechange: make TrackStatus a struct instead of opaque uint32_t (#15653) 2026-05-31 18:09:26 +01:00
Peter Nelson a687f02e87 Add: implement custom waypoint layouts by callback 24 2026-05-31 14:55:24 +01:00
Peter Nelson 62669a24d3 Codechange: simplify GetPlatformInfo
Move axis flipping to the only caller that requires it.
2026-05-31 14:55:24 +01:00
Peter Nelson d6783335ca Codechange: make Direction a scoped enum 2026-05-31 13:11:53 +01:00
Peter Nelson f010c21f1a Codechange: make DiagDirection a scoped enum 2026-05-31 13:11:53 +01:00
Peter Nelson 356ca9c6d9 Codechange: use static_cast/to_underlying when converting Direction 2026-05-31 13:11:53 +01:00
Peter Nelson 0e0e8056a7 Codechange: use static_cast/to_underlying when converting DiagDirection 2026-05-31 13:11:53 +01:00
Peter Nelson 37f1a046e4 Codechange: use single array for vehicle subtile coord deltas (#15651) 2026-05-31 12:22:18 +01:00
Peter Nelson a7c078dcaf Codechange: use scoped enum for MoveToAction (#15621) 2026-05-31 08:16:51 +01:00
Peter Nelson ee0d9f662e Codechange: rework definition of ship and train tile entrance coordinates (#15650) 2026-05-31 08:16:26 +01:00
Rubidium ebc61380f6 Codechange: make PriceCategory a scoped enum 2026-05-31 07:22:30 +02:00
Rubidium e4b6666fef Codechange: make VisualEffectSpawnModel a scoped enum 2026-05-31 07:22:21 +02:00
Rubidium 8bac7bd519 Codechange: make SwitchMode a scoped enum 2026-05-31 07:22:11 +02:00
Peter Nelson 0d2aed3b87 Codechange: make FloodingBehaviour a scoped enum (#15632) 2026-05-31 06:07:05 +01:00
Rubidium 2ff631caa2 Codechange: make GameMode a scoped enum 2026-05-30 23:20:20 +02:00
Peter Nelson 4b44d0a376 Codechange: use AxisToDiagDirs() in more places (#15646) 2026-05-30 18:24:04 +00:00
Peter Nelson 89201f80fb Codechange: use InclinedSlope() when drawing catenary (#15645)
Bit-shifted `Corner` is also a `Slope`, so use existing function instead of a lookup table.
2026-05-30 18:39:27 +01:00
Peter Nelson e97a4e1b06 Codechange: improve readability of logic of trains for depot enter/exit
Replaces magical hexadecimal values, masking and shifts with various Coord2Ds.
2026-05-30 17:24:04 +01:00
Peter Nelson af6868198e Codechange: add spaceship operator for Coord2D and Coord3D 2026-05-30 17:24:04 +01:00
Rubidium 9fabd511b6 Codefix: incidating isn't English 2026-05-30 14:26:01 +02:00
Peter Nelson bc8b16a99b Codechange: use EnumIndexArray for Track and Trackdir indexed arrays 2026-05-30 07:39:21 +01:00
Peter Nelson 81bdc44d1a Codechange: use EnumIndexArray for Direction and DiagDirection indexed arrays 2026-05-30 07:39:21 +01:00
Cyprian Klimaszewski d68553bbd6 Codefix: halftile_test is an int but used as a Slope. 2026-05-29 16:11:10 +02:00
Peter Nelson 1d8d07e561 Codechange: make DiagDirDiff a scoped enum (#15635) 2026-05-28 16:56:52 +00:00
Peter Nelson 568c7bb259 Codechange: make DirDiff a scoped enum 2026-05-28 17:10:31 +01:00
Peter Nelson e6cf643103 Codechange: add function to limit direction difference 2026-05-28 17:10:31 +01:00
Peter Nelson f7d1108934 Cleanup: remove unused RotateRoadBits() function (#15633) 2026-05-28 08:05:16 +00:00
translators da0a244db6 Update: Translations from eints
chinese (traditional): 6 changes by KogentaSan
hungarian: 1 change by vargaviktor
2026-05-28 05:59:48 +00:00
Peter Nelson ae1ca76596 Codechange: use Direction helpers instead of direct masking (#15631) 2026-05-27 20:07:24 +01:00
Cyprian Klimaszewski 89f730bfb7 Codechange: replace TrackdirBits C-style casts. (#15628) 2026-05-27 07:50:12 +01:00
Peter Nelson c74431e734 Codechange: make Axis a scoped enum 2026-05-27 07:49:39 +01:00
Peter Nelson c0cb8b74e1 Codechange: use static_cast/to_underlying when explicitly converting Axis 2026-05-27 07:49:39 +01:00
Peter Nelson 807436b3ea Codechange: use EnumIndexArray for axis indexed arrays 2026-05-27 07:49:39 +01:00
translators a5ec6823c6 Update: Translations from eints
luxembourgish: 10 changes by phreeze83
2026-05-27 05:59:46 +00:00
Peter Nelson 46ee856057 Fix: pylons and no-wires flags were ignored for waypoint tiles (#15619) 2026-05-26 21:57:43 +01:00
Jonathan G Rennison 33874571a5 Fix: Scenario editor random industry generation (#15626) 2026-05-26 20:01:11 +01:00
Cyprian Klimaszewski d490243c7f Codechange: Use ExtractCommandCost instead of std::get<0>. (#15542) 2026-05-26 20:00:29 +01:00
Peter Nelson 2fcb7f2b02 Codechange: use existing helpers to convert to/from Axis (#15629) 2026-05-26 19:59:52 +01:00
Peter Nelson c4b642668d Codechange: use EnumIndexArray for RoadStopType-indexed arrays 2026-05-26 17:12:50 +01:00
Peter Nelson 233c616425 Codechange: use EnumIndexArray for NewsType-indexed array 2026-05-26 17:12:50 +01:00
Peter Nelson 06b0b59c92 Codechange: use EnumIndexArray for ContentInfo::State-indexed arrays 2026-05-26 17:12:50 +01:00
Peter Nelson 6c39def287 Codechange: use EnumIndexArray for ZoomLevel-indexed arrays 2026-05-26 17:12:50 +01:00
Peter Nelson fa1a5b998e Codechange: use EnumIndexArray for ContentType-indexed arrays 2026-05-26 17:12:50 +01:00
Peter Nelson 1860355246 Codechange: use EnumIndexArray for Driver::Type-indexed arrays 2026-05-26 17:12:50 +01:00
Peter Nelson fa387fe129 Codechange: use EnumIndexArray for ClearGround-indexed arrays 2026-05-26 17:12:50 +01:00
Peter Nelson 4d809f4b43 Codechange: use EnumIndexArray for GrfSpecFeature-indexed arrays 2026-05-26 17:12:50 +01:00
Peter Nelson f47af07945 Codechange: use EnumIndexArray for StationType-indexed arrays 2026-05-26 17:12:50 +01:00
Peter Nelson fce33c5015 Codechange: make WarningLevel a scoped enum (#15622) 2026-05-26 17:12:21 +01:00
translators 957184ae90 Update: Translations from eints
swedish: 7 changes by joeax910
maori (new zealand): 6 changes by Kyle-McDangersword
2026-05-26 05:52:48 +00:00
Peter Nelson 39d4fe24a0 Codechange: treat station gui axis as an axis (#15627) 2026-05-25 07:21:15 +01:00
Peter Nelson 4519b5db69 Codechange: make ConsoleHookResult a scoped enum (#15623) 2026-05-25 07:19:59 +01:00
translators bb2c3aed71 Update: Translations from eints
norwegian (bokmal): 3 changes by eriksorngard
2026-05-25 06:01:33 +00:00
Peter Nelson 507b50223c Codechange: make WagonOverride a scoped enum (#15625) 2026-05-24 22:58:34 +01:00
translators 052a6f15b4 Update: Translations from eints
korean: 5 changes by telk5093
2026-05-24 05:50:21 +00:00
translators 68a03db17f Update: Translations from eints
english (us): 3 changes by 2TallTyler
esperanto: 3 changes by slashdevslashurandom
portuguese (brazilian): 1 change by jcteotonio
polish: 1 change by Rito13
2026-05-23 05:45:43 +00:00
Jonathan G Rennison f2aeed9cb9 Cleanup: Remove unused GameOptionsWindowNumber::GameSettings window number (#15617)
Remove associated redundant SetWindowDirty calls
2026-05-23 02:18:30 +02:00
translators b13cf794bc Update: Translations from eints
english (au): 3 changes by krysclarke
greek: 3 changes by gh658804
russian: 3 changes by Ln-Wolf
finnish: 3 changes by hpiirai
portuguese: 3 changes by jcteotonio
portuguese (brazilian): 82 changes by pasantoro
2026-05-22 05:52:28 +00:00
Peter Nelson 01ae236eec Codechange: replace saveload C-style casts with static_cast<> (#15583) 2026-05-21 21:33:26 +01:00
Peter Nelson dbc0aa4cdb Codechange: make ClientStatus and ServerStatus scoped enums (#15578) 2026-05-21 21:32:42 +01:00
Peter Nelson b2e01a9afa Codechange: remove code to save/load deques (#15577)
Deques are no longer involved in save/load so this was redundant code.
2026-05-21 21:31:16 +01:00
Rubidium bcda4a72ee Codechange: make WindowClass a scoped enum 2026-05-20 21:39:04 +02:00
Rubidium a9a2965131 Codechange: introduce regression script for GS compat scripts 2026-05-20 20:36:03 +02:00
Rubidium 4e58f4dffa Codechange: introduce regression script for GS 2026-05-20 20:36:03 +02:00
Rubidium 2cebcc50f4 Codechange: explicitly pass the script folder for regression scripts 2026-05-20 20:36:03 +02:00
Ricardo Holmes bf03ca2303 Fix #13600: Make terraform click+draggable in scenario editor. (#15135) 2026-05-20 13:09:34 -04:00
Tad Hardesty ad87be3a6b Add: List 'Place object' in landscaping dropdown 2026-05-20 11:55:22 +01:00
translators a6db43ea59 Update: Translations from eints
maori (new zealand): 144 changes by Kyle-McDangersword
2026-05-20 05:53:46 +00:00
Peter Nelson 3177583cdd Codechange: make TileSource a scoped enum (#15613) 2026-05-19 19:02:21 +01:00
Rubidium 54d8c3f8e3 Codechange: split WindowNumberEnum into several scoped enumerations 2026-05-19 16:14:40 +02:00
Rubidium 98c9297134 Add: scoped enum support for scripts 2026-05-19 16:14:40 +02:00
Tyler Trahan 49c36f1b39 Codechange: Use enum class for GenWorldProgress (#15560) 2026-05-19 13:26:02 +00:00
Peter Nelson 7a0d9ba2d7 Codechange: use AutoRestoreBackup when loading NewGRFs (#15612)
Dates, counters and display options are now automatically restored.
2026-05-19 07:14:23 +01:00
translators d349295091 Update: Translations from eints
vietnamese: 4 changes by MagicalDrizzle
luxembourgish: 23 changes by phreeze83
2026-05-19 05:52:40 +00:00
Cyprian Klimaszewski e4803dbe54 Codechange: Prefer std::get<T> over std::get<N>. (#15538) 2026-05-19 06:50:16 +01:00
Peter Nelson e7845e48dc Codechange: make DisplayOption a scoped enum/enum bitset (#15611) 2026-05-19 06:21:38 +01:00
Jonathan G Rennison 7d03e0c4b7 Fix: Dedicated server signal handling for SIGTERM/SIGINT/SIGQUIT 2026-05-18 21:39:58 +02:00
Peter Nelson 36a4a10a01 Codefix: F is not a suitable name for a local variable (#15603) 2026-05-18 20:05:55 +01:00
Peter Nelson a2b8d38a73 Codechange: make LiveryClass a scoped enum 2026-05-18 20:05:19 +01:00
Peter Nelson 2868060660 Codechange: make LiveryScheme a scoped enum 2026-05-18 20:05:19 +01:00
Peter Nelson 7d70a7b9e9 Codechange: add LiverySchemes as EnumBitSet 2026-05-18 20:05:19 +01:00
Peter Nelson 81c07db934 Codechange: split group and livery selections internally in company colour window
This allows using the properties of strong types.
2026-05-18 20:05:19 +01:00
Rubidium c59d64c132 Codechange: separate TextColour enumeration and flags 2026-05-18 08:37:42 +02:00
translators 31424f700e Update: Translations from eints
swedish: 25 changes by robert-i
2026-05-18 05:56:30 +00:00
translators 2dba7ac196 Update: Translations from eints
chinese (simplified): 4 changes by xiaoliuprogrammer
2026-05-17 05:48:11 +00:00
translators 2a7bd3fc60 Update: Translations from eints
norwegian (bokmal): 4 changes by eriksorngard
2026-05-15 05:49:18 +00:00
translators 71bda38826 Update: Translations from eints
swedish: 14 changes by joeax910
luxembourgish: 192 changes by phreeze83
2026-05-14 05:47:55 +00:00
Peter Nelson a5b1394b9e Cleanup: remove unused yapf functions (#15605) 2026-05-13 22:39:07 +01:00
Jonathan G Rennison 4817364a7f Codefix: Order type checks in CmdOrderRefit (#15602) 2026-05-13 09:07:07 -04:00
translators 030c5d9c67 Update: Translations from eints
luxembourgish: 39 changes by phreeze83
maori (new zealand): 4 changes by Kyle-McDangersword
2026-05-13 05:48:12 +00:00
Peter Nelson 7a15d3c017 Fix: [NewGRF] potential out-of-bounds read when performing GRM (#15600) 2026-05-12 07:48:16 +01:00
translators 20b387b91f Update: Translations from eints
portuguese: 1 change by jcteotonio
2026-05-12 05:46:04 +00:00
translators a2b380830e Update: Translations from eints
esperanto: 4 changes by slashdevslashurandom
2026-05-11 05:49:28 +00:00
translators 8b7f7f7bc0 Update: Translations from eints
chinese (traditional): 4 changes by KogentaSan
english (us): 4 changes by 2TallTyler
korean: 4 changes by telk5093
hungarian: 4 changes by vargaviktor
portuguese: 4 changes by jcteotonio
2026-05-10 05:45:18 +00:00
translators 4abec621b5 Update: Translations from eints
english (au): 4 changes by krysclarke
greek: 4 changes by gh658804
russian: 4 changes by Ln-Wolf
finnish: 4 changes by hpiirai
portuguese (brazilian): 4 changes by pasantoro
polish: 4 changes by pAter-exe
2026-05-09 05:33:35 +00:00
translators 54e32255a0 Update: Translations from eints
luxembourgish: 84 changes by phreeze83
2026-05-08 05:20:36 +00:00
Tyler Trahan 4decdedff4 Feature: Scale cargo payment aging rate (#14635)
Co-authored-by: dP <dp@dpointer.org>
2026-05-07 08:09:08 -04:00
translators e8658995e3 Update: Translations from eints
swedish: 5 changes by joeax910
maori (new zealand): 73 changes by Kyle-McDangersword
2026-05-07 05:41:34 +00:00
Jonathan G Rennison ebba01a4c8 Fix: Finding nearest train depot when driving backwards (#15590) 2026-05-06 08:10:50 +01:00
translators fdbc25a941 Update: Translations from eints
swedish: 13 changes by joeax910
korean: 1 change by telk5093
2026-05-06 05:39:19 +00:00
Peter Nelson ce506230c0 Fix: badge offsets not ignored when determining width (#15588)
Badges are drawn without padding offsets, so they should not affect dimensions either.
2026-05-05 21:35:02 +01:00
Peter Nelson 01b5b35b74 Codechange: use Coord2D instead of various structs and typedefs (#15586) 2026-05-05 21:34:39 +01:00
Peter Nelson d026e7098c Fix: account for NewGRF's global train width when drawing dual-head engines (#15587)
Improves display in purchase list for dual-head engines.
2026-05-05 20:48:15 +01:00
translators 275ba48eea Update: Translations from eints 2026-05-05 05:30:46 +00:00
Peter Nelson 0cc9f02e86 Fix #15495: fix incorrectly built default waypoints 2026-05-04 23:02:03 +01:00
Peter Nelson 1be2cd0c9a Fix #15495: unable to build bridge over default waypoints 2026-05-04 23:02:03 +01:00
nikolas b5abd08a52 Add: [CI] pipewire-devel header files (#15582)
SDL supports the pipewire audio driver, and we can allow for use of
this by installing these headers.

As documented here:
https://github.com/libsdl-org/SDL/blob/main/docs/README-linux.md
2026-05-04 23:01:28 +01:00
Peter Nelson eb52e2448d Fix 9494881e: NewGRF driving-backwards flag tested wrong part (#15579)
The DrivingBackwards flag is only ever set on the first vehicle of the consist, other vehicle parts in the consist may have indeterminate state.
2026-05-04 23:00:46 +01:00
verbosecodes 8875e12956 Fix #15235: Make GameScripts obey town road construction setting (#15559) 2026-05-04 22:59:47 +01:00
Peter Nelson 30fbc0aab8 Codechange: make SaveLoadResult a scoped enum (#15584) 2026-05-04 22:58:43 +01:00
Peter Nelson a7a025623e Codechange: make RailVehicleType a scoped enum (#15576) 2026-05-04 22:58:05 +01:00
nikolas f1fd17be8f Doc: Fix typo in comment of translation source file (#15581) 2026-05-04 14:35:05 -04:00
Jonathan G Rennison a4e1865cd7 Fix: Depot listing for trains arriving backwards with an articulated tail (#15547) 2026-05-04 19:19:04 +01:00
Peter Nelson 792f6d99a3 Codechange: make ExpensesType a scoped enum (#15572) 2026-05-04 08:20:52 +01:00
Peter Nelson cd597f79ad Codechange: make EngineClass a scoped enum (#15575) 2026-05-03 15:53:27 +01:00
Peter Nelson 7e624beadc Codechange: make Shade a scoped enum (#15571)
Renamed from `ColourShade` to `Shade` for brevity.
2026-05-03 15:07:29 +01:00
translators 420abb3865 Update: Translations from eints
vietnamese: 11 changes by KhoiCanDev
2026-05-03 05:39:44 +00:00
Peter Nelson b220cc1a29 Fix: station list facility buttons do not produce click sound (#15569) 2026-05-02 19:36:36 +01:00
Peter Nelson 7bb3774d7f Codechange: iterate station list facilities filter in a saner manner (#15568) 2026-05-02 19:36:19 +01:00
Jonathan G Rennison a8e151c10a Codefix: Station/waypoint viewport rect handling in QueryStringWindow::OnPlaceObjectAbort (#15558) 2026-05-01 07:39:43 -04:00
translators ceac1258d8 Update: Translations from eints
vietnamese: 288 changes by KhoiCanDev
2026-05-01 05:46:25 +00:00
Peter Nelson 1707b5ddea Codechange: make IndustryConstructionType a scoped enum 2026-04-30 22:40:20 +01:00
Peter Nelson e8cc0f5dc5 Codechange: make IndustryCheck a scoped enum
Enum is renamed from overly generic `CheckProc`.
2026-04-30 22:40:20 +01:00
Peter Nelson 77be3fc12d Codechange: make IndustryAvailabilityCallType a scoped enum 2026-04-30 22:40:20 +01:00
Jonathan G Rennison 89174e891a Codechange: typedef for EnumClassIndexContainer with std::array (#15548) 2026-04-30 14:59:10 -04:00
Tyler Trahan 826e9a3c8c Change: Generate lighthouses along coasts and near towns (#14828) 2026-04-30 14:52:21 -04:00
translators d17e32d4b5 Update: Translations from eints
welsh: 123 changes by Ansbaradigeidfran
vietnamese: 173 changes by KhoiCanDev
luxembourgish: 87 changes by phreeze83
2026-04-30 05:40:21 +00:00
translators a2e98f880f Update: Translations from eints
polish: 2 changes by pAter-exe
2026-04-29 05:37:47 +00:00
Peter Nelson 7eafa497d1 Fix 47dd04d: crash when loading crash save with no viewport coordinates (#15550) 2026-04-28 21:45:35 +01:00
translators 88dd010618 Update: Translations from eints
swedish: 11 changes by joeax910
greek: 6 changes by gh658804
spanish: 1 change by franpacheco-cpp
2026-04-28 05:40:22 +00:00
Rubidium 8feffc9eba Codechange: make FillRectMode a scoped enum 2026-04-27 22:12:20 +02:00
Jonathan G Rennison bbe5dbf230 Cleanup: Correct various spelling errors 2026-04-27 21:05:08 +02:00
Peter Nelson 4a7cbf29f0 Codechange: prefer AutoRestoreBackup over Backup/Restore (#15480) 2026-04-27 08:02:41 +01:00
Peter Nelson a4d142eddb Codechange: prefer bit set methods over operators (#15537)
Missing conversion of some RoadBits calls.
2026-04-27 07:08:33 +01:00
translators def17a75b2 Update: Translations from eints
chinese (traditional): 8 changes by KogentaSan
luxembourgish: 2 changes by phreeze83
2026-04-27 05:37:05 +00:00
Rubidium 38dd2e59eb Codechange: remove aligning parameters in SquirrelExport 2026-04-26 15:18:40 +02:00
Peter Nelson 77403627a8 Codechange: make VehicleType a scoped enum 2026-04-26 07:00:13 +01:00
Peter Nelson b90aefbf49 Codechange: allow passing a scoped enum to InvalidateWindowData 2026-04-26 07:00:13 +01:00
Peter Nelson 8b5c4ae96b Codechange: add helpers to get engine sorter names/functions
Avoids exposing raw C-style arrays.
2026-04-26 07:00:13 +01:00
Peter Nelson 174ff5d914 Codechange: add helpers to get original engine count/offset
Avoids exposing raw C-style arrays.
2026-04-26 07:00:13 +01:00
translators 32d61a8938 Update: Translations from eints
turkish: 14 changes by BeratSJ
2026-04-26 05:27:56 +00:00
Rubidium 66df1188c4 Codechange: let _dirkeys use an enum and EnumBitSet 2026-04-25 18:47:54 +02:00
Rubidium 99c8a637b4 Codechange: make WindowPosition a scoped enum 2026-04-25 17:15:18 +02:00
Richard Wheeler a2e99c9cfa Fix: Fix viewport snap back on stop following vehicle (#15520)
Fixes #15520
2026-04-25 14:30:12 +01:00
Tyler Trahan f62eeada65 Fix: Use tile of leading vehicle when calculating too-short station loading penalty (#15530) 2026-04-24 17:19:58 -04:00
Rubidium 53799cc39a Codechange: make Support8bpp a scoped enum 2026-04-24 22:35:31 +02:00
Cyprian Klimaszewski 4a69cafe9a Codechange: Deduplicate test for "block signal on trackdir" into a function. (#15526)
Co-authored-by: Michael Lutz <michi@icosahedron.de>
2026-04-24 18:52:17 +01:00
Owen Rudge a0ce1f94ed Add: Support automatic detection of data from Atari's Transport Tycoon Deluxe re-release 2026-04-24 09:31:19 +01:00
Peter Nelson 44c63bc400 Codefix 1d10e8ee6: explicitly delete unwanted indexers (#15522)
Prevents typed-indexers being used via implicit conversion.
2026-04-23 08:32:25 +01:00
translators 146499ab99 Update: Translations from eints
swedish: 12 changes by joeax910
2026-04-23 05:20:39 +00:00
translators c14de5faa5 Update: Translations from eints
swedish: 9 changes by joeax910
polish: 4 changes by Rito13
2026-04-22 05:18:55 +00:00
Peter Nelson c45aa3c9b6 Codechange: use EnumBitSet for CargoTypes 2026-04-21 17:13:31 +01:00
Peter Nelson 962a550d1b Codechange: add parameterless Flip() method to BaseBitSet
This allows flipping all valid bits, similar to parameterless Set() and Reset().
2026-04-21 17:13:31 +01:00
translators c2fbc6fdeb Update: Translations from eints
swedish: 13 changes by joeax910
norwegian (bokmal): 9 changes by eriksorngard
hungarian: 6 changes by vargaviktor
polish: 2 changes by SzyZuu
2026-04-21 05:19:40 +00:00
Peter Nelson 8341beb345 Codechange: add functions to convert between GrfSpecFeature and VehicleType (#15517)
Removes various different casts.
2026-04-20 19:17:48 +01:00
translators a6db99765a Update: Translations from eints
swedish: 20 changes by joeax910
2026-04-20 05:29:08 +00:00
Cyprian Klimaszewski b46b660b0b Fix: Buttons for choosing engine in preview window show for single engine. 2026-04-19 22:32:42 +02:00
Rubidium 3b5d46e0bb Codechange: make Colours a scoped enum 2026-04-19 20:53:52 +02:00
Rubidium 6823a1bc9e Codechange: move fetching colour offset to a separate function 2026-04-19 20:53:52 +02:00
Jonathan G Rennison bd1bb3adc8 Fix: Force proceed behaviour when driving backwards (#15510) 2026-04-19 14:16:55 -04:00
Peter Nelson 2bf84ea78c Codechange: make GrfSpecFeature a scoped enum (#15487) 2026-04-19 19:04:27 +01:00
Peter Nelson 16b192d61f Fix #15511: vehicle passed to commands must be a company buildable type (#15512) 2026-04-19 17:03:39 +01:00
translators ea4964371d Update: Translations from eints
swedish: 4 changes by joeax910
korean: 6 changes by telk5093
russian: 1 change by Ln-Wolf
2026-04-19 05:19:36 +00:00
Rubidium 8bbad0dfaf Codechange: Object's colour is actually a recolour offset 2026-04-18 21:28:08 +02:00
Rubidium ba209c8745 Codechange: let GenerateCompanyColour use C++ constructs 2026-04-18 19:21:19 +02:00
translators b75390ba60 Update: Translations from eints
english (au): 1 change by krysclarke
chinese (traditional): 1 change by KogentaSan
english (us): 6 changes by 2TallTyler
russian: 2 changes by Ln-Wolf
finnish: 1 change by hpiirai
portuguese: 5 changes by jcteotonio
esperanto: 6 changes by slashdevslashurandom
portuguese (brazilian): 1 change by pasantoro
polish: 1 change by Rito13
2026-04-18 05:16:32 +00:00
Matt C e4bc01d172 Change: Most used rail type takes ownership into account (#15489) 2026-04-17 18:29:39 -04:00
Jonathan G Rennison 3437a58d5e Fix: Condition for whether to change driving direction or flip on train reverse (#15499) 2026-04-17 18:28:17 -04:00
Rubidium 7f1d17df46 Codechange: use EnumBitSet for used_colours 2026-04-17 22:34:17 +02:00
Rubidium 9a87f184c4 Codechange: move calculating livery recolour offset to Livery 2026-04-17 22:05:25 +02:00
Peter Nelson e24f92ce82 Fix d15f0597: prevent setting DrivingBackwards condition on non-trains (#15493)
The existing code only prevented this in the GUI.
2026-04-17 18:30:36 +01:00
Loïc Guilloux b7c51a9332 Fix #15497: [Script] ScriptController::Break not pausing in TestMode (#15498) 2026-04-17 16:36:16 +02:00
translators 678dfe658a Update: Translations from eints
english (au): 8 changes by krysclarke
chinese (traditional): 7 changes by KogentaSan
russian: 5 changes by Ln-Wolf
finnish: 5 changes by hpiirai
portuguese: 5 changes by jcteotonio
portuguese (brazilian): 5 changes by pasantoro
polish: 3 changes by Rito13
2026-04-17 05:20:14 +00:00
Peter Nelson 8568f1f7bc Codechange: rename and make RailSpriteType a scoped enum
RailTypeSpriteGroup is now renamed to RailSpriteType
2026-04-16 21:01:17 +01:00
Peter Nelson 5cef1ca68a Codechange: rename and make RoadSpriteType a scoped enum
RoadTypeSpriteGroup is now renamed to RoadSpriteType
2026-04-16 21:01:17 +01:00
Peter Nelson d15f105974 Add: conditional order to test if a train is driving backwards (#15484) 2026-04-16 21:00:49 +01:00
Jonathan G Rennison fd855aa61d Fix: Coordinate transformation for JSON town placement when anticlockwise 2026-04-16 16:48:44 +02:00
translators e09cca949f Update: Translations from eints
swedish: 36 changes by joeax910
english (us): 3 changes by 2TallTyler
chinese (simplified): 58 changes by WenSimEHRP
hungarian: 3 changes by vargaviktor
polish: 3 changes by pAter-exe
2026-04-16 05:22:10 +00:00
Rubidium fe5171a6c5 Codechange: make PaletteType a scoped enum 2026-04-15 23:48:31 +02:00
Tyler Trahan 98805561f8 Add: Setting to disallow train magic flip, and reverse at reduced speed (#15391) 2026-04-15 16:24:26 -04:00
translators 3f4984ebaa Update: Translations from eints
swedish: 27 changes by joeax910
chinese (traditional): 5 changes by KogentaSan
luxembourgish: 42 changes by phreeze83
korean: 3 changes by telk5093
greek: 3 changes by gh658804
russian: 3 changes by Ln-Wolf
finnish: 4 changes by hpiirai
portuguese: 5 changes by jcteotonio
esperanto: 3 changes by slashdevslashurandom
portuguese (brazilian): 3 changes by pasantoro
2026-04-15 05:18:39 +00:00
Peter Nelson f60bb23268 Codechange: make ChecksumResult a scoped enum (#15482) 2026-04-14 17:50:01 +01:00
translators 8a7bc482ad Update: Translations from eints
swedish: 171 changes by joeax910, 2 changes by robert-i
norwegian (bokmal): 3 changes by eriksorngard
spanish (mexican): 19 changes by qAxelFT
welsh: 211 changes by Ansbaradigeidfran
luxembourgish: 64 changes by phreeze83
russian: 3 changes by Ln-Wolf
esperanto: 327 changes by slashdevslashurandom
2026-04-14 05:19:01 +00:00
Tyler Trahan 9494881e14 Add: [NewGRF] Variable for when a train is driving backwards 2026-04-13 21:52:22 -04:00
Tyler Trahan 631d6ba641 Add: [NewGRF] Flag to allow unpowered wagon to lead train when backing up 2026-04-13 21:52:22 -04:00
Tyler Trahan 2b530751dd Feature: Trains with an engine on the rear drive backwards when reversing 2026-04-13 21:52:22 -04:00
Cyprian Klimaszewski 76c277805d Codefix: comment for TileLoop_Water is outdated. (#15478) 2026-04-13 22:52:00 +01:00
Peter Nelson 73dafe5021 Codechange: use EnumBitSet for DisallowedRoadDirections (#15479) 2026-04-13 22:48:44 +01:00
Peter Nelson b33b0d92a0 Codechange: make RoadBits an EnumBitSet (#15476) 2026-04-13 21:23:17 +01:00
Peter Nelson a5a60c8615 Codechange: make RoadTramType a scoped enum, and use EnumBitSet (#15477) 2026-04-13 18:15:41 +01:00
Anton Molyboha dab82fdff0 Codefix: Minor bug in framerate/performance computation (#15459) 2026-04-12 17:20:55 -04:00
Cyprian Klimaszewski 778839894d Codechange: use a scoped enum for OskActivation. (#15474) 2026-04-12 17:19:51 -04:00
Cyprian Klimaszewski eb9b648587 Codefix: in LandInfoWindow::OnInit tile is accessed without this->. (#15472) 2026-04-12 19:32:59 +00:00
Rubidium 1adfb81aa9 Codechange: properly document a few DrawString 'Rect' variants 2026-04-12 18:10:34 +02:00
Rubidium 7434052eb6 Codechange: make FontSize a scoped enum 2026-04-12 18:10:34 +02:00
Peter Nelson 636fcf3af3 Codechange: make TownProductionEffect a scoped enum 2026-04-12 14:46:54 +01:00
Peter Nelson 7c6da0ae6d Codechange: make TownAcceptanceEffect a scoped enum 2026-04-12 14:46:54 +01:00
Rubidium 053f17c63d Codechange: make base music set folder name consistent with content tarball filenames 2026-04-12 14:46:35 +02:00
Peter Nelson f5061df387 Codechange: make ContentType a scoped enum (#15458) 2026-04-12 13:41:07 +01:00
Peter Nelson a0ff1ec595 Fix 8f14894024: NewGRF debug handler for towns in wrong place since badges (#15467)
Badges should exist before (fake) towns.
2026-04-12 07:45:41 +01:00
Peter Nelson c41f893428 Fix 1ec1f1ef37: object id overrides were not reset between games (#15465) 2026-04-11 21:35:46 +01:00
Rubidium ae2d11c9da Codechange: document a bit of GRF feature handler code 2026-04-11 22:25:12 +02:00
Peter Nelson dd1c5c1a8a Codechange: make GRFTempEngineData::Refittability a scoped enum (#15462) 2026-04-11 20:11:01 +01:00
Peter Nelson 1e17c62f3a Codechange: make FindGRFConfigMode a scoped enum (#15461) 2026-04-11 20:10:45 +01:00
Tyler Trahan 43c8681ee9 Codefix f1f31c1: Set width of string with all parameters (#15460) 2026-04-11 18:42:23 +00:00
Rubidium 7016d2bee3 Codechange: make ChangeInfoResult a scoped enum 2026-04-11 16:06:49 +02:00
Peter Nelson 042facf96c Fix b266a044c4: debug saveload errors were clobbered (#15452) 2026-04-10 19:51:21 +00:00
Loïc Guilloux 7f0be1f27f Fix a6c042855e: [CI] Don't mark previous sucessful deployments inactive (#15451) 2026-04-10 18:40:34 +00:00
Jonathan G Rennison 037cd53803 Codefix fb795089: Duplicate string colour codes in english.txt (#15449) 2026-04-10 10:35:19 -04:00
Loïc Guilloux b3b407acaf Fix a6c042855e: [CI] Deployment creation was failing (#15448) 2026-04-10 14:30:45 +02:00
Loïc Guilloux a6c042855e Fix c3f1372d74: [CI] Deployment was not linked to the PR (#15441) 2026-04-08 18:36:52 +02:00
Peter Nelson 4db1672611 Codechange: make TropicZone a scoped enum (#15442) 2026-04-07 08:33:16 +01:00
Rubidium bcd98a6ba5 Codechange: document a number of functions and variables 2026-04-06 21:17:17 +02:00
Peter Nelson 01568ce0b1 Fix: refresh client list when client renames (#15439) 2026-04-06 16:58:55 +01:00
Peter Nelson 736ed61c1c Codechange: remove size_t indexer from TypedIndexContainer
Makes container index even stronger.
2026-04-06 15:05:30 +01:00
Peter Nelson 1d10e8ee64 Codechange: remove size_t indexer from EnumIndexContainer
Makes container index even stronger.
2026-04-06 15:05:30 +01:00
Peter Nelson a9d7397a77 Codechange: Pass rail and roadtypes separately for tunnel and bridge commands. (#15438)
Avoids passing and casting each via an unrelated type, at the expense of an extra command parameter.
2026-04-06 14:45:22 +01:00
Rubidium 9acfa96cb3 Codechange: use scoped enum for PacketGameType 2026-04-06 15:12:02 +02:00
Rubidium 0ad97043bb Codechange: give more context regarding the PacketType enumerations 2026-04-06 15:12:02 +02:00
Rubidium 316eac1208 Codechange: improve some pathfinder documentation 2026-04-06 15:11:35 +02:00
Rubidium 2e77b6f9f4 Codechange: document missing parameters and return types 2026-04-06 06:52:23 +02:00
Rubidium 9f849fcd9a Codechange: use scoped enum for PacketCoordinatorType 2026-04-06 06:52:14 +02:00
Rubidium 817a47773a Codechange: use scoped enum for PacketAdminType 2026-04-06 06:52:01 +02:00
Rubidium c858e0c90a Codechange: prepare TCPListener for scoped enums 2026-04-06 06:52:01 +02:00
Peter Nelson 6dce7fdca3 Codechange: remove padding spaces from settings types (#15436) 2026-04-06 00:04:19 +01:00
Peter Nelson 9f287a7828 Cleanup 61a0a520f6: remove obsolete IndustryTrigger enum (#15437) 2026-04-05 22:53:56 +00:00
Peter Nelson 78bc829886 Codechange: make Searchpath a scoped enum 2026-04-05 21:46:07 +01:00
Peter Nelson 5aae8e2d64 Codechange: make Subdirectory a scoped enum 2026-04-05 21:46:07 +01:00
Peter Nelson 93a6aa77c6 Codechange: make SaveLoadOperation a scoped enum 2026-04-05 21:46:07 +01:00
Peter Nelson 04f7adb7b7 Codechange: make DetailedFileType a scoped enum 2026-04-05 21:46:07 +01:00
Peter Nelson 74b0b080e7 Codechange: make AbstractFileType a scoped enum 2026-04-05 21:46:07 +01:00
Loïc Guilloux c3f1372d74 Codechange: [CI] Use unprivileged env to build preview (#15419) 2026-04-05 18:16:27 +02:00
Peter Nelson 0b29a2560a Codechange: make GRFStatus, GRFListCompatibility and GRFParameterType scoped enums (#15426) 2026-04-05 16:41:56 +01:00
EmperorJake fed04d0a03 Add: Setting to disable aircraft range limit (#15433) 2026-04-05 10:51:12 -04:00
Cyprian Klimaszewski 4707f78744 Codechange: Make doxygen ignore some parts of code that it does not understand. (#15430) 2026-04-05 15:46:52 +01:00
Charles Pigott 3bb17ce2d7 Codechange: [CI] Use UCRT64 MSYS2 environment (#15422)
* Codechange: [CI] Use UCRT64 MSYS2 environment

* Codechange: [CI] Use pacboy to install packages from the correct subsystem
2026-04-05 10:37:04 +02:00
Peter Nelson 41a0a8967a Fix #15428: [Fluidsynth] treat configured synth.gain as maximum instead of hardcoded value (#15429) 2026-04-04 22:31:37 +01:00
Peter Nelson dd233a9b70 Fix f864aaf131: refresh string width cache for all loaded fonts (#15427)
Cache needs to be loaded for all font sizes, not just those that were missing glyphs.
2026-04-04 21:51:29 +01:00
Peter Nelson cdb548c252 Codechange: make ShoreReplacement and TramDepotReplacement scoped enums (#15425)
Rename TramReplacement to TramDepotReplacement, as it only affects depots.
2026-04-04 17:53:21 +01:00
Peter Nelson bf6898290d Codefix 3f3ee69d0f: really make GrfLoadingStage a scoped enum (#15424) 2026-04-04 14:40:39 +00:00
Cyprian Klimaszewski 4da085e598 Add: [NewGRF] Station flag to divide cargo by area instead of perimeter. 2026-04-04 16:16:32 +02:00
Abigail 4355855b85 Change: Make ScriptTile::IsBuildableRectangle use a TileArea for iteration 2026-04-04 16:15:40 +02:00
Abigail 34f5f1eaea Fix #15318: Nonsensical error message when trying to send aircraft to hangar with no usable airports 2026-04-04 16:15:24 +02:00
David Newton 5f20b45cd8 Codechange: Refactor smooth economy industry production change chances 2026-04-04 16:14:36 +02:00
Rubidium ea5e87651f Codechange: make NetworkAction a scoped enum 2026-04-04 16:08:51 +02:00
Charles Pigott 08563632f3 Remove: [CI] MinGW32 target (#15420) 2026-04-04 12:09:26 +01:00
Rubidium 48a8903d85 Codechange: document network related functions/types/variables 2026-04-03 22:34:01 +02:00
Peter Nelson 856a02ae53 Codefix cdfbb113: FontConfig does not need to load font caches (#15416) 2026-04-03 20:17:15 +00:00
Rubidium cd4fb5dea3 Codechange: simplify the FiosItem sorter logic 2026-04-03 21:40:57 +02:00
Rubidium 95fbc7abf5 Codechange: use scope enum and rename DestType to NetworkChatDestinationType 2026-04-03 21:40:24 +02:00
Rubidium c36f9d2d2a Codechange: add automatic WindowNumber conversions for scoped enums and documentation 2026-04-03 21:40:24 +02:00
Tyler Trahan 41a4917211 Codechange: Cache last vehicle of chains (#15385) 2026-04-03 14:46:41 -04:00
Peter Nelson f864aaf131 Change: test font for eligibility before adding as fallback
Avoids reloading fonts and scanning for missing glyphs for each searched font.
2026-04-03 19:45:46 +01:00
Peter Nelson 9a0af4387b Codechange: pass required font/os_handle via FontProviderManager::LoadFont()
This allows fonts other than configured to be loaded.
2026-04-03 19:45:46 +01:00
Peter Nelson cdfbb113ce Codechange: MissingGlyphSearcher now contains which fontsizes to search for 2026-04-03 19:45:46 +01:00
metablaster 3c9a75a387 Fix: [Script] IsBuildableRectangle for a 0x0 tile should return false (#15357) 2026-04-03 19:38:24 +01:00
Peter Nelson 36878bfbc8 Codechange: remove duplicate and out-of-date documentation for LoadFont (#15411)
Move comments inline to code where useful.
2026-04-02 12:20:46 +01:00
Tyler Trahan 3efaeb0eea Change: Allow subsidies with CargoDist (#15189) 2026-04-01 18:45:27 -04:00
translators 2ac2fa79b9 Update: Translations from eints
korean: 3 changes by telk5093
2026-04-01 05:20:45 +00:00
Jonathan G Rennison 935f39ecab Fix: MaxReliability order condition value not being clamped to <= 100 2026-03-31 23:08:08 +02:00
Tad Hardesty e40c7f0c81 Add: Lower the Send To Depot button when a vehicle is on its way to one (#15397) 2026-03-31 12:23:28 +01:00
Peter Nelson d2dd4d4e4a Codefix: NWidgetDisplayFlag and MWidContainerFlag should be scoped enums 2026-03-31 12:21:00 +01:00
Peter Nelson cca03f3112 Codechange: use scoped enum for Scrollbar Stepping
Rename as it is already in scope of Scrollbar class.
2026-03-31 12:21:00 +01:00
Peter Nelson b856899a13 Codechange: use scoped enum for SizingType 2026-03-31 12:21:00 +01:00
Peter Nelson 8fdc503448 Codechange: use scoped enum for ResizeWidgetType
Rename from ResizeWidgetValues
2026-03-31 12:21:00 +01:00
Peter Nelson ff2028c7d6 Codechange: use scoped enum for ArrowWidgetType
Rename from ArrowWidgetValues to make more sense
2026-03-31 12:21:00 +01:00
Peter Nelson 423bf8d5cd Fix: force sprites in main menu image-text buttons to same square dimensions
Fixes appearance with original basesets
2026-03-31 12:20:40 +01:00
Peter Nelson 56f7d87b56 Fix: size toolbar buttons relative to largest toolbar icon instead of hardcoded value
This improves appearance with basesets that use a different sprite size for toolbar icons.
2026-03-31 12:20:40 +01:00
Peter Nelson d15cbef897 Codechange: call AdjustPaddingForZoom on window creation
Reduces duplication in SetMinimalSize / SetMinimalTextLines
2026-03-31 12:20:40 +01:00
translators 915bc00ea0 Update: Translations from eints
chinese (traditional): 1 change by KogentaSan
english (us): 2 changes by 2TallTyler
hungarian: 5 changes by vargaviktor
portuguese: 2 changes by jcteotonio
esperanto: 2 changes by slashdevslashurandom
portuguese (brazilian): 5 changes by pasantoro, 1 change by jcteotonio
2026-03-31 05:18:54 +00:00
translators 10ac3a22e0 Update: Translations from eints
english (au): 2 changes by krysclarke
chinese (traditional): 3 changes by KogentaSan
greek: 2 changes by gh658804
finnish: 2 changes by hpiirai
esperanto: 61 changes by slashdevslashurandom
portuguese (brazilian): 4 changes by pasantoro
polish: 2 changes by pAter-exe
2026-03-30 05:21:03 +00:00
translators bc9e786f84 Update: Translations from eints
english (au): 1 change by krysclarke
english (us): 1 change by 2TallTyler
greek: 1 change by gh658804
finnish: 1 change by hpiirai
catalan: 7 changes by J0anJosep
portuguese: 1 change by jcteotonio
esperanto: 23 changes by slashdevslashurandom
portuguese (brazilian): 6 changes by pasantoro
polish: 1 change by pAter-exe
2026-03-29 05:19:04 +00:00
Tyler Trahan 877af52d61 Change: Clarify max age shown in vehicle info window (#15403) 2026-03-28 21:52:48 +00:00
translators a9b32664ca Update: Translations from eints 2026-03-28 05:08:57 +00:00
Master Hellish f1f31c1481 Add: Show maximum reliability in vehicle info (#15401) 2026-03-27 20:09:05 +00:00
translators aeddd30a48 Update: Translations from eints
korean: 2 changes by telk5093
polish: 2 changes by pAter-exe
2026-03-27 05:17:26 +00:00
translators 34fdaec58e Update: Translations from eints
norwegian (bokmal): 2 changes by eriksorngard
english (us): 2 changes by 2TallTyler
polish: 1 change by pAter-exe
2026-03-26 05:17:15 +00:00
translators 56342308eb Update: Translations from eints
english (au): 2 changes by krysclarke
chinese (traditional): 2 changes by KogentaSan
greek: 2 changes by gh658804
russian: 2 changes by Ln-Wolf
finnish: 2 changes by hpiirai
portuguese: 2 changes by jcteotonio
portuguese (brazilian): 2 changes by pasantoro
polish: 1 change by Rito13
2026-03-25 05:09:12 +00:00
Tyler Trahan fc3b81a313 Codechange: Rename "non-stop" and "go via" order flags for clarity (#15398) 2026-03-24 08:52:50 -04:00
translators d9c35037d4 Update: Translations from eints
catalan: 4 changes by J0anJosep
2026-03-24 05:09:07 +00:00
Peter Nelson b325575105 Add: Record history of cargo delivered to towns (#15184) 2026-03-23 21:32:18 +00:00
SamuXarick 11d5558c60 Doc: [Script] Update ScriptCargo::GetCargoIncome (#15271)
Update API docs to clarify distance is Manhattan tiles, rename days_in_transit unit to economy-days, update its max from 637 to 163838, and add a reference to ScriptEconomyTime.
2026-03-23 08:38:50 -04:00
Cyprian Klimaszewski 673d696989 Fix 05f2a0f: [NewGRF] Variable 0x69 has not been added for waypoints. (#15396) 2026-03-23 08:34:53 -04:00
Cyprian Klimaszewski 9abaf555a0 Codechange: [CI] Give examples in errors in file description checker. (#15366) 2026-03-23 08:32:03 -04:00
translators 4b40c1fefb Update: Translations from eints
norwegian (bokmal): 65 changes by eriksorngard
2026-03-23 05:14:45 +00:00
translators 600df4caaa Update: Translations from eints
swedish: 25 changes by joeax910
norwegian (bokmal): 38 changes by eriksorngard
spanish: 69 changes by franpacheco-cpp
esperanto: 30 changes by slashdevslashurandom
2026-03-22 05:07:21 +00:00
translators 8237a44152 Update: Translations from eints
esperanto: 94 changes by slashdevslashurandom
2026-03-21 04:58:27 +00:00
Peter Nelson 36869844d5 Fix 38b74639be: dropdown text filter could interfere with hotkeys after closing (#15395) 2026-03-20 19:01:48 +00:00
translators bcc0476d18 Update: Translations from eints
swedish: 2 changes by joeax910
norwegian (bokmal): 141 changes by eriksorngard
2026-03-19 05:08:21 +00:00
translators 60ed1fb779 Update: Translations from eints
swedish: 7 changes by joeax910
2026-03-18 05:10:20 +00:00
translators ba3c2a43f1 Update: Translations from eints
swedish: 32 changes by joeax910
2026-03-17 05:07:34 +00:00
translators f949f3487b Update: Translations from eints
norwegian (bokmal): 164 changes by eriksorngard
2026-03-16 05:19:51 +00:00
translators 4cee9e72d6 Update: Translations from eints
chinese (simplified): 21 changes by WenSimEHRP
turkish: 499 changes by jnmbk
danish: 12 changes by bscargo
2026-03-15 05:14:45 +00:00
translators f296606c92 Update: Translations from eints
ukrainian: 22 changes by StepanIvasyn
2026-03-13 05:03:18 +00:00
translators d2da30debe Update: Translations from eints
vietnamese: 8 changes by KhoiCanDev
2026-03-12 05:04:52 +00:00
Tyler Trahan 812a74f821 Codechange: Make ReverseTrainDirection() static (#15381) 2026-03-11 18:30:03 +00:00
translators 511d3794ce Update: Translations from eints
hungarian: 219 changes by vargaviktor
danish: 35 changes by bscargo
2026-03-11 05:01:37 +00:00
translators a1cf40448e Update: Translations from eints
hungarian: 122 changes by titanicbobo
catalan: 7 changes by J0anJosep
2026-03-10 05:00:35 +00:00
Peter Nelson d02d57b348 Change: Make dropdown text filter persistent in some cases. 2026-03-08 19:25:28 +00:00
Peter Nelson d685fc97f1 Change: Enable dropdown text filter for various dropdown lists. 2026-03-08 19:25:28 +00:00
Peter Nelson 38b74639be Change: Add text filter to dropdown lists. 2026-03-08 19:25:28 +00:00
Peter Nelson 01ecbe5798 Codechange: Allow vertical container direction to be flipped.
Allows widgets to be laid out from bottom to top instead of top to bottom.
2026-03-08 19:25:28 +00:00
Peter Nelson d4f5ded0d2 Fix 802a31cdb0: rejecting or accepting engine preview incorrectly closed preview windo (#15378) 2026-03-08 17:07:40 +00:00
Peter Nelson 37118b93c7 Codechange: use scoped enum for ScriptSettingSource (#15377) 2026-03-08 14:00:23 +00:00
translators 61d17c959e Update: Translations from eints
chinese (traditional): 1 change by KogentaSan
korean: 1 change by telk5093
portuguese: 1 change by jcteotonio
2026-03-08 05:00:54 +00:00
Rubidium 12392fd295 Codechange: document some network types/functions 2026-03-07 17:18:45 +01:00
Rubidium 92dae45773 Codechange: use a scoped enum for NetworkErrorCode 2026-03-07 16:39:22 +01:00
Rubidium 54aaae4ffd Codechange: document functions of GrfActionHandler 2026-03-07 16:26:49 +01:00
Rubidium 984ae8e707 Codechange: replace function with constant 2026-03-07 16:26:41 +01:00
translators 265dde1f28 Update: Translations from eints
english (au): 1 change by krysclarke
english (us): 1 change by 2TallTyler
greek: 1 change by gh658804
russian: 1 change by Ln-Wolf
finnish: 1 change by hpiirai
latvian: 4 changes by lexuslatvia
esperanto: 14 changes by slashdevslashurandom
portuguese (brazilian): 1 change by pasantoro
polish: 1 change by pAter-exe
2026-03-07 04:53:31 +00:00
Rubidium 3f3ee69d0f Codechange: make GrfLoadingStage a scoped enum and remove unused GLS_END 2026-03-06 17:31:25 +01:00
Rubidium dd812125dc Codechange: make StationNaming a scoped enum and add some documentation 2026-03-06 16:22:36 +01:00
Rubidium fd8a28ef9b Codechange: make NetworkJoinStatus a scoped enum and remove unused value/strings 2026-03-06 15:38:11 +01:00
translators b5489e9b90 Update: Translations from eints
esperanto: 56 changes by slashdevslashurandom
polish: 14 changes by pAter-exe
2026-03-06 05:01:08 +00:00
Jonathan G Rennison 71d59aaf3d Change: Show "Delete All" in order window delete button when applicable (#15370) 2026-03-05 17:56:20 -05:00
translators 182a2c5100 Update: Translations from eints
polish: 51 changes by pAter-exe, 5 changes by Rito13
2026-03-05 05:03:19 +00:00
Jonathan G Rennison 4125514ee1 Codechange: [CMake] Remove -flifetime-dse=1 as this is no longer required 2026-03-04 19:59:51 +01:00
Cyprian Klimaszewski 6db72d1f59 Codefix 22f5b61: Paths with "/" in file-descriptions.py are invalid on Windows.
Make file-descriptions.py always check all source files in the
repository when called without arguments regardless of current working
directory.
2026-03-04 19:59:39 +01:00
Cyprian Klimaszewski 48703f0a75 Codechange: Make MainToolbarEditorHotkeys enum an enum class. 2026-03-04 19:59:25 +01:00
Cyprian Klimaszewski 450dd6f789 Codechange: Allow to pass num as a member of scoped enum in Hotkey constructors. 2026-03-04 19:59:25 +01:00
Cyprian Klimaszewski 85a6c4b65d Codechange: Make TownMenuEntries enum an enum class. 2026-03-04 19:59:25 +01:00
Cyprian Klimaszewski c868a25245 Codechange: Make MapMenuEntries enum an enum class. 2026-03-04 19:59:25 +01:00
Cyprian Klimaszewski e30113c01c Codechange: Make SaveLoadEditorMenuEntries and SaveLoadNormalMenuEntries enums enum classes. 2026-03-04 19:59:25 +01:00
Cyprian Klimaszewski 9eaab1cfb9 Codechange: Make OptionMenuEntries enum an enum class. 2026-03-04 19:59:25 +01:00
Cyprian Klimaszewski 829745f28c Codechange: Allow to pass value as a member of scoped enum when creating drop down list. 2026-03-04 19:59:25 +01:00
Cyprian Klimaszewski 6b336c206c Codechange: Make CallBackFunction enum an enum class. 2026-03-04 19:59:25 +01:00
Cyprian Klimaszewski d13887bca4 Codechange: Make ToolbarMode enum an enum class.
Also makes that _toolbar_mode is properly reseted to
ToolbarMode::Normal.
2026-03-04 19:59:25 +01:00
translators 1baaa74679 Update: Translations from eints
maori (new zealand): 5 changes by Kyle-McDangersword
catalan: 26 changes by J0anJosep
esperanto: 107 changes by slashdevslashurandom
polish: 8 changes by Rito13
2026-03-04 05:00:35 +00:00
Rubidium 281d70c185 Codechange: use a scoped enum for ServerGameType 2026-03-03 18:53:37 +01:00
translators 259086ca18 Update: Translations from eints
esperanto: 7 changes by slashdevslashurandom
polish: 16 changes by Rito13
2026-03-03 05:04:00 +00:00
Rubidium 700701bf18 Codechange: use scoped enum for NetworkVehicleType 2026-03-02 21:54:43 +01:00
Jonathan G Rennison 6c508d9046 Codefix: Avoid duplicating industry tables in output binary 2026-03-02 16:21:03 +01:00
Jonathan G Rennison f7317c22a4 Codefix: Double-counting of object types when loading pre-147 savegames 2026-03-02 16:20:53 +01:00
Rubidium efed900b09 Codechange: make ConNetworkAuthorizedKeyAction a scoped enum 2026-03-02 16:20:19 +01:00
translators 52cc44a96e Update: Translations from eints
norwegian (bokmal): 32 changes by eriksorngard
2026-03-02 05:04:53 +00:00
translators c806bee528 Update: Translations from eints
english (au): 2 changes by krysclarke
english (us): 2 changes by 2TallTyler
esperanto: 1 change by slashdevslashurandom
2026-03-01 05:06:41 +00:00
translators e5c9025ad5 Update: Translations from eints
norwegian (bokmal): 5 changes by eriksorngard
chinese (traditional): 1 change by KogentaSan
greek: 2 changes by gh658804
russian: 2 changes by Ln-Wolf
finnish: 3 changes by hpiirai
maori (new zealand): 80 changes by Kyle-McDangersword
portuguese: 1 change by jcteotonio
esperanto: 187 changes by slashdevslashurandom
portuguese (brazilian): 1 change by pasantoro
2026-02-28 04:51:23 +00:00
Peter Nelson 5e9d20d57e Codechange: use scoped enums in industry windows (#15319) 2026-02-27 23:24:26 +00:00
Loïc Guilloux f574fb30c5 Fix 4b7a324: compilation with DEBUG_DUMP_COMMANDS (#15343) 2026-02-27 18:52:20 +01:00
translators 29991c93c3 Update: Translations from eints
hungarian: 96 changes by vargaviktor
2026-02-27 05:04:21 +00:00
Peter Nelson 3f3ced5fea Fix b266a044c4: correct two non-continuation error messages (#15340)
These were decapitalised as if they are continuation error messages, but they are not.
2026-02-26 17:21:31 +00:00
translators 71bf7d3b04 Update: Translations from eints
chinese (traditional): 10 changes by KogentaSan
korean: 438 changes by telk5093
maori (new zealand): 26 changes by Kyle-McDangersword
danish: 9 changes by bscargo
esperanto: 147 changes by slashdevslashurandom
polish: 35 changes by Rito13, 2 changes by pAter-exe
2026-02-26 05:07:15 +00:00
translators ccf816a44d Update: Translations from eints
swedish: 46 changes by robert-i
chinese (traditional): 11 changes by KogentaSan
maori (new zealand): 1 change by Kyle-McDangersword
polish: 42 changes by Rito13, 19 changes by pAter-exe
2026-02-25 05:08:46 +00:00
Loïc Guilloux a683f1c96b Fix 98ac75e: non deterministic handling of train crashes (#15338) 2026-02-24 21:57:11 +01:00
Rubidium 6370859c7e Codechange: add missing documentation to destructors 2026-02-24 16:24:53 +01:00
Rubidium 52b25b981f Codechange: add documentation to the virtual destructors 2026-02-24 16:24:53 +01:00
translators 6b25087c56 Update: Translations from eints
english (au): 435 changes by krysclarke
chinese (traditional): 264 changes by KogentaSan
english (us): 2 changes by 2TallTyler
greek: 436 changes by gh658804
maori (new zealand): 15 changes by Kyle-McDangersword
polish: 33 changes by Rito13
2026-02-24 05:08:16 +00:00
Rito12 f7e20ecb4e Cleanup: STR_ERROR_TOO_CLOSE_TO_EDGE_OF_MAP_SUB is not needed. 2026-02-23 17:14:56 +01:00
Cyprian Klimaszewski 7f66f87af4 Codefix: [CI] file descriptions checker crashed when file was removed/renamed. 2026-02-23 17:13:16 +01:00
Jonathan G Rennison f1390b9cf8 Fix #15310: Incorrect map tile indices used for aircraft outside the map
When crashing aircraft or finding hangars
2026-02-23 17:13:07 +01:00
Rubidium 0670c096f7 Codechange: use existing enum over magic number
DiagDirection is the enum that comes closest. A new enum doesn't make sense
for just one function, especially if you get sort-of overlapping behaviour.
It would be X::EastToSouth, X::SouthToWest where either can be chosen in case
of the dragging being in the southern direction.
2026-02-23 17:11:02 +01:00
translators 1883bb6731 Update: Translations from eints
chinese (traditional): 179 changes by KogentaSan
english (us): 438 changes by 2TallTyler
russian: 438 changes by Ln-Wolf
finnish: 438 changes by hpiirai
maori (new zealand): 516 changes by Kyle-McDangersword
french: 452 changes by glx22
portuguese: 437 changes by jcteotonio
esperanto: 452 changes by slashdevslashurandom
portuguese (brazilian): 479 changes by pasantoro, 1 change by jcteotonio
polish: 250 changes by Rito13
2026-02-23 05:11:31 +00:00
translators 2cce03e2e1 Update: Translations from eints
maori (new zealand): 59 changes by Kyle-McDangersword
french: 1 change by ottdfevr
2026-02-22 05:05:12 +00:00
Peter Nelson ffa961d8b5 Codechange: remove colour prefix from some strings used in error window 2026-02-21 20:24:57 +00:00
Peter Nelson b266a044c4 Change: make continuation error messages consistent
Remove prefix ellipsis and start with lowercase.
2026-02-21 20:24:57 +00:00
Peter Nelson f1ef2ab76d Codechange: ensure error without continuation is drawn in white 2026-02-21 20:24:57 +00:00
Rubidium 5b37a7b35c Codefix: do not remove (last) newline when sorting doxygen warnings 2026-02-21 19:46:26 +01:00
Cyprian Klimaszewski 504b5e656e Codechange: Make documentation comments for some macros recognised by doxygen. 2026-02-21 15:05:13 +01:00
Cyprian Klimaszewski 2ac0811ff9 Codechange: Make documentation comments for some functions recognised by doxygen. 2026-02-21 15:05:13 +01:00
Cyprian Klimaszewski 3c8d7df657 Codechange: Make documentation comments for some enums and their members recognised by doxygen. 2026-02-21 15:05:13 +01:00
Cyprian Klimaszewski 5943382cf5 Codechange: Make documentation comments for some types recognised by doxygen. 2026-02-21 15:05:13 +01:00
Cyprian Klimaszewski 21bee91fa7 Codechange: Make some variables and constants documentation comments recognised by doxygen. 2026-02-21 15:05:13 +01:00
Cyprian Klimaszewski 7a6b7fb1f0 Codechange: Allow to document multiple members with one comment using doxygen groups. 2026-02-21 15:05:13 +01:00
Cyprian Klimaszewski 01776bf161 Codechange: Document INTERNAL_LINKAGE. 2026-02-21 15:05:13 +01:00
Rubidium e0d2843fd7 Codechange: add parameter and return documentation the Squirrel wrappers 2026-02-21 15:03:20 +01:00
Jonathan G Rennison a5cb0529cb Fix: Incorrect scroll bar capacity for train details window total cargo tab 2026-02-21 14:24:28 +01:00
Rubidium 6438bb4d07 Change: distinguish between 'Flat land required' and 'Land sloped in wrong direction' for building depots 2026-02-21 11:44:23 +01:00
Rubidium 9a5187bac8 Codechange: document return types and parameters 2026-02-21 06:13:15 +01:00
Rubidium a4a807cd1b Codechange: improve code style and documentation for TGP 2026-02-21 06:13:07 +01:00
translators 940a3b12ce Update: Translations from eints
english (au): 2 changes by krysclarke
chinese (traditional): 3 changes by KogentaSan
english (us): 2 changes by 2TallTyler
french: 52 changes by ottdfevr
2026-02-21 04:58:10 +00:00
Rubidium 89ffb429c5 Codechange: document missing parameters and return values 2026-02-20 19:00:15 +01:00
Rito12 7179ea8b02 Codechange: Fix all doxygen warnings related to train.h file.
Fixes 14 doxygen warnings.
The `head` parameter of `GroundVehicle::GetPoweredPartPower` virtual method is removed as it's always the same as the object it's called on.
2026-02-20 16:14:33 +01:00
Rubidium dde097a080 Codechange: document parameters and return types 2026-02-20 16:14:02 +01:00
Rubidium 21b4248fe9 Codechange: improve filter parameter name, add documentation 2026-02-20 16:13:34 +01:00
translators de3fa9ada6 Update: Translations from eints
swedish: 2 changes by robert-i
greek: 2 changes by gh658804
hungarian: 2 changes by titanicbobo
russian: 2 changes by Ln-Wolf
finnish: 2 changes by hpiirai
maori (new zealand): 4 changes by Kyle-McDangersword
latvian: 15 changes by lexuslatvia
portuguese: 2 changes by jcteotonio
portuguese (brazilian): 2 changes by pasantoro
polish: 2 changes by pAter-exe
2026-02-20 05:04:55 +00:00
Rubidium 90c8dfa03d Codechange: replace macro and goto with lambda and return 2026-02-19 20:02:07 +01:00
translators 698dc9cb08 Update: Translations from eints
swedish: 2 changes by robert-i
chinese (traditional): 5 changes by KogentaSan
english (us): 2 changes by 2TallTyler
chinese (simplified): 14 changes by WenSimEHRP
italian: 4 changes by quasimagia
maori (new zealand): 37 changes by Kyle-McDangersword
danish: 2 changes by bscargo
polish: 3 changes by pAter-exe
2026-02-19 05:08:09 +00:00
Rubidium 549d555be7 Codechange: document a number of parameters and return types 2026-02-18 22:57:05 +01:00
Rubidium 8f9ceeec75 Codechange: add parameter and return documentation 2026-02-18 22:56:54 +01:00
Rubidium aeadfb2f67 Codechange: demystify some magic numbers and document callback 2026-02-18 22:56:54 +01:00
Rubidium d067bfe577 Codechange: add missing parameter/return documentation to NewGRF code 2026-02-18 18:28:46 +01:00
Rubidium 5226ae3f53 Codechange: use scoped enum for PacketContentType 2026-02-18 17:05:45 +01:00
Rubidium c868b2ee61 Codechange: use scoped enum for PacketTurnType 2026-02-18 17:05:45 +01:00
Rubidium 1af77a7f75 Codechange: use scoped enum for PacketStunType 2026-02-18 17:05:45 +01:00
Rubidium fb817f456d Codechange: use scoped enum for PacketUDPType 2026-02-18 17:05:45 +01:00
Rubidium 02e73ae4ba Codechange: prepare for scoped enums as PacketType 2026-02-18 17:05:45 +01:00
Rubidium ce5058aac8 Codechange: document a few other parameters and return types 2026-02-18 17:05:16 +01:00
Rubidium 671b62e073 Codechange: document a few parameter and return types 2026-02-18 17:04:49 +01:00
Rubidium ab968555e5 Codechange: add missing @param and @return for music 2026-02-18 17:04:19 +01:00
Rubidium 81f2f4e2e8 Codechange: use designated initialisers for _tile_type_water_procs 2026-02-18 17:03:33 +01:00
Rubidium 7e8fad95c6 Codechange: use designated initialisers for _tile_type_void_procs 2026-02-18 17:03:33 +01:00
Rubidium b387f55ff7 Codechange: use designated initialisers for _tile_type_tunnelbridge_procs 2026-02-18 17:03:33 +01:00
Rubidium 8bc3c13a7e Codechange: use designated initialisers for _tile_type_trees_procs 2026-02-18 17:03:33 +01:00
Rubidium d6d6ab1b4f Codechange: use designated initialisers for _tile_type_town_procs 2026-02-18 17:03:33 +01:00
Rubidium e5295f86fa Codechange: use designated initialisers for _tile_type_station_procs 2026-02-18 17:03:33 +01:00
Rubidium 977dc23f06 Codechange: use designated initialisers for _tile_type_road_procs 2026-02-18 17:03:33 +01:00
Rubidium fd7f211351 Codechange: use designated initialisers for _tile_type_rail_procs 2026-02-18 17:03:33 +01:00
Rubidium 6be4e353bc Codechange: use designated initialisers for _tile_type_object_procs 2026-02-18 17:03:33 +01:00
Rubidium c859d34c66 Codechange: use designated initialisers for _tile_type_industry_procs 2026-02-18 17:03:33 +01:00
Rubidium a1708450f7 Codechange: use designated initialisers for _tile_type_clear_procs 2026-02-18 17:03:33 +01:00
Rubidium f469cfb761 Codechange: rename get_slope_z_proc to get_slope_pixel_z_proc to follow GetSlopePixelZ name 2026-02-18 17:03:33 +01:00
Rubidium 7ddeac8810 Codechange: introduce some defaults for TileTypeProcs 2026-02-18 17:03:33 +01:00
Rubidium 781eb4cea4 Codechange: document TileTypeProcs 2026-02-18 17:03:33 +01:00
Peter Nelson 10379441bc Codechange: use enum class for DistributionType 2026-02-18 10:57:28 +00:00
Peter Nelson 7c7f74c551 Codechange: use enum class for Driver::Type enum 2026-02-18 10:57:28 +00:00
Peter Nelson 33a0d59d1d Change: Apply slightly more padding to image-text buttons. (#15077)
Add space equal to the width of the image to balance the text better(?) no matter what font or interface scale settings are use.
2026-02-18 09:12:17 +00:00
Peter Nelson 50110602aa Change: Display rail and road type speed limit text in yellow. (#15076)
This was a "convention" used by NewGRFs which exploited string colour bleeding.
2026-02-18 09:11:46 +00:00
Peter Nelson 0e25f9245c Codechange: use PoolID for newgrf class ids (#15228) 2026-02-18 09:11:04 +00:00
SamuXarick a92dba290b Fix 434163aa: Crashed zeppelin not blocking runway (#15281)
Turns out the block flag was in Reset mode instead of Set.
Move the Set block logic earlier to make it repeatedly set for as long as the zeppeliner exists.
2026-02-18 09:01:18 +00:00
translators 2123fca5ea Update: Translations from eints
english (au): 2 changes by krysclarke
greek: 2 changes by gh658804
hungarian: 2 changes by vargaviktor
russian: 2 changes by Ln-Wolf
finnish: 2 changes by hpiirai
maori (new zealand): 3 changes by Kyle-McDangersword
portuguese: 2 changes by jcteotonio
esperanto: 2 changes by slashdevslashurandom
portuguese (brazilian): 2 changes by pasantoro
polish: 13 changes by Rito13
2026-02-18 05:08:40 +00:00
Rubidium 23dcc9dd07 Codechange: document parameters and return types 2026-02-17 23:11:27 +01:00
Peter Nelson 7c9f2c71f4 Codechange: remove GetAcceptanceAroundTiles always_accepted out parameter (#15295)
Return multiple values as std::pair instead of using pointers for out parameters.
2026-02-17 19:14:54 +00:00
translators e33d53e37e Update: Translations from eints
maori (new zealand): 30 changes by Kyle-McDangersword
2026-02-17 05:08:17 +00:00
Rubidium b1e1d56aba Codechange: improve coding style, replace output parameter and bool return with std::optional 2026-02-16 21:09:31 +01:00
Rubidium 863355f0a6 Codechange: improve documentation 2026-02-16 21:09:31 +01:00
Peter Nelson 1c095ba464 Codechange: use enum class for CompanyAllowListCtrlAction 2026-02-16 20:08:05 +00:00
Peter Nelson d09b91cd92 Codechange: use enum class for CompanyCtrlAction 2026-02-16 20:08:05 +00:00
Peter Nelson a5d028e892 Codechange: use enum class for CompanyRemoveReason 2026-02-16 20:08:05 +00:00
Rubidium 7aecc268b6 Codechange: add missing @param and @return 2026-02-16 17:19:09 +01:00
Rubidium 02438e9934 Codechange: unify behaviour of handling too short packets 2026-02-16 17:07:24 +01:00
Rubidium 0b3c448ea1 Codechange: move documentation to declaration, when there are multiple implementations 2026-02-16 16:35:19 +01:00
Rubidium 581a038913 Codechange: add missing @param and @return for linkgraph 2026-02-16 16:34:51 +01:00
Rubidium 190e91f19d Codechange: add missing @param and @return for kdtree 2026-02-16 16:34:29 +01:00
Rubidium 269633f77b Codechange: document network (adjacent) parameters/return types 2026-02-16 16:34:06 +01:00
Rubidium 465f2c340a Codechange: ignore CDECL macros for Doxygen 2026-02-16 16:34:06 +01:00
Rubidium 68a46f460c Codechange: add some missing parameter and return type documentation 2026-02-16 16:33:41 +01:00
Peter Nelson da4dd91887 Add: Company allow-list can be set to allow anyone. 2026-02-16 14:01:05 +00:00
Peter Nelson a6803199d5 Codechange: use enum class for network client drop down actions
Move enum to scope of window.
2026-02-16 14:01:05 +00:00
translators 65216111b1 Update: Translations from eints
maori (new zealand): 148 changes by Kyle-McDangersword
catalan: 7 changes by J0anJosep
danish: 11 changes by bscargo
2026-02-16 05:12:50 +00:00
Rubidium 55870b4331 Codechange: add missing @param and @return 2026-02-16 04:29:58 +01:00
Rubidium 480040c86e Codechange: reduce ottd_cpuid boilerplate, make static and rename 2026-02-15 22:54:58 +01:00
Rubidium c7468a6922 Codechange: add missing @param and @return 2026-02-15 22:14:37 +01:00
Rubidium a0b173b43c Codechange: remove @return documentation for void methods 2026-02-15 20:30:26 +01:00
Rubidium 308eff6eeb Codechange: add some missing documentation to some core functions 2026-02-15 16:52:16 +01:00
Rubidium 3fc6bbd5bf Codechange: add some missing vehicle related documentation 2026-02-15 12:02:18 +01:00
Rubidium ce676a6300 Codechange: add documentation for core string helpers 2026-02-15 10:16:41 +01:00
translators 72e4955a09 Update: Translations from eints
norwegian (bokmal): 11 changes by eriksorngard
maori (new zealand): 11 changes by Kyle-McDangersword
catalan: 4 changes by J0anJosep
2026-02-15 05:07:41 +00:00
Rubidium 9000092e78 Codechange: exclude unit tests from the main documentation 2026-02-14 21:34:25 +01:00
Rubidium 341e097b5a Codechange: exclude safeguards macros from ending up in documentation
The goal of safeguards is to prevent people from using these macros,
having (doxygen) documentation of these macros defeats that purpose.
2026-02-14 21:34:25 +01:00
Rubidium 5c28e41f6a Codechange: doxygen-document console commands 2026-02-14 20:49:20 +01:00
Rubidium b4bfa06054 Codechange: add missing map-accessor documentation 2026-02-14 18:51:19 +01:00
translators 0e9b3a81ad Update: Translations from eints
catalan: 27 changes by J0anJosep
2026-02-14 05:00:38 +00:00
Peter Nelson 341ab30c4a Fix #15269: crash when building drive-through stop on unowned one-way road (#15270)
Allow over-building drive-through roadstops on unowned one-way roads.
2026-02-13 22:20:55 +00:00
translators 7b88c518cf Update: Translations from eints
hungarian: 11 changes by titanicbobo
portuguese: 11 changes by jcteotonio
2026-02-13 05:07:07 +00:00
translators 396aa75a84 Update: Translations from eints
english (au): 11 changes by krysclarke
swedish: 11 changes by robert-i
chinese (traditional): 11 changes by KogentaSan
english (us): 11 changes by 2TallTyler
korean: 11 changes by telk5093
greek: 11 changes by gh658804
russian: 11 changes by Ln-Wolf
finnish: 11 changes by hpiirai
maori (new zealand): 11 changes by Kyle-McDangersword
esperanto: 11 changes by slashdevslashurandom
portuguese (brazilian): 11 changes by pasantoro
2026-02-12 05:11:17 +00:00
Rubidium 39dfb7c27b Codechange: use size_t for glyph/run counts, remove unneeded glyph count instance variable 2026-02-11 21:44:35 +01:00
Rubidium c52c8e04a8 Codechange: move documentation to super class and add missing documentation 2026-02-11 20:43:31 +01:00
Rubidium f56b17571e Codechange: document undocumented functions and remove duplicate documentation 2026-02-11 16:22:33 +01:00
translators 04436b7401 Update: Translations from eints
esperanto: 58 changes by slashdevslashurandom
2026-02-11 05:13:36 +00:00
Rubidium 8e75626b49 Codechange: unify documentation and parameter names of sorters 2026-02-11 04:53:39 +01:00
Eilon Lipton 83f58b3fbd Add: Show additional vehicle details based on sort criteria (#15158)
When creating vehicles and sorting the list, additional vehicle details are shown for the field being sorted by. For example, when sorting by running cost, the running cost of every vehicle is shown in the vehicle list at the top-level.

Co-authored-by: rubidium42 <rubidium42@users.noreply.github.com>
Co-authored-by: Charles Pigott <charlespigott@googlemail.com>
2026-02-10 08:58:11 -05:00
Abigail ba82ba27a1 Fix #15234: Null pointer dereference opening sign edit window when sign 0 does not exist (#15236) 2026-02-10 08:51:53 -05:00
translators b5eea625cd Update: Translations from eints
esperanto: 32 changes by slashdevslashurandom
2026-02-10 05:14:49 +00:00
Owen Rudge 1fdcccbd49 Codechange: [CI] Upload to the Windows Store automatically.
Microsoft expects a .msixbundle these days, which is effectively identical to .appxbundle, but needs a newer version of Windows 10, so bump our minimum version requirement too.
2026-02-09 15:13:41 +01:00
translators 6090865874 Update: Translations from eints
vietnamese: 27 changes by MagicalDrizzle
2026-02-09 05:13:13 +00:00
ronvid ae80a47c7d Fix #15105: Czech townname generation causing crashes. (#15231) 2026-02-08 23:55:28 +01:00
Peter Nelson 840e4316c6 Fix #15247: crash when handling invalid sprite in OpenGL cursor sprite system (#15248) 2026-02-08 17:29:54 +00:00
Rubidium 4ba0208437 Codechange: document some script functions 2026-02-08 18:27:26 +01:00
Rubidium 9cc9a9702b Codechange: add missing return/parameters to protocol implementation 2026-02-08 17:44:46 +01:00
Rubidium 5e491ebc1b Codechange: document parameters/return types of PickerCallback 2026-02-08 17:44:26 +01:00
Rubidium d62c9b132f Codechange: complete documentation for some blitter/driver functions 2026-02-08 17:44:02 +01:00
Rubidium 7adf44e474 Codechange: document some virtual functions 2026-02-08 17:43:18 +01:00
translators 43af8e94d0 Update: Translations from eints
norwegian (bokmal): 1 change by eriksorngard
danish: 1 change by bscargo
2026-02-08 05:11:51 +00:00
Loïc Guilloux 41c3dbe8ef Fix dd2cf93: Only ignore nearest depot order (#15238) 2026-02-07 17:27:31 +01:00
Rubidium 4d4e37dbf1 Codechange: document some virtual functions 2026-02-06 21:38:49 +01:00
Cyprian Klimaszewski 59d9619fc1 Fix 800ade7: [GS] Docs are missing or do not match the code. (#15230) 2026-02-06 09:48:53 +00:00
translators 4438209683 Update: Translations from eints
latvian: 97 changes by lexuslatvia
portuguese: 1 change by jcteotonio
2026-02-06 05:04:54 +00:00
translators 4bd9d657ca Update: Translations from eints
chinese (traditional): 1 change by KogentaSan
portuguese: 4 changes by jcteotonio
esperanto: 1 change by slashdevslashurandom
2026-02-05 05:05:50 +00:00
translators 9a52dec15c Update: Translations from eints
english (au): 1 change by krysclarke
swedish: 1 change by robert-i
english (us): 1 change by 2TallTyler
korean: 1 change by telk5093
greek: 2 changes by gh658804
hungarian: 6 changes by vargaviktor
russian: 1 change by Ln-Wolf
finnish: 8 changes by hpiirai
maori (new zealand): 1 change by Kyle-McDangersword
portuguese (brazilian): 1 change by pasantoro
polish: 1 change by pAter-exe
2026-02-04 05:00:39 +00:00
Rubidium 10d3c7b293 Codechange: document some virtual functions 2026-02-04 00:27:49 +01:00
Rubidium 22d6a7b5ad Codechange: remove unneeded/unused return type 2026-02-04 00:27:30 +01:00
Rubidium 2e619f31c2 Codefix: various tweaks to improve doxygen parsing 2026-02-04 00:27:13 +01:00
Rubidium 3d844d3f1d Codefix: override already implies virtual, so don't add virtual 2026-02-04 00:26:51 +01:00
Loïc Guilloux 4e767224df Fix #15225: [CMake] Detect mismatch between tag and internal version (#15226) 2026-02-04 00:09:02 +01:00
Peter Nelson 7341c4d9aa Fix #14827: Store random trigger information per-tile. (#14830) 2026-02-03 23:01:55 +00:00
OpenCharlie 1cb2015694 Change: Improve water edges (#14868)
Co-authored-by: charlie <open_charle@outlook.com>
2026-02-03 13:03:27 +00:00
Peter Nelson 10f9f13c64 Codechange: use enum class for TreeGround (#15222) 2026-02-03 08:59:56 +00:00
Rito12 9ed9e42b2a Codechange: [CI] Use doxygen 1.16.1. 2026-02-02 21:09:53 +01:00
Peter Nelson 092fe307ce Codechange: follow defensive coding for clear ground arrays
Ensure arrays used for clear ground lookups never overflow.
2026-02-02 18:49:20 +00:00
Peter Nelson 5c2a37d03e Codechange: use enum class for ClearGround 2026-02-02 18:49:20 +00:00
Richard Wheeler 17cab9b29d Change: Protect rivers from removal when terraforming 2026-02-02 18:22:44 +00:00
Rubidium bcaf3eaec2 Codefix: wrong parameter names and partially missing parameters 2026-02-02 18:18:51 +01:00
Rubidium c6c06e13eb Codefix: wrong parameter names and partially missing parameters 2026-02-02 16:31:46 +01:00
Peter Nelson f25e1f8be1 Fix b4ac5e2231: don't compare clear density with ClearGround (#15217) 2026-02-02 13:02:56 +00:00
translators cb562ef33c Update: Translations from eints
norwegian (bokmal): 33 changes by eriksorngard
maori (new zealand): 8 changes by Kyle-McDangersword
2026-02-02 05:10:52 +00:00
Richard Wheeler 2347a56d7c Fix: Off by one and redundant logic in snowy road checks 2026-02-01 22:51:32 +00:00
Rubidium 58f3255f01 Codefix: remove deprecated Doxygen configuration entries 2026-02-01 19:13:21 +01:00
Rubidium ab43f57d40 Codechange: remove duplicate doxygen warnings 2026-02-01 15:50:45 +01:00
Rubidium c77bbcba9a Codefix: remove unneeded parameter 2026-02-01 15:50:17 +01:00
Rubidium 1c68cc5f03 Codefix: unneeded templating of function 2026-02-01 15:50:17 +01:00
Rubidium 13bd34fcbd Codefix: wrong type in function declaration 2026-02-01 15:50:17 +01:00
Rubidium 73232058d9 Codechange: deduplicate code by dereferencing in callee instead of callers 2026-02-01 15:50:17 +01:00
Rubidium ae7af6c463 Codefix: expand some macros, so doxygen actually sees what is documented 2026-02-01 15:50:07 +01:00
Rubidium 67fac86149 Codefix: remove @param documentation for parameters that don't exist anymore 2026-02-01 15:49:41 +01:00
translators dedcd78da0 Update: Translations from eints
swedish: 23 changes by robert-i
korean: 38 changes by telk5093
esperanto: 1 change by slashdevslashurandom
2026-02-01 05:12:31 +00:00
Rito12 31531e616e Codechange: [CI] Sort doxygen warnings in docs checker. 2026-01-31 16:48:40 +01:00
Rito12 e869d4f2bd Codefix: script_window.hpp contains invalid links in docs. 2026-01-31 16:48:15 +01:00
Abigail b23d4b6e56 Fix #15137: Roads built on steep slopes at the minimum snow level height have inconsistent snowiness 2026-01-31 16:47:19 +01:00
translators d675a71eaf Update: Translations from eints
chinese (traditional): 48 changes by KogentaSan
english (us): 8 changes by 2TallTyler
esperanto: 1 change by slashdevslashurandom
2026-01-31 04:55:19 +00:00
translators 1dd3d65574 Update: Translations from eints
swedish: 2 changes by robert-i
chinese (traditional): 23 changes by KogentaSan
chinese (simplified): 26 changes by WenSimEHRP
hungarian: 2 changes by vargaviktor
russian: 6 changes by Ln-Wolf
portuguese: 1 change by jcteotonio
2026-01-30 05:00:37 +00:00
Rito12 664b507fe2 Change: Add support for next/previous/first/last road/tram type hotkeys. 2026-01-30 00:00:53 +01:00
Konstantin Gribov 6cac80a158 Change: Add support for next/previous/first/last railtype hotkeys.
This patch adds support for next/prev railtype hotkeys which select
previous next, first or last  available railtype.
If user selected any widget in railway build toolbox it will be
preserved.

Such behaviour is useful for players who use PURR, Useless Tracks,
U&ReRMM and similar NewGRFs for quick selection.

I use PURR with semantic tracks coloring (e.g. white purr for waiting
bays, red purr for prio zones etc).

Current patch binds this feature to `[`, `]`, `CTRL+[` and `CTRL+]`.

Initialy by Konstantin Gribov <grossws@gmail.com>.
2026-01-30 00:00:53 +01:00
Rito12 7b5bfe2ac6 Codechange: Create API for special hotkeys used to select items from list. 2026-01-30 00:00:53 +01:00
Cyprian Klimaszewski d17f662490 Codechange: Allow to set cursor directly. 2026-01-30 00:00:53 +01:00
Rito12 2de2c5d31d Cleanup: Expose last built types in the toolbar gui header. 2026-01-30 00:00:53 +01:00
Rito12 a706ac7dc9 Codechange: Add sorter for doxygen warnings. 2026-01-29 23:58:39 +01:00
Rubidium a42ba2493e Codefix: too many or too few documented parameters 2026-01-29 23:38:32 +01:00
Rubidium 79588cbfe3 Codefix: CommandProc does not exist, so remove any references 2026-01-29 23:38:32 +01:00
Rubidium 7d70d70e0e Codefix: remove unused parameter 2026-01-29 23:38:32 +01:00
Rubidium 954ac16c8c Codefix: remove implicit LaTeX dependency 2026-01-29 21:40:06 +01:00
Rubidium 920fc5657b Codechange: move 'out' parameters of GetVehicleFromDepotWndPt to the returned value 2026-01-29 20:03:54 +01:00
Jonathan G Rennison f49924e749 Fix: Station view window fold/unfold not refreshing scrollbar 2026-01-29 19:14:17 +01:00
Rubidium 03c24810b1 Codechange: use scoped enums for timer enumerations, rename one enum 2026-01-29 12:42:27 +01:00
Richard Wheeler 7092162a97 Change: Removing river tiles reduce local authority rating 2026-01-29 07:44:27 +00:00
translators 2bb01bd0e4 Update: Translations from eints
english (au): 8 changes by krysclarke
greek: 8 changes by gh658804
russian: 2 changes by Ln-Wolf
finnish: 7 changes by hpiirai
danish: 7 changes by bscargo
portuguese: 27 changes by jcteotonio
esperanto: 8 changes by slashdevslashurandom
portuguese (brazilian): 8 changes by pasantoro
polish: 9 changes by pAter-exe
2026-01-29 04:58:48 +00:00
Peter Nelson 526ee6434d Codefix: add doxygen for DefaultSaveLoadHandler (#15186) 2026-01-28 22:42:04 +00:00
Rubidium 4adf494ebc Codechange: enum-class-ify Commands 2026-01-28 23:32:51 +01:00
Peter Nelson 014bf7e750 Fix bd57aee3a9: Town supplied history incorrectly clamped to uint16_t (#15183) 2026-01-28 21:13:56 +00:00
translators bec75bc22a Update: Translations from eints
chinese (traditional): 18 changes by KogentaSan
english (us): 18 changes by 2TallTyler
maori (new zealand): 49 changes by Kyle-McDangersword
danish: 18 changes by bscargo
2026-01-28 04:49:12 +00:00
Richard Wheeler 140ca5d3e6 Fix: Use consistent description for invalid orders 2026-01-27 22:57:36 +00:00
Peter Nelson 802a31cdb0 Change #13915: Share one window for engine preview pop ups. (#14703)
If more than one engine preview occurs at the same time, previous/next buttons allow the player to switch between engines.
2026-01-27 22:29:29 +00:00
Loïc Guilloux fb8d4e880e Change: [Script] Reformat callstack output (#15171) 2026-01-27 22:30:04 +01:00
Peter Nelson 3937d7ed6f Fix #15085: don't perform GUI scale changes before video driver is fully initialised (#15175) 2026-01-27 21:07:18 +00:00
Cyprian Klimaszewski 89ddc87c16 Codefix 97f3e5b: Restore defensive programming for _tile_type_procs. (#15165) 2026-01-27 20:41:45 +00:00
Rubidium 98f27ed83c Fix #15166: foundations missing adjacent to NewGRF objects without foundation 2026-01-27 20:23:26 +01:00
translators 70404850e2 Update: Translations from eints
english (au): 18 changes by krysclarke
greek: 23 changes by gh658804
hungarian: 25 changes by vargaviktor
russian: 18 changes by Ln-Wolf
finnish: 18 changes by hpiirai
esperanto: 18 changes by slashdevslashurandom
portuguese (brazilian): 18 changes by pasantoro
polish: 18 changes by pAter-exe
2026-01-27 04:50:06 +00:00
Jonathan G Rennison 44612d5b59 Fix: Articulated road vehicle following with immediately sequential u-turns (#15170) 2026-01-26 18:46:55 +00:00
Peter Nelson 24a4f3b1a6 Fix e0c2ad1: [Script] Give GetPrimary/SecondaryLiveryColour preconditions (#15169)
These calls ignored existing API conventions and did not document them.
2026-01-26 18:45:22 +00:00
translators 402ab7cf5f Update: Translations from eints
swedish: 7 changes by robert-i
greek: 6 changes by superuser-does
portuguese: 1 change by jcteotonio
2026-01-26 04:51:30 +00:00
mmtunligit 2bcbea2694 Feature: User-defined collections of saved items in the picker window (#14813) 2026-01-25 12:38:01 -05:00
translators e661db0396 Update: Translations from eints
maori (new zealand): 7 changes by Kyle-McDangersword
esperanto: 43 changes by slashdevslashurandom
2026-01-25 04:51:08 +00:00
Peter Nelson 6addf5c704 Fix #15088: When building a new train, the refit button state may be incorrect. (#15162)
Invalidate vehicle view window when the vehicle chain is changed.

Co-authored-by: Abigail <abigailthomsonhicks@gmail.com>
2026-01-24 19:12:22 +00:00
Loïc Guilloux 6e356eb267 Fix #15160: Use savegame landscape to display company names in SaveLoad window (#15161) 2026-01-24 19:53:30 +01:00
Peter Nelson a8d0241c0b Fix #15116: install fallback cargo translation table for old cargo sets (#15150)
Old combined cargo/industry sets may set up cargo types with labels and expect them to be usable without a translation table.

Install a fallback table if the NewGRF does not install one to give them a better chance of working.
2026-01-24 14:42:58 +00:00
Peter Nelson 1716d36ebb Fix: Allow infinite water to be selected when loading heightmap (#15146) 2026-01-24 14:42:36 +00:00
Cyprian Klimaszewski 97f3e5b70f Codechange: Make TileType enum an enum class. 2026-01-24 08:34:05 +01:00
Cyprian Klimaszewski 7d34e09f94 Codefix b0542c8: Remove tree counter from docs. 2026-01-24 06:52:59 +01:00
Rubidium 84863e73a9 Fix 666073fc7b: cocoa video driver did not register 2026-01-24 06:50:36 +01:00
Rubidium 0519f82a37 Fix 317dc71c6a: MacOS version detection was broken, and return a tuple instead of three out-params 2026-01-24 06:50:36 +01:00
Rubidium 6b3eaba308 Codechange: remove unneeded MacOSVersionIsAtLeast calls 2026-01-24 06:50:36 +01:00
translators 009905e39e Update: Translations from eints
vietnamese: 11 changes by myquartz
catalan: 7 changes by J0anJosep
esperanto: 791 changes by slashdevslashurandom
2026-01-24 04:46:04 +00:00
Peter Nelson 2d6fe7d9c6 Codefix: incorrect indentation for GetCargoTranslationTable (#15156) 2026-01-23 22:37:16 +00:00
Loïc Guilloux ab68e3616d Fix #15153, beb213f9: Wrong tile used to get bridge reservation overlay (#15154) 2026-01-23 16:36:37 +01:00
Peter Nelson df7bf03cc8 Fix 568b70e: Fjordia SlCompanyLiveries::Load crash (#15148)
Co-authored-by: qirlib <qirlib@gmail.com>
2026-01-22 22:59:20 +00:00
Cyprian Klimaszewski 9545d255ce Codefix: <var> is taken as HTML tag by doxygen. 2026-01-22 23:43:25 +01:00
Cyprian Klimaszewski d18cf47c10 Codefix f4b0ac2: Documentation for non existing parameters is copied to function overrides. 2026-01-22 23:43:25 +01:00
Cyprian Klimaszewski 639cf2aa76 Codefix 9e9b513: Line numbers do not hide in WARN_LINE_FORMAT. 2026-01-22 23:43:25 +01:00
translators 0f0f19092b Update: Translations from eints
danish: 7 changes by bscargo
2026-01-22 04:49:47 +00:00
translators 0c0f55302d Update: Translations from eints
chinese (traditional): 12 changes by KogentaSan
2026-01-21 04:49:23 +00:00
Rito12 23d8a3df1b Codechange: Add GitHub workflow that checks new doxygen warnings.
Uses diff to print warnings.
2026-01-20 17:12:18 +01:00
translators f2d0e3342a Update: Translations from eints
english (us): 7 changes by 2TallTyler
chinese (simplified): 26 changes by WenSimEHRP
korean: 15 changes by telk5093
portuguese: 1 change by jcteotonio
2026-01-20 04:50:04 +00:00
Peter Nelson 4be378bc08 Fix: [Script] Map some error strings to existing errors. (#15113) 2026-01-20 00:04:21 +00:00
Peter Nelson f983a74f2e Codechange: Remove CLEAR_SNOW. (#15136)
Remove CLEAR_SNOW which is no longer used on the map and causes confusion.

IsSnowTile() is checked instead.
2026-01-19 23:34:56 +00:00
Peter Nelson 2bb6d3350f Fix 595b696d61: Tile suitability test for farm field no longer handled snow tiles. (#15134) 2026-01-19 19:59:57 +00:00
Peter Nelson 16dc1fc8bd Fix #15131, 3cf9b15959: Trees no longer spread on partially snowy tiles. (#15133) 2026-01-19 18:45:51 +00:00
translators d685a5034b Update: Translations from eints
english (au): 7 changes by krysclarke
chinese (traditional): 7 changes by KogentaSan
greek: 7 changes by gh658804
russian: 6 changes by Ln-Wolf
finnish: 6 changes by hpiirai
portuguese: 3 changes by jcteotonio
portuguese (brazilian): 6 changes by pasantoro
polish: 7 changes by pAter-exe
2026-01-19 04:50:49 +00:00
translators f1adfd58ef Update: Translations from eints
swedish: 18 changes by robert-i
2026-01-18 04:48:47 +00:00
Richard Wheeler e1e0583d1b Fix: Change tooltips to match change from checkboxes to switches (#15123) 2026-01-17 18:54:45 +00:00
translators 5cc954321a Update: Translations from eints
catalan: 48 changes by J0anJosep
french: 19 changes by glx22
2026-01-17 04:44:52 +00:00
Cyprian Klimaszewski 2e8d76386b Fix 22f5b61: [CI] File descriptions check failure due to missing git fetch depth. 2026-01-16 18:35:19 +01:00
Rubidium d4f0ff927e Codechange: make aircraft vehicle flags enum-class and EnumBitSet 2026-01-16 07:33:13 +01:00
Rubidium d2757ca5f6 Codefix: partial enum class conversion 2026-01-16 07:33:13 +01:00
Abigail df74656996 Fix #15069: World generation map edges GUI starts in an invalid state (#15082) 2026-01-15 20:11:16 -05:00
Cyprian Klimaszewski 25184a23fc Codechange: Make EconomyType an enum class. 2026-01-14 22:07:02 +01:00
Cyprian Klimaszewski 322ce224b4 Codechange: Make Price an enum class. 2026-01-14 22:07:02 +01:00
Cyprian Klimaszewski b556dc24b8 Codechange: Make ScoreID an enum class. 2026-01-14 22:07:02 +01:00
Cyprian Klimaszewski 810dae240a Add: EnumClassIndexContainer class. 2026-01-14 22:07:02 +01:00
Cyprian Klimaszewski e1d474d47d Doc: Add docs for members of Price enum. 2026-01-14 22:07:02 +01:00
Cyprian Klimaszewski 6afdf51aba Doc: Add docs for members of ScoreID enum. 2026-01-14 22:07:02 +01:00
Cyprian Klimaszewski 46fd829267 Doc: Add docs for members of EconomyType enum. 2026-01-14 22:07:02 +01:00
Rito12 22f5b6111f Codechange: Add GitHub workflow that checks descriptions of source files. 2026-01-14 22:05:02 +01:00
Cyprian Klimaszewski aa6309e784 Doc: Add @file annotation to generated strings table. 2026-01-14 22:04:31 +01:00
Cyprian Klimaszewski 54b0fcf6dc Doc: Add @file annotation to generated squirrel files. 2026-01-14 22:04:31 +01:00
Peter Nelson cb4787b92a Fix: [Script] Potential out of bounds array/string slice indexes. 2026-01-14 20:17:11 +00:00
Peter Nelson 6fd761d7f6 Fix: [Script] Potential out of bounds indexed string access. 2026-01-14 20:17:11 +00:00
Peter Nelson 7933b0417d Fix: [Script] Check if array sort function modified array.
Do not allow a script to add or remove elements.
2026-01-14 20:17:11 +00:00
Loïc Guilloux 5e4af50768 Codefix 701cb2e: Incorrect initialisation of treat_first_red_two_way_signal_as_eol (#15109) 2026-01-14 12:28:00 +01:00
translators 86f621b838 Update: Translations from eints
danish: 18 changes by bscargo
polish: 1 change by pAter-exe
maori (new zealand): 18 changes by Kyle-McDangersword
2026-01-14 04:50:04 +00:00
Rubidium 0500198bea Codechange: some documentation for enumerations 2026-01-13 21:54:24 +01:00
Cyprian Klimaszewski e1d90d7b69 Codefix: Remove unnecessary client side checks for setting an unbunch order (#15107) 2026-01-13 20:25:31 +00:00
Owen Rudge 5a906f8a30 Fix: [CI] Use the latest version of GOGGalaxyPipelineBuilder to upload releases to GOG 2026-01-13 11:11:43 +00:00
translators 2d8cb5314c Update: Translations from eints
hungarian: 19 changes by vargaviktor
latvian: 1 change by lexuslatvia
polish: 12 changes by pAter-exe, 3 changes by Rito13
2026-01-13 04:48:58 +00:00
Rubidium 5418a8c6f8 Codechange: document a few enumerations 2026-01-12 06:35:19 +01:00
translators 5f7d11a6c5 Update: Translations from eints
english (au): 9 changes by krysclarke
norwegian (bokmal): 20 changes by eriksorngard
chinese (traditional): 12 changes by KogentaSan
english (us): 9 changes by 2TallTyler
czech: 18 changes by justidan4
greek: 9 changes by gh658804
russian: 9 changes by Ln-Wolf
finnish: 11 changes by hpiirai
portuguese: 9 changes by jcteotonio
portuguese (brazilian): 9 changes by pasantoro
2026-01-12 04:50:57 +00:00
Rubidium c49f1da09e Codefix: incorrect naming of enum class members 2026-01-11 22:57:38 +01:00
Cyprian Klimaszewski e0be9f09f9 Change: Warn about undocumented enum members. 2026-01-11 14:39:44 +01:00
Cyprian Klimaszewski 9e9b51369e Cmake options to customise doxygen warnings. (#15071)
* Add: Cmake otion to hide line numbers in doxygen warnings.
* Add: Cmake options to specify output file for doxygen warnings.

Adds 3 options each one for each docs target, because doxygen deletes
content of the specified file before it begins to write into it.
2026-01-11 09:58:20 +00:00
Peter Nelson dc15cd30e8 Codefix: prevent inefficient reserve behaviour (#15081)
Same as d3420e6e4c but for Town instead of Industry graph.
2026-01-11 09:56:17 +00:00
translators d925595ad1 Update: Translations from eints
polish: 8 changes by pAter-exe
2026-01-11 04:50:26 +00:00
Peter Nelson cc28e19052 Fix #15079: Incorrect dates shown on town cargo history graph. (#15080) 2026-01-11 00:03:56 +00:00
Tyler Trahan 18f2f7eb2d Codechange: Use enum class for setting values (#15074) 2026-01-10 22:40:48 +00:00
SamuXarick 6a06a76b5d Add: Several more regression tests for ScriptList (#14772)
* Add 3ebedec: [Script] Test implicit conversion from bool to integer in lists

* Codefix 333249c: Don't print the inverse of IsEnd in regression

It is more natural to print the value as is.

* Add: [Script] Several more ScriptList regression tests

* Add: [Script] ScriptList regression tests for KeepBelowValue, KeepAboveValue, KeepValue
2026-01-10 18:02:20 +01:00
Tyler Trahan 7ccfd0a658 Feature: Add worldgen setting for average height (#14989) 2026-01-10 16:53:27 +00:00
Cyprian Klimaszewski 666073fc7b Doc: Improve documentation for .mm files. (#15009) 2026-01-10 16:13:46 +00:00
translators 14e0917ae4 Update: Translations from eints
english (au): 9 changes by krysclarke
chinese (traditional): 28 changes by KogentaSan
english (us): 9 changes by 2TallTyler
korean: 8 changes by telk5093
greek: 9 changes by gh658804
russian: 7 changes by Ln-Wolf
finnish: 9 changes by hpiirai
portuguese: 9 changes by jcteotonio
portuguese (brazilian): 7 changes by pasantoro, 2 changes by jcteotonio
2026-01-10 04:46:44 +00:00
Peter Nelson 4131a36e5a Change: Show only selected badge in badge filter dropdown buttons. (#14855)
This avoids complicating languages and translations trying to compose a string from multiple parts.

Also makes these dropdown buttons more consistent with other dropdown buttons.
2026-01-09 23:03:33 +00:00
Peter Nelson 0794287b30 Fix #15067: Mark NewGRF settings as modified after moving by drag & drop. (#15068) 2026-01-09 23:02:54 +00:00
Michael Lutz bd9ced2ec2 Codechange: Support scoped enums as type for settings. (#15065) 2026-01-09 19:55:19 +01:00
translators 241b5fcdfe Update: Translations from eints
danish: 1 change by bscargo
portuguese: 3 changes by jcteotonio
2026-01-09 04:48:28 +00:00
Cyprian Klimaszewski d405e4cb09 Codechange: Use proper widget type and update widgets properly (#14870)
For vehicle window.
2026-01-08 22:31:00 +00:00
Cyprian Klimaszewski 52d6a579e5 Codefix: Use special values of CompanyID instead of CTMN "enum" (#14886) 2026-01-08 22:26:24 +00:00
Cyprian Klimaszewski fadeeb6da1 Fix 0b99a0b: Incorrect error message for aqueducts reaching northern map borders (#14974) 2026-01-08 22:14:58 +00:00
SamuXarick bee3bc0ce5 Fix: [Script] Retarget iterators on list swap (#14805)
Fix script list sorter to correctly retarget iterator when swapping lists.
Each sorter implementation now updates its internal iterator to remain valid after attaching to a new list, avoiding undefined behaviour.
2026-01-08 22:06:57 +00:00
Tyler Trahan 80f19546d2 Change: River springs must be surrounded by hills (#14845) 2026-01-08 20:58:33 +00:00
Tyler Trahan b41e23270d Codefix: Clean up object area placement (#15062) 2026-01-08 20:51:03 +00:00
Tyler Trahan 09a8b1cf5c Feature: Allow placing an area of 1x1 houses (#14708) 2026-01-08 20:43:50 +00:00
Tyler Trahan e97213e7e2 Change: Vehicles loading at stations don't lose reliability (#14841) 2026-01-08 15:34:50 -05:00
Tyler Trahan 9c6100c32a Change: Transmitter object only spawns after original base year (#14786) 2026-01-08 15:21:45 -05:00
Rubidium 55f05846a5 Cleanup: remove unneeded warning disabling macros 2026-01-08 17:52:12 +01:00
Tyler Trahan a6915cd5a3 Fix: Standardize wording of GRF/NewGRF (#15059) 2026-01-08 05:48:23 -05:00
translators 8ba1860eaa Update: Translations from eints
korean: 1 change by telk5093
turkish: 2 changes by jnmbk
2026-01-08 04:48:32 +00:00
Rubidium 463e1131da Cleanup: remove unneeded define 2026-01-07 22:00:42 +01:00
Rubidium 317dc71c6a Codechange: cleanup old defines for unsupported versions of MacOS 2026-01-07 21:34:15 +01:00
Charles Pigott 97a4e1b59e Fix: [Fluidsynth] Don't try to load the default soundfont if it's not set or doesn't exist 2026-01-07 19:18:49 +00:00
Charles Pigott 98799c9b9c Add: [Fluidsynth] Read settings from config files if available 2026-01-07 19:18:49 +00:00
Rubidium f291e3c68e Codechange: reduce required padding of some structs 2026-01-07 18:26:29 +01:00
translators 88a467db19 Update: Translations from eints
swedish: 1 change by robert-i
ukrainian: 14 changes by StepanIvasyn
portuguese: 15 changes by jcteotonio
2026-01-07 04:48:44 +00:00
Peter Nelson 58abbf9e67 Fix #15046: Crash on loading game due to invalid group parents. (#15049)
A bug when deleting groups could leave the group hierarchy in an invalid state.
2026-01-06 18:39:43 +00:00
translators d2b1253583 Update: Translations from eints
english (au): 1 change by krysclarke
chinese (traditional): 3 changes by KogentaSan
english (us): 1 change by 2TallTyler
vietnamese: 1 change by KhoiCanDev
greek: 1 change by gh658804
hungarian: 5 changes by vargaviktor
russian: 1 change by Ln-Wolf
finnish: 1 change by hpiirai
portuguese: 4 changes by jcteotonio
portuguese (brazilian): 1 change by pasantoro
polish: 1 change by Rito13
maori (new zealand): 2 changes by Kyle-McDangersword
2026-01-06 04:48:38 +00:00
SamuXarick 9406e8b36c Codefix: Mostly aligment, and missing closing tags in landscape.html
- Enclose "Presence and direction of bridge above" within <li> </li>
- Several missing closing </li> tags
- A few missing closing </td></tr> tags
- Consistent lower case <br> tags
- A big table misalignment by one space in "m5 bits 7..4: Water tile type:" with an incorrect closing </li> tag at the end
2026-01-05 21:38:56 +01:00
Rito12 dc663d7b0a Feature: Allow to build buoys at (0x0). 2026-01-05 21:26:47 +01:00
Miguel Horta 9e7cb99dc2 Codefix: Use active_tab instead of hardcoded value 2026-01-05 21:25:43 +01:00
Jonathan G Rennison fed2149846 Fix: disable_elrails handling with engines that use both RAIL and ELRL (#15045) 2026-01-05 21:23:05 +01:00
J 710c78a0bb Add: Make smallmap clear to water instead of black if infinite water enabled. (#15041) 2026-01-05 19:12:31 +00:00
translators 50e890eeb5 Update: Translations from eints
greek: 1 change by superuser-does
ukrainian: 33 changes by StepanIvasyn
turkish: 3 changes by jnmbk
portuguese: 12 changes by jcteotonio
portuguese (brazilian): 1 change by jcteotonio
maori (new zealand): 30 changes by Kyle-McDangersword
2026-01-05 04:52:02 +00:00
Peter Nelson f0105607dc Fix #15039: Name and version can disappear from content list. (#15040)
If the small font is set larger than the normal font, both name and version text disappeared.

Take account of the height of the small font when setting the resize height.
2026-01-04 17:54:59 +00:00
Rubidium 7935253ee4 Codefix: initialise all fields of FileScanner 2026-01-03 20:44:38 +01:00
sorbat 46a05315b0 Codefix: [CMake] Make lsb_release a fallback option for platform detection (#15012) 2026-01-03 18:51:30 +00:00
Rubidium 13cf05c941 Codechange: remove unused parameter and unneeded heap allocation 2026-01-03 18:34:37 +01:00
Rubidium e9e7e4af51 Codechange: remove need for new (address) PoolItem(...) 2026-01-03 17:33:18 +01:00
Rubidium 2e6f8fe191 Codefix: use constructor to set index of PoolItems over 'magic'/UB 2026-01-03 16:04:32 +01:00
Rubidium ee9e8ab9b2 Codechange: replace 'new (index) PoolItem(...' with 'PoolItem::CreateAtIndex(index, ...' 2026-01-03 16:04:32 +01:00
Rubidium 2fcd4e189a Codechange: replace 'new PoolItem(...' with 'PoolItem::Create(...' 2026-01-03 16:04:32 +01:00
Tyler Trahan bc842811fc Fix #15026: Remove incorrect info from base sounds tooltip (#15029) 2026-01-03 14:11:15 +00:00
Cyprian Klimaszewski e39932c245 Doc: Update landscape_grid.html to match the source (#15022) 2026-01-03 10:34:11 +00:00
Peter Nelson ebbb7cf3e9 Codechange: Pass company ID to SubtractMoneyFromCompany. (#15018)
This avoids needing to backup and restore `_current_company` just for SubtractMoneyFromCompany to use it.
2026-01-03 09:33:37 +00:00
Rubidium 1464d5fd06 Codechange: [Script] Simplify constructors and add constness 2026-01-03 07:51:57 +01:00
Rubidium 091035b533 Codechange: [Script] Move identical code from sub class to super class 2026-01-03 07:51:57 +01:00
Loïc Guilloux 7d32bf24d5 Codefix: some incorrect doxygen comments (#15019) 2026-01-02 21:53:34 +00:00
Loïc Guilloux fdf75775d9 Fix: [Script] Improve reporting of invalid GetAPIVersion return (#15015) 2026-01-02 17:28:15 +01:00
dependabot[bot] 9add77a790 Upgrade: Bump the actions group with 4 updates (#15011)
Bumps the actions group with 4 updates: [actions/cache](https://github.com/actions/cache), [actions/download-artifact](https://github.com/actions/download-artifact), [actions/upload-artifact](https://github.com/actions/upload-artifact) and [Apple-Actions/import-codesign-certs](https://github.com/apple-actions/import-codesign-certs).


Updates `actions/cache` from 4 to 5
- [Release notes](https://github.com/actions/cache/releases)
- [Changelog](https://github.com/actions/cache/blob/main/RELEASES.md)
- [Commits](https://github.com/actions/cache/compare/v4...v5)

Updates `actions/download-artifact` from 6 to 7
- [Release notes](https://github.com/actions/download-artifact/releases)
- [Commits](https://github.com/actions/download-artifact/compare/v6...v7)

Updates `actions/upload-artifact` from 5 to 6
- [Release notes](https://github.com/actions/upload-artifact/releases)
- [Commits](https://github.com/actions/upload-artifact/compare/v5...v6)

Updates `Apple-Actions/import-codesign-certs` from 5 to 6
- [Release notes](https://github.com/apple-actions/import-codesign-certs/releases)
- [Commits](https://github.com/apple-actions/import-codesign-certs/compare/v5...v6)

---
updated-dependencies:
- dependency-name: actions/cache
  dependency-version: '5'
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: actions
- dependency-name: actions/download-artifact
  dependency-version: '7'
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: actions
- dependency-name: actions/upload-artifact
  dependency-version: '6'
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: actions
- dependency-name: Apple-Actions/import-codesign-certs
  dependency-version: '6'
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: actions
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-01-02 01:01:14 +01:00
Peter Nelson 27c5f9a5cd Fix #14982: Can't place buoys under bridges. (#15007)
Bridges can be built over buoys but not the other way around.
2026-01-01 16:31:08 +00:00
Rito12 f57c2cc56e Fix: Company query popups do not update in multiplayer. 2026-01-01 16:53:26 +01:00
Jonathan G Rennison 0ec507d4c5 Fix b4ac5e22: Incorrect TileIndex used in TownCanBePlacedHere (#15002) 2026-01-01 13:31:37 +00:00
Charles Pigott 1bac36a8c3 Fix: Small ufos would loop over vehicles in depots forever (#15008)
* Codechange: Rename variables to be more meaningful

* Fix: Small ufos would loop over vehicles in depots forever
2026-01-01 13:24:36 +00:00
Cyprian Klimaszewski 29a26b7f93 Codefix: Earlier return from window functions which use window number (#14960) 2025-12-31 22:33:38 +00:00
Charles Pigott 3a41738d9f Fix #15004: Crash when dropdown is open when end game screen appears (#15006) 2025-12-31 22:24:31 +00:00
translators 2a6798cc43 Update: Translations from eints
ukrainian: 12 changes by StepanIvasyn
2025-12-31 04:45:32 +00:00
translators 0d9844a815 Update: Translations from eints
ukrainian: 17 changes by StepanIvasyn
portuguese: 1 change by jcteotonio
2025-12-30 04:45:28 +00:00
translators e5f58ab7c9 Update: Translations from eints
vietnamese: 2 changes by myquartz
greek: 2 changes by superuser-does
ukrainian: 7 changes by StepanIvasyn
portuguese: 10 changes by jcteotonio
2025-12-29 04:47:12 +00:00
translators a0f80e1935 Update: Translations from eints
welsh: 67 changes by Ansbaradigeidfran
czech: 47 changes by LubosKolouch
greek: 9 changes by superuser-does
serbian: 47 changes by nkrs
ukrainian: 16 changes by StepanIvasyn
2025-12-28 04:46:56 +00:00
Peter Nelson 4776837675 Change: Allow rocks on desert tiles. (#14979) 2025-12-27 20:08:00 +00:00
Nusio_coding dd2cf93164 Fix #14610: Do not treat aircraft with only depot orders as having valid orders (#14961) 2025-12-27 14:00:57 -05:00
Tyler Trahan 851310108f Fix #14992, 046b0c6: Respect non-stop order setting when adding waypoint orders (#14993) 2025-12-27 13:59:46 -05:00
Tyler Trahan eaa066990e Fix: Use correct 'minutes per year' setting for old savegames (#14995) 2025-12-27 13:59:28 -05:00
Loïc Guilloux 42cffe0e16 Fix: potential division by 0 when drawing a line (#14994) 2025-12-27 14:50:32 +00:00
translators a900f5656c Update: Translations from eints
swedish: 2 changes by robert-i
vietnamese: 9 changes by KhoiCanDev
greek: 226 changes by superuser-does
catalan: 9 changes by J0anJosep
esperanto: 1 change by legoscia
2025-12-27 04:42:54 +00:00
Peter Nelson 5c96a2c19a Codechange: Improve performance of perlin noise function. (#14991)
Avoid pow() and reduce computations.
2025-12-26 22:01:23 +00:00
Peter Nelson b2fd405e55 Fix: Update language files for changes to English strings. 2025-12-26 16:15:25 +00:00
Peter Nelson dc115cc785 Fix f34c45c36d: Incorrect colour in cargo list in fund industry window. 2025-12-26 16:15:25 +00:00
Peter Nelson fb15730fc7 Fix 8a8ebabb9d: Don't draw bridge deck rail sprites for default bridges. (#14985)
Bridge deck sprites for default rail/road types should only be drawn for custom bridges.
2025-12-26 15:33:09 +00:00
Jonathan G Rennison 8f598b442a Fix b956af63: Incorrect TileIndex used in FindNearestGoodCoastalTownSpot (#14988) 2025-12-26 14:06:21 +00:00
Jonathan G Rennison 5683ddb99a Fix #12465: Click/tooltip alignment of industry chain cargo lines (#14963) 2025-12-26 10:20:15 +00:00
translators 02449652e4 Update: Translations from eints
czech: 37 changes by LubosKolouch
hebrew: 34 changes by maximunited
maori (new zealand): 10 changes by Kyle-McDangersword
2025-12-26 04:43:28 +00:00
Peter Nelson d80ed069b5 Fix 2d7d085e8e: "(Invalid parameter)" in error message when trying to remove another player's object. (#14981)
Formatted error string was thrown away.
2025-12-25 17:21:43 +00:00
Peter Nelson a6d66343ac Fix #14978: Don't clear water tiles after removing buoys. (#14980)
Buoys have no owner and can be cleared by anyone, but the underlying tile (e.g. canal) should not be cleared if has a different owner.
2025-12-25 14:30:39 +00:00
Peter Nelson fb79508968 Fix: Update language files for changes to English strings. 2025-12-25 09:33:49 +00:00
Peter Nelson 2406d22830 Fix f34c45c36d: Incorrect string colour in industry directory. 2025-12-25 09:33:49 +00:00
Peter Nelson 8a4d60b812 Fix #14973: Incorrect colour for some composed strings. 2025-12-25 09:33:49 +00:00
Peter Nelson c7f6971729 Fix c213218b66: Don't highlight selected dropdown item if it has a click result.
This is used by toggles and buttons within the dropdown item, and using those should not cause the row to look selected.
2025-12-25 05:57:44 +00:00
Peter Nelson 48bc08dbfb Fix 39f30692fe: Badge filter toggles no longer worked. 2025-12-25 05:57:44 +00:00
Tyler Trahan c2532fac3e Fix #14938: Don't allow cacti to die off (#14956) 2025-12-24 12:34:46 -05:00
Loïc Guilloux 0019f3831e Codechange: [Script] Reuse memory when changing values of ScriptList items (#14966) 2025-12-24 17:26:46 +00:00
Rubidium 900192e2cd Codefix: add missing tracing debug messages for Coordinator/Stun/Turn 2025-12-24 16:18:14 +01:00
Cyprian Klimaszewski cb06ca69e8 Fix cb1c240: Client list is not invalidated after company take over. (#14955) 2025-12-24 13:01:15 +00:00
Jonathan G Rennison 9ac7623608 Fix #14951: Init and save/load TimerGameEconomy::days_since_last_month (#14962) 2025-12-24 13:00:09 +00:00
translators 2515fc802d Update: Translations from eints
swedish: 7 changes by robert-i
czech: 58 changes by LubosKolouch
greek: 38 changes by superuser-does
spanish: 20 changes by MontyMontana
2025-12-24 04:44:25 +00:00
Peter Nelson 98b0197d53 Change: [Script] Include Array contents in script memory allocation total 2025-12-23 20:52:24 +00:00
Peter Nelson e8424c0ae2 Change: [Script] Include PriorityQueue contents in script memory allocation total 2025-12-23 20:52:24 +00:00
Peter Nelson 13ec1816dc Change: [Script] Include ScriptList contents in script memory allocation total 2025-12-23 20:52:24 +00:00
Peter Nelson d7942c3fd0 Codechange: [Script] Add allocator that uses script memory allocation accounting 2025-12-23 20:52:24 +00:00
Jonathan G Rennison 33c967a558 Codechange: [Script] Add helpers for script memory allocation accounting 2025-12-23 20:52:24 +00:00
Rito12 ed687c6e10 Codechange: Make doxygen warn about lack of documentation for function parameters. 2025-12-23 21:47:35 +01:00
Max c918a29e49 Fix #12937: Allow the computer to go to sleep while the game is paused 2025-12-23 21:47:25 +01:00
translators 07353973a1 Update: Translations from eints
korean: 7 changes by telk5093
greek: 60 changes by superuser-does
russian: 3 changes by Ln-Wolf
danish: 9 changes by bscargo
2025-12-23 04:45:20 +00:00
Loïc Guilloux b36c78b2de Fix #14958, e96f35c: Don't use not yet initialised member (#14959) 2025-12-22 18:21:10 +00:00
Loïc Guilloux b881d8ef5c Fix 9a47f53: Incorrect filter for ScriptList::KeepBetweenValue (#14957) 2025-12-22 14:09:50 +00:00
translators bf2ff83c67 Update: Translations from eints
english (au): 9 changes by krysclarke
norwegian (bokmal): 9 changes by eriksorngard
chinese (traditional): 9 changes by KogentaSan
english (us): 7 changes by 2TallTyler
serbian: 43 changes by nkrs
german: 12 changes by Wuzzy2
irish: 33 changes by temuchie
turkish: 59 changes by jnmbk
portuguese (brazilian): 6 changes by pasantoro
2025-12-22 04:45:58 +00:00
glx22 dbecf010eb Fix #14949, 0717746: Add the new callbacks to the callback table 2025-12-21 16:24:24 +01:00
glx22 95b913bbb7 Codechange: Check command callbacks registration even in single player 2025-12-21 16:24:24 +01:00
Peter Nelson 0a88c084ad Codechange: Don't read font os_handle on MacOS. (#14936)
os_handle is never set, so there's no need to read it.
2025-12-21 15:08:55 +00:00
Peter Nelson c6679bbcab Fix #14945: Hang when deleting implicit orders during vehicle loading. (#14946) 2025-12-21 15:08:13 +00:00
translators 75f1c36eff Update: Translations from eints
english (us): 2 changes by 2TallTyler
chinese (simplified): 9 changes by WenSimEHRP
korean: 2 changes by telk5093
greek: 9 changes by gh658804
russian: 6 changes by Ln-Wolf
finnish: 9 changes by hpiirai
french: 26 changes by glx22
portuguese: 24 changes by jcteotonio
portuguese (brazilian): 3 changes by pasantoro
polish: 9 changes by Rito13
2025-12-21 04:43:57 +00:00
glx22 ec5e7ed5e0 Change: [Script] ScripTiletList::[Add|Remove]Rectangle are now suspendable 2025-12-21 00:37:01 +01:00
glx22 36ccc5e005 Change: [Script] ScriptList::AddList is now suspendable 2025-12-21 00:37:01 +01:00
glx22 d15dd3a036 Change: [Script] ScriptList::[Remove|Keep][Top|Bottom] are now suspendable 2025-12-21 00:37:01 +01:00
glx22 ee789a1197 Change: [Script] ScriptList::[Remove|Keep][XXXValue|List] are now suspendable 2025-12-21 00:37:01 +01:00
Loïc Guilloux fd7f6fcf91 Codechange: [Script] Specify underlying type for ScriptList::SorterType (#14942) 2025-12-20 17:01:39 +01:00
Rubidium 67d9daed47 Codechange: [Script] Make member functions that do not change state const 2025-12-20 16:36:35 +01:00
Peter Nelson f34c45c36d Change: Automatically push/pop colours when formatting a sub-string. (#14006)
Reverts 226a44bf86.

This universally prevents the sub-string from changing colours in the outer string.
2025-12-19 20:17:58 +00:00
Peter Nelson f1e831233a Codefix: Mark destructors override. (#14925)
Remove some empty destructors.
2025-12-19 18:14:29 +00:00
Peter Nelson 39f30692fe Fix #14932: Increase internal badge index size to avoid overflowing BadgeIDs. (#14933) 2025-12-19 18:13:59 +00:00
translators 598d8fd65c Update: Translations from eints
chinese (traditional): 16 changes by KogentaSan
portuguese: 3 changes by jcteotonio
2025-12-19 04:43:16 +00:00
Loïc Guilloux ca1c0007b6 Codechange: [Script] Replace map of sets with set of pairs for per value storage (#14930) 2025-12-18 22:34:47 +01:00
translators 53178d0549 Update: Translations from eints
vietnamese: 41 changes by KhoiCanDev
ukrainian: 3 changes by StepanIvasyn
spanish: 135 changes by MontyMontana
maori (new zealand): 27 changes by Kyle-McDangersword
2025-12-18 04:43:22 +00:00
Loïc Guilloux 5d702a96d6 Codefix 2b24444: Don't run regression tests in parallel (#14935) 2025-12-17 19:19:29 +01:00
Loïc Guilloux 9a47f53db0 Codechange: [Script] Reduce code duplication in ScriptList filtering (#14931) 2025-12-17 15:35:53 +01:00
mmtunligit 938c3de640 Fix a41738e: Picker item recolour depends on gamemode (#14929) 2025-12-17 08:44:04 +00:00
translators 9ad161b7e9 Update: Translations from eints
czech: 4 changes by LubosKolouch
korean: 3 changes by telk5093
ukrainian: 16 changes by StepanIvasyn
portuguese: 1 change by jcteotonio
2025-12-17 04:42:55 +00:00
translators 483f1f0afa Update: Translations from eints
czech: 3 changes by jacobczsk
hungarian: 2 changes by baliball
french: 10 changes by ben20471
portuguese: 2 changes by jcteotonio
2025-12-16 04:44:42 +00:00
Peter Nelson ebdc82ad54 Fix #14921: Crash during station autorefit if station doesn't accept current cargo type. (#14924)
Add convenience helpers to correctly retrieve goods entry cargo available/totals.

Avoids having to check if cargo data is available before accessing it, which was missing for autorefit.
2025-12-15 18:06:43 +00:00
Peter Nelson b1c0198d3f Fix #14917: Crash when opening house picker with no houses available. (#14920) 2025-12-15 16:42:50 +00:00
Peter Nelson 447959b214 Fix #14916: Duration of error message window could be too short. (#14919)
The timer for automatically closing the error message was started when creating the window, instead of when first displaying the window.
2025-12-15 16:42:36 +00:00
Peter Nelson f6eba87e47 Fix #14915: Crash due to divide-by-zero of industry probabilities. (#14918) 2025-12-15 16:42:10 +00:00
Rito12 859b56a066 Doc: Correct file descriptions to match coding style and doxygen. 2025-12-15 17:31:00 +01:00
translators e1333abc3e Update: Translations from eints
chinese (traditional): 30 changes by KogentaSan
czech: 121 changes by jacobczsk
luxembourgish: 6 changes by phreeze83
russian: 11 changes by Ln-Wolf
turkish: 145 changes by jnmbk
dutch: 48 changes by Afoklala
portuguese: 21 changes by jcteotonio
2025-12-15 04:45:58 +00:00
Rubidium 4e69ef938b Codefix: missing GPL headers 2025-12-14 20:26:22 +01:00
Peter Nelson 3351975133 Codefix: Avoid shadowing month/year BaseGraphWindow member variables. (#14912) 2025-12-14 19:08:45 +00:00
Loïc Guilloux 7b69a0b7fa Fix ff08a22: script configs were cleared by AIPL and GSDT chunks from intro game (#14910) 2025-12-14 16:07:19 +00:00
Rubidium 5e2df6d028 Codefix: move error instead of copying it 2025-12-14 08:48:28 +01:00
Rubidium 36589abb33 Codefix: always initialise field 2025-12-14 08:48:28 +01:00
Rubidium ed318b0154 Codefix: unused assignment 2025-12-14 08:48:28 +01:00
Rubidium d3420e6e4c Codefix: prevent inefficient reserve behaviour
When reserving by size() + 2, in a loop you're not really helping.
2025-12-14 08:48:28 +01:00
Rubidium a3393af26c Codefix: possible null pointer dereference 2025-12-14 08:48:16 +01:00
translators 0ec8842232 Update: Translations from eints
swedish: 2 changes by joeax910
norwegian (bokmal): 2 changes by eriksorngard
catalan: 6 changes by J0anJosep
danish: 2 changes by bscargo
portuguese: 89 changes by jcteotonio
2025-12-14 04:44:00 +00:00
translators 6851cb53e8 Update: Translations from eints 2025-12-13 11:10:41 +00:00
Rubidium 13ea783bd8 Fix #14677: desync due to using newgame time settings to validate savegame time settings 2025-12-13 11:54:02 +01:00
Peter Nelson b03347f00c Revert: "Change: Support side-by-side fallback FontCaches instead of hierarchical. (#13303)"
This reverts commit 1829f7926d.
2025-12-13 09:09:21 +00:00
Peter Nelson 973514adc3 Revert: "Add: Automatically load fonts for missing glyphs. (#14856)"
This reverts commit c1d37d8699.
2025-12-13 09:09:21 +00:00
Peter Nelson 0778687ed5 Revert: "Fix #14892, 1829f7926d: Potential crash when logging fonts for survey. (#14896)"
This reverts commit 542dd1a597.
2025-12-13 09:09:21 +00:00
translators 1091fa6071 Update: Translations from eints
english (au): 2 changes by krysclarke
chinese (traditional): 2 changes by KogentaSan
english (us): 2 changes by 2TallTyler
chinese (simplified): 8 changes by WenSimEHRP
greek: 2 changes by gh658804
russian: 2 changes by Ln-Wolf
finnish: 6 changes by hpiirai
portuguese: 28 changes by jcteotonio
portuguese (brazilian): 2 changes by pasantoro
polish: 2 changes by pAter-exe
2025-12-13 04:40:52 +00:00
Peter Nelson 688958da8a Fix: Graph label allocated size could be too small. (#14901)
Set initial size based on what could be displayed, instead of what is displayed right now.
2025-12-12 09:24:16 +00:00
translators 8a5c052933 Update: Translations from eints
norwegian (bokmal): 6 changes by eriksorngard
hungarian: 1 change by vargaviktor
hebrew: 48 changes by yair-bn
portuguese: 2 changes by jcteotonio
polish: 7 changes by Rito13, 4 changes by pAter-exe
2025-12-12 04:44:29 +00:00
glx22 392f743bcd Change: [Script] ScriptList::Valuate is now suspendable 2025-12-11 23:30:27 +01:00
glx22 81b4075095 Add: [Script] Framework to make selected native calls suspendable 2025-12-11 23:30:27 +01:00
Peter Nelson ef4687895e Add: Setting to control minimum distance between towns. (#14893)
Backported from JGRPP.
2025-12-11 11:28:04 +00:00
translators a2304154d4 Update: Translations from eints
english (au): 4 changes by krysclarke
swedish: 6 changes by joeax910
chinese (traditional): 1 change by KogentaSan
english (us): 1 change by 2TallTyler
greek: 1 change by gh658804
russian: 2 changes by Ln-Wolf
finnish: 1 change by hpiirai
turkish: 30 changes by jnmbk
danish: 38 changes by bscargo
portuguese: 10 changes by jcteotonio
portuguese (brazilian): 4 changes by pasantoro
polish: 1 change by pAter-exe
2025-12-11 04:44:09 +00:00
Loïc Guilloux f32646743a Codechange: [CI] setup-vcpkg action is now in OpenTTD/actions (#14897) 2025-12-10 21:13:44 +01:00
Peter Nelson 542dd1a597 Fix #14892, 1829f7926d: Potential crash when logging fonts for survey. (#14896)
Check for empty fontcache slots before outputting font info in survey.
2025-12-10 17:56:43 +00:00
Kuhnovic 19b65cd3e7 Codechange: Added DIAGDIRECTIONS_ALL. (#14895) 2025-12-10 14:14:13 +01:00
Peter Nelson 1e6153e875 Fix #14891, a8650c6b06: Minimum sprite zoomlevel could break in some cases. (#14894)
Caused by sprite control flags not being reset when scanning available sprites.
2025-12-10 08:17:24 +00:00
translators fef0d830b2 Update: Translations from eints
swedish: 5 changes by robert-i
chinese (traditional): 7 changes by KogentaSan
english (us): 3 changes by 2TallTyler
korean: 5 changes by telk5093
greek: 3 changes by gh658804
hungarian: 5 changes by vargaviktor
russian: 3 changes by Ln-Wolf
finnish: 3 changes by hpiirai
turkish: 147 changes by jnmbk
portuguese: 28 changes by jcteotonio
portuguese (brazilian): 6 changes by jcteotonio
polish: 10 changes by Rito13
2025-12-09 04:41:41 +00:00
Peter Nelson 9695de9e1c Fix #14889: [FluidSynth] Don't try to load a soundfont that doesn't exist. 2025-12-08 23:30:06 +00:00
Peter Nelson 2162983054 Codechange: Auto-reformat fluidsynth.cpp. 2025-12-08 23:30:06 +00:00
Kuhnovic 8e35553208 Feature: Configurable sign text colors in scenario editor. (#14743) 2025-12-08 17:52:19 +01:00
Peter Nelson 0d59ecf7de Codefix 6f52a977a8: GRFConfigFlag was given enum class naming without being enum class. (#14884) 2025-12-08 08:59:02 +00:00
translators 2c8a15cf36 Update: Translations from eints
english (au): 2 changes by krysclarke
english (us): 2 changes by 2TallTyler
greek: 2 changes by gh658804
russian: 2 changes by Ln-Wolf
finnish: 2 changes by hpiirai
catalan: 18 changes by J0anJosep
portuguese: 10 changes by jcteotonio
portuguese (brazilian): 2 changes by pasantoro
polish: 2 changes by pAter-exe
2025-12-08 04:44:16 +00:00
Loïc Guilloux 40be27503d Fix: [CI] Install NSIS for windows releases (#14885) 2025-12-07 23:50:14 +00:00
Michael Lutz 170c29b376 Codechange: We are heading to 16 (#14882) 2025-12-07 23:16:08 +01:00
1164 changed files with 62069 additions and 48599 deletions
-50
View File
@@ -1,50 +0,0 @@
name: 'Setup vcpkg'
description: 'Installs vcpkg and initialises binary caching via NuGet'
inputs:
vcpkg-location:
description: 'Where to install vcpkg'
required: true
mono-install-command:
description: 'Command to run to install mono'
required: false
runs:
using: "composite"
steps:
- name: Install vcpkg
shell: bash
run: |
git clone https://github.com/microsoft/vcpkg "${{ inputs.vcpkg-location }}"
cd "${{ inputs.vcpkg-location }}"
./bootstrap-vcpkg.$(if [ "${{ runner.os }}" = "Windows" ]; then echo "bat"; else echo "sh"; fi) -disableMetrics
- name: Install mono
if: inputs.mono-install-command
shell: bash
run: |
${{ inputs.mono-install-command }}
echo "MONO=mono" >> "$GITHUB_ENV"
- name: Setup NuGet Credentials
shell: bash
env:
FEED_URL: 'https://nuget.pkg.github.com/${{ github.repository_owner }}/index.json'
run: |
cd "${{ inputs.vcpkg-location }}"
${{ env.MONO }} $(./vcpkg fetch nuget | tail -n 1) \
sources add \
-source "${{ env.FEED_URL }}" \
-storepasswordincleartext \
-name "GitHub" \
-username "${{ github.repository_owner }}" \
-password "${{ github.token }}"
${{ env.MONO }} $(./vcpkg fetch nuget | tail -n 1) \
setapikey "${{ github.token }}" \
-source "${{ env.FEED_URL }}"
- name: Setup vcpkg caching
uses: actions/github-script@v7
with:
script: |
core.exportVariable('VCPKG_BINARY_SOURCES', 'clear;nuget,GitHub,readwrite')
+85
View File
@@ -0,0 +1,85 @@
"""
Script to scan the OpenTTD source-tree for doxygen @file annotations.
Checks whether they exist, are recognised by doxygen and match coding style.
"""
import os
import sys
END_OF_SENTENCE = [".", "!", "?"]
SOURCE_FILE_EXTENSION = ["cpp", "c", "hpp", "h", "mm", "m", "cc"]
TEMPLATE_FILE_EXTENSION = ["preamble", "in"]
REPO_DIR = os.path.abspath(os.path.join(os.path.dirname(__file__), ".."))
EXCLUDED_FILES = [
os.path.join(REPO_DIR, "src", "script", "api", "squirrel_export.sq.hpp.in"),
os.path.join(REPO_DIR, "src", "script", "api", "script_includes.hpp.in"),
]
def read_files_list_from_file(file_path):
with open(file_path, "r") as f:
while line := f.readline():
yield line[:-1]
def list_files_walk(start_path="."):
for root, dirs, files in os.walk(start_path):
for file in files:
yield os.path.join(root, file)
def check_descriptions(files):
errors = []
for path in files:
if os.path.abspath(path) in EXCLUDED_FILES:
continue
if path.find("3rdparty") != -1 or path.find("lang") != -1:
continue
if not os.path.isfile(path):
continue
name = path[path.rfind("/") + 1 :]
while True:
extension = name[name.rfind('.') + 1 :]
if extension not in TEMPLATE_FILE_EXTENSION:
break
name = name[0 : -len(extension) - 1]
if extension not in SOURCE_FILE_EXTENSION:
continue
with open(path, "r") as f:
content = f.read()
ann = content.find(f"@file {name} ")
reason = f'Should be of the form "/** @file {name} Brief description of the file here. */"'
if ann == -1:
if content.find("@file") == -1:
errors.append(f'File "{path}" does not provide description. {reason}')
continue
else:
end = content.find("\n", ann)
start = content.rfind("\n", 0, ann) + 1
if content[start : ann] == "/** " and content[end - 3 : end] == " */" and content[end - 4] in END_OF_SENTENCE:
continue
elif content[start : ann] == " * ":
if content[start - 4 : start - 1] == "/**" and content[end - 1] in END_OF_SENTENCE and content[end + 1 : end + 4] != " */":
continue
reason = f"Should be of the form:\n/**\n * @file {name} Brief description of the file here.\n * Detailed description of the file here.\n */"
errors.append(f'Description of file "{path}" does not match coding style. {reason}')
return errors
def main():
if len(sys.argv) == 1:
files = list_files_walk(os.path.join(REPO_DIR, "src"))
else:
files = read_files_list_from_file(sys.argv[1])
errors = check_descriptions(files)
if errors:
print("\n".join(errors))
sys.exit(1)
print("OK")
if __name__ == "__main__":
main()
+26
View File
@@ -0,0 +1,26 @@
name: Install Doxygen
runs:
using: composite
steps:
- name: Install Doxygen
run: |
echo "::group::Downloading"
# Download currently (at the time of creation this action) latest version of Doxygen
# because version in ubuntu repository (1.9.8) is outdated and buggy.
wget -O doxygen.tar.gz "https://github.com/doxygen/doxygen/releases/download/Release_1_17_0/doxygen-1.17.0.linux.bin.tar.gz"
echo "::endgroup::"
echo "::group::Unpacking"
tar -xzf doxygen.tar.gz
rm doxygen.tar.gz
echo "::endgroup::"
echo "::group::Installing"
cd doxygen*
sudo make install
echo "::endgroup::"
cd ..
rm -r doxygen*
shell: bash
+28
View File
@@ -0,0 +1,28 @@
""" Script that sorts warnings generated by doxygen to maintain consistent order. """
import sys
def read_by_line(file_path):
with open(file_path, "r") as f:
while line := f.readline():
yield line[:-1]
def main():
if len(sys.argv) != 3:
print("Wrong number of arguments provided, expected two.")
print("Usage: python3 sort_doxygen_warnings.py [input_file] [output_file]")
sys.exit(1)
warnings = []
for line in read_by_line(sys.argv[1]):
if "warning:" in line or "error:" in line:
warnings.append(line)
continue
# Doxygen warnings can span multiple lines, keep these lines together.
warnings[-1] = f"{warnings[-1]}\n{line}"
warnings = sorted(set(warnings))
with open(sys.argv[2], "w") as out:
out.write("\n".join(warnings))
out.write("\n")
print("Doxygen warnings sorted successfully.")
if __name__ == "__main__":
main()
+1 -1
View File
@@ -105,4 +105,4 @@ jobs:
steps:
- name: Check annotations
uses: OpenTTD/actions/annotation-check@v5
uses: OpenTTD/actions/annotation-check@v6
+3 -10
View File
@@ -14,7 +14,7 @@ jobs:
container:
# If you change this version, change the numbers in the cache step,
# .github/workflows/preview-build.yml (2x) and os/emscripten/Dockerfile too.
image: emscripten/emsdk:3.1.57
image: emscripten/emsdk:6.0.1
steps:
- name: Checkout
@@ -24,20 +24,13 @@ jobs:
run: |
git config --global --add safe.directory ${GITHUB_WORKSPACE}
- name: Update to modern GCC
run: |
apt-get update
apt-get install -y gcc-12 g++-12
update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-12 100
update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-12 100
- name: Setup cache
uses: actions/cache@v4
uses: actions/cache@v5
with:
# If you change this version, change the numbers in the image configuration step,
# .github/workflows/preview-build.yml (2x) and os/emscripten/Dockerfile too.
path: /emsdk/upstream/emscripten/cache
key: 3.1.57-${{ runner.os }}
key: 6.0.1-${{ runner.os }}
- name: Add liblzma support
run: |
+3 -5
View File
@@ -33,10 +33,8 @@ jobs:
uses: actions/checkout@v6
- name: Setup vcpkg
uses: ./.github/actions/setup-vcpkg
with:
vcpkg-location: ${{ runner.temp }}/vcpkg
mono-install-command: 'sudo apt-get install -y --no-install-recommends mono-complete'
id: vcpkg
uses: OpenTTD/actions/setup-vcpkg@v6
- name: Install dependencies
run: |
@@ -67,7 +65,7 @@ jobs:
# We only use breakpad from vcpkg, as its CMake files
# are a bit special. So the Ubuntu's variant doesn't work.
${{ runner.temp }}/vcpkg/vcpkg install breakpad
${{ steps.vcpkg.outputs.vcpkg }} install breakpad
echo "::endgroup::"
env:
+3 -5
View File
@@ -35,10 +35,8 @@ jobs:
uses: actions/checkout@v6
- name: Setup vcpkg
uses: ./.github/actions/setup-vcpkg
with:
vcpkg-location: ${{ runner.temp }}/vcpkg
mono-install-command: 'brew install mono'
id: vcpkg
uses: OpenTTD/actions/setup-vcpkg@v6
- name: Install OpenGFX
run: |
@@ -67,7 +65,7 @@ jobs:
cmake .. \
-DCMAKE_OSX_ARCHITECTURES=${{ inputs.full_arch }} \
-DVCPKG_TARGET_TRIPLET=${{ inputs.arch }}-osx \
-DCMAKE_TOOLCHAIN_FILE=${{ runner.temp }}/vcpkg/scripts/buildsystems/vcpkg.cmake \
-DCMAKE_TOOLCHAIN_FILE=${{ steps.vcpkg.outputs.vcpkg-cmake }} \
${{ inputs.extra-cmake-parameters }} \
# EOF
echo "::endgroup::"
+10 -9
View File
@@ -31,15 +31,16 @@ jobs:
install: >-
git
make
mingw-w64-${{ inputs.arch }}-cmake
mingw-w64-${{ inputs.arch }}-gcc
mingw-w64-${{ inputs.arch }}-lzo2
mingw-w64-${{ inputs.arch }}-libpng
mingw-w64-${{ inputs.arch }}-lld
mingw-w64-${{ inputs.arch }}-ninja
mingw-w64-${{ inputs.arch }}-libogg
mingw-w64-${{ inputs.arch }}-opus
mingw-w64-${{ inputs.arch }}-opusfile
pacboy: >-
cmake:p
gcc:p
lzo2:p
libpng:p
lld:p
ninja:p
libogg:p
opus:p
opusfile:p
- name: Install OpenGFX
shell: bash
+2 -4
View File
@@ -31,10 +31,8 @@ jobs:
fail-fast: false
matrix:
include:
- msystem: MINGW64
- msystem: UCRT64
arch: x86_64
- msystem: MINGW32
arch: i686
name: MinGW (${{ matrix.arch }})
@@ -57,4 +55,4 @@ jobs:
steps:
- name: Check annotations
uses: OpenTTD/actions/annotation-check@v5
uses: OpenTTD/actions/annotation-check@v6
+3 -4
View File
@@ -21,9 +21,8 @@ jobs:
uses: actions/checkout@v6
- name: Setup vcpkg
uses: ./.github/actions/setup-vcpkg
with:
vcpkg-location: ${{ runner.temp }}/vcpkg
id: vcpkg
uses: OpenTTD/actions/setup-vcpkg@v6
- name: Install OpenGFX
shell: bash
@@ -61,7 +60,7 @@ jobs:
cmake .. \
-GNinja \
-DVCPKG_TARGET_TRIPLET=${{ inputs.arch }}-windows-static \
-DCMAKE_TOOLCHAIN_FILE="${{ runner.temp }}\vcpkg\scripts\buildsystems\vcpkg.cmake" \
-DCMAKE_TOOLCHAIN_FILE="${{ steps.vcpkg.outputs.vcpkg-cmake }}" \
# EOF
echo "::endgroup::"
+3 -5
View File
@@ -28,10 +28,8 @@ jobs:
uses: actions/checkout@v6
- name: Setup vcpkg
uses: ./.github/actions/setup-vcpkg
with:
vcpkg-location: ${{ runner.temp }}/vcpkg
mono-install-command: 'sudo apt-get install -y --no-install-recommends mono-complete'
id: vcpkg
uses: OpenTTD/actions/setup-vcpkg@v6
- name: Install dependencies
run: |
@@ -61,7 +59,7 @@ jobs:
# We only use breakpad from vcpkg, as its CMake files
# are a bit special. So the Ubuntu's variant doesn't work.
${{ runner.temp }}/vcpkg/vcpkg install breakpad
${{ steps.vcpkg.outputs.vcpkg }} install breakpad
echo "::endgroup::"
env:
+1 -1
View File
@@ -19,7 +19,7 @@ jobs:
fetch-depth: 4
- name: Get pull-request commits
uses: OpenTTD/actions/checkout-pull-request@v5
uses: OpenTTD/actions/checkout-pull-request@v6
- name: Check commits
uses: OpenTTD/OpenTTD-git-hooks@main
+88
View File
@@ -0,0 +1,88 @@
name: Docs checker
on:
pull_request:
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: ${{ github.ref != 'refs/heads/master' }}
jobs:
docs-checker:
name: New doxygen warnings checker
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v6
with:
fetch-depth: 4
- name: Get pull-request commits
uses: OpenTTD/actions/checkout-pull-request@v6
- name: Install Doxygen
uses: ./.github/install-doxygen
- name: Build docs for PR
run: |
mkdir build
echo "::group::CMake"
cmake -S . -B build -DOPTION_DOCS_ONLY=ON -DOPTION_LINE_IN_DOXYGEN_WARNINGS=OFF -DOPTION_DOXYGEN_GS_WARN_FILE="Warnings.GS" -DOPTION_DOXYGEN_AI_WARN_FILE="Warnings.AI" -DOPTION_DOXYGEN_WARN_FILE="Warnings.source"
echo "::endgroup::"
echo "::group::Build Source"
cmake --build build --target docs_source
python3 .github/sort_doxygen_warnings.py build/Warnings.source doxygen_warnings.PR
echo "::endgroup::"
echo "::group::Build AI"
cmake --build build --target docs_ai
python3 .github/sort_doxygen_warnings.py build/Warnings.AI doxygen_AI_warnings.PR
echo "::endgroup::"
echo "::group::Build GS"
cmake --build build --target docs_game
python3 .github/sort_doxygen_warnings.py build/Warnings.GS doxygen_GS_warnings.PR
echo "::endgroup::"
rm -r build
- name: Build docs for base branch
run: |
git checkout HEAD^
mkdir build
echo "::group::CMake"
cmake -S . -B build -DOPTION_DOCS_ONLY=ON -DOPTION_LINE_IN_DOXYGEN_WARNINGS=OFF -DOPTION_DOXYGEN_GS_WARN_FILE="Warnings.GS" -DOPTION_DOXYGEN_AI_WARN_FILE="Warnings.AI" -DOPTION_DOXYGEN_WARN_FILE="Warnings.source"
echo "::endgroup::"
echo "::group::Build Source"
cmake --build build --target docs_source
python3 .github/sort_doxygen_warnings.py build/Warnings.source doxygen_warnings.base
echo "::endgroup::"
echo "::group::Build AI"
cmake --build build --target docs_ai
python3 .github/sort_doxygen_warnings.py build/Warnings.AI doxygen_AI_warnings.base
echo "::endgroup::"
echo "::group::Build GS"
cmake --build build --target docs_game
python3 .github/sort_doxygen_warnings.py build/Warnings.GS doxygen_GS_warnings.base
echo "::endgroup::"
rm -r build
- name: Compare doxygen warnings and errors
run: |
unset FAIL
diff doxygen_warnings.base doxygen_warnings.PR | grep '^>' && FAIL=1
diff doxygen_AI_warnings.base doxygen_AI_warnings.PR | grep '^>' && FAIL=1
diff doxygen_GS_warnings.base doxygen_GS_warnings.PR | grep '^>' && FAIL=1
if [ $FAIL ]; then
exit 1;
fi
+29
View File
@@ -0,0 +1,29 @@
name: File descriptions
on:
pull_request:
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: ${{ github.ref != 'refs/heads/master' }}
jobs:
file-descriptions:
name: File descriptions
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v6
with:
fetch-depth: 4
- name: Get pull-request commits
uses: OpenTTD/actions/checkout-pull-request@v6
- name: Check descriptions of source files
run: |
git diff-tree --no-commit-id --name-only -r HEAD HEAD^ > modified_files.txt
cat modified_files.txt
set -ex
python3 .github/file-descriptions.py modified_files.txt
+12 -32
View File
@@ -2,27 +2,16 @@ name: Preview build
on:
workflow_call:
secrets:
PREVIEW_CLOUDFLARE_API_TOKEN:
description: API token to upload a preview to Cloudflare Pages
required: true
PREVIEW_CLOUDFLARE_ACCOUNT_ID:
description: Account ID to upload a preview to Cloudflare Pages
required: true
jobs:
preview:
name: Build preview
environment:
name: preview
url: https://preview.openttd.org/pr${{ github.event.pull_request.number }}/
runs-on: ubuntu-latest
container:
# If you change this version, change the numbers in the cache step,
# .github/workflows/ci-emscripten.yml (2x) and os/emscripten/Dockerfile too.
image: emscripten/emsdk:3.1.57
image: emscripten/emsdk:6.0.1
steps:
- name: Checkout
@@ -35,20 +24,13 @@ jobs:
git config --global --add safe.directory ${GITHUB_WORKSPACE}
git checkout -b pr${{ github.event.pull_request.number }}
- name: Update to modern GCC
run: |
apt-get update
apt-get install -y gcc-12 g++-12
update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-12 100
update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-12 100
- name: Setup cache
uses: actions/cache@v4
uses: actions/cache@v5
with:
path: /emsdk/upstream/emscripten/cache
# If you change this version, change the numbers in the image configuration step,
# .github/workflows/ci-emscripten.yml (2x) and os/emscripten/Dockerfile too.
key: 3.1.57-${{ runner.os }}
key: 6.0.1-${{ runner.os }}
- name: Add liblzma support
run: |
@@ -97,16 +79,14 @@ jobs:
cp build/openttd.js public/
cp build/openttd.wasm public/
# Ensure we use the latest version of npm; the one we get with current
# emscripten doesn't allow running "npx wrangler" as root.
# Current emscripten can't install npm>=10.0.0 because node is too old.
npm install -g npm@9
mkdir pr
echo ${{ github.event.pull_request.number }} > ./pr/number
- name: Publish preview
uses: cloudflare/pages-action@v1
- name: Upload artifacts
uses: actions/upload-artifact@v7
with:
apiToken: ${{ secrets.PREVIEW_CLOUDFLARE_API_TOKEN }}
accountId: ${{ secrets.PREVIEW_CLOUDFLARE_ACCOUNT_ID }}
projectName: ${{ vars.PREVIEW_CLOUDFLARE_PROJECT_NAME }}
directory: public
branch: pr${{ github.event.pull_request.number }}
name: pr${{ github.event.pull_request.number }}
path: |
public
pr
retention-days: 1
+59
View File
@@ -0,0 +1,59 @@
name: Preview publish
on:
workflow_run:
workflows:
- Preview
types:
- completed
jobs:
preview:
name: Publish preview
runs-on: ubuntu-latest
if: >
github.event.workflow_run.event == 'pull_request' &&
github.event.workflow_run.conclusion == 'success'
steps:
- name: Create deployment
id: deployment
run: |
curl -L \
-X POST \
-H "Accept: application/vnd.github+json" \
-H "Authorization: Bearer ${{ secrets.GITHUB_TOKEN }}" \
-H "X-GitHub-Api-Version: 2026-03-10" \
https://api.github.com/repos/${{ github.repository }}/deployments \
-d '{"ref":"${{ github.event.workflow_run.head_sha }}","environment":"preview","required_contexts":[]}' \
| jq --raw-output0 '"url=\(.statuses_url)"' >> $GITHUB_OUTPUT
- name: Download artifacts
uses: actions/download-artifact@v8
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
run-id: ${{github.event.workflow_run.id }}
- name: Get PR number
id: pr
run: |
echo "number=$(cat pr/number)" >> $GITHUB_OUTPUT
- name: Publish preview
uses: cloudflare/wrangler-action@v3
with:
apiToken: ${{ secrets.PREVIEW_CLOUDFLARE_API_TOKEN }}
accountId: ${{ secrets.PREVIEW_CLOUDFLARE_ACCOUNT_ID }}
command: pages deploy public --project-name=${{ vars.PREVIEW_CLOUDFLARE_PROJECT_NAME }} --branch pr${{ steps.pr.outputs.number }}
- name: Update deployment
if: always()
run: |
curl -L \
-X POST \
-H "Accept: application/vnd.github+json" \
-H "Authorization: Bearer ${{ secrets.GITHUB_TOKEN }}" \
-H "X-GitHub-Api-Version: 2026-03-10" \
${{ steps.deployment.outputs.url }} \
-d '{"state":"${{ job.status }}","log_url":"${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}","environment_url":"https://preview.openttd.org/pr${{ steps.pr.outputs.number }}/","auto_inactive":false}'
+1 -1
View File
@@ -1,7 +1,7 @@
name: Preview
on:
pull_request_target:
pull_request:
types:
- labeled
- synchronize
+4 -15
View File
@@ -15,7 +15,7 @@ jobs:
steps:
- name: Download source
uses: actions/download-artifact@v6
uses: actions/download-artifact@v8
with:
name: internal-source
@@ -23,19 +23,8 @@ jobs:
run: |
tar -xf source.tar.gz --strip-components=1
- name: Install dependencies
run: |
echo "::group::Update apt"
sudo apt-get update
echo "::endgroup::"
echo "::group::Install dependencies"
sudo apt-get install -y --no-install-recommends \
doxygen \
# EOF
echo "::endgroup::"
env:
DEBIAN_FRONTEND: noninteractive
- name: Install Doxygen
uses: ./.github/install-doxygen
- name: Build
run: |
@@ -78,7 +67,7 @@ jobs:
echo "::endgroup::"
- name: Store bundles
uses: actions/upload-artifact@v5
uses: actions/upload-artifact@v7
with:
name: openttd-docs
path: build/bundles/*.tar.xz
+9 -5
View File
@@ -21,7 +21,7 @@ jobs:
steps:
- name: Download source
uses: actions/download-artifact@v6
uses: actions/download-artifact@v8
with:
name: internal-source
@@ -40,9 +40,11 @@ jobs:
echo "::group::Install system dependencies"
# perl-IPC-Cmd, wget, and zip are needed to run vcpkg.
# autoconf-archive is needed to build ICU.
# perl-Time-Piece is needed to build OpenSSL.
yum install -y \
autoconf-archive \
perl-IPC-Cmd \
perl-Time-Piece \
wget \
zip \
# EOF
@@ -81,6 +83,7 @@ jobs:
yum install -y \
alsa-lib-devel \
pulseaudio-libs-devel \
pipewire-devel \
# EOF
echo "::endgroup::"
@@ -110,7 +113,8 @@ jobs:
echo "::endgroup::"
- name: Setup vcpkg
uses: ./.github/actions/setup-vcpkg
id: vcpkg
uses: OpenTTD/actions/setup-vcpkg@v6
with:
vcpkg-location: /vcpkg
mono-install-command: 'yum install -y mono-complete'
@@ -125,7 +129,7 @@ jobs:
echo "::group::CMake"
cmake ${GITHUB_WORKSPACE} \
-DCMAKE_TOOLCHAIN_FILE=/vcpkg/scripts/buildsystems/vcpkg.cmake \
-DCMAKE_TOOLCHAIN_FILE=${{ steps.vcpkg.outputs.vcpkg-cmake }} \
-DCMAKE_BUILD_TYPE=RelWithDebInfo \
-DOPTION_SURVEY_KEY=${{ inputs.survey_key }} \
-DOPTION_PACKAGE_DEPENDENCIES=ON \
@@ -156,14 +160,14 @@ jobs:
echo "::endgroup::"
- name: Store bundles
uses: actions/upload-artifact@v5
uses: actions/upload-artifact@v7
with:
name: openttd-linux-generic
path: build/bundles
retention-days: 5
- name: Store symbols
uses: actions/upload-artifact@v5
uses: actions/upload-artifact@v7
with:
name: symbols-linux-generic
path: build/symbols
+8 -10
View File
@@ -23,7 +23,7 @@ jobs:
xcode-version: latest-stable
- name: Download source
uses: actions/download-artifact@v6
uses: actions/download-artifact@v8
with:
name: internal-source
@@ -38,10 +38,8 @@ jobs:
uses: Swatinem/rust-cache@v2
- name: Setup vcpkg
uses: ./.github/actions/setup-vcpkg
with:
vcpkg-location: ${{ runner.temp }}/vcpkg
mono-install-command: 'brew install mono'
id: vcpkg
uses: OpenTTD/actions/setup-vcpkg@v6
- name: Install dependencies
env:
@@ -79,7 +77,7 @@ jobs:
echo "::endgroup::"
- name: Import code signing certificates
uses: Apple-Actions/import-codesign-certs@v5
uses: Apple-Actions/import-codesign-certs@v7
with:
# The certificates in a PKCS12 file encoded as a base64 string
p12-file-base64: ${{ secrets.APPLE_DEVELOPER_CERTIFICATE_P12_BASE64 }}
@@ -97,7 +95,7 @@ jobs:
cmake ${GITHUB_WORKSPACE} \
-DCMAKE_OSX_ARCHITECTURES=arm64 \
-DVCPKG_TARGET_TRIPLET=arm64-osx \
-DCMAKE_TOOLCHAIN_FILE=${{ runner.temp }}/vcpkg/scripts/buildsystems/vcpkg.cmake \
-DCMAKE_TOOLCHAIN_FILE=${{ steps.vcpkg.outputs.vcpkg-cmake }} \
-DHOST_BINARY_DIR=${GITHUB_WORKSPACE}/build-host \
-DCMAKE_BUILD_TYPE=RelWithDebInfo \
-DOPTION_SURVEY_KEY=${{ inputs.survey_key }} \
@@ -118,7 +116,7 @@ jobs:
cmake ${GITHUB_WORKSPACE} \
-DCMAKE_OSX_ARCHITECTURES=x86_64 \
-DVCPKG_TARGET_TRIPLET=x64-osx \
-DCMAKE_TOOLCHAIN_FILE=${{ runner.temp }}/vcpkg/scripts/buildsystems/vcpkg.cmake \
-DCMAKE_TOOLCHAIN_FILE=${{ steps.vcpkg.outputs.vcpkg-cmake }} \
-DHOST_BINARY_DIR=${GITHUB_WORKSPACE}/build-host \
-DCMAKE_BUILD_TYPE=RelWithDebInfo \
-DOPTION_SURVEY_KEY=${{ inputs.survey_key }} \
@@ -205,14 +203,14 @@ jobs:
mv _CPack_Packages/*/Bundle/openttd-*.zip bundles/
- name: Store bundles
uses: actions/upload-artifact@v5
uses: actions/upload-artifact@v7
with:
name: openttd-macos-universal
path: build-x64/bundles
retention-days: 5
- name: Store symbols
uses: actions/upload-artifact@v5
uses: actions/upload-artifact@v7
with:
name: symbols-macos-universal
path: build-x64/symbols
+2 -2
View File
@@ -202,14 +202,14 @@ jobs:
echo "::endgroup::"
- name: Store bundles
uses: actions/upload-artifact@v5
uses: actions/upload-artifact@v7
with:
name: openttd-source
path: build/bundles/*
retention-days: 5
- name: Store source (for other jobs)
uses: actions/upload-artifact@v5
uses: actions/upload-artifact@v7
with:
name: internal-source
path: source.tar.gz
+8 -8
View File
@@ -15,7 +15,7 @@ jobs:
steps:
- name: Download source
uses: actions/download-artifact@v6
uses: actions/download-artifact@v8
with:
name: internal-source
@@ -25,17 +25,17 @@ jobs:
tar -xf source.tar.gz --strip-components=1
- name: Download x86 build
uses: actions/download-artifact@v6
uses: actions/download-artifact@v8
with:
name: openttd-windows-x86
- name: Download x64 build
uses: actions/download-artifact@v6
uses: actions/download-artifact@v8
with:
name: openttd-windows-x64
- name: Download arm64 build
uses: actions/download-artifact@v6
uses: actions/download-artifact@v8
with:
name: openttd-windows-arm64
@@ -124,7 +124,7 @@ jobs:
run: |
cd builds
REM We need to provide a signed .appx to the Windows Store, so generate a certificate with password 'password'
REM We need to provide a signed .msix to the Windows Store, so generate a certificate with password 'password'
call ..\os\windows\winstore\generate-key.bat "CN=78024DA8-4BE4-4C77-B12E-547BBF7359D2" password cert.pfx
- name: Generate assets
@@ -176,16 +176,16 @@ jobs:
REM Build and sign the package
makeappx build /v /f PackagingLayout.xml /op output\ /bv %OTTD_VERSION% /pv %OTTD_VERSION% /ca
SignTool sign /fd sha256 /a /f cert.pfx /p password "output\OpenTTD.appxbundle"
SignTool sign /fd sha256 /a /f cert.pfx /p password "output\OpenTTD.msixbundle"
REM Move resulting files to bundles folder
mkdir bundles
mkdir bundles\internal
move cert.pfx bundles\internal\openttd-${{ inputs.version }}-windows-store.pfx
move output\OpenTTD.appxbundle bundles\internal\openttd-${{ inputs.version }}-windows-store.appxbundle
move output\OpenTTD.msixbundle bundles\internal\openttd-${{ inputs.version }}-windows-store.msixbundle
- name: Store bundles
uses: actions/upload-artifact@v5
uses: actions/upload-artifact@v7
with:
name: openttd-windows-store
path: builds/bundles
+8 -9
View File
@@ -30,7 +30,7 @@ jobs:
steps:
- name: Download source
uses: actions/download-artifact@v6
uses: actions/download-artifact@v8
with:
name: internal-source
@@ -46,15 +46,14 @@ jobs:
uses: Swatinem/rust-cache@v2
- name: Setup vcpkg
uses: ./.github/actions/setup-vcpkg
with:
vcpkg-location: ${{ runner.temp }}/vcpkg
id: vcpkg
uses: OpenTTD/actions/setup-vcpkg@v6
- name: Install dependencies
shell: bash
run: |
echo "::group::Install choco dependencies"
choco install pandoc
choco install pandoc nsis
echo "::endgroup::"
echo "::group::Install breakpad dependencies"
@@ -103,7 +102,7 @@ jobs:
cmake ${GITHUB_WORKSPACE} \
-GNinja \
-DVCPKG_TARGET_TRIPLET=${{ matrix.arch }}-windows-static \
-DCMAKE_TOOLCHAIN_FILE="${{ runner.temp }}\vcpkg\scripts\buildsystems\vcpkg.cmake" \
-DCMAKE_TOOLCHAIN_FILE="${{ steps.vcpkg.outputs.vcpkg-cmake }}" \
-DOPTION_USE_NSIS=ON \
-DHOST_BINARY_DIR=${GITHUB_WORKSPACE}/build-host \
-DCMAKE_BUILD_TYPE=RelWithDebInfo \
@@ -133,7 +132,7 @@ jobs:
cmake ${GITHUB_WORKSPACE} \
-GNinja \
-DVCPKG_TARGET_TRIPLET=${{ matrix.arch }}-windows-static \
-DCMAKE_TOOLCHAIN_FILE="${{ runner.temp }}\vcpkg\scripts\buildsystems\vcpkg.cmake" \
-DCMAKE_TOOLCHAIN_FILE="${{ steps.vcpkg.outputs.vcpkg-cmake }}" \
-DHOST_BINARY_DIR=${GITHUB_WORKSPACE}/build-host \
-DCMAKE_BUILD_TYPE=RelWithDebInfo \
-DOPTION_SURVEY_KEY=${{ inputs.survey_key }} \
@@ -194,14 +193,14 @@ jobs:
AZURE_CODESIGN_PROFILE_NAME: ${{ secrets.AZURE_CODESIGN_PROFILE_NAME }}
- name: Store bundles
uses: actions/upload-artifact@v5
uses: actions/upload-artifact@v7
with:
name: openttd-windows-${{ matrix.arch }}
path: build/bundles
retention-days: 5
- name: Store symbols
uses: actions/upload-artifact@v5
uses: actions/upload-artifact@v7
with:
name: symbols-windows-${{ matrix.arch }}
path: build/symbols
+15
View File
@@ -153,3 +153,18 @@ jobs:
with:
version: ${{ needs.source.outputs.version }}
upload-windows-store:
name: Upload (Windows Store)
needs:
- upload
# Only upload final release builds to Windows Store; "-beta" or "-RC" tags should be ignored
if: needs.source.outputs.is_tag == 'true' && !contains(needs.source.outputs.version, '-')
uses: ./.github/workflows/upload-windows-store.yml
secrets: inherit
with:
version: ${{ needs.source.outputs.version }}
trigger_type: ${{ needs.source.outputs.trigger_type }}
+5 -5
View File
@@ -21,7 +21,7 @@ jobs:
steps:
- name: Download all bundles
uses: actions/download-artifact@v6
uses: actions/download-artifact@v8
- name: Calculate checksums
run: |
@@ -70,14 +70,14 @@ jobs:
done
- name: Store bundles
uses: actions/upload-artifact@v5
uses: actions/upload-artifact@v7
with:
name: cdn-bundles
path: bundles/*
retention-days: 5
- name: Store breakpad symbols
uses: actions/upload-artifact@v5
uses: actions/upload-artifact@v7
with:
name: cdn-symbols
path: symbols/*
@@ -88,7 +88,7 @@ jobs:
- prepare
name: Publish bundles
uses: OpenTTD/actions/.github/workflows/rw-cdn-upload.yml@v5
uses: OpenTTD/actions/.github/workflows/rw-cdn-upload.yml@v6
secrets:
CDN_SIGNING_KEY: ${{ secrets.CDN_SIGNING_KEY }}
DEPLOYMENT_APP_ID: ${{ secrets.DEPLOYMENT_APP_ID }}
@@ -103,7 +103,7 @@ jobs:
- prepare
name: Publish symbols
uses: OpenTTD/actions/.github/workflows/rw-symbols-upload.yml@v5
uses: OpenTTD/actions/.github/workflows/rw-symbols-upload.yml@v6
secrets:
SYMBOLS_SIGNING_KEY: ${{ secrets.SYMBOLS_SIGNING_KEY }}
with:
+10 -11
View File
@@ -15,40 +15,39 @@ jobs:
steps:
- name: Download source
uses: actions/download-artifact@v6
uses: actions/download-artifact@v8
with:
name: internal-source
path: internal-source
- name: Download bundle (Windows x86)
uses: actions/download-artifact@v6
uses: actions/download-artifact@v8
with:
name: openttd-windows-x86
path: openttd-windows-x86
- name: Download bundle (Windows x64)
uses: actions/download-artifact@v6
uses: actions/download-artifact@v8
with:
name: openttd-windows-x64
path: openttd-windows-x64
- name: Download bundle (MacOS)
uses: actions/download-artifact@v6
uses: actions/download-artifact@v8
with:
name: openttd-macos-universal
path: openttd-macos-universal
- name: Download bundle (Linux)
uses: actions/download-artifact@v6
uses: actions/download-artifact@v8
with:
name: openttd-linux-generic
path: openttd-linux-generic
- name: Install GOG Galaxy Build Creator
run: |
wget https://cdn.gog.com/open/galaxy/pipeline/build_creator/gnu-linux/GOGGalaxyBuildCreator-1.4.0.AppImage
7z x GOGGalaxyBuildCreator-1.4.0.AppImage
chmod +x ./app/GOGGalaxyPipelineBuilder
wget https://cdn.gog.com/open/galaxy/pipeline/10.6.7.17/gnu-linux/GOGGalaxyPipelineBuilder
chmod +x ./GOGGalaxyPipelineBuilder
- name: Install OpenGFX
shell: bash
@@ -145,8 +144,8 @@ jobs:
echo "::endgroup::"
echo "::group::Upload to GOG"
../app/GOGGalaxyPipelineBuilder build-game --username "${{ secrets.GOG_USERNAME }}" --password "${{ secrets.GOG_PASSWORD }}" --branch Testing windows.json
../app/GOGGalaxyPipelineBuilder build-game --username "${{ secrets.GOG_USERNAME }}" --password "${{ secrets.GOG_PASSWORD }}" --branch Testing macos.json
../app/GOGGalaxyPipelineBuilder build-game --username "${{ secrets.GOG_USERNAME }}" --password "${{ secrets.GOG_PASSWORD }}" --branch Testing linux.json
../GOGGalaxyPipelineBuilder build-game --username "${{ secrets.GOG_USERNAME }}" --password "${{ secrets.GOG_PASSWORD }}" --branch Testing windows.json
../GOGGalaxyPipelineBuilder build-game --username "${{ secrets.GOG_USERNAME }}" --password "${{ secrets.GOG_PASSWORD }}" --branch Testing macos.json
../GOGGalaxyPipelineBuilder build-game --username "${{ secrets.GOG_USERNAME }}" --password "${{ secrets.GOG_PASSWORD }}" --branch Testing linux.json
echo "::endgroup::"
)
+5 -5
View File
@@ -18,31 +18,31 @@ jobs:
steps:
- name: Download source
uses: actions/download-artifact@v6
uses: actions/download-artifact@v8
with:
name: internal-source
path: internal-source
- name: Download bundle (Windows x86)
uses: actions/download-artifact@v6
uses: actions/download-artifact@v8
with:
name: openttd-windows-x86
path: openttd-windows-x86
- name: Download bundle (Windows x64)
uses: actions/download-artifact@v6
uses: actions/download-artifact@v8
with:
name: openttd-windows-x64
path: openttd-windows-x64
- name: Download bundle (MacOS)
uses: actions/download-artifact@v6
uses: actions/download-artifact@v8
with:
name: openttd-macos-universal
path: openttd-macos-universal
- name: Download bundle (Linux)
uses: actions/download-artifact@v6
uses: actions/download-artifact@v8
with:
name: openttd-linux-generic
path: openttd-linux-generic
@@ -0,0 +1,44 @@
name: Upload (Windows Store)
on:
workflow_call:
inputs:
version:
required: true
type: string
trigger_type:
required: true
type: string
jobs:
upload:
name: Upload (Windows Store)
runs-on: windows-latest
steps:
- name: Download bundle (Windows Store)
uses: actions/download-artifact@v8
with:
name: openttd-windows-store
path: openttd-windows-store
- name: Configure Microsoft Store CLI
uses: microsoft/microsoft-store-apppublisher@v1.3
- name: Reconfigure store credentials
run: msstore reconfigure `
--tenantId ${{ secrets.AZURE_TENANT_ID }} `
--sellerId ${{ secrets.WINSTORE_SELLER_ID }} `
--clientId ${{ secrets.AZURE_WINSTORE_APPLICATION_CLIENT_ID }} `
--clientSecret ${{ secrets.AZURE_WINSTORE_APPLICATION_SECRET }}
- name: Publish msix package
shell: pwsh
run: |
$bundle = Get-ChildItem openttd-windows-store/internal/openttd-*.msixbundle | Select-Object -First 1
if (-not $bundle) {
throw "No msixbundle found"
}
msstore publish $bundle.FullName -id 9NCJG5RVRR1C -v
+9 -5
View File
@@ -5,7 +5,7 @@ if(NOT BINARY_NAME)
endif()
project(${BINARY_NAME}
VERSION 15.0
VERSION 16.0
LANGUAGES CXX
)
@@ -75,6 +75,10 @@ add_custom_target(find_version
-DREV_MAJOR=${PROJECT_VERSION_MAJOR}
-DREV_MINOR=${PROJECT_VERSION_MINOR}
-DWINDOWS=${WIN32}
-DDOXYGEN_WARN_FORMAT_LINE=${DOXYGEN_WARN_FORMAT_LINE}
-DDOXYGEN_WARN_FILE=${DOXYGEN_WARN_FILE}
-DDOXYGEN_GS_WARN_FILE=${DOXYGEN_GS_WARN_FILE}
-DDOXYGEN_AI_WARN_FILE=${DOXYGEN_AI_WARN_FILE}
-P "${CMAKE_SOURCE_DIR}/cmake/scripts/FindVersion.cmake"
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
BYPRODUCTS ${GENERATED_SOURCE_FILES}
@@ -185,7 +189,7 @@ if(UNIX AND NOT APPLE AND NOT OPTION_DEDICATED)
if(NOT SDL2_FOUND AND NOT ALLEGRO_FOUND)
message(FATAL_ERROR "SDL2 or Allegro is required for this platform")
endif()
if(HARFBUZZ_FOUND AND NOT ICU_i18n_FOUND)
if(HARFBUZZ_FOUND AND NOT ICU_I18N_FOUND)
message(WARNING "HarfBuzz depends on ICU i18n to function; HarfBuzz will be disabled")
endif()
if(NOT HARFBUZZ_FOUND)
@@ -323,8 +327,8 @@ if(NOT OPTION_DEDICATED)
link_package(FREETYPE TARGET Freetype::Freetype)
link_package(Fontconfig TARGET Fontconfig::Fontconfig)
link_package(Harfbuzz TARGET harfbuzz::harfbuzz)
link_package(ICU_i18n)
link_package(ICU_uc)
link_package(ICU_I18N TARGET ICU::i18n)
link_package(ICU_UC TARGET ICU::uc)
link_package(OpusFile TARGET OpusFile::opusfile)
if(SDL2_FOUND AND OPENGL_FOUND AND UNIX)
@@ -366,7 +370,7 @@ if(EMSCRIPTEN)
add_definitions(-s DISABLE_EXCEPTION_CATCHING=0)
# Export functions to Javascript.
target_link_libraries(WASM::WASM INTERFACE "-s EXPORTED_FUNCTIONS='[\"_main\", \"_em_openttd_add_server\"]' -s EXPORTED_RUNTIME_METHODS='[\"cwrap\"]'")
target_link_libraries(WASM::WASM INTERFACE "-s EXPORTED_FUNCTIONS='[\"_main\", \"_em_openttd_add_server\"]' -s EXPORTED_RUNTIME_METHODS='[\"cwrap\", \"HEAPU8\"]'")
# Preload all the files we generate during build.
# As we do not compile with FreeType / FontConfig, we also have no way to
+19 -15
View File
@@ -45,7 +45,9 @@ PYTHON_DOCSTRING = YES
INHERIT_DOCS = YES
SEPARATE_MEMBER_PAGES = NO
TAB_SIZE = 2
ALIASES =
ALIASES = important="@attention" # @important is available in newer versions of doxygen.
ALIASES += split_group{1}="@}^^@{^^@ingroup \1^^" \
split_group{3;}="^^@defgroup \1_\2 \3^^@ingroup \1^^@{^^@}^^@}^^@{^^@ingroup \1_\2^^"
OPTIMIZE_OUTPUT_FOR_C = YES
OPTIMIZE_OUTPUT_JAVA = NO
OPTIMIZE_FOR_FORTRAN = NO
@@ -59,7 +61,7 @@ BUILTIN_STL_SUPPORT = NO
CPP_CLI_SUPPORT = NO
SIP_SUPPORT = NO
IDL_PROPERTY_SUPPORT = YES
DISTRIBUTE_GROUP_DOC = NO
DISTRIBUTE_GROUP_DOC = YES
GROUP_NESTED_COMPOUNDS = NO
SUBGROUPING = YES
INLINE_GROUPED_CLASSES = NO
@@ -118,11 +120,12 @@ WARNINGS = YES
WARN_IF_UNDOCUMENTED = YES
WARN_IF_DOC_ERROR = YES
WARN_IF_INCOMPLETE_DOC = YES
WARN_NO_PARAMDOC = NO
WARN_NO_PARAMDOC = YES
WARN_IF_UNDOC_ENUM_VAL = YES
WARN_AS_ERROR = NO
WARN_FORMAT = "$file:$line: $text"
WARN_LINE_FORMAT = "at line $line of file $file"
WARN_LOGFILE =
WARN_FORMAT = "$file:$${DOXYGEN_WARN_FORMAT_LINE}: $text"
WARN_LINE_FORMAT = "at line $${DOXYGEN_WARN_FORMAT_LINE} of file $file"
WARN_LOGFILE = ${DOXYGEN_WARN_FILE}
#---------------------------------------------------------------------------
# Configuration options related to the input files
#---------------------------------------------------------------------------
@@ -134,12 +137,15 @@ FILE_PATTERNS = *.c \
*.cpp \
*.c++ \
*.h \
*.hpp
*.hpp \
*.mm \
*.m
RECURSIVE = YES
EXCLUDE =
EXCLUDE_SYMLINKS = NO
EXCLUDE_PATTERNS = */3rdparty \
*/script/api
*/script/api \
*/tests
EXCLUDE_SYMBOLS =
EXAMPLE_PATH =
EXAMPLE_PATTERNS = *
@@ -185,7 +191,6 @@ HTML_EXTRA_FILES =
HTML_COLORSTYLE_HUE = 220
HTML_COLORSTYLE_SAT = 100
HTML_COLORSTYLE_GAMMA = 80
HTML_TIMESTAMP = NO
HTML_DYNAMIC_MENUS = YES
HTML_DYNAMIC_SECTIONS = NO
HTML_INDEX_NUM_ENTRIES = 100
@@ -221,7 +226,6 @@ EXT_LINKS_IN_WINDOW = NO
OBFUSCATE_EMAILS = YES
HTML_FORMULA_FORMAT = png
FORMULA_FONTSIZE = 10
FORMULA_TRANSPARENT = YES
FORMULA_MACROFILE =
USE_MATHJAX = NO
MATHJAX_VERSION = MathJax_2
@@ -256,7 +260,6 @@ USE_PDFLATEX = NO
LATEX_BATCHMODE = NO
LATEX_HIDE_INDICES = NO
LATEX_BIB_STYLE = plain
LATEX_TIMESTAMP = NO
LATEX_EMOJI_DIRECTORY =
#---------------------------------------------------------------------------
# Configuration options related to the RTF output
@@ -317,10 +320,14 @@ PREDEFINED = WITH_ZLIB \
WITH_HARFBUZZ \
WITH_ICU_I18N \
UNICODE \
DOXYGEN_API \
_UNICODE \
_GNU_SOURCE \
CDECL= \
CALLBACK= \
APIENTRY= \
FINAL=
EXPAND_AS_DEFINED =
EXPAND_AS_DEFINED = DEFINE_POOL_METHOD
SKIP_FUNCTION_MACROS = YES
#---------------------------------------------------------------------------
# Configuration options related to external references
@@ -337,8 +344,6 @@ DIA_PATH =
HIDE_UNDOC_RELATIONS = YES
HAVE_DOT = NO
DOT_NUM_THREADS = 0
DOT_FONTNAME = Helvetica
DOT_FONTSIZE = 10
DOT_FONTPATH =
CLASS_GRAPH = YES
COLLABORATION_GRAPH = YES
@@ -366,7 +371,6 @@ PLANTUML_CFG_FILE =
PLANTUML_INCLUDE_PATH =
DOT_GRAPH_MAX_NODES = 50
MAX_DOT_GRAPH_DEPTH = 1000
DOT_TRANSPARENT = NO
DOT_MULTI_TARGETS = NO
GENERATE_LEGEND = YES
DOT_CLEANUP = YES
+1
View File
@@ -15,6 +15,7 @@ set(AI_COMPAT_SOURCE_FILES
${CMAKE_CURRENT_SOURCE_DIR}/compat_12.nut
${CMAKE_CURRENT_SOURCE_DIR}/compat_13.nut
${CMAKE_CURRENT_SOURCE_DIR}/compat_14.nut
${CMAKE_CURRENT_SOURCE_DIR}/compat_15.nut
)
foreach(AI_COMPAT_SOURCE_FILE IN LISTS AI_COMPAT_SOURCE_FILES)
+8
View File
@@ -0,0 +1,8 @@
/*
* This file is part of OpenTTD.
* OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2.
* OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see <https://www.gnu.org/licenses/old-licenses/gpl-2.0>.
*/
/* This file contains code to downgrade the API from 16 to 15. */
+1
View File
@@ -12,6 +12,7 @@ set(GS_COMPAT_SOURCE_FILES
${CMAKE_CURRENT_SOURCE_DIR}/compat_12.nut
${CMAKE_CURRENT_SOURCE_DIR}/compat_13.nut
${CMAKE_CURRENT_SOURCE_DIR}/compat_14.nut
${CMAKE_CURRENT_SOURCE_DIR}/compat_15.nut
)
foreach(GS_COMPAT_SOURCE_FILE IN LISTS GS_COMPAT_SOURCE_FILES)
+140
View File
@@ -0,0 +1,140 @@
/*
* This file is part of OpenTTD.
* OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2.
* OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see <https://www.gnu.org/licenses/old-licenses/gpl-2.0>.
*/
/* This file contains code to downgrade the API from 16 to 15. */
/*
* These window/widget related enumerations have never been stable, but breaking anything using them
* is a really big ask when restructuring code. If in the future things are removed from the underlying
* enumerations, feel free to remove them from this compatibility script.
*/
GSWindow.WN_GAME_OPTIONS_AI <- GSWindow.GameOptionsWindowNumber.AI;
GSWindow.WN_GAME_OPTIONS_GS <- GSWindow.GameOptionsWindowNumber.GS;
GSWindow.WN_GAME_OPTIONS_ABOUT <- GSWindow.GameOptionsWindowNumber.About;
GSWindow.WN_GAME_OPTIONS_NEWGRF_STATE <- GSWindow.GameOptionsWindowNumber.NewGRFState;
GSWindow.WN_GAME_OPTIONS_GAME_OPTIONS <- GSWindow.GameOptionsWindowNumber.GameOptions;
GSWindow.WN_GAME_OPTIONS_GAME_SETTINGS <- GSWindow.GameOptionsWindowNumber.GameOptions;
GSWindow.WN_QUERY_STRING <- GSWindow.QueryStringWindowNumber.Default;
GSWindow.WN_QUERY_STRING_SIGN <- GSWindow.QueryStringWindowNumber.Sign;
GSWindow.WN_CONFIRM_POPUP_QUERY <- GSWindow.ConfirmPopupQueryWindowNumber.Default;
GSWindow.WN_CONFIRM_POPUP_QUERY_BOOTSTRAP <- GSWindow.ConfirmPopupQueryWindowNumber.Bootstrap;
GSWindow.WN_NETWORK_WINDOW_GAME <- GSWindow.NetworkWindowNumber.Game;
GSWindow.WN_NETWORK_WINDOW_CONTENT_LIST <- GSWindow.NetworkWindowNumber.ContentList;
GSWindow.WN_NETWORK_WINDOW_START <- GSWindow.NetworkWindowNumber.StartServer;
GSWindow.WN_NETWORK_STATUS_WINDOW_JOIN <- GSWindow.NetworkStatusWindowNumber.Join;
GSWindow.WN_NETWORK_STATUS_WINDOW_CONTENT_DOWNLOAD <- GSWindow.NetworkStatusWindowNumber.ContentDownload;
GSWindow.WC_NONE <- GSWindow.WindowClass.None;
GSWindow.WC_MAIN_WINDOW <- GSWindow.WindowClass.MainWindow;
GSWindow.WC_MAIN_TOOLBAR <- GSWindow.WindowClass.MainToolbar;
GSWindow.WC_STATUS_BAR <- GSWindow.WindowClass.Statusbar;
GSWindow.WC_BUILD_TOOLBAR <- GSWindow.WindowClass.BuildToolbar;
GSWindow.WC_SCEN_BUILD_TOOLBAR <- GSWindow.WindowClass.ScenarioBuildToolbar;
GSWindow.WC_BUILD_TREES <- GSWindow.WindowClass.BuildTrees;
GSWindow.WC_TRANSPARENCY_TOOLBAR <- GSWindow.WindowClass.TransparencyToolbar;
GSWindow.WC_BUILD_SIGNAL <- GSWindow.WindowClass.BuildSignal;
GSWindow.WC_SMALLMAP <- GSWindow.WindowClass.SmallMap;
GSWindow.WC_ERRMSG <- GSWindow.WindowClass.ErrorMessage;
GSWindow.WC_TOOLTIPS <- GSWindow.WindowClass.ToolTips;
GSWindow.WC_QUERY_STRING <- GSWindow.WindowClass.QueryString;
GSWindow.WC_CONFIRM_POPUP_QUERY <- GSWindow.WindowClass.ConfirmPopupQuery;
GSWindow.WC_GOAL_QUESTION <- GSWindow.WindowClass.GoalQuestion;
GSWindow.WC_SAVELOAD <- GSWindow.WindowClass.SaveLoad;
GSWindow.WC_LAND_INFO <- GSWindow.WindowClass.LandInfo;
GSWindow.WC_DROPDOWN_MENU <- GSWindow.WindowClass.DropdownMenu;
GSWindow.WC_OSK <- GSWindow.WindowClass.OnScreenKeyboard;
GSWindow.WC_SET_DATE <- GSWindow.WindowClass.SetDate;
GSWindow.WC_SCRIPT_SETTINGS <- GSWindow.WindowClass.ScriptSettings;
GSWindow.WC_GRF_PARAMETERS <- GSWindow.WindowClass.NewGRFParameters;
GSWindow.WC_TEXTFILE <- GSWindow.WindowClass.Textfile;
GSWindow.WC_TOWN_AUTHORITY <- GSWindow.WindowClass.TownAuthority;
GSWindow.WC_VEHICLE_DETAILS <- GSWindow.WindowClass.VehicleDetails;
GSWindow.WC_VEHICLE_REFIT <- GSWindow.WindowClass.VehicleRefit;
GSWindow.WC_VEHICLE_ORDERS <- GSWindow.WindowClass.VehicleOrders;
GSWindow.WC_REPLACE_VEHICLE <- GSWindow.WindowClass.ReplaceVehicle;
GSWindow.WC_VEHICLE_TIMETABLE <- GSWindow.WindowClass.VehicleTimetable;
GSWindow.WC_COMPANY_COLOUR <- GSWindow.WindowClass.CompanyLivery;
GSWindow.WC_COMPANY_MANAGER_FACE <- GSWindow.WindowClass.CompanyManagerFace;
GSWindow.WC_SELECT_STATION <- GSWindow.WindowClass.JoinStation;
GSWindow.WC_NEWS_WINDOW <- GSWindow.WindowClass.News;
GSWindow.WC_TOWN_DIRECTORY <- GSWindow.WindowClass.TownDirectory;
GSWindow.WC_SUBSIDIES_LIST <- GSWindow.WindowClass.SubsidyList;
GSWindow.WC_INDUSTRY_DIRECTORY <- GSWindow.WindowClass.IndustryDirectory;
GSWindow.WC_MESSAGE_HISTORY <- GSWindow.WindowClass.MessageHistory;
GSWindow.WC_SIGN_LIST <- GSWindow.WindowClass.SignList;
GSWindow.WC_SCRIPT_LIST <- GSWindow.WindowClass.ScriptList;
GSWindow.WC_GOALS_LIST <- GSWindow.WindowClass.GoalList;
GSWindow.WC_STORY_BOOK <- GSWindow.WindowClass.StoryBook;
GSWindow.WC_STATION_LIST <- GSWindow.WindowClass.StationList;
GSWindow.WC_TRAINS_LIST <- GSWindow.WindowClass.TrainList;
GSWindow.WC_ROADVEH_LIST <- GSWindow.WindowClass.RoadVehicleList;
GSWindow.WC_SHIPS_LIST <- GSWindow.WindowClass.ShipList;
GSWindow.WC_AIRCRAFT_LIST <- GSWindow.WindowClass.AircraftList;
GSWindow.WC_TOWN_VIEW <- GSWindow.WindowClass.TownView;
GSWindow.WC_VEHICLE_VIEW <- GSWindow.WindowClass.VehicleView;
GSWindow.WC_STATION_VIEW <- GSWindow.WindowClass.StationView;
GSWindow.WC_VEHICLE_DEPOT <- GSWindow.WindowClass.VehicleDepot;
GSWindow.WC_WAYPOINT_VIEW <- GSWindow.WindowClass.WaypointView;
GSWindow.WC_INDUSTRY_VIEW <- GSWindow.WindowClass.IndustryView;
GSWindow.WC_COMPANY <- GSWindow.WindowClass.Company;
GSWindow.WC_BUILD_OBJECT <- GSWindow.WindowClass.BuildObject;
GSWindow.WC_BUILD_HOUSE <- GSWindow.WindowClass.BuildHouse;
GSWindow.WC_BUILD_VEHICLE <- GSWindow.WindowClass.BuildVehicle;
GSWindow.WC_BUILD_BRIDGE <- GSWindow.WindowClass.BuildBridge;
GSWindow.WC_BUILD_STATION <- GSWindow.WindowClass.BuildStation;
GSWindow.WC_BUS_STATION <- GSWindow.WindowClass.BuildBusStation;
GSWindow.WC_TRUCK_STATION <- GSWindow.WindowClass.BuildTruckStation;
GSWindow.WC_BUILD_DEPOT <- GSWindow.WindowClass.BuildDepot;
GSWindow.WC_BUILD_WAYPOINT <- GSWindow.WindowClass.BuildWaypoint;
GSWindow.WC_FOUND_TOWN <- GSWindow.WindowClass.FoundTown;
GSWindow.WC_BUILD_INDUSTRY <- GSWindow.WindowClass.BuildIndustry;
GSWindow.WC_SELECT_GAME <- GSWindow.WindowClass.SelectGame;
GSWindow.WC_SCEN_LAND_GEN <- GSWindow.WindowClass.ScenarioGenerateLandscape;
GSWindow.WC_GENERATE_LANDSCAPE <- GSWindow.WindowClass.GenerateLandscape;
GSWindow.WC_MODAL_PROGRESS <- GSWindow.WindowClass.ModalProgress;
GSWindow.WC_NETWORK_WINDOW <- GSWindow.WindowClass.Network;
GSWindow.WC_CLIENT_LIST <- GSWindow.WindowClass.NetworkClientList;
GSWindow.WC_NETWORK_STATUS_WINDOW <- GSWindow.WindowClass.NetworkStatus;
GSWindow.WC_NETWORK_ASK_RELAY <- GSWindow.WindowClass.NetworkAskRelay;
GSWindow.WC_NETWORK_ASK_SURVEY <- GSWindow.WindowClass.NetworkAskSurvey;
GSWindow.WC_SEND_NETWORK_MSG <- GSWindow.WindowClass.NetworkChat;
GSWindow.WC_INDUSTRY_CARGOES <- GSWindow.WindowClass.IndustryCargoes;
GSWindow.WC_GRAPH_LEGEND <- GSWindow.WindowClass.GraphLegend;
GSWindow.WC_FINANCES <- GSWindow.WindowClass.Finances;
GSWindow.WC_INCOME_GRAPH <- GSWindow.WindowClass.IncomeGraph;
GSWindow.WC_OPERATING_PROFIT <- GSWindow.WindowClass.OperatingProfitGraph;
GSWindow.WC_DELIVERED_CARGO <- GSWindow.WindowClass.DeliveredCargoGraph;
GSWindow.WC_PERFORMANCE_HISTORY <- GSWindow.WindowClass.PerformanceGraph;
GSWindow.WC_COMPANY_VALUE <- GSWindow.WindowClass.CompanyValueGraph;
GSWindow.WC_COMPANY_LEAGUE <- GSWindow.WindowClass.CompanyLeague;
GSWindow.WC_PAYMENT_RATES <- GSWindow.WindowClass.CargoPaymentRatesGraph;
GSWindow.WC_PERFORMANCE_DETAIL <- GSWindow.WindowClass.PerformanceDetail;
GSWindow.WC_INDUSTRY_PRODUCTION <- GSWindow.WindowClass.IndustryProductionGraph;
GSWindow.WC_TOWN_CARGO_GRAPH <- GSWindow.WindowClass.TownCargoGraph;
GSWindow.WC_COMPANY_INFRASTRUCTURE <- GSWindow.WindowClass.CompanyInfrastructure;
GSWindow.WC_BUY_COMPANY <- GSWindow.WindowClass.BuyCompany;
GSWindow.WC_ENGINE_PREVIEW <- GSWindow.WindowClass.EnginePreview;
GSWindow.WC_MUSIC_WINDOW <- GSWindow.WindowClass.Music;
GSWindow.WC_MUSIC_TRACK_SELECTION <- GSWindow.WindowClass.MusicTrackSelection;
GSWindow.WC_GAME_OPTIONS <- GSWindow.WindowClass.GameOptions;
GSWindow.WC_CUSTOM_CURRENCY <- GSWindow.WindowClass.CustomCurrenty;
GSWindow.WC_CHEATS <- GSWindow.WindowClass.Cheat;
GSWindow.WC_EXTRA_VIEWPORT <- GSWindow.WindowClass.ExtraViewport;
GSWindow.WC_CONSOLE <- GSWindow.WindowClass.Console;
GSWindow.WC_BOOTSTRAP <- GSWindow.WindowClass.Bootstrap;
GSWindow.WC_HIGHSCORE <- GSWindow.WindowClass.Highscore;
GSWindow.WC_ENDSCREEN <- GSWindow.WindowClass.Endscreen;
GSWindow.WC_SCRIPT_DEBUG <- GSWindow.WindowClass.ScriptDebug;
GSWindow.WC_NEWGRF_INSPECT <- GSWindow.WindowClass.NewGRFInspect;
GSWindow.WC_SPRITE_ALIGNER <- GSWindow.WindowClass.SpriteAligner;
GSWindow.WC_LINKGRAPH_LEGEND <- GSWindow.WindowClass.LinkGraphLegend;
GSWindow.WC_SAVE_PRESET <- GSWindow.WindowClass.SavePreset;
GSWindow.WC_FRAMERATE_DISPLAY <- GSWindow.WindowClass.FramerateDisplay;
GSWindow.WC_FRAMETIME_GRAPH <- GSWindow.WindowClass.FrametimeGraph;
GSWindow.WC_SCREENSHOT <- GSWindow.WindowClass.Screenshot;
GSWindow.WC_HELPWIN <- GSWindow.WindowClass.Help;
GSWindow.WC_INVALID <- GSWindow.WindowClass.Invalid;
+212
View File
@@ -1,5 +1,217 @@
## 16.x
### 16.0-beta2 (2026-07-12)
- Feature: Allow bridges over depots (#15836)
- Feature: Increase maximum number of vehicles per type to 10,000 (#15810)
- Feature: Add and remove whole classes to picker collections (#15808)
- Feature: Station list can be filtered by name (#15772)
- Change: Use "bridge ... too low" message for bridgeable objects (#15838)
- Fix: Use meaningful tooltips for graph range toggle buttons (#15842)
- Fix #15826: Exclude allow any/all options for AI companies (#15834)
- Fix #7992: Fix for catenary road and tram catenary sprites not being drawn on bridges (#15811)
- Fix #15784: Crash due to incorrect road build toolbar when switching road tram types (#15789)
- Fix: [NewGRF] Make 'signals on traffic side' consistent with explicit settings (#15661)
- Fix: [Win32] Explicitly initialize COM in Win32 video driver (#15553)
### 16.0-beta1 (2026-06-25)
- Feature: Add default road and tram selection (#15585)
- Feature: Trains with an engine on the rear can drive backwards when reversing (#15379)
- Feature: Add worldgen setting for average height of terrain (#14989)
- Feature: Add text filter to dropdown lists (#14842)
- Feature: User-defined collections of saved items in the picker window (#14813)
- Feature: Configurable sign text colors in scenario editor (#14743)
- Feature: Allow placing an area of 1x1 houses in scenario editor (#14708)
- Feature: Scale cargo payment aging rate (#14635)
- Feature: Support automatic detection of data from Atari's Transport Tycoon Deluxe re-release (#15483)
- Add: [NewGRF] Implement custom waypoint layouts by callback 24 (#15616)
- Add: List 'Place object' in landscaping dropdown (#15609)
- Add: Setting to disable aircraft range limit (#15433)
- Add: Show maximum reliability in vehicle info (#15401)
- Add: Lower the Send To Depot button when a vehicle is on its way to one (#15397)
- Add: Setting to disallow train magic flip, and reverse at reduced speed (#15391)
- Add: [NewGRF] Variable for when a train is driving backwards (#15379)
- Add: [NewGRF] Flag to allow unpowered wagon to lead train when backing up (#15379)
- Add: [NewGRF] Station flag to divide cargo by area instead of perimeter (#15253)
- Add: Company allow-list can be set to allow anyone (#15204)
- Add: Record history of cargo delivered to towns (#15184)
- Add: Show additional vehicle details based on sort criteria (#15158)
- Add: Setting to control minimum distance between towns (#14893)
- Change: Selecting Rail/Roadtype updates build toolbar instead of closing and reopening (#15589)
- Change: Default setting to review orders excludes stopped vehicles (#15565)
- Change: Most used rail type takes ownership into account (#15489)
- Change: Test font for eligibility before adding as fallback (#15412)
- Change: Clarify max age shown in vehicle info window (#15403)
- Change: Show "Delete All" in order window delete button when applicable (#15370)
- Change: Make continuation error messages consistent (#15328)
- Change: Distinguish between 'Flat land required' and 'Land sloped in wrong direction' for building depots (#15327)
- Change: Allow subsidies with CargoDist (#15189)
- Change: Removing river tiles reduces local authority rating (#15180)
- Change: Protect rivers from removal when terraforming (#15176)
- Change: [Script] Reformat callstack output (#15171)
- Change: Apply slightly more padding to image-text buttons (#15077)
- Change: [NewGRF] Display rail and road type speed limit text in yellow (#15076)
- Change: Make smallmap show infinite water, if enabled (#15041)
- Change: Add support for next/previous/first/last rail/road/tram type hotkeys (#15028)
- Change: Allow rocks on desert tiles (#14979)
- Change: [Script] Include Array/PriorityQueye/ScriptList contents in script memory allocation total (#14954)
- Change: [Script] Various ScriptList methods are now suspendable (#14943, #14762)
- Change: Improve generation of coasts at map edges (#14868)
- Change: Show only selected badge in badge filter dropdown buttons (#14855)
- Change: River springs must be surrounded by hills (#14845)
- Change: Vehicles loading at stations don't lose reliability (#14841)
- Change: Generate lighthouses along coasts and near towns (#14828)
- Change: Transmitter object only spawns after original base year (#14786)
- Change: Share one window for engine preview pop ups (#14703)
- Fix: [NewGRF] Town name language incorrectly decoded (#15691)
- Fix #15606: Undefined behaviour may cause buttons to be invisible (#15686)
- Fix #14975: Show correct tile for tunnel error message (#15660)
- Fix: [NewGRF] Incorrect language IDs passed to TranslateTTDPatchCodes (#15655)
- Fix: Scenario editor random industry generation (#15626)
- Fix: [NewGRF] Ignore blocked waypoint tiles (#15620)
- Fix: [NewGRF] Pylons and no-wires flags were ignored for waypoint tiles (#15619)
- Fix: Dedicated server signal handling for SIGTERM/SIGINT/SIGQUIT (#15607)
- Fix: [NewGRF] Potential out-of-bounds read when performing GRM (#15600)
- Fix: Badge offsets not ignored when determining width (#15588)
- Fix: Account for NewGRF's global train width when drawing dual-head engines (#15587)
- Fix: Station list facility buttons do not produce click sound (#15569)
- Fix #15495: Fix incorrectly built default waypoints (#15562)
- Fix #15495: Unable to build bridge over default waypoints (#15562)
- Fix #15235: Make GameScripts obey town road construction setting (#15559)
- Fix: Crash when loading crash save with no viewport coordinates (#15550)
- Fix #15520: Fix viewport snap back on stop following vehicle (#15520) (#15531)
- Fix: Buttons for choosing engine in preview window show for single engine (#15514)
- Fix #15511: Vehicle passed to commands must be a company buildable type (#15512)
- Fix #15497: [Script] ScriptController::Break not pausing in TestMode (#15498)
- Fix: Coordinate transformation for JSON town placement when anticlockwise (#15490)
- Fix: NewGRF debug handler for towns in wrong place since badges (#15467)
- Fix: Object id overrides were not reset between games (#15465)
- Fix: Debug saveload errors were clobbered (#15452)
- Fix: Refresh client list when client renames (#15439)
- Fix #15428: [Fluidsynth] Treat configured synth.gain as maximum instead of hardcoded value (#15429)
- Fix: Refresh string width cache for all loaded fonts (#15427)
- Fix: Typo in Hungarian town name suffix ("kak" -> "lak") (#15421)
- Fix: [NewGRF] Variable 0x69 has not been added for waypoints (#15396)
- Fix: Dropdown text filter could interfere with hotkeys after closing (#15395)
- Fix: Rejecting or accepting engine preview incorrectly closed preview window (#15378)
- Fix #15318: Nonsensical error message when trying to send aircraft to hangar with no usable airports (#15334)
- Fix #15234: Null pointer dereference opening sign edit window when sign 0 does not exist (#15236)
- Fix: [GS] Docs are missing or do not match the code (#15230)
- Fix: Off by one and redundant logic in snowy road checks (#15214)
- Fix #15137: Roads built on steep slopes at the minimum snow level height have inconsistent snowiness (#15190)
- Fix: Station view window fold/unfold not refreshing scrollbar (#15187)
- Fix: Use consistent description for invalid orders (#15177)
- Fix: [Script] Give GetPrimary/SecondaryLiveryColour preconditions (#15169)
- Fix: Cocoa video driver did not register (#15145)
- Fix: MacOS version detection was broken (#15145)
- Fix #13600: Make terraform click+draggable in scenario editor (#15135)
- Fix: [Script] Map some error strings to existing errors (#15113)
- Fix: Allow to build buoys at (0x0) (#14983)
- Fix #14610: Do not treat aircraft with only depot orders as having valid orders (#14961)
- Fix #12937: Allow the computer to go to sleep while the game is paused (#14948)
- Fix: Company query popups do not update in multiplayer (#14947)
- Fix #14892: Potential crash when logging fonts for survey (#14896)
- Fix #14827: Store random trigger information per-tile (#14830)
## 15.x
### 15.3 (2026-04-04)
- Fix: Conditional orders could require a maximum reliability over 100% (#15409)
- Fix: Improve appearance of toolbars and main menu images/text with some non-default base sets (#15402)
- Fix: [Script] IsBuildableRectangle for a 0x0 tile should return false (#15357)
- Fix: Desync caused by train crashes (#15338)
- Fix: Incorrect scroll bar capacity for train details window total cargo tab (#15329)
- Fix #15310: Crash caused by a helicopter running out of fuel near map edge (#15311)
### 15.2 (2026-02-18)
- Fix: Crashed zeppelin not blocking runway (#15281)
- Fix #15269: Crash when building drive-through stop on unowned one-way road (#15270)
- Fix #15247: Crash when handling invalid sprite in OpenGL cursor sprite system (#15248)
- Fix #15105: Czech townname generation causing crashes (#15231)
- Fix: Incorrect ground type test when placing towns (#15217)
- Fix: Town supplied cargo history incorrectly clamped to 16 bit values (#15183)
- Fix #15085: Crash when GUI scale changes before video driver is fully initialised (#15175)
- Fix: Articulated road vehicle following with immediately sequential u-turns (#15170)
- Fix #15166: Foundations missing adjacent to NewGRF objects without foundation (#15168)
- Fix #14035: [Fluidsynth] Read settings from config files if available (#15044)
- Fix #15263: Badge filter toggles no longer worked (#14972)
### 15.1 (2026-01-24)
- Fix #15088: When building a new train, the refit button state may be incorrect (#15162)
- Fix #15160: Incorrect company names displayed in load game window (#15161)
- Fix #15153: Wrong tile used to get bridge reservation overlay (#15154)
- Fix #15116: Old cargo/industry sets without cargo translation table broken (#15150)
- Fix: Possible crash converting company liveries in older savegames/scenarios (#15148)
- Fix: Allow infinite water to be (de)selected when loading heightmap (#15146)
- Fix: Tile suitability test for farm field no longer handled snow tiles (#15134)
- Fix #15131: Trees no longer spread on partially snowy tiles (#15133)
- Fix: Change tooltips to match change from checkboxes to switches (#15123)
- Fix: [Script] Potential out of bounds array/string slice indexes (#15106)
- Fix: [Script] Potential out of bounds indexed string access (#15106)
- Fix: [Script] Check if array sort function modified array (#15106)
- Fix #15069: World generation map edges GUI starts in an invalid state (#15082)
- Fix #15079: Incorrect dates shown on town cargo history graph (#15080)
- Fix #15067: Mark NewGRF settings as modified after moving by drag & drop (#15068)
- Fix: Incorrect error message for aqueducts reaching northern map borders (#14974)
- Fix: Standardize wording of GRF/NewGRF (#15059)
- Fix #15046: Crash on loading game due to invalid group parents (#15049)
- Fix: Disable_elrails handling with engines that use both RAIL and ELRL (#15045)
- Fix: [Fluidsynth] Read settings from system and user config files if available (#15044)
- Fix #15039: Name and version can disappear from content list (#15040)
- Fix #15026: Remove incorrect info from base sounds tooltip (#15029)
- Fix: [Script] Improve reporting of invalid GetAPIVersion return (#15015)
- Fix: [Script] Undefined behaviour after calling SwapList during iteration (#14805)
### 15.0 (2026-01-01)
- Fix: Small ufos would loop over vehicles in depots forever (#15008)
- Fix #14982: Can't place buoys under bridges (#15007)
- Fix #15004: Crashes when dropdown is held open during endgame screen (#15006)
- Fix: Further improve town spawning near water (#15002)
- Fix: Use correct 'minutes per year' setting for old savegames (#14995)
- Fix: Rare crash dividing by 0 when drawing a line (#14994)
- Fix #14992: Respect non-stop order setting when adding waypoint orders (#14993)
### 15.0-RC4 (2025-12-26)
- Fix: Incorrect text colour in fund industry window (#14987)
- Fix: Towns failed to find spawn locations near water (#14988)
- Fix: Don't draw bridge deck rail sprites for default bridges (#14985)
- Fix: "(Invalid parameter)" in error message when trying to remove another player's object (#14981)
- Fix #14978: Don't clear water tiles after removing buoys (#14980)
- Fix #14973: Composed strings are incorrect colour (#14976)
- Fix: Badge filter toggles no longer worked (#14972)
- Fix #12465: Click/tooltip alignment of industry chain cargo lines (#14963)
- Fix #14951: Possible incorrect data in industry production graphs (#14962)
- Fix #14958: Crash when opening station window (#14959)
- Fix #14938: Don't allow cacti to die off (#14956)
- Fix: Don't allow joining a company after it was taken over (#14955)
- Fix #14949: Crash when moving station sign in a network game (#14950)
- Fix #14945: Hang when deleting implicit orders during vehicle loading (#14946)
### 15.0-RC3 (2025-12-20)
- Fix #14932: [NewGRF] Increase internal badge index size to avoid overflowing BadgeIDs (#14933)
- Fix: Crash related to object picker recolours in Scenario Editor (#14929)
- Fix #14921: Crash during station autorefit if station doesn't accept current cargo type (#14924)
- Fix #14917: Crash when opening house picker with no houses available (#14920)
- Fix #14916: Duration of error message window could be too short (#14919)
- Fix #14915: Crash due to divide-by-zero of industry probabilities (#14918)
- Fix: Script configs were cleared by intro game (#14910)
- Fix: [NewGRF] Automatically push/pop colours when formatting a sub-string (#14006)
### 15.0-RC2 (2025-12-13)
- Fix #14677: Desync due to using newgame time settings to validate savegame time settings (#14904)
- Fix: Graph label allocated size could be too small (#14901)
- Fix #14891: Minimum sprite zoomlevel could break in some cases showing placeholder sprites instead (#14894)
- Fix #14889: [FluidSynth] Don't try to load a soundfont that doesn't exist (#14890)
- Revert: Dynamic font loading changes removed (#14903)
### 15.0-RC1 (2025-12-07)
- Feature: Automatically load extra fonts for missing glyphs (#13303, #14856)
-7
View File
@@ -100,9 +100,6 @@ macro(compile_flags)
endif()
if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
include(CheckCXXCompilerFlag)
check_cxx_compiler_flag("-flifetime-dse=1" LIFETIME_DSE_FOUND)
add_compile_options(
# GCC 4.2+ automatically assumes that signed overflows do
# not occur in signed arithmetics, whereas we are not
@@ -110,10 +107,6 @@ macro(compile_flags)
# about its own optimized code in some places.
"-fno-strict-overflow"
# -flifetime-dse=2 (default since GCC 6) doesn't play
# well with our custom pool item allocator
"$<$<BOOL:${LIFETIME_DSE_FOUND}>:-flifetime-dse=1>"
# We have a fight between clang wanting std::move() and gcc not wanting it
# and of course they both warn when the other compiler is happy
"-Wno-redundant-move"
+6 -2
View File
@@ -5,12 +5,12 @@
#
# create_regression(file1 ...)
#
macro(create_regression)
macro(create_regression SCRIPT_FOLDER)
set(REGRESSION_SOURCE_FILES ${ARGN})
foreach(REGRESSION_SOURCE_FILE IN LISTS REGRESSION_SOURCE_FILES)
string(REPLACE "${CMAKE_SOURCE_DIR}/regression/" "" REGRESSION_SOURCE_FILE_NAME "${REGRESSION_SOURCE_FILE}")
string(CONCAT REGRESSION_BINARY_FILE "${CMAKE_BINARY_DIR}/ai/" "${REGRESSION_SOURCE_FILE_NAME}")
string(CONCAT REGRESSION_BINARY_FILE "${CMAKE_BINARY_DIR}/${SCRIPT_FOLDER}/" "${REGRESSION_SOURCE_FILE_NAME}")
add_custom_command(OUTPUT ${REGRESSION_BINARY_FILE}
COMMAND ${CMAKE_COMMAND} -E copy
@@ -38,6 +38,7 @@ macro(create_regression)
-DOPENTTD_EXECUTABLE=$<TARGET_FILE:openttd>
-DEDITBIN_EXECUTABLE=${EDITBIN_EXECUTABLE}
-DREGRESSION_TEST=${REGRESSION_TEST_NAME}
-DSCRIPT_FOLDER=${SCRIPT_FOLDER}
-P "${CMAKE_SOURCE_DIR}/cmake/scripts/Regression.cmake"
DEPENDS openttd regression_${REGRESSION_TEST_NAME}_files
WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
@@ -50,9 +51,12 @@ macro(create_regression)
-DOPENTTD_EXECUTABLE=$<TARGET_FILE:openttd>
-DEDITBIN_EXECUTABLE=${EDITBIN_EXECUTABLE}
-DREGRESSION_TEST=${REGRESSION_TEST_NAME}
-DSCRIPT_FOLDER=${SCRIPT_FOLDER}
-P "${CMAKE_SOURCE_DIR}/cmake/scripts/Regression.cmake"
WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
)
set_property(TEST regression_${REGRESSION_TEST_NAME} PROPERTY RUN_SERIAL TRUE)
add_dependencies(regression regression_${REGRESSION_TEST_NAME})
endmacro()
-69
View File
@@ -1,69 +0,0 @@
# CMake provides a FindICU module since version 3.7.
# But it doesn't use pkgconfig, doesn't set expected variables,
# And it returns incomplete dependencies if only some modules are searched.
#[=======================================================================[.rst:
FindICU
-------
Finds components of the ICU library.
Accepted components are: uc, i18n, le, lx, io, data
Result Variables
^^^^^^^^^^^^^^^^
This will define the following variables:
``ICU_FOUND``
True if components of ICU library are found.
``ICU_VERSION``
The version of the ICU library which was found.
``ICU_<c>_FOUND``
True if the system has the <c> component of ICU library.
``ICU_<c>_INCLUDE_DIRS``
Include directories needed to use the <c> component of ICU library.
``ICU_<c>_LIBRARIES``
Libraries needed to link to the <c> component of ICU library.
#]=======================================================================]
find_package(PkgConfig QUIET)
set(ICU_KNOWN_COMPONENTS "uc" "i18n" "le" "lx" "io" "data")
foreach(MOD_NAME IN LISTS ICU_FIND_COMPONENTS)
if(NOT MOD_NAME IN_LIST ICU_KNOWN_COMPONENTS)
message(FATAL_ERROR "Unknown ICU component: ${MOD_NAME}")
endif()
pkg_check_modules(PC_ICU_${MOD_NAME} QUIET icu-${MOD_NAME})
# Check the libraries returned by pkg-config really exist.
unset(PC_LIBRARIES)
foreach(LIBRARY IN LISTS PC_ICU_${MOD_NAME}_LIBRARIES)
unset(PC_LIBRARY CACHE)
find_library(PC_LIBRARY NAMES ${LIBRARY})
if(NOT PC_LIBRARY)
unset(PC_ICU_${MOD_NAME}_FOUND)
endif()
list(APPEND PC_LIBRARIES ${PC_LIBRARY})
endforeach()
unset(PC_LIBRARY CACHE)
if(${PC_ICU_${MOD_NAME}_FOUND})
set(ICU_COMPONENT_FOUND TRUE)
set(ICU_${MOD_NAME}_FOUND TRUE)
set(ICU_${MOD_NAME}_LIBRARIES ${PC_LIBRARIES})
set(ICU_${MOD_NAME}_INCLUDE_DIRS ${PC_ICU_${MOD_NAME}_INCLUDE_DIRS})
set(ICU_VERSION ${PC_ICU_${MOD_NAME}_VERSION})
endif()
endforeach()
include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(ICU
FOUND_VAR ICU_FOUND
REQUIRED_VARS ICU_COMPONENT_FOUND
VERSION_VAR ICU_VERSION
HANDLE_COMPONENTS
)
+34 -24
View File
@@ -190,29 +190,7 @@ elseif(UNIX)
set(CPACK_GENERATOR "TXZ")
set(PLATFORM "unknown")
else()
find_program(LSB_RELEASE_EXEC lsb_release)
execute_process(COMMAND ${LSB_RELEASE_EXEC} -is
OUTPUT_VARIABLE LSB_RELEASE_ID
OUTPUT_STRIP_TRAILING_WHITESPACE
)
if(LSB_RELEASE_ID)
if(LSB_RELEASE_ID STREQUAL "Ubuntu" OR LSB_RELEASE_ID STREQUAL "Debian" OR LSB_RELEASE_ID STREQUAL "Linuxmint")
execute_process(COMMAND ${LSB_RELEASE_EXEC} -cs
OUTPUT_VARIABLE LSB_RELEASE_CODENAME
OUTPUT_STRIP_TRAILING_WHITESPACE
)
string(TOLOWER "${LSB_RELEASE_ID}-${LSB_RELEASE_CODENAME}" PLATFORM)
set(CPACK_GENERATOR "DEB")
include(PackageDeb)
elseif(LSB_RELEASE_ID STREQUAL "Fedora")
set(PLATFORM "fedora")
set(CPACK_GENERATOR "RPM")
include(PackageRPM)
else()
set(UNSUPPORTED_PLATFORM_NAME "LSB-based Linux distribution '${LSB_RELEASE_ID}'")
endif()
elseif(EXISTS "/etc/os-release")
if(EXISTS "/etc/os-release")
file(STRINGS "/etc/os-release" OS_RELEASE_CONTENTS REGEX "^ID=")
string(REGEX MATCH "ID=(.*)" _ ${OS_RELEASE_CONTENTS})
set(DISTRO_ID ${CMAKE_MATCH_1})
@@ -223,11 +201,43 @@ elseif(UNIX)
set(PLATFORM "fedora")
set(CPACK_GENERATOR "RPM")
include(PackageRPM)
elseif(DISTRO_ID STREQUAL "ubuntu" OR DISTRO_ID STREQUAL "debian" OR DISTRO_ID STREQUAL "linuxmint")
file(STRINGS "/etc/os-release" OS_RELEASE_CODENAME REGEX "^VERSION_CODENAME=")
string(REGEX MATCH "VERSION_CODENAME=(.*)" _ ${OS_RELEASE_CODENAME})
set(RELEASE_CODENAME ${CMAKE_MATCH_1})
string(TOLOWER "${DISTRO_ID}-${RELEASE_CODENAME}" PLATFORM)
set(CPACK_GENERATOR "DEB")
include(PackageDeb)
else()
set(UNSUPPORTED_PLATFORM_NAME "Linux distribution '${DISTRO_ID}' from /etc/os-release")
endif()
else()
set(UNSUPPORTED_PLATFORM_NAME "Linux distribution")
find_program(LSB_RELEASE_EXEC lsb_release)
execute_process(COMMAND ${LSB_RELEASE_EXEC} -is
OUTPUT_VARIABLE LSB_RELEASE_ID
OUTPUT_STRIP_TRAILING_WHITESPACE
)
if(LSB_RELEASE_ID)
if(LSB_RELEASE_ID STREQUAL "Ubuntu" OR LSB_RELEASE_ID STREQUAL "Debian" OR LSB_RELEASE_ID STREQUAL "Linuxmint")
execute_process(COMMAND ${LSB_RELEASE_EXEC} -cs
OUTPUT_VARIABLE LSB_RELEASE_CODENAME
OUTPUT_STRIP_TRAILING_WHITESPACE
)
string(TOLOWER "${LSB_RELEASE_ID}-${LSB_RELEASE_CODENAME}" PLATFORM)
set(CPACK_GENERATOR "DEB")
include(PackageDeb)
elseif(LSB_RELEASE_ID STREQUAL "Fedora")
set(PLATFORM "fedora")
set(CPACK_GENERATOR "RPM")
include(PackageRPM)
else()
set(UNSUPPORTED_PLATFORM_NAME "LSB-based Linux distribution '${LSB_RELEASE_ID}'")
endif()
else()
set(UNSUPPORTED_PLATFORM_NAME "Linux distribution")
endif()
endif()
if(NOT PLATFORM)
+20
View File
@@ -61,12 +61,32 @@ function(set_options)
option(OPTION_TOOLS_ONLY "Build only tools target" OFF)
option(OPTION_DOCS_ONLY "Build only docs target" OFF)
option(OPTION_ALLOW_INVALID_SIGNATURE "Allow loading of content with invalid signatures" OFF)
option(OPTION_LINE_IN_DOXYGEN_WARNINGS "Print line number in doxygen warnings" ON)
if (OPTION_DOCS_ONLY)
set(OPTION_TOOLS_ONLY ON PARENT_SCOPE)
endif()
if (OPTION_LINE_IN_DOXYGEN_WARNINGS)
set(DOXYGEN_WARN_FORMAT_LINE "line" PARENT_SCOPE)
endif()
option(OPTION_SURVEY_KEY "Survey-key to use for the opt-in survey (empty if you have none)" "")
option(OPTION_DOXYGEN_WARN_FILE "File to write doxygen warnings into (if empty warnings are written to standard error)" "")
option(OPTION_DOXYGEN_GS_WARN_FILE "File to write doxygen warnings from game script docs into (if empty warnings are written to standard error)" "")
option(OPTION_DOXYGEN_AI_WARN_FILE "File to write doxygen warnings from AI docs into (if empty warnings are written to standard error)" "")
if(OPTION_DOXYGEN_WARN_FILE)
set(DOXYGEN_WARN_FILE ${CMAKE_BINARY_DIR}/${OPTION_DOXYGEN_WARN_FILE} PARENT_SCOPE)
endif()
if(OPTION_DOXYGEN_GS_WARN_FILE)
set(DOXYGEN_GS_WARN_FILE ${CMAKE_BINARY_DIR}/${OPTION_DOXYGEN_GS_WARN_FILE} PARENT_SCOPE)
endif()
if(OPTION_DOXYGEN_AI_WARN_FILE)
set(DOXYGEN_AI_WARN_FILE ${CMAKE_BINARY_DIR}/${OPTION_DOXYGEN_AI_WARN_FILE} PARENT_SCOPE)
endif()
endfunction()
# Show the values of the generic options.
+3
View File
@@ -135,6 +135,9 @@ if(GENERATE_OTTDREV)
message(STATUS "Generating .ottdrev")
file(WRITE ${CMAKE_SOURCE_DIR}/.ottdrev "${REV_VERSION}\t${REV_ISODATE}\t${REV_MODIFIED}\t${REV_HASH}\t${REV_ISTAG}\t${REV_ISSTABLETAG}\n")
else()
if(REV_ISSTABLETAG AND NOT (REV_VERSION STREQUAL "${REV_MAJOR}.${REV_MINOR}"))
message(FATAL_ERROR "Tag (${REV_VERSION}) doesn't match internal version (${REV_MAJOR}.${REV_MINOR})")
endif()
message(STATUS "Generating rev.cpp")
configure_file("${CMAKE_SOURCE_DIR}/src/rev.cpp.in"
"${FIND_VERSION_BINARY_DIR}/rev.cpp")
+23 -13
View File
@@ -25,6 +25,13 @@ endif()
file(STRINGS ${GENERATE_SOURCE_FILE} ENUM_LINES REGEX "@enum")
function(remove_invalid_links VARIABLE)
string(REGEX REPLACE "#([A-Za-z0-9_]*Widgets)" "@hash \\1" VARIABLE "${VARIABLE}")
string(REPLACE "#" "" VARIABLE "${VARIABLE}")
string(REPLACE "@hash " "#" VARIABLE "${VARIABLE}")
set(NO_INVALID_LINKS ${VARIABLE} PARENT_SCOPE)
endfunction()
foreach(ENUM IN LISTS ENUM_LINES)
string(REGEX REPLACE "^( )// @enum ([^ ]+) ([^ ]+)@([^ ]+)@" "\\4" PLACE_HOLDER "${ENUM}")
set(ADD_INDENT "${CMAKE_MATCH_1}")
@@ -49,14 +56,17 @@ foreach(ENUM IN LISTS ENUM_LINES)
# Remember possible doxygen comment before enum declaration
if((NOT ACTIVE) AND "${LINE}" MATCHES "/\\*\\*")
set(COMMENT "${ADD_INDENT}${LINE}")
remove_invalid_links("${LINE}")
set(COMMENT "${ADD_INDENT}${NO_INVALID_LINKS}")
set(ACTIVE_COMMENT 1)
elseif(ACTIVE_COMMENT EQUAL 1)
string(APPEND COMMENT "\n${ADD_INDENT}${LINE}")
remove_invalid_links("${LINE}")
string(APPEND COMMENT "\n${ADD_INDENT}${NO_INVALID_LINKS}")
endif()
# Check for enum match
if("${LINE}" MATCHES "^ *enum *${ENUM_PATTERN}( *: *[^ ]*)? *\{")
if("${LINE}" MATCHES "^ *enum *(class)? *(${ENUM_PATTERN})( *: *[^ ]*)? *\{")
set(ENUM_NAME "${CMAKE_MATCH_2}")
# REGEX REPLACE does a REGEX MATCHALL and fails if an empty string is matched
string(REGEX MATCH "[^ ]*" RESULT "${LINE}")
string(REPLACE "${RESULT}" "" RM_INDENT "${LINE}")
@@ -100,23 +110,23 @@ foreach(ENUM IN LISTS ENUM_LINES)
endforeach()
if(CMAKE_MATCH_3)
string(APPEND ${PLACE_HOLDER} "\n${ADD_INDENT}${CMAKE_MATCH_1}${CMAKE_MATCH_2}${SPACES} = ::${CMAKE_MATCH_2},${SPACES}${CMAKE_MATCH_3}")
# CMAKE_MATCH_3 contains inline comment.
remove_invalid_links("${CMAKE_MATCH_3}")
string(APPEND ${PLACE_HOLDER} "\n${ADD_INDENT}${CMAKE_MATCH_1}${CMAKE_MATCH_2}${SPACES} = to_underlying(::${ENUM_NAME}::${CMAKE_MATCH_2}),${SPACES}${NO_INVALID_LINKS}")
else()
string(APPEND ${PLACE_HOLDER} "\n${ADD_INDENT}${CMAKE_MATCH_1}${CMAKE_MATCH_2}${SPACES} = ::${CMAKE_MATCH_2},")
string(APPEND ${PLACE_HOLDER} "\n${ADD_INDENT}${CMAKE_MATCH_1}${CMAKE_MATCH_2}${SPACES} = to_underlying(::${ENUM_NAME}::${CMAKE_MATCH_2}),")
endif()
elseif("${LINE}" STREQUAL "")
string(APPEND ${PLACE_HOLDER} "\n")
elseif("${LINE}" MATCHES "^ *\};")
string(APPEND ${PLACE_HOLDER} "\n${ADD_INDENT}${LINE}\n")
unset(ACTIVE)
else()
string(APPEND ${PLACE_HOLDER} "\n${ADD_INDENT}${LINE}")
# Line is not an enum member, so it might be a comment.
remove_invalid_links("${LINE}")
string(APPEND ${PLACE_HOLDER} "\n${ADD_INDENT}${NO_INVALID_LINKS}")
endif()
endif()
if("${LINE}" MATCHES "^ *\};")
if(ACTIVE)
string(APPEND ${PLACE_HOLDER} "\n")
endif()
unset(ACTIVE)
endif()
endforeach()
endforeach()
endforeach()
+7 -4
View File
@@ -7,11 +7,14 @@ cmake_minimum_required(VERSION 3.17)
if(NOT REGRESSION_TEST)
message(FATAL_ERROR "Script needs REGRESSION_TEST defined (tip: use -DREGRESSION_TEST=..)")
endif()
if(NOT SCRIPT_FOLDER)
message(FATAL_ERROR "Script needs SCRIPT_FOLDER defined (tip: use -DSCRIPT_FOLDER=..)")
endif()
if(NOT OPENTTD_EXECUTABLE)
message(FATAL_ERROR "Script needs OPENTTD_EXECUTABLE defined (tip: use -DOPENTTD_EXECUTABLE=..)")
endif()
if(NOT EXISTS ai/${REGRESSION_TEST}/test.sav)
if(NOT EXISTS ${SCRIPT_FOLDER}/${REGRESSION_TEST}/test.sav)
message(FATAL_ERROR "Regression test ${REGRESSION_TEST} does not exist (tip: check regression folder for the correct spelling)")
endif()
@@ -35,7 +38,7 @@ endif()
execute_process(COMMAND ${OPENTTD_EXECUTABLE}
-x
-c regression/regression.cfg
-g ai/${REGRESSION_TEST}/test.sav
-g ${SCRIPT_FOLDER}/${REGRESSION_TEST}/test.sav
-snull
-mnull
-vnull:ticks=30000
@@ -77,7 +80,7 @@ string(REGEX REPLACE "\\\[script:[0-9]\\\]" "" REGRESSION_RESULT "${REGRESSION_R
# Convert the output to a format that is expected (and more readable) by result.txt
string(REPLACE "dbg: " "ERROR: " REGRESSION_RESULT "${REGRESSION_RESULT}")
string(REPLACE "ERROR: [1] " "" REGRESSION_RESULT "${REGRESSION_RESULT}")
string(REGEX REPLACE "ERROR: \\\[18?\\\] " "" REGRESSION_RESULT "${REGRESSION_RESULT}")
string(REPLACE "[P] " "" REGRESSION_RESULT "${REGRESSION_RESULT}")
string(REPLACE "[S] " "" REGRESSION_RESULT "${REGRESSION_RESULT}")
string(REGEX REPLACE "dbg: ([^\n]*)\n?" "" REGRESSION_RESULT "${REGRESSION_RESULT}")
@@ -88,7 +91,7 @@ string(REGEX REPLACE "ERROR: [12]([^\n]*)\n?" "" REGRESSION_RESULT "${REGRESSI
string(REGEX REPLACE "ERROR: The first([^\n]*)\n?" "" REGRESSION_RESULT "${REGRESSION_RESULT}")
# Read the expected result
file(READ ai/${REGRESSION_TEST}/result.txt REGRESSION_EXPECTED)
file(READ ${SCRIPT_FOLDER}/${REGRESSION_TEST}/result.txt REGRESSION_EXPECTED)
# Convert the string to a list
string(REPLACE "\n" ";" REGRESSION_RESULT "${REGRESSION_RESULT}")
+59 -127
View File
@@ -215,6 +215,10 @@ foreach(LINE IN LISTS SOURCE_LINES)
continue()
endif()
if("${LINE}" MATCHES "^([\t ]*)\\* @suspendable.*$")
set(SUSPENDABLE TRUE)
endif()
# Ignore the comments
if("${LINE}" MATCHES "^#")
continue()
@@ -258,7 +262,7 @@ foreach(LINE IN LISTS SOURCE_LINES)
endif()
# We need to make specialized conversions for enums
if("${LINE}" MATCHES "^(\t*)enum ([^ ]*)")
if("${LINE}" MATCHES "^(\t*)enum *(class)? *([^ ]*)")
math(EXPR CLS_LEVEL "${CLS_LEVEL} + 1")
# Check if we want to publish this enum
@@ -276,7 +280,10 @@ foreach(LINE IN LISTS SOURCE_LINES)
endif()
set(IN_ENUM TRUE)
list(APPEND ENUMS "${CLS}::${CMAKE_MATCH_2}")
if(CMAKE_MATCH_2 STREQUAL "class")
set(IN_SCOPED_ENUM TRUE)
endif()
list(APPEND ENUMS "${CLS}::${CMAKE_MATCH_3}")
continue()
endif()
@@ -285,6 +292,7 @@ foreach(LINE IN LISTS SOURCE_LINES)
math(EXPR CLS_LEVEL "${CLS_LEVEL} - 1")
if(CLS_LEVEL)
unset(IN_ENUM)
unset(IN_SCOPED_ENUM)
continue()
endif()
@@ -361,168 +369,86 @@ foreach(LINE IN LISTS SOURCE_LINES)
string(APPEND SQUIRREL_EXPORT "\n")
# Enum values
set(MLEN 0)
foreach(ENUM_VALUE IN LISTS ENUM_VALUES)
string(LENGTH "${ENUM_VALUE}" LEN)
if(MLEN LESS LEN)
set(MLEN ${LEN})
macro(add_scoped_enum_end_if_needed)
if(CURRENT_ENUM_NAME)
unset(CURRENT_ENUM_NAME)
string(APPEND SQUIRREL_EXPORT "\n\tSQ${API_CLS}.AddScopedEnumEnd(engine);\n")
endif()
endforeach()
endmacro()
set(CURRENT_ENUM_NAME 0)
foreach(ENUM_VALUE IN LISTS ENUM_VALUES)
string(LENGTH "${ENUM_VALUE}" LEN)
math(EXPR LEN "${MLEN} - ${LEN}")
unset(SPACES)
foreach(i RANGE ${LEN})
string(APPEND SPACES " ")
endforeach()
string(APPEND SQUIRREL_EXPORT "\n\tSQ${API_CLS}.DefSQConst(engine, ${CLS}::${ENUM_VALUE},${SPACES}\"${ENUM_VALUE}\");")
if(ENUM_VALUE MATCHES "::")
string(REGEX REPLACE ".*:" "" ENUM_VALUE_NAME "${ENUM_VALUE}")
string(REGEX MATCH "::(.*)::" ENUM_NAME "${ENUM_VALUE}")
set(ENUM_NAME ${CMAKE_MATCH_1})
if(CURRENT_ENUM_NAME STREQUAL ENUM_NAME)
else()
add_scoped_enum_end_if_needed()
string(APPEND SQUIRREL_EXPORT "\n\tSQ${API_CLS}.AddScopedEnumBegin(engine, \"${ENUM_NAME}\");")
set(CURRENT_ENUM_NAME ${ENUM_NAME})
endif()
string(APPEND SQUIRREL_EXPORT "\n\tSQ${API_CLS}.DefSQConst(engine, to_underlying(${ENUM_VALUE}), \"${ENUM_VALUE_NAME}\");")
continue()
endif()
add_scoped_enum_end_if_needed()
string(APPEND SQUIRREL_EXPORT "\n\tSQ${API_CLS}.DefSQConst(engine, ${CLS}::${ENUM_VALUE}, \"${ENUM_VALUE}\");")
endforeach()
if(MLEN)
string(APPEND SQUIRREL_EXPORT "\n")
endif()
add_scoped_enum_end_if_needed()
# Const values
set(MLEN 0)
foreach(CONST_VALUE IN LISTS CONST_VALUES)
string(LENGTH "${CONST_VALUE}" LEN)
if(MLEN LESS LEN)
set(MLEN ${LEN})
endif()
string(APPEND SQUIRREL_EXPORT "\n\tSQ${API_CLS}.DefSQConst(engine, ${CLS}::${CONST_VALUE}, \"${CONST_VALUE}\");")
endforeach()
foreach(CONST_VALUE IN LISTS CONST_VALUES)
string(LENGTH "${CONST_VALUE}" LEN)
math(EXPR LEN "${MLEN} - ${LEN}")
unset(SPACES)
foreach(i RANGE ${LEN})
string(APPEND SPACES " ")
endforeach()
string(APPEND SQUIRREL_EXPORT "\n\tSQ${API_CLS}.DefSQConst(engine, ${CLS}::${CONST_VALUE},${SPACES}\"${CONST_VALUE}\");")
endforeach()
if(MLEN)
string(APPEND SQUIRREL_EXPORT "\n")
endif()
# Mapping of OTTD strings to errors
set(MLEN 0)
foreach(ENUM_STRING_TO_ERROR IN LISTS ENUM_STRING_TO_ERRORS)
string(REPLACE ":" ";" ENUM_STRING_TO_ERROR "${ENUM_STRING_TO_ERROR}")
list(GET ENUM_STRING_TO_ERROR 0 ENUM_STRING)
string(LENGTH "${ENUM_STRING}" LEN)
if(MLEN LESS LEN)
set(MLEN ${LEN})
endif()
endforeach()
foreach(ENUM_STRING_TO_ERROR IN LISTS ENUM_STRING_TO_ERRORS)
string(REPLACE ":" ";" ENUM_STRING_TO_ERROR "${ENUM_STRING_TO_ERROR}")
list(GET ENUM_STRING_TO_ERROR 0 ENUM_STRING)
list(GET ENUM_STRING_TO_ERROR 1 ENUM_ERROR)
string(LENGTH "${ENUM_STRING}" LEN)
math(EXPR LEN "${MLEN} - ${LEN}")
unset(SPACES)
foreach(i RANGE ${LEN})
string(APPEND SPACES " ")
endforeach()
string(APPEND SQUIRREL_EXPORT "\n\tScriptError::RegisterErrorMap(${ENUM_STRING},${SPACES}${CLS}::${ENUM_ERROR});")
string(APPEND SQUIRREL_EXPORT "\n\tScriptError::RegisterErrorMap(${ENUM_STRING}, ${CLS}::${ENUM_ERROR});")
endforeach()
if(MLEN)
string(APPEND SQUIRREL_EXPORT "\n")
endif()
# Mapping of errors to human 'readable' strings.
set(MLEN 0)
foreach(ENUM_ERROR_TO_STRING IN LISTS ENUM_ERROR_TO_STRINGS)
string(LENGTH "${ENUM_ERROR_TO_STRING}" LEN)
if(MLEN LESS LEN)
set(MLEN ${LEN})
endif()
string(APPEND SQUIRREL_EXPORT "\n\tScriptError::RegisterErrorMapString(${CLS}::${ENUM_ERROR_TO_STRING}, \"${ENUM_ERROR_TO_STRING}\");")
endforeach()
foreach(ENUM_ERROR_TO_STRING IN LISTS ENUM_ERROR_TO_STRINGS)
string(LENGTH "${ENUM_ERROR_TO_STRING}" LEN)
math(EXPR LEN "${MLEN} - ${LEN}")
unset(SPACES)
foreach(i RANGE ${LEN})
string(APPEND SPACES " ")
endforeach()
string(APPEND SQUIRREL_EXPORT "\n\tScriptError::RegisterErrorMapString(${CLS}::${ENUM_ERROR_TO_STRING},${SPACES}\"${ENUM_ERROR_TO_STRING}\");")
endforeach()
if(MLEN)
string(APPEND SQUIRREL_EXPORT "\n")
endif()
# Static methods
set(MLEN 0)
foreach(STATIC_METHOD IN LISTS STATIC_METHODS)
string(REPLACE ":" ";" STATIC_METHOD "${STATIC_METHOD}")
list(GET STATIC_METHOD 0 FUNCNAME)
string(LENGTH "${FUNCNAME}" LEN)
if(MLEN LESS LEN)
set(MLEN ${LEN})
endif()
endforeach()
foreach(STATIC_METHOD IN LISTS STATIC_METHODS)
string(REPLACE ":" ";" STATIC_METHOD "${STATIC_METHOD}")
list(GET STATIC_METHOD 0 FUNCNAME)
list(GET STATIC_METHOD 1 TYPES)
string(LENGTH "${FUNCNAME}" LEN)
math(EXPR LEN "${MLEN} - ${LEN}")
if("${TYPES}" STREQUAL "v")
if(LEN GREATER 8)
math(EXPR LEN "${LEN} - 8")
else()
set(LEN 0)
endif()
list(GET STATIC_METHOD 2 SUSPENDABLE)
if(SUSPENDABLE)
set(SUSPENDABLE ", true")
endif()
unset(SPACES)
foreach(i RANGE ${LEN})
string(APPEND SPACES " ")
endforeach()
if("${TYPES}" STREQUAL "v")
string(APPEND SQUIRREL_EXPORT "\n\tSQ${API_CLS}.DefSQAdvancedStaticMethod(engine, &${CLS}::${FUNCNAME},${SPACES}\"${FUNCNAME}\");")
string(APPEND SQUIRREL_EXPORT "\n\tSQ${API_CLS}.DefSQAdvancedStaticMethod(engine, &${CLS}::${FUNCNAME}, \"${FUNCNAME}\"${SUSPENDABLE});")
else()
string(APPEND SQUIRREL_EXPORT "\n\tSQ${API_CLS}.DefSQStaticMethod(engine, &${CLS}::${FUNCNAME},${SPACES}\"${FUNCNAME}\",${SPACES}\"${TYPES}\");")
string(APPEND SQUIRREL_EXPORT "\n\tSQ${API_CLS}.DefSQStaticMethod(engine, &${CLS}::${FUNCNAME}, \"${FUNCNAME}\", \"${TYPES}\"${SUSPENDABLE});")
endif()
endforeach()
if(MLEN)
string(APPEND SQUIRREL_EXPORT "\n")
endif()
# Non-static methods
set(MLEN 0)
foreach(METHOD IN LISTS METHODS)
string(REPLACE ":" ";" METHOD "${METHOD}")
list(GET METHOD 0 FUNCNAME)
string(LENGTH "${FUNCNAME}" LEN)
if(MLEN LESS LEN)
set(MLEN ${LEN})
endif()
endforeach()
foreach(METHOD IN LISTS METHODS)
string(REPLACE ":" ";" METHOD "${METHOD}")
list(GET METHOD 0 FUNCNAME)
list(GET METHOD 1 TYPES)
string(LENGTH "${FUNCNAME}" LEN)
math(EXPR LEN "${MLEN} - ${LEN}")
if("${TYPES}" STREQUAL "v")
if(LEN GREATER 8)
math(EXPR LEN "${LEN} - 8")
else()
set(LEN 0)
endif()
list(GET METHOD 2 SUSPENDABLE)
if(SUSPENDABLE)
set(SUSPENDABLE ", true")
endif()
unset(SPACES)
foreach(i RANGE ${LEN})
string(APPEND SPACES " ")
endforeach()
if("${TYPES}" STREQUAL "v")
string(APPEND SQUIRREL_EXPORT "\n\tSQ${API_CLS}.DefSQAdvancedMethod(engine, &${CLS}::${FUNCNAME},${SPACES}\"${FUNCNAME}\");")
string(APPEND SQUIRREL_EXPORT "\n\tSQ${API_CLS}.DefSQAdvancedMethod(engine, &${CLS}::${FUNCNAME}, \"${FUNCNAME}\"${SUSPENDABLE});")
else()
string(APPEND SQUIRREL_EXPORT "\n\tSQ${API_CLS}.DefSQMethod(engine, &${CLS}::${FUNCNAME},${SPACES}\"${FUNCNAME}\",${SPACES}\"${TYPES}\");")
string(APPEND SQUIRREL_EXPORT "\n\tSQ${API_CLS}.DefSQMethod(engine, &${CLS}::${FUNCNAME}, \"${FUNCNAME}\", \"${TYPES}\"${SUSPENDABLE});")
endif()
endforeach()
if(MLEN)
string(APPEND SQUIRREL_EXPORT "\n")
endif()
string(APPEND SQUIRREL_EXPORT "\n")
string(APPEND SQUIRREL_EXPORT "\n\tSQ${API_CLS}.PostRegister(engine);")
string(APPEND SQUIRREL_EXPORT "\n}")
@@ -542,11 +468,16 @@ foreach(LINE IN LISTS SOURCE_LINES)
# Add enums
if(IN_ENUM)
string(REGEX MATCH "([^,\t ]+)" ENUM_VALUE "${LINE}")
list(APPEND ENUM_VALUES "${ENUM_VALUE}")
# Check if this a special error enum
list(GET ENUMS -1 ENUM)
string(REGEX MATCH "([^,\t ]+)" ENUM_VALUE "${LINE}")
if(IN_SCOPED_ENUM)
list(APPEND ENUM_VALUES "${ENUM}::${ENUM_VALUE}")
else()
list(APPEND ENUM_VALUES "${ENUM_VALUE}")
endif()
if("${ENUM}" MATCHES ".*::ErrorMessages")
# syntax:
# enum ErrorMessages {
@@ -672,10 +603,11 @@ foreach(LINE IN LISTS SOURCE_LINES)
set(CLS_TYPES "${TYPES}")
elseif("${FUNCNAME}" MATCHES "^_" AND NOT "${TYPES}" STREQUAL "v")
elseif(IS_STATIC)
list(APPEND STATIC_METHODS "${FUNCNAME}:${TYPES}")
list(APPEND STATIC_METHODS "${FUNCNAME}:${TYPES}:${SUSPENDABLE}")
else()
list(APPEND METHODS "${FUNCNAME}:${TYPES}")
list(APPEND METHODS "${FUNCNAME}:${TYPES}:${SUSPENDABLE}")
endif()
unset(SUSPENDABLE)
continue()
endif()
endforeach()
+66 -66
View File
@@ -38,7 +38,7 @@ Last updated: 2024-03-26
packets are dropped in favour of a new packet.
This though will be reflected in the protocol version as announced in the
`ADMIN_PACKET_SERVER_PROTOCOL` in section 2.0).
`PacketAdminType::ServerProtocol` in section 2.0).
A reference implementation in Java for a client connecting to the admin interface
can be found at: [http://dev.openttdcoop.org/projects/joan](http://dev.openttdcoop.org/projects/joan)
@@ -49,18 +49,18 @@ Last updated: 2024-03-26
Create a TCP connection to the server on port 3977. The application is
expected to authenticate within 10 seconds.
To authenticate send either an `ADMIN_PACKET_ADMIN_JOIN` or an
`ADMIN_PACKET_ADMIN_JOIN_SECURE` packet.
To authenticate send either an `PacketAdminType::AdminJoin` or an
`PacketAdminType::AdminJoinSecure` packet.
The `ADMIN_PACKET_ADMIN_JOIN` packet sends the password without any
The `PacketAdminType::AdminJoin` packet sends the password without any
encryption or safeguards over the connection, and as such has been disabled
by default.
The `ADMIN_PACKET_ADMIN_JOIN_SECURE` packet initiates a key exchange
The `PacketAdminType::AdminJoinSecure` packet initiates a key exchange
authentication schema which tells te server which methods the client
supports and the server makes a choice. The server will then send an
`ADMIN_PACKET_SERVER_AUTH_REQUEST` packet to which the client has to respond
with an `ADMIN_PACKET_ADMIN_AUTH_RESPONSE` packet.
`PacketAdminType::ServerAuthenticationRequest` packet to which the client has to respond
with an `PacketAdminType::AdminAuthenticationResponse` packet.
The current choices for secure authentication are authorized keys, where
the client has a private key and the server a list of authorized public
@@ -69,41 +69,41 @@ Last updated: 2024-03-26
The server falls back to password authentication when the client's key is
not in the list of authorized keys.
When authentication has succeeded for either of the `JOIN` schemas, the
server will reply with `ADMIN_PACKET_SERVER_PROTOCOL` followed directly
by `ADMIN_PACKET_SERVER_WELCOME`.
When authentication has succeeded for either of the `AdminJoin` schemas, the
server will reply with `PacketAdminType::ServerProtocol` followed directly
by `PacketAdminType::ServerWelcome`.
`ADMIN_PACKET_SERVER_PROTOCOL` contains details about the protocol version.
`PacketAdminType::ServerProtocol` contains details about the protocol version.
It is the job of your application to check this number and decide whether
it will remain connected or not.
Furthermore, this packet holds details on every `AdminUpdateType` and the
supported `AdminFrequencyTypes` (bitwise representation).
`ADMIN_PACKET_SERVER_WELCOME` contains details on the server and the map,
`PacketAdminType::ServerWelcome` contains details on the server and the map,
e.g. if the server is dedicated, its NetworkLanguage, size of the Map, etc.
Once you have received `ADMIN_PACKET_SERVER_WELCOME` you are connected and
Once you have received `PacketAdminType::ServerWelcome` you are connected and
authorized to do your thing.
The server will not provide any game related updates unless you ask for them.
There are four packets the server will none the less send, if applicable:
- ADMIN_PACKET_SERVER_ERROR
- ADMIN_PACKET_SERVER_WELCOME
- ADMIN_PACKET_SERVER_NEWGAME
- ADMIN_PACKET_SERVER_SHUTDOWN
- PacketAdminType::ServerError
- PacketAdminType::ServerWelcome
- PacketAdminType::ServerNewGame
- PacketAdminType::ServerShutdown
However, `ADMIN_PACKET_SERVER_WELCOME` only after a `ADMIN_PACKET_SERVER_NEWGAME`
However, `PacketAdminType::ServerWelcome` only after a `PacketAdminType::ServerNewGame`
## 3.0) Asking for updates
Asking for updates is done with `ADMIN_PACKET_ADMIN_UPDATE_FREQUENCY`.
Asking for updates is done with `PacketAdminType::AdminUpdateFrequency`.
With this packet you define which update you wish to receive at which
frequency.
Note: not every update type supports every frequency. If in doubt, you can
verify against the data received in `ADMIN_PACKET_SERVER_PROTOCOL`.
verify against the data received in `PacketAdminType::ServerProtocol`.
Please note the potential gotcha in the "Certain packet information" section below
when using the `ADMIN_UPDATE_FREQUENCY` packet.
@@ -114,61 +114,61 @@ Last updated: 2024-03-26
Additional debug information can be found with a debug level of `net=3`.
`ADMIN_UPDATE_DATE` results in the server sending:
`AdminUpdateType::Date` results in the server sending:
- ADMIN_PACKET_SERVER_DATE
- PacketAdminType::ServerDate
`ADMIN_UPDATE_CLIENT_INFO` results in the server sending:
`AdminUpdateType::ClientInfo` results in the server sending:
- ADMIN_PACKET_SERVER_CLIENT_JOIN
- ADMIN_PACKET_SERVER_CLIENT_INFO
- ADMIN_PACKET_SERVER_CLIENT_UPDATE
- ADMIN_PACKET_SERVER_CLIENT_QUIT
- ADMIN_PACKET_SERVER_CLIENT_ERROR
- PacketAdminType::ServerClientJoin
- PacketAdminType::ServerClientInfo
- PacketAdminType::ServerClientUpdate
- PacketAdminType::ServerClientQuit
- PacketAdminType::ServerClientError
`ADMIN_UPDATE_COMPANY_INFO` results in the server sending:
`AdminUpdateType::CompanyInfo` results in the server sending:
- ADMIN_PACKET_SERVER_COMPANY_NEW
- ADMIN_PACKET_SERVER_COMPANY_INFO
- ADMIN_PACKET_SERVER_COMPANY_UPDATE
- ADMIN_PACKET_SERVER_COMPANY_REMOVE
- PacketAdminType::ServerCompanyNew
- PacketAdminType::ServerCompanyInfo
- PacketAdminType::ServerCompanyUpdate
- PacketAdminType::ServerCompanyRemove
`ADMIN_UPDATE_COMPANY_ECONOMY` results in the server sending:
`AdminUpdateType::CompanyEconomy` results in the server sending:
- ADMIN_PACKET_SERVER_COMPANY_ECONOMY
- PacketAdminType::ServerCompanyEconomy
`ADMIN_UPDATE_COMPANY_STATS` results in the server sending:
`AdminUpdateType::CompanyStats` results in the server sending:
- ADMIN_PACKET_SERVER_COMPANY_STATS
- PacketAdminType::ServerCompanyStatistics
`ADMIN_UPDATE_CHAT` results in the server sending:
`AdminUpdateType::Chat` results in the server sending:
- ADMIN_PACKET_SERVER_CHAT
- PacketAdminType::ServerChat
`ADMIN_UPDATE_CONSOLE` results in the server sending:
`AdminUpdateType::Console` results in the server sending:
- ADMIN_PACKET_SERVER_CONSOLE
- PacketAdminType::ServerConsole
`ADMIN_UPDATE_CMD_LOGGING` results in the server sending:
`AdminUpdateType::CmdLogging` results in the server sending:
- ADMIN_PACKET_SERVER_CMD_LOGGING
- PacketAdminType::ServerCommandLogging
## 3.1) Polling manually
Certain `AdminUpdateTypes` can also be polled:
- ADMIN_UPDATE_DATE
- ADMIN_UPDATE_CLIENT_INFO
- ADMIN_UPDATE_COMPANY_INFO
- ADMIN_UPDATE_COMPANY_ECONOMY
- ADMIN_UPDATE_COMPANY_STATS
- ADMIN_UPDATE_CMD_NAMES
- AdminUpdateType::Date
- AdminUpdateType::ClientInfo
- AdminUpdateType::CompanyInfo
- AdminUpdateType::CompanyEconomy
- AdminUpdateType::CompanyStats
- AdminUpdateType::CmdNames
Please note the potential gotcha in the "Certain packet information" section below
when using the `ADMIN_POLL` packet.
`ADMIN_UPDATE_CLIENT_INFO` and `ADMIN_UPDATE_COMPANY_INFO` accept an additional
`AdminUpdateType::ClientInfo` and `AdminUpdateType::CompanyInfo` accept an additional
parameter. This parameter is used to specify a certain client or company.
Setting this parameter to `UINT32_MAX (0xFFFFFFFF)` will tell the server you
want to receive updates for all clients or companies.
@@ -181,16 +181,16 @@ Last updated: 2024-03-26
## 4.0) Sending rcon commands
Rcon runs separate from the `ADMIN_UPDATE_CONSOLE` `AdminUpdateType`. Requesting
Rcon runs separate from the `AdminUpdateType::Console` `AdminUpdateType`. Requesting
the execution of a remote console command is done with the packet
`ADMIN_PACKET_ADMIN_RCON`.
`PacketAdminType::AdminRemoteConsoleCommand`.
Note: No additional authentication is required for rcon commands.
The server will reply with one or more `ADMIN_PACKET_SERVER_RCON` packets.
Finally an `ADMIN_PACKET_ADMIN_RCON_END` packet will be sent. Applications
The server will reply with one or more `PacketAdminType::ServerRemoteConsoleCommand` packets.
Finally an `PacketAdminType::AdminRemoteConsoleCommandEnd` packet will be sent. Applications
will not receive the answer twice if they have asked for the `AdminUpdateType`
`ADMIN_UPDATE_CONSOLE`, as the result is not printed on the servers console
`AdminUpdateType::Console`, as the result is not printed on the servers console
(just like clients rcon commands).
Furthermore, sending a `say` command (or any similar command) will not
@@ -199,7 +199,7 @@ Last updated: 2024-03-26
was not sent from the admin network.
Note that when content is queried or updated via rcon, the processing
happens asynchronously. But the `ADMIN_PACKET_ADMIN_RCON_END` packet is sent
happens asynchronously. But the `PacketAdminType::AdminRemoteConsoleCommandEnd` packet is sent
already right after the content is requested as there's no immediate output.
Thus other packages and the output of content rcon command may be sent at
an arbitrary later time, mixing into the output of other console activity,
@@ -208,7 +208,7 @@ Last updated: 2024-03-26
## 5.0) Sending chat
Sending a `ADMIN_PACKET_ADMIN_CHAT` results in chat originating from the server.
Sending a `PacketAdminType::AdminChat` results in chat originating from the server.
Currently four types of chat are supported:
@@ -223,7 +223,7 @@ Last updated: 2024-03-26
## 5.1) Receiving chat
Register `ADMIN_UPDATE_CHAT` at `AdminUpdateFrequency::Automatic` to receive chat.
Register `AdminUpdateType::Chat` at `AdminUpdateFrequency::Automatic` to receive chat.
The application will be able to receive all chat the server can see.
The configuration option `network.server_admin_chat` specifies whether
@@ -233,12 +233,12 @@ Last updated: 2024-03-26
## 6.0) Disconnecting
It is a kind thing to say good bye before leaving. Do this by sending the
`ADMIN_PACKET_ADMIN_QUIT` packet.
`PacketAdminType::AdminQuit` packet.
## 7.0) Certain packet information
`ADMIN_PACKET_ADMIN_UPDATE_FREQUENCY` and `ADMIN_PACKET_ADMIN_POLL`
`PacketAdminType::AdminUpdateFrequency` and `PacketAdminType::AdminPoll`
Potential gotcha: the AdminUpdateType integer type used is a
uint16 for `UPDATE_FREQUENCY`, and a uint8 for `POLL`.
@@ -246,21 +246,21 @@ Last updated: 2024-03-26
It is safe to cast between the two when sending
(i.e cast from a uint8 to a uint16).
All `ADMIN_PACKET_SERVER_*` packets have an enum value greater 100.
All `PacketAdminType::Server*` packets have an enum value greater 100.
`ADMIN_PACKET_SERVER_WELCOME`
`PacketAdminType::ServerWelcome`
Either directly follows `ADMIN_PACKET_SERVER_PROTOCOL` or is sent
Either directly follows `PacketAdminType::ServerProtocol` or is sent
after a new game has been started or a map loaded, i.e. also
after ADMIN_PACKET_SERVER_NEWGAME.
after PacketAdminType::ServerNewGame.
`ADMIN_PACKET_SERVER_CLIENT_JOIN` and `ADMIN_PACKET_SERVER_COMPANY_NEW`
`PacketAdminType::ServerClientJoin` and `PacketAdminType::ServerCompanyNew`
These packets directly follow their respective INFO packets. If you receive
a CLIENT_JOIN / COMPANY_NEW packet without having received the INFO packet
it may be a good idea to POLL for the specific ID.
`ADMIN_PACKET_SERVER_CMD_NAMES` and `ADMIN_PACKET_SERVER_CMD_LOGGING`
`PacketAdminType::ServerCommandNames` and `PacketAdminType::ServerCommandLogging`
Data provided with these packets is not stable and will not be
treated as such. Do not rely on IDs or names to be constant
+11
View File
@@ -38,6 +38,17 @@ your operating system:
It includes the OpenTTD files (grf+lng) and it will work as long as they
are not touched
7. The Atari Transport Tycoon Deluxe directory, if installed (path may vary)
This refers to the `CD` folder within the Transport Tycoon Deluxe
installation folder (2026 Atari re-release). OpenTTD detects the presence
of this folder based upon the contents of the `installpath.ini` file located
in:
- Windows: `%APPDATA%\Atari\Transport Tycoon Deluxe`
- macOS: `~/Library/Application Support/Atari/Transport Tycoon Deluxe`
- Linux: `$XDG_DATA_HOME/Atari/Transport Tycoon Deluxe`
This is used only for the loading of base sets (graphics, sound, music).
Different types of data or extensions go into different subdirectories of the
chosen main OpenTTD directory:
+98 -94
View File
@@ -16,7 +16,7 @@
<a href="landscape_grid.html">Landscape grid</a> page.
</p>
<p>Nine attributes (counting &quot;<span style="font-weight: bold;">type</span>&quot; and
&quot;<span style="font-weight: bold;">height</span>&quot;) hold the information about a tile.<BR>
&quot;<span style="font-weight: bold;">height</span>&quot;) hold the information about a tile.<br>
These attributes are referred to as
&quot;<span style="font-weight: bold;">type</span>",
&quot;<span style="font-weight: bold;">height</span>",
@@ -50,6 +50,7 @@
<tr><td><tt>0A</tt></td><td>Objects</td></tr>
</table>
</li>
<li>
Bits 3..2:
<table border="1" style="width: 30em;">
<tr bgcolor="#CCCCCC"><td colspan="2">Presence and direction of bridge above.</td></tr>
@@ -57,6 +58,7 @@
<tr><td><tt>01</tt></td><td>Axis X (North-East)</td></tr>
<tr><td><tt>02</tt></td><td>Axis Y (South-West)</td></tr>
</table>
</li>
<li>
<a name="tropic_zone"></a>
Bits 1..0:
@@ -69,13 +71,14 @@
In any other climate these 2 bits are theoretically free of use, however using them does not seem useful.
</li>
</ul>
</li>
<li><span style="font-weight: bold;">m1</span>
<ul>
<li>
<a name="WaterClass"></a>
Bits 6..5:
<table border="1" style="width: 30em;">
<tr bgcolor="#CCCCCC"><td colspan="2">The type of water that is on a tile.
<tr bgcolor="#CCCCCC"><td colspan="2">The type of water that is on a tile.</td></tr>
<tr><td style="width: 5em;"><tt>00</tt></td><td align=left>Sea</td></tr>
<tr><td><tt>01</tt></td><td align=left>Canal</td></tr>
<tr><td><tt>02</tt></td><td align=left>River</td></tr>
@@ -87,7 +90,7 @@
<a name="OwnershipInfo"></a>
Bits 4..0:
<table border="1" style="width: 30em;">
<tr bgcolor="#CCCCCC"><td colspan="2">The owner of a tile can be either companies (human or AI) or "Game entities".
<tr bgcolor="#CCCCCC"><td colspan="2">The owner of a tile can be either companies (human or AI) or "Game entities".</td></tr>
<tr><td style="width: 5em;"><tt>00..0E</tt></td><td align=left>Normal companies</td></tr>
<tr><td><tt>0F</tt></td><td align=left>a town owns the tile</td></tr>
<tr><td><tt>10</tt></td><td align=left>nobody owns the tile</td></tr>
@@ -152,8 +155,8 @@
<li>m4 bits 7..5: type of hedge on the SW border of the tile (1 through 6, or 0=none)</li>
<li>m4 bits 4..2: same as 7..5, but for the SE border</li>
<li>m5 bits 7..5: update counter, incremented on every periodic processing for tile types,
other than <tt>03</tt>, <tt>07</tt>, <tt>0B</tt>, <tt>10</tt> and above.<BR>
on wraparound, the tile is updated (for fields, the type of fields in m3 is increased, for other types the tile type in m5 is increased).<BR>
other than <tt>03</tt>, <tt>07</tt>, <tt>0B</tt>, <tt>10</tt> and above.<br>
on wraparound, the tile is updated (for fields, the type of fields in m3 is increased, for other types the tile type in m5 is increased).<br>
For snow and desert, these bits are not used, tile is updated on every periodic processing.</li>
<li>m5 bits 4..2: tile type:
<table>
@@ -390,7 +393,7 @@
</tr>
</table>
</li>
<li>m5 bit 6 set = with signals:<BR>
<li>m5 bit 6 set = with signals:<br>
There are at most 4 signals on a tile. The signals 0..3 belong to the directions:
<table>
<tr>
@@ -562,7 +565,7 @@
<td>
<ul>
<li>m2: Index into the array of towns (owning town for town roads; closest town otherwise, INVALID_TOWN if there is no town or we are creating a town)</li>
<li>m3 bits 7..4: <a href="#OwnershipInfo">owner</a> of road type 1 (tram); OWNER_NONE (<tt>10</tt>) is stored as OWNER_TOWN (<tt>0F</tt>)
<li>m3 bits 7..4: <a href="#OwnershipInfo">owner</a> of road type 1 (tram); OWNER_NONE (<tt>10</tt>) is stored as OWNER_TOWN (<tt>0F</tt>)</li>
<li>m4 bits 5..0: <a href="#RoadType">Roadtype</a></li>
<li>m7 bit 5 set = on snow or desert</li>
<li>m8 bits 11..6: <a href="#TramType">Tramtype</a></li>
@@ -721,6 +724,7 @@
</ul>
</li>
</ul>
</li>
<li>m3 bit 6 : free</li>
<li>m3 bit 5 : The house is protected from the town upgrading it</li>
<li>m3 bits 4..0 : triggers activated <a href="#newhouses">(newhouses)</a></li>
@@ -1050,97 +1054,96 @@
<td>
<ul>
<li>m1 bit 7: Ship docking tile status</li>
<li>m1 bits 6..5 : Water class (sea, canal or river)
<li>m1 bits 6..5 : Water class (sea, canal or river)</li>
<li>m1 bits 4..0: <a href="#OwnershipInfo">owner</a> (for sea, rivers, and coasts normally <tt>11</tt>)</li>
<li>m2: Depot index (for depots only)</li>
<li>m3 bit 0: Non-flooding state</li>
<li>m4: Random data for canal or river tiles</li>
<li>m5 bits 7..4: Water tile type:
<table>
<tr>
<td><tt>0</tt>&nbsp; </td>
<td>water, canal or river</td>
</tr>
<tr>
<td><tt>1</tt>&nbsp; </td>
<td>coast or riverbank</td>
</tr>
<tr>
<td nowrap valign=top><tt>2</tt>&nbsp; </td>
<td>canal lock<br>
<ul>
<li>m5 bits 3..2: Lock part
<table>
<tr>
<td><tt>0</tt>&nbsp; </td>
<td>Middle part</td>
</tr>
<tr>
<td><tt>1</tt>&nbsp; </td>
<td>Lower part</td>
</tr>
<tr>
<td><tt>2</tt>&nbsp; </td>
<td>Upper part</td>
</tr>
</table>
</li>
<li>m5 bits 1..0: Lock direction
<table>
<tr>
<td><tt>0</tt>&nbsp; </td>
<td>NE raised</td>
</tr>
<tr>
<td><tt>1</tt>&nbsp; </td>
<td>SE raised</td>
</tr>
<tr>
<td><tt>2</tt>&nbsp; </td>
<td>SW raised</td>
</tr>
<tr>
<td><tt>3</tt>&nbsp; </td>
<td>NW raised</td>
</tr>
</table>
</li>
</ul>
</td>
</tr>
<tr>
<td nowrap valign=top><tt>3</tt>&nbsp; </td>
<td>depot<br>
<ul>
<li>m5 bit 1: Depot axis
<table>
<tr>
<td><tt>0</tt>&nbsp; </td>
<td>X direction (NE-SW)</td>
</tr>
<tr>
<td><tt>1</tt>&nbsp; </td>
<td>Y direction (NW-SE)</td>
</tr>
</table>
</li>
<li>m5 bit 0: Depot part
<table>
<tr>
<td><tt>0</tt>&nbsp; </td>
<td>North part</td>
</tr>
<tr>
<td><tt>1</tt>&nbsp; </td>
<td>South part</td>
</tr>
</table>
</li>
</ul>
</td>
</tr>
</table>
</li>
<tr>
<td><tt>0</tt>&nbsp; </td>
<td>water, canal or river</td>
</tr>
<tr>
<td><tt>1</tt>&nbsp; </td>
<td>coast or riverbank</td>
</tr>
<tr>
<td nowrap valign=top><tt>2</tt>&nbsp; </td>
<td>canal lock<br>
<ul>
<li>m5 bits 3..2: Lock part
<table>
<tr>
<td><tt>0</tt>&nbsp; </td>
<td>Middle part</td>
</tr>
<tr>
<td><tt>1</tt>&nbsp; </td>
<td>Lower part</td>
</tr>
<tr>
<td><tt>2</tt>&nbsp; </td>
<td>Upper part</td>
</tr>
</table>
</li>
<li>m5 bits 1..0: Lock direction
<table>
<tr>
<td><tt>0</tt>&nbsp; </td>
<td>NE raised</td>
</tr>
<tr>
<td><tt>1</tt>&nbsp; </td>
<td>SE raised</td>
</tr>
<tr>
<td><tt>2</tt>&nbsp; </td>
<td>SW raised</td>
</tr>
<tr>
<td><tt>3</tt>&nbsp; </td>
<td>NW raised</td>
</tr>
</table>
</li>
</ul>
</td>
</tr>
<tr>
<td nowrap valign=top><tt>3</tt>&nbsp; </td>
<td>depot<br>
<ul>
<li>m5 bit 1: Depot axis
<table>
<tr>
<td><tt>0</tt>&nbsp; </td>
<td>X direction (NE-SW)</td>
</tr>
<tr>
<td><tt>1</tt>&nbsp; </td>
<td>Y direction (NW-SE)</td>
</tr>
</table>
</li>
<li>m5 bit 0: Depot part
<table>
<tr>
<td><tt>0</tt>&nbsp; </td>
<td>North part</td>
</tr>
<tr>
<td><tt>1</tt>&nbsp; </td>
<td>South part</td>
</tr>
</table>
</li>
</ul>
</td>
</tr>
</table>
</li>
</ul>
</td>
@@ -1167,7 +1170,7 @@
<ul>
<li>m1 bit 7: clear = under construction
<ul>
<li>m1 bits 6..5 : Water class (sea, canal, river or land)
<li>m1 bits 6..5 : Water class (sea, canal, river or land)</li>
<li>m1 bits 3..2: construction counter, for buildings under construction incremented on every periodic tile processing</li>
<li>m1 bits 1..0: stage of construction (<tt>3</tt> = completed), incremented when the construction counter wraps around<br>
the meaning is different for some animated tiles which are never under construction (types <tt>01</tt>, <tt>1E</tt>..<tt>20</tt>, <tt>30</tt>, <tt>58</tt>; see above)</li>
@@ -1323,7 +1326,8 @@
<td nowrap valign=top><tt>58</tt>&nbsp; </td>
<td align=left>wheel tower when animated; animation state in m7 bits 5..0; m7 bit 6 set = sound already generated</td>
</tr>
</table></td>
</table>
</td>
</tr>
<tr>
+3 -3
View File
@@ -92,7 +92,7 @@ the array so you can quickly see what is used and what is not.
<tr>
<td class="caption">farmland</td>
<td class="bits"><span class="pool" title="Industry index on pool">XXXX XXXX XXXX XXXX</span></td>
<td class="bits"><span class="used" title="Type of hedge on NE border">XXX</span> <span class="used" title="Field production stage">XXXXX</span></td>
<td class="bits"><span class="used" title="Type of hedge on NE border">XXX</span> <span class="used" title="Snow presence">X</span><span class="used" title="Field production stage">XXXX</span></td>
</tr>
<tr>
<td rowspan=3>1</td>
@@ -165,14 +165,14 @@ the array so you can quickly see what is used and what is not.
</tr>
<tr>
<td class="caption">house under construction</td>
<td class="bits"><span class="used" title="House is complete/in construction (see m5)">O</span><span class="used" title="House type (m4 + m3[6])">X</span><span class="used" title="The house is protected from the town upgrading it.">X</span><span class="usable" title="Activated triggers (bits 2..4 don't have a meaning)">X XX</span><span class="used" title="Activated triggers (bits 2..4 don't have a meaning)">XX</span></td>
<td class="bits"><span class="used" title="House is complete/in construction (see m5)">O</span><span class="free">O</span><span class="used" title="The house is protected from the town upgrading it.">X</span><span class="usable" title="Activated triggers (bits 2..4 don't have a meaning)">X XX</span><span class="used" title="Activated triggers (bits 2..4 don't have a meaning)">XX</span></td>
<td class="bits"><span class="free">OOO</span><span class="used" title="Construction stage">X X</span><span class="used" title="Construction counter">XXX</span></td>
</tr>
<tr>
<td>4</td>
<td class="caption">trees</td>
<td class="bits"><span class="free">O</span><span class="used" title="Water class">XX</span><span class="usable" title="Owner (always OWNER_NONE)">1 OOOO</span></td>
<td class="bits"><span class="free">OOOO OOO</span><span class="used" title="Tree ground">XXX</span> <span class="used" title="Tree density">XX</span> <span class="used" title="Tree counter">XXXX</span></td>
<td class="bits"><span class="free">OOOO OOO</span><span class="used" title="Tree ground">XXX</span> <span class="used" title="Tree density">XX</span> <span class="free">OOOO</span></td>
<td class="bits"><span class="usable" title="Tree type unused bits">XX</span><span class="used" title="Tree type">XX XXXX</span></td>
<td class="bits"><span class="free">OOOO OOOO</span></td>
<td class="bits"><span class="used" title="Number of trees on tile (+1)">XX</span><span class="free">OO O</span><span class="used" title="Tree growth">XXX</span></td>
+16 -16
View File
@@ -69,19 +69,19 @@ An example of a valid tag is `PLYR` when looking at it via ASCII, which contains
`[4..4]` - Next follows a byte where the lower 4 bits contain the type.
The possible valid types are:
- `0` - `CH_RIFF` - This chunk is a binary blob.
- `1` - `CH_ARRAY` - This chunk is a list of items.
- `2` - `CH_SPARSE_ARRAY` - This chunk is a list of items.
- `3` - `CH_TABLE` - This chunk is self-describing list of items.
- `4` - `CH_SPARSE_TABLE` - This chunk is self-describing list of items.
- `0` - `ChunkType::Riff` - This chunk is a binary blob.
- `1` - `ChunkType::Array` - This chunk is a list of items.
- `2` - `ChunkType::SparseArray` - This chunk is a list of items.
- `3` - `ChunkType::Table` - This chunk is self-describing list of items.
- `4` - `ChunkType::SparseTable` - This chunk is self-describing list of items.
Now per type the format is (slightly) different.
### CH_RIFF
### ChunkType::Riff
(since savegame version 295, this chunk type is only used for MAP-chunks, containing bit-information about each tile on the map)
A `CH_RIFF` starts with an `uint24` which together with the upper-bits of the type defines the length of the chunk.
A `ChunkType::Riff` starts with an `uint24` which together with the upper-bits of the type defines the length of the chunk.
In pseudo-code:
```
@@ -94,11 +94,11 @@ if type == 0
The next `length` bytes are part of the chunk.
What those bytes mean depends on the tag of the chunk; further details per chunk can be found in the source-code.
### CH_ARRAY / CH_SPARSE_ARRAY
### ChunkType::Array / ChunkType::SparseArray
(this chunk type is deprecated since savegame version 295 and is no longer in use)
`[0..G1]` - A `CH_ARRAY` / `CH_SPARSE_ARRAY` starts with a `gamma`, indicating the size of the next item plus one.
`[0..G1]` - A `ChunkType::Array` / `ChunkType::SparseArray` starts with a `gamma`, indicating the size of the next item plus one.
If this size value is zero, it indicates the end of the list.
This indicates the full length of the next item minus one.
In psuedo-code:
@@ -111,21 +111,21 @@ loop
read <size> bytes
```
`[]` - For `CH_ARRAY` there is an implicit index.
`[]` - For `ChunkType::Array` there is an implicit index.
The loop starts at zero, and every iteration adds one to the index.
For entries in the game that were not allocated, the `size` will be zero.
`[G1+1..G2]` - For `CH_SPARSE_ARRAY` there is an explicit index.
`[G1+1..G2]` - For `ChunkType::SparseArray` there is an explicit index.
The `gamma` following the size indicates the index.
The content of the item is a binary blob, and similar to `CH_RIFF`, it depends on the tag of the chunk what it means.
The content of the item is a binary blob, and similar to `ChunkType::Riff`, it depends on the tag of the chunk what it means.
Please check the source-code for further details.
### CH_TABLE / CH_SPARSE_TABLE
### ChunkType::Table / ChunkType::SparseTable
(this chunk type only exists since savegame version 295)
Both `CH_TABLE` and `CH_SPARSE_TABLE` are very similar to `CH_ARRAY` / `CH_SPARSE_ARRAY` respectively.
Both `ChunkType::Table` and `ChunkType::SparseTable` are very similar to `ChunkType::Array` / `ChunkType::SparseArray` respectively.
The only change is that the chunk starts with a header.
This header describes the chunk in details; with the header you know the meaning of each byte in the binary blob that follows.
@@ -168,7 +168,7 @@ struct | substruct3
The headers will be, in order: `table`, `substruct1`, `substruct3`, `substruct2`, each ending with a `type` is zero field.
After reading all the fields of all the headers, there is a list of records.
To read this, see `CH_ARRAY` / `CH_SPARSE_ARRAY` for details.
To read this, see `ChunkType::Array` / `ChunkType::SparseArray` for details.
As each `type` has a well defined length, you can read the records even without knowing anything about the chunk-tag yourself.
@@ -187,7 +187,7 @@ The prefix is strongly advised to avoid conflicts with future-settings in an unp
## Scripts custom data format
Script chunks (`AIPL` and `GSDT`) use `CH_TABLE` chunk type.
Script chunks (`AIPL` and `GSDT`) use `ChunkType::Table` chunk type.
At the end of each record there's an `uint8` to indicate if there's custom data (1) or not (0).
+1 -4
View File
@@ -1,11 +1,8 @@
# If you change this version, change the numbers in .github/workflows/ci-emscripten.yml (2x)
# and .github/workflows/preview-build.yml (2x) too.
FROM emscripten/emsdk:3.1.57
FROM emscripten/emsdk:6.0.1
RUN apt-get update \
&& apt-get install -y gcc-12 g++-12 \
&& update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-12 100 \
&& update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-12 100 \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/*
@@ -63,6 +63,6 @@
<Resource Language="cy-gb" />
</Resources>
<Dependencies>
<TargetDeviceFamily Name="Windows.Desktop" MinVersion="10.0.17134.0" MaxVersionTested="10.0.18363.0" />
<TargetDeviceFamily Name="Windows.Desktop" MinVersion="10.0.17701.0" MaxVersionTested="10.0.18363.0" />
</Dependencies>
</Package>
@@ -7,7 +7,7 @@
<Logo>Assets\StoreLogo.png</Logo>
</Properties>
<Dependencies>
<TargetDeviceFamily Name="Windows.Desktop" MinVersion="10.0.17134.0" MaxVersionTested="10.0.18363.0" />
<TargetDeviceFamily Name="Windows.Desktop" MinVersion="10.0.17701.0" MaxVersionTested="10.0.18363.0" />
</Dependencies>
<Resources>
<Resource Language="en-gb" />
+2
View File
@@ -22,3 +22,5 @@
add_subdirectory(regression)
add_subdirectory(stationlist)
add_subdirectory(gs)
add_subdirectory(gs_compat)
+8
View File
@@ -0,0 +1,8 @@
include(CreateRegression)
create_regression("game"
${CMAKE_CURRENT_SOURCE_DIR}/info.nut
${CMAKE_CURRENT_SOURCE_DIR}/main.nut
${CMAKE_CURRENT_SOURCE_DIR}/require.nut
${CMAKE_CURRENT_SOURCE_DIR}/result.txt
${CMAKE_CURRENT_SOURCE_DIR}/test.sav
)
+14
View File
@@ -0,0 +1,14 @@
class Regression extends GSInfo {
function GetAuthor() { return "OpenTTD GS Developers Team"; }
function GetName() { return "Regression"; }
function GetShortName() { return "REGR"; }
function GetDescription() { return "This runs regression-tests on some commands. On the same map the result should always be the same."; }
function GetVersion() { return 1; }
function GetAPIVersion() { return "16"; }
function GetDate() { return "2026-05-19"; }
function CreateInstance() { return "Regression"; }
function UseAsRandomAI() { return false; }
}
RegisterGS(Regression());
+83
View File
@@ -0,0 +1,83 @@
class Regression extends GSController {
function Start();
};
function Regression::TestInit()
{
print("");
print("--TestInit--");
print(" Ops: " + this.GetOpsTillSuspend());
print(" TickTest: " + this.GetTick());
this.Sleep(1);
print(" TickTest: " + this.GetTick());
print(" Ops: " + this.GetOpsTillSuspend());
print(" SetCommandDelay: " + GSController.SetCommandDelay(1));
print(" IsValid(vehicle.plane_speed): " + GSGameSettings.IsValid("vehicle.plane_speed"));
print(" vehicle.plane_speed: " + GSGameSettings.GetValue("vehicle.plane_speed"));
require("require.nut");
print(" TestEnum.value1: " + ::TestEnum.value1);
print(" test_constant: " + ::test_constant);
print(" TestEnum.value2: " + TestEnum.value2);
print(" test_constant: " + test_constant);
print(" min(6, 3): " + min(6, 3));
print(" min(3, 6): " + min(3, 6));
print(" max(6, 3): " + max(6, 3));
print(" max(3, 6): " + max(3, 6));
}
function Regression::Company()
{
print("");
print("--Company--");
/* Test GSXXXMode() in scopes */
{
local test = GSTestMode();
print(" SetName(): " + GSCompany.SetName("Regression"));
print(" SetName(): " + GSCompany.SetName("Regression"));
{
local exec = GSExecMode();
print(" SetName(): " + GSCompany.SetName("Regression"));
print(" SetName(): " + GSCompany.SetName("Regression"));
print(" GetLastErrorString(): " + GSError.GetLastErrorString());
}
}
print(" GetName(): " + GSCompany.GetName(GSCompany.COMPANY_SELF));
print(" GetPresidentName(): " + GSCompany.GetPresidentName(GSCompany.COMPANY_SELF));
print(" SetPresidentName(): " + GSCompany.SetPresidentName("Regression GS"));
print(" GetPresidentName(): " + GSCompany.GetPresidentName(GSCompany.COMPANY_SELF));
print("");
print("--CompanyMode--");
local company = GSCompanyMode(GSCompany.COMPANY_FIRST);
{
local test = GSTestMode();
print(" SetName(): " + GSCompany.SetName("Regression"));
print(" SetName(): " + GSCompany.SetName("Regression"));
{
local exec = GSExecMode();
print(" SetName(): " + GSCompany.SetName("Regression"));
print(" SetName(): " + GSCompany.SetName("Regression"));
print(" GetLastErrorString(): " + GSError.GetLastErrorString());
}
}
print(" GetName(): " + GSCompany.GetName(GSCompany.COMPANY_SELF));
print(" GetPresidentName(): " + GSCompany.GetPresidentName(GSCompany.COMPANY_SELF));
print(" SetPresidentName(): " + GSCompany.SetPresidentName("Regression GS"));
print(" GetPresidentName(): " + GSCompany.GetPresidentName(GSCompany.COMPANY_SELF));
}
function Regression::Start()
{
this.TestInit();
this.Company();
print("");
print("Done...");
print("");
}
+9
View File
@@ -0,0 +1,9 @@
print(" Required this file");
const test_constant = 1;
enum TestEnum {
value0,
value1,
value2
};
+44
View File
@@ -0,0 +1,44 @@
--TestInit--
Ops: 9988
TickTest: 1
TickTest: 2
Ops: 9990
SetCommandDelay: (null : 0x00000000)
IsValid(vehicle.plane_speed): true
vehicle.plane_speed: 4
Required this file
TestEnum.value1: 1
test_constant: 1
TestEnum.value2: 2
test_constant: 1
min(6, 3): 3
min(3, 6): 3
max(6, 3): 6
max(3, 6): 6
--Company--
SetName(): false
SetName(): false
SetName(): false
SetName(): false
GetLastErrorString(): ERR_PRECONDITION_INVALID_COMPANY
GetName(): (null : 0x00000000)
GetPresidentName(): (null : 0x00000000)
SetPresidentName(): false
GetPresidentName(): (null : 0x00000000)
--CompanyMode--
SetName(): true
SetName(): true
SetName(): true
SetName(): false
GetLastErrorString(): ERR_NAME_IS_NOT_UNIQUE
GetName(): Regression
GetPresidentName(): S. G. Bloggs
SetPresidentName(): true
GetPresidentName(): Regression GS
Done...
ERROR: The script died unexpectedly.
Binary file not shown.
+7
View File
@@ -0,0 +1,7 @@
include(CreateRegression)
create_regression("game"
${CMAKE_CURRENT_SOURCE_DIR}/info.nut
${CMAKE_CURRENT_SOURCE_DIR}/main.nut
${CMAKE_CURRENT_SOURCE_DIR}/result.txt
${CMAKE_CURRENT_SOURCE_DIR}/test.sav
)
+13
View File
@@ -0,0 +1,13 @@
class CompatRegression extends GSInfo {
function GetAuthor() { return "OpenTTD GS Developers Team"; }
function GetName() { return "Compat Regression"; }
function GetShortName() { return "REGC"; }
function GetDescription() { return "This runs regression on the compat scripts."; }
function GetVersion() { return 1; }
function GetAPIVersion() { return "1.2"; }
function GetDate() { return "2026-05-19"; }
function CreateInstance() { return "CompatRegression"; }
function UseAsRandomAI() { return false; }
}
RegisterGS(CompatRegression());
+6
View File
@@ -0,0 +1,6 @@
class CompatRegression extends GSController {
function Start()
{
print("Done...");
}
};
+2
View File
@@ -0,0 +1,2 @@
Done...
ERROR: The script died unexpectedly.
Binary file not shown.
+1 -1
View File
@@ -1,5 +1,5 @@
include(CreateRegression)
create_regression(
create_regression("ai"
${CMAKE_CURRENT_SOURCE_DIR}/info.nut
${CMAKE_CURRENT_SOURCE_DIR}/main.nut
${CMAKE_CURRENT_SOURCE_DIR}/require.nut
+1 -1
View File
@@ -4,7 +4,7 @@ class Regression extends AIInfo {
function GetShortName() { return "REGR"; }
function GetDescription() { return "This runs regression-tests on some commands. On the same map the result should always be the same."; }
function GetVersion() { return 1; }
function GetAPIVersion() { return "15"; }
function GetAPIVersion() { return "16"; }
function GetDate() { return "2007-03-18"; }
function CreateInstance() { return "Regression"; }
function UseAsRandomAI() { return false; }
+296 -6
View File
@@ -842,6 +842,7 @@ function Regression::List()
}
list[4000] = 50;
list[4006] = 12;
list[4012] = true;
print(" foreach():");
foreach (idx, val in list) {
@@ -849,6 +850,7 @@ function Regression::List()
}
print(" []:");
print(" 4000 => " + list[4000]);
print(" 4012 => " + list[4012]);
print(" clone:");
local list3 = clone list;
@@ -865,25 +867,25 @@ function Regression::List()
}
local it = list.Begin();
print(" " + it + " => " + list.GetValue(it) + " (" + !list.IsEnd() + ")");
print(" " + it + " => " + list.GetValue(it) + " (" + list.IsEnd() + ")");
list.Sort(list.SORT_BY_VALUE, list.SORT_ASCENDING);
it = list.Next();
print(" " + it + " => " + list.GetValue(it) + " (" + !list.IsEnd() + ")");
print(" " + it + " => " + list.GetValue(it) + " (" + list.IsEnd() + ")");
it = list.Begin();
print(" " + it + " => " + list.GetValue(it) + " (" + !list.IsEnd() + ")");
print(" " + it + " => " + list.GetValue(it) + " (" + list.IsEnd() + ")");
list.SetValue(it + 1, -5);
it = list.Next();
print(" " + it + " => " + list.GetValue(it) + " (" + !list.IsEnd() + ")");
print(" " + it + " => " + list.GetValue(it) + " (" + list.IsEnd() + ")");
list.RemoveValue(list.GetValue(it) + 1);
it = list.Next();
print(" " + it + " => " + list.GetValue(it) + " (" + !list.IsEnd() + ")");
print(" " + it + " => " + list.GetValue(it) + " (" + list.IsEnd() + ")");
list.RemoveAboveValue(list.GetValue(it));
it = list.Next();
print(" " + it + " => " + list.GetValue(it) + " (" + !list.IsEnd() + ")");
print(" " + it + " => " + list.GetValue(it) + " (" + list.IsEnd() + ")");
while (!list.IsEnd()) {
it = list.Next();
@@ -895,6 +897,232 @@ function Regression::List()
print(" " + idx + " => " + val);
}
list.RemoveItem(0);
local list4 = clone list;
foreach (sorter_type in [ AIList.SORT_BY_VALUE, AIList.SORT_BY_ITEM ]) {
foreach (sorter_direction in [ AIList.SORT_DESCENDING, AIList.SORT_ASCENDING ]) {
local type = sorter_type == AIList.SORT_BY_VALUE ? "Value" : "Item";
local direction = sorter_direction == AIList.SORT_DESCENDING ? "Descending" : "Ascending";
local sorter = " (" + type + " " + direction + ")";
list = clone list4;
list.Sort(sorter_type, sorter_direction);
print("");
print(" ListDump:" + sorter);
foreach (idx, val in list) {
print(" " + idx + " => " + val);
}
it = list.Begin();
print(" Begin(): " + it + " => " + list.GetValue(it) + " (" + list.IsEnd() + ")");
it = list.Next();
print(" Next(): " + it + " => " + list.GetValue(it) + " (" + list.IsEnd() + ")");
it = list.Next();
print(" Next(): " + it + " => " + list.GetValue(it) + " (" + list.IsEnd() + ")");
it = list.Next();
print(" Next(): " + it + " => " + list.GetValue(it) + " (" + list.IsEnd() + ")");
it = list.Next();
print(" Next(): " + it + " => " + list.GetValue(it) + " (" + list.IsEnd() + ")");
print(" foreach (idx, val in list) {print}:" + sorter);
foreach (idx, val in list) {
print(" " + idx + " => " + val + " (" + list.IsEnd() + ")");
}
print(" Post loop: (" + list.IsEnd() + ")");
it = list.Next();
print(" Post loop Next: " + it + " => " + list.GetValue(it) + " (" + list.IsEnd() + ")");
it = list.Next();
print(" Post loop Next: " + it + " => " + list.GetValue(it) + " (" + list.IsEnd() + ")");
print(" for (Begin / !IsEnd / Next) {print}:" + sorter);
for (it = list.Begin(); !list.IsEnd(); it = list.Next()) {
print(" " + it + " => " + list.GetValue(it) + " (" + list.IsEnd() + ")");
}
print(" Post loop: " + it + " => " + list.GetValue(it) + " (" + list.IsEnd() + ")");
it = list.Next();
print(" Post loop Next: " + it + " => " + list.GetValue(it) + " (" + list.IsEnd() + ")");
it = list.Next();
print(" Post loop Next: " + it + " => " + list.GetValue(it) + " (" + list.IsEnd() + ")");
print(" Begin / while (!IsEnd) {print / Next}:" + sorter);
it = list.Begin();
while (!list.IsEnd()) {
print(" " + it + " => " + list.GetValue(it) + " (" + list.IsEnd() + ")");
it = list.Next();
}
print(" Post loop: " + it + " => " + list.GetValue(it) + " (" + list.IsEnd() + ")");
it = list.Next();
print(" Post loop Next: " + it + " => " + list.GetValue(it) + " (" + list.IsEnd() + ")");
it = list.Next();
print(" Post loop Next: " + it + " => " + list.GetValue(it) + " (" + list.IsEnd() + ")");
print(" Begin / do {{print / Next} while (!IsEnd)}:" + sorter);
it = list.Begin();
do {
print(" " + it + " => " + list.GetValue(it) + " (" + list.IsEnd() + ")");
it = list.Next();
} while (!list.IsEnd());
print(" Post loop: " + it + " => " + list.GetValue(it) + " (" + list.IsEnd() + ")");
it = list.Next();
print(" Post loop Next: " + it + " => " + list.GetValue(it) + " (" + list.IsEnd() + ")");
it = list.Next();
print(" Post loop Next: " + it + " => " + list.GetValue(it) + " (" + list.IsEnd() + ")");
print(" GetValue / SetValue:" + sorter);
for (it = list.Begin(); !list.IsEnd(); it = list.Next()) {
local old_val = list.GetValue(it);
local old_isend = list.IsEnd();
local res = list.SetValue(it, old_val);
local val = list.GetValue(it);
local isend = list.IsEnd();
local new_val_to_set = old_val * 1111;
local new_res = list.SetValue(it, new_val_to_set);
local new_val = list.GetValue(it);
local new_isend = list.IsEnd();
print(" " + it + " => " + old_val + " (" + old_isend + ")");
print(" => SetValue(" + it + ", " + old_val + ") ? " + res + " => " + val + " (" + isend + ")");
print(" => SetValue(" + it + ", " + new_val_to_set + ") ? " + new_res + " => " + new_val + " (" + new_isend + ")");
}
print(" Post loop: " + it + " => " + list.GetValue(it) + " (" + list.IsEnd() + ")");
it = list.Next();
print(" Post loop Next: " + it + " => " + list.GetValue(it) + " (" + list.IsEnd() + ")");
it = list.Next();
print(" Post loop Next: " + it + " => " + list.GetValue(it) + " (" + list.IsEnd() + ")");
list.Clear();
list.AddList(list4);
print(" GetValue / AddItem:" + sorter);
for (it = list.Begin(); !list.IsEnd(); it = list.Next()) {
local old_val = list.GetValue(it);
local old_isend = list.IsEnd();
list.AddItem(it, old_val);
local val = list.GetValue(it);
local isend = list.IsEnd();
local new_val_to_set = old_val * 1111;
list.AddItem(it, new_val_to_set);
local new_val = list.GetValue(it);
local new_isend = list.IsEnd();
print(" " + it + " => " + old_val + " (" + old_isend + ")");
print(" => AddItem(" + it + ", " + old_val + ") => " + val + " (" + isend + ")");
print(" => AddItem(" + it + ", " + new_val_to_set + ") => " + new_val + " (" + new_isend + ")");
}
print(" Post loop: " + it + " => " + list.GetValue(it) + " (" + list.IsEnd() + ")");
it = list.Next();
print(" Post loop Next: " + it + " => " + list.GetValue(it) + " (" + list.IsEnd() + ")");
it = list.Next();
print(" Post loop Next: " + it + " => " + list.GetValue(it) + " (" + list.IsEnd() + ")");
list.Clear();
list.AddList(list4);
print(" RemoveItem / HasItem / AddItem:" + sorter);
for (it = list.Begin(); !list.IsEnd(); it = list.Next()) {
local val = list.GetValue(it);
print(" " + it + " => " + val + " / " + list.HasItem(it) + " (" + list.IsEnd() + ")");
list.RemoveItem(it);
print(" => RemoveItem(" + it + ") => " + list.GetValue(it) + " / " + list.HasItem(it) + " (" + list.IsEnd() + ")");
if (list.IsEnd()) {
list.AddItem(it, val);
print(" => AddItem(" + it + ", " + val + ") => " + list.GetValue(it) + " / " + list.HasItem(it) + " (" + list.IsEnd() + ")");
}
}
print(" Post loop: " + it + " => " + list.GetValue(it) + " (" + list.IsEnd() + ")");
it = list.Next();
print(" Post loop Next: " + it + " => " + list.GetValue(it) + " (" + list.IsEnd() + ")");
it = list.Next();
print(" Post loop Next: " + it + " => " + list.GetValue(it) + " (" + list.IsEnd() + ")");
}
}
list.Clear(),
list.AddList(list4);
local list1 = list;
local list2 = list3;
foreach (sorter_type_1 in [ AIList.SORT_BY_VALUE, AIList.SORT_BY_ITEM ]) {
foreach (sorter_direction_1 in [ AIList.SORT_DESCENDING, AIList.SORT_ASCENDING ]) {
local type_1 = sorter_type_1 == AIList.SORT_BY_VALUE ? "Value" : "Item";
local direction_1 = sorter_direction_1 == AIList.SORT_DESCENDING ? "Descending" : "Ascending";
local sorter_1 = " (" + type_1 + " " + direction_1 + ")";
foreach (sorter_type_2 in [ AIList.SORT_BY_VALUE, AIList.SORT_BY_ITEM ]) {
foreach (sorter_direction_2 in [ AIList.SORT_DESCENDING, AIList.SORT_ASCENDING ]) {
local type_2 = sorter_type_2 == AIList.SORT_BY_VALUE ? "Value" : "Item";
local direction_2 = sorter_direction_2 == AIList.SORT_DESCENDING ? "Descending" : "Ascending";
local sorter_2 = " (" + type_2 + " " + direction_2 + ")";
local sorter = sorter_1 + sorter_2;
list1.Clear(),
list1.AddList(list4);
list1.Sort(sorter_type_1, sorter_direction_1);
list2.Sort(sorter_type_2, sorter_direction_2);
print("");
print(" SwapList:" + sorter);
print(" DumpList 1:" + sorter_1);
foreach (idx, val in list1) {
print(" " + idx + " => " + val);
}
print(" DumpList 2:" + sorter_2);
foreach (idx, val in list2) {
print(" " + idx + " => " + val);
}
local it1 = list1.Begin();
print(" List 1 Begin: " + it1 + " => " + list1.GetValue(it1) + " (" + list1.IsEnd() + ")");
local it2 = list2.Begin();
print(" List 2 Begin: " + it2 + " => " + list2.GetValue(it2) + " (" + list2.IsEnd() + ")");
it2 = list2.Next();
print(" List 2 Next: " + it2 + " => " + list2.GetValue(it2) + " (" + list2.IsEnd() + ")");
print(" => Swap list 1 with list 2 " + list1.SwapList(list2));
it1 = list1.Next();
print(" List 1 Next: " + it1 + " => " + list1.GetValue(it1) + " (" + list1.IsEnd() + ")");
it2 = list2.Next();
print(" List 2 Next: " + it2 + " => " + list2.GetValue(it2) + " (" + list2.IsEnd() + ")");
it2 = list2.Next();
print(" List 2 Next: " + it2 + " => " + list2.GetValue(it2) + " (" + list2.IsEnd() + ")");
print(" => Swap list 1 with list 2 " + list1.SwapList(list2));
it1 = list1.Next();
print(" List 1 Next: " + it1 + " => " + list1.GetValue(it1) + " (" + list1.IsEnd() + ")");
it2 = list2.Next();
print(" List 2 Next: " + it2 + " >= " + list2.GetValue(it2) + " (" + list2.IsEnd() + ")");
it2 = list2.Next();
print(" List 2 Next: " + it2 + " >= " + list2.GetValue(it2) + " (" + list2.IsEnd() + ")");
}
}
}
}
list.Clear();
print(" IsEmpty(): " + list.IsEmpty());
list2 = AIList();
for (local i = -10; i < 10; i++) {
list2.AddItem(i, -i * i / 2);
}
list.SwapList(list2);
print(" Negative ListDump:");
for (local i = list.Begin(); !list.IsEnd(); i = list.Next()) {
print(" " + i + " => " + list.GetValue(i));
}
print(" KeepBelowValue(-12):");
list.KeepBelowValue(-12);
for (local i = list.Begin(); !list.IsEnd(); i = list.Next()) {
print(" " + i + " => " + list.GetValue(i));
}
print(" KeepAboveValue(-40):");
list.KeepAboveValue(-40);
for (local i = list.Begin(); !list.IsEnd(); i = list.Next()) {
print(" " + i + " => " + list.GetValue(i));
}
print(" KeepValue(-24):");
list.KeepValue(-24);
for (local i = list.Begin(); !list.IsEnd(); i = list.Next()) {
print(" " + i + " => " + list.GetValue(i));
}
}
function Regression::Map()
@@ -2072,6 +2300,67 @@ function Regression::PriorityQueue()
print(" Count(): " + queue.Count());
}
function Regression::Terraforming()
{
print("");
print("--Terraforming--");
print(" DemolishTile(): " + AITile.DemolishTile(4033));
print(" DemolishTile(): " + AITile.DemolishTile(60766));
print(" GetBankBalance(): " + AICompany.GetBankBalance(AICompany.COMPANY_SELF));
print(" LowerTile(): " + AITile.LowerTile(8205, AITile.SLOPE_ENW));
print(" RaiseTile(): " + AITile.RaiseTile(8205, AITile.SLOPE_ENW));
print(" GetBankBalance(): " + AICompany.GetBankBalance(AICompany.COMPANY_SELF));
print(" LowerTile(): " + AITile.LowerTile(8205, AITile.SLOPE_ENW));
print(" GetBankBalance(): " + AICompany.GetBankBalance(AICompany.COMPANY_SELF));
print(" LowerTile(): " + AITile.LowerTile(4113, AITile.SLOPE_SW));
print(" RaiseTile(): " + AITile.RaiseTile(5902, AITile.SLOPE_NE));
print(" GetBankBalance(): " + AICompany.GetBankBalance(AICompany.COMPANY_SELF));
print(" RaiseTile(): " + AITile.RaiseTile(7958, AITile.SLOPE_SE));
print(" LowerTile(): " + AITile.LowerTile(7958, AITile.SLOPE_NE));
print(" LowerTile(): " + AITile.LowerTile(7958, AITile.SLOPE_SE));
print(" RaiseTile(): " + AITile.RaiseTile(7958, AITile.SLOPE_SE));
print(" LowerTile(): " + AITile.LowerTile(7958, AITile.SLOPE_EW));
print(" GetBankBalance(): " + AICompany.GetBankBalance(AICompany.COMPANY_SELF));
print(" LowerTile(): " + AITile.LowerTile(33924, AITile.SLOPE_ELEVATED));
print(" LowerTile(): " + AITile.LowerTile(33923, AITile.SLOPE_ELEVATED));
print(" RaiseTile(): " + AITile.RaiseTile(34193, AITile.SLOPE_ELEVATED));
print(" LowerTile(): " + AITile.LowerTile(34193, AITile.SLOPE_ELEVATED));
print(" LowerTile(): " + AITile.LowerTile(34192, AITile.SLOPE_NE));
print(" RaiseTile(): " + AITile.RaiseTile(34193, AITile.SLOPE_ELEVATED));
print(" LowerTile(): " + AITile.LowerTile(34192, AITile.SLOPE_NE));
print(" GetBankBalance(): " + AICompany.GetBankBalance(AICompany.COMPANY_SELF));
print(" RaiseTile(): " + AITile.RaiseTile(5687, AITile.SLOPE_N));
print(" LowerTile(): " + AITile.LowerTile(5687, AITile.SLOPE_SE));
print(" GetBankBalance(): " + AICompany.GetBankBalance(AICompany.COMPANY_SELF));
print(" RaiseTile(): " + AITile.RaiseTile(23596, AITile.SLOPE_NE));
print(" LowerTile(): " + AITile.LowerTile(23596, AITile.SLOPE_NE));
print(" GetBankBalance(): " + AICompany.GetBankBalance(AICompany.COMPANY_SELF));
print(" RaiseTile(): " + AITile.RaiseTile(28536, AITile.SLOPE_E));
print(" RaiseTile(): " + AITile.RaiseTile(28536, AITile.SLOPE_E));
print(" GetBankBalance(): " + AICompany.GetBankBalance(AICompany.COMPANY_SELF));
print(" LevelTiles(): " + AITile.LevelTiles(28536, 29053));
print(" LevelTiles(): " + AITile.LevelTiles(28536, 29053));
print(" GetBankBalance(): " + AICompany.GetBankBalance(AICompany.COMPANY_SELF));
print(" LevelTiles(): " + AITile.LevelTiles(22348, 24405));
print(" LevelTiles(): " + AITile.LevelTiles(27717, 29772));
print(" GetBankBalance(): " + AICompany.GetBankBalance(AICompany.COMPANY_SELF));
print(" LowerTile(): " + AITile.LowerTile(61534, AITile.SLOPE_W));
print(" RaiseTile(): " + AITile.RaiseTile(61534, AITile.SLOPE_NE));
print(" RaiseTile(): " + AITile.RaiseTile(61534, AITile.SLOPE_N));
print(" LowerTile(): " + AITile.LowerTile(61534, AITile.SLOPE_W));
print(" GetBankBalance(): " + AICompany.GetBankBalance(AICompany.COMPANY_SELF));
print(" RaiseTile(): " + AITile.RaiseTile(61534, AITile.SLOPE_N));
print(" LowerTile(): " + AITile.LowerTile(61533, AITile.SLOPE_E));
print(" LowerTile(): " + AITile.LowerTile(61534, AITile.SLOPE_E));
print(" GetBankBalance(): " + AICompany.GetBankBalance(AICompany.COMPANY_SELF));
print(" RaiseTile(): " + AITile.RaiseTile(4033, AITile.SLOPE_S));
print(" LowerTile(): " + AITile.LowerTile(4033, AITile.SLOPE_S));
print(" LowerTile(): " + AITile.LowerTile(4033, AITile.SLOPE_E));
print(" RaiseTile(): " + AITile.RaiseTile(4033, AITile.SLOPE_E));
print(" RaiseTile(): " + AITile.RaiseTile(4033, AITile.SLOPE_NWS));
print(" GetBankBalance(): " + AICompany.GetBankBalance(AICompany.COMPANY_SELF));
}
function Regression::Start()
{
this.TestInit();
@@ -2170,6 +2459,7 @@ function Regression::Start()
this.Math();
this.PriorityQueue();
this.Terraforming();
/* Check Valuate() is actually limited, MUST BE THE LAST TEST. */
print("--Valuate() with excessive CPU usage--")
+834 -16
View File
@@ -573,8 +573,10 @@
4001 => 8002
4002 => 8004
4006 => 12
4012 => 1
[]:
4000 => 50
4012 => 1
clone:
Clone ListDump:
1005 => 1005
@@ -582,21 +584,779 @@
4001 => 8002
4002 => 8004
4006 => 12
4012 => 1
IsEmpty(): true
0 => 5 (true)
0 => 5 (false)
ERROR: Next() is invalid as Begin() is never called
ERROR: IsEnd() is invalid as Begin() is never called
0 => 5 (false)
0 => 5 (true)
2 => 6 (true)
3 => 6 (true)
0 => 5 (false)
2 => 6 (false)
3 => 6 (false)
0 => 5 (true)
Clone ListDump:
1005 => 1005
4000 => 50
4001 => 8002
4002 => 8004
4006 => 12
4012 => 1
ListDump: (Value Descending)
3 => 6
2 => 6
1 => -5
Begin(): 3 => 6 (false)
Next(): 2 => 6 (false)
Next(): 1 => -5 (false)
Next(): 0 => 0 (true)
Next(): 0 => 0 (true)
foreach (idx, val in list) {print}: (Value Descending)
3 => 6 (false)
2 => 6 (false)
1 => -5 (false)
Post loop: (true)
Post loop Next: 0 => 0 (true)
Post loop Next: 0 => 0 (true)
for (Begin / !IsEnd / Next) {print}: (Value Descending)
3 => 6 (false)
2 => 6 (false)
1 => -5 (false)
Post loop: 0 => 0 (true)
Post loop Next: 0 => 0 (true)
Post loop Next: 0 => 0 (true)
Begin / while (!IsEnd) {print / Next}: (Value Descending)
3 => 6 (false)
2 => 6 (false)
1 => -5 (false)
Post loop: 0 => 0 (true)
Post loop Next: 0 => 0 (true)
Post loop Next: 0 => 0 (true)
Begin / do {{print / Next} while (!IsEnd)}: (Value Descending)
3 => 6 (false)
2 => 6 (false)
1 => -5 (false)
Post loop: 0 => 0 (true)
Post loop Next: 0 => 0 (true)
Post loop Next: 0 => 0 (true)
GetValue / SetValue: (Value Descending)
3 => 6 (false)
=> SetValue(3, 6) ? true => 6 (false)
=> SetValue(3, 6666) ? true => 6666 (false)
2 => 6 (false)
=> SetValue(2, 6) ? true => 6 (false)
=> SetValue(2, 6666) ? true => 6666 (false)
1 => -5 (false)
=> SetValue(1, -5) ? true => -5 (false)
=> SetValue(1, -5555) ? true => -5555 (false)
Post loop: 0 => 0 (true)
Post loop Next: 0 => 0 (true)
Post loop Next: 0 => 0 (true)
GetValue / AddItem: (Value Descending)
3 => 6 (false)
=> AddItem(3, 6) => 6 (false)
=> AddItem(3, 6666) => 6 (false)
2 => 6 (false)
=> AddItem(2, 6) => 6 (false)
=> AddItem(2, 6666) => 6 (false)
1 => -5 (false)
=> AddItem(1, -5) => -5 (false)
=> AddItem(1, -5555) => -5 (false)
Post loop: 0 => 0 (true)
Post loop Next: 0 => 0 (true)
Post loop Next: 0 => 0 (true)
RemoveItem / HasItem / AddItem: (Value Descending)
3 => 6 / true (false)
=> RemoveItem(3) => 0 / false (false)
2 => 6 / true (false)
=> RemoveItem(2) => 0 / false (false)
1 => -5 / true (false)
=> RemoveItem(1) => 0 / false (true)
=> AddItem(1, -5) => -5 / true (false)
Post loop: 0 => 0 (true)
Post loop Next: 0 => 0 (true)
Post loop Next: 0 => 0 (true)
ListDump: (Value Ascending)
1 => -5
2 => 6
3 => 6
Begin(): 1 => -5 (false)
Next(): 2 => 6 (false)
Next(): 3 => 6 (false)
Next(): 0 => 0 (true)
Next(): 0 => 0 (true)
foreach (idx, val in list) {print}: (Value Ascending)
1 => -5 (false)
2 => 6 (false)
3 => 6 (false)
Post loop: (true)
Post loop Next: 0 => 0 (true)
Post loop Next: 0 => 0 (true)
for (Begin / !IsEnd / Next) {print}: (Value Ascending)
1 => -5 (false)
2 => 6 (false)
3 => 6 (false)
Post loop: 0 => 0 (true)
Post loop Next: 0 => 0 (true)
Post loop Next: 0 => 0 (true)
Begin / while (!IsEnd) {print / Next}: (Value Ascending)
1 => -5 (false)
2 => 6 (false)
3 => 6 (false)
Post loop: 0 => 0 (true)
Post loop Next: 0 => 0 (true)
Post loop Next: 0 => 0 (true)
Begin / do {{print / Next} while (!IsEnd)}: (Value Ascending)
1 => -5 (false)
2 => 6 (false)
3 => 6 (false)
Post loop: 0 => 0 (true)
Post loop Next: 0 => 0 (true)
Post loop Next: 0 => 0 (true)
GetValue / SetValue: (Value Ascending)
1 => -5 (false)
=> SetValue(1, -5) ? true => -5 (false)
=> SetValue(1, -5555) ? true => -5555 (false)
2 => 6 (false)
=> SetValue(2, 6) ? true => 6 (false)
=> SetValue(2, 6666) ? true => 6666 (false)
3 => 6 (false)
=> SetValue(3, 6) ? true => 6 (false)
=> SetValue(3, 6666) ? true => 6666 (false)
2 => 6666 (false)
=> SetValue(2, 6666) ? true => 6666 (false)
=> SetValue(2, 7405926) ? true => 7405926 (false)
3 => 6666 (false)
=> SetValue(3, 6666) ? true => 6666 (false)
=> SetValue(3, 7405926) ? true => 7405926 (false)
2 => 7405926 (false)
=> SetValue(2, 7405926) ? true => 7405926 (false)
=> SetValue(2, 8227983786) ? true => 8227983786 (false)
3 => 7405926 (false)
=> SetValue(3, 7405926) ? true => 7405926 (false)
=> SetValue(3, 8227983786) ? true => 8227983786 (false)
2 => 8227983786 (false)
=> SetValue(2, 8227983786) ? true => 8227983786 (false)
=> SetValue(2, 9141289986246) ? true => 9141289986246 (false)
3 => 8227983786 (false)
=> SetValue(3, 8227983786) ? true => 8227983786 (false)
=> SetValue(3, 9141289986246) ? true => 9141289986246 (false)
2 => 9141289986246 (false)
=> SetValue(2, 9141289986246) ? true => 9141289986246 (false)
=> SetValue(2, 10155973174719306) ? true => 10155973174719306 (false)
3 => 9141289986246 (false)
=> SetValue(3, 9141289986246) ? true => 9141289986246 (false)
=> SetValue(3, 10155973174719306) ? true => 10155973174719306 (false)
2 => 10155973174719306 (false)
=> SetValue(2, 10155973174719306) ? true => 10155973174719306 (false)
=> SetValue(2, -7163457876596402650) ? true => -7163457876596402650 (false)
3 => 10155973174719306 (false)
=> SetValue(3, 10155973174719306) ? true => 10155973174719306 (false)
=> SetValue(3, -7163457876596402650) ? true => -7163457876596402650 (false)
Post loop: 0 => 0 (true)
Post loop Next: 0 => 0 (true)
Post loop Next: 0 => 0 (true)
GetValue / AddItem: (Value Ascending)
1 => -5 (false)
=> AddItem(1, -5) => -5 (false)
=> AddItem(1, -5555) => -5 (false)
2 => 6 (false)
=> AddItem(2, 6) => 6 (false)
=> AddItem(2, 6666) => 6 (false)
3 => 6 (false)
=> AddItem(3, 6) => 6 (false)
=> AddItem(3, 6666) => 6 (false)
Post loop: 0 => 0 (true)
Post loop Next: 0 => 0 (true)
Post loop Next: 0 => 0 (true)
RemoveItem / HasItem / AddItem: (Value Ascending)
1 => -5 / true (false)
=> RemoveItem(1) => 0 / false (false)
2 => 6 / true (false)
=> RemoveItem(2) => 0 / false (false)
3 => 6 / true (false)
=> RemoveItem(3) => 0 / false (true)
=> AddItem(3, 6) => 6 / true (false)
Post loop: 0 => 0 (true)
Post loop Next: 0 => 0 (true)
Post loop Next: 0 => 0 (true)
ListDump: (Item Descending)
3 => 6
2 => 6
1 => -5
Begin(): 3 => 6 (false)
Next(): 2 => 6 (false)
Next(): 1 => -5 (false)
Next(): 0 => 0 (true)
Next(): 0 => 0 (true)
foreach (idx, val in list) {print}: (Item Descending)
3 => 6 (false)
2 => 6 (false)
1 => -5 (false)
Post loop: (true)
Post loop Next: 0 => 0 (true)
Post loop Next: 0 => 0 (true)
for (Begin / !IsEnd / Next) {print}: (Item Descending)
3 => 6 (false)
2 => 6 (false)
1 => -5 (false)
Post loop: 0 => 0 (true)
Post loop Next: 0 => 0 (true)
Post loop Next: 0 => 0 (true)
Begin / while (!IsEnd) {print / Next}: (Item Descending)
3 => 6 (false)
2 => 6 (false)
1 => -5 (false)
Post loop: 0 => 0 (true)
Post loop Next: 0 => 0 (true)
Post loop Next: 0 => 0 (true)
Begin / do {{print / Next} while (!IsEnd)}: (Item Descending)
3 => 6 (false)
2 => 6 (false)
1 => -5 (false)
Post loop: 0 => 0 (true)
Post loop Next: 0 => 0 (true)
Post loop Next: 0 => 0 (true)
GetValue / SetValue: (Item Descending)
3 => 6 (false)
=> SetValue(3, 6) ? true => 6 (false)
=> SetValue(3, 6666) ? true => 6666 (false)
2 => 6 (false)
=> SetValue(2, 6) ? true => 6 (false)
=> SetValue(2, 6666) ? true => 6666 (false)
1 => -5 (false)
=> SetValue(1, -5) ? true => -5 (false)
=> SetValue(1, -5555) ? true => -5555 (false)
Post loop: 0 => 0 (true)
Post loop Next: 0 => 0 (true)
Post loop Next: 0 => 0 (true)
GetValue / AddItem: (Item Descending)
3 => 6 (false)
=> AddItem(3, 6) => 6 (false)
=> AddItem(3, 6666) => 6 (false)
2 => 6 (false)
=> AddItem(2, 6) => 6 (false)
=> AddItem(2, 6666) => 6 (false)
1 => -5 (false)
=> AddItem(1, -5) => -5 (false)
=> AddItem(1, -5555) => -5 (false)
Post loop: 0 => 0 (true)
Post loop Next: 0 => 0 (true)
Post loop Next: 0 => 0 (true)
RemoveItem / HasItem / AddItem: (Item Descending)
3 => 6 / true (false)
=> RemoveItem(3) => 0 / false (false)
2 => 6 / true (false)
=> RemoveItem(2) => 0 / false (false)
1 => -5 / true (false)
=> RemoveItem(1) => 0 / false (true)
=> AddItem(1, -5) => -5 / true (false)
Post loop: 0 => 0 (true)
Post loop Next: 0 => 0 (true)
Post loop Next: 0 => 0 (true)
ListDump: (Item Ascending)
1 => -5
2 => 6
3 => 6
Begin(): 1 => -5 (false)
Next(): 2 => 6 (false)
Next(): 3 => 6 (false)
Next(): 0 => 0 (true)
Next(): 0 => 0 (true)
foreach (idx, val in list) {print}: (Item Ascending)
1 => -5 (false)
2 => 6 (false)
3 => 6 (false)
Post loop: (true)
Post loop Next: 0 => 0 (true)
Post loop Next: 0 => 0 (true)
for (Begin / !IsEnd / Next) {print}: (Item Ascending)
1 => -5 (false)
2 => 6 (false)
3 => 6 (false)
Post loop: 0 => 0 (true)
Post loop Next: 0 => 0 (true)
Post loop Next: 0 => 0 (true)
Begin / while (!IsEnd) {print / Next}: (Item Ascending)
1 => -5 (false)
2 => 6 (false)
3 => 6 (false)
Post loop: 0 => 0 (true)
Post loop Next: 0 => 0 (true)
Post loop Next: 0 => 0 (true)
Begin / do {{print / Next} while (!IsEnd)}: (Item Ascending)
1 => -5 (false)
2 => 6 (false)
3 => 6 (false)
Post loop: 0 => 0 (true)
Post loop Next: 0 => 0 (true)
Post loop Next: 0 => 0 (true)
GetValue / SetValue: (Item Ascending)
1 => -5 (false)
=> SetValue(1, -5) ? true => -5 (false)
=> SetValue(1, -5555) ? true => -5555 (false)
2 => 6 (false)
=> SetValue(2, 6) ? true => 6 (false)
=> SetValue(2, 6666) ? true => 6666 (false)
3 => 6 (false)
=> SetValue(3, 6) ? true => 6 (false)
=> SetValue(3, 6666) ? true => 6666 (false)
Post loop: 0 => 0 (true)
Post loop Next: 0 => 0 (true)
Post loop Next: 0 => 0 (true)
GetValue / AddItem: (Item Ascending)
1 => -5 (false)
=> AddItem(1, -5) => -5 (false)
=> AddItem(1, -5555) => -5 (false)
2 => 6 (false)
=> AddItem(2, 6) => 6 (false)
=> AddItem(2, 6666) => 6 (false)
3 => 6 (false)
=> AddItem(3, 6) => 6 (false)
=> AddItem(3, 6666) => 6 (false)
Post loop: 0 => 0 (true)
Post loop Next: 0 => 0 (true)
Post loop Next: 0 => 0 (true)
RemoveItem / HasItem / AddItem: (Item Ascending)
1 => -5 / true (false)
=> RemoveItem(1) => 0 / false (false)
2 => 6 / true (false)
=> RemoveItem(2) => 0 / false (false)
3 => 6 / true (false)
=> RemoveItem(3) => 0 / false (true)
=> AddItem(3, 6) => 6 / true (false)
Post loop: 0 => 0 (true)
Post loop Next: 0 => 0 (true)
Post loop Next: 0 => 0 (true)
SwapList: (Value Descending) (Value Descending)
DumpList 1: (Value Descending)
3 => 6
2 => 6
1 => -5
DumpList 2: (Value Descending)
4002 => 8004
4001 => 8002
1005 => 1005
4000 => 50
4006 => 12
4012 => 1
List 1 Begin: 3 => 6 (false)
List 2 Begin: 4002 => 8004 (false)
List 2 Next: 4001 => 8002 (false)
=> Swap list 1 with list 2 (null : 0x00000000)
List 1 Next: 1005 => 1005 (false)
List 2 Next: 2 => 6 (false)
List 2 Next: 1 => -5 (false)
=> Swap list 1 with list 2 (null : 0x00000000)
List 1 Next: 0 => 0 (true)
List 2 Next: 4000 >= 50 (false)
List 2 Next: 4006 >= 12 (false)
SwapList: (Value Descending) (Value Ascending)
DumpList 1: (Value Descending)
3 => 6
2 => 6
1 => -5
DumpList 2: (Value Ascending)
4012 => 1
4006 => 12
4000 => 50
1005 => 1005
4001 => 8002
4002 => 8004
List 1 Begin: 3 => 6 (false)
List 2 Begin: 4012 => 1 (false)
List 2 Next: 4006 => 12 (false)
=> Swap list 1 with list 2 (null : 0x00000000)
List 1 Next: 4000 => 50 (false)
List 2 Next: 2 => 6 (false)
List 2 Next: 1 => -5 (false)
=> Swap list 1 with list 2 (null : 0x00000000)
List 1 Next: 0 => 0 (true)
List 2 Next: 1005 >= 1005 (false)
List 2 Next: 4001 >= 8002 (false)
SwapList: (Value Descending) (Item Descending)
DumpList 1: (Value Descending)
3 => 6
2 => 6
1 => -5
DumpList 2: (Item Descending)
4012 => 1
4006 => 12
4002 => 8004
4001 => 8002
4000 => 50
1005 => 1005
List 1 Begin: 3 => 6 (false)
List 2 Begin: 4012 => 1 (false)
List 2 Next: 4006 => 12 (false)
=> Swap list 1 with list 2 (null : 0x00000000)
List 1 Next: 4002 => 8004 (false)
List 2 Next: 2 => 6 (false)
List 2 Next: 1 => -5 (false)
=> Swap list 1 with list 2 (null : 0x00000000)
List 1 Next: 0 => 0 (true)
List 2 Next: 4001 >= 8002 (false)
List 2 Next: 4000 >= 50 (false)
SwapList: (Value Descending) (Item Ascending)
DumpList 1: (Value Descending)
3 => 6
2 => 6
1 => -5
DumpList 2: (Item Ascending)
1005 => 1005
4000 => 50
4001 => 8002
4002 => 8004
4006 => 12
4012 => 1
List 1 Begin: 3 => 6 (false)
List 2 Begin: 1005 => 1005 (false)
List 2 Next: 4000 => 50 (false)
=> Swap list 1 with list 2 (null : 0x00000000)
List 1 Next: 4001 => 8002 (false)
List 2 Next: 2 => 6 (false)
List 2 Next: 1 => -5 (false)
=> Swap list 1 with list 2 (null : 0x00000000)
List 1 Next: 0 => 0 (true)
List 2 Next: 4002 >= 8004 (false)
List 2 Next: 4006 >= 12 (false)
SwapList: (Value Ascending) (Value Descending)
DumpList 1: (Value Ascending)
1 => -5
2 => 6
3 => 6
DumpList 2: (Value Descending)
4002 => 8004
4001 => 8002
1005 => 1005
4000 => 50
4006 => 12
4012 => 1
List 1 Begin: 1 => -5 (false)
List 2 Begin: 4002 => 8004 (false)
List 2 Next: 4001 => 8002 (false)
=> Swap list 1 with list 2 (null : 0x00000000)
List 1 Next: 1005 => 1005 (false)
List 2 Next: 2 => 6 (false)
List 2 Next: 3 => 6 (false)
=> Swap list 1 with list 2 (null : 0x00000000)
List 1 Next: 0 => 0 (true)
List 2 Next: 4000 >= 50 (false)
List 2 Next: 4006 >= 12 (false)
SwapList: (Value Ascending) (Value Ascending)
DumpList 1: (Value Ascending)
1 => -5
2 => 6
3 => 6
DumpList 2: (Value Ascending)
4012 => 1
4006 => 12
4000 => 50
1005 => 1005
4001 => 8002
4002 => 8004
List 1 Begin: 1 => -5 (false)
List 2 Begin: 4012 => 1 (false)
List 2 Next: 4006 => 12 (false)
=> Swap list 1 with list 2 (null : 0x00000000)
List 1 Next: 4000 => 50 (false)
List 2 Next: 2 => 6 (false)
List 2 Next: 3 => 6 (false)
=> Swap list 1 with list 2 (null : 0x00000000)
List 1 Next: 0 => 0 (true)
List 2 Next: 1005 >= 1005 (false)
List 2 Next: 4001 >= 8002 (false)
SwapList: (Value Ascending) (Item Descending)
DumpList 1: (Value Ascending)
1 => -5
2 => 6
3 => 6
DumpList 2: (Item Descending)
4012 => 1
4006 => 12
4002 => 8004
4001 => 8002
4000 => 50
1005 => 1005
List 1 Begin: 1 => -5 (false)
List 2 Begin: 4012 => 1 (false)
List 2 Next: 4006 => 12 (false)
=> Swap list 1 with list 2 (null : 0x00000000)
List 1 Next: 4002 => 8004 (false)
List 2 Next: 2 => 6 (false)
List 2 Next: 3 => 6 (false)
=> Swap list 1 with list 2 (null : 0x00000000)
List 1 Next: 0 => 0 (true)
List 2 Next: 4001 >= 8002 (false)
List 2 Next: 4000 >= 50 (false)
SwapList: (Value Ascending) (Item Ascending)
DumpList 1: (Value Ascending)
1 => -5
2 => 6
3 => 6
DumpList 2: (Item Ascending)
1005 => 1005
4000 => 50
4001 => 8002
4002 => 8004
4006 => 12
4012 => 1
List 1 Begin: 1 => -5 (false)
List 2 Begin: 1005 => 1005 (false)
List 2 Next: 4000 => 50 (false)
=> Swap list 1 with list 2 (null : 0x00000000)
List 1 Next: 4001 => 8002 (false)
List 2 Next: 2 => 6 (false)
List 2 Next: 3 => 6 (false)
=> Swap list 1 with list 2 (null : 0x00000000)
List 1 Next: 0 => 0 (true)
List 2 Next: 4002 >= 8004 (false)
List 2 Next: 4006 >= 12 (false)
SwapList: (Item Descending) (Value Descending)
DumpList 1: (Item Descending)
3 => 6
2 => 6
1 => -5
DumpList 2: (Value Descending)
4002 => 8004
4001 => 8002
1005 => 1005
4000 => 50
4006 => 12
4012 => 1
List 1 Begin: 3 => 6 (false)
List 2 Begin: 4002 => 8004 (false)
List 2 Next: 4001 => 8002 (false)
=> Swap list 1 with list 2 (null : 0x00000000)
List 1 Next: 1005 => 1005 (false)
List 2 Next: 2 => 6 (false)
List 2 Next: 1 => -5 (false)
=> Swap list 1 with list 2 (null : 0x00000000)
List 1 Next: 0 => 0 (true)
List 2 Next: 4000 >= 50 (false)
List 2 Next: 4006 >= 12 (false)
SwapList: (Item Descending) (Value Ascending)
DumpList 1: (Item Descending)
3 => 6
2 => 6
1 => -5
DumpList 2: (Value Ascending)
4012 => 1
4006 => 12
4000 => 50
1005 => 1005
4001 => 8002
4002 => 8004
List 1 Begin: 3 => 6 (false)
List 2 Begin: 4012 => 1 (false)
List 2 Next: 4006 => 12 (false)
=> Swap list 1 with list 2 (null : 0x00000000)
List 1 Next: 4000 => 50 (false)
List 2 Next: 2 => 6 (false)
List 2 Next: 1 => -5 (false)
=> Swap list 1 with list 2 (null : 0x00000000)
List 1 Next: 0 => 0 (true)
List 2 Next: 1005 >= 1005 (false)
List 2 Next: 4001 >= 8002 (false)
SwapList: (Item Descending) (Item Descending)
DumpList 1: (Item Descending)
3 => 6
2 => 6
1 => -5
DumpList 2: (Item Descending)
4012 => 1
4006 => 12
4002 => 8004
4001 => 8002
4000 => 50
1005 => 1005
List 1 Begin: 3 => 6 (false)
List 2 Begin: 4012 => 1 (false)
List 2 Next: 4006 => 12 (false)
=> Swap list 1 with list 2 (null : 0x00000000)
List 1 Next: 4002 => 8004 (false)
List 2 Next: 2 => 6 (false)
List 2 Next: 1 => -5 (false)
=> Swap list 1 with list 2 (null : 0x00000000)
List 1 Next: 0 => 0 (true)
List 2 Next: 4001 >= 8002 (false)
List 2 Next: 4000 >= 50 (false)
SwapList: (Item Descending) (Item Ascending)
DumpList 1: (Item Descending)
3 => 6
2 => 6
1 => -5
DumpList 2: (Item Ascending)
1005 => 1005
4000 => 50
4001 => 8002
4002 => 8004
4006 => 12
4012 => 1
List 1 Begin: 3 => 6 (false)
List 2 Begin: 1005 => 1005 (false)
List 2 Next: 4000 => 50 (false)
=> Swap list 1 with list 2 (null : 0x00000000)
List 1 Next: 4001 => 8002 (false)
List 2 Next: 2 => 6 (false)
List 2 Next: 1 => -5 (false)
=> Swap list 1 with list 2 (null : 0x00000000)
List 1 Next: 0 => 0 (true)
List 2 Next: 4002 >= 8004 (false)
List 2 Next: 4006 >= 12 (false)
SwapList: (Item Ascending) (Value Descending)
DumpList 1: (Item Ascending)
1 => -5
2 => 6
3 => 6
DumpList 2: (Value Descending)
4002 => 8004
4001 => 8002
1005 => 1005
4000 => 50
4006 => 12
4012 => 1
List 1 Begin: 1 => -5 (false)
List 2 Begin: 4002 => 8004 (false)
List 2 Next: 4001 => 8002 (false)
=> Swap list 1 with list 2 (null : 0x00000000)
List 1 Next: 1005 => 1005 (false)
List 2 Next: 2 => 6 (false)
List 2 Next: 3 => 6 (false)
=> Swap list 1 with list 2 (null : 0x00000000)
List 1 Next: 0 => 0 (true)
List 2 Next: 4000 >= 50 (false)
List 2 Next: 4006 >= 12 (false)
SwapList: (Item Ascending) (Value Ascending)
DumpList 1: (Item Ascending)
1 => -5
2 => 6
3 => 6
DumpList 2: (Value Ascending)
4012 => 1
4006 => 12
4000 => 50
1005 => 1005
4001 => 8002
4002 => 8004
List 1 Begin: 1 => -5 (false)
List 2 Begin: 4012 => 1 (false)
List 2 Next: 4006 => 12 (false)
=> Swap list 1 with list 2 (null : 0x00000000)
List 1 Next: 4000 => 50 (false)
List 2 Next: 2 => 6 (false)
List 2 Next: 3 => 6 (false)
=> Swap list 1 with list 2 (null : 0x00000000)
List 1 Next: 0 => 0 (true)
List 2 Next: 1005 >= 1005 (false)
List 2 Next: 4001 >= 8002 (false)
SwapList: (Item Ascending) (Item Descending)
DumpList 1: (Item Ascending)
1 => -5
2 => 6
3 => 6
DumpList 2: (Item Descending)
4012 => 1
4006 => 12
4002 => 8004
4001 => 8002
4000 => 50
1005 => 1005
List 1 Begin: 1 => -5 (false)
List 2 Begin: 4012 => 1 (false)
List 2 Next: 4006 => 12 (false)
=> Swap list 1 with list 2 (null : 0x00000000)
List 1 Next: 4002 => 8004 (false)
List 2 Next: 2 => 6 (false)
List 2 Next: 3 => 6 (false)
=> Swap list 1 with list 2 (null : 0x00000000)
List 1 Next: 0 => 0 (true)
List 2 Next: 4001 >= 8002 (false)
List 2 Next: 4000 >= 50 (false)
SwapList: (Item Ascending) (Item Ascending)
DumpList 1: (Item Ascending)
1 => -5
2 => 6
3 => 6
DumpList 2: (Item Ascending)
1005 => 1005
4000 => 50
4001 => 8002
4002 => 8004
4006 => 12
4012 => 1
List 1 Begin: 1 => -5 (false)
List 2 Begin: 1005 => 1005 (false)
List 2 Next: 4000 => 50 (false)
=> Swap list 1 with list 2 (null : 0x00000000)
List 1 Next: 4001 => 8002 (false)
List 2 Next: 2 => 6 (false)
List 2 Next: 3 => 6 (false)
=> Swap list 1 with list 2 (null : 0x00000000)
List 1 Next: 0 => 0 (true)
List 2 Next: 4002 >= 8004 (false)
List 2 Next: 4006 >= 12 (false)
IsEmpty(): true
Negative ListDump:
1 => 0
0 => 0
-1 => 0
2 => -2
-2 => -2
3 => -4
-3 => -4
4 => -8
-4 => -8
5 => -12
-5 => -12
6 => -18
-6 => -18
7 => -24
-7 => -24
8 => -32
-8 => -32
9 => -40
-9 => -40
-10 => -50
KeepBelowValue(-12):
6 => -18
-6 => -18
7 => -24
-7 => -24
8 => -32
-8 => -32
9 => -40
-9 => -40
-10 => -50
KeepAboveValue(-40):
6 => -18
-6 => -18
7 => -24
-7 => -24
8 => -32
-8 => -32
KeepValue(-24):
7 => -24
-7 => -24
--Company--
SetName(): true
@@ -9778,9 +10538,9 @@ ERROR: IsEnd() is invalid as Begin() is never called
GetLocation(): 33417
GetEngineType(): 153
GetUnitNumber(): 1
GetAge(): 1
GetAge(): 0
GetMaxAge(): 5490
GetAgeLeft(): 5489
GetAgeLeft(): 5490
GetCurrentSpeed(): 7
GetRunningCost(): 421
GetProfitThisYear(): 0
@@ -9793,7 +10553,7 @@ ERROR: IsEnd() is invalid as Begin() is never called
IsInDepot(): false
GetNumWagons(): 1
GetWagonEngineType(): 153
GetWagonAge(): 1
GetWagonAge(): 0
GetLength(): 8
GetOwner(): 1
BuildVehicle(): 14
@@ -9868,11 +10628,11 @@ ERROR: IsEnd() is invalid as Begin() is never called
14 => 1
12 => 1
Age ListDump:
12 => 1
17 => 0
16 => 0
14 => 0
13 => 0
12 => 0
MaxAge ListDump:
16 => 10980
14 => 10980
@@ -9884,7 +10644,7 @@ ERROR: IsEnd() is invalid as Begin() is never called
14 => 10980
17 => 7320
13 => 5490
12 => 5489
12 => 5490
CurrentSpeed ListDump:
12 => 27
17 => 0
@@ -10112,15 +10872,73 @@ ERROR: IsEnd() is invalid as Begin() is never called
Clear(): (null : 0x00000000)
IsEmpty(): true
Count(): 0
--Terraforming--
DemolishTile(): true
DemolishTile(): true
GetBankBalance(): 1999216685
LowerTile(): false
RaiseTile(): true
GetBankBalance(): 1999156124
LowerTile(): true
GetBankBalance(): 1999155563
LowerTile(): true
RaiseTile(): true
GetBankBalance(): 1999124603
RaiseTile(): false
LowerTile(): false
LowerTile(): true
RaiseTile(): true
LowerTile(): true
GetBankBalance(): 1999122125
LowerTile(): false
LowerTile(): true
RaiseTile(): false
LowerTile(): true
LowerTile(): false
RaiseTile(): true
LowerTile(): true
GetBankBalance(): 1999116574
RaiseTile(): true
LowerTile(): true
GetBankBalance(): 1999100519
RaiseTile(): false
LowerTile(): true
GetBankBalance(): 1999098443
RaiseTile(): true
RaiseTile(): true
GetBankBalance(): 1999088221
LevelTiles(): true
LevelTiles(): false
GetBankBalance(): 1999078593
LevelTiles(): true
LevelTiles(): true
GetBankBalance(): 1998792514
LowerTile(): false
RaiseTile(): true
RaiseTile(): false
LowerTile(): true
GetBankBalance(): 1998786415
RaiseTile(): true
LowerTile(): true
LowerTile(): false
GetBankBalance(): 1998785248
RaiseTile(): false
LowerTile(): true
LowerTile(): false
RaiseTile(): false
RaiseTile(): true
GetBankBalance(): 1998738752
--Valuate() with excessive CPU usage--
constructor failed with: excessive CPU usage in list filter function
Your script made an error: excessive CPU usage in valuator function
CALLSTACK
*FUNCTION [Start()] regression/main.nut line [2184]
LOCALS
[Infinite] CLOSURE
[list] INSTANCE
[this] INSTANCE
CALLSTACK WITH LOCALS
*FUNCTION [Valuate()] Valuate line [5]
[args] ARRAY
[this] INSTANCE
*FUNCTION [Start()] regression/main.nut line [2474]
[Infinite] CLOSURE
[list] INSTANCE
[this] INSTANCE
ERROR: The script died unexpectedly.
+1 -1
View File
@@ -1,5 +1,5 @@
include(CreateRegression)
create_regression(
create_regression("ai"
${CMAKE_CURRENT_SOURCE_DIR}/info.nut
${CMAKE_CURRENT_SOURCE_DIR}/main.nut
${CMAKE_CURRENT_SOURCE_DIR}/result.txt
+1 -1
View File
@@ -4,7 +4,7 @@ class StationList extends AIInfo {
function GetShortName() { return "REGS"; }
function GetDescription() { return "This runs stationlist-tests on some commands. On the same map the result should always be the same."; }
function GetVersion() { return 1; }
function GetAPIVersion() { return "15"; }
function GetAPIVersion() { return "16"; }
function GetDate() { return "2007-03-18"; }
function CreateInstance() { return "StationList"; }
function UseAsRandomAI() { return false; }
+1 -1
View File
@@ -3,5 +3,5 @@ add_subdirectory(tests)
add_files(
scriptrun.cpp
scriptrun.h
CONDITION ICU_i18n_FOUND
CONDITION ICU_I18N_FOUND
)
+1 -1
View File
@@ -152,7 +152,7 @@ UBool ScriptRun::next()
// if it's an open character, push it onto the stack.
// if it's a close character, find the matching open on the
// stack, and use that script code. Any non-matching open
// characters above it on the stack will be poped.
// characters above it on the stack will be popped.
if (pairIndex >= 0) {
if ((pairIndex & 1) == 0) {
parenStack[++parenSP].pairIndex = pairIndex;
+1 -1
View File
@@ -1,4 +1,4 @@
add_test_files(
test_srtest.cpp
CONDITION ICU_i18n_FOUND
CONDITION ICU_I18N_FOUND
)
+18 -24
View File
@@ -19,7 +19,7 @@ void sqstd_printcallstack(HSQUIRRELVM v)
SQInteger level=1; //1 is to skip this function that is level 0
SQInteger seq=0;
pf(v,"\n");
pf(v,"CALLSTACK\n");
pf(v,"CALLSTACK WITH LOCALS\n");
while(SQ_SUCCEEDED(sq_stackinfos(v,level,&si)))
{
std::string_view fn="unknown";
@@ -35,13 +35,6 @@ void sqstd_printcallstack(HSQUIRRELVM v)
src = (p == std::string_view::npos) ? si.source : si.source.substr(p + 4);
}
pf(v,fmt::format("*FUNCTION [{}()] {} line [{}]\n",fn,src,si.line));
level++;
}
level=0;
pf(v,"\n");
pf(v,"LOCALS\n");
for(level=0;level<10;level++){
seq=0;
std::optional<std::string_view> opt;
while ((opt = sq_getlocal(v,level,seq)).has_value()) {
@@ -50,64 +43,65 @@ void sqstd_printcallstack(HSQUIRRELVM v)
switch(sq_gettype(v,-1))
{
case OT_NULL:
pf(v,fmt::format("[{}] NULL\n",name));
pf(v,fmt::format(" [{}] NULL\n",name));
break;
case OT_INTEGER:
sq_getinteger(v,-1,&i);
pf(v,fmt::format("[{}] {}\n",name,i));
pf(v,fmt::format(" [{}] {}\n",name,i));
break;
case OT_FLOAT:
sq_getfloat(v,-1,&f);
pf(v,fmt::format("[{}] {:14g}\n",name,f));
pf(v,fmt::format(" [{}] {:14g}\n",name,f));
break;
case OT_USERPOINTER:
pf(v,fmt::format("[{}] USERPOINTER\n",name));
pf(v,fmt::format(" [{}] USERPOINTER\n",name));
break;
case OT_STRING: {
std::string_view view;
sq_getstring(v,-1,view);
pf(v,fmt::format("[{}] \"{}\"\n",name,view));
pf(v,fmt::format(" [{}] \"{}\"\n",name,view));
break;
}
case OT_TABLE:
pf(v,fmt::format("[{}] TABLE\n",name));
pf(v,fmt::format(" [{}] TABLE\n",name));
break;
case OT_ARRAY:
pf(v,fmt::format("[{}] ARRAY\n",name));
pf(v,fmt::format(" [{}] ARRAY\n",name));
break;
case OT_CLOSURE:
pf(v,fmt::format("[{}] CLOSURE\n",name));
pf(v,fmt::format(" [{}] CLOSURE\n",name));
break;
case OT_NATIVECLOSURE:
pf(v,fmt::format("[{}] NATIVECLOSURE\n",name));
pf(v,fmt::format(" [{}] NATIVECLOSURE\n",name));
break;
case OT_GENERATOR:
pf(v,fmt::format("[{}] GENERATOR\n",name));
pf(v,fmt::format(" [{}] GENERATOR\n",name));
break;
case OT_USERDATA:
pf(v,fmt::format("[{}] USERDATA\n",name));
pf(v,fmt::format(" [{}] USERDATA\n",name));
break;
case OT_THREAD:
pf(v,fmt::format("[{}] THREAD\n",name));
pf(v,fmt::format(" [{}] THREAD\n",name));
break;
case OT_CLASS:
pf(v,fmt::format("[{}] CLASS\n",name));
pf(v,fmt::format(" [{}] CLASS\n",name));
break;
case OT_INSTANCE:
pf(v,fmt::format("[{}] INSTANCE\n",name));
pf(v,fmt::format(" [{}] INSTANCE\n",name));
break;
case OT_WEAKREF:
pf(v,fmt::format("[{}] WEAKREF\n",name));
pf(v,fmt::format(" [{}] WEAKREF\n",name));
break;
case OT_BOOL:{
sq_getbool(v,-1,&b);
pf(v,fmt::format("[{}] {}\n",name,b?"true":"false"));
pf(v,fmt::format(" [{}] {}\n",name,b?"true":"false"));
}
break;
default: assert(0); break;
}
sq_pop(v,1);
}
level++;
}
}
}
+3 -3
View File
@@ -472,7 +472,7 @@ SQRESULT sq_setroottable(HSQUIRRELVM v)
v->Pop();
return SQ_OK;
}
return sq_throwerror(v, "ivalid type");
return sq_throwerror(v, "invalid type");
}
SQRESULT sq_setconsttable(HSQUIRRELVM v)
@@ -483,7 +483,7 @@ SQRESULT sq_setconsttable(HSQUIRRELVM v)
v->Pop();
return SQ_OK;
}
return sq_throwerror(v, "ivalid type, expected table");
return sq_throwerror(v, "invalid type, expected table");
}
void sq_setforeignptr(HSQUIRRELVM v,SQUserPointer p)
@@ -796,7 +796,7 @@ SQRESULT sq_setdelegate(HSQUIRRELVM v,SQInteger idx)
switch(type) {
case OT_TABLE:
if(type(mt) == OT_TABLE) {
if(!_table(self)->SetDelegate(_table(mt))) return sq_throwerror(v, "delagate cycle");
if(!_table(self)->SetDelegate(_table(mt))) return sq_throwerror(v, "delegate cycle");
v->Pop();}
else if(type(mt)==OT_NULL) {
_table(self)->SetDelegate(nullptr); v->Pop(); }
+12 -3
View File
@@ -519,6 +519,7 @@ bool _sort_compare(HSQUIRRELVM v,SQObjectPtr &a,SQObjectPtr &b,SQInteger func,SQ
bool _hsort_sift_down(HSQUIRRELVM v,SQArray *arr, SQInteger root, SQInteger bottom, SQInteger func)
{
SQInteger initial_size = arr->Size();
SQInteger maxChild;
SQInteger done = 0;
SQInteger ret;
@@ -531,6 +532,10 @@ bool _hsort_sift_down(HSQUIRRELVM v,SQArray *arr, SQInteger root, SQInteger bott
else {
if(!_sort_compare(v,arr->_values[root2],arr->_values[root2 + 1],func,ret))
return false;
if (initial_size != arr->Size()) {
v->Raise_Error("compare function modified array");
return false;
}
if (ret > 0) {
maxChild = root2;
}
@@ -542,10 +547,14 @@ bool _hsort_sift_down(HSQUIRRELVM v,SQArray *arr, SQInteger root, SQInteger bott
if(!_sort_compare(v,arr->_values[root],arr->_values[maxChild],func,ret))
return false;
if (initial_size != arr->Size()) {
v->Raise_Error("compare function modified array");
return false;
}
if (ret < 0) {
if (root == maxChild) {
v->Raise_Error("inconsistent compare function");
return false; // We'd be swapping ourselve. The compare function is incorrect
return false; // We'd be swapping ourself. The compare function is incorrect
}
_Swap(arr->_values[root],arr->_values[maxChild]);
root = maxChild;
@@ -596,7 +605,7 @@ static SQInteger array_slice(HSQUIRRELVM v)
if(sidx < 0)sidx = alen + sidx;
if(eidx < 0)eidx = alen + eidx;
if(eidx < sidx)return sq_throwerror(v,"wrong indexes");
if(eidx > alen)return sq_throwerror(v,"slice out of range");
if(sidx < 0 || eidx > alen) return sq_throwerror(v,"slice out of range");
SQArray *arr=SQArray::Create(_ss(v),eidx-sidx);
SQObjectPtr t;
SQInteger count=0;
@@ -637,7 +646,7 @@ static SQInteger string_slice(HSQUIRRELVM v)
if(sidx < 0)sidx = slen + sidx;
if(eidx < 0)eidx = slen + eidx;
if(eidx < sidx) return sq_throwerror(v,"wrong indexes");
if(eidx > slen) return sq_throwerror(v,"slice out of range");
if(sidx < 0 || eidx > slen) return sq_throwerror(v,"slice out of range");
v->Push(SQString::Create(_ss(v),_stringval(o).substr(sidx,eidx-sidx)));
return 1;
}
+1 -1
View File
@@ -245,7 +245,7 @@ bool SafeWrite(HSQUIRRELVM v,SQWRITEFUNC write,SQUserPointer up,SQUserPointer de
bool SafeRead(HSQUIRRELVM v,SQWRITEFUNC read,SQUserPointer up,SQUserPointer dest,SQInteger size)
{
if(size && read(up,dest,size) != size) {
v->Raise_Error("io error, read function failure, the origin stream could be corrupted/trucated");
v->Raise_Error("io error, read function failure, the origin stream could be corrupted/truncated");
return false;
}
return true;
+2 -2
View File
@@ -193,7 +193,7 @@ SQSharedState::~SQSharedState()
t = nx;
}
}
// assert(_gc_chain==nullptr); //just to proove a theory
// assert(_gc_chain==nullptr); //just to prove a theory
while(_gc_chain){
_gc_chain->_uiRef--;
_gc_chain->Release();
@@ -227,7 +227,7 @@ SQInteger SQSharedState::GetMetaMethodIdxByName(const SQObjectPtr &name)
* This is done internally by a vector onto which the to be freed instances are pushed. When
* this is called when not already processing, this method will actually call the FinalFree
* function which might cause more elements to end up in the queue which this method then
* picks up continueing until it has processed all instances in that queue.
* picks up continuing until it has processed all instances in that queue.
* @param collectable The collectable to (eventually) free.
*/
void SQSharedState::DelayFinalFree(SQCollectable *collectable)
+3 -3
View File
@@ -424,7 +424,7 @@ bool SQVM::Return(SQInteger _arg0, SQInteger _arg1, SQObjectPtr &retval)
else retval = _null_;
}
else {
if(target != -1) { //-1 is when a class contructor ret value has to be ignored
if(target != -1) { //-1 is when a class constructor ret value has to be ignored
if (_arg0 != MAX_FUNC_STACKSIZE)
STK(target) = _stack._vals[oldstackbase+_arg1];
else
@@ -1285,8 +1285,8 @@ bool SQVM::FallBackGet(const SQObjectPtr &self,const SQObjectPtr &key,SQObjectPt
if(sq_isnumeric(key)){
SQInteger n=tointeger(key);
std::string_view str = _stringval(self);
if(std::abs(n) < static_cast<SQInteger>(str.size())){
if(n<0)n=str.size()+n;
if (n < 0) n = str.size() + n;
if (n >= 0 && n < static_cast<SQInteger>(str.size())) {
dest=SQInteger(str[n]);
return true;
}
+5 -2
View File
@@ -37,7 +37,7 @@ add_files(
add_files(
gfx_layout_icu.cpp
gfx_layout_icu.h
CONDITION ICU_i18n_FOUND AND HARFBUZZ_FOUND
CONDITION ICU_I18N_FOUND AND HARFBUZZ_FOUND
)
add_files(
@@ -133,7 +133,8 @@ add_files(
crashlog.cpp
crashlog.h
currency.cpp
currency.h
currency_func.h
currency_type.h
date_gui.cpp
date_gui.h
debug.cpp
@@ -209,6 +210,7 @@ add_files(
goal_base.h
goal_cmd.h
goal_gui.cpp
goal_gui.h
goal_type.h
graph_gui.cpp
graph_gui.h
@@ -334,6 +336,7 @@ add_files(
newgrf_town.h
newgrf_townname.cpp
newgrf_townname.h
newgrf_type.h
news_cmd.h
news_func.h
news_gui.cpp
+13 -7
View File
@@ -37,6 +37,7 @@ public:
/**
* Get the current AI tick.
* @return The tick number.
*/
static uint GetTick();
@@ -97,30 +98,35 @@ public:
/**
* Queue a new event for an AI.
* @param company The company to receive the event.
* @param event The event.
*/
static void NewEvent(CompanyID company, ScriptEvent *event);
/**
* Broadcast a new event to all active AIs.
* @param event The event to broadcast.
* @param skip_company The optional company not to send the event to.
*/
static void BroadcastNewEvent(ScriptEvent *event, CompanyID skip_company = CompanyID::Invalid());
/**
* Save data from an AI to a savegame.
* @param company To company to save.
*/
static void Save(CompanyID company);
/** Wrapper function for AIScanner::GetAIConsoleList */
/** @copydoc ScriptScanner::GetConsoleList */
static void GetConsoleList(std::back_insert_iterator<std::string> &output_iterator, bool newest_only);
/** Wrapper function for AIScanner::GetAIConsoleLibraryList */
static void GetConsoleLibraryList(std::back_insert_iterator<std::string> &output_iterator);
/** Wrapper function for AIScanner::GetAIInfoList */
/** @copydoc ScriptScanner::GetConsoleList */
static void GetConsoleLibraryList(std::back_insert_iterator<std::string> &output_iterator, bool newest_only);
/** @copydoc ScriptScanner::GetInfoList */
static const ScriptInfoList *GetInfoList();
/** Wrapper function for AIScanner::GetUniqueAIInfoList */
/** @copydoc ScriptScanner::GetUniqueInfoList */
static const ScriptInfoList *GetUniqueInfoList();
/** Wrapper function for AIScanner::FindInfo */
/** @copydoc ScriptConfig::FindInfo */
static class AIInfo *FindInfo(const std::string &name, int version, bool force_exact_match);
/** Wrapper function for AIScanner::FindLibrary */
/** @copydoc ScriptInstance::FindLibrary */
static class AILibrary *FindLibrary(const std::string &library, int version);
/**
+3 -3
View File
@@ -21,14 +21,14 @@
{
assert(company < MAX_COMPANIES);
if (_game_mode == GM_MENU) source = SSS_FORCE_NEWGAME;
if (source == ScriptSettingSource::Default && _game_mode == GameMode::Menu) source = ScriptSettingSource::ForceNewGame;
if (source == SSS_DEFAULT) {
if (source == ScriptSettingSource::Default) {
Company *c = Company::GetIfValid(company);
if (c != nullptr && c->ai_config != nullptr) return c->ai_config.get();
}
auto &config = (source == SSS_FORCE_NEWGAME) ? _settings_newgame.script_config.ai[company] : _settings_game.script_config.ai[company];
auto &config = (source == ScriptSettingSource::ForceNewGame) ? _settings_newgame.script_config.ai[company] : _settings_game.script_config.ai[company];
if (config == nullptr) config = std::make_unique<AIConfig>();
return config.get();
+11 -2
View File
@@ -13,21 +13,30 @@
#include "../script/script_config.hpp"
#include "../company_type.h"
/** AI instantion of script configuration. */
class AIConfig : public ScriptConfig {
public:
/**
* Get the config of a company.
* Get the AI configuration of specific company.
* @param company The company to get the configuration for.
* @param source The context, i.e. current / new game mode.
* @return The configuration.
*/
static AIConfig *GetConfig(CompanyID company, ScriptSettingSource source = SSS_DEFAULT);
static AIConfig *GetConfig(CompanyID company, ScriptSettingSource source = ScriptSettingSource::Default);
AIConfig() :
ScriptConfig()
{}
/**
* Copy constructor.
* @param config The configuration to copy.
*/
AIConfig(const AIConfig &config) :
ScriptConfig(config)
{}
/** @copydoc ScriptConfig::GetInfo. */
class AIInfo *GetInfo() const;
/**
+46 -38
View File
@@ -40,12 +40,12 @@
/* Clients shouldn't start AIs */
if (_networking && !_network_server) return;
Backup<CompanyID> cur_company(_current_company, company);
AutoRestoreBackup cur_company(_current_company, company);
Company *c = Company::Get(company);
AIConfig *config = c->ai_config.get();
if (config == nullptr) {
c->ai_config = std::make_unique<AIConfig>(*AIConfig::GetConfig(company, AIConfig::SSS_FORCE_GAME));
c->ai_config = std::make_unique<AIConfig>(*AIConfig::GetConfig(company, AIConfig::ScriptSettingSource::ForceCurrentGame));
config = c->ai_config.get();
}
@@ -65,12 +65,20 @@
c->ai_instance->LoadOnStack(config->GetToLoadData());
config->SetToLoadData(nullptr);
cur_company.Restore();
InvalidateWindowClassesData(WC_SCRIPT_DEBUG, -1);
InvalidateWindowClassesData(WindowClass::ScriptDebug, -1);
return;
}
/**
* Get the \c PerformanceElement for the AI of the given company.
* @param company The company to get the PerformanceElement for.
* @return The \c PerformanceElement.
*/
static constexpr PerformanceElement GetAIPerformanceElement(CompanyID company)
{
return static_cast<PerformanceElement>(PerformanceElement::AI0 + company);
}
/* static */ void AI::GameLoop()
{
/* If we are in networking, only servers run this function, and that only if it is allowed */
@@ -81,11 +89,10 @@
assert(_settings_game.difficulty.competitor_speed <= 4);
if ((AI::frame_counter & ((1 << (4 - _settings_game.difficulty.competitor_speed)) - 1)) != 0) return;
Backup<CompanyID> cur_company(_current_company);
for (const Company *c : Company::Iterate()) {
if (c->is_ai) {
PerformanceMeasurer framerate((PerformanceElement)(PFE_AI0 + c->index));
cur_company.Change(c->index);
PerformanceMeasurer framerate(GetAIPerformanceElement(c->index));
AutoRestoreBackup cur_company(_current_company, c->index);
c->ai_instance->GameLoop();
/* Occasionally collect garbage; every 255 ticks do one company.
* Effectively collecting garbage once every two months per AI. */
@@ -93,10 +100,9 @@
c->ai_instance->CollectGarbage();
}
} else {
PerformanceMeasurer::SetInactive((PerformanceElement)(PFE_AI0 + c->index));
PerformanceMeasurer::SetInactive(GetAIPerformanceElement(c->index));
}
}
cur_company.Restore();
}
/* static */ uint AI::GetTick()
@@ -107,18 +113,16 @@
/* static */ void AI::Stop(CompanyID company)
{
if (_networking && !_network_server) return;
PerformanceMeasurer::SetInactive((PerformanceElement)(PFE_AI0 + company));
PerformanceMeasurer::SetInactive(GetAIPerformanceElement(company));
Backup<CompanyID> cur_company(_current_company, company);
AutoRestoreBackup cur_company(_current_company, company);
Company *c = Company::Get(company);
c->ai_instance.reset();
c->ai_info = nullptr;
c->ai_config.reset();
cur_company.Restore();
InvalidateWindowClassesData(WC_SCRIPT_DEBUG, -1);
InvalidateWindowClassesData(WindowClass::ScriptDebug, -1);
}
/* static */ void AI::Pause(CompanyID company)
@@ -128,28 +132,20 @@
* for the server owner to unpause the script again. */
if (_network_dedicated) return;
Backup<CompanyID> cur_company(_current_company, company);
AutoRestoreBackup cur_company(_current_company, company);
Company::Get(company)->ai_instance->Pause();
cur_company.Restore();
}
/* static */ void AI::Unpause(CompanyID company)
{
Backup<CompanyID> cur_company(_current_company, company);
AutoRestoreBackup cur_company(_current_company, company);
Company::Get(company)->ai_instance->Unpause();
cur_company.Restore();
}
/* static */ bool AI::IsPaused(CompanyID company)
{
Backup<CompanyID> cur_company(_current_company, company);
bool paused = Company::Get(company)->ai_instance->IsPaused();
cur_company.Restore();
return paused;
AutoRestoreBackup cur_company(_current_company, company);
return Company::Get(company)->ai_instance->IsPaused();
}
/* static */ void AI::KillAll()
@@ -247,9 +243,8 @@
}
/* Queue the event */
Backup<CompanyID> cur_company(_current_company, company);
AutoRestoreBackup cur_company(_current_company, company);
Company::Get(_current_company)->ai_instance->InsertEvent(event);
cur_company.Restore();
}
/* static */ void AI::BroadcastNewEvent(ScriptEvent *event, CompanyID skip_company)
@@ -275,9 +270,8 @@
/* When doing emergency saving, an AI can be not fully initialised. */
if (c->ai_instance != nullptr) {
Backup<CompanyID> cur_company(_current_company, company);
AutoRestoreBackup cur_company(_current_company, company);
c->ai_instance->Save();
cur_company.Restore();
return;
}
}
@@ -290,9 +284,9 @@
AI::scanner_info->GetConsoleList(output_iterator, newest_only);
}
/* static */ void AI::GetConsoleLibraryList(std::back_insert_iterator<std::string> &output_iterator)
/* static */ void AI::GetConsoleLibraryList(std::back_insert_iterator<std::string> &output_iterator, bool newest_only)
{
AI::scanner_library->GetConsoleList(output_iterator, true);
AI::scanner_library->GetConsoleList(output_iterator, newest_only);
}
/* static */ const ScriptInfoList *AI::GetInfoList()
@@ -323,32 +317,46 @@
AI::scanner_library->RescanDir();
ResetConfig();
InvalidateWindowData(WC_SCRIPT_LIST, 0, 1);
SetWindowClassesDirty(WC_SCRIPT_DEBUG);
InvalidateWindowClassesData(WC_SCRIPT_SETTINGS);
InvalidateWindowData(WindowClass::ScriptList, 0, 1);
SetWindowClassesDirty(WindowClass::ScriptDebug);
InvalidateWindowClassesData(WindowClass::ScriptSettings);
}
/**
* Check whether we have an AI (library) with the exact characteristics as ci.
* Check whether we have an AI with the exact characteristics as ci.
* @param ci the characteristics to search on (shortname and md5sum)
* @param md5sum whether to check the MD5 checksum
* @return true iff we have an AI (library) matching.
* @return true iff we have an AI matching.
*/
/* static */ bool AI::HasAI(const ContentInfo &ci, bool md5sum)
{
return AI::scanner_info->HasScript(ci, md5sum);
}
/**
* Check whether we have an AI library with the exact characteristics as ci.
* @param ci the characteristics to search on (shortname and md5sum)
* @param md5sum whether to check the MD5 checksum
* @return true iff we have an AI library matching.
*/
/* static */ bool AI::HasAILibrary(const ContentInfo &ci, bool md5sum)
{
return AI::scanner_library->HasScript(ci, md5sum);
}
/**
* Get the scanner info for AIs.
* @return The AI scanner info.
*/
/* static */ AIScannerInfo *AI::GetScannerInfo()
{
return AI::scanner_info.get();
}
/**
* Get the scanner info for AI libraries.
* @return The AI library scanner info.
*/
/* static */ AIScannerLibrary *AI::GetScannerLibrary()
{
return AI::scanner_library.get();
+43 -41
View File
@@ -5,7 +5,7 @@
* See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see <https://www.gnu.org/licenses/old-licenses/gpl-2.0>.
*/
/** @file ai_gui.cpp %Window for configuring the AIs */
/** @file ai_gui.cpp %Window for configuring the AIs. */
#include "../stdafx.h"
#include "../error.h"
@@ -30,51 +30,51 @@
/** Widgets for the configure AI window. */
static constexpr std::initializer_list<NWidgetPart> _nested_ai_config_widgets = {
NWidget(NWID_HORIZONTAL),
NWidget(WWT_CLOSEBOX, COLOUR_MAUVE),
NWidget(WWT_CAPTION, COLOUR_MAUVE), SetStringTip(STR_AI_CONFIG_CAPTION_AI, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS),
NWidget(WWT_CLOSEBOX, Colours::Mauve),
NWidget(WWT_CAPTION, Colours::Mauve), SetStringTip(STR_AI_CONFIG_CAPTION_AI, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS),
EndContainer(),
NWidget(WWT_PANEL, COLOUR_MAUVE, WID_AIC_BACKGROUND),
NWidget(WWT_PANEL, Colours::Mauve, WID_AIC_BACKGROUND),
NWidget(NWID_VERTICAL), SetPIP(0, WidgetDimensions::unscaled.vsep_wide, 0), SetPadding(WidgetDimensions::unscaled.sparse),
NWidget(NWID_VERTICAL), SetPIP(0, WidgetDimensions::unscaled.vsep_sparse, 0),
NWidget(NWID_HORIZONTAL), SetPIP(0, WidgetDimensions::unscaled.hsep_wide, 0),
NWidget(NWID_HORIZONTAL, NWidContainerFlag::EqualSize),
NWidget(WWT_PUSHARROWBTN, COLOUR_YELLOW, WID_AIC_DECREASE_NUMBER), SetArrowWidgetTypeTip(AWV_DECREASE),
NWidget(WWT_PUSHARROWBTN, COLOUR_YELLOW, WID_AIC_INCREASE_NUMBER), SetArrowWidgetTypeTip(AWV_INCREASE),
NWidget(WWT_PUSHARROWBTN, Colours::Yellow, WID_AIC_DECREASE_NUMBER), SetArrowWidgetTypeTip(ArrowWidgetType::Decrease),
NWidget(WWT_PUSHARROWBTN, Colours::Yellow, WID_AIC_INCREASE_NUMBER), SetArrowWidgetTypeTip(ArrowWidgetType::Increase),
EndContainer(),
NWidget(WWT_TEXT, INVALID_COLOUR, WID_AIC_NUMBER), SetFill(1, 0),
NWidget(WWT_TEXT, Colours::Invalid, WID_AIC_NUMBER), SetFill(1, 0),
EndContainer(),
NWidget(NWID_HORIZONTAL), SetPIP(0, WidgetDimensions::unscaled.hsep_wide, 0),
NWidget(NWID_HORIZONTAL, NWidContainerFlag::EqualSize),
NWidget(WWT_PUSHARROWBTN, COLOUR_YELLOW, WID_AIC_DECREASE_INTERVAL), SetArrowWidgetTypeTip(AWV_DECREASE),
NWidget(WWT_PUSHARROWBTN, COLOUR_YELLOW, WID_AIC_INCREASE_INTERVAL), SetArrowWidgetTypeTip(AWV_INCREASE),
NWidget(WWT_PUSHARROWBTN, Colours::Yellow, WID_AIC_DECREASE_INTERVAL), SetArrowWidgetTypeTip(ArrowWidgetType::Decrease),
NWidget(WWT_PUSHARROWBTN, Colours::Yellow, WID_AIC_INCREASE_INTERVAL), SetArrowWidgetTypeTip(ArrowWidgetType::Increase),
EndContainer(),
NWidget(WWT_TEXT, INVALID_COLOUR, WID_AIC_INTERVAL), SetFill(1, 0),
NWidget(WWT_TEXT, Colours::Invalid, WID_AIC_INTERVAL), SetFill(1, 0),
EndContainer(),
NWidget(NWID_HORIZONTAL, NWidContainerFlag::EqualSize),
NWidget(WWT_PUSHTXTBTN, COLOUR_YELLOW, WID_AIC_MOVE_UP), SetResize(1, 0), SetFill(1, 0), SetStringTip(STR_AI_CONFIG_MOVE_UP, STR_AI_CONFIG_MOVE_UP_TOOLTIP),
NWidget(WWT_PUSHTXTBTN, COLOUR_YELLOW, WID_AIC_MOVE_DOWN), SetResize(1, 0), SetFill(1, 0), SetStringTip(STR_AI_CONFIG_MOVE_DOWN, STR_AI_CONFIG_MOVE_DOWN_TOOLTIP),
NWidget(WWT_PUSHTXTBTN, Colours::Yellow, WID_AIC_MOVE_UP), SetResize(1, 0), SetFill(1, 0), SetStringTip(STR_AI_CONFIG_MOVE_UP, STR_AI_CONFIG_MOVE_UP_TOOLTIP),
NWidget(WWT_PUSHTXTBTN, Colours::Yellow, WID_AIC_MOVE_DOWN), SetResize(1, 0), SetFill(1, 0), SetStringTip(STR_AI_CONFIG_MOVE_DOWN, STR_AI_CONFIG_MOVE_DOWN_TOOLTIP),
EndContainer(),
EndContainer(),
NWidget(WWT_FRAME, COLOUR_MAUVE), SetStringTip(STR_AI_CONFIG_AI), SetPIP(0, WidgetDimensions::unscaled.vsep_sparse, 0),
NWidget(WWT_FRAME, Colours::Mauve), SetStringTip(STR_AI_CONFIG_AI), SetPIP(0, WidgetDimensions::unscaled.vsep_sparse, 0),
NWidget(NWID_HORIZONTAL),
NWidget(WWT_MATRIX, COLOUR_MAUVE, WID_AIC_LIST), SetMinimalSize(288, 112), SetFill(1, 0), SetMatrixDataTip(1, 8, STR_AI_CONFIG_AILIST_TOOLTIP), SetScrollbar(WID_AIC_SCROLLBAR),
NWidget(NWID_VSCROLLBAR, COLOUR_MAUVE, WID_AIC_SCROLLBAR),
NWidget(WWT_MATRIX, Colours::Mauve, WID_AIC_LIST), SetMinimalSize(288, 112), SetFill(1, 0), SetMatrixDataTip(1, 8, STR_AI_CONFIG_AILIST_TOOLTIP), SetScrollbar(WID_AIC_SCROLLBAR),
NWidget(NWID_VSCROLLBAR, Colours::Mauve, WID_AIC_SCROLLBAR),
EndContainer(),
NWidget(WWT_PUSHTXTBTN, COLOUR_YELLOW, WID_AIC_CONFIGURE), SetFill(1, 0), SetStringTip(STR_AI_CONFIG_CONFIGURE, STR_AI_CONFIG_CONFIGURE_TOOLTIP),
NWidget(WWT_PUSHTXTBTN, Colours::Yellow, WID_AIC_CONFIGURE), SetFill(1, 0), SetStringTip(STR_AI_CONFIG_CONFIGURE, STR_AI_CONFIG_CONFIGURE_TOOLTIP),
EndContainer(),
NWidget(NWID_HORIZONTAL), SetPIP(0, WidgetDimensions::unscaled.hsep_wide, 0),
NWidget(NWID_VERTICAL, NWidContainerFlag::EqualSize),
NWidget(WWT_PUSHTXTBTN, COLOUR_YELLOW, WID_AIC_CHANGE), SetFill(1, 1), SetStringTip(STR_AI_CONFIG_CHANGE_AI, STR_AI_CONFIG_CHANGE_TOOLTIP),
NWidget(WWT_PUSHTXTBTN, COLOUR_YELLOW, WID_AIC_CONTENT_DOWNLOAD), SetFill(1, 1), SetStringTip(STR_INTRO_ONLINE_CONTENT, STR_INTRO_TOOLTIP_ONLINE_CONTENT),
NWidget(WWT_PUSHTXTBTN, Colours::Yellow, WID_AIC_CHANGE), SetFill(1, 1), SetStringTip(STR_AI_CONFIG_CHANGE_AI, STR_AI_CONFIG_CHANGE_TOOLTIP),
NWidget(WWT_PUSHTXTBTN, Colours::Yellow, WID_AIC_CONTENT_DOWNLOAD), SetFill(1, 1), SetStringTip(STR_INTRO_ONLINE_CONTENT, STR_INTRO_TOOLTIP_ONLINE_CONTENT),
EndContainer(),
NWidget(NWID_VERTICAL, NWidContainerFlag::EqualSize),
NWidget(NWID_HORIZONTAL, NWidContainerFlag::EqualSize),
NWidget(WWT_PUSHTXTBTN, COLOUR_YELLOW, WID_AIC_OPEN_URL), SetResize(1, 0), SetFill(1, 0), SetStringTip(STR_CONTENT_OPEN_URL, STR_CONTENT_OPEN_URL_TOOLTIP),
NWidget(WWT_PUSHTXTBTN, COLOUR_YELLOW, WID_AIC_TEXTFILE + TFT_README), SetFill(1, 1), SetResize(1, 0), SetStringTip(STR_TEXTFILE_VIEW_README, STR_TEXTFILE_VIEW_README_TOOLTIP),
NWidget(WWT_PUSHTXTBTN, Colours::Yellow, WID_AIC_OPEN_URL), SetResize(1, 0), SetFill(1, 0), SetStringTip(STR_CONTENT_OPEN_URL, STR_CONTENT_OPEN_URL_TOOLTIP),
NWidget(WWT_PUSHTXTBTN, Colours::Yellow, WID_AIC_TEXTFILE + TFT_README), SetFill(1, 1), SetResize(1, 0), SetStringTip(STR_TEXTFILE_VIEW_README, STR_TEXTFILE_VIEW_README_TOOLTIP),
EndContainer(),
NWidget(NWID_HORIZONTAL, NWidContainerFlag::EqualSize),
NWidget(WWT_PUSHTXTBTN, COLOUR_YELLOW, WID_AIC_TEXTFILE + TFT_CHANGELOG), SetFill(1, 1), SetResize(1, 0), SetStringTip(STR_TEXTFILE_VIEW_CHANGELOG, STR_TEXTFILE_VIEW_CHANGELOG_TOOLTIP),
NWidget(WWT_PUSHTXTBTN, COLOUR_YELLOW, WID_AIC_TEXTFILE + TFT_LICENSE), SetFill(1, 1), SetResize(1, 0), SetStringTip(STR_TEXTFILE_VIEW_LICENCE, STR_TEXTFILE_VIEW_LICENCE_TOOLTIP),
NWidget(WWT_PUSHTXTBTN, Colours::Yellow, WID_AIC_TEXTFILE + TFT_CHANGELOG), SetFill(1, 1), SetResize(1, 0), SetStringTip(STR_TEXTFILE_VIEW_CHANGELOG, STR_TEXTFILE_VIEW_CHANGELOG_TOOLTIP),
NWidget(WWT_PUSHTXTBTN, Colours::Yellow, WID_AIC_TEXTFILE + TFT_LICENSE), SetFill(1, 1), SetResize(1, 0), SetStringTip(STR_TEXTFILE_VIEW_LICENCE, STR_TEXTFILE_VIEW_LICENCE_TOOLTIP),
EndContainer(),
EndContainer(),
EndContainer(),
@@ -84,8 +84,8 @@ static constexpr std::initializer_list<NWidgetPart> _nested_ai_config_widgets =
/** Window definition for the configure AI window. */
static WindowDesc _ai_config_desc(
WDP_CENTER, {}, 0, 0,
WC_GAME_OPTIONS, WC_NONE,
WindowPosition::Center, {}, 0, 0,
WindowClass::GameOptions, WindowClass::None,
{},
_nested_ai_config_widgets
);
@@ -100,7 +100,7 @@ struct AIConfigWindow : public Window {
AIConfigWindow() : Window(_ai_config_desc)
{
this->InitNested(WN_GAME_OPTIONS_AI); // Initializes 'this->line_height' as a side effect.
this->InitNested(GameOptionsWindowNumber::AI); // Initializes 'this->line_height' as a side effect.
this->vscroll = this->GetScrollbar(WID_AIC_SCROLLBAR);
this->selected_slot = CompanyID::Invalid();
NWidgetCore *nwi = this->GetWidget<NWidgetCore>(WID_AIC_LIST);
@@ -111,8 +111,8 @@ struct AIConfigWindow : public Window {
void Close([[maybe_unused]] int data = 0) override
{
CloseWindowByClass(WC_SCRIPT_LIST);
CloseWindowByClass(WC_SCRIPT_SETTINGS);
CloseWindowByClass(WindowClass::ScriptList);
CloseWindowByClass(WindowClass::ScriptSettings);
this->Window::Close();
}
@@ -141,7 +141,7 @@ struct AIConfigWindow : public Window {
break;
case WID_AIC_LIST:
this->line_height = GetCharacterHeight(FS_NORMAL) + padding.height;
this->line_height = GetCharacterHeight(FontSize::Normal) + padding.height;
fill.height = resize.height = this->line_height;
size.height = 8 * this->line_height;
break;
@@ -155,7 +155,7 @@ struct AIConfigWindow : public Window {
*/
static bool IsEditable(CompanyID slot)
{
if (_game_mode != GM_NORMAL) {
if (_game_mode != GameMode::Normal) {
return slot > 0 && slot < MAX_COMPANIES;
}
return slot < MAX_COMPANIES && !Company::IsValidID(slot);
@@ -168,7 +168,7 @@ struct AIConfigWindow : public Window {
*/
std::string GetSlotText(CompanyID cid) const
{
if ((_game_mode != GM_NORMAL && cid == 0) || (_game_mode == GM_NORMAL && Company::IsValidHumanID(cid))) return GetString(STR_AI_CONFIG_HUMAN_PLAYER);
if ((_game_mode != GameMode::Normal && cid == 0) || (_game_mode == GameMode::Normal && Company::IsValidHumanID(cid))) return GetString(STR_AI_CONFIG_HUMAN_PLAYER);
if (const AIInfo *info = AIConfig::GetConfig(cid)->GetInfo(); info != nullptr) return info->GetName();
return GetString(STR_AI_CONFIG_RANDOM_AI);
}
@@ -181,10 +181,10 @@ struct AIConfigWindow : public Window {
*/
TextColour GetSlotColour(CompanyID cid, CompanyID max_slot) const
{
if (this->selected_slot == cid) return TC_WHITE;
if (IsEditable(cid)) return cid < max_slot ? TC_ORANGE : TC_SILVER;
if (Company::IsValidAiID(cid)) return TC_GREEN;
return TC_SILVER;
if (this->selected_slot == cid) return TextColour::White;
if (IsEditable(cid)) return cid < max_slot ? TextColour::Orange : TextColour::Silver;
if (Company::IsValidAiID(cid)) return TextColour::Green;
return TextColour::Silver;
}
void DrawWidget(const Rect &r, WidgetID widget) const override
@@ -193,7 +193,7 @@ struct AIConfigWindow : public Window {
case WID_AIC_LIST: {
Rect tr = r.Shrink(WidgetDimensions::scaled.matrix);
int max_slot = GetGameSettings().difficulty.max_no_competitors;
if (_game_mode == GM_NORMAL) {
if (_game_mode == GameMode::Normal) {
for (const Company *c : Company::Iterate()) {
if (c->is_ai) max_slot--;
}
@@ -258,7 +258,8 @@ struct AIConfigWindow : public Window {
case WID_AIC_MOVE_UP:
if (IsEditable(this->selected_slot) && IsEditable(static_cast<CompanyID>(this->selected_slot - 1))) {
std::swap(GetGameSettings().script_config.ai[this->selected_slot], GetGameSettings().script_config.ai[this->selected_slot - 1]);
auto it = std::next(std::begin(GetGameSettings().script_config.ai), this->selected_slot.base());
std::swap(*it, *std::prev(it));
this->selected_slot = static_cast<CompanyID>(this->selected_slot - 1);
this->vscroll->ScrollTowards(this->selected_slot.base());
this->InvalidateData();
@@ -267,7 +268,8 @@ struct AIConfigWindow : public Window {
case WID_AIC_MOVE_DOWN:
if (IsEditable(this->selected_slot) && IsEditable(static_cast<CompanyID>(this->selected_slot + 1))) {
std::swap(GetGameSettings().script_config.ai[this->selected_slot], GetGameSettings().script_config.ai[this->selected_slot + 1]);
auto it = std::next(std::begin(GetGameSettings().script_config.ai), this->selected_slot.base());
std::swap(*it, *std::next(it));
++this->selected_slot;
this->vscroll->ScrollTowards(this->selected_slot.base());
this->InvalidateData();
@@ -291,9 +293,9 @@ struct AIConfigWindow : public Window {
case WID_AIC_CONTENT_DOWNLOAD:
if (!_network_available) {
ShowErrorMessage(GetEncodedString(STR_NETWORK_ERROR_NOTAVAILABLE), {}, WL_ERROR);
ShowErrorMessage(GetEncodedString(STR_NETWORK_ERROR_NOTAVAILABLE), {}, WarningLevel::Error);
} else {
ShowNetworkContentListWindow(nullptr, CONTENT_TYPE_AI);
ShowNetworkContentListWindow(nullptr, ContentType::Ai);
}
break;
}
@@ -324,7 +326,7 @@ struct AIConfigWindow : public Window {
this->SetWidgetDisabledState(WID_AIC_MOVE_DOWN, !IsEditable(this->selected_slot) || !IsEditable(static_cast<CompanyID>(this->selected_slot + 1)));
this->SetWidgetDisabledState(WID_AIC_OPEN_URL, this->selected_slot == CompanyID::Invalid() || config->GetInfo() == nullptr || config->GetInfo()->GetURL().empty());
for (TextfileType tft = TFT_CONTENT_BEGIN; tft < TFT_CONTENT_END; tft++) {
for (TextfileType tft : EnumRange(TFT_CONTENT_BEGIN, TFT_CONTENT_END)) {
this->SetWidgetDisabledState(WID_AIC_TEXTFILE + tft, this->selected_slot == CompanyID::Invalid() || !config->GetTextfile(tft, this->selected_slot).has_value());
}
}
@@ -333,7 +335,7 @@ struct AIConfigWindow : public Window {
/** Open the AI config window. */
void ShowAIConfigWindow()
{
CloseWindowByClass(WC_GAME_OPTIONS);
CloseWindowByClass(WindowClass::GameOptions);
new AIConfigWindow();
}
+1 -1
View File
@@ -5,7 +5,7 @@
* See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see <https://www.gnu.org/licenses/old-licenses/gpl-2.0>.
*/
/** @file ai_gui.hpp %Window for configuring the AIs */
/** @file ai_gui.hpp %Window for configuring the AIs. */
#ifndef AI_GUI_HPP
#define AI_GUI_HPP
+3 -2
View File
@@ -5,7 +5,7 @@
* See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see <https://www.gnu.org/licenses/old-licenses/gpl-2.0>.
*/
/** @file ai_info.cpp Implementation of AIInfo and AILibrary */
/** @file ai_info.cpp Implementation of AIInfo and AILibrary. */
#include "../stdafx.h"
@@ -21,6 +21,7 @@
/**
* Check if the API version provided by the AI is supported.
* @param api_version The API version as provided by the AI.
* @return \c true if the given version is supported by this version of OpenTTD.
*/
static bool CheckAPIVersion(const std::string &api_version)
{
@@ -80,7 +81,7 @@ template <> SQInteger PushClassName<AIInfo, ScriptType::AI>(HSQUIRRELVM vm) { sq
if (info->engine->MethodExists(info->SQ_instance, "GetAPIVersion")) {
if (!info->engine->CallStringMethod(info->SQ_instance, "GetAPIVersion", &info->api_version, MAX_GET_OPS)) return SQ_ERROR;
if (!CheckAPIVersion(info->api_version)) {
Debug(script, 1, "Loading info.nut from ({}.{}): GetAPIVersion returned invalid version", info->GetName(), info->GetVersion());
sq_throwerror(vm, fmt::format("Loading info.nut from ({}.{}): GetAPIVersion returned invalid version", info->GetName(), info->GetVersion()));
return SQ_ERROR;
}
} else {
+15 -2
View File
@@ -15,38 +15,47 @@
/** All static information from an AI like name, version, etc. */
class AIInfo : public ScriptInfo {
public:
/* All valid AI API versions, in order. */
static constexpr std::string_view ApiVersions[]{ "0.7", "1.0", "1.1", "1.2", "1.3", "1.4", "1.5", "1.6", "1.7", "1.8", "1.9", "1.10", "1.11", "12", "13", "14", "15" };
/** All valid AI API versions, in order. */
static constexpr std::string_view ApiVersions[]{ "0.7", "1.0", "1.1", "1.2", "1.3", "1.4", "1.5", "1.6", "1.7", "1.8", "1.9", "1.10", "1.11", "12", "13", "14", "15", "16" };
AIInfo();
/**
* Register the functions of this class.
* @param engine The engine to register to.
*/
static void RegisterAPI(Squirrel &engine);
/**
* Create an AI, using this AIInfo as start-template.
* @param vm The virtual machine to push the instance to.
* @return The number of stack places occupied.
*/
static SQInteger Constructor(HSQUIRRELVM vm);
/**
* Create a dummy-AI.
* @param vm The virtual machine to push the instance to.
* @return The number of stack places occupied.
*/
static SQInteger DummyConstructor(HSQUIRRELVM vm);
/**
* Check if we can start this AI.
* @param version The version to check.
* @return \c true if this script can load the data from that version.
*/
bool CanLoadFromVersion(int version) const;
/**
* Use this AI as a random AI.
* @return \c true when it can be used as random AI, \c false when the user must specifically request it.
*/
bool UseAsRandomAI() const { return this->use_as_random; }
/**
* Get the API version this AI is written for.
* @return The API version.
*/
const std::string &GetAPIVersion() const { return this->api_version; }
@@ -63,16 +72,20 @@ public:
/**
* Register the functions of this class.
* @param engine The engine to register to.
*/
static void RegisterAPI(Squirrel &engine);
/**
* Create an AI, using this AIInfo as start-template.
* @param vm The virtual machine to push the instance to.
* @return The number of stack places occupied.
*/
static SQInteger Constructor(HSQUIRRELVM vm);
/**
* Get the category this library is in.
* @return The category.
*/
const std::string &GetCategory() const { return this->category; }
+4 -4
View File
@@ -55,7 +55,7 @@ void AIInstance::RegisterAPI()
/* Register all classes */
SQAI_RegisterAll(*this->engine);
if (!this->LoadCompatibilityScripts(AI_DIR, AIInfo::ApiVersions)) this->Died();
if (!this->LoadCompatibilityScripts(Subdirectory::Ai, AIInfo::ApiVersions)) this->Died();
}
void AIInstance::Died()
@@ -63,16 +63,16 @@ void AIInstance::Died()
ScriptInstance::Died();
/* Intro is not supposed to use AI, but it may have 'dummy' AI which instant dies. */
if (_game_mode == GM_MENU) return;
if (_game_mode == GameMode::Menu) return;
/* Don't show errors while loading savegame. They will be shown at end of loading anyway. */
if (_switch_mode != SM_NONE) return;
if (_switch_mode != SwitchMode::None) return;
ShowScriptDebugWindow(_current_company);
const AIInfo *info = AIConfig::GetConfig(_current_company)->GetInfo();
if (info != nullptr) {
ShowErrorMessage(GetEncodedString(STR_ERROR_AI_PLEASE_REPORT_CRASH), {}, WL_WARNING);
ShowErrorMessage(GetEncodedString(STR_ERROR_AI_PLEASE_REPORT_CRASH), {}, WarningLevel::Warning);
if (!info->GetURL().empty()) {
ScriptLog::Info("Please report the error to the following URL:");
+2 -2
View File
@@ -5,7 +5,7 @@
* See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see <https://www.gnu.org/licenses/old-licenses/gpl-2.0>.
*/
/** @file ai_scanner.cpp allows scanning AI scripts */
/** @file ai_scanner.cpp Allows scanning AI scripts. */
#include "../stdafx.h"
#include <ranges>
@@ -53,7 +53,7 @@ void AIScannerInfo::RegisterAPI(class Squirrel &engine)
AIInfo *AIScannerInfo::SelectRandomAI() const
{
if (_game_mode == GM_MENU) {
if (_game_mode == GameMode::Menu) {
Debug(script, 0, "The intro game should not use AI, loading 'dummy' AI.");
return this->info_dummy.get();
}
+7 -4
View File
@@ -5,17 +5,18 @@
* See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see <https://www.gnu.org/licenses/old-licenses/gpl-2.0>.
*/
/** @file ai_scanner.hpp declarations of the class for AI scanner */
/** @file ai_scanner.hpp Declarations of the class for AI scanner. */
#ifndef AI_SCANNER_HPP
#define AI_SCANNER_HPP
#include "../script/script_scanner.hpp"
/** AI instantiation of a ScriptScanner. */
class AIScannerInfo : public ScriptScanner {
public:
AIScannerInfo();
~AIScannerInfo();
~AIScannerInfo() override;
void Initialize() override;
@@ -36,13 +37,14 @@ public:
/**
* Set the Dummy AI.
* @param info The new dummy AI.
*/
void SetDummyAI(std::unique_ptr<class AIInfo> &&info);
protected:
std::string GetScriptName(ScriptInfo &info) override;
std::string_view GetFileName() const override { return PATHSEP "info.nut"; }
Subdirectory GetDirectory() const override { return AI_DIR; }
Subdirectory GetDirectory() const override { return Subdirectory::Ai; }
std::string_view GetScannerName() const override { return "AIs"; }
void RegisterAPI(class Squirrel &engine) override;
@@ -50,6 +52,7 @@ private:
std::unique_ptr<AIInfo> info_dummy; ///< The dummy AI.
};
/** AI instantiation of a ScriptScanner for libraries. */
class AIScannerLibrary : public ScriptScanner {
public:
void Initialize() override;
@@ -65,7 +68,7 @@ public:
protected:
std::string GetScriptName(ScriptInfo &info) override;
std::string_view GetFileName() const override { return PATHSEP "library.nut"; }
Subdirectory GetDirectory() const override { return AI_LIBRARY_DIR; }
Subdirectory GetDirectory() const override { return Subdirectory::AiLibrary; }
std::string_view GetScannerName() const override { return "AI Libraries"; }
void RegisterAPI(class Squirrel &engine) override;
};
+14 -12
View File
@@ -33,18 +33,21 @@ enum AircraftSubType : uint8_t {
};
/** Flags for air vehicles; shared with disaster vehicles. */
enum AirVehicleFlags : uint8_t {
VAF_DEST_TOO_FAR = 0, ///< Next destination is too far away.
enum class VehicleAirFlag : uint8_t {
DestinationTooFar = 0, ///< Next destination is too far away.
/* The next two flags are to prevent stair climbing of the aircraft. The idea is that the aircraft
* will ascend or descend multiple flight levels at a time instead of following the contours of the
* landscape at a fixed altitude. This only has effect when there are more than 15 height levels. */
VAF_IN_MAX_HEIGHT_CORRECTION = 1, ///< The vehicle is currently lowering its altitude because it hit the upper bound.
VAF_IN_MIN_HEIGHT_CORRECTION = 2, ///< The vehicle is currently raising its altitude because it hit the lower bound.
InMaximumHeightCorrection = 1, ///< The vehicle is currently lowering its altitude because it hit the upper bound.
InMinimumHeightCorrection = 2, ///< The vehicle is currently raising its altitude because it hit the lower bound.
VAF_HELI_DIRECT_DESCENT = 3, ///< The helicopter is descending directly at its destination (helipad or in front of hangar)
HelicopterDirectDescent = 3, ///< The helicopter is descending directly at its destination (helipad or in front of hangar)
};
/** Bitset of \c VehicleAirFlag elements. */
using VehicleAirFlags = EnumBitSet<VehicleAirFlag, uint8_t>;
static const int ROTOR_Z_OFFSET = 5; ///< Z Offset between helicopter- and rotorsprite.
void HandleAircraftEnterHangar(Aircraft *v);
@@ -69,27 +72,26 @@ struct AircraftCache {
/**
* Aircraft, helicopters, rotors and their shadows belong to this class.
*/
struct Aircraft final : public SpecializedVehicle<Aircraft, VEH_AIRCRAFT> {
struct Aircraft final : public SpecializedVehicle<Aircraft, VehicleType::Aircraft> {
uint16_t crashed_counter = 0; ///< Timer for handling crash animations.
uint8_t pos = 0; ///< Next desired position of the aircraft.
uint8_t previous_pos = 0; ///< Previous desired position of the aircraft.
StationID targetairport = StationID::Invalid(); ///< Airport to go to next.
uint8_t state = 0; ///< State of the airport. @see AirportMovementStates
Direction last_direction = INVALID_DIR;
Direction last_direction = Direction::Invalid;
uint8_t number_consecutive_turns = 0; ///< Protection to prevent the aircraft of making a lot of turns in order to reach a specific point.
uint8_t turn_counter = 0; ///< Ticks between each turn to prevent > 45 degree turns.
uint8_t flags = 0; ///< Aircraft flags. @see AirVehicleFlags
VehicleAirFlags flags{}; ///< Aircraft flags. @see VehicleAirFlags
AircraftCache acache{};
/** We don't want GCC to zero our struct! It already is zeroed and has an index! */
Aircraft() : SpecializedVehicleBase() {}
Aircraft(VehicleID index) : SpecializedVehicleBase(index) {}
/** We want to 'destruct' the right class. */
virtual ~Aircraft() { this->PreDestructor(); }
~Aircraft() override { this->PreDestructor(); }
void MarkDirty() override;
void UpdateDeltaXY() override;
ExpensesType GetExpenseType(bool income) const override { return income ? EXPENSES_AIRCRAFT_REVENUE : EXPENSES_AIRCRAFT_RUN; }
ExpensesType GetExpenseType(bool income) const override { return income ? ExpensesType::AircraftRevenue : ExpensesType::AircraftRun; }
bool IsPrimaryVehicle() const override { return this->IsNormalAircraft(); }
void GetImage(Direction direction, EngineImageType image_type, VehicleSpriteSeq *result) const override;
int GetDisplaySpeed() const override { return this->cur_speed; }
+127 -121
View File
@@ -5,10 +5,7 @@
* See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see <https://www.gnu.org/licenses/old-licenses/gpl-2.0>.
*/
/**
* @file aircraft_cmd.cpp
* This file deals with aircraft and airport movements functionalities
*/
/** @file aircraft_cmd.cpp This file deals with aircraft and airport movements functionalities. */
#include "stdafx.h"
#include "aircraft.h"
@@ -96,8 +93,9 @@ static const SpriteID _aircraft_sprite[] = {
0x0EBD, 0x0EC5
};
/** @copydoc IsValidImageIndex */
template <>
bool IsValidImageIndex<VEH_AIRCRAFT>(uint8_t image_index)
bool IsValidImageIndex<VehicleType::Aircraft>(uint8_t image_index)
{
return image_index < lengthof(_aircraft_sprite);
}
@@ -121,7 +119,7 @@ static StationID FindNearestHangar(const Aircraft *v)
{
uint best = 0;
StationID index = StationID::Invalid();
TileIndex vtile = TileVirtXY(v->x_pos, v->y_pos);
TileIndex vtile = TileVirtXYClampedToMap(v->x_pos, v->y_pos);
const AircraftVehicleInfo *avi = AircraftVehInfo(v->engine_type);
uint max_range = v->acache.cached_max_range_sqr;
@@ -180,8 +178,8 @@ void Aircraft::GetImage(Direction direction, EngineImageType image_type, Vehicle
spritenum = this->GetEngine()->original_image_index;
}
assert(IsValidImageIndex<VEH_AIRCRAFT>(spritenum));
result->Set(direction + _aircraft_sprite[spritenum]);
assert(IsValidImageIndex<VehicleType::Aircraft>(spritenum));
result->Set(to_underlying(direction) + _aircraft_sprite[spritenum]);
}
void GetRotorImage(const Aircraft *v, EngineImageType image_type, VehicleSpriteSeq *result)
@@ -204,14 +202,14 @@ static void GetAircraftIcon(EngineID engine, EngineImageType image_type, Vehicle
uint8_t spritenum = e->VehInfo<AircraftVehicleInfo>().image_index;
if (IsCustomVehicleSpriteNum(spritenum)) {
GetCustomVehicleIcon(engine, DIR_W, image_type, result);
GetCustomVehicleIcon(engine, Direction::W, image_type, result);
if (result->IsValid()) return;
spritenum = e->original_image_index;
}
assert(IsValidImageIndex<VEH_AIRCRAFT>(spritenum));
result->Set(DIR_W + _aircraft_sprite[spritenum]);
assert(IsValidImageIndex<VehicleType::Aircraft>(spritenum));
result->Set(to_underlying(Direction::W) + _aircraft_sprite[spritenum]);
}
void DrawAircraftEngine(int left, int right, int preferred_x, int y, EngineID engine, PaletteID pal, EngineImageType image_type)
@@ -278,11 +276,11 @@ CommandCost CmdBuildAircraft(DoCommandFlags flags, TileIndex tile, const Engine
tile = st->airport.GetHangarTile(st->airport.GetHangarNum(tile));
if (flags.Test(DoCommandFlag::Execute)) {
Aircraft *v = new Aircraft(); // aircraft
Aircraft *u = new Aircraft(); // shadow
Aircraft *v = Aircraft::Create(); // aircraft
Aircraft *u = Aircraft::Create(); // shadow
*ret = v;
v->direction = DIR_SE;
v->direction = Direction::SE;
v->owner = u->owner = _current_company;
@@ -369,9 +367,9 @@ CommandCost CmdBuildAircraft(DoCommandFlags flags, TileIndex tile, const Engine
/* Aircraft with 3 vehicles (chopper)? */
if (v->subtype == AIR_HELICOPTER) {
Aircraft *w = new Aircraft();
Aircraft *w = Aircraft::Create();
w->engine_type = e->index;
w->direction = DIR_N;
w->direction = Direction::N;
w->owner = _current_company;
w->x_pos = v->x_pos;
w->y_pos = v->y_pos;
@@ -429,10 +427,10 @@ static void CheckIfAircraftNeedsService(Aircraft *v)
/* only goto depot if the target airport has a depot */
if (st->airport.HasHangar() && CanVehicleUseStation(v, st)) {
v->current_order.MakeGoToDepot(st->index, OrderDepotTypeFlag::Service);
SetWindowWidgetDirty(WC_VEHICLE_VIEW, v->index, WID_VV_START_STOP);
SetWindowWidgetDirty(WindowClass::VehicleView, v->index, WID_VV_START_STOP);
} else if (v->current_order.IsType(OT_GOTO_DEPOT)) {
v->current_order.MakeDummy();
SetWindowWidgetDirty(WC_VEHICLE_VIEW, v->index, WID_VV_START_STOP);
SetWindowWidgetDirty(WindowClass::VehicleView, v->index, WID_VV_START_STOP);
}
}
@@ -440,7 +438,7 @@ Money Aircraft::GetRunningCost() const
{
const Engine *e = this->GetEngine();
uint cost_factor = GetVehicleProperty(this, PROP_AIRCRAFT_RUNNING_COST_FACTOR, e->VehInfo<AircraftVehicleInfo>().running_cost);
return GetPrice(PR_RUNNING_AIRCRAFT, cost_factor, e->GetGRF());
return GetPrice(Price::RunningAircraft, cost_factor, e->GetGRF());
}
/** Calendar day handler */
@@ -465,15 +463,15 @@ void Aircraft::OnNewEconomyDay()
if (this->running_ticks == 0) return;
CommandCost cost(EXPENSES_AIRCRAFT_RUN, this->GetRunningCost() * this->running_ticks / (CalendarTime::DAYS_IN_YEAR * Ticks::DAY_TICKS));
CommandCost cost(ExpensesType::AircraftRun, this->GetRunningCost() * this->running_ticks / (CalendarTime::DAYS_IN_YEAR * Ticks::DAY_TICKS));
this->profit_this_year -= cost.GetCost();
this->running_ticks = 0;
SubtractMoneyFromCompanyFract(this->owner, cost);
SetWindowDirty(WC_VEHICLE_DETAILS, this->index);
SetWindowClassesDirty(WC_AIRCRAFT_LIST);
SetWindowDirty(WindowClass::VehicleDetails, this->index);
SetWindowClassesDirty(WindowClass::AircraftList);
}
static void HelicopterTickHandler(Aircraft *v)
@@ -506,13 +504,13 @@ static void HelicopterTickHandler(Aircraft *v)
VehicleSpriteSeq seq;
if (spd == 0) {
u->state = HRS_ROTOR_STOPPED;
GetRotorImage(v, EIT_ON_MAP, &seq);
GetRotorImage(v, EngineImageType::OnMap, &seq);
if (u->sprite_cache.sprite_seq == seq) return;
} else if (tick >= spd) {
u->tick_counter = 0;
u->state++;
if (u->state > HRS_ROTOR_MOVING_3) u->state = HRS_ROTOR_MOVING_1;
GetRotorImage(v, EIT_ON_MAP, &seq);
GetRotorImage(v, EngineImageType::OnMap, &seq);
} else {
return;
}
@@ -538,7 +536,7 @@ void SetAircraftPosition(Aircraft *v, int x, int y, int z)
v->UpdatePosition();
v->UpdateViewport(true, false);
if (v->subtype == AIR_HELICOPTER) {
GetRotorImage(v, EIT_ON_MAP, &v->Next()->Next()->sprite_cache.sprite_seq);
GetRotorImage(v, EngineImageType::OnMap, &v->Next()->Next()->sprite_cache.sprite_seq);
}
Aircraft *u = v->Next();
@@ -618,7 +616,7 @@ void UpdateAircraftCache(Aircraft *v, bool update_range)
/* Update aircraft range. */
if (update_range) {
v->acache.cached_max_range = GetVehicleProperty(v, PROP_AIRCRAFT_RANGE, AircraftVehInfo(v->engine_type)->max_range);
v->acache.cached_max_range = Engine::Get(v->engine_type)->GetRange();
/* Squared it now so we don't have to do it later all the time. */
v->acache.cached_max_range_sqr = v->acache.cached_max_range * v->acache.cached_max_range;
}
@@ -685,7 +683,7 @@ static int UpdateAircraftSpeed(Aircraft *v, uint speed_limit = SPEED_LIMIT_NONE,
/* updates statusbar only if speed have changed to save CPU time */
if (spd != v->cur_speed) {
v->cur_speed = spd;
SetWindowWidgetDirty(WC_VEHICLE_VIEW, v->index, WID_VV_START_STOP);
SetWindowWidgetDirty(WindowClass::VehicleView, v->index, WID_VV_START_STOP);
}
/* Adjust distance moved by plane speed setting */
@@ -726,7 +724,7 @@ int GetTileHeightBelowAircraft(const Vehicle *v)
void GetAircraftFlightLevelBounds(const Vehicle *v, int *min_level, int *max_level)
{
int base_altitude = GetTileHeightBelowAircraft(v);
if (v->type == VEH_AIRCRAFT && Aircraft::From(v)->subtype == AIR_HELICOPTER) {
if (v->type == VehicleType::Aircraft && Aircraft::From(v)->subtype == AIR_HELICOPTER) {
base_altitude += HELICOPTER_HOLD_MAX_FLYING_ALTITUDE - PLANE_HOLD_MAX_FLYING_ALTITUDE;
}
@@ -734,10 +732,10 @@ void GetAircraftFlightLevelBounds(const Vehicle *v, int *min_level, int *max_lev
* other by providing them with vertical separation
*/
switch (v->direction) {
case DIR_N:
case DIR_NE:
case DIR_E:
case DIR_SE:
case Direction::N:
case Direction::NE:
case Direction::E:
case Direction::SE:
base_altitude += 10;
break;
@@ -781,24 +779,24 @@ int GetAircraftFlightLevel(T *v, bool takeoff)
int z = v->z_pos;
if (z < aircraft_min_altitude ||
(HasBit(v->flags, VAF_IN_MIN_HEIGHT_CORRECTION) && z < aircraft_middle_altitude)) {
(v->flags.Test(VehicleAirFlag::InMinimumHeightCorrection) && z < aircraft_middle_altitude)) {
/* Ascend. And don't fly into that mountain right ahead.
* And avoid our aircraft become a stairclimber, so if we start
* correcting altitude, then we stop correction not too early. */
SetBit(v->flags, VAF_IN_MIN_HEIGHT_CORRECTION);
v->flags.Set(VehicleAirFlag::InMinimumHeightCorrection);
z += takeoff ? 2 : 1;
} else if (!takeoff && (z > aircraft_max_altitude ||
(HasBit(v->flags, VAF_IN_MAX_HEIGHT_CORRECTION) && z > aircraft_middle_altitude))) {
(v->flags.Test(VehicleAirFlag::InMaximumHeightCorrection) && z > aircraft_middle_altitude))) {
/* Descend lower. You are an aircraft, not an space ship.
* And again, don't stop correcting altitude too early. */
SetBit(v->flags, VAF_IN_MAX_HEIGHT_CORRECTION);
v->flags.Set(VehicleAirFlag::InMaximumHeightCorrection);
z--;
} else if (HasBit(v->flags, VAF_IN_MIN_HEIGHT_CORRECTION) && z >= aircraft_middle_altitude) {
} else if (v->flags.Test(VehicleAirFlag::InMinimumHeightCorrection) && z >= aircraft_middle_altitude) {
/* Now, we have corrected altitude enough. */
ClrBit(v->flags, VAF_IN_MIN_HEIGHT_CORRECTION);
} else if (HasBit(v->flags, VAF_IN_MAX_HEIGHT_CORRECTION) && z <= aircraft_middle_altitude) {
v->flags.Reset(VehicleAirFlag::InMinimumHeightCorrection);
} else if (v->flags.Test(VehicleAirFlag::InMaximumHeightCorrection) && z <= aircraft_middle_altitude) {
/* Now, we have corrected altitude enough. */
ClrBit(v->flags, VAF_IN_MAX_HEIGHT_CORRECTION);
v->flags.Reset(VehicleAirFlag::InMaximumHeightCorrection);
}
return z;
@@ -843,13 +841,13 @@ static uint8_t AircraftGetEntryPoint(const Aircraft *v, const AirportFTAClass *a
DiagDirection dir;
if (abs(delta_y) < abs(delta_x)) {
/* We are northeast or southwest of the airport */
dir = delta_x < 0 ? DIAGDIR_NE : DIAGDIR_SW;
dir = delta_x < 0 ? DiagDirection::NE : DiagDirection::SW;
} else {
/* We are northwest or southeast of the airport */
dir = delta_y < 0 ? DIAGDIR_NW : DIAGDIR_SE;
dir = delta_y < 0 ? DiagDirection::NW : DiagDirection::SE;
}
dir = ChangeDiagDir(dir, DiagDirDifference(DIAGDIR_NE, DirToDiagDir(rotation)));
return apc->entry_points[dir];
dir = ChangeDiagDir(dir, DiagDirDifference(DiagDirection::NE, DirToDiagDir(rotation)));
return apc->entry_points[to_underlying(dir)];
}
@@ -868,7 +866,7 @@ static bool AircraftController(Aircraft *v)
const Station *st = Station::GetIfValid(v->targetairport);
/* INVALID_TILE if there is no station */
TileIndex tile = INVALID_TILE;
Direction rotation = DIR_N;
Direction rotation = Direction::N;
uint size_x = 1, size_y = 1;
if (st != nullptr) {
if (st->airport.tile != INVALID_TILE) {
@@ -887,7 +885,7 @@ static bool AircraftController(Aircraft *v)
if (st == nullptr || st->airport.tile == INVALID_TILE) {
/* Jump into our "holding pattern" state machine if possible */
if (v->pos >= afc->nofelements) {
v->pos = v->previous_pos = AircraftGetEntryPoint(v, afc, DIR_N);
v->pos = v->previous_pos = AircraftGetEntryPoint(v, afc, Direction::N);
} else if (v->targetairport != v->current_order.GetDestination()) {
/* If not possible, just get out of here fast */
v->state = FLYING;
@@ -943,7 +941,7 @@ static bool AircraftController(Aircraft *v)
/* Helicopter landing. */
if (amd.flags.Test(AirportMovingDataFlag::HeliLower)) {
SetBit(v->flags, VAF_HELI_DIRECT_DESCENT);
v->flags.Set(VehicleAirFlag::HelicopterDirectDescent);
if (st == nullptr) {
v->state = FLYING;
@@ -970,7 +968,7 @@ static bool AircraftController(Aircraft *v)
/* Increase speed of rotors. When speed is 80, we've landed. */
if (u->cur_speed >= 80) {
ClrBit(v->flags, VAF_HELI_DIRECT_DESCENT);
v->flags.Reset(VehicleAirFlag::HelicopterDirectDescent);
return true;
}
u->cur_speed += 4;
@@ -999,14 +997,14 @@ static bool AircraftController(Aircraft *v)
DirDiff dirdiff = DirDifference(amd.direction, v->direction);
/* if distance is 0, and plane points in right direction, no point in calling
* UpdateAircraftSpeed(). So do it only afterwards */
if (dirdiff == DIRDIFF_SAME) {
if (dirdiff == DirDiff::Same) {
v->cur_speed = 0;
return true;
}
if (!UpdateAircraftSpeed(v, SPEED_LIMIT_TAXI)) return false;
v->direction = ChangeDir(v->direction, dirdiff > DIRDIFF_REVERSE ? DIRDIFF_45LEFT : DIRDIFF_45RIGHT);
v->direction = ChangeDir(v->direction, LimitDirDiff(dirdiff));
v->cur_speed >>= 1;
SetAircraftPosition(v, v->x_pos, v->y_pos, v->z_pos);
@@ -1184,6 +1182,7 @@ static bool AircraftController(Aircraft *v)
/**
* Handle crashed aircraft \a v.
* @param v Crashed aircraft.
* @return \c false iff the aircraft has been deleted.
*/
static bool HandleCrashedAircraft(Aircraft *v)
{
@@ -1208,7 +1207,7 @@ static bool HandleCrashedAircraft(Aircraft *v)
uint32_t r;
if (Chance16R(1, 32, r)) {
static const DirDiff delta[] = {
DIRDIFF_45LEFT, DIRDIFF_SAME, DIRDIFF_SAME, DIRDIFF_45RIGHT
DirDiff::Left45, DirDiff::Same, DirDiff::Same, DirDiff::Right45
};
v->direction = ChangeDir(v->direction, delta[GB(r, 16, 2)]);
@@ -1224,7 +1223,7 @@ static bool HandleCrashedAircraft(Aircraft *v)
/* remove rubble of crashed airplane */
/* clear runway-in on all airports, set by crashing plane
* small airports use AIRPORT_BUSY, city airports use AirportBlock::RunwayInOut, etc.
* small airports use AirportBlock::AirportBusy, city airports use AirportBlock::RunwayInOut, etc.
* but they all share the same number */
if (st != nullptr) {
st->airport.blocks.Reset(AirportBlock::RunwayIn);
@@ -1248,19 +1247,16 @@ static bool HandleCrashedAircraft(Aircraft *v)
*/
static void HandleAircraftSmoke(Aircraft *v, bool mode)
{
static const struct {
int8_t x;
int8_t y;
} smoke_pos[] = {
{ 5, 5 },
{ 6, 0 },
{ 5, -5 },
{ 0, -6 },
{ -5, -5 },
{ -6, 0 },
{ -5, 5 },
{ 0, 6 }
};
static constexpr DirectionIndexArray<Coord2D<int8_t>> smoke_pos{{{
{ 5, 5},
{ 6, 0},
{ 5, -5},
{ 0, -6},
{-5, -5},
{-6, 0},
{-5, 5},
{ 0, 6},
}}};
if (!v->vehstatus.Test(VehState::AircraftBroken)) return;
@@ -1301,9 +1297,8 @@ void HandleMissingAircraftOrders(Aircraft *v)
*/
const Station *st = GetTargetAirportIfValid(v);
if (st == nullptr) {
Backup<CompanyID> cur_company(_current_company, v->owner);
CommandCost ret = Command<CMD_SEND_VEHICLE_TO_DEPOT>::Do(DoCommandFlag::Execute, v->index, DepotCommandFlag{}, {});
cur_company.Restore();
AutoRestoreBackup cur_company(_current_company, v->owner);
CommandCost ret = Command<Commands::SendVehicleToDepot>::Do(DoCommandFlag::Execute, v->index, DepotCommandFlag{}, {});
if (ret.Failed()) CrashAirplane(v);
} else if (!v->current_order.IsType(OT_GOTO_DEPOT)) {
@@ -1328,7 +1323,7 @@ void Aircraft::MarkDirty()
this->colourmap = PAL_NONE;
this->UpdateViewport(true, false);
if (this->subtype == AIR_HELICOPTER) {
GetRotorImage(this, EIT_ON_MAP, &this->Next()->Next()->sprite_cache.sprite_seq);
GetRotorImage(this, EngineImageType::OnMap, &this->Next()->Next()->sprite_cache.sprite_seq);
}
}
@@ -1354,7 +1349,7 @@ static void CrashAirplane(Aircraft *v)
v->cargo.Truncate();
v->Next()->cargo.Truncate();
const Station *st = GetTargetAirportIfValid(v);
TileIndex vt = TileVirtXY(v->x_pos, v->y_pos);
TileIndex vt = TileVirtXYClampedToMap(v->x_pos, v->y_pos);
EncodedString headline;
if (st == nullptr) {
@@ -1420,8 +1415,8 @@ static void AircraftEntersTerminal(Aircraft *v)
v->last_station_visited = v->targetairport;
/* Check if station was ever visited before */
if (!(st->had_vehicle_of_type & HVOT_AIRCRAFT)) {
st->had_vehicle_of_type |= HVOT_AIRCRAFT;
if (!st->had_vehicle_of_type.Test(StationVehicleType::Aircraft)) {
st->had_vehicle_of_type.Set(StationVehicleType::Aircraft);
/* show newsitem of celebrating citizens */
AddVehicleNewsItem(
GetEncodedString(STR_NEWS_FIRST_AIRCRAFT_ARRIVAL, st->index),
@@ -1456,7 +1451,10 @@ static void AircraftLandAirplane(Aircraft *v)
}
/** set the right pos when heading to other airports after takeoff */
/**
* Set the right pos when heading to other airports after takeoff
* @param v The aircraft to consider.
*/
void AircraftNextAirportPos_and_Order(Aircraft *v)
{
if (v->current_order.IsType(OT_GOTO_STATION) || v->current_order.IsType(OT_GOTO_DEPOT)) {
@@ -1465,7 +1463,7 @@ void AircraftNextAirportPos_and_Order(Aircraft *v)
const Station *st = GetTargetAirportIfValid(v);
const AirportFTAClass *apc = st == nullptr ? GetAirport(AT_DUMMY) : st->airport.GetFTA();
Direction rotation = st == nullptr ? DIR_N : st->airport.rotation;
Direction rotation = st == nullptr ? Direction::N : st->airport.rotation;
v->pos = v->previous_pos = AircraftGetEntryPoint(v, apc, rotation);
}
@@ -1499,35 +1497,29 @@ void AircraftLeaveHangar(Aircraft *v, Direction exit_dir)
VehicleServiceInDepot(v);
v->LeaveUnbunchingDepot();
SetAircraftPosition(v, v->x_pos, v->y_pos, v->z_pos);
InvalidateWindowData(WC_VEHICLE_DEPOT, v->tile);
SetWindowClassesDirty(WC_AIRCRAFT_LIST);
InvalidateWindowData(WindowClass::VehicleDepot, v->tile);
SetWindowClassesDirty(WindowClass::AircraftList);
}
////////////////////////////////////////////////////////////////////////////////
/////////////////// AIRCRAFT MOVEMENT SCHEME ////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
/** Aircraft arrives at the terminal. @copydoc AircraftStateHandler */
static void AircraftEventHandler_EnterTerminal(Aircraft *v, const AirportFTAClass *apc)
{
AircraftEntersTerminal(v);
v->state = apc->layout[v->pos].heading;
}
/**
* Aircraft arrived in an airport hangar.
* @param v Aircraft in the hangar.
* @param apc Airport description containing the hangar.
*/
/** Aircraft arrived in an airport hangar. @copydoc AircraftStateHandler */
static void AircraftEventHandler_EnterHangar(Aircraft *v, const AirportFTAClass *apc)
{
VehicleEnterDepot(v);
v->state = apc->layout[v->pos].heading;
}
/**
* Handle aircraft movement/decision making in an airport hangar.
* @param v Aircraft in the hangar.
* @param apc Airport description containing the hangar.
*/
/** Handle aircraft movement/decision making in an airport hangar. @copydoc AircraftStateHandler */
static void AircraftEventHandler_InHangar(Aircraft *v, const AirportFTAClass *apc)
{
/* if we just arrived, execute EnterHangar first */
@@ -1576,7 +1568,7 @@ static void AircraftEventHandler_InHangar(Aircraft *v, const AirportFTAClass *ap
AirportMove(v, apc);
}
/** At one of the Airport's Terminals */
/** At one of the Airport's Terminals. @copydoc AircraftStateHandler */
static void AircraftEventHandler_AtTerminal(Aircraft *v, const AirportFTAClass *apc)
{
/* if we just arrived, execute EnterTerminal first */
@@ -1591,7 +1583,7 @@ static void AircraftEventHandler_AtTerminal(Aircraft *v, const AirportFTAClass *
v->date_of_last_service_newgrf = TimerGameCalendar::date;
v->breakdowns_since_last_service = 0;
v->reliability = v->GetEngine()->reliability;
SetWindowDirty(WC_VEHICLE_DETAILS, v->index);
SetWindowDirty(WindowClass::VehicleDetails, v->index);
}
}
return;
@@ -1631,31 +1623,30 @@ static void AircraftEventHandler_AtTerminal(Aircraft *v, const AirportFTAClass *
AirportMove(v, apc);
}
static void AircraftEventHandler_General(Aircraft *, const AirportFTAClass *)
{
FatalError("OK, you shouldn't be here, check your Airport Scheme!");
}
static void AircraftEventHandler_TakeOff(Aircraft *v, const AirportFTAClass *)
/** Aircraft is taking off (rolling). @copydoc AircraftStateHandler */
static void AircraftEventHandler_TakeOff(Aircraft *v, [[maybe_unused]] const AirportFTAClass *apc)
{
PlayAircraftSound(v); // play takeoffsound for airplanes
v->state = STARTTAKEOFF;
}
static void AircraftEventHandler_StartTakeOff(Aircraft *v, const AirportFTAClass *)
/** Aircraft is taking off (rotation). @copydoc AircraftStateHandler */
static void AircraftEventHandler_StartTakeOff(Aircraft *v, [[maybe_unused]] const AirportFTAClass *apc)
{
v->state = ENDTAKEOFF;
v->UpdateDeltaXY();
}
static void AircraftEventHandler_EndTakeOff(Aircraft *v, const AirportFTAClass *)
/** Aircraft has taken off. @copydoc AircraftStateHandler */
static void AircraftEventHandler_EndTakeOff(Aircraft *v, [[maybe_unused]] const AirportFTAClass *apc)
{
v->state = FLYING;
/* get the next position to go to, differs per airport */
AircraftNextAirportPos_and_Order(v);
}
static void AircraftEventHandler_HeliTakeOff(Aircraft *v, const AirportFTAClass *)
/** Helicopter takes off. @copydoc AircraftStateHandler */
static void AircraftEventHandler_HeliTakeOff(Aircraft *v, [[maybe_unused]] const AirportFTAClass *apc)
{
v->state = FLYING;
v->UpdateDeltaXY();
@@ -1665,12 +1656,12 @@ static void AircraftEventHandler_HeliTakeOff(Aircraft *v, const AirportFTAClass
/* Send the helicopter to a hangar if needed for replacement */
if (v->NeedsAutomaticServicing()) {
Backup<CompanyID> cur_company(_current_company, v->owner);
Command<CMD_SEND_VEHICLE_TO_DEPOT>::Do(DoCommandFlag::Execute, v->index, DepotCommandFlag::Service, {});
cur_company.Restore();
AutoRestoreBackup cur_company(_current_company, v->owner);
Command<Commands::SendVehicleToDepot>::Do(DoCommandFlag::Execute, v->index, DepotCommandFlag::Service, {});
}
}
/** Aircraft is flying around. @copydoc AircraftStateHandler */
static void AircraftEventHandler_Flying(Aircraft *v, const AirportFTAClass *apc)
{
Station *st = Station::Get(v->targetairport);
@@ -1691,7 +1682,7 @@ static void AircraftEventHandler_Flying(Aircraft *v, const AirportFTAClass *apc)
uint16_t tsubspeed = v->subspeed;
if (!AirportHasBlock(v, current, apc)) {
v->state = landingtype; // LANDING / HELILANDING
if (v->state == HELILANDING) SetBit(v->flags, VAF_HELI_DIRECT_DESCENT);
if (v->state == HELILANDING) v->flags.Set(VehicleAirFlag::HelicopterDirectDescent);
/* it's a bit dirty, but I need to set position to next position, otherwise
* if there are multiple runways, plane won't know which one it took (because
* they all have heading LANDING). And also occupy that block! */
@@ -1709,25 +1700,27 @@ static void AircraftEventHandler_Flying(Aircraft *v, const AirportFTAClass *apc)
v->pos = apc->layout[v->pos].next_position;
}
static void AircraftEventHandler_Landing(Aircraft *v, const AirportFTAClass *)
/** Aircraft is landing (touchdown). @copydoc AircraftStateHandler */
static void AircraftEventHandler_Landing(Aircraft *v, [[maybe_unused]] const AirportFTAClass *apc)
{
v->state = ENDLANDING;
AircraftLandAirplane(v); // maybe crash airplane
/* check if the aircraft needs to be replaced or renewed and send it to a hangar if needed */
if (v->NeedsAutomaticServicing()) {
Backup<CompanyID> cur_company(_current_company, v->owner);
Command<CMD_SEND_VEHICLE_TO_DEPOT>::Do(DoCommandFlag::Execute, v->index, DepotCommandFlag::Service, {});
cur_company.Restore();
AutoRestoreBackup cur_company(_current_company, v->owner);
Command<Commands::SendVehicleToDepot>::Do(DoCommandFlag::Execute, v->index, DepotCommandFlag::Service, {});
}
}
static void AircraftEventHandler_HeliLanding(Aircraft *v, const AirportFTAClass *)
/** Helicopter is starting to land. @copydoc AircraftStateHandler */
static void AircraftEventHandler_HeliLanding(Aircraft *v, [[maybe_unused]] const AirportFTAClass *apc)
{
v->state = HELIENDLANDING;
v->UpdateDeltaXY();
}
/** Aircraft is has landed. @copydoc AircraftStateHandler */
static void AircraftEventHandler_EndLanding(Aircraft *v, const AirportFTAClass *apc)
{
/* next block busy, don't do a thing, just wait */
@@ -1741,9 +1734,9 @@ static void AircraftEventHandler_EndLanding(Aircraft *v, const AirportFTAClass *
if (AirportFindFreeTerminal(v, apc)) return;
}
v->state = HANGAR;
}
/** Helicopter has landed. @copydoc AircraftStateHandler */
static void AircraftEventHandler_HeliEndLanding(Aircraft *v, const AirportFTAClass *apc)
{
/* next block busy, don't do a thing, just wait */
@@ -1767,10 +1760,11 @@ static void AircraftEventHandler_HeliEndLanding(Aircraft *v, const AirportFTACla
* @param v Aircraft to handle.
* @param apc Airport state machine.
*/
typedef void AircraftStateHandler(Aircraft *v, const AirportFTAClass *apc);
using AircraftStateHandler = void(Aircraft *v, const AirportFTAClass *apc);
/** Array of handler functions for each target of the aircraft. */
static AircraftStateHandler * const _aircraft_state_handlers[] = {
AircraftEventHandler_General, // TO_ALL = 0
[](Aircraft *, const AirportFTAClass *) { NOT_REACHED(); }, // TO_ALL = 0
AircraftEventHandler_InHangar, // HANGAR = 1
AircraftEventHandler_AtTerminal, // TERM1 = 2
AircraftEventHandler_AtTerminal, // TERM2 = 3
@@ -1868,7 +1862,13 @@ static bool AirportMove(Aircraft *v, const AirportFTAClass *apc)
NOT_REACHED();
}
/** returns true if the road ahead is busy, eg. you must wait before proceeding. */
/**
* Checks whether the next block the aircraft wants to travel on is busy.
* @param v The aircraft to consider.
* @param current_pos The current position in the state machine the aircraft is at.
* @param apc The airport's state machine.
* @return \c true iff the road ahead is busy, eg. you must wait before proceeding.
*/
static bool AirportHasBlock(Aircraft *v, const AirportFTA *current_pos, const AirportFTAClass *apc)
{
const AirportFTA *reference = &apc->layout[v->pos];
@@ -2075,9 +2075,9 @@ static bool AirportFindFreeHelipad(Aircraft *v, const AirportFTAClass *apc)
static void AircraftHandleDestTooFar(Aircraft *v, bool too_far)
{
if (too_far) {
if (!HasBit(v->flags, VAF_DEST_TOO_FAR)) {
SetBit(v->flags, VAF_DEST_TOO_FAR);
SetWindowWidgetDirty(WC_VEHICLE_VIEW, v->index, WID_VV_START_STOP);
if (!v->flags.Test(VehicleAirFlag::DestinationTooFar)) {
v->flags.Set(VehicleAirFlag::DestinationTooFar);
SetWindowWidgetDirty(WindowClass::VehicleView, v->index, WID_VV_START_STOP);
AI::NewEvent(v->owner, new ScriptEventAircraftDestTooFar(v->index));
if (v->owner == _local_company) {
/* Post a news message. */
@@ -2087,14 +2087,20 @@ static void AircraftHandleDestTooFar(Aircraft *v, bool too_far)
return;
}
if (HasBit(v->flags, VAF_DEST_TOO_FAR)) {
if (v->flags.Test(VehicleAirFlag::DestinationTooFar)) {
/* Not too far anymore, clear flag and message. */
ClrBit(v->flags, VAF_DEST_TOO_FAR);
SetWindowWidgetDirty(WC_VEHICLE_VIEW, v->index, WID_VV_START_STOP);
v->flags.Reset(VehicleAirFlag::DestinationTooFar);
SetWindowWidgetDirty(WindowClass::VehicleView, v->index, WID_VV_START_STOP);
DeleteVehicleNews(v->index, AdviceType::AircraftDestinationTooFar);
}
}
/**
* Event handler loop for a single aircraft.
* @param v Aircraft to process events for.
* @param loop How many times has this been called during this tick.
* @return \c true iff another loop can take place, i.e. the vehicle still exists.
*/
static bool AircraftEventHandler(Aircraft *v, int loop)
{
if (v->vehstatus.Test(VehState::Crashed)) {
@@ -2126,7 +2132,7 @@ static bool AircraftEventHandler(Aircraft *v, int loop)
}
}
if (!HasBit(v->flags, VAF_DEST_TOO_FAR)) AirportGoToNextPosition(v);
if (!v->flags.Test(VehicleAirFlag::DestinationTooFar)) AirportGoToNextPosition(v);
return true;
}
@@ -2135,7 +2141,7 @@ bool Aircraft::Tick()
{
if (!this->IsNormalAircraft()) return true;
PerformanceAccumulator framerate(PFE_GL_AIRCRAFT);
PerformanceAccumulator framerate(PerformanceElement::GameLoopAircraft);
this->tick_counter++;
@@ -2162,7 +2168,7 @@ bool Aircraft::Tick()
*/
Station *GetTargetAirportIfValid(const Aircraft *v)
{
assert(v->type == VEH_AIRCRAFT);
assert(v->type == VehicleType::Aircraft);
Station *st = Station::GetIfValid(v->targetairport);
if (st == nullptr) return nullptr;
@@ -2178,7 +2184,7 @@ void UpdateAirplanesOnNewStation(const Station *st)
{
/* only 1 station is updated per function call, so it is enough to get entry_point once */
const AirportFTAClass *ap = st->airport.GetFTA();
Direction rotation = st->airport.tile == INVALID_TILE ? DIR_N : st->airport.rotation;
Direction rotation = st->airport.tile == INVALID_TILE ? Direction::N : st->airport.rotation;
for (Aircraft *v : Aircraft::Iterate()) {
if (!v->IsNormalAircraft() || v->targetairport != st->index) continue;
@@ -2190,7 +2196,7 @@ void UpdateAirplanesOnNewStation(const Station *st)
if (o->IsType(OT_GOTO_DEPOT) && !o->GetDepotOrderType().Test(OrderDepotTypeFlag::PartOfOrders) && o->GetDestination() == st->index &&
(!st->airport.HasHangar() || !CanVehicleUseStation(v, st))) {
o->MakeDummy();
SetWindowWidgetDirty(WC_VEHICLE_VIEW, v->index, WID_VV_START_STOP);
SetWindowWidgetDirty(WindowClass::VehicleView, v->index, WID_VV_START_STOP);
}
v->pos = v->previous_pos = AircraftGetEntryPoint(v, ap, rotation);
UpdateAircraftCache(v);
+6 -5
View File
@@ -34,14 +34,14 @@ void DrawAircraftDetails(const Aircraft *v, const Rect &r)
for (const Aircraft *u = v; u != nullptr; u = u->Next()) {
if (u->IsNormalAircraft()) {
DrawString(r.left, r.right, y, GetString(STR_VEHICLE_INFO_BUILT_VALUE, PackEngineNameDParam(u->engine_type, EngineNameContext::VehicleDetails), u->build_year, u->value));
y += GetCharacterHeight(FS_NORMAL);
y += GetCharacterHeight(FontSize::Normal);
if (u->Next()->cargo_cap != 0) {
DrawString(r.left, r.right, y, GetString(STR_VEHICLE_INFO_CAPACITY_CAPACITY, u->cargo_type, u->cargo_cap, u->Next()->cargo_type, u->Next()->cargo_cap, GetCargoSubtypeText(u)));
} else {
DrawString(r.left, r.right, y, GetString(STR_VEHICLE_INFO_CAPACITY, u->cargo_type, u->cargo_cap, GetCargoSubtypeText(u)));
}
y += GetCharacterHeight(FS_NORMAL) + WidgetDimensions::scaled.vsep_normal;
y += GetCharacterHeight(FontSize::Normal) + WidgetDimensions::scaled.vsep_normal;
}
if (u->cargo_cap != 0) {
@@ -50,7 +50,7 @@ void DrawAircraftDetails(const Aircraft *v, const Rect &r)
if (cargo_count != 0) {
/* Cargo names (fix pluralness) */
DrawString(r.left, r.right, y, GetString(STR_VEHICLE_DETAILS_CARGO_FROM, u->cargo_type, cargo_count, u->cargo.GetFirstStation()));
y += GetCharacterHeight(FS_NORMAL);
y += GetCharacterHeight(FontSize::Normal);
feeder_share += u->cargo.GetFeederShare();
}
}
@@ -66,13 +66,14 @@ void DrawAircraftDetails(const Aircraft *v, const Rect &r)
* @param v Front vehicle
* @param r Rect to draw at
* @param selection Selected vehicle to draw a frame around
* @param image_type Context where the image is being drawn.
*/
void DrawAircraftImage(const Vehicle *v, const Rect &r, VehicleID selection, EngineImageType image_type)
{
bool rtl = _current_text_dir == TD_RTL;
VehicleSpriteSeq seq;
v->GetImage(rtl ? DIR_E : DIR_W, image_type, &seq);
v->GetImage(rtl ? Direction::E : Direction::W, image_type, &seq);
Rect rect;
seq.GetBounds(&rect);
@@ -111,6 +112,6 @@ void DrawAircraftImage(const Vehicle *v, const Rect &r, VehicleID selection, Eng
x += x_offs;
y += UnScaleGUI(rect.top) - heli_offs;
Rect hr = {x, y, x + width - 1, y + UnScaleGUI(rect.Height()) + heli_offs - 1};
DrawFrameRect(hr.Expand(WidgetDimensions::scaled.bevel), COLOUR_WHITE, FrameFlag::BorderOnly);
DrawFrameRect(hr.Expand(WidgetDimensions::scaled.bevel), Colours::White, FrameFlag::BorderOnly);
}
}
+7 -5
View File
@@ -82,24 +82,24 @@ AirportMovingData RotateAirportMovingData(const AirportMovingData *orig, Directi
{
AirportMovingData amd;
amd.flags = orig->flags;
amd.direction = ChangeDir(orig->direction, (DirDiff)rotation);
amd.direction = ChangeDir(orig->direction, static_cast<DirDiff>(rotation));
switch (rotation) {
case DIR_N:
case Direction::N:
amd.x = orig->x;
amd.y = orig->y;
break;
case DIR_E:
case Direction::E:
amd.x = orig->y;
amd.y = num_tiles_y * TILE_SIZE - orig->x - 1;
break;
case DIR_S:
case Direction::S:
amd.x = num_tiles_x * TILE_SIZE - orig->x - 1;
amd.y = num_tiles_y * TILE_SIZE - orig->y - 1;
break;
case DIR_W:
case Direction::W:
amd.x = num_tiles_x * TILE_SIZE - orig->y - 1;
amd.y = orig->x;
break;
@@ -134,6 +134,8 @@ AirportFTAClass::AirportFTAClass(
* Get the number of elements of a source Airport state automata
* Since it is actually just a big array of AirportFTA types, we only
* know one element from the other by differing 'position' identifiers
* @param apFA The state machine builder.
* @return The number of elements.
*/
static uint16_t AirportGetNofElements(const AirportFTAbuildup *apFA)
{
+29 -25
View File
@@ -5,7 +5,7 @@
* See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see <https://www.gnu.org/licenses/old-licenses/gpl-2.0>.
*/
/** @file airport.h Various declarations for airports */
/** @file airport.h Various declarations for airports. */
#ifndef AIRPORT_H
#define AIRPORT_H
@@ -56,6 +56,7 @@ enum class AirportMovingDataFlag : uint8_t {
Hold, ///< Holding pattern movement (above the airport).
};
/** Bitset of \c AirportMovingDataFlag elements. */
using AirportMovingDataFlags = EnumBitSet<AirportMovingDataFlag, uint16_t>;
/** Movement States on Airports (headings target) */
@@ -96,40 +97,41 @@ enum class AirportBlock : uint8_t {
Term6 = 5, ///< Block belonging to terminal 6.
Helipad1 = 6, ///< Block belonging to helipad 1.
Helipad2 = 7, ///< Block belonging to helipad 2.
RunwayInOut = 8,
RunwayIn = 8,
AirportBusy = 8,
RunwayOut = 9,
TaxiwayBusy = 10,
OutWay = 11,
InWay = 12,
AirportEntrance = 13,
TermGroup1 = 14,
TermGroup2 = 15,
Hangar2Area = 16,
TermGroup2Enter1 = 17,
TermGroup2Enter2 = 18,
TermGroup2Exit1 = 19,
TermGroup2Exit2 = 20,
PreHelipad = 21,
RunwayInOut = 8, ///< Runway used for landing and take-off (commuter / city airports).
RunwayIn = 8, ///< Runway used for landing (metropolitan / international / intercontinental airports).
AirportBusy = 8, ///< Complete airport is busy (small airport / heliport).
RunwayOut = 9, ///< Runway used for take off.
TaxiwayBusy = 10, ///< Taxiway is occupied (commuter / city airports / helistation).
OutWay = 11, ///< Holding point just before take off.
InWay = 12, ///< Holding point just after take off.
AirportEntrance = 13, ///< Entrance point before terminals.
TermGroup1 = 14, ///< First set of terminals.
TermGroup2 = 15, ///< Second set of terminals.
Hangar2Area = 16, ///< Area in front of the second hangar.
TermGroup2Enter1 = 17, ///< First holding point before terminal.
TermGroup2Enter2 = 18, ///< Second holding point before terminal.
TermGroup2Exit1 = 19, ///< First holding point after terminal.
TermGroup2Exit2 = 20, ///< Second holding point after terminal.
PreHelipad = 21, ///< Holding point for helicopter landings.
/* blocks for new airports */
Term7 = 22, ///< Block belonging to terminal 7.
Term8 = 23, ///< Block belonging to terminal 8.
Helipad3 = 24, ///< Block belonging to helipad 3.
Hangar1Area = 26,
OutWay2 = 27,
InWay2 = 28,
RunwayIn2 = 29,
RunwayOut2 = 10, ///< @note re-uses #AirportBlock::TaxiwayBusy
HelipadGroup = 13, ///< @note re-uses #AirportBlock::AirportEntrance
OutWay3 = 31,
Hangar1Area = 26, ///< Area in front of the first hangar.
OutWay2 = 27, ///< Second holding point just before take off.
InWay2 = 28, ///< Second holding point just after take off.
RunwayIn2 = 29, ///< Second runway for landing.
RunwayOut2 = 10, ///< Second runway for take off. @note re-uses #AirportBlock::TaxiwayBusy
OutWay3 = 31, ///< Third holding point just before take off.
/* end of new blocks */
Nothing = 30,
Nothing = 30, ///< Nothing is blocked, for example being in the hanger.
Zeppeliner = 62, ///< Block for the zeppeliner disaster vehicle.
AirportClosed = 63, ///< Dummy block for indicating a closed airport.
};
/** Bitset of \c AirportBlock elements. */
using AirportBlocks = EnumBitSet<AirportBlock, uint64_t>;
/** A single location on an airport where aircraft can move to. */
@@ -164,6 +166,8 @@ public:
Helicopters = 1, ///< Can helicopters land on this airport type?
ShortStrip = 2, ///< This airport has a short landing strip, dangerous for fast aircraft.
};
/** Bitset of \c Flag elements. */
using Flags = EnumBitSet<Flag, uint8_t>;
AirportFTAClass(
+62 -57
View File
@@ -73,9 +73,9 @@ static void PlaceAirport(TileIndex tile)
auto proc = [=](bool test, StationID to_join) -> bool {
if (test) {
return Command<CMD_BUILD_AIRPORT>::Do(CommandFlagsToDCFlags(GetCommandFlags<CMD_BUILD_AIRPORT>()), tile, airport_type, layout, StationID::Invalid(), adjacent).Succeeded();
return Command<Commands::BuildAirport>::Do(CommandFlagsToDCFlags(GetCommandFlags<Commands::BuildAirport>()), tile, airport_type, layout, StationID::Invalid(), adjacent).Succeeded();
} else {
return Command<CMD_BUILD_AIRPORT>::Post(STR_ERROR_CAN_T_BUILD_AIRPORT_HERE, CcBuildAirport, tile, airport_type, layout, to_join, adjacent);
return Command<Commands::BuildAirport>::Post(STR_ERROR_CAN_T_BUILD_AIRPORT_HERE, CcBuildAirport, tile, airport_type, layout, to_join, adjacent);
}
};
@@ -84,7 +84,7 @@ static void PlaceAirport(TileIndex tile)
/** Airport build toolbar window handler. */
struct BuildAirToolbarWindow : Window {
WidgetID last_user_action = INVALID_WIDGET; // Last started user action.
WidgetID last_user_action = INVALID_WIDGET; ///< Last started user action.
BuildAirToolbarWindow(WindowDesc &desc, WindowNumber window_number) : Window(desc)
{
@@ -96,7 +96,7 @@ struct BuildAirToolbarWindow : Window {
void Close([[maybe_unused]] int data = 0) override
{
if (this->IsWidgetLowered(WID_AT_AIRPORT)) SetViewportCatchmentStation(nullptr, true);
if (_settings_client.gui.link_terraform_toolbar) CloseWindowById(WC_SCEN_LAND_GEN, 0, false);
if (_settings_client.gui.link_terraform_toolbar) CloseWindowById(WindowClass::ScenarioGenerateLandscape, 0, false);
this->Window::Close();
}
@@ -109,10 +109,10 @@ struct BuildAirToolbarWindow : Window {
{
if (!gui_scope) return;
bool can_build = CanBuildVehicleInfrastructure(VEH_AIRCRAFT);
bool can_build = CanBuildVehicleInfrastructure(VehicleType::Aircraft);
this->SetWidgetDisabledState(WID_AT_AIRPORT, !can_build);
if (!can_build) {
CloseWindowById(WC_BUILD_STATION, TRANSPORT_AIR);
CloseWindowById(WindowClass::BuildStation, TransportType::Air);
/* Show in the tooltip why this button is disabled. */
this->GetWidget<NWidgetCore>(WID_AT_AIRPORT)->SetToolTip(STR_TOOLBAR_DISABLED_NO_VEHICLE_AVAILABLE);
@@ -179,20 +179,20 @@ struct BuildAirToolbarWindow : Window {
this->RaiseButtons();
CloseWindowById(WC_BUILD_STATION, TRANSPORT_AIR);
CloseWindowById(WC_SELECT_STATION, 0);
CloseWindowById(WindowClass::BuildStation, TransportType::Air);
CloseWindowById(WindowClass::JoinStation, 0);
}
/**
* Handler for global hotkeys of the BuildAirToolbarWindow.
* @param hotkey Hotkey
* @return ES_HANDLED if hotkey was accepted.
* @return EventState::Handled if hotkey was accepted.
*/
static EventState AirportToolbarGlobalHotkeys(int hotkey)
{
if (_game_mode != GM_NORMAL) return ES_NOT_HANDLED;
if (_game_mode != GameMode::Normal) return EventState::NotHandled;
Window *w = ShowBuildAirToolbar();
if (w == nullptr) return ES_NOT_HANDLED;
if (w == nullptr) return EventState::NotHandled;
return w->OnHotkey(hotkey);
}
@@ -204,20 +204,21 @@ struct BuildAirToolbarWindow : Window {
static constexpr std::initializer_list<NWidgetPart> _nested_air_toolbar_widgets = {
NWidget(NWID_HORIZONTAL),
NWidget(WWT_CLOSEBOX, COLOUR_DARK_GREEN),
NWidget(WWT_CAPTION, COLOUR_DARK_GREEN), SetStringTip(STR_TOOLBAR_AIRCRAFT_CAPTION, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS),
NWidget(WWT_STICKYBOX, COLOUR_DARK_GREEN),
NWidget(WWT_CLOSEBOX, Colours::DarkGreen),
NWidget(WWT_CAPTION, Colours::DarkGreen), SetStringTip(STR_TOOLBAR_AIRCRAFT_CAPTION, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS),
NWidget(WWT_STICKYBOX, Colours::DarkGreen),
EndContainer(),
NWidget(NWID_HORIZONTAL),
NWidget(WWT_IMGBTN, COLOUR_DARK_GREEN, WID_AT_AIRPORT), SetFill(0, 1), SetToolbarMinimalSize(2), SetSpriteTip(SPR_IMG_AIRPORT, STR_TOOLBAR_AIRCRAFT_BUILD_AIRPORT_TOOLTIP),
NWidget(WWT_PANEL, COLOUR_DARK_GREEN), SetToolbarSpacerMinimalSize(), SetFill(1, 1), EndContainer(),
NWidget(WWT_IMGBTN, COLOUR_DARK_GREEN, WID_AT_DEMOLISH), SetFill(0, 1), SetToolbarMinimalSize(1), SetSpriteTip(SPR_IMG_DYNAMITE, STR_TOOLTIP_DEMOLISH_BUILDINGS_ETC),
NWidget(WWT_IMGBTN, Colours::DarkGreen, WID_AT_AIRPORT), SetFill(0, 1), SetToolbarMinimalSize(2), SetSpriteTip(SPR_IMG_AIRPORT, STR_TOOLBAR_AIRCRAFT_BUILD_AIRPORT_TOOLTIP),
NWidget(WWT_PANEL, Colours::DarkGreen), SetToolbarSpacerMinimalSize(), SetFill(1, 1), EndContainer(),
NWidget(WWT_IMGBTN, Colours::DarkGreen, WID_AT_DEMOLISH), SetFill(0, 1), SetToolbarMinimalSize(1), SetSpriteTip(SPR_IMG_DYNAMITE, STR_TOOLTIP_DEMOLISH_BUILDINGS_ETC),
EndContainer(),
};
/** Window definition for the air toolbar. */
static WindowDesc _air_toolbar_desc(
WDP_MANUAL, "toolbar_air", 0, 0,
WC_BUILD_TOOLBAR, WC_NONE,
WindowPosition::Manual, "toolbar_air", 0, 0,
WindowClass::BuildToolbar, WindowClass::None,
WindowDefaultFlag::Construction,
_nested_air_toolbar_widgets,
&BuildAirToolbarWindow::hotkeys
@@ -234,8 +235,8 @@ Window *ShowBuildAirToolbar()
{
if (!Company::IsValidID(_local_company)) return nullptr;
CloseWindowByClass(WC_BUILD_TOOLBAR);
return AllocateWindowDescFront<BuildAirToolbarWindow>(_air_toolbar_desc, TRANSPORT_AIR);
CloseWindowByClass(WindowClass::BuildToolbar);
return AllocateWindowDescFront<BuildAirToolbarWindow>(_air_toolbar_desc, TransportType::Air);
}
class BuildAirportWindow : public PickerWindowBase {
@@ -243,13 +244,16 @@ class BuildAirportWindow : public PickerWindowBase {
int line_height = 0;
Scrollbar *vscroll = nullptr;
/** Build a dropdown list of available airport classes */
/**
* Build a dropdown list of available airport classes.
* @return The constructed dropdown list.
*/
static DropDownList BuildAirportClassDropDown()
{
DropDownList list;
for (const auto &cls : AirportClass::Classes()) {
list.push_back(MakeDropDownListStringItem(cls.name, cls.Index()));
list.push_back(MakeDropDownListStringItem(cls.name, cls.Index().base()));
}
return list;
@@ -264,14 +268,14 @@ public:
this->vscroll->SetCapacity(5);
this->vscroll->SetPosition(0);
this->FinishInitNested(TRANSPORT_AIR);
this->FinishInitNested(TransportType::Air);
this->SetWidgetLoweredState(WID_AP_BTN_DONTHILIGHT, !_settings_client.gui.station_show_coverage);
this->SetWidgetLoweredState(WID_AP_BTN_DOHILIGHT, _settings_client.gui.station_show_coverage);
this->OnInvalidateData();
/* Ensure airport class is valid (changing NewGRFs). */
_selected_airport_class = Clamp(_selected_airport_class, APC_BEGIN, (AirportClassID)(AirportClass::GetClassCount() - 1));
_selected_airport_class = Clamp(_selected_airport_class, AirportClassID::Begin(), static_cast<AirportClassID>(AirportClass::GetClassCount() - 1));
const AirportClass *ac = AirportClass::Get(_selected_airport_class);
this->vscroll->SetCount(ac->GetSpecCount());
@@ -295,7 +299,7 @@ public:
void Close([[maybe_unused]] int data = 0) override
{
CloseWindowById(WC_SELECT_STATION, 0);
CloseWindowById(WindowClass::JoinStation, 0);
this->PickerWindowBase::Close();
}
@@ -344,7 +348,7 @@ public:
size.width = std::max(size.width, GetStringBoundingBox(as->name).width + padding.width);
}
this->line_height = GetCharacterHeight(FS_NORMAL) + padding.height;
this->line_height = GetCharacterHeight(FontSize::Normal) + padding.height;
size.height = 5 * this->line_height;
break;
}
@@ -394,9 +398,9 @@ public:
for (auto it = first; it != last; ++it) {
const AirportSpec *as = *it;
if (!as->IsAvailable()) {
GfxFillRect(row, PC_BLACK, FILLRECT_CHECKER);
GfxFillRect(row, PC_BLACK, FillRectMode::Checker);
}
DrawString(text, as->name, (static_cast<int>(as->index) == _selected_airport_index) ? TC_WHITE : TC_BLACK);
DrawString(text, as->name, (static_cast<int>(as->index) == _selected_airport_index) ? TextColour::White : TextColour::Black);
row = row.Translate(0, this->line_height);
text = text.Translate(0, this->line_height);
}
@@ -415,7 +419,7 @@ public:
const AirportSpec *as = AirportClass::Get(_selected_airport_class)->GetSpec(_selected_airport_index);
StringID string = GetAirportTextCallback(as, _selected_airport_layout, CBID_AIRPORT_ADDITIONAL_TEXT);
if (string != STR_UNDEFINED) {
DrawStringMultiLine(r, string, TC_BLACK);
DrawStringMultiLine(r, string, TextColour::Black);
}
}
break;
@@ -438,17 +442,17 @@ public:
if (_settings_game.economy.station_noise_level) {
/* show the noise of the selected airport */
DrawString(r, GetString(STR_STATION_BUILD_NOISE, as->noise_level));
r.top += GetCharacterHeight(FS_NORMAL) + WidgetDimensions::scaled.vsep_normal;
r.top += GetCharacterHeight(FontSize::Normal) + WidgetDimensions::scaled.vsep_normal;
}
if (_settings_game.economy.infrastructure_maintenance) {
Money monthly = _price[PR_INFRASTRUCTURE_AIRPORT] * as->maintenance_cost >> 3;
Money monthly = _price[Price::InfrastructureAirport] * as->maintenance_cost >> 3;
DrawString(r, GetString(TimerGameEconomy::UsingWallclockUnits() ? STR_STATION_BUILD_INFRASTRUCTURE_COST_PERIOD : STR_STATION_BUILD_INFRASTRUCTURE_COST_YEAR, monthly * 12));
r.top += GetCharacterHeight(FS_NORMAL) + WidgetDimensions::scaled.vsep_normal;
r.top += GetCharacterHeight(FontSize::Normal) + WidgetDimensions::scaled.vsep_normal;
}
/* strings such as 'Size' and 'Coverage Area' */
r.top = DrawBadgeNameList(r, as->badges, GSF_AIRPORTS) + WidgetDimensions::scaled.vsep_normal;
r.top = DrawBadgeNameList(r, as->badges, GrfSpecFeature::Airports) + WidgetDimensions::scaled.vsep_normal;
r.top = DrawStationCoverageAreaText(r, SCT_ALL, rad, false) + WidgetDimensions::scaled.vsep_normal;
r.top = DrawStationCoverageAreaText(r, SCT_ALL, rad, true);
}
@@ -481,7 +485,7 @@ public:
int w = as->size_x;
int h = as->size_y;
Direction rotation = as->layouts[_selected_airport_layout].rotation;
if (rotation == DIR_E || rotation == DIR_W) std::swap(w, h);
if (rotation == Direction::E || rotation == Direction::W) std::swap(w, h);
SetTileSelectSize(w, h);
this->preview_sprite = GetCustomAirportSprite(as, _selected_airport_layout);
@@ -498,7 +502,7 @@ public:
{
switch (widget) {
case WID_AP_CLASS_DROPDOWN:
ShowDropDownList(this, BuildAirportClassDropDown(), _selected_airport_class, WID_AP_CLASS_DROPDOWN);
ShowDropDownList(this, BuildAirportClassDropDown(), _selected_airport_class.base(), WID_AP_CLASS_DROPDOWN);
break;
case WID_AP_AIRPORT_LIST: {
@@ -580,51 +584,52 @@ public:
CheckRedrawStationCoverage(this);
}
const IntervalTimer<TimerGameCalendar> yearly_interval = {{TimerGameCalendar::YEAR, TimerGameCalendar::Priority::NONE}, [this](auto) {
const IntervalTimer<TimerGameCalendar> yearly_interval = {{TimerGameCalendar::Trigger::Year, TimerGameCalendar::Priority::None}, [this](auto) {
this->InvalidateData();
}};
};
static constexpr std::initializer_list<NWidgetPart> _nested_build_airport_widgets = {
NWidget(NWID_HORIZONTAL),
NWidget(WWT_CLOSEBOX, COLOUR_DARK_GREEN),
NWidget(WWT_CAPTION, COLOUR_DARK_GREEN), SetStringTip(STR_STATION_BUILD_AIRPORT_CAPTION, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS),
NWidget(WWT_CLOSEBOX, Colours::DarkGreen),
NWidget(WWT_CAPTION, Colours::DarkGreen), SetStringTip(STR_STATION_BUILD_AIRPORT_CAPTION, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS),
EndContainer(),
NWidget(WWT_PANEL, COLOUR_DARK_GREEN),
NWidget(WWT_PANEL, Colours::DarkGreen),
NWidget(NWID_VERTICAL), SetPIP(0, WidgetDimensions::unscaled.vsep_normal, 0), SetPadding(WidgetDimensions::unscaled.picker),
NWidget(NWID_VERTICAL), SetPIP(0, WidgetDimensions::unscaled.vsep_picker, 0),
NWidget(WWT_LABEL, INVALID_COLOUR), SetStringTip(STR_STATION_BUILD_AIRPORT_CLASS_LABEL), SetFill(1, 0),
NWidget(WWT_DROPDOWN, COLOUR_GREY, WID_AP_CLASS_DROPDOWN), SetFill(1, 0), SetToolTip(STR_STATION_BUILD_AIRPORT_TOOLTIP),
NWidget(WWT_EMPTY, INVALID_COLOUR, WID_AP_AIRPORT_SPRITE), SetFill(1, 0),
NWidget(WWT_LABEL, Colours::Invalid), SetStringTip(STR_STATION_BUILD_AIRPORT_CLASS_LABEL), SetFill(1, 0),
NWidget(WWT_DROPDOWN, Colours::Grey, WID_AP_CLASS_DROPDOWN), SetFill(1, 0), SetToolTip(STR_STATION_BUILD_AIRPORT_TOOLTIP),
NWidget(WWT_EMPTY, Colours::Invalid, WID_AP_AIRPORT_SPRITE), SetFill(1, 0),
NWidget(NWID_HORIZONTAL),
NWidget(WWT_MATRIX, COLOUR_GREY, WID_AP_AIRPORT_LIST), SetFill(1, 0), SetMatrixDataTip(1, 5, STR_STATION_BUILD_AIRPORT_TOOLTIP), SetScrollbar(WID_AP_SCROLLBAR),
NWidget(NWID_VSCROLLBAR, COLOUR_GREY, WID_AP_SCROLLBAR),
NWidget(WWT_MATRIX, Colours::Grey, WID_AP_AIRPORT_LIST), SetFill(1, 0), SetMatrixDataTip(1, 5, STR_STATION_BUILD_AIRPORT_TOOLTIP), SetScrollbar(WID_AP_SCROLLBAR),
NWidget(NWID_VSCROLLBAR, Colours::Grey, WID_AP_SCROLLBAR),
EndContainer(),
NWidget(WWT_LABEL, INVALID_COLOUR), SetStringTip(STR_STATION_BUILD_ORIENTATION), SetFill(1, 0),
NWidget(WWT_LABEL, Colours::Invalid), SetStringTip(STR_STATION_BUILD_ORIENTATION), SetFill(1, 0),
NWidget(NWID_HORIZONTAL),
NWidget(WWT_PUSHARROWBTN, COLOUR_GREY, WID_AP_LAYOUT_DECREASE), SetMinimalSize(12, 0), SetArrowWidgetTypeTip(AWV_DECREASE),
NWidget(WWT_LABEL, INVALID_COLOUR, WID_AP_LAYOUT_NUM), SetResize(1, 0), SetFill(1, 0),
NWidget(WWT_PUSHARROWBTN, COLOUR_GREY, WID_AP_LAYOUT_INCREASE), SetMinimalSize(12, 0), SetArrowWidgetTypeTip(AWV_INCREASE),
NWidget(WWT_PUSHARROWBTN, Colours::Grey, WID_AP_LAYOUT_DECREASE), SetMinimalSize(12, 0), SetArrowWidgetTypeTip(ArrowWidgetType::Decrease),
NWidget(WWT_LABEL, Colours::Invalid, WID_AP_LAYOUT_NUM), SetResize(1, 0), SetFill(1, 0),
NWidget(WWT_PUSHARROWBTN, Colours::Grey, WID_AP_LAYOUT_INCREASE), SetMinimalSize(12, 0), SetArrowWidgetTypeTip(ArrowWidgetType::Increase),
EndContainer(),
NWidget(WWT_EMPTY, INVALID_COLOUR, WID_AP_EXTRA_TEXT), SetFill(1, 0), SetMinimalSize(150, 0),
NWidget(WWT_LABEL, INVALID_COLOUR), SetStringTip(STR_STATION_BUILD_COVERAGE_AREA_TITLE), SetFill(1, 0),
NWidget(WWT_EMPTY, Colours::Invalid, WID_AP_EXTRA_TEXT), SetFill(1, 0), SetMinimalSize(150, 0),
NWidget(WWT_LABEL, Colours::Invalid), SetStringTip(STR_STATION_BUILD_COVERAGE_AREA_TITLE), SetFill(1, 0),
NWidget(NWID_HORIZONTAL), SetPIP(14, 0, 14), SetPIPRatio(1, 0, 1),
NWidget(NWID_HORIZONTAL, NWidContainerFlag::EqualSize),
NWidget(WWT_TEXTBTN, COLOUR_GREY, WID_AP_BTN_DONTHILIGHT), SetMinimalSize(60, 12), SetFill(1, 0),
NWidget(WWT_TEXTBTN, Colours::Grey, WID_AP_BTN_DONTHILIGHT), SetMinimalSize(60, 12), SetFill(1, 0),
SetStringTip(STR_STATION_BUILD_COVERAGE_OFF, STR_STATION_BUILD_COVERAGE_AREA_OFF_TOOLTIP),
NWidget(WWT_TEXTBTN, COLOUR_GREY, WID_AP_BTN_DOHILIGHT), SetMinimalSize(60, 12), SetFill(1, 0),
NWidget(WWT_TEXTBTN, Colours::Grey, WID_AP_BTN_DOHILIGHT), SetMinimalSize(60, 12), SetFill(1, 0),
SetStringTip(STR_STATION_BUILD_COVERAGE_ON, STR_STATION_BUILD_COVERAGE_AREA_ON_TOOLTIP),
EndContainer(),
EndContainer(),
EndContainer(),
NWidget(WWT_EMPTY, INVALID_COLOUR, WID_AP_ACCEPTANCE), SetResize(0, 1), SetFill(1, 0), SetMinimalTextLines(2, WidgetDimensions::unscaled.vsep_normal),
NWidget(WWT_EMPTY, Colours::Invalid, WID_AP_ACCEPTANCE), SetResize(0, 1), SetFill(1, 0), SetMinimalTextLines(2, WidgetDimensions::unscaled.vsep_normal),
EndContainer(),
EndContainer(),
};
/** Window definition for the airport build window. */
static WindowDesc _build_airport_desc(
WDP_AUTO, {}, 0, 0,
WC_BUILD_STATION, WC_BUILD_TOOLBAR,
WindowPosition::Automatic, {}, 0, 0,
WindowClass::BuildStation, WindowClass::BuildToolbar,
WindowDefaultFlag::Construction,
_nested_build_airport_widgets
);
@@ -636,6 +641,6 @@ static void ShowBuildAirportPicker(Window *parent)
void InitializeAirportGui()
{
_selected_airport_class = APC_BEGIN;
_selected_airport_class = AirportClassID::Begin();
_selected_airport_index = -1;
}
+1 -1
View File
@@ -74,7 +74,7 @@ void AddAnimatedTile(TileIndex tile, bool mark_dirty)
*/
void AnimateAnimatedTiles()
{
PerformanceAccumulator landscape_framerate(PFE_GL_LANDSCAPE);
PerformanceAccumulator landscape_framerate(PerformanceElement::GameLoopLandscape);
for (auto it = std::begin(_animated_tiles); it != std::end(_animated_tiles); /* nothing */) {
TileIndex &tile = *it;
+1
View File
@@ -35,6 +35,7 @@ inline AnimatedTileState GetAnimatedTileState(Tile t)
/**
* Set the animated state of a tile.
* @param t The tile.
* @param state The new state.
*/
inline void SetAnimatedTileState(Tile t, AnimatedTileState state)
{

Some files were not shown because too many files have changed in this diff Show More