diff --git a/media/baseset/orig_extra.grf b/media/baseset/orig_extra.grf index 9adc6e04f8..25193b8020 100644 Binary files a/media/baseset/orig_extra.grf and b/media/baseset/orig_extra.grf differ diff --git a/media/baseset/orig_extra.grf.hash b/media/baseset/orig_extra.grf.hash index 3d6fe3d451..6ca3b2ee0c 100644 --- a/media/baseset/orig_extra.grf.hash +++ b/media/baseset/orig_extra.grf.hash @@ -1 +1 @@ -3e860a0e880e3dc90615facf5f455fc6 +5fdc049a7a0ada4c280239f15bc38174 diff --git a/media/baseset/orig_extra/CMakeLists.txt b/media/baseset/orig_extra/CMakeLists.txt index ceae83ca70..997e309a16 100644 --- a/media/baseset/orig_extra/CMakeLists.txt +++ b/media/baseset/orig_extra/CMakeLists.txt @@ -10,6 +10,7 @@ if(GRFCODEC_FOUND) ${CMAKE_CURRENT_SOURCE_DIR}/rivers/rapids.nfo ${CMAKE_CURRENT_SOURCE_DIR}/rivers/temperate.nfo ${CMAKE_CURRENT_SOURCE_DIR}/rivers/toyland.nfo + ${CMAKE_CURRENT_SOURCE_DIR}/rivers/toyland_rapids.nfo ${CMAKE_CURRENT_SOURCE_DIR}/rivers/tropic.nfo ${CMAKE_CURRENT_SOURCE_DIR}/airports_orig_extra.nfo ${CMAKE_CURRENT_SOURCE_DIR}/canals_extra.nfo @@ -24,6 +25,8 @@ if(GRFCODEC_FOUND) ${CMAKE_CURRENT_SOURCE_DIR}/rivers/rapids_shading.png ${CMAKE_CURRENT_SOURCE_DIR}/rivers/temperate.png ${CMAKE_CURRENT_SOURCE_DIR}/rivers/toyland.png + ${CMAKE_CURRENT_SOURCE_DIR}/rivers/toyland_rapids.png + ${CMAKE_CURRENT_SOURCE_DIR}/rivers/toyland_rapids_shading.png ${CMAKE_CURRENT_SOURCE_DIR}/rivers/tropic_desert.png ${CMAKE_CURRENT_SOURCE_DIR}/rivers/tropic_forest.png ${CMAKE_CURRENT_SOURCE_DIR}/fix_graphics.png diff --git a/media/baseset/orig_extra/orig_extra.nfo b/media/baseset/orig_extra/orig_extra.nfo index e6ecca8a00..ad1c7b72fb 100644 --- a/media/baseset/orig_extra/orig_extra.nfo +++ b/media/baseset/orig_extra/orig_extra.nfo @@ -79,6 +79,7 @@ #include "airports_orig_extra.nfo" #include "canals_extra.nfo" #include "rivers/rapids.nfo" +#include "rivers/toyland_rapids.nfo" #include "rivers/temperate.nfo" #include "rivers/arctic.nfo" #include "rivers/tropic.nfo" diff --git a/media/baseset/orig_extra/rivers/toyland.nfo b/media/baseset/orig_extra/rivers/toyland.nfo index 8b6dedd386..41d6ff5666 100644 --- a/media/baseset/orig_extra/rivers/toyland.nfo +++ b/media/baseset/orig_extra/rivers/toyland.nfo @@ -3,7 +3,7 @@ // OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. // See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see . // - -1 * 0 0C "Toyland river graphics by andythenorth (Andrew Parkhouse)" + -1 * 0 0C "Toyland river graphics by zephyris (Richard Wheeler)" -1 * 4 01 05 01 3C -1 sprites/toyland.png 8bpp 10 10 38 19 -5 0 normal -1 sprites/toyland.png 8bpp 58 10 38 18 -5 13 normal diff --git a/media/baseset/orig_extra/rivers/toyland.png b/media/baseset/orig_extra/rivers/toyland.png index 61ff224301..80db3e2ab2 100644 Binary files a/media/baseset/orig_extra/rivers/toyland.png and b/media/baseset/orig_extra/rivers/toyland.png differ diff --git a/media/baseset/orig_extra/rivers/toyland_rapids.nfo b/media/baseset/orig_extra/rivers/toyland_rapids.nfo new file mode 100644 index 0000000000..fc61bcb239 --- /dev/null +++ b/media/baseset/orig_extra/rivers/toyland_rapids.nfo @@ -0,0 +1,73 @@ +// This file is part of OpenTTD. +// OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. +// OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see . +// + -1 * 0 0C "Toyland rapid graphics by zephyris (Richard Wheeler)" + -1 * 4 01 05 01 04 + -1 sprites/toyland_rapids.png 8bpp 10 10 64 23 -31 0 normal + | sprites/toyland_rapids_shading.png 32bpp 10 10 64 23 -31 0 normal + | sprites/toyland_rapids.png mask 10 10 + -1 sprites/toyland_rapids.png 8bpp 90 10 64 39 -31 -8 normal + | sprites/toyland_rapids_shading.png 32bpp 90 10 64 39 -31 -8 normal + | sprites/toyland_rapids.png mask 90 10 + -1 sprites/toyland_rapids.png 8bpp 170 10 64 23 -31 0 normal + | sprites/toyland_rapids_shading.png 32bpp 170 10 64 23 -31 0 normal + | sprites/toyland_rapids.png mask 170 10 + -1 sprites/toyland_rapids.png 8bpp 250 10 64 39 -31 -8 normal + | sprites/toyland_rapids_shading.png 32bpp 250 10 64 39 -31 -8 normal + | sprites/toyland_rapids.png mask 250 10 + -1 * 7 02 05 00 01 00 00 00 + + -1 * 4 01 05 01 04 + -1 sprites/toyland_rapids.png 8bpp 10 60 64 23 -31 0 normal + | sprites/toyland_rapids_shading.png 32bpp 10 60 64 23 -31 0 normal + | sprites/toyland_rapids.png mask 10 60 + -1 sprites/toyland_rapids.png 8bpp 90 60 64 39 -31 -8 normal + | sprites/toyland_rapids_shading.png 32bpp 90 60 64 39 -31 -8 normal + | sprites/toyland_rapids.png mask 90 60 + -1 sprites/toyland_rapids.png 8bpp 170 60 64 23 -31 0 normal + | sprites/toyland_rapids_shading.png 32bpp 170 60 64 23 -31 0 normal + | sprites/toyland_rapids.png mask 170 60 + -1 sprites/toyland_rapids.png 8bpp 250 60 64 39 -31 -8 normal + | sprites/toyland_rapids_shading.png 32bpp 250 60 64 39 -31 -8 normal + | sprites/toyland_rapids.png mask 250 60 + -1 * 7 02 05 01 01 00 00 00 + + -1 * 4 01 05 01 04 + -1 sprites/toyland_rapids.png 8bpp 10 110 64 23 -31 0 normal + | sprites/toyland_rapids_shading.png 32bpp 10 110 64 23 -31 0 normal + | sprites/toyland_rapids.png mask 10 110 + -1 sprites/toyland_rapids.png 8bpp 90 110 64 39 -31 -8 normal + | sprites/toyland_rapids_shading.png 32bpp 90 110 64 39 -31 -8 normal + | sprites/toyland_rapids.png mask 90 110 + -1 sprites/toyland_rapids.png 8bpp 170 110 64 23 -31 0 normal + | sprites/toyland_rapids_shading.png 32bpp 170 110 64 23 -31 0 normal + | sprites/toyland_rapids.png mask 170 110 + -1 sprites/toyland_rapids.png 8bpp 250 110 64 39 -31 -8 normal + | sprites/toyland_rapids_shading.png 32bpp 250 110 64 39 -31 -8 normal + | sprites/toyland_rapids.png mask 250 110 + -1 * 7 02 05 02 01 00 00 00 + + -1 * 4 01 05 01 04 + -1 sprites/toyland_rapids.png 8bpp 10 160 64 23 -31 0 normal + | sprites/toyland_rapids_shading.png 32bpp 10 160 64 23 -31 0 normal + | sprites/toyland_rapids.png mask 10 160 + -1 sprites/toyland_rapids.png 8bpp 90 160 64 39 -31 -8 normal + | sprites/toyland_rapids_shading.png 32bpp 90 160 64 39 -31 -8 normal + | sprites/toyland_rapids.png mask 90 160 + -1 sprites/toyland_rapids.png 8bpp 170 160 64 23 -31 0 normal + | sprites/toyland_rapids_shading.png 32bpp 170 160 64 23 -31 0 normal + | sprites/toyland_rapids.png mask 170 160 + -1 sprites/toyland_rapids.png 8bpp 250 160 64 39 -31 -8 normal + | sprites/toyland_rapids_shading.png 32bpp 250 160 64 39 -31 -8 normal + | sprites/toyland_rapids.png mask 250 160 + -1 * 7 02 05 03 01 00 00 00 + + -1 * 39 02 05 10 80 00 01 04 + 00 00 + 01 00 + 02 00 + 03 00 + -1 * 6 07 83 01 \7! 03 01 + -1 * 7 03 05 01 05 00 10 00 diff --git a/media/baseset/orig_extra/rivers/toyland_rapids.png b/media/baseset/orig_extra/rivers/toyland_rapids.png new file mode 100644 index 0000000000..7216b1b448 Binary files /dev/null and b/media/baseset/orig_extra/rivers/toyland_rapids.png differ diff --git a/media/baseset/orig_extra/rivers/toyland_rapids_shading.png b/media/baseset/orig_extra/rivers/toyland_rapids_shading.png new file mode 100644 index 0000000000..946a0ef090 Binary files /dev/null and b/media/baseset/orig_extra/rivers/toyland_rapids_shading.png differ diff --git a/src/3rdparty/squirrel/sqstdlib/sqstdmath.cpp b/src/3rdparty/squirrel/sqstdlib/sqstdmath.cpp index 3ba6811a6c..7f07271f20 100644 --- a/src/3rdparty/squirrel/sqstdlib/sqstdmath.cpp +++ b/src/3rdparty/squirrel/sqstdlib/sqstdmath.cpp @@ -84,7 +84,7 @@ static SQRegFunction mathlib_funcs[] = { _DECL_FUNC(exp,2,".n"), #ifdef EXPORT_DEFAULT_SQUIRREL_FUNCTIONS _DECL_FUNC(srand,2,".n"), - _DECL_FUNC(rand,1,NULL), + _DECL_FUNC(rand,1,nullptr), #endif /* EXPORT_DEFAULT_SQUIRREL_FUNCTIONS */ _DECL_FUNC(fabs,2,".n"), _DECL_FUNC(abs,2,".n"), diff --git a/src/3rdparty/squirrel/sqstdlib/sqstdrex.cpp b/src/3rdparty/squirrel/sqstdlib/sqstdrex.cpp index 2bc3684a5e..16e87b3d24 100644 --- a/src/3rdparty/squirrel/sqstdlib/sqstdrex.cpp +++ b/src/3rdparty/squirrel/sqstdlib/sqstdrex.cpp @@ -378,8 +378,8 @@ static const SQChar *sqstd_rex_matchnode(SQRex* exp,SQRexNode *node,const SQChar SQRexNodeType type = node->type; switch(type) { case OP_GREEDY: { - //SQRexNode *greedystop = (node->next != -1) ? &exp->_nodes[node->next] : NULL; - SQRexNode *greedystop = NULL; + //SQRexNode *greedystop = (node->next != -1) ? &exp->_nodes[node->next] : nullptr; + SQRexNode *greedystop = nullptr; SQInteger p0 = (node->right >> 16)&0x0000FFFF, p1 = node->right&0x0000FFFF, nmaches = 0; const SQChar *s=str, *good = str; @@ -403,7 +403,7 @@ static const SQChar *sqstd_rex_matchnode(SQRex* exp,SQRexNode *node,const SQChar if(greedystop->type != OP_GREEDY || (greedystop->type == OP_GREEDY && ((greedystop->right >> 16)&0x0000FFFF) != 0)) { - SQRexNode *gnext = NULL; + SQRexNode *gnext = nullptr; if(greedystop->next != -1) { gnext = &exp->_nodes[greedystop->next]; }else if(next && next->next != -1){ @@ -425,12 +425,12 @@ static const SQChar *sqstd_rex_matchnode(SQRex* exp,SQRexNode *node,const SQChar if(p0 == p1 && p0 == nmaches) return good; else if(nmaches >= p0 && p1 == 0xFFFF) return good; else if(nmaches >= p0 && nmaches <= p1) return good; - return NULL; + return nullptr; } case OP_OR: { const SQChar *asd = str; SQRexNode *temp=&exp->_nodes[node->left]; - while( (asd = sqstd_rex_matchnode(exp,temp,asd,NULL)) ) { + while( (asd = sqstd_rex_matchnode(exp,temp,asd,nullptr)) ) { if(temp->next != -1) temp = &exp->_nodes[temp->next]; else @@ -438,13 +438,13 @@ static const SQChar *sqstd_rex_matchnode(SQRex* exp,SQRexNode *node,const SQChar } asd = str; temp = &exp->_nodes[node->right]; - while( (asd = sqstd_rex_matchnode(exp,temp,asd,NULL)) ) { + while( (asd = sqstd_rex_matchnode(exp,temp,asd,nullptr)) ) { if(temp->next != -1) temp = &exp->_nodes[temp->next]; else return asd; } - return NULL; + return nullptr; break; } case OP_EXPR: @@ -459,7 +459,7 @@ static const SQChar *sqstd_rex_matchnode(SQRex* exp,SQRexNode *node,const SQChar } do { - SQRexNode *subnext = NULL; + SQRexNode *subnext = nullptr; if(n->next != -1) { subnext = &exp->_nodes[n->next]; }else { @@ -470,7 +470,7 @@ static const SQChar *sqstd_rex_matchnode(SQRex* exp,SQRexNode *node,const SQChar exp->_matches[capture].begin = 0; exp->_matches[capture].len = 0; } - return NULL; + return nullptr; } } while((n->next != -1) && (n = &exp->_nodes[n->next])); @@ -483,15 +483,15 @@ static const SQChar *sqstd_rex_matchnode(SQRex* exp,SQRexNode *node,const SQChar || (str == exp->_eol && !isspace(*(str-1))) || (!isspace(*str) && isspace(*(str+1))) || (isspace(*str) && !isspace(*(str+1))) ) { - return (node->left == 'b')?str:NULL; + return (node->left == 'b')?str:nullptr; } - return (node->left == 'b')?NULL:str; + return (node->left == 'b')?nullptr:str; case OP_BOL: if(str == exp->_bol) return str; - return NULL; + return nullptr; case OP_EOL: if(str == exp->_eol) return str; - return NULL; + return nullptr; case OP_DOT:{ *str++; } @@ -502,26 +502,26 @@ static const SQChar *sqstd_rex_matchnode(SQRex* exp,SQRexNode *node,const SQChar *str++; return str; } - return NULL; + return nullptr; case OP_CCLASS: if(sqstd_rex_matchcclass(node->left,*str)) { *str++; return str; } - return NULL; + return nullptr; default: /* char */ - if(*str != (SQChar)node->type) return NULL; + if(*str != (SQChar)node->type) return nullptr; *str++; return str; } - return NULL; + return nullptr; } /* public api */ SQRex *sqstd_rex_compile(const SQChar *pattern,const SQChar **error) { SQRex *exp = (SQRex *)sq_malloc(sizeof(SQRex)); - exp->_eol = exp->_bol = NULL; + exp->_eol = exp->_bol = nullptr; exp->_p = pattern; exp->_nallocated = (SQInteger)strlen(pattern) * sizeof(SQChar); exp->_nodes = (SQRexNode *)sq_malloc(exp->_nallocated * sizeof(SQRexNode)); @@ -558,7 +558,7 @@ SQRex *sqstd_rex_compile(const SQChar *pattern,const SQChar **error) } catch (...) { sqstd_rex_free(exp); - return NULL; + return nullptr; } return exp; } @@ -574,19 +574,19 @@ void sqstd_rex_free(SQRex *exp) SQBool sqstd_rex_match(SQRex* exp,const SQChar* text) { - const SQChar* res = NULL; + const SQChar* res = nullptr; exp->_bol = text; exp->_eol = text + strlen(text); exp->_currsubexp = 0; - res = sqstd_rex_matchnode(exp,exp->_nodes,text,NULL); - if(res == NULL || res != exp->_eol) + res = sqstd_rex_matchnode(exp,exp->_nodes,text,nullptr); + if(res == nullptr || res != exp->_eol) return SQFalse; return SQTrue; } SQBool sqstd_rex_searchrange(SQRex* exp,const SQChar* text_begin,const SQChar* text_end,const SQChar** out_begin, const SQChar** out_end) { - const SQChar *cur = NULL; + const SQChar *cur = nullptr; SQInteger node = exp->_first; if(text_begin >= text_end) return SQFalse; exp->_bol = text_begin; @@ -595,15 +595,15 @@ SQBool sqstd_rex_searchrange(SQRex* exp,const SQChar* text_begin,const SQChar* t cur = text_begin; while(node != -1) { exp->_currsubexp = 0; - cur = sqstd_rex_matchnode(exp,&exp->_nodes[node],cur,NULL); + cur = sqstd_rex_matchnode(exp,&exp->_nodes[node],cur,nullptr); if(!cur) break; node = exp->_nodes[node].next; } *text_begin++; - } while(cur == NULL && text_begin != text_end); + } while(cur == nullptr && text_begin != text_end); - if(cur == NULL) + if(cur == nullptr) return SQFalse; --text_begin; diff --git a/src/3rdparty/squirrel/sqstdlib/sqstdstring.cpp b/src/3rdparty/squirrel/sqstdlib/sqstdstring.cpp index 300fed08e9..f042ac7df8 100644 --- a/src/3rdparty/squirrel/sqstdlib/sqstdstring.cpp +++ b/src/3rdparty/squirrel/sqstdlib/sqstdstring.cpp @@ -112,16 +112,16 @@ static SQInteger _string_split(HSQUIRRELVM v) memcpy(stemp,str,memsize); tok = scstrtok(stemp,seps); sq_newarray(v,0); - while( tok != NULL ) { + while( tok != nullptr ) { sq_pushstring(v,tok,-1); sq_arrayappend(v,-2); - tok = scstrtok( NULL, seps ); + tok = scstrtok( nullptr, seps ); } return 1; } #define SETUP_REX(v) \ - SQRex *self = NULL; \ + SQRex *self = nullptr; \ sq_getinstanceup(v,1,(SQUserPointer *)&self,0); static SQInteger _rexobj_releasehook(SQUserPointer p, SQInteger size) diff --git a/src/3rdparty/squirrel/squirrel/sqbaselib.cpp b/src/3rdparty/squirrel/squirrel/sqbaselib.cpp index 051b03a514..dbab1b7c80 100644 --- a/src/3rdparty/squirrel/squirrel/sqbaselib.cpp +++ b/src/3rdparty/squirrel/squirrel/sqbaselib.cpp @@ -100,7 +100,7 @@ static SQInteger base_getstackinfos(HSQUIRRELVM v) SQInteger level; SQStackInfos si; SQInteger seq = 0; - const SQChar *name = NULL; + const SQChar *name = nullptr; sq_getinteger(v, -1, &level); if (SQ_SUCCEEDED(sq_stackinfos(v, level, &si))) { @@ -179,7 +179,7 @@ static SQInteger base_print(HSQUIRRELVM v) static SQInteger base_compilestring(HSQUIRRELVM v) { SQInteger nargs=sq_gettop(v); - const SQChar *src=NULL,*name="unnamedbuffer"; + const SQChar *src=nullptr,*name="unnamedbuffer"; SQInteger size; sq_getstring(v,2,&src); size=sq_getsize(v,2); @@ -238,26 +238,26 @@ static SQInteger base_type(HSQUIRRELVM v) static SQRegFunction base_funcs[]={ //generic #ifdef EXPORT_DEFAULT_SQUIRREL_FUNCTIONS - {"seterrorhandler",base_seterrorhandler,2, NULL}, - {"setdebughook",base_setdebughook,2, NULL}, - {"enabledebuginfo",base_enabledebuginfo,2, NULL}, + {"seterrorhandler",base_seterrorhandler,2, nullptr}, + {"setdebughook",base_setdebughook,2, nullptr}, + {"enabledebuginfo",base_enabledebuginfo,2, nullptr}, {"getstackinfos",base_getstackinfos,2, ".n"}, - {"getroottable",base_getroottable,1, NULL}, - {"setroottable",base_setroottable,2, NULL}, - {"getconsttable",base_getconsttable,1, NULL}, - {"setconsttable",base_setconsttable,2, NULL}, + {"getroottable",base_getroottable,1, nullptr}, + {"setroottable",base_setroottable,2, nullptr}, + {"getconsttable",base_getconsttable,1, nullptr}, + {"setconsttable",base_setconsttable,2, nullptr}, #endif {"assert",base_assert,2, nullptr}, {"print",base_print,2, nullptr}, #ifdef EXPORT_DEFAULT_SQUIRREL_FUNCTIONS {"compilestring",base_compilestring,-2, ".ss"}, {"newthread",base_newthread,2, ".c"}, - {"suspend",base_suspend,-1, NULL}, + {"suspend",base_suspend,-1, nullptr}, #endif {"array",base_array,-2, ".n"}, {"type",base_type,2, nullptr}, #ifdef EXPORT_DEFAULT_SQUIRREL_FUNCTIONS - {"dummy",base_dummy,0,NULL}, + {"dummy",base_dummy,0,nullptr}, #ifndef NO_GARBAGE_COLLECTOR {"collectgarbage",base_collectgarbage,1, "t"}, #endif diff --git a/src/3rdparty/squirrel/squirrel/sqobject.h b/src/3rdparty/squirrel/squirrel/sqobject.h index a20fb4d639..3c152dc50d 100644 --- a/src/3rdparty/squirrel/squirrel/sqobject.h +++ b/src/3rdparty/squirrel/squirrel/sqobject.h @@ -136,7 +136,7 @@ struct SQObjectPtr; (obj)->_uiRef--; \ if((obj)->_uiRef == 0) \ (obj)->Release(); \ - (obj) = NULL; \ + (obj) = nullptr; \ } \ } @@ -446,7 +446,7 @@ public: #define ADD_TO_CHAIN(chain,obj) AddToChain(chain,obj) #define REMOVE_FROM_CHAIN(chain,obj) {if(!(_uiRef&MARK_FLAG))RemoveFromChain(chain,obj);} #define CHAINABLE_OBJ SQCollectable -#define INIT_CHAIN() {_next=NULL;_prev=NULL;_sharedstate=ss;} +#define INIT_CHAIN() {_next=nullptr;_prev=nullptr;_sharedstate=ss;} #else #define ADD_TO_CHAIN(chain,obj) ((void)0) diff --git a/src/3rdparty/squirrel/squirrel/sqstate.cpp b/src/3rdparty/squirrel/squirrel/sqstate.cpp index 112b1bb612..faf1995cfc 100644 --- a/src/3rdparty/squirrel/squirrel/sqstate.cpp +++ b/src/3rdparty/squirrel/squirrel/sqstate.cpp @@ -201,7 +201,7 @@ SQSharedState::~SQSharedState() t = nx; } } -// assert(_gc_chain==NULL); //just to proove a theory +// assert(_gc_chain==nullptr); //just to proove a theory while(_gc_chain){ _gc_chain->_uiRef--; _gc_chain->Release(); diff --git a/src/3rdparty/squirrel/squirrel/sqvm.h b/src/3rdparty/squirrel/squirrel/sqvm.h index 2ac19e2da7..320488d37a 100644 --- a/src/3rdparty/squirrel/squirrel/sqvm.h +++ b/src/3rdparty/squirrel/squirrel/sqvm.h @@ -194,7 +194,7 @@ inline SQObjectPtr &stack_get(HSQUIRRELVM v,SQInteger idx){return ((idx>=0)?(v-> #ifndef NO_GARBAGE_COLLECTOR #define _opt_ss(_vm_) (_vm_)->_sharedstate #else -#define _opt_ss(_vm_) NULL +#define _opt_ss(_vm_) nullptr #endif #define PUSH_CALLINFO(v,nci){ \ @@ -218,6 +218,6 @@ inline SQObjectPtr &stack_get(HSQUIRRELVM v,SQInteger idx){return ((idx>=0)?(v-> if(v->_callsstacksize) \ v->ci = &v->_callsstack[v->_callsstacksize-1] ; \ else \ - v->ci = NULL; \ + v->ci = nullptr; \ } #endif //_SQVM_H_ diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 9a5066f6e4..dbd6126acb 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -345,6 +345,8 @@ add_files( order_gui.cpp order_type.h osk_gui.cpp + palette.cpp + palette_func.h pbs.cpp pbs.h plans.cpp diff --git a/src/blitter/32bpp_anim.cpp b/src/blitter/32bpp_anim.cpp index 60a976fadf..003cde40a0 100644 --- a/src/blitter/32bpp_anim.cpp +++ b/src/blitter/32bpp_anim.cpp @@ -9,6 +9,7 @@ #include "../stdafx.h" #include "../video/video_driver.hpp" +#include "../palette_func.h" #include "../zoom_func.h" #include "32bpp_anim.hpp" #include "common.hpp" @@ -220,10 +221,6 @@ inline void Blitter_32bppAnim::Draw(const Blitter::BlitterParams *bp, ZoomLevel break; case BM_TRANSPARENT: - /* TODO -- We make an assumption here that the remap in fact is transparency, not some colour. - * This is never a problem with the code we produce, but newgrfs can make it fail... or at least: - * we produce a result the newgrf maker didn't expect ;) */ - /* Make the current colour a bit more black, so it looks like this image is transparent */ src_n += n; if (src_px->a == 255) { @@ -245,6 +242,24 @@ inline void Blitter_32bppAnim::Draw(const Blitter::BlitterParams *bp, ZoomLevel } break; + case BM_TRANSPARENT_REMAP: + /* Apply custom transparency remap. */ + src_n += n; + if (src_px->a != 0) { + src_px += n; + do { + *dst = this->LookupColourInPalette(remap[GetNearestColourIndex(*dst)]); + *anim = 0; + anim++; + dst++; + } while (--n != 0); + } else { + dst += n; + anim += n; + src_px += n; + } + break; + default: if (fast_path || (src_px->a == 255 && (sprite_flags & BSF_NO_ANIM))) { do { @@ -343,6 +358,7 @@ void Blitter_32bppAnim::Draw(Blitter::BlitterParams *bp, BlitterMode mode, ZoomL return; case BM_TRANSPARENT: Draw (bp, zoom); return; + case BM_TRANSPARENT_REMAP: Draw (bp, zoom); return; case BM_CRASH_REMAP: Draw (bp, zoom); return; case BM_BLACK_REMAP: Draw (bp, zoom); return; } diff --git a/src/blitter/32bpp_anim_sse4.cpp b/src/blitter/32bpp_anim_sse4.cpp index ff6c1ea901..a420a6c6b5 100644 --- a/src/blitter/32bpp_anim_sse4.cpp +++ b/src/blitter/32bpp_anim_sse4.cpp @@ -12,6 +12,7 @@ #include "../stdafx.h" #include "../video/video_driver.hpp" #include "../table/sprites.h" +#include "../palette_func.h" #include "32bpp_anim_sse4.hpp" #include "32bpp_sse_func.hpp" @@ -317,6 +318,21 @@ bmcr_alpha_blend_single: } break; + case BM_TRANSPARENT_REMAP: + /* Apply custom transparency remap. */ + for (uint x = (uint) bp->width; x > 0; x--) { + if (src->a != 0) { + *dst = this->LookupColourInPalette(remap[GetNearestColourIndex(*dst)]); + *anim = 0; + } + src_mv++; + dst++; + src++; + anim++; + } + break; + + case BM_CRASH_REMAP: for (uint x = (uint) bp->width; x > 0; x--) { if (src_mv->m == 0) { @@ -420,7 +436,7 @@ bmcr_alpha_blend_single_brightness: } next_line: - if (mode != BM_TRANSPARENT) src_mv_line += si->sprite_width; + if (mode != BM_TRANSPARENT && mode != BM_TRANSPARENT_REMAP) src_mv_line += si->sprite_width; src_rgba_line = (const Colour*) ((const byte*) src_rgba_line + si->sprite_line_size); dst_line += bp->pitch; anim_line += this->anim_buf_pitch; @@ -483,6 +499,7 @@ bm_normal: } break; case BM_TRANSPARENT: Draw(bp, zoom); return; + case BM_TRANSPARENT_REMAP: Draw(bp, zoom); return; case BM_CRASH_REMAP: Draw(bp, zoom); return; case BM_BLACK_REMAP: Draw(bp, zoom); return; diff --git a/src/blitter/32bpp_optimized.cpp b/src/blitter/32bpp_optimized.cpp index 9b77f78a46..af839b78a6 100644 --- a/src/blitter/32bpp_optimized.cpp +++ b/src/blitter/32bpp_optimized.cpp @@ -10,6 +10,7 @@ #include "../stdafx.h" #include "../zoom_func.h" #include "../settings_type.h" +#include "../palette_func.h" #include "32bpp_optimized.hpp" #include "common.hpp" @@ -189,10 +190,6 @@ inline void Blitter_32bppOptimized::Draw(const Blitter::BlitterParams *bp, ZoomL break; case BM_TRANSPARENT: - /* TODO -- We make an assumption here that the remap in fact is transparency, not some colour. - * This is never a problem with the code we produce, but newgrfs can make it fail... or at least: - * we produce a result the newgrf maker didn't expect ;) */ - /* Make the current colour a bit more black, so it looks like this image is transparent */ src_n += n; if (src_px->a == 255) { @@ -210,6 +207,21 @@ inline void Blitter_32bppOptimized::Draw(const Blitter::BlitterParams *bp, ZoomL } break; + case BM_TRANSPARENT_REMAP: + /* Apply custom transparency remap. */ + src_n += n; + if (src_px->a != 0) { + src_px += n; + do { + *dst = this->LookupColourInPalette(remap[GetNearestColourIndex(*dst)]); + dst++; + } while (--n != 0); + } else { + dst += n; + src_px += n; + } + break; + default: if (src_px->a == 255) { /* faster than memcpy(), n is usually low */ @@ -260,6 +272,7 @@ void Blitter_32bppOptimized::Draw(Blitter::BlitterParams *bp, BlitterMode mode, case BM_NORMAL: Draw(bp, zoom); return; case BM_COLOUR_REMAP: Draw(bp, zoom); return; case BM_TRANSPARENT: Draw(bp, zoom); return; + case BM_TRANSPARENT_REMAP: Draw(bp, zoom); return; case BM_CRASH_REMAP: Draw(bp, zoom); return; case BM_BLACK_REMAP: Draw(bp, zoom); return; case BM_NORMAL_WITH_BRIGHTNESS: Draw(bp, zoom); return; diff --git a/src/blitter/32bpp_simple.cpp b/src/blitter/32bpp_simple.cpp index c8d42c565e..403e0e81a3 100644 --- a/src/blitter/32bpp_simple.cpp +++ b/src/blitter/32bpp_simple.cpp @@ -9,6 +9,7 @@ #include "../stdafx.h" #include "../zoom_func.h" +#include "../palette_func.h" #include "32bpp_simple.hpp" #include "../table/sprites.h" @@ -75,12 +76,17 @@ void Blitter_32bppSimple::Draw(Blitter::BlitterParams *bp, BlitterMode mode, Zoo break; case BM_TRANSPARENT: - /* TODO -- We make an assumption here that the remap in fact is transparency, not some colour. - * This is never a problem with the code we produce, but newgrfs can make it fail... or at least: - * we produce a result the newgrf maker didn't expect ;) */ - /* Make the current colour a bit more black, so it looks like this image is transparent */ - if (src->a != 0) *dst = MakeTransparent(*dst, 192); + if (src->a != 0) { + *dst = MakeTransparent(*dst, 192); + } + break; + + case BM_TRANSPARENT_REMAP: + /* Apply custom transparency remap. */ + if (src->a != 0) { + *dst = this->LookupColourInPalette(bp->remap[GetNearestColourIndex(*dst)]); + } break; case BM_NORMAL_WITH_BRIGHTNESS: diff --git a/src/blitter/32bpp_sse_func.hpp b/src/blitter/32bpp_sse_func.hpp index 64f4fd75b5..f42f9e74d8 100644 --- a/src/blitter/32bpp_sse_func.hpp +++ b/src/blitter/32bpp_sse_func.hpp @@ -398,6 +398,18 @@ bmcr_alpha_blend_single: } break; + case BM_TRANSPARENT_REMAP: + /* Apply custom transparency remap. */ + for (uint x = (uint) bp->width; x > 0; x--) { + if (src->a != 0) { + *dst = this->LookupColourInPalette(remap[GetNearestColourIndex(*dst)]); + } + src_mv++; + dst++; + src++; + } + break; + case BM_CRASH_REMAP: for (uint x = (uint) bp->width; x > 0; x--) { if (src_mv->m == 0) { @@ -532,6 +544,7 @@ bm_normal: Draw(bp, zoom); return; } case BM_TRANSPARENT: Draw(bp, zoom); return; + case BM_TRANSPARENT_REMAP: Draw(bp, zoom); return; case BM_CRASH_REMAP: Draw(bp, zoom); return; case BM_BLACK_REMAP: Draw(bp, zoom); return; diff --git a/src/blitter/40bpp_anim.cpp b/src/blitter/40bpp_anim.cpp index e3c411a65f..4a8e9f2793 100644 --- a/src/blitter/40bpp_anim.cpp +++ b/src/blitter/40bpp_anim.cpp @@ -11,6 +11,7 @@ #include "../zoom_func.h" #include "../settings_type.h" #include "../video/video_driver.hpp" +#include "../palette_func.h" #include "40bpp_anim.hpp" #include "common.hpp" @@ -288,10 +289,6 @@ inline void Blitter_40bppAnim::Draw(const Blitter::BlitterParams *bp, ZoomLevel break; case BM_TRANSPARENT: - /* TODO -- We make an assumption here that the remap in fact is transparency, not some colour. - * This is never a problem with the code we produce, but newgrfs can make it fail... or at least: - * we produce a result the newgrf maker didn't expect ;) */ - /* Make the current colour a bit more black, so it looks like this image is transparent */ src_n += n; if (src_px->a == 255) { @@ -317,6 +314,28 @@ inline void Blitter_40bppAnim::Draw(const Blitter::BlitterParams *bp, ZoomLevel } break; + case BM_TRANSPARENT_REMAP: + /* Apply custom transparency remap. */ + src_n += n; + if (src_px->a != 0) { + src_px += n; + do { + if (*anim != 0) { + *anim = remap[*anim]; + } else { + *dst = this->LookupColourInPalette(remap[GetNearestColourIndex(*dst)]); + *anim = 0; + } + anim++; + dst++; + } while (--n != 0); + } else { + dst += n; + anim += n; + src_px += n; + } + break; + default: if (src_px->a == 255) { do { @@ -389,6 +408,7 @@ void Blitter_40bppAnim::Draw(Blitter::BlitterParams *bp, BlitterMode mode, ZoomL case BM_NORMAL: Draw (bp, zoom); return; case BM_COLOUR_REMAP: Draw(bp, zoom); return; case BM_TRANSPARENT: Draw (bp, zoom); return; + case BM_TRANSPARENT_REMAP: Draw(bp, zoom); return; case BM_CRASH_REMAP: Draw (bp, zoom); return; case BM_BLACK_REMAP: Draw (bp, zoom); return; case BM_NORMAL_WITH_BRIGHTNESS: Draw (bp, zoom); return; diff --git a/src/blitter/8bpp_optimized.cpp b/src/blitter/8bpp_optimized.cpp index 7cacf6b4c1..50709aafee 100644 --- a/src/blitter/8bpp_optimized.cpp +++ b/src/blitter/8bpp_optimized.cpp @@ -101,8 +101,9 @@ void Blitter_8bppOptimized::Draw(Blitter::BlitterParams *bp, BlitterMode mode, Z dst += pixels; break; - case BM_TRANSPARENT: { - const uint8 *remap = bp->remap; + case BM_TRANSPARENT: + case BM_TRANSPARENT_REMAP: { + const uint8_t *remap = bp->remap; src += pixels; do { *dst = remap[*dst]; diff --git a/src/blitter/8bpp_simple.cpp b/src/blitter/8bpp_simple.cpp index 2725c112e0..44993dba4b 100644 --- a/src/blitter/8bpp_simple.cpp +++ b/src/blitter/8bpp_simple.cpp @@ -43,6 +43,7 @@ void Blitter_8bppSimple::Draw(Blitter::BlitterParams *bp, BlitterMode mode, Zoom break; case BM_TRANSPARENT: + case BM_TRANSPARENT_REMAP: if (*src != 0) colour = bp->remap[*dst]; break; diff --git a/src/blitter/base.hpp b/src/blitter/base.hpp index 1717b18475..056ce79802 100644 --- a/src/blitter/base.hpp +++ b/src/blitter/base.hpp @@ -20,7 +20,8 @@ enum BlitterMode { BM_NORMAL, ///< Perform the simple blitting. BM_COLOUR_REMAP, ///< Perform a colour remapping. - BM_TRANSPARENT, ///< Perform transparency colour remapping. + BM_TRANSPARENT, ///< Perform transparency darkening remapping. + BM_TRANSPARENT_REMAP, ///< Perform transparency colour remapping. BM_CRASH_REMAP, ///< Perform a crash remapping. BM_BLACK_REMAP, ///< Perform remapping to a completely blackened sprite BM_NORMAL_WITH_BRIGHTNESS, ///< Perform a simple blitting with brightness adjustment diff --git a/src/company_gui.cpp b/src/company_gui.cpp index 0d2eaa11cb..89d903a0b4 100644 --- a/src/company_gui.cpp +++ b/src/company_gui.cpp @@ -823,7 +823,7 @@ public: this->square = GetSpriteSize(SPR_SQUARE); this->line_height = std::max(this->square.height, (uint)GetCharacterHeight(FS_NORMAL)) + padding.height; - size->height = 11 * this->line_height; + size->height = 5 * this->line_height; resize->width = 1; resize->height = this->line_height; break; @@ -966,6 +966,12 @@ public: SetDParam(0, g->index); draw_livery(STR_GROUP_NAME, livery_set ? g->livery : c->livery[LS_DEFAULT], this->sel == g->index, livery_set, this->indents[i] * WidgetDimensions::scaled.hsep_indent); } + + if (this->vscroll->GetCount() == 0) { + const StringID empty_labels[] = { STR_LIVERY_TRAIN_GROUP_EMPTY, STR_LIVERY_ROAD_VEHICLE_GROUP_EMPTY, STR_LIVERY_SHIP_GROUP_EMPTY, STR_LIVERY_AIRCRAFT_GROUP_EMPTY }; + VehicleType vtype = (VehicleType)(this->livery_class - LC_GROUP_RAIL); + DrawString(ir.left, ir.right, y + text_offs, empty_labels[vtype], TC_BLACK); + } } } @@ -1116,7 +1122,7 @@ public: } }; -static const NWidgetPart _nested_select_company_livery_widgets [] = { +static const NWidgetPart _nested_select_company_livery_widgets[] = { NWidget(NWID_HORIZONTAL), NWidget(WWT_CLOSEBOX, COLOUR_GREY), NWidget(WWT_CAPTION, COLOUR_GREY, WID_SCL_CAPTION), SetDataTip(STR_LIVERY_CAPTION, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS), @@ -1127,24 +1133,21 @@ static const NWidgetPart _nested_select_company_livery_widgets [] = { NWidget(WWT_IMGBTN, COLOUR_GREY, WID_SCL_CLASS_ROAD), SetMinimalSize(22, 22), SetFill(0, 1), SetDataTip(SPR_IMG_TRUCKLIST, STR_LIVERY_ROAD_VEHICLE_TOOLTIP), NWidget(WWT_IMGBTN, COLOUR_GREY, WID_SCL_CLASS_SHIP), SetMinimalSize(22, 22), SetFill(0, 1), SetDataTip(SPR_IMG_SHIPLIST, STR_LIVERY_SHIP_TOOLTIP), NWidget(WWT_IMGBTN, COLOUR_GREY, WID_SCL_CLASS_AIRCRAFT), SetMinimalSize(22, 22), SetFill(0, 1), SetDataTip(SPR_IMG_AIRPLANESLIST, STR_LIVERY_AIRCRAFT_TOOLTIP), - NWidget(WWT_IMGBTN, COLOUR_GREY, WID_SCL_GROUPS_RAIL), SetMinimalSize(22, 22), SetFill(0, 1), SetDataTip(SPR_GROUP_LIVERY_TRAIN, STR_LIVERY_TRAIN_TOOLTIP), - NWidget(WWT_IMGBTN, COLOUR_GREY, WID_SCL_GROUPS_ROAD), SetMinimalSize(22, 22), SetFill(0, 1), SetDataTip(SPR_GROUP_LIVERY_ROADVEH, STR_LIVERY_ROAD_VEHICLE_TOOLTIP), - NWidget(WWT_IMGBTN, COLOUR_GREY, WID_SCL_GROUPS_SHIP), SetMinimalSize(22, 22), SetFill(0, 1), SetDataTip(SPR_GROUP_LIVERY_SHIP, STR_LIVERY_SHIP_TOOLTIP), - NWidget(WWT_IMGBTN, COLOUR_GREY, WID_SCL_GROUPS_AIRCRAFT), SetMinimalSize(22, 22), SetFill(0, 1), SetDataTip(SPR_GROUP_LIVERY_AIRCRAFT, STR_LIVERY_AIRCRAFT_TOOLTIP), - NWidget(WWT_PANEL, COLOUR_GREY), SetMinimalSize(90, 22), SetFill(1, 1), EndContainer(), + NWidget(WWT_IMGBTN, COLOUR_GREY, WID_SCL_GROUPS_RAIL), SetMinimalSize(22, 22), SetFill(0, 1), SetDataTip(SPR_GROUP_LIVERY_TRAIN, STR_LIVERY_TRAIN_GROUP_TOOLTIP), + NWidget(WWT_IMGBTN, COLOUR_GREY, WID_SCL_GROUPS_ROAD), SetMinimalSize(22, 22), SetFill(0, 1), SetDataTip(SPR_GROUP_LIVERY_ROADVEH, STR_LIVERY_ROAD_VEHICLE_GROUP_TOOLTIP), + NWidget(WWT_IMGBTN, COLOUR_GREY, WID_SCL_GROUPS_SHIP), SetMinimalSize(22, 22), SetFill(0, 1), SetDataTip(SPR_GROUP_LIVERY_SHIP, STR_LIVERY_SHIP_GROUP_TOOLTIP), + NWidget(WWT_IMGBTN, COLOUR_GREY, WID_SCL_GROUPS_AIRCRAFT), SetMinimalSize(22, 22), SetFill(0, 1), SetDataTip(SPR_GROUP_LIVERY_AIRCRAFT, STR_LIVERY_AIRCRAFT_GROUP_TOOLTIP), + NWidget(WWT_PANEL, COLOUR_GREY), SetFill(1, 1), SetResize(1, 0), EndContainer(), EndContainer(), NWidget(NWID_HORIZONTAL), - NWidget(WWT_PANEL, COLOUR_GREY, WID_SCL_SPACER_DROPDOWN), SetMinimalSize(150, 12), SetFill(1, 1), EndContainer(), - NWidget(WWT_DROPDOWN, COLOUR_GREY, WID_SCL_PRI_COL_DROPDOWN), SetMinimalSize(125, 12), SetFill(0, 1), SetDataTip(STR_JUST_STRING, STR_LIVERY_PRIMARY_TOOLTIP), - NWidget(WWT_DROPDOWN, COLOUR_GREY, WID_SCL_SEC_COL_DROPDOWN), SetMinimalSize(125, 12), SetFill(0, 1), - SetDataTip(STR_JUST_STRING, STR_LIVERY_SECONDARY_TOOLTIP), + NWidget(WWT_MATRIX, COLOUR_GREY, WID_SCL_MATRIX), SetMinimalSize(275, 0), SetResize(1, 0), SetFill(1, 1), SetMatrixDataTip(1, 0, STR_LIVERY_PANEL_TOOLTIP), SetScrollbar(WID_SCL_MATRIX_SCROLLBAR), + NWidget(NWID_VSCROLLBAR, COLOUR_GREY, WID_SCL_MATRIX_SCROLLBAR), EndContainer(), NWidget(NWID_HORIZONTAL), - NWidget(WWT_MATRIX, COLOUR_GREY, WID_SCL_MATRIX), SetMinimalSize(275, 0), SetResize(1, 0), SetFill(1, 1), SetMatrixDataTip(1, 0, STR_LIVERY_PANEL_TOOLTIP), SetScrollbar(WID_SCL_MATRIX_SCROLLBAR), - NWidget(NWID_VERTICAL), - NWidget(NWID_VSCROLLBAR, COLOUR_GREY, WID_SCL_MATRIX_SCROLLBAR), - NWidget(WWT_RESIZEBOX, COLOUR_GREY), - EndContainer(), + NWidget(WWT_PANEL, COLOUR_GREY, WID_SCL_SPACER_DROPDOWN), SetFill(1, 1), SetResize(1, 0), EndContainer(), + NWidget(WWT_DROPDOWN, COLOUR_GREY, WID_SCL_PRI_COL_DROPDOWN), SetFill(0, 1), SetDataTip(STR_JUST_STRING, STR_LIVERY_PRIMARY_TOOLTIP), + NWidget(WWT_DROPDOWN, COLOUR_GREY, WID_SCL_SEC_COL_DROPDOWN), SetFill(0, 1), SetDataTip(STR_JUST_STRING, STR_LIVERY_SECONDARY_TOOLTIP), + NWidget(WWT_RESIZEBOX, COLOUR_GREY), EndContainer(), }; diff --git a/src/gfx.cpp b/src/gfx.cpp index da97b9dcd0..e738c81777 100644 --- a/src/gfx.cpp +++ b/src/gfx.cpp @@ -29,7 +29,6 @@ #include "core/container_func.hpp" #include "viewport_func.h" -#include "table/palettes.h" #include "table/string_colours.h" #include "table/sprites.h" #include "table/control_codes.h" @@ -62,33 +61,11 @@ SwitchMode _switch_mode; ///< The next mainloop command. std::chrono::steady_clock::time_point _switch_mode_time; ///< The time when the switch mode was requested. PauseMode _pause_mode; uint32 _pause_countdown; -Palette _cur_palette; -std::mutex _cur_palette_mutex; std::string _switch_baseset; static bool _adjust_gui_zoom_startup_done = false; static byte _stringwidth_table[FS_END][224]; ///< Cache containing width of often used characters. @see GetCharacterWidth() DrawPixelInfo *_cur_dpi; -byte _colour_gradient[COLOUR_END][8]; - -byte _colour_value[COLOUR_END] = { - 133, // COLOUR_DARK_BLUE - 99, // COLOUR_PALE_GREEN, - 48, // COLOUR_PINK, - 68, // COLOUR_YELLOW, - 184, // COLOUR_RED, - 152, // COLOUR_LIGHT_BLUE, - 209, // COLOUR_GREEN, - 95, // COLOUR_DARK_GREEN, - 150, // COLOUR_BLUE, - 79, // COLOUR_CREAM, - 134, // COLOUR_MAUVE, - 174, // COLOUR_PURPLE, - 195, // COLOUR_ORANGE, - 116, // COLOUR_BROWN, - 6, // COLOUR_GREY, - 15, // COLOUR_WHITE, -}; struct GfxBlitterCtx { const DrawPixelInfo *dpi; @@ -1040,8 +1017,9 @@ void DrawSpriteViewport(const SpritePointerHolder &sprite_store, const DrawPixel GfxBlitterCtx ctx(dpi); SpriteID real_sprite = GB(img, 0, SPRITE_WIDTH); if (HasBit(img, PALETTE_MODIFIER_TRANSPARENT)) { - ctx.colour_remap_ptr = sprite_store.GetRecolourSprite(GB(pal, 0, PALETTE_WIDTH)) + 1; - GfxMainBlitterViewport(ctx, sprite_store.GetSprite(real_sprite, SpriteType::Normal), x, y, BM_TRANSPARENT, sub, real_sprite); + pal = GB(pal, 0, PALETTE_WIDTH); + ctx.colour_remap_ptr = sprite_store.GetRecolourSprite(pal) + 1; + GfxMainBlitterViewport(ctx, sprite_store.GetSprite(real_sprite, SpriteType::Normal), x, y, pal == PALETTE_TO_TRANSPARENT ? BM_TRANSPARENT : BM_TRANSPARENT_REMAP, sub, real_sprite); } else if (pal != PAL_NONE) { if (HasBit(pal, PALETTE_TEXT_RECOLOUR)) { ctx.SetColourRemap((TextColour)GB(pal, 0, PALETTE_WIDTH)); @@ -1087,8 +1065,9 @@ void DrawSprite(SpriteID img, PaletteID pal, int x, int y, const SubSprite *sub, GfxBlitterCtx ctx(_cur_dpi); SpriteID real_sprite = GB(img, 0, SPRITE_WIDTH); if (HasBit(img, PALETTE_MODIFIER_TRANSPARENT)) { - ctx.colour_remap_ptr = GetNonSprite(GB(pal, 0, PALETTE_WIDTH), SpriteType::Recolour) + 1; - GfxMainBlitter(ctx, GetSprite(real_sprite, SpriteType::Normal, ZoomMask(zoom)), x, y, BM_TRANSPARENT, sub, real_sprite, zoom); + pal = GB(pal, 0, PALETTE_WIDTH); + ctx.colour_remap_ptr = GetNonSprite(pal, SpriteType::Recolour) + 1; + GfxMainBlitter(ctx, GetSprite(real_sprite, SpriteType::Normal, ZoomMask(zoom)), x, y, pal == PALETTE_TO_TRANSPARENT ? BM_TRANSPARENT : BM_TRANSPARENT_REMAP, sub, real_sprite, zoom); } else if (pal != PAL_NONE) { if (HasBit(pal, PALETTE_TEXT_RECOLOUR)) { ctx.SetColourRemap((TextColour)GB(pal, 0, PALETTE_WIDTH)); @@ -1312,151 +1291,6 @@ static void GfxMainBlitter(const GfxBlitterCtx &ctx, const Sprite *sprite, int x GfxBlitter<1, true>(ctx, sprite, x, y, mode, sub, sprite_id, zoom); } -void DoPaletteAnimations(); - -Colour _water_palette[10]; - -void GfxInitPalettes() -{ - MemCpyT(_water_palette, (_settings_game.game_creation.landscape == LT_TOYLAND) ? _extra_palette_values.dark_water_toyland : _extra_palette_values.dark_water, 5); - const Colour *s = (_settings_game.game_creation.landscape == LT_TOYLAND) ? _extra_palette_values.glitter_water_toyland : _extra_palette_values.glitter_water; - for (int i = 0; i < 5; i++) { - _water_palette[i + 5] = s[i * 3]; - } - - std::lock_guard lock_state(_cur_palette_mutex); - memcpy(&_cur_palette, &_palette, sizeof(_cur_palette)); - DoPaletteAnimations(); -} - -#define EXTR(p, q) (((uint16)(palette_animation_counter * (p)) * (q)) >> 16) -#define EXTR2(p, q) (((uint16)(~palette_animation_counter * (p)) * (q)) >> 16) - -void DoPaletteAnimations() -{ - /* Animation counter for the palette animation. */ - static int palette_animation_counter = 0; - palette_animation_counter += 8; - - Blitter *blitter = BlitterFactory::GetCurrentBlitter(); - const Colour *s; - const ExtraPaletteValues *ev = &_extra_palette_values; - Colour old_val[PALETTE_ANIM_SIZE]; - const uint old_tc = palette_animation_counter; - uint j; - - if (blitter != nullptr && blitter->UsePaletteAnimation() == Blitter::PALETTE_ANIMATION_NONE) { - palette_animation_counter = 0; - } - - Colour *palette_pos = &_cur_palette.palette[PALETTE_ANIM_START]; // Points to where animations are taking place on the palette - /* Makes a copy of the current animation palette in old_val, - * so the work on the current palette could be compared, see if there has been any changes */ - memcpy(old_val, palette_pos, sizeof(old_val)); - - /* Fizzy Drink bubbles animation */ - s = ev->fizzy_drink; - j = EXTR2(512, EPV_CYCLES_FIZZY_DRINK); - for (uint i = 0; i != EPV_CYCLES_FIZZY_DRINK; i++) { - *palette_pos++ = s[j]; - j++; - if (j == EPV_CYCLES_FIZZY_DRINK) j = 0; - } - - /* Oil refinery fire animation */ - s = ev->oil_refinery; - j = EXTR2(512, EPV_CYCLES_OIL_REFINERY); - for (uint i = 0; i != EPV_CYCLES_OIL_REFINERY; i++) { - *palette_pos++ = s[j]; - j++; - if (j == EPV_CYCLES_OIL_REFINERY) j = 0; - } - - /* Radio tower blinking */ - { - byte i = (palette_animation_counter >> 1) & 0x7F; - byte v; - - if (i < 0x3f) { - v = 255; - } else if (i < 0x4A || i >= 0x75) { - v = 128; - } else { - v = 20; - } - palette_pos->r = v; - palette_pos->g = 0; - palette_pos->b = 0; - palette_pos++; - - i ^= 0x40; - if (i < 0x3f) { - v = 255; - } else if (i < 0x4A || i >= 0x75) { - v = 128; - } else { - v = 20; - } - palette_pos->r = v; - palette_pos->g = 0; - palette_pos->b = 0; - palette_pos++; - } - - /* Handle lighthouse and stadium animation */ - s = ev->lighthouse; - j = EXTR(256, EPV_CYCLES_LIGHTHOUSE); - for (uint i = 0; i != EPV_CYCLES_LIGHTHOUSE; i++) { - *palette_pos++ = s[j]; - j++; - if (j == EPV_CYCLES_LIGHTHOUSE) j = 0; - } - - /* Dark blue water */ - s = (_settings_game.game_creation.landscape == LT_TOYLAND) ? ev->dark_water_toyland : ev->dark_water; - j = EXTR(320, EPV_CYCLES_DARK_WATER); - for (uint i = 0; i != EPV_CYCLES_DARK_WATER; i++) { - *palette_pos++ = s[j]; - j++; - if (j == EPV_CYCLES_DARK_WATER) j = 0; - } - - /* Glittery water */ - s = (_settings_game.game_creation.landscape == LT_TOYLAND) ? ev->glitter_water_toyland : ev->glitter_water; - j = EXTR(128, EPV_CYCLES_GLITTER_WATER); - for (uint i = 0; i != EPV_CYCLES_GLITTER_WATER / 3; i++) { - *palette_pos++ = s[j]; - j += 3; - if (j >= EPV_CYCLES_GLITTER_WATER) j -= EPV_CYCLES_GLITTER_WATER; - } - - if (blitter != nullptr && blitter->UsePaletteAnimation() == Blitter::PALETTE_ANIMATION_NONE) { - palette_animation_counter = old_tc; - } else { - if (memcmp(old_val, &_cur_palette.palette[PALETTE_ANIM_START], sizeof(old_val)) != 0 && _cur_palette.count_dirty == 0) { - /* Did we changed anything on the palette? Seems so. Mark it as dirty */ - _cur_palette.first_dirty = PALETTE_ANIM_START; - _cur_palette.count_dirty = PALETTE_ANIM_SIZE; - } - } -} - -/** - * Determine a contrasty text colour for a coloured background. - * @param background Background colour. - * @param threshold Background colour brightness threshold below which the background is considered dark and TC_WHITE is returned, range: 0 - 255, default 128. - * @return TC_BLACK or TC_WHITE depending on what gives a better contrast. - */ -TextColour GetContrastColour(uint8 background, uint8 threshold) -{ - Colour c = _cur_palette.palette[background]; - /* Compute brightness according to http://www.w3.org/TR/AERT#color-contrast. - * The following formula computes 1000 * brightness^2, with brightness being in range 0 to 255. */ - uint sq1000_brightness = c.r * c.r * 299 + c.g * c.g * 587 + c.b * c.b * 114; - /* Compare with threshold brightness which defaults to 128 (50%) */ - return sq1000_brightness < ((uint) threshold) * ((uint) threshold) * 1000 ? TC_WHITE : TC_BLACK; -} - /** * Initialize _stringwidth_table cache * @param monospace Whether to load the monospace cache or the normal fonts. diff --git a/src/gfx_func.h b/src/gfx_func.h index a58930706a..2b5e2e07a7 100644 --- a/src/gfx_func.h +++ b/src/gfx_func.h @@ -40,6 +40,7 @@ #define GFX_FUNC_H #include "gfx_type.h" +#include "palette_func.h" #include "strings_type.h" #include "string_type.h" #include @@ -169,7 +170,6 @@ void SetPendingDirtyBlocks(int left, int top, int right, int bottom); void UnsetDirtyBlocks(int left, int top, int right, int bottom); void MarkWholeScreenDirty(); -void GfxInitPalettes(); void CheckBlitter(); bool FillDrawPixelInfo(DrawPixelInfo *n, int left, int top, int width, int height); @@ -228,43 +228,4 @@ inline int GetCharacterHeight(FontSize size) return font_height_cache[size]; } -TextColour GetContrastColour(uint8 background, uint8 threshold = 128); - -/** - * All 16 colour gradients - * 8 colours per gradient from darkest (0) to lightest (7) - */ -extern byte _colour_gradient[COLOUR_END][8]; -extern byte _colour_value[COLOUR_END]; - -/** - * Return the colour for a particular greyscale level. - * @param level Intensity, 0 = black, 15 = white - * @return colour - */ -#define GREY_SCALE(level) (level) - -static const uint8 PC_BLACK = GREY_SCALE(1); ///< Black palette colour. -static const uint8 PC_DARK_GREY = GREY_SCALE(6); ///< Dark grey palette colour. -static const uint8 PC_GREY = GREY_SCALE(10); ///< Grey palette colour. -static const uint8 PC_WHITE = GREY_SCALE(15); ///< White palette colour. - -static const uint8 PC_VERY_DARK_RED = 0xB2; ///< Almost-black red palette colour. -static const uint8 PC_DARK_RED = 0xB4; ///< Dark red palette colour. -static const uint8 PC_RED = 0xB8; ///< Red palette colour. - -static const uint8 PC_VERY_DARK_BROWN = 0x56; ///< Almost-black brown palette colour. - -static const uint8 PC_ORANGE = 0xC2; ///< Orange palette colour. - -static const uint8 PC_YELLOW = 0xBF; ///< Yellow palette colour. -static const uint8 PC_LIGHT_YELLOW = 0x44; ///< Light yellow palette colour. -static const uint8 PC_VERY_LIGHT_YELLOW = 0x45; ///< Almost-white yellow palette colour. - -static const uint8 PC_GREEN = 0xD0; ///< Green palette colour. - -static const uint8 PC_VERY_DARK_BLUE = 0x9A; ///< Almost-black blue palette colour. -static const uint8 PC_DARK_BLUE = 0x9D; ///< Dark blue palette colour. -static const uint8 PC_LIGHT_BLUE = 0x98; ///< Light blue palette colour. - #endif /* GFX_FUNC_H */ diff --git a/src/lang/danish.txt b/src/lang/danish.txt index 63ef2596cf..6f51fc9060 100644 --- a/src/lang/danish.txt +++ b/src/lang/danish.txt @@ -256,6 +256,7 @@ STR_UNITS_HEIGHT_METRIC :{DECIMAL} m STR_UNITS_HEIGHT_SI :{DECIMAL} m STR_UNITS_DAYS :{COMMA}{NBSP}dag{P "" s} +STR_UNITS_SECONDS :{COMMA}{NBSP}sekund{P "" er} # Common window strings STR_LIST_FILTER_TITLE :{BLACK}Filtrer udtryk: @@ -1489,7 +1490,7 @@ STR_CONFIG_SETTING_LAND_GENERATOR_ORIGINAL :Original STR_CONFIG_SETTING_LAND_GENERATOR_TERRA_GENESIS :TerraGenesis STR_CONFIG_SETTING_TERRAIN_TYPE :Terræn type: {STRING} -STR_CONFIG_SETTING_TERRAIN_TYPE_HELPTEXT :(Kun TerraGenesis) Størrelse af højderygge +STR_CONFIG_SETTING_TERRAIN_TYPE_HELPTEXT :Vælg højden på bakker og bjerge i landskabet STR_CONFIG_SETTING_INDUSTRY_DENSITY :Industri tæthed: {STRING} STR_CONFIG_SETTING_INDUSTRY_DENSITY_HELPTEXT :Angiv hvor mange industrier skal genereres og hvilket niveau der bevares i løbet af spillet @@ -1498,18 +1499,18 @@ STR_CONFIG_SETTING_OIL_REF_EDGE_DISTANCE :Maksimal afstan STR_CONFIG_SETTING_OIL_REF_EDGE_DISTANCE_HELPTEXT :Grænse for hvor langt fra kortets kant olieraffinaderier kan blive bygget. På ø-kort sikrer dette at de er nær kysten. På kort større end 256 felter bliver denne værdi automatisk skaleret op. STR_CONFIG_SETTING_SNOWLINE_HEIGHT :Snelinjehøjden: {STRING} -STR_CONFIG_SETTING_SNOWLINE_HEIGHT_HELPTEXT :Styrer ved hvilken højde sneen starter i det sub-arktiske landskab. Sne påvirker også industri-generering og byers krav for at vokse.Kan kun ændres i Scenarieeditoren, og beregnes ellers via "snedække". +STR_CONFIG_SETTING_SNOWLINE_HEIGHT_HELPTEXT :Vælg, i hvilken højde sneen starter i det subarktiske landskab. Sne påvirker også industriproduktion og byvækstkrav. Kan kun ændres via Scenario Editor eller på anden måde beregnes via "snedækning" STR_CONFIG_SETTING_SNOW_COVERAGE :Snedække: {STRING} -STR_CONFIG_SETTING_SNOW_COVERAGE_HELPTEXT :Styrer den omtrentlige mængde sne i det sub-arktiske landskab. Sne påvirker også industri-generering og byernes krav for at vokse. Anvendes kun under landskabsgenerering. Land lige over havniveau er altid snefrit. +STR_CONFIG_SETTING_SNOW_COVERAGE_HELPTEXT :Vælg den omtrentlige mængde sne på det subarktiske landskab. Sne påvirker også industriproduktion og byvækstkrav. Bruges kun under kortgenerering. Havniveau og kystfliser har aldrig sne. STR_CONFIG_SETTING_SNOW_COVERAGE_VALUE :{NUM}% STR_CONFIG_SETTING_DESERT_COVERAGE :Ørkendækning: {STRING} -STR_CONFIG_SETTING_DESERT_COVERAGE_HELPTEXT :Styrer den omtrentlige mængde ørken i det tropiske landskab. Ørken påvirker også industri-generering. Anvendes kun under landskabsgenerering. +STR_CONFIG_SETTING_DESERT_COVERAGE_HELPTEXT :Vælg den omtrentlige mængde ørken i det tropiske landskab. Ørken påvirker også industriproduktion og byvækstkrav. Bruges kun under kortgenerering STR_CONFIG_SETTING_DESERT_COVERAGE_VALUE :{NUM}% STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN :Tærrenets hårdhed (kun TerraGenesis) : {STRING} -STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_HELPTEXT :(TerraGenesis kun) Vælg frekvensen af bakkerne: Glatte landskaber har færre, mere udbredt bakker. Ujævne landskaber har mange bakker, der kan se gentaget ud +STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_HELPTEXT :Vælg formen og antallet af bakker. Glatte landskaber har færre, bredere bakker, mens barske landskaber har flere mindre bakker. ###length 4 STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_VERY_SMOOTH :Meget blødt STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_SMOOTH :Blødt @@ -1517,7 +1518,7 @@ STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_ROUGH :Råt STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_VERY_ROUGH :Meget råt STR_CONFIG_SETTING_VARIETY :Forskelligheds fordeling: {STRING} -STR_CONFIG_SETTING_VARIETY_HELPTEXT :(TerraGenesis kun) Kontrollere, om kortet indeholder både bjerg- og flade områder. Da dette kun gør kortet fladere bør andre indstillinger sættes til bjergrigt +STR_CONFIG_SETTING_VARIETY_HELPTEXT :Vælg om kortet indeholder både bjerge og flade områder. Jo højere sorten er, jo flere højdeforskelle mellem bjergrige og flade områder. STR_CONFIG_SETTING_RIVER_AMOUNT :Floder antal: {STRING} STR_CONFIG_SETTING_RIVER_AMOUNT_HELPTEXT :Vælg, hvor mange floder at skabe @@ -1658,6 +1659,7 @@ STR_CONFIG_SETTING_ADVANCED_VEHICLE_LISTS_HELPTEXT :Aktiver brug af STR_CONFIG_SETTING_LOADING_INDICATORS :Benyt laste-indikatorer: {STRING} STR_CONFIG_SETTING_LOADING_INDICATORS_HELPTEXT :Vælg om lastnings-indikatorer vises ved pålæsning og aflæsning af køretøjer +STR_CONFIG_SETTING_TIMETABLE_MODE :Tidsenheder for køreplaner: {STRING} STR_CONFIG_SETTING_TIMETABLE_MODE_HELPTEXT :Vælg de tidsenheder, der skal bruges til køreplaner ###length 3 STR_CONFIG_SETTING_TIMETABLE_MODE_DAYS :Dage @@ -3211,7 +3213,9 @@ STR_MAPGEN_TOWN_NAME_DROPDOWN_TOOLTIP :{BLACK}Vælg st STR_MAPGEN_DATE :{BLACK}Dato: STR_MAPGEN_DATE_TOOLTIP :{BLACK}Vælg startdato STR_MAPGEN_NUMBER_OF_INDUSTRIES :{BLACK}Antal industrier: +STR_MAPGEN_NUMBER_OF_INDUSTRIES_TOOLTIP :{BLACK}Vælg tætheden af industrier eller et brugerdefineret tal STR_MAPGEN_HEIGHTMAP_HEIGHT :{BLACK}Højeste bjergtop: +STR_MAPGEN_HEIGHTMAP_HEIGHT_TOOLTIP :{BLACK}Vælg den højeste top, som spillet vil forsøge at skabe, målt i højde over havets overflade STR_MAPGEN_HEIGHTMAP_HEIGHT_UP :{BLACK}Forøger den maksimale højde på højeste bjergtop på kortet med én STR_MAPGEN_HEIGHTMAP_HEIGHT_DOWN :{BLACK}Sænker den maksimale højde på højeste bjergtop på kortet med én STR_MAPGEN_SNOW_COVERAGE :{BLACK}Snedække: @@ -3224,6 +3228,7 @@ STR_MAPGEN_DESERT_COVERAGE_DOWN :{BLACK}Sænker STR_MAPGEN_DESERT_COVERAGE_TEXT :{BLACK}{NUM}% STR_MAPGEN_TERRAIN_TYPE :{BLACK}Terræntype: STR_MAPGEN_SEA_LEVEL :{BLACK}Havniveau +STR_MAPGEN_SEA_LEVEL_TOOLTIP :{BLACK}Vælg havniveau STR_MAPGEN_QUANTITY_OF_RIVERS :{BLACK}Floder: STR_MAPGEN_SMOOTHNESS :{BLACK}Blødhed: STR_MAPGEN_VARIETY :{BLACK}Varietet af distributionen: @@ -3261,6 +3266,7 @@ STR_MAPGEN_TOWN_NAME_CATALAN :Catalanske # Strings for map borders at game generation STR_MAPGEN_BORDER_TYPE :{BLACK}Kortkanter: +STR_MAPGEN_BORDER_TYPE_TOOLTIP :Vælg ydre grænser for spilverdenen STR_MAPGEN_NORTHWEST :{BLACK}Nordvest STR_MAPGEN_NORTHEAST :{BLACK}Nordøst STR_MAPGEN_SOUTHEAST :{BLACK}Sydøst @@ -3273,7 +3279,9 @@ STR_MAPGEN_BORDER_MANUAL :{BLACK}Manuel STR_MAPGEN_HEIGHTMAP_ROTATION :{BLACK}Højdekortets rotation: STR_MAPGEN_HEIGHTMAP_NAME :{BLACK}Højdekortets navn: +STR_MAPGEN_HEIGHTMAP_NAME_TOOLTIP :{BLACK}Navnet på højdekort-billedfilen STR_MAPGEN_HEIGHTMAP_SIZE_LABEL :{BLACK}Størrelse: +STR_MAPGEN_HEIGHTMAP_SIZE_LABEL_TOOLTIP :{BLACK}Størrelsen på kildehøjdekortbilledet. For de bedste resultater skal hver kant matche en tilgængelig kortkantlængde i OpenTTD, såsom 256, 512, 1024 osv. STR_MAPGEN_HEIGHTMAP_SIZE :{ORANGE}{NUM} x {NUM} STR_MAPGEN_TERRAIN_TYPE_QUERY_CAPT :{WHITE}Ønsket højeste bjergtop @@ -3288,6 +3296,7 @@ STR_SE_MAPGEN_FLAT_WORLD :{WHITE}Fladt la STR_SE_MAPGEN_FLAT_WORLD_TOOLTIP :{BLACK}Generer fladt landskab STR_SE_MAPGEN_RANDOM_LAND :{WHITE}Tilfældigt land STR_SE_MAPGEN_FLAT_WORLD_HEIGHT :{BLACK}Højde af fladt landskab: +STR_SE_MAPGEN_FLAT_WORLD_HEIGHT_TOOLTIP :{BLACK}Vælg højden af landet over havets overflade STR_SE_MAPGEN_FLAT_WORLD_HEIGHT_DOWN :{BLACK}Sæt højden af fladt landskab en ned STR_SE_MAPGEN_FLAT_WORLD_HEIGHT_UP :{BLACK}Sæt højden af fladt landskab en op @@ -4614,6 +4623,7 @@ STR_TIMETABLE_EXPECTED_TOOLTIP :{BLACK}Skift me STR_TIMETABLE_ARRIVAL_DATE :A: {COLOUR}{DATE_TINY} STR_TIMETABLE_DEPARTURE_DATE :D: {COLOUR}{DATE_TINY} STR_TIMETABLE_ARRIVAL_SECONDS_IN_FUTURE :A: {COLOUR}{COMMA} sek +STR_TIMETABLE_DEPARTURE_SECONDS_IN_FUTURE :D: {COLOUR}{COMMA} sek # Date window (for timetable) diff --git a/src/lang/dutch.txt b/src/lang/dutch.txt index 5ddd1e5dc5..60fead6ee5 100644 --- a/src/lang/dutch.txt +++ b/src/lang/dutch.txt @@ -1491,7 +1491,7 @@ STR_CONFIG_SETTING_LAND_GENERATOR_ORIGINAL :Origineel STR_CONFIG_SETTING_LAND_GENERATOR_TERRA_GENESIS :TerraGenesis STR_CONFIG_SETTING_TERRAIN_TYPE :Terreintype: {STRING} -STR_CONFIG_SETTING_TERRAIN_TYPE_HELPTEXT :(Alleen TerraGenesis) Heuvelachtigheid van het landschap +STR_CONFIG_SETTING_TERRAIN_TYPE_HELPTEXT :Kies de hoogte van heuvels en bergen in het landschap STR_CONFIG_SETTING_INDUSTRY_DENSITY :Industriedichtheid: {STRING} STR_CONFIG_SETTING_INDUSTRY_DENSITY_HELPTEXT :Stelt in hoeveel industrieën worden gegenereerd en welk niveau tijdens het spel moet worden gehandhaafd @@ -1500,18 +1500,18 @@ STR_CONFIG_SETTING_OIL_REF_EDGE_DISTANCE :Maximumafstand STR_CONFIG_SETTING_OIL_REF_EDGE_DISTANCE_HELPTEXT :Olieraffinaderijen worden alleen gebouwd nabij de kaartgrens, dat is aan de kust van eilandkaarten STR_CONFIG_SETTING_SNOWLINE_HEIGHT :Sneeuwhoogte: {STRING} -STR_CONFIG_SETTING_SNOWLINE_HEIGHT_HELPTEXT :Stelt in op welke hoogte de sneeuw begint in subarctisch landschap. Sneeuw heeft ook invloed op het ontstaan van industrieën en op de vereisten voor stadsgroei. Kan alleen worden aangepast in de scenariobewerker of wordt berekend met behulp van 'sneeuwoppervlak' +STR_CONFIG_SETTING_SNOWLINE_HEIGHT_HELPTEXT :Kies op welke hoogte de sneeuw begint in subarctisch landschap. Sneeuw heeft ook invloed op het ontstaan van industrieën en op de vereisten voor stadsgroei. Kan alleen worden aangepast in de scenariobewerker of wordt berekend met behulp van 'sneeuwoppervlak' STR_CONFIG_SETTING_SNOW_COVERAGE :Sneeuwoppervlak: {STRING} -STR_CONFIG_SETTING_SNOW_COVERAGE_HELPTEXT :Bepaalt de hoeveelheid sneeuw in het subarctische landschap. Sneeuw is ook van invloed op de industrieën en de groei van steden. Wordt alleen gebruikt tijdens het maken van de kaart. Land net boven zeeniveau krijgt nooit sneeuw +STR_CONFIG_SETTING_SNOW_COVERAGE_HELPTEXT :Kies de hoeveelheid sneeuw in het subarctische landschap. Sneeuw is ook van invloed op de industrieën en de groei van steden. Wordt alleen gebruikt tijdens het maken van de kaart. Land op zeeniveau of aan de kust krijgt nooit sneeuw. STR_CONFIG_SETTING_SNOW_COVERAGE_VALUE :{NUM}% STR_CONFIG_SETTING_DESERT_COVERAGE :Woestijnoppervlak: {STRING} -STR_CONFIG_SETTING_DESERT_COVERAGE_HELPTEXT :Bepaalt de hoeveelheid woestijn in het tropische landschap. Woestijn is ook van invloed op industrieën. Wordt alleen gebruikt tijdens het maken van de kaart +STR_CONFIG_SETTING_DESERT_COVERAGE_HELPTEXT :Kies de hoeveelheid woestijn in het tropische landschap. Woestijn is ook van invloed op het ontstaan van industrieën en de vereisten voor stadsgroei. Wordt alleen gebruikt tijdens het maken van de kaart STR_CONFIG_SETTING_DESERT_COVERAGE_VALUE :{NUM}% STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN :Ruwheid van het terrein: {STRING} -STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_HELPTEXT :(Alleen TerraGenesis) Selecteer de frequentie van heuvels: gladde landschappen hebben minder, meer wijdverspreide heuvels. Ruwe landschappen hebben veel heuvels, die repetitief kunnen lijken. +STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_HELPTEXT :Kies vorm en aantal heuvels. Gladde landschappen hebben minder en bredere heuvels. Ruwe landschappen hebben meer, maar kleinere heuvels. ###length 4 STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_VERY_SMOOTH :Erg glad STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_SMOOTH :Glad @@ -1519,7 +1519,7 @@ STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_ROUGH :Ruig STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_VERY_ROUGH :Erg ruig STR_CONFIG_SETTING_VARIETY :Variëteit distributie: {STRING} -STR_CONFIG_SETTING_VARIETY_HELPTEXT :(Alleen TerraGenesis) Bepaalt of de kaart zowel bergachtige als vlakke gebieden bevat. Aangezien dit de kaart alleen platter maakt, moeten andere instellingen worden ingesteld op bergachtig. +STR_CONFIG_SETTING_VARIETY_HELPTEXT :Kies of de kaart zowel bergachtige als vlakke gebieden bevat. Hoe groter de variatie, hoe meer verschillen in hoogte tussen bergachtige en vlakke gebieden. STR_CONFIG_SETTING_RIVER_AMOUNT :Hoeveelheid rivieren: {STRING} STR_CONFIG_SETTING_RIVER_AMOUNT_HELPTEXT :Selecteer hoeveel rivieren er gegenereerd worden @@ -1539,6 +1539,7 @@ STR_CONFIG_SETTING_ROAD_SIDE_LEFT :Links rijden STR_CONFIG_SETTING_ROAD_SIDE_RIGHT :Rechts rijden STR_CONFIG_SETTING_HEIGHTMAP_ROTATION :Draaiing van hoogtekaart: {STRING} +STR_CONFIG_SETTING_HEIGHTMAP_ROTATION_TOOLTIP :Kies in welke richting de hoogtekaart wordt gedraaid om deze aan te passen aan de spelwereld ###length 2 STR_CONFIG_SETTING_HEIGHTMAP_ROTATION_COUNTER_CLOCKWISE :Tegen de klok in STR_CONFIG_SETTING_HEIGHTMAP_ROTATION_CLOCKWISE :Met de klok mee @@ -3208,11 +3209,15 @@ STR_MAPGEN_MAPSIZE :{BLACK}Kaartgro STR_MAPGEN_MAPSIZE_TOOLTIP :{BLACK}Selecteer het formaat van de kaart in tegels. Het aantal beschikbare tegels zal iets kleiner zijn STR_MAPGEN_BY :{BLACK}* STR_MAPGEN_NUMBER_OF_TOWNS :{BLACK}Aantal steden: +STR_MAPGEN_NUMBER_OF_TOWNS_TOOLTIP :{BLACK}Kies de dichtheid van steden of een aangepast getal STR_MAPGEN_TOWN_NAME_LABEL :{BLACK}Plaatsnamen: STR_MAPGEN_TOWN_NAME_DROPDOWN_TOOLTIP :{BLACK}Stijl voor plaatsnamen kiezen STR_MAPGEN_DATE :{BLACK}Datum: +STR_MAPGEN_DATE_TOOLTIP :{BLACK}Kies de startdatum STR_MAPGEN_NUMBER_OF_INDUSTRIES :{BLACK}Aantal industrieën: +STR_MAPGEN_NUMBER_OF_INDUSTRIES_TOOLTIP :{BLACK}Kies de dichtheid van industrieën of een aangepast getal STR_MAPGEN_HEIGHTMAP_HEIGHT :{BLACK}Hoogste berg: +STR_MAPGEN_HEIGHTMAP_HEIGHT_TOOLTIP :{BLACK}Kies de hoogste piek die het spel probeert te creëren, gemeten in hoogte boven zeeniveau STR_MAPGEN_HEIGHTMAP_HEIGHT_UP :{BLACK}Verhoogt de maximale hoogte van de hoogste berg op de kaart met één STR_MAPGEN_HEIGHTMAP_HEIGHT_DOWN :{BLACK}Verlaagt de maximale hoogte van de hoogste berg op de kaart met één STR_MAPGEN_SNOW_COVERAGE :{BLACK}Sneeuwoppervlak: @@ -3225,10 +3230,12 @@ STR_MAPGEN_DESERT_COVERAGE_DOWN :{BLACK}Verklein STR_MAPGEN_DESERT_COVERAGE_TEXT :{BLACK}{NUM}% STR_MAPGEN_TERRAIN_TYPE :{BLACK}Terreintype: STR_MAPGEN_SEA_LEVEL :{BLACK}Zeeniveau: +STR_MAPGEN_SEA_LEVEL_TOOLTIP :{BLACK}Kies het zeeniveau STR_MAPGEN_QUANTITY_OF_RIVERS :{BLACK}Rivieren: STR_MAPGEN_SMOOTHNESS :{BLACK}Gladheid: STR_MAPGEN_VARIETY :{BLACK}Landschapsvariatie: STR_MAPGEN_GENERATE :{WHITE}Maken +STR_MAPGEN_GENERATE_TOOLTIP :{BLACK}Creëer de wereld en speel OpenTTD! STR_MAPGEN_NEWGRF_SETTINGS :{BLACK}NewGRF-instellingen STR_MAPGEN_NEWGRF_SETTINGS_TOOLTIP :{BLACK}NewGRF-instellingen weergeven STR_MAPGEN_AI_SETTINGS :{BLACK}AI-instellingen @@ -3261,6 +3268,7 @@ STR_MAPGEN_TOWN_NAME_CATALAN :Catalaans # Strings for map borders at game generation STR_MAPGEN_BORDER_TYPE :{BLACK}Kaartranden: +STR_MAPGEN_BORDER_TYPE_TOOLTIP :{BLACK}Kies de grenzen van de spelwereld STR_MAPGEN_NORTHWEST :{BLACK}Noordwest STR_MAPGEN_NORTHEAST :{BLACK}Noordoost STR_MAPGEN_SOUTHEAST :{BLACK}Zuidoost @@ -3273,7 +3281,9 @@ STR_MAPGEN_BORDER_MANUAL :{BLACK}Handmati STR_MAPGEN_HEIGHTMAP_ROTATION :{BLACK}Rotatie van hoogtekaart: STR_MAPGEN_HEIGHTMAP_NAME :{BLACK}Naam van hoogtekaart: +STR_MAPGEN_HEIGHTMAP_NAME_TOOLTIP :{BLACK}De naam van het hoogtekaart-bestand STR_MAPGEN_HEIGHTMAP_SIZE_LABEL :{BLACK}Grootte: +STR_MAPGEN_HEIGHTMAP_SIZE_LABEL_TOOLTIP :{BLACK}De grootte van de bron-hoogtekaart. Voor optimaal resultaat kies je de lengten van de zijden gelijk aan de beschikbare kaartmaten in OpenTTD, zoals 256, 512, 1024 enz. STR_MAPGEN_HEIGHTMAP_SIZE :{ORANGE}{NUM} x {NUM} STR_MAPGEN_TERRAIN_TYPE_QUERY_CAPT :{WHITE}Gewenste hoogte van bergen @@ -3288,6 +3298,7 @@ STR_SE_MAPGEN_FLAT_WORLD :{WHITE}Vlak lan STR_SE_MAPGEN_FLAT_WORLD_TOOLTIP :{BLACK}Genereer een vlakke kaart STR_SE_MAPGEN_RANDOM_LAND :{WHITE}Willekeurig land STR_SE_MAPGEN_FLAT_WORLD_HEIGHT :{BLACK}Hoogte van vlak land: +STR_SE_MAPGEN_FLAT_WORLD_HEIGHT_TOOLTIP :{BLACK}Kies de hoogte van het land boven zee STR_SE_MAPGEN_FLAT_WORLD_HEIGHT_DOWN :{BLACK}Verlaag de hoogte van vlak land met één STR_SE_MAPGEN_FLAT_WORLD_HEIGHT_UP :{BLACK}Verhoog de hoogte van vlak land met één diff --git a/src/lang/english.txt b/src/lang/english.txt index 3aa24bce81..05a5884905 100644 --- a/src/lang/english.txt +++ b/src/lang/english.txt @@ -2196,12 +2196,20 @@ STR_LIVERY_TRAIN_TOOLTIP :{BLACK}Show tra STR_LIVERY_ROAD_VEHICLE_TOOLTIP :{BLACK}Show road vehicle colour schemes STR_LIVERY_SHIP_TOOLTIP :{BLACK}Show ship colour schemes STR_LIVERY_AIRCRAFT_TOOLTIP :{BLACK}Show aircraft colour schemes +STR_LIVERY_TRAIN_GROUP_TOOLTIP :{BLACK}Show colours of train groups +STR_LIVERY_ROAD_VEHICLE_GROUP_TOOLTIP :{BLACK}Show colours of road vehicle groups +STR_LIVERY_SHIP_GROUP_TOOLTIP :{BLACK}Show colours of ship groups +STR_LIVERY_AIRCRAFT_GROUP_TOOLTIP :{BLACK}Show colours of aircraft groups STR_LIVERY_PRIMARY_TOOLTIP :{BLACK}Choose the primary colour for the selected scheme. Ctrl+Click will set this colour for every scheme STR_LIVERY_SECONDARY_TOOLTIP :{BLACK}Choose the secondary colour for the selected scheme. Ctrl+Click will set this colour for every scheme STR_LIVERY_PANEL_TOOLTIP :{BLACK}Select a colour scheme to change, or multiple schemes with Ctrl+Click. Click on the box to toggle use of the scheme +STR_LIVERY_TRAIN_GROUP_EMPTY :No train groups are set up +STR_LIVERY_ROAD_VEHICLE_GROUP_EMPTY :No road vehicle groups are set up +STR_LIVERY_SHIP_GROUP_EMPTY :No ship groups are set up +STR_LIVERY_AIRCRAFT_GROUP_EMPTY :No aircraft groups are set up ###length 23 -STR_LIVERY_DEFAULT :Standard Livery +STR_LIVERY_DEFAULT :Default Livery STR_LIVERY_STEAM :Steam Engine STR_LIVERY_DIESEL :Diesel Engine STR_LIVERY_ELECTRIC :Electric Engine diff --git a/src/lang/english_AU.txt b/src/lang/english_AU.txt index a5f3bd9d8c..0278f5a4ee 100644 --- a/src/lang/english_AU.txt +++ b/src/lang/english_AU.txt @@ -4467,9 +4467,9 @@ STR_ORDER_CONDITIONAL_COMPARATOR_TOOLTIP :{BLACK}How to c STR_ORDER_CONDITIONAL_COMPARATOR_EQUALS :is equal to STR_ORDER_CONDITIONAL_COMPARATOR_NOT_EQUALS :is not equal to STR_ORDER_CONDITIONAL_COMPARATOR_LESS_THAN :is less than -STR_ORDER_CONDITIONAL_COMPARATOR_LESS_EQUALS :is less or equal to +STR_ORDER_CONDITIONAL_COMPARATOR_LESS_EQUALS :is less than or equal to STR_ORDER_CONDITIONAL_COMPARATOR_MORE_THAN :is more than -STR_ORDER_CONDITIONAL_COMPARATOR_MORE_EQUALS :is more or equal to +STR_ORDER_CONDITIONAL_COMPARATOR_MORE_EQUALS :is more than or equal to STR_ORDER_CONDITIONAL_COMPARATOR_IS_TRUE :is true STR_ORDER_CONDITIONAL_COMPARATOR_IS_FALSE :is false diff --git a/src/lang/finnish.txt b/src/lang/finnish.txt index 066c967b3a..d161ecb8c3 100644 --- a/src/lang/finnish.txt +++ b/src/lang/finnish.txt @@ -255,6 +255,9 @@ STR_UNITS_HEIGHT_IMPERIAL :{DECIMAL}{NBSP} STR_UNITS_HEIGHT_METRIC :{DECIMAL}{NBSP}m STR_UNITS_HEIGHT_SI :{DECIMAL}{NBSP}m +STR_UNITS_DAYS :{COMMA}{NBSP}vrk +STR_UNITS_SECONDS :{COMMA}{NBSP}sekunti{P "" a} +STR_UNITS_TICKS :{COMMA}{NBSP}räpäys{P "" tä} # Common window strings STR_LIST_FILTER_TITLE :{BLACK}Suodatin: @@ -719,6 +722,7 @@ STR_PLAYLIST_TOOLTIP_CLICK_TO_ADD_TRACK :{BLACK}Valitse STR_PLAYLIST_TOOLTIP_CLICK_TO_REMOVE_TRACK :{BLACK}Poista musiikkiraita nykyiseltä soittolistalta napsauttamalla (vain oma{NBSP}1 tai oma{NBSP}2) # Highscore window +STR_HIGHSCORE_TOP_COMPANIES :{BIG_FONT}{BLACK}Huippuyhtiöt STR_HIGHSCORE_POSITION :{BIG_FONT}{BLACK}{COMMA}. STR_HIGHSCORE_PERFORMANCE_TITLE_BUSINESSMAN :Kaupantekijä STR_HIGHSCORE_PERFORMANCE_TITLE_ENTREPRENEUR :Yrittäjä @@ -1487,7 +1491,7 @@ STR_CONFIG_SETTING_LAND_GENERATOR_ORIGINAL :Alkuperäinen STR_CONFIG_SETTING_LAND_GENERATOR_TERRA_GENESIS :TerraGenesis STR_CONFIG_SETTING_TERRAIN_TYPE :Maaston tyyppi: {STRING} -STR_CONFIG_SETTING_TERRAIN_TYPE_HELPTEXT :(Vain TerraGenesis) Maaston mäkisyys +STR_CONFIG_SETTING_TERRAIN_TYPE_HELPTEXT :Valitse maiseman mäkien ja vuorten korkeus STR_CONFIG_SETTING_INDUSTRY_DENSITY :Teollisuuden määrä: {STRING} STR_CONFIG_SETTING_INDUSTRY_DENSITY_HELPTEXT :Määritä, kuinka paljon teollisuutta tulisi luoda ja millä tasolla teollisuuden tulisi pysytellä pelin aikana @@ -1496,18 +1500,18 @@ STR_CONFIG_SETTING_OIL_REF_EDGE_DISTANCE :Suurin sallittu STR_CONFIG_SETTING_OIL_REF_EDGE_DISTANCE_HELPTEXT :Öljynjalostamojen ja öljynporauslauttojen suurin etäisyys kartan reunasta. Saarikartoilla tämä takaa sen, että ne ovat lähellä rannikkoa. Yli 256 ruudun kartoilla tämä arvo suhteutetaan kartan kokoon. STR_CONFIG_SETTING_SNOWLINE_HEIGHT :Lumirajan korkeus: {STRING} -STR_CONFIG_SETTING_SNOWLINE_HEIGHT_HELPTEXT :Määritä, millä korkeudella lumiraja on pohjoisessa maastotyypissä. Lumi vaikuttaa teollisuuslaitosten luontiin sekä kuntien kasvuedellytyksiin. Voidaan muuttaa vain Skenaariomuokkaimessa, muuten lasketaan ”lumen peiton” perusteella +STR_CONFIG_SETTING_SNOWLINE_HEIGHT_HELPTEXT :Säätää lumirajan korkeutta pohjoisessa maastossa. Lumi vaikuttaa myös teollisuuslaitosten luontiin ja kuntien kasvuedellytyksiin. Voidaan muuttaa vain skenaariomuokkaimessa, lasketaan muutoin ”lumen peiton” perusteella STR_CONFIG_SETTING_SNOW_COVERAGE :Lumen peitto: {STRING} -STR_CONFIG_SETTING_SNOW_COVERAGE_HELPTEXT :Säätele lumen määrän suuruusluokkaa pohjoisessa maastossa. Lumi vaikuttaa myös teollisuuden luontiin ja kuntien kasvuedellytyksiin. Käytetään vain karttaa luodessa. Juuri merenpinnan yläpuolella oleva maa on aina lumetonta +STR_CONFIG_SETTING_SNOW_COVERAGE_HELPTEXT :Säätää lumen määrän suuruusluokkaa pohjoisessa maastossa. Lumi vaikuttaa myös teollisuuslaitosten luontiin ja kuntien kasvuedellytyksiin. Käytetään vain karttaa luotaessa. Merenpinnan tasolla sijaitsevat ruudut ja rannikkoruudut ovat aina lumettomat. STR_CONFIG_SETTING_SNOW_COVERAGE_VALUE :{NUM}{NBSP}% STR_CONFIG_SETTING_DESERT_COVERAGE :Aavikon peitto: {STRING} -STR_CONFIG_SETTING_DESERT_COVERAGE_HELPTEXT :Säätele aavikon määrän suuruusluokkaa subtrooppisessa maastossa. Aavikko vaikuttaa myös teollisuuden luontiin. Käytetään vain karttaa luodessa +STR_CONFIG_SETTING_DESERT_COVERAGE_HELPTEXT :Säätele aavikon määrän suuruusluokkaa subtrooppisessa maastossa. Aavikko vaikuttaa myös teollisuuslaitosten luontiin ja kuntien kasvuedellytyksiin. Käytetään vain karttaa luotaessa. STR_CONFIG_SETTING_DESERT_COVERAGE_VALUE :{NUM}{NBSP}% STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN :Maaston epätasaisuus: {STRING} -STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_HELPTEXT :(Vain TerraGenesis) Määritä mäkien tiheys: Tasaisessa maastossa mäet ovat laajempia ja niitä on vähemmän. Epätasaisessa maastossa on enemmän mäkiä, mikä voi saada maaston näyttämään itseään toistavalta +STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_HELPTEXT :Määritä mäkien muoto ja tiheys. Tasaisessa maastossa mäkiä on vähemmän ja ne ovat laajempia, kun taas epätasaisessa maastossa on useampia pienempiä mäkiä. ###length 4 STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_VERY_SMOOTH :Erittäin tasainen STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_SMOOTH :Tasainen @@ -1515,7 +1519,7 @@ STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_ROUGH :Epätasainen STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_VERY_ROUGH :Erittäin epätasainen STR_CONFIG_SETTING_VARIETY :Maaston vaihtelu: {STRING} -STR_CONFIG_SETTING_VARIETY_HELPTEXT :(Vain TerraGenesis) Valitse, onko kartalla sekä vuoristoisia että tasaisia alueita. Koska tämä asetus tekee maastosta tasaisempaa, muut asetukset tulisi määrittää vuoristoisiksi +STR_CONFIG_SETTING_VARIETY_HELPTEXT :Valitse, onko kartalla sekä vuoristoisia että tasaisia alueita. Mitä suurempi on vaihtelu, sitä suurempia ovat korkeuserot vuoristoisten ja tasaisten alueiden välillä. STR_CONFIG_SETTING_RIVER_AMOUNT :Jokien määrä: {STRING} STR_CONFIG_SETTING_RIVER_AMOUNT_HELPTEXT :Valitse, kuinka paljon jokia luodaan @@ -1535,6 +1539,7 @@ STR_CONFIG_SETTING_ROAD_SIDE_LEFT :Vasemmanpuoline STR_CONFIG_SETTING_ROAD_SIDE_RIGHT :Oikeanpuolinen liikenne STR_CONFIG_SETTING_HEIGHTMAP_ROTATION :Korkeuskartan pyöritys:{STRING} +STR_CONFIG_SETTING_HEIGHTMAP_ROTATION_TOOLTIP :Valitse, mihin suuntaan korkeuskartan kuvaa kierretään pelimaailmaan sopiakseen ###length 2 STR_CONFIG_SETTING_HEIGHTMAP_ROTATION_COUNTER_CLOCKWISE :Vastapäivään STR_CONFIG_SETTING_HEIGHTMAP_ROTATION_CLOCKWISE :Myötäpäivään @@ -1655,7 +1660,12 @@ STR_CONFIG_SETTING_ADVANCED_VEHICLE_LISTS_HELPTEXT :Salli kehittyne STR_CONFIG_SETTING_LOADING_INDICATORS :Lastausilmaisimet: {STRING} STR_CONFIG_SETTING_LOADING_INDICATORS_HELPTEXT :Määritä näytetäänkö lastausilmaisimet kulkuneuvojen yläpuolella lastatessa ja purettaessa rahtia +STR_CONFIG_SETTING_TIMETABLE_MODE :Aikataulujen aikayksikkö: {STRING} +STR_CONFIG_SETTING_TIMETABLE_MODE_HELPTEXT :Valitse kulkuneuvojen aikatauluissa käytettävä aikayksikkö ###length 3 +STR_CONFIG_SETTING_TIMETABLE_MODE_DAYS :Vuorokaudet +STR_CONFIG_SETTING_TIMETABLE_MODE_SECONDS :Sekunnit +STR_CONFIG_SETTING_TIMETABLE_MODE_TICKS :Räpäykset STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE :Näytä saapuminen ja lähtö aikatauluissa: {STRING} STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE_HELPTEXT :Näytä odotetut saapumis- ja lähtemisajat aikatauluissa @@ -2344,7 +2354,7 @@ STR_NETWORK_START_SERVER_NEW_GAME_NAME_TOOLTIP :{BLACK}Nimi nä STR_NETWORK_START_SERVER_SET_PASSWORD :{BLACK}Aseta salasana STR_NETWORK_START_SERVER_PASSWORD_TOOLTIP :{BLACK}Jos peliin ei halua ulkopuolisia, voi sen suojata salasanalla -STR_NETWORK_START_SERVER_VISIBILITY_LABEL :{BLACK}Näkyvyys +STR_NETWORK_START_SERVER_VISIBILITY_LABEL :{BLACK}Näkyvyys: STR_NETWORK_START_SERVER_VISIBILITY_TOOLTIP :{BLACK}Näkyykö palvelimesi muille julkisessa listauksessa STR_NETWORK_START_SERVER_CLIENTS_SELECT :{BLACK}{NUM} asiakas{P "" ta} STR_NETWORK_START_SERVER_NUMBER_OF_CLIENTS :{BLACK}Pelaajien enimmäismäärä: @@ -3199,11 +3209,15 @@ STR_MAPGEN_MAPSIZE :{BLACK}Kartan k STR_MAPGEN_MAPSIZE_TOOLTIP :{BLACK}Valitse kartan koko ruutuina. Saatavilla olevien ruutujen määrä on hieman alhaisempi STR_MAPGEN_BY :{BLACK}× STR_MAPGEN_NUMBER_OF_TOWNS :{BLACK}Kuntien määrä: +STR_MAPGEN_NUMBER_OF_TOWNS_TOOLTIP :{BLACK}Valitse kuntien tiheys tai valinnainen määrä STR_MAPGEN_TOWN_NAME_LABEL :{BLACK}Kuntien nimet: STR_MAPGEN_TOWN_NAME_DROPDOWN_TOOLTIP :{BLACK}Valitse kuntien nimien tyyli STR_MAPGEN_DATE :{BLACK}Päivämäärä: +STR_MAPGEN_DATE_TOOLTIP :{BLACK}Valitse aloituspäivä STR_MAPGEN_NUMBER_OF_INDUSTRIES :{BLACK}Teollisuuden määrä: +STR_MAPGEN_NUMBER_OF_INDUSTRIES_TOOLTIP :{BLACK}Valitse teollisuuden tiheys tai valinnainen määrä STR_MAPGEN_HEIGHTMAP_HEIGHT :{BLACK}Korkein huippu: +STR_MAPGEN_HEIGHTMAP_HEIGHT_TOOLTIP :{BLACK}Valitse korkein huippu, jonka peli pyrkii luomaan, mitattuna korkeutena merenpinnasta STR_MAPGEN_HEIGHTMAP_HEIGHT_UP :{BLACK}Korota kartan korkeimman huipun maksimikorkeutta yhdellä STR_MAPGEN_HEIGHTMAP_HEIGHT_DOWN :{BLACK}Madalla kartan korkeimman huipun maksimikorkeutta yhdellä STR_MAPGEN_SNOW_COVERAGE :{BLACK}Lumen peitto: @@ -3216,10 +3230,12 @@ STR_MAPGEN_DESERT_COVERAGE_DOWN :{BLACK}Vähenn STR_MAPGEN_DESERT_COVERAGE_TEXT :{BLACK}{NUM}{NBSP}% STR_MAPGEN_TERRAIN_TYPE :{BLACK}Maaston tyyppi: STR_MAPGEN_SEA_LEVEL :{BLACK}Merenpinta: +STR_MAPGEN_SEA_LEVEL_TOOLTIP :{BLACK}Valitse merenpinnan taso STR_MAPGEN_QUANTITY_OF_RIVERS :{BLACK}Joet: STR_MAPGEN_SMOOTHNESS :{BLACK}Tasaisuus: STR_MAPGEN_VARIETY :{BLACK}Vaihtelu: STR_MAPGEN_GENERATE :{WHITE}Generoi +STR_MAPGEN_GENERATE_TOOLTIP :{BLACK}Luo maailma ja pelaa OpenTTD:tä! STR_MAPGEN_NEWGRF_SETTINGS :{BLACK}NewGRF-asetukset STR_MAPGEN_NEWGRF_SETTINGS_TOOLTIP :{BLACK}Näytä NewGRF-asetukset STR_MAPGEN_AI_SETTINGS :{BLACK}Tekoälyasetukset @@ -3252,6 +3268,7 @@ STR_MAPGEN_TOWN_NAME_CATALAN :Katalonialainen # Strings for map borders at game generation STR_MAPGEN_BORDER_TYPE :{BLACK}Kartan reunat: +STR_MAPGEN_BORDER_TYPE_TOOLTIP :{BLACK}Valitse pelimaailman reunukset STR_MAPGEN_NORTHWEST :{BLACK}Luode STR_MAPGEN_NORTHEAST :{BLACK}Koillinen STR_MAPGEN_SOUTHEAST :{BLACK}Kaakko @@ -3264,7 +3281,9 @@ STR_MAPGEN_BORDER_MANUAL :{BLACK}Manuaali STR_MAPGEN_HEIGHTMAP_ROTATION :{BLACK}Korkeuskartan kierto: STR_MAPGEN_HEIGHTMAP_NAME :{BLACK}Korkeuskartan nimi: +STR_MAPGEN_HEIGHTMAP_NAME_TOOLTIP :{BLACK}Korkeuskartan kuvatiedoston nimi STR_MAPGEN_HEIGHTMAP_SIZE_LABEL :{BLACK}Koko: +STR_MAPGEN_HEIGHTMAP_SIZE_LABEL_TOOLTIP :{BLACK}Korkeuskartan lähdekuvan koko. Paras tulos tulee, kun kuvan mitat vastaavat OpenTTD:n karttojen reunamittoja, kuten 256, 512, 1024, jne. STR_MAPGEN_HEIGHTMAP_SIZE :{ORANGE}{NUM}×{NUM} STR_MAPGEN_TERRAIN_TYPE_QUERY_CAPT :{WHITE}Huipun tavoitekorkeus @@ -3279,6 +3298,7 @@ STR_SE_MAPGEN_FLAT_WORLD :{WHITE}Tasainen STR_SE_MAPGEN_FLAT_WORLD_TOOLTIP :{BLACK}Luo tasainen maa STR_SE_MAPGEN_RANDOM_LAND :{WHITE}Satunnainen maa STR_SE_MAPGEN_FLAT_WORLD_HEIGHT :{BLACK}Tasaisen maan korkeus: +STR_SE_MAPGEN_FLAT_WORLD_HEIGHT_TOOLTIP :{BLACK}Valitse merenpinnan yläpuolisen maan korkeus STR_SE_MAPGEN_FLAT_WORLD_HEIGHT_DOWN :{BLACK}Siirrä tasaista maata yksi alaspäin STR_SE_MAPGEN_FLAT_WORLD_HEIGHT_UP :{BLACK}Siirrä tasaista maata yksi ylöspäin @@ -4572,8 +4592,13 @@ STR_TIMETABLE_STATUS_ON_TIME :{BLACK}Kulkuneu STR_TIMETABLE_STATUS_LATE :{BLACK}Kulkuneuvo on {STRING} myöhässä STR_TIMETABLE_STATUS_EARLY :{BLACK}Kulkuneuvo on {STRING} etuajassa STR_TIMETABLE_STATUS_NOT_STARTED :{BLACK}Tämä aikataulu ei ole vielä alkanut +STR_TIMETABLE_STATUS_START_AT_DATE :{BLACK}Tämä aikataulu alkaa {STRING} +STR_TIMETABLE_STATUS_START_IN_SECONDS :{BLACK}Tämä aikataulu alkaa {COMMA} sekunnin päästä +STR_TIMETABLE_START :{BLACK}Käynnistä aikataulu +STR_TIMETABLE_START_TOOLTIP :{BLACK}Valitse tämän aikataulun alkamisajankohta. Ctrl+napsautus jakaa tasaisesti kaikkien tätä käskyä jakavien kulkuneuvojen lähtöajat niiden keskinäisen järjestyksen mukaan, mikäli käsky on kokonaan aikataulutettu +STR_TIMETABLE_START_SECONDS_QUERY :Sekunteja aikataulun alkamiseen STR_TIMETABLE_CHANGE_TIME :{BLACK}Muuta aikaa STR_TIMETABLE_WAIT_TIME_TOOLTIP :{BLACK}Muuta aikaa, jonka valitun käskyn tulisi kestää. Ctrl+napsautus asettaa keston kaikille käskyille @@ -4597,6 +4622,10 @@ STR_TIMETABLE_EXPECTED :{BLACK}Odotettu STR_TIMETABLE_SCHEDULED :{BLACK}Aikataulu STR_TIMETABLE_EXPECTED_TOOLTIP :{BLACK}Vaihda odotetun ja aikataulun välillä +STR_TIMETABLE_ARRIVAL_DATE :T: {COLOUR}{DATE_TINY} +STR_TIMETABLE_DEPARTURE_DATE :L: {COLOUR}{DATE_TINY} +STR_TIMETABLE_ARRIVAL_SECONDS_IN_FUTURE :T: {COLOUR}{COMMA} s +STR_TIMETABLE_DEPARTURE_SECONDS_IN_FUTURE :L: {COLOUR}{COMMA} s # Date window (for timetable) diff --git a/src/lang/romanian.txt b/src/lang/romanian.txt index c3cd99252c..0c99dab235 100644 --- a/src/lang/romanian.txt +++ b/src/lang/romanian.txt @@ -719,6 +719,7 @@ STR_PLAYLIST_TOOLTIP_CLICK_TO_ADD_TRACK :{BLACK}Click pe STR_PLAYLIST_TOOLTIP_CLICK_TO_REMOVE_TRACK :{BLACK}Apasă pe melodie pentru a o elimina din programul actual (doar Custom1 sau Custom2) # Highscore window +STR_HIGHSCORE_TOP_COMPANIES :{BIG_FONT}{BLACK}Companii de top STR_HIGHSCORE_POSITION :{BIG_FONT}{BLACK}{COMMA}. STR_HIGHSCORE_PERFORMANCE_TITLE_BUSINESSMAN :Om de afaceri STR_HIGHSCORE_PERFORMANCE_TITLE_ENTREPRENEUR :Întreprinzător @@ -1533,6 +1534,7 @@ STR_CONFIG_SETTING_ROAD_SIDE_LEFT :Pe partea stân STR_CONFIG_SETTING_ROAD_SIDE_RIGHT :Pe partea dreaptă STR_CONFIG_SETTING_HEIGHTMAP_ROTATION :Rotaţie hartă înălţimi: {STRING} +STR_CONFIG_SETTING_HEIGHTMAP_ROTATION_TOOLTIP :Alegeți modul în care imaginea hărții de înălțime este rotită pentru a se potrivi în lumea jocului ###length 2 STR_CONFIG_SETTING_HEIGHTMAP_ROTATION_COUNTER_CLOCKWISE :Spre stânga STR_CONFIG_SETTING_HEIGHTMAP_ROTATION_CLOCKWISE :Spre dreapta @@ -1653,7 +1655,11 @@ STR_CONFIG_SETTING_ADVANCED_VEHICLE_LISTS_HELPTEXT :Activează folo STR_CONFIG_SETTING_LOADING_INDICATORS :Foloseşte indicatorii de încărcare: {STRING} STR_CONFIG_SETTING_LOADING_INDICATORS_HELPTEXT :Alege dacă indicatori de încărcare sunt afișați deasupra unor vehicule care sunt în proces de încărcare sau descărcare +STR_CONFIG_SETTING_TIMETABLE_MODE :Unități de timp pentru orare: {STRING} +STR_CONFIG_SETTING_TIMETABLE_MODE_HELPTEXT :Selectați unitățile de timp utilizate pentru orarele vehiculelor ###length 3 +STR_CONFIG_SETTING_TIMETABLE_MODE_DAYS :Zile +STR_CONFIG_SETTING_TIMETABLE_MODE_SECONDS :Secunde STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE :Afișează plecările și sosirile din orare: {STRING} STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE_HELPTEXT :Arată timpii estimați de plecare și sosire din orar @@ -3197,11 +3203,15 @@ STR_MAPGEN_MAPSIZE :{BLACK}Mărime STR_MAPGEN_MAPSIZE_TOOLTIP :{BLACK}Alege mărimea hărții folosind ca unitate de măsură suprafețele. Numărul de suprafețe disponibile va fi puțin mai mic decât această valoare STR_MAPGEN_BY :{BLACK}* STR_MAPGEN_NUMBER_OF_TOWNS :{BLACK}Nr. de oraşe: +STR_MAPGEN_NUMBER_OF_TOWNS_TOOLTIP :{BLACK}Selectați densitatea orașelor sau un număr personalizat STR_MAPGEN_TOWN_NAME_LABEL :{BLACK}Numele orașelor: STR_MAPGEN_TOWN_NAME_DROPDOWN_TOOLTIP :{BLACK}Alege naţionalitatea numelor oraşelor STR_MAPGEN_DATE :{BLACK}Data: +STR_MAPGEN_DATE_TOOLTIP :{BLACK}Selectați data de începere STR_MAPGEN_NUMBER_OF_INDUSTRIES :{BLACK}Nr. de industrii: +STR_MAPGEN_NUMBER_OF_INDUSTRIES_TOOLTIP :{BLACK}Selectați densitatea industriilor sau un număr personalizat STR_MAPGEN_HEIGHTMAP_HEIGHT :{BLACK}Cel mai înalt vârf: +STR_MAPGEN_HEIGHTMAP_HEIGHT_TOOLTIP :{BLACK}Alegeți cel mai înalt vârf pe care jocul va încerca să îl creeze, măsurat în altitudine deasupra nivelului mării STR_MAPGEN_HEIGHTMAP_HEIGHT_UP :{BLACK}Crește cu o unitate înălțimea maximă a celui mai înalt vârf al hărții STR_MAPGEN_HEIGHTMAP_HEIGHT_DOWN :{BLACK}Redu cu o unitate înălțimea maximă a celui mai înalt vârf al hărții STR_MAPGEN_SNOW_COVERAGE :{BLACK}Acoperire cu zăpadă: @@ -3214,10 +3224,12 @@ STR_MAPGEN_DESERT_COVERAGE_DOWN :{BLACK}Reduce STR_MAPGEN_DESERT_COVERAGE_TEXT :{BLACK}{NUM}% STR_MAPGEN_TERRAIN_TYPE :{BLACK}Tip teren: STR_MAPGEN_SEA_LEVEL :{BLACK}Nivelul mării: +STR_MAPGEN_SEA_LEVEL_TOOLTIP :{BLACK}Selectați nivelul mării STR_MAPGEN_QUANTITY_OF_RIVERS :{BLACK}Râuri: STR_MAPGEN_SMOOTHNESS :{BLACK}Netezime: STR_MAPGEN_VARIETY :{BLACK}Distribuţia varietăţii: STR_MAPGEN_GENERATE :{WHITE}Generează +STR_MAPGEN_GENERATE_TOOLTIP :{BLACK}Creează lumea și joacă OpenTTD! STR_MAPGEN_NEWGRF_SETTINGS :{BLACK}Setări NewGRF STR_MAPGEN_NEWGRF_SETTINGS_TOOLTIP :{BLACK}Afişează setările NewGRF STR_MAPGEN_AI_SETTINGS :{BLACK}Configurație AI @@ -3250,6 +3262,7 @@ STR_MAPGEN_TOWN_NAME_CATALAN :Catalană # Strings for map borders at game generation STR_MAPGEN_BORDER_TYPE :{BLACK}Margine: +STR_MAPGEN_BORDER_TYPE_TOOLTIP :{BLACK}Alegeți granițele lumii jocului STR_MAPGEN_NORTHWEST :{BLACK}Nord-vest STR_MAPGEN_NORTHEAST :{BLACK}Nord-est STR_MAPGEN_SOUTHEAST :{BLACK}Sud-est @@ -3262,7 +3275,9 @@ STR_MAPGEN_BORDER_MANUAL :{BLACK}Manual STR_MAPGEN_HEIGHTMAP_ROTATION :{BLACK}Rotaţie hartă înălţimi: STR_MAPGEN_HEIGHTMAP_NAME :{BLACK}Nume hartă înălţimi: +STR_MAPGEN_HEIGHTMAP_NAME_TOOLTIP :{BLACK}Numele fișierului al hărții de înălțime STR_MAPGEN_HEIGHTMAP_SIZE_LABEL :{BLACK}Dimensiune: +STR_MAPGEN_HEIGHTMAP_SIZE_LABEL_TOOLTIP :{BLACK}Dimensiunea imaginii hărții de înălțime. Pentru cele mai bune rezultate, fiecare margine ar trebui să se potrivească cu o lungime disponibilă a marginii hărții în OpenTTD, cum ar fi 256, 512, 1024 etc. STR_MAPGEN_HEIGHTMAP_SIZE :{ORANGE}{NUM} x {NUM} STR_MAPGEN_TERRAIN_TYPE_QUERY_CAPT :{WHITE}Înălțimea maximă dorită @@ -3277,6 +3292,7 @@ STR_SE_MAPGEN_FLAT_WORLD :{WHITE}Teren pl STR_SE_MAPGEN_FLAT_WORLD_TOOLTIP :{BLACK}Generează un teren plat STR_SE_MAPGEN_RANDOM_LAND :{WHITE}Teren aleator STR_SE_MAPGEN_FLAT_WORLD_HEIGHT :{BLACK}Înălţimea terenului plat: +STR_SE_MAPGEN_FLAT_WORLD_HEIGHT_TOOLTIP :{BLACK}Alegeți înălțimea terenului deasupra nivelului mării STR_SE_MAPGEN_FLAT_WORLD_HEIGHT_DOWN :{BLACK}Mută înălţimea terenului plat cu o unitate în jos STR_SE_MAPGEN_FLAT_WORLD_HEIGHT_UP :{BLACK}Mută înălţimea terenului plat cu o unitate în sus @@ -4570,8 +4586,13 @@ STR_TIMETABLE_STATUS_ON_TIME :{BLACK}Acest ve STR_TIMETABLE_STATUS_LATE :{BLACK}Vehiculul are întârziere de {STRING} STR_TIMETABLE_STATUS_EARLY :{BLACK}Momentan, acest vehicul și-a devansat programul {STRING} STR_TIMETABLE_STATUS_NOT_STARTED :{BLACK}Acest orar nu a început încă +STR_TIMETABLE_STATUS_START_AT_DATE :{BLACK}Acest orar va începe la {STRING} +STR_TIMETABLE_STATUS_START_IN_SECONDS :{BLACK}Acest orar va începe în {COMMA} secunde +STR_TIMETABLE_START :{BLACK}Începe orarul +STR_TIMETABLE_START_TOOLTIP :{BLACK}Selectați când începe acest orar. Ctrl+Click distribuie uniform pornirea tuturor vehiculelor care partajează această comandă pe baza ordinii lor relative, dacă comanda este complet programată +STR_TIMETABLE_START_SECONDS_QUERY :Secunde până la începerea orarului STR_TIMETABLE_CHANGE_TIME :{BLACK}Modifică timpul STR_TIMETABLE_WAIT_TIME_TOOLTIP :{BLACK}Modificați timpul pe care ar trebui să o dureze comanda evidențiată. Ctrl+Click setează ora pentru toate comenzile @@ -4595,6 +4616,10 @@ STR_TIMETABLE_EXPECTED :{BLACK}Estimat STR_TIMETABLE_SCHEDULED :{BLACK}Planificat STR_TIMETABLE_EXPECTED_TOOLTIP :{BLACK}Comută între estimare şi orar +STR_TIMETABLE_ARRIVAL_DATE :S: {COLOUR}{DATE_TINY} +STR_TIMETABLE_DEPARTURE_DATE :P: {COLOUR}{DATE_TINY} +STR_TIMETABLE_ARRIVAL_SECONDS_IN_FUTURE :S: {COLOUR}{COMMA} sec +STR_TIMETABLE_DEPARTURE_SECONDS_IN_FUTURE :P: {COLOUR}{COMMA} sec # Date window (for timetable) @@ -4698,8 +4723,11 @@ STR_TEXTFILE_NAVFORWARD_TOOLTIP :{BLACK}Reveniț STR_TEXTFILE_WRAP_TEXT :{WHITE}Încadrează textul STR_TEXTFILE_WRAP_TEXT_TOOLTIP :{BLACK}Încadrează textul ferestrei ca să fie vizibil integral, fără derulare STR_TEXTFILE_VIEW_README :{BLACK}Vezi fișierul readme +STR_TEXTFILE_VIEW_README_TOOLTIP :Vizualizați "citiți-mă / readme" pentru acest conținut STR_TEXTFILE_VIEW_CHANGELOG :{BLACK}Listă modificări +STR_TEXTFILE_VIEW_CHANGELOG_TOOLTIP :Vizualizați jurnalul de modificări pentru acest conținut STR_TEXTFILE_VIEW_LICENCE :{BLACK}Licenţă +STR_TEXTFILE_VIEW_LICENCE_TOOLTIP :Vedeți licența pentru acest conținut ###length 5 STR_TEXTFILE_README_CAPTION :{WHITE}{STRING}, fișier readme al {STRING} STR_TEXTFILE_CHANGELOG_CAPTION :{WHITE}{STRING}, lista de modificări a {STRING} diff --git a/src/lang/russian.txt b/src/lang/russian.txt index 177ac17012..05305c66c0 100644 --- a/src/lang/russian.txt +++ b/src/lang/russian.txt @@ -1259,8 +1259,8 @@ STR_NUM_VERY_LOW :Очень ма STR_NUM_LOW :Малое STR_NUM_NORMAL :Среднее STR_NUM_HIGH :Большое -STR_NUM_CUSTOM :Указанное -STR_NUM_CUSTOM_NUMBER :Заданный ({NUM}) +STR_NUM_CUSTOM :Указанное... +STR_NUM_CUSTOM_NUMBER :Указанное: {NUM} STR_VARIETY_NONE :Нет STR_VARIETY_VERY_LOW :Очень низкое @@ -1285,8 +1285,8 @@ STR_SEA_LEVEL_MEDIUM :Среднее STR_SEA_LEVEL_MEDIUM.p :Средние STR_SEA_LEVEL_HIGH :Большое STR_SEA_LEVEL_HIGH.p :Высокие -STR_SEA_LEVEL_CUSTOM :Заданный -STR_SEA_LEVEL_CUSTOM_PERCENTAGE :Заданный ({NUM}%) +STR_SEA_LEVEL_CUSTOM :Заданное... +STR_SEA_LEVEL_CUSTOM_PERCENTAGE :Заданное: {NUM}% ###length 4 STR_RIVERS_NONE :Нет @@ -1317,8 +1317,8 @@ STR_TERRAIN_TYPE_FLAT :Равнинн STR_TERRAIN_TYPE_HILLY :Холмистый STR_TERRAIN_TYPE_MOUNTAINOUS :Преимущественно горный STR_TERRAIN_TYPE_ALPINIST :Исключительно горный -STR_TERRAIN_TYPE_CUSTOM :Установить высоту вручную -STR_TERRAIN_TYPE_CUSTOM_VALUE :Установленная высота ({NUM}) +STR_TERRAIN_TYPE_CUSTOM :Указанная высота... +STR_TERRAIN_TYPE_CUSTOM_VALUE :Указанная высота: {NUM} ###length 4 STR_CITY_APPROVAL_LENIENT :снисходительное @@ -2281,10 +2281,10 @@ STR_INTRO_TOOLTIP_PLAY_SCENARIO :{BLACK}Нача STR_INTRO_TOOLTIP_SCENARIO_EDITOR :{BLACK}Создать собственный сценарий STR_INTRO_TOOLTIP_MULTIPLAYER :{BLACK}Начать сетевую игру -STR_INTRO_TOOLTIP_TEMPERATE :{BLACK}Выбрать умеренный климат -STR_INTRO_TOOLTIP_SUB_ARCTIC_LANDSCAPE :{BLACK}Выбрать субарктический климат -STR_INTRO_TOOLTIP_SUB_TROPICAL_LANDSCAPE :{BLACK}Выбрать субтропический климат -STR_INTRO_TOOLTIP_TOYLAND_LANDSCAPE :{BLACK}Выбрать игрушечный мир +STR_INTRO_TOOLTIP_TEMPERATE :{BLACK}Умеренный климат +STR_INTRO_TOOLTIP_SUB_ARCTIC_LANDSCAPE :{BLACK}Субарктический климат +STR_INTRO_TOOLTIP_SUB_TROPICAL_LANDSCAPE :{BLACK}Субтропический климат +STR_INTRO_TOOLTIP_TOYLAND_LANDSCAPE :{BLACK}Детский мир STR_INTRO_TOOLTIP_GAME_OPTIONS :{BLACK}Изменить основные настройки игры STR_INTRO_TOOLTIP_HIGHSCORE :{BLACK}Показать таблицу рекордов @@ -3404,8 +3404,8 @@ STR_MAPGEN_DESERT_COVERAGE_UP :{BLACK}Увел STR_MAPGEN_DESERT_COVERAGE_DOWN :{BLACK}Уменьшить площадь песчаного покрытия на 10% STR_MAPGEN_DESERT_COVERAGE_TEXT :{BLACK}{NUM}% STR_MAPGEN_TERRAIN_TYPE :{BLACK}Тип ландшафта: -STR_MAPGEN_SEA_LEVEL :{BLACK}Количество морей и озёр: -STR_MAPGEN_SEA_LEVEL_TOOLTIP :{BLACK}Выберите значение уровня моря +STR_MAPGEN_SEA_LEVEL :{BLACK}Количество водоёмов: +STR_MAPGEN_SEA_LEVEL_TOOLTIP :{BLACK}Выберите количество морей и озёр на карте STR_MAPGEN_QUANTITY_OF_RIVERS :{BLACK}Количество рек: STR_MAPGEN_SMOOTHNESS :{BLACK}Грубость ландшафта: STR_MAPGEN_VARIETY :{BLACK}Разнообразие ландшафта: @@ -4799,7 +4799,7 @@ STR_TIMETABLE_CHANGE_SPEED_TOOLTIP :{BLACK}Изме STR_TIMETABLE_CLEAR_SPEED :{BLACK}Сбросить огранич. скорости STR_TIMETABLE_CLEAR_SPEED_TOOLTIP :{BLACK}Сбросить ограничение скорости движения для выделенного задания. Ctrl+щелчок - сбросить время для всех заданий. -STR_TIMETABLE_RESET_LATENESS :{BLACK}Сбросить счетчик опозд. +STR_TIMETABLE_RESET_LATENESS :{BLACK}Сбросить счётчик опозд. STR_TIMETABLE_RESET_LATENESS_TOOLTIP :{BLACK}Сбросить счётчик опоздания, чтобы ТС считалось идущим по графику. Ctrl+щелчок сбросит счётчики у всей группы, так что последнее ТС будет идти по графику, а остальные - раньше графика. STR_TIMETABLE_AUTOFILL :{BLACK}Авторасчёт diff --git a/src/lang/simplified_chinese.txt b/src/lang/simplified_chinese.txt index 6ab2b8c4c6..4768d82107 100644 --- a/src/lang/simplified_chinese.txt +++ b/src/lang/simplified_chinese.txt @@ -255,6 +255,9 @@ STR_UNITS_HEIGHT_IMPERIAL :{DECIMAL}{NBSP} STR_UNITS_HEIGHT_METRIC :{DECIMAL}{NBSP}米 STR_UNITS_HEIGHT_SI :{DECIMAL}{NBSP}米 +STR_UNITS_DAYS :{COMMA}{NBSP} 日 +STR_UNITS_SECONDS :{COMMA}{NBSP} 秒 +STR_UNITS_TICKS :{COMMA}{NBSP} 刻 # Common window strings STR_LIST_FILTER_TITLE :{BLACK}关键字词: @@ -719,6 +722,7 @@ STR_PLAYLIST_TOOLTIP_CLICK_TO_ADD_TRACK :{BLACK}点击 STR_PLAYLIST_TOOLTIP_CLICK_TO_REMOVE_TRACK :{BLACK}点击音乐曲目以从当前播放列表中删除{}(仅限自定义1或自定义2) # Highscore window +STR_HIGHSCORE_TOP_COMPANIES :{BIG_FONT}{BLACK}顶级公司 STR_HIGHSCORE_POSITION :{BIG_FONT}{BLACK}{COMMA}. STR_HIGHSCORE_PERFORMANCE_TITLE_BUSINESSMAN :运输个体户 STR_HIGHSCORE_PERFORMANCE_TITLE_ENTREPRENEUR :运输代理商 @@ -1072,6 +1076,7 @@ STR_GAME_OPTIONS_BASE_MUSIC :{BLACK}基础 STR_GAME_OPTIONS_BASE_MUSIC_TOOLTIP :{BLACK}选择要使用的基础音乐组 STR_GAME_OPTIONS_BASE_MUSIC_DESCRIPTION_TOOLTIP :{BLACK}有关基础音乐组的附加信息 +STR_BASESET_STATUS :{STRING} {RED}(共有{NUM}份缺失或损坏的文件) STR_ERROR_RESOLUTION_LIST_FAILED :{WHITE}无法撷取可用的屏幕分辨率清单 STR_ERROR_FULLSCREEN_FAILED :{WHITE}无法切换到全屏模式{}尝试使用不同的分辨率 @@ -1486,7 +1491,7 @@ STR_CONFIG_SETTING_LAND_GENERATOR_ORIGINAL :原始算法 STR_CONFIG_SETTING_LAND_GENERATOR_TERRA_GENESIS :新算法 STR_CONFIG_SETTING_TERRAIN_TYPE :地貌类型: {STRING} -STR_CONFIG_SETTING_TERRAIN_TYPE_HELPTEXT :(仅限生成地图时) 多丘陵地形 +STR_CONFIG_SETTING_TERRAIN_TYPE_HELPTEXT :选择生成地图的起伏度 STR_CONFIG_SETTING_INDUSTRY_DENSITY :工业布局: {STRING} STR_CONFIG_SETTING_INDUSTRY_DENSITY_HELPTEXT :设置地图生成过程中,工业数量及一、二级工业比例。 @@ -1498,15 +1503,15 @@ STR_CONFIG_SETTING_SNOWLINE_HEIGHT :雪线高度: STR_CONFIG_SETTING_SNOWLINE_HEIGHT_HELPTEXT :控制在寒带气候中雪线高度。大雪会影响工业和城镇发展需求。只能在场景编辑器中更改或由“积雪覆盖率”计算得到。 STR_CONFIG_SETTING_SNOW_COVERAGE :积雪覆盖率:{STRING} -STR_CONFIG_SETTING_SNOW_COVERAGE_HELPTEXT :控制寒带气候中大致的雪量。雪会影响工业和城镇发展需求。只在地图生成时使用。海平面以上一格的土地永远没有积雪 +STR_CONFIG_SETTING_SNOW_COVERAGE_HELPTEXT :控制寒带气候中大致的雪量。雪会影响工业和城镇发展需求。只在地图生成时使用。海岸线上的土地永远没有积雪 STR_CONFIG_SETTING_SNOW_COVERAGE_VALUE :{NUM}% STR_CONFIG_SETTING_DESERT_COVERAGE :沙漠覆盖率:{STRING} -STR_CONFIG_SETTING_DESERT_COVERAGE_HELPTEXT :控制热带气候中大致的沙漠量。沙漠会影响工业生成。只在地图生成时使用 +STR_CONFIG_SETTING_DESERT_COVERAGE_HELPTEXT :控制热带气候中大致的沙漠量。沙漠会影响工业生成和城镇发展需求。只在地图生成时有效 STR_CONFIG_SETTING_DESERT_COVERAGE_VALUE :{NUM}% STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN :地面粗糙度 (仅限生成地图时):{STRING} -STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_HELPTEXT :(仅限新算法) 选择在地图上的山丘密度。光滑的地形会包含较少、相互之间较分散的山丘。粗糙的地形的山丘较密集,但可能会使地图显得重复 +STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_HELPTEXT :选择在地图上的山丘密度。光滑的地形会包含较少且相互之间较分散的山丘;粗糙的地形的山丘较密集,但可能会使地图显得重复 ###length 4 STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_VERY_SMOOTH :非常光滑 STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_SMOOTH :光滑 @@ -1514,7 +1519,7 @@ STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_ROUGH :粗糙 STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_VERY_ROUGH :非常粗糙 STR_CONFIG_SETTING_VARIETY :多样的分发: {STRING} -STR_CONFIG_SETTING_VARIETY_HELPTEXT :(仅限新算法) 此设置控制地图是否同时包含多山及平坦的地带。由于此设置只会使地图的一部份変得较平坦,请把其他相关设置(如 "地形特点")的值设为 "山地" +STR_CONFIG_SETTING_VARIETY_HELPTEXT :此设置控制地图是否同时包含多山及平坦的地带。由于此设置只会使地图的一部份変得较平坦,请把其他相关设置(如 "地形特点")的值设为 "山地" STR_CONFIG_SETTING_RIVER_AMOUNT :河流数量: {STRING} STR_CONFIG_SETTING_RIVER_AMOUNT_HELPTEXT :选择生成河流的数量 @@ -1534,6 +1539,7 @@ STR_CONFIG_SETTING_ROAD_SIDE_LEFT :左侧通行 STR_CONFIG_SETTING_ROAD_SIDE_RIGHT :右侧通行 STR_CONFIG_SETTING_HEIGHTMAP_ROTATION :高度图旋转:{STRING} +STR_CONFIG_SETTING_HEIGHTMAP_ROTATION_TOOLTIP :选择高度图旋转的方向以创建地图 ###length 2 STR_CONFIG_SETTING_HEIGHTMAP_ROTATION_COUNTER_CLOCKWISE :逆时针 STR_CONFIG_SETTING_HEIGHTMAP_ROTATION_CLOCKWISE :顺时针 @@ -1654,7 +1660,12 @@ STR_CONFIG_SETTING_ADVANCED_VEHICLE_LISTS_HELPTEXT :允许使用高 STR_CONFIG_SETTING_LOADING_INDICATORS :使用装货进度指示: {STRING} STR_CONFIG_SETTING_LOADING_INDICATORS_HELPTEXT :选择是否在车辆上方显示装卸货物进度 +STR_CONFIG_SETTING_TIMETABLE_MODE :时刻表使用的时间单位: {STRING} +STR_CONFIG_SETTING_TIMETABLE_MODE_HELPTEXT :选择载具时刻表所使用的时间单位 ###length 3 +STR_CONFIG_SETTING_TIMETABLE_MODE_DAYS :日 +STR_CONFIG_SETTING_TIMETABLE_MODE_SECONDS :秒 +STR_CONFIG_SETTING_TIMETABLE_MODE_TICKS :刻 STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE :在时刻表中显示到达时间和出发时间: {STRING} STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE_HELPTEXT :在时刻表中显示预期的到达和出发时间 @@ -1956,7 +1967,7 @@ STR_CONFIG_SETTING_CITY_SIZE_MULTIPLIER_HELPTEXT :游戏开局时 STR_CONFIG_SETTING_LINKGRAPH_RECALC_INTERVAL :每 {STRING} 更新货物分配 STR_CONFIG_SETTING_LINKGRAPH_RECALC_INTERVAL_HELPTEXT :两次连结图的重新计算间隔。每次重新计算会计算图中一个部分的计划。这意味着填入的值X不意味着整张图会每X秒更新一次,只有其中的一部分会被更新。此设定赋值越小,则更多的CPU时间会被用来重新计算。此设定赋值越大,则在线路改变时货物再分配所需时间会变长。 -STR_CONFIG_SETTING_LINKGRAPH_RECALC_TIME :花费 {STRING} 在货物分配的重新计算上 +STR_CONFIG_SETTING_LINKGRAPH_RECALC_TIME :在货物分配的重新计算上花费 {STRING} STR_CONFIG_SETTING_LINKGRAPH_RECALC_TIME_HELPTEXT :每一个连结图的重新计算时间。当一次重新计算开始,一个线程会被允许运行这个秒数。此设定赋值越小,则线程无法按时结束的可能性越大,从而导致游戏运行延迟。此设定赋值越大,则在线路改变时货物再分配所需时间会变长。 STR_CONFIG_SETTING_DISTRIBUTION_PAX :乗客分配方式:{STRING} @@ -3198,11 +3209,15 @@ STR_MAPGEN_MAPSIZE :{BLACK}地图 STR_MAPGEN_MAPSIZE_TOOLTIP :{BLACK}选择地图尺寸(单位:格)。可用的数值会略小。 STR_MAPGEN_BY :{BLACK}* STR_MAPGEN_NUMBER_OF_TOWNS :{BLACK}城镇数量: +STR_MAPGEN_NUMBER_OF_TOWNS_TOOLTIP :{BLACK}选择城镇密度,或者输入一个自定义数字 STR_MAPGEN_TOWN_NAME_LABEL :{BLACK}城镇名称: STR_MAPGEN_TOWN_NAME_DROPDOWN_TOOLTIP :{BLACK}选择城镇名称的命名风格 STR_MAPGEN_DATE :{BLACK}日期: +STR_MAPGEN_DATE_TOOLTIP :{BLACK}选择起始日期 STR_MAPGEN_NUMBER_OF_INDUSTRIES :{BLACK}工业数量: +STR_MAPGEN_NUMBER_OF_INDUSTRIES_TOOLTIP :{BLACK}选择工业密度,或者输入一个自定义数字 STR_MAPGEN_HEIGHTMAP_HEIGHT :{BLACK}最高峰: +STR_MAPGEN_HEIGHTMAP_HEIGHT_TOOLTIP :{BLACK}选择游戏地图中最高峰的海拔,以海平面为原点计。 STR_MAPGEN_HEIGHTMAP_HEIGHT_UP :{BLACK}提高最高峰的最大高度一格 STR_MAPGEN_HEIGHTMAP_HEIGHT_DOWN :{BLACK}降低最高峰的最大高度一格 STR_MAPGEN_SNOW_COVERAGE :{BLACK}积雪覆盖率: @@ -3215,10 +3230,12 @@ STR_MAPGEN_DESERT_COVERAGE_DOWN :{BLACK}减少 1 STR_MAPGEN_DESERT_COVERAGE_TEXT :{BLACK}{NUM}% STR_MAPGEN_TERRAIN_TYPE :{BLACK}地形特点: STR_MAPGEN_SEA_LEVEL :{BLACK}海洋面积: +STR_MAPGEN_SEA_LEVEL_TOOLTIP :{BLACK} 选择覆盖率 STR_MAPGEN_QUANTITY_OF_RIVERS :{BLACK}河流数量: STR_MAPGEN_SMOOTHNESS :{BLACK}平滑度: STR_MAPGEN_VARIETY :{BLACK}多样的分发: STR_MAPGEN_GENERATE :{WHITE}生成 +STR_MAPGEN_GENERATE_TOOLTIP :{BLACK} 创建世界并开始游玩OpenTTD! STR_MAPGEN_NEWGRF_SETTINGS :{BLACK}NewGRF设置 STR_MAPGEN_NEWGRF_SETTINGS_TOOLTIP :{BLACK}显示NewGRF设置 STR_MAPGEN_AI_SETTINGS :{BLACK}AI 设置 @@ -3251,6 +3268,7 @@ STR_MAPGEN_TOWN_NAME_CATALAN :加泰罗尼亚 # Strings for map borders at game generation STR_MAPGEN_BORDER_TYPE :{BLACK}地图边缘: +STR_MAPGEN_BORDER_TYPE_TOOLTIP :{BLACK}选择地图边界的样式 STR_MAPGEN_NORTHWEST :{BLACK}西北 STR_MAPGEN_NORTHEAST :{BLACK}东北 STR_MAPGEN_SOUTHEAST :{BLACK}东南 @@ -3263,7 +3281,9 @@ STR_MAPGEN_BORDER_MANUAL :{BLACK}手动 STR_MAPGEN_HEIGHTMAP_ROTATION :{BLACK}高度图旋转: STR_MAPGEN_HEIGHTMAP_NAME :{BLACK}高度图名称: +STR_MAPGEN_HEIGHTMAP_NAME_TOOLTIP :{BLACK}高度图图像文件的名字 STR_MAPGEN_HEIGHTMAP_SIZE_LABEL :{BLACK}地图尺寸: +STR_MAPGEN_HEIGHTMAP_SIZE_LABEL_TOOLTIP :{BLACK}高度图的长宽大小。建议选择长宽符合游戏地图大小的图片作为高度图,如256、512、1024等 STR_MAPGEN_HEIGHTMAP_SIZE :{ORANGE}{NUM} × {NUM} STR_MAPGEN_TERRAIN_TYPE_QUERY_CAPT :{WHITE}最高峰目标高度 @@ -3278,6 +3298,7 @@ STR_SE_MAPGEN_FLAT_WORLD :{WHITE}平坦 STR_SE_MAPGEN_FLAT_WORLD_TOOLTIP :{BLACK}生成平坦水面 STR_SE_MAPGEN_RANDOM_LAND :{WHITE}随机地面 STR_SE_MAPGEN_FLAT_WORLD_HEIGHT :{BLACK}地面高度: +STR_SE_MAPGEN_FLAT_WORLD_HEIGHT_TOOLTIP :{BLACK}选择地面海拔高度 STR_SE_MAPGEN_FLAT_WORLD_HEIGHT_DOWN :{BLACK}提升地面高度 STR_SE_MAPGEN_FLAT_WORLD_HEIGHT_UP :{BLACK}降低地面高度 @@ -3303,7 +3324,7 @@ STR_GENERATION_PREPARING_GAME :{BLACK}准备 # NewGRF settings STR_NEWGRF_SETTINGS_CAPTION :{WHITE}NewGRF 设置 STR_NEWGRF_SETTINGS_INFO_TITLE :{WHITE}NewGRF 详细信息 -STR_NEWGRF_SETTINGS_ACTIVE_LIST :{WHITE}激活 NewGRF +STR_NEWGRF_SETTINGS_ACTIVE_LIST :{WHITE}已激活 NewGRF STR_NEWGRF_SETTINGS_INACTIVE_LIST :{WHITE}停用 NewGRF STR_NEWGRF_SETTINGS_SELECT_PRESET :{ORANGE}选择预设 STR_NEWGRF_FILTER_TITLE :{ORANGE}关键字词搜索: @@ -4571,8 +4592,13 @@ STR_TIMETABLE_STATUS_ON_TIME :{BLACK}该车 STR_TIMETABLE_STATUS_LATE :{BLACK}该车辆目前晚点 {STRING} STR_TIMETABLE_STATUS_EARLY :{BLACK}该车辆目前提前 {STRING} STR_TIMETABLE_STATUS_NOT_STARTED :{BLACK}此时刻表尚未开始 +STR_TIMETABLE_STATUS_START_AT_DATE :{BLACK}本时刻表将在 {STRING} 开始 +STR_TIMETABLE_STATUS_START_IN_SECONDS :{BLACK}本时刻表将会在 {COMMA} 秒内开始 +STR_TIMETABLE_START :{BLACK}开始时刻表 +STR_TIMETABLE_START_TOOLTIP :{BLACK}选择此时刻表开始的时间。如果订单完全按时刻表安排,则按住Ctrl键并单击会根据它们的相对顺序,且均匀分配共享此订单的所有车辆的开始时间。 +STR_TIMETABLE_START_SECONDS_QUERY :直至时刻表开始的秒数 STR_TIMETABLE_CHANGE_TIME :{BLACK}改变时间 STR_TIMETABLE_WAIT_TIME_TOOLTIP :{BLACK}改变高亮选择的命令执行的时间,按住Ctrl单击可为所有命令设置时间 @@ -4596,6 +4622,10 @@ STR_TIMETABLE_EXPECTED :{BLACK}预期 STR_TIMETABLE_SCHEDULED :{BLACK}表定时间 STR_TIMETABLE_EXPECTED_TOOLTIP :{BLACK}切换显示(根据实际情况计算的)预期时间或表定时间 +STR_TIMETABLE_ARRIVAL_DATE :抵: {COLOUR}{DATE_TINY} +STR_TIMETABLE_DEPARTURE_DATE :发:{COLOUR}{DATE_TINY} +STR_TIMETABLE_ARRIVAL_SECONDS_IN_FUTURE :抵: {COLOUR}{COMMA} 秒 +STR_TIMETABLE_DEPARTURE_SECONDS_IN_FUTURE :发: {COLOUR}{COMMA} 秒 # Date window (for timetable) diff --git a/src/network/core/http_winhttp.cpp b/src/network/core/http_winhttp.cpp index e5e2ab9457..500c41074b 100644 --- a/src/network/core/http_winhttp.cpp +++ b/src/network/core/http_winhttp.cpp @@ -67,7 +67,7 @@ static std::string GetLastErrorAsString() DWORD error_code = GetLastError(); if (FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_FROM_HMODULE | FORMAT_MESSAGE_IGNORE_INSERTS, GetModuleHandleA("winhttp.dll"), error_code, - MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), buffer, sizeof(buffer), NULL) == 0) { + MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), buffer, sizeof(buffer), nullptr) == 0) { return fmt::format("unknown error {}", error_code); } diff --git a/src/network/core/os_abstraction.cpp b/src/network/core/os_abstraction.cpp index 70f0c0d14a..21ed6b5539 100644 --- a/src/network/core/os_abstraction.cpp +++ b/src/network/core/os_abstraction.cpp @@ -81,8 +81,8 @@ const char *NetworkError::AsString() const if (this->message.empty()) { #if defined(_WIN32) char buffer[512]; - if (FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, this->error, - MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), buffer, sizeof(buffer), NULL) == 0) { + if (FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, nullptr, this->error, + MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), buffer, sizeof(buffer), nullptr) == 0) { seprintf(buffer, lastof(buffer), "Unknown error %d", this->error); } this->message.assign(buffer); diff --git a/src/palette.cpp b/src/palette.cpp new file mode 100644 index 0000000000..7b8dffb8bb --- /dev/null +++ b/src/palette.cpp @@ -0,0 +1,296 @@ +/* + * This file is part of OpenTTD. + * OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. + * OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see . + */ + +/** @file palette.cpp Handling of palettes. */ + +#include "stdafx.h" +#include "blitter/base.hpp" +#include "blitter/factory.hpp" +#include "fileio_func.h" +#include "gfx_type.h" +#include "landscape_type.h" +#include "palette_func.h" +#include "settings_type.h" +#include "thread.h" +#include "core/mem_func.hpp" + +#include "table/palettes.h" + +#include "safeguards.h" + +Palette _cur_palette; +std::mutex _cur_palette_mutex; + +byte _colour_gradient[COLOUR_END][8]; + +byte _colour_value[COLOUR_END] = { + 133, // COLOUR_DARK_BLUE + 99, // COLOUR_PALE_GREEN, + 48, // COLOUR_PINK, + 68, // COLOUR_YELLOW, + 184, // COLOUR_RED, + 152, // COLOUR_LIGHT_BLUE, + 209, // COLOUR_GREEN, + 95, // COLOUR_DARK_GREEN, + 150, // COLOUR_BLUE, + 79, // COLOUR_CREAM, + 134, // COLOUR_MAUVE, + 174, // COLOUR_PURPLE, + 195, // COLOUR_ORANGE, + 116, // COLOUR_BROWN, + 6, // COLOUR_GREY, + 15, // COLOUR_WHITE, +}; + +Colour _water_palette[10]; + +/** + * PALETTE_BITS reduces the bits-per-channel of 32bpp graphics data to allow faster palette lookups from + * a smaller lookup table. + * + * 6 bpc is chosen as this results in a palette lookup table of 256KiB with adequate fidelty. + * In constract, a 5 bpc lookup table would be 32KiB, and 7 bpc would be 2MiB. + * + * Values in the table are filled as they are first encountered -- larger lookup table means more colour + * distance calculations, and is therefore slower. + */ +const uint PALETTE_BITS = 6; +const uint PALETTE_SHIFT = 8 - PALETTE_BITS; +const uint PALETTE_BITS_MASK = ((1U << PALETTE_BITS) - 1) << PALETTE_SHIFT; +const uint PALETTE_BITS_OR = (1U << (PALETTE_SHIFT - 1)); + +/* Palette and reshade lookup table. */ +using PaletteLookup = std::array; +static PaletteLookup _palette_lookup{}; + +/** + * Reduce bits per channel to PALETTE_BITS, and place value in the middle of the reduced range. + * This is to counteract the information lost between bright and dark pixels, e.g if PALETTE_BITS was 2: + * 0 - 63 -> 32 + * 64 - 127 -> 96 + * 128 - 191 -> 160 + * 192 - 255 -> 224 + * @param c 8 bit colour component. + * @returns Colour component reduced to PALETTE_BITS. + */ +inline uint CrunchColour(uint c) +{ + return (c & PALETTE_BITS_MASK) | PALETTE_BITS_OR; +} + +/** + * Calculate distance between two colours. + * @param col1 First colour. + * @param r2 Red component of second colour. + * @param g2 Green component of second colour. + * @param b2 Blue component of second colour. + * @returns Euclidean distance between first and second colour. + */ +static uint CalculateColourDistance(const Colour &col1, int r2, int g2, int b2) +{ + /* Euclidean colour distance for sRGB based on https://en.wikipedia.org/wiki/Color_difference#sRGB */ + int r = (int)col1.r - (int)r2; + int g = (int)col1.g - (int)g2; + int b = (int)col1.b - (int)b2; + + int avgr = (col1.r + r2) / 2; + return ((2 + (avgr / 256.0)) * r * r) + (4 * g * g) + ((2 + ((255 - avgr) / 256.0)) * b * b); +} + +/* Palette indexes for conversion. See docs/palettes/palette_key.png */ +const uint8_t PALETTE_INDEX_CC_START = 198; ///< Palette index of start of company colour remap area. +const uint8_t PALETTE_INDEX_CC_END = PALETTE_INDEX_CC_START + 8; ///< Palette index of end of company colour remap area. +const uint8_t PALETTE_INDEX_START = 1; ///< Palette index of start of defined palette. +const uint8_t PALETTE_INDEX_END = 215; ///< Palette index of end of defined palette. + +/** + * Find nearest colour palette index for a 32bpp pixel. + * @param r Red component. + * @param g Green component. + * @param b Blue component. + * @returns palette index of nearest colour. + */ +static uint8_t FindNearestColourIndex(uint8_t r, uint8_t g, uint8_t b) +{ + r = CrunchColour(r); + g = CrunchColour(g); + b = CrunchColour(b); + + uint best_index = 0; + uint best_distance = UINT32_MAX; + + for (uint i = PALETTE_INDEX_START; i < PALETTE_INDEX_CC_START; i++) { + if (uint distance = CalculateColourDistance(_palette.palette[i], r, g, b); distance < best_distance) { + best_index = i; + best_distance = distance; + } + } + /* There's a hole in the palette reserved for company colour remaps. */ + for (uint i = PALETTE_INDEX_CC_END; i < PALETTE_INDEX_END; i++) { + if (uint distance = CalculateColourDistance(_palette.palette[i], r, g, b); distance < best_distance) { + best_index = i; + best_distance = distance; + } + } + return best_index; +} + +/** + * Get nearest colour palette index from an RGB colour. + * A search is performed if this colour is not already in the lookup table. + * @param r Red component. + * @param g Green component. + * @param b Blue component. + * @returns nearest colour palette index. + */ +uint8_t GetNearestColourIndex(uint8_t r, uint8_t g, uint8_t b) +{ + uint32_t key = (r >> PALETTE_SHIFT) | (g >> PALETTE_SHIFT) << PALETTE_BITS | (b >> PALETTE_SHIFT) << (PALETTE_BITS * 2); + if (_palette_lookup[key] == 0) _palette_lookup[key] = FindNearestColourIndex(r, g, b); + return _palette_lookup[key]; +} + +void DoPaletteAnimations(); + +void GfxInitPalettes() +{ + MemCpyT(_water_palette, (_settings_game.game_creation.landscape == LT_TOYLAND) ? _extra_palette_values.dark_water_toyland : _extra_palette_values.dark_water, 5); + const Colour *s = (_settings_game.game_creation.landscape == LT_TOYLAND) ? _extra_palette_values.glitter_water_toyland : _extra_palette_values.glitter_water; + for (int i = 0; i < 5; i++) { + _water_palette[i + 5] = s[i * 3]; + } + + std::lock_guard lock_state(_cur_palette_mutex); + memcpy(&_cur_palette, &_palette, sizeof(_cur_palette)); + DoPaletteAnimations(); +} + +#define EXTR(p, q) (((uint16_t)(palette_animation_counter * (p)) * (q)) >> 16) +#define EXTR2(p, q) (((uint16_t)(~palette_animation_counter * (p)) * (q)) >> 16) + +void DoPaletteAnimations() +{ + /* Animation counter for the palette animation. */ + static int palette_animation_counter = 0; + palette_animation_counter += 8; + + Blitter *blitter = BlitterFactory::GetCurrentBlitter(); + const Colour *s; + const ExtraPaletteValues *ev = &_extra_palette_values; + Colour old_val[PALETTE_ANIM_SIZE]; + const uint old_tc = palette_animation_counter; + uint j; + + if (blitter != nullptr && blitter->UsePaletteAnimation() == Blitter::PALETTE_ANIMATION_NONE) { + palette_animation_counter = 0; + } + + Colour *palette_pos = &_cur_palette.palette[PALETTE_ANIM_START]; // Points to where animations are taking place on the palette + /* Makes a copy of the current animation palette in old_val, + * so the work on the current palette could be compared, see if there has been any changes */ + memcpy(old_val, palette_pos, sizeof(old_val)); + + /* Fizzy Drink bubbles animation */ + s = ev->fizzy_drink; + j = EXTR2(512, EPV_CYCLES_FIZZY_DRINK); + for (uint i = 0; i != EPV_CYCLES_FIZZY_DRINK; i++) { + *palette_pos++ = s[j]; + j++; + if (j == EPV_CYCLES_FIZZY_DRINK) j = 0; + } + + /* Oil refinery fire animation */ + s = ev->oil_refinery; + j = EXTR2(512, EPV_CYCLES_OIL_REFINERY); + for (uint i = 0; i != EPV_CYCLES_OIL_REFINERY; i++) { + *palette_pos++ = s[j]; + j++; + if (j == EPV_CYCLES_OIL_REFINERY) j = 0; + } + + /* Radio tower blinking */ + { + byte i = (palette_animation_counter >> 1) & 0x7F; + byte v; + + if (i < 0x3f) { + v = 255; + } else if (i < 0x4A || i >= 0x75) { + v = 128; + } else { + v = 20; + } + palette_pos->r = v; + palette_pos->g = 0; + palette_pos->b = 0; + palette_pos++; + + i ^= 0x40; + if (i < 0x3f) { + v = 255; + } else if (i < 0x4A || i >= 0x75) { + v = 128; + } else { + v = 20; + } + palette_pos->r = v; + palette_pos->g = 0; + palette_pos->b = 0; + palette_pos++; + } + + /* Handle lighthouse and stadium animation */ + s = ev->lighthouse; + j = EXTR(256, EPV_CYCLES_LIGHTHOUSE); + for (uint i = 0; i != EPV_CYCLES_LIGHTHOUSE; i++) { + *palette_pos++ = s[j]; + j++; + if (j == EPV_CYCLES_LIGHTHOUSE) j = 0; + } + + /* Dark blue water */ + s = (_settings_game.game_creation.landscape == LT_TOYLAND) ? ev->dark_water_toyland : ev->dark_water; + j = EXTR(320, EPV_CYCLES_DARK_WATER); + for (uint i = 0; i != EPV_CYCLES_DARK_WATER; i++) { + *palette_pos++ = s[j]; + j++; + if (j == EPV_CYCLES_DARK_WATER) j = 0; + } + + /* Glittery water */ + s = (_settings_game.game_creation.landscape == LT_TOYLAND) ? ev->glitter_water_toyland : ev->glitter_water; + j = EXTR(128, EPV_CYCLES_GLITTER_WATER); + for (uint i = 0; i != EPV_CYCLES_GLITTER_WATER / 3; i++) { + *palette_pos++ = s[j]; + j += 3; + if (j >= EPV_CYCLES_GLITTER_WATER) j -= EPV_CYCLES_GLITTER_WATER; + } + + if (blitter != nullptr && blitter->UsePaletteAnimation() == Blitter::PALETTE_ANIMATION_NONE) { + palette_animation_counter = old_tc; + } else if (_cur_palette.count_dirty == 0 && memcmp(old_val, &_cur_palette.palette[PALETTE_ANIM_START], sizeof(old_val)) != 0) { + /* Did we changed anything on the palette? Seems so. Mark it as dirty */ + _cur_palette.first_dirty = PALETTE_ANIM_START; + _cur_palette.count_dirty = PALETTE_ANIM_SIZE; + } +} + +/** + * Determine a contrasty text colour for a coloured background. + * @param background Background colour. + * @param threshold Background colour brightness threshold below which the background is considered dark and TC_WHITE is returned, range: 0 - 255, default 128. + * @return TC_BLACK or TC_WHITE depending on what gives a better contrast. + */ +TextColour GetContrastColour(uint8_t background, uint8_t threshold) +{ + Colour c = _cur_palette.palette[background]; + /* Compute brightness according to http://www.w3.org/TR/AERT#color-contrast. + * The following formula computes 1000 * brightness^2, with brightness being in range 0 to 255. */ + uint sq1000_brightness = c.r * c.r * 299 + c.g * c.g * 587 + c.b * c.b * 114; + /* Compare with threshold brightness which defaults to 128 (50%) */ + return sq1000_brightness < ((uint) threshold) * ((uint) threshold) * 1000 ? TC_WHITE : TC_BLACK; +} diff --git a/src/palette_func.h b/src/palette_func.h new file mode 100644 index 0000000000..4b080d8d9b --- /dev/null +++ b/src/palette_func.h @@ -0,0 +1,84 @@ +/* + * This file is part of OpenTTD. + * OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. + * OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see . + */ + +/** @file palette_func.h Functions related to palettes. */ + +#ifndef PALETTE_FUNC_H +#define PALETTE_FUNC_H + +#include "gfx_type.h" + +extern Palette _cur_palette; ///< Current palette + +void GfxInitPalettes(); + +uint8_t GetNearestColourIndex(uint8_t r, uint8_t g, uint8_t b); + +static inline uint8_t GetNearestColourIndex(const Colour colour) +{ + return GetNearestColourIndex(colour.r, colour.g, colour.b); +} + +/** + * Checks if a Colours value is valid. + * + * @param colours The value to check + * @return true if the given value is a valid Colours. + */ +static inline bool IsValidColours(Colours colours) +{ + return colours < COLOUR_END; +} + +TextColour GetContrastColour(uint8_t background, uint8_t threshold = 128); + +/** + * All 16 colour gradients + * 8 colours per gradient from darkest (0) to lightest (7) + */ +extern byte _colour_gradient[COLOUR_END][8]; +extern byte _colour_value[COLOUR_END]; + +/** + * Return the colour for a particular greyscale level. + * @param level Intensity, 0 = black, 15 = white + * @return colour + */ +#define GREY_SCALE(level) (level) + +static const uint8_t PC_BLACK = GREY_SCALE(1); ///< Black palette colour. +static const uint8_t PC_DARK_GREY = GREY_SCALE(6); ///< Dark grey palette colour. +static const uint8_t PC_GREY = GREY_SCALE(10); ///< Grey palette colour. +static const uint8_t PC_WHITE = GREY_SCALE(15); ///< White palette colour. + +static const uint8_t PC_VERY_DARK_RED = 0xB2; ///< Almost-black red palette colour. +static const uint8_t PC_DARK_RED = 0xB4; ///< Dark red palette colour. +static const uint8_t PC_RED = 0xB8; ///< Red palette colour. + +static const uint8_t PC_VERY_DARK_BROWN = 0x56; ///< Almost-black brown palette colour. + +static const uint8_t PC_ORANGE = 0xC2; ///< Orange palette colour. + +static const uint8_t PC_YELLOW = 0xBF; ///< Yellow palette colour. +static const uint8_t PC_LIGHT_YELLOW = 0x44; ///< Light yellow palette colour. +static const uint8_t PC_VERY_LIGHT_YELLOW = 0x45; ///< Almost-white yellow palette colour. + +static const uint8_t PC_GREEN = 0xD0; ///< Green palette colour. + +static const uint8_t PC_VERY_DARK_BLUE = 0x9A; ///< Almost-black blue palette colour. +static const uint8_t PC_DARK_BLUE = 0x9D; ///< Dark blue palette colour. +static const uint8_t PC_LIGHT_BLUE = 0x98; ///< Light blue palette colour. + +static const uint8_t PC_ROUGH_LAND = 0x52; ///< Dark green palette colour for rough land. +static const uint8_t PC_GRASS_LAND = 0x54; ///< Dark green palette colour for grass land. +static const uint8_t PC_BARE_LAND = 0x37; ///< Brown palette colour for bare land. +static const uint8_t PC_RAINFOREST = 0x5C; ///< Pale green palette colour for rainforest. +static const uint8_t PC_FIELDS = 0x25; ///< Light brown palette colour for fields. +static const uint8_t PC_TREES = 0x57; ///< Green palette colour for trees. +static const uint8_t PC_WATER = 0xC9; ///< Dark blue palette colour for water. + +#endif /* PALETTE_FUNC_H */ diff --git a/src/script/script_gui.cpp b/src/script/script_gui.cpp index 9aef087beb..686dec818a 100644 --- a/src/script/script_gui.cpp +++ b/src/script/script_gui.cpp @@ -22,6 +22,7 @@ #include "../string_func.h" #include "../settings_type.h" #include "../command_func.h" +#include "../core/backup_type.hpp" #include "script_gui.h" #include "script_log.hpp" @@ -817,8 +818,9 @@ struct ScriptDebugWindow : public Window { SetWidgetsDisabledState(!this->show_break_box, WID_SCRD_BREAK_STR_ON_OFF_BTN, WID_SCRD_BREAK_STR_EDIT_BOX, WID_SCRD_MATCH_CASE_BTN); this->hscroll->SetStepSize(10); // Speed up horizontal scrollbar - /* Restore the break string value from static variable */ + /* Restore the break string value from static variable, and enable the filter. */ this->break_editbox.text.Assign(this->filter.break_string); + this->break_string_filter.SetFilterTerm(this->filter.break_string); if (show_company == INVALID_COMPANY) { this->SelectValidDebugCompany(); @@ -915,8 +917,19 @@ struct ScriptDebugWindow : public Window { ScriptLogTypes::LogData &log = this->GetLogData(); if (log.empty()) return; - Rect br = r.Shrink(WidgetDimensions::scaled.bevel); - Rect tr = r.Shrink(WidgetDimensions::scaled.framerect); + Rect fr = r.Shrink(WidgetDimensions::scaled.framerect); + + /* Setup a clipping rectangle... */ + DrawPixelInfo tmp_dpi; + if (!FillDrawPixelInfo(&tmp_dpi, fr)) return; + /* ...but keep coordinates relative to the window. */ + tmp_dpi.left += fr.left; + tmp_dpi.top += fr.top; + + AutoRestoreBackup dpi_backup(_cur_dpi, &tmp_dpi); + + fr.left -= this->hscroll->GetPosition(); + for (int i = this->vscroll->GetPosition(); this->vscroll->IsVisible(i) && (size_t)i < log.size(); i++) { const ScriptLogTypes::LogLine &line = log[i]; @@ -932,12 +945,13 @@ struct ScriptDebugWindow : public Window { /* Check if the current line should be highlighted */ if (i == this->highlight_row) { - GfxFillRect(br.left, tr.top, br.right, tr.top + this->resize.step_height - 1, PC_BLACK); + fr.bottom = fr.top + this->resize.step_height - 1; + GfxFillRect(fr, PC_BLACK); if (colour == TC_BLACK) colour = TC_WHITE; // Make black text readable by inverting it to white. } - DrawString(-this->hscroll->GetPosition(), tr.right, tr.top, line.text, colour, SA_LEFT | SA_FORCE); - tr.top += this->resize.step_height; + DrawString(fr, line.text, colour, SA_LEFT | SA_FORCE); + fr.top += this->resize.step_height; } } diff --git a/src/smallmap_colours.h b/src/smallmap_colours.h index 29f6b99308..44095d62f8 100644 --- a/src/smallmap_colours.h +++ b/src/smallmap_colours.h @@ -10,16 +10,9 @@ #ifndef SMALLMAP_COLOURS_H #define SMALLMAP_COLOURS_H +#include "palette_func.h" #include "core/endian_func.hpp" -static const uint8 PC_ROUGH_LAND = 0x52; ///< Dark green palette colour for rough land. -static const uint8 PC_GRASS_LAND = 0x54; ///< Dark green palette colour for grass land. -static const uint8 PC_BARE_LAND = 0x37; ///< Brown palette colour for bare land. -static const uint8 PC_RAINFOREST = 0x5C; ///< Pale green palette colour for rainforest. -static const uint8 PC_FIELDS = 0x25; ///< Light brown palette colour for fields. -static const uint8 PC_TREES = 0x57; ///< Green palette colour for trees. -static const uint8 PC_WATER = 0xC9; ///< Dark blue palette colour for water. - #define MKCOLOUR(x) TO_LE32X(x) #define MKCOLOUR_XXXX(x) (MKCOLOUR(0x01010101) * (uint)(x)) diff --git a/src/spritecache.cpp b/src/spritecache.cpp index a58b2b9c91..cec3a3ba28 100644 --- a/src/spritecache.cpp +++ b/src/spritecache.cpp @@ -378,6 +378,19 @@ static bool ResizeSprites(SpriteLoader::SpriteCollection &sprite, unsigned int s { ZoomLevel first_avail = static_cast(FindFirstBit(sprite_avail)); ZoomLevel first_needed = static_cast(FindFirstBit(zoom_levels)); + + /* Upscale to desired sprite_min_zoom if provided sprite only had zoomed in versions. */ + if (first_avail < _settings_client.gui.sprite_zoom_min) { + const unsigned int below_min_zoom_mask = (1 << _settings_client.gui.sprite_zoom_min) - 1; + if ((zoom_levels & below_min_zoom_mask) != 0 && !HasBit(sprite_avail, _settings_client.gui.sprite_zoom_min)) { + if (!HasBit(sprite_avail, ZOOM_LVL_OUT_2X)) ResizeSpriteOut(sprite, ZOOM_LVL_OUT_2X, false); + if (_settings_client.gui.sprite_zoom_min == ZOOM_LVL_OUT_4X) ResizeSpriteOut(sprite, ZOOM_LVL_OUT_4X, false); + sprite_avail &= ~below_min_zoom_mask; + SetBit(sprite_avail, _settings_client.gui.sprite_zoom_min); + first_avail = _settings_client.gui.sprite_zoom_min; + } + } + ZoomLevel start = std::min(first_avail, first_needed); bool needed = false; diff --git a/src/video/cocoa/cocoa_v.mm b/src/video/cocoa/cocoa_v.mm index bdd1981084..1ac4fdc88f 100644 --- a/src/video/cocoa/cocoa_v.mm +++ b/src/video/cocoa/cocoa_v.mm @@ -665,7 +665,7 @@ void VideoDriver_CocoaQuartz::AllocateBackingStore(bool) kCGImageAlphaNoneSkipFirst | kCGBitmapByteOrder32Host ); - assert(this->cgcontext != NULL); + assert(this->cgcontext != nullptr); CGContextSetShouldAntialias(this->cgcontext, FALSE); CGContextSetAllowsAntialiasing(this->cgcontext, FALSE); CGContextSetInterpolationQuality(this->cgcontext, kCGInterpolationNone); diff --git a/src/video/cocoa/cocoa_wnd.mm b/src/video/cocoa/cocoa_wnd.mm index 6bf503d000..57c7c8bd8c 100644 --- a/src/video/cocoa/cocoa_wnd.mm +++ b/src/video/cocoa/cocoa_wnd.mm @@ -932,16 +932,16 @@ void CocoaDialog(const char *title, const char *message, const char *buttonLabel NSString *s = [ aString isKindOfClass:[ NSAttributedString class ] ] ? [ aString string ] : (NSString *)aString; - const char *insert_point = NULL; - const char *replace_range = NULL; + const char *insert_point = nullptr; + const char *replace_range = nullptr; if (replacementRange.location != NSNotFound) { /* Calculate the part to be replaced. */ insert_point = Utf8AdvanceByUtf16Units(_focused_window->GetFocusedTextbuf()->GetText(), replacementRange.location); replace_range = Utf8AdvanceByUtf16Units(insert_point, replacementRange.length); } - HandleTextInput(NULL, true); - HandleTextInput([ s UTF8String ], false, NULL, insert_point, replace_range); + HandleTextInput(nullptr, true); + HandleTextInput([ s UTF8String ], false, nullptr, insert_point, replace_range); } /** Insert the given text at the caret. */ @@ -958,9 +958,9 @@ void CocoaDialog(const char *title, const char *message, const char *buttonLabel NSString *s = [ aString isKindOfClass:[ NSAttributedString class ] ] ? [ aString string ] : (NSString *)aString; const char *utf8 = [ s UTF8String ]; - if (utf8 != NULL) { - const char *insert_point = NULL; - const char *replace_range = NULL; + if (utf8 != nullptr) { + const char *insert_point = nullptr; + const char *replace_range = nullptr; if (replacementRange.location != NSNotFound) { /* Calculate the part to be replaced. */ NSRange marked = [ self markedRange ]; diff --git a/src/video/win32_v.cpp b/src/video/win32_v.cpp index 60755944e1..01cf02b3f7 100644 --- a/src/video/win32_v.cpp +++ b/src/video/win32_v.cpp @@ -277,7 +277,7 @@ static bool DrawIMECompositionString() static void SetCompositionPos(HWND hwnd) { HIMC hIMC = ImmGetContext(hwnd); - if (hIMC != NULL) { + if (hIMC != nullptr) { COMPOSITIONFORM cf; cf.dwStyle = CFS_POINT; @@ -299,7 +299,7 @@ static void SetCompositionPos(HWND hwnd) static void SetCandidatePos(HWND hwnd) { HIMC hIMC = ImmGetContext(hwnd); - if (hIMC != NULL) { + if (hIMC != nullptr) { CANDIDATEFORM cf; cf.dwIndex = 0; cf.dwStyle = CFS_EXCLUDE; @@ -334,7 +334,7 @@ static LRESULT HandleIMEComposition(HWND hwnd, WPARAM wParam, LPARAM lParam) { HIMC hIMC = ImmGetContext(hwnd); - if (hIMC != NULL) { + if (hIMC != nullptr) { if (lParam & GCS_RESULTSTR) { /* Read result string from the IME. */ LONG len = ImmGetCompositionString(hIMC, GCS_RESULTSTR, nullptr, 0); // Length is always in bytes, even in UNICODE build. @@ -393,7 +393,7 @@ static LRESULT HandleIMEComposition(HWND hwnd, WPARAM wParam, LPARAM lParam) static void CancelIMEComposition(HWND hwnd) { HIMC hIMC = ImmGetContext(hwnd); - if (hIMC != NULL) ImmNotifyIME(hIMC, NI_COMPOSITIONSTR, CPS_CANCEL, 0); + if (hIMC != nullptr) ImmNotifyIME(hIMC, NI_COMPOSITIONSTR, CPS_CANCEL, 0); ImmReleaseContext(hwnd, hIMC); /* Clear any marked string from the current edit box. */ HandleTextInput(nullptr, true); @@ -690,7 +690,7 @@ LRESULT CALLBACK WndProcGdi(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) /* Resize the window to match the new DPI setting. */ RECT *prcNewWindow = (RECT *)lParam; SetWindowPos(hwnd, - NULL, + nullptr, prcNewWindow->left, prcNewWindow->top, prcNewWindow->right - prcNewWindow->left, diff --git a/src/window_type.h b/src/window_type.h index 5f0dced793..1f23a5d171 100644 --- a/src/window_type.h +++ b/src/window_type.h @@ -695,7 +695,7 @@ enum WindowClass { /** * Script debug window; %Window numbers: - * - 0 = #ScriptDebugWidgets + * - Ascending value = #ScriptDebugWidgets */ WC_SCRIPT_DEBUG,