From c6dafb0865818e57a7013657f730bf7e5da767f2 Mon Sep 17 00:00:00 2001 From: Patric Stout Date: Thu, 4 Jan 2024 13:40:59 +0100 Subject: [PATCH 01/13] Doc: indicate a bit better that mass-change PRs for translations are possible (#11677) --- docs/eints.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/eints.md b/docs/eints.md index 1fbdbf1d45..0e49d56a22 100644 --- a/docs/eints.md +++ b/docs/eints.md @@ -25,6 +25,10 @@ The translators will decide whether, where and how to apply your suggestion. Sorry, we don't offer this option. +Only when there is a consistency problem that needs addressing, this can be done via a PR. +We are very strict about this, and in general all PRs making translation changes will be closed. +But if it is really needed, and the change is not a revert of any older change, a PR can be created to do mass changes to a translation. + ### I want to change the language definition (plural form, genders, cases) of a translation. Please [create an issue](https://github.com/OpenTTD/OpenTTD/issues/new/choose) for this. From 51ef416b49f54f45544f8df73983fa1bf03cc956 Mon Sep 17 00:00:00 2001 From: Jonathan G Rennison Date: Thu, 4 Jan 2024 01:02:22 +0000 Subject: [PATCH 02/13] Fix: libcurl HTTP thread race at uninit preventing thread exit --- src/network/core/http_curl.cpp | 11 +++++++++-- src/network/core/http_shared.h | 22 +++++++++++++++++++--- 2 files changed, 28 insertions(+), 5 deletions(-) diff --git a/src/network/core/http_curl.cpp b/src/network/core/http_curl.cpp index d60c0c42b9..ac49673341 100644 --- a/src/network/core/http_curl.cpp +++ b/src/network/core/http_curl.cpp @@ -230,8 +230,10 @@ void HttpThread() request->callback.OnFailure(); } - /* Wait till the callback tells us all data is dequeued. */ - request->callback.WaitTillEmpty(); + /* Wait till the callback tells us all data is dequeued, or _http_thread_exit has been set. */ + request->callback.WaitTillEmptyOrCondition([]() -> bool { + return _http_thread_exit; + }); } curl_easy_cleanup(curl); @@ -278,6 +280,11 @@ void NetworkHTTPUninitialize() _http_thread_exit = true; + /* Queues must be cleared (and the queue CV signalled) after _http_thread_exit is set to ensure that the HTTP thread can exit */ + for (auto &callback : _http_callbacks) { + callback->ClearQueue(); + } + { std::lock_guard lock(_http_mutex); _http_cv.notify_one(); diff --git a/src/network/core/http_shared.h b/src/network/core/http_shared.h index b406076b11..b7549e8fe7 100644 --- a/src/network/core/http_shared.h +++ b/src/network/core/http_shared.h @@ -75,13 +75,15 @@ public: } /** - * Wait till the queue is dequeued. + * Wait till the queue is dequeued, or a condition is met. + * @param condition Condition functor. */ - void WaitTillEmpty() + template + void WaitTillEmptyOrCondition(T condition) { std::unique_lock lock(this->mutex); - while (!queue.empty()) { + while (!(queue.empty() || condition())) { this->queue_cv.wait(lock); } } @@ -95,6 +97,20 @@ public: return this->queue.empty(); } + + /** + * Clear everything in the queue. + * + * Should be called from the Game Thread. + */ + void ClearQueue() + { + std::lock_guard lock(this->mutex); + + this->queue.clear(); + this->queue_cv.notify_all(); + } + HTTPThreadSafeCallback(HTTPCallback *callback) : callback(callback) {} ~HTTPThreadSafeCallback() From 0075364c89796595cbbb97daba0ed2bc1066d5b9 Mon Sep 17 00:00:00 2001 From: Jonathan G Rennison Date: Thu, 4 Jan 2024 01:02:51 +0000 Subject: [PATCH 03/13] Fix: curl_global_cleanup called before libcurl HTTP thread exited --- src/network/core/http_curl.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/network/core/http_curl.cpp b/src/network/core/http_curl.cpp index ac49673341..c7a454da8b 100644 --- a/src/network/core/http_curl.cpp +++ b/src/network/core/http_curl.cpp @@ -276,8 +276,6 @@ void NetworkHTTPInitialize() void NetworkHTTPUninitialize() { - curl_global_cleanup(); - _http_thread_exit = true; /* Queues must be cleared (and the queue CV signalled) after _http_thread_exit is set to ensure that the HTTP thread can exit */ @@ -293,4 +291,6 @@ void NetworkHTTPUninitialize() if (_http_thread.joinable()) { _http_thread.join(); } + + curl_global_cleanup(); } From e3f49ee7a01528ec5399e1fbe525012b4c7b8b07 Mon Sep 17 00:00:00 2001 From: Rubidium Date: Wed, 3 Jan 2024 22:33:38 +0100 Subject: [PATCH 04/13] Codechange: coding style fixes --- src/company_func.h | 4 ++-- src/core/overflowsafe_type.hpp | 2 +- src/core/pool_type.hpp | 8 ++++---- src/core/span_type.hpp | 2 +- src/engine.cpp | 2 +- src/fontcache.cpp | 2 +- src/group_gui.cpp | 2 +- src/industry_cmd.cpp | 2 +- src/misc/array.hpp | 2 +- src/misc/dbg_helpers.h | 2 +- src/misc/fixedsizearray.hpp | 8 ++++---- src/misc/hashtable.hpp | 2 +- src/music/dmusic.cpp | 6 +++--- src/music/midifile.cpp | 6 +++--- src/network/core/host.cpp | 4 ++-- src/network/network_command.cpp | 2 +- src/network/network_gui.cpp | 2 +- src/newgrf_debug_gui.cpp | 6 +++--- src/newgrf_roadstop.cpp | 2 +- src/newgrf_roadstop.h | 6 +++--- src/newgrf_spritegroup.cpp | 2 +- src/newgrf_townname.cpp | 2 +- src/newgrf_townname.h | 2 +- src/news_gui.cpp | 4 ++-- src/os/macosx/crashlog_osx.cpp | 2 +- src/os/macosx/string_osx.cpp | 12 ++++++------ src/os/unix/crashlog_unix.cpp | 2 +- src/pathfinder/yapf/nodelist.hpp | 4 ++-- src/pathfinder/yapf/yapf_base.hpp | 6 +++--- src/pathfinder/yapf/yapf_common.hpp | 6 +++--- src/pathfinder/yapf/yapf_costcache.hpp | 8 ++++---- src/pathfinder/yapf/yapf_costrail.hpp | 2 +- src/pathfinder/yapf/yapf_destrail.hpp | 6 +++--- src/pathfinder/yapf/yapf_node.hpp | 2 +- src/pathfinder/yapf/yapf_node_rail.hpp | 2 +- src/pathfinder/yapf/yapf_rail.cpp | 8 ++++---- src/pathfinder/yapf/yapf_road.cpp | 8 ++++---- src/pathfinder/yapf/yapf_ship.cpp | 10 +++++----- src/road_cmd.cpp | 4 ++-- src/road_gui.cpp | 2 +- src/saveload/afterload.cpp | 6 +++--- src/saveload/engine_sl.cpp | 2 +- src/saveload/waypoint_sl.cpp | 2 +- src/settings_gui.cpp | 10 +++++----- src/sortlist_type.h | 2 +- src/sound/xaudio2_s.cpp | 10 +++++----- src/station_cmd.cpp | 4 ++-- src/story_gui.cpp | 2 +- src/strings_internal.h | 2 +- src/thread.h | 2 +- src/tilematrix_type.hpp | 2 +- src/toolbar_gui.cpp | 4 ++-- src/vehicle.cpp | 2 +- src/vehicle_base.h | 4 ++-- src/video/cocoa/cocoa_ogl.h | 2 +- src/video/cocoa/cocoa_v.h | 4 ++-- src/video/cocoa/cocoa_v.mm | 2 +- src/widgets/dropdown_type.h | 12 ++++++------ src/window.cpp | 2 +- 59 files changed, 121 insertions(+), 121 deletions(-) diff --git a/src/company_func.h b/src/company_func.h index 3f43e7530e..28b424a5d1 100644 --- a/src/company_func.h +++ b/src/company_func.h @@ -27,8 +27,8 @@ void UpdateLandscapingLimits(); void UpdateCompanyLiveries(Company *c); bool CheckCompanyHasMoney(CommandCost &cost); -void SubtractMoneyFromCompany(const CommandCost& cost); -void SubtractMoneyFromCompanyFract(CompanyID company, const CommandCost& cost); +void SubtractMoneyFromCompany(const CommandCost &cost); +void SubtractMoneyFromCompanyFract(CompanyID company, const CommandCost &cost); CommandCost CheckOwnership(Owner owner, TileIndex tile = 0U); CommandCost CheckTileOwnership(TileIndex tile); diff --git a/src/core/overflowsafe_type.hpp b/src/core/overflowsafe_type.hpp index ca7b7ad5e0..8e40973192 100644 --- a/src/core/overflowsafe_type.hpp +++ b/src/core/overflowsafe_type.hpp @@ -37,7 +37,7 @@ private: public: constexpr OverflowSafeInt() : m_value(0) { } - constexpr OverflowSafeInt(const OverflowSafeInt& other) : m_value(other.m_value) { } + constexpr OverflowSafeInt(const OverflowSafeInt &other) : m_value(other.m_value) { } constexpr OverflowSafeInt(const T int_) : m_value(int_) { } inline constexpr OverflowSafeInt& operator = (const OverflowSafeInt& other) { this->m_value = other.m_value; return *this; } diff --git a/src/core/pool_type.hpp b/src/core/pool_type.hpp index 32eb364f2c..00547cf7c1 100644 --- a/src/core/pool_type.hpp +++ b/src/core/pool_type.hpp @@ -142,8 +142,8 @@ struct Pool : PoolBase { template struct PoolIterator { typedef T value_type; - typedef T* pointer; - typedef T& reference; + typedef T *pointer; + typedef T &reference; typedef size_t difference_type; typedef std::forward_iterator_tag iterator_category; @@ -186,8 +186,8 @@ struct Pool : PoolBase { template struct PoolIteratorFiltered { typedef T value_type; - typedef T* pointer; - typedef T& reference; + typedef T *pointer; + typedef T &reference; typedef size_t difference_type; typedef std::forward_iterator_tag iterator_category; diff --git a/src/core/span_type.hpp b/src/core/span_type.hpp index 626a4b7b78..9a39bdb529 100644 --- a/src/core/span_type.hpp +++ b/src/core/span_type.hpp @@ -39,7 +39,7 @@ template struct is_compatible_container : std::bool_constant < has_size_and_data::value - && is_compatible_element::value + && is_compatible_element::value >{}; /** diff --git a/src/engine.cpp b/src/engine.cpp index 4f9b3b5da2..417a52b087 100644 --- a/src/engine.cpp +++ b/src/engine.cpp @@ -1081,7 +1081,7 @@ static void NewVehicleAvailable(Engine *e) } else if (e->type == VEH_ROAD) { /* maybe make another road type available */ assert(e->u.road.roadtype < ROADTYPE_END); - for (Company* c : Company::Iterate()) c->avail_roadtypes = AddDateIntroducedRoadTypes(c->avail_roadtypes | GetRoadTypeInfo(e->u.road.roadtype)->introduces_roadtypes, TimerGameCalendar::date); + for (Company *c : Company::Iterate()) c->avail_roadtypes = AddDateIntroducedRoadTypes(c->avail_roadtypes | GetRoadTypeInfo(e->u.road.roadtype)->introduces_roadtypes, TimerGameCalendar::date); } /* Only broadcast event if AIs are able to build this vehicle type. */ diff --git a/src/fontcache.cpp b/src/fontcache.cpp index ce5dffe6a4..0f94fd2c82 100644 --- a/src/fontcache.cpp +++ b/src/fontcache.cpp @@ -98,7 +98,7 @@ bool GetFontAAState(FontSize size, bool check_blitter) return GetFontCacheSubSetting(size)->aa; } -void SetFont(FontSize fontsize, const std::string& font, uint size, bool aa) +void SetFont(FontSize fontsize, const std::string &font, uint size, bool aa) { FontCacheSubSetting *setting = GetFontCacheSubSetting(fontsize); bool changed = false; diff --git a/src/group_gui.cpp b/src/group_gui.cpp index f4ad3a032e..7da213c0d7 100644 --- a/src/group_gui.cpp +++ b/src/group_gui.cpp @@ -901,7 +901,7 @@ public: case GB_SHARED_ORDERS: { if (!VehicleClicked(vehgroup)) { - const Vehicle* v = vehgroup.vehicles_begin[0]; + const Vehicle *v = vehgroup.vehicles_begin[0]; if (vindex == v->index) { if (vehgroup.NumVehicles() == 1) { ShowVehicleViewWindow(v); diff --git a/src/industry_cmd.cpp b/src/industry_cmd.cpp index ebbc316dba..59a726d7ff 100644 --- a/src/industry_cmd.cpp +++ b/src/industry_cmd.cpp @@ -1663,7 +1663,7 @@ static CommandCost CheckIfFarEnoughFromConflictingIndustry(TileIndex tile, int t /* On a large map with many industries, it may be faster to check an area. */ static const int dmax = 14; if (Industry::GetNumItems() > (size_t) (dmax * dmax * 2)) { - const Industry* i = nullptr; + const Industry *i = nullptr; TileArea tile_area = TileArea(tile, 1, 1).Expand(dmax); for (TileIndex atile : tile_area) { if (GetTileType(atile) == MP_INDUSTRY) { diff --git a/src/misc/array.hpp b/src/misc/array.hpp index 277fe29a36..cc48d295cd 100644 --- a/src/misc/array.hpp +++ b/src/misc/array.hpp @@ -28,7 +28,7 @@ protected: SuperArray data; ///< array of arrays of items /** return first sub-array with free space for new item */ - inline SubArray& FirstFreeSubArray() + inline SubArray &FirstFreeSubArray() { uint super_size = data.Length(); if (super_size > 0) { diff --git a/src/misc/dbg_helpers.h b/src/misc/dbg_helpers.h index 8453aa1618..fdfcaba04a 100644 --- a/src/misc/dbg_helpers.h +++ b/src/misc/dbg_helpers.h @@ -124,7 +124,7 @@ struct DumpTarget { : m_indent(0) {} - static size_t& LastTypeId(); + static size_t &LastTypeId(); std::string GetCurrentStructName(); bool FindKnownName(size_t type_id, const void *ptr, std::string &name); diff --git a/src/misc/fixedsizearray.hpp b/src/misc/fixedsizearray.hpp index a36a810f27..7a2c97b58b 100644 --- a/src/misc/fixedsizearray.hpp +++ b/src/misc/fixedsizearray.hpp @@ -39,25 +39,25 @@ protected: T *data; /** return reference to the array header (non-const) */ - inline ArrayHeader& Hdr() + inline ArrayHeader &Hdr() { return *(ArrayHeader*)(((byte*)data) - HeaderSize); } /** return reference to the array header (const) */ - inline const ArrayHeader& Hdr() const + inline const ArrayHeader &Hdr() const { return *(ArrayHeader*)(((byte*)data) - HeaderSize); } /** return reference to the block reference counter */ - inline uint& RefCnt() + inline uint &RefCnt() { return Hdr().reference_count; } /** return reference to number of used items */ - inline uint& SizeRef() + inline uint &SizeRef() { return Hdr().items; } diff --git a/src/misc/hashtable.hpp b/src/misc/hashtable.hpp index 0fd744777a..92e759adbe 100644 --- a/src/misc/hashtable.hpp +++ b/src/misc/hashtable.hpp @@ -216,7 +216,7 @@ public: } /** non-const item search & removal */ - Titem_& Pop(const Tkey &key) + Titem_ &Pop(const Tkey &key) { Titem_ *item = TryPop(key); assert(item != nullptr); diff --git a/src/music/dmusic.cpp b/src/music/dmusic.cpp index d180886a38..eaf616c535 100644 --- a/src/music/dmusic.cpp +++ b/src/music/dmusic.cpp @@ -37,9 +37,9 @@ static const int MS_TO_REFTIME = 1000 * 10; ///< DirectMusic time base is 100 ns static const int MIDITIME_TO_REFTIME = 10; ///< Time base of the midi file reader is 1 us. -#define FOURCC_INFO mmioFOURCC('I','N','F','O') -#define FOURCC_fmt mmioFOURCC('f','m','t',' ') -#define FOURCC_data mmioFOURCC('d','a','t','a') +#define FOURCC_INFO mmioFOURCC('I', 'N', 'F', 'O') +#define FOURCC_fmt mmioFOURCC('f', 'm', 't', ' ') +#define FOURCC_data mmioFOURCC('d', 'a', 't', 'a') /** A DLS file. */ struct DLSFile { diff --git a/src/music/midifile.cpp b/src/music/midifile.cpp index dc02bc280c..fbb1a1dee1 100644 --- a/src/music/midifile.cpp +++ b/src/music/midifile.cpp @@ -377,7 +377,7 @@ static bool FixupMidiData(MidiFile &target) while (cur_block < target.blocks.size()) { MidiFile::DataBlock &block = target.blocks[cur_block]; MidiFile::TempoChange &tempo = target.tempos[cur_tempo]; - MidiFile::TempoChange &next_tempo = target.tempos[cur_tempo+1]; + MidiFile::TempoChange &next_tempo = target.tempos[cur_tempo + 1]; if (block.ticktime <= next_tempo.ticktime) { /* block is within the current tempo */ int64_t tickdiff = block.ticktime - last_ticktime; @@ -792,12 +792,12 @@ struct MpsMachine { /* Always reset percussion channel to program 0 */ this->target.blocks.push_back(MidiFile::DataBlock()); - AddMidiData(this->target.blocks.back(), MIDIST_PROGCHG+9, 0x00); + AddMidiData(this->target.blocks.back(), MIDIST_PROGCHG + 9, 0x00); /* Technically should be an endless loop, but having * a maximum (about 10 minutes) avoids getting stuck, * in case of corrupted data. */ - for (uint32_t tick = 0; tick < 100000; tick+=1) { + for (uint32_t tick = 0; tick < 100000; tick += 1) { this->target.blocks.push_back(MidiFile::DataBlock()); auto &block = this->target.blocks.back(); block.ticktime = tick; diff --git a/src/network/core/host.cpp b/src/network/core/host.cpp index 4d57dcb501..7504f6986f 100644 --- a/src/network/core/host.cpp +++ b/src/network/core/host.cpp @@ -52,7 +52,7 @@ static void NetworkFindBroadcastIPsInternal(NetworkAddressList *broadcast) // Wi memcpy(&address, &ifo[j].iiAddress.Address, sizeof(sockaddr)); ((sockaddr_in*)&address)->sin_addr.s_addr = ifo[j].iiAddress.AddressIn.sin_addr.s_addr | ~ifo[j].iiNetmask.AddressIn.sin_addr.s_addr; NetworkAddress addr(address, sizeof(sockaddr)); - if (std::none_of(broadcast->begin(), broadcast->end(), [&addr](NetworkAddress const& elem) -> bool { return elem == addr; })) broadcast->push_back(addr); + if (std::none_of(broadcast->begin(), broadcast->end(), [&addr](NetworkAddress const &elem) -> bool { return elem == addr; })) broadcast->push_back(addr); } free(ifo); @@ -72,7 +72,7 @@ static void NetworkFindBroadcastIPsInternal(NetworkAddressList *broadcast) if (ifa->ifa_broadaddr->sa_family != AF_INET) continue; NetworkAddress addr(ifa->ifa_broadaddr, sizeof(sockaddr)); - if (std::none_of(broadcast->begin(), broadcast->end(), [&addr](NetworkAddress const& elem) -> bool { return elem == addr; })) broadcast->push_back(addr); + if (std::none_of(broadcast->begin(), broadcast->end(), [&addr](NetworkAddress const &elem) -> bool { return elem == addr; })) broadcast->push_back(addr); } freeifaddrs(ifap); } diff --git a/src/network/network_command.cpp b/src/network/network_command.cpp index b5dc3e6b6a..ef3ca67c3e 100644 --- a/src/network/network_command.cpp +++ b/src/network/network_command.cpp @@ -537,7 +537,7 @@ CommandDataBuffer SanitizeCmdStrings(const CommandDataBuffer &data) * @param cp Command packet to unpack. */ template -void UnpackNetworkCommand(const CommandPacket* cp) +void UnpackNetworkCommand(const CommandPacket *cp) { auto args = EndianBufferReader::ToValue::Args>(cp->data); Command::PostFromNet(cp->err_msg, std::get(_callback_tuple), cp->my_cmd, args); diff --git a/src/network/network_gui.cpp b/src/network/network_gui.cpp index 29227844bf..3e58ca964b 100644 --- a/src/network/network_gui.cpp +++ b/src/network/network_gui.cpp @@ -1097,7 +1097,7 @@ struct NetworkStartServerWindow : public Window { case WID_NSS_PLAY_HEIGHTMAP: if (!CheckServerName()) return; _is_network_server = true; - ShowSaveLoadDialog(FT_HEIGHTMAP,SLO_LOAD); + ShowSaveLoadDialog(FT_HEIGHTMAP, SLO_LOAD); break; } } diff --git a/src/newgrf_debug_gui.cpp b/src/newgrf_debug_gui.cpp index c64f58549a..83f857e657 100644 --- a/src/newgrf_debug_gui.cpp +++ b/src/newgrf_debug_gui.cpp @@ -403,7 +403,7 @@ struct NewGRFInspectWindow : Window { * Helper function to draw the vehicle chain widget. * @param r The rectangle to draw within. */ - void DrawVehicleChainWidget(const Rect& r) const + void DrawVehicleChainWidget(const Rect &r) const { const Vehicle *v = Vehicle::Get(this->GetFeatureIndex()); int total_width = 0; @@ -444,7 +444,7 @@ struct NewGRFInspectWindow : Window { * Helper function to draw the main panel widget. * @param r The rectangle to draw within. */ - void DrawMainPanelWidget(const Rect& r) const + void DrawMainPanelWidget(const Rect &r) const { uint index = this->GetFeatureIndex(); const NIFeature *nif = GetFeature(this->window_number); @@ -919,7 +919,7 @@ struct SpriteAlignerWindow : Window { DrawSprite(this->current_sprite, PAL_NONE, x, y, nullptr, SpriteAlignerWindow::zoom); Rect outline = {0, 0, UnScaleByZoom(spr->width, SpriteAlignerWindow::zoom) - 1, UnScaleByZoom(spr->height, SpriteAlignerWindow::zoom) - 1}; - outline = outline.Translate(x + UnScaleByZoom(spr->x_offs, SpriteAlignerWindow::zoom),y + UnScaleByZoom(spr->y_offs, SpriteAlignerWindow::zoom)); + outline = outline.Translate(x + UnScaleByZoom(spr->x_offs, SpriteAlignerWindow::zoom), y + UnScaleByZoom(spr->y_offs, SpriteAlignerWindow::zoom)); DrawRectOutline(outline.Expand(1), PC_LIGHT_BLUE, 1, 1); if (SpriteAlignerWindow::crosshair) { diff --git a/src/newgrf_roadstop.cpp b/src/newgrf_roadstop.cpp index 2b16653030..9fe9bf3af3 100644 --- a/src/newgrf_roadstop.cpp +++ b/src/newgrf_roadstop.cpp @@ -227,7 +227,7 @@ RoadStopResolverObject::~RoadStopResolverObject() delete this->town_scope; } -TownScopeResolver* RoadStopResolverObject::GetTown() +TownScopeResolver *RoadStopResolverObject::GetTown() { if (this->town_scope == nullptr) { Town *t; diff --git a/src/newgrf_roadstop.h b/src/newgrf_roadstop.h index 87803dc8bc..eda86054d9 100644 --- a/src/newgrf_roadstop.h +++ b/src/newgrf_roadstop.h @@ -81,7 +81,7 @@ struct RoadStopScopeResolver : public ScopeResolver { uint8_t view; ///< Station axis. RoadType roadtype; ///< Road type (used when no tile) - RoadStopScopeResolver(ResolverObject& ro, BaseStation* st, const RoadStopSpec *roadstopspec, TileIndex tile, RoadType roadtype, StationType type, uint8_t view = 0) + RoadStopScopeResolver(ResolverObject &ro, BaseStation *st, const RoadStopSpec *roadstopspec, TileIndex tile, RoadType roadtype, StationType type, uint8_t view = 0) : ScopeResolver(ro), tile(tile), st(st), roadstopspec(roadstopspec), type(type), view(view), roadtype(roadtype) { } @@ -97,10 +97,10 @@ struct RoadStopResolverObject : public ResolverObject { RoadStopScopeResolver roadstop_scope; ///< The stop scope resolver. TownScopeResolver *town_scope; ///< The town scope resolver (created on the first call). - RoadStopResolverObject(const RoadStopSpec* roadstopspec, BaseStation* st, TileIndex tile, RoadType roadtype, StationType type, uint8_t view, CallbackID callback = CBID_NO_CALLBACK, uint32_t param1 = 0, uint32_t param2 = 0); + RoadStopResolverObject(const RoadStopSpec *roadstopspec, BaseStation *st, TileIndex tile, RoadType roadtype, StationType type, uint8_t view, CallbackID callback = CBID_NO_CALLBACK, uint32_t param1 = 0, uint32_t param2 = 0); ~RoadStopResolverObject(); - ScopeResolver* GetScope(VarSpriteGroupScope scope = VSG_SCOPE_SELF, byte relative = 0) override + ScopeResolver *GetScope(VarSpriteGroupScope scope = VSG_SCOPE_SELF, byte relative = 0) override { switch (scope) { case VSG_SCOPE_SELF: return &this->roadstop_scope; diff --git a/src/newgrf_spritegroup.cpp b/src/newgrf_spritegroup.cpp index d63f4061cc..fcdd12bb91 100644 --- a/src/newgrf_spritegroup.cpp +++ b/src/newgrf_spritegroup.cpp @@ -180,7 +180,7 @@ static U EvalAdjustT(const DeterministicSpriteGroupAdjust &adjust, ScopeResolver } -static bool RangeHighComparator(const DeterministicSpriteGroupRange& range, uint32_t value) +static bool RangeHighComparator(const DeterministicSpriteGroupRange &range, uint32_t value) { return range.high < value; } diff --git a/src/newgrf_townname.cpp b/src/newgrf_townname.cpp index bc89dbc6f1..82e9c9aa2c 100644 --- a/src/newgrf_townname.cpp +++ b/src/newgrf_townname.cpp @@ -88,7 +88,7 @@ void InitGRFTownGeneratorNames() } } -const std::vector& GetGRFTownNameList() +const std::vector &GetGRFTownNameList() { return _grf_townname_names; } diff --git a/src/newgrf_townname.h b/src/newgrf_townname.h index 1ca54cdb48..9a0e919efe 100644 --- a/src/newgrf_townname.h +++ b/src/newgrf_townname.h @@ -51,6 +51,6 @@ uint32_t GetGRFTownNameId(uint16_t gen); uint16_t GetGRFTownNameType(uint16_t gen); StringID GetGRFTownNameName(uint16_t gen); -const std::vector& GetGRFTownNameList(); +const std::vector &GetGRFTownNameList(); #endif /* NEWGRF_TOWNNAME_H */ diff --git a/src/news_gui.cpp b/src/news_gui.cpp index 0bc8caf012..e5b73de2e4 100644 --- a/src/news_gui.cpp +++ b/src/news_gui.cpp @@ -210,7 +210,7 @@ static WindowDesc _small_news_desc(__FILE__, __LINE__, /** * Window layouts for news items. */ -static WindowDesc* _news_window_layout[] = { +static WindowDesc *_news_window_layout[] = { &_thin_news_desc, ///< NF_THIN &_small_news_desc, ///< NF_SMALL &_normal_news_desc, ///< NF_NORMAL @@ -218,7 +218,7 @@ static WindowDesc* _news_window_layout[] = { &_company_news_desc, ///< NF_COMPANY }; -WindowDesc* GetNewsWindowLayout(NewsFlag flags) +WindowDesc *GetNewsWindowLayout(NewsFlag flags) { uint layout = GB(flags, NFB_WINDOW_LAYOUT, NFB_WINDOW_LAYOUT_COUNT); assert(layout < lengthof(_news_window_layout)); diff --git a/src/os/macosx/crashlog_osx.cpp b/src/os/macosx/crashlog_osx.cpp index 3f8b7fe7ec..8e3f4c224b 100644 --- a/src/os/macosx/crashlog_osx.cpp +++ b/src/os/macosx/crashlog_osx.cpp @@ -70,7 +70,7 @@ class CrashLogOSX : public CrashLog { } #ifdef WITH_UNOFFICIAL_BREAKPAD - static bool MinidumpCallback(const char* dump_dir, const char* minidump_id, void* context, bool succeeded) + static bool MinidumpCallback(const char *dump_dir, const char *minidump_id, void *context, bool succeeded) { CrashLogOSX *crashlog = reinterpret_cast(context); diff --git a/src/os/macosx/string_osx.cpp b/src/os/macosx/string_osx.cpp index cd281257b0..068767b6fd 100644 --- a/src/os/macosx/string_osx.cpp +++ b/src/os/macosx/string_osx.cpp @@ -24,10 +24,10 @@ extern "C" { typedef const struct __CTRunDelegate * CTRunDelegateRef; - typedef void (*CTRunDelegateDeallocateCallback) (void* refCon); - typedef CGFloat (*CTRunDelegateGetAscentCallback) (void* refCon); - typedef CGFloat (*CTRunDelegateGetDescentCallback) (void* refCon); - typedef CGFloat (*CTRunDelegateGetWidthCallback) (void* refCon); + typedef void (*CTRunDelegateDeallocateCallback) (void *refCon); + typedef CGFloat (*CTRunDelegateGetAscentCallback) (void *refCon); + typedef CGFloat (*CTRunDelegateGetDescentCallback) (void *refCon); + typedef CGFloat (*CTRunDelegateGetWidthCallback) (void *refCon); typedef struct { CFIndex version; CTRunDelegateDeallocateCallback dealloc; @@ -43,7 +43,7 @@ extern "C" { extern const CFStringRef kCTRunDelegateAttributeName AVAILABLE_MAC_OS_X_VERSION_10_5_AND_LATER; - CTRunDelegateRef CTRunDelegateCreate(const CTRunDelegateCallbacks* callbacks, void* refCon) AVAILABLE_MAC_OS_X_VERSION_10_5_AND_LATER; + CTRunDelegateRef CTRunDelegateCreate(const CTRunDelegateCallbacks *callbacks, void *refCon) AVAILABLE_MAC_OS_X_VERSION_10_5_AND_LATER; } #endif /* HAVE_OSX_109_SDK */ @@ -60,7 +60,7 @@ class CoreTextParagraphLayout : public ParagraphLayouter { private: const CoreTextParagraphLayoutFactory::CharType *text_buffer; ptrdiff_t length; - const FontMap& font_map; + const FontMap &font_map; CFAutoRelease typesetter; diff --git a/src/os/unix/crashlog_unix.cpp b/src/os/unix/crashlog_unix.cpp index 70cdc7be68..7ab97a7222 100644 --- a/src/os/unix/crashlog_unix.cpp +++ b/src/os/unix/crashlog_unix.cpp @@ -70,7 +70,7 @@ class CrashLogUnix : public CrashLog { } #ifdef WITH_UNOFFICIAL_BREAKPAD - static bool MinidumpCallback(const google_breakpad::MinidumpDescriptor& descriptor, void* context, bool succeeded) + static bool MinidumpCallback(const google_breakpad::MinidumpDescriptor &descriptor, void *context, bool succeeded) { CrashLogUnix *crashlog = reinterpret_cast(context); diff --git a/src/pathfinder/yapf/nodelist.hpp b/src/pathfinder/yapf/nodelist.hpp index e4d91c6ee0..b74345e544 100644 --- a/src/pathfinder/yapf/nodelist.hpp +++ b/src/pathfinder/yapf/nodelist.hpp @@ -116,7 +116,7 @@ public: } /** remove and return the open node specified by a key */ - inline Titem_& PopOpenNode(const Key &key) + inline Titem_ &PopOpenNode(const Key &key) { Titem_ &item = m_open.Pop(key); uint idxPop = m_open_queue.FindIndex(item); @@ -145,7 +145,7 @@ public: } /** Get a particular item. */ - inline Titem_& ItemAt(int idx) + inline Titem_ &ItemAt(int idx) { return m_arr[idx]; } diff --git a/src/pathfinder/yapf/yapf_base.hpp b/src/pathfinder/yapf/yapf_base.hpp index 8c45efa1e3..d5d388cebe 100644 --- a/src/pathfinder/yapf/yapf_base.hpp +++ b/src/pathfinder/yapf/yapf_base.hpp @@ -87,14 +87,14 @@ public: protected: /** to access inherited path finder */ - inline Tpf& Yapf() + inline Tpf &Yapf() { return *static_cast(this); } public: /** return current settings (can be custom - company based - but later) */ - inline const YAPFSettings& PfGetSettings() const + inline const YAPFSettings &PfGetSettings() const { return *m_settings; } @@ -167,7 +167,7 @@ public: * Calls NodeList::CreateNewNode() - allocates new node that can be filled and used * as argument for AddStartupNode() or AddNewNode() */ - inline Node& CreateNewNode() + inline Node &CreateNewNode() { Node &node = *m_nodes.CreateNewNode(); return node; diff --git a/src/pathfinder/yapf/yapf_common.hpp b/src/pathfinder/yapf/yapf_common.hpp index e0e43c4689..796c3e05a3 100644 --- a/src/pathfinder/yapf/yapf_common.hpp +++ b/src/pathfinder/yapf/yapf_common.hpp @@ -24,7 +24,7 @@ protected: TrackdirBits m_orgTrackdirs; ///< origin trackdir mask /** to access inherited path finder */ - inline Tpf& Yapf() + inline Tpf &Yapf() { return *static_cast(this); } @@ -68,7 +68,7 @@ protected: bool m_treat_first_red_two_way_signal_as_eol; ///< in some cases (leaving station) we need to handle first two-way signal differently /** to access inherited path finder */ - inline Tpf& Yapf() + inline Tpf &Yapf() { return *static_cast(this); } @@ -131,7 +131,7 @@ public: protected: /** to access inherited path finder */ - Tpf& Yapf() + Tpf &Yapf() { return *static_cast(this); } diff --git a/src/pathfinder/yapf/yapf_costcache.hpp b/src/pathfinder/yapf/yapf_costcache.hpp index 2f453b846a..06e8566a79 100644 --- a/src/pathfinder/yapf/yapf_costcache.hpp +++ b/src/pathfinder/yapf/yapf_costcache.hpp @@ -63,7 +63,7 @@ protected: LocalCache m_local_cache; /** to access inherited path finder */ - inline Tpf& Yapf() + inline Tpf &Yapf() { return *static_cast(this); } @@ -138,7 +138,7 @@ struct CSegmentCostCacheT : public CSegmentCostCacheBase { m_heap.Clear(); } - inline Tsegment& Get(Key &key, bool *found) + inline Tsegment &Get(Key &key, bool *found) { Tsegment *item = m_map.Find(key); if (item == nullptr) { @@ -174,12 +174,12 @@ protected: inline CYapfSegmentCostCacheGlobalT() : m_global_cache(stGetGlobalCache()) {}; /** to access inherited path finder */ - inline Tpf& Yapf() + inline Tpf &Yapf() { return *static_cast(this); } - inline static Cache& stGetGlobalCache() + inline static Cache &stGetGlobalCache() { static int last_rail_change_counter = 0; static Cache C; diff --git a/src/pathfinder/yapf/yapf_costrail.hpp b/src/pathfinder/yapf/yapf_costrail.hpp index 042ccf9275..0ce9e478de 100644 --- a/src/pathfinder/yapf/yapf_costrail.hpp +++ b/src/pathfinder/yapf/yapf_costrail.hpp @@ -77,7 +77,7 @@ protected: } /** to access inherited path finder */ - Tpf& Yapf() + Tpf &Yapf() { return *static_cast(this); } diff --git a/src/pathfinder/yapf/yapf_destrail.hpp b/src/pathfinder/yapf/yapf_destrail.hpp index e9167d3fdb..7abc4294ee 100644 --- a/src/pathfinder/yapf/yapf_destrail.hpp +++ b/src/pathfinder/yapf/yapf_destrail.hpp @@ -40,7 +40,7 @@ public: typedef typename Node::Key Key; ///< key to hash tables /** to access inherited path finder */ - Tpf& Yapf() + Tpf &Yapf() { return *static_cast(this); } @@ -78,7 +78,7 @@ public: typedef typename Types::TrackFollower TrackFollower; ///< TrackFollower. Need to typedef for gcc 2.95 /** to access inherited path finder */ - Tpf& Yapf() + Tpf &Yapf() { return *static_cast(this); } @@ -121,7 +121,7 @@ protected: bool m_any_depot; /** to access inherited path finder */ - Tpf& Yapf() + Tpf &Yapf() { return *static_cast(this); } diff --git a/src/pathfinder/yapf/yapf_node.hpp b/src/pathfinder/yapf/yapf_node.hpp index 760ed330bb..82c212708b 100644 --- a/src/pathfinder/yapf/yapf_node.hpp +++ b/src/pathfinder/yapf/yapf_node.hpp @@ -97,7 +97,7 @@ struct CYapfNodeT { return m_key.m_td; } - inline const Tkey_& GetKey() const + inline const Tkey_ &GetKey() const { return m_key; } diff --git a/src/pathfinder/yapf/yapf_node_rail.hpp b/src/pathfinder/yapf/yapf_node_rail.hpp index a7a0795150..9185009df6 100644 --- a/src/pathfinder/yapf/yapf_node_rail.hpp +++ b/src/pathfinder/yapf/yapf_node_rail.hpp @@ -82,7 +82,7 @@ struct CYapfRailSegment , m_hash_next(nullptr) {} - inline const Key& GetKey() const + inline const Key &GetKey() const { return m_key; } diff --git a/src/pathfinder/yapf/yapf_rail.cpp b/src/pathfinder/yapf/yapf_rail.cpp index ee7ba618be..94ec48f127 100644 --- a/src/pathfinder/yapf/yapf_rail.cpp +++ b/src/pathfinder/yapf/yapf_rail.cpp @@ -44,7 +44,7 @@ public: protected: /** to access inherited pathfinder */ - inline Tpf& Yapf() + inline Tpf &Yapf() { return *static_cast(this); } @@ -196,7 +196,7 @@ public: protected: /** to access inherited path finder */ - inline Tpf& Yapf() + inline Tpf &Yapf() { return *static_cast(this); } @@ -287,7 +287,7 @@ public: protected: /** to access inherited path finder */ - inline Tpf& Yapf() + inline Tpf &Yapf() { return *static_cast(this); } @@ -370,7 +370,7 @@ public: protected: /** to access inherited path finder */ - inline Tpf& Yapf() + inline Tpf &Yapf() { return *static_cast(this); } diff --git a/src/pathfinder/yapf/yapf_road.cpp b/src/pathfinder/yapf/yapf_road.cpp index 86749c4f23..2cb55ea059 100644 --- a/src/pathfinder/yapf/yapf_road.cpp +++ b/src/pathfinder/yapf/yapf_road.cpp @@ -30,7 +30,7 @@ protected: CYapfCostRoadT() : m_max_cost(0) {}; /** to access inherited path finder */ - Tpf& Yapf() + Tpf &Yapf() { return *static_cast(this); } @@ -191,7 +191,7 @@ public: typedef typename Node::Key Key; ///< key to hash tables /** to access inherited path finder */ - Tpf& Yapf() + Tpf &Yapf() { return *static_cast(this); } @@ -258,7 +258,7 @@ public: protected: /** to access inherited path finder */ - Tpf& Yapf() + Tpf &Yapf() { return *static_cast(this); } @@ -325,7 +325,7 @@ public: protected: /** to access inherited path finder */ - inline Tpf& Yapf() + inline Tpf &Yapf() { return *static_cast(this); } diff --git a/src/pathfinder/yapf/yapf_ship.cpp b/src/pathfinder/yapf/yapf_ship.cpp index 947de5a764..0cef7d2a48 100644 --- a/src/pathfinder/yapf/yapf_ship.cpp +++ b/src/pathfinder/yapf/yapf_ship.cpp @@ -47,14 +47,14 @@ public: protected: /** to access inherited path finder */ - inline Tpf& Yapf() + inline Tpf &Yapf() { return *static_cast(this); } public: /** Called by YAPF to detect if node ends in the desired destination */ - inline bool PfDetectDestination(Node& n) + inline bool PfDetectDestination(Node &n) { return PfDetectDestinationTile(n.m_segment_last_tile, n.m_segment_last_td); } @@ -72,7 +72,7 @@ public: * Called by YAPF to calculate cost estimate. Calculates distance to the destination * adds it to the actual cost from origin and stores the sum to the Node::m_estimate */ - inline bool PfCalcEstimate(Node& n) + inline bool PfCalcEstimate(Node &n) { static const int dg_dir_to_x_offs[] = {-1, 0, 1, 0}; static const int dg_dir_to_y_offs[] = {0, 1, 0, -1}; @@ -111,7 +111,7 @@ public: protected: /** to access inherited path finder */ - inline Tpf& Yapf() + inline Tpf &Yapf() { return *static_cast(this); } @@ -254,7 +254,7 @@ public: protected: /** to access inherited path finder */ - Tpf& Yapf() + Tpf &Yapf() { return *static_cast(this); } diff --git a/src/road_cmd.cpp b/src/road_cmd.cpp index 53cc8e2278..592edd1b58 100644 --- a/src/road_cmd.cpp +++ b/src/road_cmd.cpp @@ -1404,7 +1404,7 @@ void DrawRoadTypeCatenary(const TileInfo *ti, RoadType rt, RoadBits rb) if (CountBits(rb_new) >= 2) rb = rb_new; } - const RoadTypeInfo* rti = GetRoadTypeInfo(rt); + const RoadTypeInfo *rti = GetRoadTypeInfo(rt); SpriteID front = GetCustomRoadSprite(rti, ti->tile, ROTSG_CATENARY_FRONT); SpriteID back = GetCustomRoadSprite(rti, ti->tile, ROTSG_CATENARY_BACK); @@ -1849,7 +1849,7 @@ void DrawRoadDepotSprite(int x, int y, DiagDirection dir, RoadType rt) { PaletteID palette = COMPANY_SPRITE_COLOUR(_local_company); - const RoadTypeInfo* rti = GetRoadTypeInfo(rt); + const RoadTypeInfo *rti = GetRoadTypeInfo(rt); int relocation = GetCustomRoadSprite(rti, INVALID_TILE, ROTSG_DEPOT); bool default_gfx = relocation == 0; if (default_gfx) { diff --git a/src/road_gui.cpp b/src/road_gui.cpp index 34cab6a898..1d513d49d4 100644 --- a/src/road_gui.cpp +++ b/src/road_gui.cpp @@ -755,7 +755,7 @@ struct BuildRoadToolbarWindow : Window { */ static EventState RoadTramToolbarGlobalHotkeys(int hotkey, RoadType last_build, RoadTramType rtt) { - Window* w = nullptr; + Window *w = nullptr; switch (_game_mode) { case GM_NORMAL: w = ShowBuildRoadToolbar(last_build); diff --git a/src/saveload/afterload.cpp b/src/saveload/afterload.cpp index ac75e3abcb..f72a01b886 100644 --- a/src/saveload/afterload.cpp +++ b/src/saveload/afterload.cpp @@ -1242,7 +1242,7 @@ bool AfterLoadGame() } } - for (Vehicle* v : Vehicle::Iterate()) { + for (Vehicle *v : Vehicle::Iterate()) { if (!v->IsGroundVehicle()) continue; if (IsBridgeTile(v->tile)) { DiagDirection dir = GetTunnelBridgeDirection(v->tile); @@ -2397,7 +2397,7 @@ bool AfterLoadGame() * 'default' names, after that we can assign the names. */ for (Depot *d : Depot::Iterate()) d->town_cn = UINT16_MAX; - for (Depot* d : Depot::Iterate()) MakeDefaultName(d); + for (Depot *d : Depot::Iterate()) MakeDefaultName(d); } if (IsSavegameVersionBefore(SLV_142)) { @@ -2482,7 +2482,7 @@ bool AfterLoadGame() if (!wp->name.empty()) wp->town_cn = UINT16_MAX; } - for (Waypoint* wp : Waypoint::Iterate()) { + for (Waypoint *wp : Waypoint::Iterate()) { if (!wp->name.empty()) MakeDefaultName(wp); } } diff --git a/src/saveload/engine_sl.cpp b/src/saveload/engine_sl.cpp index b8ecc89449..ab62d756a8 100644 --- a/src/saveload/engine_sl.cpp +++ b/src/saveload/engine_sl.cpp @@ -48,7 +48,7 @@ static std::vector _temp_engine; * The allocated Engine must be freed using FreeEngine; * @return Allocated engine. */ -static Engine* CallocEngine() +static Engine *CallocEngine() { uint8_t *zero = CallocT(sizeof(Engine)); Engine *engine = new (zero) Engine(); diff --git a/src/saveload/waypoint_sl.cpp b/src/saveload/waypoint_sl.cpp index de57120c98..7745c9b6e5 100644 --- a/src/saveload/waypoint_sl.cpp +++ b/src/saveload/waypoint_sl.cpp @@ -86,7 +86,7 @@ void MoveWaypointsToBaseStations() /* As of version 17, we recalculate the custom graphic ID of waypoints * from the GRF ID / station index. */ for (OldWaypoint &wp : _old_waypoints) { - StationClass* stclass = StationClass::Get(STAT_CLASS_WAYP); + StationClass *stclass = StationClass::Get(STAT_CLASS_WAYP); for (uint i = 0; i < stclass->GetSpecCount(); i++) { const StationSpec *statspec = stclass->GetSpec(i); if (statspec != nullptr && statspec->grf_prop.grffile->grfid == wp.grfid && statspec->grf_prop.local_id == wp.localidx) { diff --git a/src/settings_gui.cpp b/src/settings_gui.cpp index 8bd0f82fb3..47b2bf833b 100644 --- a/src/settings_gui.cpp +++ b/src/settings_gui.cpp @@ -87,10 +87,10 @@ static void ShowCustCurrency(); /** Window for displaying the textfile of a BaseSet. */ template struct BaseSetTextfileWindow : public TextfileWindow { - const TBaseSet* baseset; ///< View the textfile of this BaseSet. + const TBaseSet *baseset; ///< View the textfile of this BaseSet. StringID content_type; ///< STR_CONTENT_TYPE_xxx for title. - BaseSetTextfileWindow(TextfileType file_type, const TBaseSet* baseset, StringID content_type) : TextfileWindow(file_type), baseset(baseset), content_type(content_type) + BaseSetTextfileWindow(TextfileType file_type, const TBaseSet *baseset, StringID content_type) : TextfileWindow(file_type), baseset(baseset), content_type(content_type) { auto textfile = this->baseset->GetTextfile(file_type); this->LoadTextfile(textfile.value(), BASESET_DIR); @@ -112,7 +112,7 @@ struct BaseSetTextfileWindow : public TextfileWindow { * @param content_type STR_CONTENT_TYPE_xxx for title. */ template -void ShowBaseSetTextfileWindow(TextfileType file_type, const TBaseSet* baseset, StringID content_type) +void ShowBaseSetTextfileWindow(TextfileType file_type, const TBaseSet *baseset, StringID content_type) { CloseWindowById(WC_TEXTFILE, file_type); new BaseSetTextfileWindow(file_type, baseset, content_type); @@ -688,7 +688,7 @@ struct GameOptionsWindow : Window { case WID_GO_BASE_GRF_DROPDOWN: if (_game_mode == GM_MENU) { CloseWindowByClass(WC_GRF_PARAMETERS); - auto* set = BaseGraphics::GetSet(index); + auto set = BaseGraphics::GetSet(index); BaseGraphics::SetSet(set); this->reload = true; this->InvalidateData(); @@ -697,7 +697,7 @@ struct GameOptionsWindow : Window { case WID_GO_BASE_SFX_DROPDOWN: if (_game_mode == GM_MENU) { - auto* set = BaseSounds::GetSet(index); + auto set = BaseSounds::GetSet(index); BaseSounds::ini_set = set->name; BaseSounds::SetSet(set); this->reload = true; diff --git a/src/sortlist_type.h b/src/sortlist_type.h index d9fc170581..e0fd01c740 100644 --- a/src/sortlist_type.h +++ b/src/sortlist_type.h @@ -96,7 +96,7 @@ public: /* If sort parameters are used then we require a reference to the params. */ template >* = nullptr> - GUIList(const P& params) : + GUIList(const P ¶ms) : sort_func_list(nullptr), filter_func_list(nullptr), flags(VL_NONE), diff --git a/src/sound/xaudio2_s.cpp b/src/sound/xaudio2_s.cpp index f50a109dec..b4d08c4900 100644 --- a/src/sound/xaudio2_s.cpp +++ b/src/sound/xaudio2_s.cpp @@ -36,7 +36,7 @@ using Microsoft::WRL::ComPtr; #include "../safeguards.h" // Definition of the "XAudio2Create" call used to initialise XAudio2 -typedef HRESULT(__stdcall *API_XAudio2Create)(_Outptr_ IXAudio2** ppXAudio2, UINT32 Flags, XAUDIO2_PROCESSOR XAudio2Processor); +typedef HRESULT(__stdcall *API_XAudio2Create)(_Outptr_ IXAudio2 **ppXAudio2, UINT32 Flags, XAUDIO2_PROCESSOR XAudio2Processor); static FSoundDriver_XAudio2 iFSoundDriver_XAudio2; @@ -51,7 +51,7 @@ private: char *buffer; public: - IXAudio2SourceVoice* SourceVoice; + IXAudio2SourceVoice *SourceVoice; StreamingVoiceContext(int bufferLength) { @@ -112,10 +112,10 @@ public: }; static HMODULE _xaudio_dll_handle; -static IXAudio2SourceVoice* _source_voice = nullptr; -static IXAudio2MasteringVoice* _mastering_voice = nullptr; +static IXAudio2SourceVoice *_source_voice = nullptr; +static IXAudio2MasteringVoice *_mastering_voice = nullptr; static ComPtr _xaudio2; -static StreamingVoiceContext* _voice_context = nullptr; +static StreamingVoiceContext *_voice_context = nullptr; /** Create XAudio2 context with SEH exception checking. */ static HRESULT CreateXAudio(API_XAudio2Create xAudio2Create) diff --git a/src/station_cmd.cpp b/src/station_cmd.cpp index 4cbfab5979..ea2553bf77 100644 --- a/src/station_cmd.cpp +++ b/src/station_cmd.cpp @@ -3164,8 +3164,8 @@ draw_default_foundation: if (IsRoadStop(ti->tile)) { RoadType road_rt = GetRoadTypeRoad(ti->tile); RoadType tram_rt = GetRoadTypeTram(ti->tile); - const RoadTypeInfo* road_rti = road_rt == INVALID_ROADTYPE ? nullptr : GetRoadTypeInfo(road_rt); - const RoadTypeInfo* tram_rti = tram_rt == INVALID_ROADTYPE ? nullptr : GetRoadTypeInfo(tram_rt); + const RoadTypeInfo *road_rti = road_rt == INVALID_ROADTYPE ? nullptr : GetRoadTypeInfo(road_rt); + const RoadTypeInfo *tram_rti = tram_rt == INVALID_ROADTYPE ? nullptr : GetRoadTypeInfo(tram_rt); Axis axis = GetRoadStopDir(ti->tile) == DIAGDIR_NE ? AXIS_X : AXIS_Y; DiagDirection dir = GetRoadStopDir(ti->tile); diff --git a/src/story_gui.cpp b/src/story_gui.cpp index a3232194ca..b3f4647337 100644 --- a/src/story_gui.cpp +++ b/src/story_gui.cpp @@ -534,7 +534,7 @@ protected: * Internal event handler for when a page element is clicked. * @param pe The clicked page element. */ - void OnPageElementClick(const StoryPageElement& pe) + void OnPageElementClick(const StoryPageElement &pe) { switch (pe.type) { case SPET_TEXT: diff --git a/src/strings_internal.h b/src/strings_internal.h index e9e4b1921a..a0154c3b21 100644 --- a/src/strings_internal.h +++ b/src/strings_internal.h @@ -225,7 +225,7 @@ public: return *this; } - ArrayStringParameters(const ArrayStringParameters& other) = delete; + ArrayStringParameters(const ArrayStringParameters &other) = delete; ArrayStringParameters& operator=(const ArrayStringParameters &other) = delete; }; diff --git a/src/thread.h b/src/thread.h index 67140644c7..336a0317be 100644 --- a/src/thread.h +++ b/src/thread.h @@ -74,7 +74,7 @@ inline bool StartNewThread(std::thread *thr, const char *name, TFn&& _Fx, TArgs& } return true; - } catch (const std::system_error& e) { + } catch (const std::system_error &e) { /* Something went wrong, the system we are running on might not support threads. */ Debug(misc, 1, "Can't create thread '{}': {}", name, e.what()); } diff --git a/src/tilematrix_type.hpp b/src/tilematrix_type.hpp index ee5792ea24..006267b5bd 100644 --- a/src/tilematrix_type.hpp +++ b/src/tilematrix_type.hpp @@ -78,7 +78,7 @@ public: * Get the total covered area. * @return The area covered by the matrix. */ - const TileArea& GetArea() const + const TileArea &GetArea() const { return this->area; } diff --git a/src/toolbar_gui.cpp b/src/toolbar_gui.cpp index 4ca6ad5383..0ff9cfe7eb 100644 --- a/src/toolbar_gui.cpp +++ b/src/toolbar_gui.cpp @@ -370,8 +370,8 @@ static CallBackFunction MenuClickSaveLoad(int index = 0) switch (index) { case SLEME_SAVE_SCENARIO: ShowSaveLoadDialog(FT_SCENARIO, SLO_SAVE); break; case SLEME_LOAD_SCENARIO: ShowSaveLoadDialog(FT_SCENARIO, SLO_LOAD); break; - case SLEME_SAVE_HEIGHTMAP: ShowSaveLoadDialog(FT_HEIGHTMAP,SLO_SAVE); break; - case SLEME_LOAD_HEIGHTMAP: ShowSaveLoadDialog(FT_HEIGHTMAP,SLO_LOAD); break; + case SLEME_SAVE_HEIGHTMAP: ShowSaveLoadDialog(FT_HEIGHTMAP, SLO_SAVE); break; + case SLEME_LOAD_HEIGHTMAP: ShowSaveLoadDialog(FT_HEIGHTMAP, SLO_LOAD); break; case SLEME_EXIT_TOINTRO: AskExitToGameMenu(); break; case SLEME_EXIT_GAME: HandleExitGameRequest(); break; } diff --git a/src/vehicle.cpp b/src/vehicle.cpp index a202aa0cb3..b4b6a53de0 100644 --- a/src/vehicle.cpp +++ b/src/vehicle.cpp @@ -3045,7 +3045,7 @@ uint32_t Vehicle::GetDisplayMaxWeight() const { uint32_t max_weight = 0; - for (const Vehicle* u = this; u != nullptr; u = u->Next()) { + for (const Vehicle *u = this; u != nullptr; u = u->Next()) { max_weight += u->GetMaxWeight(); } diff --git a/src/vehicle_base.h b/src/vehicle_base.h index cd0ac70aae..b1ddea8a61 100644 --- a/src/vehicle_base.h +++ b/src/vehicle_base.h @@ -1017,8 +1017,8 @@ public: */ struct OrderIterator { typedef Order value_type; - typedef Order* pointer; - typedef Order& reference; + typedef Order *pointer; + typedef Order &reference; typedef size_t difference_type; typedef std::forward_iterator_tag iterator_category; diff --git a/src/video/cocoa/cocoa_ogl.h b/src/video/cocoa/cocoa_ogl.h index b8a06c3bae..16f0f11900 100644 --- a/src/video/cocoa/cocoa_ogl.h +++ b/src/video/cocoa/cocoa_ogl.h @@ -52,7 +52,7 @@ protected: void *GetVideoPointer() override; void ReleaseVideoPointer() override; - NSView* AllocateDrawView() override; + NSView *AllocateDrawView() override; }; class FVideoDriver_CocoaOpenGL : public DriverFactoryBase { diff --git a/src/video/cocoa/cocoa_v.h b/src/video/cocoa/cocoa_v.h index 8606a902bc..2244f99204 100644 --- a/src/video/cocoa/cocoa_v.h +++ b/src/video/cocoa/cocoa_v.h @@ -78,7 +78,7 @@ protected: bool MakeWindow(int width, int height); - virtual NSView* AllocateDrawView() = 0; + virtual NSView *AllocateDrawView() = 0; /** Get a pointer to the video buffer. */ virtual void *GetVideoPointer() = 0; @@ -121,7 +121,7 @@ protected: void Paint() override; void CheckPaletteAnim() override; - NSView* AllocateDrawView() override; + NSView *AllocateDrawView() override; void *GetVideoPointer() override { return this->buffer_depth == 8 ? this->pixel_buffer : this->window_buffer; } }; diff --git a/src/video/cocoa/cocoa_v.mm b/src/video/cocoa/cocoa_v.mm index 0be6745b0c..23979b4ef4 100644 --- a/src/video/cocoa/cocoa_v.mm +++ b/src/video/cocoa/cocoa_v.mm @@ -400,7 +400,7 @@ bool VideoDriver_Cocoa::MakeWindow(int width, int height) behavior |= NSWindowCollectionBehaviorFullScreenPrimary; [ this->window setCollectionBehavior:behavior ]; - NSButton* fullscreenButton = [ this->window standardWindowButton:NSWindowZoomButton ]; + NSButton *fullscreenButton = [ this->window standardWindowButton:NSWindowZoomButton ]; [ fullscreenButton setAction:@selector(toggleFullScreen:) ]; [ fullscreenButton setTarget:this->window ]; } diff --git a/src/widgets/dropdown_type.h b/src/widgets/dropdown_type.h index 2a079b5e73..c3aad63bd1 100644 --- a/src/widgets/dropdown_type.h +++ b/src/widgets/dropdown_type.h @@ -117,12 +117,12 @@ public: } /** - * Natural sorting comparator function for DropDownList::sort(). - * @param first Left side of comparison. - * @param second Right side of comparison. - * @return true if \a first precedes \a second. - * @warning All items in the list need to be derivates of DropDownListStringItem. - */ + * Natural sorting comparator function for DropDownList::sort(). + * @param first Left side of comparison. + * @param second Right side of comparison. + * @return true if \a first precedes \a second. + * @warning All items in the list need to be derivates of DropDownListStringItem. + */ static bool NatSortFunc(std::unique_ptr const &first, std::unique_ptr const &second) { const std::string &str1 = static_cast(first.get())->string; diff --git a/src/window.cpp b/src/window.cpp index 8f99f252a4..0c22944151 100644 --- a/src/window.cpp +++ b/src/window.cpp @@ -166,7 +166,7 @@ void WindowDesc::LoadFromConfig() /** * Sort WindowDesc by ini_key. */ -static bool DescSorter(WindowDesc* const &a, WindowDesc* const &b) +static bool DescSorter(WindowDesc * const &a, WindowDesc * const &b) { if (a->ini_key != nullptr && b->ini_key != nullptr) return strcmp(a->ini_key, b->ini_key) < 0; return a->ini_key != nullptr; From 6522351a1f66d45eea213560b820d7ad09538d45 Mon Sep 17 00:00:00 2001 From: EmperorJake <68182631+EmperorJake@users.noreply.github.com> Date: Thu, 4 Jan 2024 23:03:11 +1100 Subject: [PATCH 05/13] Feature: Setting to disable the loading speed penalty for trains longer than the station --- .DS_Store | Bin 0 -> 8196 bytes src/economy.cpp | 2 +- src/lang/english.txt | 3 +++ src/settings_gui.cpp | 1 + src/settings_type.h | 1 + src/table/settings/game_settings.ini | 7 +++++++ 6 files changed, 13 insertions(+), 1 deletion(-) create mode 100644 .DS_Store diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..b179567118f04d786067ad30991c86cf3f0e7835 GIT binary patch literal 8196 zcmeHMU2GIp6u#fIg&8`~0a{zIBbzQnz!qu?cKJ)Tf69N6ZRxfYmf4+=4oqjt&g>Q} zHI0c6qG){5_!oWhhscA97+-u)6n#`Q!5AMf8h;)%(HE5m&&-_#+QNg0F^Y4Oxo6Hf z_uM<@-0$4kGs_r5M?t@nu{y?>NS9BQO6soDe7%3oXhJ9{CknD>%*c+pqgl(z&KMgB zq6kD0h$0Y0Ac{Z~fqzE?=$-91@dodGu8sOA0#OA1ml5#KhZtQxO@?%m)8Oc!E+_$r z`XxZn=$`6;z$O;bWJo7D4NPfHUOgZ*MOb2ho0C4~4=0)o=_IGzoPnD&gexPgP!Oz6 zcClbMLz2^|k0KC7U}gmT^r>JuHo`P^cuM_#HalvWuGifBIfSzEidnNoQLGgArG}lc zl&5(Gw?oVC^|@Zhv9hImExX4w#xhEEr(=7XX&d>#z|;*IGSqL{x--_{6l~oMY*Snz zN|KaOYRAVDiN@HPMC(LjYBLlr zEVtOnKS-3NN)CNda!8s}DbH2=(*uL@P)1o$q$lqg^-RZh_ZWGXXhx}W$-^x<$KI7U ze0_h;u?i!$n^ETHG%HuIG|y*T%8 zV6u#&6kKDsL35c!ql;#A(!y9MZ_L!a;r^oOnpw-}wY3pLnvX{5LRHdbb7cQj_$9bi^>_AhgM&vHmG}jO=sSqUJngcsCUS{F8LrT z8XveyZkBrw69y#3<&su;t=ea4S;LYPov)LS*Q@DqNY@L_S?qAE3|_KC_TB5jdr7fr%FZ7YYr7*D#*!S2M9EBP+POPj?59Zzz-|M^U1 zEv$=eX9rlGjkA;NDRzpz$LM@S2ra7b{3QSOjXO16C^2SfQW zqSu@rlx*SGKjHNCldb-q&0Dt0+y67kc5z;iUez_X)W(*rT)if-sr?EJIc`f(y*2>? z)KAHk0QCVXrXlu1kcaYZOG=4%H5GYk_EEYRM@2ttmD%Cw_)?M5MX3nc@wke9u}ewx1*WR-GR;68Q?pGKI}&Z2atu15!i5Wgpht56LdPDsNkk zeUPLjtype == VEH_TRAIN) { + if (front->type == VEH_TRAIN && _settings_game.order.station_length_loading_penalty) { /* Each platform tile is worth 2 rail vehicles. */ int overhang = front->GetGroundVehicleCache()->cached_total_length - st->GetPlatformLength(front->tile) * TILE_SIZE; if (overhang > 0) { diff --git a/src/lang/english.txt b/src/lang/english.txt index 7c1c6ae2e6..09aac5258a 100644 --- a/src/lang/english.txt +++ b/src/lang/english.txt @@ -1777,6 +1777,9 @@ STR_CONFIG_SETTING_SERVINT_DISABLED :Disabled STR_CONFIG_SETTING_NOSERVICE :Disable servicing when breakdowns set to none: {STRING2} STR_CONFIG_SETTING_NOSERVICE_HELPTEXT :When enabled, vehicles do not get serviced if they cannot break down +STR_CONFIG_SETTING_STATION_LENGTH_LOADING_PENALTY :Loading speed penalty for trains that are longer than the station: {STRING2} +STR_CONFIG_SETTING_STATION_LENGTH_LOADING_PENALTY_HELPTEXT :When enabled, trains which are too long for the station load more slowly than a train which fits the station. This setting does not affect pathfinding. + STR_CONFIG_SETTING_WAGONSPEEDLIMITS :Enable wagon speed limits: {STRING2} STR_CONFIG_SETTING_WAGONSPEEDLIMITS_HELPTEXT :When enabled, also use speed limits of wagons for deciding the maximum speed of a train diff --git a/src/settings_gui.cpp b/src/settings_gui.cpp index 47b2bf833b..23f0000189 100644 --- a/src/settings_gui.cpp +++ b/src/settings_gui.cpp @@ -1918,6 +1918,7 @@ static SettingsContainer &GetSettingsTree() limitations->Add(new SettingEntry("construction.road_stop_on_competitor_road")); limitations->Add(new SettingEntry("construction.crossing_with_competitor")); limitations->Add(new SettingEntry("vehicle.disable_elrails")); + limitations->Add(new SettingEntry("order.station_length_loading_penalty")); } SettingsPage *disasters = main->Add(new SettingsPage(STR_CONFIG_SETTING_ACCIDENTS)); diff --git a/src/settings_type.h b/src/settings_type.h index 8ac229ed72..8e9c40e3f1 100644 --- a/src/settings_type.h +++ b/src/settings_type.h @@ -501,6 +501,7 @@ struct OrderSettings { bool selectgoods; ///< only send the goods to station if a train has been there bool no_servicing_if_no_breakdowns; ///< don't send vehicles to depot when breakdowns are disabled bool serviceathelipad; ///< service helicopters at helipads automatically (no need to send to depot) + bool station_length_loading_penalty; ///< make trains longer than the station load more slowly }; /** Settings related to vehicles. */ diff --git a/src/table/settings/game_settings.ini b/src/table/settings/game_settings.ini index 7c4fdf51c9..7902d17a4c 100644 --- a/src/table/settings/game_settings.ini +++ b/src/table/settings/game_settings.ini @@ -78,6 +78,13 @@ str = STR_CONFIG_SETTING_SERVICEATHELIPAD strhelp = STR_CONFIG_SETTING_SERVICEATHELIPAD_HELPTEXT cat = SC_EXPERT +[SDT_BOOL] +var = order.station_length_loading_penalty +def = true +str = STR_CONFIG_SETTING_STATION_LENGTH_LOADING_PENALTY +strhelp = STR_CONFIG_SETTING_STATION_LENGTH_LOADING_PENALTY_HELPTEXT +cat = SC_EXPERT + [SDT_BOOL] var = order.gradual_loading from = SLV_40 From a3576e48c1f1da38f6694803e9a0e6b5450454f2 Mon Sep 17 00:00:00 2001 From: Tyler Trahan Date: Thu, 4 Jan 2024 12:02:16 -0500 Subject: [PATCH 06/13] Cleanup: Remove DS_Store added in #11682 (#11684) --- .DS_Store | Bin 8196 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 .DS_Store diff --git a/.DS_Store b/.DS_Store deleted file mode 100644 index b179567118f04d786067ad30991c86cf3f0e7835..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8196 zcmeHMU2GIp6u#fIg&8`~0a{zIBbzQnz!qu?cKJ)Tf69N6ZRxfYmf4+=4oqjt&g>Q} zHI0c6qG){5_!oWhhscA97+-u)6n#`Q!5AMf8h;)%(HE5m&&-_#+QNg0F^Y4Oxo6Hf z_uM<@-0$4kGs_r5M?t@nu{y?>NS9BQO6soDe7%3oXhJ9{CknD>%*c+pqgl(z&KMgB zq6kD0h$0Y0Ac{Z~fqzE?=$-91@dodGu8sOA0#OA1ml5#KhZtQxO@?%m)8Oc!E+_$r z`XxZn=$`6;z$O;bWJo7D4NPfHUOgZ*MOb2ho0C4~4=0)o=_IGzoPnD&gexPgP!Oz6 zcClbMLz2^|k0KC7U}gmT^r>JuHo`P^cuM_#HalvWuGifBIfSzEidnNoQLGgArG}lc zl&5(Gw?oVC^|@Zhv9hImExX4w#xhEEr(=7XX&d>#z|;*IGSqL{x--_{6l~oMY*Snz zN|KaOYRAVDiN@HPMC(LjYBLlr zEVtOnKS-3NN)CNda!8s}DbH2=(*uL@P)1o$q$lqg^-RZh_ZWGXXhx}W$-^x<$KI7U ze0_h;u?i!$n^ETHG%HuIG|y*T%8 zV6u#&6kKDsL35c!ql;#A(!y9MZ_L!a;r^oOnpw-}wY3pLnvX{5LRHdbb7cQj_$9bi^>_AhgM&vHmG}jO=sSqUJngcsCUS{F8LrT z8XveyZkBrw69y#3<&su;t=ea4S;LYPov)LS*Q@DqNY@L_S?qAE3|_KC_TB5jdr7fr%FZ7YYr7*D#*!S2M9EBP+POPj?59Zzz-|M^U1 zEv$=eX9rlGjkA;NDRzpz$LM@S2ra7b{3QSOjXO16C^2SfQW zqSu@rlx*SGKjHNCldb-q&0Dt0+y67kc5z;iUez_X)W(*rT)if-sr?EJIc`f(y*2>? z)KAHk0QCVXrXlu1kcaYZOG=4%H5GYk_EEYRM@2ttmD%Cw_)?M5MX3nc@wke9u}ewx1*WR-GR;68Q?pGKI}&Z2atu15!i5Wgpht56LdPDsNkk zeUPLj Date: Thu, 4 Jan 2024 00:25:07 +0000 Subject: [PATCH 07/13] Codechange: No longer advance parent offset in StringParameters parent mode Add method to manually advance offset --- src/strings.cpp | 1 + src/strings_internal.h | 20 ++++++++++++-------- 2 files changed, 13 insertions(+), 8 deletions(-) diff --git a/src/strings.cpp b/src/strings.cpp index a0f1387972..65bde033fe 100644 --- a/src/strings.cpp +++ b/src/strings.cpp @@ -1140,6 +1140,7 @@ static void FormatString(StringBuilder &builder, const char *str_arg, StringPara } else { StringParameters sub_args(args, size); GetStringWithArgs(builder, string_id, sub_args, next_substr_case_index, game_script); + args.AdvanceOffset(size); } next_substr_case_index = 0; break; diff --git a/src/strings_internal.h b/src/strings_internal.h index a0154c3b21..b7e521cc2b 100644 --- a/src/strings_internal.h +++ b/src/strings_internal.h @@ -39,20 +39,13 @@ protected: public: /** * Create a new StringParameters instance that can reference part of the data of - * the given partent instance. + * the given parent instance. */ StringParameters(StringParameters &parent, size_t size) : parent(&parent), parameters(parent.parameters.subspan(parent.offset, size)) {} - ~StringParameters() - { - if (this->parent != nullptr) { - this->parent->offset += this->parameters.size(); - } - } - void PrepareForNextRun(); void SetTypeOfNextParameter(char32_t type) { this->next_type = type; } @@ -81,6 +74,17 @@ public: this->offset = offset; } + /** + * Advance the offset within the string from where to return the next result of + * \c GetInt64 or \c GetInt32. + * @param advance The amount to advance the offset by. + */ + void AdvanceOffset(size_t advance) + { + this->offset += advance; + assert(this->offset <= this->parameters.size()); + } + /** * Get the next parameter from our parameters. * This updates the offset, so the next time this is called the next parameter From 5db9266f4b56887cacad8b178ade91f4bd49344d Mon Sep 17 00:00:00 2001 From: Jonathan G Rennison Date: Thu, 4 Jan 2024 01:51:40 +0000 Subject: [PATCH 08/13] Change: Allow STRING/STRINGN to use all remaining parameters in game script mode --- src/strings.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/strings.cpp b/src/strings.cpp index 65bde033fe..1e29b2493f 100644 --- a/src/strings.cpp +++ b/src/strings.cpp @@ -1118,7 +1118,7 @@ static void FormatString(StringBuilder &builder, const char *str_arg, StringPara StringID string_id = args.GetNextParameter(); if (game_script && GetStringTab(string_id) != TEXT_TAB_GAMESCRIPT_START) break; /* It's prohibited for the included string to consume any arguments. */ - StringParameters tmp_params(args, 0); + StringParameters tmp_params(args, game_script ? args.GetDataLeft() : 0); GetStringWithArgs(builder, string_id, tmp_params, next_substr_case_index, game_script); next_substr_case_index = 0; break; @@ -1138,7 +1138,7 @@ static void FormatString(StringBuilder &builder, const char *str_arg, StringPara if (game_script && size > args.GetDataLeft()) { builder += "(too many parameters)"; } else { - StringParameters sub_args(args, size); + StringParameters sub_args(args, game_script ? args.GetDataLeft() : size); GetStringWithArgs(builder, string_id, sub_args, next_substr_case_index, game_script); args.AdvanceOffset(size); } From c44faf4eea7d18a50ba84890b7ca818c70e7d11a Mon Sep 17 00:00:00 2001 From: translators Date: Thu, 4 Jan 2024 18:39:48 +0000 Subject: [PATCH 09/13] Update: Translations from eints english (us): 2 changes by 2TallTyler chinese (simplified): 39 changes by WenSimEHRP polish: 29 changes by pAter-exe --- src/lang/afrikaans.txt | 1 + src/lang/arabic_egypt.txt | 1 + src/lang/basque.txt | 1 + src/lang/belarusian.txt | 1 + src/lang/brazilian_portuguese.txt | 1 + src/lang/bulgarian.txt | 1 + src/lang/catalan.txt | 1 + src/lang/chuvash.txt | 1 + src/lang/croatian.txt | 1 + src/lang/czech.txt | 1 + src/lang/danish.txt | 1 + src/lang/dutch.txt | 1 + src/lang/english_AU.txt | 1 + src/lang/english_US.txt | 5 ++- src/lang/esperanto.txt | 1 + src/lang/estonian.txt | 1 + src/lang/faroese.txt | 1 + src/lang/finnish.txt | 1 + src/lang/french.txt | 1 + src/lang/frisian.txt | 1 + src/lang/gaelic.txt | 1 + src/lang/galician.txt | 1 + src/lang/german.txt | 1 + src/lang/greek.txt | 1 + src/lang/hebrew.txt | 1 + src/lang/hindi.txt | 1 + src/lang/hungarian.txt | 1 + src/lang/icelandic.txt | 1 + src/lang/ido.txt | 1 + src/lang/indonesian.txt | 1 + src/lang/irish.txt | 1 + src/lang/italian.txt | 1 + src/lang/japanese.txt | 1 + src/lang/korean.txt | 1 + src/lang/latin.txt | 1 + src/lang/latvian.txt | 1 + src/lang/lithuanian.txt | 1 + src/lang/luxembourgish.txt | 1 + src/lang/macedonian.txt | 1 + src/lang/malay.txt | 1 + src/lang/maltese.txt | 1 + src/lang/marathi.txt | 1 + src/lang/norwegian_bokmal.txt | 1 + src/lang/norwegian_nynorsk.txt | 1 + src/lang/persian.txt | 1 + src/lang/polish.txt | 30 +++++++++++++ src/lang/portuguese.txt | 1 + src/lang/romanian.txt | 1 + src/lang/russian.txt | 1 + src/lang/serbian.txt | 1 + src/lang/simplified_chinese.txt | 71 +++++++++++++++++-------------- src/lang/slovak.txt | 1 + src/lang/slovenian.txt | 1 + src/lang/spanish.txt | 1 + src/lang/spanish_MX.txt | 1 + src/lang/swedish.txt | 1 + src/lang/tamil.txt | 1 + src/lang/thai.txt | 1 + src/lang/traditional_chinese.txt | 1 + src/lang/turkish.txt | 1 + src/lang/ukrainian.txt | 1 + src/lang/urdu.txt | 1 + src/lang/vietnamese.txt | 1 + src/lang/welsh.txt | 1 + 64 files changed, 134 insertions(+), 33 deletions(-) diff --git a/src/lang/afrikaans.txt b/src/lang/afrikaans.txt index e73af9446d..a40e74a38b 100644 --- a/src/lang/afrikaans.txt +++ b/src/lang/afrikaans.txt @@ -1606,6 +1606,7 @@ STR_CONFIG_SETTING_SERVINT_DISABLED :Gedeaktiveer STR_CONFIG_SETTING_NOSERVICE :Sper diens wanneer komplikasies is na geen gestel: {STRING} STR_CONFIG_SETTING_NOSERVICE_HELPTEXT :As dit geaktiveerd is, word voertuie nie gediens as hulle nie kan onklaar raak nie + STR_CONFIG_SETTING_WAGONSPEEDLIMITS :Laat wa spoed beperkings toe: {STRING} STR_CONFIG_SETTING_WAGONSPEEDLIMITS_HELPTEXT :As dit geaktiveer is bepaal die spoedbeperking van treinwaens ook die maksimum spoed van die hele trein diff --git a/src/lang/arabic_egypt.txt b/src/lang/arabic_egypt.txt index c6bb6d2ffa..3634effa6c 100644 --- a/src/lang/arabic_egypt.txt +++ b/src/lang/arabic_egypt.txt @@ -1485,6 +1485,7 @@ STR_CONFIG_SETTING_SERVINT_AIRCRAFT ::مدة فحص STR_CONFIG_SETTING_NOSERVICE :الغاء الصيانة عندما يكون التعطيل للمركبات غير مفعل: {STRING} + STR_CONFIG_SETTING_WAGONSPEEDLIMITS :السماح بتحديد سرعة العربات: {STRING} STR_CONFIG_SETTING_DISABLE_ELRAILS :تعطيل سكة القطار الكهربائي: {STRING} diff --git a/src/lang/basque.txt b/src/lang/basque.txt index 8b22e53b74..9068607591 100644 --- a/src/lang/basque.txt +++ b/src/lang/basque.txt @@ -1538,6 +1538,7 @@ STR_CONFIG_SETTING_SERVINT_DISABLED :Desgaitua STR_CONFIG_SETTING_NOSERVICE :Mantenimendua desgaitu ibilgailuen matxurak kenduta daudenean: {STRING} STR_CONFIG_SETTING_NOSERVICE_HELPTEXT :Gaitua dagoenean, ibilgailuek ez dute mantenimendurik jasoko ezin badira matxuratu + STR_CONFIG_SETTING_WAGONSPEEDLIMITS :Bagoiaren abiadura mugak aktibatu: {STRING} STR_CONFIG_SETTING_WAGONSPEEDLIMITS_HELPTEXT :Gaitua dagoenean, bagoien gehienezko abiadura erabili trenen geheienezko abiadura zehazteko diff --git a/src/lang/belarusian.txt b/src/lang/belarusian.txt index 740fedb542..7e7673d499 100644 --- a/src/lang/belarusian.txt +++ b/src/lang/belarusian.txt @@ -1925,6 +1925,7 @@ STR_CONFIG_SETTING_SERVINT_DISABLED :адключа STR_CONFIG_SETTING_NOSERVICE :Адключыць абслугоўваньне, калі скасаваны паломкі: {STRING} STR_CONFIG_SETTING_NOSERVICE_HELPTEXT :Калі ўключана, транспарт не абслугоўваецца ўвогуле, калі адключаны паломкі. + STR_CONFIG_SETTING_WAGONSPEEDLIMITS :Уключыць абмежаваньне хуткасьці ваґонаў: {STRING} STR_CONFIG_SETTING_WAGONSPEEDLIMITS_HELPTEXT :Калі ўключана, выкарыстоўваць таксама й ліміты хуткасьці ў асобных ваґонаў для вызначэньня максымальнай хуткасьці ўсяго цягніка. diff --git a/src/lang/brazilian_portuguese.txt b/src/lang/brazilian_portuguese.txt index 6acd1b88dc..916c8842b8 100644 --- a/src/lang/brazilian_portuguese.txt +++ b/src/lang/brazilian_portuguese.txt @@ -1778,6 +1778,7 @@ STR_CONFIG_SETTING_SERVINT_DISABLED :Desativado STR_CONFIG_SETTING_NOSERVICE :Desativar manutenção quando as quebras estão desativadas: {STRING} STR_CONFIG_SETTING_NOSERVICE_HELPTEXT :Quando ativado, veículos não sofrem manutenção se não puderem quebrar + STR_CONFIG_SETTING_WAGONSPEEDLIMITS :Ativar limite de velocidade dos vagões: {STRING} STR_CONFIG_SETTING_WAGONSPEEDLIMITS_HELPTEXT :Ativado, usa limites de velocidade para vagões para decidir a velocidade máxima de um trem diff --git a/src/lang/bulgarian.txt b/src/lang/bulgarian.txt index d92af42511..55fcc51ffe 100644 --- a/src/lang/bulgarian.txt +++ b/src/lang/bulgarian.txt @@ -1570,6 +1570,7 @@ STR_CONFIG_SETTING_SERVINT_DISABLED :Изключе STR_CONFIG_SETTING_NOSERVICE :Без сервиз когато повредите са изключени: {STRING.n} STR_CONFIG_SETTING_NOSERVICE_HELPTEXT :Ако тази опция бъде активирана, превозните средсва няма да бъдат обслужвани, ако не могат да се повредят + STR_CONFIG_SETTING_WAGONSPEEDLIMITS :Вагоните имат ограничение на скоростта: {STRING} STR_CONFIG_SETTING_WAGONSPEEDLIMITS_HELPTEXT :Ако тази опция бъде активирана, максималната скорост на вагоните ще се взима впредвид при изчисляването на максималната скорост на влака diff --git a/src/lang/catalan.txt b/src/lang/catalan.txt index 6ea013392b..8bdd1b8712 100644 --- a/src/lang/catalan.txt +++ b/src/lang/catalan.txt @@ -1778,6 +1778,7 @@ STR_CONFIG_SETTING_SERVINT_DISABLED :Desactivat STR_CONFIG_SETTING_NOSERVICE :Desactiva les revisions quan les avaries s'estableixen a cap: {STRING} STR_CONFIG_SETTING_NOSERVICE_HELPTEXT :Quan està activat, els vehicles no són revisats si no es poden espatllar + STR_CONFIG_SETTING_WAGONSPEEDLIMITS :Activa límits de velocitat per als vagons: {STRING} STR_CONFIG_SETTING_WAGONSPEEDLIMITS_HELPTEXT :Quan està activat, també utilitza els límits de velocitat dels vagons per decidir la velocitat màxima del tren diff --git a/src/lang/chuvash.txt b/src/lang/chuvash.txt index 6447e31e9f..fd5d776dc1 100644 --- a/src/lang/chuvash.txt +++ b/src/lang/chuvash.txt @@ -767,6 +767,7 @@ STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES_ISO :ISO (2008-12-31 + STR_CONFIG_SETTING_NEWS_SUBSIDIES :Грантсем: {STRING} ###length 3 diff --git a/src/lang/croatian.txt b/src/lang/croatian.txt index e21092b4aa..4779595bf5 100644 --- a/src/lang/croatian.txt +++ b/src/lang/croatian.txt @@ -1721,6 +1721,7 @@ STR_CONFIG_SETTING_SERVINT_DISABLED :Isključeno STR_CONFIG_SETTING_NOSERVICE :Isključi servisiranje kada su kvarovi postavljeni na nula: {STRING} STR_CONFIG_SETTING_NOSERVICE_HELPTEXT :Kada je uključeno, vozila se ne servisiraju kada se ne mogu pokvariti + STR_CONFIG_SETTING_WAGONSPEEDLIMITS :Omogući ograničenje brzine za vagone: {STRING} STR_CONFIG_SETTING_WAGONSPEEDLIMITS_HELPTEXT :Kada je uključeno, koristiti će se i limit brzine vagona kod određivanja najveće brzine nekog vlaka diff --git a/src/lang/czech.txt b/src/lang/czech.txt index 24dd12f1fd..6562313f20 100644 --- a/src/lang/czech.txt +++ b/src/lang/czech.txt @@ -1816,6 +1816,7 @@ STR_CONFIG_SETTING_SERVINT_DISABLED :Vypnuto STR_CONFIG_SETTING_NOSERVICE :Vypnout servisy, když jsou vypnuty poruchy: {STRING} STR_CONFIG_SETTING_NOSERVICE_HELPTEXT :Pokud je zapnuto a zároveň jsou vypnuty poruchy, vozidla nebudou vůbec jezdit do servisu, protože se nemohou nikdy porouchat + STR_CONFIG_SETTING_WAGONSPEEDLIMITS :Zapnout omezení rychlosti vagonů: {STRING} STR_CONFIG_SETTING_WAGONSPEEDLIMITS_HELPTEXT :Pokud zapnuto, použije rychlostní omezení vagónů při stanovení maximální rychlosti vlaku diff --git a/src/lang/danish.txt b/src/lang/danish.txt index 0cfccb6724..54ebd30077 100644 --- a/src/lang/danish.txt +++ b/src/lang/danish.txt @@ -1777,6 +1777,7 @@ STR_CONFIG_SETTING_SERVINT_DISABLED :Deaktiveret STR_CONFIG_SETTING_NOSERVICE :Slå service fra, når nedbrud er sat til ingen: {STRING} STR_CONFIG_SETTING_NOSERVICE_HELPTEXT :Når tilladt, bliver køretøjer ikke serviceret, hvis de ikke kan bryde ned + STR_CONFIG_SETTING_WAGONSPEEDLIMITS :Aktiver hastighedsbegrænsning for vogne: {STRING} STR_CONFIG_SETTING_WAGONSPEEDLIMITS_HELPTEXT :Når tilladt, brug også fartgrænse på vogne, for at bestemme makshastigheden på tog diff --git a/src/lang/dutch.txt b/src/lang/dutch.txt index 7a485a9b37..8378439d44 100644 --- a/src/lang/dutch.txt +++ b/src/lang/dutch.txt @@ -1777,6 +1777,7 @@ STR_CONFIG_SETTING_SERVINT_DISABLED :Uitgeschakeld STR_CONFIG_SETTING_NOSERVICE :Onderhoud uitschakelen wanneer defecten uit staan: {STRING} STR_CONFIG_SETTING_NOSERVICE_HELPTEXT :Als deze optie is ingeschakeld worden voertuigen niet onderhouden als ze niet kapot kunnen gaan. + STR_CONFIG_SETTING_WAGONSPEEDLIMITS :Snelheidslimieten voor wagons inschakelen: {STRING} STR_CONFIG_SETTING_WAGONSPEEDLIMITS_HELPTEXT :Wanneer ingeschakeld, ook gebruik maken van snelheidsbeperkingen van wagons voor het bepalen van de maximale snelheid van een trein diff --git a/src/lang/english_AU.txt b/src/lang/english_AU.txt index eb94bd140d..ee769426e4 100644 --- a/src/lang/english_AU.txt +++ b/src/lang/english_AU.txt @@ -1777,6 +1777,7 @@ STR_CONFIG_SETTING_SERVINT_DISABLED :Disabled STR_CONFIG_SETTING_NOSERVICE :Disable servicing when breakdowns set to none: {STRING} STR_CONFIG_SETTING_NOSERVICE_HELPTEXT :When enabled, vehicles do not get serviced if they cannot break down + STR_CONFIG_SETTING_WAGONSPEEDLIMITS :Enable wagon speed limits: {STRING} STR_CONFIG_SETTING_WAGONSPEEDLIMITS_HELPTEXT :When enabled, also use speed limits of wagons for deciding the maximum speed of a train diff --git a/src/lang/english_US.txt b/src/lang/english_US.txt index d22d9b13a1..74250054b7 100644 --- a/src/lang/english_US.txt +++ b/src/lang/english_US.txt @@ -1777,6 +1777,7 @@ STR_CONFIG_SETTING_SERVINT_DISABLED :Disabled STR_CONFIG_SETTING_NOSERVICE :Disable maintenance when breakdowns are set to none: {STRING} STR_CONFIG_SETTING_NOSERVICE_HELPTEXT :When enabled, vehicles do not get maintained if they cannot break down + STR_CONFIG_SETTING_WAGONSPEEDLIMITS :Enable railroad car speed limits: {STRING} STR_CONFIG_SETTING_WAGONSPEEDLIMITS_HELPTEXT :When enabled, also use speed limits of wagons for deciding the maximum speed of a train @@ -4475,9 +4476,9 @@ STR_ORDER_CONDITIONAL_COMPARATOR_TOOLTIP :{BLACK}How to c STR_ORDER_CONDITIONAL_COMPARATOR_EQUALS :is equal to STR_ORDER_CONDITIONAL_COMPARATOR_NOT_EQUALS :is not equal to STR_ORDER_CONDITIONAL_COMPARATOR_LESS_THAN :is less than -STR_ORDER_CONDITIONAL_COMPARATOR_LESS_EQUALS :is less or equal to +STR_ORDER_CONDITIONAL_COMPARATOR_LESS_EQUALS :is less than or equal to STR_ORDER_CONDITIONAL_COMPARATOR_MORE_THAN :is more than -STR_ORDER_CONDITIONAL_COMPARATOR_MORE_EQUALS :is more or equal to +STR_ORDER_CONDITIONAL_COMPARATOR_MORE_EQUALS :is more than or equal to STR_ORDER_CONDITIONAL_COMPARATOR_IS_TRUE :is true STR_ORDER_CONDITIONAL_COMPARATOR_IS_FALSE :is false diff --git a/src/lang/esperanto.txt b/src/lang/esperanto.txt index 8ecbd2b36f..d0102ce46e 100644 --- a/src/lang/esperanto.txt +++ b/src/lang/esperanto.txt @@ -1784,6 +1784,7 @@ STR_CONFIG_SETTING_SERVINT_DISABLED :Malaktiva STR_CONFIG_SETTING_NOSERVICE :Malŝaltu prizorgadon se rompiĝoj ne okazas: {STRING} STR_CONFIG_SETTING_NOSERVICE_HELPTEXT :Kiam tiu ĉi agordo estas aktiva, veturiloj kiuj ne povas panei ne estos priservataj + STR_CONFIG_SETTING_WAGONSPEEDLIMITS :Aktivigu vagonajn rapideclimojn: {STRING} STR_CONFIG_SETTING_WAGONSPEEDLIMITS_HELPTEXT :Kiam ebligita, ankaŭ uzu rapideco-limigojn de vagonoj por decidi la maksimuman rapidecon de trajno diff --git a/src/lang/estonian.txt b/src/lang/estonian.txt index ebc583b3ea..ba9ab0b61c 100644 --- a/src/lang/estonian.txt +++ b/src/lang/estonian.txt @@ -1765,6 +1765,7 @@ STR_CONFIG_SETTING_SERVINT_DISABLED :Väljas STR_CONFIG_SETTING_NOSERVICE :Hoolduse keelamine rikete väljalülitamisel: {STRING} STR_CONFIG_SETTING_NOSERVICE_HELPTEXT :Kui on aktiveeritud, siis ei teostata hooldust sõidukitele mille tõrkumine ei ole võimalik + STR_CONFIG_SETTING_WAGONSPEEDLIMITS :Vagunite kiiruspiirangud: {STRING} STR_CONFIG_SETTING_WAGONSPEEDLIMITS_HELPTEXT :Kui on aktiveeritud siis kasutatakse rongi maksimaalse kiiruse arvutamiseks ka vagunite kiiruse piirangut diff --git a/src/lang/faroese.txt b/src/lang/faroese.txt index 160492fa9d..ac67a9797f 100644 --- a/src/lang/faroese.txt +++ b/src/lang/faroese.txt @@ -1519,6 +1519,7 @@ STR_CONFIG_SETTING_SERVINT_DISABLED :Ikki sligi til STR_CONFIG_SETTING_NOSERVICE :Ógilda eftirlit tá maskinskaðar eru ásettir til eingir: {STRING} STR_CONFIG_SETTING_NOSERVICE_HELPTEXT :Um gilda fáa flutningstól einki eftirlit um tey ikki kunnu fáa maskinskaða + STR_CONFIG_SETTING_WAGONSPEEDLIMITS :Gilda hámarksferð fyri vognar: {STRING} STR_CONFIG_SETTING_WAGONSPEEDLIMITS_HELPTEXT :Um gilda, verður hámarksferðin hjá vognum eisini nýtt fyri at avgerða mest loydu ferðina á tokum diff --git a/src/lang/finnish.txt b/src/lang/finnish.txt index 72aff10a6b..2ddc8e6817 100644 --- a/src/lang/finnish.txt +++ b/src/lang/finnish.txt @@ -1777,6 +1777,7 @@ STR_CONFIG_SETTING_SERVINT_DISABLED :Pois käytöst STR_CONFIG_SETTING_NOSERVICE :Poista huollot käytöstä kun kulkuneuvojen rikkoutuminen on poistettu käytöstä: {STRING} STR_CONFIG_SETTING_NOSERVICE_HELPTEXT :Mikäli käytössä, kulkuneuvoja ei huolleta, jos ne eivät voi rikkoutua + STR_CONFIG_SETTING_WAGONSPEEDLIMITS :Ota käyttöön vaunujen nopeusrajoitukset: {STRING} STR_CONFIG_SETTING_WAGONSPEEDLIMITS_HELPTEXT :Mikäli käytössä, vaunujen nopeusrajoitusta käytetään junan maksiminopeuden määrittämisessä diff --git a/src/lang/french.txt b/src/lang/french.txt index 19dded592e..cb5aaecec3 100644 --- a/src/lang/french.txt +++ b/src/lang/french.txt @@ -1778,6 +1778,7 @@ STR_CONFIG_SETTING_SERVINT_DISABLED :Désactivé STR_CONFIG_SETTING_NOSERVICE :Désactiver l'entretien quand les pannes sont inactives{NBSP}: {STRING} STR_CONFIG_SETTING_NOSERVICE_HELPTEXT :Lorsqu'il est activé, les véhicules ne sont pas entretenus s'ils ne peuvent pas tomber en panne + STR_CONFIG_SETTING_WAGONSPEEDLIMITS :Activer la vitesse limite des wagons{NBSP}: {STRING} STR_CONFIG_SETTING_WAGONSPEEDLIMITS_HELPTEXT :Lorsqu'il est activé, utiliser la vitesse limite des wagons pour déterminer la vitesse maximum d'un train diff --git a/src/lang/frisian.txt b/src/lang/frisian.txt index 65dff9170c..4125619292 100644 --- a/src/lang/frisian.txt +++ b/src/lang/frisian.txt @@ -1592,6 +1592,7 @@ STR_CONFIG_SETTING_SERVINT_DISABLED :Útskeakele STR_CONFIG_SETTING_NOSERVICE :Gjin ûnderhald as stikken gean út steat: {STRING} STR_CONFIG_SETTING_NOSERVICE_HELPTEXT :By ynskeakeljen sille fiertugen gjin ûnderhâld krije at sy net kapot gean kinne + STR_CONFIG_SETTING_WAGONSPEEDLIMITS :Wagon snelheids limiet: {STRING} STR_CONFIG_SETTING_WAGONSPEEDLIMITS_HELPTEXT :By ynskeakeljen sille de faasjelimyten fan de weinen meinaam wurde by it bepalen fan de maksimale faasje foar in trein diff --git a/src/lang/gaelic.txt b/src/lang/gaelic.txt index ae306ddbb6..f34f62f314 100644 --- a/src/lang/gaelic.txt +++ b/src/lang/gaelic.txt @@ -1785,6 +1785,7 @@ STR_CONFIG_SETTING_SERVINT_DISABLED :À comas STR_CONFIG_SETTING_NOSERVICE :Cuir obair-chàraidh à comas ma chaidh briseadh a chur gu “Cha tachair seo idir”: {STRING} STR_CONFIG_SETTING_NOSERVICE_HELPTEXT :Ma tha seo air, chan fhaigh carbadan obair-chàraidh mur urrainn dhaibh briseadh + STR_CONFIG_SETTING_WAGONSPEEDLIMITS :Cuir crìochan-luaiths nan carbadan-rèile an comas: {STRING} STR_CONFIG_SETTING_WAGONSPEEDLIMITS_HELPTEXT :Ma tha seo air, cleachd crìochan-luaiths nan carbadan cuideachd gus an luaths as motha aig trèan a shuidheachadh diff --git a/src/lang/galician.txt b/src/lang/galician.txt index a3e5aa123f..db14242498 100644 --- a/src/lang/galician.txt +++ b/src/lang/galician.txt @@ -1771,6 +1771,7 @@ STR_CONFIG_SETTING_SERVINT_DISABLED :Desactivado STR_CONFIG_SETTING_NOSERVICE :Deshabilita-lo mantemento cando as avarías están desactivadas: {STRING} STR_CONFIG_SETTING_NOSERVICE_HELPTEXT :Cando estea activado, os vehículos non teñen mantemento no caso de que non poidan ter avarías + STR_CONFIG_SETTING_WAGONSPEEDLIMITS :Activa-los límites de velocidade dos vagóns: {STRING} STR_CONFIG_SETTING_WAGONSPEEDLIMITS_HELPTEXT :Cando estea activado, usar tamén os límites de velocidade dos vagóns para decidir a máxima velocidade do tren diff --git a/src/lang/german.txt b/src/lang/german.txt index 2bab17f3fd..8a2d526e59 100644 --- a/src/lang/german.txt +++ b/src/lang/german.txt @@ -1768,6 +1768,7 @@ STR_CONFIG_SETTING_SERVINT_DISABLED :Deaktiviert STR_CONFIG_SETTING_NOSERVICE :Wartung deaktivieren, wenn Pannen abgeschaltet: {STRING} STR_CONFIG_SETTING_NOSERVICE_HELPTEXT :Schicke Fahrzeuge nicht zur Wartung, wenn Pannen ausgeschaltet sind + STR_CONFIG_SETTING_WAGONSPEEDLIMITS :Berücksichtige Waggonhöchstgeschwindigkeit: {STRING} STR_CONFIG_SETTING_WAGONSPEEDLIMITS_HELPTEXT :Begrenze die Höchstgeschwindigkeit eines Zuges durch die jeweiligen Höchstgeschwindigkeiten der mitgeführten Waggons diff --git a/src/lang/greek.txt b/src/lang/greek.txt index 95c0e1b74b..bb929eb169 100644 --- a/src/lang/greek.txt +++ b/src/lang/greek.txt @@ -1813,6 +1813,7 @@ STR_CONFIG_SETTING_SERVINT_DISABLED :Απενεργ STR_CONFIG_SETTING_NOSERVICE :Απενεργοποίηση επισκευών όταν οι καταρρεύσεις είναι απενεργοποιημένες: {STRING} STR_CONFIG_SETTING_NOSERVICE_HELPTEXT :Όταν είναι ενεργοποιημένη, τα οχήματα δεν συντηρούνται όταν δεν είναι δυνατό να χαλάσουν + STR_CONFIG_SETTING_WAGONSPEEDLIMITS :Ενεργοποίηση ορίων ταχύτητας βαγονιών: {STRING} STR_CONFIG_SETTING_WAGONSPEEDLIMITS_HELPTEXT :Όταν είναι ενεργοποιημένο, χρησιμοποιούνται και τα όρια ταχύτητας των βαγονιών όταν αποφασίζεται η μέγιστη ταχύτητα ενός τρένου diff --git a/src/lang/hebrew.txt b/src/lang/hebrew.txt index 2c55687f70..134cccbe51 100644 --- a/src/lang/hebrew.txt +++ b/src/lang/hebrew.txt @@ -1624,6 +1624,7 @@ STR_CONFIG_SETTING_SERVINT_DISABLED :מבוטל STR_CONFIG_SETTING_NOSERVICE :{STRING} :בטל טיפולים כאשר האפשרות לביטול תקלות נבחרה STR_CONFIG_SETTING_NOSERVICE_HELPTEXT :כאשר מאופשר, כלי רכב אינם מתוחזקים אם הם אינם יכולים להתקלקל + STR_CONFIG_SETTING_WAGONSPEEDLIMITS :{STRING} :אפשר הגבלת מהירות עבור קרונות רכבת STR_CONFIG_SETTING_WAGONSPEEDLIMITS_HELPTEXT :כאשר מאופשר, השתמש גם במגבלות מהירות של קרונות לצורך קביעות המהירות המירבית של רכבת diff --git a/src/lang/hindi.txt b/src/lang/hindi.txt index 6e926b758f..d81895bd71 100644 --- a/src/lang/hindi.txt +++ b/src/lang/hindi.txt @@ -551,6 +551,7 @@ STR_CONFIG_SETTING_AI_BUILDS_AIRCRAFT :कंप्य + STR_CONFIG_SETTING_NEWS_ACCIDENTS_DISASTERS :दुर्घटनायें / आपदायें : {STRING} diff --git a/src/lang/hungarian.txt b/src/lang/hungarian.txt index 79bf30e8ee..71f3ad3d87 100644 --- a/src/lang/hungarian.txt +++ b/src/lang/hungarian.txt @@ -1830,6 +1830,7 @@ STR_CONFIG_SETTING_SERVINT_DISABLED :kikapcsolva STR_CONFIG_SETTING_NOSERVICE :Ne legyen javítás ha lerobbanások sincsenek: {STRING} STR_CONFIG_SETTING_NOSERVICE_HELPTEXT :Bekapcsolva a járművek nem kerülnek javításra, ha nem tudnak lerobbanni + STR_CONFIG_SETTING_WAGONSPEEDLIMITS :A vagonok sebessége korlátozható: {STRING} STR_CONFIG_SETTING_WAGONSPEEDLIMITS_HELPTEXT :Bekapcsolva a szerelvényben lévő vasúti kocsik maximális sebessége is korlátozza a vonat maximális sebességét diff --git a/src/lang/icelandic.txt b/src/lang/icelandic.txt index e29370908b..e18f171616 100644 --- a/src/lang/icelandic.txt +++ b/src/lang/icelandic.txt @@ -1518,6 +1518,7 @@ STR_CONFIG_SETTING_SERVINT_DISABLED :Óvirkt STR_CONFIG_SETTING_NOSERVICE :Sleppa viðhaldi þegar bilanir eru óvirkar: {STRING} STR_CONFIG_SETTING_NOSERVICE_HELPTEXT :Ef þessi stilling er virk eru farartæki ekki þjónustuð ef þau geta ekki bilað + STR_CONFIG_SETTING_WAGONSPEEDLIMITS :Leyfa hraðatakmarkanir vagna: {STRING} STR_CONFIG_SETTING_WAGONSPEEDLIMITS_HELPTEXT :Ef þessi stilling er virk er hámarkshraði á vögnum einnig notaður til að ákvarða hámarks hraða á járnbrautalestum diff --git a/src/lang/ido.txt b/src/lang/ido.txt index b69b47d0e6..589f3223aa 100644 --- a/src/lang/ido.txt +++ b/src/lang/ido.txt @@ -734,6 +734,7 @@ STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_VIOLET :Violkolora + ###length 3 diff --git a/src/lang/indonesian.txt b/src/lang/indonesian.txt index 6498f2bfe7..c1b0371f5e 100644 --- a/src/lang/indonesian.txt +++ b/src/lang/indonesian.txt @@ -1767,6 +1767,7 @@ STR_CONFIG_SETTING_SERVINT_DISABLED :Di non-aktifkan STR_CONFIG_SETTING_NOSERVICE :Tidak perlu perbaikan jika tidak pernah mogok: {STRING} STR_CONFIG_SETTING_NOSERVICE_HELPTEXT :Jika diaktifkan, kendaraan tidak akan diperbaiki jika tidak pernah mogok + STR_CONFIG_SETTING_WAGONSPEEDLIMITS :Aktifkan batas kecepatan gerbong: {STRING} STR_CONFIG_SETTING_WAGONSPEEDLIMITS_HELPTEXT :Jika diaktifkan, batas kecepatan gerbong juga digunakan untuk menentukan kecepatan maksimum kereta diff --git a/src/lang/irish.txt b/src/lang/irish.txt index 7dbd840afa..96ac944b66 100644 --- a/src/lang/irish.txt +++ b/src/lang/irish.txt @@ -1671,6 +1671,7 @@ STR_CONFIG_SETTING_SERVINT_DISABLED :Díchumasaithe STR_CONFIG_SETTING_NOSERVICE :Díchumasaigh seirbhísiú nuair nach mbíonn aon bhriseadh síos: {STRING} STR_CONFIG_SETTING_NOSERVICE_HELPTEXT :Má tá sé cumasaithe, ní dhéantar feithiclí a sheirbhísí má rud é nach féidir leo briseadh síos + STR_CONFIG_SETTING_WAGONSPEEDLIMITS :Cumasaigh teorainneacha luais vaigíní: {STRING} STR_CONFIG_SETTING_WAGONSPEEDLIMITS_HELPTEXT :Má tá sé cumasaithe, úsáid teorainneacha luais na vaigíní freisin chun luas uasta traenacha a shocrú diff --git a/src/lang/italian.txt b/src/lang/italian.txt index 6d300ac363..b8d49fb313 100644 --- a/src/lang/italian.txt +++ b/src/lang/italian.txt @@ -1812,6 +1812,7 @@ STR_CONFIG_SETTING_SERVINT_DISABLED :Disabilitato STR_CONFIG_SETTING_NOSERVICE :Disabilita manutenzione con i guasti veicoli disattivati: {STRING} STR_CONFIG_SETTING_NOSERVICE_HELPTEXT :Se abilitata, non vengono manutenuti i veicoli che non possono guastarsi. + STR_CONFIG_SETTING_WAGONSPEEDLIMITS :Abilita limiti di velocità dei vagoni: {STRING} STR_CONFIG_SETTING_WAGONSPEEDLIMITS_HELPTEXT :Quando abilitata, tiene conto anche dei limiti di velocità dei vagoni per determinare la velocità massima di un treno. diff --git a/src/lang/japanese.txt b/src/lang/japanese.txt index 6cd76eec69..bcb1ad78ca 100644 --- a/src/lang/japanese.txt +++ b/src/lang/japanese.txt @@ -1728,6 +1728,7 @@ STR_CONFIG_SETTING_SERVINT_DISABLED :点検なし STR_CONFIG_SETTING_NOSERVICE :故障切ならば点検無効化: {STRING} STR_CONFIG_SETTING_NOSERVICE_HELPTEXT :有効にすると、故障が起こらない設定の時には点検も行わなくなります + STR_CONFIG_SETTING_WAGONSPEEDLIMITS :貨車の上限速度: {STRING} STR_CONFIG_SETTING_WAGONSPEEDLIMITS_HELPTEXT :有効にすると、上限速度が設定されている貨車を使用した場合、列車はその速度以上出せなくなります diff --git a/src/lang/korean.txt b/src/lang/korean.txt index 3f74dd1e38..150278761e 100644 --- a/src/lang/korean.txt +++ b/src/lang/korean.txt @@ -1778,6 +1778,7 @@ STR_CONFIG_SETTING_SERVINT_DISABLED :사용 안 함 STR_CONFIG_SETTING_NOSERVICE :차량 고장 설정을 껐으면 점검을 하지 않음: {STRING} STR_CONFIG_SETTING_NOSERVICE_HELPTEXT :이 설정을 켜면, 차량이 고장나지 않도록 설정되어 있는 경우 차량이 자동으로 점검을 하러 가지 않습니다 + STR_CONFIG_SETTING_WAGONSPEEDLIMITS :화물차 속력 제한 적용: {STRING} STR_CONFIG_SETTING_WAGONSPEEDLIMITS_HELPTEXT :이 설정을 켜면, 화물차의 속력 제한값에 따라 열차의 최대 속력을 제한합니다. diff --git a/src/lang/latin.txt b/src/lang/latin.txt index 5ded827f24..fc74f15697 100644 --- a/src/lang/latin.txt +++ b/src/lang/latin.txt @@ -1783,6 +1783,7 @@ STR_CONFIG_SETTING_SERVINT_DISABLED :Neglectum STR_CONFIG_SETTING_NOSERVICE :Neglegere ministrationem cum nullae sunt defectiones vehiculorum: {STRING} STR_CONFIG_SETTING_NOSERVICE_HELPTEXT :Electa, vehicula non ministrantur defectionibus vetatis + STR_CONFIG_SETTING_WAGONSPEEDLIMITS :Annuere currus ferriviarios habere velocitates maximas: {STRING} STR_CONFIG_SETTING_WAGONSPEEDLIMITS_HELPTEXT :Electa, velocitates maximae curruum afficiunt velocitatem maximam traminis diff --git a/src/lang/latvian.txt b/src/lang/latvian.txt index 98db1f65a8..ab350142d4 100644 --- a/src/lang/latvian.txt +++ b/src/lang/latvian.txt @@ -1779,6 +1779,7 @@ STR_CONFIG_SETTING_SERVINT_DISABLED :izslēgts STR_CONFIG_SETTING_NOSERVICE :Aizliegt apkopi, kad bojāšanās ir izslēgta: {STRING} STR_CONFIG_SETTING_NOSERVICE_HELPTEXT :Ja ieslēgts, transportlīdzekļiem netiek veikta apkope. Jo tie nebojājas + STR_CONFIG_SETTING_WAGONSPEEDLIMITS :Ieslēgt vagonu ātruma ierobežojumus: {STRING} STR_CONFIG_SETTING_WAGONSPEEDLIMITS_HELPTEXT :Ja ieslēgts, var izmantot vagonu ātruma ierobežojumus, lai lemtu par vilcienu maksimālo ātrumu diff --git a/src/lang/lithuanian.txt b/src/lang/lithuanian.txt index 0a0f383213..03d1b45f7a 100644 --- a/src/lang/lithuanian.txt +++ b/src/lang/lithuanian.txt @@ -1896,6 +1896,7 @@ STR_CONFIG_SETTING_SERVINT_DISABLED :Išjungta STR_CONFIG_SETTING_NOSERVICE :Atjungti techninę apžiūrą, jei gedimai nenaudojami: {STRING} STR_CONFIG_SETTING_NOSERVICE_HELPTEXT :Jeigu įjungta, tada automobiliams nebus atliekama techninė apžiūra, jeigu jie negalės sugesti + STR_CONFIG_SETTING_WAGONSPEEDLIMITS :Aktyvinti vagonų greičio apribojimą: {STRING} STR_CONFIG_SETTING_WAGONSPEEDLIMITS_HELPTEXT :Įgalinus šią nuostatą, vagonų didžiausias leistinas greitis įtakos viso traukinio greitį diff --git a/src/lang/luxembourgish.txt b/src/lang/luxembourgish.txt index 75bd422bab..ffb6784765 100644 --- a/src/lang/luxembourgish.txt +++ b/src/lang/luxembourgish.txt @@ -1709,6 +1709,7 @@ STR_CONFIG_SETTING_SERVINT_DISABLED :Ausgeschalt STR_CONFIG_SETTING_NOSERVICE :Revisiounen ausschalten wann Pannen op "Keng" gestallt sinn: {STRING} STR_CONFIG_SETTING_NOSERVICE_HELPTEXT :Wann ugeschalt, ginn Gefierer net an d'Revisioun geschéckt, wann se keng Pann kënne kréien + STR_CONFIG_SETTING_WAGONSPEEDLIMITS :Geschwindegkeetsbegrenzungen fir Waggonen: {STRING} STR_CONFIG_SETTING_WAGONSPEEDLIMITS_HELPTEXT :Wann ugeschalt, benotz och Geschwindegkeetslimitatiounen fir Waggonen fir d'maximal Geschwindegkeet vun engem Zuch ze definéiren diff --git a/src/lang/macedonian.txt b/src/lang/macedonian.txt index 0fb16f81bf..997f282c7b 100644 --- a/src/lang/macedonian.txt +++ b/src/lang/macedonian.txt @@ -1024,6 +1024,7 @@ STR_CONFIG_SETTING_SCRIPT_MAX_OPCODES :#ОПкодов + STR_CONFIG_SETTING_NEWS_ARRIVAL_FIRST_VEHICLE_OWN :Пристигнување на првото возило на станицата на играчот: {STRING} STR_CONFIG_SETTING_NEWS_ARRIVAL_FIRST_VEHICLE_OTHER :Пристигнување на прво возило на конкурентска станица: {STRING} diff --git a/src/lang/malay.txt b/src/lang/malay.txt index fd0ce2af4b..7937c49f0c 100644 --- a/src/lang/malay.txt +++ b/src/lang/malay.txt @@ -1452,6 +1452,7 @@ STR_CONFIG_SETTING_SERVINT_DISABLED :Dilumpuhkan STR_CONFIG_SETTING_NOSERVICE :Servis tidak diperlukan apabila kerosakan kenderaan ditetapkan kepada tiada: {STRING} + STR_CONFIG_SETTING_WAGONSPEEDLIMITS :Benarkan had kelajuan untuk gerabak: {STRING} STR_CONFIG_SETTING_DISABLE_ELRAILS :Tiada landasan elektrik: {STRING} diff --git a/src/lang/maltese.txt b/src/lang/maltese.txt index 7ffdb59539..ac991bd2ed 100644 --- a/src/lang/maltese.txt +++ b/src/lang/maltese.txt @@ -665,6 +665,7 @@ STR_CONFIG_SETTING_ADVANCED_VEHICLE_LISTS_HELPTEXT :Ippermetti l-uz + ###length 3 diff --git a/src/lang/marathi.txt b/src/lang/marathi.txt index b48c25162e..dd33138a51 100644 --- a/src/lang/marathi.txt +++ b/src/lang/marathi.txt @@ -971,6 +971,7 @@ STR_CONFIG_SETTING_COMMAND_PAUSE_LEVEL_ALL_ACTIONS :सर्व + ###length 3 diff --git a/src/lang/norwegian_bokmal.txt b/src/lang/norwegian_bokmal.txt index faddec4575..358a7355cb 100644 --- a/src/lang/norwegian_bokmal.txt +++ b/src/lang/norwegian_bokmal.txt @@ -1682,6 +1682,7 @@ STR_CONFIG_SETTING_SERVINT_DISABLED :Deaktivert STR_CONFIG_SETTING_NOSERVICE :Deaktiver vedlikehold når havarier er slått av: {STRING} STR_CONFIG_SETTING_NOSERVICE_HELPTEXT :Når aktivert, vil kjøretøy ikke bli vedlikeholdt hvis de ikke kan bryte sammen + STR_CONFIG_SETTING_WAGONSPEEDLIMITS :Aktiver fartsgrenser for vogner: {STRING} STR_CONFIG_SETTING_WAGONSPEEDLIMITS_HELPTEXT :Når aktivert, brukes også fartsgrenser til vogner for å avgjøre den maksimale hastigheten til et tog diff --git a/src/lang/norwegian_nynorsk.txt b/src/lang/norwegian_nynorsk.txt index 46353cb279..b8d4a7d35a 100644 --- a/src/lang/norwegian_nynorsk.txt +++ b/src/lang/norwegian_nynorsk.txt @@ -1526,6 +1526,7 @@ STR_CONFIG_SETTING_SERVINT_DISABLED :Deaktivert STR_CONFIG_SETTING_NOSERVICE :Deaktiver vedlikehald når havari er slått av: {STRING} + STR_CONFIG_SETTING_WAGONSPEEDLIMITS :Aktiver fartsgrenser for vogner: {STRING} STR_CONFIG_SETTING_DISABLE_ELRAILS :Deaktiver elektriske tog: {STRING} diff --git a/src/lang/persian.txt b/src/lang/persian.txt index 674f798758..5dc92ee66c 100644 --- a/src/lang/persian.txt +++ b/src/lang/persian.txt @@ -1412,6 +1412,7 @@ STR_CONFIG_SETTING_SERVINT_ISPERCENT :درصد زما STR_CONFIG_SETTING_NOSERVICE :غیرفعال کردن تعمیر/بازنگری کلیه وسایل نقلیه وقتی که طبق تنظیمات بازی خودرو ها خراب نشوند : {STRING} + STR_CONFIG_SETTING_WAGONSPEEDLIMITS :فعال کردن حد برای سرعت واگن: {STRING} STR_CONFIG_SETTING_DISABLE_ELRAILS :غیر فعال کردن ریل برقی: {STRING} diff --git a/src/lang/polish.txt b/src/lang/polish.txt index adebb77f20..230b340408 100644 --- a/src/lang/polish.txt +++ b/src/lang/polish.txt @@ -634,6 +634,9 @@ STR_UNITS_HEIGHT_IMPERIAL :{DECIMAL}{NBSP} STR_UNITS_HEIGHT_METRIC :{DECIMAL}{NBSP}m STR_UNITS_HEIGHT_SI :{DECIMAL}{NBSP}m +STR_UNITS_DAYS :{COMMA}{NBSP}d{P zień ni ni} +STR_UNITS_SECONDS :{COMMA}{NBSP}sekund{P a y ""} +STR_UNITS_TICKS :{COMMA}{NBSP}tyknię{P cie cia ć} # Common window strings STR_LIST_FILTER_TITLE :{BLACK}Filtr: @@ -1098,6 +1101,7 @@ STR_PLAYLIST_TOOLTIP_CLICK_TO_ADD_TRACK :{BLACK}Kliknij STR_PLAYLIST_TOOLTIP_CLICK_TO_REMOVE_TRACK :{BLACK}Kliknij na ścieżce muzycznej aby usunąć ją z wybranego programu (Wlasny1 lub Wlasny2) # Highscore window +STR_HIGHSCORE_TOP_COMPANIES :{BIG_FONT}{BLACK}Najlepsze firmy STR_HIGHSCORE_POSITION :{BIG_FONT}{BLACK}{COMMA}. STR_HIGHSCORE_PERFORMANCE_TITLE_BUSINESSMAN :Biznesmen STR_HIGHSCORE_PERFORMANCE_TITLE_ENTREPRENEUR :Przedsiębiorca @@ -1915,6 +1919,7 @@ STR_CONFIG_SETTING_ROAD_SIDE_LEFT :Jazda po lewej STR_CONFIG_SETTING_ROAD_SIDE_RIGHT :Jazda po prawej STR_CONFIG_SETTING_HEIGHTMAP_ROTATION :Obrót mapy wysokości: {STRING} +STR_CONFIG_SETTING_HEIGHTMAP_ROTATION_TOOLTIP :Wybierz kierunek obrotu mapy wysokości, aby dopasować ją do świata gry ###length 2 STR_CONFIG_SETTING_HEIGHTMAP_ROTATION_COUNTER_CLOCKWISE :Przeciwnie do wsk. zegara STR_CONFIG_SETTING_HEIGHTMAP_ROTATION_CLOCKWISE :Zgodnie ze wsk. zegara @@ -2035,7 +2040,12 @@ STR_CONFIG_SETTING_ADVANCED_VEHICLE_LISTS_HELPTEXT :Wlącz obsług STR_CONFIG_SETTING_LOADING_INDICATORS :Pokazuj wskaźniki załadunku: {STRING} STR_CONFIG_SETTING_LOADING_INDICATORS_HELPTEXT :Wybierz, czy wskaźnik załadunku pokazuje się nad ładowanym/rozładowywanym pojazdem +STR_CONFIG_SETTING_TIMETABLE_MODE :Jednostki czasu w rozkładach jazdy: {STRING} +STR_CONFIG_SETTING_TIMETABLE_MODE_HELPTEXT :Wybierz jednostki czasu używane w rozkładach jazdy pojazdów ###length 3 +STR_CONFIG_SETTING_TIMETABLE_MODE_DAYS :Dni +STR_CONFIG_SETTING_TIMETABLE_MODE_SECONDS :Sekundy +STR_CONFIG_SETTING_TIMETABLE_MODE_TICKS :Tyknięcia STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE :Pokazuj przyjazdy i odjazdy w rozkładach: {STRING} STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE_HELPTEXT :Wyświetlanie przewidywanego przyjazdu i odjazdu w rozkładach @@ -2147,6 +2157,7 @@ STR_CONFIG_SETTING_SERVINT_DISABLED :Wyłączone STR_CONFIG_SETTING_NOSERVICE :Wyłącz serwisowanie jeśli awarie pojazdów są wyłączone: {STRING} STR_CONFIG_SETTING_NOSERVICE_HELPTEXT :Kiedy włączone, pojazdy nie są serwisowane, jeśli nie mogą się popsuć + STR_CONFIG_SETTING_WAGONSPEEDLIMITS :Włącz limity prędkości wagonów: {STRING} STR_CONFIG_SETTING_WAGONSPEEDLIMITS_HELPTEXT :Kiedy włączone, użyj także ograniczenia prędkości dla wagonów do obliczenia maksymalnej prędkości pociągu @@ -3579,11 +3590,15 @@ STR_MAPGEN_MAPSIZE :{BLACK}Rozmiar STR_MAPGEN_MAPSIZE_TOOLTIP :{BLACK}Wybierz rozmiar mapy w kwadratach. Liczba dostępnych kwadratów będzie nieco mniejsza STR_MAPGEN_BY :{BLACK}* STR_MAPGEN_NUMBER_OF_TOWNS :{BLACK}Liczba miast: +STR_MAPGEN_NUMBER_OF_TOWNS_TOOLTIP :{BLACK}Wybierz gęstość rozmieszczenia miast lub podaj ich określoną liczbę STR_MAPGEN_TOWN_NAME_LABEL :{BLACK}Nazwy miast: STR_MAPGEN_TOWN_NAME_DROPDOWN_TOOLTIP :{BLACK}Wybierz styl nazw miast STR_MAPGEN_DATE :{BLACK}Data: +STR_MAPGEN_DATE_TOOLTIP :{BLACK}Wybierz datę początkową STR_MAPGEN_NUMBER_OF_INDUSTRIES :{BLACK}Liczba przedsiębiorstw: +STR_MAPGEN_NUMBER_OF_INDUSTRIES_TOOLTIP :{BLACK}Wybierz gęstość rozmieszczenia przedsiębiorstw lub podaj ich określoną liczbę STR_MAPGEN_HEIGHTMAP_HEIGHT :{BLACK}Najwyższy szczyt: +STR_MAPGEN_HEIGHTMAP_HEIGHT_TOOLTIP :{BLACK}Wybierz najwyższy szczyt, który gra spróbuje utworzyć, mierzony wysokością nad poziomem wody STR_MAPGEN_HEIGHTMAP_HEIGHT_UP :{BLACK}Zwiększ wysokość najwyższego szczytu na mapie o jeden poziom STR_MAPGEN_HEIGHTMAP_HEIGHT_DOWN :{BLACK}Zmniejsz wysokość najwyższego szczytu na mapie o jeden poziom STR_MAPGEN_SNOW_COVERAGE :{BLACK}Pokrycie śniegiem: @@ -3596,10 +3611,12 @@ STR_MAPGEN_DESERT_COVERAGE_DOWN :{BLACK}Zmniejsz STR_MAPGEN_DESERT_COVERAGE_TEXT :{BLACK}{NUM}% STR_MAPGEN_TERRAIN_TYPE :{BLACK}Typ terenu: STR_MAPGEN_SEA_LEVEL :{BLACK}Poziom wody: +STR_MAPGEN_SEA_LEVEL_TOOLTIP :{BLACK}Określ wysokość poziomu wody STR_MAPGEN_QUANTITY_OF_RIVERS :{BLACK}Liczba rzek: STR_MAPGEN_SMOOTHNESS :{BLACK}Gładkość: STR_MAPGEN_VARIETY :{BLACK}Różnorodność: STR_MAPGEN_GENERATE :{WHITE}Stwórz +STR_MAPGEN_GENERATE_TOOLTIP :{BLACK}Stwórz świat i graj w OpenTTD! STR_MAPGEN_NEWGRF_SETTINGS :{BLACK}Ustawienia NewGRF STR_MAPGEN_NEWGRF_SETTINGS_TOOLTIP :{BLACK}Wyświetl ustawienia NewGRF STR_MAPGEN_AI_SETTINGS :{BLACK}Ustawienia SI @@ -3632,6 +3649,7 @@ STR_MAPGEN_TOWN_NAME_CATALAN :Katalońskie # Strings for map borders at game generation STR_MAPGEN_BORDER_TYPE :{BLACK}Krańce mapy: +STR_MAPGEN_BORDER_TYPE_TOOLTIP :{BLACK}Wybierz obrzeża świata gry STR_MAPGEN_NORTHWEST :{BLACK}Płn.-zach. STR_MAPGEN_NORTHEAST :{BLACK}Płn.-wsch. STR_MAPGEN_SOUTHEAST :{BLACK}Płd.-wsch. @@ -3644,7 +3662,9 @@ STR_MAPGEN_BORDER_MANUAL :{BLACK}Użytkow STR_MAPGEN_HEIGHTMAP_ROTATION :{BLACK}Obrót mapy wysokości: STR_MAPGEN_HEIGHTMAP_NAME :{BLACK}Nazwa mapy wysokosci: +STR_MAPGEN_HEIGHTMAP_NAME_TOOLTIP :{BLACK}Nazwa pliku obrazu mapy wysokości STR_MAPGEN_HEIGHTMAP_SIZE_LABEL :{BLACK}Rozmiar: +STR_MAPGEN_HEIGHTMAP_SIZE_LABEL_TOOLTIP :{BLACK}Rozmiar źródłowego obrazu mapy wysokości. Aby uzyskać najlepsze wyniki, każda krawędź powinna odpowiadać dostępnej długości krawędzi mapy w OpenTTD, takiej jak 256, 512, 1024 itd. STR_MAPGEN_HEIGHTMAP_SIZE :{ORANGE}{NUM} x {NUM} STR_MAPGEN_TERRAIN_TYPE_QUERY_CAPT :{WHITE}Żądana wysokość najwyższego szczytu @@ -3659,6 +3679,7 @@ STR_SE_MAPGEN_FLAT_WORLD :{WHITE}Płaski STR_SE_MAPGEN_FLAT_WORLD_TOOLTIP :{BLACK}Stwórz płaski świat STR_SE_MAPGEN_RANDOM_LAND :{WHITE}Losowy teren STR_SE_MAPGEN_FLAT_WORLD_HEIGHT :{BLACK}Wysokość płaskiego świata: +STR_SE_MAPGEN_FLAT_WORLD_HEIGHT_TOOLTIP :{BLACK}Wybierz wysokość terenu nad poziomem morza STR_SE_MAPGEN_FLAT_WORLD_HEIGHT_DOWN :{BLACK}Obniż wysokość terenu o jeden w dół STR_SE_MAPGEN_FLAT_WORLD_HEIGHT_UP :{BLACK}Podnieś wysokość terenu o jeden w górę @@ -4958,8 +4979,13 @@ STR_TIMETABLE_STATUS_ON_TIME :{BLACK}Ten poja STR_TIMETABLE_STATUS_LATE :{BLACK}Ten pojazd jest teraz spóźniony o {STRING} STR_TIMETABLE_STATUS_EARLY :{BLACK}Ten pojazd spieszy się teraz o {STRING} STR_TIMETABLE_STATUS_NOT_STARTED :{BLACK}Ten rozkład jazdy jeszcze się nie rozpoczął +STR_TIMETABLE_STATUS_START_AT_DATE :{BLACK}Ten rozkład jazdy rozpocznie się {STRING} +STR_TIMETABLE_STATUS_START_IN_SECONDS :{BLACK}Ten rozkład jazdy rozpocznie się za {COMMA} sekund{P ę y ""} +STR_TIMETABLE_START :{BLACK}Początek rozkładu +STR_TIMETABLE_START_TOOLTIP :{BLACK}Wybierz moment rozpoczęcia tego rozkładu jazdy. Ctrl+klik rozłoży równomiernie momenty startu wszystkich pojazdów współdzielących te polecenia w oparciu o ich względną kolejność, o ile rozkład jest w pełni zaplanowany +STR_TIMETABLE_START_SECONDS_QUERY :Sekundy do uruchomienia rozkładu jazdy STR_TIMETABLE_CHANGE_TIME :{BLACK}Zmień czas STR_TIMETABLE_WAIT_TIME_TOOLTIP :{BLACK}Zmień ilość czasu, jaką powinno zająć zaznaczone polecenie. Ctrl+klik ustala czas dla wszystkich poleceń @@ -4983,6 +5009,10 @@ STR_TIMETABLE_EXPECTED :{BLACK}Wymagany STR_TIMETABLE_SCHEDULED :{BLACK}Zaplanowany STR_TIMETABLE_EXPECTED_TOOLTIP :{BLACK}Przełącz między spodziewanymi i zaplanowanymi +STR_TIMETABLE_ARRIVAL_DATE :P: {COLOUR}{DATE_TINY} +STR_TIMETABLE_DEPARTURE_DATE :O: {COLOUR}{DATE_TINY} +STR_TIMETABLE_ARRIVAL_SECONDS_IN_FUTURE :P: {COLOUR}{COMMA} s +STR_TIMETABLE_DEPARTURE_SECONDS_IN_FUTURE :O: {COLOUR}{COMMA} s # Date window (for timetable) diff --git a/src/lang/portuguese.txt b/src/lang/portuguese.txt index 936f9e80d9..31bb788205 100644 --- a/src/lang/portuguese.txt +++ b/src/lang/portuguese.txt @@ -1778,6 +1778,7 @@ STR_CONFIG_SETTING_SERVINT_DISABLED :Desativado STR_CONFIG_SETTING_NOSERVICE :Não fazer manutenção quando não há avarias: {STRING} STR_CONFIG_SETTING_NOSERVICE_HELPTEXT :Quando ativo, os veículos não farão manutenção se não puderem avariar + STR_CONFIG_SETTING_WAGONSPEEDLIMITS :Ativar limites de velocidade para vagões: {STRING} STR_CONFIG_SETTING_WAGONSPEEDLIMITS_HELPTEXT :Quando ativo, aplica também os limites de velocidade dos vagões para decidir a velocidade máxima do comboio diff --git a/src/lang/romanian.txt b/src/lang/romanian.txt index 69b59b0420..03663b1d6d 100644 --- a/src/lang/romanian.txt +++ b/src/lang/romanian.txt @@ -1771,6 +1771,7 @@ STR_CONFIG_SETTING_SERVINT_DISABLED :Dezactivat STR_CONFIG_SETTING_NOSERVICE :Deactivare service când defecțiunile nu sunt active: {STRING} STR_CONFIG_SETTING_NOSERVICE_HELPTEXT :Dacă este activată, vehiculele nu vor întreținute dacă nu se pot defecta + STR_CONFIG_SETTING_WAGONSPEEDLIMITS :Activează limite de viteză pentru vagoane: {STRING} STR_CONFIG_SETTING_WAGONSPEEDLIMITS_HELPTEXT :Dacă este activată, folosește și limita de viteză a vagoanelor pentru a stabili viteza maximă a trenului diff --git a/src/lang/russian.txt b/src/lang/russian.txt index 1b9cf46733..dfe2f4cebe 100644 --- a/src/lang/russian.txt +++ b/src/lang/russian.txt @@ -1928,6 +1928,7 @@ STR_CONFIG_SETTING_SERVINT_DISABLED :отключе STR_CONFIG_SETTING_NOSERVICE :Не обслуживать транспорт, если отключены поломки: {STRING} STR_CONFIG_SETTING_NOSERVICE_HELPTEXT :Отключение технического обслуживания транспортных средств, если отключены поломки. (Если транспорт не заходит в депо, автозамена не работает). + STR_CONFIG_SETTING_WAGONSPEEDLIMITS :Учитывать ограничение скорости у вагонов: {STRING} STR_CONFIG_SETTING_WAGONSPEEDLIMITS_HELPTEXT :При наличии в составе вагонов с ограничением скорости учитывать это ограничение при определении максимальной скорости состава diff --git a/src/lang/serbian.txt b/src/lang/serbian.txt index b92d562f13..34b2a1ec13 100644 --- a/src/lang/serbian.txt +++ b/src/lang/serbian.txt @@ -1902,6 +1902,7 @@ STR_CONFIG_SETTING_SERVINT_DISABLED :Onemogućeno STR_CONFIG_SETTING_NOSERVICE :Isključeno servisiranje kada ne postoje kvarovi: {STRING} STR_CONFIG_SETTING_NOSERVICE_HELPTEXT :Kada je uključeno, vozila se ne servisiraju ako ne mogu da se pokvare + STR_CONFIG_SETTING_WAGONSPEEDLIMITS :Uključeno ograničenje brzine kod vagona: {STRING} STR_CONFIG_SETTING_WAGONSPEEDLIMITS_HELPTEXT :Kada je omogućeno, takođe upotrebi ograničenje brzine vagona za određivanje maksimalne brzine voza diff --git a/src/lang/simplified_chinese.txt b/src/lang/simplified_chinese.txt index 4768d82107..097adccb0c 100644 --- a/src/lang/simplified_chinese.txt +++ b/src/lang/simplified_chinese.txt @@ -349,7 +349,7 @@ STR_SORT_BY_POWER_VS_RUNNING_COST :功率/运行 STR_SORT_BY_CARGO_CAPACITY :运载能力 STR_SORT_BY_RANGE :航行距离 STR_SORT_BY_POPULATION :人口 -STR_SORT_BY_RATING :等级 +STR_SORT_BY_RATING :评价 STR_SORT_BY_NUM_VEHICLES :交通工具数量 STR_SORT_BY_TOTAL_PROFIT_LAST_YEAR :去年总利润 STR_SORT_BY_TOTAL_PROFIT_THIS_YEAR :今年总利润 @@ -367,7 +367,7 @@ STR_GOTO_ORDER_VIEW_TOOLTIP :{BLACK}打开 # Tooltips for the main toolbar ###length 31 STR_TOOLBAR_TOOLTIP_PAUSE_GAME :{BLACK}暂停游戏 -STR_TOOLBAR_TOOLTIP_FORWARD :{BLACK}快速游戏模式 +STR_TOOLBAR_TOOLTIP_FORWARD :{BLACK}快进游戏 STR_TOOLBAR_TOOLTIP_OPTIONS :{BLACK}选项和设置 STR_TOOLBAR_TOOLTIP_SAVE_GAME_ABANDON_GAME :{BLACK}保存游戏、读取游戏、放弃游戏、退出 STR_TOOLBAR_TOOLTIP_DISPLAY_MAP :{BLACK}显示地图、附加视点、客货流或标志列表 @@ -378,8 +378,8 @@ STR_TOOLBAR_TOOLTIP_DISPLAY_COMPANY_FINANCES :{BLACK}显示 STR_TOOLBAR_TOOLTIP_DISPLAY_COMPANY_GENERAL :{BLACK}显示公司综合信息 STR_TOOLBAR_TOOLTIP_DISPLAY_STORY_BOOK :{BLACK}显示公司历史纪录 STR_TOOLBAR_TOOLTIP_DISPLAY_GOALS_LIST :{BLACK}显示游戏目标选单 -STR_TOOLBAR_TOOLTIP_DISPLAY_GRAPHS :{BLACK}显示图表和货物运费表 -STR_TOOLBAR_TOOLTIP_DISPLAY_COMPANY_LEAGUE :{BLACK}显示公司名次表 +STR_TOOLBAR_TOOLTIP_DISPLAY_GRAPHS :{BLACK}显示公司图表和货物运费表 +STR_TOOLBAR_TOOLTIP_DISPLAY_COMPANY_LEAGUE :{BLACK}显示公司排行榜 STR_TOOLBAR_TOOLTIP_FUND_CONSTRUCTION_OF_NEW :{BLACK}查看工业设施或投资工业设施建设 STR_TOOLBAR_TOOLTIP_DISPLAY_LIST_OF_COMPANY_TRAINS :{BLACK}显示公司的火车列表。按住 Ctrl 键单击可以切换组群和车辆列表。 STR_TOOLBAR_TOOLTIP_DISPLAY_LIST_OF_COMPANY_ROAD_VEHICLES :{BLACK}显示公司的汽车列表。按住 Ctrl 键单击可以切换组群和汽车列表。 @@ -388,10 +388,10 @@ STR_TOOLBAR_TOOLTIP_DISPLAY_LIST_OF_COMPANY_AIRCRAFT :{BLACK}显示 STR_TOOLBAR_TOOLTIP_ZOOM_THE_VIEW_IN :{BLACK}放大视图 STR_TOOLBAR_TOOLTIP_ZOOM_THE_VIEW_OUT :{BLACK}缩小视图 STR_TOOLBAR_TOOLTIP_BUILD_RAILROAD_TRACK :{BLACK}显示铁路建设工具 -STR_TOOLBAR_TOOLTIP_BUILD_ROADS :{BLACK}显示公路建设工具 -STR_TOOLBAR_TOOLTIP_BUILD_TRAMWAYS :{BLACK}建造电车道 -STR_TOOLBAR_TOOLTIP_BUILD_SHIP_DOCKS :{BLACK}显示水运建设工具 -STR_TOOLBAR_TOOLTIP_BUILD_AIRPORTS :{BLACK}显示机场建设工具 +STR_TOOLBAR_TOOLTIP_BUILD_ROADS :{BLACK}建设道路 +STR_TOOLBAR_TOOLTIP_BUILD_TRAMWAYS :{BLACK}建造电车轨道 +STR_TOOLBAR_TOOLTIP_BUILD_SHIP_DOCKS :{BLACK}建设码头 +STR_TOOLBAR_TOOLTIP_BUILD_AIRPORTS :{BLACK}建设机场 STR_TOOLBAR_TOOLTIP_LANDSCAPING :{BLACK}打开景观美化工具栏{}以修改地形、设置地貌等 STR_TOOLBAR_TOOLTIP_SHOW_SOUND_MUSIC_WINDOW :{BLACK}显示 声音/音乐 控制菜单 STR_TOOLBAR_TOOLTIP_SHOW_LAST_MESSAGE_NEWS :{BLACK}显示最新消息、新闻,消息历史或删除所有消息 @@ -717,7 +717,7 @@ STR_PLAYLIST_PROGRAM :{TINY_FONT}{BLA STR_PLAYLIST_CLEAR :{TINY_FONT}{BLACK}清除 STR_PLAYLIST_CHANGE_SET :更改设置 STR_PLAYLIST_TOOLTIP_CLEAR_CURRENT_PROGRAM_CUSTOM1 :{BLACK}清除当前列表中曲目{}(仅限自定义1或自定义2) -STR_PLAYLIST_TOOLTIP_CHANGE_SET :{BLACK}选择另一种已安装的音乐 +STR_PLAYLIST_TOOLTIP_CHANGE_SET :{BLACK}选择其他已安装的音乐包 STR_PLAYLIST_TOOLTIP_CLICK_TO_ADD_TRACK :{BLACK}点击音乐曲目以加入当前播放列表{}(仅限自定义1或自定义2) STR_PLAYLIST_TOOLTIP_CLICK_TO_REMOVE_TRACK :{BLACK}点击音乐曲目以从当前播放列表中删除{}(仅限自定义1或自定义2) @@ -809,7 +809,7 @@ STR_SMALLMAP_TOOLTIP_ENABLE_ALL_CARGOS :{BLACK}地图 # Status bar messages STR_STATUSBAR_TOOLTIP_SHOW_LAST_NEWS :{BLACK}显示最后一条消息或新闻 STR_STATUSBAR_COMPANY_NAME :{SILVER}- - {COMPANY} - - -STR_STATUSBAR_PAUSED :{YELLOW}* * 暂停中 * * +STR_STATUSBAR_PAUSED :{YELLOW}* * 已暂停 * * STR_STATUSBAR_PAUSED_LINK_GRAPH :{ORANGE}* * 已暂停 (等待货物分配图更新) * * STR_STATUSBAR_AUTOSAVE :{RED}自动保存 STR_STATUSBAR_SAVING_GAME :{RED}* * 保存游戏中 * * @@ -842,7 +842,7 @@ STR_NEWS_DISASTER_ZEPPELIN :{BIG_FONT}{BLAC STR_NEWS_DISASTER_SMALL_UFO :{BIG_FONT}{BLACK}汽车被 'UFO' 炸毁! STR_NEWS_DISASTER_AIRPLANE_OIL_REFINERY :{BIG_FONT}{BLACK}在 {TOWN} 附近的炼油厂泄漏! STR_NEWS_DISASTER_HELICOPTER_FACTORY :{BIG_FONT}{BLACK}在 {TOWN} 附近的工厂神秘被毁! -STR_NEWS_DISASTER_BIG_UFO :{BIG_FONT}{BLACK}'UFO' 在 {TOWN} 附近降落! +STR_NEWS_DISASTER_BIG_UFO :{BIG_FONT}{BLACK}UFO 在 {TOWN} 附近降落! STR_NEWS_DISASTER_COAL_MINE_SUBSIDENCE :{BIG_FONT}{BLACK}在 {TOWN} 附近的煤矿发生塌方! STR_NEWS_DISASTER_FLOOD_VEHICLE :{BIG_FONT}{BLACK}洪水!{}至少 {COMMA} 人失踪,据推测凶多吉少! @@ -1172,7 +1172,7 @@ STR_TERRAIN_TYPE_CUSTOM :自定义高度 STR_TERRAIN_TYPE_CUSTOM_VALUE :自定义高度 ({NUM}) ###length 4 -STR_CITY_APPROVAL_LENIENT :宽容的 +STR_CITY_APPROVAL_LENIENT :宽容 STR_CITY_APPROVAL_TOLERANT :隐忍 STR_CITY_APPROVAL_HOSTILE :对立 STR_CITY_APPROVAL_PERMISSIVE :宽容(对公司行为没有影响 ) @@ -1777,6 +1777,7 @@ STR_CONFIG_SETTING_SERVINT_DISABLED :关闭 STR_CONFIG_SETTING_NOSERVICE :在无故障模式下禁用保养周期:{STRING} STR_CONFIG_SETTING_NOSERVICE_HELPTEXT :“打开”时,在无故障模式下,车辆禁用保养周期 + STR_CONFIG_SETTING_WAGONSPEEDLIMITS :启动车辆限速:{STRING} STR_CONFIG_SETTING_WAGONSPEEDLIMITS_HELPTEXT :“打开“时,还要根据车辆的限速来决定一列火车的最高速度 @@ -1923,8 +1924,8 @@ STR_CONFIG_SETTING_SNAP_RADIUS_HELPTEXT :移动一个窗 STR_CONFIG_SETTING_SNAP_RADIUS_VALUE :{COMMA} 像素 ###setting-zero-is-special STR_CONFIG_SETTING_SNAP_RADIUS_DISABLED :关闭 -STR_CONFIG_SETTING_SOFT_LIMIT :窗口软性限制(非粘滞): {STRING} -STR_CONFIG_SETTING_SOFT_LIMIT_HELPTEXT :设置为腾出位置显示新的窗口,在打开多少个窗口后自动关闭非锁定窗口 +STR_CONFIG_SETTING_SOFT_LIMIT :窗口数量上限: {STRING} +STR_CONFIG_SETTING_SOFT_LIMIT_HELPTEXT :设定窗口数量上限。超出此限值时游戏会自动关闭最早打开的窗口。已固定的窗口不受此项限制。 STR_CONFIG_SETTING_SOFT_LIMIT_VALUE :{COMMA} ###setting-zero-is-special STR_CONFIG_SETTING_SOFT_LIMIT_DISABLED :关闭 @@ -2196,12 +2197,20 @@ STR_LIVERY_TRAIN_TOOLTIP :{BLACK}显示 STR_LIVERY_ROAD_VEHICLE_TOOLTIP :{BLACK}显示汽车配色方案 STR_LIVERY_SHIP_TOOLTIP :{BLACK}显示船只配色方案 STR_LIVERY_AIRCRAFT_TOOLTIP :{BLACK}显示飞机配色方案 +STR_LIVERY_TRAIN_GROUP_TOOLTIP :{BLACK}显示列车分组配色 +STR_LIVERY_ROAD_VEHICLE_GROUP_TOOLTIP :{BLACK}显示汽车分组配色 +STR_LIVERY_SHIP_GROUP_TOOLTIP :{BLACK}显示船只分组配色 +STR_LIVERY_AIRCRAFT_GROUP_TOOLTIP :{BLACK}显示飞机分组配色 STR_LIVERY_PRIMARY_TOOLTIP :{BLACK}为选定的配色方案指定主色调 STR_LIVERY_SECONDARY_TOOLTIP :{BLACK}为选定的配色方案指定副色调 STR_LIVERY_PANEL_TOOLTIP :{BLACK}选择一个或多个(CTRL+单击){}要更改的配色方案{}点击方块可以切换不同的方案 +STR_LIVERY_TRAIN_GROUP_EMPTY :尚未为列车分组 +STR_LIVERY_ROAD_VEHICLE_GROUP_EMPTY :尚未为汽车分组 +STR_LIVERY_SHIP_GROUP_EMPTY :尚未为船只分组 +STR_LIVERY_AIRCRAFT_GROUP_EMPTY :尚未为飞机分组 ###length 23 -STR_LIVERY_DEFAULT :标准外观 +STR_LIVERY_DEFAULT :默认配色 STR_LIVERY_STEAM :蒸汽机车 STR_LIVERY_DIESEL :内燃机车 STR_LIVERY_ELECTRIC :电力机车 @@ -2861,10 +2870,10 @@ STR_STATION_BUILD_AIRPORT_LAYOUT_NAME :{BLACK}配置 { STR_AIRPORT_SMALL :小型机场 STR_AIRPORT_CITY :城市机场 -STR_AIRPORT_METRO :国内机场 +STR_AIRPORT_METRO :都会机场 STR_AIRPORT_INTERNATIONAL :国际机场 STR_AIRPORT_COMMUTER :通勤机场 -STR_AIRPORT_INTERCONTINENTAL :全球机场 +STR_AIRPORT_INTERCONTINENTAL :洲际机场 STR_AIRPORT_HELIPORT :直升机停机楼 STR_AIRPORT_HELIDEPOT :直升机专用机场 STR_AIRPORT_HELISTATION :直升机小型机场 @@ -3325,7 +3334,7 @@ STR_GENERATION_PREPARING_GAME :{BLACK}准备 STR_NEWGRF_SETTINGS_CAPTION :{WHITE}NewGRF 设置 STR_NEWGRF_SETTINGS_INFO_TITLE :{WHITE}NewGRF 详细信息 STR_NEWGRF_SETTINGS_ACTIVE_LIST :{WHITE}已激活 NewGRF -STR_NEWGRF_SETTINGS_INACTIVE_LIST :{WHITE}停用 NewGRF +STR_NEWGRF_SETTINGS_INACTIVE_LIST :{WHITE}已停用 NewGRF STR_NEWGRF_SETTINGS_SELECT_PRESET :{ORANGE}选择预设 STR_NEWGRF_FILTER_TITLE :{ORANGE}关键字词搜索: STR_NEWGRF_SETTINGS_PRESET_LIST_TOOLTIP :{BLACK}装载选定的预定义 @@ -3337,8 +3346,8 @@ STR_NEWGRF_SETTINGS_ADD :{BLACK}增加 STR_NEWGRF_SETTINGS_ADD_FILE_TOOLTIP :{BLACK}将选定的 NewGRF 文件添加到你的配置中 STR_NEWGRF_SETTINGS_RESCAN_FILES :{BLACK}重新检索文件 STR_NEWGRF_SETTINGS_RESCAN_FILES_TOOLTIP :{BLACK}刷新可用的 NewGRF 文件列表 -STR_NEWGRF_SETTINGS_REMOVE :{BLACK}删除 -STR_NEWGRF_SETTINGS_REMOVE_TOOLTIP :{BLACK}从列表中删除一个 NewGRF 文件 +STR_NEWGRF_SETTINGS_REMOVE :{BLACK}停用 +STR_NEWGRF_SETTINGS_REMOVE_TOOLTIP :{BLACK}从列表中停用选定的 NewGRF 文件 STR_NEWGRF_SETTINGS_MOVEUP :{BLACK}上移 STR_NEWGRF_SETTINGS_MOVEUP_TOOLTIP :{BLACK}将选定的 NewGRF 文件向上移动 STR_NEWGRF_SETTINGS_MOVEDOWN :{BLACK}下移 @@ -3350,7 +3359,7 @@ STR_NEWGRF_SETTINGS_FILE_TOOLTIP :{BLACK}已经 STR_NEWGRF_SETTINGS_SET_PARAMETERS :{BLACK}设置参数 STR_NEWGRF_SETTINGS_SHOW_PARAMETERS :{BLACK}显示参数 STR_NEWGRF_SETTINGS_TOGGLE_PALETTE :{BLACK}切换调色板 -STR_NEWGRF_SETTINGS_TOGGLE_PALETTE_TOOLTIP :{BLACK}切换选定GRF的调色.{}本功能用于游戏使用时GRF呈粉色 +STR_NEWGRF_SETTINGS_TOGGLE_PALETTE_TOOLTIP :{BLACK}切换选定GRF的调色盘。{}如果该GRF在游戏中看起来是一片粉色,您可以尝试调整此项以解决问题。若没有问题,请不要调整此项 STR_NEWGRF_SETTINGS_APPLY_CHANGES :{BLACK}应用 STR_NEWGRF_SETTINGS_FIND_MISSING_CONTENT_BUTTON :{BLACK}在线查找缺失的扩展包 @@ -3362,10 +3371,10 @@ STR_NEWGRF_SETTINGS_VERSION :{BLACK}版本: STR_NEWGRF_SETTINGS_MIN_VERSION :{BLACK}最低兼容版本: {SILVER}{NUM} STR_NEWGRF_SETTINGS_MD5SUM :{BLACK}MD5 码:{SILVER}{STRING} STR_NEWGRF_SETTINGS_PALETTE :{BLACK}调色板: {SILVER}{STRING} -STR_NEWGRF_SETTINGS_PALETTE_DEFAULT :默认 (D) -STR_NEWGRF_SETTINGS_PALETTE_DEFAULT_32BPP :默认 (D) / 32 bpp -STR_NEWGRF_SETTINGS_PALETTE_LEGACY :传统 (W) -STR_NEWGRF_SETTINGS_PALETTE_LEGACY_32BPP :传统 (W) / 32 bpp +STR_NEWGRF_SETTINGS_PALETTE_DEFAULT :默认 (DOS) +STR_NEWGRF_SETTINGS_PALETTE_DEFAULT_32BPP :默认 (DOS) / 32 bpp +STR_NEWGRF_SETTINGS_PALETTE_LEGACY :传统 (Windows) +STR_NEWGRF_SETTINGS_PALETTE_LEGACY_32BPP :传统 (Windows) / 32 bpp STR_NEWGRF_SETTINGS_PARAMETER :{BLACK}参数:{SILVER}{STRING} STR_NEWGRF_SETTINGS_PARAMETER_NONE :无 @@ -3661,7 +3670,7 @@ STR_STATION_LIST_WAYPOINT :{YELLOW}{WAYPOI STR_STATION_LIST_NONE :{YELLOW}- 没有 - STR_STATION_LIST_SELECT_ALL_FACILITIES :{BLACK}选择全部运输工具种类 STR_STATION_LIST_SELECT_ALL_TYPES :{BLACK}选择所有货物类型{}(包括不在等待列表中的) -STR_STATION_LIST_NO_WAITING_CARGO :{BLACK}选择无等待货物车站 +STR_STATION_LIST_NO_WAITING_CARGO :{BLACK}无任何货物等待运送 # Station view window STR_STATION_VIEW_CAPTION :{WHITE}{STATION} {STATION_FEATURES} @@ -4277,7 +4286,7 @@ STR_VEHICLE_VIEW_AIRCRAFT_STATUS_START_STOP_TOOLTIP :{BLACK}当前 # Messages in the start stop button in the vehicle view STR_VEHICLE_STATUS_LOADING_UNLOADING :{LTBLUE}装载/卸货 STR_VEHICLE_STATUS_LEAVING :{LTBLUE}发车 -STR_VEHICLE_STATUS_CRASHED :{RED}撞毁! +STR_VEHICLE_STATUS_CRASHED :{RED}已撞毁! STR_VEHICLE_STATUS_BROKEN_DOWN :{RED}抛锚 STR_VEHICLE_STATUS_STOPPED :{RED}停运 STR_VEHICLE_STATUS_TRAIN_STOPPING_VEL :{RED}正在停止,{VELOCITY} @@ -4288,11 +4297,11 @@ STR_VEHICLE_STATUS_AIRCRAFT_TOO_FAR :{ORANGE}距离 STR_VEHICLE_STATUS_HEADING_FOR_STATION_VEL :{LTBLUE}正在前往 {STATION},{VELOCITY} STR_VEHICLE_STATUS_NO_ORDERS_VEL :{LTBLUE}没有目标,{VELOCITY} STR_VEHICLE_STATUS_HEADING_FOR_WAYPOINT_VEL :{LTBLUE}正在前往{WAYPOINT},{VELOCITY} -STR_VEHICLE_STATUS_HEADING_FOR_DEPOT_VEL :{ORANGE}正前往 {DEPOT}, {VELOCITY} +STR_VEHICLE_STATUS_HEADING_FOR_DEPOT_VEL :{ORANGE}正在前往 {DEPOT}, {VELOCITY} STR_VEHICLE_STATUS_HEADING_FOR_DEPOT_SERVICE_VEL :{LTBLUE}正在服务于 {DEPOT}, {VELOCITY} STR_VEHICLE_STATUS_CANNOT_REACH_STATION_VEL :{LTBLUE}不能到达 {STATION}, {VELOCITY} -STR_VEHICLE_STATUS_CANNOT_REACH_WAYPOINT_VEL :{LTBLUE}不能到达路点 {WAYPOINT}, {VELOCITY} +STR_VEHICLE_STATUS_CANNOT_REACH_WAYPOINT_VEL :{LTBLUE}不能到达 {WAYPOINT}, {VELOCITY} STR_VEHICLE_STATUS_CANNOT_REACH_DEPOT_VEL :{ORANGE}不能到达 {DEPOT}, {VELOCITY} STR_VEHICLE_STATUS_CANNOT_REACH_DEPOT_SERVICE_VEL :{LTBLUE}不能到达 {DEPOT}, {VELOCITY} @@ -4653,9 +4662,9 @@ STR_AI_DEBUG_MATCH_CASE :{BLACK}符合 STR_AI_DEBUG_MATCH_CASE_TOOLTIP :{BLACK}切换对比AI 记录信息是否与断点字符串相符时是否要符合大小写 STR_AI_DEBUG_CONTINUE :{BLACK}继续 STR_AI_DEBUG_CONTINUE_TOOLTIP :{BLACK}取消暂停AI -STR_AI_DEBUG_SELECT_AI_TOOLTIP :{BLACK}查看此AI的调试输出 +STR_AI_DEBUG_SELECT_AI_TOOLTIP :{BLACK}查看此AI的调试输出。按住Ctrl键点选以打开新窗口 STR_AI_GAME_SCRIPT :{BLACK}游戏脚本 -STR_AI_GAME_SCRIPT_TOOLTIP :{BLACK}查看脚本记录 +STR_AI_GAME_SCRIPT_TOOLTIP :{BLACK}检查游戏脚本日志。按住Ctrl键点选以打开新窗口 STR_ERROR_AI_NO_AI_FOUND :找不到可用的AI。{}本AI是一个演示AI,并不会在游戏中做任何动作,{}您可以通过“在线查找扩展包”功能下载新的AI。 STR_ERROR_AI_PLEASE_REPORT_CRASH :{WHITE}您使用的一个AI崩溃了。请附上一张AI调试窗口的截图,将此错误通报AI作者。 diff --git a/src/lang/slovak.txt b/src/lang/slovak.txt index 7a01b41ad6..2761d26018 100644 --- a/src/lang/slovak.txt +++ b/src/lang/slovak.txt @@ -1815,6 +1815,7 @@ STR_CONFIG_SETTING_SERVINT_DISABLED :vypnuté STR_CONFIG_SETTING_NOSERVICE :Vypnúť servisy, ak sú vypnuté poruchy: {STRING} STR_CONFIG_SETTING_NOSERVICE_HELPTEXT :Ak je zapnuté, vozidlá nebudú servisované ak sú vypnuté poruchy. + STR_CONFIG_SETTING_WAGONSPEEDLIMITS :Obmedzenie rýchlosti pre vagóny: {STRING} STR_CONFIG_SETTING_WAGONSPEEDLIMITS_HELPTEXT :Ak je zapnuté, použijú sa tiež rýchlostné obmedzenia pre vagóny na obmedzenie celkovej rýchlosti vlakov. diff --git a/src/lang/slovenian.txt b/src/lang/slovenian.txt index 7c28205376..ff6849addd 100644 --- a/src/lang/slovenian.txt +++ b/src/lang/slovenian.txt @@ -1735,6 +1735,7 @@ STR_CONFIG_SETTING_SERVINT_DISABLED :Onemogočeno STR_CONFIG_SETTING_NOSERVICE :Onemogoči servisiranje, če so onemogočene okvare: {STRING} STR_CONFIG_SETTING_NOSERVICE_HELPTEXT :Če je omogočeno, se vozila ne servisirajo, če ni okvar. + STR_CONFIG_SETTING_WAGONSPEEDLIMITS :Omogoči omejitve hitrosti vagonov: {STRING} STR_CONFIG_SETTING_WAGONSPEEDLIMITS_HELPTEXT :Če je omogočeno, se upošteva tudi omejitve hitrosti posameznih vagonov pri najvišji hitrosti vlaka. diff --git a/src/lang/spanish.txt b/src/lang/spanish.txt index 1c27e5fd52..2307048bfe 100644 --- a/src/lang/spanish.txt +++ b/src/lang/spanish.txt @@ -1710,6 +1710,7 @@ STR_CONFIG_SETTING_SERVINT_DISABLED :Deshabilitado STR_CONFIG_SETTING_NOSERVICE :Desactivar mantenimiento cuando las averías están desactivadas: {STRING} STR_CONFIG_SETTING_NOSERVICE_HELPTEXT :Cuando se activa, los vehículos no reciben mantenimiento si no pueden averiarse + STR_CONFIG_SETTING_WAGONSPEEDLIMITS :Activar límites de velocidad en vagones: {STRING} STR_CONFIG_SETTING_WAGONSPEEDLIMITS_HELPTEXT :Si se activa, se tienen en cuenta los límites de velocidad de los vagones a la hora de establecer la velocidad máxima de un tren diff --git a/src/lang/spanish_MX.txt b/src/lang/spanish_MX.txt index c73c53cd4e..b85e3c8682 100644 --- a/src/lang/spanish_MX.txt +++ b/src/lang/spanish_MX.txt @@ -1710,6 +1710,7 @@ STR_CONFIG_SETTING_SERVINT_DISABLED :Deshabilitado STR_CONFIG_SETTING_NOSERVICE :Desactivar mantenimiento si las averías están desactivadas: {STRING} STR_CONFIG_SETTING_NOSERVICE_HELPTEXT :Al activarse, los vehículos no recibirán mantenimiento si no pueden averiarse + STR_CONFIG_SETTING_WAGONSPEEDLIMITS :Activar límites de velocidad para vagones: {STRING} STR_CONFIG_SETTING_WAGONSPEEDLIMITS_HELPTEXT :Al activarse, se tienen en cuenta los límites de velocidad de los vagones para decidir la máxima velocidad de un tren diff --git a/src/lang/swedish.txt b/src/lang/swedish.txt index 8749a84be0..e20e3d46be 100644 --- a/src/lang/swedish.txt +++ b/src/lang/swedish.txt @@ -1762,6 +1762,7 @@ STR_CONFIG_SETTING_SERVINT_DISABLED :Inaktiverat STR_CONFIG_SETTING_NOSERVICE :Inaktivera service när motorstopp är av: {STRING} STR_CONFIG_SETTING_NOSERVICE_HELPTEXT :När det är aktiverat servas inte fordon om de inte kan få motorstopp + STR_CONFIG_SETTING_WAGONSPEEDLIMITS :Använd hastighetsbegränsningar för tågvagnar: {STRING} STR_CONFIG_SETTING_WAGONSPEEDLIMITS_HELPTEXT :När det är aktiverat tas även hänsyn till vagnarnas hastighetsbegränsningar när ett tågs maxhastighet beräknas diff --git a/src/lang/tamil.txt b/src/lang/tamil.txt index 577a6f955e..ce0e573aae 100644 --- a/src/lang/tamil.txt +++ b/src/lang/tamil.txt @@ -1549,6 +1549,7 @@ STR_CONFIG_SETTING_SERVINT_DISABLED :செயலி STR_CONFIG_SETTING_NOSERVICE :பழுதுகள் இல்லையெனில் பழுதுபார்த்தலினை செயலிழக்கவும்: {STRING} STR_CONFIG_SETTING_NOSERVICE_HELPTEXT :இயக்கப்படும் போது, வாகனங்கள் உடைக்க முடியாவிட்டால் சேவை செய்யப்படாது + STR_CONFIG_SETTING_WAGONSPEEDLIMITS :பெட்டி வேக கட்டுப்பாட்டினை செயல்படுத்தவும்: {STRING} STR_CONFIG_SETTING_DISABLE_ELRAILS :மின்சார இரயில்களை அனுமதிக்காதே: {STRING} diff --git a/src/lang/thai.txt b/src/lang/thai.txt index cb5798c642..876b6cf246 100644 --- a/src/lang/thai.txt +++ b/src/lang/thai.txt @@ -1596,6 +1596,7 @@ STR_CONFIG_SETTING_SERVINT_DISABLED :ไม่ตั STR_CONFIG_SETTING_NOSERVICE :ไม่ใช้งานการซ่อมบำรุงเมื่อตั้งเป็นไม่มีการขัดข้อง: {STRING} STR_CONFIG_SETTING_NOSERVICE_HELPTEXT :เมื่อเปิดใช้งาน ยานพาหนะจะไม่เข้ารับการซ่อมบำรุงหากตั้งค่าไว้ไม่ให้มีการชำรุด + STR_CONFIG_SETTING_WAGONSPEEDLIMITS :จำกัดความเร็วของรถจักร/รถพ่วง: {STRING} STR_CONFIG_SETTING_WAGONSPEEDLIMITS_HELPTEXT :เมื่อเปิดใช้งาน จะทำให้มีจำกัดความเร็วสูงสุดของยานพาหนะและรถพ่วงต่างๆ diff --git a/src/lang/traditional_chinese.txt b/src/lang/traditional_chinese.txt index 03e036c28a..af6d24f501 100644 --- a/src/lang/traditional_chinese.txt +++ b/src/lang/traditional_chinese.txt @@ -1755,6 +1755,7 @@ STR_CONFIG_SETTING_SERVINT_DISABLED :停用 STR_CONFIG_SETTING_NOSERVICE :如果停用故障,車輛不會進行自動維護:{STRING} STR_CONFIG_SETTING_NOSERVICE_HELPTEXT :如啟用此選項,而且車輛設定為不故障,它們將不會進入機廠接受維護。 + STR_CONFIG_SETTING_WAGONSPEEDLIMITS :開啟列車車廂速限:{STRING} STR_CONFIG_SETTING_WAGONSPEEDLIMITS_HELPTEXT :如啟用此選項,無動力車廂的限速會影響列車的最高速度。 diff --git a/src/lang/turkish.txt b/src/lang/turkish.txt index eecec8e4e7..056a8b07f1 100644 --- a/src/lang/turkish.txt +++ b/src/lang/turkish.txt @@ -1777,6 +1777,7 @@ STR_CONFIG_SETTING_SERVINT_DISABLED :Etkisiz STR_CONFIG_SETTING_NOSERVICE :Bozulmalar kapalıysa sevisler kapalı olsun: {STRING} STR_CONFIG_SETTING_NOSERVICE_HELPTEXT :Etkinleştirildiğinde, araçlar bozulmuyorlarsa bakıma gönderilmezler + STR_CONFIG_SETTING_WAGONSPEEDLIMITS :Vagonların treni yavaşlatması izinli: {STRING} STR_CONFIG_SETTING_WAGONSPEEDLIMITS_HELPTEXT :Etkinleştirildiğinde, bir trenin azami hızına karar verirken vagonların hız limitleri de göz önünde bulundurulur diff --git a/src/lang/ukrainian.txt b/src/lang/ukrainian.txt index 3e9de47466..ea6f39c4a3 100644 --- a/src/lang/ukrainian.txt +++ b/src/lang/ukrainian.txt @@ -1857,6 +1857,7 @@ STR_CONFIG_SETTING_SERVINT_DISABLED :Відключ STR_CONFIG_SETTING_NOSERVICE :Не відправляти на техогляд, якщо відключені аварії: {STRING} STR_CONFIG_SETTING_NOSERVICE_HELPTEXT :Включення цієї опції дозволяє не проводити автоматичний техогляд у разі, якщо поломки транспорту вимкнено. + STR_CONFIG_SETTING_WAGONSPEEDLIMITS :Враховувати обмеження швидкості вагонів: {STRING} STR_CONFIG_SETTING_WAGONSPEEDLIMITS_HELPTEXT :При включенні максимальна швидкість потяга враховує обмеження швидкості вагонів. diff --git a/src/lang/urdu.txt b/src/lang/urdu.txt index afa61cebac..d6a8d6db9a 100644 --- a/src/lang/urdu.txt +++ b/src/lang/urdu.txt @@ -1336,6 +1336,7 @@ STR_CONFIG_SETTING_SERVINT_ISPERCENT :مرمتی وق STR_CONFIG_SETTING_NOSERVICE :گاڑیوں کی خرابی غیر فعال ہونے کی صورت میں مرمت بھی غیر فعال کر دیں: {STRING} + STR_CONFIG_SETTING_WAGONSPEEDLIMITS :مال گاڑی کی حد رفتار فعال کریں: {STRING} STR_CONFIG_SETTING_DISABLE_ELRAILS :الیلٹرک ریل گاڑیاں غیر فعال کریں: {STRING} diff --git a/src/lang/vietnamese.txt b/src/lang/vietnamese.txt index d29cbb867c..0cbd17a0bb 100644 --- a/src/lang/vietnamese.txt +++ b/src/lang/vietnamese.txt @@ -1777,6 +1777,7 @@ STR_CONFIG_SETTING_SERVINT_DISABLED :tắt STR_CONFIG_SETTING_NOSERVICE :Tắt bảo trì khi đặt tắt tuỳ chọn hỏng hóc: {STRING} STR_CONFIG_SETTING_NOSERVICE_HELPTEXT :Nếu bật, phương tiện sẽ không cần bảo trì nếu chúng không thể bị hỏng + STR_CONFIG_SETTING_WAGONSPEEDLIMITS :Bật giới hạn tốc độ toa tàu: {STRING} STR_CONFIG_SETTING_WAGONSPEEDLIMITS_HELPTEXT :Nếu bật, sử dụng giới hạn tốc độ của toa xe để hạn chế tốc độ của cả đoàn tàu diff --git a/src/lang/welsh.txt b/src/lang/welsh.txt index c50e759abb..8f291f18b8 100644 --- a/src/lang/welsh.txt +++ b/src/lang/welsh.txt @@ -1627,6 +1627,7 @@ STR_CONFIG_SETTING_SERVINT_DISABLED :Analluogwyd STR_CONFIG_SETTING_NOSERVICE :Analluogi gwasanaethau pan fydd torri i lawr wedi ei osod i Ddim: {STRING} STR_CONFIG_SETTING_NOSERVICE_HELPTEXT :Pan y galluogir, ni wasanaethir cerbydau os na allent dorri i lawr + STR_CONFIG_SETTING_WAGONSPEEDLIMITS :Galluogi terfynau cyflymder wagenni: {STRING} STR_CONFIG_SETTING_WAGONSPEEDLIMITS_HELPTEXT :Pan y galluogir, fe ddefnyddir terfynnau cyflymder pob cerbyd mewn trên pan yn cyfrifo ei gyflymder uchafsymol From 7482f716927dcd9209d61f30db2485b2b39ccaf5 Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Thu, 4 Jan 2024 20:50:58 +0000 Subject: [PATCH 10/13] Change: Don't handle 'missing' string parameters as 0. (#11673) If not enough parameters are supplied for a string, then a value of 0 was used, which could result in incorrect information being displayed. Instead, throw an exception and include an error in the string. --- src/strings.cpp | 1241 ++++++++++++++++++++-------------------- src/strings_internal.h | 3 +- 2 files changed, 623 insertions(+), 621 deletions(-) diff --git a/src/strings.cpp b/src/strings.cpp index 1e29b2493f..456ea6ab34 100644 --- a/src/strings.cpp +++ b/src/strings.cpp @@ -81,15 +81,13 @@ StringParameter *StringParameters::GetNextParameterPointer() { assert(this->next_type == 0 || (SCC_CONTROL_START <= this->next_type && this->next_type <= SCC_CONTROL_END)); if (this->offset >= this->parameters.size()) { - Debug(misc, 0, "Trying to read invalid string parameter"); - return nullptr; + throw std::out_of_range("Trying to read invalid string parameter"); } auto ¶m = this->parameters[this->offset++]; if (param.type != 0 && param.type != this->next_type) { - Debug(misc, 0, "Trying to read string parameter with wrong type"); this->next_type = 0; - return nullptr; + throw std::out_of_range("Trying to read string parameter with wrong type"); } param.type = this->next_type; this->next_type = 0; @@ -903,733 +901,738 @@ static void FormatString(StringBuilder &builder, const char *str_arg, StringPara str_stack.push(str_arg); for (;;) { - while (!str_stack.empty() && (b = Utf8Consume(&str_stack.top())) == '\0') { - str_stack.pop(); - } - if (str_stack.empty()) break; - const char *&str = str_stack.top(); - - if (SCC_NEWGRF_FIRST <= b && b <= SCC_NEWGRF_LAST) { - /* We need to pass some stuff as it might be modified. */ - StringParameters remaining = args.GetRemainingParameters(); - b = RemapNewGRFStringControlCode(b, &str, remaining, dry_run); - if (b == 0) continue; - } + try { + while (!str_stack.empty() && (b = Utf8Consume(&str_stack.top())) == '\0') { + str_stack.pop(); + } + if (str_stack.empty()) break; + const char *&str = str_stack.top(); + + if (SCC_NEWGRF_FIRST <= b && b <= SCC_NEWGRF_LAST) { + /* We need to pass some stuff as it might be modified. */ + StringParameters remaining = args.GetRemainingParameters(); + b = RemapNewGRFStringControlCode(b, &str, remaining, dry_run); + if (b == 0) continue; + } - if (b < SCC_CONTROL_START || b > SCC_CONTROL_END) { - builder.Utf8Encode(b); - continue; - } + if (b < SCC_CONTROL_START || b > SCC_CONTROL_END) { + builder.Utf8Encode(b); + continue; + } - args.SetTypeOfNextParameter(b); - switch (b) { - case SCC_ENCODED: { - ArrayStringParameters<20> sub_args; - - char *p; - uint32_t stringid = std::strtoul(str, &p, 16); - if (*p != ':' && *p != '\0') { - while (*p != '\0') p++; - str = p; - builder += "(invalid SCC_ENCODED)"; - break; - } - if (stringid >= TAB_SIZE_GAMESCRIPT) { - while (*p != '\0') p++; - str = p; - builder += "(invalid StringID)"; - break; - } + args.SetTypeOfNextParameter(b); + switch (b) { + case SCC_ENCODED: { + ArrayStringParameters<20> sub_args; + + char *p; + uint32_t stringid = std::strtoul(str, &p, 16); + if (*p != ':' && *p != '\0') { + while (*p != '\0') p++; + str = p; + builder += "(invalid SCC_ENCODED)"; + break; + } + if (stringid >= TAB_SIZE_GAMESCRIPT) { + while (*p != '\0') p++; + str = p; + builder += "(invalid StringID)"; + break; + } - int i = 0; - while (*p != '\0' && i < 20) { - uint64_t param; - const char *s = ++p; - - /* Find the next value */ - bool instring = false; - bool escape = false; - for (;; p++) { - if (*p == '\\') { - escape = true; - continue; - } - if (*p == '"' && escape) { + int i = 0; + while (*p != '\0' && i < 20) { + uint64_t param; + const char *s = ++p; + + /* Find the next value */ + bool instring = false; + bool escape = false; + for (;; p++) { + if (*p == '\\') { + escape = true; + continue; + } + if (*p == '"' && escape) { + escape = false; + continue; + } escape = false; - continue; - } - escape = false; - if (*p == '"') { - instring = !instring; - continue; - } - if (instring) { - continue; - } + if (*p == '"') { + instring = !instring; + continue; + } + if (instring) { + continue; + } - if (*p == ':') break; - if (*p == '\0') break; - } + if (*p == ':') break; + if (*p == '\0') break; + } - if (*s != '"') { - /* Check if we want to look up another string */ - char32_t l; - size_t len = Utf8Decode(&l, s); - bool lookup = (l == SCC_ENCODED); - if (lookup) s += len; - - param = std::strtoull(s, &p, 16); - - if (lookup) { - if (param >= TAB_SIZE_GAMESCRIPT) { - while (*p != '\0') p++; - str = p; - builder += "(invalid sub-StringID)"; - break; + if (*s != '"') { + /* Check if we want to look up another string */ + char32_t l; + size_t len = Utf8Decode(&l, s); + bool lookup = (l == SCC_ENCODED); + if (lookup) s += len; + + param = std::strtoull(s, &p, 16); + + if (lookup) { + if (param >= TAB_SIZE_GAMESCRIPT) { + while (*p != '\0') p++; + str = p; + builder += "(invalid sub-StringID)"; + break; + } + param = MakeStringID(TEXT_TAB_GAMESCRIPT_START, param); } - param = MakeStringID(TEXT_TAB_GAMESCRIPT_START, param); - } - sub_args.SetParam(i++, param); - } else { - s++; // skip the leading \" - sub_args.SetParam(i++, std::string(s, p - s - 1)); // also skip the trailing \". + sub_args.SetParam(i++, param); + } else { + s++; // skip the leading \" + sub_args.SetParam(i++, std::string(s, p - s - 1)); // also skip the trailing \". + } } + /* If we didn't error out, we can actually print the string. */ + if (*str != '\0') { + str = p; + GetStringWithArgs(builder, MakeStringID(TEXT_TAB_GAMESCRIPT_START, stringid), sub_args, true); + } + break; } - /* If we didn't error out, we can actually print the string. */ - if (*str != '\0') { - str = p; - GetStringWithArgs(builder, MakeStringID(TEXT_TAB_GAMESCRIPT_START, stringid), sub_args, true); - } - break; - } - case SCC_NEWGRF_STRINL: { - StringID substr = Utf8Consume(&str); - str_stack.push(GetStringPtr(substr)); - break; - } + case SCC_NEWGRF_STRINL: { + StringID substr = Utf8Consume(&str); + str_stack.push(GetStringPtr(substr)); + break; + } - case SCC_NEWGRF_PRINT_WORD_STRING_ID: { - StringID substr = args.GetNextParameter(); - str_stack.push(GetStringPtr(substr)); - case_index = next_substr_case_index; - next_substr_case_index = 0; - break; - } + case SCC_NEWGRF_PRINT_WORD_STRING_ID: { + StringID substr = args.GetNextParameter(); + str_stack.push(GetStringPtr(substr)); + case_index = next_substr_case_index; + next_substr_case_index = 0; + break; + } - case SCC_GENDER_LIST: { // {G 0 Der Die Das} - /* First read the meta data from the language file. */ - size_t offset = orig_offset + (byte)*str++; - int gender = 0; - if (!dry_run && args.GetTypeAtOffset(offset) != 0) { - /* Now we need to figure out what text to resolve, i.e. - * what do we need to draw? So get the actual raw string - * first using the control code to get said string. */ - char input[4 + 1]; - char *p = input + Utf8Encode(input, args.GetTypeAtOffset(offset)); - *p = '\0'; - - /* The gender is stored at the start of the formatted string. */ - bool old_sgd = _scan_for_gender_data; - _scan_for_gender_data = true; - std::string buffer; - StringBuilder tmp_builder(buffer); - StringParameters tmp_params = args.GetRemainingParameters(offset); - FormatString(tmp_builder, input, tmp_params); - _scan_for_gender_data = old_sgd; - - /* And determine the string. */ - const char *s = buffer.c_str(); - char32_t c = Utf8Consume(&s); - /* Does this string have a gender, if so, set it */ - if (c == SCC_GENDER_INDEX) gender = (byte)s[0]; + case SCC_GENDER_LIST: { // {G 0 Der Die Das} + /* First read the meta data from the language file. */ + size_t offset = orig_offset + (byte)*str++; + int gender = 0; + if (!dry_run && args.GetTypeAtOffset(offset) != 0) { + /* Now we need to figure out what text to resolve, i.e. + * what do we need to draw? So get the actual raw string + * first using the control code to get said string. */ + char input[4 + 1]; + char *p = input + Utf8Encode(input, args.GetTypeAtOffset(offset)); + *p = '\0'; + + /* The gender is stored at the start of the formatted string. */ + bool old_sgd = _scan_for_gender_data; + _scan_for_gender_data = true; + std::string buffer; + StringBuilder tmp_builder(buffer); + StringParameters tmp_params = args.GetRemainingParameters(offset); + FormatString(tmp_builder, input, tmp_params); + _scan_for_gender_data = old_sgd; + + /* And determine the string. */ + const char *s = buffer.c_str(); + char32_t c = Utf8Consume(&s); + /* Does this string have a gender, if so, set it */ + if (c == SCC_GENDER_INDEX) gender = (byte)s[0]; + } + str = ParseStringChoice(str, gender, builder); + break; } - str = ParseStringChoice(str, gender, builder); - break; - } - /* This sets up the gender for the string. - * We just ignore this one. It's used in {G 0 Der Die Das} to determine the case. */ - case SCC_GENDER_INDEX: // {GENDER 0} - if (_scan_for_gender_data) { - builder.Utf8Encode(SCC_GENDER_INDEX); - builder += *str++; - } else { - str++; + /* This sets up the gender for the string. + * We just ignore this one. It's used in {G 0 Der Die Das} to determine the case. */ + case SCC_GENDER_INDEX: // {GENDER 0} + if (_scan_for_gender_data) { + builder.Utf8Encode(SCC_GENDER_INDEX); + builder += *str++; + } else { + str++; + } + break; + + case SCC_PLURAL_LIST: { // {P} + int plural_form = *str++; // contains the plural form for this string + size_t offset = orig_offset + (byte)*str++; + int64_t v = args.GetParam(offset); // contains the number that determines plural + str = ParseStringChoice(str, DeterminePluralForm(v, plural_form), builder); + break; } - break; - - case SCC_PLURAL_LIST: { // {P} - int plural_form = *str++; // contains the plural form for this string - size_t offset = orig_offset + (byte)*str++; - int64_t v = args.GetParam(offset); // contains the number that determines plural - str = ParseStringChoice(str, DeterminePluralForm(v, plural_form), builder); - break; - } - case SCC_ARG_INDEX: { // Move argument pointer - args.SetOffset(orig_offset + (byte)*str++); - break; - } + case SCC_ARG_INDEX: { // Move argument pointer + args.SetOffset(orig_offset + (byte)*str++); + break; + } - case SCC_SET_CASE: { // {SET_CASE} - /* This is a pseudo command, it's outputted when someone does {STRING.ack} - * The modifier is added to all subsequent GetStringWithArgs that accept the modifier. */ - next_substr_case_index = (byte)*str++; - break; - } + case SCC_SET_CASE: { // {SET_CASE} + /* This is a pseudo command, it's outputted when someone does {STRING.ack} + * The modifier is added to all subsequent GetStringWithArgs that accept the modifier. */ + next_substr_case_index = (byte)*str++; + break; + } - case SCC_SWITCH_CASE: { // {Used to implement case switching} - /* <0x9E> - * Each LEN is printed using 2 bytes in big endian order. */ - uint num = (byte)*str++; - while (num) { - if ((byte)str[0] == case_index) { - /* Found the case, adjust str pointer and continue */ - str += 3; - break; + case SCC_SWITCH_CASE: { // {Used to implement case switching} + /* <0x9E> + * Each LEN is printed using 2 bytes in big endian order. */ + uint num = (byte)*str++; + while (num) { + if ((byte)str[0] == case_index) { + /* Found the case, adjust str pointer and continue */ + str += 3; + break; + } + /* Otherwise skip to the next case */ + str += 3 + (str[1] << 8) + str[2]; + num--; } - /* Otherwise skip to the next case */ - str += 3 + (str[1] << 8) + str[2]; - num--; + break; } - break; - } - case SCC_REVISION: // {REV} - builder += _openttd_revision; - break; + case SCC_REVISION: // {REV} + builder += _openttd_revision; + break; - case SCC_RAW_STRING_POINTER: { // {RAW_STRING} - const char *raw_string = args.GetNextParameterString(); - /* raw_string can be(come) nullptr when the parameter is out of range and 0 is returned instead. */ - if (raw_string == nullptr) { - builder += "(invalid RAW_STRING parameter)"; + case SCC_RAW_STRING_POINTER: { // {RAW_STRING} + const char *raw_string = args.GetNextParameterString(); + /* raw_string can be nullptr. */ + if (raw_string == nullptr) { + builder += "(invalid RAW_STRING parameter)"; + break; + } + FormatString(builder, raw_string, args); break; } - FormatString(builder, raw_string, args); - break; - } - case SCC_STRING: {// {STRING} - StringID string_id = args.GetNextParameter(); - if (game_script && GetStringTab(string_id) != TEXT_TAB_GAMESCRIPT_START) break; - /* It's prohibited for the included string to consume any arguments. */ - StringParameters tmp_params(args, game_script ? args.GetDataLeft() : 0); - GetStringWithArgs(builder, string_id, tmp_params, next_substr_case_index, game_script); - next_substr_case_index = 0; - break; - } + case SCC_STRING: {// {STRING} + StringID string_id = args.GetNextParameter(); + if (game_script && GetStringTab(string_id) != TEXT_TAB_GAMESCRIPT_START) break; + /* It's prohibited for the included string to consume any arguments. */ + StringParameters tmp_params(args, game_script ? args.GetDataLeft() : 0); + GetStringWithArgs(builder, string_id, tmp_params, next_substr_case_index, game_script); + next_substr_case_index = 0; + break; + } - case SCC_STRING1: - case SCC_STRING2: - case SCC_STRING3: - case SCC_STRING4: - case SCC_STRING5: - case SCC_STRING6: - case SCC_STRING7: { // {STRING1..7} - /* Strings that consume arguments */ - StringID string_id = args.GetNextParameter(); - if (game_script && GetStringTab(string_id) != TEXT_TAB_GAMESCRIPT_START) break; - uint size = b - SCC_STRING1 + 1; - if (game_script && size > args.GetDataLeft()) { - builder += "(too many parameters)"; - } else { - StringParameters sub_args(args, game_script ? args.GetDataLeft() : size); - GetStringWithArgs(builder, string_id, sub_args, next_substr_case_index, game_script); - args.AdvanceOffset(size); + case SCC_STRING1: + case SCC_STRING2: + case SCC_STRING3: + case SCC_STRING4: + case SCC_STRING5: + case SCC_STRING6: + case SCC_STRING7: { // {STRING1..7} + /* Strings that consume arguments */ + StringID string_id = args.GetNextParameter(); + if (game_script && GetStringTab(string_id) != TEXT_TAB_GAMESCRIPT_START) break; + uint size = b - SCC_STRING1 + 1; + if (game_script && size > args.GetDataLeft()) { + builder += "(too many parameters)"; + } else { + StringParameters sub_args(args, game_script ? args.GetDataLeft() : size); + GetStringWithArgs(builder, string_id, sub_args, next_substr_case_index, game_script); + args.AdvanceOffset(size); + } + next_substr_case_index = 0; + break; } - next_substr_case_index = 0; - break; - } - case SCC_COMMA: // {COMMA} - FormatCommaNumber(builder, args.GetNextParameter()); - break; + case SCC_COMMA: // {COMMA} + FormatCommaNumber(builder, args.GetNextParameter()); + break; - case SCC_DECIMAL: { // {DECIMAL} - int64_t number = args.GetNextParameter(); - int digits = args.GetNextParameter(); - FormatCommaNumber(builder, number, digits); - break; - } + case SCC_DECIMAL: { // {DECIMAL} + int64_t number = args.GetNextParameter(); + int digits = args.GetNextParameter(); + FormatCommaNumber(builder, number, digits); + break; + } - case SCC_NUM: // {NUM} - FormatNoCommaNumber(builder, args.GetNextParameter()); - break; + case SCC_NUM: // {NUM} + FormatNoCommaNumber(builder, args.GetNextParameter()); + break; - case SCC_ZEROFILL_NUM: { // {ZEROFILL_NUM} - int64_t num = args.GetNextParameter(); - FormatZerofillNumber(builder, num, args.GetNextParameter()); - break; - } + case SCC_ZEROFILL_NUM: { // {ZEROFILL_NUM} + int64_t num = args.GetNextParameter(); + FormatZerofillNumber(builder, num, args.GetNextParameter()); + break; + } - case SCC_HEX: // {HEX} - FormatHexNumber(builder, args.GetNextParameter()); - break; - - case SCC_BYTES: // {BYTES} - FormatBytes(builder, args.GetNextParameter()); - break; - - case SCC_CARGO_TINY: { // {CARGO_TINY} - /* Tiny description of cargotypes. Layout: - * param 1: cargo type - * param 2: cargo count */ - CargoID cargo = args.GetNextParameter(); - if (cargo >= CargoSpec::GetArraySize()) break; - - StringID cargo_str = CargoSpec::Get(cargo)->units_volume; - int64_t amount = 0; - switch (cargo_str) { - case STR_TONS: - amount = _units_weight[_settings_game.locale.units_weight].c.ToDisplay(args.GetNextParameter()); - break; + case SCC_HEX: // {HEX} + FormatHexNumber(builder, args.GetNextParameter()); + break; - case STR_LITERS: - amount = _units_volume[_settings_game.locale.units_volume].c.ToDisplay(args.GetNextParameter()); - break; + case SCC_BYTES: // {BYTES} + FormatBytes(builder, args.GetNextParameter()); + break; - default: { - amount = args.GetNextParameter(); - break; + case SCC_CARGO_TINY: { // {CARGO_TINY} + /* Tiny description of cargotypes. Layout: + * param 1: cargo type + * param 2: cargo count */ + CargoID cargo = args.GetNextParameter(); + if (cargo >= CargoSpec::GetArraySize()) break; + + StringID cargo_str = CargoSpec::Get(cargo)->units_volume; + int64_t amount = 0; + switch (cargo_str) { + case STR_TONS: + amount = _units_weight[_settings_game.locale.units_weight].c.ToDisplay(args.GetNextParameter()); + break; + + case STR_LITERS: + amount = _units_volume[_settings_game.locale.units_volume].c.ToDisplay(args.GetNextParameter()); + break; + + default: { + amount = args.GetNextParameter(); + break; + } } - } - FormatCommaNumber(builder, amount); - break; - } + FormatCommaNumber(builder, amount); + break; + } - case SCC_CARGO_SHORT: { // {CARGO_SHORT} - /* Short description of cargotypes. Layout: - * param 1: cargo type - * param 2: cargo count */ - CargoID cargo = args.GetNextParameter(); - if (cargo >= CargoSpec::GetArraySize()) break; - - StringID cargo_str = CargoSpec::Get(cargo)->units_volume; - switch (cargo_str) { - case STR_TONS: { - assert(_settings_game.locale.units_weight < lengthof(_units_weight)); - const auto &x = _units_weight[_settings_game.locale.units_weight]; - auto tmp_params = MakeParameters(x.c.ToDisplay(args.GetNextParameter()), x.decimal_places); - FormatString(builder, GetStringPtr(x.l), tmp_params); - break; - } + case SCC_CARGO_SHORT: { // {CARGO_SHORT} + /* Short description of cargotypes. Layout: + * param 1: cargo type + * param 2: cargo count */ + CargoID cargo = args.GetNextParameter(); + if (cargo >= CargoSpec::GetArraySize()) break; + + StringID cargo_str = CargoSpec::Get(cargo)->units_volume; + switch (cargo_str) { + case STR_TONS: { + assert(_settings_game.locale.units_weight < lengthof(_units_weight)); + const auto &x = _units_weight[_settings_game.locale.units_weight]; + auto tmp_params = MakeParameters(x.c.ToDisplay(args.GetNextParameter()), x.decimal_places); + FormatString(builder, GetStringPtr(x.l), tmp_params); + break; + } - case STR_LITERS: { - assert(_settings_game.locale.units_volume < lengthof(_units_volume)); - const auto &x = _units_volume[_settings_game.locale.units_volume]; - auto tmp_params = MakeParameters(x.c.ToDisplay(args.GetNextParameter()), x.decimal_places); - FormatString(builder, GetStringPtr(x.l), tmp_params); - break; - } + case STR_LITERS: { + assert(_settings_game.locale.units_volume < lengthof(_units_volume)); + const auto &x = _units_volume[_settings_game.locale.units_volume]; + auto tmp_params = MakeParameters(x.c.ToDisplay(args.GetNextParameter()), x.decimal_places); + FormatString(builder, GetStringPtr(x.l), tmp_params); + break; + } - default: { - auto tmp_params = MakeParameters(args.GetNextParameter()); - GetStringWithArgs(builder, cargo_str, tmp_params); - break; + default: { + auto tmp_params = MakeParameters(args.GetNextParameter()); + GetStringWithArgs(builder, cargo_str, tmp_params); + break; + } } + break; } - break; - } - case SCC_CARGO_LONG: { // {CARGO_LONG} - /* First parameter is cargo type, second parameter is cargo count */ - CargoID cargo = args.GetNextParameter(); - if (IsValidCargoID(cargo) && cargo >= CargoSpec::GetArraySize()) break; + case SCC_CARGO_LONG: { // {CARGO_LONG} + /* First parameter is cargo type, second parameter is cargo count */ + CargoID cargo = args.GetNextParameter(); + if (IsValidCargoID(cargo) && cargo >= CargoSpec::GetArraySize()) break; - StringID cargo_str = !IsValidCargoID(cargo) ? STR_QUANTITY_N_A : CargoSpec::Get(cargo)->quantifier; - auto tmp_args = MakeParameters(args.GetNextParameter()); - GetStringWithArgs(builder, cargo_str, tmp_args); - break; - } + StringID cargo_str = !IsValidCargoID(cargo) ? STR_QUANTITY_N_A : CargoSpec::Get(cargo)->quantifier; + auto tmp_args = MakeParameters(args.GetNextParameter()); + GetStringWithArgs(builder, cargo_str, tmp_args); + break; + } - case SCC_CARGO_LIST: { // {CARGO_LIST} - CargoTypes cmask = args.GetNextParameter(); - bool first = true; + case SCC_CARGO_LIST: { // {CARGO_LIST} + CargoTypes cmask = args.GetNextParameter(); + bool first = true; - for (const auto &cs : _sorted_cargo_specs) { - if (!HasBit(cmask, cs->Index())) continue; + for (const auto &cs : _sorted_cargo_specs) { + if (!HasBit(cmask, cs->Index())) continue; - if (first) { - first = false; - } else { - /* Add a comma if this is not the first item */ - builder += ", "; - } + if (first) { + first = false; + } else { + /* Add a comma if this is not the first item */ + builder += ", "; + } - GetStringWithArgs(builder, cs->name, args, next_substr_case_index, game_script); - } + GetStringWithArgs(builder, cs->name, args, next_substr_case_index, game_script); + } - /* If first is still true then no cargo is accepted */ - if (first) GetStringWithArgs(builder, STR_JUST_NOTHING, args, next_substr_case_index, game_script); + /* If first is still true then no cargo is accepted */ + if (first) GetStringWithArgs(builder, STR_JUST_NOTHING, args, next_substr_case_index, game_script); - next_substr_case_index = 0; - break; - } + next_substr_case_index = 0; + break; + } - case SCC_CURRENCY_SHORT: // {CURRENCY_SHORT} - FormatGenericCurrency(builder, _currency, args.GetNextParameter(), true); - break; - - case SCC_CURRENCY_LONG: // {CURRENCY_LONG} - FormatGenericCurrency(builder, _currency, args.GetNextParameter(), false); - break; - - case SCC_DATE_TINY: // {DATE_TINY} - FormatTinyOrISODate(builder, args.GetNextParameter(), STR_FORMAT_DATE_TINY); - break; - - case SCC_DATE_SHORT: // {DATE_SHORT} - FormatMonthAndYear(builder, args.GetNextParameter(), next_substr_case_index); - next_substr_case_index = 0; - break; - - case SCC_DATE_LONG: // {DATE_LONG} - FormatYmdString(builder, args.GetNextParameter(), next_substr_case_index); - next_substr_case_index = 0; - break; - - case SCC_DATE_ISO: // {DATE_ISO} - FormatTinyOrISODate(builder, args.GetNextParameter(), STR_FORMAT_DATE_ISO); - break; - - case SCC_FORCE: { // {FORCE} - assert(_settings_game.locale.units_force < lengthof(_units_force)); - const auto &x = _units_force[_settings_game.locale.units_force]; - auto tmp_params = MakeParameters(x.c.ToDisplay(args.GetNextParameter()), x.decimal_places); - FormatString(builder, GetStringPtr(x.s), tmp_params); - break; - } + case SCC_CURRENCY_SHORT: // {CURRENCY_SHORT} + FormatGenericCurrency(builder, _currency, args.GetNextParameter(), true); + break; - case SCC_HEIGHT: { // {HEIGHT} - assert(_settings_game.locale.units_height < lengthof(_units_height)); - const auto &x = _units_height[_settings_game.locale.units_height]; - auto tmp_params = MakeParameters(x.c.ToDisplay(args.GetNextParameter()), x.decimal_places); - FormatString(builder, GetStringPtr(x.s), tmp_params); - break; - } + case SCC_CURRENCY_LONG: // {CURRENCY_LONG} + FormatGenericCurrency(builder, _currency, args.GetNextParameter(), false); + break; - case SCC_POWER: { // {POWER} - assert(_settings_game.locale.units_power < lengthof(_units_power)); - const auto &x = _units_power[_settings_game.locale.units_power]; - auto tmp_params = MakeParameters(x.c.ToDisplay(args.GetNextParameter()), x.decimal_places); - FormatString(builder, GetStringPtr(x.s), tmp_params); - break; - } + case SCC_DATE_TINY: // {DATE_TINY} + FormatTinyOrISODate(builder, args.GetNextParameter(), STR_FORMAT_DATE_TINY); + break; - case SCC_POWER_TO_WEIGHT: { // {POWER_TO_WEIGHT} - auto setting = _settings_game.locale.units_power * 3u + _settings_game.locale.units_weight; - assert(setting < lengthof(_units_power_to_weight)); - const auto &x = _units_power_to_weight[setting]; - auto tmp_params = MakeParameters(x.c.ToDisplay(args.GetNextParameter()), x.decimal_places); - FormatString(builder, GetStringPtr(x.s), tmp_params); - break; - } + case SCC_DATE_SHORT: // {DATE_SHORT} + FormatMonthAndYear(builder, args.GetNextParameter(), next_substr_case_index); + next_substr_case_index = 0; + break; - case SCC_VELOCITY: { // {VELOCITY} - int64_t arg = args.GetNextParameter(); - // Unpack vehicle type from packed argument to get desired units. - VehicleType vt = static_cast(GB(arg, 56, 8)); - byte units = GetVelocityUnits(vt); - assert(units < lengthof(_units_velocity)); - const auto &x = _units_velocity[units]; - auto tmp_params = MakeParameters(ConvertKmhishSpeedToDisplaySpeed(GB(arg, 0, 56), vt), x.decimal_places); - FormatString(builder, GetStringPtr(x.s), tmp_params); - break; - } + case SCC_DATE_LONG: // {DATE_LONG} + FormatYmdString(builder, args.GetNextParameter(), next_substr_case_index); + next_substr_case_index = 0; + break; - case SCC_VOLUME_SHORT: { // {VOLUME_SHORT} - assert(_settings_game.locale.units_volume < lengthof(_units_volume)); - const auto &x = _units_volume[_settings_game.locale.units_volume]; - auto tmp_params = MakeParameters(x.c.ToDisplay(args.GetNextParameter()), x.decimal_places); - FormatString(builder, GetStringPtr(x.s), tmp_params); - break; - } + case SCC_DATE_ISO: // {DATE_ISO} + FormatTinyOrISODate(builder, args.GetNextParameter(), STR_FORMAT_DATE_ISO); + break; - case SCC_VOLUME_LONG: { // {VOLUME_LONG} - assert(_settings_game.locale.units_volume < lengthof(_units_volume)); - const auto &x = _units_volume[_settings_game.locale.units_volume]; - auto tmp_params = MakeParameters(x.c.ToDisplay(args.GetNextParameter()), x.decimal_places); - FormatString(builder, GetStringPtr(x.l), tmp_params); - break; - } + case SCC_FORCE: { // {FORCE} + assert(_settings_game.locale.units_force < lengthof(_units_force)); + const auto &x = _units_force[_settings_game.locale.units_force]; + auto tmp_params = MakeParameters(x.c.ToDisplay(args.GetNextParameter()), x.decimal_places); + FormatString(builder, GetStringPtr(x.s), tmp_params); + break; + } - case SCC_WEIGHT_SHORT: { // {WEIGHT_SHORT} - assert(_settings_game.locale.units_weight < lengthof(_units_weight)); - const auto &x = _units_weight[_settings_game.locale.units_weight]; - auto tmp_params = MakeParameters(x.c.ToDisplay(args.GetNextParameter()), x.decimal_places); - FormatString(builder, GetStringPtr(x.s), tmp_params); - break; - } + case SCC_HEIGHT: { // {HEIGHT} + assert(_settings_game.locale.units_height < lengthof(_units_height)); + const auto &x = _units_height[_settings_game.locale.units_height]; + auto tmp_params = MakeParameters(x.c.ToDisplay(args.GetNextParameter()), x.decimal_places); + FormatString(builder, GetStringPtr(x.s), tmp_params); + break; + } - case SCC_WEIGHT_LONG: { // {WEIGHT_LONG} - assert(_settings_game.locale.units_weight < lengthof(_units_weight)); - const auto &x = _units_weight[_settings_game.locale.units_weight]; - auto tmp_params = MakeParameters(x.c.ToDisplay(args.GetNextParameter()), x.decimal_places); - FormatString(builder, GetStringPtr(x.l), tmp_params); - break; - } + case SCC_POWER: { // {POWER} + assert(_settings_game.locale.units_power < lengthof(_units_power)); + const auto &x = _units_power[_settings_game.locale.units_power]; + auto tmp_params = MakeParameters(x.c.ToDisplay(args.GetNextParameter()), x.decimal_places); + FormatString(builder, GetStringPtr(x.s), tmp_params); + break; + } - case SCC_COMPANY_NAME: { // {COMPANY} - const Company *c = Company::GetIfValid(args.GetNextParameter()); - if (c == nullptr) break; + case SCC_POWER_TO_WEIGHT: { // {POWER_TO_WEIGHT} + auto setting = _settings_game.locale.units_power * 3u + _settings_game.locale.units_weight; + assert(setting < lengthof(_units_power_to_weight)); + const auto &x = _units_power_to_weight[setting]; + auto tmp_params = MakeParameters(x.c.ToDisplay(args.GetNextParameter()), x.decimal_places); + FormatString(builder, GetStringPtr(x.s), tmp_params); + break; + } - if (!c->name.empty()) { - auto tmp_params = MakeParameters(c->name); - GetStringWithArgs(builder, STR_JUST_RAW_STRING, tmp_params); - } else { - auto tmp_params = MakeParameters(c->name_2); - GetStringWithArgs(builder, c->name_1, tmp_params); + case SCC_VELOCITY: { // {VELOCITY} + int64_t arg = args.GetNextParameter(); + // Unpack vehicle type from packed argument to get desired units. + VehicleType vt = static_cast(GB(arg, 56, 8)); + byte units = GetVelocityUnits(vt); + assert(units < lengthof(_units_velocity)); + const auto &x = _units_velocity[units]; + auto tmp_params = MakeParameters(ConvertKmhishSpeedToDisplaySpeed(GB(arg, 0, 56), vt), x.decimal_places); + FormatString(builder, GetStringPtr(x.s), tmp_params); + break; } - break; - } - case SCC_COMPANY_NUM: { // {COMPANY_NUM} - CompanyID company = args.GetNextParameter(); + case SCC_VOLUME_SHORT: { // {VOLUME_SHORT} + assert(_settings_game.locale.units_volume < lengthof(_units_volume)); + const auto &x = _units_volume[_settings_game.locale.units_volume]; + auto tmp_params = MakeParameters(x.c.ToDisplay(args.GetNextParameter()), x.decimal_places); + FormatString(builder, GetStringPtr(x.s), tmp_params); + break; + } - /* Nothing is added for AI or inactive companies */ - if (Company::IsValidHumanID(company)) { - auto tmp_params = MakeParameters(company + 1); - GetStringWithArgs(builder, STR_FORMAT_COMPANY_NUM, tmp_params); + case SCC_VOLUME_LONG: { // {VOLUME_LONG} + assert(_settings_game.locale.units_volume < lengthof(_units_volume)); + const auto &x = _units_volume[_settings_game.locale.units_volume]; + auto tmp_params = MakeParameters(x.c.ToDisplay(args.GetNextParameter()), x.decimal_places); + FormatString(builder, GetStringPtr(x.l), tmp_params); + break; } - break; - } - case SCC_DEPOT_NAME: { // {DEPOT} - VehicleType vt = args.GetNextParameter(); - if (vt == VEH_AIRCRAFT) { - auto tmp_params = MakeParameters(args.GetNextParameter()); - GetStringWithArgs(builder, STR_FORMAT_DEPOT_NAME_AIRCRAFT, tmp_params); + case SCC_WEIGHT_SHORT: { // {WEIGHT_SHORT} + assert(_settings_game.locale.units_weight < lengthof(_units_weight)); + const auto &x = _units_weight[_settings_game.locale.units_weight]; + auto tmp_params = MakeParameters(x.c.ToDisplay(args.GetNextParameter()), x.decimal_places); + FormatString(builder, GetStringPtr(x.s), tmp_params); break; } - const Depot *d = Depot::Get(args.GetNextParameter()); - if (!d->name.empty()) { - auto tmp_params = MakeParameters(d->name); - GetStringWithArgs(builder, STR_JUST_RAW_STRING, tmp_params); - } else { - auto tmp_params = MakeParameters(d->town->index, d->town_cn + 1); - GetStringWithArgs(builder, STR_FORMAT_DEPOT_NAME_TRAIN + 2 * vt + (d->town_cn == 0 ? 0 : 1), tmp_params); + case SCC_WEIGHT_LONG: { // {WEIGHT_LONG} + assert(_settings_game.locale.units_weight < lengthof(_units_weight)); + const auto &x = _units_weight[_settings_game.locale.units_weight]; + auto tmp_params = MakeParameters(x.c.ToDisplay(args.GetNextParameter()), x.decimal_places); + FormatString(builder, GetStringPtr(x.l), tmp_params); + break; } - break; - } - case SCC_ENGINE_NAME: { // {ENGINE} - int64_t arg = args.GetNextParameter(); - const Engine *e = Engine::GetIfValid(static_cast(arg)); - if (e == nullptr) break; + case SCC_COMPANY_NAME: { // {COMPANY} + const Company *c = Company::GetIfValid(args.GetNextParameter()); + if (c == nullptr) break; - if (!e->name.empty() && e->IsEnabled()) { - auto tmp_params = MakeParameters(e->name); - GetStringWithArgs(builder, STR_JUST_RAW_STRING, tmp_params); + if (!c->name.empty()) { + auto tmp_params = MakeParameters(c->name); + GetStringWithArgs(builder, STR_JUST_RAW_STRING, tmp_params); + } else { + auto tmp_params = MakeParameters(c->name_2); + GetStringWithArgs(builder, c->name_1, tmp_params); + } break; } - if (HasBit(e->info.callback_mask, CBM_VEHICLE_NAME)) { - uint16_t callback = GetVehicleCallback(CBID_VEHICLE_NAME, static_cast(arg >> 32), 0, e->index, nullptr); - /* Not calling ErrorUnknownCallbackResult due to being inside string processing. */ - if (callback != CALLBACK_FAILED && callback < 0x400) { - const GRFFile *grffile = e->GetGRF(); - assert(grffile != nullptr); + case SCC_COMPANY_NUM: { // {COMPANY_NUM} + CompanyID company = args.GetNextParameter(); - StartTextRefStackUsage(grffile, 6); - ArrayStringParameters<6> tmp_params; - GetStringWithArgs(builder, GetGRFStringID(grffile->grfid, 0xD000 + callback), tmp_params); - StopTextRefStackUsage(); + /* Nothing is added for AI or inactive companies */ + if (Company::IsValidHumanID(company)) { + auto tmp_params = MakeParameters(company + 1); + GetStringWithArgs(builder, STR_FORMAT_COMPANY_NUM, tmp_params); + } + break; + } + case SCC_DEPOT_NAME: { // {DEPOT} + VehicleType vt = args.GetNextParameter(); + if (vt == VEH_AIRCRAFT) { + auto tmp_params = MakeParameters(args.GetNextParameter()); + GetStringWithArgs(builder, STR_FORMAT_DEPOT_NAME_AIRCRAFT, tmp_params); break; } + + const Depot *d = Depot::Get(args.GetNextParameter()); + if (!d->name.empty()) { + auto tmp_params = MakeParameters(d->name); + GetStringWithArgs(builder, STR_JUST_RAW_STRING, tmp_params); + } else { + auto tmp_params = MakeParameters(d->town->index, d->town_cn + 1); + GetStringWithArgs(builder, STR_FORMAT_DEPOT_NAME_TRAIN + 2 * vt + (d->town_cn == 0 ? 0 : 1), tmp_params); + } + break; } - auto tmp_params = ArrayStringParameters<0>(); - GetStringWithArgs(builder, e->info.string_id, tmp_params); - break; - } + case SCC_ENGINE_NAME: { // {ENGINE} + int64_t arg = args.GetNextParameter(); + const Engine *e = Engine::GetIfValid(static_cast(arg)); + if (e == nullptr) break; - case SCC_GROUP_NAME: { // {GROUP} - const Group *g = Group::GetIfValid(args.GetNextParameter()); - if (g == nullptr) break; + if (!e->name.empty() && e->IsEnabled()) { + auto tmp_params = MakeParameters(e->name); + GetStringWithArgs(builder, STR_JUST_RAW_STRING, tmp_params); + break; + } - if (!g->name.empty()) { - auto tmp_params = MakeParameters(g->name); - GetStringWithArgs(builder, STR_JUST_RAW_STRING, tmp_params); - } else { - auto tmp_params = MakeParameters(g->index); - GetStringWithArgs(builder, STR_FORMAT_GROUP_NAME, tmp_params); - } - break; - } + if (HasBit(e->info.callback_mask, CBM_VEHICLE_NAME)) { + uint16_t callback = GetVehicleCallback(CBID_VEHICLE_NAME, static_cast(arg >> 32), 0, e->index, nullptr); + /* Not calling ErrorUnknownCallbackResult due to being inside string processing. */ + if (callback != CALLBACK_FAILED && callback < 0x400) { + const GRFFile *grffile = e->GetGRF(); + assert(grffile != nullptr); + + StartTextRefStackUsage(grffile, 6); + ArrayStringParameters<6> tmp_params; + GetStringWithArgs(builder, GetGRFStringID(grffile->grfid, 0xD000 + callback), tmp_params); + StopTextRefStackUsage(); + + break; + } + } - case SCC_INDUSTRY_NAME: { // {INDUSTRY} - const Industry *i = Industry::GetIfValid(args.GetNextParameter()); - if (i == nullptr) break; - - static bool use_cache = true; - if (use_cache) { // Use cached version if first call - AutoRestoreBackup cache_backup(use_cache, false); - builder += i->GetCachedName(); - } else if (_scan_for_gender_data) { - /* Gender is defined by the industry type. - * STR_FORMAT_INDUSTRY_NAME may have the town first, so it would result in the gender of the town name */ auto tmp_params = ArrayStringParameters<0>(); - FormatString(builder, GetStringPtr(GetIndustrySpec(i->type)->name), tmp_params, next_substr_case_index); - } else { - /* First print the town name and the industry type name. */ - auto tmp_params = MakeParameters(i->town->index, GetIndustrySpec(i->type)->name); - FormatString(builder, GetStringPtr(STR_FORMAT_INDUSTRY_NAME), tmp_params, next_substr_case_index); + GetStringWithArgs(builder, e->info.string_id, tmp_params); + break; } - next_substr_case_index = 0; - break; - } - case SCC_PRESIDENT_NAME: { // {PRESIDENT_NAME} - const Company *c = Company::GetIfValid(args.GetNextParameter()); - if (c == nullptr) break; + case SCC_GROUP_NAME: { // {GROUP} + const Group *g = Group::GetIfValid(args.GetNextParameter()); + if (g == nullptr) break; - if (!c->president_name.empty()) { - auto tmp_params = MakeParameters(c->president_name); - GetStringWithArgs(builder, STR_JUST_RAW_STRING, tmp_params); - } else { - auto tmp_params = MakeParameters(c->president_name_2); - GetStringWithArgs(builder, c->president_name_1, tmp_params); + if (!g->name.empty()) { + auto tmp_params = MakeParameters(g->name); + GetStringWithArgs(builder, STR_JUST_RAW_STRING, tmp_params); + } else { + auto tmp_params = MakeParameters(g->index); + GetStringWithArgs(builder, STR_FORMAT_GROUP_NAME, tmp_params); + } + break; } - break; - } - case SCC_STATION_NAME: { // {STATION} - StationID sid = args.GetNextParameter(); - const Station *st = Station::GetIfValid(sid); + case SCC_INDUSTRY_NAME: { // {INDUSTRY} + const Industry *i = Industry::GetIfValid(args.GetNextParameter()); + if (i == nullptr) break; + + static bool use_cache = true; + if (use_cache) { // Use cached version if first call + AutoRestoreBackup cache_backup(use_cache, false); + builder += i->GetCachedName(); + } else if (_scan_for_gender_data) { + /* Gender is defined by the industry type. + * STR_FORMAT_INDUSTRY_NAME may have the town first, so it would result in the gender of the town name */ + auto tmp_params = ArrayStringParameters<0>(); + FormatString(builder, GetStringPtr(GetIndustrySpec(i->type)->name), tmp_params, next_substr_case_index); + } else { + /* First print the town name and the industry type name. */ + auto tmp_params = MakeParameters(i->town->index, GetIndustrySpec(i->type)->name); + FormatString(builder, GetStringPtr(STR_FORMAT_INDUSTRY_NAME), tmp_params, next_substr_case_index); + } + next_substr_case_index = 0; + break; + } - if (st == nullptr) { - /* The station doesn't exist anymore. The only place where we might - * be "drawing" an invalid station is in the case of cargo that is - * in transit. */ - auto tmp_params = ArrayStringParameters<0>(); - GetStringWithArgs(builder, STR_UNKNOWN_STATION, tmp_params); + case SCC_PRESIDENT_NAME: { // {PRESIDENT_NAME} + const Company *c = Company::GetIfValid(args.GetNextParameter()); + if (c == nullptr) break; + + if (!c->president_name.empty()) { + auto tmp_params = MakeParameters(c->president_name); + GetStringWithArgs(builder, STR_JUST_RAW_STRING, tmp_params); + } else { + auto tmp_params = MakeParameters(c->president_name_2); + GetStringWithArgs(builder, c->president_name_1, tmp_params); + } break; } - static bool use_cache = true; - if (use_cache) { // Use cached version if first call - AutoRestoreBackup cache_backup(use_cache, false); - builder += st->GetCachedName(); - } else if (!st->name.empty()) { - auto tmp_params = MakeParameters(st->name); - GetStringWithArgs(builder, STR_JUST_RAW_STRING, tmp_params); - } else { - StringID string_id = st->string_id; - if (st->indtype != IT_INVALID) { - /* Special case where the industry provides the name for the station */ - const IndustrySpec *indsp = GetIndustrySpec(st->indtype); - - /* Industry GRFs can change which might remove the station name and - * thus cause very strange things. Here we check for that before we - * actually set the station name. */ - if (indsp->station_name != STR_NULL && indsp->station_name != STR_UNDEFINED) { - string_id = indsp->station_name; - } + case SCC_STATION_NAME: { // {STATION} + StationID sid = args.GetNextParameter(); + const Station *st = Station::GetIfValid(sid); + + if (st == nullptr) { + /* The station doesn't exist anymore. The only place where we might + * be "drawing" an invalid station is in the case of cargo that is + * in transit. */ + auto tmp_params = ArrayStringParameters<0>(); + GetStringWithArgs(builder, STR_UNKNOWN_STATION, tmp_params); + break; } - auto tmp_params = MakeParameters(STR_TOWN_NAME, st->town->index, st->index); - GetStringWithArgs(builder, string_id, tmp_params); - } - break; - } + static bool use_cache = true; + if (use_cache) { // Use cached version if first call + AutoRestoreBackup cache_backup(use_cache, false); + builder += st->GetCachedName(); + } else if (!st->name.empty()) { + auto tmp_params = MakeParameters(st->name); + GetStringWithArgs(builder, STR_JUST_RAW_STRING, tmp_params); + } else { + StringID string_id = st->string_id; + if (st->indtype != IT_INVALID) { + /* Special case where the industry provides the name for the station */ + const IndustrySpec *indsp = GetIndustrySpec(st->indtype); + + /* Industry GRFs can change which might remove the station name and + * thus cause very strange things. Here we check for that before we + * actually set the station name. */ + if (indsp->station_name != STR_NULL && indsp->station_name != STR_UNDEFINED) { + string_id = indsp->station_name; + } + } - case SCC_TOWN_NAME: { // {TOWN} - const Town *t = Town::GetIfValid(args.GetNextParameter()); - if (t == nullptr) break; - - static bool use_cache = true; - if (use_cache) { // Use cached version if first call - AutoRestoreBackup cache_backup(use_cache, false); - builder += t->GetCachedName(); - } else if (!t->name.empty()) { - auto tmp_params = MakeParameters(t->name); - GetStringWithArgs(builder, STR_JUST_RAW_STRING, tmp_params); - } else { - GetTownName(builder, t); + auto tmp_params = MakeParameters(STR_TOWN_NAME, st->town->index, st->index); + GetStringWithArgs(builder, string_id, tmp_params); + } + break; } - break; - } - case SCC_WAYPOINT_NAME: { // {WAYPOINT} - Waypoint *wp = Waypoint::GetIfValid(args.GetNextParameter()); - if (wp == nullptr) break; - - if (!wp->name.empty()) { - auto tmp_params = MakeParameters(wp->name); - GetStringWithArgs(builder, STR_JUST_RAW_STRING, tmp_params); - } else { - auto tmp_params = MakeParameters(wp->town->index, wp->town_cn + 1); - StringID string_id = ((wp->string_id == STR_SV_STNAME_BUOY) ? STR_FORMAT_BUOY_NAME : STR_FORMAT_WAYPOINT_NAME); - if (wp->town_cn != 0) string_id++; - GetStringWithArgs(builder, string_id, tmp_params); + case SCC_TOWN_NAME: { // {TOWN} + const Town *t = Town::GetIfValid(args.GetNextParameter()); + if (t == nullptr) break; + + static bool use_cache = true; + if (use_cache) { // Use cached version if first call + AutoRestoreBackup cache_backup(use_cache, false); + builder += t->GetCachedName(); + } else if (!t->name.empty()) { + auto tmp_params = MakeParameters(t->name); + GetStringWithArgs(builder, STR_JUST_RAW_STRING, tmp_params); + } else { + GetTownName(builder, t); + } + break; } - break; - } - case SCC_VEHICLE_NAME: { // {VEHICLE} - const Vehicle *v = Vehicle::GetIfValid(args.GetNextParameter()); - if (v == nullptr) break; - - if (!v->name.empty()) { - auto tmp_params = MakeParameters(v->name); - GetStringWithArgs(builder, STR_JUST_RAW_STRING, tmp_params); - } else if (v->group_id != DEFAULT_GROUP) { - /* The vehicle has no name, but is member of a group, so print group name */ - auto tmp_params = MakeParameters(v->group_id, v->unitnumber); - GetStringWithArgs(builder, STR_FORMAT_GROUP_VEHICLE_NAME, tmp_params); - } else { - auto tmp_params = MakeParameters(v->unitnumber); - - StringID string_id; - switch (v->type) { - default: string_id = STR_INVALID_VEHICLE; break; - case VEH_TRAIN: string_id = STR_SV_TRAIN_NAME; break; - case VEH_ROAD: string_id = STR_SV_ROAD_VEHICLE_NAME; break; - case VEH_SHIP: string_id = STR_SV_SHIP_NAME; break; - case VEH_AIRCRAFT: string_id = STR_SV_AIRCRAFT_NAME; break; + case SCC_WAYPOINT_NAME: { // {WAYPOINT} + Waypoint *wp = Waypoint::GetIfValid(args.GetNextParameter()); + if (wp == nullptr) break; + + if (!wp->name.empty()) { + auto tmp_params = MakeParameters(wp->name); + GetStringWithArgs(builder, STR_JUST_RAW_STRING, tmp_params); + } else { + auto tmp_params = MakeParameters(wp->town->index, wp->town_cn + 1); + StringID string_id = ((wp->string_id == STR_SV_STNAME_BUOY) ? STR_FORMAT_BUOY_NAME : STR_FORMAT_WAYPOINT_NAME); + if (wp->town_cn != 0) string_id++; + GetStringWithArgs(builder, string_id, tmp_params); } + break; + } - GetStringWithArgs(builder, string_id, tmp_params); + case SCC_VEHICLE_NAME: { // {VEHICLE} + const Vehicle *v = Vehicle::GetIfValid(args.GetNextParameter()); + if (v == nullptr) break; + + if (!v->name.empty()) { + auto tmp_params = MakeParameters(v->name); + GetStringWithArgs(builder, STR_JUST_RAW_STRING, tmp_params); + } else if (v->group_id != DEFAULT_GROUP) { + /* The vehicle has no name, but is member of a group, so print group name */ + auto tmp_params = MakeParameters(v->group_id, v->unitnumber); + GetStringWithArgs(builder, STR_FORMAT_GROUP_VEHICLE_NAME, tmp_params); + } else { + auto tmp_params = MakeParameters(v->unitnumber); + + StringID string_id; + switch (v->type) { + default: string_id = STR_INVALID_VEHICLE; break; + case VEH_TRAIN: string_id = STR_SV_TRAIN_NAME; break; + case VEH_ROAD: string_id = STR_SV_ROAD_VEHICLE_NAME; break; + case VEH_SHIP: string_id = STR_SV_SHIP_NAME; break; + case VEH_AIRCRAFT: string_id = STR_SV_AIRCRAFT_NAME; break; + } + + GetStringWithArgs(builder, string_id, tmp_params); + } + break; } - break; - } - case SCC_SIGN_NAME: { // {SIGN} - const Sign *si = Sign::GetIfValid(args.GetNextParameter()); - if (si == nullptr) break; + case SCC_SIGN_NAME: { // {SIGN} + const Sign *si = Sign::GetIfValid(args.GetNextParameter()); + if (si == nullptr) break; - if (!si->name.empty()) { - auto tmp_params = MakeParameters(si->name); - GetStringWithArgs(builder, STR_JUST_RAW_STRING, tmp_params); - } else { - auto tmp_params = ArrayStringParameters<0>(); - GetStringWithArgs(builder, STR_DEFAULT_SIGN_NAME, tmp_params); + if (!si->name.empty()) { + auto tmp_params = MakeParameters(si->name); + GetStringWithArgs(builder, STR_JUST_RAW_STRING, tmp_params); + } else { + auto tmp_params = ArrayStringParameters<0>(); + GetStringWithArgs(builder, STR_DEFAULT_SIGN_NAME, tmp_params); + } + break; } - break; - } - case SCC_STATION_FEATURES: { // {STATIONFEATURES} - StationGetSpecialString(builder, args.GetNextParameter()); - break; - } + case SCC_STATION_FEATURES: { // {STATIONFEATURES} + StationGetSpecialString(builder, args.GetNextParameter()); + break; + } - case SCC_COLOUR: { // {COLOUR} - StringControlCode scc = (StringControlCode)(SCC_BLUE + args.GetNextParameter()); - if (IsInsideMM(scc, SCC_BLUE, SCC_COLOUR)) builder.Utf8Encode(scc); - break; - } + case SCC_COLOUR: { // {COLOUR} + StringControlCode scc = (StringControlCode)(SCC_BLUE + args.GetNextParameter()); + if (IsInsideMM(scc, SCC_BLUE, SCC_COLOUR)) builder.Utf8Encode(scc); + break; + } - default: - builder.Utf8Encode(b); - break; + default: + builder.Utf8Encode(b); + break; + } + } catch (std::out_of_range &e) { + Debug(misc, 0, "FormatString: {}", e.what()); + builder += "(invalid parameter)"; } } } diff --git a/src/strings_internal.h b/src/strings_internal.h index b7e521cc2b..6584827e78 100644 --- a/src/strings_internal.h +++ b/src/strings_internal.h @@ -95,7 +95,7 @@ public: T GetNextParameter() { auto ptr = GetNextParameterPointer(); - return static_cast(ptr == nullptr ? 0 : ptr->data); + return static_cast(ptr->data); } /** @@ -107,7 +107,6 @@ public: const char *GetNextParameterString() { auto ptr = GetNextParameterPointer(); - if (ptr == nullptr) return nullptr; return ptr->string != nullptr ? ptr->string->c_str() : ptr->string_view; } From 06050f7bb3f7effe0e73ca20e101ac273a693cf7 Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Thu, 4 Jan 2024 23:10:54 +0000 Subject: [PATCH 11/13] Fix: Pass townnameparts as parameter when testing townname based companyname. (#11685) Length of returned string could vary and pass/fail the length check with a different string than the final selection. --- src/company_cmd.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/company_cmd.cpp b/src/company_cmd.cpp index 5413ba437c..7d14fafbd1 100644 --- a/src/company_cmd.cpp +++ b/src/company_cmd.cpp @@ -374,6 +374,7 @@ verify_name:; if (cc->name_1 == str && cc->name_2 == strp) goto bad_town_name; } + SetDParam(0, strp); name = GetString(str); if (Utf8StringLength(name) >= MAX_LENGTH_COMPANY_NAME_CHARS) goto bad_town_name; From 91ea8e3fa64fb10d539e09179bb0bc5e2b397cb0 Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Fri, 5 Jan 2024 08:32:43 +0000 Subject: [PATCH 12/13] Codechange: Use locals for company/deity mode during script loops. (#11686) --- src/script/api/script_depotlist.cpp | 8 ++++++-- src/script/api/script_enginelist.cpp | 4 +++- src/script/api/script_grouplist.cpp | 3 ++- src/script/api/script_railtypelist.cpp | 4 +++- src/script/api/script_roadtypelist.cpp | 3 ++- src/script/api/script_stationlist.cpp | 4 +++- src/script/api/script_vehiclelist.cpp | 18 +++++++++++++----- 7 files changed, 32 insertions(+), 12 deletions(-) diff --git a/src/script/api/script_depotlist.cpp b/src/script/api/script_depotlist.cpp index 6f3caa2900..eb43139165 100644 --- a/src/script/api/script_depotlist.cpp +++ b/src/script/api/script_depotlist.cpp @@ -27,8 +27,10 @@ ScriptDepotList::ScriptDepotList(ScriptTile::TransportType transport_type) case ScriptTile::TRANSPORT_AIR: { /* Hangars are not seen as real depots by the depot code. */ + bool is_deity = ScriptCompanyMode::IsDeity(); + CompanyID owner = ScriptObject::GetCompany(); for (const Station *st : Station::Iterate()) { - if (st->owner == ScriptObject::GetCompany() || ScriptCompanyMode::IsDeity()) { + if (is_deity || st->owner == owner) { for (uint i = 0; i < st->airport.GetNumHangars(); i++) { this->AddItem(st->airport.GetHangarTile(i).base()); } @@ -39,7 +41,9 @@ ScriptDepotList::ScriptDepotList(ScriptTile::TransportType transport_type) } /* Handle 'standard' depots. */ + bool is_deity = ScriptCompanyMode::IsDeity(); + CompanyID owner = ScriptObject::GetCompany(); for (const Depot *depot : Depot::Iterate()) { - if ((::GetTileOwner(depot->xy) == ScriptObject::GetCompany() || ScriptCompanyMode::IsDeity()) && ::IsTileType(depot->xy, tile_type)) this->AddItem(depot->xy.base()); + if ((is_deity || ::GetTileOwner(depot->xy) == owner) && ::IsTileType(depot->xy, tile_type)) this->AddItem(depot->xy.base()); } } diff --git a/src/script/api/script_enginelist.cpp b/src/script/api/script_enginelist.cpp index 9ba725dfd0..e7c38f840b 100644 --- a/src/script/api/script_enginelist.cpp +++ b/src/script/api/script_enginelist.cpp @@ -16,7 +16,9 @@ ScriptEngineList::ScriptEngineList(ScriptVehicle::VehicleType vehicle_type) { EnforceDeityOrCompanyModeValid_Void(); + bool is_deity = ScriptCompanyMode::IsDeity(); + CompanyID owner = ScriptObject::GetCompany(); for (const Engine *e : Engine::IterateType((::VehicleType)vehicle_type)) { - if (ScriptCompanyMode::IsDeity() || HasBit(e->company_avail, ScriptObject::GetCompany())) this->AddItem(e->index); + if (is_deity || HasBit(e->company_avail, owner)) this->AddItem(e->index); } } diff --git a/src/script/api/script_grouplist.cpp b/src/script/api/script_grouplist.cpp index 3fb9358e8d..7fa93e8099 100644 --- a/src/script/api/script_grouplist.cpp +++ b/src/script/api/script_grouplist.cpp @@ -17,7 +17,8 @@ ScriptGroupList::ScriptGroupList() { EnforceCompanyModeValid_Void(); + CompanyID owner = ScriptObject::GetCompany(); for (const Group *g : Group::Iterate()) { - if (g->owner == ScriptObject::GetCompany()) this->AddItem(g->index); + if (g->owner == owner) this->AddItem(g->index); } } diff --git a/src/script/api/script_railtypelist.cpp b/src/script/api/script_railtypelist.cpp index 7bf55dca4b..3cdc9b83c6 100644 --- a/src/script/api/script_railtypelist.cpp +++ b/src/script/api/script_railtypelist.cpp @@ -17,7 +17,9 @@ ScriptRailTypeList::ScriptRailTypeList() { EnforceDeityOrCompanyModeValid_Void(); + bool is_deity = ScriptCompanyMode::IsDeity(); + CompanyID owner = ScriptObject::GetCompany(); for (RailType rt = RAILTYPE_BEGIN; rt != RAILTYPE_END; rt++) { - if (ScriptCompanyMode::IsDeity() || ::HasRailTypeAvail(ScriptObject::GetCompany(), rt)) this->AddItem(rt); + if (is_deity || ::HasRailTypeAvail(owner, rt)) this->AddItem(rt); } } diff --git a/src/script/api/script_roadtypelist.cpp b/src/script/api/script_roadtypelist.cpp index e1728553be..18b0d6845d 100644 --- a/src/script/api/script_roadtypelist.cpp +++ b/src/script/api/script_roadtypelist.cpp @@ -16,8 +16,9 @@ ScriptRoadTypeList::ScriptRoadTypeList(ScriptRoad::RoadTramTypes rtts) { EnforceDeityOrCompanyModeValid_Void(); + CompanyID owner = ScriptObject::GetCompany(); for (RoadType rt = ROADTYPE_BEGIN; rt != ROADTYPE_END; rt++) { if (!HasBit(rtts, GetRoadTramType(rt))) continue; - if (::HasRoadTypeAvail(ScriptObject::GetCompany(), rt)) this->AddItem(rt); + if (::HasRoadTypeAvail(owner, rt)) this->AddItem(rt); } } diff --git a/src/script/api/script_stationlist.cpp b/src/script/api/script_stationlist.cpp index dd254f19cb..e3bca735ba 100644 --- a/src/script/api/script_stationlist.cpp +++ b/src/script/api/script_stationlist.cpp @@ -19,8 +19,10 @@ ScriptStationList::ScriptStationList(ScriptStation::StationType station_type) { EnforceDeityOrCompanyModeValid_Void(); + bool is_deity = ScriptCompanyMode::IsDeity(); + CompanyID owner = ScriptObject::GetCompany(); for (Station *st : Station::Iterate()) { - if ((st->owner == ScriptObject::GetCompany() || ScriptCompanyMode::IsDeity()) && (st->facilities & station_type) != 0) this->AddItem(st->index); + if ((is_deity || st->owner == owner) && (st->facilities & station_type) != 0) this->AddItem(st->index); } } diff --git a/src/script/api/script_vehiclelist.cpp b/src/script/api/script_vehiclelist.cpp index 870ce6a9b6..5a06e81aef 100644 --- a/src/script/api/script_vehiclelist.cpp +++ b/src/script/api/script_vehiclelist.cpp @@ -51,8 +51,10 @@ ScriptVehicleList::ScriptVehicleList(HSQUIRRELVM vm) } AutoRestoreBackup ops_error_threshold_backup(vm->_ops_till_suspend_error_threshold, new_ops_error_threshold); + bool is_deity = ScriptCompanyMode::IsDeity(); + CompanyID owner = ScriptObject::GetCompany(); for (const Vehicle *v : Vehicle::Iterate()) { - if (v->owner != ScriptObject::GetCompany() && !ScriptCompanyMode::IsDeity()) continue; + if (v->owner != owner && !is_deity) continue; if (!v->IsPrimaryVehicle() && !(v->type == VEH_TRAIN && ::Train::From(v)->IsFreeWagon())) continue; if (nparam < 1) { @@ -107,8 +109,10 @@ ScriptVehicleList_Station::ScriptVehicleList_Station(StationID station_id) EnforceDeityOrCompanyModeValid_Void(); if (!ScriptBaseStation::IsValidBaseStation(station_id)) return; + bool is_deity = ScriptCompanyMode::IsDeity(); + CompanyID owner = ScriptObject::GetCompany(); for (const Vehicle *v : Vehicle::Iterate()) { - if ((v->owner == ScriptObject::GetCompany() || ScriptCompanyMode::IsDeity()) && v->IsPrimaryVehicle()) { + if ((v->owner == owner || is_deity) && v->IsPrimaryVehicle()) { for (const Order *order : v->Orders()) { if ((order->IsType(OT_GOTO_STATION) || order->IsType(OT_GOTO_WAYPOINT)) && order->GetDestination() == station_id) { this->AddItem(v->index); @@ -156,8 +160,10 @@ ScriptVehicleList_Depot::ScriptVehicleList_Depot(TileIndex tile) return; } + bool is_deity = ScriptCompanyMode::IsDeity(); + CompanyID owner = ScriptObject::GetCompany(); for (const Vehicle *v : Vehicle::Iterate()) { - if ((v->owner == ScriptObject::GetCompany() || ScriptCompanyMode::IsDeity()) && v->IsPrimaryVehicle() && v->type == type) { + if ((v->owner == owner || is_deity) && v->IsPrimaryVehicle() && v->type == type) { for (const Order *order : v->Orders()) { if (order->IsType(OT_GOTO_DEPOT) && order->GetDestination() == dest) { this->AddItem(v->index); @@ -182,8 +188,9 @@ ScriptVehicleList_Group::ScriptVehicleList_Group(GroupID group_id) EnforceCompanyModeValid_Void(); if (!ScriptGroup::IsValidGroup((ScriptGroup::GroupID)group_id)) return; + CompanyID owner = ScriptObject::GetCompany(); for (const Vehicle *v : Vehicle::Iterate()) { - if (v->owner == ScriptObject::GetCompany() && v->IsPrimaryVehicle()) { + if (v->owner == owner && v->IsPrimaryVehicle()) { if (v->group_id == group_id) this->AddItem(v->index); } } @@ -194,8 +201,9 @@ ScriptVehicleList_DefaultGroup::ScriptVehicleList_DefaultGroup(ScriptVehicle::Ve EnforceCompanyModeValid_Void(); if (vehicle_type < ScriptVehicle::VT_RAIL || vehicle_type > ScriptVehicle::VT_AIR) return; + CompanyID owner = ScriptObject::GetCompany(); for (const Vehicle *v : Vehicle::Iterate()) { - if (v->owner == ScriptObject::GetCompany() && v->IsPrimaryVehicle()) { + if (v->owner == owner && v->IsPrimaryVehicle()) { if (v->type == (::VehicleType)vehicle_type && v->group_id == ScriptGroup::GROUP_DEFAULT) this->AddItem(v->index); } } From 623df6b94f2d602aa60481c1298893776cc120be Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Fri, 5 Jan 2024 13:13:55 +0000 Subject: [PATCH 13/13] Codechange: Get count of road vehicles by summing company group statistics data in small UFO handler. (#11690) This avoids needing to iterate the complete vehicle pool. Company group statistics are maintained elsewhere already. The vehicle pool is still iterated later to find the nth random road vehicle. --- src/disaster_vehicle.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/disaster_vehicle.cpp b/src/disaster_vehicle.cpp index 6d3ffc9e75..bfc4c58ebd 100644 --- a/src/disaster_vehicle.cpp +++ b/src/disaster_vehicle.cpp @@ -334,8 +334,8 @@ static bool DisasterTick_Ufo(DisasterVehicle *v) v->state = 1; uint n = 0; // Total number of targetable road vehicles. - for (const RoadVehicle *u : RoadVehicle::Iterate()) { - if (u->IsFrontEngine()) n++; + for (const Company *c : Company::Iterate()) { + n += c->group_all[VEH_ROAD].num_vehicle; } if (n == 0) {