diff --git a/src/3rdparty/squirrel/include/sqstdstring.h b/src/3rdparty/squirrel/include/sqstdstring.h index 856c33f791..65dae348b3 100644 --- a/src/3rdparty/squirrel/include/sqstdstring.h +++ b/src/3rdparty/squirrel/include/sqstdstring.h @@ -18,8 +18,6 @@ SQBool sqstd_rex_searchrange(SQRex* exp,const SQChar* text_begin,const SQChar* t SQInteger sqstd_rex_getsubexpcount(SQRex* exp); SQBool sqstd_rex_getsubexp(SQRex* exp, SQInteger n, SQRexMatch *subexp); -SQRESULT sqstd_format(HSQUIRRELVM v,SQInteger nformatstringidx,SQInteger *outlen,SQChar **output); - SQRESULT sqstd_register_stringlib(HSQUIRRELVM v); #endif /*_SQSTD_STRING_H_*/ diff --git a/src/3rdparty/squirrel/sqstdlib/sqstdstring.cpp b/src/3rdparty/squirrel/sqstdlib/sqstdstring.cpp index 8639b6456a..b6efa13148 100644 --- a/src/3rdparty/squirrel/sqstdlib/sqstdstring.cpp +++ b/src/3rdparty/squirrel/sqstdlib/sqstdstring.cpp @@ -53,101 +53,6 @@ static SQInteger validate_format(HSQUIRRELVM v, SQChar *fmt, const SQChar *src, return n; } -/* - * Little hack to remove the "format not a string literal, argument types not checked" warning. - * This check has been added to OpenTTD to make sure that nobody passes wrong string literals, - * but three lines in Squirrel have a little problem with those. Therefor we use this hack - * which basically uses vsnprintf instead of sprintf as vsnprintf is not testing for the right - * string literal at compile time. - */ -static void _append_string(SQInteger &i, SQChar *dest, SQInteger allocated, const SQChar *fmt, ...) -{ - va_list va; - va_start(va, fmt); - i += vsnprintf(&dest[i],allocated-i,fmt,va); - va_end(va); -} - - -SQRESULT sqstd_format(HSQUIRRELVM v,SQInteger nformatstringidx,SQInteger *outlen,SQChar **output) -{ - const SQChar *format; - SQChar *dest; - SQChar fmt[MAX_FORMAT_LEN]; - sq_getstring(v,nformatstringidx,&format); - SQInteger allocated = (sq_getsize(v,nformatstringidx)+2)*sizeof(SQChar); - dest = sq_getscratchpad(v,allocated); - SQInteger n = 0,i = 0, nparam = nformatstringidx+1, w = 0; - while(format[n] != '\0') { - if(format[n] != '%') { - assert(i < allocated); - dest[i++] = format[n]; - n++; - } - else if(format[n+1] == '%') { //handles %% - dest[i++] = '%'; - n += 2; - } - else { - n++; - if( nparam > sq_gettop(v) ) - return sq_throwerror(v,"not enough paramters for the given format string"); - n = validate_format(v,fmt,format,n,w); - if(n < 0) return -1; - SQInteger addlen = 0; - SQInteger valtype = 0; - const SQChar *ts; - SQInteger ti; - SQFloat tf; - switch(format[n]) { - case 's': - if(SQ_FAILED(sq_getstring(v,nparam,&ts))) - return sq_throwerror(v,"string expected for the specified format"); - addlen = (sq_getsize(v,nparam)*sizeof(SQChar))+((w+1)*sizeof(SQChar)); - valtype = 's'; - break; - case 'i': case 'd': case 'c':case 'o': case 'u': case 'x': case 'X': - if(SQ_FAILED(sq_getinteger(v,nparam,&ti))) - return sq_throwerror(v,"integer expected for the specified format"); - addlen = (ADDITIONAL_FORMAT_SPACE)+((w+1)*sizeof(SQChar)); - valtype = 'i'; - break; - case 'f': case 'g': case 'G': case 'e': case 'E': - if(SQ_FAILED(sq_getfloat(v,nparam,&tf))) - return sq_throwerror(v,"float expected for the specified format"); - addlen = (ADDITIONAL_FORMAT_SPACE)+((w+1)*sizeof(SQChar)); - valtype = 'f'; - break; - default: - return sq_throwerror(v,"invalid format"); - } - n++; - allocated += addlen + sizeof(SQChar); - dest = sq_getscratchpad(v,allocated); - switch(valtype) { - case 's': _append_string(i,dest,allocated,fmt,ts); break; - case 'i': _append_string(i,dest,allocated,fmt,ti); break; - case 'f': _append_string(i,dest,allocated,fmt,tf); break; - }; - nparam ++; - } - } - *outlen = i; - dest[i] = '\0'; - *output = dest; - return SQ_OK; -} - -static SQInteger _string_format(HSQUIRRELVM v) -{ - SQChar *dest = NULL; - SQInteger length = 0; - if(SQ_FAILED(sqstd_format(v,2,&length,&dest))) - return -1; - sq_pushstring(v,dest,length); - return 1; -} - static void __strip_l(const SQChar *str,const SQChar **start) { const SQChar *t = str; diff --git a/src/autoreplace_gui.cpp b/src/autoreplace_gui.cpp index d4bf242ef7..4cdd21c0a1 100644 --- a/src/autoreplace_gui.cpp +++ b/src/autoreplace_gui.cpp @@ -146,7 +146,7 @@ class ReplaceVehicleWindow : public Window { GUIEngineList list; for (const Engine *e : Engine::IterateType(type)) { - if (!draw_left && !this->show_hidden_engines && e->IsHidden(_local_company)) continue; + if (!draw_left && !this->show_hidden_engines && e->IsVariantHidden(_local_company)) continue; EngineID eid = e->index; switch (type) { case VEH_TRAIN: diff --git a/src/base_media_base.h b/src/base_media_base.h index 9a9d6ff48a..84c12d0858 100644 --- a/src/base_media_base.h +++ b/src/base_media_base.h @@ -31,9 +31,9 @@ struct MD5File { CR_NO_FILE, ///< The file did not exist }; - const char *filename; ///< filename + std::string filename; ///< filename uint8 hash[16]; ///< md5 sum of the file - const char *missing_warning; ///< warning when this file is missing + std::string missing_warning; ///< warning when this file is missing ChecksumResult check_result; ///< cached result of md5 check ChecksumResult CheckMD5(Subdirectory subdir, size_t max_size) const; @@ -73,11 +73,6 @@ struct BaseSet { /** Free everything we allocated */ ~BaseSet() { - for (uint i = 0; i < NUM_FILES; i++) { - free(this->files[i].filename); - free(this->files[i].missing_warning); - } - delete this->next; } @@ -100,7 +95,7 @@ struct BaseSet { return Tnum_files - this->valid_files; } - bool FillSetDetails(IniFile *ini, const char *path, const char *full_filename, bool allow_empty_filename = true); + bool FillSetDetails(IniFile *ini, const std::string &path, const std::string &full_filename, bool allow_empty_filename = true); /** * Get the description for the given ISO code. @@ -147,7 +142,7 @@ struct BaseSet { const char *GetTextfile(TextfileType type) const { for (uint i = 0; i < NUM_FILES; i++) { - const char *textfile = ::GetTextfile(type, BASESET_DIR, this->files[i].filename); + const char *textfile = ::GetTextfile(type, BASESET_DIR, this->files[i].filename.c_str()); if (textfile != nullptr) { return textfile; } @@ -249,7 +244,7 @@ struct GraphicsSet : BaseSet { PaletteType palette; ///< Palette of this graphics set BlitterType blitter; ///< Blitter of this graphics set - bool FillSetDetails(struct IniFile *ini, const char *path, const char *full_filename); + bool FillSetDetails(struct IniFile *ini, const std::string &path, const std::string &full_filename); static MD5File::ChecksumResult CheckMD5(const MD5File *file, Subdirectory subdir); }; @@ -279,8 +274,8 @@ static const uint NUM_SONGS_AVAILABLE = 1 + NUM_SONG_CLASSES * NUM_SONGS_CLASS; static const uint NUM_SONGS_PLAYLIST = 32; /* Functions to read DOS music CAT files, similar to but not quite the same as sound effect CAT files */ -char *GetMusicCatEntryName(const char *filename, size_t entrynum); -byte *GetMusicCatEntryData(const char *filename, size_t entrynum, size_t &entrylen); +char *GetMusicCatEntryName(const std::string &filename, size_t entrynum); +byte *GetMusicCatEntryData(const std::string &filename, size_t entrynum, size_t &entrylen); enum MusicTrackType { MTT_STANDARDMIDI, ///< Standard MIDI file @@ -291,7 +286,7 @@ enum MusicTrackType { struct MusicSongInfo { std::string songname; ///< name of song displayed in UI byte tracknr; ///< track number of song displayed in UI - const char *filename; ///< file on disk containing song (when used in MusicSet class, this pointer is owned by MD5File object for the file) + std::string filename; ///< file on disk containing song (when used in MusicSet class) MusicTrackType filetype; ///< decoder required for song file int cat_index; ///< entry index in CAT file, for filetype==MTT_MPSMIDI bool loop; ///< song should play in a tight loop if possible, never ending @@ -306,7 +301,7 @@ struct MusicSet : BaseSet { /** Number of valid songs in set. */ byte num_available; - bool FillSetDetails(struct IniFile *ini, const char *path, const char *full_filename); + bool FillSetDetails(struct IniFile *ini, const std::string &path, const std::string &full_filename); }; /** All data/functions related with replacing the base music */ diff --git a/src/base_media_func.h b/src/base_media_func.h index 9fec671377..dab2d97952 100644 --- a/src/base_media_func.h +++ b/src/base_media_func.h @@ -25,7 +25,7 @@ extern void CheckExternalFiles(); item = metadata->GetItem(name, false); \ if (item == nullptr || !item->value.has_value() || item->value->empty()) { \ DEBUG(grf, 0, "Base " SET_TYPE "set detail loading: %s field missing.", name); \ - DEBUG(grf, 0, " Is %s readable for the user running OpenTTD?", full_filename); \ + DEBUG(grf, 0, " Is %s readable for the user running OpenTTD?", full_filename.c_str()); \ return false; \ } @@ -38,7 +38,7 @@ extern void CheckExternalFiles(); * @return true if loading was successful. */ template -bool BaseSet::FillSetDetails(IniFile *ini, const char *path, const char *full_filename, bool allow_empty_filename) +bool BaseSet::FillSetDetails(IniFile *ini, const std::string &path, const std::string &full_filename, bool allow_empty_filename) { IniGroup *metadata = ini->GetGroup("metadata"); IniItem *item; @@ -76,25 +76,25 @@ bool BaseSet::FillSetDetails(IniFile *ini, const /* Find the filename first. */ item = files->GetItem(BaseSet::file_names[i], false); if (item == nullptr || (!item->value.has_value() && !allow_empty_filename)) { - DEBUG(grf, 0, "No " SET_TYPE " file for: %s (in %s)", BaseSet::file_names[i], full_filename); + DEBUG(grf, 0, "No " SET_TYPE " file for: %s (in %s)", BaseSet::file_names[i], full_filename.c_str()); return false; } if (!item->value.has_value()) { - file->filename = nullptr; + file->filename.clear(); /* If we list no file, that file must be valid */ this->valid_files++; this->found_files++; continue; } - const char *filename = item->value->c_str(); - file->filename = str_fmt("%s%s", path, filename); + const std::string &filename = item->value.value(); + file->filename = path + filename; /* Then find the MD5 checksum */ item = md5s->GetItem(filename, false); if (item == nullptr || !item->value.has_value()) { - DEBUG(grf, 0, "No MD5 checksum specified for: %s (in %s)", filename, full_filename); + DEBUG(grf, 0, "No MD5 checksum specified for: %s (in %s)", filename.c_str(), full_filename.c_str()); return false; } const char *c = item->value->c_str(); @@ -107,7 +107,7 @@ bool BaseSet::FillSetDetails(IniFile *ini, const } else if ('A' <= *c && *c <= 'F') { j = *c - 'A' + 10; } else { - DEBUG(grf, 0, "Malformed MD5 checksum specified for: %s (in %s)", filename, full_filename); + DEBUG(grf, 0, "Malformed MD5 checksum specified for: %s (in %s)", filename.c_str(), full_filename.c_str()); return false; } if (i % 2 == 0) { @@ -121,10 +121,10 @@ bool BaseSet::FillSetDetails(IniFile *ini, const item = origin->GetItem(filename, false); if (item == nullptr) item = origin->GetItem("default", false); if (item == nullptr || !item->value.has_value()) { - DEBUG(grf, 1, "No origin warning message specified for: %s", filename); - file->missing_warning = stredup(""); + DEBUG(grf, 1, "No origin warning message specified for: %s", filename.c_str()); + file->missing_warning.clear(); } else { - file->missing_warning = stredup(item->value->c_str()); + file->missing_warning = item->value.value(); } file->check_result = T::CheckMD5(file, BASESET_DIR); @@ -138,12 +138,12 @@ bool BaseSet::FillSetDetails(IniFile *ini, const break; case MD5File::CR_MISMATCH: - DEBUG(grf, 1, "MD5 checksum mismatch for: %s (in %s)", filename, full_filename); + DEBUG(grf, 1, "MD5 checksum mismatch for: %s (in %s)", filename.c_str(), full_filename.c_str()); this->found_files++; break; case MD5File::CR_NO_FILE: - DEBUG(grf, 1, "The file %s specified in %s is missing", filename, full_filename); + DEBUG(grf, 1, "The file %s specified in %s is missing", filename.c_str(), full_filename.c_str()); break; } } @@ -169,7 +169,7 @@ bool BaseMedia::AddFile(const std::string &filename, size_t basepath_ path.clear(); } - if (set->FillSetDetails(ini, path.c_str(), filename.c_str())) { + if (set->FillSetDetails(ini, path, filename)) { Tbase_set *duplicate = nullptr; for (Tbase_set *c = BaseMedia::available_sets; c != nullptr; c = c->next) { if (c->name == set->name || c->shortname == set->shortname) { @@ -282,7 +282,7 @@ template const char *TryGetBaseSetFile(const ContentInfo *ci, if (s->GetNumMissing() != 0) continue; if (s->shortname != ci->unique_id) continue; - if (!md5sum) return s->files[0].filename; + if (!md5sum) return s->files[0].filename.c_str(); byte md5[16]; memset(md5, 0, sizeof(md5)); @@ -291,7 +291,7 @@ template const char *TryGetBaseSetFile(const ContentInfo *ci, md5[j] ^= s->files[i].hash[j]; } } - if (memcmp(md5, ci->md5sum, sizeof(md5)) == 0) return s->files[0].filename; + if (memcmp(md5, ci->md5sum, sizeof(md5)) == 0) return s->files[0].filename.c_str(); } return nullptr; } diff --git a/src/build_vehicle_gui.cpp b/src/build_vehicle_gui.cpp index 4015639bb9..6d5681a5fc 100644 --- a/src/build_vehicle_gui.cpp +++ b/src/build_vehicle_gui.cpp @@ -1217,7 +1217,7 @@ void DrawEngineList(VehicleType type, const Rect &r, const GUIEngineList &eng_li if (show_count) { replace_icon = GetSpriteSize(SPR_GROUP_REPLACE_ACTIVE); SetDParamMaxDigits(0, 3, FS_SMALL); - count_width = GetStringBoundingBox(STR_TINY_BLACK_COMA).width; + count_width = GetStringBoundingBox(STR_TINY_BLACK_COMMA).width; } Rect tr = ir.Indent(circle_width + WidgetDimensions::scaled.hsep_normal + sprite_width + WidgetDimensions::scaled.hsep_wide, rtl); // Name position @@ -1256,7 +1256,7 @@ void DrawEngineList(VehicleType type, const Rect &r, const GUIEngineList &eng_li DrawVehicleEngine(r.left, r.right, sprite_x, y + sprite_y_offset, item.engine_id, (show_count && num_engines == 0) ? PALETTE_CRASH : GetEnginePalette(item.engine_id, _local_company), EIT_PURCHASE); if (show_count) { SetDParam(0, num_engines); - DrawString(cr.left, cr.right, y + small_text_y_offset, STR_TINY_BLACK_COMA, TC_FROMSTRING, SA_RIGHT | SA_FORCE); + DrawString(cr.left, cr.right, y + small_text_y_offset, STR_TINY_BLACK_COMMA, TC_FROMSTRING, SA_RIGHT | SA_FORCE); if (EngineHasReplacementForCompany(Company::Get(_local_company), item.engine_id, selected_group)) DrawSprite(SPR_GROUP_REPLACE_ACTIVE, num_engines == 0 ? PALETTE_CRASH : PAL_NONE, rr.left, y + replace_icon_y_offset); } if (has_variants) { @@ -1618,7 +1618,7 @@ struct BuildVehicleWindow : BuildVehicleWindowBase { * and if not, reset selection to INVALID_ENGINE. This could be the case * when engines become obsolete and are removed */ for (const Engine *e : Engine::IterateType(VEH_TRAIN)) { - if (!this->show_hidden_engines && e->IsHidden(_local_company)) continue; + if (!this->show_hidden_engines && e->IsVariantHidden(_local_company)) continue; EngineID eid = e->index; const RailVehicleInfo *rvi = &e->u.rail; @@ -1669,7 +1669,7 @@ struct BuildVehicleWindow : BuildVehicleWindowBase { this->eng_list.clear(); for (const Engine *e : Engine::IterateType(VEH_ROAD)) { - if (!this->show_hidden_engines && e->IsHidden(_local_company)) continue; + if (!this->show_hidden_engines && e->IsVariantHidden(_local_company)) continue; EngineID eid = e->index; if (!IsEngineBuildable(eid, VEH_ROAD, _local_company)) continue; if (this->filter.roadtype != INVALID_ROADTYPE && !HasPowerOnRoad(e->u.road.roadtype, this->filter.roadtype)) continue; @@ -1688,7 +1688,7 @@ struct BuildVehicleWindow : BuildVehicleWindowBase { this->eng_list.clear(); for (const Engine *e : Engine::IterateType(VEH_SHIP)) { - if (!this->show_hidden_engines && e->IsHidden(_local_company)) continue; + if (!this->show_hidden_engines && e->IsVariantHidden(_local_company)) continue; EngineID eid = e->index; if (!IsEngineBuildable(eid, VEH_SHIP, _local_company)) continue; this->eng_list.emplace_back(eid, e->info.variant_id, e->display_flags, 0); @@ -1712,7 +1712,7 @@ struct BuildVehicleWindow : BuildVehicleWindowBase { * and if not, reset selection to INVALID_ENGINE. This could be the case * when planes become obsolete and are removed */ for (const Engine *e : Engine::IterateType(VEH_AIRCRAFT)) { - if (!this->show_hidden_engines && e->IsHidden(_local_company)) continue; + if (!this->show_hidden_engines && e->IsVariantHidden(_local_company)) continue; EngineID eid = e->index; if (!IsEngineBuildable(eid, VEH_AIRCRAFT, _local_company)) continue; /* First VEH_END window_numbers are fake to allow a window open for all different types at once */ @@ -2481,7 +2481,7 @@ struct BuildVehicleWindowTrainAdvanced final : BuildVehicleWindowBase { * and if not, reset selection to INVALID_ENGINE. This could be the case * when engines become obsolete and are removed */ for (const Engine *engine : Engine::IterateType(VEH_TRAIN)) { - if (!state.show_hidden && engine->IsHidden(_local_company)) continue; + if (!state.show_hidden && engine->IsVariantHidden(_local_company)) continue; EngineID eid = engine->index; const RailVehicleInfo *rvi = &engine->u.rail; diff --git a/src/cheat_gui.cpp b/src/cheat_gui.cpp index 7fd6f3189a..f39180d1f1 100644 --- a/src/cheat_gui.cpp +++ b/src/cheat_gui.cpp @@ -98,23 +98,28 @@ extern void EnginesMonthlyLoop(); /** * Handle changing of the current year. - * @param p1 Unused. + * @param p1 The chosen year to change to. * @param p2 +1 (increase) or -1 (decrease). * @return New year. */ static int32 ClickChangeDateCheat(int32 p1, int32 p2) { - YearMonthDay ymd; - ConvertDateToYMD(_date, &ymd); - + /* Don't allow changing to an invalid year, or the current year. */ p1 = Clamp(p1, MIN_YEAR, MAX_YEAR); if (p1 == _cur_year) return _cur_year; + YearMonthDay ymd; + ConvertDateToYMD(_date, &ymd); Date new_date = ConvertYMDToDate(p1, ymd.month, ymd.day); + + /* Shift cached dates. */ LinkGraphSchedule::instance.ShiftDates(new_date - _date); ShiftOrderDates(new_date - _date); ShiftVehicleDates(new_date - _date); + + /* Change the date. */ SetDate(new_date, _date_fract); + EnginesMonthlyLoop(); InvalidateWindowClassesData(WC_BUILD_STATION, 0); InvalidateWindowClassesData(WC_BUS_STATION, 0); diff --git a/src/core/enum_type.hpp b/src/core/enum_type.hpp index cd2358eca6..8687c62428 100644 --- a/src/core/enum_type.hpp +++ b/src/core/enum_type.hpp @@ -28,14 +28,14 @@ /** Operators to allow to work with enum as with type safe bit set in C++ */ -# define DECLARE_ENUM_AS_BIT_SET(mask_t) \ - inline constexpr mask_t operator | (mask_t m1, mask_t m2) {return (mask_t)((std::underlying_type::type)m1 | (std::underlying_type::type)m2);} \ - inline constexpr mask_t operator & (mask_t m1, mask_t m2) {return (mask_t)((std::underlying_type::type)m1 & (std::underlying_type::type)m2);} \ - inline constexpr mask_t operator ^ (mask_t m1, mask_t m2) {return (mask_t)((std::underlying_type::type)m1 ^ (std::underlying_type::type)m2);} \ - inline constexpr mask_t& operator |= (mask_t& m1, mask_t m2) {m1 = m1 | m2; return m1;} \ - inline constexpr mask_t& operator &= (mask_t& m1, mask_t m2) {m1 = m1 & m2; return m1;} \ - inline constexpr mask_t& operator ^= (mask_t& m1, mask_t m2) {m1 = m1 ^ m2; return m1;} \ - inline constexpr mask_t operator ~(mask_t m) {return (mask_t)(~(std::underlying_type::type)m);} +#define DECLARE_ENUM_AS_BIT_SET(enum_type) \ + inline constexpr enum_type operator | (enum_type m1, enum_type m2) {return (enum_type)((std::underlying_type::type)m1 | (std::underlying_type::type)m2);} \ + inline constexpr enum_type operator & (enum_type m1, enum_type m2) {return (enum_type)((std::underlying_type::type)m1 & (std::underlying_type::type)m2);} \ + inline constexpr enum_type operator ^ (enum_type m1, enum_type m2) {return (enum_type)((std::underlying_type::type)m1 ^ (std::underlying_type::type)m2);} \ + inline constexpr enum_type& operator |= (enum_type& m1, enum_type m2) {m1 = m1 | m2; return m1;} \ + inline constexpr enum_type& operator &= (enum_type& m1, enum_type m2) {m1 = m1 & m2; return m1;} \ + inline constexpr enum_type& operator ^= (enum_type& m1, enum_type m2) {m1 = m1 ^ m2; return m1;} \ + inline constexpr enum_type operator ~(enum_type m) {return (enum_type)(~(std::underlying_type::type)m);} /** diff --git a/src/engine.cpp b/src/engine.cpp index 424c6d879a..13422368a3 100644 --- a/src/engine.cpp +++ b/src/engine.cpp @@ -523,6 +523,30 @@ StringID Engine::GetAircraftTypeText() const } } +/** + * Check whether the engine variant chain is hidden in the GUI for the given company. + * @param c Company to check. + * @return \c true iff the engine variant chain is hidden in the GUI for the given company. + */ +bool Engine::IsVariantHidden(CompanyID c) const +{ + /* In case company is spectator. */ + if (c >= MAX_COMPANIES) return false; + + /* Shortcut if this engine is explicitly hidden. */ + if (this->IsHidden(c)) return true; + + /* Check for hidden parent variants. This is a bit convoluted as we must check hidden status of + * the last display variant rather than the actual parent variant. */ + const Engine *re = this; + const Engine *ve = re->GetDisplayVariant(); + while (!(ve->IsHidden(c)) && re->info.variant_id != INVALID_ENGINE && re->info.variant_id != re->index) { + re = Engine::Get(re->info.variant_id); + ve = re->GetDisplayVariant(); + } + return ve->IsHidden(c); +} + /** * Initializes the #EngineOverrideManager with the default engines. */ diff --git a/src/engine_base.h b/src/engine_base.h index 9b9fb3aeb7..75371edf7e 100644 --- a/src/engine_base.h +++ b/src/engine_base.h @@ -153,6 +153,18 @@ struct Engine : EnginePool::PoolItem<&_engine_pool> { return c < MAX_COMPANIES && HasBit(this->company_hidden, c); } + /** + * Get the last display variant for an engine. + * @return Engine's last display variant or engine itself if no last display variant is set. + */ + const Engine *GetDisplayVariant() const + { + if (this->display_last_variant == this->index || this->display_last_variant == INVALID_ENGINE) return this; + return Engine::Get(this->display_last_variant); + } + + bool IsVariantHidden(CompanyID c) const; + /** * Check if the engine is a ground vehicle. * @return True iff the engine is a train or a road vehicle. diff --git a/src/fileio.cpp b/src/fileio.cpp index 188689b211..a244191707 100644 --- a/src/fileio.cpp +++ b/src/fileio.cpp @@ -140,7 +140,7 @@ void FioFCloseFile(FILE *f) * @param filename Filename to look for. * @return String containing the path if the path was found, else an empty string. */ -std::string FioFindFullPath(Subdirectory subdir, const char *filename) +std::string FioFindFullPath(Subdirectory subdir, const std::string &filename) { assert(subdir < NUM_SUBDIRS); diff --git a/src/fileio_func.h b/src/fileio_func.h index 5c02b2aaf5..ffce5b7a3d 100644 --- a/src/fileio_func.h +++ b/src/fileio_func.h @@ -18,7 +18,7 @@ void FioFCloseFile(FILE *f); FILE *FioFOpenFile(const std::string &filename, const char *mode, Subdirectory subdir, size_t *filesize = nullptr, std::string *output_filename = nullptr); bool FioCheckFileExists(const std::string &filename, Subdirectory subdir); -std::string FioFindFullPath(Subdirectory subdir, const char *filename); +std::string FioFindFullPath(Subdirectory subdir, const std::string &filename); std::string FioGetDirectory(Searchpath sp, Subdirectory subdir); std::string FioFindDirectory(Subdirectory subdir); void FioCreateDirectory(const std::string &name); diff --git a/src/gfxinit.cpp b/src/gfxinit.cpp index 9db287279e..e25f93d0ec 100644 --- a/src/gfxinit.cpp +++ b/src/gfxinit.cpp @@ -48,16 +48,16 @@ static const SpriteID * const _landscape_spriteindexes[] = { * @param load_index The offset of the first sprite. * @param needs_palette_remap Whether the colours in the GRF file need a palette remap. */ -static SpriteFile &LoadGrfFile(const char *filename, uint load_index, bool needs_palette_remap) +static SpriteFile &LoadGrfFile(const std::string &filename, uint load_index, bool needs_palette_remap) { uint sprite_id = 0; SpriteFile &file = OpenCachedSpriteFile(filename, BASESET_DIR, needs_palette_remap); - DEBUG(sprite, 2, "Reading grf-file '%s'", filename); + DEBUG(sprite, 2, "Reading grf-file '%s'", filename.c_str()); byte container_ver = file.GetContainerVersion(); - if (container_ver == 0) usererror("Base grf '%s' is corrupt", filename); + if (container_ver == 0) usererror("Base grf '%s' is corrupt", filename.c_str()); ReadGRFSpriteOffsets(file); if (container_ver >= 2) { /* Read compression. */ @@ -84,17 +84,17 @@ static SpriteFile &LoadGrfFile(const char *filename, uint load_index, bool needs * @param needs_palette_remap Whether the colours in the GRF file need a palette remap. * @return The number of loaded sprites. */ -static void LoadGrfFileIndexed(const char *filename, const SpriteID *index_tbl, bool needs_palette_remap) +static void LoadGrfFileIndexed(const std::string &filename, const SpriteID *index_tbl, bool needs_palette_remap) { uint start; uint sprite_id = 0; SpriteFile &file = OpenCachedSpriteFile(filename, BASESET_DIR, needs_palette_remap); - DEBUG(sprite, 2, "Reading indexed grf-file '%s'", filename); + DEBUG(sprite, 2, "Reading indexed grf-file '%s'", filename.c_str()); byte container_ver = file.GetContainerVersion(); - if (container_ver == 0) usererror("Base grf '%s' is corrupt", filename); + if (container_ver == 0) usererror("Base grf '%s' is corrupt", filename.c_str()); ReadGRFSpriteOffsets(file); if (container_ver >= 2) { /* Read compression. */ @@ -142,7 +142,7 @@ void CheckExternalFiles() add_pos += seprintf(add_pos, last, "Trying to load graphics set '%s', but it is incomplete. The game will probably not run correctly until you properly install this set or select another one. See section 4.1 of README.md.\n\nThe following files are corrupted or missing:\n", used_set->name.c_str()); for (uint i = 0; i < GraphicsSet::NUM_FILES; i++) { MD5File::ChecksumResult res = GraphicsSet::CheckMD5(&used_set->files[i], BASESET_DIR); - if (res != MD5File::CR_MATCH) add_pos += seprintf(add_pos, last, "\t%s is %s (%s)\n", used_set->files[i].filename, res == MD5File::CR_MISMATCH ? "corrupt" : "missing", used_set->files[i].missing_warning); + if (res != MD5File::CR_MATCH) add_pos += seprintf(add_pos, last, "\t%s is %s (%s)\n", used_set->files[i].filename.c_str(), res == MD5File::CR_MISMATCH ? "corrupt" : "missing", used_set->files[i].missing_warning.c_str()); } add_pos += seprintf(add_pos, last, "\n"); } @@ -154,7 +154,7 @@ void CheckExternalFiles() static_assert(SoundsSet::NUM_FILES == 1); /* No need to loop each file, as long as there is only a single * sound file. */ - add_pos += seprintf(add_pos, last, "\t%s is %s (%s)\n", sounds_set->files->filename, SoundsSet::CheckMD5(sounds_set->files, BASESET_DIR) == MD5File::CR_MISMATCH ? "corrupt" : "missing", sounds_set->files->missing_warning); + add_pos += seprintf(add_pos, last, "\t%s is %s (%s)\n", sounds_set->files->filename.c_str(), SoundsSet::CheckMD5(sounds_set->files, BASESET_DIR) == MD5File::CR_MISMATCH ? "corrupt" : "missing", sounds_set->files->missing_warning.c_str()); } if (add_pos != error_msg) ShowInfoF("%s", error_msg); @@ -257,7 +257,7 @@ static void LoadSpriteTables() ClrBit(master->flags, GCF_INIT_ONLY); /* Baseset extra graphics */ - GRFConfig *extra = new GRFConfig(used_set->files[GFT_EXTRA].filename); + GRFConfig *extra = new GRFConfig(used_set->files[GFT_EXTRA].filename.c_str()); /* We know the palette of the base set, so if the base NewGRF is not * setting one, use the palette of the base set and not the global @@ -542,7 +542,7 @@ void GfxLoadSprites() DEBUG(sprite, 2, "Completed loading sprite set %d", _settings_game.game_creation.landscape); } -bool GraphicsSet::FillSetDetails(IniFile *ini, const char *path, const char *full_filename) +bool GraphicsSet::FillSetDetails(IniFile *ini, const std::string &path, const std::string &full_filename) { bool ret = this->BaseSet::FillSetDetails(ini, path, full_filename, false); if (ret) { diff --git a/src/industry.h b/src/industry.h index be5ac6b819..1ea4472eef 100644 --- a/src/industry.h +++ b/src/industry.h @@ -21,6 +21,8 @@ typedef Pool IndustryPool; extern IndustryPool _industry_pool; +static const Year PROCESSING_INDUSTRY_ABANDONMENT_YEARS = 5; ///< If a processing industry doesn't produce for this many consecutive years, it may close. + /** * Production level maximum, minimum and default values. * It is not a value been really used in order to change, but rather an indicator diff --git a/src/industry_cmd.cpp b/src/industry_cmd.cpp index 97a1dc545b..15fce1177f 100644 --- a/src/industry_cmd.cpp +++ b/src/industry_cmd.cpp @@ -2937,7 +2937,7 @@ static void ChangeIndustryProduction(Industry *i, bool monthly) if ((i->ctlflags & INDCTL_NO_PRODUCTION_INCREASE) && (mul > 0 || increment > 0)) return; if (!callback_enabled && (indspec->life_type & INDUSTRYLIFE_PROCESSING)) { - if ( (byte)(_cur_year - i->last_prod_year) >= 5 && Chance16(1, original_economy ? 2 : 180)) { + if ((_cur_year - i->last_prod_year) >= PROCESSING_INDUSTRY_ABANDONMENT_YEARS && Chance16(1, original_economy ? 2 : 180)) { closeit = true; } } diff --git a/src/lang/afrikaans.txt b/src/lang/afrikaans.txt index 0d5f48bf65..bf58be2f68 100644 --- a/src/lang/afrikaans.txt +++ b/src/lang/afrikaans.txt @@ -5229,7 +5229,7 @@ STR_JUST_BIG_RAW_STRING :{BIG_FONT}{STRI # Slightly 'raw' stringcodes with colour or size STR_BLACK_COMMA :{BLACK}{COMMA} -STR_TINY_BLACK_COMA :{TINY_FONT}{BLACK}{COMMA} +STR_TINY_BLACK_COMMA :{TINY_FONT}{BLACK}{COMMA} STR_TINY_COMMA :{TINY_FONT}{COMMA} STR_BLUE_COMMA :{BLUE}{COMMA} STR_RED_COMMA :{RED}{COMMA} diff --git a/src/lang/arabic_egypt.txt b/src/lang/arabic_egypt.txt index d632dde908..db0c27e3dd 100644 --- a/src/lang/arabic_egypt.txt +++ b/src/lang/arabic_egypt.txt @@ -4927,7 +4927,7 @@ STR_JUST_BIG_RAW_STRING :{BIG_FONT}{STRI # Slightly 'raw' stringcodes with colour or size STR_BLACK_COMMA :{BLACK}{COMMA} -STR_TINY_BLACK_COMA :{TINY_FONT}{BLACK}{COMMA} +STR_TINY_BLACK_COMMA :{TINY_FONT}{BLACK}{COMMA} STR_TINY_COMMA :{TINY_FONT}{COMMA} STR_BLUE_COMMA :{BLUE}{COMMA} STR_RED_COMMA :{RED}{COMMA} diff --git a/src/lang/basque.txt b/src/lang/basque.txt index 89f49b2b64..9b732bb855 100644 --- a/src/lang/basque.txt +++ b/src/lang/basque.txt @@ -4961,7 +4961,7 @@ STR_JUST_BIG_RAW_STRING :{BIG_FONT}{STRI # Slightly 'raw' stringcodes with colour or size STR_BLACK_COMMA :{BLACK}{COMMA} -STR_TINY_BLACK_COMA :{TINY_FONT}{BLACK}{COMMA} +STR_TINY_BLACK_COMMA :{TINY_FONT}{BLACK}{COMMA} STR_TINY_COMMA :{TINY_FONT}{COMMA} STR_BLUE_COMMA :{BLUE}{COMMA} STR_RED_COMMA :{RED}{COMMA} diff --git a/src/lang/belarusian.txt b/src/lang/belarusian.txt index 0d5f4554ad..5a74a01ace 100644 --- a/src/lang/belarusian.txt +++ b/src/lang/belarusian.txt @@ -5701,7 +5701,7 @@ STR_JUST_BIG_RAW_STRING :{BIG_FONT}{STRI # Slightly 'raw' stringcodes with colour or size STR_BLACK_COMMA :{BLACK}{COMMA} -STR_TINY_BLACK_COMA :{TINY_FONT}{BLACK}{COMMA} +STR_TINY_BLACK_COMMA :{TINY_FONT}{BLACK}{COMMA} STR_TINY_COMMA :{TINY_FONT}{COMMA} STR_BLUE_COMMA :{BLUE}{COMMA} STR_RED_COMMA :{RED}{COMMA} diff --git a/src/lang/brazilian_portuguese.txt b/src/lang/brazilian_portuguese.txt index d01ad1f1e7..05dd6fc6f3 100644 --- a/src/lang/brazilian_portuguese.txt +++ b/src/lang/brazilian_portuguese.txt @@ -5602,7 +5602,7 @@ STR_JUST_BIG_RAW_STRING :{BIG_FONT}{STRI # Slightly 'raw' stringcodes with colour or size STR_BLACK_COMMA :{BLACK}{COMMA} -STR_TINY_BLACK_COMA :{TINY_FONT}{BLACK}{COMMA} +STR_TINY_BLACK_COMMA :{TINY_FONT}{BLACK}{COMMA} STR_TINY_COMMA :{TINY_FONT}{COMMA} STR_BLUE_COMMA :{BLUE}{COMMA} STR_RED_COMMA :{RED}{COMMA} diff --git a/src/lang/bulgarian.txt b/src/lang/bulgarian.txt index fd653c5818..0ec3a15f13 100644 --- a/src/lang/bulgarian.txt +++ b/src/lang/bulgarian.txt @@ -5050,7 +5050,7 @@ STR_JUST_BIG_RAW_STRING :{BIG_FONT}{STRI # Slightly 'raw' stringcodes with colour or size STR_BLACK_COMMA :{BLACK}{COMMA} -STR_TINY_BLACK_COMA :{TINY_FONT}{BLACK}{COMMA} +STR_TINY_BLACK_COMMA :{TINY_FONT}{BLACK}{COMMA} STR_TINY_COMMA :{TINY_FONT}{COMMA} STR_BLUE_COMMA :{BLUE}{COMMA} STR_RED_COMMA :{RED}{COMMA} diff --git a/src/lang/catalan.txt b/src/lang/catalan.txt index eac967f762..f9696bf7cf 100644 --- a/src/lang/catalan.txt +++ b/src/lang/catalan.txt @@ -5602,7 +5602,7 @@ STR_JUST_BIG_RAW_STRING :{BIG_FONT}{STRI # Slightly 'raw' stringcodes with colour or size STR_BLACK_COMMA :{BLACK}{COMMA} -STR_TINY_BLACK_COMA :{TINY_FONT}{BLACK}{COMMA} +STR_TINY_BLACK_COMMA :{TINY_FONT}{BLACK}{COMMA} STR_TINY_COMMA :{TINY_FONT}{COMMA} STR_BLUE_COMMA :{BLUE}{COMMA} STR_RED_COMMA :{RED}{COMMA} diff --git a/src/lang/chuvash.txt b/src/lang/chuvash.txt index 378e0e7cc7..09a719bf4d 100644 --- a/src/lang/chuvash.txt +++ b/src/lang/chuvash.txt @@ -1821,7 +1821,7 @@ STR_JUST_RAW_STRING :{STRING} # Slightly 'raw' stringcodes with colour or size STR_BLACK_COMMA :{BLACK}{COMMA} -STR_TINY_BLACK_COMA :{TINY_FONT}{BLACK}{COMMA} +STR_TINY_BLACK_COMMA :{TINY_FONT}{BLACK}{COMMA} STR_TINY_COMMA :{TINY_FONT}{COMMA} STR_BLUE_COMMA :{BLUE}{COMMA} STR_RED_COMMA :{RED}{COMMA} diff --git a/src/lang/croatian.txt b/src/lang/croatian.txt index 0f181c624f..9bc3f38d08 100644 --- a/src/lang/croatian.txt +++ b/src/lang/croatian.txt @@ -5455,7 +5455,7 @@ STR_JUST_BIG_RAW_STRING :{BIG_FONT}{STRI # Slightly 'raw' stringcodes with colour or size STR_BLACK_COMMA :{BLACK}{COMMA} -STR_TINY_BLACK_COMA :{TINY_FONT}{BLACK}{COMMA} +STR_TINY_BLACK_COMMA :{TINY_FONT}{BLACK}{COMMA} STR_TINY_COMMA :{TINY_FONT}{COMMA} STR_BLUE_COMMA :{BLUE}{COMMA} STR_RED_COMMA :{RED}{COMMA} diff --git a/src/lang/czech.txt b/src/lang/czech.txt index 64f1342c0b..17509f4bd8 100644 --- a/src/lang/czech.txt +++ b/src/lang/czech.txt @@ -5815,7 +5815,7 @@ STR_JUST_BIG_RAW_STRING :{BIG_FONT}{STRI # Slightly 'raw' stringcodes with colour or size STR_BLACK_COMMA :{BLACK}{COMMA} -STR_TINY_BLACK_COMA :{TINY_FONT}{BLACK}{COMMA} +STR_TINY_BLACK_COMMA :{TINY_FONT}{BLACK}{COMMA} STR_TINY_COMMA :{TINY_FONT}{COMMA} STR_BLUE_COMMA :{BLUE}{COMMA} STR_RED_COMMA :{RED}{COMMA} diff --git a/src/lang/danish.txt b/src/lang/danish.txt index 19f447f4fc..db0b5e0866 100644 --- a/src/lang/danish.txt +++ b/src/lang/danish.txt @@ -5601,7 +5601,7 @@ STR_JUST_BIG_RAW_STRING :{BIG_FONT}{STRI # Slightly 'raw' stringcodes with colour or size STR_BLACK_COMMA :{BLACK}{COMMA} -STR_TINY_BLACK_COMA :{TINY_FONT}{BLACK}{COMMA} +STR_TINY_BLACK_COMMA :{TINY_FONT}{BLACK}{COMMA} STR_TINY_COMMA :{TINY_FONT}{COMMA} STR_BLUE_COMMA :{BLUE}{COMMA} STR_RED_COMMA :{RED}{COMMA} diff --git a/src/lang/dutch.txt b/src/lang/dutch.txt index fb7cbc72de..75e041b55c 100644 --- a/src/lang/dutch.txt +++ b/src/lang/dutch.txt @@ -5606,7 +5606,7 @@ STR_JUST_BIG_RAW_STRING :{BIG_FONT}{STRI # Slightly 'raw' stringcodes with colour or size STR_BLACK_COMMA :{BLACK}{COMMA} -STR_TINY_BLACK_COMA :{TINY_FONT}{BLACK}{COMMA} +STR_TINY_BLACK_COMMA :{TINY_FONT}{BLACK}{COMMA} STR_TINY_COMMA :{TINY_FONT}{COMMA} STR_BLUE_COMMA :{BLUE}{COMMA} STR_RED_COMMA :{RED}{COMMA} diff --git a/src/lang/english.txt b/src/lang/english.txt index b12b339f9a..ec9d72dc5d 100644 --- a/src/lang/english.txt +++ b/src/lang/english.txt @@ -5607,7 +5607,7 @@ STR_JUST_BIG_RAW_STRING :{BIG_FONT}{RAW_ # Slightly 'raw' stringcodes with colour or size STR_BLACK_COMMA :{BLACK}{COMMA} -STR_TINY_BLACK_COMA :{TINY_FONT}{BLACK}{COMMA} +STR_TINY_BLACK_COMMA :{TINY_FONT}{BLACK}{COMMA} STR_TINY_COMMA :{TINY_FONT}{COMMA} STR_BLUE_COMMA :{BLUE}{COMMA} STR_RED_COMMA :{RED}{COMMA} diff --git a/src/lang/english_AU.txt b/src/lang/english_AU.txt index dcf69b67c6..cd7312addb 100644 --- a/src/lang/english_AU.txt +++ b/src/lang/english_AU.txt @@ -5110,6 +5110,7 @@ STR_ERROR_NO_BUOY :{WHITE}There is STR_ERROR_CAN_T_TIMETABLE_VEHICLE :{WHITE}Can't timetable vehicle... STR_ERROR_TIMETABLE_ONLY_WAIT_AT_STATIONS :{WHITE}Vehicles can only wait at stations STR_ERROR_TIMETABLE_NOT_STOPPING_HERE :{WHITE}This vehicle is not stopping at this station +STR_ERROR_TIMETABLE_INCOMPLETE :{WHITE}... timetable is incomplete # Sign related errors STR_ERROR_TOO_MANY_SIGNS :{WHITE}... too many signs @@ -5606,7 +5607,7 @@ STR_JUST_BIG_RAW_STRING :{BIG_FONT}{STRI # Slightly 'raw' stringcodes with colour or size STR_BLACK_COMMA :{BLACK}{COMMA} -STR_TINY_BLACK_COMA :{TINY_FONT}{BLACK}{COMMA} +STR_TINY_BLACK_COMMA :{TINY_FONT}{BLACK}{COMMA} STR_TINY_COMMA :{TINY_FONT}{COMMA} STR_BLUE_COMMA :{BLUE}{COMMA} STR_RED_COMMA :{RED}{COMMA} diff --git a/src/lang/english_US.txt b/src/lang/english_US.txt index 355043283c..155810f55a 100644 --- a/src/lang/english_US.txt +++ b/src/lang/english_US.txt @@ -5110,6 +5110,7 @@ STR_ERROR_NO_BUOY :{WHITE}There is STR_ERROR_CAN_T_TIMETABLE_VEHICLE :{WHITE}Can't timetable vehicle... STR_ERROR_TIMETABLE_ONLY_WAIT_AT_STATIONS :{WHITE}Vehicles can only wait at stations STR_ERROR_TIMETABLE_NOT_STOPPING_HERE :{WHITE}This vehicle is not stopping at this station +STR_ERROR_TIMETABLE_INCOMPLETE :{WHITE}... timetable is incomplete # Sign related errors STR_ERROR_TOO_MANY_SIGNS :{WHITE}... too many signs @@ -5606,7 +5607,7 @@ STR_JUST_BIG_RAW_STRING :{BIG_FONT}{STRI # Slightly 'raw' stringcodes with colour or size STR_BLACK_COMMA :{BLACK}{COMMA} -STR_TINY_BLACK_COMA :{TINY_FONT}{BLACK}{COMMA} +STR_TINY_BLACK_COMMA :{TINY_FONT}{BLACK}{COMMA} STR_TINY_COMMA :{TINY_FONT}{COMMA} STR_BLUE_COMMA :{BLUE}{COMMA} STR_RED_COMMA :{RED}{COMMA} diff --git a/src/lang/esperanto.txt b/src/lang/esperanto.txt index 439231b78c..bafdcb85c7 100644 --- a/src/lang/esperanto.txt +++ b/src/lang/esperanto.txt @@ -4461,7 +4461,7 @@ STR_JUST_BIG_RAW_STRING :{BIG_FONT}{STRI # Slightly 'raw' stringcodes with colour or size STR_BLACK_COMMA :{BLACK}{COMMA} -STR_TINY_BLACK_COMA :{TINY_FONT}{BLACK}{COMMA} +STR_TINY_BLACK_COMMA :{TINY_FONT}{BLACK}{COMMA} STR_TINY_COMMA :{TINY_FONT}{COMMA} STR_BLUE_COMMA :{BLUE}{COMMA} STR_RED_COMMA :{RED}{COMMA} diff --git a/src/lang/estonian.txt b/src/lang/estonian.txt index 2ae60e435c..7ee4b4fbaf 100644 --- a/src/lang/estonian.txt +++ b/src/lang/estonian.txt @@ -5639,7 +5639,7 @@ STR_JUST_BIG_RAW_STRING :{BIG_FONT}{STRI # Slightly 'raw' stringcodes with colour or size STR_BLACK_COMMA :{BLACK}{COMMA} -STR_TINY_BLACK_COMA :{TINY_FONT}{BLACK}{COMMA} +STR_TINY_BLACK_COMMA :{TINY_FONT}{BLACK}{COMMA} STR_TINY_COMMA :{TINY_FONT}{COMMA} STR_BLUE_COMMA :{BLUE}{COMMA} STR_RED_COMMA :{RED}{COMMA} diff --git a/src/lang/faroese.txt b/src/lang/faroese.txt index fc2f86ae28..093bb895a9 100644 --- a/src/lang/faroese.txt +++ b/src/lang/faroese.txt @@ -4603,7 +4603,7 @@ STR_JUST_RAW_STRING :{STRING} # Slightly 'raw' stringcodes with colour or size STR_BLACK_COMMA :{BLACK}{COMMA} -STR_TINY_BLACK_COMA :{TINY_FONT}{BLACK}{COMMA} +STR_TINY_BLACK_COMMA :{TINY_FONT}{BLACK}{COMMA} STR_TINY_COMMA :{TINY_FONT}{COMMA} STR_BLUE_COMMA :{BLUE}{COMMA} STR_RED_COMMA :{RED}{COMMA} diff --git a/src/lang/finnish.txt b/src/lang/finnish.txt index f90c989494..bcdf3c2df4 100644 --- a/src/lang/finnish.txt +++ b/src/lang/finnish.txt @@ -1712,7 +1712,7 @@ STR_CONFIG_SETTING_SCRIPT_MAX_MEMORY_HELPTEXT :Kuinka paljon m STR_CONFIG_SETTING_SCRIPT_MAX_MEMORY_VALUE :{COMMA} MiB STR_CONFIG_SETTING_SERVINT_ISPERCENT :Huoltovälit ovat prosentteina: {STRING} -STR_CONFIG_SETTING_SERVINT_ISPERCENT_HELPTEXT :Määritä, aiheuttaako edellisestä huollosta kulunut aika vai luotettavuuden laskeminen kulkuneuvon huoltamisen +STR_CONFIG_SETTING_SERVINT_ISPERCENT_HELPTEXT :Kun tämä on valittuna, kulkuneuvot yrittävät mennä huoltoon niiden luotettavuuden laskettua annetun prosenttiosuuden verran enimmäisluotettavuudesta.{}{}Jos esimerkiksi kulkuneuvon enimmäisluotettavuus on 90 % ja huoltoväli 20 %, kulkuneuvo pyrkii huoltoon luotettavuuden laskettua 72 %:iin. STR_CONFIG_SETTING_SERVINT_TRAINS :Junien oletushuoltoväli: {STRING} STR_CONFIG_SETTING_SERVINT_TRAINS_HELPTEXT :Määritä oletushuoltoväli uusille junille, mikäli kulkuneuvolle ei ole määritelty erillistä huoltoväliä @@ -5110,6 +5110,7 @@ STR_ERROR_NO_BUOY :{WHITE}Poijua e STR_ERROR_CAN_T_TIMETABLE_VEHICLE :{WHITE}Ei voi asettaa aikataulua. STR_ERROR_TIMETABLE_ONLY_WAIT_AT_STATIONS :{WHITE}Kulkuneuvo voi odottaa vain asemalla STR_ERROR_TIMETABLE_NOT_STOPPING_HERE :{WHITE}Tämä kulkuneuvo ei pysähdy tällä asemalla +STR_ERROR_TIMETABLE_INCOMPLETE :{WHITE}… aikataulu on puutteellinen # Sign related errors STR_ERROR_TOO_MANY_SIGNS :{WHITE}... liian monta kylttiä. @@ -5606,7 +5607,7 @@ STR_JUST_BIG_RAW_STRING :{BIG_FONT}{STRI # Slightly 'raw' stringcodes with colour or size STR_BLACK_COMMA :{BLACK}{COMMA} -STR_TINY_BLACK_COMA :{TINY_FONT}{BLACK}{COMMA} +STR_TINY_BLACK_COMMA :{TINY_FONT}{BLACK}{COMMA} STR_TINY_COMMA :{TINY_FONT}{COMMA} STR_BLUE_COMMA :{BLUE}{COMMA} STR_RED_COMMA :{RED}{COMMA} diff --git a/src/lang/french.txt b/src/lang/french.txt index 3d2fc3e413..c82717ff41 100644 --- a/src/lang/french.txt +++ b/src/lang/french.txt @@ -5607,7 +5607,7 @@ STR_JUST_BIG_RAW_STRING :{BIG_FONT}{STRI # Slightly 'raw' stringcodes with colour or size STR_BLACK_COMMA :{BLACK}{COMMA} -STR_TINY_BLACK_COMA :{TINY_FONT}{BLACK}{COMMA} +STR_TINY_BLACK_COMMA :{TINY_FONT}{BLACK}{COMMA} STR_TINY_COMMA :{TINY_FONT}{COMMA} STR_BLUE_COMMA :{BLUE}{COMMA} STR_RED_COMMA :{RED}{COMMA} diff --git a/src/lang/frisian.txt b/src/lang/frisian.txt index d84d8cb866..b45ead94bb 100644 --- a/src/lang/frisian.txt +++ b/src/lang/frisian.txt @@ -4798,7 +4798,7 @@ STR_JUST_BIG_RAW_STRING :{BIG_FONT}{STRI # Slightly 'raw' stringcodes with colour or size STR_BLACK_COMMA :{BLACK}{COMMA} -STR_TINY_BLACK_COMA :{TINY_FONT}{BLACK}{COMMA} +STR_TINY_BLACK_COMMA :{TINY_FONT}{BLACK}{COMMA} STR_TINY_COMMA :{TINY_FONT}{COMMA} STR_BLUE_COMMA :{BLUE}{COMMA} STR_RED_COMMA :{RED}{COMMA} diff --git a/src/lang/gaelic.txt b/src/lang/gaelic.txt index 8da18cc02e..c55c2100d1 100644 --- a/src/lang/gaelic.txt +++ b/src/lang/gaelic.txt @@ -5520,7 +5520,7 @@ STR_JUST_BIG_RAW_STRING :{BIG_FONT}{STRI # Slightly 'raw' stringcodes with colour or size STR_BLACK_COMMA :{BLACK}{COMMA} -STR_TINY_BLACK_COMA :{TINY_FONT}{BLACK}{COMMA} +STR_TINY_BLACK_COMMA :{TINY_FONT}{BLACK}{COMMA} STR_TINY_COMMA :{TINY_FONT}{COMMA} STR_BLUE_COMMA :{BLUE}{COMMA} STR_RED_COMMA :{RED}{COMMA} diff --git a/src/lang/galician.txt b/src/lang/galician.txt index 3381f4f61e..6d16900508 100644 --- a/src/lang/galician.txt +++ b/src/lang/galician.txt @@ -196,6 +196,7 @@ STR_UNITS_VELOCITY_IMPERIAL :{COMMA} mph STR_UNITS_VELOCITY_METRIC :{COMMA} km/h STR_UNITS_VELOCITY_SI :{COMMA} m/s STR_UNITS_VELOCITY_GAMEUNITS :{DECIMAL}{NBSP}cadros/día +STR_UNITS_VELOCITY_KNOTS :{COMMA}{NBSP}nudos STR_UNITS_POWER_IMPERIAL :{COMMA}cv STR_UNITS_POWER_METRIC :{COMMA}cv @@ -344,9 +345,9 @@ STR_GOTO_ORDER_VIEW_TOOLTIP :{BLACK}Abre a v ###length 31 STR_TOOLBAR_TOOLTIP_PAUSE_GAME :{BLACK}Pausar partida STR_TOOLBAR_TOOLTIP_FORWARD :{BLACK}Avance rápido da partida -STR_TOOLBAR_TOOLTIP_OPTIONS :{BLACK}Opcións -STR_TOOLBAR_TOOLTIP_SAVE_GAME_ABANDON_GAME :{BLACK}Gravar partida, abandonar partida, saír -STR_TOOLBAR_TOOLTIP_DISPLAY_MAP :{BLACK}Amosa-lo mapa, ventá extra ou lista de rótulos +STR_TOOLBAR_TOOLTIP_OPTIONS :{BLACK}Opcións e axustes +STR_TOOLBAR_TOOLTIP_SAVE_GAME_ABANDON_GAME :{BLACK}Gravar, cargar ou abandonar partida, saír do programa +STR_TOOLBAR_TOOLTIP_DISPLAY_MAP :{BLACK}Amosa-lo mapa, ventá extra, fluxo de carga ou lista de rótulos STR_TOOLBAR_TOOLTIP_DISPLAY_TOWN_DIRECTORY :{BLACK}Amosa-lo directorio de cidades STR_TOOLBAR_TOOLTIP_DISPLAY_SUBSIDIES :{BLACK}Amosa-las subvencións STR_TOOLBAR_TOOLTIP_DISPLAY_LIST_OF_COMPANY_STATIONS :{BLACK}Amosa-la lista das estacións da compañía @@ -354,9 +355,9 @@ STR_TOOLBAR_TOOLTIP_DISPLAY_COMPANY_FINANCES :{BLACK}Amosa-la STR_TOOLBAR_TOOLTIP_DISPLAY_COMPANY_GENERAL :{BLACK}Amosa-la información xeral da compañía STR_TOOLBAR_TOOLTIP_DISPLAY_STORY_BOOK :{BLACK}Mostrar historial STR_TOOLBAR_TOOLTIP_DISPLAY_GOALS_LIST :{BLACK} Mostrar lista de obxectivos -STR_TOOLBAR_TOOLTIP_DISPLAY_GRAPHS :{BLACK}Amosa-las gráficas +STR_TOOLBAR_TOOLTIP_DISPLAY_GRAPHS :{BLACK}Mostrar gráficos de compañías e taxas de pago de carga. STR_TOOLBAR_TOOLTIP_DISPLAY_COMPANY_LEAGUE :{BLACK}Amosa-lo cadro da liga de compañías -STR_TOOLBAR_TOOLTIP_FUND_CONSTRUCTION_OF_NEW :{BLACK}Financia-la construción dunha nova industria ou listar tódalas industrias +STR_TOOLBAR_TOOLTIP_FUND_CONSTRUCTION_OF_NEW :{BLACK}Examinar as industrias ou financiar a construción dunha nova industria. STR_TOOLBAR_TOOLTIP_DISPLAY_LIST_OF_COMPANY_TRAINS :{BLACK}Amosa-la lista dos trens da compañía. Ctrl+Click alterna entre lista de grupos/vehículos STR_TOOLBAR_TOOLTIP_DISPLAY_LIST_OF_COMPANY_ROAD_VEHICLES :{BLACK}Amosa-la lista dos vehículos de estrada da compañía. Ctrl+Click alterna entre lista de grupos/vehículos STR_TOOLBAR_TOOLTIP_DISPLAY_LIST_OF_COMPANY_SHIPS :{BLACK}Amosar a lista dos barcos da compañía. Ctrl+Click alterna entre lista de grupos/vehículos @@ -370,8 +371,8 @@ STR_TOOLBAR_TOOLTIP_BUILD_SHIP_DOCKS :{BLACK}Constru STR_TOOLBAR_TOOLTIP_BUILD_AIRPORTS :{BLACK}Construír aeroportos STR_TOOLBAR_TOOLTIP_LANDSCAPING :{BLACK}Abri-la ferramenta de terreo para subir/baixar terreo, plantar árbores, etc. STR_TOOLBAR_TOOLTIP_SHOW_SOUND_MUSIC_WINDOW :{BLACK}Amosa-la ventá de son/música -STR_TOOLBAR_TOOLTIP_SHOW_LAST_MESSAGE_NEWS :{BLACK}Amosa-la última mensaxe/nova, amosa-las opcións das mensaxes -STR_TOOLBAR_TOOLTIP_LAND_BLOCK_INFORMATION :{BLACK}Información dunha área de terreo, consola, depuración de scripts, capturas de pantalla, acerca de OpenTTD +STR_TOOLBAR_TOOLTIP_SHOW_LAST_MESSAGE_NEWS :{BLACK}Amosa-la última mensaxe/nova, histórico de mensaxes ou borra todas as mensaxes +STR_TOOLBAR_TOOLTIP_LAND_BLOCK_INFORMATION :{BLACK}Información sobre a área de terra, capturas de pantalla, sobre OpenTTD e ferramentas de desenvolvedor. STR_TOOLBAR_TOOLTIP_SWITCH_TOOLBAR :{BLACK}Intercambiar barras de ferramentas # Extra tooltips for the scenario editor toolbar @@ -1712,7 +1713,7 @@ STR_CONFIG_SETTING_SCRIPT_MAX_MEMORY_HELPTEXT :Canta memoria p STR_CONFIG_SETTING_SCRIPT_MAX_MEMORY_VALUE :{COMMA} MiB STR_CONFIG_SETTING_SERVINT_ISPERCENT :Intervalos de servizo en porcentaxes: {STRING} -STR_CONFIG_SETTING_SERVINT_ISPERCENT_HELPTEXT :Permite escoller se o mantemento de vehículos comezará debido ao tempo transcurrido dende o último mantemento ou por unha redución da fiabilidade cando se sobrepase unha porcentaxe determinado +STR_CONFIG_SETTING_SERVINT_ISPERCENT_HELPTEXT :Cando está habilitado, os vehículos intentan ser reparados cando a súa fiabilidade baixa unha porcentaxe dada da fiabilidade máxima.{}{}Por exemplo, se a fiabilidade máxima dun vehículo é do 90% e o intervalo de mantemento é do 20%, o vehículo tentará ser reparado cando alcance unha fiabilidade do 72%. STR_CONFIG_SETTING_SERVINT_TRAINS :Intervalo de mantemento por defecto para trens: {STRING} STR_CONFIG_SETTING_SERVINT_TRAINS_HELPTEXT :Fixa o intervalo de mantemento por defecto para trens novos, o cal se empregará no caso de que non se defina explicitamente un novo intervalo de mantemento para o vehículo @@ -1809,7 +1810,9 @@ STR_CONFIG_SETTING_ALLOW_SHARES_HELPTEXT :Cando se activa STR_CONFIG_SETTING_MIN_YEARS_FOR_SHARES :Idade mínima da compañía para compraventa de accións: {STRING} STR_CONFIG_SETTING_MIN_YEARS_FOR_SHARES_HELPTEXT :Establece a idade mínima dunha compañía para que outros poidan comprar e vender accións dela. +STR_CONFIG_SETTING_MIN_YEARS_FOR_SHARES_VALUE :{COMMA} ano{P "" s} ###setting-zero-is-special +STR_CONFIG_SETTING_MIN_YEARS_FOR_SHARES_NO_MIN :Sen mínimo STR_CONFIG_SETTING_FEEDER_PAYMENT_SHARE :Porcentaxe do beneficio parcial a pagar en sistemas transitivos: {STRING} STR_CONFIG_SETTING_FEEDER_PAYMENT_SHARE_HELPTEXT :Porcentaxe dos beneficios asignados ás partes intermedias da ruta en sistemas transitivos, dando un maior control sobre os ingresos @@ -1924,6 +1927,10 @@ STR_CONFIG_SETTING_LARGER_TOWNS_DISABLED :Ningunha STR_CONFIG_SETTING_CITY_SIZE_MULTIPLIER :Multiplicador inicial do tamaño da cidade: {STRING} STR_CONFIG_SETTING_CITY_SIZE_MULTIPLIER_HELPTEXT :Relación entre o tamaño medio das cidades e o dos pobos ao inicio da partida +STR_CONFIG_SETTING_LINKGRAPH_RECALC_INTERVAL :Actualizar o grafo de distribución cada {STRING}{NBSP}segundo{P 0:2 "" s}. +STR_CONFIG_SETTING_LINKGRAPH_RECALC_INTERVAL_HELPTEXT :Tempo entre recálculos sucesivos do grafo de ligazóns. Cada recálculo calcula os plans para un compoñente do grafo. Iso significa que un valor X para esta configuración non significa que o grafo completo sexa actualizado cada X segundos. Só algúns compoñentes o serán. Canto máis curto sexa o tempo establecido, máis tempo de CPU será necesario para calculalo. Canto máis longo sexa o tempo establecido, máis tempo levará ata que a distribución de carga comece a percorrer novas rutas. +STR_CONFIG_SETTING_LINKGRAPH_RECALC_TIME :Toma {STRING}{NBSP}segundo{P 0:2 "" s} para o recálculo do grafo de distribución. +STR_CONFIG_SETTING_LINKGRAPH_RECALC_TIME_HELPTEXT :Tempo necesario para cada recalculación dun compoñente do grafo de ligazóns. Cando se inicia unha recalculación, abrese un fío que se pode executar durante este número de segundos. Canto máis curto o establezas, máis probable é que o fío non remate cando se supón que debe facelo. Entón, o xogo detense ata que o fío remata («lag»). Canto máis longo o estabelezas, máis tempo levará actualizar a distribución cando cambien as rutas. STR_CONFIG_SETTING_DISTRIBUTION_PAX :Modo de distribución para pasaxeiros: {STRING} STR_CONFIG_SETTING_DISTRIBUTION_PAX_HELPTEXT :"Simétrico" significa que máis ou menos o mesmo número de pasaxeiros irán dende a estación A cada a estación B e tamén da B cara a A. "Asimétrico" significa que calquera número de pasaxeiros pode ir en calquera dirección. "manual" significa que non haberá distribución automática para os pasaxeiros. @@ -1949,13 +1956,15 @@ STR_CONFIG_SETTING_DEMAND_SIZE_HELPTEXT :Fixar esta opci STR_CONFIG_SETTING_SHORT_PATH_SATURATION :Saturación de rutas curtas antes de empregar rutas con capacidade: {STRING} STR_CONFIG_SETTING_SHORT_PATH_SATURATION_HELPTEXT :Frecuentemente hai múltiples rutas posíbeis entre dúas estacións dadas. En primero lugar intentarase satura-la ruta máis curta, para posteriormente satura-la segunda máis curta e así sucesivamente. A saturación está determinada por unha estimación de capacidade e uso planificado. Unha vez saturadas tódalas rutas, se aínda queda demanda, sobrecargaranse as rutas comezando por aquelas de maior capacidade. A maior parte das veces, o algoritmo non estimará a capacidade con precisión. Esta opción permite especificar ata que porcentaxe de saturación pode ter unha ruta curta na primeira volta do algoritmo antes de escolle-la seguinte máis curta. Fíxao en menos do 100% para evitar estacións sobrecargadas no caso de que se sobreestime a capacidade. -STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY :Unidades de velocidade: {STRING} +STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY :Unidades de velocidade (terra): {STRING} +STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_NAUTICAL :Unidade de velocidade (náutica): {STRING} STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_HELPTEXT :Cando unha velocidade apareza na interfaz de usuario, facelo nas unidades seleccionadas ###length 5 STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_IMPERIAL :Imperial (mph) STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_METRIC :Métrico (km/h) STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_SI :SI (m/s) STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_GAMEUNITS :Unidades do xogo (cadros/día) +STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_KNOTS :Nudos STR_CONFIG_SETTING_LOCALISATION_UNITS_POWER :Unidades de potencia dos vehículos: {STRING} STR_CONFIG_SETTING_LOCALISATION_UNITS_POWER_HELPTEXT :Cando a potencia dun vehículo se amose na interfaz de usuario, facelo nas unidades seleccionadas @@ -2356,6 +2365,8 @@ STR_NETWORK_CLIENT_LIST_NEW_COMPANY :(Nova compañí STR_NETWORK_CLIENT_LIST_NEW_COMPANY_TOOLTIP :{BLACK}Crear unha nova compañía e unirte a ela STR_NETWORK_CLIENT_LIST_PLAYER_ICON_SELF_TOOLTIP :{BLACK}Este es ti STR_NETWORK_CLIENT_LIST_PLAYER_ICON_HOST_TOOLTIP :{BLACK}Este é o anfitrión da partida +STR_NETWORK_CLIENT_LIST_CLIENT_COMPANY_COUNT :{BLACK}{NUM} cliente{P "" s} - {NUM}/{NUM} compañía{P "" "s"} +STR_NETWORK_CLIENT_LIST_CLIENT_COMPANY_COUNT_TOOLTIP :{BLACK}O número de clientes conectados actualmente, o número de compañías e o número máximo de compañías permitidas polo administrador do servidor. # Matches ConnectionType ###length 5 @@ -4580,7 +4591,9 @@ STR_AI_CONFIG_AILIST_TOOLTIP :{BLACK}As IAs q STR_AI_CONFIG_HUMAN_PLAYER :Xogador humano STR_AI_CONFIG_RANDOM_AI :IA aleatoria STR_AI_CONFIG_NONE :(ningunha) +STR_AI_CONFIG_NAME_VERSION :{STRING} {YELLOW}v{NUM} STR_AI_CONFIG_MAX_COMPETITORS :{LTBLUE}Nº máximo de opoñentes: {ORANGE}{COMMA} +STR_AI_CONFIG_COMPETITORS_INTERVAL :{LTBLUE}Intervalo entre o comezo dos competidores: {ORANGE}{COMMA} minuto{P "" s} STR_AI_CONFIG_MOVE_UP :{BLACK}Subir STR_AI_CONFIG_MOVE_UP_TOOLTIP :{BLACK}Mover a IA seleccionada cara arriba na lista @@ -4593,7 +4606,7 @@ STR_AI_CONFIG_AI :{SILVER}IAs STR_AI_CONFIG_CHANGE_AI :{BLACK}Seleccionar IA STR_AI_CONFIG_CHANGE_GAMESCRIPT :{BLACK}Seleccionar script do xogo -STR_AI_CONFIG_CHANGE_TOOLTIP :{BLACK}Cargar outro script +STR_AI_CONFIG_CHANGE_TOOLTIP :{BLACK}Cargar outro script. Ctrl+Click amosa todas as versións dispoñibles STR_AI_CONFIG_CONFIGURE :{BLACK}Configurar STR_AI_CONFIG_CONFIGURE_TOOLTIP :{BLACK}Configurar os parámetros do script @@ -5081,11 +5094,24 @@ STR_ERROR_TOO_FAR_FROM_PREVIOUS_DESTINATION :{WHITE}... dema STR_ERROR_AIRCRAFT_NOT_ENOUGH_RANGE :{WHITE}... o avión non ten autonomía suficiente # Extra messages which go on the third line of errors, explaining why orders failed +STR_ERROR_NO_RAIL_STATION :{WHITE}Non hai estación de ferrocarril +STR_ERROR_NO_BUS_STATION :{WHITE}Non hai estación de bus +STR_ERROR_NO_TRUCK_STATION :{WHITE}Non hai estación de camións +STR_ERROR_NO_DOCK :{WHITE}Non hai porto +STR_ERROR_NO_AIRPORT :{WHITE}Non hai aeroporto/heliporto +STR_ERROR_NO_STOP_COMPATIBLE_ROAD_TYPE :{WHITE}Non hai paradas con un tipo de estrada compatible. +STR_ERROR_NO_STOP_COMPATIBLE_TRAM_TYPE :{WHITE}Non hai paradas con un tipo de tranvía compatible +STR_ERROR_NO_STOP_ARTICULATED_VEHICLE :{WHITE}Non hai paradas que sexan axeitadas para vehículos articulados.{} Os vehículos articulados requiren dunha parada na que se poida pasar directamente, non unha parada en baía. +STR_ERROR_AIRPORT_NO_PLANES :{WHITE}Este avión non pode aterrar neste heliporto +STR_ERROR_AIRPORT_NO_HELICOPTERS :{WHITE}Este helicóptero non pode aterrar neste aeroporto +STR_ERROR_NO_RAIL_WAYPOINT :{WHITE}Non hai punto de ruta da liña férrea +STR_ERROR_NO_BUOY :{WHITE}Non hai boia # Timetable related errors STR_ERROR_CAN_T_TIMETABLE_VEHICLE :{WHITE}Non se pode axusta-lo horario do vehículo... STR_ERROR_TIMETABLE_ONLY_WAIT_AT_STATIONS :{WHITE}Os vehículos só poden parar nas estacións STR_ERROR_TIMETABLE_NOT_STOPPING_HERE :{WHITE}Este vehículo non para nesta estación +STR_ERROR_TIMETABLE_INCOMPLETE :{WHITE}... horario incompleto # Sign related errors STR_ERROR_TOO_MANY_SIGNS :{WHITE}... demasiados sinais @@ -5582,7 +5608,7 @@ STR_JUST_BIG_RAW_STRING :{BIG_FONT}{STRI # Slightly 'raw' stringcodes with colour or size STR_BLACK_COMMA :{BLACK}{COMMA} -STR_TINY_BLACK_COMA :{TINY_FONT}{BLACK}{COMMA} +STR_TINY_BLACK_COMMA :{TINY_FONT}{BLACK}{COMMA} STR_TINY_COMMA :{TINY_FONT}{COMMA} STR_BLUE_COMMA :{BLUE}{COMMA} STR_RED_COMMA :{RED}{COMMA} diff --git a/src/lang/german.txt b/src/lang/german.txt index da807a6473..2d92843a6e 100644 --- a/src/lang/german.txt +++ b/src/lang/german.txt @@ -5597,7 +5597,7 @@ STR_JUST_BIG_RAW_STRING :{BIG_FONT}{STRI # Slightly 'raw' stringcodes with colour or size STR_BLACK_COMMA :{BLACK}{COMMA} -STR_TINY_BLACK_COMA :{TINY_FONT}{BLACK}{COMMA} +STR_TINY_BLACK_COMMA :{TINY_FONT}{BLACK}{COMMA} STR_TINY_COMMA :{TINY_FONT}{COMMA} STR_BLUE_COMMA :{BLUE}{COMMA} STR_RED_COMMA :{RED}{COMMA} diff --git a/src/lang/greek.txt b/src/lang/greek.txt index 0ec59002c9..e0ddb756ad 100644 --- a/src/lang/greek.txt +++ b/src/lang/greek.txt @@ -5687,7 +5687,7 @@ STR_JUST_BIG_RAW_STRING :{BIG_FONT}{STRI # Slightly 'raw' stringcodes with colour or size STR_BLACK_COMMA :{BLACK}{COMMA} -STR_TINY_BLACK_COMA :{TINY_FONT}{BLACK}{COMMA} +STR_TINY_BLACK_COMMA :{TINY_FONT}{BLACK}{COMMA} STR_TINY_COMMA :{TINY_FONT}{COMMA} STR_BLUE_COMMA :{BLUE}{COMMA} STR_RED_COMMA :{RED}{COMMA} diff --git a/src/lang/hebrew.txt b/src/lang/hebrew.txt index a567be6133..b7d193dd7d 100644 --- a/src/lang/hebrew.txt +++ b/src/lang/hebrew.txt @@ -5278,7 +5278,7 @@ STR_JUST_BIG_RAW_STRING :{BIG_FONT}{STRI # Slightly 'raw' stringcodes with colour or size STR_BLACK_COMMA :{BLACK}{COMMA} -STR_TINY_BLACK_COMA :{TINY_FONT}{BLACK}{COMMA} +STR_TINY_BLACK_COMMA :{TINY_FONT}{BLACK}{COMMA} STR_TINY_COMMA :{TINY_FONT}{COMMA} STR_BLUE_COMMA :{BLUE}{COMMA} STR_RED_COMMA :{RED}{COMMA} diff --git a/src/lang/hindi.txt b/src/lang/hindi.txt index 387093a538..1ea63d23dc 100644 --- a/src/lang/hindi.txt +++ b/src/lang/hindi.txt @@ -1518,7 +1518,7 @@ STR_JUST_BIG_RAW_STRING :{BIG_FONT}{STRI # Slightly 'raw' stringcodes with colour or size STR_BLACK_COMMA :{BLACK}{COMMA} -STR_TINY_BLACK_COMA :{TINY_FONT}{BLACK}{COMMA} +STR_TINY_BLACK_COMMA :{TINY_FONT}{BLACK}{COMMA} STR_TINY_COMMA :{TINY_FONT}{COMMA} STR_BLUE_COMMA :{BLUE}{COMMA} STR_RED_COMMA :{RED}{COMMA} diff --git a/src/lang/hungarian.txt b/src/lang/hungarian.txt index 538343553f..96bae4af2a 100644 --- a/src/lang/hungarian.txt +++ b/src/lang/hungarian.txt @@ -5676,7 +5676,7 @@ STR_JUST_BIG_RAW_STRING :{BIG_FONT}{STRI # Slightly 'raw' stringcodes with colour or size STR_BLACK_COMMA :{BLACK}{COMMA} -STR_TINY_BLACK_COMA :{TINY_FONT}{BLACK}{COMMA} +STR_TINY_BLACK_COMMA :{TINY_FONT}{BLACK}{COMMA} STR_TINY_COMMA :{TINY_FONT}{COMMA} STR_BLUE_COMMA :{BLUE}{COMMA} STR_RED_COMMA :{RED}{COMMA} diff --git a/src/lang/icelandic.txt b/src/lang/icelandic.txt index b44b3b8d16..6ba3e68ea0 100644 --- a/src/lang/icelandic.txt +++ b/src/lang/icelandic.txt @@ -4846,7 +4846,7 @@ STR_JUST_RAW_STRING :{STRING} # Slightly 'raw' stringcodes with colour or size STR_BLACK_COMMA :{BLACK}{COMMA} -STR_TINY_BLACK_COMA :{TINY_FONT}{BLACK}{COMMA} +STR_TINY_BLACK_COMMA :{TINY_FONT}{BLACK}{COMMA} STR_TINY_COMMA :{TINY_FONT}{COMMA} STR_BLUE_COMMA :{BLUE}{COMMA} STR_RED_COMMA :{RED}{COMMA} diff --git a/src/lang/ido.txt b/src/lang/ido.txt index 297233d123..237753a0a1 100644 --- a/src/lang/ido.txt +++ b/src/lang/ido.txt @@ -1696,7 +1696,7 @@ STR_JUST_RAW_STRING :{STRING} # Slightly 'raw' stringcodes with colour or size STR_BLACK_COMMA :{BLACK}{COMMA} -STR_TINY_BLACK_COMA :{TINY_FONT}{BLACK}{COMMA} +STR_TINY_BLACK_COMMA :{TINY_FONT}{BLACK}{COMMA} STR_TINY_COMMA :{TINY_FONT}{COMMA} STR_BLUE_COMMA :{BLUE}{COMMA} STR_RED_COMMA :{RED}{COMMA} diff --git a/src/lang/indonesian.txt b/src/lang/indonesian.txt index 4528fb3c5a..d2bbb2dab3 100644 --- a/src/lang/indonesian.txt +++ b/src/lang/indonesian.txt @@ -5571,7 +5571,7 @@ STR_JUST_BIG_RAW_STRING :{BIG_FONT}{STRI # Slightly 'raw' stringcodes with colour or size STR_BLACK_COMMA :{BLACK}{COMMA} -STR_TINY_BLACK_COMA :{TINY_FONT}{BLACK}{COMMA} +STR_TINY_BLACK_COMMA :{TINY_FONT}{BLACK}{COMMA} STR_TINY_COMMA :{TINY_FONT}{COMMA} STR_BLUE_COMMA :{BLUE}{COMMA} STR_RED_COMMA :{RED}{COMMA} diff --git a/src/lang/irish.txt b/src/lang/irish.txt index bf2411ab3c..1b35e6a89e 100644 --- a/src/lang/irish.txt +++ b/src/lang/irish.txt @@ -5480,7 +5480,7 @@ STR_JUST_BIG_RAW_STRING :{BIG_FONT}{STRI # Slightly 'raw' stringcodes with colour or size STR_BLACK_COMMA :{BLACK}{COMMA} -STR_TINY_BLACK_COMA :{TINY_FONT}{BLACK}{COMMA} +STR_TINY_BLACK_COMMA :{TINY_FONT}{BLACK}{COMMA} STR_TINY_COMMA :{TINY_FONT}{COMMA} STR_BLUE_COMMA :{BLUE}{COMMA} STR_RED_COMMA :{RED}{COMMA} diff --git a/src/lang/italian.txt b/src/lang/italian.txt index 5bed11d88f..a7995cc936 100644 --- a/src/lang/italian.txt +++ b/src/lang/italian.txt @@ -5151,6 +5151,7 @@ STR_ERROR_NO_BUOY :{WHITE}Non c'è STR_ERROR_CAN_T_TIMETABLE_VEHICLE :{WHITE}Impossibile dare un orario al veicolo... STR_ERROR_TIMETABLE_ONLY_WAIT_AT_STATIONS :{WHITE}I veicoli possono attendere solo alle stazioni STR_ERROR_TIMETABLE_NOT_STOPPING_HERE :{WHITE}Il veicolo non ferma a questa stazione +STR_ERROR_TIMETABLE_INCOMPLETE :{WHITE}... l'orario è incompleto # Sign related errors STR_ERROR_TOO_MANY_SIGNS :{WHITE}... troppi cartelli @@ -5647,7 +5648,7 @@ STR_JUST_BIG_RAW_STRING :{BIG_FONT}{STRI # Slightly 'raw' stringcodes with colour or size STR_BLACK_COMMA :{BLACK}{COMMA} -STR_TINY_BLACK_COMA :{TINY_FONT}{BLACK}{COMMA} +STR_TINY_BLACK_COMMA :{TINY_FONT}{BLACK}{COMMA} STR_TINY_COMMA :{TINY_FONT}{COMMA} STR_BLUE_COMMA :{BLUE}{COMMA} STR_RED_COMMA :{RED}{COMMA} diff --git a/src/lang/japanese.txt b/src/lang/japanese.txt index 1033f065e8..e4a0d2e6fd 100644 --- a/src/lang/japanese.txt +++ b/src/lang/japanese.txt @@ -5595,7 +5595,7 @@ STR_JUST_BIG_RAW_STRING :{BIG_FONT}{STRI # Slightly 'raw' stringcodes with colour or size STR_BLACK_COMMA :{BLACK}{COMMA} -STR_TINY_BLACK_COMA :{TINY_FONT}{BLACK}{COMMA} +STR_TINY_BLACK_COMMA :{TINY_FONT}{BLACK}{COMMA} STR_TINY_COMMA :{TINY_FONT}{COMMA} STR_BLUE_COMMA :{BLUE}{COMMA} STR_RED_COMMA :{RED}{COMMA} diff --git a/src/lang/korean.txt b/src/lang/korean.txt index 9287729682..58ef7981df 100644 --- a/src/lang/korean.txt +++ b/src/lang/korean.txt @@ -345,9 +345,9 @@ STR_GOTO_ORDER_VIEW_TOOLTIP :{BLACK}경로 ###length 31 STR_TOOLBAR_TOOLTIP_PAUSE_GAME :{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}지도, 외부 화면, 팻말 목록을 보여줍니다. +STR_TOOLBAR_TOOLTIP_OPTIONS :{BLACK}게임 기본 설정을 엽니다 +STR_TOOLBAR_TOOLTIP_SAVE_GAME_ABANDON_GAME :{BLACK}게임을 저장하거나, 불러오거나, 그만두거나, 게임을 종료합니다 +STR_TOOLBAR_TOOLTIP_DISPLAY_MAP :{BLACK}지도, 외부 화면, 화물 흐름, 팻말 목록을 보여줍니다. STR_TOOLBAR_TOOLTIP_DISPLAY_TOWN_DIRECTORY :{BLACK}도시 메뉴를 표시합니다. STR_TOOLBAR_TOOLTIP_DISPLAY_SUBSIDIES :{BLACK}보조금 메뉴를 표시합니다. STR_TOOLBAR_TOOLTIP_DISPLAY_LIST_OF_COMPANY_STATIONS :{BLACK}각 회사의 정거장 목록을 표시합니다. @@ -355,9 +355,9 @@ 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_GRAPHS :{BLACK}회사 그래프와 화물 운송단가 비율 창을 보여줍니다 STR_TOOLBAR_TOOLTIP_DISPLAY_COMPANY_LEAGUE :{BLACK}회사의 성취도 순위를 표시합니다. -STR_TOOLBAR_TOOLTIP_FUND_CONSTRUCTION_OF_NEW :{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+클릭하면 그룹화된 창은 일반 창으로, 일반 창은 그룹화된 창으로 표시됩니다. STR_TOOLBAR_TOOLTIP_DISPLAY_LIST_OF_COMPANY_SHIPS :{BLACK}각 회사의 선박 목록을 표시합니다. CTRL+클릭하면 그룹화된 창은 일반 창으로, 일반 창은 그룹화된 창으로 표시됩니다. @@ -371,8 +371,8 @@ 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}최근 메시지/뉴스 기록이나 메시지 설정을 엽니다. -STR_TOOLBAR_TOOLTIP_LAND_BLOCK_INFORMATION :{BLACK}지역 정보, 콘솔, 스크립트 디버그, 스크린샷, OpenTTD에 대한 정보를 보여줍니다. +STR_TOOLBAR_TOOLTIP_SHOW_LAST_MESSAGE_NEWS :{BLACK}최근 메시지/뉴스 기록을 보거나, 모든 메시지를 삭제합니다 +STR_TOOLBAR_TOOLTIP_LAND_BLOCK_INFORMATION :{BLACK}지역 정보, 스크린샷, OpenTTD에 대한 정보, 개발자 도구 등을 보여줍니다 STR_TOOLBAR_TOOLTIP_SWITCH_TOOLBAR :{BLACK}툴바를 변경합니다. # Extra tooltips for the scenario editor toolbar @@ -1713,7 +1713,7 @@ STR_CONFIG_SETTING_SCRIPT_MAX_MEMORY_HELPTEXT :스크립트 STR_CONFIG_SETTING_SCRIPT_MAX_MEMORY_VALUE :{COMMA} MiB STR_CONFIG_SETTING_SERVINT_ISPERCENT :신뢰도에 따른 점검 설정: {STRING} -STR_CONFIG_SETTING_SERVINT_ISPERCENT_HELPTEXT :차량 점검 방식을 "마지막 점검 이후 지난 시간 (또는) 최대 신뢰도에 대한 차량 신뢰도의 일정 퍼센트 하락 여부" 중에 하나로 선택합니다. +STR_CONFIG_SETTING_SERVINT_ISPERCENT_HELPTEXT :이 설정을 켜면, 차량의 신뢰도가 최대 신뢰도에 비해 일정 비율만큼 하락했을 때 점검을 하러 가려고 합니다.{}{}예를 들어, 차량의 최대 신뢰도가 90%이고 점검 주기를 20%로 설정하면, 그 차량은 신뢰도가 72%가 되었을 때 점검을 하러 가게 됩니다. STR_CONFIG_SETTING_SERVINT_TRAINS :열차에 대한 기본 점검 기준: {STRING} STR_CONFIG_SETTING_SERVINT_TRAINS_HELPTEXT :열차에 따로 점검 기간이 설정되어있지 않은 경우에 사용할 기본 점검 기간을 설정합니다. @@ -1927,6 +1927,10 @@ STR_CONFIG_SETTING_LARGER_TOWNS_DISABLED :없음 STR_CONFIG_SETTING_CITY_SIZE_MULTIPLIER :초기 대도시 크기 비율: 일반 도시보다 {STRING}배 크게 시작 STR_CONFIG_SETTING_CITY_SIZE_MULTIPLIER_HELPTEXT :게임을 시작했을 때 일반 도시에 대한 대도시의 평균 크기를 설정합니다 +STR_CONFIG_SETTING_LINKGRAPH_RECALC_INTERVAL :분배 그래프를 매 {STRING}초마다 업데이트 +STR_CONFIG_SETTING_LINKGRAPH_RECALC_INTERVAL_HELPTEXT :각 연결 그래프의 하위 시퀀스 재계산 사이의 시간입니다. 각 재계산은 그래프의 한 구성 요소에 대한 계획을 계산합니다. 즉, 이 설정을 X로 설정한다고 해서 전체 그래프를 X초마다 업데이트한다는 뜻은 아닙니다. 일부 구성 요소만 X초마다 업데이트됩니다. 이 값을 더 짧게 설정할 수록 계산하는데 더 많은 CPU 계산 시간이 필요합니다. 값을 더 길게 설정하면 화물 분배가 새 경로로 이뤄지기까지 더 오랜 시간이 걸리게 됩니다. +STR_CONFIG_SETTING_LINKGRAPH_RECALC_TIME :분배 그래프의 재계산을 위해 {STRING}초 사용 +STR_CONFIG_SETTING_LINKGRAPH_RECALC_TIME_HELPTEXT :각 연결 그래프의 구성 요소를 재계산하는데 걸리는 시간입니다. 재계산이 시작되면, 이 시간(초) 동안 실행할 수 있는 스레드가 생성됩니다. 이 값을 더 짧게 설정할수록 스레드가 완료되어야 할 때 완료되지 못할 가능성이 높아집니다. 그러면 이를 완료하기 전까지는 게임이 멈추게 됩니다. 값을 더 길게 설정하면 경로가 변경되었을 때 분배가 업데이트되는 데 더 오래 걸립니다. STR_CONFIG_SETTING_DISTRIBUTION_PAX :승객에 대한 분배 형식: {STRING} STR_CONFIG_SETTING_DISTRIBUTION_PAX_HELPTEXT :"대칭"은 A역에서 B역으로 가려는 승객의 수가 B에서 A로 가려는 승객의 수와 비슷하다는 뜻입니다. "비대칭"은 승객이 아무 방향이나 임의의 양만큼 가게 됨을 뜻합니다. "수동"은 자동적인 승객 분배가 일어나지 않고 기존 방식을 사용하겠음을 뜻합니다. @@ -4589,6 +4593,7 @@ STR_AI_CONFIG_RANDOM_AI :무작위 인 STR_AI_CONFIG_NONE :(없음) STR_AI_CONFIG_NAME_VERSION :{STRING} {YELLOW}v{NUM} STR_AI_CONFIG_MAX_COMPETITORS :{LTBLUE}최대 경쟁자수: {ORANGE}{COMMA} +STR_AI_CONFIG_COMPETITORS_INTERVAL :{LTBLUE}새 경쟁사가 나타나기 위해 필요한 최소 시간: {ORANGE}{COMMA}분 STR_AI_CONFIG_MOVE_UP :{BLACK}위로 이동 STR_AI_CONFIG_MOVE_UP_TOOLTIP :{BLACK}목록에서 선택한 인공지능의 순서를 한 칸 위로 옮깁니다 @@ -5106,6 +5111,7 @@ STR_ERROR_NO_BUOY :{WHITE}부표 STR_ERROR_CAN_T_TIMETABLE_VEHICLE :{WHITE}차량의 시간표를 정할 수 없습니다... STR_ERROR_TIMETABLE_ONLY_WAIT_AT_STATIONS :{WHITE}차량은 정거장에서만 기다릴 수 있습니다 STR_ERROR_TIMETABLE_NOT_STOPPING_HERE :{WHITE}이 차량은 이 정거장에 서지 않습니다 +STR_ERROR_TIMETABLE_INCOMPLETE :{WHITE}... 시간표가 모두 작성되지 않았습니다 # Sign related errors STR_ERROR_TOO_MANY_SIGNS :{WHITE}... 팻말 수가 너무 많습니다 @@ -5602,7 +5608,7 @@ STR_JUST_BIG_RAW_STRING :{BIG_FONT}{STRI # Slightly 'raw' stringcodes with colour or size STR_BLACK_COMMA :{BLACK}{COMMA} -STR_TINY_BLACK_COMA :{TINY_FONT}{BLACK}{COMMA} +STR_TINY_BLACK_COMMA :{TINY_FONT}{BLACK}{COMMA} STR_TINY_COMMA :{TINY_FONT}{COMMA} STR_BLUE_COMMA :{BLUE}{COMMA} STR_RED_COMMA :{RED}{COMMA} diff --git a/src/lang/latin.txt b/src/lang/latin.txt index 967083a7f1..14d8e6904c 100644 --- a/src/lang/latin.txt +++ b/src/lang/latin.txt @@ -5472,7 +5472,7 @@ STR_JUST_BIG_RAW_STRING :{BIG_FONT}{STRI # Slightly 'raw' stringcodes with colour or size STR_BLACK_COMMA :{BLACK}{COMMA} -STR_TINY_BLACK_COMA :{TINY_FONT}{BLACK}{COMMA} +STR_TINY_BLACK_COMMA :{TINY_FONT}{BLACK}{COMMA} STR_TINY_COMMA :{TINY_FONT}{COMMA} STR_BLUE_COMMA :{BLUE}{COMMA} STR_RED_COMMA :{RED}{COMMA} diff --git a/src/lang/latvian.txt b/src/lang/latvian.txt index 740b6a7a6b..253fbff1a0 100644 --- a/src/lang/latvian.txt +++ b/src/lang/latvian.txt @@ -5588,7 +5588,7 @@ STR_JUST_BIG_RAW_STRING :{BIG_FONT}{STRI # Slightly 'raw' stringcodes with colour or size STR_BLACK_COMMA :{BLACK}{COMMA} -STR_TINY_BLACK_COMA :{TINY_FONT}{BLACK}{COMMA} +STR_TINY_BLACK_COMMA :{TINY_FONT}{BLACK}{COMMA} STR_TINY_COMMA :{TINY_FONT}{COMMA} STR_BLUE_COMMA :{BLUE}{COMMA} STR_RED_COMMA :{RED}{COMMA} diff --git a/src/lang/lithuanian.txt b/src/lang/lithuanian.txt index bf0eefea0d..b25b0c4bbf 100644 --- a/src/lang/lithuanian.txt +++ b/src/lang/lithuanian.txt @@ -6045,7 +6045,7 @@ STR_JUST_BIG_RAW_STRING :{BIG_FONT}{STRI # Slightly 'raw' stringcodes with colour or size STR_BLACK_COMMA :{BLACK}{COMMA} -STR_TINY_BLACK_COMA :{TINY_FONT}{BLACK}{COMMA} +STR_TINY_BLACK_COMMA :{TINY_FONT}{BLACK}{COMMA} STR_TINY_COMMA :{TINY_FONT}{COMMA} STR_BLUE_COMMA :{BLUE}{COMMA} STR_RED_COMMA :{RED}{COMMA} diff --git a/src/lang/luxembourgish.txt b/src/lang/luxembourgish.txt index 9c08da2187..a4ad44de64 100644 --- a/src/lang/luxembourgish.txt +++ b/src/lang/luxembourgish.txt @@ -5581,7 +5581,7 @@ STR_JUST_BIG_RAW_STRING :{BIG_FONT}{STRI # Slightly 'raw' stringcodes with colour or size STR_BLACK_COMMA :{BLACK}{COMMA} -STR_TINY_BLACK_COMA :{TINY_FONT}{BLACK}{COMMA} +STR_TINY_BLACK_COMMA :{TINY_FONT}{BLACK}{COMMA} STR_TINY_COMMA :{TINY_FONT}{COMMA} STR_BLUE_COMMA :{BLUE}{COMMA} STR_RED_COMMA :{RED}{COMMA} diff --git a/src/lang/macedonian.txt b/src/lang/macedonian.txt index ac3b40b60f..c6064c65dc 100644 --- a/src/lang/macedonian.txt +++ b/src/lang/macedonian.txt @@ -2240,7 +2240,7 @@ STR_JUST_RAW_STRING :{STRING} # Slightly 'raw' stringcodes with colour or size STR_BLACK_COMMA :{BLACK}{COMMA} -STR_TINY_BLACK_COMA :{TINY_FONT}{BLACK}{COMMA} +STR_TINY_BLACK_COMMA :{TINY_FONT}{BLACK}{COMMA} STR_TINY_COMMA :{TINY_FONT}{COMMA} STR_BLUE_COMMA :{BLUE}{COMMA} STR_RED_COMMA :{RED}{COMMA} diff --git a/src/lang/malay.txt b/src/lang/malay.txt index 14cc903a8b..ab2a36db3a 100644 --- a/src/lang/malay.txt +++ b/src/lang/malay.txt @@ -4753,7 +4753,7 @@ STR_JUST_RAW_STRING :{STRING} # Slightly 'raw' stringcodes with colour or size STR_BLACK_COMMA :{BLACK}{COMMA} -STR_TINY_BLACK_COMA :{TINY_FONT}{BLACK}{COMMA} +STR_TINY_BLACK_COMMA :{TINY_FONT}{BLACK}{COMMA} STR_TINY_COMMA :{TINY_FONT}{COMMA} STR_BLUE_COMMA :{BLUE}{COMMA} STR_RED_COMMA :{RED}{COMMA} diff --git a/src/lang/maltese.txt b/src/lang/maltese.txt index d7af4d76b5..20bca7ea89 100644 --- a/src/lang/maltese.txt +++ b/src/lang/maltese.txt @@ -1739,7 +1739,7 @@ STR_JUST_RAW_STRING :{STRING} # Slightly 'raw' stringcodes with colour or size STR_BLACK_COMMA :{BLACK}{COMMA} -STR_TINY_BLACK_COMA :{TINY_FONT}{BLACK}{COMMA} +STR_TINY_BLACK_COMMA :{TINY_FONT}{BLACK}{COMMA} STR_TINY_COMMA :{TINY_FONT}{COMMA} STR_BLUE_COMMA :{BLUE}{COMMA} STR_RED_COMMA :{RED}{COMMA} diff --git a/src/lang/marathi.txt b/src/lang/marathi.txt index f4799eb7c9..679d7d56b7 100644 --- a/src/lang/marathi.txt +++ b/src/lang/marathi.txt @@ -2113,7 +2113,7 @@ STR_JUST_RAW_STRING :{STRING} # Slightly 'raw' stringcodes with colour or size STR_BLACK_COMMA :{BLACK}{COMMA} -STR_TINY_BLACK_COMA :{TINY_FONT}{BLACK}{COMMA} +STR_TINY_BLACK_COMMA :{TINY_FONT}{BLACK}{COMMA} STR_TINY_COMMA :{TINY_FONT}{COMMA} STR_BLUE_COMMA :{BLUE}{COMMA} STR_RED_COMMA :{RED}{COMMA} diff --git a/src/lang/norwegian_bokmal.txt b/src/lang/norwegian_bokmal.txt index 563fa80774..b02d7b25f8 100644 --- a/src/lang/norwegian_bokmal.txt +++ b/src/lang/norwegian_bokmal.txt @@ -5502,7 +5502,7 @@ STR_JUST_BIG_RAW_STRING :{BIG_FONT}{STRI # Slightly 'raw' stringcodes with colour or size STR_BLACK_COMMA :{BLACK}{COMMA} -STR_TINY_BLACK_COMA :{TINY_FONT}{BLACK}{COMMA} +STR_TINY_BLACK_COMMA :{TINY_FONT}{BLACK}{COMMA} STR_TINY_COMMA :{TINY_FONT}{COMMA} STR_BLUE_COMMA :{BLUE}{COMMA} STR_RED_COMMA :{RED}{COMMA} diff --git a/src/lang/norwegian_nynorsk.txt b/src/lang/norwegian_nynorsk.txt index 8d69c390f5..baf7ad2a2c 100644 --- a/src/lang/norwegian_nynorsk.txt +++ b/src/lang/norwegian_nynorsk.txt @@ -4990,7 +4990,7 @@ STR_JUST_BIG_RAW_STRING :{BIG_FONT}{STRI # Slightly 'raw' stringcodes with colour or size STR_BLACK_COMMA :{BLACK}{COMMA} -STR_TINY_BLACK_COMA :{TINY_FONT}{BLACK}{COMMA} +STR_TINY_BLACK_COMMA :{TINY_FONT}{BLACK}{COMMA} STR_TINY_COMMA :{TINY_FONT}{COMMA} STR_BLUE_COMMA :{BLUE}{COMMA} STR_RED_COMMA :{RED}{COMMA} diff --git a/src/lang/persian.txt b/src/lang/persian.txt index 4f88d8ae87..cdb62ffcdd 100644 --- a/src/lang/persian.txt +++ b/src/lang/persian.txt @@ -4290,7 +4290,7 @@ STR_JUST_BIG_RAW_STRING :{BIG_FONT}{STRI # Slightly 'raw' stringcodes with colour or size STR_BLACK_COMMA :{BLACK}{COMMA} -STR_TINY_BLACK_COMA :{TINY_FONT}{BLACK}{COMMA} +STR_TINY_BLACK_COMMA :{TINY_FONT}{BLACK}{COMMA} STR_TINY_COMMA :{TINY_FONT}{COMMA} STR_BLUE_COMMA :{BLUE}{COMMA} STR_RED_COMMA :{RED}{COMMA} diff --git a/src/lang/polish.txt b/src/lang/polish.txt index 6dbbbbb604..0df0f9c208 100644 --- a/src/lang/polish.txt +++ b/src/lang/polish.txt @@ -2092,7 +2092,7 @@ STR_CONFIG_SETTING_SCRIPT_MAX_MEMORY_HELPTEXT :Ilość pamięc STR_CONFIG_SETTING_SCRIPT_MAX_MEMORY_VALUE :{COMMA} MiB STR_CONFIG_SETTING_SERVINT_ISPERCENT :Okres między serwisowaniami w procentach: {STRING} -STR_CONFIG_SETTING_SERVINT_ISPERCENT_HELPTEXT :Wybierz, czy serwisowanie pojazdów odbywa się na podstawie czasu od ostatniego serwisu, czy sprawności malejącej o pewien procent maksymalnej sprawności +STR_CONFIG_SETTING_SERVINT_ISPERCENT_HELPTEXT :Kiedy włączone, pojazdy podejmują próbę serwisowania, gdy ich niezawodność spadnie o dany procent maksymalnej niezawodności.{}{}Na przykład, jeśli maksymalna niezawodność pojazdu wynosi 90%, a interwał serwisowy wynosi 20%, pojazd podejmie próbę serwisowania, gdy osiągnie 72% niezawodności. STR_CONFIG_SETTING_SERVINT_TRAINS :Domyślny interwał serwisowania pociągów: {STRING} STR_CONFIG_SETTING_SERVINT_TRAINS_HELPTEXT :Ustaw domyślny okres serwisowania dla nowych pojazdów kolejowych, jeśli takowy nie istnieje dla określonego pojazdu @@ -2306,6 +2306,10 @@ STR_CONFIG_SETTING_LARGER_TOWNS_DISABLED :Żadne STR_CONFIG_SETTING_CITY_SIZE_MULTIPLIER :Początkowy mnożnik rozmiarów metropolii: {STRING} STR_CONFIG_SETTING_CITY_SIZE_MULTIPLIER_HELPTEXT :Średni rozmiar metropolii w porównaniu do normalnych miast na początku gry +STR_CONFIG_SETTING_LINKGRAPH_RECALC_INTERVAL :Aktualizuj graf dystrybucji co {STRING}{NBSP}sekund{P 0:2 ę y ""} +STR_CONFIG_SETTING_LINKGRAPH_RECALC_INTERVAL_HELPTEXT :Czas pomiędzy kolejnymi przeliczeniami grafu połączeń. Każde przeliczenie oblicza plany dla jednego komponentu grafu. Wartość X dla tego ustawienia nie oznacza, że cały graf będzie aktualizowany co X sekund. Aktualizowane będą tylko niektóre komponenty. Im mniejszą wartość ustawisz, tym więcej czasu będzie potrzebował procesor, aby wykonać obliczenia. Im większą wartość ustawisz, tym więcej czasu upłynie, zanim rozpocznie się dystrybucja ładunków po nowych trasach. +STR_CONFIG_SETTING_LINKGRAPH_RECALC_TIME :Przeznacz {STRING}{NBSP}sekund{P 0:2 ę y ""} na przeliczenie grafu dystrybucji +STR_CONFIG_SETTING_LINKGRAPH_RECALC_TIME_HELPTEXT :Czas potrzebny na każde przeliczenie komponentu grafu połączeń. Po rozpoczęciu przeliczania, tworzony jest wątek, który może działać przez podaną liczbę sekund. Im mniejszą wartość ustawisz, tym większe prawdopodobieństwo, że wątek nie zostanie ukończony w wyznaczonym czasie. Wtedy gra zatrzymuje się do czasu jego zakończenia („lag”). Im większą wartość ustawisz, tym dłużej będzie trwała aktualizacja dystrybucji, gdy zmienią się trasy. STR_CONFIG_SETTING_DISTRIBUTION_PAX :Tryb dystrybucji dla pasażerów: {STRING} STR_CONFIG_SETTING_DISTRIBUTION_PAX_HELPTEXT :Tryb „symetryczny” oznacza, że mniej więcej tyle samo pasażerów będzie podróżować ze stacji A do stacji B, co z B do A. Tryb „asymetryczny” oznacza, że w obu kierunkach może podróżować różna liczba pasażerów. Tryb „ręczny” oznacza, że dla pasażerów nie będzie przeprowadzana dystrybucja automatyczna. @@ -4974,6 +4978,7 @@ STR_AI_CONFIG_RANDOM_AI :Losowe SI STR_AI_CONFIG_NONE :(brak) STR_AI_CONFIG_NAME_VERSION :{STRING} {YELLOW}v{NUM} STR_AI_CONFIG_MAX_COMPETITORS :{LTBLUE}Maksymalna liczba przeciwników: {ORANGE}{COMMA} +STR_AI_CONFIG_COMPETITORS_INTERVAL :{LTBLUE}Odstęp czasowy pomiędzy uruchamianiem rywali: {ORANGE}{COMMA} minut{P a y ""} STR_AI_CONFIG_MOVE_UP :{BLACK}Przesuń w górę STR_AI_CONFIG_MOVE_UP_TOOLTIP :{BLACK}Przesuń wybraną SI w górę listy @@ -5491,6 +5496,7 @@ STR_ERROR_NO_BUOY :{WHITE}Brak boi STR_ERROR_CAN_T_TIMETABLE_VEHICLE :{WHITE}Nie można wyznaczyć rozkładu jazdy pojazdu... STR_ERROR_TIMETABLE_ONLY_WAIT_AT_STATIONS :{WHITE}Pojazdy mogą czekać tylko na stacjach STR_ERROR_TIMETABLE_NOT_STOPPING_HERE :{WHITE}Ten pojazd nie zatrzymuje się na tej stacji. +STR_ERROR_TIMETABLE_INCOMPLETE :{WHITE}... rozkład jazdy jest niekompletny # Sign related errors STR_ERROR_TOO_MANY_SIGNS :{WHITE}... zbyt wiele napisów @@ -6024,7 +6030,7 @@ STR_JUST_BIG_RAW_STRING :{BIG_FONT}{STRI # Slightly 'raw' stringcodes with colour or size STR_BLACK_COMMA :{BLACK}{COMMA} -STR_TINY_BLACK_COMA :{TINY_FONT}{BLACK}{COMMA} +STR_TINY_BLACK_COMMA :{TINY_FONT}{BLACK}{COMMA} STR_TINY_COMMA :{TINY_FONT}{COMMA} STR_BLUE_COMMA :{BLUE}{COMMA} STR_RED_COMMA :{RED}{COMMA} diff --git a/src/lang/portuguese.txt b/src/lang/portuguese.txt index 2e75bb44b2..8c90122a3a 100644 --- a/src/lang/portuguese.txt +++ b/src/lang/portuguese.txt @@ -5111,6 +5111,7 @@ STR_ERROR_NO_BUOY :{WHITE}Não exi STR_ERROR_CAN_T_TIMETABLE_VEHICLE :{WHITE}Impossível programar veículo... STR_ERROR_TIMETABLE_ONLY_WAIT_AT_STATIONS :{WHITE}Veículos apenas podem esperar em estações. STR_ERROR_TIMETABLE_NOT_STOPPING_HERE :{WHITE}Este veículo não pára nesta estação. +STR_ERROR_TIMETABLE_INCOMPLETE :{WHITE}... horário incompleto # Sign related errors STR_ERROR_TOO_MANY_SIGNS :{WHITE}... demasiados sinais @@ -5607,7 +5608,7 @@ STR_JUST_BIG_RAW_STRING :{BIG_FONT}{STRI # Slightly 'raw' stringcodes with colour or size STR_BLACK_COMMA :{BLACK}{COMMA} -STR_TINY_BLACK_COMA :{TINY_FONT}{BLACK}{COMMA} +STR_TINY_BLACK_COMMA :{TINY_FONT}{BLACK}{COMMA} STR_TINY_COMMA :{TINY_FONT}{COMMA} STR_BLUE_COMMA :{BLUE}{COMMA} STR_RED_COMMA :{RED}{COMMA} diff --git a/src/lang/romanian.txt b/src/lang/romanian.txt index 8b96a026c0..b954a2313a 100644 --- a/src/lang/romanian.txt +++ b/src/lang/romanian.txt @@ -5594,7 +5594,7 @@ STR_JUST_BIG_RAW_STRING :{BIG_FONT}{STRI # Slightly 'raw' stringcodes with colour or size STR_BLACK_COMMA :{BLACK}{COMMA} -STR_TINY_BLACK_COMA :{TINY_FONT}{BLACK}{COMMA} +STR_TINY_BLACK_COMMA :{TINY_FONT}{BLACK}{COMMA} STR_TINY_COMMA :{TINY_FONT}{COMMA} STR_BLUE_COMMA :{BLUE}{COMMA} STR_RED_COMMA :{RED}{COMMA} diff --git a/src/lang/russian.txt b/src/lang/russian.txt index e96ca4d49b..1b2e61a71b 100644 --- a/src/lang/russian.txt +++ b/src/lang/russian.txt @@ -5297,6 +5297,7 @@ STR_ERROR_NO_BUOY :{WHITE}Буи STR_ERROR_CAN_T_TIMETABLE_VEHICLE :{WHITE}Не удалось составить график движения для этого транспорта... STR_ERROR_TIMETABLE_ONLY_WAIT_AT_STATIONS :{WHITE}Транспорт может ждать только на станции STR_ERROR_TIMETABLE_NOT_STOPPING_HERE :{WHITE}Это транспортное средство не останавливается на этой станции +STR_ERROR_TIMETABLE_INCOMPLETE :{WHITE}... график движения неполный # Sign related errors STR_ERROR_TOO_MANY_SIGNS :{WHITE}... слишком много табличек @@ -5830,7 +5831,7 @@ STR_JUST_BIG_RAW_STRING :{BIG_FONT}{STRI # Slightly 'raw' stringcodes with colour or size STR_BLACK_COMMA :{BLACK}{COMMA} -STR_TINY_BLACK_COMA :{TINY_FONT}{BLACK}{COMMA} +STR_TINY_BLACK_COMMA :{TINY_FONT}{BLACK}{COMMA} STR_TINY_COMMA :{TINY_FONT}{COMMA} STR_BLUE_COMMA :{BLUE}{COMMA} STR_RED_COMMA :{RED}{COMMA} diff --git a/src/lang/serbian.txt b/src/lang/serbian.txt index 928fc41c31..029dc38ad3 100644 --- a/src/lang/serbian.txt +++ b/src/lang/serbian.txt @@ -5782,7 +5782,7 @@ STR_JUST_BIG_RAW_STRING :{BIG_FONT}{STRI # Slightly 'raw' stringcodes with colour or size STR_BLACK_COMMA :{BLACK}{COMMA} -STR_TINY_BLACK_COMA :{TINY_FONT}{BLACK}{COMMA} +STR_TINY_BLACK_COMMA :{TINY_FONT}{BLACK}{COMMA} STR_TINY_COMMA :{TINY_FONT}{COMMA} STR_BLUE_COMMA :{BLUE}{COMMA} STR_RED_COMMA :{RED}{COMMA} diff --git a/src/lang/simplified_chinese.txt b/src/lang/simplified_chinese.txt index 4a977e293f..3456f9a67c 100644 --- a/src/lang/simplified_chinese.txt +++ b/src/lang/simplified_chinese.txt @@ -5591,7 +5591,7 @@ STR_JUST_BIG_RAW_STRING :{BIG_FONT}{STRI # Slightly 'raw' stringcodes with colour or size STR_BLACK_COMMA :{BLACK}{COMMA} -STR_TINY_BLACK_COMA :{TINY_FONT}{BLACK}{COMMA} +STR_TINY_BLACK_COMMA :{TINY_FONT}{BLACK}{COMMA} STR_TINY_COMMA :{TINY_FONT}{COMMA} STR_BLUE_COMMA :{BLUE}{COMMA} STR_RED_COMMA :{RED}{COMMA} diff --git a/src/lang/slovak.txt b/src/lang/slovak.txt index 82f2920048..9e7317fb5d 100644 --- a/src/lang/slovak.txt +++ b/src/lang/slovak.txt @@ -5670,7 +5670,7 @@ STR_JUST_BIG_RAW_STRING :{BIG_FONT}{STRI # Slightly 'raw' stringcodes with colour or size STR_BLACK_COMMA :{BLACK}{COMMA} -STR_TINY_BLACK_COMA :{TINY_FONT}{BLACK}{COMMA} +STR_TINY_BLACK_COMMA :{TINY_FONT}{BLACK}{COMMA} STR_TINY_COMMA :{TINY_FONT}{COMMA} STR_BLUE_COMMA :{BLUE}{COMMA} STR_RED_COMMA :{RED}{COMMA} diff --git a/src/lang/slovenian.txt b/src/lang/slovenian.txt index 4e200cb91b..f2843a6ace 100644 --- a/src/lang/slovenian.txt +++ b/src/lang/slovenian.txt @@ -5291,7 +5291,7 @@ STR_JUST_BIG_RAW_STRING :{BIG_FONT}{STRI # Slightly 'raw' stringcodes with colour or size STR_BLACK_COMMA :{BLACK}{COMMA} -STR_TINY_BLACK_COMA :{TINY_FONT}{BLACK}{COMMA} +STR_TINY_BLACK_COMMA :{TINY_FONT}{BLACK}{COMMA} STR_TINY_COMMA :{TINY_FONT}{COMMA} STR_BLUE_COMMA :{BLUE}{COMMA} STR_RED_COMMA :{RED}{COMMA} diff --git a/src/lang/spanish.txt b/src/lang/spanish.txt index 92df45c636..1051b74fed 100644 --- a/src/lang/spanish.txt +++ b/src/lang/spanish.txt @@ -5578,7 +5578,7 @@ STR_JUST_BIG_RAW_STRING :{BIG_FONT}{STRI # Slightly 'raw' stringcodes with colour or size STR_BLACK_COMMA :{BLACK}{COMMA} -STR_TINY_BLACK_COMA :{TINY_FONT}{BLACK}{COMMA} +STR_TINY_BLACK_COMMA :{TINY_FONT}{BLACK}{COMMA} STR_TINY_COMMA :{TINY_FONT}{COMMA} STR_BLUE_COMMA :{BLUE}{COMMA} STR_RED_COMMA :{RED}{COMMA} diff --git a/src/lang/spanish_MX.txt b/src/lang/spanish_MX.txt index 0fa8e683bb..a25ec4a60c 100644 --- a/src/lang/spanish_MX.txt +++ b/src/lang/spanish_MX.txt @@ -5581,7 +5581,7 @@ STR_JUST_BIG_RAW_STRING :{BIG_FONT}{STRI # Slightly 'raw' stringcodes with colour or size STR_BLACK_COMMA :{BLACK}{COMMA} -STR_TINY_BLACK_COMA :{TINY_FONT}{BLACK}{COMMA} +STR_TINY_BLACK_COMMA :{TINY_FONT}{BLACK}{COMMA} STR_TINY_COMMA :{TINY_FONT}{COMMA} STR_BLUE_COMMA :{BLUE}{COMMA} STR_RED_COMMA :{RED}{COMMA} diff --git a/src/lang/swedish.txt b/src/lang/swedish.txt index 2f5f480dc2..c641d67bcb 100644 --- a/src/lang/swedish.txt +++ b/src/lang/swedish.txt @@ -5595,7 +5595,7 @@ STR_JUST_BIG_RAW_STRING :{BIG_FONT}{STRI # Slightly 'raw' stringcodes with colour or size STR_BLACK_COMMA :{BLACK}{COMMA} -STR_TINY_BLACK_COMA :{TINY_FONT}{BLACK}{COMMA} +STR_TINY_BLACK_COMMA :{TINY_FONT}{BLACK}{COMMA} STR_TINY_COMMA :{TINY_FONT}{COMMA} STR_BLUE_COMMA :{BLUE}{COMMA} STR_RED_COMMA :{RED}{COMMA} diff --git a/src/lang/tamil.txt b/src/lang/tamil.txt index 7f1fec6d7b..6177cb032d 100644 --- a/src/lang/tamil.txt +++ b/src/lang/tamil.txt @@ -5068,7 +5068,7 @@ STR_JUST_BIG_RAW_STRING :{BIG_FONT}{STRI # Slightly 'raw' stringcodes with colour or size STR_BLACK_COMMA :{BLACK}{COMMA} -STR_TINY_BLACK_COMA :{TINY_FONT}{BLACK}{COMMA} +STR_TINY_BLACK_COMMA :{TINY_FONT}{BLACK}{COMMA} STR_TINY_COMMA :{TINY_FONT}{COMMA} STR_BLUE_COMMA :{BLUE}{COMMA} STR_RED_COMMA :{RED}{COMMA} diff --git a/src/lang/thai.txt b/src/lang/thai.txt index fcdc273c0d..47ef4e9b4e 100644 --- a/src/lang/thai.txt +++ b/src/lang/thai.txt @@ -5205,7 +5205,7 @@ STR_JUST_BIG_RAW_STRING :{BIG_FONT}{STRI # Slightly 'raw' stringcodes with colour or size STR_BLACK_COMMA :{BLACK}{COMMA} -STR_TINY_BLACK_COMA :{TINY_FONT}{BLACK}{COMMA} +STR_TINY_BLACK_COMMA :{TINY_FONT}{BLACK}{COMMA} STR_TINY_COMMA :{TINY_FONT}{COMMA} STR_BLUE_COMMA :{BLUE}{COMMA} STR_RED_COMMA :{RED}{COMMA} diff --git a/src/lang/traditional_chinese.txt b/src/lang/traditional_chinese.txt index 96ab183b87..f0c499408b 100644 --- a/src/lang/traditional_chinese.txt +++ b/src/lang/traditional_chinese.txt @@ -5595,7 +5595,7 @@ STR_JUST_BIG_RAW_STRING :{BIG_FONT}{STRI # Slightly 'raw' stringcodes with colour or size STR_BLACK_COMMA :{BLACK}{COMMA} -STR_TINY_BLACK_COMA :{TINY_FONT}{BLACK}{COMMA} +STR_TINY_BLACK_COMMA :{TINY_FONT}{BLACK}{COMMA} STR_TINY_COMMA :{TINY_FONT}{COMMA} STR_BLUE_COMMA :{BLUE}{COMMA} STR_RED_COMMA :{RED}{COMMA} diff --git a/src/lang/turkish.txt b/src/lang/turkish.txt index a6ab7390ca..4e8d9f7d8e 100644 --- a/src/lang/turkish.txt +++ b/src/lang/turkish.txt @@ -157,7 +157,7 @@ STR_ABBREV_COLA :{TINY_FONT}KO STR_ABBREV_CANDYFLOSS :{TINY_FONT}PŞ STR_ABBREV_BUBBLES :{TINY_FONT}BA STR_ABBREV_TOFFEE :{TINY_FONT}ŞL -STR_ABBREV_BATTERIES :{TINY_FONT}PİL +STR_ABBREV_BATTERIES :{TINY_FONT}PL STR_ABBREV_PLASTIC :{TINY_FONT}PL STR_ABBREV_FIZZY_DRINKS :{TINY_FONT}İÇ STR_ABBREV_NONE :{TINY_FONT}YO @@ -5111,6 +5111,7 @@ STR_ERROR_NO_BUOY :{WHITE}Şamand STR_ERROR_CAN_T_TIMETABLE_VEHICLE :{WHITE}Aracın zaman çizelgesi oluşturulamıyor... STR_ERROR_TIMETABLE_ONLY_WAIT_AT_STATIONS :{WHITE}Araçlar sadece istasyonlarda bekleyebilir STR_ERROR_TIMETABLE_NOT_STOPPING_HERE :{WHITE}Araç bu istasyonda durmuyor +STR_ERROR_TIMETABLE_INCOMPLETE :{WHITE}... zaman çizelgesi eksik # Sign related errors STR_ERROR_TOO_MANY_SIGNS :{WHITE}... çok fazla tabela var @@ -5617,7 +5618,7 @@ STR_JUST_BIG_RAW_STRING :{BIG_FONT}{STRI # Slightly 'raw' stringcodes with colour or size STR_BLACK_COMMA :{BLACK}{COMMA} -STR_TINY_BLACK_COMA :{TINY_FONT}{BLACK}{COMMA} +STR_TINY_BLACK_COMMA :{TINY_FONT}{BLACK}{COMMA} STR_TINY_COMMA :{TINY_FONT}{COMMA} STR_BLUE_COMMA :{BLUE}{COMMA} STR_RED_COMMA :{RED}{COMMA} diff --git a/src/lang/ukrainian.txt b/src/lang/ukrainian.txt index 0a0ad48013..6e6d17d7bf 100644 --- a/src/lang/ukrainian.txt +++ b/src/lang/ukrainian.txt @@ -5741,7 +5741,7 @@ STR_JUST_BIG_RAW_STRING :{BIG_FONT}{STRI # Slightly 'raw' stringcodes with colour or size STR_BLACK_COMMA :{BLACK}{COMMA} -STR_TINY_BLACK_COMA :{TINY_FONT}{BLACK}{COMMA} +STR_TINY_BLACK_COMMA :{TINY_FONT}{BLACK}{COMMA} STR_TINY_COMMA :{TINY_FONT}{COMMA} STR_BLUE_COMMA :{BLUE}{COMMA} STR_RED_COMMA :{RED}{COMMA} diff --git a/src/lang/urdu.txt b/src/lang/urdu.txt index 9421f86052..4469fcb764 100644 --- a/src/lang/urdu.txt +++ b/src/lang/urdu.txt @@ -3180,7 +3180,7 @@ STR_JUST_RAW_STRING :{STRING} # Slightly 'raw' stringcodes with colour or size STR_BLACK_COMMA :{BLACK}{COMMA} -STR_TINY_BLACK_COMA :{TINY_FONT}{BLACK}{COMMA} +STR_TINY_BLACK_COMMA :{TINY_FONT}{BLACK}{COMMA} STR_TINY_COMMA :{TINY_FONT}{COMMA} STR_BLUE_COMMA :{BLUE}{COMMA} STR_RED_COMMA :{RED}{COMMA} diff --git a/src/lang/vietnamese.txt b/src/lang/vietnamese.txt index 0ab7cc6bc3..c1dbc0354e 100644 --- a/src/lang/vietnamese.txt +++ b/src/lang/vietnamese.txt @@ -5110,6 +5110,7 @@ STR_ERROR_NO_BUOY :{WHITE}Không c STR_ERROR_CAN_T_TIMETABLE_VEHICLE :{WHITE}Không thể lập lịch trình cho phương tiện... STR_ERROR_TIMETABLE_ONLY_WAIT_AT_STATIONS :{WHITE}Phương tiện chỉ có thể chờ ở nhà ga, bến, cảng. STR_ERROR_TIMETABLE_NOT_STOPPING_HERE :{WHITE}Phương tiện này không dừng lại tại ga, bến này theo lộ trình. +STR_ERROR_TIMETABLE_INCOMPLETE :{WHITE}... lịch trình chưa hoàn thiện # Sign related errors STR_ERROR_TOO_MANY_SIGNS :{WHITE}... quá nhiều biển hiệu @@ -5606,7 +5607,7 @@ STR_JUST_BIG_RAW_STRING :{BIG_FONT}{STRI # Slightly 'raw' stringcodes with colour or size STR_BLACK_COMMA :{BLACK}{COMMA} -STR_TINY_BLACK_COMA :{TINY_FONT}{BLACK}{COMMA} +STR_TINY_BLACK_COMMA :{TINY_FONT}{BLACK}{COMMA} STR_TINY_COMMA :{TINY_FONT}{COMMA} STR_BLUE_COMMA :{BLUE}{COMMA} STR_RED_COMMA :{RED}{COMMA} diff --git a/src/lang/welsh.txt b/src/lang/welsh.txt index 7f47899011..a201c79111 100644 --- a/src/lang/welsh.txt +++ b/src/lang/welsh.txt @@ -5114,7 +5114,7 @@ STR_JUST_BIG_RAW_STRING :{BIG_FONT}{STRI # Slightly 'raw' stringcodes with colour or size STR_BLACK_COMMA :{BLACK}{COMMA} -STR_TINY_BLACK_COMA :{TINY_FONT}{BLACK}{COMMA} +STR_TINY_BLACK_COMMA :{TINY_FONT}{BLACK}{COMMA} STR_TINY_COMMA :{TINY_FONT}{COMMA} STR_BLUE_COMMA :{BLUE}{COMMA} STR_RED_COMMA :{RED}{COMMA} diff --git a/src/misc/dbg_helpers.h b/src/misc/dbg_helpers.h index 53033110d8..b807ef25f1 100644 --- a/src/misc/dbg_helpers.h +++ b/src/misc/dbg_helpers.h @@ -25,7 +25,7 @@ template struct ArrayT; /** Helper template class that provides C array length and item type */ template struct ArrayT { static const size_t length = N; - typedef T item_t; + using Item = T; }; @@ -34,7 +34,7 @@ template struct ArrayT { * or t_unk when index is out of bounds. */ template -inline typename ArrayT::item_t ItemAtT(E idx, const T &t, typename ArrayT::item_t t_unk) +inline typename ArrayT::Item ItemAtT(E idx, const T &t, typename ArrayT::Item t_unk) { if ((size_t)idx >= ArrayT::length) { return t_unk; @@ -48,7 +48,7 @@ inline typename ArrayT::item_t ItemAtT(E idx, const T &t, typename ArrayT: * or t_unk when index is out of bounds. */ template -inline typename ArrayT::item_t ItemAtT(E idx, const T &t, typename ArrayT::item_t t_unk, E idx_inv, typename ArrayT::item_t t_inv) +inline typename ArrayT::Item ItemAtT(E idx, const T &t, typename ArrayT::Item t_unk, E idx_inv, typename ArrayT::Item t_inv) { if ((size_t)idx < ArrayT::length) { return t[idx]; diff --git a/src/music.cpp b/src/music.cpp index 42d6edbf78..903e2f8714 100644 --- a/src/music.cpp +++ b/src/music.cpp @@ -25,7 +25,7 @@ * @return Pointer to string, caller is responsible for freeing memory, * nullptr if entrynum does not exist. */ -char *GetMusicCatEntryName(const char *filename, size_t entrynum) +char *GetMusicCatEntryName(const std::string &filename, size_t entrynum) { if (!FioCheckFileExists(filename, BASESET_DIR)) return nullptr; @@ -52,7 +52,7 @@ char *GetMusicCatEntryName(const char *filename, size_t entrynum) * @return Pointer to buffer with data read, caller is responsible for freeind memory, * nullptr if entrynum does not exist. */ -byte *GetMusicCatEntryData(const char *filename, size_t entrynum, size_t &entrylen) +byte *GetMusicCatEntryData(const std::string &filename, size_t entrynum, size_t &entrylen) { entrylen = 0; if (!FioCheckFileExists(filename, BASESET_DIR)) return nullptr; @@ -116,7 +116,7 @@ template return BaseMedia::used_set != nullptr; } -bool MusicSet::FillSetDetails(IniFile *ini, const char *path, const char *full_filename) +bool MusicSet::FillSetDetails(IniFile *ini, const std::string &path, const std::string &full_filename) { bool ret = this->BaseSet::FillSetDetails(ini, path, full_filename); if (ret) { @@ -126,8 +126,8 @@ bool MusicSet::FillSetDetails(IniFile *ini, const char *path, const char *full_f IniGroup *timingtrim = ini->GetGroup("timingtrim"); uint tracknr = 1; for (uint i = 0; i < lengthof(this->songinfo); i++) { - const char *filename = this->files[i].filename; - if (names == nullptr || StrEmpty(filename) || this->files[i].check_result == MD5File::CR_NO_FILE) { + const std::string &filename = this->files[i].filename; + if (filename.empty() || this->files[i].check_result == MD5File::CR_NO_FILE) { continue; } @@ -140,7 +140,7 @@ bool MusicSet::FillSetDetails(IniFile *ini, const char *path, const char *full_f this->songinfo[i].cat_index = atoi(item->value->c_str()); char *songname = GetMusicCatEntryName(filename, this->songinfo[i].cat_index); if (songname == nullptr) { - DEBUG(grf, 0, "Base music set song missing from CAT file: %s/%d", filename, this->songinfo[i].cat_index); + DEBUG(grf, 0, "Base music set song missing from CAT file: %s/%d", filename.c_str(), this->songinfo[i].cat_index); continue; } this->songinfo[i].songname = songname; @@ -149,7 +149,7 @@ bool MusicSet::FillSetDetails(IniFile *ini, const char *path, const char *full_f this->songinfo[i].filetype = MTT_STANDARDMIDI; } - const char *trimmed_filename = filename; + const char *trimmed_filename = filename.c_str(); /* As we possibly add a path to the filename and we compare * on the filename with the path as in the .obm, we need to * keep stripping path elements until we find a match. */ @@ -166,7 +166,7 @@ bool MusicSet::FillSetDetails(IniFile *ini, const char *path, const char *full_f if (item != nullptr && item->value.has_value() && !item->value->empty()) { this->songinfo[i].songname = item->value.value(); } else { - DEBUG(grf, 0, "Base music set song name missing: %s", filename); + DEBUG(grf, 0, "Base music set song name missing: %s", filename.c_str()); return false; } } diff --git a/src/music/midifile.cpp b/src/music/midifile.cpp index 2932df2107..82ce019ca3 100644 --- a/src/music/midifile.cpp +++ b/src/music/midifile.cpp @@ -849,7 +849,7 @@ bool MidiFile::LoadSong(const MusicSongInfo &song) { switch (song.filetype) { case MTT_STANDARDMIDI: - return this->LoadFile(song.filename); + return this->LoadFile(song.filename.c_str()); case MTT_MPSMIDI: { size_t songdatalen = 0; @@ -1060,9 +1060,9 @@ std::string MidiFile::GetSMFFile(const MusicSongInfo &song) char basename[MAX_PATH]; { - const char *fnstart = strrchr(song.filename, PATHSEPCHAR); + const char *fnstart = strrchr(song.filename.c_str(), PATHSEPCHAR); if (fnstart == nullptr) { - fnstart = song.filename; + fnstart = song.filename.c_str(); } else { fnstart++; } diff --git a/src/settings_gui.cpp b/src/settings_gui.cpp index 3d5d66eb0a..60b4462110 100644 --- a/src/settings_gui.cpp +++ b/src/settings_gui.cpp @@ -325,7 +325,6 @@ struct GameOptionsWindow : Window { case WID_GO_BASE_SFX_DROPDOWN: SetDParamStr(0, BaseSounds::GetUsedSet()->name); break; case WID_GO_BASE_MUSIC_DROPDOWN: SetDParamStr(0, BaseMusic::GetUsedSet()->name); break; case WID_GO_BASE_MUSIC_STATUS: SetDParam(0, BaseMusic::GetUsedSet()->GetNumInvalid()); break; - case WID_GO_VIDEO_DRIVER_INFO: SetDParamStr(0, VideoDriver::GetInstance()->GetInfoString()); break; case WID_GO_REFRESH_RATE_DROPDOWN: SetDParam(0, _settings_client.gui.refresh_rate); break; case WID_GO_RESOLUTION_DROPDOWN: { auto current_resolution = GetCurrentResolutionIndex(); @@ -364,6 +363,11 @@ struct GameOptionsWindow : Window { DrawSliderWidget(r, MIN_INTERFACE_SCALE, MAX_INTERFACE_SCALE, this->gui_scale, _scale_labels); break; + case WID_GO_VIDEO_DRIVER_INFO: + SetDParamStr(0, VideoDriver::GetInstance()->GetInfoString()); + DrawStringMultiLine(r, STR_GAME_OPTIONS_VIDEO_DRIVER_INFO); + break; + case WID_GO_BASE_SFX_VOLUME: DrawSliderWidget(r, 0, INT8_MAX, _settings_client.music.effect_vol, {}); break; @@ -374,17 +378,45 @@ struct GameOptionsWindow : Window { } } + void OnResize() override + { + bool changed = false; + + NWidgetResizeBase *wid = this->GetWidget(WID_GO_BASE_GRF_DESCRIPTION); + int y = 0; + for (int i = 0; i < BaseGraphics::GetNumSets(); i++) { + SetDParamStr(0, BaseGraphics::GetSet(i)->GetDescription(GetCurrentLanguageIsoCode())); + y = std::max(y, GetStringHeight(STR_BLACK_RAW_STRING, wid->current_x)); + } + changed |= wid->UpdateVerticalSize(y); + + wid = this->GetWidget(WID_GO_BASE_SFX_DESCRIPTION); + y = 0; + for (int i = 0; i < BaseSounds::GetNumSets(); i++) { + SetDParamStr(0, BaseSounds::GetSet(i)->GetDescription(GetCurrentLanguageIsoCode())); + y = std::max(y, GetStringHeight(STR_BLACK_RAW_STRING, wid->current_x)); + } + changed |= wid->UpdateVerticalSize(y); + + wid = this->GetWidget(WID_GO_BASE_MUSIC_DESCRIPTION); + y = 0; + for (int i = 0; i < BaseMusic::GetNumSets(); i++) { + SetDParamStr(0, BaseMusic::GetSet(i)->GetDescription(GetCurrentLanguageIsoCode())); + y = std::max(y, GetStringHeight(STR_BLACK_RAW_STRING, wid->current_x)); + } + changed |= wid->UpdateVerticalSize(y); + + wid = this->GetWidget(WID_GO_VIDEO_DRIVER_INFO); + SetDParamStr(0, VideoDriver::GetInstance()->GetInfoString()); + y = GetStringHeight(STR_GAME_OPTIONS_VIDEO_DRIVER_INFO, wid->current_x); + changed |= wid->UpdateVerticalSize(y); + + if (changed) this->ReInit(0, 0, true); + } + void UpdateWidgetSize(int widget, Dimension *size, const Dimension &padding, Dimension *fill, Dimension *resize) override { switch (widget) { - case WID_GO_BASE_GRF_DESCRIPTION: - /* Find the biggest description for the default size. */ - for (int i = 0; i < BaseGraphics::GetNumSets(); i++) { - SetDParamStr(0, BaseGraphics::GetSet(i)->GetDescription(GetCurrentLanguageIsoCode())); - size->height = std::max(size->height, (uint)GetStringHeight(STR_BLACK_RAW_STRING, size->width)); - } - break; - case WID_GO_BASE_GRF_STATUS: /* Find the biggest description for the default size. */ for (int i = 0; i < BaseGraphics::GetNumSets(); i++) { @@ -396,22 +428,6 @@ struct GameOptionsWindow : Window { } break; - case WID_GO_BASE_SFX_DESCRIPTION: - /* Find the biggest description for the default size. */ - for (int i = 0; i < BaseSounds::GetNumSets(); i++) { - SetDParamStr(0, BaseSounds::GetSet(i)->GetDescription(GetCurrentLanguageIsoCode())); - size->height = std::max(size->height, (uint)GetStringHeight(STR_BLACK_RAW_STRING, size->width)); - } - break; - - case WID_GO_BASE_MUSIC_DESCRIPTION: - /* Find the biggest description for the default size. */ - for (int i = 0; i < BaseMusic::GetNumSets(); i++) { - SetDParamStr(0, BaseMusic::GetSet(i)->GetDescription(GetCurrentLanguageIsoCode())); - size->height = std::max(size->height, (uint)GetStringHeight(STR_BLACK_RAW_STRING, size->width)); - } - break; - case WID_GO_BASE_MUSIC_STATUS: /* Find the biggest description for the default size. */ for (int i = 0; i < BaseMusic::GetNumSets(); i++) { @@ -793,7 +809,7 @@ static const NWidgetPart _nested_game_options_widgets[] = { EndContainer(), #endif NWidget(NWID_HORIZONTAL), - NWidget(WWT_TEXT, COLOUR_GREY, WID_GO_VIDEO_DRIVER_INFO), SetMinimalSize(0, 12), SetFill(1, 0), SetDataTip(STR_GAME_OPTIONS_VIDEO_DRIVER_INFO, STR_NULL), + NWidget(WWT_EMPTY, INVALID_COLOUR, WID_GO_VIDEO_DRIVER_INFO), SetMinimalTextLines(1, 0), SetFill(1, 0), EndContainer(), EndContainer(), EndContainer(), @@ -804,7 +820,7 @@ static const NWidgetPart _nested_game_options_widgets[] = { NWidget(WWT_DROPDOWN, COLOUR_GREY, WID_GO_BASE_GRF_DROPDOWN), SetMinimalSize(150, 12), SetDataTip(STR_BLACK_RAW_STRING, STR_GAME_OPTIONS_BASE_GRF_TOOLTIP), NWidget(WWT_TEXT, COLOUR_GREY, WID_GO_BASE_GRF_STATUS), SetMinimalSize(150, 12), SetDataTip(STR_EMPTY, STR_NULL), SetFill(1, 0), EndContainer(), - NWidget(WWT_TEXT, COLOUR_GREY, WID_GO_BASE_GRF_DESCRIPTION), SetMinimalSize(330, 0), SetDataTip(STR_EMPTY, STR_GAME_OPTIONS_BASE_GRF_DESCRIPTION_TOOLTIP), SetFill(1, 0), SetPadding(6, 0, 6, 0), + NWidget(WWT_EMPTY, INVALID_COLOUR, WID_GO_BASE_GRF_DESCRIPTION), SetMinimalSize(330, 0), SetMinimalTextLines(1, 0), SetDataTip(STR_NULL, STR_GAME_OPTIONS_BASE_GRF_DESCRIPTION_TOOLTIP), SetFill(1, 0), SetPadding(6, 0, 6, 0), NWidget(NWID_HORIZONTAL, NC_EQUALSIZE), SetPIP(7, 0, 7), NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_GO_BASE_GRF_TEXTFILE + TFT_README), SetFill(1, 0), SetResize(1, 0), SetDataTip(STR_TEXTFILE_VIEW_README, STR_NULL), NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_GO_BASE_GRF_TEXTFILE + TFT_CHANGELOG), SetFill(1, 0), SetResize(1, 0), SetDataTip(STR_TEXTFILE_VIEW_CHANGELOG, STR_NULL), @@ -818,7 +834,7 @@ static const NWidgetPart _nested_game_options_widgets[] = { NWidget(NWID_SPACER), SetMinimalSize(150, 12), SetFill(1, 0), NWidget(WWT_EMPTY, COLOUR_GREY, WID_GO_BASE_SFX_VOLUME), SetMinimalSize(67, 12), SetFill(0, 0), SetDataTip(0x0, STR_MUSIC_TOOLTIP_DRAG_SLIDERS_TO_SET_MUSIC), EndContainer(), - NWidget(WWT_TEXT, COLOUR_GREY, WID_GO_BASE_SFX_DESCRIPTION), SetMinimalSize(330, 0), SetDataTip(STR_EMPTY, STR_GAME_OPTIONS_BASE_SFX_DESCRIPTION_TOOLTIP), SetFill(1, 0), SetPadding(6, 0, 6, 0), + NWidget(WWT_EMPTY, INVALID_COLOUR, WID_GO_BASE_SFX_DESCRIPTION), SetMinimalSize(330, 0), SetMinimalTextLines(1, 0), SetDataTip(STR_NULL, STR_GAME_OPTIONS_BASE_SFX_DESCRIPTION_TOOLTIP), SetFill(1, 0), SetPadding(6, 0, 6, 0), NWidget(NWID_HORIZONTAL, NC_EQUALSIZE), SetPIP(7, 0, 7), NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_GO_BASE_SFX_TEXTFILE + TFT_README), SetFill(1, 0), SetResize(1, 0), SetDataTip(STR_TEXTFILE_VIEW_README, STR_NULL), NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_GO_BASE_SFX_TEXTFILE + TFT_CHANGELOG), SetFill(1, 0), SetResize(1, 0), SetDataTip(STR_TEXTFILE_VIEW_CHANGELOG, STR_NULL), @@ -833,7 +849,7 @@ static const NWidgetPart _nested_game_options_widgets[] = { NWidget(WWT_EMPTY, COLOUR_GREY, WID_GO_BASE_MUSIC_VOLUME), SetMinimalSize(67, 12), SetFill(0, 0), SetDataTip(0x0, STR_MUSIC_TOOLTIP_DRAG_SLIDERS_TO_SET_MUSIC), EndContainer(), NWidget(NWID_HORIZONTAL), SetPIP(0, 30, 7), - NWidget(WWT_TEXT, COLOUR_GREY, WID_GO_BASE_MUSIC_DESCRIPTION), SetMinimalSize(330, 0), SetDataTip(STR_EMPTY, STR_GAME_OPTIONS_BASE_MUSIC_DESCRIPTION_TOOLTIP), SetFill(1, 0), SetPadding(6, 0, 6, 0), + NWidget(WWT_EMPTY, INVALID_COLOUR, WID_GO_BASE_MUSIC_DESCRIPTION), SetMinimalSize(330, 0), SetMinimalTextLines(1, 0), SetDataTip(STR_NULL, STR_GAME_OPTIONS_BASE_MUSIC_DESCRIPTION_TOOLTIP), SetFill(1, 0), SetPadding(6, 0, 6, 0), NWidget(NWID_VERTICAL), SetPIP(0, 0, 0), NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, WID_GO_BASE_MUSIC_JUKEBOX), SetMinimalSize(22, 22), SetDataTip(SPR_IMG_MUSIC, STR_TOOLBAR_TOOLTIP_SHOW_SOUND_MUSIC_WINDOW), SetPadding(6, 0, 6, 0), EndContainer(), diff --git a/src/sound.cpp b/src/sound.cpp index b5d77949aa..7ae7f8dd8b 100644 --- a/src/sound.cpp +++ b/src/sound.cpp @@ -23,7 +23,7 @@ static SoundEntry _original_sounds[ORIGINAL_SAMPLE_COUNT]; -static void OpenBankFile(const char *filename) +static void OpenBankFile(const std::string &filename) { /** * The sound file for the original sounds, i.e. those not defined/overridden by a NewGRF. @@ -34,7 +34,7 @@ static void OpenBankFile(const char *filename) memset(_original_sounds, 0, sizeof(_original_sounds)); /* If there is no sound file (nosound set), don't load anything */ - if (filename == nullptr) return; + if (filename.empty()) return; original_sound_file.reset(new RandomAccessFile(filename, BASESET_DIR)); size_t pos = original_sound_file->GetPos(); @@ -50,7 +50,7 @@ static void OpenBankFile(const char *filename) /* Corrupt sample data? Just leave the allocated memory as those tell * there is no sound to play (size = 0 due to calloc). Not allocating * the memory disables valid NewGRFs that replace sounds. */ - DEBUG(sound, 6, "Incorrect number of sounds in '%s', ignoring.", filename); + DEBUG(sound, 6, "Incorrect number of sounds in '%s', ignoring.", filename.c_str()); return; } diff --git a/src/tgp.cpp b/src/tgp.cpp index d4f2ab4280..e4bc850f57 100644 --- a/src/tgp.cpp +++ b/src/tgp.cpp @@ -151,17 +151,17 @@ */ /** Fixed point type for heights */ -typedef int16 height_t; +using Height = int16; static const int height_decimal_bits = 4; /** Fixed point array for amplitudes (and percent values) */ -typedef int amplitude_t; +using Amplitude = int; static const int amplitude_decimal_bits = 10; /** Height map - allocated array of heights (MapSizeX() + 1) x (MapSizeY() + 1) */ struct HeightMap { - std::vector h; //< array of heights + std::vector h; //< array of heights /* Even though the sizes are always positive, there are many cases where * X and Y need to be signed integers due to subtractions. */ int dim_x; //< height map size_x MapSizeX() + 1 @@ -174,7 +174,7 @@ struct HeightMap * @param y Y position * @return height as fixed point number */ - inline height_t &height(uint x, uint y) + inline Height &height(uint x, uint y) { return h[x + y * dim_x]; } @@ -183,24 +183,24 @@ struct HeightMap /** Global height map instance */ static HeightMap _height_map = { {}, 0, 0, 0 }; -/** Conversion: int to height_t */ +/** Conversion: int to Height */ #define I2H(i) ((i) << height_decimal_bits) -/** Conversion: height_t to int */ +/** Conversion: Height to int */ #define H2I(i) ((i) >> height_decimal_bits) -/** Conversion: int to amplitude_t */ +/** Conversion: int to Amplitude */ #define I2A(i) ((i) << amplitude_decimal_bits) -/** Conversion: amplitude_t to int */ +/** Conversion: Amplitude to int */ #define A2I(i) ((i) >> amplitude_decimal_bits) -/** Conversion: amplitude_t to height_t */ +/** Conversion: Amplitude to Height */ #define A2H(a) ((a) >> (amplitude_decimal_bits - height_decimal_bits)) /** Maximum number of TGP noise frequencies. */ static const int MAX_TGP_FREQUENCIES = 10; /** Desired water percentage (100% == 1024) - indexed by _settings_game.difficulty.quantity_sea_lakes */ -static const amplitude_t _water_percent[4] = {70, 170, 270, 420}; +static const Amplitude _water_percent[4] = {70, 170, 270, 420}; /** * Gets the maximum allowed height while generating a map based on @@ -208,7 +208,7 @@ static const amplitude_t _water_percent[4] = {70, 170, 270, 420}; * @return The maximum height for the map generation. * @note Values should never be lower than 3 since the minimum snowline height is 2. */ -static height_t TGPGetMaxHeight() +static Height TGPGetMaxHeight() { if (_settings_game.difficulty.terrain_type == CUSTOM_TERRAIN_TYPE_NUMBER_DIFFICULTY) { /* TGP never reaches this height; this means that if a user inputs "2", @@ -262,10 +262,10 @@ uint GetEstimationTGPMapHeight() * @param frequency The frequency to get the amplitudes for * @return The amplitudes to apply to the map. */ -static amplitude_t GetAmplitude(int frequency) +static Amplitude GetAmplitude(int frequency) { /* Base noise amplitudes (multiplied by 1024) and indexed by "smoothness setting" and log2(frequency). */ - static const amplitude_t amplitudes[][7] = { + static const Amplitude amplitudes[][7] = { /* lowest frequency ...... highest (every corner) */ {16000, 5600, 1968, 688, 240, 16, 16}, ///< Very smooth {24000, 12800, 6400, 2700, 1024, 128, 16}, ///< Smooth @@ -288,14 +288,14 @@ static amplitude_t GetAmplitude(int frequency) /* Get the table index, and return that value if possible. */ int index = frequency - MAX_TGP_FREQUENCIES + lengthof(amplitudes[smoothness]); - amplitude_t amplitude = amplitudes[smoothness][std::max(0, index)]; + Amplitude amplitude = amplitudes[smoothness][std::max(0, index)]; if (index >= 0) return amplitude; /* We need to extrapolate the amplitude. */ double extrapolation_factor = extrapolation_factors[smoothness]; int height_range = I2H(16); do { - amplitude = (amplitude_t)(extrapolation_factor * (double)amplitude); + amplitude = (Amplitude)(extrapolation_factor * (double)amplitude); height_range <<= 1; index++; } while (index < 0); @@ -345,7 +345,7 @@ static inline void FreeHeightMap() * @param rMax Limit of result * @return generated height */ -static inline height_t RandomHeight(amplitude_t rMax) +static inline Height RandomHeight(Amplitude rMax) { /* Spread height into range -rMax..+rMax */ return A2H(RandomRange(2 * rMax + 1) - rMax); @@ -367,7 +367,7 @@ static void HeightMapGenerate() bool first = true; for (int frequency = start; frequency < MAX_TGP_FREQUENCIES; frequency++) { - const amplitude_t amplitude = GetAmplitude(frequency); + const Amplitude amplitude = GetAmplitude(frequency); /* Ignore zero amplitudes; it means our map isn't height enough for this * amplitude, so ignore it and continue with the next set of amplitude. */ @@ -379,7 +379,7 @@ static void HeightMapGenerate() /* This is first round, we need to establish base heights with step = size_min */ for (int y = 0; y <= _height_map.size_y; y += step) { for (int x = 0; x <= _height_map.size_x; x += step) { - height_t height = (amplitude > 0) ? RandomHeight(amplitude) : 0; + Height height = (amplitude > 0) ? RandomHeight(amplitude) : 0; _height_map.height(x, y) = height; } } @@ -391,9 +391,9 @@ static void HeightMapGenerate() * Interpolate height values at odd x, even y tiles */ for (int y = 0; y <= _height_map.size_y; y += 2 * step) { for (int x = 0; x <= _height_map.size_x - 2 * step; x += 2 * step) { - height_t h00 = _height_map.height(x + 0 * step, y); - height_t h02 = _height_map.height(x + 2 * step, y); - height_t h01 = (h00 + h02) / 2; + Height h00 = _height_map.height(x + 0 * step, y); + Height h02 = _height_map.height(x + 2 * step, y); + Height h01 = (h00 + h02) / 2; _height_map.height(x + 1 * step, y) = h01; } } @@ -401,9 +401,9 @@ static void HeightMapGenerate() /* Interpolate height values at odd y tiles */ for (int y = 0; y <= _height_map.size_y - 2 * step; y += 2 * step) { for (int x = 0; x <= _height_map.size_x; x += step) { - height_t h00 = _height_map.height(x, y + 0 * step); - height_t h20 = _height_map.height(x, y + 2 * step); - height_t h10 = (h00 + h20) / 2; + Height h00 = _height_map.height(x, y + 0 * step); + Height h20 = _height_map.height(x, y + 2 * step); + Height h10 = (h00 + h20) / 2; _height_map.height(x, y + 1 * step) = h10; } } @@ -418,21 +418,21 @@ static void HeightMapGenerate() } /** Returns min, max and average height from height map */ -static void HeightMapGetMinMaxAvg(height_t *min_ptr, height_t *max_ptr, height_t *avg_ptr) +static void HeightMapGetMinMaxAvg(Height *min_ptr, Height *max_ptr, Height *avg_ptr) { - height_t h_min, h_max, h_avg; + Height h_min, h_max, h_avg; int64 h_accu = 0; h_min = h_max = _height_map.height(0, 0); /* Get h_min, h_max and accumulate heights into h_accu */ - for (const height_t &h : _height_map.h) { + for (const Height &h : _height_map.h) { if (h < h_min) h_min = h; if (h > h_max) h_max = h; h_accu += h; } /* Get average height */ - h_avg = (height_t)(h_accu / (_height_map.size_x * _height_map.size_y)); + h_avg = (Height)(h_accu / (_height_map.size_x * _height_map.size_y)); /* Return required results */ if (min_ptr != nullptr) *min_ptr = h_min; @@ -441,12 +441,12 @@ static void HeightMapGetMinMaxAvg(height_t *min_ptr, height_t *max_ptr, height_t } /** Dill histogram and return pointer to its base point - to the count of zero heights */ -static int *HeightMapMakeHistogram(height_t h_min, height_t h_max, int *hist_buf) +static int *HeightMapMakeHistogram(Height h_min, Height h_max, int *hist_buf) { int *hist = hist_buf - h_min; /* Count the heights and fill the histogram */ - for (const height_t &h : _height_map.h){ + for (const Height &h : _height_map.h){ assert(h >= h_min); assert(h <= h_max); hist[h]++; @@ -455,9 +455,9 @@ static int *HeightMapMakeHistogram(height_t h_min, height_t h_max, int *hist_buf } /** Applies sine wave redistribution onto height map */ -static void HeightMapSineTransform(height_t h_min, height_t h_max) +static void HeightMapSineTransform(Height h_min, Height h_max) { - for (height_t &h : _height_map.h) { + for (Height &h : _height_map.h) { double fheight; if (h < h_min) continue; @@ -523,7 +523,7 @@ static void HeightMapSineTransform(height_t h_min, height_t h_max) break; } /* Transform it back into h_min..h_max space */ - h = (height_t)(fheight * (h_max - h_min) + h_min); + h = (Height)(fheight * (h_max - h_min) + h_min); if (h < 0) h = I2H(0); if (h >= h_max) h = h_max - 1; } @@ -547,34 +547,34 @@ static void HeightMapSineTransform(height_t h_min, height_t h_max) */ static void HeightMapCurves(uint level) { - height_t mh = TGPGetMaxHeight() - I2H(1); // height levels above sea level only + Height mh = TGPGetMaxHeight() - I2H(1); // height levels above sea level only /** Basically scale height X to height Y. Everything in between is interpolated. */ - struct control_point_t { - height_t x; ///< The height to scale from. - height_t y; ///< The height to scale to. + struct ControlPoint { + Height x; ///< The height to scale from. + Height y; ///< The height to scale to. }; /* Scaled curve maps; value is in height_ts. */ -#define F(fraction) ((height_t)(fraction * mh)) - const control_point_t curve_map_1[] = { { F(0.0), F(0.0) }, { F(0.8), F(0.13) }, { F(1.0), F(0.4) } }; - const control_point_t curve_map_2[] = { { F(0.0), F(0.0) }, { F(0.53), F(0.13) }, { F(0.8), F(0.27) }, { F(1.0), F(0.6) } }; - const control_point_t curve_map_3[] = { { F(0.0), F(0.0) }, { F(0.53), F(0.27) }, { F(0.8), F(0.57) }, { F(1.0), F(0.8) } }; - const control_point_t curve_map_4[] = { { F(0.0), F(0.0) }, { F(0.4), F(0.3) }, { F(0.7), F(0.8) }, { F(0.92), F(0.99) }, { F(1.0), F(0.99) } }; +#define F(fraction) ((Height)(fraction * mh)) + const ControlPoint curve_map_1[] = { { F(0.0), F(0.0) }, { F(0.8), F(0.13) }, { F(1.0), F(0.4) } }; + const ControlPoint curve_map_2[] = { { F(0.0), F(0.0) }, { F(0.53), F(0.13) }, { F(0.8), F(0.27) }, { F(1.0), F(0.6) } }; + const ControlPoint curve_map_3[] = { { F(0.0), F(0.0) }, { F(0.53), F(0.27) }, { F(0.8), F(0.57) }, { F(1.0), F(0.8) } }; + const ControlPoint curve_map_4[] = { { F(0.0), F(0.0) }, { F(0.4), F(0.3) }, { F(0.7), F(0.8) }, { F(0.92), F(0.99) }, { F(1.0), F(0.99) } }; #undef F /** Helper structure to index the different curve maps. */ - struct control_point_list_t { - size_t length; ///< The length of the curve map. - const control_point_t *list; ///< The actual curve map. + struct ControlPointList { + size_t length; ///< The length of the curve map. + const ControlPoint *list; ///< The actual curve map. }; - const control_point_list_t curve_maps[] = { + static const ControlPointList curve_maps[] = { { lengthof(curve_map_1), curve_map_1 }, { lengthof(curve_map_2), curve_map_2 }, { lengthof(curve_map_3), curve_map_3 }, { lengthof(curve_map_4), curve_map_4 }, }; - height_t ht[lengthof(curve_maps)]; + Height ht[lengthof(curve_maps)]; MemSetT(ht, 0, lengthof(ht)); /* Set up a grid to choose curve maps based on location; attempt to get a somewhat square grid */ @@ -635,7 +635,7 @@ static void HeightMapCurves(uint level) corner_bits |= 1 << corner_c; corner_bits |= 1 << corner_d; - height_t *h = &_height_map.height(x, y); + Height *h = &_height_map.height(x, y); /* Do not touch sea level */ if (*h < I2H(1)) continue; @@ -648,10 +648,10 @@ static void HeightMapCurves(uint level) if (!HasBit(corner_bits, t)) continue; [[maybe_unused]] bool found = false; - const control_point_t *cm = curve_maps[t].list; + const ControlPoint *cm = curve_maps[t].list; for (uint i = 0; i < curve_maps[t].length - 1; i++) { - const control_point_t &p1 = cm[i]; - const control_point_t &p2 = cm[i + 1]; + const ControlPoint &p1 = cm[i]; + const ControlPoint &p2 = cm[i + 1]; if (*h >= p1.x && *h < p2.x) { ht[t] = p1.y + (*h - p1.x) * (p2.y - p1.y) / (p2.x - p1.x); @@ -665,7 +665,7 @@ static void HeightMapCurves(uint level) } /* Apply interpolation of curve map results. */ - *h = (height_t)((ht[corner_a] * yri + ht[corner_b] * yr) * xri + (ht[corner_c] * yri + ht[corner_d] * yr) * xr); + *h = (Height)((ht[corner_a] * yri + ht[corner_b] * yr) * xri + (ht[corner_c] * yri + ht[corner_d] * yr) * xr); /* Readd sea level */ *h += I2H(1); @@ -674,9 +674,9 @@ static void HeightMapCurves(uint level) } /** Adjusts heights in height map to contain required amount of water tiles */ -static void HeightMapAdjustWaterLevel(amplitude_t water_percent, height_t h_max_new) +static void HeightMapAdjustWaterLevel(Amplitude water_percent, Height h_max_new) { - height_t h_min, h_max, h_avg, h_water_level; + Height h_min, h_max, h_avg, h_water_level; int64 water_tiles, desired_water_tiles; int *hist; @@ -702,9 +702,9 @@ static void HeightMapAdjustWaterLevel(amplitude_t water_percent, height_t h_max_ * values from range: h_water_level..h_max are transformed into 0..h_max_new * where h_max_new is depending on terrain type and map size. */ - for (height_t &h : _height_map.h) { + for (Height &h : _height_map.h) { /* Transform height from range h_water_level..h_max into 0..h_max_new range */ - h = (height_t)(((int)h_max_new) * (h - h_water_level) / (h_max - h_water_level)) + I2H(1); + h = (Height)(((int)h_max_new) * (h - h_water_level) / (h_max - h_water_level)) + I2H(1); /* Make sure all values are in the proper range (0..h_max_new) */ if (h < 0) h = I2H(0); if (h >= h_max_new) h = h_max_new - 1; @@ -800,8 +800,8 @@ static void HeightMapSmoothCoastInDirection(int org_x, int org_y, int dir_x, int int ed; // coast distance from edge int depth; - height_t h_prev = I2H(1); - height_t h; + Height h_prev = I2H(1); + Height h; assert(IsValidXY(org_x, org_y)); @@ -850,17 +850,17 @@ static void HeightMapSmoothCoasts(uint8 water_borders) * the most it can change is one level. When OTTD can support cliffs, this * routine may not be necessary. */ -static void HeightMapSmoothSlopes(height_t dh_max) +static void HeightMapSmoothSlopes(Height dh_max) { for (int y = 0; y <= (int)_height_map.size_y; y++) { for (int x = 0; x <= (int)_height_map.size_x; x++) { - height_t h_max = std::min(_height_map.height(x > 0 ? x - 1 : x, y), _height_map.height(x, y > 0 ? y - 1 : y)) + dh_max; + Height h_max = std::min(_height_map.height(x > 0 ? x - 1 : x, y), _height_map.height(x, y > 0 ? y - 1 : y)) + dh_max; if (_height_map.height(x, y) > h_max) _height_map.height(x, y) = h_max; } } for (int y = _height_map.size_y; y >= 0; y--) { for (int x = _height_map.size_x; x >= 0; x--) { - height_t h_max = std::min(_height_map.height(x < _height_map.size_x ? x + 1 : x, y), _height_map.height(x, y < _height_map.size_y ? y + 1 : y)) + dh_max; + Height h_max = std::min(_height_map.height(x < _height_map.size_x ? x + 1 : x, y), _height_map.height(x, y < _height_map.size_y ? y + 1 : y)) + dh_max; if (_height_map.height(x, y) > h_max) _height_map.height(x, y) = h_max; } } @@ -876,9 +876,9 @@ static void HeightMapSmoothSlopes(height_t dh_max) static void HeightMapNormalize() { int sea_level_setting = _settings_game.difficulty.quantity_sea_lakes; - const amplitude_t water_percent = sea_level_setting != (int)CUSTOM_SEA_LEVEL_NUMBER_DIFFICULTY ? _water_percent[sea_level_setting] : _settings_game.game_creation.custom_sea_level * 1024 / 100; - const height_t h_max_new = TGPGetMaxHeight(); - const height_t roughness = 7 + 3 * _settings_game.game_creation.tgen_smoothness; + const Amplitude water_percent = sea_level_setting != (int)CUSTOM_SEA_LEVEL_NUMBER_DIFFICULTY ? _water_percent[sea_level_setting] : _settings_game.game_creation.custom_sea_level * 1024 / 100; + const Height h_max_new = TGPGetMaxHeight(); + const Height roughness = 7 + 3 * _settings_game.game_creation.tgen_smoothness; HeightMapAdjustWaterLevel(water_percent, h_max_new); diff --git a/src/widget.cpp b/src/widget.cpp index 966bc0125b..0e18ba276b 100644 --- a/src/widget.cpp +++ b/src/widget.cpp @@ -1133,6 +1133,18 @@ void NWidgetResizeBase::SetResize(uint resize_x, uint resize_y) this->resize_y = resize_y; } +/** + * Set absolute (post-scaling) minimal size of the widget. + * @param min_y Vertical minimal size of the widget. + * @return true iff the widget minimum size has changed. + */ +bool NWidgetResizeBase::UpdateVerticalSize(uint min_y) +{ + if (min_y == this->min_y) return false; + this->min_y = min_y; + return true; +} + void NWidgetResizeBase::AssignSizePosition(SizingType sizing, uint x, uint y, uint given_width, uint given_height, bool rtl) { this->StoreSizePosition(sizing, x, y, given_width, given_height); diff --git a/src/widget_type.h b/src/widget_type.h index 4c2059cf40..bdf89883b9 100644 --- a/src/widget_type.h +++ b/src/widget_type.h @@ -283,6 +283,8 @@ public: void SetFill(uint fill_x, uint fill_y); void SetResize(uint resize_x, uint resize_y); + bool UpdateVerticalSize(uint min_y); + void AssignSizePosition(SizingType sizing, uint x, uint y, uint given_width, uint given_height, bool rtl) override; uint min_x; ///< Minimal horizontal size of only this widget. diff --git a/src/window.cpp b/src/window.cpp index 128ad4cac8..5ee9b3d770 100644 --- a/src/window.cpp +++ b/src/window.cpp @@ -1028,9 +1028,10 @@ void Window::SetDirtyAsBlocks() * Re-initialize a window, and optionally change its size. * @param rx Horizontal resize of the window. * @param ry Vertical resize of the window. + * @param reposition If set, reposition the window to default location. * @note For just resizing the window, use #ResizeWindow instead. */ -void Window::ReInit(int rx, int ry) +void Window::ReInit(int rx, int ry, bool reposition) { this->SetDirtyAsBlocks(); // Mark whole current window as dirty. @@ -1057,6 +1058,12 @@ void Window::ReInit(int rx, int ry) if (this->resize.step_width > 1) dx -= dx % (int)this->resize.step_width; if (this->resize.step_height > 1) dy -= dy % (int)this->resize.step_height; + if (reposition) { + Point pt = this->OnInitialPosition(this->nested_root->smallest_x, this->nested_root->smallest_y, window_number); + this->InitializePositionSize(pt.x, pt.y, this->nested_root->smallest_x, this->nested_root->smallest_y); + this->FindWindowPlacementAndResize(this->window_desc->GetDefaultWidth(), this->window_desc->GetDefaultHeight()); + } + ResizeWindow(this, dx, dy); /* ResizeWindow() does this->SetDirty() already, no need to do it again here. */ } diff --git a/src/window_gui.h b/src/window_gui.h index 9f48c26086..ede6b5ef4c 100644 --- a/src/window_gui.h +++ b/src/window_gui.h @@ -521,7 +521,7 @@ public: void SetDirty(); void SetDirtyAsBlocks(); - void ReInit(int rx = 0, int ry = 0); + void ReInit(int rx = 0, int ry = 0, bool reposition = false); /** Is window shaded currently? */ inline bool IsShaded() const