Merge branch 'master' into jgrpp-beta

# Conflicts:
#	src/company_cmd.cpp
#	src/economy.cpp
#	src/lang/swedish.txt
#	src/network/network_command.cpp
#	src/news_gui.cpp
#	src/saveload/saveload.h
#	src/script/api/script_list.cpp
#	src/video/cocoa/cocoa_v.mm
#	src/video/sdl2_v.cpp
pull/332/head
Jonathan G Rennison 3 years ago
commit 62afd94b47

@ -1,17 +0,0 @@
---
name: Bugs
about: Found a bug in OpenTTD?
title: "Bug Report"
---
## Version of OpenTTD
<!-- Fill in below what version of OpenTTD you are using, including your OS. -->
## Expected result
<!-- Describe in a few words what you expected to happen. -->
## Actual result
<!-- Describe in a few words what actually happens. -->
## Steps to reproduce
<!-- As detailed as possible, please tell us how we can reproduce this. Feel free to attach a savegame (zip it first) to make it more clear. -->

@ -0,0 +1,41 @@
name: Bug Report
description: Found a bug in OpenTTD?
title: "[Bug]: "
body:
- type: markdown
attributes:
value: |
Thanks for taking the time to fill out this bug report!
- type: input
id: version
attributes:
label: Version of OpenTTD
description: Fill in below what version of OpenTTD you are using, including your OS.
placeholder: ex. 1.11.2, Windows 10
validations:
required: true
- type: textarea
id: expected
attributes:
label: Expected result
description: Describe in a few words what you expected to happen.
validations:
required: true
- type: textarea
id: actual
attributes:
label: Actual result
description: Describe in a few words what actually happens.
validations:
required: true
- type: textarea
id: reproduce
attributes:
label: Steps to reproduce
description: As detailed as possible, please tell us how we can reproduce this. Feel free to attach a savegame (zip it first) to make it more clear.
placeholder: |
1. Loaded the attached savegame.
2. Click on the button left of that other icon.
3. The window doesn't open.
validations:
required: true

@ -1,12 +0,0 @@
---
name: Crash
about: Did OpenTTD crash?
title: "Crash Report"
---
<!-- Please zip the crash.log, crash.dmp and crash.sav and attach it to this crash report. -->
## Version of OpenTTD
<!-- Fill in below what version of OpenTTD you are using, including your OS. -->
## Steps to reproduce
<!-- Please spend a few words if you can reproduce this problem. -->

@ -0,0 +1,37 @@
name: Crash
description: Did OpenTTD crash?
title: "[Crash]: "
body:
- type: markdown
attributes:
value: |
Thanks for taking the time to fill out this crash report!
- type: input
id: version
attributes:
label: Version of OpenTTD
description: Fill in below what version of OpenTTD you are using, including your OS.
placeholder: ex. 1.11.2, Windows 10
validations:
required: true
- type: textarea
id: reproduce
attributes:
label: Steps to reproduce
description: Please spend a few words if you can reproduce this problem.
placeholder: |
1. Bought a new train.
2. The game crashed.
validations:
required: true
- type: textarea
id: crashlogs
attributes:
label: Upload crash files
description: With the `crash.log`, `crash.dmp`, and `crash.sav` we can analyze the crash in detail; this way you allow us to easier triage and fix the problem.
placeholder: |
1. Zip the `crash.log`, `crash.dmp` and `crash.sav`.
2. Click on this field.
3. Drag and drop the zip file in here.
validations:
required: true

@ -28,10 +28,10 @@ endmacro()
macro(dump_class_templates NAME)
string(REGEX REPLACE "^Script" "" REALNAME ${NAME})
string(APPEND SQUIRREL_EXPORT "\n template <> inline ${NAME} *GetParam(ForceType<${NAME} *>, HSQUIRRELVM vm, int index, SQAutoFreePointers *ptr) { SQUserPointer instance; sq_getinstanceup(vm, index, &instance, 0); return (${NAME} *)instance; }")
string(APPEND SQUIRREL_EXPORT "\n template <> inline ${NAME} &GetParam(ForceType<${NAME} &>, HSQUIRRELVM vm, int index, SQAutoFreePointers *ptr) { SQUserPointer instance; sq_getinstanceup(vm, index, &instance, 0); return *(${NAME} *)instance; }")
string(APPEND SQUIRREL_EXPORT "\n template <> inline const ${NAME} *GetParam(ForceType<const ${NAME} *>, HSQUIRRELVM vm, int index, SQAutoFreePointers *ptr) { SQUserPointer instance; sq_getinstanceup(vm, index, &instance, 0); return (${NAME} *)instance; }")
string(APPEND SQUIRREL_EXPORT "\n template <> inline const ${NAME} &GetParam(ForceType<const ${NAME} &>, HSQUIRRELVM vm, int index, SQAutoFreePointers *ptr) { SQUserPointer instance; sq_getinstanceup(vm, index, &instance, 0); return *(${NAME} *)instance; }")
string(APPEND SQUIRREL_EXPORT "\n template <> inline ${NAME} *GetParam(ForceType<${NAME} *>, HSQUIRRELVM vm, int index, SQAutoFreePointers *ptr) { SQUserPointer instance; sq_getinstanceup(vm, index, &instance, nullptr); return (${NAME} *)instance; }")
string(APPEND SQUIRREL_EXPORT "\n template <> inline ${NAME} &GetParam(ForceType<${NAME} &>, HSQUIRRELVM vm, int index, SQAutoFreePointers *ptr) { SQUserPointer instance; sq_getinstanceup(vm, index, &instance, nullptr); return *(${NAME} *)instance; }")
string(APPEND SQUIRREL_EXPORT "\n template <> inline const ${NAME} *GetParam(ForceType<const ${NAME} *>, HSQUIRRELVM vm, int index, SQAutoFreePointers *ptr) { SQUserPointer instance; sq_getinstanceup(vm, index, &instance, nullptr); return (${NAME} *)instance; }")
string(APPEND SQUIRREL_EXPORT "\n template <> inline const ${NAME} &GetParam(ForceType<const ${NAME} &>, HSQUIRRELVM vm, int index, SQAutoFreePointers *ptr) { SQUserPointer instance; sq_getinstanceup(vm, index, &instance, nullptr); return *(${NAME} *)instance; }")
if("${NAME}" STREQUAL "ScriptEvent")
string(APPEND SQUIRREL_EXPORT "\n template <> inline int Return<${NAME} *>(HSQUIRRELVM vm, ${NAME} *res) { if (res == nullptr) { sq_pushnull(vm); return 1; } Squirrel::CreateClassInstanceVM(vm, \"${REALNAME}\", res, nullptr, DefSQDestructorCallback<${NAME}>, true); return 1; }")
elseif("${NAME}" STREQUAL "ScriptText")

@ -85,6 +85,8 @@
position: absolute;
width: 100%;
z-index: 2;
/* OpenTTD draws the cursor itself */
cursor: none !important;
}
</style>
</head>

@ -17,7 +17,7 @@ void sqstd_printcallstack(HSQUIRRELVM v)
SQFloat f;
const SQChar *s;
SQInteger level=1; //1 is to skip this function that is level 0
const SQChar *name=0;
const SQChar *name=nullptr;
SQInteger seq=0;
pf(v,"\nCALLSTACK\n");
while(SQ_SUCCEEDED(sq_stackinfos(v,level,&si)))
@ -116,7 +116,7 @@ static SQInteger _sqstd_aux_printerror(HSQUIRRELVM v)
{
SQPRINTFUNCTION pf = sq_getprintfunc(v);
if(pf) {
const SQChar *sErr = 0;
const SQChar *sErr = nullptr;
if(sq_gettop(v)>=1) {
if(SQ_SUCCEEDED(sq_getstring(v,2,&sErr))) {
pf(v,"\nAN ERROR HAS OCCURRED [%s]\n",sErr);

@ -88,7 +88,7 @@ static SQRegFunction mathlib_funcs[] = {
#endif /* EXPORT_DEFAULT_SQUIRREL_FUNCTIONS */
_DECL_FUNC(fabs,2,".n"),
_DECL_FUNC(abs,2,".n"),
{0,0,0,0},
{nullptr,nullptr,0,nullptr},
};
#ifndef M_PI
@ -98,7 +98,7 @@ static SQRegFunction mathlib_funcs[] = {
SQRESULT sqstd_register_mathlib(HSQUIRRELVM v)
{
SQInteger i=0;
while(mathlib_funcs[i].name!=0) {
while(mathlib_funcs[i].name!=nullptr) {
sq_pushstring(v,mathlib_funcs[i].name,-1);
sq_newclosure(v,mathlib_funcs[i].f,0);
sq_setparamscheck(v,mathlib_funcs[i].nparamscheck,mathlib_funcs[i].typemask);

@ -60,11 +60,11 @@ HSQUIRRELVM sq_open(SQInteger initialstacksize)
v = (SQVM *)SQ_MALLOC(sizeof(SQVM));
new (v) SQVM(ss);
ss->_root_vm = v;
if(v->Init(NULL, initialstacksize)) {
if(v->Init(nullptr, initialstacksize)) {
return v;
} else {
sq_delete(v, SQVM);
return NULL;
return nullptr;
}
return v;
}
@ -83,7 +83,7 @@ HSQUIRRELVM sq_newthread(HSQUIRRELVM friendvm, SQInteger initialstacksize)
return v;
} else {
sq_delete(v, SQVM);
return NULL;
return nullptr;
}
}
@ -135,7 +135,7 @@ void sq_close(HSQUIRRELVM v)
SQRESULT sq_compile(HSQUIRRELVM v,SQLEXREADFUNC read,SQUserPointer p,const SQChar *sourcename,SQBool raiseerror)
{
SQObjectPtr o;
if(Compile(v, read, p, sourcename, o, raiseerror?true:false, _ss(v)->_debuginfo)) {
if(Compile(v, read, p, sourcename, o, raiseerror != 0, _ss(v)->_debuginfo)) {
v->Push(SQClosure::Create(_ss(v), _funcproto(o)));
return SQ_OK;
}
@ -144,12 +144,12 @@ SQRESULT sq_compile(HSQUIRRELVM v,SQLEXREADFUNC read,SQUserPointer p,const SQCha
void sq_enabledebuginfo(HSQUIRRELVM v, SQBool enable)
{
_ss(v)->_debuginfo = enable?true:false;
_ss(v)->_debuginfo = enable != 0;
}
void sq_notifyallexceptions(HSQUIRRELVM v, SQBool enable)
{
_ss(v)->_notifyallexceptions = enable?true:false;
_ss(v)->_notifyallexceptions = enable != 0;
}
void sq_addref(HSQUIRRELVM v,HSQOBJECT *po)
@ -178,7 +178,7 @@ const SQChar *sq_objtostring(HSQOBJECT *o)
if(sq_type(*o) == OT_STRING) {
return _stringval(*o);
}
return NULL;
return nullptr;
}
SQInteger sq_objtointeger(HSQOBJECT *o)
@ -224,7 +224,7 @@ void sq_pushinteger(HSQUIRRELVM v,SQInteger n)
void sq_pushbool(HSQUIRRELVM v,SQBool b)
{
v->Push(b?true:false);
v->Push(b != 0);
}
void sq_pushfloat(HSQUIRRELVM v,SQFloat n)
@ -256,7 +256,7 @@ void sq_newarray(HSQUIRRELVM v,SQInteger size)
SQRESULT sq_newclass(HSQUIRRELVM v,SQBool hasbase)
{
SQClass *baseclass = NULL;
SQClass *baseclass = nullptr;
if(hasbase) {
SQObjectPtr &base = stack_get(v,-1);
if(type(base) != OT_CLASS)
@ -555,7 +555,7 @@ SQRESULT sq_getbool(HSQUIRRELVM v,SQInteger idx,SQBool *b)
SQRESULT sq_getstring(HSQUIRRELVM v,SQInteger idx,const SQChar **c)
{
SQObjectPtr *o = NULL;
SQObjectPtr *o = nullptr;
_GETSAFE_OBJ(v, idx, OT_STRING,o);
*c = _stringval(*o);
return SQ_OK;
@ -563,7 +563,7 @@ SQRESULT sq_getstring(HSQUIRRELVM v,SQInteger idx,const SQChar **c)
SQRESULT sq_getthread(HSQUIRRELVM v,SQInteger idx,HSQUIRRELVM *thread)
{
SQObjectPtr *o = NULL;
SQObjectPtr *o = nullptr;
_GETSAFE_OBJ(v, idx, OT_THREAD,o);
*thread = _thread(*o);
return SQ_OK;
@ -598,7 +598,7 @@ SQInteger sq_getsize(HSQUIRRELVM v, SQInteger idx)
SQRESULT sq_getuserdata(HSQUIRRELVM v,SQInteger idx,SQUserPointer *p,SQUserPointer *typetag)
{
SQObjectPtr *o = NULL;
SQObjectPtr *o = nullptr;
_GETSAFE_OBJ(v, idx, OT_USERDATA,o);
(*p) = _userdataval(*o);
if(typetag) *typetag = _userdata(*o)->_typetag;
@ -637,7 +637,7 @@ SQRESULT sq_gettypetag(HSQUIRRELVM v,SQInteger idx,SQUserPointer *typetag)
SQRESULT sq_getuserpointer(HSQUIRRELVM v, SQInteger idx, SQUserPointer *p)
{
SQObjectPtr *o = NULL;
SQObjectPtr *o = nullptr;
_GETSAFE_OBJ(v, idx, OT_USERPOINTER,o);
(*p) = _userpointer(*o);
return SQ_OK;
@ -666,13 +666,13 @@ SQRESULT sq_getinstanceup(HSQUIRRELVM v, SQInteger idx, SQUserPointer *p,SQUserP
SQObjectPtr &o = stack_get(v,idx);
if(type(o) != OT_INSTANCE) return sq_throwerror(v,"the object is not a class instance");
(*p) = _instance(o)->_userpointer;
if(typetag != 0) {
if(typetag != nullptr) {
SQClass *cl = _instance(o)->_class;
do{
if(cl->_typetag == typetag)
return SQ_OK;
cl = cl->_base;
}while(cl != NULL);
}while(cl != nullptr);
return sq_throwerror(v,"invalid type tag");
}
return SQ_OK;
@ -724,7 +724,7 @@ SQRESULT sq_newslot(HSQUIRRELVM v, SQInteger idx, SQBool bstatic)
if(type(self) == OT_TABLE || type(self) == OT_CLASS) {
SQObjectPtr &key = v->GetUp(-2);
if(type(key) == OT_NULL) return sq_throwerror(v, "null is not a valid key");
v->NewSlot(self, key, v->GetUp(-1),bstatic?true:false);
v->NewSlot(self, key, v->GetUp(-1),bstatic != 0);
v->Pop(2);
}
return SQ_OK;
@ -801,14 +801,14 @@ SQRESULT sq_setdelegate(HSQUIRRELVM v,SQInteger idx)
if(!_table(self)->SetDelegate(_table(mt))) return sq_throwerror(v, "delagate cycle");
v->Pop();}
else if(type(mt)==OT_NULL) {
_table(self)->SetDelegate(NULL); v->Pop(); }
_table(self)->SetDelegate(nullptr); v->Pop(); }
else return sq_aux_invalidtype(v,type);
break;
case OT_USERDATA:
if(type(mt)==OT_TABLE) {
_userdata(self)->SetDelegate(_table(mt)); v->Pop(); }
else if(type(mt)==OT_NULL) {
_userdata(self)->SetDelegate(NULL); v->Pop(); }
_userdata(self)->SetDelegate(nullptr); v->Pop(); }
else return sq_aux_invalidtype(v, type);
break;
default:
@ -909,7 +909,7 @@ const SQChar *sq_getlocal(HSQUIRRELVM v,SQUnsignedInteger level,SQUnsignedIntege
}
SQVM::CallInfo &ci=v->_callsstack[lvl];
if(type(ci._closure)!=OT_CLOSURE)
return NULL;
return nullptr;
SQClosure *c=_closure(ci._closure);
SQFunctionProto *func=_funcproto(c->_function);
if(func->_noutervalues > (SQInteger)idx) {
@ -919,7 +919,7 @@ const SQChar *sq_getlocal(HSQUIRRELVM v,SQUnsignedInteger level,SQUnsignedIntege
idx -= func->_noutervalues;
return func->GetLocal(v,stackbase,idx,(SQInteger)(ci._ip-func->_instructions)-1);
}
return NULL;
return nullptr;
}
void sq_pushobject(HSQUIRRELVM v,HSQOBJECT obj)
@ -929,7 +929,7 @@ void sq_pushobject(HSQUIRRELVM v,HSQOBJECT obj)
void sq_resetobject(HSQOBJECT *po)
{
po->_unVal.pUserPointer=NULL;po->_type=OT_NULL;
po->_unVal.pUserPointer=nullptr;po->_type=OT_NULL;
}
SQRESULT sq_throwerror(HSQUIRRELVM v,const SQChar *err)
@ -975,7 +975,7 @@ SQRESULT sq_call(HSQUIRRELVM v,SQInteger params,SQBool retval,SQBool raiseerror,
v->_can_suspend = suspend >= 0;
if (v->_can_suspend) v->_ops_till_suspend = suspend;
if(v->Call(v->GetUp(-(params+1)),params,v->_top-params,res,raiseerror?true:false,v->_can_suspend)){
if(v->Call(v->GetUp(-(params+1)),params,v->_top-params,res,raiseerror != 0,v->_can_suspend)){
if(!v->_suspended) {
v->Pop(params);//pop closure and args
}
@ -1051,7 +1051,7 @@ void sq_setcompilererrorhandler(HSQUIRRELVM v,SQCOMPILERERROR f)
SQRESULT sq_writeclosure(HSQUIRRELVM v,SQWRITEFUNC w,SQUserPointer up)
{
SQObjectPtr *o = NULL;
SQObjectPtr *o = nullptr;
_GETSAFE_OBJ(v, -1, OT_CLOSURE,o);
unsigned short tag = SQ_BYTECODE_STREAM_TAG;
if(w(up,&tag,2) != 2)
@ -1093,7 +1093,7 @@ SQInteger sq_collectgarbage(HSQUIRRELVM v)
const SQChar *sq_getfreevariable(HSQUIRRELVM v,SQInteger idx,SQUnsignedInteger nval)
{
SQObjectPtr &self = stack_get(v,idx);
const SQChar *name = NULL;
const SQChar *name = nullptr;
if(type(self) == OT_CLOSURE) {
if(_closure(self)->_outervalues.size()>nval) {
v->Push(_closure(self)->_outervalues[nval]);
@ -1131,7 +1131,7 @@ SQRESULT sq_setfreevariable(HSQUIRRELVM v,SQInteger idx,SQUnsignedInteger nval)
SQRESULT sq_setattributes(HSQUIRRELVM v,SQInteger idx)
{
SQObjectPtr *o = NULL;
SQObjectPtr *o = nullptr;
_GETSAFE_OBJ(v, idx, OT_CLASS,o);
SQObjectPtr &key = stack_get(v,-2);
SQObjectPtr &val = stack_get(v,-1);
@ -1153,7 +1153,7 @@ SQRESULT sq_setattributes(HSQUIRRELVM v,SQInteger idx)
SQRESULT sq_getattributes(HSQUIRRELVM v,SQInteger idx)
{
SQObjectPtr *o = NULL;
SQObjectPtr *o = nullptr;
_GETSAFE_OBJ(v, idx, OT_CLASS,o);
SQObjectPtr &key = stack_get(v,-1);
SQObjectPtr attrs;
@ -1173,7 +1173,7 @@ SQRESULT sq_getattributes(HSQUIRRELVM v,SQInteger idx)
SQRESULT sq_getbase(HSQUIRRELVM v,SQInteger idx)
{
SQObjectPtr *o = NULL;
SQObjectPtr *o = nullptr;
_GETSAFE_OBJ(v, idx, OT_CLASS,o);
if(_class(*o)->_base)
v->Push(SQObjectPtr(_class(*o)->_base));
@ -1184,7 +1184,7 @@ SQRESULT sq_getbase(HSQUIRRELVM v,SQInteger idx)
SQRESULT sq_getclass(HSQUIRRELVM v,SQInteger idx)
{
SQObjectPtr *o = NULL;
SQObjectPtr *o = nullptr;
_GETSAFE_OBJ(v, idx, OT_INSTANCE,o);
v->Push(SQObjectPtr(_instance(*o)->_class));
return SQ_OK;
@ -1192,7 +1192,7 @@ SQRESULT sq_getclass(HSQUIRRELVM v,SQInteger idx)
SQRESULT sq_createinstance(HSQUIRRELVM v,SQInteger idx)
{
SQObjectPtr *o = NULL;
SQObjectPtr *o = nullptr;
_GETSAFE_OBJ(v, idx, OT_CLASS,o);
v->Push(_class(*o)->CreateInstance());
return SQ_OK;

@ -248,29 +248,29 @@ static SQRegFunction base_funcs[]={
{"getconsttable",base_getconsttable,1, NULL},
{"setconsttable",base_setconsttable,2, NULL},
#endif
{"assert",base_assert,2, NULL},
{"print",base_print,2, NULL},
{"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},
#endif
{"array",base_array,-2, ".n"},
{"type",base_type,2, NULL},
{"type",base_type,2, nullptr},
#ifdef EXPORT_DEFAULT_SQUIRREL_FUNCTIONS
{"dummy",base_dummy,0,NULL},
#ifndef NO_GARBAGE_COLLECTOR
{"collectgarbage",base_collectgarbage,1, "t"},
#endif
#endif
{0,0,0,0}
{nullptr,nullptr,0,nullptr}
};
void sq_base_register(HSQUIRRELVM v)
{
SQInteger i=0;
sq_pushroottable(v);
while(base_funcs[i].name!=0) {
while(base_funcs[i].name!=nullptr) {
sq_pushstring(v,base_funcs[i].name,-1);
sq_newclosure(v,base_funcs[i].f,0);
sq_setnativeclosurename(v,-1,base_funcs[i].name);
@ -415,10 +415,10 @@ SQRegFunction SQSharedState::_table_default_delegate_funcz[]={
{"rawset",table_rawset,3, "t"},
{"rawdelete",table_rawdelete,2, "t"},
{"rawin",container_rawexists,2, "t"},
{"weakref",obj_delegate_weakref,1, NULL },
{"weakref",obj_delegate_weakref,1, nullptr },
{"tostring",default_delegate_tostring,1, "."},
{"clear",obj_clear,1, "."},
{0,0,0,0}
{nullptr,nullptr,0,nullptr}
};
//ARRAY DEFAULT DELEGATE///////////////////////////////////////
@ -624,10 +624,10 @@ SQRegFunction SQSharedState::_array_default_delegate_funcz[]={
{"reverse",array_reverse,1, "a"},
{"sort",array_sort,-1, "ac"},
{"slice",array_slice,-1, "ann"},
{"weakref",obj_delegate_weakref,1, NULL },
{"weakref",obj_delegate_weakref,1, nullptr },
{"tostring",default_delegate_tostring,1, "."},
{"clear",obj_clear,1, "."},
{0,0,0,0}
{nullptr,nullptr,0,nullptr}
};
//STRING DEFAULT DELEGATE//////////////////////////
@ -687,8 +687,8 @@ SQRegFunction SQSharedState::_string_default_delegate_funcz[]={
{"find",string_find,-2, "s s n "},
{"tolower",string_tolower,1, "s"},
{"toupper",string_toupper,1, "s"},
{"weakref",obj_delegate_weakref,1, NULL },
{0,0,0,0}
{"weakref",obj_delegate_weakref,1, nullptr },
{nullptr,nullptr,0,nullptr}
};
//INTEGER DEFAULT DELEGATE//////////////////////////
@ -697,8 +697,8 @@ SQRegFunction SQSharedState::_number_default_delegate_funcz[]={
{"tofloat",default_delegate_tofloat,1, "n|b"},
{"tostring",default_delegate_tostring,1, "."},
{"tochar",number_delegate_tochar,1, "n|b"},
{"weakref",obj_delegate_weakref,1, NULL },
{0,0,0,0}
{"weakref",obj_delegate_weakref,1, nullptr },
{nullptr,nullptr,0,nullptr}
};
//CLOSURE DEFAULT DELEGATE//////////////////////////
@ -782,11 +782,11 @@ SQRegFunction SQSharedState::_closure_default_delegate_funcz[]={
{"pcall",closure_pcall,-1, "c"},
{"acall",closure_acall,2, "ca"},
{"pacall",closure_pacall,2, "ca"},
{"weakref",obj_delegate_weakref,1, NULL },
{"weakref",obj_delegate_weakref,1, nullptr },
{"tostring",default_delegate_tostring,1, "."},
{"bindenv",closure_bindenv,2, "c x|y|t"},
{"getinfos",closure_getinfos,1, "c"},
{0,0,0,0}
{nullptr,nullptr,0,nullptr}
};
//GENERATOR DEFAULT DELEGATE
@ -803,9 +803,9 @@ static SQInteger generator_getstatus(HSQUIRRELVM v)
SQRegFunction SQSharedState::_generator_default_delegate_funcz[]={
{"getstatus",generator_getstatus,1, "g"},
{"weakref",obj_delegate_weakref,1, NULL },
{"weakref",obj_delegate_weakref,1, nullptr },
{"tostring",default_delegate_tostring,1, "."},
{0,0,0,0}
{nullptr,nullptr,0,nullptr}
};
//THREAD DEFAULT DELEGATE
@ -889,9 +889,9 @@ SQRegFunction SQSharedState::_thread_default_delegate_funcz[] = {
{"call", thread_call, -1, "v"},
{"wakeup", thread_wakeup, -1, "v"},
{"getstatus", thread_getstatus, 1, "v"},
{"weakref",obj_delegate_weakref,1, NULL },
{"weakref",obj_delegate_weakref,1, nullptr },
{"tostring",default_delegate_tostring,1, "."},
{0,0,0,0},
{nullptr,nullptr,0,nullptr},
};
static SQInteger class_getattributes(HSQUIRRELVM v)
@ -919,10 +919,10 @@ SQRegFunction SQSharedState::_class_default_delegate_funcz[] = {
{"getattributes", class_getattributes, 2, "y."},
{"setattributes", class_setattributes, 3, "y.."},
{"rawin",container_rawexists,2, "y"},
{"weakref",obj_delegate_weakref,1, NULL },
{"weakref",obj_delegate_weakref,1, nullptr },
{"tostring",default_delegate_tostring,1, "."},
{"instance",class_instance,1, "y"},
{0,0,0,0}
{nullptr,nullptr,0,nullptr}
};
static SQInteger instance_getclass(HSQUIRRELVM v)
@ -935,9 +935,9 @@ static SQInteger instance_getclass(HSQUIRRELVM v)
SQRegFunction SQSharedState::_instance_default_delegate_funcz[] = {
{"getclass", instance_getclass, 1, "x"},
{"rawin",container_rawexists,2, "x"},
{"weakref",obj_delegate_weakref,1, NULL },
{"weakref",obj_delegate_weakref,1, nullptr },
{"tostring",default_delegate_tostring,1, "."},
{0,0,0,0}
{nullptr,nullptr,0,nullptr}
};
static SQInteger weakref_ref(HSQUIRRELVM v)
@ -949,9 +949,9 @@ static SQInteger weakref_ref(HSQUIRRELVM v)
SQRegFunction SQSharedState::_weakref_default_delegate_funcz[] = {
{"ref",weakref_ref,1, "r"},
{"weakref",obj_delegate_weakref,1, NULL },
{"weakref",obj_delegate_weakref,1, nullptr },
{"tostring",default_delegate_tostring,1, "."},
{0,0,0,0}
{nullptr,nullptr,0,nullptr}
};

@ -15,8 +15,8 @@
SQClass::SQClass(SQSharedState *ss,SQClass *base)
{
_base = base;
_typetag = 0;
_hook = NULL;
_typetag = nullptr;
_hook = nullptr;
_udsize = 0;
_metamethods.resize(MT_LAST); //size it to max size
if(_base) {
@ -139,8 +139,8 @@ bool SQClass::GetAttributes(const SQObjectPtr &key,SQObjectPtr &outval)
///////////////////////////////////////////////////////////////////////
void SQInstance::Init(SQSharedState *ss)
{
_userpointer = NULL;
_hook = NULL;
_userpointer = nullptr;
_hook = nullptr;
__ObjAddRef(_class);
_delegate = _class->_members;
INIT_CHAIN();
@ -196,7 +196,7 @@ bool SQInstance::GetMetaMethod(SQVM *v,SQMetaMethod mm,SQObjectPtr &res)
bool SQInstance::InstanceOf(SQClass *trg)
{
SQClass *parent = _class;
while(parent != NULL) {
while(parent != nullptr) {
if(parent == trg)
return true;
parent = parent->_base;

@ -45,7 +45,7 @@ struct SQGenerator : public CHAINABLE_OBJ
{
enum SQGeneratorState{eRunning,eSuspended,eDead};
private:
SQGenerator(SQSharedState *ss,SQClosure *closure){_closure=closure;_state=eRunning;_ci._generator=NULL;INIT_CHAIN();ADD_TO_CHAIN(&_ss(this)->_gc_chain,this);}
SQGenerator(SQSharedState *ss,SQClosure *closure){_closure=closure;_state=eRunning;_ci._generator=nullptr;INIT_CHAIN();ADD_TO_CHAIN(&_ss(this)->_gc_chain,this);}
public:
static SQGenerator *Create(SQSharedState *ss,SQClosure *closure){
SQGenerator *nc=(SQGenerator*)SQ_MALLOC(sizeof(SQGenerator));

@ -57,7 +57,7 @@ typedef sqvector<ExpState> ExpStateVec;
class SQCompiler
{
public:
SQCompiler(SQVM *v, SQLEXREADFUNC rg, SQUserPointer up, const SQChar* sourcename, bool raiseerror, bool lineinfo) : _token(0), _fs(NULL), _lex(_ss(v), rg, up, ThrowError, this), _debugline(0), _debugop(0)
SQCompiler(SQVM *v, SQLEXREADFUNC rg, SQUserPointer up, const SQChar* sourcename, bool raiseerror, bool lineinfo) : _token(0), _fs(nullptr), _lex(_ss(v), rg, up, ThrowError, this), _debugline(0), _debugop(0)
{
_vm=v;
_sourcename = SQString::Create(_ss(v), sourcename);
@ -164,7 +164,7 @@ public:
_debugline = 1;
_debugop = 0;
SQFuncState funcstate(_ss(_vm), NULL,ThrowError,this);
SQFuncState funcstate(_ss(_vm), nullptr,ThrowError,this);
funcstate._name = SQString::Create(_ss(_vm), "main");
_fs = &funcstate;
_fs->AddParameter(_fs->CreateString("this"));

@ -87,7 +87,7 @@ SQLexer::SQLexer(SQSharedState *ss, SQLEXREADFUNC rg, SQUserPointer up,CompilerE
_prevtoken = -1;
_curtoken = -1;
_svalue = NULL;
_svalue = nullptr;
_nvalue = 0;
_fvalue = 0;
@ -119,7 +119,7 @@ const SQChar *SQLexer::Tok2Str(SQInteger tok)
if(((SQInteger)_integer(val)) == tok)
return _stringval(key);
}
return NULL;
return nullptr;
}
void SQLexer::LexBlockComment()

@ -41,7 +41,7 @@ const SQChar *IdType2Name(SQObjectType type)
case _RT_INSTANCE: return "instance";
case _RT_WEAKREF: return "weakref";
default:
return NULL;
return nullptr;
}
}
@ -101,13 +101,13 @@ SQRefCounted::~SQRefCounted()
{
if(_weakref) {
_weakref->_obj._type = OT_NULL;
_weakref->_obj._unVal.pRefCounted = NULL;
_weakref->_obj._unVal.pRefCounted = nullptr;
}
}
void SQWeakRef::Release() {
if(ISREFCOUNTED(_obj._type)) {
_obj._unVal.pRefCounted->_weakref = NULL;
_obj._unVal.pRefCounted->_weakref = nullptr;
}
sq_delete(this,SQWeakRef);
}
@ -149,7 +149,7 @@ bool SQGenerator::Yield(SQVM *v)
for(SQInteger j = nvargs - 1; j >= 0; j--) {
_vargsstack.push_back(v->_vargsstack[vargsbase+j]);
}
_ci._generator=NULL;
_ci._generator=nullptr;
for(SQInteger i=0;i<_ci._etraps;i++) {
_etraps.push_back(v->_etraps.top());
v->_etraps.pop_back();
@ -204,7 +204,7 @@ void SQArray::Extend(const SQArray *a){
const SQChar* SQFunctionProto::GetLocal(SQVM *vm,SQUnsignedInteger stackbase,SQUnsignedInteger nseq,SQUnsignedInteger nop)
{
SQUnsignedInteger nvars=_nlocalvarinfos;
const SQChar *res=NULL;
const SQChar *res=nullptr;
if(nvars>=nseq){
for(SQUnsignedInteger i=0;i<nvars;i++){
if(_localvarinfos[i]._start_op<=nop && _localvarinfos[i]._end_op>=nop)

@ -56,7 +56,7 @@ enum SQMetaMethod{
struct SQRefCounted
{
SQRefCounted() { _uiRef = 0; _weakref = NULL; }
SQRefCounted() { _uiRef = 0; _weakref = nullptr; }
virtual ~SQRefCounted();
SQWeakRef *GetWeakRef(SQObjectType type);
SQUnsignedInteger _uiRef;
@ -152,7 +152,7 @@ struct SQObjectPtr : public SQObject
{
SQ_OBJECT_RAWINIT()
_type=OT_NULL;
_unVal.pUserPointer=NULL;
_unVal.pUserPointer=nullptr;
}
SQObjectPtr(const SQObjectPtr &o)
{
@ -299,7 +299,7 @@ struct SQObjectPtr : public SQObject
tOldType = _type;
unOldVal = _unVal;
_type = OT_NULL;
_unVal.pUserPointer = NULL;
_unVal.pUserPointer = nullptr;
__Release(tOldType,unOldVal);
}
inline SQObjectPtr& operator=(SQInteger i)

@ -79,12 +79,12 @@ SQTable *CreateDefaultDelegate(SQSharedState *ss,SQRegFunction *funcz)
{
SQInteger i=0;
SQTable *t=SQTable::Create(ss,0);
while(funcz[i].name!=0){
while(funcz[i].name!=nullptr){
SQNativeClosure *nc = SQNativeClosure::Create(ss,funcz[i].f);
nc->_nparamscheck = funcz[i].nparamscheck;
nc->_name = SQString::Create(ss,funcz[i].name);
if(funcz[i].typemask && !CompileTypemask(nc->_typecheck,funcz[i].typemask))
return NULL;
return nullptr;
t->NewSlot(SQString::Create(ss,funcz[i].name),nc);
i++;
}
@ -93,15 +93,15 @@ SQTable *CreateDefaultDelegate(SQSharedState *ss,SQRegFunction *funcz)
SQSharedState::SQSharedState()
{
_compilererrorhandler = NULL;
_printfunc = NULL;
_compilererrorhandler = nullptr;
_printfunc = nullptr;
_debuginfo = false;
_notifyallexceptions = false;
_scratchpad=NULL;
_scratchpad=nullptr;
_scratchpadsize=0;
_collectable_free_processing = false;
#ifndef NO_GARBAGE_COLLECTOR
_gc_chain=NULL;
_gc_chain=nullptr;
#endif
sq_new(_stringtable,SQStringTable);
sq_new(_metamethods,SQObjectPtrVec);
@ -189,7 +189,7 @@ SQSharedState::~SQSharedState()
_refs_table.Finalize();
#ifndef NO_GARBAGE_COLLECTOR
SQCollectable *t = _gc_chain;
SQCollectable *nx = NULL;
SQCollectable *nx = nullptr;
if(t) {
t->_uiRef++;
while(t) {
@ -299,7 +299,7 @@ SQInteger SQSharedState::CollectGarbage(SQVM *vm)
EnqueueMarkObject(_instance_default_delegate,queue);
EnqueueMarkObject(_weakref_default_delegate,queue);
SQCollectable *tchain=NULL;
SQCollectable *tchain=nullptr;
while (!queue.IsEmpty()) {
SQCollectable *q = queue.Pop();
@ -309,7 +309,7 @@ SQInteger SQSharedState::CollectGarbage(SQVM *vm)
}
SQCollectable *t = _gc_chain;
SQCollectable *nx = NULL;
SQCollectable *nx = nullptr;
if(t) {
t->_uiRef++;
while(t) {
@ -340,7 +340,7 @@ SQInteger SQSharedState::CollectGarbage(SQVM *vm)
#ifndef NO_GARBAGE_COLLECTOR
void SQCollectable::AddToChain(SQCollectable **chain,SQCollectable *c)
{
c->_prev = NULL;
c->_prev = nullptr;
c->_next = *chain;
if(*chain) (*chain)->_prev = c;
*chain = c;
@ -352,8 +352,8 @@ void SQCollectable::RemoveFromChain(SQCollectable **chain,SQCollectable *c)
else *chain = c->_next;
if(c->_next)
c->_next->_prev = c->_prev;
c->_next = NULL;
c->_prev = NULL;
c->_next = nullptr;
c->_prev = nullptr;
}
#endif
@ -483,16 +483,16 @@ RefTable::RefNode *RefTable::Get(SQObject &obj,SQHash &mainpos,RefNode **prev,bo
{
RefNode *ref;
mainpos = ::HashObj(obj)&(_numofslots-1);
*prev = NULL;
*prev = nullptr;
for (ref = _buckets[mainpos]; ref; ) {
if(_rawval(ref->obj) == _rawval(obj) && type(ref->obj) == type(obj))
break;
*prev = ref;
ref = ref->next;
}
if(ref == NULL && add) {
if(ref == nullptr && add) {
if(_numofslots == _slotused) {
assert(_freelist == 0);
assert(_freelist == nullptr);
Resize(_numofslots*2);
mainpos = ::HashObj(obj)&(_numofslots-1);
}
@ -510,16 +510,16 @@ void RefTable::AllocNodes(SQUnsignedInteger size)
RefNode *temp = nodes;
SQUnsignedInteger n;
for(n = 0; n < size - 1; n++) {
bucks[n] = NULL;
bucks[n] = nullptr;
temp->refs = 0;
new (&temp->obj) SQObjectPtr;
temp->next = temp+1;
temp++;
}
bucks[n] = NULL;
bucks[n] = nullptr;
temp->refs = 0;
new (&temp->obj) SQObjectPtr;
temp->next = NULL;
temp->next = nullptr;
_freelist = nodes;
_nodes = nodes;
_buckets = bucks;
@ -543,7 +543,7 @@ SQStringTable::SQStringTable()
SQStringTable::~SQStringTable()
{
SQ_FREE(_strings,sizeof(SQString*)*_numofslots);
_strings = NULL;
_strings = nullptr;
}
void SQStringTable::AllocNodes(SQInteger size)
@ -580,8 +580,8 @@ SQString::SQString(const SQChar *news, SQInteger len)
_val[len] = '\0';
_len = len;
_hash = ::_hashstr(news,(size_t)len);
_next = NULL;
_sharedstate = NULL;
_next = nullptr;
_sharedstate = nullptr;
}
void SQStringTable::Resize(SQInteger size)
@ -605,7 +605,7 @@ void SQStringTable::Resize(SQInteger size)
void SQStringTable::Remove(SQString *bs)
{
SQString *s;
SQString *prev=NULL;
SQString *prev=nullptr;
SQHash h = bs->_hash&(_numofslots - 1);
for (s = _strings[h]; s; ){

@ -18,7 +18,7 @@ SQTable::SQTable(SQSharedState *ss,SQInteger nInitialSize)
while(nInitialSize>pow2size)pow2size=pow2size<<1;
AllocNodes(pow2size);
_usednodes = 0;
_delegate = NULL;
_delegate = nullptr;
INIT_CHAIN();
ADD_TO_CHAIN(&_sharedstate->_gc_chain,this);
}
@ -39,7 +39,7 @@ void SQTable::AllocNodes(SQInteger nSize)
_HashNode *nodes=(_HashNode *)SQ_MALLOC(sizeof(_HashNode)*nSize);
for(SQInteger i=0;i<nSize;i++){
new (&nodes[i]) _HashNode;
nodes[i].next=NULL;
nodes[i].next=nullptr;
}
_numofnodes=nSize;
_nodes=nodes;
@ -120,7 +120,7 @@ bool SQTable::NewSlot(const SQObjectPtr &key,const SQObjectPtr &val)
if (mp > n && (othern = &_nodes[mph]) != mp){
/* yes; move colliding node into free position */
while (othern->next != mp){
assert(othern->next != NULL);
assert(othern->next != nullptr);
othern = othern->next; /* find previous */
}
othern->next = n; /* redo the chain with `n' in place of `mp' */
@ -129,7 +129,7 @@ bool SQTable::NewSlot(const SQObjectPtr &key,const SQObjectPtr &val)
n->next = mp->next;
mp->key = _null_;
mp->val = _null_;
mp->next = NULL; /* now `mp' is free */
mp->next = nullptr; /* now `mp' is free */
}
else{
/* new node will go into free position */
@ -141,7 +141,7 @@ bool SQTable::NewSlot(const SQObjectPtr &key,const SQObjectPtr &val)
mp->key = key;
for (;;) { /* correct `firstfree' */
if (type(_firstfree->key) == OT_NULL && _firstfree->next == NULL) {
if (type(_firstfree->key) == OT_NULL && _firstfree->next == nullptr) {
mp->val = val;
_usednodes++;
return true; /* OK; table still has a free place */
@ -190,7 +190,7 @@ void SQTable::_ClearNodes()
void SQTable::Finalize()
{
_ClearNodes();
SetDelegate(NULL);
SetDelegate(nullptr);
}
void SQTable::Clear()

@ -27,7 +27,7 @@ struct SQTable : public SQDelegable
private:
struct _HashNode
{
_HashNode() { next = NULL; }
_HashNode() { next = nullptr; }
SQObjectPtr val;
SQObjectPtr key;
_HashNode *next;
@ -47,14 +47,14 @@ public:
{
SQTable *newtable = (SQTable*)SQ_MALLOC(sizeof(SQTable));
new (newtable) SQTable(ss, nInitialSize);
newtable->_delegate = NULL;
newtable->_delegate = nullptr;
return newtable;
}
void Finalize() override;
SQTable *Clone();
~SQTable()
{
SetDelegate(NULL);
SetDelegate(nullptr);
REMOVE_FROM_CHAIN(&_sharedstate->_gc_chain, this);
for (SQInteger i = 0; i < _numofnodes; i++) _nodes[i].~_HashNode();
SQ_FREE(_nodes, _numofnodes * sizeof(_HashNode));
@ -70,7 +70,7 @@ public:
return n;
}
}while((n = n->next));
return NULL;
return nullptr;
}
bool Get(const SQObjectPtr &key,SQObjectPtr &val);
void Remove(const SQObjectPtr &key);

@ -4,12 +4,12 @@
struct SQUserData : SQDelegable
{
SQUserData(SQSharedState *ss, SQInteger size){ _delegate = 0; _hook = NULL; INIT_CHAIN(); ADD_TO_CHAIN(&_ss(this)->_gc_chain, this); _size = size; _typetag = 0;
SQUserData(SQSharedState *ss, SQInteger size){ _delegate = nullptr; _hook = nullptr; INIT_CHAIN(); ADD_TO_CHAIN(&_ss(this)->_gc_chain, this); _size = size; _typetag = nullptr;
}
~SQUserData()
{
REMOVE_FROM_CHAIN(&_ss(this)->_gc_chain, this);
SetDelegate(NULL);
SetDelegate(nullptr);
}
static SQUserData* Create(SQSharedState *ss, SQInteger size)
{
@ -19,7 +19,7 @@ struct SQUserData : SQDelegable
}
#ifndef NO_GARBAGE_COLLECTOR
void EnqueueMarkObjectForChildren(SQGCMarkerQueue &queue);
void Finalize(){SetDelegate(NULL);}
void Finalize(){SetDelegate(nullptr);}
#endif
void Release() {
if (_hook) _hook(_val,_size);

@ -18,7 +18,7 @@ template<typename T> class sqvector
public:
sqvector()
{
_vals = NULL;
_vals = nullptr;
_size = 0;
_allocated = 0;
}

@ -33,7 +33,7 @@ void SQVM::ClearStack(SQInteger last_top)
tOldType = o._type;
unOldVal = o._unVal;
o._type = OT_NULL;
o._unVal.pUserPointer = NULL;
o._unVal.pUserPointer = nullptr;
__Release(tOldType,unOldVal);
}
}
@ -107,7 +107,7 @@ SQVM::SQVM(SQSharedState *ss)
_suspended_target=-1;
_suspended_root = SQFalse;
_suspended_traps=0;
_foreignptr=NULL;
_foreignptr=nullptr;
_nnativecalls=0;
_lasterror = _null_;
_errorhandler = _null_;
@ -115,12 +115,12 @@ SQVM::SQVM(SQSharedState *ss)
_can_suspend = false;
_in_stackoverflow = false;
_ops_till_suspend = 0;
_callsstack = NULL;
_callsstack = nullptr;
_callsstacksize = 0;
_alloccallsstacksize = 0;
_top = 0;
_stackbase = 0;
ci = NULL;
ci = nullptr;
INIT_CHAIN();ADD_TO_CHAIN(&_ss(this)->_gc_chain,this);
}
@ -379,7 +379,7 @@ bool SQVM::StartCall(SQClosure *closure,SQInteger target,SQInteger args,SQIntege
if (!tailcall) {
CallInfo lc = {};
lc._generator = NULL;
lc._generator = nullptr;
lc._etraps = 0;
lc._prevstkbase = (SQInt32) ( stackbase - _stackbase );
lc._target = (SQInt32) target;
@ -437,7 +437,7 @@ bool SQVM::Return(SQInteger _arg0, SQInteger _arg1, SQObjectPtr &retval)
while (last_top > oldstackbase) _stack._vals[last_top--].Null();
assert(oldstackbase >= _stackbase);
return broot?true:false;
return broot != 0;
}
#define _RET_ON_FAIL(exp) { if(!exp) return false; }
@ -557,7 +557,7 @@ bool SQVM::DELEGATE_OP(SQObjectPtr &trg,SQObjectPtr &o1,SQObjectPtr &o2)
}
break;
case OT_NULL:
_table(o1)->SetDelegate(NULL);
_table(o1)->SetDelegate(nullptr);
break;
default:
Raise_Error("using '%s' as delegate", GetTypeName(o2));
@ -627,7 +627,7 @@ bool SQVM::GETVARGV_OP(SQObjectPtr &target,SQObjectPtr &index,CallInfo *ci)
bool SQVM::CLASS_OP(SQObjectPtr &target,SQInteger baseclass,SQInteger attributes)
{
SQClass *base = NULL;
SQClass *base = nullptr;
SQObjectPtr attrs;
if(baseclass != -1) {
if(type(_stack._vals[_stackbase+baseclass]) != OT_CLASS) { Raise_Error("trying to inherit from a %s",GetTypeName(_stack._vals[_stackbase+baseclass])); return false; }
@ -653,7 +653,7 @@ bool SQVM::CLASS_OP(SQObjectPtr &target,SQInteger baseclass,SQInteger attributes
bool SQVM::IsEqual(SQObjectPtr &o1,SQObjectPtr &o2,bool &res)
{
if(type(o1) == type(o2)) {
res = ((_rawval(o1) == _rawval(o2)?true:false));
res = ((_rawval(o1) == _rawval(o2)));
}
else {
if(sq_isnumeric(o1) && sq_isnumeric(o2)) {
@ -708,7 +708,7 @@ bool SQVM::Execute(SQObjectPtr &closure, SQInteger target, SQInteger nargs, SQIn
temp_reg = closure;
if(!StartCall(_closure(temp_reg), _top - nargs, nargs, stackbase, false)) {
//call the handler if there are no calls in the stack, if not relies on the previous node
if(ci == NULL) CallErrorHandler(_lasterror);
if(ci == nullptr) CallErrorHandler(_lasterror);
return false;
}
if (_funcproto(_closure(temp_reg)->_function)->_bgenerator) {
@ -1028,7 +1028,7 @@ common_call:
case _OP_THROW: Raise_Error(TARGET); SQ_THROW();
case _OP_CLASS: _GUARD(CLASS_OP(TARGET,arg1,arg2)); continue;
case _OP_NEWSLOTA:
bool bstatic = (arg0&NEW_SLOT_STATIC_FLAG)?true:false;
bool bstatic = (arg0&NEW_SLOT_STATIC_FLAG) != 0;
if(type(STK(arg1)) == OT_CLASS) {
if(type(_class(STK(arg1))->_metamethods[MT_NEWMEMBER]) != OT_NULL ) {
Push(STK(arg1)); Push(STK(arg2)); Push(STK(arg3));
@ -1160,7 +1160,7 @@ bool SQVM::CallNative(SQNativeClosure *nclosure,SQInteger nargs,SQInteger stackb
_top = stackbase + nargs;
CallInfo lci = {};
lci._closure = nclosure;
lci._generator = NULL;
lci._generator = nullptr;
lci._etraps = 0;
lci._prevstkbase = (SQInt32) (stackbase - _stackbase);
lci._ncalls = 1;

@ -63,7 +63,7 @@ template <> const char *GetClassName<AIInfo, ST_AI>() { return "AIInfo"; }
{
/* Get the AIInfo */
SQUserPointer instance = nullptr;
if (SQ_FAILED(sq_getinstanceup(vm, 2, &instance, 0)) || instance == nullptr) return sq_throwerror(vm, "Pass an instance of a child class of AIInfo to RegisterAI");
if (SQ_FAILED(sq_getinstanceup(vm, 2, &instance, nullptr)) || instance == nullptr) return sq_throwerror(vm, "Pass an instance of a child class of AIInfo to RegisterAI");
AIInfo *info = (AIInfo *)instance;
SQInteger res = ScriptInfo::Constructor(vm, info);
@ -107,7 +107,7 @@ template <> const char *GetClassName<AIInfo, ST_AI>() { return "AIInfo"; }
{
/* Get the AIInfo */
SQUserPointer instance;
sq_getinstanceup(vm, 2, &instance, 0);
sq_getinstanceup(vm, 2, &instance, nullptr);
AIInfo *info = (AIInfo *)instance;
info->api_version = nullptr;

@ -393,8 +393,7 @@ set_name:;
MarkWholeScreenDirty();
if (c->is_ai) {
CompanyNewsInformation *cni = MallocT<CompanyNewsInformation>(1);
cni->FillData(c);
CompanyNewsInformation *cni = new CompanyNewsInformation(c);
SetDParam(0, STR_NEWS_COMPANY_LAUNCH_TITLE);
SetDParam(1, STR_NEWS_COMPANY_LAUNCH_DESCRIPTION);
SetDParamStr(2, cni->company_name);
@ -782,21 +781,19 @@ void CompaniesYearlyLoop()
* @param c the current company.
* @param other the other company (use \c nullptr if not relevant).
*/
void CompanyNewsInformation::FillData(const Company *c, const Company *other)
CompanyNewsInformation::CompanyNewsInformation(const Company *c, const Company *other)
{
SetDParam(0, c->index);
GetString(this->company_name, STR_COMPANY_NAME, lastof(this->company_name));
this->company_name = GetString(STR_COMPANY_NAME);
if (other == nullptr) {
*this->other_company_name = '\0';
} else {
if (other != nullptr) {
SetDParam(0, other->index);
GetString(this->other_company_name, STR_COMPANY_NAME, lastof(this->other_company_name));
this->other_company_name = GetString(STR_COMPANY_NAME);
c = other;
}
SetDParam(0, c->index);
GetString(this->president_name, STR_PRESIDENT_NAME_MANAGER, lastof(this->president_name));
this->president_name = GetString(STR_PRESIDENT_NAME_MANAGER);
this->colour = c->colour;
this->face = c->face;
@ -921,8 +918,7 @@ CommandCost CmdCompanyCtrl(TileIndex tile, DoCommandFlag flags, uint32 p1, uint3
/* Delete any open window of the company */
DeleteCompanyWindows(c->index);
CompanyNewsInformation *cni = MallocT<CompanyNewsInformation>(1);
cni->FillData(c);
CompanyNewsInformation *cni = new CompanyNewsInformation(c);
/* Show the bankrupt news */
SetDParam(0, STR_NEWS_COMPANY_BANKRUPT_TITLE);

@ -634,8 +634,7 @@ static void CompanyCheckBankrupt(Company *c)
/* Warn about bankruptcy after 3 months */
case 4: {
CompanyNewsInformation *cni = MallocT<CompanyNewsInformation>(1);
cni->FillData(c);
CompanyNewsInformation *cni = new CompanyNewsInformation(c);
SetDParam(0, STR_NEWS_COMPANY_IN_TROUBLE_TITLE);
SetDParam(1, STR_NEWS_COMPANY_IN_TROUBLE_DESCRIPTION);
SetDParamStr(2, cni->company_name);
@ -2261,8 +2260,7 @@ static void DoAcquireCompany(Company *c)
DEBUG(desync, 1, "buy_company: date{%08x; %02x; %02x}, buyer: %u, bought: %u", _date, _date_fract, _tick_skip_counter, (uint) _current_company, (uint) ci);
CompanyNewsInformation *cni = MallocT<CompanyNewsInformation>(1);
cni->FillData(c, Company::Get(_current_company));
CompanyNewsInformation *cni = new CompanyNewsInformation(c, Company::Get(_current_company));
SetDParam(0, STR_NEWS_COMPANY_MERGER_TITLE);
SetDParam(1, c->bankrupt_value == 0 ? STR_NEWS_MERGER_TAKEOVER_TITLE : STR_NEWS_COMPANY_MERGER_DESCRIPTION);

@ -889,7 +889,7 @@ public:
this->fios_items_shown[i] = this->string_filter.GetState();
if (this->fios_items_shown[i]) items_shown_count++;
if (&(this->fios_items[i]) == this->selected && this->fios_items_shown[i] == false) {
if (&(this->fios_items[i]) == this->selected && !this->fios_items_shown[i]) {
/* The selected element has been filtered out */
this->selected = nullptr;
this->OnInvalidateData(SLIWD_SELECTION_CHANGES);

@ -54,7 +54,7 @@ template <> const char *GetClassName<GameInfo, ST_GS>() { return "GSInfo"; }
{
/* Get the GameInfo */
SQUserPointer instance = nullptr;
if (SQ_FAILED(sq_getinstanceup(vm, 2, &instance, 0)) || instance == nullptr) return sq_throwerror(vm, "Pass an instance of a child class of GameInfo to RegisterGame");
if (SQ_FAILED(sq_getinstanceup(vm, 2, &instance, nullptr)) || instance == nullptr) return sq_throwerror(vm, "Pass an instance of a child class of GameInfo to RegisterGame");
GameInfo *info = (GameInfo *)instance;
SQInteger res = ScriptInfo::Constructor(vm, info);

@ -890,6 +890,11 @@ STR_NEWS_STATION_NOW_ACCEPTS_CARGO_AND_CARGO :{WHITE}{STATION
STR_NEWS_OFFER_OF_SUBSIDY_EXPIRED :{BIG_FONT}{BLACK}Oferta de subvenció caducada:{}{}El transport de {STRING} des de {STRING} fins a {STRING} no tindrà subvenció
STR_NEWS_SUBSIDY_WITHDRAWN_SERVICE :{BIG_FONT}{BLACK}Subvenció retirada:{}{}El transport de {STRING} des de {STRING} fins a {STRING} ja no està subvencionat
STR_NEWS_SERVICE_SUBSIDY_OFFERED :{BIG_FONT}{BLACK}Oferta de subvenció per a un servei:{}{}La primera companyia en transportar {STRING} des de {STRING} fins a {STRING} tindrà una subvenció de {NUM} any{P "" s} per part de l'autoritat local
STR_NEWS_SERVICE_SUBSIDY_AWARDED_HALF :{BIG_FONT}{BLACK}Subvenció concedida a {STRING}{}{}El transport de {STRING} des de {STRING} fins a {STRING} rebrà uns ingressos addicionals del 50% durant {NUM} any{P "" s}
STR_NEWS_SERVICE_SUBSIDY_AWARDED_DOUBLE :{BIG_FONT}{BLACK}Subvenció concedida a {STRING}{}{}El transport de {STRING} des de {STRING} fins a {STRING} ingressarà el doble de la tarifa habitual durant {NUM} any{P "" s}!
STR_NEWS_SERVICE_SUBSIDY_AWARDED_TRIPLE :{BIG_FONT}{BLACK}Subvenció concedida a {STRING}{}{}El transport de {STRING} des de {STRING} fins a {STRING} ingressarà el triple de la tarifa habitual durant {NUM} any{P "" s}
STR_NEWS_SERVICE_SUBSIDY_AWARDED_QUADRUPLE :{BIG_FONT}{BLACK}Subvenció concedida a {STRING}{}{}El transport de {STRING} des de {STRING} fins a {STRING} ingressarà el quàdruple de la tarifa habitual durant {NUM} any{P "" s}
STR_NEWS_ROAD_REBUILDING :{BIG_FONT}{BLACK}Trànsit caòtic a {TOWN}{}{}El programa de reconstrucció dels carrers patrocinat per {STRING} porta 6 mesos de misèria als automobilistes
STR_NEWS_EXCLUSIVE_RIGHTS_TITLE :{BIG_FONT}{BLACK}Monopoli de transports
@ -1205,6 +1210,10 @@ STR_CONFIG_SETTING_VEHICLE_BREAKDOWNS :Nombre d'avarie
STR_CONFIG_SETTING_VEHICLE_BREAKDOWNS_HELPTEXT :Controla cada quan els vehicles revisats inadequadament s'espatllen
STR_CONFIG_SETTING_SUBSIDY_MULTIPLIER :Multiplicador del subsidi: {STRING}
STR_CONFIG_SETTING_SUBSIDY_MULTIPLIER_HELPTEXT :Fixa quant es paga pels transports subsidiats
STR_CONFIG_SETTING_SUBSIDY_DURATION :Durada dels subsidis: {STRING}
STR_CONFIG_SETTING_SUBSIDY_DURATION_HELPTEXT :Establiu el nombre d'anys que duren els subsidis.
STR_CONFIG_SETTING_SUBSIDY_DURATION_VALUE :{NUM} any{P "" s}
STR_CONFIG_SETTING_SUBSIDY_DURATION_DISABLED :Sense subsidis
STR_CONFIG_SETTING_CONSTRUCTION_COSTS :Costos de construcció: {STRING}
STR_CONFIG_SETTING_CONSTRUCTION_COSTS_HELPTEXT :Fixa el nivell de construcció i els preus de compra
STR_CONFIG_SETTING_RECESSIONS :Recessions: {STRING}

@ -889,6 +889,11 @@ STR_NEWS_STATION_NOW_ACCEPTS_CARGO_AND_CARGO :{WHITE}{STATION
STR_NEWS_OFFER_OF_SUBSIDY_EXPIRED :{BIG_FONT}{BLACK}Subsidieaanbod is verlopen:{}{}{STRING} van {STRING} naar {STRING} wordt nu niet meer gesubsidieerd
STR_NEWS_SUBSIDY_WITHDRAWN_SERVICE :{BIG_FONT}{BLACK}Subsidie ingetrokken:{}{}{STRING}route van {STRING} naar {STRING} wordt nu niet meer gesubsidieerd
STR_NEWS_SERVICE_SUBSIDY_OFFERED :{BIG_FONT}{BLACK}Subsidie aangeboden:{}{}Eerste {STRING}route van {STRING} naar {STRING} krijgt {NUM} jaar lang subsidie van de gemeente!
STR_NEWS_SERVICE_SUBSIDY_AWARDED_HALF :{BIG_FONT}{BLACK}Subsidie toegekend aan {STRING}!{}{}{STRING}route van {STRING} naar {STRING} krijgt de volgende {NUM} jaar 50% extra betaald!
STR_NEWS_SERVICE_SUBSIDY_AWARDED_DOUBLE :{BIG_FONT}{BLACK}Subsidie toegekend aan {STRING}!{}{}{STRING}route van {STRING} naar {STRING} krijgt de volgende {NUM} jaar dubbel betaald!
STR_NEWS_SERVICE_SUBSIDY_AWARDED_TRIPLE :{BIG_FONT}{BLACK}Subsidie toegekend aan {STRING}!{}{}{STRING}route van {STRING} naar {STRING} krijgt devolgende {NUM} jaar driedubbel betaald!
STR_NEWS_SERVICE_SUBSIDY_AWARDED_QUADRUPLE :{BIG_FONT}{BLACK}Subsidie toegekend aan {STRING}!{}{}{STRING}route van {STRING} naar {STRING} krijgt de volgende {NUM} jaar vierdubbel betaald!
STR_NEWS_ROAD_REBUILDING :{BIG_FONT}{BLACK}Verkeerschaos in {TOWN}!{}{}Wegreconstructie betaald door {STRING} zorgt voor 6 maanden van misère bij weggebruikers!
STR_NEWS_EXCLUSIVE_RIGHTS_TITLE :{BIG_FONT}{BLACK}Transportmonopolie!
@ -1204,6 +1209,10 @@ STR_CONFIG_SETTING_VEHICLE_BREAKDOWNS :Voertuigstoring
STR_CONFIG_SETTING_VEHICLE_BREAKDOWNS_HELPTEXT :Bepaal hoe vaak onvoldoende onderhouden voertuigen kapot kunnen gaan
STR_CONFIG_SETTING_SUBSIDY_MULTIPLIER :Subsidiefactor: {STRING}
STR_CONFIG_SETTING_SUBSIDY_MULTIPLIER_HELPTEXT :Instellen hoeveel wordt betaald voor gesubsidieerde verbindingen
STR_CONFIG_SETTING_SUBSIDY_DURATION :Duur van subsidie: {STRING}
STR_CONFIG_SETTING_SUBSIDY_DURATION_HELPTEXT :Bepaal het aantal jaar dat de subsidie wordt verleend
STR_CONFIG_SETTING_SUBSIDY_DURATION_VALUE :{NUM} jaar{P "" ""}
STR_CONFIG_SETTING_SUBSIDY_DURATION_DISABLED :Geen subsidie
STR_CONFIG_SETTING_CONSTRUCTION_COSTS :Bouwkosten: {STRING}
STR_CONFIG_SETTING_CONSTRUCTION_COSTS_HELPTEXT :Het niveau van bouw- en aankoopkosten instellen
STR_CONFIG_SETTING_RECESSIONS :Recessies: {STRING}

@ -2592,6 +2592,7 @@ STR_NETWORK_CLIENT_LIST_NEW_COMPANY :(New company)
STR_NETWORK_CLIENT_LIST_NEW_COMPANY_TOOLTIP :{BLACK}Create a new company and join it
STR_NETWORK_CLIENT_LIST_PLAYER_ICON_SELF_TOOLTIP :{BLACK}This is you
STR_NETWORK_CLIENT_LIST_PLAYER_ICON_HOST_TOOLTIP :{BLACK}This is the host of the game
STR_NETWORK_CLIENT_LIST_CLIENT_COMPANY_COUNT :{BLACK}{NUM} client{P "" s} / {NUM} compan{P y ies}
STR_NETWORK_CLIENT_LIST_ADMIN_CLIENT_KICK :Kick
STR_NETWORK_CLIENT_LIST_ADMIN_CLIENT_BAN :Ban

@ -889,6 +889,11 @@ STR_NEWS_STATION_NOW_ACCEPTS_CARGO_AND_CARGO :{WHITE}{STATION
STR_NEWS_OFFER_OF_SUBSIDY_EXPIRED :{BIG_FONT}{BLACK}Offer of subsidy expired:{}{}{STRING} from {STRING} to {STRING} will now not attract a subsidy
STR_NEWS_SUBSIDY_WITHDRAWN_SERVICE :{BIG_FONT}{BLACK}Subsidy withdrawn:{}{}{STRING} service from {STRING} to {STRING} is no longer subsidized
STR_NEWS_SERVICE_SUBSIDY_OFFERED :{BIG_FONT}{BLACK}Service subsidy offered:{}{}First {STRING} service from {STRING} to {STRING} will attract a {NUM} year subsidy from the local authority!
STR_NEWS_SERVICE_SUBSIDY_AWARDED_HALF :{BIG_FONT}{BLACK}Service subsidy awarded to {STRING}!{}{}{STRING} service from {STRING} to {STRING} will pay 50% extra for the next {NUM} year{P "" s}!
STR_NEWS_SERVICE_SUBSIDY_AWARDED_DOUBLE :{BIG_FONT}{BLACK}Service subsidy awarded to {STRING}!{}{}{STRING} service from {STRING} to {STRING} will pay double rates for the next {NUM} year{P "" s}!
STR_NEWS_SERVICE_SUBSIDY_AWARDED_TRIPLE :{BIG_FONT}{BLACK}Service subsidy awarded to {STRING}!{}{}{STRING} service from {STRING} to {STRING} will pay triple rates for the next {NUM} year{P "" s}!
STR_NEWS_SERVICE_SUBSIDY_AWARDED_QUADRUPLE :{BIG_FONT}{BLACK}Service subsidy awarded to {STRING}!{}{}{STRING} service from {STRING} to {STRING} will pay quadruple rates for the next {NUM} year{P "" s}!
STR_NEWS_ROAD_REBUILDING :{BIG_FONT}{BLACK}Traffic chaos in {TOWN}!{}{}Road rebuilding program funded by {STRING} brings 6 months of misery to motorists!
STR_NEWS_EXCLUSIVE_RIGHTS_TITLE :{BIG_FONT}{BLACK}Transport monopoly!
@ -1204,6 +1209,10 @@ STR_CONFIG_SETTING_VEHICLE_BREAKDOWNS :Vehicle breakdo
STR_CONFIG_SETTING_VEHICLE_BREAKDOWNS_HELPTEXT :Control how often inadequately maintained vehicles may break down
STR_CONFIG_SETTING_SUBSIDY_MULTIPLIER :Subsidy multiplier: {STRING}
STR_CONFIG_SETTING_SUBSIDY_MULTIPLIER_HELPTEXT :Set how much is paid for subsidized connections
STR_CONFIG_SETTING_SUBSIDY_DURATION :Subsidy duration: {STRING}
STR_CONFIG_SETTING_SUBSIDY_DURATION_HELPTEXT :Set the number of years for which a subsidy is awarded
STR_CONFIG_SETTING_SUBSIDY_DURATION_VALUE :{NUM} year{P "" s}
STR_CONFIG_SETTING_SUBSIDY_DURATION_DISABLED :No subsidies
STR_CONFIG_SETTING_CONSTRUCTION_COSTS :Construction costs: {STRING}
STR_CONFIG_SETTING_CONSTRUCTION_COSTS_HELPTEXT :Set level of construction and purchase costs
STR_CONFIG_SETTING_RECESSIONS :Recessions: {STRING}

@ -2159,6 +2159,7 @@ STR_NETWORK_CLIENT_LIST_NEW_COMPANY :(Uusi yhtiö)
STR_NETWORK_CLIENT_LIST_NEW_COMPANY_TOOLTIP :{BLACK}Perusta uusi yhtiö ja liity siihen
STR_NETWORK_CLIENT_LIST_PLAYER_ICON_SELF_TOOLTIP :{BLACK}Tämä olet sinä
STR_NETWORK_CLIENT_LIST_PLAYER_ICON_HOST_TOOLTIP :{BLACK}Tämä on pelin ylläpitäjä
STR_NETWORK_CLIENT_LIST_CLIENT_COMPANY_COUNT :{BLACK}{NUM} pelaaja{P "" a} / {NUM} yhtiö{P "" tä}
STR_NETWORK_CLIENT_LIST_ADMIN_CLIENT_KICK :Potki
STR_NETWORK_CLIENT_LIST_ADMIN_CLIENT_BAN :Estä
@ -2316,7 +2317,7 @@ STR_CONTENT_DETAIL_SUBTITLE_SELECTED :{SILVER}Olet va
STR_CONTENT_DETAIL_SUBTITLE_AUTOSELECTED :{SILVER}Tämä vaatimus on valittu ladattavaksi
STR_CONTENT_DETAIL_SUBTITLE_ALREADY_HERE :{SILVER}Sinulla on jo tämä
STR_CONTENT_DETAIL_SUBTITLE_DOES_NOT_EXIST :{SILVER}Tämä sisältö on tuntematon, ja sitä ei voida ladata OpenTTD:ssä
STR_CONTENT_DETAIL_UPDATE :{SILVER}Tämä korvaa sisällön {STRING}
STR_CONTENT_DETAIL_UPDATE :{SILVER}Tällä korvataan olemassa oleva {STRING}
STR_CONTENT_DETAIL_NAME :{SILVER}Nimi: {WHITE}{STRING}
STR_CONTENT_DETAIL_VERSION :{SILVER}Versio: {WHITE}{STRING}
STR_CONTENT_DETAIL_DESCRIPTION :{SILVER}Kuvaus: {WHITE}{STRING}

@ -19,11 +19,26 @@
##id 0x0000
STR_NULL :
STR_EMPTY :
STR_UNDEFINED :(अपरिभाषित सूत्र)
STR_JUST_NOTHING :कुछ नहीं
# Cargo related strings
# Plural cargo name
STR_CARGO_PLURAL_NOTHING :
STR_CARGO_PLURAL_PASSENGERS :यात्रीगण
STR_CARGO_PLURAL_COAL :कोयला
STR_CARGO_PLURAL_MAIL :डाक
STR_CARGO_PLURAL_OIL :तेल
STR_CARGO_PLURAL_LIVESTOCK :पशुधन
STR_CARGO_PLURAL_GOODS :वस्तुएं
STR_CARGO_PLURAL_GRAIN :अन्न
STR_CARGO_PLURAL_WOOD :काष्ठ
STR_CARGO_PLURAL_IRON_ORE :लौह अयस्क
STR_CARGO_PLURAL_STEEL :इस्पात
STR_CARGO_PLURAL_VALUABLES :मूल्यवान वस्तुएं
STR_CARGO_PLURAL_COPPER_ORE :ताम्र अयस्क
STR_CARGO_PLURAL_MAIZE :मक्के
STR_CARGO_PLURAL_FRUIT :फल
# Singular cargo name
STR_CARGO_SINGULAR_NOTHING :
@ -222,7 +237,7 @@ STR_NEWS_NEW_VEHICLE_TYPE :{BIG_FONT}{BLAC
# Game options window
############ start of currency region
STR_GAME_OPTIONS_CURRENCY_FIM :मार्का, फिनलैंड (FIM)
STR_GAME_OPTIONS_CURRENCY_FIM :फिनलैंड मार्का (FIM)
STR_GAME_OPTIONS_CURRENCY_HKD :हाँग काँग डॉलर (एचकेडी)
############ end of currency region
@ -358,6 +373,9 @@ STR_INTRO_TOOLTIP_SCENARIO_EDITOR :{BLACK}अप
STR_QUIT_YES :{BLACK}हाँ
# Abandon game
STR_ABANDON_GAME_CAPTION :{WHITE}खेल छोड़ें
STR_ABANDON_GAME_QUERY :{YELLOW}क्या आप वास्तव में खेल छोड़ना चाहते हैं?
STR_ABANDON_SCENARIO_QUERY :{YELLOW}क्या आप वास्तव में यह परिदृश्य छोड़ना चाहते हैं?
# Cheat window
@ -418,6 +436,7 @@ STR_NETWORK_GAME_LOBBY_INAUGURATION_YEAR :{SILVER}उद
############ Leave those lines in this order!!
############ End of leave-in-this-order
STR_NETWORK_ERROR_CLIENT_GUI_LOST_CONNECTION_CAPTION :{WHITE}संपर्क विच्छेद संभावित
# Network related errors
############ Leave those lines in this order!!
@ -463,8 +482,10 @@ STR_CONTENT_ERROR_COULD_NOT_DOWNLOAD :{WHITE}डा
STR_STATION_CLASS_DFLT :मानक स्टेशन
STR_STATION_CLASS_WAYP :पथ-संकेत
# Signal window
STR_BUILD_SIGNAL_DRAG_SIGNALS_DENSITY_TOOLTIP :{BLACK}खींचते समय संकेतों के बीच की दूरी
# Bridge selection window
@ -495,6 +516,7 @@ STR_AIRPORT_CLASS_SMALL :लघु व
# Object construction window
STR_OBJECT_CLASS_LTHS :प्रकाश स्तम्भ
# Tree planting window (last eight for SE only)
@ -511,10 +533,12 @@ STR_FOUND_TOWN_CITY :{BLACK}शह
# Fund new industry window
# Industry cargoes window
STR_INDUSTRY_CARGOES_SELECT_INDUSTRY :{BLACK}उद्योग चुनें
# Land area window
# Description of land area of different tiles
STR_LAI_CLEAR_DESCRIPTION_BARE_LAND :रिक्त भूमि
@ -542,6 +566,7 @@ STR_FRAMERATE_BYTES_BAD :{RED}{BYTES}
############ Leave those lines in this order!!
############ End of leave-in-this-order
############ Leave those lines in this order!!
STR_FRAMETIME_CAPTION_GL_ECONOMY :माल प्रबंधन
############ End of leave-in-this-order
@ -925,6 +950,7 @@ STR_ERROR_TOO_HIGH :{WHITE}... ब
# Town related errors
STR_ERROR_CAN_T_RENAME_TOWN :{WHITE}नगर का नाम नहीं बदला जा सकता है...
STR_ERROR_TOO_CLOSE_TO_EDGE_OF_MAP_SUB :{WHITE}... मानचित्र के किनारों के बहुत समीप
# Industry related errors
STR_ERROR_FOREST_CAN_ONLY_BE_PLANTED :{WHITE}... वन केवल बर्फ की सीमा के ऊपर ही लगाये जा सकते हैं।
@ -951,6 +977,7 @@ STR_ERROR_FOREST_CAN_ONLY_BE_PLANTED :{WHITE}... व
STR_ERROR_AUTOREPLACE_NOTHING_TO_DO :{WHITE}स्वतः नवीनीकरण/बदलाव का कोई भी नियम लागू नहीं किया गया
# Rail construction errors
STR_ERROR_CAN_T_REMOVE_RAILROAD_TRACK :{WHITE}पटरियों को यहाँ से नहीं हटा सकते...
# Road construction errors

@ -1928,7 +1928,7 @@ STR_CONFIG_SETTING_TOWN_FOUNDING :게임 도중
STR_CONFIG_SETTING_TOWN_FOUNDING_HELPTEXT :플레이어가 게임 중에 새로운 도시를 설립하는 것을 허용합니다.
STR_CONFIG_SETTING_TOWN_FOUNDING_FORBIDDEN :금지
STR_CONFIG_SETTING_TOWN_FOUNDING_ALLOWED :허용
STR_CONFIG_SETTING_TOWN_FOUNDING_ALLOWED_CUSTOM_LAYOUT :허용, 도시 구조 선택 가능
STR_CONFIG_SETTING_TOWN_FOUNDING_ALLOWED_CUSTOM_LAYOUT :허용, 도로 모양 선택 가능
STR_CONFIG_SETTING_TOWN_CARGOGENMODE :도시 화물 생성: {STRING}
STR_CONFIG_SETTING_TOWN_CARGOGENMODE_HELPTEXT :도시의 전반적인 인구에 따라, 도시가 얼마나 많은 화물을 생산하는 지를 설정합니다.{}제곱 성장: 도시의 규모가 2배 커지면 승객을 4배 더 생산합니다.{}선형 성장: 도시의 규모가 2배 커지면 승객을 2배 더 생산합니다.
STR_CONFIG_SETTING_TOWN_CARGOGENMODE_ORIGINAL :제곱 (기본)
@ -2592,6 +2592,7 @@ STR_NETWORK_CLIENT_LIST_NEW_COMPANY :(새 회사)
STR_NETWORK_CLIENT_LIST_NEW_COMPANY_TOOLTIP :{BLACK}새 회사를 만듭니다
STR_NETWORK_CLIENT_LIST_PLAYER_ICON_SELF_TOOLTIP :{BLACK}당신입니다
STR_NETWORK_CLIENT_LIST_PLAYER_ICON_HOST_TOOLTIP :{BLACK}이 게임을 연 사람입니다
STR_NETWORK_CLIENT_LIST_CLIENT_COMPANY_COUNT :{BLACK}접속자 {NUM}명 / 회사 {NUM}개
STR_NETWORK_CLIENT_LIST_ADMIN_CLIENT_KICK :추방
STR_NETWORK_CLIENT_LIST_ADMIN_CLIENT_BAN :차단

@ -2160,6 +2160,7 @@ STR_NETWORK_CLIENT_LIST_NEW_COMPANY :(Nova empresa)
STR_NETWORK_CLIENT_LIST_NEW_COMPANY_TOOLTIP :{BLACK}Criar uma nova empresa e juntar-se a ela
STR_NETWORK_CLIENT_LIST_PLAYER_ICON_SELF_TOOLTIP :{BLACK}Este é você
STR_NETWORK_CLIENT_LIST_PLAYER_ICON_HOST_TOOLTIP :{BLACK}Este é o anfitrião do jogo
STR_NETWORK_CLIENT_LIST_CLIENT_COMPANY_COUNT :{BLACK}{NUM} cliente{P "" s} / {NUM} companhi{P a as}
STR_NETWORK_CLIENT_LIST_ADMIN_CLIENT_KICK :Expulsar
STR_NETWORK_CLIENT_LIST_ADMIN_CLIENT_BAN :Banir

@ -2313,6 +2313,7 @@ STR_NETWORK_CLIENT_LIST_NEW_COMPANY :(Новая к
STR_NETWORK_CLIENT_LIST_NEW_COMPANY_TOOLTIP :{BLACK}Основать новую транспортную компанию и присоединиться к ней
STR_NETWORK_CLIENT_LIST_PLAYER_ICON_SELF_TOOLTIP :{BLACK}Это вы!
STR_NETWORK_CLIENT_LIST_PLAYER_ICON_HOST_TOOLTIP :{BLACK}Это организатор игры
STR_NETWORK_CLIENT_LIST_CLIENT_COMPANY_COUNT :{BLACK}{NUM} клиент{P "" а ов} / {NUM} компани{P я и й}
STR_NETWORK_CLIENT_LIST_ADMIN_CLIENT_KICK :Отключить
STR_NETWORK_CLIENT_LIST_ADMIN_CLIENT_BAN :Заблокировать

@ -891,7 +891,10 @@ STR_NEWS_STATION_NOW_ACCEPTS_CARGO_AND_CARGO :{WHITE}{STATION
STR_NEWS_OFFER_OF_SUBSIDY_EXPIRED :{BIG_FONT}{BLACK}Oferta de subvención terminada:{}{}{STRING} de {STRING} a {STRING} ya no conlleva una subvención
STR_NEWS_SUBSIDY_WITHDRAWN_SERVICE :{BIG_FONT}{BLACK}Subvención retirada:{}{}El servicio de {STRING} desde {STRING} a {STRING} ya no está subvencionado
STR_NEWS_SERVICE_SUBSIDY_OFFERED :{BIG_FONT}{BLACK}Se ofrece subvención:{}{}¡Al primer servicio de {STRING} que cubra la línea desde {STRING} a {STRING} se le otorgará una subvención durante {NUM} año{P "" s} por parte de las autoridades locales!
STR_NEWS_SERVICE_SUBSIDY_AWARDED_HALF :{BIG_FONT}{BLACK}¡Subvención otorgada a {STRING}!{}{}¡El servicio de {STRING} desde {STRING} a {STRING} se pagará un 50% más caro durante {NUM} año{P "" s}!
STR_NEWS_SERVICE_SUBSIDY_AWARDED_DOUBLE :{BIG_FONT}{BLACK}¡Subvención otorgada a {STRING}!{}{}¡El servicio de {STRING} desde {STRING} a {STRING} se pagará a tarifa doble durante los próximos {NUM} año{P "" s}!
STR_NEWS_SERVICE_SUBSIDY_AWARDED_TRIPLE :{BIG_FONT}{BLACK}¡Subvención otorgada a {STRING}!{}{}¡El servicio de {STRING} desde {STRING} a {STRING} se pagará a tarifa triple durante {NUM} año{P "" s}!
STR_NEWS_SERVICE_SUBSIDY_AWARDED_QUADRUPLE :{BIG_FONT}{BLACK}¡Subvención otorgada a {STRING}!{}{}¡El servicio de {STRING} desde {STRING} a {STRING} se pagará a tarifa cuádruple durante {NUM} año{P "" s}!
STR_NEWS_ROAD_REBUILDING :{BIG_FONT}{BLACK}¡Colapso circulatorio en {TOWN}!{}{}¡El programa de reconstrucción de carreteras patrocinado por {STRING} causa 6 meses de problemas a los conductores!
STR_NEWS_EXCLUSIVE_RIGHTS_TITLE :{BIG_FONT}{BLACK}¡Monopolio de transportes!

@ -392,7 +392,7 @@ STR_SCENEDIT_FILE_MENU_QUIT :Avsluta
############ range for settings menu starts
STR_SETTINGS_MENU_GAME_OPTIONS :Spelinställningar
STR_SETTINGS_MENU_CONFIG_SETTINGS_TREE :Inställningar
STR_SETTINGS_MENU_SCRIPT_SETTINGS :Inställningar för AI / spelskript
STR_SETTINGS_MENU_SCRIPT_SETTINGS :Inställningar för datorspelare / spelskript
STR_SETTINGS_MENU_NEWGRF_SETTINGS :Inställningar för NewGRF
STR_SETTINGS_MENU_TRANSPARENCY_OPTIONS :Inställningar för genomskinlighet
STR_SETTINGS_MENU_TOWN_NAMES_DISPLAYED :Stadsnamn visas
@ -490,7 +490,7 @@ STR_NEWS_MENU_DELETE_ALL_MESSAGES :Ta bort alla me
STR_ABOUT_MENU_LAND_BLOCK_INFO :Information om mark
STR_ABOUT_MENU_SEPARATOR :
STR_ABOUT_MENU_TOGGLE_CONSOLE :Visa/dölj konsolen
STR_ABOUT_MENU_AI_DEBUG :Felsökning av AI / spelskript
STR_ABOUT_MENU_AI_DEBUG :Felsökning av datorspelare / spelskript
STR_ABOUT_MENU_SCREENSHOT :Skärmdump
STR_ABOUT_MENU_SHOW_FRAMERATE :Visa bildfrekvens
STR_ABOUT_MENU_ABOUT_OPENTTD :Om 'OpenTTD'
@ -785,7 +785,7 @@ STR_SMALLMAP_TOOLTIP_ENABLE_ALL_CARGOS :{BLACK}Visa all
STR_STATUSBAR_TOOLTIP_SHOW_LAST_NEWS :{BLACK}Visa senaste meddelande eller nyhet
STR_STATUSBAR_COMPANY_NAME :{SILVER}- - {COMPANY} - -
STR_STATUSBAR_PAUSED :{YELLOW}* * PAUSAD * *
STR_STATUSBAR_PAUSED_LINK_GRAPH :{ORANGE}* * PAUSAD (väntar på updatering av länkdiagram) * *
STR_STATUSBAR_PAUSED_LINK_GRAPH :{ORANGE}* * PAUSAD (väntar på uppdatering av länkgraf) * *
STR_STATUSBAR_AUTOSAVE :{RED}AUTOSPARA
STR_STATUSBAR_SAVING_GAME :{RED}* * SPARAR SPEL * *
@ -830,7 +830,7 @@ STR_NEWS_COMPANY_LAUNCH_DESCRIPTION :{BIG_FONT}{BLAC
STR_NEWS_MERGER_TAKEOVER_TITLE :{BIG_FONT}{BLACK}{STRING} har tagits över av {STRING}!
STR_PRESIDENT_NAME_MANAGER :{BLACK}{PRESIDENT_NAME}{}(VD)
STR_NEWS_NEW_TOWN :{BLACK}{BIG_FONT}{STRING} har sponsrat byggnationen av nya staden {TOWN}!
STR_NEWS_NEW_TOWN :{BLACK}{BIG_FONT}{STRING} har sponsrat byggnationen av den nya staden {TOWN}!
STR_NEWS_NEW_TOWN_UNSPONSORED :{BLACK}{BIG_FONT}En ny stad, kallad {TOWN}, har grundats!
STR_NEWS_INDUSTRY_CONSTRUCTION :{BIG_FONT}{BLACK}Ny {STRING} under konstruktion nära {TOWN}!
@ -889,6 +889,11 @@ STR_NEWS_STATION_NOW_ACCEPTS_CARGO_AND_CARGO :{WHITE}{STATION
STR_NEWS_OFFER_OF_SUBSIDY_EXPIRED :{BIG_FONT}{BLACK}Subventionen har gått ut:{}{}{STRING} från {STRING} till {STRING} är inte längre subventionerad
STR_NEWS_SUBSIDY_WITHDRAWN_SERVICE :{BIG_FONT}{BLACK}Subventionen gäller inte längre:{}{}{STRING} från {STRING} till {STRING} är inte längre subventionerad
STR_NEWS_SERVICE_SUBSIDY_OFFERED :{BIG_FONT}{BLACK}Ny subvention:{}{}Första transporten av {STRING} från {STRING} till {STRING} får {NUM} års subvention från kommunen!
STR_NEWS_SERVICE_SUBSIDY_AWARDED_HALF :{BIG_FONT}{BLACK}Subvention tilldelad {STRING}!{}{}{STRING} från {STRING} till {STRING} ger 50% extra de{P 4 t ""} {NUM} kommande år{P et en}!
STR_NEWS_SERVICE_SUBSIDY_AWARDED_DOUBLE :{BIG_FONT}{BLACK}Subvention tilldelad {STRING}!{}{}{STRING} från {STRING} till {STRING} ger dubbelt så mycket nästa {NUM} år{P "" s}!
STR_NEWS_SERVICE_SUBSIDY_AWARDED_TRIPLE :{BIG_FONT}{BLACK}Subvention tilldelad {STRING}!{}{}{STRING} från {STRING} till {STRING} ger tre gånger så mycket de{P 4 t ""} kommande {NUM} år{P et en}!
STR_NEWS_SERVICE_SUBSIDY_AWARDED_QUADRUPLE :{BIG_FONT}{BLACK}Subvention tilldelad {STRING}!{}{}{STRING} från {STRING} till {STRING} ger fyra gånger så mycket de{P 4 t ""} kommande {NUM} år{P et en}!
STR_NEWS_ROAD_REBUILDING :{BIG_FONT}{BLACK}Trafikkaos i {TOWN}!{}{}Vägombyggnadsprogram bekostat av {STRING} medför 6 månader av elände för bilister!
STR_NEWS_EXCLUSIVE_RIGHTS_TITLE :{BIG_FONT}{BLACK}Transportmonopol!
@ -1038,7 +1043,7 @@ STR_GAME_OPTIONS_REFRESH_RATE_WARNING :{WHITE}uppdater
STR_GAME_OPTIONS_BASE_GRF :{BLACK}Grafikpaket som standard
STR_GAME_OPTIONS_BASE_GRF_TOOLTIP :{BLACK}Välj vilket grafikpaket som ska användas som standard
STR_GAME_OPTIONS_BASE_GRF_STATUS :{RED}{NUM} saknad{P "" e}/trasig{P "" a} fil{P "" er}
STR_GAME_OPTIONS_BASE_GRF_DESCRIPTION_TOOLTIP :{BLACK}Ytterligare information om basgrafik-set
STR_GAME_OPTIONS_BASE_GRF_DESCRIPTION_TOOLTIP :{BLACK}Ytterligare information om basgrafik-settet
STR_GAME_OPTIONS_BASE_SFX :{BLACK}Grundljudspaket
STR_GAME_OPTIONS_BASE_SFX_TOOLTIP :{BLACK}Välj vilket grundljudspaket som ska användas
@ -1199,11 +1204,15 @@ STR_CONFIG_SETTING_INTEREST_RATE_HELPTEXT :Räntenivå fö
STR_CONFIG_SETTING_RUNNING_COSTS :Driftkostnader: {STRING}
STR_CONFIG_SETTING_RUNNING_COSTS_HELPTEXT :Sätt nivån för underhålls- och driftskostnader för fordon och infrastruktur
STR_CONFIG_SETTING_CONSTRUCTION_SPEED :Konstruktionshastighet: {STRING}
STR_CONFIG_SETTING_CONSTRUCTION_SPEED_HELPTEXT :Begränsar antalet konstruktionshandlingar för AI-spelare
STR_CONFIG_SETTING_CONSTRUCTION_SPEED_HELPTEXT :Begränsar antalet konstruktionshandlingar för datorspelare
STR_CONFIG_SETTING_VEHICLE_BREAKDOWNS :Fordonshaverier: {STRING}
STR_CONFIG_SETTING_VEHICLE_BREAKDOWNS_HELPTEXT :Styr hur ofta otillräckligt servade fordon kan få motorstopp
STR_CONFIG_SETTING_SUBSIDY_MULTIPLIER :Subvention (multiplikativ): {STRING}
STR_CONFIG_SETTING_SUBSIDY_MULTIPLIER_HELPTEXT :Ange hur mycket betalt som subventionerade anslutningar ger
STR_CONFIG_SETTING_SUBSIDY_DURATION :Subventioners varaktighet: {STRING}
STR_CONFIG_SETTING_SUBSIDY_DURATION_HELPTEXT :Ställ in hur många år en subvention ska gälla
STR_CONFIG_SETTING_SUBSIDY_DURATION_VALUE :{NUM} år
STR_CONFIG_SETTING_SUBSIDY_DURATION_DISABLED :Inga subventioner
STR_CONFIG_SETTING_CONSTRUCTION_COSTS :Konstruktionskostnader: {STRING}
STR_CONFIG_SETTING_CONSTRUCTION_COSTS_HELPTEXT :Sätt nivån för konstruktions- och inköpskostnader
STR_CONFIG_SETTING_RECESSIONS :Lågkonjunkturer: {STRING}
@ -1270,9 +1279,9 @@ STR_CONFIG_SETTING_SIGNALSIDE_DRIVING_SIDE :På förarsidan
STR_CONFIG_SETTING_SIGNALSIDE_RIGHT :På höger sida
STR_CONFIG_SETTING_SHOWFINANCES :Visa finansfönstret vid slutet av året: {STRING}
STR_CONFIG_SETTING_SHOWFINANCES_HELPTEXT :Om aktiverad kommer finans-fönstret att visas vid slutet av varje år för att möjliggöra enkel granskning av den finansiella statusen för företaget.
STR_CONFIG_SETTING_NONSTOP_BY_DEFAULT :Nya orders är 'non-stop' om inte annat anges.{STRING}
STR_CONFIG_SETTING_NONSTOP_BY_DEFAULT :Nya order är 'non-stop' om inte annat anges.{STRING}
STR_CONFIG_SETTING_NONSTOP_BY_DEFAULT_HELPTEXT :I normala fall stannar ett fordon vid varje station det passerar. Aktiveras den här inställningen kommer det istället att köra igenom alla stationer på väg till dess slutdestination utan att stanna. Tänk på att den här inställningen bara definierar ett förinställt värde för nya order. Individuella order kan uttryckligen definiera båda typerna av beteende oavsett inställning
STR_CONFIG_SETTING_STOP_LOCATION :Nya tåg-orders stannar som standard vid {STRING} av platformen
STR_CONFIG_SETTING_STOP_LOCATION :Nya tåg-order stannar som standard vid {STRING} av platformen
STR_CONFIG_SETTING_STOP_LOCATION_HELPTEXT :Grundinställning för var tåg stannar utmed plattformar. 'början' betyder i början av plattformen sett från var tåget kommer ifrån. 'mitten' betyder i mitten av plattformen och 'slutet' betyder så långt bort som möjligt. Notera att denna inställning endast anger grundvärdet för nya ordrar. Individuella instruktioner kan ges per orderrad explicit till valfritt värde oberoende av denna inställning.
STR_CONFIG_SETTING_STOP_LOCATION_NEAR_END :början
STR_CONFIG_SETTING_STOP_LOCATION_MIDDLE :mitten
@ -1291,7 +1300,7 @@ STR_CONFIG_SETTING_ALLOW_FUND_BUILDINGS :Tillåt att byg
STR_CONFIG_SETTING_ALLOW_FUND_BUILDINGS_HELPTEXT :Tillåt företag att ge pengar till städer för att bekosta nybyggnation av hus
STR_CONFIG_SETTING_ALLOW_FUND_ROAD :Tillåt finansiering av lokal vägrekonstruktion: {STRING}
STR_CONFIG_SETTING_ALLOW_FUND_ROAD_HELPTEXT :Tillåt att företag ger pengar till städer för vägbyggen och därmed saboterar för vägtransporter i staden.
STR_CONFIG_SETTING_ALLOW_GIVE_MONEY :Tillåt skicka pengar till andra företag: {STRING}
STR_CONFIG_SETTING_ALLOW_GIVE_MONEY :Tillåt att skicka pengar till andra företag: {STRING}
STR_CONFIG_SETTING_ALLOW_GIVE_MONEY_HELPTEXT :Tillåt överföring av pengar mellan företag i flerspelarläge
STR_CONFIG_SETTING_FREIGHT_TRAINS :Godsfaktor för att simulera tunga tåg: {STRING}
STR_CONFIG_SETTING_FREIGHT_TRAINS_HELPTEXT :Ställ in påverkan av att frakta gods i tåg. Ett högre värde gör att fraktgods är mer krävande för tågen, speciellt vid lutningar
@ -1365,10 +1374,10 @@ STR_CONFIG_SETTING_OIL_REF_EDGE_DISTANCE_HELPTEXT :Begränsar hur
STR_CONFIG_SETTING_SNOWLINE_HEIGHT :Snögränsens höjd: {STRING}
STR_CONFIG_SETTING_SNOWLINE_HEIGHT_HELPTEXT :Kontrollerar på vilken höjd snön börjar i det subarktiska landskapet. Snö påverkar även industrigeneration och städers tillväxtkrav. Kan endast modifieras via Scenarioredigeraren eller beräknas via "snötäckning"
STR_CONFIG_SETTING_SNOW_COVERAGE :Snötäckning: {STRING}
STR_CONFIG_SETTING_SNOW_COVERAGE_HELPTEXT :Kontrollerar ungefärlig mängd snö på den subarktiska landskapet. Snö påverkar även industri generation och städernas tillväxtkrav. Används endast under kartgeneration. Land precis över havsnivån är alltid utan snö
STR_CONFIG_SETTING_SNOW_COVERAGE_HELPTEXT :Kontrollerar ungefärlig mängd snö i det subarktiska landskapet. Snö påverkar även industrigeneration och städernas tillväxtkrav. Används endast under kartgeneration. Land precis över havsnivån är alltid utan snö
STR_CONFIG_SETTING_SNOW_COVERAGE_VALUE :{NUM}%
STR_CONFIG_SETTING_DESERT_COVERAGE :Öken täckning: {STRING}
STR_CONFIG_SETTING_DESERT_COVERAGE_HELPTEXT :Kontrollera ungefärligt mängd öken i tropiskt landskap. Öken påverkar även industri generation. Används bara under kartgeneration
STR_CONFIG_SETTING_DESERT_COVERAGE :Ökentäckning: {STRING}
STR_CONFIG_SETTING_DESERT_COVERAGE_HELPTEXT :Kontrollera ungefärlig mängd öken i tropiskt landskap. Öken påverkar även industrigeneration. Används bara under kartgeneration
STR_CONFIG_SETTING_DESERT_COVERAGE_VALUE :{NUM}%
STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN :Terrängens svårhetsgrad: {STRING}
STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_HELPTEXT :(TerraGenesis endast) Välj frekvensen av kullar: Smooth landskap har färre, mer utbredda kullar. Rough landskap har många kullar, som kan se repetitiva
@ -1380,14 +1389,14 @@ STR_CONFIG_SETTING_VARIETY :Varierad distri
STR_CONFIG_SETTING_VARIETY_HELPTEXT :(TerraGenesis endast) Styr om kartan innehåller både bergs och flacka områden. Eftersom detta gör bara kartan flackare bör andra inställningar ställas in på bergiga
STR_CONFIG_SETTING_RIVER_AMOUNT :Antal floder: {STRING}
STR_CONFIG_SETTING_RIVER_AMOUNT_HELPTEXT :Välj hur många floder att generera
STR_CONFIG_SETTING_TREE_PLACER :Trädplacerings-algoritm: {STRING}
STR_CONFIG_SETTING_TREE_PLACER_HELPTEXT :Välj fördelningen av träden på kartan: "Original" växter träd jämnt utspridda, "Förbättrad" växter dem i grupper
STR_CONFIG_SETTING_TREE_PLACER :Trädplaceringsalgoritm: {STRING}
STR_CONFIG_SETTING_TREE_PLACER_HELPTEXT :Välj hur träd fördelas över kartan: "Original" planterar träden jämnt utspridda, "Förbättrad" planterar dem i grupper
STR_CONFIG_SETTING_TREE_PLACER_NONE :Inget
STR_CONFIG_SETTING_TREE_PLACER_ORIGINAL :Original
STR_CONFIG_SETTING_TREE_PLACER_IMPROVED :Förbättrad
STR_CONFIG_SETTING_ROAD_SIDE :Väg fordon: {STRING}
STR_CONFIG_SETTING_ROAD_SIDE_HELPTEXT :Välj kör sida
STR_CONFIG_SETTING_HEIGHTMAP_ROTATION :Höjkartans rotation: {STRING}
STR_CONFIG_SETTING_ROAD_SIDE :Vägfordon: {STRING}
STR_CONFIG_SETTING_ROAD_SIDE_HELPTEXT :Välj körsida
STR_CONFIG_SETTING_HEIGHTMAP_ROTATION :Höjdkartans rotation: {STRING}
STR_CONFIG_SETTING_HEIGHTMAP_ROTATION_COUNTER_CLOCKWISE :Motsols
STR_CONFIG_SETTING_HEIGHTMAP_ROTATION_CLOCKWISE :Medsols
STR_CONFIG_SETTING_SE_FLAT_WORLD_HEIGHT :Vilken nivåhöjd en platt scenario-karta får: {STRING}
@ -1534,7 +1543,7 @@ STR_CONFIG_SETTING_AI_PROFILE_MEDIUM :Mellan
STR_CONFIG_SETTING_AI_PROFILE_HARD :Svår
STR_CONFIG_SETTING_AI_IN_MULTIPLAYER :Tillåt datorspelare i flerspelarläge: {STRING}
STR_CONFIG_SETTING_AI_IN_MULTIPLAYER_HELPTEXT :Tillåt datorstyrda AI-spelare att delta i spel för flera spelare
STR_CONFIG_SETTING_AI_IN_MULTIPLAYER_HELPTEXT :Tillåt datorstyrda spelare att delta i spel för flera spelare
STR_CONFIG_SETTING_SCRIPT_MAX_OPCODES :#opcodes innan skript sätts i viloläge: {STRING}
STR_CONFIG_SETTING_SCRIPT_MAX_OPCODES_HELPTEXT :Maximalt antal beräkningssteg ett skript kan utföra i en omgång
STR_CONFIG_SETTING_SCRIPT_MAX_MEMORY :Maximalt minnesanvändning per skript: {STRING}
@ -1583,7 +1592,7 @@ STR_CONFIG_SETTING_NEWS_INDUSTRY_CHANGES_UNSERVED_HELPTEXT :Visa nyhetstidn
STR_CONFIG_SETTING_NEWS_ADVICE :Råd / information om företagets fordon: {STRING}
STR_CONFIG_SETTING_NEWS_ADVICE_HELPTEXT :Visa meddelande ifall att ett fordon behöver uppmärksamhet
STR_CONFIG_SETTING_NEWS_NEW_VEHICLES :Nya fordon: {STRING}
STR_CONFIG_SETTING_NEWS_NEW_VEHICLES_HELPTEXT :Visa nyhetstidning när en ny typ av fordon blir tillgängligt
STR_CONFIG_SETTING_NEWS_NEW_VEHICLES_HELPTEXT :Visa nyhetstidning när en ny typ av fordon blir tillgänglig
STR_CONFIG_SETTING_NEWS_CHANGES_ACCEPTANCE :Ändringar i godsacceptans: {STRING}
STR_CONFIG_SETTING_NEWS_CHANGES_ACCEPTANCE_HELPTEXT :Visa meddelande vid förändring av stationers varuacceptans
STR_CONFIG_SETTING_NEWS_SUBSIDIES :Subventioner: {STRING}
@ -1704,8 +1713,8 @@ STR_CONFIG_SETTING_LARGER_TOWNS_DISABLED :Inga
STR_CONFIG_SETTING_CITY_SIZE_MULTIPLIER :Initial stadsstorleks-multiplikator: {STRING}
STR_CONFIG_SETTING_CITY_SIZE_MULTIPLIER_HELPTEXT :Storstäders genomsnittliga storlek i relation till vanliga städers vid spelets början
STR_CONFIG_SETTING_LINKGRAPH_INTERVAL :Uppdatera distributionsgrafen var {STRING}:e{NBSP}dag{P 0:2 "" s}
STR_CONFIG_SETTING_LINKGRAPH_INTERVAL_HELPTEXT :Tid mellan efterföljande omräkningar av länkgrafen. Varje omräkning beräknar planer för en komponent i grafen. Det medför att ett värde X för den här inställningen inte innebär att hela grafen uppdateras var X:e dag, bara vissa komponenter. Ju lägre värde du ställer in desto mer processorkraft kommer att behövas för beräkningarna. Ju högre värde du ställer in desto längre tid kommer det att ta innan distributionen av last börjar använda nya rutter.
STR_CONFIG_SETTING_LINKGRAPH_INTERVAL :Uppdatera distributionsgrafen var {STRING}:e{NBSP}dag
STR_CONFIG_SETTING_LINKGRAPH_INTERVAL_HELPTEXT :Tid mellan efterföljande omräkningar av länkgrafen. Varje omräkning beräknar planerna för en komponent i grafen. Det medför att ett värde X för den här inställningen inte innebär att hela grafen uppdateras var X:e dag, utan bara vissa komponenter. Ju kortare intervall du ställer in desto mer processorkraft kommer att behövas för beräkningarna. Ju längre intervall du ställer in desto längre tid kommer det att ta innan distributionen av last börjar använda nya rutter.
STR_CONFIG_SETTING_LINKGRAPH_TIME :Avsätt {STRING}{NBSP}dag{P 0:2 "" ar} för omberäkning av distributionsgraf
STR_CONFIG_SETTING_LINKGRAPH_TIME_HELPTEXT :Den tid varje omberäkning av en länkgrafkomponent tillåts ta. När en omberäkning startas skapas en tråd som tillåts löpa detta antal dagar. Ju kortare du sätter denna, desto mer troligt är det att tråden inte är hinner bli färdig i tid. Då kommer spelet att stanna tills den är klar (vilket gör att det laggar). Ju längre du sätter denna, desto längre tid tar det för distributionen att uppdateras när rutter ändras.
STR_CONFIG_SETTING_DISTRIBUTION_MANUAL :manuellt
@ -1769,7 +1778,7 @@ STR_CONFIG_SETTING_LOCALISATION :{ORANGE}Lokalis
STR_CONFIG_SETTING_GRAPHICS :{ORANGE}Grafik
STR_CONFIG_SETTING_SOUND :{ORANGE}Ljud
STR_CONFIG_SETTING_INTERFACE :{ORANGE}Gränssnitt
STR_CONFIG_SETTING_INTERFACE_GENERAL :{ORANGE}Generelt
STR_CONFIG_SETTING_INTERFACE_GENERAL :{ORANGE}Generellt
STR_CONFIG_SETTING_INTERFACE_VIEWPORTS :{ORANGE}Vyfönster
STR_CONFIG_SETTING_INTERFACE_CONSTRUCTION :{ORANGE}Konstruktion
STR_CONFIG_SETTING_ADVISORS :{ORANGE} Nyheter / Rådgivare
@ -2004,7 +2013,7 @@ STR_NETWORK_SERVER_LIST_GAME_NAME :{BLACK}Namn
STR_NETWORK_SERVER_LIST_GAME_NAME_TOOLTIP :{BLACK}Namn på nätverksspelet
STR_NETWORK_SERVER_LIST_GENERAL_ONLINE :{BLACK}{COMMA}/{COMMA} - {COMMA}/{COMMA}
STR_NETWORK_SERVER_LIST_CLIENTS_CAPTION :{BLACK}Klienter
STR_NETWORK_SERVER_LIST_CLIENTS_CAPTION_TOOLTIP :{BLACK}Klienter online / klienter max{}Företag online / företag max
STR_NETWORK_SERVER_LIST_CLIENTS_CAPTION_TOOLTIP :{BLACK}Klienter online / max antal klienter{}Företag online / max antal företag
STR_NETWORK_SERVER_LIST_MAP_SIZE_SHORT :{BLACK}{COMMA}x{COMMA}
STR_NETWORK_SERVER_LIST_MAP_SIZE_CAPTION :{BLACK}Kartstorlek
STR_NETWORK_SERVER_LIST_MAP_SIZE_CAPTION_TOOLTIP :{BLACK}Kartstorlek av spelet{}Klicka för att sortera efter område
@ -2150,6 +2159,7 @@ STR_NETWORK_CLIENT_LIST_NEW_COMPANY :(Nytt företag)
STR_NETWORK_CLIENT_LIST_NEW_COMPANY_TOOLTIP :{BLACK}Skapa ett nytt företag och gå med i det
STR_NETWORK_CLIENT_LIST_PLAYER_ICON_SELF_TOOLTIP :{BLACK}Det här är du
STR_NETWORK_CLIENT_LIST_PLAYER_ICON_HOST_TOOLTIP :{BLACK}Det här är spelets värd
STR_NETWORK_CLIENT_LIST_CLIENT_COMPANY_COUNT :{BLACK}{NUM} klient{P "" er} / {NUM} företag
STR_NETWORK_CLIENT_LIST_ADMIN_CLIENT_KICK :Kasta ut
STR_NETWORK_CLIENT_LIST_ADMIN_CLIENT_BAN :Bannlys
@ -2252,10 +2262,10 @@ STR_NETWORK_ERROR_CLIENT_GUI_LOST_CONNECTION :{WHITE}De senas
# Network related errors
STR_NETWORK_SERVER_MESSAGE :*** {1:STRING}
############ Leave those lines in this order!!
STR_NETWORK_SERVER_MESSAGE_GAME_PAUSED :Spel pausad ({STRING})
STR_NETWORK_SERVER_MESSAGE_GAME_PAUSED :Spelet är pausat ({STRING})
STR_NETWORK_SERVER_MESSAGE_GAME_STILL_PAUSED_1 :Spelet är fortfarande pausat ({STRING})
STR_NETWORK_SERVER_MESSAGE_GAME_STILL_PAUSED_2 :Spel fortfarande pausad ({STRING}, {STRING})
STR_NETWORK_SERVER_MESSAGE_GAME_STILL_PAUSED_3 :Spel fortfarande pausad ({STRING}, {STRING}, {STRING})
STR_NETWORK_SERVER_MESSAGE_GAME_STILL_PAUSED_2 :Spelet är fortfarande pausat ({STRING}, {STRING})
STR_NETWORK_SERVER_MESSAGE_GAME_STILL_PAUSED_3 :Spelet är fortfarande pausat ({STRING}, {STRING}, {STRING})
STR_NETWORK_SERVER_MESSAGE_GAME_STILL_PAUSED_4 :Spelet är fortfarande pausat ({STRING}, {STRING}, {STRING}, {STRING})
STR_NETWORK_SERVER_MESSAGE_GAME_STILL_PAUSED_5 :Spelet är fortfarande pausat ({STRING}, {STRING}, {STRING}, {STRING}, {STRING})
STR_NETWORK_SERVER_MESSAGE_GAME_UNPAUSED :Spelet är opausat ({STRING})
@ -2263,11 +2273,11 @@ STR_NETWORK_SERVER_MESSAGE_GAME_REASON_NOT_ENOUGH_PLAYERS :antal spelare
STR_NETWORK_SERVER_MESSAGE_GAME_REASON_CONNECTING_CLIENTS :ansluter klienter
STR_NETWORK_SERVER_MESSAGE_GAME_REASON_MANUAL :manuell
STR_NETWORK_SERVER_MESSAGE_GAME_REASON_GAME_SCRIPT :spelskript
STR_NETWORK_SERVER_MESSAGE_GAME_REASON_LINK_GRAPH :Väntar på updatering av länkdiagram
STR_NETWORK_SERVER_MESSAGE_GAME_REASON_LINK_GRAPH :väntar på uppdatering av länkgraf
############ End of leave-in-this-order
STR_NETWORK_MESSAGE_CLIENT_LEAVING :lämnar
STR_NETWORK_MESSAGE_CLIENT_JOINED :*** {STRING} har gått med i spelet
STR_NETWORK_MESSAGE_CLIENT_JOINED_ID :*** {STRING} har gått med i spelet (Client #{2:NUM})
STR_NETWORK_MESSAGE_CLIENT_JOINED_ID :*** {STRING} har gått med i spelet (Klient #{2:NUM})
STR_NETWORK_MESSAGE_CLIENT_COMPANY_JOIN :*** {STRING} har gått med i företag #{2:NUM}
STR_NETWORK_MESSAGE_CLIENT_COMPANY_SPECTATE :*** {STRING} har gått med som åskådare
STR_NETWORK_MESSAGE_CLIENT_COMPANY_NEW :*** {STRING} har startat ett nytt företag (#{2:NUM})
@ -2663,7 +2673,7 @@ STR_FUND_INDUSTRY_REMOVE_ALL_INDUSTRIES_CAPTION :{WHITE}Ta bort
STR_FUND_INDUSTRY_REMOVE_ALL_INDUSTRIES_QUERY :{YELLOW}Är du säker på att du vill ta bort alla industrier?
# Industry cargoes window
STR_INDUSTRY_CARGOES_INDUSTRY_CAPTION :{WHITE}Industrikedja för {STRING} industrin
STR_INDUSTRY_CARGOES_INDUSTRY_CAPTION :{WHITE}Industrikedja för industrin {STRING}
STR_INDUSTRY_CARGOES_CARGO_CAPTION :{WHITE}Industrikedja för godset {STRING}
STR_INDUSTRY_CARGOES_PRODUCERS :{WHITE}Producerande industrier
STR_INDUSTRY_CARGOES_CUSTOMERS :{WHITE}Mottagande industrier
@ -2911,9 +2921,9 @@ STR_MAPGEN_SNOW_COVERAGE :{BLACK}Snötäc
STR_MAPGEN_SNOW_COVERAGE_UP :{BLACK}Öka snötäckning med tio procent
STR_MAPGEN_SNOW_COVERAGE_DOWN :{BLACK}Minska snötäckning med tio procent
STR_MAPGEN_SNOW_COVERAGE_TEXT :{BLACK}{NUM}%
STR_MAPGEN_DESERT_COVERAGE :{BLACK}Öken täckning:
STR_MAPGEN_DESERT_COVERAGE :{BLACK}Ökentäckning:
STR_MAPGEN_DESERT_COVERAGE_UP :{BLACK}Öka ökentäckning med tio procent
STR_MAPGEN_DESERT_COVERAGE_DOWN :{BLACK}Minska öken täckning med tio procent
STR_MAPGEN_DESERT_COVERAGE_DOWN :{BLACK}Minska ökentäckning med tio procent
STR_MAPGEN_DESERT_COVERAGE_TEXT :{BLACK}{NUM}%
STR_MAPGEN_SNOW_LINE_HEIGHT :{BLACK}Snögränsens höjd:
STR_MAPGEN_SNOW_LINE_UP :{BLACK}Höj snögränsens höjd ett steg
@ -2936,9 +2946,9 @@ STR_MAPGEN_BORDER_FREEFORM :{BLACK}Fri form
STR_MAPGEN_BORDER_WATER :{BLACK}Vatten
STR_MAPGEN_BORDER_RANDOM :{BLACK}På måfå
STR_MAPGEN_BORDER_RANDOMIZE :{BLACK}På måfå
STR_MAPGEN_BORDER_MANUAL :{BLACK}Manuell
STR_MAPGEN_BORDER_MANUAL :{BLACK}Manuella
STR_MAPGEN_HEIGHTMAP_ROTATION :{BLACK}Rotation på höjdkarta:
STR_MAPGEN_HEIGHTMAP_ROTATION :{BLACK}Höjdkartans rotation:
STR_MAPGEN_HEIGHTMAP_NAME :{BLACK}Namn på höjdkarta:
STR_MAPGEN_HEIGHTMAP_SIZE_LABEL :{BLACK}Storlek:
STR_MAPGEN_HEIGHTMAP_SIZE :{ORANGE}{NUM} x {NUM}
@ -2946,7 +2956,7 @@ STR_MAPGEN_HEIGHTMAP_SIZE :{ORANGE}{NUM} x
STR_MAPGEN_TERRAIN_TYPE_QUERY_CAPT :{WHITE}Måltopp höjd
STR_MAPGEN_HEIGHTMAP_HEIGHT_QUERY_CAPT :{WHITE}Högsta höjdpunkt
STR_MAPGEN_SNOW_COVERAGE_QUERY_CAPT :{WHITE}Snötäckning (i %)
STR_MAPGEN_DESERT_COVERAGE_QUERY_CAPT :{WHITE}Öken täckning (i %)
STR_MAPGEN_DESERT_COVERAGE_QUERY_CAPT :{WHITE}Ökentäckning (i %)
STR_MAPGEN_SNOW_LINE_QUERY_CAPT :{WHITE}Ändra snögränsens höjd
STR_MAPGEN_START_DATE_QUERY_CAPT :{WHITE}Ändra Startår
@ -3231,7 +3241,7 @@ STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_MEDIUM_ADVERTISING :{YELLOW}Starta
STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_LARGE_ADVERTISING :{YELLOW}Starta en stor lokal reklamkampanj, för att attrahera fler passagerare och gods till dina transporttjänster.{}Tillhandahåller en temporär boost till stationens betyg i en stor radie runt stadens centrum.{}Kostnad: {CURRENCY_LONG}
STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_ROAD_RECONSTRUCTION :{YELLOW}Bekosta ombyggnad av stadens vägnätverk.{}Orsakar ansenliga störningar för vägtrafik i upp till 6 månader.{}Kostnad: {CURRENCY_LONG}
STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_STATUE_OF_COMPANY :{YELLOW}Bygg en staty i ditt företags ära.{}Tillhandahåller en permanent boost till stations betyg i staden.{}Cost: {CURRENCY_LONG}
STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_NEW_BUILDINGS :{YELLOW}Bekosta uppbyggnad av nya byggnader i staden.{}Tillhandahåller en temporär boost till stadens tillväxt.{}Kostnad: {CURRENCY_LONG}
STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_NEW_BUILDINGS :{YELLOW}Bekosta uppbyggnad av nya byggnader i staden.{}Ger en temporär boost till stadens tillväxt.{}Kostnad: {CURRENCY_LONG}
STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_EXCLUSIVE_TRANSPORT :{YELLOW}Köp 1 års exklusiva transport rättigheter i staden.{}Lokala myndigheterna kommer inte tillåta passagerare och gods att använda dina motståndares stationer.{}Cost: {CURRENCY_LONG}
STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_BRIBE :{YELLOW} Muta de lokala myndigheterna för att öka din värdering, med risk för att få höga böter om du blir upptäckt.{} Kostnad: {CURRENCY_LONG}
@ -3586,7 +3596,7 @@ STR_BUY_VEHICLE_TRAIN_ELRAIL_CAPTION :Nya elektriska
STR_BUY_VEHICLE_TRAIN_MONORAIL_CAPTION :Nytt monorailfordon
STR_BUY_VEHICLE_TRAIN_MAGLEV_CAPTION :Nytt maglevfordon
STR_BUY_VEHICLE_ROAD_VEHICLE_CAPTION :Nytt Vägfordon
STR_BUY_VEHICLE_ROAD_VEHICLE_CAPTION :Nytt vägfordon
STR_BUY_VEHICLE_TRAM_VEHICLE_CAPTION :Nya spårvägsfordon
############ range for vehicle availability starts
@ -4217,12 +4227,12 @@ STR_AI_DEBUG_SETTINGS :{BLACK}Inställ
STR_AI_DEBUG_SETTINGS_TOOLTIP :{BLACK}Ändra inställningarna för spelskriptet
STR_AI_DEBUG_RELOAD :{BLACK}Ladda om datorspelaren
STR_AI_DEBUG_RELOAD_TOOLTIP :{BLACK}Stoppa datorspelaren, ladda om skriptet och starta sedan om datorspelaren
STR_AI_DEBUG_BREAK_STR_ON_OFF_TOOLTIP :{BLACK}Slå på/av brytning då AI-loggmeddelande matchar brytsträngen
STR_AI_DEBUG_BREAK_STR_ON_OFF_TOOLTIP :{BLACK}Slå på/av brytning då datorspelares loggmeddelande matchar brytsträngen
STR_AI_DEBUG_BREAK_ON_LABEL :{BLACK}Bryt på:
STR_AI_DEBUG_BREAK_STR_OSKTITLE :{BLACK}Bryt på
STR_AI_DEBUG_BREAK_STR_TOOLTIP :{BLACK}När ett AI-loggmeddelande matchar angiven sträng så kommer spelet att pausas
STR_AI_DEBUG_BREAK_STR_TOOLTIP :{BLACK}När ett loggmeddelande om datorspelare matchar angiven sträng så kommer spelet att pausas
STR_AI_DEBUG_MATCH_CASE :{BLACK}Matcha VERSALER/gemener
STR_AI_DEBUG_MATCH_CASE_TOOLTIP :{BLACK}Slå på/av matchning av VERSALER/gemener när AI-loggmeddelanden jämförs mot brytsträngen
STR_AI_DEBUG_MATCH_CASE_TOOLTIP :{BLACK}Slå på/av matchning av VERSALER/gemener när datorspelares loggmeddelanden jämförs mot brytsträngen
STR_AI_DEBUG_CONTINUE :{BLACK}Fortsätt
STR_AI_DEBUG_CONTINUE_TOOLTIP :{BLACK}Opausa och fortsätt datorspelaren
STR_AI_DEBUG_SELECT_AI_TOOLTIP :{BLACK}Visa debug-utskrifter för denna datorspelare

@ -339,7 +339,7 @@ struct MainWindow : Window
case GHK_REFRESH_SCREEN: MarkWholeScreenDirty(); break;
case GHK_CRASH: // Crash the game
*(volatile byte *)0 = 0;
*(volatile byte *)nullptr = 0;
break;
case GHK_MONEY: // Gimme money

@ -45,7 +45,7 @@ TCPConnecter::~TCPConnecter()
this->sockets.clear();
this->sock_to_address.clear();
freeaddrinfo(this->ai);
if (this->ai != nullptr) freeaddrinfo(this->ai);
}
/**
@ -268,7 +268,7 @@ bool TCPConnecter::CheckActivity()
timeval tv;
tv.tv_usec = 0;
tv.tv_sec = 0;
int n = select(FD_SETSIZE, NULL, &write_fd, NULL, &tv);
int n = select(FD_SETSIZE, nullptr, &write_fd, nullptr, &tv);
/* select() failed; hopefully next try it doesn't. */
if (n < 0) {
/* select() normally never fails; so hopefully it works next try! */

@ -825,7 +825,7 @@ bool NetworkClientConnectGame(const std::string &connection_string, CompanyID de
std::string resolved_connection_string = ParseGameConnectionString(connection_string, NETWORK_DEFAULT_PORT, &join_as).GetAddressAsString(false);
if (!_network_available) return false;
if (!NetworkValidateClientName()) return false;
if (!NetworkValidateOurClientName()) return false;
_network_join.connection_string = resolved_connection_string;
_network_join.company = join_as;

@ -1561,7 +1561,7 @@ bool NetworkValidateClientName(std::string &client_name)
* See \c NetworkValidateClientName(char*) for details about the functionality.
* @return True iff the client name is valid.
*/
bool NetworkValidateClientName()
bool NetworkValidateOurClientName()
{
return NetworkValidateClientName(_settings_client.network.client_name);
}

@ -201,7 +201,7 @@ void NetworkSyncCommandQueue(NetworkClientSocket *cs)
{
for (CommandPacket *p = _local_execution_queue.Peek(); p != nullptr; p = p->next) {
CommandPacket c = *p;
c.callback = 0;
c.callback = nullptr;
cs->outgoing_queue.Append(std::move(c));
}
}

@ -36,7 +36,7 @@ extern StringList _network_ban_list;
byte NetworkSpectatorCount();
bool NetworkIsValidClientName(const std::string_view client_name);
bool NetworkValidateClientName();
bool NetworkValidateOurClientName();
bool NetworkValidateClientName(std::string &client_name);
bool NetworkValidateServerName(std::string &server_name);
void NetworkUpdateClientName(const std::string &client_name);

@ -1278,7 +1278,7 @@ static WindowDesc _network_start_server_window_desc(
static void ShowNetworkStartServerWindow()
{
if (!NetworkValidateClientName()) return;
if (!NetworkValidateOurClientName()) return;
DeleteWindowById(WC_NETWORK_WINDOW, WN_NETWORK_WINDOW_GAME);
DeleteWindowById(WC_NETWORK_WINDOW, WN_NETWORK_WINDOW_LOBBY);
@ -1572,7 +1572,7 @@ static WindowDesc _network_lobby_window_desc(
*/
static void ShowNetworkLobbyWindow(NetworkGameList *ngl)
{
if (!NetworkValidateClientName()) return;
if (!NetworkValidateOurClientName()) return;
DeleteWindowById(WC_NETWORK_WINDOW, WN_NETWORK_WINDOW_START);
DeleteWindowById(WC_NETWORK_WINDOW, WN_NETWORK_WINDOW_GAME);
@ -1642,7 +1642,10 @@ static const NWidgetPart _nested_client_list_widgets[] = {
EndContainer(),
EndContainer(),
NWidget(NWID_HORIZONTAL),
NWidget(WWT_MATRIX, COLOUR_GREY, WID_CL_MATRIX), SetMinimalSize(180, 0), SetResize(1, 1), SetFill(1, 1), SetMatrixDataTip(1, 0, STR_NULL), SetScrollbar(WID_CL_SCROLLBAR),
NWidget(NWID_VERTICAL),
NWidget(WWT_MATRIX, COLOUR_GREY, WID_CL_MATRIX), SetMinimalSize(180, 0), SetResize(1, 1), SetFill(1, 1), SetMatrixDataTip(1, 0, STR_NULL), SetScrollbar(WID_CL_SCROLLBAR),
NWidget(WWT_TEXT, COLOUR_GREY, WID_CL_CLIENT_COMPANY_COUNT), SetFill(1, 0), SetMinimalTextLines(1, 0), SetResize(1, 0), SetPadding(2, 1, 2, 1), SetAlignment(SA_CENTER), SetDataTip(STR_NETWORK_CLIENT_LIST_CLIENT_COMPANY_COUNT, STR_NULL),
EndContainer(),
NWidget(NWID_VERTICAL),
NWidget(NWID_VSCROLLBAR, COLOUR_GREY, WID_CL_SCROLLBAR),
NWidget(WWT_RESIZEBOX, COLOUR_GREY),
@ -2065,6 +2068,11 @@ public:
case WID_CL_CLIENT_NAME:
SetDParamStr(0, _settings_client.network.client_name);
break;
case WID_CL_CLIENT_COMPANY_COUNT:
SetDParam(0, NetworkClientInfo::GetNumItems());
SetDParam(1, Company::GetNumItems());
break;
}
}

@ -309,7 +309,7 @@ bool Convert8bitBooleanCallback(const struct GRFFile *grffile, uint16 cbid, uint
*/
template <size_t Tcnt>
struct GRFFilePropsBase {
GRFFilePropsBase() : local_id(0), grffile(0)
GRFFilePropsBase() : local_id(0), grffile(nullptr)
{
/* The lack of some compilers to provide default constructors complying to the specs
* requires us to zero the stuff ourself. */

@ -15,7 +15,7 @@
#include "station_type.h"
#include "industry_type.h"
void AddNewsItem(StringID string, NewsType type, NewsFlag flags, NewsReferenceType reftype1 = NR_NONE, uint32 ref1 = UINT32_MAX, NewsReferenceType reftype2 = NR_NONE, uint32 ref2 = UINT32_MAX, void *free_data = nullptr);
void AddNewsItem(StringID string, NewsType type, NewsFlag flags, NewsReferenceType reftype1 = NR_NONE, uint32 ref1 = UINT32_MAX, NewsReferenceType reftype2 = NR_NONE, uint32 ref2 = UINT32_MAX, const NewsAllocatedData *data = nullptr);
static inline void AddCompanyNewsItem(StringID string, CompanyNewsInformation *cni)
{
@ -42,9 +42,9 @@ static inline void AddVehicleAdviceNewsItem(StringID string, VehicleID vehicle)
AddNewsItem(string, NT_ADVICE, NF_INCOLOUR | NF_SMALL | NF_VEHICLE_PARAM0, NR_VEHICLE, vehicle);
}
static inline void AddTileNewsItem(StringID string, NewsType type, TileIndex tile, void *free_data = nullptr, StationID station = INVALID_STATION)
static inline void AddTileNewsItem(StringID string, NewsType type, TileIndex tile, const NewsAllocatedData *data = nullptr, StationID station = INVALID_STATION)
{
AddNewsItem(string, type, NF_NO_TRANSPARENT | NF_SHADE | NF_THIN, NR_TILE, tile, station == INVALID_STATION ? NR_NONE : NR_STATION, station, free_data);
AddNewsItem(string, type, NF_NO_TRANSPARENT | NF_SHADE | NF_THIN, NR_TILE, tile, station == INVALID_STATION ? NR_NONE : NR_STATION, station, data);
}
static inline void AddIndustryNewsItem(StringID string, NewsType type, IndustryID industry)

@ -355,7 +355,7 @@ struct NewsWindow : Window {
break;
case WID_N_MGR_NAME:
SetDParamStr(0, static_cast<const CompanyNewsInformation *>(this->ni->free_data)->president_name);
SetDParamStr(0, static_cast<const CompanyNewsInformation *>(this->ni->data.get())->president_name);
str = STR_JUST_RAW_STRING;
break;
@ -433,13 +433,13 @@ struct NewsWindow : Window {
break;
case WID_N_MGR_FACE: {
const CompanyNewsInformation *cni = (const CompanyNewsInformation*)this->ni->free_data;
const CompanyNewsInformation *cni = static_cast<const CompanyNewsInformation*>(this->ni->data.get());
DrawCompanyManagerFace(cni->face, cni->colour, r.left, r.top);
GfxFillRect(r.left, r.top, r.right, r.bottom, PALETTE_NEWSPAPER, FILLRECT_RECOLOUR);
break;
}
case WID_N_MGR_NAME: {
const CompanyNewsInformation *cni = (const CompanyNewsInformation*)this->ni->free_data;
const CompanyNewsInformation *cni = static_cast<const CompanyNewsInformation*>(this->ni->data.get());
SetDParamStr(0, cni->president_name);
DrawStringMultiLine(r.left, r.right, r.top, r.bottom, STR_JUST_RAW_STRING, TC_FROMSTRING, SA_CENTER);
break;
@ -642,8 +642,7 @@ static bool ReadyForNextTickerItem()
/* Ticker message
* Check if the status bar message is still being displayed? */
if (IsNewsTickerShown()) return false;
return true;
return !IsNewsTickerShown();
}
/**
@ -774,6 +773,27 @@ static void DeleteNewsItem(NewsItem *ni)
SetWindowDirty(WC_MESSAGE_HISTORY, 0);
}
/**
* Create a new newsitem to be shown.
* @param string_id String to display.
* @param type The type of news.
* @param flags Flags related to how to display the news.
* @param reftype1 Type of ref1.
* @param ref1 Reference 1 to some object: Used for a possible viewport, scrolling after clicking on the news, and for deleting the news when the object is deleted.
* @param reftype2 Type of ref2.
* @param ref2 Reference 2 to some object: Used for scrolling after clicking on the news, and for deleting the news when the object is deleted.
* @param data Pointer to data that must be released once the news message is cleared.
*
* @see NewsSubtype
*/
NewsItem::NewsItem(StringID string_id, NewsType type, NewsFlag flags, NewsReferenceType reftype1, uint32 ref1, NewsReferenceType reftype2, uint32 ref2, const NewsAllocatedData *data) :
string_id(string_id), date(_date), type(type), flags(flags), reftype1(reftype1), reftype2(reftype2), ref1(ref1), ref2(ref2), data(data)
{
/* show this news message in colour? */
if (_cur_year >= _settings_client.gui.coloured_news_year) this->flags |= NF_INCOLOUR;
CopyOutDParam(this->params, 0, lengthof(this->params));
}
/**
* Add a new newsitem to be shown.
* @param string String to display
@ -783,31 +803,16 @@ static void DeleteNewsItem(NewsItem *ni)
* @param ref1 Reference 1 to some object: Used for a possible viewport, scrolling after clicking on the news, and for deleting the news when the object is deleted.
* @param reftype2 Type of ref2
* @param ref2 Reference 2 to some object: Used for scrolling after clicking on the news, and for deleting the news when the object is deleted.
* @param free_data Pointer to data that must be freed once the news message is cleared
* @param data Pointer to data that must be released once the news message is cleared.
*
* @see NewsSubtype
*/
void AddNewsItem(StringID string, NewsType type, NewsFlag flags, NewsReferenceType reftype1, uint32 ref1, NewsReferenceType reftype2, uint32 ref2, void *free_data)
void AddNewsItem(StringID string, NewsType type, NewsFlag flags, NewsReferenceType reftype1, uint32 ref1, NewsReferenceType reftype2, uint32 ref2, const NewsAllocatedData *data)
{
if (_game_mode == GM_MENU) return;
/* Create new news item node */
NewsItem *ni = new NewsItem;
ni->string_id = string;
ni->type = type;
ni->flags = flags;
/* show this news message in colour? */
if (_cur_year >= _settings_client.gui.coloured_news_year) ni->flags |= NF_INCOLOUR;
ni->reftype1 = reftype1;
ni->reftype2 = reftype2;
ni->ref1 = ref1;
ni->ref2 = ref2;
ni->free_data = free_data;
ni->date = _date;
CopyOutDParam(ni->params, 0, lengthof(ni->params));
NewsItem *ni = new NewsItem(string, type, flags, reftype1, ref1, reftype2, ref2, data);
if (_total_news++ == 0) {
assert(_oldest_news == nullptr);
@ -886,8 +891,8 @@ CommandCost CmdCustomNewsItem(TileIndex tile, DoCommandFlag flags, uint32 p1, ui
if (company != INVALID_OWNER && company != _local_company) return CommandCost();
if (flags & DC_EXEC) {
char *news = stredup(text);
SetDParamStr(0, news);
NewsStringData *news = new NewsStringData(text);
SetDParamStr(0, news->string);
AddNewsItem(STR_NEWS_CUSTOM_ITEM, type, NF_NORMAL, reftype1, p2, NR_NONE, UINT32_MAX, news);
}

@ -115,6 +115,12 @@ struct NewsTypeData {
NewsDisplay GetDisplay() const;
};
/** Container for any custom data that must be deleted after the news item has reached end-of-life. */
struct NewsAllocatedData {
virtual ~NewsAllocatedData() {}
};
/** Information about a single item of news. */
struct NewsItem {
NewsItem *prev; ///< Previous news item
@ -129,14 +135,17 @@ struct NewsItem {
uint32 ref1; ///< Reference 1 to some object: Used for a possible viewport, scrolling after clicking on the news, and for deleting the news when the object is deleted.
uint32 ref2; ///< Reference 2 to some object: Used for scrolling after clicking on the news, and for deleting the news when the object is deleted.
void *free_data; ///< Data to be freed when the news item has reached its end.
~NewsItem()
{
free(this->free_data);
}
std::unique_ptr<const NewsAllocatedData> data; ///< Custom data for the news item that will be deallocated (deleted) when the news item has reached its end.
uint64 params[10]; ///< Parameters for string resolving.
NewsItem(StringID string_id, NewsType type, NewsFlag flags, NewsReferenceType reftype1, uint32 ref1, NewsReferenceType reftype2, uint32 ref2, const NewsAllocatedData *data);
};
/** Container for a single string to be passed as NewsAllocatedData. */
struct NewsStringData : NewsAllocatedData {
std::string string; ///< The string to retain.
NewsStringData(const std::string &str) : string(str) {}
};
/**
@ -145,15 +154,15 @@ struct NewsItem {
* of the companies and the fact that the company data is reset,
* resulting in wrong names and such.
*/
struct CompanyNewsInformation {
char company_name[64]; ///< The name of the company
char president_name[64]; ///< The name of the president
char other_company_name[64]; ///< The name of the company taking over this one
struct CompanyNewsInformation : NewsAllocatedData {
std::string company_name; ///< The name of the company
std::string president_name; ///< The name of the president
std::string other_company_name; ///< The name of the company taking over this one
uint32 face; ///< The face of the president
byte colour; ///< The colour related to the company
void FillData(const struct Company *c, const struct Company *other = nullptr);
CompanyNewsInformation(const struct Company *c, const struct Company *other = nullptr);
};
#endif /* NEWS_TYPE_H */

@ -191,13 +191,13 @@ const char *GetCurrentLocale(const char *)
bool GetClipboardContents(char *buffer, const char *last)
{
NSPasteboard *pb = [ NSPasteboard generalPasteboard ];
NSArray *types = [ NSArray arrayWithObject:NSStringPboardType ];
NSArray *types = [ NSArray arrayWithObject:NSPasteboardTypeString ];
NSString *bestType = [ pb availableTypeFromArray:types ];
/* Clipboard has no text data available. */
if (bestType == nil) return false;
NSString *string = [ pb stringForType:NSStringPboardType ];
NSString *string = [ pb stringForType:NSPasteboardTypeString ];
if (string == nil || [ string length ] == 0) return false;
strecpy(buffer, [ string UTF8String ], last);

@ -27,6 +27,10 @@
#define HAVE_OSX_1011_SDK
#endif
#ifdef MAC_OS_X_VERSION_10_12
#define HAVE_OSX_1012_SDK
#endif
/* It would seem that to ensure backward compatibility we have to ensure that we have defined MAC_OS_X_VERSION_10_x everywhere */
#ifndef MAC_OS_X_VERSION_10_3
#define MAC_OS_X_VERSION_10_3 1030

@ -51,10 +51,10 @@ FT_Error GetFontByFaceName(const char *font_name, FT_Face *face)
/* Resolve the name and populate the information structure */
pat = FcNameParse((FcChar8 *)font_family);
if (font_style != nullptr) FcPatternAddString(pat, FC_STYLE, (FcChar8 *)font_style);
FcConfigSubstitute(0, pat, FcMatchPattern);
FcConfigSubstitute(nullptr, pat, FcMatchPattern);
FcDefaultSubstitute(pat);
fs = FcFontSetCreate();
match = FcFontMatch(0, pat, &result);
match = FcFontMatch(nullptr, pat, &result);
if (fs != nullptr && match != nullptr) {
int i;

@ -278,7 +278,7 @@ bool GetClipboardContents(char *buffer, const char *last)
}
char *clip = SDL_GetClipboardText();
if (clip != NULL) {
if (clip != nullptr) {
strecpy(buffer, clip, last);
SDL_free(clip);
return true;

@ -817,9 +817,7 @@ static bool CanEnterTile(TileIndex tile, DiagDirection dir, AyStarUserData *user
/* Depots, standard roadstops and single tram bits can only be entered from one direction */
DiagDirection single_entry = GetTileSingleEntry(tile, user->type, user->subtype);
if (single_entry != INVALID_DIAGDIR && single_entry != ReverseDiagDir(dir)) return false;
return true;
return single_entry == INVALID_DIAGDIR || single_entry == ReverseDiagDir(dir);
}
/**

@ -825,7 +825,7 @@ bool AfterLoadGame()
if (IsSavegameVersionBefore(SLV_6, 1)) _settings_game.pf.forbid_90_deg = false;
if (IsSavegameVersionBefore(SLV_21)) _settings_game.vehicle.train_acceleration_model = 0;
if (IsSavegameVersionBefore(SLV_90)) _settings_game.vehicle.plane_speed = 4;
if (IsSavegameVersionBefore(SLV_95)) _settings_game.vehicle.dynamic_engines = 0;
if (IsSavegameVersionBefore(SLV_95)) _settings_game.vehicle.dynamic_engines = false;
if (IsSavegameVersionBefore(SLV_96)) _settings_game.economy.station_noise_level = false;
if (IsSavegameVersionBefore(SLV_133)) {
_settings_game.vehicle.train_slope_steepness = 3;

@ -65,7 +65,7 @@ static void Load_AIPL()
while ((index = (CompanyID)SlIterateArray()) != (CompanyID)-1) {
if (index >= MAX_COMPANIES) SlErrorCorrupt("Too many AI configs");
_ai_saveload_is_random = 0;
_ai_saveload_is_random = false;
_ai_saveload_version = -1;
SlObject(nullptr, _ai_company);

@ -468,7 +468,7 @@ int64 ScriptList::Begin()
int64 ScriptList::Next()
{
if (this->initialized == false) {
if (!this->initialized) {
DEBUG(script, 0, "Next() is invalid as Begin() is never called");
return 0;
}
@ -482,7 +482,7 @@ bool ScriptList::IsEmpty()
bool ScriptList::IsEnd()
{
if (this->initialized == false) {
if (!this->initialized) {
DEBUG(script, 0, "IsEnd() is invalid as Begin() is never called");
return true;
}

@ -109,7 +109,7 @@ SQInteger ScriptText::_SetParam(int parameter, HSQUIRRELVM vm)
sq_pop(vm, 3);
/* Get the 'real' instance of this class */
sq_getinstanceup(vm, -1, &real_instance, 0);
sq_getinstanceup(vm, -1, &real_instance, nullptr);
if (real_instance == nullptr) return SQ_ERROR;
ScriptText *value = static_cast<ScriptText *>(real_instance);

@ -273,7 +273,7 @@ void Squirrel::RunError(HSQUIRRELVM vm, const SQChar *error)
SQInteger Squirrel::_RunError(HSQUIRRELVM vm)
{
const SQChar *sErr = 0;
const SQChar *sErr = nullptr;
if (sq_gettop(vm) >= 1) {
if (SQ_SUCCEEDED(sq_getstring(vm, -1, &sErr))) {

@ -190,7 +190,7 @@ public:
* @note This will only work just after a function-call from within Squirrel
* to your C++ function.
*/
static bool GetRealInstance(HSQUIRRELVM vm, SQUserPointer *ptr) { return SQ_SUCCEEDED(sq_getinstanceup(vm, 1, ptr, 0)); }
static bool GetRealInstance(HSQUIRRELVM vm, SQUserPointer *ptr) { return SQ_SUCCEEDED(sq_getinstanceup(vm, 1, ptr, nullptr)); }
/**
* Get the Squirrel-instance pointer.

@ -754,9 +754,9 @@ namespace SQConvert {
sq_pop(vm, 3);
/* Get the 'real' instance of this class */
sq_getinstanceup(vm, 1, &real_instance, 0);
sq_getinstanceup(vm, 1, &real_instance, nullptr);
/* Get the real function pointer */
sq_getuserdata(vm, nparam, &ptr, 0);
sq_getuserdata(vm, nparam, &ptr, nullptr);
if (real_instance == nullptr) return sq_throwerror(vm, "couldn't detect real instance of class for non-static call");
/* Remove the userdata from the stack */
sq_pop(vm, 1);
@ -796,9 +796,9 @@ namespace SQConvert {
sq_pop(vm, 3);
/* Get the 'real' instance of this class */
sq_getinstanceup(vm, 1, &real_instance, 0);
sq_getinstanceup(vm, 1, &real_instance, nullptr);
/* Get the real function pointer */
sq_getuserdata(vm, nparam, &ptr, 0);
sq_getuserdata(vm, nparam, &ptr, nullptr);
if (real_instance == nullptr) return sq_throwerror(vm, "couldn't detect real instance of class for non-static call");
/* Remove the userdata from the stack */
sq_pop(vm, 1);
@ -820,7 +820,7 @@ namespace SQConvert {
SQUserPointer ptr = nullptr;
/* Get the real function pointer */
sq_getuserdata(vm, nparam, &ptr, 0);
sq_getuserdata(vm, nparam, &ptr, nullptr);
try {
/* Delegate it to a template that can handle this specific function */
@ -844,7 +844,7 @@ namespace SQConvert {
SQUserPointer ptr = nullptr;
/* Get the real function pointer */
sq_getuserdata(vm, nparam, &ptr, 0);
sq_getuserdata(vm, nparam, &ptr, nullptr);
/* Remove the userdata from the stack */
sq_pop(vm, 1);

@ -471,7 +471,7 @@ void IntSettingDesc::MakeValueValid(int32 &val) const
uval = (uint32)this->def;
}
}
val = (int32)val;
val = (int32)uval;
return;
}
case SLE_VAR_I64:
@ -893,7 +893,7 @@ static void UpdateConsists(int32 new_value)
}
/* Check service intervals of vehicles, newvalue is value of % or day based servicing */
static void UpdateServiceInterval(int32 new_value)
static void UpdateAllServiceInterval(int32 new_value)
{
bool update_vehicles;
VehicleDefaultSettings *vds;

@ -977,8 +977,7 @@ void BaseSettingEntry::Init(byte level)
bool BaseSettingEntry::IsVisible(const BaseSettingEntry *item) const
{
if (this->IsFiltered()) return false;
if (this == item) return true;
return false;
return this == item;
}
/**

@ -248,9 +248,7 @@ static inline bool CheckAddToTodoSet(TileIndex t1, DiagDirection d1, TileIndex t
assert(!_tbdset.IsIn(t1, d1)); // it really shouldn't be there already
if (_tbdset.Remove(t2, d2)) return false;
return true;
return !_tbdset.Remove(t2, d2);
}

@ -29,9 +29,6 @@
#include <functional>
#include <algorithm>
typedef Pool<BaseStation, StationID, 32, 64000> StationPool;
extern StationPool _station_pool;
static const byte INITIAL_STATION_RATING = 175;
static const uint MAX_EXTRA_STATION_NAMES = 1024;

@ -46,7 +46,11 @@ void CDECL strgen_warning(const char *s, ...)
va_start(va, s);
vseprintf(buf, lastof(buf), s, va);
va_end(va);
fprintf(stderr, LINE_NUM_FMT("warning"), _file, _cur_line, buf);
if (_show_todo > 0) {
fprintf(stderr, LINE_NUM_FMT("warning"), _file, _cur_line, buf);
} else {
fprintf(stderr, LINE_NUM_FMT("info"), _file, _cur_line, buf);
}
_warnings++;
}

@ -818,9 +818,13 @@ void StringReader::ParseFile()
char buf[2048];
_warnings = _errors = 0;
_translation = this->master || this->translation;
_translation = this->translation;
_file = this->file;
/* Abusing _show_todo to replace "warning" with "info" for translations. */
_show_todo &= 3;
if (!this->translation) _show_todo |= 4;
/* For each new file we parse, reset the genders, and language codes. */
MemSetT(&_lang, 0);
strecpy(_lang.digit_group_separator, ",", lastof(_lang.digit_group_separator));

@ -43,22 +43,19 @@ void Subsidy::AwardTo(CompanyID company)
this->awarded = company;
this->remaining = _settings_game.difficulty.subsidy_duration * MONTHS_IN_YEAR;
char company_name[MAX_LENGTH_COMPANY_NAME_CHARS * MAX_CHAR_LENGTH];
SetDParam(0, company);
GetString(company_name, STR_COMPANY_NAME, lastof(company_name));
char *cn = stredup(company_name);
NewsStringData *company_name = new NewsStringData(GetString(STR_COMPANY_NAME));
/* Add a news item */
std::pair<NewsReferenceType, NewsReferenceType> reftype = SetupSubsidyDecodeParam(this, SubsidyDecodeParamType::NewsAwarded);
InjectDParam(1);
SetDParamStr(0, cn);
SetDParamStr(0, company_name->string);
AddNewsItem(
STR_NEWS_SERVICE_SUBSIDY_AWARDED_HALF + _settings_game.difficulty.subsidy_multiplier,
NT_SUBSIDIES, NF_NORMAL,
reftype.first, this->src, reftype.second, this->dst,
cn
company_name
);
AI::BroadcastNewEvent(new ScriptEventSubsidyAwarded(this->index));
Game::NewEvent(new ScriptEventSubsidyAwarded(this->index));

@ -8,7 +8,7 @@
; company changes them, it changes for all players.
[pre-amble]
static void UpdateServiceInterval(int32 new_value);
static void UpdateAllServiceInterval(int32 new_value);
static bool CanUpdateServiceInterval(VehicleType type, int32 &new_value);
static void UpdateServiceInterval(VehicleType type, int32 new_value);
@ -85,7 +85,7 @@ var = vehicle.servint_ispercent
def = false
str = STR_CONFIG_SETTING_SERVINT_ISPERCENT
strhelp = STR_CONFIG_SETTING_SERVINT_ISPERCENT_HELPTEXT
post_cb = UpdateServiceInterval
post_cb = UpdateAllServiceInterval
[SDT_VAR]
var = vehicle.servint_trains

@ -4091,6 +4091,20 @@ strval = STR_CONFIG_SETTING_AUTOSCROLL_DISABLED
cat = SC_BASIC
[SDTC_VAR]
ifdef = __EMSCRIPTEN__
var = gui.scroll_mode
type = SLE_UINT8
flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_GUI_DROPDOWN
def = 2
min = 0
max = 3
str = STR_CONFIG_SETTING_SCROLLMODE
strhelp = STR_CONFIG_SETTING_SCROLLMODE_HELPTEXT
strval = STR_CONFIG_SETTING_SCROLLMODE_DEFAULT
cat = SC_BASIC
[SDTC_VAR]
ifndef = __EMSCRIPTEN__
var = gui.scroll_mode
type = SLE_UINT8
flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_GUI_DROPDOWN

@ -2274,15 +2274,13 @@ CommandCost CmdFoundTown(TileIndex tile, DoCommandFlag flags, uint32 p1, uint32
SetDParam(0, t->index);
AddTileNewsItem(STR_NEWS_NEW_TOWN_UNSPONSORED, NT_INDUSTRY_OPEN, tile);
} else {
char company_name[MAX_LENGTH_COMPANY_NAME_CHARS * MAX_CHAR_LENGTH];
SetDParam(0, _current_company);
GetString(company_name, STR_COMPANY_NAME, lastof(company_name));
NewsStringData *company_name = new NewsStringData(GetString(STR_COMPANY_NAME));
char *cn = stredup(company_name);
SetDParamStr(0, cn);
SetDParamStr(0, company_name->string);
SetDParam(1, t->index);
AddTileNewsItem(STR_NEWS_NEW_TOWN, NT_INDUSTRY_OPEN, tile, cn);
AddTileNewsItem(STR_NEWS_NEW_TOWN, NT_INDUSTRY_OPEN, tile, company_name);
}
AI::BroadcastNewEvent(new ScriptEventTownFounded(t->index));
Game::NewEvent(new ScriptEventTownFounded(t->index));
@ -3452,15 +3450,13 @@ static CommandCost TownActionRoadRebuild(Town *t, DoCommandFlag flags)
if (flags & DC_EXEC) {
t->road_build_months = 6;
char company_name[MAX_LENGTH_COMPANY_NAME_CHARS * MAX_CHAR_LENGTH];
SetDParam(0, _current_company);
GetString(company_name, STR_COMPANY_NAME, lastof(company_name));
NewsStringData *company_name = new NewsStringData(GetString(STR_COMPANY_NAME));
char *cn = stredup(company_name);
SetDParam(0, t->index);
SetDParamStr(1, cn);
SetDParamStr(1, company_name->string);
AddNewsItem(STR_NEWS_ROAD_REBUILDING, NT_GENERAL, NF_NORMAL, NR_TOWN, t->index, NR_NONE, UINT32_MAX, cn);
AddNewsItem(STR_NEWS_ROAD_REBUILDING, NT_GENERAL, NF_NORMAL, NR_TOWN, t->index, NR_NONE, UINT32_MAX, company_name);
AI::BroadcastNewEvent(new ScriptEventRoadReconstruction((ScriptCompany::CompanyID)(Owner)_current_company, t->index));
Game::NewEvent(new ScriptEventRoadReconstruction((ScriptCompany::CompanyID)(Owner)_current_company, t->index));
}
@ -3597,8 +3593,7 @@ static CommandCost TownActionBuyRights(Town *t, DoCommandFlag flags)
SetWindowClassesDirty(WC_STATION_VIEW);
/* Spawn news message */
CompanyNewsInformation *cni = MallocT<CompanyNewsInformation>(1);
cni->FillData(Company::Get(_current_company));
CompanyNewsInformation *cni = new CompanyNewsInformation(Company::Get(_current_company));
SetDParam(0, STR_NEWS_EXCLUSIVE_RIGHTS_TITLE);
SetDParam(1, STR_NEWS_EXCLUSIVE_RIGHTS_DESCRIPTION);
SetDParam(2, t->index);

@ -12,6 +12,8 @@
#include "../../stdafx.h"
#include "../../os/macosx/macos.h"
#define GL_SILENCE_DEPRECATION
#define Rect OTTDRect
#define Point OTTDPoint
#import <Cocoa/Cocoa.h>
@ -150,7 +152,6 @@ static bool _allowSoftware;
{
if (self = [ super initWithFrame:frameRect ]) {
/* We manage our content updates ourselves. */
self.wantsBestResolutionOpenGLSurface = _allow_hidpi_window ? YES : NO;
self.layerContentsRedrawPolicy = NSViewLayerContentsRedrawOnSetNeedsDisplay;
/* Create backing layer. */

@ -45,6 +45,17 @@
#import <sys/time.h> /* gettimeofday */
#include <array>
/* The 10.12 SDK added new names for some enum constants and
* deprecated the old ones. As there's no functional change in any
* way, just use a define for older SDKs to the old names. */
#ifndef HAVE_OSX_1012_SDK
# define NSEventModifierFlagCommand NSCommandKeyMask
# define NSEventModifierFlagControl NSControlKeyMask
# define NSEventModifierFlagOption NSAlternateKeyMask
# define NSEventModifierFlagShift NSShiftKeyMask
# define NSEventModifierFlagCapsLock NSAlphaShiftKeyMask
#endif
/**
* Important notice regarding all modifications!!!!!!!
* There are certain limitations because the file is objective C++.
@ -360,7 +371,11 @@ bool VideoDriver_Cocoa::MakeWindow(int width, int height)
NSRect contentRect = NSMakeRect(0, 0, width, height);
/* Create main window. */
#ifdef HAVE_OSX_1012_SDK
unsigned int style = NSWindowStyleMaskTitled | NSWindowStyleMaskResizable | NSWindowStyleMaskMiniaturizable | NSWindowStyleMaskClosable;
#else
unsigned int style = NSTitledWindowMask | NSResizableWindowMask | NSMiniaturizableWindowMask | NSClosableWindowMask;
#endif
this->window = [ [ OTTD_CocoaWindow alloc ] initWithContentRect:contentRect styleMask:style backing:NSBackingStoreBuffered defer:NO driver:this ];
if (this->window == nil) {
DEBUG(driver, 0, "Could not create the Cocoa window.");
@ -376,7 +391,7 @@ bool VideoDriver_Cocoa::MakeWindow(int width, int height)
behavior |= NSWindowCollectionBehaviorFullScreenPrimary;
[ this->window setCollectionBehavior:behavior ];
NSButton* fullscreenButton = [ this->window standardWindowButton:NSWindowFullScreenButton ];
NSButton* fullscreenButton = [ this->window standardWindowButton:NSWindowZoomButton ];
[ fullscreenButton setAction:@selector(toggleFullScreen:) ];
[ fullscreenButton setTarget:this->window ];
}
@ -430,7 +445,12 @@ bool VideoDriver_Cocoa::MakeWindow(int width, int height)
*/
bool VideoDriver_Cocoa::PollEvent()
{
NSEvent *event = [ NSApp nextEventMatchingMask:NSAnyEventMask untilDate:[ NSDate distantPast ] inMode:NSDefaultRunLoopMode dequeue:YES ];
#ifdef HAVE_OSX_1012_SDK
NSEventMask mask = NSEventMaskAny;
#else
NSEventMask mask = NSAnyEventMask;
#endif
NSEvent *event = [ NSApp nextEventMatchingMask:mask untilDate:[ NSDate distantPast ] inMode:NSDefaultRunLoopMode dequeue:YES ];
if (event == nil) return false;
@ -446,8 +466,8 @@ void VideoDriver_Cocoa::InputLoop()
bool old_ctrl_pressed = _ctrl_pressed;
bool old_shift_pressed = _shift_pressed;
_ctrl_pressed = ((cur_mods & ( _settings_client.gui.right_mouse_btn_emulation != RMBE_CONTROL ? NSControlKeyMask : NSCommandKeyMask)) != 0) != _invert_ctrl;
_shift_pressed = ((cur_mods & NSShiftKeyMask) != 0) != _invert_shift;
_ctrl_pressed = ((cur_mods & ( _settings_client.gui.right_mouse_btn_emulation != RMBE_CONTROL ? NSEventModifierFlagControl : NSEventModifierFlagCommand)) != 0) != _invert_ctrl;
_shift_pressed = ((cur_mods & NSEventModifierFlagShift) != 0) != _invert_shift;
#if defined(_DEBUG)
this->fast_forward_key_pressed = _shift_pressed;

@ -32,7 +32,6 @@ extern NSString *OTTDMainLaunchGameEngine;
@interface OTTD_CocoaWindow : NSWindow
- (instancetype)initWithContentRect:(NSRect)contentRect styleMask:(NSUInteger)styleMask backing:(NSBackingStoreType)backingType defer:(BOOL)flag driver:(VideoDriver_Cocoa *)drv;
- (void)display;
- (void)setFrame:(NSRect)frameRect display:(BOOL)flag;
@end

@ -37,6 +37,16 @@
/* Table data for key mapping. */
#include "cocoa_keys.h"
/* The 10.12 SDK added new names for some enum constants and
* deprecated the old ones. As there's no functional change in any
* way, just use a define for older SDKs to the old names. */
#ifndef HAVE_OSX_1012_SDK
# define NSEventModifierFlagCommand NSCommandKeyMask
# define NSEventModifierFlagControl NSControlKeyMask
# define NSEventModifierFlagOption NSAlternateKeyMask
# define NSEventModifierFlagShift NSShiftKeyMask
# define NSEventModifierFlagCapsLock NSAlphaShiftKeyMask
#endif
/**
* Important notice regarding all modifications!!!!!!!
@ -135,7 +145,12 @@ static std::vector<WChar> NSStringToUTF32(NSString *s)
[ NSApp stop:self ];
/* Send an empty event to return from the run loop. Without that, application is stuck waiting for an event. */
NSEvent *event = [ NSEvent otherEventWithType:NSApplicationDefined location:NSMakePoint(0, 0) modifierFlags:0 timestamp:0.0 windowNumber:0 context:nil subtype:0 data1:0 data2:0 ];
#ifdef HAVE_OSX_1012_SDK
NSEventType type = NSEventTypeApplicationDefined;
#else
NSEventType type = NSApplicationDefined;
#endif
NSEvent *event = [ NSEvent otherEventWithType:type location:NSMakePoint(0, 0) modifierFlags:0 timestamp:0.0 windowNumber:0 context:nil subtype:0 data1:0 data2:0 ];
[ NSApp postEvent:event atStart:YES ];
}
@ -207,7 +222,7 @@ static void setApplicationMenu()
[ appleMenu addItemWithTitle:title action:@selector(hide:) keyEquivalent:@"h" ];
NSMenuItem *menuItem = [ appleMenu addItemWithTitle:@"Hide Others" action:@selector(hideOtherApplications:) keyEquivalent:@"h" ];
[ menuItem setKeyEquivalentModifierMask:(NSAlternateKeyMask | NSCommandKeyMask) ];
[ menuItem setKeyEquivalentModifierMask:(NSEventModifierFlagOption | NSEventModifierFlagCommand) ];
[ appleMenu addItemWithTitle:@"Show All" action:@selector(unhideAllApplications:) keyEquivalent:@"" ];
@ -329,7 +344,11 @@ void CocoaDialog(const char *title, const char *message, const char *buttonLabel
@autoreleasepool {
NSAlert *alert = [ [ NSAlert alloc ] init ];
#ifdef HAVE_OSX_1012_SDK
[ alert setAlertStyle: NSAlertStyleCritical ];
#else
[ alert setAlertStyle: NSCriticalAlertStyle ];
#endif
[ alert setMessageText:[ NSString stringWithUTF8String:title ] ];
[ alert setInformativeText:[ NSString stringWithUTF8String:message ] ];
[ alert addButtonWithTitle: [ NSString stringWithUTF8String:buttonLabel ] ];
@ -386,23 +405,6 @@ void CocoaDialog(const char *title, const char *message, const char *buttonLabel
return self;
}
/**
* This method fires just before the window deminaturizes from the Dock.
* We'll save the current visible surface, let the window manager redraw any
* UI elements, and restore the surface. This way, no expose event
* is required, and the deminiaturize works perfectly.
*/
- (void)display
{
/* save current visible surface */
[ self cacheImageInRect:[ driver->cocoaview frame ] ];
/* let the window manager redraw controls, border, etc */
[ super display ];
/* restore visible surface */
[ self restoreCachedImage ];
}
/**
* Define the rectangle we draw our window in
*/
@ -536,8 +538,8 @@ void CocoaDialog(const char *title, const char *message, const char *buttonLabel
- (BOOL)emulateRightButton:(NSEvent *)event
{
uint32 keymask = 0;
if (_settings_client.gui.right_mouse_btn_emulation == RMBE_COMMAND) keymask |= NSCommandKeyMask;
if (_settings_client.gui.right_mouse_btn_emulation == RMBE_CONTROL) keymask |= NSControlKeyMask;
if (_settings_client.gui.right_mouse_btn_emulation == RMBE_COMMAND) keymask |= NSEventModifierFlagCommand;
if (_settings_client.gui.right_mouse_btn_emulation == RMBE_CONTROL) keymask |= NSEventModifierFlagControl;
return (event.modifierFlags & keymask) != 0;
}
@ -653,18 +655,18 @@ void CocoaDialog(const char *title, const char *message, const char *buttonLabel
case QZ_RETURN:
case QZ_f:
if (down && (modifiers & NSCommandKeyMask)) {
if (down && (modifiers & NSEventModifierFlagCommand)) {
VideoDriver::GetInstance()->ToggleFullscreen(!_fullscreen);
}
break;
case QZ_v:
if (down && EditBoxInGlobalFocus() && (modifiers & (NSCommandKeyMask | NSControlKeyMask))) {
if (down && EditBoxInGlobalFocus() && (modifiers & (NSEventModifierFlagCommand | NSEventModifierFlagControl))) {
HandleKeypress(WKC_CTRL | 'V', unicode);
}
break;
case QZ_u:
if (down && EditBoxInGlobalFocus() && (modifiers & (NSCommandKeyMask | NSControlKeyMask))) {
if (down && EditBoxInGlobalFocus() && (modifiers & (NSEventModifierFlagCommand | NSEventModifierFlagControl))) {
HandleKeypress(WKC_CTRL | 'U', unicode);
}
break;
@ -676,10 +678,10 @@ void CocoaDialog(const char *title, const char *message, const char *buttonLabel
auto vk = std::find_if(std::begin(_vk_mapping), std::end(_vk_mapping), [=](const CocoaVkMapping &m) { return m.vk_from == keycode; });
uint32 pressed_key = vk != std::end(_vk_mapping) ? vk->map_to : 0;
if (modifiers & NSShiftKeyMask) pressed_key |= WKC_SHIFT;
if (modifiers & NSControlKeyMask) pressed_key |= (_settings_client.gui.right_mouse_btn_emulation != RMBE_CONTROL ? WKC_CTRL : WKC_META);
if (modifiers & NSAlternateKeyMask) pressed_key |= WKC_ALT;
if (modifiers & NSCommandKeyMask) pressed_key |= (_settings_client.gui.right_mouse_btn_emulation != RMBE_CONTROL ? WKC_META : WKC_CTRL);
if (modifiers & NSEventModifierFlagShift) pressed_key |= WKC_SHIFT;
if (modifiers & NSEventModifierFlagControl) pressed_key |= (_settings_client.gui.right_mouse_btn_emulation != RMBE_CONTROL ? WKC_CTRL : WKC_META);
if (modifiers & NSEventModifierFlagOption) pressed_key |= WKC_ALT;
if (modifiers & NSEventModifierFlagCommand) pressed_key |= (_settings_client.gui.right_mouse_btn_emulation != RMBE_CONTROL ? WKC_META : WKC_CTRL);
static bool console = false;
@ -715,7 +717,7 @@ void CocoaDialog(const char *title, const char *message, const char *buttonLabel
case QZ_q:
case QZ_h:
case QZ_m:
if (event.modifierFlags & NSCommandKeyMask) {
if (event.modifierFlags & NSEventModifierFlagCommand) {
[ self interpretKeyEvents:[ NSArray arrayWithObject:event ] ];
}
break;
@ -744,7 +746,7 @@ void CocoaDialog(const char *title, const char *message, const char *buttonLabel
case QZ_q:
case QZ_h:
case QZ_m:
if (event.modifierFlags & NSCommandKeyMask) {
if (event.modifierFlags & NSEventModifierFlagCommand) {
[ self interpretKeyEvents:[ NSArray arrayWithObject:event ] ];
}
break;
@ -765,7 +767,7 @@ void CocoaDialog(const char *title, const char *message, const char *buttonLabel
if (self->_current_mods == newMods) return;
/* Iterate through the bits, testing each against the current modifiers */
for (unsigned int i = 0, bit = NSAlphaShiftKeyMask; bit <= NSCommandKeyMask; bit <<= 1, ++i) {
for (unsigned int i = 0, bit = NSEventModifierFlagCapsLock; bit <= NSEventModifierFlagCommand; bit <<= 1, ++i) {
unsigned int currentMask, newMask;
currentMask = self->_current_mods & bit;

@ -22,6 +22,7 @@
#define GL_GLEXT_PROTOTYPES
#if defined(__APPLE__)
# define GL_SILENCE_DEPRECATION
# include <OpenGL/gl3.h>
#else
# include <GL/gl.h>
@ -146,7 +147,7 @@ GetOGLProcAddressProc GetOGLProcAddress;
*/
const char *FindStringInExtensionList(const char *string, const char *substring)
{
while (1) {
while (true) {
/* Is the extension string present at all? */
const char *pos = strstr(string, substring);
if (pos == nullptr) break;
@ -1309,7 +1310,7 @@ void OpenGLBackend::RenderOglSprite(OpenGLSprite *gl_sprite, PaletteID pal, int
_glPixelStorei(GL_UNPACK_ROW_LENGTH, 0);
_glBufferSubData(GL_PIXEL_UNPACK_BUFFER, 0, 256, GetNonSprite(GB(pal, 0, PALETTE_WIDTH), ST_RECOLOUR) + 1);
_glTexSubImage1D(GL_TEXTURE_1D, 0, 0, 256, GL_RED, GL_UNSIGNED_BYTE, 0);
_glTexSubImage1D(GL_TEXTURE_1D, 0, 0, 256, GL_RED, GL_UNSIGNED_BYTE, nullptr);
_glBindBuffer(GL_PIXEL_UNPACK_BUFFER, 0);

@ -41,11 +41,6 @@
#include "../safeguards.h"
#ifdef __EMSCRIPTEN__
/** Whether we just had a window-enter event. */
static bool _cursor_new_in_window = false;
#endif
static std::string _editing_text;
static void SetTextInputRect();
@ -424,9 +419,9 @@ bool VideoDriver_SDL_Base::CreateMainSurface(uint w, uint h, bool resize)
bool VideoDriver_SDL_Base::ClaimMousePointer()
{
/* Emscripten never claims the pointer, so we do not need to change the cursor visibility. */
#ifndef __EMSCRIPTEN__
SDL_ShowCursor(0);
#ifdef __EMSCRIPTEN__
SDL_SetRelativeMouseMode(SDL_TRUE);
#endif
return true;
}
@ -659,27 +654,9 @@ bool VideoDriver_SDL_Base::PollEvent()
switch (ev.type) {
case SDL_MOUSEMOTION:
#ifdef __EMSCRIPTEN__
if (_cursor_new_in_window) {
/* The cursor just moved into the window; this means we don't
* know the absolutely position yet to move relative from.
* Before this time, SDL didn't know it either, and this is
* why we postpone it till now. Update the absolute position
* for this once, and work relative after. */
_cursor.pos.x = ev.motion.x;
_cursor.pos.y = ev.motion.y;
_cursor.dirty = true;
_cursor_new_in_window = false;
SDL_SetRelativeMouseMode(SDL_TRUE);
} else {
_cursor.UpdateCursorPositionRelative(ev.motion.xrel, ev.motion.yrel);
}
#else
if (_cursor.UpdateCursorPosition(ev.motion.x, ev.motion.y, true)) {
SDL_WarpMouseInWindow(this->sdl_window, _cursor.pos.x, _cursor.pos.y);
}
#endif
HandleMouseEvents();
break;
@ -814,9 +791,7 @@ bool VideoDriver_SDL_Base::PollEvent()
// mouse entered the window, enable cursor
_cursor.in_window = true;
#ifdef __EMSCRIPTEN__
/* Disable relative mouse mode for the first mouse motion,
* so we can pick up the absolutely position again. */
_cursor_new_in_window = true;
/* Ensure pointer lock will not occur. */
SDL_SetRelativeMouseMode(SDL_FALSE);
#endif
} else if (ev.window.event == SDL_WINDOWEVENT_LEAVE) {
@ -857,7 +832,9 @@ static const char *InitializeSDL()
* UpdateWindowSurface() to update the window's texture instead of
* its surface. */
SDL_SetHint(SDL_HINT_FRAMEBUFFER_ACCELERATION, "0");
#ifndef __EMSCRIPTEN__
SDL_SetHint(SDL_HINT_MOUSE_RELATIVE_MODE_WARP, "1");
#endif
/* Check if the video-driver is already initialized. */
if (SDL_WasInit(SDL_INIT_VIDEO) != 0) return nullptr;
@ -926,7 +903,7 @@ void VideoDriver_SDL_Base::Stop()
void VideoDriver_SDL_Base::InputLoop()
{
uint32 mod = SDL_GetModState();
const Uint8 *keys = SDL_GetKeyboardState(NULL);
const Uint8 *keys = SDL_GetKeyboardState(nullptr);
bool old_ctrl_pressed = _ctrl_pressed;
bool old_shift_pressed = _shift_pressed;

@ -106,6 +106,7 @@ enum ClientListWidgets {
WID_CL_MATRIX, ///< Company/client list.
WID_CL_SCROLLBAR, ///< Scrollbar for company/client list.
WID_CL_COMPANY_JOIN, ///< Used for QueryWindow when a company has a password.
WID_CL_CLIENT_COMPANY_COUNT, ///< Count of clients and companies.
};
/** Widgets of the #NetworkJoinStatusWindow class. */

Loading…
Cancel
Save