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/temperate.nfo
${CMAKE_CURRENT_SOURCE_DIR}/rivers/toyland.nfo
${CMAKE_CURRENT_SOURCE_DIR}/rivers/toyland_rapids.nfo
${CMAKE_CURRENT_SOURCE_DIR}/rivers/tropic.nfo
${CMAKE_CURRENT_SOURCE_DIR}/airports_orig_extra.nfo
${CMAKE_CURRENT_SOURCE_DIR}/canals_extra.nfo
@ -24,6 +25,8 @@ if(GRFCODEC_FOUND)
${CMAKE_CURRENT_SOURCE_DIR}/rivers/rapids_shading.png
${CMAKE_CURRENT_SOURCE_DIR}/rivers/temperate.png
${CMAKE_CURRENT_SOURCE_DIR}/rivers/toyland.png
${CMAKE_CURRENT_SOURCE_DIR}/rivers/toyland_rapids.png
${CMAKE_CURRENT_SOURCE_DIR}/rivers/toyland_rapids_shading.png
${CMAKE_CURRENT_SOURCE_DIR}/rivers/tropic_desert.png
${CMAKE_CURRENT_SOURCE_DIR}/rivers/tropic_forest.png
${CMAKE_CURRENT_SOURCE_DIR}/fix_graphics.png

@ -79,6 +79,7 @@
#include "airports_orig_extra.nfo"
#include "canals_extra.nfo"
#include "rivers/rapids.nfo"
#include "rivers/toyland_rapids.nfo"
#include "rivers/temperate.nfo"
#include "rivers/arctic.nfo"
#include "rivers/tropic.nfo"

@ -3,7 +3,7 @@
// OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
// See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see <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 sprites/toyland.png 8bpp 10 10 38 19 -5 0 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"),
#ifdef EXPORT_DEFAULT_SQUIRREL_FUNCTIONS
_DECL_FUNC(srand,2,".n"),
_DECL_FUNC(rand,1,NULL),
_DECL_FUNC(rand,1,nullptr),
#endif /* EXPORT_DEFAULT_SQUIRREL_FUNCTIONS */
_DECL_FUNC(fabs,2,".n"),
_DECL_FUNC(abs,2,".n"),

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

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

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

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

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

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

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

@ -9,6 +9,7 @@
#include "../stdafx.h"
#include "../video/video_driver.hpp"
#include "../palette_func.h"
#include "../zoom_func.h"
#include "32bpp_anim.hpp"
#include "common.hpp"
@ -220,10 +221,6 @@ inline void Blitter_32bppAnim::Draw(const Blitter::BlitterParams *bp, ZoomLevel
break;
case BM_TRANSPARENT:
/* TODO -- We make an assumption here that the remap in fact is transparency, not some colour.
* This is never a problem with the code we produce, but newgrfs can make it fail... or at least:
* we produce a result the newgrf maker didn't expect ;) */
/* Make the current colour a bit more black, so it looks like this image is transparent */
src_n += n;
if (src_px->a == 255) {
@ -245,6 +242,24 @@ inline void Blitter_32bppAnim::Draw(const Blitter::BlitterParams *bp, ZoomLevel
}
break;
case BM_TRANSPARENT_REMAP:
/* Apply custom transparency remap. */
src_n += n;
if (src_px->a != 0) {
src_px += n;
do {
*dst = this->LookupColourInPalette(remap[GetNearestColourIndex(*dst)]);
*anim = 0;
anim++;
dst++;
} while (--n != 0);
} else {
dst += n;
anim += n;
src_px += n;
}
break;
default:
if (fast_path || (src_px->a == 255 && (sprite_flags & BSF_NO_ANIM))) {
do {
@ -343,6 +358,7 @@ void Blitter_32bppAnim::Draw(Blitter::BlitterParams *bp, BlitterMode mode, ZoomL
return;
case BM_TRANSPARENT: Draw<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_BLACK_REMAP: Draw<BM_BLACK_REMAP, false> (bp, zoom); return;
}

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

@ -10,6 +10,7 @@
#include "../stdafx.h"
#include "../zoom_func.h"
#include "../settings_type.h"
#include "../palette_func.h"
#include "32bpp_optimized.hpp"
#include "common.hpp"
@ -189,10 +190,6 @@ inline void Blitter_32bppOptimized::Draw(const Blitter::BlitterParams *bp, ZoomL
break;
case BM_TRANSPARENT:
/* TODO -- We make an assumption here that the remap in fact is transparency, not some colour.
* This is never a problem with the code we produce, but newgrfs can make it fail... or at least:
* we produce a result the newgrf maker didn't expect ;) */
/* Make the current colour a bit more black, so it looks like this image is transparent */
src_n += n;
if (src_px->a == 255) {
@ -210,6 +207,21 @@ inline void Blitter_32bppOptimized::Draw(const Blitter::BlitterParams *bp, ZoomL
}
break;
case BM_TRANSPARENT_REMAP:
/* Apply custom transparency remap. */
src_n += n;
if (src_px->a != 0) {
src_px += n;
do {
*dst = this->LookupColourInPalette(remap[GetNearestColourIndex(*dst)]);
dst++;
} while (--n != 0);
} else {
dst += n;
src_px += n;
}
break;
default:
if (src_px->a == 255) {
/* faster than memcpy(), n is usually low */
@ -260,6 +272,7 @@ void Blitter_32bppOptimized::Draw(Blitter::BlitterParams *bp, BlitterMode mode,
case BM_NORMAL: Draw<BM_NORMAL, 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_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_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;

@ -9,6 +9,7 @@
#include "../stdafx.h"
#include "../zoom_func.h"
#include "../palette_func.h"
#include "32bpp_simple.hpp"
#include "../table/sprites.h"
@ -75,12 +76,17 @@ void Blitter_32bppSimple::Draw(Blitter::BlitterParams *bp, BlitterMode mode, Zoo
break;
case BM_TRANSPARENT:
/* TODO -- We make an assumption here that the remap in fact is transparency, not some colour.
* This is never a problem with the code we produce, but newgrfs can make it fail... or at least:
* we produce a result the newgrf maker didn't expect ;) */
/* Make the current colour a bit more black, so it looks like this image is transparent */
if (src->a != 0) *dst = MakeTransparent(*dst, 192);
if (src->a != 0) {
*dst = MakeTransparent(*dst, 192);
}
break;
case BM_TRANSPARENT_REMAP:
/* Apply custom transparency remap. */
if (src->a != 0) {
*dst = this->LookupColourInPalette(bp->remap[GetNearestColourIndex(*dst)]);
}
break;
case BM_NORMAL_WITH_BRIGHTNESS:

@ -398,6 +398,18 @@ bmcr_alpha_blend_single:
}
break;
case BM_TRANSPARENT_REMAP:
/* Apply custom transparency remap. */
for (uint x = (uint) bp->width; x > 0; x--) {
if (src->a != 0) {
*dst = this->LookupColourInPalette(remap[GetNearestColourIndex(*dst)]);
}
src_mv++;
dst++;
src++;
}
break;
case BM_CRASH_REMAP:
for (uint x = (uint) bp->width; x > 0; x--) {
if (src_mv->m == 0) {
@ -532,6 +544,7 @@ bm_normal:
Draw<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_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_BLACK_REMAP: Draw<BM_BLACK_REMAP, RM_NONE, BT_NONE, true>(bp, zoom); return;

@ -11,6 +11,7 @@
#include "../zoom_func.h"
#include "../settings_type.h"
#include "../video/video_driver.hpp"
#include "../palette_func.h"
#include "40bpp_anim.hpp"
#include "common.hpp"
@ -288,10 +289,6 @@ inline void Blitter_40bppAnim::Draw(const Blitter::BlitterParams *bp, ZoomLevel
break;
case BM_TRANSPARENT:
/* TODO -- We make an assumption here that the remap in fact is transparency, not some colour.
* This is never a problem with the code we produce, but newgrfs can make it fail... or at least:
* we produce a result the newgrf maker didn't expect ;) */
/* Make the current colour a bit more black, so it looks like this image is transparent */
src_n += n;
if (src_px->a == 255) {
@ -317,6 +314,28 @@ inline void Blitter_40bppAnim::Draw(const Blitter::BlitterParams *bp, ZoomLevel
}
break;
case BM_TRANSPARENT_REMAP:
/* Apply custom transparency remap. */
src_n += n;
if (src_px->a != 0) {
src_px += n;
do {
if (*anim != 0) {
*anim = remap[*anim];
} else {
*dst = this->LookupColourInPalette(remap[GetNearestColourIndex(*dst)]);
*anim = 0;
}
anim++;
dst++;
} while (--n != 0);
} else {
dst += n;
anim += n;
src_px += n;
}
break;
default:
if (src_px->a == 255) {
do {
@ -389,6 +408,7 @@ void Blitter_40bppAnim::Draw(Blitter::BlitterParams *bp, BlitterMode mode, ZoomL
case BM_NORMAL: Draw<BM_NORMAL> (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_REMAP: Draw<BM_TRANSPARENT_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_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;
break;
case BM_TRANSPARENT: {
const uint8 *remap = bp->remap;
case BM_TRANSPARENT:
case BM_TRANSPARENT_REMAP: {
const uint8_t *remap = bp->remap;
src += pixels;
do {
*dst = remap[*dst];

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

@ -20,7 +20,8 @@
enum BlitterMode {
BM_NORMAL, ///< Perform the simple blitting.
BM_COLOUR_REMAP, ///< Perform a colour remapping.
BM_TRANSPARENT, ///< Perform transparency colour remapping.
BM_TRANSPARENT, ///< Perform transparency darkening remapping.
BM_TRANSPARENT_REMAP, ///< Perform transparency colour remapping.
BM_CRASH_REMAP, ///< Perform a crash remapping.
BM_BLACK_REMAP, ///< Perform remapping to a completely blackened sprite
BM_NORMAL_WITH_BRIGHTNESS, ///< Perform a simple blitting with brightness adjustment

@ -823,7 +823,7 @@ public:
this->square = GetSpriteSize(SPR_SQUARE);
this->line_height = std::max(this->square.height, (uint)GetCharacterHeight(FS_NORMAL)) + padding.height;
size->height = 11 * this->line_height;
size->height = 5 * this->line_height;
resize->width = 1;
resize->height = this->line_height;
break;
@ -966,6 +966,12 @@ public:
SetDParam(0, g->index);
draw_livery(STR_GROUP_NAME, livery_set ? g->livery : c->livery[LS_DEFAULT], this->sel == g->index, livery_set, this->indents[i] * WidgetDimensions::scaled.hsep_indent);
}
if (this->vscroll->GetCount() == 0) {
const StringID empty_labels[] = { STR_LIVERY_TRAIN_GROUP_EMPTY, STR_LIVERY_ROAD_VEHICLE_GROUP_EMPTY, STR_LIVERY_SHIP_GROUP_EMPTY, STR_LIVERY_AIRCRAFT_GROUP_EMPTY };
VehicleType vtype = (VehicleType)(this->livery_class - LC_GROUP_RAIL);
DrawString(ir.left, ir.right, y + text_offs, empty_labels[vtype], TC_BLACK);
}
}
}
@ -1116,7 +1122,7 @@ public:
}
};
static const NWidgetPart _nested_select_company_livery_widgets [] = {
static const NWidgetPart _nested_select_company_livery_widgets[] = {
NWidget(NWID_HORIZONTAL),
NWidget(WWT_CLOSEBOX, COLOUR_GREY),
NWidget(WWT_CAPTION, COLOUR_GREY, WID_SCL_CAPTION), SetDataTip(STR_LIVERY_CAPTION, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS),
@ -1127,24 +1133,21 @@ static const NWidgetPart _nested_select_company_livery_widgets [] = {
NWidget(WWT_IMGBTN, COLOUR_GREY, WID_SCL_CLASS_ROAD), SetMinimalSize(22, 22), SetFill(0, 1), SetDataTip(SPR_IMG_TRUCKLIST, STR_LIVERY_ROAD_VEHICLE_TOOLTIP),
NWidget(WWT_IMGBTN, COLOUR_GREY, WID_SCL_CLASS_SHIP), SetMinimalSize(22, 22), SetFill(0, 1), SetDataTip(SPR_IMG_SHIPLIST, STR_LIVERY_SHIP_TOOLTIP),
NWidget(WWT_IMGBTN, COLOUR_GREY, WID_SCL_CLASS_AIRCRAFT), SetMinimalSize(22, 22), SetFill(0, 1), SetDataTip(SPR_IMG_AIRPLANESLIST, STR_LIVERY_AIRCRAFT_TOOLTIP),
NWidget(WWT_IMGBTN, COLOUR_GREY, WID_SCL_GROUPS_RAIL), SetMinimalSize(22, 22), SetFill(0, 1), SetDataTip(SPR_GROUP_LIVERY_TRAIN, STR_LIVERY_TRAIN_TOOLTIP),
NWidget(WWT_IMGBTN, COLOUR_GREY, WID_SCL_GROUPS_ROAD), SetMinimalSize(22, 22), SetFill(0, 1), SetDataTip(SPR_GROUP_LIVERY_ROADVEH, STR_LIVERY_ROAD_VEHICLE_TOOLTIP),
NWidget(WWT_IMGBTN, COLOUR_GREY, WID_SCL_GROUPS_SHIP), SetMinimalSize(22, 22), SetFill(0, 1), SetDataTip(SPR_GROUP_LIVERY_SHIP, STR_LIVERY_SHIP_TOOLTIP),
NWidget(WWT_IMGBTN, COLOUR_GREY, WID_SCL_GROUPS_AIRCRAFT), SetMinimalSize(22, 22), SetFill(0, 1), SetDataTip(SPR_GROUP_LIVERY_AIRCRAFT, STR_LIVERY_AIRCRAFT_TOOLTIP),
NWidget(WWT_PANEL, COLOUR_GREY), SetMinimalSize(90, 22), SetFill(1, 1), EndContainer(),
NWidget(WWT_IMGBTN, COLOUR_GREY, WID_SCL_GROUPS_RAIL), SetMinimalSize(22, 22), SetFill(0, 1), SetDataTip(SPR_GROUP_LIVERY_TRAIN, STR_LIVERY_TRAIN_GROUP_TOOLTIP),
NWidget(WWT_IMGBTN, COLOUR_GREY, WID_SCL_GROUPS_ROAD), SetMinimalSize(22, 22), SetFill(0, 1), SetDataTip(SPR_GROUP_LIVERY_ROADVEH, STR_LIVERY_ROAD_VEHICLE_GROUP_TOOLTIP),
NWidget(WWT_IMGBTN, COLOUR_GREY, WID_SCL_GROUPS_SHIP), SetMinimalSize(22, 22), SetFill(0, 1), SetDataTip(SPR_GROUP_LIVERY_SHIP, STR_LIVERY_SHIP_GROUP_TOOLTIP),
NWidget(WWT_IMGBTN, COLOUR_GREY, WID_SCL_GROUPS_AIRCRAFT), SetMinimalSize(22, 22), SetFill(0, 1), SetDataTip(SPR_GROUP_LIVERY_AIRCRAFT, STR_LIVERY_AIRCRAFT_GROUP_TOOLTIP),
NWidget(WWT_PANEL, COLOUR_GREY), SetFill(1, 1), SetResize(1, 0), EndContainer(),
EndContainer(),
NWidget(NWID_HORIZONTAL),
NWidget(WWT_PANEL, COLOUR_GREY, WID_SCL_SPACER_DROPDOWN), SetMinimalSize(150, 12), SetFill(1, 1), EndContainer(),
NWidget(WWT_DROPDOWN, COLOUR_GREY, WID_SCL_PRI_COL_DROPDOWN), SetMinimalSize(125, 12), SetFill(0, 1), SetDataTip(STR_JUST_STRING, STR_LIVERY_PRIMARY_TOOLTIP),
NWidget(WWT_DROPDOWN, COLOUR_GREY, WID_SCL_SEC_COL_DROPDOWN), SetMinimalSize(125, 12), SetFill(0, 1),
SetDataTip(STR_JUST_STRING, STR_LIVERY_SECONDARY_TOOLTIP),
NWidget(WWT_MATRIX, COLOUR_GREY, WID_SCL_MATRIX), SetMinimalSize(275, 0), SetResize(1, 0), SetFill(1, 1), SetMatrixDataTip(1, 0, STR_LIVERY_PANEL_TOOLTIP), SetScrollbar(WID_SCL_MATRIX_SCROLLBAR),
NWidget(NWID_VSCROLLBAR, COLOUR_GREY, WID_SCL_MATRIX_SCROLLBAR),
EndContainer(),
NWidget(NWID_HORIZONTAL),
NWidget(WWT_MATRIX, COLOUR_GREY, WID_SCL_MATRIX), SetMinimalSize(275, 0), SetResize(1, 0), SetFill(1, 1), SetMatrixDataTip(1, 0, STR_LIVERY_PANEL_TOOLTIP), SetScrollbar(WID_SCL_MATRIX_SCROLLBAR),
NWidget(NWID_VERTICAL),
NWidget(NWID_VSCROLLBAR, COLOUR_GREY, WID_SCL_MATRIX_SCROLLBAR),
NWidget(WWT_RESIZEBOX, COLOUR_GREY),
EndContainer(),
NWidget(WWT_PANEL, COLOUR_GREY, WID_SCL_SPACER_DROPDOWN), SetFill(1, 1), SetResize(1, 0), EndContainer(),
NWidget(WWT_DROPDOWN, COLOUR_GREY, WID_SCL_PRI_COL_DROPDOWN), SetFill(0, 1), SetDataTip(STR_JUST_STRING, STR_LIVERY_PRIMARY_TOOLTIP),
NWidget(WWT_DROPDOWN, COLOUR_GREY, WID_SCL_SEC_COL_DROPDOWN), SetFill(0, 1), SetDataTip(STR_JUST_STRING, STR_LIVERY_SECONDARY_TOOLTIP),
NWidget(WWT_RESIZEBOX, COLOUR_GREY),
EndContainer(),
};

@ -29,7 +29,6 @@
#include "core/container_func.hpp"
#include "viewport_func.h"
#include "table/palettes.h"
#include "table/string_colours.h"
#include "table/sprites.h"
#include "table/control_codes.h"
@ -62,33 +61,11 @@ SwitchMode _switch_mode; ///< The next mainloop command.
std::chrono::steady_clock::time_point _switch_mode_time; ///< The time when the switch mode was requested.
PauseMode _pause_mode;
uint32 _pause_countdown;
Palette _cur_palette;
std::mutex _cur_palette_mutex;
std::string _switch_baseset;
static bool _adjust_gui_zoom_startup_done = false;
static byte _stringwidth_table[FS_END][224]; ///< Cache containing width of often used characters. @see GetCharacterWidth()
DrawPixelInfo *_cur_dpi;
byte _colour_gradient[COLOUR_END][8];
byte _colour_value[COLOUR_END] = {
133, // COLOUR_DARK_BLUE
99, // COLOUR_PALE_GREEN,
48, // COLOUR_PINK,
68, // COLOUR_YELLOW,
184, // COLOUR_RED,
152, // COLOUR_LIGHT_BLUE,
209, // COLOUR_GREEN,
95, // COLOUR_DARK_GREEN,
150, // COLOUR_BLUE,
79, // COLOUR_CREAM,
134, // COLOUR_MAUVE,
174, // COLOUR_PURPLE,
195, // COLOUR_ORANGE,
116, // COLOUR_BROWN,
6, // COLOUR_GREY,
15, // COLOUR_WHITE,
};
struct GfxBlitterCtx {
const DrawPixelInfo *dpi;
@ -1040,8 +1017,9 @@ void DrawSpriteViewport(const SpritePointerHolder &sprite_store, const DrawPixel
GfxBlitterCtx ctx(dpi);
SpriteID real_sprite = GB(img, 0, SPRITE_WIDTH);
if (HasBit(img, PALETTE_MODIFIER_TRANSPARENT)) {
ctx.colour_remap_ptr = sprite_store.GetRecolourSprite(GB(pal, 0, PALETTE_WIDTH)) + 1;
GfxMainBlitterViewport(ctx, sprite_store.GetSprite(real_sprite, SpriteType::Normal), x, y, BM_TRANSPARENT, sub, real_sprite);
pal = GB(pal, 0, PALETTE_WIDTH);
ctx.colour_remap_ptr = sprite_store.GetRecolourSprite(pal) + 1;
GfxMainBlitterViewport(ctx, sprite_store.GetSprite(real_sprite, SpriteType::Normal), x, y, pal == PALETTE_TO_TRANSPARENT ? BM_TRANSPARENT : BM_TRANSPARENT_REMAP, sub, real_sprite);
} else if (pal != PAL_NONE) {
if (HasBit(pal, PALETTE_TEXT_RECOLOUR)) {
ctx.SetColourRemap((TextColour)GB(pal, 0, PALETTE_WIDTH));
@ -1087,8 +1065,9 @@ void DrawSprite(SpriteID img, PaletteID pal, int x, int y, const SubSprite *sub,
GfxBlitterCtx ctx(_cur_dpi);
SpriteID real_sprite = GB(img, 0, SPRITE_WIDTH);
if (HasBit(img, PALETTE_MODIFIER_TRANSPARENT)) {
ctx.colour_remap_ptr = GetNonSprite(GB(pal, 0, PALETTE_WIDTH), SpriteType::Recolour) + 1;
GfxMainBlitter(ctx, GetSprite(real_sprite, SpriteType::Normal, ZoomMask(zoom)), x, y, BM_TRANSPARENT, sub, real_sprite, zoom);
pal = GB(pal, 0, PALETTE_WIDTH);
ctx.colour_remap_ptr = GetNonSprite(pal, SpriteType::Recolour) + 1;
GfxMainBlitter(ctx, GetSprite(real_sprite, SpriteType::Normal, ZoomMask(zoom)), x, y, pal == PALETTE_TO_TRANSPARENT ? BM_TRANSPARENT : BM_TRANSPARENT_REMAP, sub, real_sprite, zoom);
} else if (pal != PAL_NONE) {
if (HasBit(pal, PALETTE_TEXT_RECOLOUR)) {
ctx.SetColourRemap((TextColour)GB(pal, 0, PALETTE_WIDTH));
@ -1312,151 +1291,6 @@ static void GfxMainBlitter(const GfxBlitterCtx &ctx, const Sprite *sprite, int x
GfxBlitter<1, true>(ctx, sprite, x, y, mode, sub, sprite_id, zoom);
}
void DoPaletteAnimations();
Colour _water_palette[10];
void GfxInitPalettes()
{
MemCpyT<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
* @param monospace Whether to load the monospace cache or the normal fonts.

@ -40,6 +40,7 @@
#define GFX_FUNC_H
#include "gfx_type.h"
#include "palette_func.h"
#include "strings_type.h"
#include "string_type.h"
#include <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 MarkWholeScreenDirty();
void GfxInitPalettes();
void CheckBlitter();
bool FillDrawPixelInfo(DrawPixelInfo *n, int left, int top, int width, int height);
@ -228,43 +228,4 @@ inline int GetCharacterHeight(FontSize size)
return font_height_cache[size];
}
TextColour GetContrastColour(uint8 background, uint8 threshold = 128);
/**
* All 16 colour gradients
* 8 colours per gradient from darkest (0) to lightest (7)
*/
extern byte _colour_gradient[COLOUR_END][8];
extern byte _colour_value[COLOUR_END];
/**
* Return the colour for a particular greyscale level.
* @param level Intensity, 0 = black, 15 = white
* @return colour
*/
#define GREY_SCALE(level) (level)
static const uint8 PC_BLACK = GREY_SCALE(1); ///< Black palette colour.
static const uint8 PC_DARK_GREY = GREY_SCALE(6); ///< Dark grey palette colour.
static const uint8 PC_GREY = GREY_SCALE(10); ///< Grey palette colour.
static const uint8 PC_WHITE = GREY_SCALE(15); ///< White palette colour.
static const uint8 PC_VERY_DARK_RED = 0xB2; ///< Almost-black red palette colour.
static const uint8 PC_DARK_RED = 0xB4; ///< Dark red palette colour.
static const uint8 PC_RED = 0xB8; ///< Red palette colour.
static const uint8 PC_VERY_DARK_BROWN = 0x56; ///< Almost-black brown palette colour.
static const uint8 PC_ORANGE = 0xC2; ///< Orange palette colour.
static const uint8 PC_YELLOW = 0xBF; ///< Yellow palette colour.
static const uint8 PC_LIGHT_YELLOW = 0x44; ///< Light yellow palette colour.
static const uint8 PC_VERY_LIGHT_YELLOW = 0x45; ///< Almost-white yellow palette colour.
static const uint8 PC_GREEN = 0xD0; ///< Green palette colour.
static const uint8 PC_VERY_DARK_BLUE = 0x9A; ///< Almost-black blue palette colour.
static const uint8 PC_DARK_BLUE = 0x9D; ///< Dark blue palette colour.
static const uint8 PC_LIGHT_BLUE = 0x98; ///< Light blue palette colour.
#endif /* GFX_FUNC_H */

@ -256,6 +256,7 @@ STR_UNITS_HEIGHT_METRIC :{DECIMAL} m
STR_UNITS_HEIGHT_SI :{DECIMAL} m
STR_UNITS_DAYS :{COMMA}{NBSP}dag{P "" s}
STR_UNITS_SECONDS :{COMMA}{NBSP}sekund{P "" er}
# Common window strings
STR_LIST_FILTER_TITLE :{BLACK}Filtrer udtryk:
@ -1489,7 +1490,7 @@ STR_CONFIG_SETTING_LAND_GENERATOR_ORIGINAL :Original
STR_CONFIG_SETTING_LAND_GENERATOR_TERRA_GENESIS :TerraGenesis
STR_CONFIG_SETTING_TERRAIN_TYPE :Terræn type: {STRING}
STR_CONFIG_SETTING_TERRAIN_TYPE_HELPTEXT :(Kun TerraGenesis) Størrelse af højderygge
STR_CONFIG_SETTING_TERRAIN_TYPE_HELPTEXT :Vælg højden på bakker og bjerge i landskabet
STR_CONFIG_SETTING_INDUSTRY_DENSITY :Industri tæthed: {STRING}
STR_CONFIG_SETTING_INDUSTRY_DENSITY_HELPTEXT :Angiv hvor mange industrier skal genereres og hvilket niveau der bevares i løbet af spillet
@ -1498,18 +1499,18 @@ STR_CONFIG_SETTING_OIL_REF_EDGE_DISTANCE :Maksimal afstan
STR_CONFIG_SETTING_OIL_REF_EDGE_DISTANCE_HELPTEXT :Grænse for hvor langt fra kortets kant olieraffinaderier kan blive bygget. På ø-kort sikrer dette at de er nær kysten. På kort større end 256 felter bliver denne værdi automatisk skaleret op.
STR_CONFIG_SETTING_SNOWLINE_HEIGHT :Snelinjehøjden: {STRING}
STR_CONFIG_SETTING_SNOWLINE_HEIGHT_HELPTEXT :Styrer ved hvilken højde sneen starter i det sub-arktiske landskab. Sne påvirker også industri-generering og byers krav for at vokse.Kan kun ændres i Scenarieeditoren, og beregnes ellers via "snedække".
STR_CONFIG_SETTING_SNOWLINE_HEIGHT_HELPTEXT :Vælg, i hvilken højde sneen starter i det subarktiske landskab. Sne påvirker også industriproduktion og byvækstkrav. Kan kun ændres via Scenario Editor eller på anden måde beregnes via "snedækning"
STR_CONFIG_SETTING_SNOW_COVERAGE :Snedække: {STRING}
STR_CONFIG_SETTING_SNOW_COVERAGE_HELPTEXT :Styrer den omtrentlige mængde sne i det sub-arktiske landskab. Sne påvirker også industri-generering og byernes krav for at vokse. Anvendes kun under landskabsgenerering. Land lige over havniveau er altid snefrit.
STR_CONFIG_SETTING_SNOW_COVERAGE_HELPTEXT :Vælg den omtrentlige mængde sne på det subarktiske landskab. Sne påvirker også industriproduktion og byvækstkrav. Bruges kun under kortgenerering. Havniveau og kystfliser har aldrig sne.
STR_CONFIG_SETTING_SNOW_COVERAGE_VALUE :{NUM}%
STR_CONFIG_SETTING_DESERT_COVERAGE :Ørkendækning: {STRING}
STR_CONFIG_SETTING_DESERT_COVERAGE_HELPTEXT :Styrer den omtrentlige mængde ørken i det tropiske landskab. Ørken påvirker også industri-generering. Anvendes kun under landskabsgenerering.
STR_CONFIG_SETTING_DESERT_COVERAGE_HELPTEXT :Vælg den omtrentlige mængde ørken i det tropiske landskab. Ørken påvirker også industriproduktion og byvækstkrav. Bruges kun under kortgenerering
STR_CONFIG_SETTING_DESERT_COVERAGE_VALUE :{NUM}%
STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN :Tærrenets hårdhed (kun TerraGenesis) : {STRING}
STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_HELPTEXT :(TerraGenesis kun) Vælg frekvensen af bakkerne: Glatte landskaber har færre, mere udbredt bakker. Ujævne landskaber har mange bakker, der kan se gentaget ud
STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_HELPTEXT :Vælg formen og antallet af bakker. Glatte landskaber har færre, bredere bakker, mens barske landskaber har flere mindre bakker.
###length 4
STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_VERY_SMOOTH :Meget blødt
STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_SMOOTH :Blødt
@ -1517,7 +1518,7 @@ STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_ROUGH :Råt
STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_VERY_ROUGH :Meget råt
STR_CONFIG_SETTING_VARIETY :Forskelligheds fordeling: {STRING}
STR_CONFIG_SETTING_VARIETY_HELPTEXT :(TerraGenesis kun) Kontrollere, om kortet indeholder både bjerg- og flade områder. Da dette kun gør kortet fladere bør andre indstillinger sættes til bjergrigt
STR_CONFIG_SETTING_VARIETY_HELPTEXT :Vælg om kortet indeholder både bjerge og flade områder. Jo højere sorten er, jo flere højdeforskelle mellem bjergrige og flade områder.
STR_CONFIG_SETTING_RIVER_AMOUNT :Floder antal: {STRING}
STR_CONFIG_SETTING_RIVER_AMOUNT_HELPTEXT :Vælg, hvor mange floder at skabe
@ -1658,6 +1659,7 @@ STR_CONFIG_SETTING_ADVANCED_VEHICLE_LISTS_HELPTEXT :Aktiver brug af
STR_CONFIG_SETTING_LOADING_INDICATORS :Benyt laste-indikatorer: {STRING}
STR_CONFIG_SETTING_LOADING_INDICATORS_HELPTEXT :Vælg om lastnings-indikatorer vises ved pålæsning og aflæsning af køretøjer
STR_CONFIG_SETTING_TIMETABLE_MODE :Tidsenheder for køreplaner: {STRING}
STR_CONFIG_SETTING_TIMETABLE_MODE_HELPTEXT :Vælg de tidsenheder, der skal bruges til køreplaner
###length 3
STR_CONFIG_SETTING_TIMETABLE_MODE_DAYS :Dage
@ -3211,7 +3213,9 @@ STR_MAPGEN_TOWN_NAME_DROPDOWN_TOOLTIP :{BLACK}Vælg st
STR_MAPGEN_DATE :{BLACK}Dato:
STR_MAPGEN_DATE_TOOLTIP :{BLACK}Vælg startdato
STR_MAPGEN_NUMBER_OF_INDUSTRIES :{BLACK}Antal industrier:
STR_MAPGEN_NUMBER_OF_INDUSTRIES_TOOLTIP :{BLACK}Vælg tætheden af industrier eller et brugerdefineret tal
STR_MAPGEN_HEIGHTMAP_HEIGHT :{BLACK}Højeste bjergtop:
STR_MAPGEN_HEIGHTMAP_HEIGHT_TOOLTIP :{BLACK}Vælg den højeste top, som spillet vil forsøge at skabe, målt i højde over havets overflade
STR_MAPGEN_HEIGHTMAP_HEIGHT_UP :{BLACK}Forøger den maksimale højde på højeste bjergtop på kortet med én
STR_MAPGEN_HEIGHTMAP_HEIGHT_DOWN :{BLACK}Sænker den maksimale højde på højeste bjergtop på kortet med én
STR_MAPGEN_SNOW_COVERAGE :{BLACK}Snedække:
@ -3224,6 +3228,7 @@ STR_MAPGEN_DESERT_COVERAGE_DOWN :{BLACK}Sænker
STR_MAPGEN_DESERT_COVERAGE_TEXT :{BLACK}{NUM}%
STR_MAPGEN_TERRAIN_TYPE :{BLACK}Terræntype:
STR_MAPGEN_SEA_LEVEL :{BLACK}Havniveau
STR_MAPGEN_SEA_LEVEL_TOOLTIP :{BLACK}Vælg havniveau
STR_MAPGEN_QUANTITY_OF_RIVERS :{BLACK}Floder:
STR_MAPGEN_SMOOTHNESS :{BLACK}Blødhed:
STR_MAPGEN_VARIETY :{BLACK}Varietet af distributionen:
@ -3261,6 +3266,7 @@ STR_MAPGEN_TOWN_NAME_CATALAN :Catalanske
# Strings for map borders at game generation
STR_MAPGEN_BORDER_TYPE :{BLACK}Kortkanter:
STR_MAPGEN_BORDER_TYPE_TOOLTIP :Vælg ydre grænser for spilverdenen
STR_MAPGEN_NORTHWEST :{BLACK}Nordvest
STR_MAPGEN_NORTHEAST :{BLACK}Nordøst
STR_MAPGEN_SOUTHEAST :{BLACK}Sydøst
@ -3273,7 +3279,9 @@ STR_MAPGEN_BORDER_MANUAL :{BLACK}Manuel
STR_MAPGEN_HEIGHTMAP_ROTATION :{BLACK}Højdekortets rotation:
STR_MAPGEN_HEIGHTMAP_NAME :{BLACK}Højdekortets navn:
STR_MAPGEN_HEIGHTMAP_NAME_TOOLTIP :{BLACK}Navnet på højdekort-billedfilen
STR_MAPGEN_HEIGHTMAP_SIZE_LABEL :{BLACK}Størrelse:
STR_MAPGEN_HEIGHTMAP_SIZE_LABEL_TOOLTIP :{BLACK}Størrelsen på kildehøjdekortbilledet. For de bedste resultater skal hver kant matche en tilgængelig kortkantlængde i OpenTTD, såsom 256, 512, 1024 osv.
STR_MAPGEN_HEIGHTMAP_SIZE :{ORANGE}{NUM} x {NUM}
STR_MAPGEN_TERRAIN_TYPE_QUERY_CAPT :{WHITE}Ønsket højeste bjergtop
@ -3288,6 +3296,7 @@ STR_SE_MAPGEN_FLAT_WORLD :{WHITE}Fladt la
STR_SE_MAPGEN_FLAT_WORLD_TOOLTIP :{BLACK}Generer fladt landskab
STR_SE_MAPGEN_RANDOM_LAND :{WHITE}Tilfældigt land
STR_SE_MAPGEN_FLAT_WORLD_HEIGHT :{BLACK}Højde af fladt landskab:
STR_SE_MAPGEN_FLAT_WORLD_HEIGHT_TOOLTIP :{BLACK}Vælg højden af landet over havets overflade
STR_SE_MAPGEN_FLAT_WORLD_HEIGHT_DOWN :{BLACK}Sæt højden af fladt landskab en ned
STR_SE_MAPGEN_FLAT_WORLD_HEIGHT_UP :{BLACK}Sæt højden af fladt landskab en op
@ -4614,6 +4623,7 @@ STR_TIMETABLE_EXPECTED_TOOLTIP :{BLACK}Skift me
STR_TIMETABLE_ARRIVAL_DATE :A: {COLOUR}{DATE_TINY}
STR_TIMETABLE_DEPARTURE_DATE :D: {COLOUR}{DATE_TINY}
STR_TIMETABLE_ARRIVAL_SECONDS_IN_FUTURE :A: {COLOUR}{COMMA} sek
STR_TIMETABLE_DEPARTURE_SECONDS_IN_FUTURE :D: {COLOUR}{COMMA} sek
# Date window (for timetable)

@ -1491,7 +1491,7 @@ STR_CONFIG_SETTING_LAND_GENERATOR_ORIGINAL :Origineel
STR_CONFIG_SETTING_LAND_GENERATOR_TERRA_GENESIS :TerraGenesis
STR_CONFIG_SETTING_TERRAIN_TYPE :Terreintype: {STRING}
STR_CONFIG_SETTING_TERRAIN_TYPE_HELPTEXT :(Alleen TerraGenesis) Heuvelachtigheid van het landschap
STR_CONFIG_SETTING_TERRAIN_TYPE_HELPTEXT :Kies de hoogte van heuvels en bergen in het landschap
STR_CONFIG_SETTING_INDUSTRY_DENSITY :Industriedichtheid: {STRING}
STR_CONFIG_SETTING_INDUSTRY_DENSITY_HELPTEXT :Stelt in hoeveel industrieën worden gegenereerd en welk niveau tijdens het spel moet worden gehandhaafd
@ -1500,18 +1500,18 @@ STR_CONFIG_SETTING_OIL_REF_EDGE_DISTANCE :Maximumafstand
STR_CONFIG_SETTING_OIL_REF_EDGE_DISTANCE_HELPTEXT :Olieraffinaderijen worden alleen gebouwd nabij de kaartgrens, dat is aan de kust van eilandkaarten
STR_CONFIG_SETTING_SNOWLINE_HEIGHT :Sneeuwhoogte: {STRING}
STR_CONFIG_SETTING_SNOWLINE_HEIGHT_HELPTEXT :Stelt in op welke hoogte de sneeuw begint in subarctisch landschap. Sneeuw heeft ook invloed op het ontstaan van industrieën en op de vereisten voor stadsgroei. Kan alleen worden aangepast in de scenariobewerker of wordt berekend met behulp van 'sneeuwoppervlak'
STR_CONFIG_SETTING_SNOWLINE_HEIGHT_HELPTEXT :Kies op welke hoogte de sneeuw begint in subarctisch landschap. Sneeuw heeft ook invloed op het ontstaan van industrieën en op de vereisten voor stadsgroei. Kan alleen worden aangepast in de scenariobewerker of wordt berekend met behulp van 'sneeuwoppervlak'
STR_CONFIG_SETTING_SNOW_COVERAGE :Sneeuwoppervlak: {STRING}
STR_CONFIG_SETTING_SNOW_COVERAGE_HELPTEXT :Bepaalt de hoeveelheid sneeuw in het subarctische landschap. Sneeuw is ook van invloed op de industrieën en de groei van steden. Wordt alleen gebruikt tijdens het maken van de kaart. Land net boven zeeniveau krijgt nooit sneeuw
STR_CONFIG_SETTING_SNOW_COVERAGE_HELPTEXT :Kies de hoeveelheid sneeuw in het subarctische landschap. Sneeuw is ook van invloed op de industrieën en de groei van steden. Wordt alleen gebruikt tijdens het maken van de kaart. Land op zeeniveau of aan de kust krijgt nooit sneeuw.
STR_CONFIG_SETTING_SNOW_COVERAGE_VALUE :{NUM}%
STR_CONFIG_SETTING_DESERT_COVERAGE :Woestijnoppervlak: {STRING}
STR_CONFIG_SETTING_DESERT_COVERAGE_HELPTEXT :Bepaalt de hoeveelheid woestijn in het tropische landschap. Woestijn is ook van invloed op industrieën. Wordt alleen gebruikt tijdens het maken van de kaart
STR_CONFIG_SETTING_DESERT_COVERAGE_HELPTEXT :Kies de hoeveelheid woestijn in het tropische landschap. Woestijn is ook van invloed op het ontstaan van industrieën en de vereisten voor stadsgroei. Wordt alleen gebruikt tijdens het maken van de kaart
STR_CONFIG_SETTING_DESERT_COVERAGE_VALUE :{NUM}%
STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN :Ruwheid van het terrein: {STRING}
STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_HELPTEXT :(Alleen TerraGenesis) Selecteer de frequentie van heuvels: gladde landschappen hebben minder, meer wijdverspreide heuvels. Ruwe landschappen hebben veel heuvels, die repetitief kunnen lijken.
STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_HELPTEXT :Kies vorm en aantal heuvels. Gladde landschappen hebben minder en bredere heuvels. Ruwe landschappen hebben meer, maar kleinere heuvels.
###length 4
STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_VERY_SMOOTH :Erg glad
STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_SMOOTH :Glad
@ -1519,7 +1519,7 @@ STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_ROUGH :Ruig
STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_VERY_ROUGH :Erg ruig
STR_CONFIG_SETTING_VARIETY :Variëteit distributie: {STRING}
STR_CONFIG_SETTING_VARIETY_HELPTEXT :(Alleen TerraGenesis) Bepaalt of de kaart zowel bergachtige als vlakke gebieden bevat. Aangezien dit de kaart alleen platter maakt, moeten andere instellingen worden ingesteld op bergachtig.
STR_CONFIG_SETTING_VARIETY_HELPTEXT :Kies of de kaart zowel bergachtige als vlakke gebieden bevat. Hoe groter de variatie, hoe meer verschillen in hoogte tussen bergachtige en vlakke gebieden.
STR_CONFIG_SETTING_RIVER_AMOUNT :Hoeveelheid rivieren: {STRING}
STR_CONFIG_SETTING_RIVER_AMOUNT_HELPTEXT :Selecteer hoeveel rivieren er gegenereerd worden
@ -1539,6 +1539,7 @@ STR_CONFIG_SETTING_ROAD_SIDE_LEFT :Links rijden
STR_CONFIG_SETTING_ROAD_SIDE_RIGHT :Rechts rijden
STR_CONFIG_SETTING_HEIGHTMAP_ROTATION :Draaiing van hoogtekaart: {STRING}
STR_CONFIG_SETTING_HEIGHTMAP_ROTATION_TOOLTIP :Kies in welke richting de hoogtekaart wordt gedraaid om deze aan te passen aan de spelwereld
###length 2
STR_CONFIG_SETTING_HEIGHTMAP_ROTATION_COUNTER_CLOCKWISE :Tegen de klok in
STR_CONFIG_SETTING_HEIGHTMAP_ROTATION_CLOCKWISE :Met de klok mee
@ -3208,11 +3209,15 @@ STR_MAPGEN_MAPSIZE :{BLACK}Kaartgro
STR_MAPGEN_MAPSIZE_TOOLTIP :{BLACK}Selecteer het formaat van de kaart in tegels. Het aantal beschikbare tegels zal iets kleiner zijn
STR_MAPGEN_BY :{BLACK}*
STR_MAPGEN_NUMBER_OF_TOWNS :{BLACK}Aantal steden:
STR_MAPGEN_NUMBER_OF_TOWNS_TOOLTIP :{BLACK}Kies de dichtheid van steden of een aangepast getal
STR_MAPGEN_TOWN_NAME_LABEL :{BLACK}Plaatsnamen:
STR_MAPGEN_TOWN_NAME_DROPDOWN_TOOLTIP :{BLACK}Stijl voor plaatsnamen kiezen
STR_MAPGEN_DATE :{BLACK}Datum:
STR_MAPGEN_DATE_TOOLTIP :{BLACK}Kies de startdatum
STR_MAPGEN_NUMBER_OF_INDUSTRIES :{BLACK}Aantal industrieën:
STR_MAPGEN_NUMBER_OF_INDUSTRIES_TOOLTIP :{BLACK}Kies de dichtheid van industrieën of een aangepast getal
STR_MAPGEN_HEIGHTMAP_HEIGHT :{BLACK}Hoogste berg:
STR_MAPGEN_HEIGHTMAP_HEIGHT_TOOLTIP :{BLACK}Kies de hoogste piek die het spel probeert te creëren, gemeten in hoogte boven zeeniveau
STR_MAPGEN_HEIGHTMAP_HEIGHT_UP :{BLACK}Verhoogt de maximale hoogte van de hoogste berg op de kaart met één
STR_MAPGEN_HEIGHTMAP_HEIGHT_DOWN :{BLACK}Verlaagt de maximale hoogte van de hoogste berg op de kaart met één
STR_MAPGEN_SNOW_COVERAGE :{BLACK}Sneeuwoppervlak:
@ -3225,10 +3230,12 @@ STR_MAPGEN_DESERT_COVERAGE_DOWN :{BLACK}Verklein
STR_MAPGEN_DESERT_COVERAGE_TEXT :{BLACK}{NUM}%
STR_MAPGEN_TERRAIN_TYPE :{BLACK}Terreintype:
STR_MAPGEN_SEA_LEVEL :{BLACK}Zeeniveau:
STR_MAPGEN_SEA_LEVEL_TOOLTIP :{BLACK}Kies het zeeniveau
STR_MAPGEN_QUANTITY_OF_RIVERS :{BLACK}Rivieren:
STR_MAPGEN_SMOOTHNESS :{BLACK}Gladheid:
STR_MAPGEN_VARIETY :{BLACK}Landschapsvariatie:
STR_MAPGEN_GENERATE :{WHITE}Maken
STR_MAPGEN_GENERATE_TOOLTIP :{BLACK}Creëer de wereld en speel OpenTTD!
STR_MAPGEN_NEWGRF_SETTINGS :{BLACK}NewGRF-instellingen
STR_MAPGEN_NEWGRF_SETTINGS_TOOLTIP :{BLACK}NewGRF-instellingen weergeven
STR_MAPGEN_AI_SETTINGS :{BLACK}AI-instellingen
@ -3261,6 +3268,7 @@ STR_MAPGEN_TOWN_NAME_CATALAN :Catalaans
# Strings for map borders at game generation
STR_MAPGEN_BORDER_TYPE :{BLACK}Kaartranden:
STR_MAPGEN_BORDER_TYPE_TOOLTIP :{BLACK}Kies de grenzen van de spelwereld
STR_MAPGEN_NORTHWEST :{BLACK}Noordwest
STR_MAPGEN_NORTHEAST :{BLACK}Noordoost
STR_MAPGEN_SOUTHEAST :{BLACK}Zuidoost
@ -3273,7 +3281,9 @@ STR_MAPGEN_BORDER_MANUAL :{BLACK}Handmati
STR_MAPGEN_HEIGHTMAP_ROTATION :{BLACK}Rotatie van hoogtekaart:
STR_MAPGEN_HEIGHTMAP_NAME :{BLACK}Naam van hoogtekaart:
STR_MAPGEN_HEIGHTMAP_NAME_TOOLTIP :{BLACK}De naam van het hoogtekaart-bestand
STR_MAPGEN_HEIGHTMAP_SIZE_LABEL :{BLACK}Grootte:
STR_MAPGEN_HEIGHTMAP_SIZE_LABEL_TOOLTIP :{BLACK}De grootte van de bron-hoogtekaart. Voor optimaal resultaat kies je de lengten van de zijden gelijk aan de beschikbare kaartmaten in OpenTTD, zoals 256, 512, 1024 enz.
STR_MAPGEN_HEIGHTMAP_SIZE :{ORANGE}{NUM} x {NUM}
STR_MAPGEN_TERRAIN_TYPE_QUERY_CAPT :{WHITE}Gewenste hoogte van bergen
@ -3288,6 +3298,7 @@ STR_SE_MAPGEN_FLAT_WORLD :{WHITE}Vlak lan
STR_SE_MAPGEN_FLAT_WORLD_TOOLTIP :{BLACK}Genereer een vlakke kaart
STR_SE_MAPGEN_RANDOM_LAND :{WHITE}Willekeurig land
STR_SE_MAPGEN_FLAT_WORLD_HEIGHT :{BLACK}Hoogte van vlak land:
STR_SE_MAPGEN_FLAT_WORLD_HEIGHT_TOOLTIP :{BLACK}Kies de hoogte van het land boven zee
STR_SE_MAPGEN_FLAT_WORLD_HEIGHT_DOWN :{BLACK}Verlaag de hoogte van vlak land met één
STR_SE_MAPGEN_FLAT_WORLD_HEIGHT_UP :{BLACK}Verhoog de hoogte van vlak land met één

@ -2196,12 +2196,20 @@ STR_LIVERY_TRAIN_TOOLTIP :{BLACK}Show tra
STR_LIVERY_ROAD_VEHICLE_TOOLTIP :{BLACK}Show road vehicle colour schemes
STR_LIVERY_SHIP_TOOLTIP :{BLACK}Show ship colour schemes
STR_LIVERY_AIRCRAFT_TOOLTIP :{BLACK}Show aircraft colour schemes
STR_LIVERY_TRAIN_GROUP_TOOLTIP :{BLACK}Show colours of train groups
STR_LIVERY_ROAD_VEHICLE_GROUP_TOOLTIP :{BLACK}Show colours of road vehicle groups
STR_LIVERY_SHIP_GROUP_TOOLTIP :{BLACK}Show colours of ship groups
STR_LIVERY_AIRCRAFT_GROUP_TOOLTIP :{BLACK}Show colours of aircraft groups
STR_LIVERY_PRIMARY_TOOLTIP :{BLACK}Choose the primary colour for the selected scheme. Ctrl+Click will set this colour for every scheme
STR_LIVERY_SECONDARY_TOOLTIP :{BLACK}Choose the secondary colour for the selected scheme. Ctrl+Click will set this colour for every scheme
STR_LIVERY_PANEL_TOOLTIP :{BLACK}Select a colour scheme to change, or multiple schemes with Ctrl+Click. Click on the box to toggle use of the scheme
STR_LIVERY_TRAIN_GROUP_EMPTY :No train groups are set up
STR_LIVERY_ROAD_VEHICLE_GROUP_EMPTY :No road vehicle groups are set up
STR_LIVERY_SHIP_GROUP_EMPTY :No ship groups are set up
STR_LIVERY_AIRCRAFT_GROUP_EMPTY :No aircraft groups are set up
###length 23
STR_LIVERY_DEFAULT :Standard Livery
STR_LIVERY_DEFAULT :Default Livery
STR_LIVERY_STEAM :Steam Engine
STR_LIVERY_DIESEL :Diesel Engine
STR_LIVERY_ELECTRIC :Electric Engine

@ -4467,9 +4467,9 @@ STR_ORDER_CONDITIONAL_COMPARATOR_TOOLTIP :{BLACK}How to c
STR_ORDER_CONDITIONAL_COMPARATOR_EQUALS :is equal to
STR_ORDER_CONDITIONAL_COMPARATOR_NOT_EQUALS :is not equal to
STR_ORDER_CONDITIONAL_COMPARATOR_LESS_THAN :is less than
STR_ORDER_CONDITIONAL_COMPARATOR_LESS_EQUALS :is less or equal to
STR_ORDER_CONDITIONAL_COMPARATOR_LESS_EQUALS :is less than or equal to
STR_ORDER_CONDITIONAL_COMPARATOR_MORE_THAN :is more than
STR_ORDER_CONDITIONAL_COMPARATOR_MORE_EQUALS :is more or equal to
STR_ORDER_CONDITIONAL_COMPARATOR_MORE_EQUALS :is more than or equal to
STR_ORDER_CONDITIONAL_COMPARATOR_IS_TRUE :is true
STR_ORDER_CONDITIONAL_COMPARATOR_IS_FALSE :is false

@ -255,6 +255,9 @@ STR_UNITS_HEIGHT_IMPERIAL :{DECIMAL}{NBSP}
STR_UNITS_HEIGHT_METRIC :{DECIMAL}{NBSP}m
STR_UNITS_HEIGHT_SI :{DECIMAL}{NBSP}m
STR_UNITS_DAYS :{COMMA}{NBSP}vrk
STR_UNITS_SECONDS :{COMMA}{NBSP}sekunti{P "" a}
STR_UNITS_TICKS :{COMMA}{NBSP}räpäys{P "" tä}
# Common window strings
STR_LIST_FILTER_TITLE :{BLACK}Suodatin:
@ -719,6 +722,7 @@ STR_PLAYLIST_TOOLTIP_CLICK_TO_ADD_TRACK :{BLACK}Valitse
STR_PLAYLIST_TOOLTIP_CLICK_TO_REMOVE_TRACK :{BLACK}Poista musiikkiraita nykyiseltä soittolistalta napsauttamalla (vain oma{NBSP}1 tai oma{NBSP}2)
# Highscore window
STR_HIGHSCORE_TOP_COMPANIES :{BIG_FONT}{BLACK}Huippuyhtiöt
STR_HIGHSCORE_POSITION :{BIG_FONT}{BLACK}{COMMA}.
STR_HIGHSCORE_PERFORMANCE_TITLE_BUSINESSMAN :Kaupantekijä
STR_HIGHSCORE_PERFORMANCE_TITLE_ENTREPRENEUR :Yrittäjä
@ -1487,7 +1491,7 @@ STR_CONFIG_SETTING_LAND_GENERATOR_ORIGINAL :Alkuperäinen
STR_CONFIG_SETTING_LAND_GENERATOR_TERRA_GENESIS :TerraGenesis
STR_CONFIG_SETTING_TERRAIN_TYPE :Maaston tyyppi: {STRING}
STR_CONFIG_SETTING_TERRAIN_TYPE_HELPTEXT :(Vain TerraGenesis) Maaston mäkisyys
STR_CONFIG_SETTING_TERRAIN_TYPE_HELPTEXT :Valitse maiseman mäkien ja vuorten korkeus
STR_CONFIG_SETTING_INDUSTRY_DENSITY :Teollisuuden määrä: {STRING}
STR_CONFIG_SETTING_INDUSTRY_DENSITY_HELPTEXT :Määritä, kuinka paljon teollisuutta tulisi luoda ja millä tasolla teollisuuden tulisi pysytellä pelin aikana
@ -1496,18 +1500,18 @@ STR_CONFIG_SETTING_OIL_REF_EDGE_DISTANCE :Suurin sallittu
STR_CONFIG_SETTING_OIL_REF_EDGE_DISTANCE_HELPTEXT :Öljynjalostamojen ja öljynporauslauttojen suurin etäisyys kartan reunasta. Saarikartoilla tämä takaa sen, että ne ovat lähellä rannikkoa. Yli 256 ruudun kartoilla tämä arvo suhteutetaan kartan kokoon.
STR_CONFIG_SETTING_SNOWLINE_HEIGHT :Lumirajan korkeus: {STRING}
STR_CONFIG_SETTING_SNOWLINE_HEIGHT_HELPTEXT :Määritä, millä korkeudella lumiraja on pohjoisessa maastotyypissä. Lumi vaikuttaa teollisuuslaitosten luontiin sekä kuntien kasvuedellytyksiin. Voidaan muuttaa vain Skenaariomuokkaimessa, muuten lasketaan ”lumen peiton” perusteella
STR_CONFIG_SETTING_SNOWLINE_HEIGHT_HELPTEXT :Säätää lumirajan korkeutta pohjoisessa maastossa. Lumi vaikuttaa myös teollisuuslaitosten luontiin ja kuntien kasvuedellytyksiin. Voidaan muuttaa vain skenaariomuokkaimessa, lasketaan muutoin ”lumen peiton” perusteella
STR_CONFIG_SETTING_SNOW_COVERAGE :Lumen peitto: {STRING}
STR_CONFIG_SETTING_SNOW_COVERAGE_HELPTEXT :Säätele lumen määrän suuruusluokkaa pohjoisessa maastossa. Lumi vaikuttaa myös teollisuuden luontiin ja kuntien kasvuedellytyksiin. Käytetään vain karttaa luodessa. Juuri merenpinnan yläpuolella oleva maa on aina lumetonta
STR_CONFIG_SETTING_SNOW_COVERAGE_HELPTEXT :Säätää lumen määrän suuruusluokkaa pohjoisessa maastossa. Lumi vaikuttaa myös teollisuuslaitosten luontiin ja kuntien kasvuedellytyksiin. Käytetään vain karttaa luotaessa. Merenpinnan tasolla sijaitsevat ruudut ja rannikkoruudut ovat aina lumettomat.
STR_CONFIG_SETTING_SNOW_COVERAGE_VALUE :{NUM}{NBSP}%
STR_CONFIG_SETTING_DESERT_COVERAGE :Aavikon peitto: {STRING}
STR_CONFIG_SETTING_DESERT_COVERAGE_HELPTEXT :Säätele aavikon määrän suuruusluokkaa subtrooppisessa maastossa. Aavikko vaikuttaa myös teollisuuden luontiin. Käytetään vain karttaa luodessa
STR_CONFIG_SETTING_DESERT_COVERAGE_HELPTEXT :Säätele aavikon määrän suuruusluokkaa subtrooppisessa maastossa. Aavikko vaikuttaa myös teollisuuslaitosten luontiin ja kuntien kasvuedellytyksiin. Käytetään vain karttaa luotaessa.
STR_CONFIG_SETTING_DESERT_COVERAGE_VALUE :{NUM}{NBSP}%
STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN :Maaston epätasaisuus: {STRING}
STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_HELPTEXT :(Vain TerraGenesis) Määritä mäkien tiheys: Tasaisessa maastossa mäet ovat laajempia ja niitä on vähemmän. Epätasaisessa maastossa on enemmän mäkiä, mikä voi saada maaston näyttämään itseään toistavalta
STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_HELPTEXT :Määritä mäkien muoto ja tiheys. Tasaisessa maastossa mäkiä on vähemmän ja ne ovat laajempia, kun taas epätasaisessa maastossa on useampia pienempiä mäkiä.
###length 4
STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_VERY_SMOOTH :Erittäin tasainen
STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_SMOOTH :Tasainen
@ -1515,7 +1519,7 @@ STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_ROUGH :Epätasainen
STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_VERY_ROUGH :Erittäin epätasainen
STR_CONFIG_SETTING_VARIETY :Maaston vaihtelu: {STRING}
STR_CONFIG_SETTING_VARIETY_HELPTEXT :(Vain TerraGenesis) Valitse, onko kartalla sekä vuoristoisia että tasaisia alueita. Koska tämä asetus tekee maastosta tasaisempaa, muut asetukset tulisi määrittää vuoristoisiksi
STR_CONFIG_SETTING_VARIETY_HELPTEXT :Valitse, onko kartalla sekä vuoristoisia että tasaisia alueita. Mitä suurempi on vaihtelu, sitä suurempia ovat korkeuserot vuoristoisten ja tasaisten alueiden välillä.
STR_CONFIG_SETTING_RIVER_AMOUNT :Jokien määrä: {STRING}
STR_CONFIG_SETTING_RIVER_AMOUNT_HELPTEXT :Valitse, kuinka paljon jokia luodaan
@ -1535,6 +1539,7 @@ STR_CONFIG_SETTING_ROAD_SIDE_LEFT :Vasemmanpuoline
STR_CONFIG_SETTING_ROAD_SIDE_RIGHT :Oikeanpuolinen liikenne
STR_CONFIG_SETTING_HEIGHTMAP_ROTATION :Korkeuskartan pyöritys:{STRING}
STR_CONFIG_SETTING_HEIGHTMAP_ROTATION_TOOLTIP :Valitse, mihin suuntaan korkeuskartan kuvaa kierretään pelimaailmaan sopiakseen
###length 2
STR_CONFIG_SETTING_HEIGHTMAP_ROTATION_COUNTER_CLOCKWISE :Vastapäivään
STR_CONFIG_SETTING_HEIGHTMAP_ROTATION_CLOCKWISE :Myötäpäivään
@ -1655,7 +1660,12 @@ STR_CONFIG_SETTING_ADVANCED_VEHICLE_LISTS_HELPTEXT :Salli kehittyne
STR_CONFIG_SETTING_LOADING_INDICATORS :Lastausilmaisimet: {STRING}
STR_CONFIG_SETTING_LOADING_INDICATORS_HELPTEXT :Määritä näytetäänkö lastausilmaisimet kulkuneuvojen yläpuolella lastatessa ja purettaessa rahtia
STR_CONFIG_SETTING_TIMETABLE_MODE :Aikataulujen aikayksikkö: {STRING}
STR_CONFIG_SETTING_TIMETABLE_MODE_HELPTEXT :Valitse kulkuneuvojen aikatauluissa käytettävä aikayksikkö
###length 3
STR_CONFIG_SETTING_TIMETABLE_MODE_DAYS :Vuorokaudet
STR_CONFIG_SETTING_TIMETABLE_MODE_SECONDS :Sekunnit
STR_CONFIG_SETTING_TIMETABLE_MODE_TICKS :Räpäykset
STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE :Näytä saapuminen ja lähtö aikatauluissa: {STRING}
STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE_HELPTEXT :Näytä odotetut saapumis- ja lähtemisajat aikatauluissa
@ -2344,7 +2354,7 @@ STR_NETWORK_START_SERVER_NEW_GAME_NAME_TOOLTIP :{BLACK}Nimi nä
STR_NETWORK_START_SERVER_SET_PASSWORD :{BLACK}Aseta salasana
STR_NETWORK_START_SERVER_PASSWORD_TOOLTIP :{BLACK}Jos peliin ei halua ulkopuolisia, voi sen suojata salasanalla
STR_NETWORK_START_SERVER_VISIBILITY_LABEL :{BLACK}Näkyvyys
STR_NETWORK_START_SERVER_VISIBILITY_LABEL :{BLACK}Näkyvyys:
STR_NETWORK_START_SERVER_VISIBILITY_TOOLTIP :{BLACK}Näkyykö palvelimesi muille julkisessa listauksessa
STR_NETWORK_START_SERVER_CLIENTS_SELECT :{BLACK}{NUM} asiakas{P "" ta}
STR_NETWORK_START_SERVER_NUMBER_OF_CLIENTS :{BLACK}Pelaajien enimmäismäärä:
@ -3199,11 +3209,15 @@ STR_MAPGEN_MAPSIZE :{BLACK}Kartan k
STR_MAPGEN_MAPSIZE_TOOLTIP :{BLACK}Valitse kartan koko ruutuina. Saatavilla olevien ruutujen määrä on hieman alhaisempi
STR_MAPGEN_BY :{BLACK}×
STR_MAPGEN_NUMBER_OF_TOWNS :{BLACK}Kuntien määrä:
STR_MAPGEN_NUMBER_OF_TOWNS_TOOLTIP :{BLACK}Valitse kuntien tiheys tai valinnainen määrä
STR_MAPGEN_TOWN_NAME_LABEL :{BLACK}Kuntien nimet:
STR_MAPGEN_TOWN_NAME_DROPDOWN_TOOLTIP :{BLACK}Valitse kuntien nimien tyyli
STR_MAPGEN_DATE :{BLACK}Päivämäärä:
STR_MAPGEN_DATE_TOOLTIP :{BLACK}Valitse aloituspäivä
STR_MAPGEN_NUMBER_OF_INDUSTRIES :{BLACK}Teollisuuden määrä:
STR_MAPGEN_NUMBER_OF_INDUSTRIES_TOOLTIP :{BLACK}Valitse teollisuuden tiheys tai valinnainen määrä
STR_MAPGEN_HEIGHTMAP_HEIGHT :{BLACK}Korkein huippu:
STR_MAPGEN_HEIGHTMAP_HEIGHT_TOOLTIP :{BLACK}Valitse korkein huippu, jonka peli pyrkii luomaan, mitattuna korkeutena merenpinnasta
STR_MAPGEN_HEIGHTMAP_HEIGHT_UP :{BLACK}Korota kartan korkeimman huipun maksimikorkeutta yhdellä
STR_MAPGEN_HEIGHTMAP_HEIGHT_DOWN :{BLACK}Madalla kartan korkeimman huipun maksimikorkeutta yhdellä
STR_MAPGEN_SNOW_COVERAGE :{BLACK}Lumen peitto:
@ -3216,10 +3230,12 @@ STR_MAPGEN_DESERT_COVERAGE_DOWN :{BLACK}Vähenn
STR_MAPGEN_DESERT_COVERAGE_TEXT :{BLACK}{NUM}{NBSP}%
STR_MAPGEN_TERRAIN_TYPE :{BLACK}Maaston tyyppi:
STR_MAPGEN_SEA_LEVEL :{BLACK}Merenpinta:
STR_MAPGEN_SEA_LEVEL_TOOLTIP :{BLACK}Valitse merenpinnan taso
STR_MAPGEN_QUANTITY_OF_RIVERS :{BLACK}Joet:
STR_MAPGEN_SMOOTHNESS :{BLACK}Tasaisuus:
STR_MAPGEN_VARIETY :{BLACK}Vaihtelu:
STR_MAPGEN_GENERATE :{WHITE}Generoi
STR_MAPGEN_GENERATE_TOOLTIP :{BLACK}Luo maailma ja pelaa OpenTTD:tä!
STR_MAPGEN_NEWGRF_SETTINGS :{BLACK}NewGRF-asetukset
STR_MAPGEN_NEWGRF_SETTINGS_TOOLTIP :{BLACK}Näytä NewGRF-asetukset
STR_MAPGEN_AI_SETTINGS :{BLACK}Tekoälyasetukset
@ -3252,6 +3268,7 @@ STR_MAPGEN_TOWN_NAME_CATALAN :Katalonialainen
# Strings for map borders at game generation
STR_MAPGEN_BORDER_TYPE :{BLACK}Kartan reunat:
STR_MAPGEN_BORDER_TYPE_TOOLTIP :{BLACK}Valitse pelimaailman reunukset
STR_MAPGEN_NORTHWEST :{BLACK}Luode
STR_MAPGEN_NORTHEAST :{BLACK}Koillinen
STR_MAPGEN_SOUTHEAST :{BLACK}Kaakko
@ -3264,7 +3281,9 @@ STR_MAPGEN_BORDER_MANUAL :{BLACK}Manuaali
STR_MAPGEN_HEIGHTMAP_ROTATION :{BLACK}Korkeuskartan kierto:
STR_MAPGEN_HEIGHTMAP_NAME :{BLACK}Korkeuskartan nimi:
STR_MAPGEN_HEIGHTMAP_NAME_TOOLTIP :{BLACK}Korkeuskartan kuvatiedoston nimi
STR_MAPGEN_HEIGHTMAP_SIZE_LABEL :{BLACK}Koko:
STR_MAPGEN_HEIGHTMAP_SIZE_LABEL_TOOLTIP :{BLACK}Korkeuskartan lähdekuvan koko. Paras tulos tulee, kun kuvan mitat vastaavat OpenTTD:n karttojen reunamittoja, kuten 256, 512, 1024, jne.
STR_MAPGEN_HEIGHTMAP_SIZE :{ORANGE}{NUM}×{NUM}
STR_MAPGEN_TERRAIN_TYPE_QUERY_CAPT :{WHITE}Huipun tavoitekorkeus
@ -3279,6 +3298,7 @@ STR_SE_MAPGEN_FLAT_WORLD :{WHITE}Tasainen
STR_SE_MAPGEN_FLAT_WORLD_TOOLTIP :{BLACK}Luo tasainen maa
STR_SE_MAPGEN_RANDOM_LAND :{WHITE}Satunnainen maa
STR_SE_MAPGEN_FLAT_WORLD_HEIGHT :{BLACK}Tasaisen maan korkeus:
STR_SE_MAPGEN_FLAT_WORLD_HEIGHT_TOOLTIP :{BLACK}Valitse merenpinnan yläpuolisen maan korkeus
STR_SE_MAPGEN_FLAT_WORLD_HEIGHT_DOWN :{BLACK}Siirrä tasaista maata yksi alaspäin
STR_SE_MAPGEN_FLAT_WORLD_HEIGHT_UP :{BLACK}Siirrä tasaista maata yksi ylöspäin
@ -4572,8 +4592,13 @@ STR_TIMETABLE_STATUS_ON_TIME :{BLACK}Kulkuneu
STR_TIMETABLE_STATUS_LATE :{BLACK}Kulkuneuvo on {STRING} myöhässä
STR_TIMETABLE_STATUS_EARLY :{BLACK}Kulkuneuvo on {STRING} etuajassa
STR_TIMETABLE_STATUS_NOT_STARTED :{BLACK}Tämä aikataulu ei ole vielä alkanut
STR_TIMETABLE_STATUS_START_AT_DATE :{BLACK}Tämä aikataulu alkaa {STRING}
STR_TIMETABLE_STATUS_START_IN_SECONDS :{BLACK}Tämä aikataulu alkaa {COMMA} sekunnin päästä
STR_TIMETABLE_START :{BLACK}Käynnistä aikataulu
STR_TIMETABLE_START_TOOLTIP :{BLACK}Valitse tämän aikataulun alkamisajankohta. Ctrl+napsautus jakaa tasaisesti kaikkien tätä käskyä jakavien kulkuneuvojen lähtöajat niiden keskinäisen järjestyksen mukaan, mikäli käsky on kokonaan aikataulutettu
STR_TIMETABLE_START_SECONDS_QUERY :Sekunteja aikataulun alkamiseen
STR_TIMETABLE_CHANGE_TIME :{BLACK}Muuta aikaa
STR_TIMETABLE_WAIT_TIME_TOOLTIP :{BLACK}Muuta aikaa, jonka valitun käskyn tulisi kestää. Ctrl+napsautus asettaa keston kaikille käskyille
@ -4597,6 +4622,10 @@ STR_TIMETABLE_EXPECTED :{BLACK}Odotettu
STR_TIMETABLE_SCHEDULED :{BLACK}Aikataulu
STR_TIMETABLE_EXPECTED_TOOLTIP :{BLACK}Vaihda odotetun ja aikataulun välillä
STR_TIMETABLE_ARRIVAL_DATE :T: {COLOUR}{DATE_TINY}
STR_TIMETABLE_DEPARTURE_DATE :L: {COLOUR}{DATE_TINY}
STR_TIMETABLE_ARRIVAL_SECONDS_IN_FUTURE :T: {COLOUR}{COMMA} s
STR_TIMETABLE_DEPARTURE_SECONDS_IN_FUTURE :L: {COLOUR}{COMMA} s
# Date window (for timetable)

@ -719,6 +719,7 @@ STR_PLAYLIST_TOOLTIP_CLICK_TO_ADD_TRACK :{BLACK}Click pe
STR_PLAYLIST_TOOLTIP_CLICK_TO_REMOVE_TRACK :{BLACK}Apasă pe melodie pentru a o elimina din programul actual (doar Custom1 sau Custom2)
# Highscore window
STR_HIGHSCORE_TOP_COMPANIES :{BIG_FONT}{BLACK}Companii de top
STR_HIGHSCORE_POSITION :{BIG_FONT}{BLACK}{COMMA}.
STR_HIGHSCORE_PERFORMANCE_TITLE_BUSINESSMAN :Om de afaceri
STR_HIGHSCORE_PERFORMANCE_TITLE_ENTREPRENEUR :Întreprinzător
@ -1533,6 +1534,7 @@ STR_CONFIG_SETTING_ROAD_SIDE_LEFT :Pe partea stân
STR_CONFIG_SETTING_ROAD_SIDE_RIGHT :Pe partea dreaptă
STR_CONFIG_SETTING_HEIGHTMAP_ROTATION :Rotaţie hartă înălţimi: {STRING}
STR_CONFIG_SETTING_HEIGHTMAP_ROTATION_TOOLTIP :Alegeți modul în care imaginea hărții de înălțime este rotită pentru a se potrivi în lumea jocului
###length 2
STR_CONFIG_SETTING_HEIGHTMAP_ROTATION_COUNTER_CLOCKWISE :Spre stânga
STR_CONFIG_SETTING_HEIGHTMAP_ROTATION_CLOCKWISE :Spre dreapta
@ -1653,7 +1655,11 @@ STR_CONFIG_SETTING_ADVANCED_VEHICLE_LISTS_HELPTEXT :Activează folo
STR_CONFIG_SETTING_LOADING_INDICATORS :Foloseşte indicatorii de încărcare: {STRING}
STR_CONFIG_SETTING_LOADING_INDICATORS_HELPTEXT :Alege dacă indicatori de încărcare sunt afișați deasupra unor vehicule care sunt în proces de încărcare sau descărcare
STR_CONFIG_SETTING_TIMETABLE_MODE :Unități de timp pentru orare: {STRING}
STR_CONFIG_SETTING_TIMETABLE_MODE_HELPTEXT :Selectați unitățile de timp utilizate pentru orarele vehiculelor
###length 3
STR_CONFIG_SETTING_TIMETABLE_MODE_DAYS :Zile
STR_CONFIG_SETTING_TIMETABLE_MODE_SECONDS :Secunde
STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE :Afișează plecările și sosirile din orare: {STRING}
STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE_HELPTEXT :Arată timpii estimați de plecare și sosire din orar
@ -3197,11 +3203,15 @@ STR_MAPGEN_MAPSIZE :{BLACK}Mărime
STR_MAPGEN_MAPSIZE_TOOLTIP :{BLACK}Alege mărimea hărții folosind ca unitate de măsură suprafețele. Numărul de suprafețe disponibile va fi puțin mai mic decât această valoare
STR_MAPGEN_BY :{BLACK}*
STR_MAPGEN_NUMBER_OF_TOWNS :{BLACK}Nr. de oraşe:
STR_MAPGEN_NUMBER_OF_TOWNS_TOOLTIP :{BLACK}Selectați densitatea orașelor sau un număr personalizat
STR_MAPGEN_TOWN_NAME_LABEL :{BLACK}Numele orașelor:
STR_MAPGEN_TOWN_NAME_DROPDOWN_TOOLTIP :{BLACK}Alege naţionalitatea numelor oraşelor
STR_MAPGEN_DATE :{BLACK}Data:
STR_MAPGEN_DATE_TOOLTIP :{BLACK}Selectați data de începere
STR_MAPGEN_NUMBER_OF_INDUSTRIES :{BLACK}Nr. de industrii:
STR_MAPGEN_NUMBER_OF_INDUSTRIES_TOOLTIP :{BLACK}Selectați densitatea industriilor sau un număr personalizat
STR_MAPGEN_HEIGHTMAP_HEIGHT :{BLACK}Cel mai înalt vârf:
STR_MAPGEN_HEIGHTMAP_HEIGHT_TOOLTIP :{BLACK}Alegeți cel mai înalt vârf pe care jocul va încerca să îl creeze, măsurat în altitudine deasupra nivelului mării
STR_MAPGEN_HEIGHTMAP_HEIGHT_UP :{BLACK}Crește cu o unitate înălțimea maximă a celui mai înalt vârf al hărții
STR_MAPGEN_HEIGHTMAP_HEIGHT_DOWN :{BLACK}Redu cu o unitate înălțimea maximă a celui mai înalt vârf al hărții
STR_MAPGEN_SNOW_COVERAGE :{BLACK}Acoperire cu zăpadă:
@ -3214,10 +3224,12 @@ STR_MAPGEN_DESERT_COVERAGE_DOWN :{BLACK}Reduce
STR_MAPGEN_DESERT_COVERAGE_TEXT :{BLACK}{NUM}%
STR_MAPGEN_TERRAIN_TYPE :{BLACK}Tip teren:
STR_MAPGEN_SEA_LEVEL :{BLACK}Nivelul mării:
STR_MAPGEN_SEA_LEVEL_TOOLTIP :{BLACK}Selectați nivelul mării
STR_MAPGEN_QUANTITY_OF_RIVERS :{BLACK}Râuri:
STR_MAPGEN_SMOOTHNESS :{BLACK}Netezime:
STR_MAPGEN_VARIETY :{BLACK}Distribuţia varietăţii:
STR_MAPGEN_GENERATE :{WHITE}Generează
STR_MAPGEN_GENERATE_TOOLTIP :{BLACK}Creează lumea și joacă OpenTTD!
STR_MAPGEN_NEWGRF_SETTINGS :{BLACK}Setări NewGRF
STR_MAPGEN_NEWGRF_SETTINGS_TOOLTIP :{BLACK}Afişează setările NewGRF
STR_MAPGEN_AI_SETTINGS :{BLACK}Configurație AI
@ -3250,6 +3262,7 @@ STR_MAPGEN_TOWN_NAME_CATALAN :Catalană
# Strings for map borders at game generation
STR_MAPGEN_BORDER_TYPE :{BLACK}Margine:
STR_MAPGEN_BORDER_TYPE_TOOLTIP :{BLACK}Alegeți granițele lumii jocului
STR_MAPGEN_NORTHWEST :{BLACK}Nord-vest
STR_MAPGEN_NORTHEAST :{BLACK}Nord-est
STR_MAPGEN_SOUTHEAST :{BLACK}Sud-est
@ -3262,7 +3275,9 @@ STR_MAPGEN_BORDER_MANUAL :{BLACK}Manual
STR_MAPGEN_HEIGHTMAP_ROTATION :{BLACK}Rotaţie hartă înălţimi:
STR_MAPGEN_HEIGHTMAP_NAME :{BLACK}Nume hartă înălţimi:
STR_MAPGEN_HEIGHTMAP_NAME_TOOLTIP :{BLACK}Numele fișierului al hărții de înălțime
STR_MAPGEN_HEIGHTMAP_SIZE_LABEL :{BLACK}Dimensiune:
STR_MAPGEN_HEIGHTMAP_SIZE_LABEL_TOOLTIP :{BLACK}Dimensiunea imaginii hărții de înălțime. Pentru cele mai bune rezultate, fiecare margine ar trebui să se potrivească cu o lungime disponibilă a marginii hărții în OpenTTD, cum ar fi 256, 512, 1024 etc.
STR_MAPGEN_HEIGHTMAP_SIZE :{ORANGE}{NUM} x {NUM}
STR_MAPGEN_TERRAIN_TYPE_QUERY_CAPT :{WHITE}Înălțimea maximă dorită
@ -3277,6 +3292,7 @@ STR_SE_MAPGEN_FLAT_WORLD :{WHITE}Teren pl
STR_SE_MAPGEN_FLAT_WORLD_TOOLTIP :{BLACK}Generează un teren plat
STR_SE_MAPGEN_RANDOM_LAND :{WHITE}Teren aleator
STR_SE_MAPGEN_FLAT_WORLD_HEIGHT :{BLACK}Înălţimea terenului plat:
STR_SE_MAPGEN_FLAT_WORLD_HEIGHT_TOOLTIP :{BLACK}Alegeți înălțimea terenului deasupra nivelului mării
STR_SE_MAPGEN_FLAT_WORLD_HEIGHT_DOWN :{BLACK}Mută înălţimea terenului plat cu o unitate în jos
STR_SE_MAPGEN_FLAT_WORLD_HEIGHT_UP :{BLACK}Mută înălţimea terenului plat cu o unitate în sus
@ -4570,8 +4586,13 @@ STR_TIMETABLE_STATUS_ON_TIME :{BLACK}Acest ve
STR_TIMETABLE_STATUS_LATE :{BLACK}Vehiculul are întârziere de {STRING}
STR_TIMETABLE_STATUS_EARLY :{BLACK}Momentan, acest vehicul și-a devansat programul {STRING}
STR_TIMETABLE_STATUS_NOT_STARTED :{BLACK}Acest orar nu a început încă
STR_TIMETABLE_STATUS_START_AT_DATE :{BLACK}Acest orar va începe la {STRING}
STR_TIMETABLE_STATUS_START_IN_SECONDS :{BLACK}Acest orar va începe în {COMMA} secunde
STR_TIMETABLE_START :{BLACK}Începe orarul
STR_TIMETABLE_START_TOOLTIP :{BLACK}Selectați când începe acest orar. Ctrl+Click distribuie uniform pornirea tuturor vehiculelor care partajează această comandă pe baza ordinii lor relative, dacă comanda este complet programată
STR_TIMETABLE_START_SECONDS_QUERY :Secunde până la începerea orarului
STR_TIMETABLE_CHANGE_TIME :{BLACK}Modifică timpul
STR_TIMETABLE_WAIT_TIME_TOOLTIP :{BLACK}Modificați timpul pe care ar trebui să o dureze comanda evidențiată. Ctrl+Click setează ora pentru toate comenzile
@ -4595,6 +4616,10 @@ STR_TIMETABLE_EXPECTED :{BLACK}Estimat
STR_TIMETABLE_SCHEDULED :{BLACK}Planificat
STR_TIMETABLE_EXPECTED_TOOLTIP :{BLACK}Comută între estimare şi orar
STR_TIMETABLE_ARRIVAL_DATE :S: {COLOUR}{DATE_TINY}
STR_TIMETABLE_DEPARTURE_DATE :P: {COLOUR}{DATE_TINY}
STR_TIMETABLE_ARRIVAL_SECONDS_IN_FUTURE :S: {COLOUR}{COMMA} sec
STR_TIMETABLE_DEPARTURE_SECONDS_IN_FUTURE :P: {COLOUR}{COMMA} sec
# Date window (for timetable)
@ -4698,8 +4723,11 @@ STR_TEXTFILE_NAVFORWARD_TOOLTIP :{BLACK}Reveniț
STR_TEXTFILE_WRAP_TEXT :{WHITE}Încadrează textul
STR_TEXTFILE_WRAP_TEXT_TOOLTIP :{BLACK}Încadrează textul ferestrei ca să fie vizibil integral, fără derulare
STR_TEXTFILE_VIEW_README :{BLACK}Vezi fișierul readme
STR_TEXTFILE_VIEW_README_TOOLTIP :Vizualizați "citiți-mă / readme" pentru acest conținut
STR_TEXTFILE_VIEW_CHANGELOG :{BLACK}Listă modificări
STR_TEXTFILE_VIEW_CHANGELOG_TOOLTIP :Vizualizați jurnalul de modificări pentru acest conținut
STR_TEXTFILE_VIEW_LICENCE :{BLACK}Licenţă
STR_TEXTFILE_VIEW_LICENCE_TOOLTIP :Vedeți licența pentru acest conținut
###length 5
STR_TEXTFILE_README_CAPTION :{WHITE}{STRING}, fișier readme al {STRING}
STR_TEXTFILE_CHANGELOG_CAPTION :{WHITE}{STRING}, lista de modificări a {STRING}

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

@ -255,6 +255,9 @@ STR_UNITS_HEIGHT_IMPERIAL :{DECIMAL}{NBSP}
STR_UNITS_HEIGHT_METRIC :{DECIMAL}{NBSP}米
STR_UNITS_HEIGHT_SI :{DECIMAL}{NBSP}米
STR_UNITS_DAYS :{COMMA}{NBSP} 日
STR_UNITS_SECONDS :{COMMA}{NBSP} 秒
STR_UNITS_TICKS :{COMMA}{NBSP} 刻
# Common window strings
STR_LIST_FILTER_TITLE :{BLACK}关键字词:
@ -719,6 +722,7 @@ STR_PLAYLIST_TOOLTIP_CLICK_TO_ADD_TRACK :{BLACK}点击
STR_PLAYLIST_TOOLTIP_CLICK_TO_REMOVE_TRACK :{BLACK}点击音乐曲目以从当前播放列表中删除{}(仅限自定义1或自定义2)
# Highscore window
STR_HIGHSCORE_TOP_COMPANIES :{BIG_FONT}{BLACK}顶级公司
STR_HIGHSCORE_POSITION :{BIG_FONT}{BLACK}{COMMA}.
STR_HIGHSCORE_PERFORMANCE_TITLE_BUSINESSMAN :运输个体户
STR_HIGHSCORE_PERFORMANCE_TITLE_ENTREPRENEUR :运输代理商
@ -1072,6 +1076,7 @@ STR_GAME_OPTIONS_BASE_MUSIC :{BLACK}基础
STR_GAME_OPTIONS_BASE_MUSIC_TOOLTIP :{BLACK}选择要使用的基础音乐组
STR_GAME_OPTIONS_BASE_MUSIC_DESCRIPTION_TOOLTIP :{BLACK}有关基础音乐组的附加信息
STR_BASESET_STATUS :{STRING} {RED}(共有{NUM}份缺失或损坏的文件)
STR_ERROR_RESOLUTION_LIST_FAILED :{WHITE}无法撷取可用的屏幕分辨率清单
STR_ERROR_FULLSCREEN_FAILED :{WHITE}无法切换到全屏模式{}尝试使用不同的分辨率
@ -1486,7 +1491,7 @@ STR_CONFIG_SETTING_LAND_GENERATOR_ORIGINAL :原始算法
STR_CONFIG_SETTING_LAND_GENERATOR_TERRA_GENESIS :新算法
STR_CONFIG_SETTING_TERRAIN_TYPE :地貌类型: {STRING}
STR_CONFIG_SETTING_TERRAIN_TYPE_HELPTEXT :(仅限生成地图时) 多丘陵地形
STR_CONFIG_SETTING_TERRAIN_TYPE_HELPTEXT :选择生成地图的起伏度
STR_CONFIG_SETTING_INDUSTRY_DENSITY :工业布局: {STRING}
STR_CONFIG_SETTING_INDUSTRY_DENSITY_HELPTEXT :设置地图生成过程中,工业数量及一、二级工业比例。
@ -1498,15 +1503,15 @@ STR_CONFIG_SETTING_SNOWLINE_HEIGHT :雪线高度:
STR_CONFIG_SETTING_SNOWLINE_HEIGHT_HELPTEXT :控制在寒带气候中雪线高度。大雪会影响工业和城镇发展需求。只能在场景编辑器中更改或由“积雪覆盖率”计算得到。
STR_CONFIG_SETTING_SNOW_COVERAGE :积雪覆盖率:{STRING}
STR_CONFIG_SETTING_SNOW_COVERAGE_HELPTEXT :控制寒带气候中大致的雪量。雪会影响工业和城镇发展需求。只在地图生成时使用。海平面以上一格的土地永远没有积雪
STR_CONFIG_SETTING_SNOW_COVERAGE_HELPTEXT :控制寒带气候中大致的雪量。雪会影响工业和城镇发展需求。只在地图生成时使用。海岸线上的土地永远没有积雪
STR_CONFIG_SETTING_SNOW_COVERAGE_VALUE :{NUM}%
STR_CONFIG_SETTING_DESERT_COVERAGE :沙漠覆盖率:{STRING}
STR_CONFIG_SETTING_DESERT_COVERAGE_HELPTEXT :控制热带气候中大致的沙漠量。沙漠会影响工业生成。只在地图生成时使用
STR_CONFIG_SETTING_DESERT_COVERAGE_HELPTEXT :控制热带气候中大致的沙漠量。沙漠会影响工业生成和城镇发展需求。只在地图生成时有效
STR_CONFIG_SETTING_DESERT_COVERAGE_VALUE :{NUM}%
STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN :地面粗糙度 (仅限生成地图时):{STRING}
STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_HELPTEXT :(仅限新算法) 选择在地图上的山丘密度。光滑的地形会包含较少、相互之间较分散的山丘。粗糙的地形的山丘较密集,但可能会使地图显得重复
STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_HELPTEXT :选择在地图上的山丘密度。光滑的地形会包含较少且相互之间较分散的山丘;粗糙的地形的山丘较密集,但可能会使地图显得重复
###length 4
STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_VERY_SMOOTH :非常光滑
STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_SMOOTH :光滑
@ -1514,7 +1519,7 @@ STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_ROUGH :粗糙
STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_VERY_ROUGH :非常粗糙
STR_CONFIG_SETTING_VARIETY :多样的分发: {STRING}
STR_CONFIG_SETTING_VARIETY_HELPTEXT :(仅限新算法) 此设置控制地图是否同时包含多山及平坦的地带。由于此设置只会使地图的一部份変得较平坦,请把其他相关设置(如 "地形特点")的值设为 "山地"
STR_CONFIG_SETTING_VARIETY_HELPTEXT :此设置控制地图是否同时包含多山及平坦的地带。由于此设置只会使地图的一部份変得较平坦,请把其他相关设置(如 "地形特点")的值设为 "山地"
STR_CONFIG_SETTING_RIVER_AMOUNT :河流数量: {STRING}
STR_CONFIG_SETTING_RIVER_AMOUNT_HELPTEXT :选择生成河流的数量
@ -1534,6 +1539,7 @@ STR_CONFIG_SETTING_ROAD_SIDE_LEFT :左侧通行
STR_CONFIG_SETTING_ROAD_SIDE_RIGHT :右侧通行
STR_CONFIG_SETTING_HEIGHTMAP_ROTATION :高度图旋转:{STRING}
STR_CONFIG_SETTING_HEIGHTMAP_ROTATION_TOOLTIP :选择高度图旋转的方向以创建地图
###length 2
STR_CONFIG_SETTING_HEIGHTMAP_ROTATION_COUNTER_CLOCKWISE :逆时针
STR_CONFIG_SETTING_HEIGHTMAP_ROTATION_CLOCKWISE :顺时针
@ -1654,7 +1660,12 @@ STR_CONFIG_SETTING_ADVANCED_VEHICLE_LISTS_HELPTEXT :允许使用高
STR_CONFIG_SETTING_LOADING_INDICATORS :使用装货进度指示: {STRING}
STR_CONFIG_SETTING_LOADING_INDICATORS_HELPTEXT :选择是否在车辆上方显示装卸货物进度
STR_CONFIG_SETTING_TIMETABLE_MODE :时刻表使用的时间单位: {STRING}
STR_CONFIG_SETTING_TIMETABLE_MODE_HELPTEXT :选择载具时刻表所使用的时间单位
###length 3
STR_CONFIG_SETTING_TIMETABLE_MODE_DAYS :日
STR_CONFIG_SETTING_TIMETABLE_MODE_SECONDS :秒
STR_CONFIG_SETTING_TIMETABLE_MODE_TICKS :刻
STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE :在时刻表中显示到达时间和出发时间: {STRING}
STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE_HELPTEXT :在时刻表中显示预期的到达和出发时间
@ -1956,7 +1967,7 @@ STR_CONFIG_SETTING_CITY_SIZE_MULTIPLIER_HELPTEXT :游戏开局时
STR_CONFIG_SETTING_LINKGRAPH_RECALC_INTERVAL :每 {STRING} 更新货物分配
STR_CONFIG_SETTING_LINKGRAPH_RECALC_INTERVAL_HELPTEXT :两次连结图的重新计算间隔。每次重新计算会计算图中一个部分的计划。这意味着填入的值X不意味着整张图会每X秒更新一次只有其中的一部分会被更新。此设定赋值越小则更多的CPU时间会被用来重新计算。此设定赋值越大则在线路改变时货物再分配所需时间会变长。
STR_CONFIG_SETTING_LINKGRAPH_RECALC_TIME :花费 {STRING} 在货物分配的重新计算上
STR_CONFIG_SETTING_LINKGRAPH_RECALC_TIME :在货物分配的重新计算上花费 {STRING}
STR_CONFIG_SETTING_LINKGRAPH_RECALC_TIME_HELPTEXT :每一个连结图的重新计算时间。当一次重新计算开始,一个线程会被允许运行这个秒数。此设定赋值越小,则线程无法按时结束的可能性越大,从而导致游戏运行延迟。此设定赋值越大,则在线路改变时货物再分配所需时间会变长。
STR_CONFIG_SETTING_DISTRIBUTION_PAX :乗客分配方式:{STRING}
@ -3198,11 +3209,15 @@ STR_MAPGEN_MAPSIZE :{BLACK}地图
STR_MAPGEN_MAPSIZE_TOOLTIP :{BLACK}选择地图尺寸(单位:格)。可用的数值会略小。
STR_MAPGEN_BY :{BLACK}*
STR_MAPGEN_NUMBER_OF_TOWNS :{BLACK}城镇数量:
STR_MAPGEN_NUMBER_OF_TOWNS_TOOLTIP :{BLACK}选择城镇密度,或者输入一个自定义数字
STR_MAPGEN_TOWN_NAME_LABEL :{BLACK}城镇名称:
STR_MAPGEN_TOWN_NAME_DROPDOWN_TOOLTIP :{BLACK}选择城镇名称的命名风格
STR_MAPGEN_DATE :{BLACK}日期:
STR_MAPGEN_DATE_TOOLTIP :{BLACK}选择起始日期
STR_MAPGEN_NUMBER_OF_INDUSTRIES :{BLACK}工业数量:
STR_MAPGEN_NUMBER_OF_INDUSTRIES_TOOLTIP :{BLACK}选择工业密度,或者输入一个自定义数字
STR_MAPGEN_HEIGHTMAP_HEIGHT :{BLACK}最高峰:
STR_MAPGEN_HEIGHTMAP_HEIGHT_TOOLTIP :{BLACK}选择游戏地图中最高峰的海拔,以海平面为原点计。
STR_MAPGEN_HEIGHTMAP_HEIGHT_UP :{BLACK}提高最高峰的最大高度一格
STR_MAPGEN_HEIGHTMAP_HEIGHT_DOWN :{BLACK}降低最高峰的最大高度一格
STR_MAPGEN_SNOW_COVERAGE :{BLACK}积雪覆盖率:
@ -3215,10 +3230,12 @@ STR_MAPGEN_DESERT_COVERAGE_DOWN :{BLACK}减少 1
STR_MAPGEN_DESERT_COVERAGE_TEXT :{BLACK}{NUM}%
STR_MAPGEN_TERRAIN_TYPE :{BLACK}地形特点:
STR_MAPGEN_SEA_LEVEL :{BLACK}海洋面积:
STR_MAPGEN_SEA_LEVEL_TOOLTIP :{BLACK} 选择覆盖率
STR_MAPGEN_QUANTITY_OF_RIVERS :{BLACK}河流数量:
STR_MAPGEN_SMOOTHNESS :{BLACK}平滑度:
STR_MAPGEN_VARIETY :{BLACK}多样的分发:
STR_MAPGEN_GENERATE :{WHITE}生成
STR_MAPGEN_GENERATE_TOOLTIP :{BLACK} 创建世界并开始游玩OpenTTD
STR_MAPGEN_NEWGRF_SETTINGS :{BLACK}NewGRF设置
STR_MAPGEN_NEWGRF_SETTINGS_TOOLTIP :{BLACK}显示NewGRF设置
STR_MAPGEN_AI_SETTINGS :{BLACK}AI 设置
@ -3251,6 +3268,7 @@ STR_MAPGEN_TOWN_NAME_CATALAN :加泰罗尼亚
# Strings for map borders at game generation
STR_MAPGEN_BORDER_TYPE :{BLACK}地图边缘:
STR_MAPGEN_BORDER_TYPE_TOOLTIP :{BLACK}选择地图边界的样式
STR_MAPGEN_NORTHWEST :{BLACK}西北
STR_MAPGEN_NORTHEAST :{BLACK}东北
STR_MAPGEN_SOUTHEAST :{BLACK}东南
@ -3263,7 +3281,9 @@ STR_MAPGEN_BORDER_MANUAL :{BLACK}手动
STR_MAPGEN_HEIGHTMAP_ROTATION :{BLACK}高度图旋转:
STR_MAPGEN_HEIGHTMAP_NAME :{BLACK}高度图名称:
STR_MAPGEN_HEIGHTMAP_NAME_TOOLTIP :{BLACK}高度图图像文件的名字
STR_MAPGEN_HEIGHTMAP_SIZE_LABEL :{BLACK}地图尺寸:
STR_MAPGEN_HEIGHTMAP_SIZE_LABEL_TOOLTIP :{BLACK}高度图的长宽大小。建议选择长宽符合游戏地图大小的图片作为高度图如256、512、1024等
STR_MAPGEN_HEIGHTMAP_SIZE :{ORANGE}{NUM} × {NUM}
STR_MAPGEN_TERRAIN_TYPE_QUERY_CAPT :{WHITE}最高峰目标高度
@ -3278,6 +3298,7 @@ STR_SE_MAPGEN_FLAT_WORLD :{WHITE}平坦
STR_SE_MAPGEN_FLAT_WORLD_TOOLTIP :{BLACK}生成平坦水面
STR_SE_MAPGEN_RANDOM_LAND :{WHITE}随机地面
STR_SE_MAPGEN_FLAT_WORLD_HEIGHT :{BLACK}地面高度:
STR_SE_MAPGEN_FLAT_WORLD_HEIGHT_TOOLTIP :{BLACK}选择地面海拔高度
STR_SE_MAPGEN_FLAT_WORLD_HEIGHT_DOWN :{BLACK}提升地面高度
STR_SE_MAPGEN_FLAT_WORLD_HEIGHT_UP :{BLACK}降低地面高度
@ -3303,7 +3324,7 @@ STR_GENERATION_PREPARING_GAME :{BLACK}准备
# NewGRF settings
STR_NEWGRF_SETTINGS_CAPTION :{WHITE}NewGRF 设置
STR_NEWGRF_SETTINGS_INFO_TITLE :{WHITE}NewGRF 详细信息
STR_NEWGRF_SETTINGS_ACTIVE_LIST :{WHITE}激活 NewGRF
STR_NEWGRF_SETTINGS_ACTIVE_LIST :{WHITE}激活 NewGRF
STR_NEWGRF_SETTINGS_INACTIVE_LIST :{WHITE}停用 NewGRF
STR_NEWGRF_SETTINGS_SELECT_PRESET :{ORANGE}选择预设
STR_NEWGRF_FILTER_TITLE :{ORANGE}关键字词搜索:
@ -4571,8 +4592,13 @@ STR_TIMETABLE_STATUS_ON_TIME :{BLACK}该车
STR_TIMETABLE_STATUS_LATE :{BLACK}该车辆目前晚点 {STRING}
STR_TIMETABLE_STATUS_EARLY :{BLACK}该车辆目前提前 {STRING}
STR_TIMETABLE_STATUS_NOT_STARTED :{BLACK}此时刻表尚未开始
STR_TIMETABLE_STATUS_START_AT_DATE :{BLACK}本时刻表将在 {STRING} 开始
STR_TIMETABLE_STATUS_START_IN_SECONDS :{BLACK}本时刻表将会在 {COMMA} 秒内开始
STR_TIMETABLE_START :{BLACK}开始时刻表
STR_TIMETABLE_START_TOOLTIP :{BLACK}选择此时刻表开始的时间。如果订单完全按时刻表安排则按住Ctrl键并单击会根据它们的相对顺序且均匀分配共享此订单的所有车辆的开始时间。
STR_TIMETABLE_START_SECONDS_QUERY :直至时刻表开始的秒数
STR_TIMETABLE_CHANGE_TIME :{BLACK}改变时间
STR_TIMETABLE_WAIT_TIME_TOOLTIP :{BLACK}改变高亮选择的命令执行的时间按住Ctrl单击可为所有命令设置时间
@ -4596,6 +4622,10 @@ STR_TIMETABLE_EXPECTED :{BLACK}预期
STR_TIMETABLE_SCHEDULED :{BLACK}表定时间
STR_TIMETABLE_EXPECTED_TOOLTIP :{BLACK}切换显示(根据实际情况计算的)预期时间或表定时间
STR_TIMETABLE_ARRIVAL_DATE :抵: {COLOUR}{DATE_TINY}
STR_TIMETABLE_DEPARTURE_DATE :发:{COLOUR}{DATE_TINY}
STR_TIMETABLE_ARRIVAL_SECONDS_IN_FUTURE :抵: {COLOUR}{COMMA} 秒
STR_TIMETABLE_DEPARTURE_SECONDS_IN_FUTURE :发: {COLOUR}{COMMA} 秒
# Date window (for timetable)

@ -67,7 +67,7 @@ static std::string GetLastErrorAsString()
DWORD error_code = GetLastError();
if (FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_FROM_HMODULE | FORMAT_MESSAGE_IGNORE_INSERTS, GetModuleHandleA("winhttp.dll"), error_code,
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), buffer, sizeof(buffer), NULL) == 0) {
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), buffer, sizeof(buffer), nullptr) == 0) {
return fmt::format("unknown error {}", error_code);
}

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

@ -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 "../settings_type.h"
#include "../command_func.h"
#include "../core/backup_type.hpp"
#include "script_gui.h"
#include "script_log.hpp"
@ -817,8 +818,9 @@ struct ScriptDebugWindow : public Window {
SetWidgetsDisabledState(!this->show_break_box, WID_SCRD_BREAK_STR_ON_OFF_BTN, WID_SCRD_BREAK_STR_EDIT_BOX, WID_SCRD_MATCH_CASE_BTN);
this->hscroll->SetStepSize(10); // Speed up horizontal scrollbar
/* Restore the break string value from static variable */
/* Restore the break string value from static variable, and enable the filter. */
this->break_editbox.text.Assign(this->filter.break_string);
this->break_string_filter.SetFilterTerm(this->filter.break_string);
if (show_company == INVALID_COMPANY) {
this->SelectValidDebugCompany();
@ -915,8 +917,19 @@ struct ScriptDebugWindow : public Window {
ScriptLogTypes::LogData &log = this->GetLogData();
if (log.empty()) return;
Rect br = r.Shrink(WidgetDimensions::scaled.bevel);
Rect tr = r.Shrink(WidgetDimensions::scaled.framerect);
Rect fr = r.Shrink(WidgetDimensions::scaled.framerect);
/* Setup a clipping rectangle... */
DrawPixelInfo tmp_dpi;
if (!FillDrawPixelInfo(&tmp_dpi, fr)) return;
/* ...but keep coordinates relative to the window. */
tmp_dpi.left += fr.left;
tmp_dpi.top += fr.top;
AutoRestoreBackup dpi_backup(_cur_dpi, &tmp_dpi);
fr.left -= this->hscroll->GetPosition();
for (int i = this->vscroll->GetPosition(); this->vscroll->IsVisible(i) && (size_t)i < log.size(); i++) {
const ScriptLogTypes::LogLine &line = log[i];
@ -932,12 +945,13 @@ struct ScriptDebugWindow : public Window {
/* Check if the current line should be highlighted */
if (i == this->highlight_row) {
GfxFillRect(br.left, tr.top, br.right, tr.top + this->resize.step_height - 1, PC_BLACK);
fr.bottom = fr.top + this->resize.step_height - 1;
GfxFillRect(fr, PC_BLACK);
if (colour == TC_BLACK) colour = TC_WHITE; // Make black text readable by inverting it to white.
}
DrawString(-this->hscroll->GetPosition(), tr.right, tr.top, line.text, colour, SA_LEFT | SA_FORCE);
tr.top += this->resize.step_height;
DrawString(fr, line.text, colour, SA_LEFT | SA_FORCE);
fr.top += this->resize.step_height;
}
}

@ -10,16 +10,9 @@
#ifndef SMALLMAP_COLOURS_H
#define SMALLMAP_COLOURS_H
#include "palette_func.h"
#include "core/endian_func.hpp"
static const uint8 PC_ROUGH_LAND = 0x52; ///< Dark green palette colour for rough land.
static const uint8 PC_GRASS_LAND = 0x54; ///< Dark green palette colour for grass land.
static const uint8 PC_BARE_LAND = 0x37; ///< Brown palette colour for bare land.
static const uint8 PC_RAINFOREST = 0x5C; ///< Pale green palette colour for rainforest.
static const uint8 PC_FIELDS = 0x25; ///< Light brown palette colour for fields.
static const uint8 PC_TREES = 0x57; ///< Green palette colour for trees.
static const uint8 PC_WATER = 0xC9; ///< Dark blue palette colour for water.
#define MKCOLOUR(x) TO_LE32X(x)
#define MKCOLOUR_XXXX(x) (MKCOLOUR(0x01010101) * (uint)(x))

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

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

@ -932,16 +932,16 @@ void CocoaDialog(const char *title, const char *message, const char *buttonLabel
NSString *s = [ aString isKindOfClass:[ NSAttributedString class ] ] ? [ aString string ] : (NSString *)aString;
const char *insert_point = NULL;
const char *replace_range = NULL;
const char *insert_point = nullptr;
const char *replace_range = nullptr;
if (replacementRange.location != NSNotFound) {
/* Calculate the part to be replaced. */
insert_point = Utf8AdvanceByUtf16Units(_focused_window->GetFocusedTextbuf()->GetText(), replacementRange.location);
replace_range = Utf8AdvanceByUtf16Units(insert_point, replacementRange.length);
}
HandleTextInput(NULL, true);
HandleTextInput([ s UTF8String ], false, NULL, insert_point, replace_range);
HandleTextInput(nullptr, true);
HandleTextInput([ s UTF8String ], false, nullptr, insert_point, replace_range);
}
/** Insert the given text at the caret. */
@ -958,9 +958,9 @@ void CocoaDialog(const char *title, const char *message, const char *buttonLabel
NSString *s = [ aString isKindOfClass:[ NSAttributedString class ] ] ? [ aString string ] : (NSString *)aString;
const char *utf8 = [ s UTF8String ];
if (utf8 != NULL) {
const char *insert_point = NULL;
const char *replace_range = NULL;
if (utf8 != nullptr) {
const char *insert_point = nullptr;
const char *replace_range = nullptr;
if (replacementRange.location != NSNotFound) {
/* Calculate the part to be replaced. */
NSRange marked = [ self markedRange ];

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

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

Loading…
Cancel
Save