Merge branch 'master' into jgrpp

# Conflicts:
#	src/base_media_func.h
#	src/cargopacket.h
#	src/gfxinit.cpp
#	src/industry_cmd.cpp
#	src/window_gui.h
pull/544/head
Jonathan G Rennison 1 year ago
commit b381a30d2d

@ -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_*/

@ -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;

@ -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:

@ -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<GraphicsSet, MAX_GFT, true> {
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<MusicSet, NUM_SONGS_AVAILABLE, false> {
/** 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 */

@ -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 <class T, size_t Tnum_files, bool Tsearch_in_tars>
bool BaseSet<T, Tnum_files, Tsearch_in_tars>::FillSetDetails(IniFile *ini, const char *path, const char *full_filename, bool allow_empty_filename)
bool BaseSet<T, Tnum_files, Tsearch_in_tars>::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<T, Tnum_files, Tsearch_in_tars>::FillSetDetails(IniFile *ini, const
/* Find the filename first. */
item = files->GetItem(BaseSet<T, Tnum_files, Tsearch_in_tars>::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<T, Tnum_files, Tsearch_in_tars>::file_names[i], full_filename);
DEBUG(grf, 0, "No " SET_TYPE " file for: %s (in %s)", BaseSet<T, Tnum_files, Tsearch_in_tars>::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<T, Tnum_files, Tsearch_in_tars>::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<T, Tnum_files, Tsearch_in_tars>::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<T, Tnum_files, Tsearch_in_tars>::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<Tbase_set>::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<Tbase_set>::available_sets; c != nullptr; c = c->next) {
if (c->name == set->name || c->shortname == set->shortname) {
@ -282,7 +282,7 @@ template <class Tbase_set> 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 <class Tbase_set> 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;
}

@ -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;

@ -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);

@ -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<mask_t>::type)m1 | (std::underlying_type<mask_t>::type)m2);} \
inline constexpr mask_t operator & (mask_t m1, mask_t m2) {return (mask_t)((std::underlying_type<mask_t>::type)m1 & (std::underlying_type<mask_t>::type)m2);} \
inline constexpr mask_t operator ^ (mask_t m1, mask_t m2) {return (mask_t)((std::underlying_type<mask_t>::type)m1 ^ (std::underlying_type<mask_t>::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<mask_t>::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<enum_type>::type)m1 | (std::underlying_type<enum_type>::type)m2);} \
inline constexpr enum_type operator & (enum_type m1, enum_type m2) {return (enum_type)((std::underlying_type<enum_type>::type)m1 & (std::underlying_type<enum_type>::type)m2);} \
inline constexpr enum_type operator ^ (enum_type m1, enum_type m2) {return (enum_type)((std::underlying_type<enum_type>::type)m1 ^ (std::underlying_type<enum_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<enum_type>::type)m);}
/**

@ -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.
*/

@ -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.

@ -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);

@ -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);

@ -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<GraphicsSet, MAX_GFT, true>::FillSetDetails(ini, path, full_filename, false);
if (ret) {

@ -21,6 +21,8 @@
typedef Pool<Industry, IndustryID, 64, 64000> 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

@ -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;
}
}

@ -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}

@ -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}

@ -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}

@ -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}

@ -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}

@ -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}

@ -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}

@ -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}

@ -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}

@ -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}

@ -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}

@ -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}

@ -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}

@ -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}

@ -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}

@ -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}

@ -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}

@ -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}

@ -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}

@ -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}

@ -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}

@ -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}

@ -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}

@ -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}

@ -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}

@ -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}

@ -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}

@ -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}

@ -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}

@ -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}

@ -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}

@ -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}

@ -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}

@ -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}

@ -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}

@ -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}

@ -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}

@ -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}

@ -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}

@ -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}

@ -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}

@ -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}

@ -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}

@ -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}

@ -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}

@ -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}

@ -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}

@ -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}

@ -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}

@ -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}

@ -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}

@ -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}

@ -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}

@ -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}

@ -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}

@ -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}

@ -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}

@ -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}

@ -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}

@ -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}

@ -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}

@ -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}

@ -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}

@ -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}

@ -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}

@ -25,7 +25,7 @@ template <typename T> struct ArrayT;
/** Helper template class that provides C array length and item type */
template <typename T, size_t N> struct ArrayT<T[N]> {
static const size_t length = N;
typedef T item_t;
using Item = T;
};
@ -34,7 +34,7 @@ template <typename T, size_t N> struct ArrayT<T[N]> {
* or t_unk when index is out of bounds.
*/
template <typename E, typename T>
inline typename ArrayT<T>::item_t ItemAtT(E idx, const T &t, typename ArrayT<T>::item_t t_unk)
inline typename ArrayT<T>::Item ItemAtT(E idx, const T &t, typename ArrayT<T>::Item t_unk)
{
if ((size_t)idx >= ArrayT<T>::length) {
return t_unk;
@ -48,7 +48,7 @@ inline typename ArrayT<T>::item_t ItemAtT(E idx, const T &t, typename ArrayT<T>:
* or t_unk when index is out of bounds.
*/
template <typename E, typename T>
inline typename ArrayT<T>::item_t ItemAtT(E idx, const T &t, typename ArrayT<T>::item_t t_unk, E idx_inv, typename ArrayT<T>::item_t t_inv)
inline typename ArrayT<T>::Item ItemAtT(E idx, const T &t, typename ArrayT<T>::Item t_unk, E idx_inv, typename ArrayT<T>::Item t_inv)
{
if ((size_t)idx < ArrayT<T>::length) {
return t[idx];

@ -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 <class Tbase_set>
return BaseMedia<Tbase_set>::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<MusicSet, NUM_SONGS_AVAILABLE, false>::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;
}
}

@ -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++;
}

@ -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<NWidgetResizeBase>(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<NWidgetResizeBase>(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<NWidgetResizeBase>(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<NWidgetResizeBase>(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(),

@ -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;
}

@ -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<height_t> h; //< array of heights
std::vector<Height> 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);

@ -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);

@ -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.

@ -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. */
}

@ -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

Loading…
Cancel
Save