Merge branch 'master' into jgrpp

# Conflicts:
#	src/blitter/32bpp_anim.cpp
#	src/blitter/8bpp_optimized.cpp
#	src/gfx.cpp
#	src/gfx_func.h
#	src/gfxinit.cpp
#	src/network/core/os_abstraction.cpp
#	src/spritecache.cpp
wip-string
Jonathan G Rennison 5 months ago
commit b72366419b

Binary file not shown.

@ -1 +1 @@
3e860a0e880e3dc90615facf5f455fc6 5fdc049a7a0ada4c280239f15bc38174

@ -10,6 +10,7 @@ if(GRFCODEC_FOUND)
${CMAKE_CURRENT_SOURCE_DIR}/rivers/rapids.nfo ${CMAKE_CURRENT_SOURCE_DIR}/rivers/rapids.nfo
${CMAKE_CURRENT_SOURCE_DIR}/rivers/temperate.nfo ${CMAKE_CURRENT_SOURCE_DIR}/rivers/temperate.nfo
${CMAKE_CURRENT_SOURCE_DIR}/rivers/toyland.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}/rivers/tropic.nfo
${CMAKE_CURRENT_SOURCE_DIR}/airports_orig_extra.nfo ${CMAKE_CURRENT_SOURCE_DIR}/airports_orig_extra.nfo
${CMAKE_CURRENT_SOURCE_DIR}/canals_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/rapids_shading.png
${CMAKE_CURRENT_SOURCE_DIR}/rivers/temperate.png ${CMAKE_CURRENT_SOURCE_DIR}/rivers/temperate.png
${CMAKE_CURRENT_SOURCE_DIR}/rivers/toyland.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_desert.png
${CMAKE_CURRENT_SOURCE_DIR}/rivers/tropic_forest.png ${CMAKE_CURRENT_SOURCE_DIR}/rivers/tropic_forest.png
${CMAKE_CURRENT_SOURCE_DIR}/fix_graphics.png ${CMAKE_CURRENT_SOURCE_DIR}/fix_graphics.png

@ -79,6 +79,7 @@
#include "airports_orig_extra.nfo" #include "airports_orig_extra.nfo"
#include "canals_extra.nfo" #include "canals_extra.nfo"
#include "rivers/rapids.nfo" #include "rivers/rapids.nfo"
#include "rivers/toyland_rapids.nfo"
#include "rivers/temperate.nfo" #include "rivers/temperate.nfo"
#include "rivers/arctic.nfo" #include "rivers/arctic.nfo"
#include "rivers/tropic.nfo" #include "rivers/tropic.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. // 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 <http://www.gnu.org/licenses/>. // 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 <http://www.gnu.org/licenses/>.
// //
-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 * 4 01 05 01 3C
-1 sprites/toyland.png 8bpp 10 10 38 19 -5 0 normal -1 sprites/toyland.png 8bpp 10 10 38 19 -5 0 normal
-1 sprites/toyland.png 8bpp 58 10 38 18 -5 13 normal -1 sprites/toyland.png 8bpp 58 10 38 18 -5 13 normal

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

After

Width:  |  Height:  |  Size: 34 KiB

@ -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 <http://www.gnu.org/licenses/>.
//
-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

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

@ -84,7 +84,7 @@ static SQRegFunction mathlib_funcs[] = {
_DECL_FUNC(exp,2,".n"), _DECL_FUNC(exp,2,".n"),
#ifdef EXPORT_DEFAULT_SQUIRREL_FUNCTIONS #ifdef EXPORT_DEFAULT_SQUIRREL_FUNCTIONS
_DECL_FUNC(srand,2,".n"), _DECL_FUNC(srand,2,".n"),
_DECL_FUNC(rand,1,NULL), _DECL_FUNC(rand,1,nullptr),
#endif /* EXPORT_DEFAULT_SQUIRREL_FUNCTIONS */ #endif /* EXPORT_DEFAULT_SQUIRREL_FUNCTIONS */
_DECL_FUNC(fabs,2,".n"), _DECL_FUNC(fabs,2,".n"),
_DECL_FUNC(abs,2,".n"), _DECL_FUNC(abs,2,".n"),

@ -378,8 +378,8 @@ static const SQChar *sqstd_rex_matchnode(SQRex* exp,SQRexNode *node,const SQChar
SQRexNodeType type = node->type; SQRexNodeType type = node->type;
switch(type) { switch(type) {
case OP_GREEDY: { case OP_GREEDY: {
//SQRexNode *greedystop = (node->next != -1) ? &exp->_nodes[node->next] : NULL; //SQRexNode *greedystop = (node->next != -1) ? &exp->_nodes[node->next] : nullptr;
SQRexNode *greedystop = NULL; SQRexNode *greedystop = nullptr;
SQInteger p0 = (node->right >> 16)&0x0000FFFF, p1 = node->right&0x0000FFFF, nmaches = 0; SQInteger p0 = (node->right >> 16)&0x0000FFFF, p1 = node->right&0x0000FFFF, nmaches = 0;
const SQChar *s=str, *good = str; 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 || if(greedystop->type != OP_GREEDY ||
(greedystop->type == OP_GREEDY && ((greedystop->right >> 16)&0x0000FFFF) != 0)) (greedystop->type == OP_GREEDY && ((greedystop->right >> 16)&0x0000FFFF) != 0))
{ {
SQRexNode *gnext = NULL; SQRexNode *gnext = nullptr;
if(greedystop->next != -1) { if(greedystop->next != -1) {
gnext = &exp->_nodes[greedystop->next]; gnext = &exp->_nodes[greedystop->next];
}else if(next && next->next != -1){ }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; if(p0 == p1 && p0 == nmaches) return good;
else if(nmaches >= p0 && p1 == 0xFFFF) return good; else if(nmaches >= p0 && p1 == 0xFFFF) return good;
else if(nmaches >= p0 && nmaches <= p1) return good; else if(nmaches >= p0 && nmaches <= p1) return good;
return NULL; return nullptr;
} }
case OP_OR: { case OP_OR: {
const SQChar *asd = str; const SQChar *asd = str;
SQRexNode *temp=&exp->_nodes[node->left]; 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) if(temp->next != -1)
temp = &exp->_nodes[temp->next]; temp = &exp->_nodes[temp->next];
else else
@ -438,13 +438,13 @@ static const SQChar *sqstd_rex_matchnode(SQRex* exp,SQRexNode *node,const SQChar
} }
asd = str; asd = str;
temp = &exp->_nodes[node->right]; 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) if(temp->next != -1)
temp = &exp->_nodes[temp->next]; temp = &exp->_nodes[temp->next];
else else
return asd; return asd;
} }
return NULL; return nullptr;
break; break;
} }
case OP_EXPR: case OP_EXPR:
@ -459,7 +459,7 @@ static const SQChar *sqstd_rex_matchnode(SQRex* exp,SQRexNode *node,const SQChar
} }
do { do {
SQRexNode *subnext = NULL; SQRexNode *subnext = nullptr;
if(n->next != -1) { if(n->next != -1) {
subnext = &exp->_nodes[n->next]; subnext = &exp->_nodes[n->next];
}else { }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].begin = 0;
exp->_matches[capture].len = 0; exp->_matches[capture].len = 0;
} }
return NULL; return nullptr;
} }
} while((n->next != -1) && (n = &exp->_nodes[n->next])); } 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))) || (str == exp->_eol && !isspace(*(str-1)))
|| (!isspace(*str) && isspace(*(str+1))) || (!isspace(*str) && 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: case OP_BOL:
if(str == exp->_bol) return str; if(str == exp->_bol) return str;
return NULL; return nullptr;
case OP_EOL: case OP_EOL:
if(str == exp->_eol) return str; if(str == exp->_eol) return str;
return NULL; return nullptr;
case OP_DOT:{ case OP_DOT:{
*str++; *str++;
} }
@ -502,26 +502,26 @@ static const SQChar *sqstd_rex_matchnode(SQRex* exp,SQRexNode *node,const SQChar
*str++; *str++;
return str; return str;
} }
return NULL; return nullptr;
case OP_CCLASS: case OP_CCLASS:
if(sqstd_rex_matchcclass(node->left,*str)) { if(sqstd_rex_matchcclass(node->left,*str)) {
*str++; *str++;
return str; return str;
} }
return NULL; return nullptr;
default: /* char */ default: /* char */
if(*str != (SQChar)node->type) return NULL; if(*str != (SQChar)node->type) return nullptr;
*str++; *str++;
return str; return str;
} }
return NULL; return nullptr;
} }
/* public api */ /* public api */
SQRex *sqstd_rex_compile(const SQChar *pattern,const SQChar **error) SQRex *sqstd_rex_compile(const SQChar *pattern,const SQChar **error)
{ {
SQRex *exp = (SQRex *)sq_malloc(sizeof(SQRex)); SQRex *exp = (SQRex *)sq_malloc(sizeof(SQRex));
exp->_eol = exp->_bol = NULL; exp->_eol = exp->_bol = nullptr;
exp->_p = pattern; exp->_p = pattern;
exp->_nallocated = (SQInteger)strlen(pattern) * sizeof(SQChar); exp->_nallocated = (SQInteger)strlen(pattern) * sizeof(SQChar);
exp->_nodes = (SQRexNode *)sq_malloc(exp->_nallocated * sizeof(SQRexNode)); exp->_nodes = (SQRexNode *)sq_malloc(exp->_nallocated * sizeof(SQRexNode));
@ -558,7 +558,7 @@ SQRex *sqstd_rex_compile(const SQChar *pattern,const SQChar **error)
} }
catch (...) { catch (...) {
sqstd_rex_free(exp); sqstd_rex_free(exp);
return NULL; return nullptr;
} }
return exp; return exp;
} }
@ -574,19 +574,19 @@ void sqstd_rex_free(SQRex *exp)
SQBool sqstd_rex_match(SQRex* exp,const SQChar* text) SQBool sqstd_rex_match(SQRex* exp,const SQChar* text)
{ {
const SQChar* res = NULL; const SQChar* res = nullptr;
exp->_bol = text; exp->_bol = text;
exp->_eol = text + strlen(text); exp->_eol = text + strlen(text);
exp->_currsubexp = 0; exp->_currsubexp = 0;
res = sqstd_rex_matchnode(exp,exp->_nodes,text,NULL); res = sqstd_rex_matchnode(exp,exp->_nodes,text,nullptr);
if(res == NULL || res != exp->_eol) if(res == nullptr || res != exp->_eol)
return SQFalse; return SQFalse;
return SQTrue; return SQTrue;
} }
SQBool sqstd_rex_searchrange(SQRex* exp,const SQChar* text_begin,const SQChar* text_end,const SQChar** out_begin, const SQChar** out_end) 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; SQInteger node = exp->_first;
if(text_begin >= text_end) return SQFalse; if(text_begin >= text_end) return SQFalse;
exp->_bol = text_begin; exp->_bol = text_begin;
@ -595,15 +595,15 @@ SQBool sqstd_rex_searchrange(SQRex* exp,const SQChar* text_begin,const SQChar* t
cur = text_begin; cur = text_begin;
while(node != -1) { while(node != -1) {
exp->_currsubexp = 0; 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) if(!cur)
break; break;
node = exp->_nodes[node].next; node = exp->_nodes[node].next;
} }
*text_begin++; *text_begin++;
} while(cur == NULL && text_begin != text_end); } while(cur == nullptr && text_begin != text_end);
if(cur == NULL) if(cur == nullptr)
return SQFalse; return SQFalse;
--text_begin; --text_begin;

@ -112,16 +112,16 @@ static SQInteger _string_split(HSQUIRRELVM v)
memcpy(stemp,str,memsize); memcpy(stemp,str,memsize);
tok = scstrtok(stemp,seps); tok = scstrtok(stemp,seps);
sq_newarray(v,0); sq_newarray(v,0);
while( tok != NULL ) { while( tok != nullptr ) {
sq_pushstring(v,tok,-1); sq_pushstring(v,tok,-1);
sq_arrayappend(v,-2); sq_arrayappend(v,-2);
tok = scstrtok( NULL, seps ); tok = scstrtok( nullptr, seps );
} }
return 1; return 1;
} }
#define SETUP_REX(v) \ #define SETUP_REX(v) \
SQRex *self = NULL; \ SQRex *self = nullptr; \
sq_getinstanceup(v,1,(SQUserPointer *)&self,0); sq_getinstanceup(v,1,(SQUserPointer *)&self,0);
static SQInteger _rexobj_releasehook(SQUserPointer p, SQInteger size) static SQInteger _rexobj_releasehook(SQUserPointer p, SQInteger size)

@ -100,7 +100,7 @@ static SQInteger base_getstackinfos(HSQUIRRELVM v)
SQInteger level; SQInteger level;
SQStackInfos si; SQStackInfos si;
SQInteger seq = 0; SQInteger seq = 0;
const SQChar *name = NULL; const SQChar *name = nullptr;
sq_getinteger(v, -1, &level); sq_getinteger(v, -1, &level);
if (SQ_SUCCEEDED(sq_stackinfos(v, level, &si))) if (SQ_SUCCEEDED(sq_stackinfos(v, level, &si)))
{ {
@ -179,7 +179,7 @@ static SQInteger base_print(HSQUIRRELVM v)
static SQInteger base_compilestring(HSQUIRRELVM v) static SQInteger base_compilestring(HSQUIRRELVM v)
{ {
SQInteger nargs=sq_gettop(v); SQInteger nargs=sq_gettop(v);
const SQChar *src=NULL,*name="unnamedbuffer"; const SQChar *src=nullptr,*name="unnamedbuffer";
SQInteger size; SQInteger size;
sq_getstring(v,2,&src); sq_getstring(v,2,&src);
size=sq_getsize(v,2); size=sq_getsize(v,2);
@ -238,26 +238,26 @@ static SQInteger base_type(HSQUIRRELVM v)
static SQRegFunction base_funcs[]={ static SQRegFunction base_funcs[]={
//generic //generic
#ifdef EXPORT_DEFAULT_SQUIRREL_FUNCTIONS #ifdef EXPORT_DEFAULT_SQUIRREL_FUNCTIONS
{"seterrorhandler",base_seterrorhandler,2, NULL}, {"seterrorhandler",base_seterrorhandler,2, nullptr},
{"setdebughook",base_setdebughook,2, NULL}, {"setdebughook",base_setdebughook,2, nullptr},
{"enabledebuginfo",base_enabledebuginfo,2, NULL}, {"enabledebuginfo",base_enabledebuginfo,2, nullptr},
{"getstackinfos",base_getstackinfos,2, ".n"}, {"getstackinfos",base_getstackinfos,2, ".n"},
{"getroottable",base_getroottable,1, NULL}, {"getroottable",base_getroottable,1, nullptr},
{"setroottable",base_setroottable,2, NULL}, {"setroottable",base_setroottable,2, nullptr},
{"getconsttable",base_getconsttable,1, NULL}, {"getconsttable",base_getconsttable,1, nullptr},
{"setconsttable",base_setconsttable,2, NULL}, {"setconsttable",base_setconsttable,2, nullptr},
#endif #endif
{"assert",base_assert,2, nullptr}, {"assert",base_assert,2, nullptr},
{"print",base_print,2, nullptr}, {"print",base_print,2, nullptr},
#ifdef EXPORT_DEFAULT_SQUIRREL_FUNCTIONS #ifdef EXPORT_DEFAULT_SQUIRREL_FUNCTIONS
{"compilestring",base_compilestring,-2, ".ss"}, {"compilestring",base_compilestring,-2, ".ss"},
{"newthread",base_newthread,2, ".c"}, {"newthread",base_newthread,2, ".c"},
{"suspend",base_suspend,-1, NULL}, {"suspend",base_suspend,-1, nullptr},
#endif #endif
{"array",base_array,-2, ".n"}, {"array",base_array,-2, ".n"},
{"type",base_type,2, nullptr}, {"type",base_type,2, nullptr},
#ifdef EXPORT_DEFAULT_SQUIRREL_FUNCTIONS #ifdef EXPORT_DEFAULT_SQUIRREL_FUNCTIONS
{"dummy",base_dummy,0,NULL}, {"dummy",base_dummy,0,nullptr},
#ifndef NO_GARBAGE_COLLECTOR #ifndef NO_GARBAGE_COLLECTOR
{"collectgarbage",base_collectgarbage,1, "t"}, {"collectgarbage",base_collectgarbage,1, "t"},
#endif #endif

@ -136,7 +136,7 @@ struct SQObjectPtr;
(obj)->_uiRef--; \ (obj)->_uiRef--; \
if((obj)->_uiRef == 0) \ if((obj)->_uiRef == 0) \
(obj)->Release(); \ (obj)->Release(); \
(obj) = NULL; \ (obj) = nullptr; \
} \ } \
} }
@ -446,7 +446,7 @@ public:
#define ADD_TO_CHAIN(chain,obj) AddToChain(chain,obj) #define ADD_TO_CHAIN(chain,obj) AddToChain(chain,obj)
#define REMOVE_FROM_CHAIN(chain,obj) {if(!(_uiRef&MARK_FLAG))RemoveFromChain(chain,obj);} #define REMOVE_FROM_CHAIN(chain,obj) {if(!(_uiRef&MARK_FLAG))RemoveFromChain(chain,obj);}
#define CHAINABLE_OBJ SQCollectable #define CHAINABLE_OBJ SQCollectable
#define INIT_CHAIN() {_next=NULL;_prev=NULL;_sharedstate=ss;} #define INIT_CHAIN() {_next=nullptr;_prev=nullptr;_sharedstate=ss;}
#else #else
#define ADD_TO_CHAIN(chain,obj) ((void)0) #define ADD_TO_CHAIN(chain,obj) ((void)0)

@ -201,7 +201,7 @@ SQSharedState::~SQSharedState()
t = nx; t = nx;
} }
} }
// assert(_gc_chain==NULL); //just to proove a theory // assert(_gc_chain==nullptr); //just to proove a theory
while(_gc_chain){ while(_gc_chain){
_gc_chain->_uiRef--; _gc_chain->_uiRef--;
_gc_chain->Release(); _gc_chain->Release();

@ -194,7 +194,7 @@ inline SQObjectPtr &stack_get(HSQUIRRELVM v,SQInteger idx){return ((idx>=0)?(v->
#ifndef NO_GARBAGE_COLLECTOR #ifndef NO_GARBAGE_COLLECTOR
#define _opt_ss(_vm_) (_vm_)->_sharedstate #define _opt_ss(_vm_) (_vm_)->_sharedstate
#else #else
#define _opt_ss(_vm_) NULL #define _opt_ss(_vm_) nullptr
#endif #endif
#define PUSH_CALLINFO(v,nci){ \ #define PUSH_CALLINFO(v,nci){ \
@ -218,6 +218,6 @@ inline SQObjectPtr &stack_get(HSQUIRRELVM v,SQInteger idx){return ((idx>=0)?(v->
if(v->_callsstacksize) \ if(v->_callsstacksize) \
v->ci = &v->_callsstack[v->_callsstacksize-1] ; \ v->ci = &v->_callsstack[v->_callsstacksize-1] ; \
else \ else \
v->ci = NULL; \ v->ci = nullptr; \
} }
#endif //_SQVM_H_ #endif //_SQVM_H_

@ -345,6 +345,8 @@ add_files(
order_gui.cpp order_gui.cpp
order_type.h order_type.h
osk_gui.cpp osk_gui.cpp
palette.cpp
palette_func.h
pbs.cpp pbs.cpp
pbs.h pbs.h
plans.cpp plans.cpp

@ -9,6 +9,7 @@
#include "../stdafx.h" #include "../stdafx.h"
#include "../video/video_driver.hpp" #include "../video/video_driver.hpp"
#include "../palette_func.h"
#include "../zoom_func.h" #include "../zoom_func.h"
#include "32bpp_anim.hpp" #include "32bpp_anim.hpp"
#include "common.hpp" #include "common.hpp"
@ -220,10 +221,6 @@ inline void Blitter_32bppAnim::Draw(const Blitter::BlitterParams *bp, ZoomLevel
break; break;
case BM_TRANSPARENT: 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 */ /* Make the current colour a bit more black, so it looks like this image is transparent */
src_n += n; src_n += n;
if (src_px->a == 255) { if (src_px->a == 255) {
@ -245,6 +242,24 @@ inline void Blitter_32bppAnim::Draw(const Blitter::BlitterParams *bp, ZoomLevel
} }
break; 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: default:
if (fast_path || (src_px->a == 255 && (sprite_flags & BSF_NO_ANIM))) { if (fast_path || (src_px->a == 255 && (sprite_flags & BSF_NO_ANIM))) {
do { do {
@ -343,6 +358,7 @@ void Blitter_32bppAnim::Draw(Blitter::BlitterParams *bp, BlitterMode mode, ZoomL
return; return;
case BM_TRANSPARENT: Draw<BM_TRANSPARENT, false> (bp, zoom); return; case BM_TRANSPARENT: Draw<BM_TRANSPARENT, false> (bp, zoom); return;
case BM_TRANSPARENT_REMAP: Draw<BM_TRANSPARENT_REMAP, false> (bp, zoom); return;
case BM_CRASH_REMAP: Draw<BM_CRASH_REMAP, false> (bp, zoom); return; case BM_CRASH_REMAP: Draw<BM_CRASH_REMAP, false> (bp, zoom); return;
case BM_BLACK_REMAP: Draw<BM_BLACK_REMAP, false> (bp, zoom); return; case BM_BLACK_REMAP: Draw<BM_BLACK_REMAP, false> (bp, zoom); return;
} }

@ -12,6 +12,7 @@
#include "../stdafx.h" #include "../stdafx.h"
#include "../video/video_driver.hpp" #include "../video/video_driver.hpp"
#include "../table/sprites.h" #include "../table/sprites.h"
#include "../palette_func.h"
#include "32bpp_anim_sse4.hpp" #include "32bpp_anim_sse4.hpp"
#include "32bpp_sse_func.hpp" #include "32bpp_sse_func.hpp"
@ -317,6 +318,21 @@ bmcr_alpha_blend_single:
} }
break; 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: case BM_CRASH_REMAP:
for (uint x = (uint) bp->width; x > 0; x--) { for (uint x = (uint) bp->width; x > 0; x--) {
if (src_mv->m == 0) { if (src_mv->m == 0) {
@ -420,7 +436,7 @@ bmcr_alpha_blend_single_brightness:
} }
next_line: 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); src_rgba_line = (const Colour*) ((const byte*) src_rgba_line + si->sprite_line_size);
dst_line += bp->pitch; dst_line += bp->pitch;
anim_line += this->anim_buf_pitch; anim_line += this->anim_buf_pitch;
@ -483,6 +499,7 @@ bm_normal:
} }
break; break;
case BM_TRANSPARENT: Draw<BM_TRANSPARENT, RM_NONE, BT_NONE, true, true>(bp, zoom); return; case BM_TRANSPARENT: Draw<BM_TRANSPARENT, RM_NONE, BT_NONE, true, true>(bp, zoom); return;
case BM_TRANSPARENT_REMAP: Draw<BM_TRANSPARENT_REMAP, RM_NONE, BT_NONE, true, true>(bp, zoom); return;
case BM_CRASH_REMAP: Draw<BM_CRASH_REMAP, RM_NONE, BT_NONE, true, true>(bp, zoom); return; case BM_CRASH_REMAP: Draw<BM_CRASH_REMAP, RM_NONE, BT_NONE, true, true>(bp, zoom); return;
case BM_BLACK_REMAP: Draw<BM_BLACK_REMAP, RM_NONE, BT_NONE, true, true>(bp, zoom); return; case BM_BLACK_REMAP: Draw<BM_BLACK_REMAP, RM_NONE, BT_NONE, true, true>(bp, zoom); return;

@ -10,6 +10,7 @@
#include "../stdafx.h" #include "../stdafx.h"
#include "../zoom_func.h" #include "../zoom_func.h"
#include "../settings_type.h" #include "../settings_type.h"
#include "../palette_func.h"
#include "32bpp_optimized.hpp" #include "32bpp_optimized.hpp"
#include "common.hpp" #include "common.hpp"
@ -189,10 +190,6 @@ inline void Blitter_32bppOptimized::Draw(const Blitter::BlitterParams *bp, ZoomL
break; break;
case BM_TRANSPARENT: 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 */ /* Make the current colour a bit more black, so it looks like this image is transparent */
src_n += n; src_n += n;
if (src_px->a == 255) { if (src_px->a == 255) {
@ -210,6 +207,21 @@ inline void Blitter_32bppOptimized::Draw(const Blitter::BlitterParams *bp, ZoomL
} }
break; 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: default:
if (src_px->a == 255) { if (src_px->a == 255) {
/* faster than memcpy(), n is usually low */ /* faster than memcpy(), n is usually low */
@ -260,6 +272,7 @@ void Blitter_32bppOptimized::Draw(Blitter::BlitterParams *bp, BlitterMode mode,
case BM_NORMAL: Draw<BM_NORMAL, Tpal_to_rgb>(bp, zoom); return; case BM_NORMAL: Draw<BM_NORMAL, Tpal_to_rgb>(bp, zoom); return;
case BM_COLOUR_REMAP: Draw<BM_COLOUR_REMAP, Tpal_to_rgb>(bp, zoom); return; case BM_COLOUR_REMAP: Draw<BM_COLOUR_REMAP, Tpal_to_rgb>(bp, zoom); return;
case BM_TRANSPARENT: Draw<BM_TRANSPARENT, Tpal_to_rgb>(bp, zoom); return; case BM_TRANSPARENT: Draw<BM_TRANSPARENT, Tpal_to_rgb>(bp, zoom); return;
case BM_TRANSPARENT_REMAP: Draw<BM_TRANSPARENT_REMAP, Tpal_to_rgb>(bp, zoom); return;
case BM_CRASH_REMAP: Draw<BM_CRASH_REMAP, Tpal_to_rgb>(bp, zoom); return; case BM_CRASH_REMAP: Draw<BM_CRASH_REMAP, Tpal_to_rgb>(bp, zoom); return;
case BM_BLACK_REMAP: Draw<BM_BLACK_REMAP, Tpal_to_rgb>(bp, zoom); return; case BM_BLACK_REMAP: Draw<BM_BLACK_REMAP, Tpal_to_rgb>(bp, zoom); return;
case BM_NORMAL_WITH_BRIGHTNESS: Draw<BM_NORMAL_WITH_BRIGHTNESS, Tpal_to_rgb>(bp, zoom); return; case BM_NORMAL_WITH_BRIGHTNESS: Draw<BM_NORMAL_WITH_BRIGHTNESS, Tpal_to_rgb>(bp, zoom); return;

@ -9,6 +9,7 @@
#include "../stdafx.h" #include "../stdafx.h"
#include "../zoom_func.h" #include "../zoom_func.h"
#include "../palette_func.h"
#include "32bpp_simple.hpp" #include "32bpp_simple.hpp"
#include "../table/sprites.h" #include "../table/sprites.h"
@ -75,12 +76,17 @@ void Blitter_32bppSimple::Draw(Blitter::BlitterParams *bp, BlitterMode mode, Zoo
break; break;
case BM_TRANSPARENT: 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 */ /* 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; break;
case BM_NORMAL_WITH_BRIGHTNESS: case BM_NORMAL_WITH_BRIGHTNESS:

@ -398,6 +398,18 @@ bmcr_alpha_blend_single:
} }
break; 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: case BM_CRASH_REMAP:
for (uint x = (uint) bp->width; x > 0; x--) { for (uint x = (uint) bp->width; x > 0; x--) {
if (src_mv->m == 0) { if (src_mv->m == 0) {
@ -532,6 +544,7 @@ bm_normal:
Draw<BM_COLOUR_REMAP, RM_WITH_MARGIN, BT_NONE, true>(bp, zoom); return; Draw<BM_COLOUR_REMAP, RM_WITH_MARGIN, BT_NONE, true>(bp, zoom); return;
} }
case BM_TRANSPARENT: Draw<BM_TRANSPARENT, RM_NONE, BT_NONE, true>(bp, zoom); return; case BM_TRANSPARENT: Draw<BM_TRANSPARENT, RM_NONE, BT_NONE, true>(bp, zoom); return;
case BM_TRANSPARENT_REMAP: Draw<BM_TRANSPARENT_REMAP, RM_NONE, BT_NONE, true>(bp, zoom); return;
case BM_CRASH_REMAP: Draw<BM_CRASH_REMAP, RM_NONE, BT_NONE, true>(bp, zoom); return; case BM_CRASH_REMAP: Draw<BM_CRASH_REMAP, RM_NONE, BT_NONE, true>(bp, zoom); return;
case BM_BLACK_REMAP: Draw<BM_BLACK_REMAP, RM_NONE, BT_NONE, true>(bp, zoom); return; case BM_BLACK_REMAP: Draw<BM_BLACK_REMAP, RM_NONE, BT_NONE, true>(bp, zoom); return;

@ -11,6 +11,7 @@
#include "../zoom_func.h" #include "../zoom_func.h"
#include "../settings_type.h" #include "../settings_type.h"
#include "../video/video_driver.hpp" #include "../video/video_driver.hpp"
#include "../palette_func.h"
#include "40bpp_anim.hpp" #include "40bpp_anim.hpp"
#include "common.hpp" #include "common.hpp"
@ -288,10 +289,6 @@ inline void Blitter_40bppAnim::Draw(const Blitter::BlitterParams *bp, ZoomLevel
break; break;
case BM_TRANSPARENT: 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 */ /* Make the current colour a bit more black, so it looks like this image is transparent */
src_n += n; src_n += n;
if (src_px->a == 255) { if (src_px->a == 255) {
@ -317,6 +314,28 @@ inline void Blitter_40bppAnim::Draw(const Blitter::BlitterParams *bp, ZoomLevel
} }
break; 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: default:
if (src_px->a == 255) { if (src_px->a == 255) {
do { do {
@ -389,6 +408,7 @@ void Blitter_40bppAnim::Draw(Blitter::BlitterParams *bp, BlitterMode mode, ZoomL
case BM_NORMAL: Draw<BM_NORMAL> (bp, zoom); return; case BM_NORMAL: Draw<BM_NORMAL> (bp, zoom); return;
case BM_COLOUR_REMAP: Draw<BM_COLOUR_REMAP>(bp, zoom); return; case BM_COLOUR_REMAP: Draw<BM_COLOUR_REMAP>(bp, zoom); return;
case BM_TRANSPARENT: Draw<BM_TRANSPARENT> (bp, zoom); return; case BM_TRANSPARENT: Draw<BM_TRANSPARENT> (bp, zoom); return;
case BM_TRANSPARENT_REMAP: Draw<BM_TRANSPARENT_REMAP>(bp, zoom); return;
case BM_CRASH_REMAP: Draw<BM_CRASH_REMAP> (bp, zoom); return; case BM_CRASH_REMAP: Draw<BM_CRASH_REMAP> (bp, zoom); return;
case BM_BLACK_REMAP: Draw<BM_BLACK_REMAP> (bp, zoom); return; case BM_BLACK_REMAP: Draw<BM_BLACK_REMAP> (bp, zoom); return;
case BM_NORMAL_WITH_BRIGHTNESS: Draw<BM_NORMAL_WITH_BRIGHTNESS> (bp, zoom); return; case BM_NORMAL_WITH_BRIGHTNESS: Draw<BM_NORMAL_WITH_BRIGHTNESS> (bp, zoom); return;

@ -101,8 +101,9 @@ void Blitter_8bppOptimized::Draw(Blitter::BlitterParams *bp, BlitterMode mode, Z
dst += pixels; dst += pixels;
break; break;
case BM_TRANSPARENT: { case BM_TRANSPARENT:
const uint8 *remap = bp->remap; case BM_TRANSPARENT_REMAP: {
const uint8_t *remap = bp->remap;
src += pixels; src += pixels;
do { do {
*dst = remap[*dst]; *dst = remap[*dst];

@ -43,6 +43,7 @@ void Blitter_8bppSimple::Draw(Blitter::BlitterParams *bp, BlitterMode mode, Zoom
break; break;
case BM_TRANSPARENT: case BM_TRANSPARENT:
case BM_TRANSPARENT_REMAP:
if (*src != 0) colour = bp->remap[*dst]; if (*src != 0) colour = bp->remap[*dst];
break; break;

@ -20,7 +20,8 @@
enum BlitterMode { enum BlitterMode {
BM_NORMAL, ///< Perform the simple blitting. BM_NORMAL, ///< Perform the simple blitting.
BM_COLOUR_REMAP, ///< Perform a colour remapping. 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_CRASH_REMAP, ///< Perform a crash remapping.
BM_BLACK_REMAP, ///< Perform remapping to a completely blackened sprite BM_BLACK_REMAP, ///< Perform remapping to a completely blackened sprite
BM_NORMAL_WITH_BRIGHTNESS, ///< Perform a simple blitting with brightness adjustment BM_NORMAL_WITH_BRIGHTNESS, ///< Perform a simple blitting with brightness adjustment

@ -823,7 +823,7 @@ public:
this->square = GetSpriteSize(SPR_SQUARE); this->square = GetSpriteSize(SPR_SQUARE);
this->line_height = std::max(this->square.height, (uint)GetCharacterHeight(FS_NORMAL)) + padding.height; 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->width = 1;
resize->height = this->line_height; resize->height = this->line_height;
break; break;
@ -966,6 +966,12 @@ public:
SetDParam(0, g->index); 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); 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(NWID_HORIZONTAL),
NWidget(WWT_CLOSEBOX, COLOUR_GREY), NWidget(WWT_CLOSEBOX, COLOUR_GREY),
NWidget(WWT_CAPTION, COLOUR_GREY, WID_SCL_CAPTION), SetDataTip(STR_LIVERY_CAPTION, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS), 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_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_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_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_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_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_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_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), SetMinimalSize(90, 22), SetFill(1, 1), EndContainer(), NWidget(WWT_PANEL, COLOUR_GREY), SetFill(1, 1), SetResize(1, 0), EndContainer(),
EndContainer(), EndContainer(),
NWidget(NWID_HORIZONTAL), NWidget(NWID_HORIZONTAL),
NWidget(WWT_PANEL, COLOUR_GREY, WID_SCL_SPACER_DROPDOWN), SetMinimalSize(150, 12), SetFill(1, 1), EndContainer(), 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(WWT_DROPDOWN, COLOUR_GREY, WID_SCL_PRI_COL_DROPDOWN), SetMinimalSize(125, 12), SetFill(0, 1), SetDataTip(STR_JUST_STRING, STR_LIVERY_PRIMARY_TOOLTIP), NWidget(NWID_VSCROLLBAR, COLOUR_GREY, WID_SCL_MATRIX_SCROLLBAR),
NWidget(WWT_DROPDOWN, COLOUR_GREY, WID_SCL_SEC_COL_DROPDOWN), SetMinimalSize(125, 12), SetFill(0, 1),
SetDataTip(STR_JUST_STRING, STR_LIVERY_SECONDARY_TOOLTIP),
EndContainer(), EndContainer(),
NWidget(NWID_HORIZONTAL), 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(WWT_PANEL, COLOUR_GREY, WID_SCL_SPACER_DROPDOWN), SetFill(1, 1), SetResize(1, 0), EndContainer(),
NWidget(NWID_VERTICAL), NWidget(WWT_DROPDOWN, COLOUR_GREY, WID_SCL_PRI_COL_DROPDOWN), SetFill(0, 1), SetDataTip(STR_JUST_STRING, STR_LIVERY_PRIMARY_TOOLTIP),
NWidget(NWID_VSCROLLBAR, COLOUR_GREY, WID_SCL_MATRIX_SCROLLBAR), 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), NWidget(WWT_RESIZEBOX, COLOUR_GREY),
EndContainer(),
EndContainer(), EndContainer(),
}; };

@ -29,7 +29,6 @@
#include "core/container_func.hpp" #include "core/container_func.hpp"
#include "viewport_func.h" #include "viewport_func.h"
#include "table/palettes.h"
#include "table/string_colours.h" #include "table/string_colours.h"
#include "table/sprites.h" #include "table/sprites.h"
#include "table/control_codes.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. std::chrono::steady_clock::time_point _switch_mode_time; ///< The time when the switch mode was requested.
PauseMode _pause_mode; PauseMode _pause_mode;
uint32 _pause_countdown; uint32 _pause_countdown;
Palette _cur_palette;
std::mutex _cur_palette_mutex;
std::string _switch_baseset; std::string _switch_baseset;
static bool _adjust_gui_zoom_startup_done = false; static bool _adjust_gui_zoom_startup_done = false;
static byte _stringwidth_table[FS_END][224]; ///< Cache containing width of often used characters. @see GetCharacterWidth() static byte _stringwidth_table[FS_END][224]; ///< Cache containing width of often used characters. @see GetCharacterWidth()
DrawPixelInfo *_cur_dpi; 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 { struct GfxBlitterCtx {
const DrawPixelInfo *dpi; const DrawPixelInfo *dpi;
@ -1040,8 +1017,9 @@ void DrawSpriteViewport(const SpritePointerHolder &sprite_store, const DrawPixel
GfxBlitterCtx ctx(dpi); GfxBlitterCtx ctx(dpi);
SpriteID real_sprite = GB(img, 0, SPRITE_WIDTH); SpriteID real_sprite = GB(img, 0, SPRITE_WIDTH);
if (HasBit(img, PALETTE_MODIFIER_TRANSPARENT)) { if (HasBit(img, PALETTE_MODIFIER_TRANSPARENT)) {
ctx.colour_remap_ptr = sprite_store.GetRecolourSprite(GB(pal, 0, PALETTE_WIDTH)) + 1; pal = GB(pal, 0, PALETTE_WIDTH);
GfxMainBlitterViewport(ctx, sprite_store.GetSprite(real_sprite, SpriteType::Normal), x, y, BM_TRANSPARENT, sub, real_sprite); 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) { } else if (pal != PAL_NONE) {
if (HasBit(pal, PALETTE_TEXT_RECOLOUR)) { if (HasBit(pal, PALETTE_TEXT_RECOLOUR)) {
ctx.SetColourRemap((TextColour)GB(pal, 0, PALETTE_WIDTH)); 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); GfxBlitterCtx ctx(_cur_dpi);
SpriteID real_sprite = GB(img, 0, SPRITE_WIDTH); SpriteID real_sprite = GB(img, 0, SPRITE_WIDTH);
if (HasBit(img, PALETTE_MODIFIER_TRANSPARENT)) { if (HasBit(img, PALETTE_MODIFIER_TRANSPARENT)) {
ctx.colour_remap_ptr = GetNonSprite(GB(pal, 0, PALETTE_WIDTH), SpriteType::Recolour) + 1; pal = GB(pal, 0, PALETTE_WIDTH);
GfxMainBlitter(ctx, GetSprite(real_sprite, SpriteType::Normal, ZoomMask(zoom)), x, y, BM_TRANSPARENT, sub, real_sprite, zoom); 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) { } else if (pal != PAL_NONE) {
if (HasBit(pal, PALETTE_TEXT_RECOLOUR)) { if (HasBit(pal, PALETTE_TEXT_RECOLOUR)) {
ctx.SetColourRemap((TextColour)GB(pal, 0, PALETTE_WIDTH)); 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); GfxBlitter<1, true>(ctx, sprite, x, y, mode, sub, sprite_id, zoom);
} }
void DoPaletteAnimations();
Colour _water_palette[10];
void GfxInitPalettes()
{
MemCpyT<Colour>(_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<std::mutex> 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 * Initialize _stringwidth_table cache
* @param monospace Whether to load the monospace cache or the normal fonts. * @param monospace Whether to load the monospace cache or the normal fonts.

@ -40,6 +40,7 @@
#define GFX_FUNC_H #define GFX_FUNC_H
#include "gfx_type.h" #include "gfx_type.h"
#include "palette_func.h"
#include "strings_type.h" #include "strings_type.h"
#include "string_type.h" #include "string_type.h"
#include <vector> #include <vector>
@ -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 UnsetDirtyBlocks(int left, int top, int right, int bottom);
void MarkWholeScreenDirty(); void MarkWholeScreenDirty();
void GfxInitPalettes();
void CheckBlitter(); void CheckBlitter();
bool FillDrawPixelInfo(DrawPixelInfo *n, int left, int top, int width, int height); 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]; 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 */ #endif /* GFX_FUNC_H */

@ -256,6 +256,7 @@ STR_UNITS_HEIGHT_METRIC :{DECIMAL} m
STR_UNITS_HEIGHT_SI :{DECIMAL} m STR_UNITS_HEIGHT_SI :{DECIMAL} m
STR_UNITS_DAYS :{COMMA}{NBSP}dag{P "" s} STR_UNITS_DAYS :{COMMA}{NBSP}dag{P "" s}
STR_UNITS_SECONDS :{COMMA}{NBSP}sekund{P "" er}
# Common window strings # Common window strings
STR_LIST_FILTER_TITLE :{BLACK}Filtrer udtryk: 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_LAND_GENERATOR_TERRA_GENESIS :TerraGenesis
STR_CONFIG_SETTING_TERRAIN_TYPE :Terræn type: {STRING} 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 :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 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_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 :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 :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_SNOW_COVERAGE_VALUE :{NUM}%
STR_CONFIG_SETTING_DESERT_COVERAGE :Ørkendækning: {STRING} 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_DESERT_COVERAGE_VALUE :{NUM}%
STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN :Tærrenets hårdhed (kun TerraGenesis) : {STRING} 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 ###length 4
STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_VERY_SMOOTH :Meget blødt STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_VERY_SMOOTH :Meget blødt
STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_SMOOTH :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_ROUGHNESS_OF_TERRAIN_VERY_ROUGH :Meget råt
STR_CONFIG_SETTING_VARIETY :Forskelligheds fordeling: {STRING} 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 :Floder antal: {STRING}
STR_CONFIG_SETTING_RIVER_AMOUNT_HELPTEXT :Vælg, hvor mange floder at skabe 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 :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_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 STR_CONFIG_SETTING_TIMETABLE_MODE_HELPTEXT :Vælg de tidsenheder, der skal bruges til køreplaner
###length 3 ###length 3
STR_CONFIG_SETTING_TIMETABLE_MODE_DAYS :Dage 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 :{BLACK}Dato:
STR_MAPGEN_DATE_TOOLTIP :{BLACK}Vælg startdato STR_MAPGEN_DATE_TOOLTIP :{BLACK}Vælg startdato
STR_MAPGEN_NUMBER_OF_INDUSTRIES :{BLACK}Antal industrier: 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 :{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_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_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: 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_DESERT_COVERAGE_TEXT :{BLACK}{NUM}%
STR_MAPGEN_TERRAIN_TYPE :{BLACK}Terræntype: STR_MAPGEN_TERRAIN_TYPE :{BLACK}Terræntype:
STR_MAPGEN_SEA_LEVEL :{BLACK}Havniveau STR_MAPGEN_SEA_LEVEL :{BLACK}Havniveau
STR_MAPGEN_SEA_LEVEL_TOOLTIP :{BLACK}Vælg havniveau
STR_MAPGEN_QUANTITY_OF_RIVERS :{BLACK}Floder: STR_MAPGEN_QUANTITY_OF_RIVERS :{BLACK}Floder:
STR_MAPGEN_SMOOTHNESS :{BLACK}Blødhed: STR_MAPGEN_SMOOTHNESS :{BLACK}Blødhed:
STR_MAPGEN_VARIETY :{BLACK}Varietet af distributionen: STR_MAPGEN_VARIETY :{BLACK}Varietet af distributionen:
@ -3261,6 +3266,7 @@ STR_MAPGEN_TOWN_NAME_CATALAN :Catalanske
# Strings for map borders at game generation # Strings for map borders at game generation
STR_MAPGEN_BORDER_TYPE :{BLACK}Kortkanter: 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_NORTHWEST :{BLACK}Nordvest
STR_MAPGEN_NORTHEAST :{BLACK}Nordøst STR_MAPGEN_NORTHEAST :{BLACK}Nordøst
STR_MAPGEN_SOUTHEAST :{BLACK}Sydø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_ROTATION :{BLACK}Højdekortets rotation:
STR_MAPGEN_HEIGHTMAP_NAME :{BLACK}Højdekortets navn: 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 :{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_HEIGHTMAP_SIZE :{ORANGE}{NUM} x {NUM}
STR_MAPGEN_TERRAIN_TYPE_QUERY_CAPT :{WHITE}Ønsket højeste bjergtop 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_FLAT_WORLD_TOOLTIP :{BLACK}Generer fladt landskab
STR_SE_MAPGEN_RANDOM_LAND :{WHITE}Tilfældigt land 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 :{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_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 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_ARRIVAL_DATE :A: {COLOUR}{DATE_TINY}
STR_TIMETABLE_DEPARTURE_DATE :D: {COLOUR}{DATE_TINY} STR_TIMETABLE_DEPARTURE_DATE :D: {COLOUR}{DATE_TINY}
STR_TIMETABLE_ARRIVAL_SECONDS_IN_FUTURE :A: {COLOUR}{COMMA} sek STR_TIMETABLE_ARRIVAL_SECONDS_IN_FUTURE :A: {COLOUR}{COMMA} sek
STR_TIMETABLE_DEPARTURE_SECONDS_IN_FUTURE :D: {COLOUR}{COMMA} sek
# Date window (for timetable) # Date window (for timetable)

@ -1491,7 +1491,7 @@ STR_CONFIG_SETTING_LAND_GENERATOR_ORIGINAL :Origineel
STR_CONFIG_SETTING_LAND_GENERATOR_TERRA_GENESIS :TerraGenesis STR_CONFIG_SETTING_LAND_GENERATOR_TERRA_GENESIS :TerraGenesis
STR_CONFIG_SETTING_TERRAIN_TYPE :Terreintype: {STRING} 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 :Industriedichtheid: {STRING}
STR_CONFIG_SETTING_INDUSTRY_DENSITY_HELPTEXT :Stelt in hoeveel industrieën worden gegenereerd en welk niveau tijdens het spel moet worden gehandhaafd 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_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 :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 :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_SNOW_COVERAGE_VALUE :{NUM}%
STR_CONFIG_SETTING_DESERT_COVERAGE :Woestijnoppervlak: {STRING} 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_DESERT_COVERAGE_VALUE :{NUM}%
STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN :Ruwheid van het terrein: {STRING} 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 ###length 4
STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_VERY_SMOOTH :Erg glad STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_VERY_SMOOTH :Erg glad
STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_SMOOTH :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_ROUGHNESS_OF_TERRAIN_VERY_ROUGH :Erg ruig
STR_CONFIG_SETTING_VARIETY :Variëteit distributie: {STRING} 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 :Hoeveelheid rivieren: {STRING}
STR_CONFIG_SETTING_RIVER_AMOUNT_HELPTEXT :Selecteer hoeveel rivieren er gegenereerd worden 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_ROAD_SIDE_RIGHT :Rechts rijden
STR_CONFIG_SETTING_HEIGHTMAP_ROTATION :Draaiing van hoogtekaart: {STRING} 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 ###length 2
STR_CONFIG_SETTING_HEIGHTMAP_ROTATION_COUNTER_CLOCKWISE :Tegen de klok in STR_CONFIG_SETTING_HEIGHTMAP_ROTATION_COUNTER_CLOCKWISE :Tegen de klok in
STR_CONFIG_SETTING_HEIGHTMAP_ROTATION_CLOCKWISE :Met de klok mee 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_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_BY :{BLACK}*
STR_MAPGEN_NUMBER_OF_TOWNS :{BLACK}Aantal steden: 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_LABEL :{BLACK}Plaatsnamen:
STR_MAPGEN_TOWN_NAME_DROPDOWN_TOOLTIP :{BLACK}Stijl voor plaatsnamen kiezen STR_MAPGEN_TOWN_NAME_DROPDOWN_TOOLTIP :{BLACK}Stijl voor plaatsnamen kiezen
STR_MAPGEN_DATE :{BLACK}Datum: 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 :{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 :{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_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_HEIGHTMAP_HEIGHT_DOWN :{BLACK}Verlaagt de maximale hoogte van de hoogste berg op de kaart met één
STR_MAPGEN_SNOW_COVERAGE :{BLACK}Sneeuwoppervlak: 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_DESERT_COVERAGE_TEXT :{BLACK}{NUM}%
STR_MAPGEN_TERRAIN_TYPE :{BLACK}Terreintype: STR_MAPGEN_TERRAIN_TYPE :{BLACK}Terreintype:
STR_MAPGEN_SEA_LEVEL :{BLACK}Zeeniveau: STR_MAPGEN_SEA_LEVEL :{BLACK}Zeeniveau:
STR_MAPGEN_SEA_LEVEL_TOOLTIP :{BLACK}Kies het zeeniveau
STR_MAPGEN_QUANTITY_OF_RIVERS :{BLACK}Rivieren: STR_MAPGEN_QUANTITY_OF_RIVERS :{BLACK}Rivieren:
STR_MAPGEN_SMOOTHNESS :{BLACK}Gladheid: STR_MAPGEN_SMOOTHNESS :{BLACK}Gladheid:
STR_MAPGEN_VARIETY :{BLACK}Landschapsvariatie: STR_MAPGEN_VARIETY :{BLACK}Landschapsvariatie:
STR_MAPGEN_GENERATE :{WHITE}Maken 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 :{BLACK}NewGRF-instellingen
STR_MAPGEN_NEWGRF_SETTINGS_TOOLTIP :{BLACK}NewGRF-instellingen weergeven STR_MAPGEN_NEWGRF_SETTINGS_TOOLTIP :{BLACK}NewGRF-instellingen weergeven
STR_MAPGEN_AI_SETTINGS :{BLACK}AI-instellingen STR_MAPGEN_AI_SETTINGS :{BLACK}AI-instellingen
@ -3261,6 +3268,7 @@ STR_MAPGEN_TOWN_NAME_CATALAN :Catalaans
# Strings for map borders at game generation # Strings for map borders at game generation
STR_MAPGEN_BORDER_TYPE :{BLACK}Kaartranden: 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_NORTHWEST :{BLACK}Noordwest
STR_MAPGEN_NORTHEAST :{BLACK}Noordoost STR_MAPGEN_NORTHEAST :{BLACK}Noordoost
STR_MAPGEN_SOUTHEAST :{BLACK}Zuidoost 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_ROTATION :{BLACK}Rotatie van hoogtekaart:
STR_MAPGEN_HEIGHTMAP_NAME :{BLACK}Naam 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 :{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_HEIGHTMAP_SIZE :{ORANGE}{NUM} x {NUM}
STR_MAPGEN_TERRAIN_TYPE_QUERY_CAPT :{WHITE}Gewenste hoogte van bergen 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_FLAT_WORLD_TOOLTIP :{BLACK}Genereer een vlakke kaart
STR_SE_MAPGEN_RANDOM_LAND :{WHITE}Willekeurig land 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 :{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_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 STR_SE_MAPGEN_FLAT_WORLD_HEIGHT_UP :{BLACK}Verhoog de hoogte van vlak land met één

@ -2196,12 +2196,20 @@ STR_LIVERY_TRAIN_TOOLTIP :{BLACK}Show tra
STR_LIVERY_ROAD_VEHICLE_TOOLTIP :{BLACK}Show road vehicle colour schemes STR_LIVERY_ROAD_VEHICLE_TOOLTIP :{BLACK}Show road vehicle colour schemes
STR_LIVERY_SHIP_TOOLTIP :{BLACK}Show ship colour schemes STR_LIVERY_SHIP_TOOLTIP :{BLACK}Show ship colour schemes
STR_LIVERY_AIRCRAFT_TOOLTIP :{BLACK}Show aircraft 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_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_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_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 ###length 23
STR_LIVERY_DEFAULT :Standard Livery STR_LIVERY_DEFAULT :Default Livery
STR_LIVERY_STEAM :Steam Engine STR_LIVERY_STEAM :Steam Engine
STR_LIVERY_DIESEL :Diesel Engine STR_LIVERY_DIESEL :Diesel Engine
STR_LIVERY_ELECTRIC :Electric Engine STR_LIVERY_ELECTRIC :Electric Engine

@ -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_EQUALS :is equal to
STR_ORDER_CONDITIONAL_COMPARATOR_NOT_EQUALS :is not 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_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_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_TRUE :is true
STR_ORDER_CONDITIONAL_COMPARATOR_IS_FALSE :is false STR_ORDER_CONDITIONAL_COMPARATOR_IS_FALSE :is false

@ -255,6 +255,9 @@ STR_UNITS_HEIGHT_IMPERIAL :{DECIMAL}{NBSP}
STR_UNITS_HEIGHT_METRIC :{DECIMAL}{NBSP}m STR_UNITS_HEIGHT_METRIC :{DECIMAL}{NBSP}m
STR_UNITS_HEIGHT_SI :{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 # Common window strings
STR_LIST_FILTER_TITLE :{BLACK}Suodatin: 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) STR_PLAYLIST_TOOLTIP_CLICK_TO_REMOVE_TRACK :{BLACK}Poista musiikkiraita nykyiseltä soittolistalta napsauttamalla (vain oma{NBSP}1 tai oma{NBSP}2)
# Highscore window # Highscore window
STR_HIGHSCORE_TOP_COMPANIES :{BIG_FONT}{BLACK}Huippuyhtiöt
STR_HIGHSCORE_POSITION :{BIG_FONT}{BLACK}{COMMA}. STR_HIGHSCORE_POSITION :{BIG_FONT}{BLACK}{COMMA}.
STR_HIGHSCORE_PERFORMANCE_TITLE_BUSINESSMAN :Kaupantekijä STR_HIGHSCORE_PERFORMANCE_TITLE_BUSINESSMAN :Kaupantekijä
STR_HIGHSCORE_PERFORMANCE_TITLE_ENTREPRENEUR :Yrittäjä 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_LAND_GENERATOR_TERRA_GENESIS :TerraGenesis
STR_CONFIG_SETTING_TERRAIN_TYPE :Maaston tyyppi: {STRING} 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 :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 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_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 :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 :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_SNOW_COVERAGE_VALUE :{NUM}{NBSP}%
STR_CONFIG_SETTING_DESERT_COVERAGE :Aavikon peitto: {STRING} 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_DESERT_COVERAGE_VALUE :{NUM}{NBSP}%
STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN :Maaston epätasaisuus: {STRING} 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 ###length 4
STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_VERY_SMOOTH :Erittäin tasainen STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_VERY_SMOOTH :Erittäin tasainen
STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_SMOOTH :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_ROUGHNESS_OF_TERRAIN_VERY_ROUGH :Erittäin epätasainen
STR_CONFIG_SETTING_VARIETY :Maaston vaihtelu: {STRING} 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 :Jokien määrä: {STRING}
STR_CONFIG_SETTING_RIVER_AMOUNT_HELPTEXT :Valitse, kuinka paljon jokia luodaan 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_ROAD_SIDE_RIGHT :Oikeanpuolinen liikenne
STR_CONFIG_SETTING_HEIGHTMAP_ROTATION :Korkeuskartan pyöritys:{STRING} 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 ###length 2
STR_CONFIG_SETTING_HEIGHTMAP_ROTATION_COUNTER_CLOCKWISE :Vastapäivään STR_CONFIG_SETTING_HEIGHTMAP_ROTATION_COUNTER_CLOCKWISE :Vastapäivään
STR_CONFIG_SETTING_HEIGHTMAP_ROTATION_CLOCKWISE :Myötäpä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 :Lastausilmaisimet: {STRING}
STR_CONFIG_SETTING_LOADING_INDICATORS_HELPTEXT :Määritä näytetäänkö lastausilmaisimet kulkuneuvojen yläpuolella lastatessa ja purettaessa rahtia 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 ###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 :Näytä saapuminen ja lähtö aikatauluissa: {STRING}
STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE_HELPTEXT :Näytä odotetut saapumis- ja lähtemisajat aikatauluissa 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_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_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_VISIBILITY_TOOLTIP :{BLACK}Näkyykö palvelimesi muille julkisessa listauksessa
STR_NETWORK_START_SERVER_CLIENTS_SELECT :{BLACK}{NUM} asiakas{P "" ta} STR_NETWORK_START_SERVER_CLIENTS_SELECT :{BLACK}{NUM} asiakas{P "" ta}
STR_NETWORK_START_SERVER_NUMBER_OF_CLIENTS :{BLACK}Pelaajien enimmäismäärä: 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_MAPSIZE_TOOLTIP :{BLACK}Valitse kartan koko ruutuina. Saatavilla olevien ruutujen määrä on hieman alhaisempi
STR_MAPGEN_BY :{BLACK}× STR_MAPGEN_BY :{BLACK}×
STR_MAPGEN_NUMBER_OF_TOWNS :{BLACK}Kuntien määrä: 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_LABEL :{BLACK}Kuntien nimet:
STR_MAPGEN_TOWN_NAME_DROPDOWN_TOOLTIP :{BLACK}Valitse kuntien nimien tyyli STR_MAPGEN_TOWN_NAME_DROPDOWN_TOOLTIP :{BLACK}Valitse kuntien nimien tyyli
STR_MAPGEN_DATE :{BLACK}Päivämäärä: 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 :{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 :{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_UP :{BLACK}Korota kartan korkeimman huipun maksimikorkeutta yhdellä
STR_MAPGEN_HEIGHTMAP_HEIGHT_DOWN :{BLACK}Madalla kartan korkeimman huipun maksimikorkeutta yhdellä STR_MAPGEN_HEIGHTMAP_HEIGHT_DOWN :{BLACK}Madalla kartan korkeimman huipun maksimikorkeutta yhdellä
STR_MAPGEN_SNOW_COVERAGE :{BLACK}Lumen peitto: 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_DESERT_COVERAGE_TEXT :{BLACK}{NUM}{NBSP}%
STR_MAPGEN_TERRAIN_TYPE :{BLACK}Maaston tyyppi: STR_MAPGEN_TERRAIN_TYPE :{BLACK}Maaston tyyppi:
STR_MAPGEN_SEA_LEVEL :{BLACK}Merenpinta: STR_MAPGEN_SEA_LEVEL :{BLACK}Merenpinta:
STR_MAPGEN_SEA_LEVEL_TOOLTIP :{BLACK}Valitse merenpinnan taso
STR_MAPGEN_QUANTITY_OF_RIVERS :{BLACK}Joet: STR_MAPGEN_QUANTITY_OF_RIVERS :{BLACK}Joet:
STR_MAPGEN_SMOOTHNESS :{BLACK}Tasaisuus: STR_MAPGEN_SMOOTHNESS :{BLACK}Tasaisuus:
STR_MAPGEN_VARIETY :{BLACK}Vaihtelu: STR_MAPGEN_VARIETY :{BLACK}Vaihtelu:
STR_MAPGEN_GENERATE :{WHITE}Generoi 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 :{BLACK}NewGRF-asetukset
STR_MAPGEN_NEWGRF_SETTINGS_TOOLTIP :{BLACK}Näytä NewGRF-asetukset STR_MAPGEN_NEWGRF_SETTINGS_TOOLTIP :{BLACK}Näytä NewGRF-asetukset
STR_MAPGEN_AI_SETTINGS :{BLACK}Tekoälyasetukset STR_MAPGEN_AI_SETTINGS :{BLACK}Tekoälyasetukset
@ -3252,6 +3268,7 @@ STR_MAPGEN_TOWN_NAME_CATALAN :Katalonialainen
# Strings for map borders at game generation # Strings for map borders at game generation
STR_MAPGEN_BORDER_TYPE :{BLACK}Kartan reunat: STR_MAPGEN_BORDER_TYPE :{BLACK}Kartan reunat:
STR_MAPGEN_BORDER_TYPE_TOOLTIP :{BLACK}Valitse pelimaailman reunukset
STR_MAPGEN_NORTHWEST :{BLACK}Luode STR_MAPGEN_NORTHWEST :{BLACK}Luode
STR_MAPGEN_NORTHEAST :{BLACK}Koillinen STR_MAPGEN_NORTHEAST :{BLACK}Koillinen
STR_MAPGEN_SOUTHEAST :{BLACK}Kaakko 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_ROTATION :{BLACK}Korkeuskartan kierto:
STR_MAPGEN_HEIGHTMAP_NAME :{BLACK}Korkeuskartan nimi: 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 :{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_HEIGHTMAP_SIZE :{ORANGE}{NUM}×{NUM}
STR_MAPGEN_TERRAIN_TYPE_QUERY_CAPT :{WHITE}Huipun tavoitekorkeus 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_FLAT_WORLD_TOOLTIP :{BLACK}Luo tasainen maa
STR_SE_MAPGEN_RANDOM_LAND :{WHITE}Satunnainen 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 :{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_DOWN :{BLACK}Siirrä tasaista maata yksi alaspäin
STR_SE_MAPGEN_FLAT_WORLD_HEIGHT_UP :{BLACK}Siirrä tasaista maata yksi ylöspä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_LATE :{BLACK}Kulkuneuvo on {STRING} myöhässä
STR_TIMETABLE_STATUS_EARLY :{BLACK}Kulkuneuvo on {STRING} etuajassa 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_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_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 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_SCHEDULED :{BLACK}Aikataulu
STR_TIMETABLE_EXPECTED_TOOLTIP :{BLACK}Vaihda odotetun ja aikataulun välillä 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) # Date window (for timetable)

@ -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) STR_PLAYLIST_TOOLTIP_CLICK_TO_REMOVE_TRACK :{BLACK}Apasă pe melodie pentru a o elimina din programul actual (doar Custom1 sau Custom2)
# Highscore window # Highscore window
STR_HIGHSCORE_TOP_COMPANIES :{BIG_FONT}{BLACK}Companii de top
STR_HIGHSCORE_POSITION :{BIG_FONT}{BLACK}{COMMA}. STR_HIGHSCORE_POSITION :{BIG_FONT}{BLACK}{COMMA}.
STR_HIGHSCORE_PERFORMANCE_TITLE_BUSINESSMAN :Om de afaceri STR_HIGHSCORE_PERFORMANCE_TITLE_BUSINESSMAN :Om de afaceri
STR_HIGHSCORE_PERFORMANCE_TITLE_ENTREPRENEUR :Întreprinzător 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_ROAD_SIDE_RIGHT :Pe partea dreaptă
STR_CONFIG_SETTING_HEIGHTMAP_ROTATION :Rotaţie hartă înălţimi: {STRING} 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 ###length 2
STR_CONFIG_SETTING_HEIGHTMAP_ROTATION_COUNTER_CLOCKWISE :Spre stânga STR_CONFIG_SETTING_HEIGHTMAP_ROTATION_COUNTER_CLOCKWISE :Spre stânga
STR_CONFIG_SETTING_HEIGHTMAP_ROTATION_CLOCKWISE :Spre dreapta 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 :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_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 ###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 :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 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_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_BY :{BLACK}*
STR_MAPGEN_NUMBER_OF_TOWNS :{BLACK}Nr. de oraşe: 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_LABEL :{BLACK}Numele orașelor:
STR_MAPGEN_TOWN_NAME_DROPDOWN_TOOLTIP :{BLACK}Alege naţionalitatea numelor oraşelor STR_MAPGEN_TOWN_NAME_DROPDOWN_TOOLTIP :{BLACK}Alege naţionalitatea numelor oraşelor
STR_MAPGEN_DATE :{BLACK}Data: 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 :{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 :{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_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_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ă: 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_DESERT_COVERAGE_TEXT :{BLACK}{NUM}%
STR_MAPGEN_TERRAIN_TYPE :{BLACK}Tip teren: STR_MAPGEN_TERRAIN_TYPE :{BLACK}Tip teren:
STR_MAPGEN_SEA_LEVEL :{BLACK}Nivelul mării: 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_QUANTITY_OF_RIVERS :{BLACK}Râuri:
STR_MAPGEN_SMOOTHNESS :{BLACK}Netezime: STR_MAPGEN_SMOOTHNESS :{BLACK}Netezime:
STR_MAPGEN_VARIETY :{BLACK}Distribuţia varietăţii: STR_MAPGEN_VARIETY :{BLACK}Distribuţia varietăţii:
STR_MAPGEN_GENERATE :{WHITE}Generează 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 :{BLACK}Setări NewGRF
STR_MAPGEN_NEWGRF_SETTINGS_TOOLTIP :{BLACK}Afişează setările NewGRF STR_MAPGEN_NEWGRF_SETTINGS_TOOLTIP :{BLACK}Afişează setările NewGRF
STR_MAPGEN_AI_SETTINGS :{BLACK}Configurație AI 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 # Strings for map borders at game generation
STR_MAPGEN_BORDER_TYPE :{BLACK}Margine: 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_NORTHWEST :{BLACK}Nord-vest
STR_MAPGEN_NORTHEAST :{BLACK}Nord-est STR_MAPGEN_NORTHEAST :{BLACK}Nord-est
STR_MAPGEN_SOUTHEAST :{BLACK}Sud-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_ROTATION :{BLACK}Rotaţie hartă înălţimi:
STR_MAPGEN_HEIGHTMAP_NAME :{BLACK}Nume 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 :{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_HEIGHTMAP_SIZE :{ORANGE}{NUM} x {NUM}
STR_MAPGEN_TERRAIN_TYPE_QUERY_CAPT :{WHITE}Înălțimea maximă dorită 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_FLAT_WORLD_TOOLTIP :{BLACK}Generează un teren plat
STR_SE_MAPGEN_RANDOM_LAND :{WHITE}Teren aleator 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 :{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_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 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_LATE :{BLACK}Vehiculul are întârziere de {STRING}
STR_TIMETABLE_STATUS_EARLY :{BLACK}Momentan, acest vehicul și-a devansat programul {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_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_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 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_SCHEDULED :{BLACK}Planificat
STR_TIMETABLE_EXPECTED_TOOLTIP :{BLACK}Comută între estimare şi orar 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) # 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 :{WHITE}Încadrează textul
STR_TEXTFILE_WRAP_TEXT_TOOLTIP :{BLACK}Încadrează textul ferestrei ca să fie vizibil integral, fără derulare 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 :{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 :{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 :{BLACK}Licenţă
STR_TEXTFILE_VIEW_LICENCE_TOOLTIP :Vedeți licența pentru acest conținut
###length 5 ###length 5
STR_TEXTFILE_README_CAPTION :{WHITE}{STRING}, fișier readme al {STRING} STR_TEXTFILE_README_CAPTION :{WHITE}{STRING}, fișier readme al {STRING}
STR_TEXTFILE_CHANGELOG_CAPTION :{WHITE}{STRING}, lista de modificări a {STRING} STR_TEXTFILE_CHANGELOG_CAPTION :{WHITE}{STRING}, lista de modificări a {STRING}

@ -1259,8 +1259,8 @@ STR_NUM_VERY_LOW :Очень ма
STR_NUM_LOW :Малое STR_NUM_LOW :Малое
STR_NUM_NORMAL :Среднее STR_NUM_NORMAL :Среднее
STR_NUM_HIGH :Большое STR_NUM_HIGH :Большое
STR_NUM_CUSTOM :Указанное STR_NUM_CUSTOM :Указанное...
STR_NUM_CUSTOM_NUMBER :Заданный ({NUM}) STR_NUM_CUSTOM_NUMBER :Указанное: {NUM}
STR_VARIETY_NONE :Нет STR_VARIETY_NONE :Нет
STR_VARIETY_VERY_LOW :Очень низкое STR_VARIETY_VERY_LOW :Очень низкое
@ -1285,8 +1285,8 @@ STR_SEA_LEVEL_MEDIUM :Среднее
STR_SEA_LEVEL_MEDIUM.p :Средние STR_SEA_LEVEL_MEDIUM.p :Средние
STR_SEA_LEVEL_HIGH :Большое STR_SEA_LEVEL_HIGH :Большое
STR_SEA_LEVEL_HIGH.p :Высокие STR_SEA_LEVEL_HIGH.p :Высокие
STR_SEA_LEVEL_CUSTOM :Заданный STR_SEA_LEVEL_CUSTOM :Заданное...
STR_SEA_LEVEL_CUSTOM_PERCENTAGE :Заданный ({NUM}%) STR_SEA_LEVEL_CUSTOM_PERCENTAGE :Заданное: {NUM}%
###length 4 ###length 4
STR_RIVERS_NONE :Нет STR_RIVERS_NONE :Нет
@ -1317,8 +1317,8 @@ STR_TERRAIN_TYPE_FLAT :Равнинн
STR_TERRAIN_TYPE_HILLY :Холмистый STR_TERRAIN_TYPE_HILLY :Холмистый
STR_TERRAIN_TYPE_MOUNTAINOUS :Преимущественно горный STR_TERRAIN_TYPE_MOUNTAINOUS :Преимущественно горный
STR_TERRAIN_TYPE_ALPINIST :Исключительно горный STR_TERRAIN_TYPE_ALPINIST :Исключительно горный
STR_TERRAIN_TYPE_CUSTOM :Установить высоту вручную STR_TERRAIN_TYPE_CUSTOM :Указанная высота...
STR_TERRAIN_TYPE_CUSTOM_VALUE :Установленная высота ({NUM}) STR_TERRAIN_TYPE_CUSTOM_VALUE :Указанная высота: {NUM}
###length 4 ###length 4
STR_CITY_APPROVAL_LENIENT :снисходительное STR_CITY_APPROVAL_LENIENT :снисходительное
@ -2281,10 +2281,10 @@ STR_INTRO_TOOLTIP_PLAY_SCENARIO :{BLACK}Нача
STR_INTRO_TOOLTIP_SCENARIO_EDITOR :{BLACK}Создать собственный сценарий STR_INTRO_TOOLTIP_SCENARIO_EDITOR :{BLACK}Создать собственный сценарий
STR_INTRO_TOOLTIP_MULTIPLAYER :{BLACK}Начать сетевую игру STR_INTRO_TOOLTIP_MULTIPLAYER :{BLACK}Начать сетевую игру
STR_INTRO_TOOLTIP_TEMPERATE :{BLACK}Выбрать умеренный климат STR_INTRO_TOOLTIP_TEMPERATE :{BLACK}Умеренный климат
STR_INTRO_TOOLTIP_SUB_ARCTIC_LANDSCAPE :{BLACK}Выбрать субарктический климат STR_INTRO_TOOLTIP_SUB_ARCTIC_LANDSCAPE :{BLACK}Субарктический климат
STR_INTRO_TOOLTIP_SUB_TROPICAL_LANDSCAPE :{BLACK}Выбрать субтропический климат STR_INTRO_TOOLTIP_SUB_TROPICAL_LANDSCAPE :{BLACK}Субтропический климат
STR_INTRO_TOOLTIP_TOYLAND_LANDSCAPE :{BLACK}Выбрать игрушечный мир STR_INTRO_TOOLTIP_TOYLAND_LANDSCAPE :{BLACK}Детский мир
STR_INTRO_TOOLTIP_GAME_OPTIONS :{BLACK}Изменить основные настройки игры STR_INTRO_TOOLTIP_GAME_OPTIONS :{BLACK}Изменить основные настройки игры
STR_INTRO_TOOLTIP_HIGHSCORE :{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_DOWN :{BLACK}Уменьшить площадь песчаного покрытия на 10%
STR_MAPGEN_DESERT_COVERAGE_TEXT :{BLACK}{NUM}% STR_MAPGEN_DESERT_COVERAGE_TEXT :{BLACK}{NUM}%
STR_MAPGEN_TERRAIN_TYPE :{BLACK}Тип ландшафта: STR_MAPGEN_TERRAIN_TYPE :{BLACK}Тип ландшафта:
STR_MAPGEN_SEA_LEVEL :{BLACK}Количество морей и озёр: STR_MAPGEN_SEA_LEVEL :{BLACK}Количество водоёмов:
STR_MAPGEN_SEA_LEVEL_TOOLTIP :{BLACK}Выберите значение уровня моря STR_MAPGEN_SEA_LEVEL_TOOLTIP :{BLACK}Выберите количество морей и озёр на карте
STR_MAPGEN_QUANTITY_OF_RIVERS :{BLACK}Количество рек: STR_MAPGEN_QUANTITY_OF_RIVERS :{BLACK}Количество рек:
STR_MAPGEN_SMOOTHNESS :{BLACK}Грубость ландшафта: STR_MAPGEN_SMOOTHNESS :{BLACK}Грубость ландшафта:
STR_MAPGEN_VARIETY :{BLACK}Разнообразие ландшафта: STR_MAPGEN_VARIETY :{BLACK}Разнообразие ландшафта:
@ -4799,7 +4799,7 @@ STR_TIMETABLE_CHANGE_SPEED_TOOLTIP :{BLACK}Изме
STR_TIMETABLE_CLEAR_SPEED :{BLACK}Сбросить огранич. скорости STR_TIMETABLE_CLEAR_SPEED :{BLACK}Сбросить огранич. скорости
STR_TIMETABLE_CLEAR_SPEED_TOOLTIP :{BLACK}Сбросить ограничение скорости движения для выделенного задания. Ctrl+щелчок - сбросить время для всех заданий. 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_RESET_LATENESS_TOOLTIP :{BLACK}Сбросить счётчик опоздания, чтобы ТС считалось идущим по графику. Ctrl+щелчок сбросит счётчики у всей группы, так что последнее ТС будет идти по графику, а остальные - раньше графика.
STR_TIMETABLE_AUTOFILL :{BLACK}Авторасчёт STR_TIMETABLE_AUTOFILL :{BLACK}Авторасчёт

@ -255,6 +255,9 @@ STR_UNITS_HEIGHT_IMPERIAL :{DECIMAL}{NBSP}
STR_UNITS_HEIGHT_METRIC :{DECIMAL}{NBSP}米 STR_UNITS_HEIGHT_METRIC :{DECIMAL}{NBSP}米
STR_UNITS_HEIGHT_SI :{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 # Common window strings
STR_LIST_FILTER_TITLE :{BLACK}关键字词: 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) STR_PLAYLIST_TOOLTIP_CLICK_TO_REMOVE_TRACK :{BLACK}点击音乐曲目以从当前播放列表中删除{}(仅限自定义1或自定义2)
# Highscore window # Highscore window
STR_HIGHSCORE_TOP_COMPANIES :{BIG_FONT}{BLACK}顶级公司
STR_HIGHSCORE_POSITION :{BIG_FONT}{BLACK}{COMMA}. STR_HIGHSCORE_POSITION :{BIG_FONT}{BLACK}{COMMA}.
STR_HIGHSCORE_PERFORMANCE_TITLE_BUSINESSMAN :运输个体户 STR_HIGHSCORE_PERFORMANCE_TITLE_BUSINESSMAN :运输个体户
STR_HIGHSCORE_PERFORMANCE_TITLE_ENTREPRENEUR :运输代理商 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_TOOLTIP :{BLACK}选择要使用的基础音乐组
STR_GAME_OPTIONS_BASE_MUSIC_DESCRIPTION_TOOLTIP :{BLACK}有关基础音乐组的附加信息 STR_GAME_OPTIONS_BASE_MUSIC_DESCRIPTION_TOOLTIP :{BLACK}有关基础音乐组的附加信息
STR_BASESET_STATUS :{STRING} {RED}(共有{NUM}份缺失或损坏的文件)
STR_ERROR_RESOLUTION_LIST_FAILED :{WHITE}无法撷取可用的屏幕分辨率清单 STR_ERROR_RESOLUTION_LIST_FAILED :{WHITE}无法撷取可用的屏幕分辨率清单
STR_ERROR_FULLSCREEN_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_LAND_GENERATOR_TERRA_GENESIS :新算法
STR_CONFIG_SETTING_TERRAIN_TYPE :地貌类型: {STRING} 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 :工业布局: {STRING}
STR_CONFIG_SETTING_INDUSTRY_DENSITY_HELPTEXT :设置地图生成过程中,工业数量及一、二级工业比例。 STR_CONFIG_SETTING_INDUSTRY_DENSITY_HELPTEXT :设置地图生成过程中,工业数量及一、二级工业比例。
@ -1498,15 +1503,15 @@ STR_CONFIG_SETTING_SNOWLINE_HEIGHT :雪线高度:
STR_CONFIG_SETTING_SNOWLINE_HEIGHT_HELPTEXT :控制在寒带气候中雪线高度。大雪会影响工业和城镇发展需求。只能在场景编辑器中更改或由“积雪覆盖率”计算得到。 STR_CONFIG_SETTING_SNOWLINE_HEIGHT_HELPTEXT :控制在寒带气候中雪线高度。大雪会影响工业和城镇发展需求。只能在场景编辑器中更改或由“积雪覆盖率”计算得到。
STR_CONFIG_SETTING_SNOW_COVERAGE :积雪覆盖率:{STRING} 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_SNOW_COVERAGE_VALUE :{NUM}%
STR_CONFIG_SETTING_DESERT_COVERAGE :沙漠覆盖率:{STRING} 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_DESERT_COVERAGE_VALUE :{NUM}%
STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN :地面粗糙度 (仅限生成地图时):{STRING} STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN :地面粗糙度 (仅限生成地图时):{STRING}
STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_HELPTEXT :(仅限新算法) 选择在地图上的山丘密度。光滑的地形会包含较少、相互之间较分散的山丘。粗糙的地形的山丘较密集,但可能会使地图显得重复 STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_HELPTEXT :选择在地图上的山丘密度。光滑的地形会包含较少且相互之间较分散的山丘;粗糙的地形的山丘较密集,但可能会使地图显得重复
###length 4 ###length 4
STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_VERY_SMOOTH :非常光滑 STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_VERY_SMOOTH :非常光滑
STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_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_ROUGHNESS_OF_TERRAIN_VERY_ROUGH :非常粗糙
STR_CONFIG_SETTING_VARIETY :多样的分发: {STRING} 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 :河流数量: {STRING}
STR_CONFIG_SETTING_RIVER_AMOUNT_HELPTEXT :选择生成河流的数量 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_ROAD_SIDE_RIGHT :右侧通行
STR_CONFIG_SETTING_HEIGHTMAP_ROTATION :高度图旋转:{STRING} STR_CONFIG_SETTING_HEIGHTMAP_ROTATION :高度图旋转:{STRING}
STR_CONFIG_SETTING_HEIGHTMAP_ROTATION_TOOLTIP :选择高度图旋转的方向以创建地图
###length 2 ###length 2
STR_CONFIG_SETTING_HEIGHTMAP_ROTATION_COUNTER_CLOCKWISE :逆时针 STR_CONFIG_SETTING_HEIGHTMAP_ROTATION_COUNTER_CLOCKWISE :逆时针
STR_CONFIG_SETTING_HEIGHTMAP_ROTATION_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 :使用装货进度指示: {STRING}
STR_CONFIG_SETTING_LOADING_INDICATORS_HELPTEXT :选择是否在车辆上方显示装卸货物进度 STR_CONFIG_SETTING_LOADING_INDICATORS_HELPTEXT :选择是否在车辆上方显示装卸货物进度
STR_CONFIG_SETTING_TIMETABLE_MODE :时刻表使用的时间单位: {STRING}
STR_CONFIG_SETTING_TIMETABLE_MODE_HELPTEXT :选择载具时刻表所使用的时间单位
###length 3 ###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 :在时刻表中显示到达时间和出发时间: {STRING}
STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE_HELPTEXT :在时刻表中显示预期的到达和出发时间 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 :每 {STRING} 更新货物分配
STR_CONFIG_SETTING_LINKGRAPH_RECALC_INTERVAL_HELPTEXT :两次连结图的重新计算间隔。每次重新计算会计算图中一个部分的计划。这意味着填入的值X不意味着整张图会每X秒更新一次只有其中的一部分会被更新。此设定赋值越小则更多的CPU时间会被用来重新计算。此设定赋值越大则在线路改变时货物再分配所需时间会变长。 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_LINKGRAPH_RECALC_TIME_HELPTEXT :每一个连结图的重新计算时间。当一次重新计算开始,一个线程会被允许运行这个秒数。此设定赋值越小,则线程无法按时结束的可能性越大,从而导致游戏运行延迟。此设定赋值越大,则在线路改变时货物再分配所需时间会变长。
STR_CONFIG_SETTING_DISTRIBUTION_PAX :乗客分配方式:{STRING} STR_CONFIG_SETTING_DISTRIBUTION_PAX :乗客分配方式:{STRING}
@ -3198,11 +3209,15 @@ STR_MAPGEN_MAPSIZE :{BLACK}地图
STR_MAPGEN_MAPSIZE_TOOLTIP :{BLACK}选择地图尺寸(单位:格)。可用的数值会略小。 STR_MAPGEN_MAPSIZE_TOOLTIP :{BLACK}选择地图尺寸(单位:格)。可用的数值会略小。
STR_MAPGEN_BY :{BLACK}* STR_MAPGEN_BY :{BLACK}*
STR_MAPGEN_NUMBER_OF_TOWNS :{BLACK}城镇数量: STR_MAPGEN_NUMBER_OF_TOWNS :{BLACK}城镇数量:
STR_MAPGEN_NUMBER_OF_TOWNS_TOOLTIP :{BLACK}选择城镇密度,或者输入一个自定义数字
STR_MAPGEN_TOWN_NAME_LABEL :{BLACK}城镇名称: STR_MAPGEN_TOWN_NAME_LABEL :{BLACK}城镇名称:
STR_MAPGEN_TOWN_NAME_DROPDOWN_TOOLTIP :{BLACK}选择城镇名称的命名风格 STR_MAPGEN_TOWN_NAME_DROPDOWN_TOOLTIP :{BLACK}选择城镇名称的命名风格
STR_MAPGEN_DATE :{BLACK}日期: STR_MAPGEN_DATE :{BLACK}日期:
STR_MAPGEN_DATE_TOOLTIP :{BLACK}选择起始日期
STR_MAPGEN_NUMBER_OF_INDUSTRIES :{BLACK}工业数量: STR_MAPGEN_NUMBER_OF_INDUSTRIES :{BLACK}工业数量:
STR_MAPGEN_NUMBER_OF_INDUSTRIES_TOOLTIP :{BLACK}选择工业密度,或者输入一个自定义数字
STR_MAPGEN_HEIGHTMAP_HEIGHT :{BLACK}最高峰: STR_MAPGEN_HEIGHTMAP_HEIGHT :{BLACK}最高峰:
STR_MAPGEN_HEIGHTMAP_HEIGHT_TOOLTIP :{BLACK}选择游戏地图中最高峰的海拔,以海平面为原点计。
STR_MAPGEN_HEIGHTMAP_HEIGHT_UP :{BLACK}提高最高峰的最大高度一格 STR_MAPGEN_HEIGHTMAP_HEIGHT_UP :{BLACK}提高最高峰的最大高度一格
STR_MAPGEN_HEIGHTMAP_HEIGHT_DOWN :{BLACK}降低最高峰的最大高度一格 STR_MAPGEN_HEIGHTMAP_HEIGHT_DOWN :{BLACK}降低最高峰的最大高度一格
STR_MAPGEN_SNOW_COVERAGE :{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_DESERT_COVERAGE_TEXT :{BLACK}{NUM}%
STR_MAPGEN_TERRAIN_TYPE :{BLACK}地形特点: STR_MAPGEN_TERRAIN_TYPE :{BLACK}地形特点:
STR_MAPGEN_SEA_LEVEL :{BLACK}海洋面积: STR_MAPGEN_SEA_LEVEL :{BLACK}海洋面积:
STR_MAPGEN_SEA_LEVEL_TOOLTIP :{BLACK} 选择覆盖率
STR_MAPGEN_QUANTITY_OF_RIVERS :{BLACK}河流数量: STR_MAPGEN_QUANTITY_OF_RIVERS :{BLACK}河流数量:
STR_MAPGEN_SMOOTHNESS :{BLACK}平滑度: STR_MAPGEN_SMOOTHNESS :{BLACK}平滑度:
STR_MAPGEN_VARIETY :{BLACK}多样的分发: STR_MAPGEN_VARIETY :{BLACK}多样的分发:
STR_MAPGEN_GENERATE :{WHITE}生成 STR_MAPGEN_GENERATE :{WHITE}生成
STR_MAPGEN_GENERATE_TOOLTIP :{BLACK} 创建世界并开始游玩OpenTTD
STR_MAPGEN_NEWGRF_SETTINGS :{BLACK}NewGRF设置 STR_MAPGEN_NEWGRF_SETTINGS :{BLACK}NewGRF设置
STR_MAPGEN_NEWGRF_SETTINGS_TOOLTIP :{BLACK}显示NewGRF设置 STR_MAPGEN_NEWGRF_SETTINGS_TOOLTIP :{BLACK}显示NewGRF设置
STR_MAPGEN_AI_SETTINGS :{BLACK}AI 设置 STR_MAPGEN_AI_SETTINGS :{BLACK}AI 设置
@ -3251,6 +3268,7 @@ STR_MAPGEN_TOWN_NAME_CATALAN :加泰罗尼亚
# Strings for map borders at game generation # Strings for map borders at game generation
STR_MAPGEN_BORDER_TYPE :{BLACK}地图边缘: STR_MAPGEN_BORDER_TYPE :{BLACK}地图边缘:
STR_MAPGEN_BORDER_TYPE_TOOLTIP :{BLACK}选择地图边界的样式
STR_MAPGEN_NORTHWEST :{BLACK}西北 STR_MAPGEN_NORTHWEST :{BLACK}西北
STR_MAPGEN_NORTHEAST :{BLACK}东北 STR_MAPGEN_NORTHEAST :{BLACK}东北
STR_MAPGEN_SOUTHEAST :{BLACK}东南 STR_MAPGEN_SOUTHEAST :{BLACK}东南
@ -3263,7 +3281,9 @@ STR_MAPGEN_BORDER_MANUAL :{BLACK}手动
STR_MAPGEN_HEIGHTMAP_ROTATION :{BLACK}高度图旋转: STR_MAPGEN_HEIGHTMAP_ROTATION :{BLACK}高度图旋转:
STR_MAPGEN_HEIGHTMAP_NAME :{BLACK}高度图名称: STR_MAPGEN_HEIGHTMAP_NAME :{BLACK}高度图名称:
STR_MAPGEN_HEIGHTMAP_NAME_TOOLTIP :{BLACK}高度图图像文件的名字
STR_MAPGEN_HEIGHTMAP_SIZE_LABEL :{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_HEIGHTMAP_SIZE :{ORANGE}{NUM} × {NUM}
STR_MAPGEN_TERRAIN_TYPE_QUERY_CAPT :{WHITE}最高峰目标高度 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_FLAT_WORLD_TOOLTIP :{BLACK}生成平坦水面
STR_SE_MAPGEN_RANDOM_LAND :{WHITE}随机地面 STR_SE_MAPGEN_RANDOM_LAND :{WHITE}随机地面
STR_SE_MAPGEN_FLAT_WORLD_HEIGHT :{BLACK}地面高度: 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_DOWN :{BLACK}提升地面高度
STR_SE_MAPGEN_FLAT_WORLD_HEIGHT_UP :{BLACK}降低地面高度 STR_SE_MAPGEN_FLAT_WORLD_HEIGHT_UP :{BLACK}降低地面高度
@ -3303,7 +3324,7 @@ STR_GENERATION_PREPARING_GAME :{BLACK}准备
# NewGRF settings # NewGRF settings
STR_NEWGRF_SETTINGS_CAPTION :{WHITE}NewGRF 设置 STR_NEWGRF_SETTINGS_CAPTION :{WHITE}NewGRF 设置
STR_NEWGRF_SETTINGS_INFO_TITLE :{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_INACTIVE_LIST :{WHITE}停用 NewGRF
STR_NEWGRF_SETTINGS_SELECT_PRESET :{ORANGE}选择预设 STR_NEWGRF_SETTINGS_SELECT_PRESET :{ORANGE}选择预设
STR_NEWGRF_FILTER_TITLE :{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_LATE :{BLACK}该车辆目前晚点 {STRING}
STR_TIMETABLE_STATUS_EARLY :{BLACK}该车辆目前提前 {STRING} STR_TIMETABLE_STATUS_EARLY :{BLACK}该车辆目前提前 {STRING}
STR_TIMETABLE_STATUS_NOT_STARTED :{BLACK}此时刻表尚未开始 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_CHANGE_TIME :{BLACK}改变时间
STR_TIMETABLE_WAIT_TIME_TOOLTIP :{BLACK}改变高亮选择的命令执行的时间按住Ctrl单击可为所有命令设置时间 STR_TIMETABLE_WAIT_TIME_TOOLTIP :{BLACK}改变高亮选择的命令执行的时间按住Ctrl单击可为所有命令设置时间
@ -4596,6 +4622,10 @@ STR_TIMETABLE_EXPECTED :{BLACK}预期
STR_TIMETABLE_SCHEDULED :{BLACK}表定时间 STR_TIMETABLE_SCHEDULED :{BLACK}表定时间
STR_TIMETABLE_EXPECTED_TOOLTIP :{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) # Date window (for timetable)

@ -67,7 +67,7 @@ static std::string GetLastErrorAsString()
DWORD error_code = GetLastError(); DWORD error_code = GetLastError();
if (FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_FROM_HMODULE | FORMAT_MESSAGE_IGNORE_INSERTS, GetModuleHandleA("winhttp.dll"), error_code, 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); return fmt::format("unknown error {}", error_code);
} }

@ -81,8 +81,8 @@ const char *NetworkError::AsString() const
if (this->message.empty()) { if (this->message.empty()) {
#if defined(_WIN32) #if defined(_WIN32)
char buffer[512]; char buffer[512];
if (FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, this->error, if (FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, nullptr, this->error,
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), buffer, sizeof(buffer), NULL) == 0) { MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), buffer, sizeof(buffer), nullptr) == 0) {
seprintf(buffer, lastof(buffer), "Unknown error %d", this->error); seprintf(buffer, lastof(buffer), "Unknown error %d", this->error);
} }
this->message.assign(buffer); this->message.assign(buffer);

@ -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 <http://www.gnu.org/licenses/>.
*/
/** @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<uint8_t, 1U << (PALETTE_BITS * 3)>;
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<Colour>(_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<std::mutex> 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;
}

@ -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 <http://www.gnu.org/licenses/>.
*/
/** @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 */

@ -22,6 +22,7 @@
#include "../string_func.h" #include "../string_func.h"
#include "../settings_type.h" #include "../settings_type.h"
#include "../command_func.h" #include "../command_func.h"
#include "../core/backup_type.hpp"
#include "script_gui.h" #include "script_gui.h"
#include "script_log.hpp" #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); 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 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_editbox.text.Assign(this->filter.break_string);
this->break_string_filter.SetFilterTerm(this->filter.break_string);
if (show_company == INVALID_COMPANY) { if (show_company == INVALID_COMPANY) {
this->SelectValidDebugCompany(); this->SelectValidDebugCompany();
@ -915,8 +917,19 @@ struct ScriptDebugWindow : public Window {
ScriptLogTypes::LogData &log = this->GetLogData(); ScriptLogTypes::LogData &log = this->GetLogData();
if (log.empty()) return; if (log.empty()) return;
Rect br = r.Shrink(WidgetDimensions::scaled.bevel); Rect fr = r.Shrink(WidgetDimensions::scaled.framerect);
Rect tr = 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++) { for (int i = this->vscroll->GetPosition(); this->vscroll->IsVisible(i) && (size_t)i < log.size(); i++) {
const ScriptLogTypes::LogLine &line = log[i]; const ScriptLogTypes::LogLine &line = log[i];
@ -932,12 +945,13 @@ struct ScriptDebugWindow : public Window {
/* Check if the current line should be highlighted */ /* Check if the current line should be highlighted */
if (i == this->highlight_row) { 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. 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); DrawString(fr, line.text, colour, SA_LEFT | SA_FORCE);
tr.top += this->resize.step_height; fr.top += this->resize.step_height;
} }
} }

@ -10,16 +10,9 @@
#ifndef SMALLMAP_COLOURS_H #ifndef SMALLMAP_COLOURS_H
#define SMALLMAP_COLOURS_H #define SMALLMAP_COLOURS_H
#include "palette_func.h"
#include "core/endian_func.hpp" #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(x) TO_LE32X(x)
#define MKCOLOUR_XXXX(x) (MKCOLOUR(0x01010101) * (uint)(x)) #define MKCOLOUR_XXXX(x) (MKCOLOUR(0x01010101) * (uint)(x))

@ -378,6 +378,19 @@ static bool ResizeSprites(SpriteLoader::SpriteCollection &sprite, unsigned int s
{ {
ZoomLevel first_avail = static_cast<ZoomLevel>(FindFirstBit(sprite_avail)); ZoomLevel first_avail = static_cast<ZoomLevel>(FindFirstBit(sprite_avail));
ZoomLevel first_needed = static_cast<ZoomLevel>(FindFirstBit(zoom_levels)); ZoomLevel first_needed = static_cast<ZoomLevel>(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); ZoomLevel start = std::min(first_avail, first_needed);
bool needed = false; bool needed = false;

@ -665,7 +665,7 @@ void VideoDriver_CocoaQuartz::AllocateBackingStore(bool)
kCGImageAlphaNoneSkipFirst | kCGBitmapByteOrder32Host kCGImageAlphaNoneSkipFirst | kCGBitmapByteOrder32Host
); );
assert(this->cgcontext != NULL); assert(this->cgcontext != nullptr);
CGContextSetShouldAntialias(this->cgcontext, FALSE); CGContextSetShouldAntialias(this->cgcontext, FALSE);
CGContextSetAllowsAntialiasing(this->cgcontext, FALSE); CGContextSetAllowsAntialiasing(this->cgcontext, FALSE);
CGContextSetInterpolationQuality(this->cgcontext, kCGInterpolationNone); CGContextSetInterpolationQuality(this->cgcontext, kCGInterpolationNone);

@ -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; NSString *s = [ aString isKindOfClass:[ NSAttributedString class ] ] ? [ aString string ] : (NSString *)aString;
const char *insert_point = NULL; const char *insert_point = nullptr;
const char *replace_range = NULL; const char *replace_range = nullptr;
if (replacementRange.location != NSNotFound) { if (replacementRange.location != NSNotFound) {
/* Calculate the part to be replaced. */ /* Calculate the part to be replaced. */
insert_point = Utf8AdvanceByUtf16Units(_focused_window->GetFocusedTextbuf()->GetText(), replacementRange.location); insert_point = Utf8AdvanceByUtf16Units(_focused_window->GetFocusedTextbuf()->GetText(), replacementRange.location);
replace_range = Utf8AdvanceByUtf16Units(insert_point, replacementRange.length); replace_range = Utf8AdvanceByUtf16Units(insert_point, replacementRange.length);
} }
HandleTextInput(NULL, true); HandleTextInput(nullptr, true);
HandleTextInput([ s UTF8String ], false, NULL, insert_point, replace_range); HandleTextInput([ s UTF8String ], false, nullptr, insert_point, replace_range);
} }
/** Insert the given text at the caret. */ /** 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; NSString *s = [ aString isKindOfClass:[ NSAttributedString class ] ] ? [ aString string ] : (NSString *)aString;
const char *utf8 = [ s UTF8String ]; const char *utf8 = [ s UTF8String ];
if (utf8 != NULL) { if (utf8 != nullptr) {
const char *insert_point = NULL; const char *insert_point = nullptr;
const char *replace_range = NULL; const char *replace_range = nullptr;
if (replacementRange.location != NSNotFound) { if (replacementRange.location != NSNotFound) {
/* Calculate the part to be replaced. */ /* Calculate the part to be replaced. */
NSRange marked = [ self markedRange ]; NSRange marked = [ self markedRange ];

@ -277,7 +277,7 @@ static bool DrawIMECompositionString()
static void SetCompositionPos(HWND hwnd) static void SetCompositionPos(HWND hwnd)
{ {
HIMC hIMC = ImmGetContext(hwnd); HIMC hIMC = ImmGetContext(hwnd);
if (hIMC != NULL) { if (hIMC != nullptr) {
COMPOSITIONFORM cf; COMPOSITIONFORM cf;
cf.dwStyle = CFS_POINT; cf.dwStyle = CFS_POINT;
@ -299,7 +299,7 @@ static void SetCompositionPos(HWND hwnd)
static void SetCandidatePos(HWND hwnd) static void SetCandidatePos(HWND hwnd)
{ {
HIMC hIMC = ImmGetContext(hwnd); HIMC hIMC = ImmGetContext(hwnd);
if (hIMC != NULL) { if (hIMC != nullptr) {
CANDIDATEFORM cf; CANDIDATEFORM cf;
cf.dwIndex = 0; cf.dwIndex = 0;
cf.dwStyle = CFS_EXCLUDE; cf.dwStyle = CFS_EXCLUDE;
@ -334,7 +334,7 @@ static LRESULT HandleIMEComposition(HWND hwnd, WPARAM wParam, LPARAM lParam)
{ {
HIMC hIMC = ImmGetContext(hwnd); HIMC hIMC = ImmGetContext(hwnd);
if (hIMC != NULL) { if (hIMC != nullptr) {
if (lParam & GCS_RESULTSTR) { if (lParam & GCS_RESULTSTR) {
/* Read result string from the IME. */ /* Read result string from the IME. */
LONG len = ImmGetCompositionString(hIMC, GCS_RESULTSTR, nullptr, 0); // Length is always in bytes, even in UNICODE build. 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) static void CancelIMEComposition(HWND hwnd)
{ {
HIMC hIMC = ImmGetContext(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); ImmReleaseContext(hwnd, hIMC);
/* Clear any marked string from the current edit box. */ /* Clear any marked string from the current edit box. */
HandleTextInput(nullptr, true); 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. */ /* Resize the window to match the new DPI setting. */
RECT *prcNewWindow = (RECT *)lParam; RECT *prcNewWindow = (RECT *)lParam;
SetWindowPos(hwnd, SetWindowPos(hwnd,
NULL, nullptr,
prcNewWindow->left, prcNewWindow->left,
prcNewWindow->top, prcNewWindow->top,
prcNewWindow->right - prcNewWindow->left, prcNewWindow->right - prcNewWindow->left,

@ -695,7 +695,7 @@ enum WindowClass {
/** /**
* Script debug window; %Window numbers: * Script debug window; %Window numbers:
* - 0 = #ScriptDebugWidgets * - Ascending value = #ScriptDebugWidgets
*/ */
WC_SCRIPT_DEBUG, WC_SCRIPT_DEBUG,

Loading…
Cancel
Save