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 | 1457 ++++++++++++++++++++-------------------- src/strings_internal.h | 3 +- 2 files changed, 731 insertions(+), 729 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(); + 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; - } - - 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) { - escape = false; - continue; - } - escape = false; - - if (*p == '"') { - instring = !instring; - continue; - } - if (instring) { - continue; - } - - 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; - } - 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 \". - } - } - /* 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 (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; } - 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_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; - } - - /* 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; - } - - 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_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--; - } - 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)"; - 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_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; - } - - 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_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_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 STR_LITERS: - amount = _units_volume[_settings_game.locale.units_volume].c.ToDisplay(args.GetNextParameter()); - break; - - default: { - amount = args.GetNextParameter(); - 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 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; - } - } - 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; - } - - 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; - - 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); - } - - /* 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; - } - - 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_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_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_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_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_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_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_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_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_COMPANY_NAME: { // {COMPANY} - const Company *c = Company::GetIfValid(args.GetNextParameter()); - if (c == nullptr) 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); - } - break; - } - - case SCC_COMPANY_NUM: { // {COMPANY_NUM} - CompanyID company = args.GetNextParameter(); - - /* 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; - } - - case SCC_ENGINE_NAME: { // {ENGINE} - int64_t arg = args.GetNextParameter(); - const Engine *e = Engine::GetIfValid(static_cast(arg)); - if (e == nullptr) break; - - if (!e->name.empty() && e->IsEnabled()) { - auto tmp_params = MakeParameters(e->name); - GetStringWithArgs(builder, STR_JUST_RAW_STRING, 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; - } - } - - auto tmp_params = ArrayStringParameters<0>(); - GetStringWithArgs(builder, e->info.string_id, tmp_params); - break; - } - - case SCC_GROUP_NAME: { // {GROUP} - const Group *g = Group::GetIfValid(args.GetNextParameter()); - if (g == nullptr) 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; - } - - 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; - } - - 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; - } - - 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; - } - - 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; - } - } - - auto tmp_params = MakeParameters(STR_TOWN_NAME, st->town->index, st->index); - GetStringWithArgs(builder, string_id, tmp_params); - } - break; - } - - 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; - } - - 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; - } - - 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; - } - - 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); - } - 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; - } - - default: + if (b < SCC_CONTROL_START || b > SCC_CONTROL_END) { builder.Utf8Encode(b); - break; + 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; + } + + 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; + + if (*p == '"') { + instring = !instring; + continue; + } + if (instring) { + continue; + } + + 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; + } + 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 \". + } + } + /* 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_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]; + } + 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++; + } + 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_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; + } + /* Otherwise skip to the next case */ + str += 3 + (str[1] << 8) + str[2]; + num--; + } + 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 nullptr. */ + if (raw_string == nullptr) { + builder += "(invalid RAW_STRING parameter)"; + 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_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; + } + + 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_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_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 STR_LITERS: + amount = _units_volume[_settings_game.locale.units_volume].c.ToDisplay(args.GetNextParameter()); + break; + + default: { + amount = args.GetNextParameter(); + 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 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; + } + } + 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; + } + + 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; + + 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); + } + + /* 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; + } + + 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_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_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_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_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_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_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_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_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_COMPANY_NAME: { // {COMPANY} + const Company *c = Company::GetIfValid(args.GetNextParameter()); + if (c == nullptr) 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); + } + break; + } + + case SCC_COMPANY_NUM: { // {COMPANY_NUM} + CompanyID company = args.GetNextParameter(); + + /* 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; + } + + case SCC_ENGINE_NAME: { // {ENGINE} + int64_t arg = args.GetNextParameter(); + const Engine *e = Engine::GetIfValid(static_cast(arg)); + if (e == nullptr) break; + + if (!e->name.empty() && e->IsEnabled()) { + auto tmp_params = MakeParameters(e->name); + GetStringWithArgs(builder, STR_JUST_RAW_STRING, 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; + } + } + + auto tmp_params = ArrayStringParameters<0>(); + GetStringWithArgs(builder, e->info.string_id, tmp_params); + break; + } + + case SCC_GROUP_NAME: { // {GROUP} + const Group *g = Group::GetIfValid(args.GetNextParameter()); + if (g == nullptr) 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; + } + + 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; + } + + 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; + } + + 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; + } + + 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; + } + } + + auto tmp_params = MakeParameters(STR_TOWN_NAME, st->town->index, st->index); + GetStringWithArgs(builder, string_id, tmp_params); + } + break; + } + + 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; + } + + 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; + } + + 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; + } + + 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); + } + 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; + } + + 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) {