Merge branch 'master' into jgrpp-beta

# Conflicts:
#	src/saveload/cargopacket_sl.cpp
#	src/saveload/cheat_sl.cpp
#	src/saveload/company_sl.cpp
#	src/saveload/engine_sl.cpp
#	src/saveload/map_sl.cpp
#	src/saveload/order_sl.cpp
#	src/saveload/saveload.cpp
#	src/saveload/saveload.h
#	src/saveload/station_sl.cpp
#	src/saveload/vehicle_sl.cpp
#	src/settings.cpp
#	src/settings_gui.cpp
#	src/settings_internal.h
#	src/stdafx.h
#	src/table/settings/settings.ini
#	src/town_cmd.cpp
#	src/vehicle.cpp
pull/332/head
Jonathan G Rennison 3 years ago
commit ffef1c9e44

@ -835,8 +835,7 @@ public:
nkeys++; nkeys++;
SQInteger val = _fs->PopTarget(); SQInteger val = _fs->PopTarget();
SQInteger key = _fs->PopTarget(); SQInteger key = _fs->PopTarget();
SQInteger attrs = hasattrs ? _fs->PopTarget():-1; [[maybe_unused]] SQInteger attrs = hasattrs ? _fs->PopTarget():-1;
(void)attrs; // assert only
assert((hasattrs && attrs == key-1) || !hasattrs); assert((hasattrs && attrs == key-1) || !hasattrs);
unsigned char flags = (hasattrs?NEW_SLOT_ATTRIBUTES_FLAG:0)|(isstatic?NEW_SLOT_STATIC_FLAG:0); unsigned char flags = (hasattrs?NEW_SLOT_ATTRIBUTES_FLAG:0)|(isstatic?NEW_SLOT_STATIC_FLAG:0);
SQInteger table = _fs->TopTarget(); //<<BECAUSE OF THIS NO COMMON EMIT FUNC IS POSSIBLE SQInteger table = _fs->TopTarget(); //<<BECAUSE OF THIS NO COMMON EMIT FUNC IS POSSIBLE

@ -1471,9 +1471,7 @@ bool SQVM::DeleteSlot(const SQObjectPtr &self,const SQObjectPtr &key,SQObjectPtr
bool SQVM::Call(SQObjectPtr &closure,SQInteger nparams,SQInteger stackbase,SQObjectPtr &outres,SQBool raiseerror,SQBool can_suspend) bool SQVM::Call(SQObjectPtr &closure,SQInteger nparams,SQInteger stackbase,SQObjectPtr &outres,SQBool raiseerror,SQBool can_suspend)
{ {
#ifdef WITH_ASSERT [[maybe_unused]] SQInteger prevstackbase = _stackbase;
SQInteger prevstackbase = _stackbase;
#endif
switch(type(closure)) { switch(type(closure)) {
case OT_CLOSURE: { case OT_CLOSURE: {
assert(!can_suspend || this->_can_suspend); assert(!can_suspend || this->_can_suspend);
@ -1504,11 +1502,9 @@ bool SQVM::Call(SQObjectPtr &closure,SQInteger nparams,SQInteger stackbase,SQObj
default: default:
return false; return false;
} }
#ifdef WITH_ASSERT
if(!_suspended) { if(!_suspended) {
assert(_stackbase == prevstackbase); assert(_stackbase == prevstackbase);
} }
#endif
return true; return true;
} }

@ -614,8 +614,7 @@ static CommandCost ReplaceChain(Vehicle **chain, DoCommandFlag flags, bool wagon
assert(RailVehInfo(wagon->engine_type)->railveh_type == RAILVEH_WAGON); assert(RailVehInfo(wagon->engine_type)->railveh_type == RAILVEH_WAGON);
/* Sell wagon */ /* Sell wagon */
CommandCost ret = DoCommand(0, wagon->index, 0, DC_EXEC, GetCmdSellVeh(wagon)); [[maybe_unused]] CommandCost ret = DoCommand(0, wagon->index, 0, DC_EXEC, GetCmdSellVeh(wagon));
(void)ret; // assert only
assert(ret.Succeeded()); assert(ret.Succeeded());
new_vehs[i] = nullptr; new_vehs[i] = nullptr;
@ -668,8 +667,7 @@ static CommandCost ReplaceChain(Vehicle **chain, DoCommandFlag flags, bool wagon
assert(Train::From(old_head)->GetNextUnit() == nullptr); assert(Train::From(old_head)->GetNextUnit() == nullptr);
for (int i = num_units - 1; i > 0; i--) { for (int i = num_units - 1; i > 0; i--) {
CommandCost ret = CmdMoveVehicle(old_vehs[i], old_head, DC_EXEC | DC_AUTOREPLACE, false); [[maybe_unused]] CommandCost ret = CmdMoveVehicle(old_vehs[i], old_head, DC_EXEC | DC_AUTOREPLACE, false);
(void)ret; // assert only
assert(ret.Succeeded()); assert(ret.Succeeded());
} }
} }

@ -247,7 +247,7 @@ inline void Blitter_32bppAnim::Draw(const Blitter::BlitterParams *bp, ZoomLevel
break; break;
default: default:
if (fast_path || (src_px->a == 255 && (sprite_flags & SF_NO_ANIM))) { if (fast_path || (src_px->a == 255 && (sprite_flags & BSF_NO_ANIM))) {
do { do {
*anim++ = 0; *anim++ = 0;
Colour c = *src_px; Colour c = *src_px;
@ -317,7 +317,7 @@ void Blitter_32bppAnim::Draw(Blitter::BlitterParams *bp, BlitterMode mode, ZoomL
default: NOT_REACHED(); default: NOT_REACHED();
case BM_COLOUR_REMAP_WITH_BRIGHTNESS: case BM_COLOUR_REMAP_WITH_BRIGHTNESS:
if (!(sprite_flags & SF_NO_REMAP)) { if (!(sprite_flags & BSF_NO_REMAP)) {
Draw<BM_COLOUR_REMAP_WITH_BRIGHTNESS, false>(bp, zoom); Draw<BM_COLOUR_REMAP_WITH_BRIGHTNESS, false>(bp, zoom);
return; return;
} }
@ -328,14 +328,14 @@ void Blitter_32bppAnim::Draw(Blitter::BlitterParams *bp, BlitterMode mode, ZoomL
return; return;
case BM_COLOUR_REMAP: case BM_COLOUR_REMAP:
if (!(sprite_flags & SF_NO_REMAP)) { if (!(sprite_flags & BSF_NO_REMAP)) {
Draw<BM_COLOUR_REMAP, false>(bp, zoom); Draw<BM_COLOUR_REMAP, false>(bp, zoom);
return; return;
} }
/* FALL THROUGH */ /* FALL THROUGH */
case BM_NORMAL: case BM_NORMAL:
if ((sprite_flags & (SF_NO_ANIM | SF_TRANSLUCENT)) == SF_NO_ANIM && if ((sprite_flags & (BSF_NO_ANIM | BSF_TRANSLUCENT)) == BSF_NO_ANIM &&
bp->skip_left == 0 && bp->width == UnScaleByZoom(bp->sprite_width, zoom)) { bp->skip_left == 0 && bp->width == UnScaleByZoom(bp->sprite_width, zoom)) {
Draw<BM_NORMAL, true>(bp, zoom); Draw<BM_NORMAL, true>(bp, zoom);
} else { } else {

@ -442,35 +442,35 @@ bm_normal:
if (bp->skip_left != 0 || bp->width <= MARGIN_NORMAL_THRESHOLD) { if (bp->skip_left != 0 || bp->width <= MARGIN_NORMAL_THRESHOLD) {
const BlockType bt_last = (BlockType) (bp->width & 1); const BlockType bt_last = (BlockType) (bp->width & 1);
if (bt_last == BT_EVEN) { if (bt_last == BT_EVEN) {
if (sprite_flags & SF_NO_ANIM) Draw<BM_NORMAL, RM_WITH_SKIP, BT_EVEN, true, false>(bp, zoom); if (sprite_flags & BSF_NO_ANIM) Draw<BM_NORMAL, RM_WITH_SKIP, BT_EVEN, true, false>(bp, zoom);
else Draw<BM_NORMAL, RM_WITH_SKIP, BT_EVEN, true, true>(bp, zoom); else Draw<BM_NORMAL, RM_WITH_SKIP, BT_EVEN, true, true>(bp, zoom);
} else { } else {
if (sprite_flags & SF_NO_ANIM) Draw<BM_NORMAL, RM_WITH_SKIP, BT_ODD, true, false>(bp, zoom); if (sprite_flags & BSF_NO_ANIM) Draw<BM_NORMAL, RM_WITH_SKIP, BT_ODD, true, false>(bp, zoom);
else Draw<BM_NORMAL, RM_WITH_SKIP, BT_ODD, true, true>(bp, zoom); else Draw<BM_NORMAL, RM_WITH_SKIP, BT_ODD, true, true>(bp, zoom);
} }
} else { } else {
#ifdef POINTER_IS_64BIT #ifdef POINTER_IS_64BIT
if (sprite_flags & SF_TRANSLUCENT) { if (sprite_flags & BSF_TRANSLUCENT) {
if (sprite_flags & SF_NO_ANIM) Draw<BM_NORMAL, RM_WITH_MARGIN, BT_NONE, true, false>(bp, zoom); if (sprite_flags & BSF_NO_ANIM) Draw<BM_NORMAL, RM_WITH_MARGIN, BT_NONE, true, false>(bp, zoom);
else Draw<BM_NORMAL, RM_WITH_MARGIN, BT_NONE, true, true>(bp, zoom); else Draw<BM_NORMAL, RM_WITH_MARGIN, BT_NONE, true, true>(bp, zoom);
} else { } else {
if (sprite_flags & SF_NO_ANIM) Draw<BM_NORMAL, RM_WITH_MARGIN, BT_NONE, false, false>(bp, zoom); if (sprite_flags & BSF_NO_ANIM) Draw<BM_NORMAL, RM_WITH_MARGIN, BT_NONE, false, false>(bp, zoom);
else Draw<BM_NORMAL, RM_WITH_MARGIN, BT_NONE, false, true>(bp, zoom); else Draw<BM_NORMAL, RM_WITH_MARGIN, BT_NONE, false, true>(bp, zoom);
} }
#else #else
if (sprite_flags & SF_NO_ANIM) Draw<BM_NORMAL, RM_WITH_MARGIN, BT_NONE, true, false>(bp, zoom); if (sprite_flags & BSF_NO_ANIM) Draw<BM_NORMAL, RM_WITH_MARGIN, BT_NONE, true, false>(bp, zoom);
else Draw<BM_NORMAL, RM_WITH_MARGIN, BT_NONE, true, true>(bp, zoom); else Draw<BM_NORMAL, RM_WITH_MARGIN, BT_NONE, true, true>(bp, zoom);
#endif #endif
} }
break; break;
} }
case BM_COLOUR_REMAP: case BM_COLOUR_REMAP:
if (sprite_flags & SF_NO_REMAP) goto bm_normal; if (sprite_flags & BSF_NO_REMAP) goto bm_normal;
if (bp->skip_left != 0 || bp->width <= MARGIN_REMAP_THRESHOLD) { if (bp->skip_left != 0 || bp->width <= MARGIN_REMAP_THRESHOLD) {
if (sprite_flags & SF_NO_ANIM) Draw<BM_COLOUR_REMAP, RM_WITH_SKIP, BT_NONE, true, false>(bp, zoom); if (sprite_flags & BSF_NO_ANIM) Draw<BM_COLOUR_REMAP, RM_WITH_SKIP, BT_NONE, true, false>(bp, zoom);
else Draw<BM_COLOUR_REMAP, RM_WITH_SKIP, BT_NONE, true, true>(bp, zoom); else Draw<BM_COLOUR_REMAP, RM_WITH_SKIP, BT_NONE, true, true>(bp, zoom);
} else { } else {
if (sprite_flags & SF_NO_ANIM) Draw<BM_COLOUR_REMAP, RM_WITH_MARGIN, BT_NONE, true, false>(bp, zoom); if (sprite_flags & BSF_NO_ANIM) Draw<BM_COLOUR_REMAP, RM_WITH_MARGIN, BT_NONE, true, false>(bp, zoom);
else Draw<BM_COLOUR_REMAP, RM_WITH_MARGIN, BT_NONE, true, true>(bp, zoom); else Draw<BM_COLOUR_REMAP, RM_WITH_MARGIN, BT_NONE, true, true>(bp, zoom);
} }
break; break;
@ -479,7 +479,7 @@ bm_normal:
case BM_BLACK_REMAP: Draw<BM_BLACK_REMAP, RM_NONE, BT_NONE, true, true>(bp, zoom); return; case BM_BLACK_REMAP: Draw<BM_BLACK_REMAP, RM_NONE, BT_NONE, true, true>(bp, zoom); return;
case BM_COLOUR_REMAP_WITH_BRIGHTNESS: case BM_COLOUR_REMAP_WITH_BRIGHTNESS:
if (!(sprite_flags & SF_NO_REMAP)) { if (!(sprite_flags & BSF_NO_REMAP)) {
Draw<BM_COLOUR_REMAP_WITH_BRIGHTNESS, RM_NONE, BT_NONE, true, true>(bp, zoom); Draw<BM_COLOUR_REMAP_WITH_BRIGHTNESS, RM_NONE, BT_NONE, true, true>(bp, zoom);
return; return;
} }

@ -313,7 +313,7 @@ template <bool Tpal_to_rgb> Sprite *Blitter_32bppOptimized::EncodeInternal(const
if (zoom_max == zoom_min) zoom_max = ZOOM_LVL_DRAW_SPR; if (zoom_max == zoom_min) zoom_max = ZOOM_LVL_DRAW_SPR;
} }
BlitterSpriteFlags flags = SF_NO_REMAP | SF_NO_ANIM; BlitterSpriteFlags flags = BSF_NO_REMAP | BSF_NO_ANIM;
for (ZoomLevel z = zoom_min; z <= zoom_max; z++) { for (ZoomLevel z = zoom_min; z <= zoom_max; z++) {
const SpriteLoader::Sprite *src_orig = &sprite[z]; const SpriteLoader::Sprite *src_orig = &sprite[z];
@ -354,11 +354,11 @@ template <bool Tpal_to_rgb> Sprite *Blitter_32bppOptimized::EncodeInternal(const
if (a != 0) { if (a != 0) {
dst_px->a = a; dst_px->a = a;
if (a != 0 && a != 255) flags |= SF_TRANSLUCENT; if (a != 0 && a != 255) flags |= BSF_TRANSLUCENT;
*dst_n = src->m; *dst_n = src->m;
if (src->m != 0) { if (src->m != 0) {
flags &= ~SF_NO_REMAP; flags &= ~BSF_NO_REMAP;
if (src->m >= PALETTE_ANIM_START) flags &= ~SF_NO_ANIM; if (src->m >= PALETTE_ANIM_START) flags &= ~BSF_NO_ANIM;
/* Get brightest value */ /* Get brightest value */
uint8 rgb_max = std::max({ src->r, src->g, src->b }); uint8 rgb_max = std::max({ src->r, src->g, src->b });

@ -129,10 +129,10 @@ Sprite *Blitter_32bppSSE_Base::Encode(const SpriteLoader::Sprite *sprite, Alloca
} }
/* Store sprite flags. */ /* Store sprite flags. */
sd.flags = SF_NONE; sd.flags = BSF_NONE;
if (has_translucency) sd.flags |= SF_TRANSLUCENT; if (has_translucency) sd.flags |= BSF_TRANSLUCENT;
if (!has_remap) sd.flags |= SF_NO_REMAP; if (!has_remap) sd.flags |= BSF_NO_REMAP;
if (!has_anim) sd.flags |= SF_NO_ANIM; if (!has_anim) sd.flags |= BSF_NO_ANIM;
memcpy(dst_sprite->data, &sd, sizeof(SpriteData)); memcpy(dst_sprite->data, &sd, sizeof(SpriteData));
return dst_sprite; return dst_sprite;

@ -499,7 +499,7 @@ bm_normal:
case BT_ODD: Draw<BM_NORMAL, RM_WITH_SKIP, BT_ODD, true>(bp, zoom); return; case BT_ODD: Draw<BM_NORMAL, RM_WITH_SKIP, BT_ODD, true>(bp, zoom); return;
} }
} else { } else {
if (((const Blitter_32bppSSE_Base::SpriteData *) bp->sprite)->flags & SF_TRANSLUCENT) { if (((const Blitter_32bppSSE_Base::SpriteData *) bp->sprite)->flags & BSF_TRANSLUCENT) {
Draw<BM_NORMAL, RM_WITH_MARGIN, BT_NONE, true>(bp, zoom); Draw<BM_NORMAL, RM_WITH_MARGIN, BT_NONE, true>(bp, zoom);
} else { } else {
Draw<BM_NORMAL, RM_WITH_MARGIN, BT_NONE, false>(bp, zoom); Draw<BM_NORMAL, RM_WITH_MARGIN, BT_NONE, false>(bp, zoom);
@ -509,7 +509,7 @@ bm_normal:
break; break;
} }
case BM_COLOUR_REMAP: case BM_COLOUR_REMAP:
if (((const Blitter_32bppSSE_Base::SpriteData *) bp->sprite)->flags & SF_NO_REMAP) goto bm_normal; if (((const Blitter_32bppSSE_Base::SpriteData *) bp->sprite)->flags & BSF_NO_REMAP) goto bm_normal;
if (bp->skip_left != 0 || bp->width <= MARGIN_REMAP_THRESHOLD) { if (bp->skip_left != 0 || bp->width <= MARGIN_REMAP_THRESHOLD) {
Draw<BM_COLOUR_REMAP, RM_WITH_SKIP, BT_NONE, true>(bp, zoom); return; Draw<BM_COLOUR_REMAP, RM_WITH_SKIP, BT_NONE, true>(bp, zoom); return;
} else { } else {
@ -520,7 +520,7 @@ bm_normal:
case BM_BLACK_REMAP: Draw<BM_BLACK_REMAP, RM_NONE, BT_NONE, true>(bp, zoom); return; case BM_BLACK_REMAP: Draw<BM_BLACK_REMAP, RM_NONE, BT_NONE, true>(bp, zoom); return;
case BM_COLOUR_REMAP_WITH_BRIGHTNESS: case BM_COLOUR_REMAP_WITH_BRIGHTNESS:
if (!(((const Blitter_32bppSSE_Base::SpriteData *) bp->sprite)->flags & SF_NO_REMAP)) { if (!(((const Blitter_32bppSSE_Base::SpriteData *) bp->sprite)->flags & BSF_NO_REMAP)) {
Draw<BM_COLOUR_REMAP_WITH_BRIGHTNESS, RM_NONE, BT_NONE, true>(bp, zoom); Draw<BM_COLOUR_REMAP_WITH_BRIGHTNESS, RM_NONE, BT_NONE, true>(bp, zoom);
return; return;
} }

@ -33,10 +33,10 @@ enum BlitterMode {
* - heavy branching (remap lookups and animation buffer handling). * - heavy branching (remap lookups and animation buffer handling).
*/ */
enum BlitterSpriteFlags { enum BlitterSpriteFlags {
SF_NONE = 0, BSF_NONE = 0,
SF_TRANSLUCENT = 1 << 1, ///< The sprite has at least 1 translucent pixel. BSF_TRANSLUCENT = 1 << 1, ///< The sprite has at least 1 translucent pixel.
SF_NO_REMAP = 1 << 2, ///< The sprite has no remappable colour pixel. BSF_NO_REMAP = 1 << 2, ///< The sprite has no remappable colour pixel.
SF_NO_ANIM = 1 << 3, ///< The sprite has no palette animated pixel. BSF_NO_ANIM = 1 << 3, ///< The sprite has no palette animated pixel.
}; };
DECLARE_ENUM_AS_BIT_SET(BlitterSpriteFlags); DECLARE_ENUM_AS_BIT_SET(BlitterSpriteFlags);

@ -35,9 +35,9 @@ DEFINE_POOL_METHOD(inline)::Pool(const char *name) :
first_free(0), first_free(0),
first_unused(0), first_unused(0),
items(0), items(0),
#ifdef OTTD_ASSERT #ifdef WITH_ASSERT
checked(0), checked(0),
#endif /* OTTD_ASSERT */ #endif /* WITH_ASSERT */
cleaning(false), cleaning(false),
data(nullptr), data(nullptr),
free_bitmap(nullptr), free_bitmap(nullptr),
@ -145,10 +145,10 @@ DEFINE_POOL_METHOD(void *)::GetNew(size_t size)
{ {
size_t index = this->FindFirstFree(); size_t index = this->FindFirstFree();
#ifdef OTTD_ASSERT #ifdef WITH_ASSERT
assert(this->checked != 0); assert(this->checked != 0);
this->checked--; this->checked--;
#endif /* OTTD_ASSERT */ #endif /* WITH_ASSERT */
if (index == NO_FREE_ITEM) { if (index == NO_FREE_ITEM) {
error("%s: no more free items", this->name); error("%s: no more free items", this->name);
} }

@ -90,9 +90,9 @@ struct Pool : PoolBase {
size_t first_free; ///< No item with index lower than this is free (doesn't say anything about this one!) size_t first_free; ///< No item with index lower than this is free (doesn't say anything about this one!)
size_t first_unused; ///< This and all higher indexes are free (doesn't say anything about first_unused-1 !) size_t first_unused; ///< This and all higher indexes are free (doesn't say anything about first_unused-1 !)
size_t items; ///< Number of used indexes (non-nullptr) size_t items; ///< Number of used indexes (non-nullptr)
#ifdef OTTD_ASSERT #ifdef WITH_ASSERT
size_t checked; ///< Number of items we checked for size_t checked; ///< Number of items we checked for
#endif /* OTTD_ASSERT */ #endif /* WITH_ASSERT */
bool cleaning; ///< True if cleaning pool (deleting all items) bool cleaning; ///< True if cleaning pool (deleting all items)
Titem **data; ///< Pointer to array of pointers to Titem Titem **data; ///< Pointer to array of pointers to Titem
@ -131,9 +131,9 @@ struct Pool : PoolBase {
inline bool CanAllocate(size_t n = 1) inline bool CanAllocate(size_t n = 1)
{ {
bool ret = this->items <= Tmax_size - n; bool ret = this->items <= Tmax_size - n;
#ifdef OTTD_ASSERT #ifdef WITH_ASSERT
this->checked = ret ? n : 0; this->checked = ret ? n : 0;
#endif /* OTTD_ASSERT */ #endif /* WITH_ASSERT */
return ret; return ret;
} }

@ -547,8 +547,7 @@ void SetupEngines()
/* Assert is safe; there won't be more than 256 original vehicles /* Assert is safe; there won't be more than 256 original vehicles
* in any case, and we just cleaned the pool. */ * in any case, and we just cleaned the pool. */
assert(Engine::CanAllocateItem()); assert(Engine::CanAllocateItem());
const Engine *e = new Engine(eid.type, eid.internal_id); [[maybe_unused]] const Engine *e = new Engine(eid.type, eid.internal_id);
(void)e; // assert only
assert(e->index == index); assert(e->index == index);
index++; index++;
} }

@ -106,8 +106,7 @@ static void LoadGrfFileIndexed(const char *filename, const SpriteID *index_tbl,
uint end = *index_tbl++; uint end = *index_tbl++;
do { do {
bool b = LoadNextSprite(start, file, sprite_id); [[maybe_unused]] bool b = LoadNextSprite(start, file, sprite_id);
(void)b; // Unused without asserts
assert(b); assert(b);
sprite_id++; sprite_id++;
} while (++start <= end); } while (++start <= end);

@ -2213,8 +2213,7 @@ static Industry *CreateNewIndustry(TileIndex tile, IndustryType type, IndustryAv
uint32 seed2 = Random(); uint32 seed2 = Random();
Industry *i = nullptr; Industry *i = nullptr;
size_t layout_index = RandomRange((uint32)indspec->layouts.size()); size_t layout_index = RandomRange((uint32)indspec->layouts.size());
CommandCost ret = CreateNewIndustryHelper(tile, type, DC_EXEC, indspec, layout_index, seed, GB(seed2, 0, 16), OWNER_NONE, creation_type, &i); [[maybe_unused]] CommandCost ret = CreateNewIndustryHelper(tile, type, DC_EXEC, indspec, layout_index, seed, GB(seed2, 0, 16), OWNER_NONE, creation_type, &i);
(void)ret; // assert only
assert(i != nullptr || ret.Failed()); assert(i != nullptr || ret.Failed());
return i; return i;
} }

@ -2639,7 +2639,7 @@ STR_NETWORK_ERROR_SERVER_START :{WHITE}서버
STR_NETWORK_ERROR_CLIENT_START :{WHITE}접속할 수 없습니다 STR_NETWORK_ERROR_CLIENT_START :{WHITE}접속할 수 없습니다
STR_NETWORK_ERROR_TIMEOUT :{WHITE}접속자 #{NUM}의 입력 시간이 초과되었습니다 STR_NETWORK_ERROR_TIMEOUT :{WHITE}접속자 #{NUM}의 입력 시간이 초과되었습니다
STR_NETWORK_ERROR_SERVER_ERROR :{WHITE}프로토콜 오류가 발생되어 연결이 끊어졌습니다 STR_NETWORK_ERROR_SERVER_ERROR :{WHITE}프로토콜 오류가 발생되어 연결이 끊어졌습니다
STR_NETWORK_ERROR_BAD_PLAYER_NAME :{WHITE}접속자 이름을 설정하지 않았습니다. 이름은 멀티플레이 창의 상단에서 설정할 수 있습니다. STR_NETWORK_ERROR_BAD_PLAYER_NAME :{WHITE}접속자 이름을 지정하지 않았습니다. 접속자 이름은 멀티플레이 창 맨 위에서 설정할 수 있습니다.
STR_NETWORK_ERROR_BAD_SERVER_NAME :{WHITE}서버 이름을 지정하지 않았습니다. 서버 이름은 멀티플레이 창 맨 위에서 설정할 수 있습니다. STR_NETWORK_ERROR_BAD_SERVER_NAME :{WHITE}서버 이름을 지정하지 않았습니다. 서버 이름은 멀티플레이 창 맨 위에서 설정할 수 있습니다.
STR_NETWORK_ERROR_WRONG_REVISION :{WHITE}이 접속자의 게임 버전이 서버의 버전과 일치하지 않습니다 STR_NETWORK_ERROR_WRONG_REVISION :{WHITE}이 접속자의 게임 버전이 서버의 버전과 일치하지 않습니다
STR_NETWORK_ERROR_WRONG_PASSWORD :{WHITE}잘못된 비밀번호입니다 STR_NETWORK_ERROR_WRONG_PASSWORD :{WHITE}잘못된 비밀번호입니다

@ -239,8 +239,7 @@ public:
/** non-const item search & removal */ /** non-const item search & removal */
void Pop(Titem_ &item) void Pop(Titem_ &item)
{ {
bool ret = TryPop(item); [[maybe_unused]] bool ret = TryPop(item);
(void)ret; // assert only
assert(ret); assert(ret);
} }

@ -1043,8 +1043,7 @@ static NPFFoundTargetData NPFRouteInternal(AyStarNode *start1, bool ignore_start
_npf_aystar.user_data = user; _npf_aystar.user_data = user;
/* GO! */ /* GO! */
int r = _npf_aystar.Main(); [[maybe_unused]] int r = _npf_aystar.Main();
(void)r; // assert only
assert(r != AYSTAR_STILL_BUSY); assert(r != AYSTAR_STILL_BUSY);
if (result.best_bird_dist != 0) { if (result.best_bird_dist != 0) {

@ -120,6 +120,8 @@ static void Save_AIPL()
} }
} }
extern const ChunkHandler _ai_chunk_handlers[] = { static const ChunkHandler ai_chunk_handlers[] = {
{ 'AIPL', Save_AIPL, Load_AIPL, nullptr, nullptr, CH_ARRAY | CH_LAST}, { 'AIPL', Save_AIPL, Load_AIPL, nullptr, nullptr, CH_ARRAY },
}; };
extern const ChunkHandlerTable _ai_chunk_handlers(ai_chunk_handlers);

@ -34,7 +34,9 @@ static void Load_ATID()
Load_NewGRFMapping(_airporttile_mngr); Load_NewGRFMapping(_airporttile_mngr);
} }
extern const ChunkHandler _airport_chunk_handlers[] = { static const ChunkHandler airport_chunk_handlers[] = {
{ 'ATID', Save_ATID, Load_ATID, nullptr, nullptr, CH_ARRAY }, { 'ATID', Save_ATID, Load_ATID, nullptr, nullptr, CH_ARRAY },
{ 'APID', Save_APID, Load_APID, nullptr, nullptr, CH_ARRAY | CH_LAST }, { 'APID', Save_APID, Load_APID, nullptr, nullptr, CH_ARRAY },
}; };
extern const ChunkHandlerTable _airport_chunk_handlers(airport_chunk_handlers);

@ -73,6 +73,8 @@ static void Load_ANIT()
* "Definition" imported by the saveload code to be able to load and save * "Definition" imported by the saveload code to be able to load and save
* the animated tile table. * the animated tile table.
*/ */
extern const ChunkHandler _animated_tile_chunk_handlers[] = { static const ChunkHandler animated_tile_chunk_handlers[] = {
{ 'ANIT', Save_ANIT, Load_ANIT, nullptr, nullptr, CH_RIFF | CH_LAST}, { 'ANIT', Save_ANIT, Load_ANIT, nullptr, nullptr, CH_RIFF },
}; };
extern const ChunkHandlerTable _animated_tile_chunk_handlers(animated_tile_chunk_handlers);

@ -55,6 +55,8 @@ static void Ptrs_ERNW()
} }
} }
extern const ChunkHandler _autoreplace_chunk_handlers[] = { static const ChunkHandler autoreplace_chunk_handlers[] = {
{ 'ERNW', Save_ERNW, Load_ERNW, Ptrs_ERNW, nullptr, CH_ARRAY | CH_LAST}, { 'ERNW', Save_ERNW, Load_ERNW, Ptrs_ERNW, nullptr, CH_ARRAY },
}; };
extern const ChunkHandlerTable _autoreplace_chunk_handlers(autoreplace_chunk_handlers);

@ -50,6 +50,8 @@ static void Save_XBSS()
} }
} }
extern const ChunkHandler _bridge_signal_chunk_handlers[] = { extern const ChunkHandler bridge_signal_chunk_handlers[] = {
{ 'XBSS', Save_XBSS, Load_XBSS, nullptr, nullptr, CH_SPARSE_ARRAY | CH_LAST}, { 'XBSS', Save_XBSS, Load_XBSS, nullptr, nullptr, CH_SPARSE_ARRAY },
}; };
extern const ChunkHandlerTable _bridge_signal_chunk_handlers(bridge_signal_chunk_handlers);

@ -117,7 +117,9 @@ static void LoadPickup()
} }
/** Chunk definition of the cargomonitoring maps. */ /** Chunk definition of the cargomonitoring maps. */
extern const ChunkHandler _cargomonitor_chunk_handlers[] = { static const ChunkHandler cargomonitor_chunk_handlers[] = {
{ 'CMDL', SaveDelivery, LoadDelivery, nullptr, nullptr, CH_ARRAY}, { 'CMDL', SaveDelivery, LoadDelivery, nullptr, nullptr, CH_ARRAY },
{ 'CMPU', SavePickup, LoadPickup, nullptr, nullptr, CH_ARRAY | CH_LAST}, { 'CMPU', SavePickup, LoadPickup, nullptr, nullptr, CH_ARRAY },
}; };
extern const ChunkHandlerTable _cargomonitor_chunk_handlers(cargomonitor_chunk_handlers);

@ -186,7 +186,9 @@ void Load_CPDP()
/** Chunk handlers related to cargo packets. */ /** Chunk handlers related to cargo packets. */
extern const ChunkHandler _cargopacket_chunk_handlers[] = { static const ChunkHandler cargopacket_chunk_handlers[] = {
{ 'CAPA', Save_CAPA, Load_CAPA, nullptr, nullptr, CH_ARRAY }, { 'CAPA', Save_CAPA, Load_CAPA, nullptr, nullptr, CH_ARRAY },
{ 'CPDP', Save_CPDP, Load_CPDP, nullptr, nullptr, CH_RIFF | CH_LAST }, { 'CPDP', Save_CPDP, Load_CPDP, nullptr, nullptr, CH_RIFF },
}; };
extern const ChunkHandlerTable _cargopacket_chunk_handlers(cargopacket_chunk_handlers);

@ -155,7 +155,9 @@ static const SaveLoad _settings_ext_save_desc[] = {
/** Chunk handlers related to cheats. */ /** Chunk handlers related to cheats. */
extern const ChunkHandler _cheat_chunk_handlers[] = { static const ChunkHandler cheat_chunk_handlers[] = {
{ 'CHTS', Save_CHTS, Load_CHTS, nullptr, nullptr, CH_RIFF}, { 'CHTS', Save_CHTS, Load_CHTS, nullptr, nullptr, CH_RIFF },
{ 'CHTX', Save_CHTX, Load_CHTX, nullptr, nullptr, CH_RIFF | CH_LAST}, { 'CHTX', Save_CHTX, Load_CHTX, nullptr, nullptr, CH_RIFF },
}; };
extern const ChunkHandlerTable _cheat_chunk_handlers(cheat_chunk_handlers);

@ -556,7 +556,9 @@ static void Save_PLYX()
SaveSettingsPlyx(); SaveSettingsPlyx();
} }
extern const ChunkHandler _company_chunk_handlers[] = { static const ChunkHandler company_chunk_handlers[] = {
{ 'PLYR', Save_PLYR, Load_PLYR, Ptrs_PLYR, Check_PLYR, CH_ARRAY }, { 'PLYR', Save_PLYR, Load_PLYR, Ptrs_PLYR, Check_PLYR, CH_ARRAY },
{ 'PLYX', Save_PLYX, Load_PLYX, nullptr, Check_PLYX, CH_RIFF | CH_LAST}, { 'PLYX', Save_PLYX, Load_PLYX, nullptr, Check_PLYX, CH_RIFF },
}; };
extern const ChunkHandlerTable _company_chunk_handlers(company_chunk_handlers);

@ -86,7 +86,9 @@ static void Check_DBGC()
} }
} }
extern const ChunkHandler _debug_chunk_handlers[] = { extern const ChunkHandler debug_chunk_handlers[] = {
{ 'DBGL', Save_DBGL, Load_DBGL, nullptr, Check_DBGL, CH_RIFF}, { 'DBGL', Save_DBGL, Load_DBGL, nullptr, Check_DBGL, CH_RIFF },
{ 'DBGC', Save_DBGC, Load_DBGC, nullptr, Check_DBGC, CH_RIFF | CH_LAST}, { 'DBGC', Save_DBGC, Load_DBGC, nullptr, Check_DBGC, CH_RIFF },
}; };
extern const ChunkHandlerTable _debug_chunk_handlers(debug_chunk_handlers);

@ -57,6 +57,8 @@ static void Ptrs_DEPT()
} }
} }
extern const ChunkHandler _depot_chunk_handlers[] = { static const ChunkHandler depot_chunk_handlers[] = {
{ 'DEPT', Save_DEPT, Load_DEPT, Ptrs_DEPT, nullptr, CH_ARRAY | CH_LAST}, { 'DEPT', Save_DEPT, Load_DEPT, Ptrs_DEPT, nullptr, CH_ARRAY },
}; };
extern const ChunkHandlerTable _depot_chunk_handlers(depot_chunk_handlers);

@ -95,9 +95,11 @@ static void Ptrs_CAPY()
} }
extern const ChunkHandler _economy_chunk_handlers[] = { static const ChunkHandler economy_chunk_handlers[] = {
{ 'CAPY', Save_CAPY, Load_CAPY, Ptrs_CAPY, nullptr, CH_ARRAY}, { 'CAPY', Save_CAPY, Load_CAPY, Ptrs_CAPY, nullptr, CH_ARRAY },
{ 'PRIC', nullptr, Load_PRIC, nullptr, nullptr, CH_RIFF }, { 'PRIC', nullptr, Load_PRIC, nullptr, nullptr, CH_RIFF },
{ 'CAPR', nullptr, Load_CAPR, nullptr, nullptr, CH_RIFF }, { 'CAPR', nullptr, Load_CAPR, nullptr, nullptr, CH_RIFF },
{ 'ECMY', Save_ECMY, Load_ECMY, nullptr, nullptr, CH_RIFF | CH_LAST}, { 'ECMY', Save_ECMY, Load_ECMY, nullptr, nullptr, CH_RIFF },
}; };
extern const ChunkHandlerTable _economy_chunk_handlers(economy_chunk_handlers);

@ -199,8 +199,10 @@ void AfterLoadEngines()
AnalyseEngineCallbacks(); AnalyseEngineCallbacks();
} }
extern const ChunkHandler _engine_chunk_handlers[] = { static const ChunkHandler engine_chunk_handlers[] = {
{ 'EIDS', Save_EIDS, Load_EIDS, nullptr, nullptr, CH_ARRAY }, { 'EIDS', Save_EIDS, Load_EIDS, nullptr, nullptr, CH_ARRAY },
{ 'ENGN', Save_ENGN, Load_ENGN, nullptr, nullptr, CH_ARRAY }, { 'ENGN', Save_ENGN, Load_ENGN, nullptr, nullptr, CH_ARRAY },
{ 'ENGS', nullptr, Load_ENGS, nullptr, nullptr, CH_RIFF | CH_LAST }, { 'ENGS', nullptr, Load_ENGS, nullptr, nullptr, CH_RIFF },
}; };
extern const ChunkHandlerTable _engine_chunk_handlers(engine_chunk_handlers);

@ -669,6 +669,7 @@ static uint32 saveLC(const SlxiSubChunkInfo *info, bool dry_run)
return 1; return 1;
} }
extern const ChunkHandler _version_ext_chunk_handlers[] = { extern const ChunkHandler version_ext_chunk_handlers[] = {
{ 'SLXI', Save_SLXI, Load_SLXI, nullptr, Load_SLXI, CH_RIFF | CH_LAST}, { 'SLXI', Save_SLXI, Load_SLXI, nullptr, Load_SLXI, CH_RIFF },
}; };
extern const ChunkHandlerTable _version_ext_chunk_handlers(version_ext_chunk_handlers);

@ -173,7 +173,9 @@ static void Save_GSTR()
} }
} }
extern const ChunkHandler _game_chunk_handlers[] = { static const ChunkHandler game_chunk_handlers[] = {
{ 'GSTR', Save_GSTR, Load_GSTR, nullptr, nullptr, CH_ARRAY }, { 'GSTR', Save_GSTR, Load_GSTR, nullptr, nullptr, CH_ARRAY },
{ 'GSDT', Save_GSDT, Load_GSDT, nullptr, nullptr, CH_ARRAY | CH_LAST}, { 'GSDT', Save_GSDT, Load_GSDT, nullptr, nullptr, CH_ARRAY },
}; };
extern const ChunkHandlerTable _game_chunk_handlers(game_chunk_handlers);

@ -175,6 +175,8 @@ static void Check_GLOG()
Load_GLOG_common(_load_check_data.gamelog_action, _load_check_data.gamelog_actions); Load_GLOG_common(_load_check_data.gamelog_action, _load_check_data.gamelog_actions);
} }
extern const ChunkHandler _gamelog_chunk_handlers[] = { static const ChunkHandler gamelog_chunk_handlers[] = {
{ 'GLOG', Save_GLOG, Load_GLOG, nullptr, Check_GLOG, CH_RIFF | CH_LAST } { 'GLOG', Save_GLOG, Load_GLOG, nullptr, Check_GLOG, CH_RIFF }
}; };
extern const ChunkHandlerTable _gamelog_chunk_handlers(gamelog_chunk_handlers);

@ -40,6 +40,8 @@ static void Load_GOAL()
} }
} }
extern const ChunkHandler _goal_chunk_handlers[] = { static const ChunkHandler goal_chunk_handlers[] = {
{ 'GOAL', Save_GOAL, Load_GOAL, nullptr, nullptr, CH_ARRAY | CH_LAST}, { 'GOAL', Save_GOAL, Load_GOAL, nullptr, nullptr, CH_ARRAY },
}; };
extern const ChunkHandlerTable _goal_chunk_handlers(goal_chunk_handlers);

@ -55,6 +55,8 @@ static void Load_GRPS()
} }
} }
extern const ChunkHandler _group_chunk_handlers[] = { static const ChunkHandler group_chunk_handlers[] = {
{ 'GRPS', Save_GRPS, Load_GRPS, nullptr, nullptr, CH_ARRAY | CH_LAST}, { 'GRPS', Save_GRPS, Load_GRPS, nullptr, nullptr, CH_ARRAY },
}; };
extern const ChunkHandlerTable _group_chunk_handlers(group_chunk_handlers);

@ -176,10 +176,12 @@ static void Load_ITBL()
} }
} }
extern const ChunkHandler _industry_chunk_handlers[] = { static const ChunkHandler industry_chunk_handlers[] = {
{ 'INDY', Save_INDY, Load_INDY, Ptrs_INDY, nullptr, CH_ARRAY}, { 'INDY', Save_INDY, Load_INDY, Ptrs_INDY, nullptr, CH_ARRAY },
{ 'IIDS', Save_IIDS, Load_IIDS, nullptr, nullptr, CH_ARRAY}, { 'IIDS', Save_IIDS, Load_IIDS, nullptr, nullptr, CH_ARRAY },
{ 'TIDS', Save_TIDS, Load_TIDS, nullptr, nullptr, CH_ARRAY}, { 'TIDS', Save_TIDS, Load_TIDS, nullptr, nullptr, CH_ARRAY },
{ 'IBLD', LoadSave_IBLD, LoadSave_IBLD, nullptr, nullptr, CH_RIFF}, { 'IBLD', LoadSave_IBLD, LoadSave_IBLD, nullptr, nullptr, CH_RIFF },
{ 'ITBL', Save_ITBL, Load_ITBL, nullptr, nullptr, CH_ARRAY | CH_LAST}, { 'ITBL', Save_ITBL, Load_ITBL, nullptr, nullptr, CH_ARRAY },
}; };
extern const ChunkHandlerTable _industry_chunk_handlers(industry_chunk_handlers);

@ -130,7 +130,9 @@ static void Load_RAIL()
} }
} }
extern const ChunkHandler _labelmaps_chunk_handlers[] = { static const ChunkHandler labelmaps_chunk_handlers[] = {
{ 'RAIL', Save_RAIL, Load_RAIL, nullptr, nullptr, CH_ARRAY | CH_LAST}, { 'RAIL', Save_RAIL, Load_RAIL, nullptr, nullptr, CH_ARRAY },
}; };
extern const ChunkHandlerTable _labelmaps_chunk_handlers(labelmaps_chunk_handlers);

@ -328,8 +328,10 @@ static void Ptrs_LGRS()
SlObject(&LinkGraphSchedule::instance, GetLinkGraphScheduleDesc()); SlObject(&LinkGraphSchedule::instance, GetLinkGraphScheduleDesc());
} }
extern const ChunkHandler _linkgraph_chunk_handlers[] = { static const ChunkHandler linkgraph_chunk_handlers[] = {
{ 'LGRP', Save_LGRP, Load_LGRP, nullptr, nullptr, CH_ARRAY }, { 'LGRP', Save_LGRP, Load_LGRP, nullptr, nullptr, CH_ARRAY },
{ 'LGRJ', Save_LGRJ, Load_LGRJ, nullptr, nullptr, CH_ARRAY }, { 'LGRJ', Save_LGRJ, Load_LGRJ, nullptr, nullptr, CH_ARRAY },
{ 'LGRS', Save_LGRS, Load_LGRS, Ptrs_LGRS, nullptr, CH_LAST } { 'LGRS', Save_LGRS, Load_LGRS, Ptrs_LGRS, nullptr, CH_RIFF }
}; };
extern const ChunkHandlerTable _linkgraph_chunk_handlers(linkgraph_chunk_handlers);

@ -296,17 +296,19 @@ static void Save_WMAP()
#endif #endif
} }
extern const ChunkHandler _map_chunk_handlers[] = { static const ChunkHandler map_chunk_handlers[] = {
{ 'MAPS', Save_MAPS, Load_MAPS, nullptr, Check_MAPS, CH_RIFF }, { 'MAPS', Save_MAPS, Load_MAPS, nullptr, Check_MAPS, CH_RIFF },
{ 'MAPT', nullptr, Load_MAPT, nullptr, nullptr, CH_RIFF }, { 'MAPT', nullptr, Load_MAPT, nullptr, nullptr, CH_RIFF },
{ 'MAPH', nullptr, Load_MAPH, nullptr, Check_MAPH, CH_RIFF }, { 'MAPH', nullptr, Load_MAPH, nullptr, Check_MAPH, CH_RIFF },
{ 'MAPO', nullptr, Load_MAP1, nullptr, nullptr, CH_RIFF }, { 'MAPO', nullptr, Load_MAP1, nullptr, nullptr, CH_RIFF },
{ 'MAP2', nullptr, Load_MAP2, nullptr, nullptr, CH_RIFF }, { 'MAP2', nullptr, Load_MAP2, nullptr, nullptr, CH_RIFF },
{ 'M3LO', nullptr, Load_MAP3, nullptr, nullptr, CH_RIFF }, { 'M3LO', nullptr, Load_MAP3, nullptr, nullptr, CH_RIFF },
{ 'M3HI', nullptr, Load_MAP4, nullptr, nullptr, CH_RIFF }, { 'M3HI', nullptr, Load_MAP4, nullptr, nullptr, CH_RIFF },
{ 'MAP5', nullptr, Load_MAP5, nullptr, nullptr, CH_RIFF }, { 'MAP5', nullptr, Load_MAP5, nullptr, nullptr, CH_RIFF },
{ 'MAPE', nullptr, Load_MAP6, nullptr, nullptr, CH_RIFF }, { 'MAPE', nullptr, Load_MAP6, nullptr, nullptr, CH_RIFF },
{ 'MAP7', nullptr, Load_MAP7, nullptr, nullptr, CH_RIFF }, { 'MAP7', nullptr, Load_MAP7, nullptr, nullptr, CH_RIFF },
{ 'MAP8', nullptr, Load_MAP8, nullptr, nullptr, CH_RIFF }, { 'MAP8', nullptr, Load_MAP8, nullptr, nullptr, CH_RIFF },
{ 'WMAP', Save_WMAP, Load_WMAP, nullptr, nullptr, CH_RIFF | CH_LAST }, { 'WMAP', Save_WMAP, Load_WMAP, nullptr, nullptr, CH_RIFF },
}; };
extern const ChunkHandlerTable _map_chunk_handlers(map_chunk_handlers);

@ -160,7 +160,9 @@ static void SaveLoad_VIEW()
SlGlobList(_view_desc); SlGlobList(_view_desc);
} }
extern const ChunkHandler _misc_chunk_handlers[] = { static const ChunkHandler misc_chunk_handlers[] = {
{ 'DATE', SaveLoad_DATE, SaveLoad_DATE, nullptr, Check_DATE, CH_RIFF}, { 'DATE', SaveLoad_DATE, SaveLoad_DATE, nullptr, Check_DATE, CH_RIFF },
{ 'VIEW', SaveLoad_VIEW, SaveLoad_VIEW, nullptr, nullptr, CH_RIFF | CH_LAST}, { 'VIEW', SaveLoad_VIEW, SaveLoad_VIEW, nullptr, nullptr, CH_RIFF },
}; };
extern const ChunkHandlerTable _misc_chunk_handlers(misc_chunk_handlers);

@ -119,6 +119,8 @@ static void Check_NGRF()
Load_NGRF_common(_load_check_data.grfconfig); Load_NGRF_common(_load_check_data.grfconfig);
} }
extern const ChunkHandler _newgrf_chunk_handlers[] = { static const ChunkHandler newgrf_chunk_handlers[] = {
{ 'NGRF', Save_NGRF, Load_NGRF, nullptr, Check_NGRF, CH_ARRAY | CH_LAST } { 'NGRF', Save_NGRF, Load_NGRF, nullptr, Check_NGRF, CH_ARRAY }
}; };
extern const ChunkHandlerTable _newgrf_chunk_handlers(newgrf_chunk_handlers);

@ -66,7 +66,9 @@ static void Load_OBID()
Load_NewGRFMapping(_object_mngr); Load_NewGRFMapping(_object_mngr);
} }
extern const ChunkHandler _object_chunk_handlers[] = { static const ChunkHandler object_chunk_handlers[] = {
{ 'OBID', Save_OBID, Load_OBID, nullptr, nullptr, CH_ARRAY }, { 'OBID', Save_OBID, Load_OBID, nullptr, nullptr, CH_ARRAY },
{ 'OBJS', Save_OBJS, Load_OBJS, Ptrs_OBJS, nullptr, CH_ARRAY | CH_LAST}, { 'OBJS', Save_OBJS, Load_OBJS, Ptrs_OBJS, nullptr, CH_ARRAY },
}; };
extern const ChunkHandlerTable _object_chunk_handlers(object_chunk_handlers);

@ -371,9 +371,11 @@ static void Ptrs_BKOR()
} }
} }
extern const ChunkHandler _order_chunk_handlers[] = { static const ChunkHandler order_chunk_handlers[] = {
{ 'BKOR', Save_BKOR, Load_BKOR, Ptrs_BKOR, nullptr, CH_ARRAY}, { 'BKOR', Save_BKOR, Load_BKOR, Ptrs_BKOR, nullptr, CH_ARRAY },
{ 'ORDR', Save_ORDR, Load_ORDR, Ptrs_ORDR, nullptr, CH_ARRAY}, { 'ORDR', Save_ORDR, Load_ORDR, Ptrs_ORDR, nullptr, CH_ARRAY },
{ 'ORDL', Save_ORDL, Load_ORDL, Ptrs_ORDL, nullptr, CH_ARRAY}, { 'ORDL', Save_ORDL, Load_ORDL, Ptrs_ORDL, nullptr, CH_ARRAY },
{ 'ORDX', Save_ORDX, Load_ORDX, nullptr, nullptr, CH_SPARSE_ARRAY | CH_LAST}, { 'ORDX', Save_ORDX, Load_ORDX, nullptr, nullptr, CH_SPARSE_ARRAY },
}; };
extern const ChunkHandlerTable _order_chunk_handlers(order_chunk_handlers);

@ -89,7 +89,9 @@ static void Load_PLANLINE()
} }
/** Chunk handlers related to plans. */ /** Chunk handlers related to plans. */
extern const ChunkHandler _plan_chunk_handlers[] = { static const ChunkHandler plan_chunk_handlers[] = {
{ 'PLAN', Save_PLAN, Load_PLAN, nullptr, nullptr, CH_ARRAY}, { 'PLAN', Save_PLAN, Load_PLAN, nullptr, nullptr, CH_ARRAY },
{ 'PLLN', nullptr, Load_PLANLINE, nullptr, nullptr, CH_ARRAY | CH_LAST}, { 'PLLN', nullptr, Load_PLANLINE, nullptr, nullptr, CH_ARRAY },
}; };
extern const ChunkHandlerTable _plan_chunk_handlers(plan_chunk_handlers);

@ -246,106 +246,112 @@ MemoryDumper *MemoryDumper::GetCurrent()
return _sl.dumper; return _sl.dumper;
} }
/* these define the chunks */ static const std::vector<ChunkHandler> &ChunkHandlers()
extern const ChunkHandler _version_ext_chunk_handlers[]; {
extern const ChunkHandler _gamelog_chunk_handlers[]; /* These define the chunks */
extern const ChunkHandler _map_chunk_handlers[]; extern const ChunkHandlerTable _version_ext_chunk_handlers;
extern const ChunkHandler _misc_chunk_handlers[]; extern const ChunkHandlerTable _gamelog_chunk_handlers;
extern const ChunkHandler _name_chunk_handlers[]; extern const ChunkHandlerTable _map_chunk_handlers;
extern const ChunkHandler _cheat_chunk_handlers[] ; extern const ChunkHandlerTable _misc_chunk_handlers;
extern const ChunkHandler _setting_chunk_handlers[]; extern const ChunkHandlerTable _name_chunk_handlers;
extern const ChunkHandler _company_chunk_handlers[]; extern const ChunkHandlerTable _cheat_chunk_handlers;
extern const ChunkHandler _engine_chunk_handlers[]; extern const ChunkHandlerTable _setting_chunk_handlers;
extern const ChunkHandler _veh_chunk_handlers[]; extern const ChunkHandlerTable _company_chunk_handlers;
extern const ChunkHandler _waypoint_chunk_handlers[]; extern const ChunkHandlerTable _engine_chunk_handlers;
extern const ChunkHandler _depot_chunk_handlers[]; extern const ChunkHandlerTable _veh_chunk_handlers;
extern const ChunkHandler _order_chunk_handlers[]; extern const ChunkHandlerTable _waypoint_chunk_handlers;
extern const ChunkHandler _town_chunk_handlers[]; extern const ChunkHandlerTable _depot_chunk_handlers;
extern const ChunkHandler _sign_chunk_handlers[]; extern const ChunkHandlerTable _order_chunk_handlers;
extern const ChunkHandler _station_chunk_handlers[]; extern const ChunkHandlerTable _town_chunk_handlers;
extern const ChunkHandler _industry_chunk_handlers[]; extern const ChunkHandlerTable _sign_chunk_handlers;
extern const ChunkHandler _economy_chunk_handlers[]; extern const ChunkHandlerTable _station_chunk_handlers;
extern const ChunkHandler _subsidy_chunk_handlers[]; extern const ChunkHandlerTable _industry_chunk_handlers;
extern const ChunkHandler _cargomonitor_chunk_handlers[]; extern const ChunkHandlerTable _economy_chunk_handlers;
extern const ChunkHandler _goal_chunk_handlers[]; extern const ChunkHandlerTable _subsidy_chunk_handlers;
extern const ChunkHandler _story_page_chunk_handlers[]; extern const ChunkHandlerTable _cargomonitor_chunk_handlers;
extern const ChunkHandler _ai_chunk_handlers[]; extern const ChunkHandlerTable _goal_chunk_handlers;
extern const ChunkHandler _game_chunk_handlers[]; extern const ChunkHandlerTable _story_page_chunk_handlers;
extern const ChunkHandler _animated_tile_chunk_handlers[]; extern const ChunkHandlerTable _ai_chunk_handlers;
extern const ChunkHandler _newgrf_chunk_handlers[]; extern const ChunkHandlerTable _game_chunk_handlers;
extern const ChunkHandler _group_chunk_handlers[]; extern const ChunkHandlerTable _animated_tile_chunk_handlers;
extern const ChunkHandler _cargopacket_chunk_handlers[]; extern const ChunkHandlerTable _newgrf_chunk_handlers;
extern const ChunkHandler _autoreplace_chunk_handlers[]; extern const ChunkHandlerTable _group_chunk_handlers;
extern const ChunkHandler _labelmaps_chunk_handlers[]; extern const ChunkHandlerTable _cargopacket_chunk_handlers;
extern const ChunkHandler _linkgraph_chunk_handlers[]; extern const ChunkHandlerTable _autoreplace_chunk_handlers;
extern const ChunkHandler _airport_chunk_handlers[]; extern const ChunkHandlerTable _labelmaps_chunk_handlers;
extern const ChunkHandler _object_chunk_handlers[]; extern const ChunkHandlerTable _linkgraph_chunk_handlers;
extern const ChunkHandler _persistent_storage_chunk_handlers[]; extern const ChunkHandlerTable _airport_chunk_handlers;
extern const ChunkHandler _trace_restrict_chunk_handlers[]; extern const ChunkHandlerTable _object_chunk_handlers;
extern const ChunkHandler _signal_chunk_handlers[]; extern const ChunkHandlerTable _persistent_storage_chunk_handlers;
extern const ChunkHandler _plan_chunk_handlers[]; extern const ChunkHandlerTable _trace_restrict_chunk_handlers;
extern const ChunkHandler _template_replacement_chunk_handlers[]; extern const ChunkHandlerTable _signal_chunk_handlers;
extern const ChunkHandler _template_vehicle_chunk_handlers[]; extern const ChunkHandlerTable _plan_chunk_handlers;
extern const ChunkHandler _bridge_signal_chunk_handlers[]; extern const ChunkHandlerTable _template_replacement_chunk_handlers;
extern const ChunkHandler _tunnel_chunk_handlers[]; extern const ChunkHandlerTable _template_vehicle_chunk_handlers;
extern const ChunkHandler _train_speed_adaptation_chunk_handlers[]; extern const ChunkHandlerTable _bridge_signal_chunk_handlers;
extern const ChunkHandler _debug_chunk_handlers[]; extern const ChunkHandlerTable _tunnel_chunk_handlers;
extern const ChunkHandlerTable _train_speed_adaptation_chunk_handlers;
/** Array of all chunks in a savegame, \c nullptr terminated. */ extern const ChunkHandlerTable _debug_chunk_handlers;
static const ChunkHandler * const _chunk_handlers[] = {
_version_ext_chunk_handlers, // this should be first, such that it is saved first, as when loading it affects the loading of subsequent chunks /** List of all chunks in a savegame. */
_gamelog_chunk_handlers, static const ChunkHandlerTable _chunk_handler_tables[] = {
_map_chunk_handlers, _version_ext_chunk_handlers,
_misc_chunk_handlers, _gamelog_chunk_handlers,
_name_chunk_handlers, _map_chunk_handlers,
_cheat_chunk_handlers, _misc_chunk_handlers,
_setting_chunk_handlers, _name_chunk_handlers,
_veh_chunk_handlers, _cheat_chunk_handlers,
_waypoint_chunk_handlers, _setting_chunk_handlers,
_depot_chunk_handlers, _veh_chunk_handlers,
_order_chunk_handlers, _waypoint_chunk_handlers,
_industry_chunk_handlers, _depot_chunk_handlers,
_economy_chunk_handlers, _order_chunk_handlers,
_subsidy_chunk_handlers, _industry_chunk_handlers,
_cargomonitor_chunk_handlers, _economy_chunk_handlers,
_goal_chunk_handlers, _subsidy_chunk_handlers,
_story_page_chunk_handlers, _cargomonitor_chunk_handlers,
_engine_chunk_handlers, _goal_chunk_handlers,
_town_chunk_handlers, _story_page_chunk_handlers,
_sign_chunk_handlers, _engine_chunk_handlers,
_station_chunk_handlers, _town_chunk_handlers,
_company_chunk_handlers, _sign_chunk_handlers,
_ai_chunk_handlers, _station_chunk_handlers,
_game_chunk_handlers, _company_chunk_handlers,
_animated_tile_chunk_handlers, _ai_chunk_handlers,
_newgrf_chunk_handlers, _game_chunk_handlers,
_group_chunk_handlers, _animated_tile_chunk_handlers,
_cargopacket_chunk_handlers, _newgrf_chunk_handlers,
_autoreplace_chunk_handlers, _group_chunk_handlers,
_labelmaps_chunk_handlers, _cargopacket_chunk_handlers,
_linkgraph_chunk_handlers, _autoreplace_chunk_handlers,
_airport_chunk_handlers, _labelmaps_chunk_handlers,
_object_chunk_handlers, _linkgraph_chunk_handlers,
_persistent_storage_chunk_handlers, _airport_chunk_handlers,
_trace_restrict_chunk_handlers, _object_chunk_handlers,
_signal_chunk_handlers, _persistent_storage_chunk_handlers,
_plan_chunk_handlers, _trace_restrict_chunk_handlers,
_template_replacement_chunk_handlers, _signal_chunk_handlers,
_template_vehicle_chunk_handlers, _plan_chunk_handlers,
_bridge_signal_chunk_handlers, _template_replacement_chunk_handlers,
_tunnel_chunk_handlers, _template_vehicle_chunk_handlers,
_train_speed_adaptation_chunk_handlers, _bridge_signal_chunk_handlers,
_debug_chunk_handlers, _tunnel_chunk_handlers,
nullptr, _train_speed_adaptation_chunk_handlers,
}; _debug_chunk_handlers,
};
static std::vector<ChunkHandler> _chunk_handlers;
if (_chunk_handlers.empty()) {
for (auto &chunk_handler_table : _chunk_handler_tables) {
for (auto &chunk_handler : chunk_handler_table) {
_chunk_handlers.push_back(chunk_handler);
}
}
}
/** return _chunk_handlers;
* Iterate over all chunk handlers. }
* @param ch the chunk handler iterator
*/
#define FOR_ALL_CHUNK_HANDLERS(ch) \
for (const ChunkHandler * const *chsc = _chunk_handlers; *chsc != nullptr; chsc++) \
for (const ChunkHandler *ch = *chsc; ch != nullptr; ch = (ch->flags & CH_LAST) ? nullptr : ch + 1)
/** Null all pointers (convert index -> nullptr) */ /** Null all pointers (convert index -> nullptr) */
static void SlNullPointers() static void SlNullPointers()
@ -358,10 +364,10 @@ static void SlNullPointers()
_sl_version = SAVEGAME_VERSION; _sl_version = SAVEGAME_VERSION;
SlXvSetCurrentState(); SlXvSetCurrentState();
FOR_ALL_CHUNK_HANDLERS(ch) { for (auto &ch : ChunkHandlers()) {
if (ch->ptrs_proc != nullptr) { if (ch.ptrs_proc != nullptr) {
DEBUG(sl, 3, "Nulling pointers for %c%c%c%c", ch->id >> 24, ch->id >> 16, ch->id >> 8, ch->id); DEBUG(sl, 3, "Nulling pointers for %c%c%c%c", ch.id >> 24, ch.id >> 16, ch.id >> 8, ch.id);
ch->ptrs_proc(); ch.ptrs_proc();
} }
} }
@ -1682,14 +1688,12 @@ size_t SlCalcObjMemberLength(const void *object, const SaveLoad &sld)
return 0; return 0;
} }
#ifdef OTTD_ASSERT
/** /**
* Check whether the variable size of the variable in the saveload configuration * Check whether the variable size of the variable in the saveload configuration
* matches with the actual variable size. * matches with the actual variable size.
* @param sld The saveload configuration to test. * @param sld The saveload configuration to test.
*/ */
static bool IsVariableSizeRight(const SaveLoad &sld) [[maybe_unused]] static bool IsVariableSizeRight(const SaveLoad &sld)
{ {
switch (sld.cmd) { switch (sld.cmd) {
case SL_VAR: case SL_VAR:
@ -1730,15 +1734,11 @@ static bool IsVariableSizeRight(const SaveLoad &sld)
} }
} }
#endif /* OTTD_ASSERT */
void SlFilterObject(const SaveLoadTable &slt, std::vector<SaveLoad> &save); void SlFilterObject(const SaveLoadTable &slt, std::vector<SaveLoad> &save);
static void SlFilterObjectMember(const SaveLoad &sld, std::vector<SaveLoad> &save) static void SlFilterObjectMember(const SaveLoad &sld, std::vector<SaveLoad> &save)
{ {
#ifdef OTTD_ASSERT
assert(IsVariableSizeRight(sld)); assert(IsVariableSizeRight(sld));
#endif
switch (sld.cmd) { switch (sld.cmd) {
case SL_VAR: case SL_VAR:
@ -1817,9 +1817,7 @@ std::vector<SaveLoad> SlFilterObject(const SaveLoadTable &slt)
template <SaveLoadAction action, bool check_version> template <SaveLoadAction action, bool check_version>
bool SlObjectMemberGeneric(void *ptr, const SaveLoad &sld) bool SlObjectMemberGeneric(void *ptr, const SaveLoad &sld)
{ {
#ifdef OTTD_ASSERT
if (check_version) assert(IsVariableSizeRight(sld)); if (check_version) assert(IsVariableSizeRight(sld));
#endif
VarType conv = GB(sld.conv, 0, 8); VarType conv = GB(sld.conv, 0, 8);
switch (sld.cmd) { switch (sld.cmd) {
@ -2043,7 +2041,7 @@ inline void SlRIFFSpringPPCheck(size_t len)
* Load a chunk of data (eg vehicles, stations, etc.) * Load a chunk of data (eg vehicles, stations, etc.)
* @param ch The chunkhandler that will be used for the operation * @param ch The chunkhandler that will be used for the operation
*/ */
static void SlLoadChunk(const ChunkHandler *ch) static void SlLoadChunk(const ChunkHandler &ch)
{ {
byte m = SlReadByte(); byte m = SlReadByte();
size_t len; size_t len;
@ -2064,11 +2062,11 @@ static void SlLoadChunk(const ChunkHandler *ch)
switch (m) { switch (m) {
case CH_ARRAY: case CH_ARRAY:
_sl.array_index = 0; _sl.array_index = 0;
ch->load_proc(); ch.load_proc();
if (_next_offs != 0) SlErrorCorrupt("Invalid array length"); if (_next_offs != 0) SlErrorCorrupt("Invalid array length");
break; break;
case CH_SPARSE_ARRAY: case CH_SPARSE_ARRAY:
ch->load_proc(); ch.load_proc();
if (_next_offs != 0) SlErrorCorrupt("Invalid array length"); if (_next_offs != 0) SlErrorCorrupt("Invalid array length");
break; break;
default: default:
@ -2089,7 +2087,7 @@ static void SlLoadChunk(const ChunkHandler *ch)
_sl.obj_len = len; _sl.obj_len = len;
endoffs = _sl.reader->GetSize() + len; endoffs = _sl.reader->GetSize() + len;
ch->load_proc(); ch.load_proc();
if (_sl.reader->GetSize() != endoffs) { if (_sl.reader->GetSize() != endoffs) {
DEBUG(sl, 1, "Invalid chunk size: " PRINTF_SIZE " != " PRINTF_SIZE ", (" PRINTF_SIZE ")", _sl.reader->GetSize(), endoffs, len); DEBUG(sl, 1, "Invalid chunk size: " PRINTF_SIZE " != " PRINTF_SIZE ", (" PRINTF_SIZE ")", _sl.reader->GetSize(), endoffs, len);
SlErrorCorrupt("Invalid chunk size"); SlErrorCorrupt("Invalid chunk size");
@ -2192,21 +2190,21 @@ static void SlLoadCheckChunk(const ChunkHandler *ch)
* prefixed by an ID identifying it, followed by data, and terminator where appropriate * prefixed by an ID identifying it, followed by data, and terminator where appropriate
* @param ch The chunkhandler that will be used for the operation * @param ch The chunkhandler that will be used for the operation
*/ */
static void SlSaveChunk(const ChunkHandler *ch) static void SlSaveChunk(const ChunkHandler &ch)
{ {
ChunkSaveLoadProc *proc = ch->save_proc; ChunkSaveLoadProc *proc = ch.save_proc;
/* Don't save any chunk information if there is no save handler. */ /* Don't save any chunk information if there is no save handler. */
if (proc == nullptr) return; if (proc == nullptr) return;
SlWriteUint32(ch->id); SlWriteUint32(ch.id);
DEBUG(sl, 2, "Saving chunk %c%c%c%c", ch->id >> 24, ch->id >> 16, ch->id >> 8, ch->id); DEBUG(sl, 2, "Saving chunk %c%c%c%c", ch.id >> 24, ch.id >> 16, ch.id >> 8, ch.id);
size_t written = 0; size_t written = 0;
if (_debug_sl_level >= 3) written = SlGetBytesWritten(); if (_debug_sl_level >= 3) written = SlGetBytesWritten();
_sl.block_mode = ch->flags & CH_TYPE_MASK; _sl.block_mode = ch.type;
switch (ch->flags & CH_TYPE_MASK) { switch (ch.type) {
case CH_RIFF: case CH_RIFF:
_sl.need_length = NL_WANTLENGTH; _sl.need_length = NL_WANTLENGTH;
proc(); proc();
@ -2225,13 +2223,13 @@ static void SlSaveChunk(const ChunkHandler *ch)
default: NOT_REACHED(); default: NOT_REACHED();
} }
DEBUG(sl, 3, "Saved chunk %c%c%c%c (" PRINTF_SIZE " bytes)", ch->id >> 24, ch->id >> 16, ch->id >> 8, ch->id, SlGetBytesWritten() - written); DEBUG(sl, 3, "Saved chunk %c%c%c%c (" PRINTF_SIZE " bytes)", ch.id >> 24, ch.id >> 16, ch.id >> 8, ch.id, SlGetBytesWritten() - written);
} }
/** Save all chunks */ /** Save all chunks */
static void SlSaveChunks() static void SlSaveChunks()
{ {
FOR_ALL_CHUNK_HANDLERS(ch) { for (auto &ch : ChunkHandlers()) {
SlSaveChunk(ch); SlSaveChunk(ch);
} }
@ -2247,7 +2245,7 @@ static void SlSaveChunks()
*/ */
static const ChunkHandler *SlFindChunkHandler(uint32 id) static const ChunkHandler *SlFindChunkHandler(uint32 id)
{ {
FOR_ALL_CHUNK_HANDLERS(ch) if (ch->id == id) return ch; for (auto &ch : ChunkHandlers()) if (ch.id == id) return &ch;
return nullptr; return nullptr;
} }
@ -2267,7 +2265,7 @@ static void SlLoadChunks()
if (ch == nullptr) { if (ch == nullptr) {
SlErrorCorrupt("Unknown chunk type"); SlErrorCorrupt("Unknown chunk type");
} else { } else {
SlLoadChunk(ch); SlLoadChunk(*ch);
} }
} }
DEBUG(sl, 3, "Loaded chunk %c%c%c%c (" PRINTF_SIZE " bytes)", id >> 24, id >> 16, id >> 8, id, SlGetBytesRead() - read); DEBUG(sl, 3, "Loaded chunk %c%c%c%c (" PRINTF_SIZE " bytes)", id >> 24, id >> 16, id >> 8, id, SlGetBytesRead() - read);
@ -2301,10 +2299,10 @@ static void SlFixPointers()
{ {
_sl.action = SLA_PTRS; _sl.action = SLA_PTRS;
FOR_ALL_CHUNK_HANDLERS(ch) { for (auto &ch : ChunkHandlers()) {
if (ch->ptrs_proc != nullptr) { if (ch.ptrs_proc != nullptr) {
DEBUG(sl, 3, "Fixing pointers for %c%c%c%c", ch->id >> 24, ch->id >> 16, ch->id >> 8, ch->id); DEBUG(sl, 3, "Fixing pointers for %c%c%c%c", ch.id >> 24, ch.id >> 16, ch.id >> 8, ch.id);
ch->ptrs_proc(); ch.ptrs_proc();
} }
} }

@ -18,6 +18,7 @@
#include <stdarg.h> #include <stdarg.h>
#include <vector> #include <vector>
#include <string> #include <string>
#include <vector>
/** SaveLoad versions /** SaveLoad versions
* Previous savegame versions, the trunk revision where they were * Previous savegame versions, the trunk revision where they were
@ -415,6 +416,14 @@ bool IsNetworkServerSave();
typedef void ChunkSaveLoadProc(); typedef void ChunkSaveLoadProc();
typedef void AutolengthProc(void *arg); typedef void AutolengthProc(void *arg);
/** Type of a chunk. */
enum ChunkType {
CH_RIFF = 0,
CH_ARRAY = 1,
CH_SPARSE_ARRAY = 2,
CH_EXT_HDR = 15, ///< Extended chunk header
};
/** Handlers and description of chunk. */ /** Handlers and description of chunk. */
struct ChunkHandler { struct ChunkHandler {
uint32 id; ///< Unique ID (4 letters). uint32 id; ///< Unique ID (4 letters).
@ -422,13 +431,16 @@ struct ChunkHandler {
ChunkSaveLoadProc *load_proc; ///< Load procedure of the chunk. ChunkSaveLoadProc *load_proc; ///< Load procedure of the chunk.
ChunkSaveLoadProc *ptrs_proc; ///< Manipulate pointers in the chunk. ChunkSaveLoadProc *ptrs_proc; ///< Manipulate pointers in the chunk.
ChunkSaveLoadProc *load_check_proc; ///< Load procedure for game preview. ChunkSaveLoadProc *load_check_proc; ///< Load procedure for game preview.
uint32 flags; ///< Flags of the chunk. @see ChunkType ChunkType type; ///< Type of the chunk. @see ChunkType
}; };
struct NullStruct { struct NullStruct {
byte null; byte null;
}; };
/** A table of ChunkHandler entries. */
using ChunkHandlerTable = span<const ChunkHandler>;
/** Type of reference (#SLE_REF, #SLE_CONDREF). */ /** Type of reference (#SLE_REF, #SLE_CONDREF). */
enum SLRefType { enum SLRefType {
REF_ORDER = 0, ///< Load/save a reference to an order. REF_ORDER = 0, ///< Load/save a reference to an order.
@ -446,16 +458,6 @@ enum SLRefType {
REF_TEMPLATE_VEHICLE = 12, ///< Load/save a reference to a template vehicle REF_TEMPLATE_VEHICLE = 12, ///< Load/save a reference to a template vehicle
}; };
/** Flags of a chunk. */
enum ChunkType {
CH_RIFF = 0,
CH_ARRAY = 1,
CH_SPARSE_ARRAY = 2,
CH_TYPE_MASK = 3,
CH_EXT_HDR = 15, ///< Extended chunk header
CH_LAST = 8, ///< Last chunk in this array.
};
/** Flags for chunk extended headers */ /** Flags for chunk extended headers */
enum SaveLoadChunkExtHeaderFlags { enum SaveLoadChunkExtHeaderFlags {
SLCEHF_BIG_RIFF = 1 << 0, ///< This block uses a 60-bit RIFF chunk size SLCEHF_BIG_RIFF = 1 << 0, ///< This block uses a 60-bit RIFF chunk size
@ -541,8 +543,6 @@ enum VarTypes {
SLF_NO_NETWORK_SYNC = 1 << 10, ///< do not synchronize over network (but it is saved if SLF_NOT_IN_SAVE is not set) SLF_NO_NETWORK_SYNC = 1 << 10, ///< do not synchronize over network (but it is saved if SLF_NOT_IN_SAVE is not set)
SLF_ALLOW_CONTROL = 1 << 11, ///< allow control codes in the strings SLF_ALLOW_CONTROL = 1 << 11, ///< allow control codes in the strings
SLF_ALLOW_NEWLINE = 1 << 12, ///< allow new lines in the strings SLF_ALLOW_NEWLINE = 1 << 12, ///< allow new lines in the strings
SLF_HEX = 1 << 13, ///< print numbers as hex in the config file (only useful for unsigned)
/* 2 more possible flags */
}; };
typedef uint32 VarType; typedef uint32 VarType;

@ -307,6 +307,8 @@ static void Load_SPRG()
} }
} }
extern const ChunkHandler _signal_chunk_handlers[] = { extern const ChunkHandler signal_chunk_handlers[] = {
{ 'SPRG', Save_SPRG, Load_SPRG, nullptr, nullptr, CH_RIFF | CH_LAST}, { 'SPRG', Save_SPRG, Load_SPRG, nullptr, nullptr, CH_RIFF },
}; };
extern const ChunkHandlerTable _signal_chunk_handlers(signal_chunk_handlers);

@ -62,6 +62,8 @@ static void Load_SIGN()
} }
/** Chunk handlers related to signs. */ /** Chunk handlers related to signs. */
extern const ChunkHandler _sign_chunk_handlers[] = { static const ChunkHandler sign_chunk_handlers[] = {
{ 'SIGN', Save_SIGN, Load_SIGN, nullptr, nullptr, CH_ARRAY | CH_LAST}, { 'SIGN', Save_SIGN, Load_SIGN, nullptr, nullptr, CH_ARRAY },
}; };
extern const ChunkHandlerTable _sign_chunk_handlers(sign_chunk_handlers);

@ -743,9 +743,11 @@ static void Load_DOCK()
SlSkipArray(); SlSkipArray();
} }
extern const ChunkHandler _station_chunk_handlers[] = { static const ChunkHandler station_chunk_handlers[] = {
{ 'STNS', nullptr, Load_STNS, Ptrs_STNS, nullptr, CH_ARRAY }, { 'STNS', nullptr, Load_STNS, Ptrs_STNS, nullptr, CH_ARRAY },
{ 'STNN', Save_STNN, Load_STNN, Ptrs_STNN, nullptr, CH_ARRAY }, { 'STNN', Save_STNN, Load_STNN, Ptrs_STNN, nullptr, CH_ARRAY },
{ 'ROAD', Save_ROADSTOP, Load_ROADSTOP, Ptrs_ROADSTOP, nullptr, CH_ARRAY}, { 'ROAD', Save_ROADSTOP, Load_ROADSTOP, Ptrs_ROADSTOP, nullptr, CH_ARRAY },
{ 'DOCK', nullptr, Load_DOCK, nullptr, nullptr, CH_ARRAY | CH_LAST}, { 'DOCK', nullptr, Load_DOCK, nullptr, nullptr, CH_ARRAY },
}; };
extern const ChunkHandlerTable _station_chunk_handlers(station_chunk_handlers);

@ -44,6 +44,8 @@ static void Save_PSAC()
} }
/** Chunk handler for persistent storages. */ /** Chunk handler for persistent storages. */
extern const ChunkHandler _persistent_storage_chunk_handlers[] = { static const ChunkHandler persistent_storage_chunk_handlers[] = {
{ 'PSAC', Save_PSAC, Load_PSAC, nullptr, nullptr, CH_ARRAY | CH_LAST}, { 'PSAC', Save_PSAC, Load_PSAC, nullptr, nullptr, CH_ARRAY },
}; };
extern const ChunkHandlerTable _persistent_storage_chunk_handlers(persistent_storage_chunk_handlers);

@ -95,7 +95,9 @@ static void Load_STORY_PAGE()
_story_page_next_sort_value = max_sort_value + 1; _story_page_next_sort_value = max_sort_value + 1;
} }
extern const ChunkHandler _story_page_chunk_handlers[] = { static const ChunkHandler story_page_chunk_handlers[] = {
{ 'STPE', Save_STORY_PAGE_ELEMENT, Load_STORY_PAGE_ELEMENT, nullptr, nullptr, CH_ARRAY}, { 'STPE', Save_STORY_PAGE_ELEMENT, Load_STORY_PAGE_ELEMENT, nullptr, nullptr, CH_ARRAY },
{ 'STPA', Save_STORY_PAGE, Load_STORY_PAGE, nullptr, nullptr, CH_ARRAY | CH_LAST}, { 'STPA', Save_STORY_PAGE, Load_STORY_PAGE, nullptr, nullptr, CH_ARRAY },
}; };
extern const ChunkHandlerTable _story_page_chunk_handlers(story_page_chunk_handlers);

@ -131,6 +131,8 @@ static void Load_NAME()
} }
/** Chunk handlers related to strings. */ /** Chunk handlers related to strings. */
extern const ChunkHandler _name_chunk_handlers[] = { static const ChunkHandler name_chunk_handlers[] = {
{ 'NAME', nullptr, Load_NAME, nullptr, nullptr, CH_ARRAY | CH_LAST}, { 'NAME', nullptr, Load_NAME, nullptr, nullptr, CH_ARRAY },
}; };
extern const ChunkHandlerTable _name_chunk_handlers(name_chunk_handlers);

@ -44,6 +44,8 @@ static void Load_SUBS()
} }
} }
extern const ChunkHandler _subsidy_chunk_handlers[] = { static const ChunkHandler subsidy_chunk_handlers[] = {
{ 'SUBS', Save_SUBS, Load_SUBS, nullptr, nullptr, CH_ARRAY | CH_LAST}, { 'SUBS', Save_SUBS, Load_SUBS, nullptr, nullptr, CH_ARRAY },
}; };
extern const ChunkHandlerTable _subsidy_chunk_handlers(subsidy_chunk_handlers);

@ -28,6 +28,8 @@ static void Load_TMPL_RPLS()
ReindexTemplateReplacements(); ReindexTemplateReplacements();
} }
extern const ChunkHandler _template_replacement_chunk_handlers[] = { extern const ChunkHandler template_replacement_chunk_handlers[] = {
{'TRPL', Save_TMPL_RPLS, Load_TMPL_RPLS, nullptr, nullptr, CH_ARRAY | CH_LAST}, { 'TRPL', Save_TMPL_RPLS, Load_TMPL_RPLS, nullptr, nullptr, CH_ARRAY },
}; };
extern const ChunkHandlerTable _template_replacement_chunk_handlers(template_replacement_chunk_handlers);

@ -151,6 +151,8 @@ void AfterLoadTemplateVehiclesUpdateProperties()
RestoreRandomSeeds(saved_seeds); RestoreRandomSeeds(saved_seeds);
} }
extern const ChunkHandler _template_vehicle_chunk_handlers[] = { extern const ChunkHandler template_vehicle_chunk_handlers[] = {
{'TMPL', Save_TMPLS, Load_TMPLS, Ptrs_TMPLS, nullptr, CH_ARRAY | CH_LAST}, { 'TMPL', Save_TMPLS, Load_TMPLS, Ptrs_TMPLS, nullptr, CH_ARRAY },
}; };
extern const ChunkHandlerTable _template_vehicle_chunk_handlers(template_vehicle_chunk_handlers);

@ -359,7 +359,9 @@ static void Ptrs_TOWN()
} }
/** Chunk handler for towns. */ /** Chunk handler for towns. */
extern const ChunkHandler _town_chunk_handlers[] = { static const ChunkHandler town_chunk_handlers[] = {
{ 'HIDS', Save_HIDS, Load_HIDS, nullptr, nullptr, CH_ARRAY }, { 'HIDS', Save_HIDS, Load_HIDS, nullptr, nullptr, CH_ARRAY },
{ 'CITY', Save_TOWN, Load_TOWN, Ptrs_TOWN, nullptr, CH_ARRAY | CH_LAST}, { 'CITY', Save_TOWN, Load_TOWN, Ptrs_TOWN, nullptr, CH_ARRAY },
}; };
extern const ChunkHandlerTable _town_chunk_handlers(town_chunk_handlers);

@ -214,9 +214,11 @@ void AfterLoadTraceRestrict()
} }
} }
extern const ChunkHandler _trace_restrict_chunk_handlers[] = { extern const ChunkHandler trace_restrict_chunk_handlers[] = {
{ 'TRRM', Save_TRRM, Load_TRRM, nullptr, nullptr, CH_SPARSE_ARRAY}, // Trace Restrict Mapping chunk { 'TRRM', Save_TRRM, Load_TRRM, nullptr, nullptr, CH_SPARSE_ARRAY }, // Trace Restrict Mapping chunk
{ 'TRRP', Save_TRRP, Load_TRRP, nullptr, nullptr, CH_ARRAY}, // Trace Restrict Mapping Program Pool chunk { 'TRRP', Save_TRRP, Load_TRRP, nullptr, nullptr, CH_ARRAY }, // Trace Restrict Mapping Program Pool chunk
{ 'TRRS', Save_TRRS, Load_TRRS, nullptr, nullptr, CH_ARRAY}, // Trace Restrict Slot Pool chunk { 'TRRS', Save_TRRS, Load_TRRS, nullptr, nullptr, CH_ARRAY }, // Trace Restrict Slot Pool chunk
{ 'TRRC', Save_TRRC, Load_TRRC, nullptr, nullptr, CH_ARRAY | CH_LAST}, // Trace Restrict Counter Pool chunk { 'TRRC', Save_TRRC, Load_TRRC, nullptr, nullptr, CH_ARRAY }, // Trace Restrict Counter Pool chunk
}; };
extern const ChunkHandlerTable _trace_restrict_chunk_handlers(trace_restrict_chunk_handlers);

@ -45,6 +45,8 @@ static void Save_TSAS()
} }
} }
extern const ChunkHandler _train_speed_adaptation_chunk_handlers[] = { extern const ChunkHandler train_speed_adaptation_chunk_handlers[] = {
{ 'TSAS', Save_TSAS, Load_TSAS, nullptr, nullptr, CH_SPARSE_ARRAY | CH_LAST}, { 'TSAS', Save_TSAS, Load_TSAS, nullptr, nullptr, CH_SPARSE_ARRAY },
}; };
extern const ChunkHandlerTable _train_speed_adaptation_chunk_handlers(train_speed_adaptation_chunk_handlers);

@ -42,6 +42,8 @@ static void Load_TUNN()
} }
extern const ChunkHandler _tunnel_chunk_handlers[] = { extern const ChunkHandler tunnel_chunk_handlers[] = {
{ 'TUNN', Save_TUNN, Load_TUNN, nullptr, nullptr, CH_ARRAY | CH_LAST}, { 'TUNN', Save_TUNN, Load_TUNN, nullptr, nullptr, CH_ARRAY },
}; };
extern const ChunkHandlerTable _tunnel_chunk_handlers(tunnel_chunk_handlers);

@ -1458,10 +1458,12 @@ void Load_VLKA()
} }
} }
extern const ChunkHandler _veh_chunk_handlers[] = { static const ChunkHandler veh_chunk_handlers[] = {
{ 'VEHS', Save_VEHS, Load_VEHS, Ptrs_VEHS, nullptr, CH_SPARSE_ARRAY}, { 'VEHS', Save_VEHS, Load_VEHS, Ptrs_VEHS, nullptr, CH_SPARSE_ARRAY },
{ 'VEOX', Save_VEOX, Load_VEOX, nullptr, nullptr, CH_SPARSE_ARRAY}, { 'VEOX', Save_VEOX, Load_VEOX, nullptr, nullptr, CH_SPARSE_ARRAY },
{ 'VESR', Save_VESR, Load_VESR, nullptr, nullptr, CH_SPARSE_ARRAY}, { 'VESR', Save_VESR, Load_VESR, nullptr, nullptr, CH_SPARSE_ARRAY },
{ 'VENC', Save_VENC, Load_VENC, nullptr, nullptr, CH_RIFF}, { 'VENC', Save_VENC, Load_VENC, nullptr, nullptr, CH_RIFF },
{ 'VLKA', Save_VLKA, Load_VLKA, nullptr, nullptr, CH_SPARSE_ARRAY | CH_LAST}, { 'VLKA', Save_VLKA, Load_VLKA, nullptr, nullptr, CH_SPARSE_ARRAY },
}; };
extern const ChunkHandlerTable _veh_chunk_handlers(veh_chunk_handlers);

@ -224,6 +224,8 @@ static void Ptrs_WAYP()
} }
} }
extern const ChunkHandler _waypoint_chunk_handlers[] = { static const ChunkHandler waypoint_chunk_handlers[] = {
{ 'CHKP', nullptr, Load_WAYP, Ptrs_WAYP, nullptr, CH_ARRAY | CH_LAST}, { 'CHKP', nullptr, Load_WAYP, Ptrs_WAYP, nullptr, CH_ARRAY },
}; };
extern const ChunkHandlerTable _waypoint_chunk_handlers(waypoint_chunk_handlers);

@ -668,8 +668,7 @@ SQRESULT Squirrel::LoadFile(HSQUIRRELVM vm, const char *filename, SQBool printer
} }
unsigned short bom = 0; unsigned short bom = 0;
if (size >= 2) { if (size >= 2) {
size_t sr = fread(&bom, 1, sizeof(bom), file); [[maybe_unused]] size_t sr = fread(&bom, 1, sizeof(bom), file);
(void)sr; // Inside tar, no point checking return value of fread
} }
SQLEXREADFUNC func; SQLEXREADFUNC func;

@ -301,8 +301,6 @@ void ListSettingDesc::FormatValue(char *buf, const char *last, const void *objec
} }
if (IsSignedVarMemType(this->save.conv)) { if (IsSignedVarMemType(this->save.conv)) {
buf += seprintf(buf, last, (i == 0) ? "%d" : ",%d", v); buf += seprintf(buf, last, (i == 0) ? "%d" : ",%d", v);
} else if (this->save.conv & SLF_HEX) {
buf += seprintf(buf, last, (i == 0) ? "0x%X" : ",0x%X", v);
} else { } else {
buf += seprintf(buf, last, (i == 0) ? "%u" : ",%u", v); buf += seprintf(buf, last, (i == 0) ? "%u" : ",%u", v);
} }
@ -423,9 +421,9 @@ void IntSettingDesc::MakeValueValidAndWrite(const void *object, int32 val) const
* Make the value valid given the limitations of this setting. * Make the value valid given the limitations of this setting.
* *
* In the case of int settings this is ensuring the value is between the minimum and * In the case of int settings this is ensuring the value is between the minimum and
* maximum value, with a special case for 0 if SGF_0ISDISABLED is set. * maximum value, with a special case for 0 if SF_GUI_0_IS_SPECIAL is set.
* This is generally done by clamping the value so it is within the allowed value range. * This is generally done by clamping the value so it is within the allowed value range.
* However, for SGF_MULTISTRING the default is used when the value is not valid. * However, for SF_GUI_DROPDOWN the default is used when the value is not valid.
* @param val The value to make valid. * @param val The value to make valid.
*/ */
void IntSettingDesc::MakeValueValid(int32 &val) const void IntSettingDesc::MakeValueValid(int32 &val) const
@ -444,10 +442,10 @@ void IntSettingDesc::MakeValueValid(int32 &val) const
case SLE_VAR_U16: case SLE_VAR_U16:
case SLE_VAR_I32: { case SLE_VAR_I32: {
/* Override the minimum value. No value below this->min, except special value 0 */ /* Override the minimum value. No value below this->min, except special value 0 */
if (!(this->flags & SGF_0ISDISABLED) || val != 0) { if (!(this->flags & SF_GUI_0_IS_SPECIAL) || val != 0) {
if (this->flags & SGF_ENUM) { if (this->flags & SF_ENUM) {
if (!ValidateEnumSetting(this, val)) val = (int32)(size_t)this->def; if (!ValidateEnumSetting(this, val)) val = (int32)(size_t)this->def;
} else if (!(this->flags & SGF_MULTISTRING)) { } else if (!(this->flags & SF_GUI_DROPDOWN)) {
/* Clamp value-type setting to its valid range */ /* Clamp value-type setting to its valid range */
val = Clamp(val, this->min, this->max); val = Clamp(val, this->min, this->max);
} else if (val < this->min || val > (int32)this->max) { } else if (val < this->min || val > (int32)this->max) {
@ -460,10 +458,10 @@ void IntSettingDesc::MakeValueValid(int32 &val) const
case SLE_VAR_U32: { case SLE_VAR_U32: {
/* Override the minimum value. No value below this->min, except special value 0 */ /* Override the minimum value. No value below this->min, except special value 0 */
uint32 uval = (uint32)val; uint32 uval = (uint32)val;
if (!(this->flags & SGF_0ISDISABLED) || uval != 0) { if (!(this->flags & SF_GUI_0_IS_SPECIAL) || uval != 0) {
if (this->flags & SGF_ENUM) { if (this->flags & SF_ENUM) {
if (!ValidateEnumSetting(this, val)) uval = (uint32)(size_t)this->def; if (!ValidateEnumSetting(this, val)) uval = (uint32)(size_t)this->def;
} else if (!(this->flags & SGF_MULTISTRING)) { } else if (!(this->flags & SF_GUI_DROPDOWN)) {
/* Clamp value-type setting to its valid range */ /* Clamp value-type setting to its valid range */
uval = ClampU(uval, this->min, this->max); uval = ClampU(uval, this->min, this->max);
} else if (uval < (uint)this->min || uval > this->max) { } else if (uval < (uint)this->min || uval > this->max) {
@ -558,7 +556,7 @@ static void IniLoadSettings(IniFile *ini, const SettingTable &settings_table, co
if (!SlIsObjectCurrentlyValid(sd->save.version_from, sd->save.version_to, sd->save.ext_feature_test)) continue; if (!SlIsObjectCurrentlyValid(sd->save.version_from, sd->save.version_to, sd->save.ext_feature_test)) continue;
if (sd->startup != only_startup) continue; if (sd->startup != only_startup) continue;
IniItem *item; IniItem *item;
if (sd->flags & SGF_NO_NEWGAME) { if (sd->flags & SF_NO_NEWGAME) {
item = nullptr; item = nullptr;
} else { } else {
/* For settings.xx.yy load the settings from [xx] yy = ? */ /* For settings.xx.yy load the settings from [xx] yy = ? */
@ -639,7 +637,7 @@ static void IniSaveSettings(IniFile *ini, const SettingTable &settings_table, co
* file, just continue with the next setting */ * file, just continue with the next setting */
if (!SlIsObjectCurrentlyValid(sd->save.version_from, sd->save.version_to, sd->save.ext_feature_test)) continue; if (!SlIsObjectCurrentlyValid(sd->save.version_from, sd->save.version_to, sd->save.ext_feature_test)) continue;
if (sd->save.conv & SLF_NOT_IN_CONFIG) continue; if (sd->save.conv & SLF_NOT_IN_CONFIG) continue;
if (sd->flags & SGF_NO_NEWGAME) continue; if (sd->flags & SF_NO_NEWGAME) continue;
/* XXX - wtf is this?? (group override?) */ /* XXX - wtf is this?? (group override?) */
std::string s{ sd->name }; std::string s{ sd->name };
@ -667,7 +665,7 @@ static void IniSaveSettings(IniFile *ini, const SettingTable &settings_table, co
void IntSettingDesc::FormatValue(char *buf, const char *last, const void *object) const void IntSettingDesc::FormatValue(char *buf, const char *last, const void *object) const
{ {
uint32 i = (uint32)this->Read(object); uint32 i = (uint32)this->Read(object);
seprintf(buf, last, IsSignedVarMemType(this->save.conv) ? "%d" : (this->save.conv & SLF_HEX) ? "%X" : "%u", i); seprintf(buf, last, IsSignedVarMemType(this->save.conv) ? "%d" : "%u", i);
} }
void BoolSettingDesc::FormatValue(char *buf, const char *last, const void *object) const void BoolSettingDesc::FormatValue(char *buf, const char *last, const void *object) const
@ -789,13 +787,13 @@ void IniSaveWindowSettings(IniFile *ini, const char *grpname, void *desc)
*/ */
bool SettingDesc::IsEditable(bool do_command) const bool SettingDesc::IsEditable(bool do_command) const
{ {
if (!do_command && !(this->save.conv & SLF_NO_NETWORK_SYNC) && _networking && !(_network_server || _network_settings_access) && !(this->flags & SGF_PER_COMPANY)) return false; if (!do_command && !(this->save.conv & SLF_NO_NETWORK_SYNC) && _networking && !(_network_server || _network_settings_access) && !(this->flags & SF_PER_COMPANY)) return false;
if ((this->flags & SGF_NETWORK_ONLY) && !_networking && _game_mode != GM_MENU) return false; if ((this->flags & SF_NETWORK_ONLY) && !_networking && _game_mode != GM_MENU) return false;
if ((this->flags & SGF_NO_NETWORK) && _networking) return false; if ((this->flags & SF_NO_NETWORK) && _networking) return false;
if ((this->flags & SGF_NEWGAME_ONLY) && if ((this->flags & SF_NEWGAME_ONLY) &&
(_game_mode == GM_NORMAL || (_game_mode == GM_NORMAL ||
(_game_mode == GM_EDITOR && !(this->flags & SGF_SCENEDIT_TOO)))) return false; (_game_mode == GM_EDITOR && !(this->flags & SF_SCENEDIT_TOO)))) return false;
if ((this->flags & SGF_SCENEDIT_ONLY) && _game_mode != GM_EDITOR) return false; if ((this->flags & SF_SCENEDIT_ONLY) && _game_mode != GM_EDITOR) return false;
return true; return true;
} }
@ -805,7 +803,7 @@ bool SettingDesc::IsEditable(bool do_command) const
*/ */
SettingType SettingDesc::GetType() const SettingType SettingDesc::GetType() const
{ {
if (this->flags & SGF_PER_COMPANY) return ST_COMPANY; if (this->flags & SF_PER_COMPANY) return ST_COMPANY;
return (this->save.conv & SLF_NOT_IN_SAVE) ? ST_CLIENT : ST_GAME; return (this->save.conv & SLF_NOT_IN_SAVE) ? ST_CLIENT : ST_GAME;
} }
@ -1643,7 +1641,7 @@ static int64 LinkGraphDistModeXrefChillPP(int64 val)
static bool OrderTownGrowthRate(SettingOnGuiCtrlData &data) static bool OrderTownGrowthRate(SettingOnGuiCtrlData &data)
{ {
switch (data.type) { switch (data.type) {
case SOGCT_MULTISTRING_ORDER: { case SOGCT_GUI_DROPDOWN_ORDER: {
int in = data.val; int in = data.val;
int out; int out;
if (in == 0) { if (in == 0) {
@ -2168,7 +2166,7 @@ void IntSettingDesc::ChangeValue(const void *object, int32 newval) const
this->Write(object, newval); this->Write(object, newval);
if (this->post_callback != nullptr) this->post_callback(newval); if (this->post_callback != nullptr) this->post_callback(newval);
if (this->flags & SGF_NO_NETWORK) { if (this->flags & SF_NO_NETWORK) {
GamelogStartAction(GLAT_SETTING); GamelogStartAction(GLAT_SETTING);
GamelogSetting(this->name, oldval, newval); GamelogSetting(this->name, oldval, newval);
GamelogStopAction(); GamelogStopAction();
@ -2316,10 +2314,10 @@ const char *GetCompanySettingNameByIndex(uint32 idx)
bool SetSettingValue(const IntSettingDesc *sd, int32 value, bool force_newgame) bool SetSettingValue(const IntSettingDesc *sd, int32 value, bool force_newgame)
{ {
const IntSettingDesc *setting = sd->AsIntSetting(); const IntSettingDesc *setting = sd->AsIntSetting();
if ((setting->flags & SGF_PER_COMPANY) != 0) { if ((setting->flags & SF_PER_COMPANY) != 0) {
if (Company::IsValidID(_local_company) && _game_mode != GM_MENU) { if (Company::IsValidID(_local_company) && _game_mode != GM_MENU) {
return DoCommandP(0, 0, value, CMD_CHANGE_COMPANY_SETTING, nullptr, setting->name); return DoCommandP(0, 0, value, CMD_CHANGE_COMPANY_SETTING, nullptr, setting->name);
} else if (setting->flags & SGF_NO_NEWGAME) { } else if (setting->flags & SF_NO_NEWGAME) {
return false; return false;
} }
@ -2331,7 +2329,7 @@ bool SetSettingValue(const IntSettingDesc *sd, int32 value, bool force_newgame)
* (if any) to change. Also *hack*hack* we update the _newgame version * (if any) to change. Also *hack*hack* we update the _newgame version
* of settings because changing a company-based setting in a game also * of settings because changing a company-based setting in a game also
* changes its defaults. At least that is the convention we have chosen */ * changes its defaults. At least that is the convention we have chosen */
bool no_newgame = setting->flags & SGF_NO_NEWGAME; bool no_newgame = setting->flags & SF_NO_NEWGAME;
if (no_newgame && _game_mode == GM_MENU) return false; if (no_newgame && _game_mode == GM_MENU) return false;
if (setting->save.conv & SLF_NO_NETWORK_SYNC) { if (setting->save.conv & SLF_NO_NETWORK_SYNC) {
if (_game_mode != GM_MENU && !no_newgame) { if (_game_mode != GM_MENU && !no_newgame) {
@ -2442,7 +2440,7 @@ void IConsoleSetSetting(const char *name, const char *value, bool force_newgame)
{ {
const SettingDesc *sd = GetSettingFromName(name); const SettingDesc *sd = GetSettingFromName(name);
if (sd == nullptr || ((sd->flags & SGF_NO_NEWGAME) && (_game_mode == GM_MENU || force_newgame))) { if (sd == nullptr || ((sd->flags & SF_NO_NEWGAME) && (_game_mode == GM_MENU || force_newgame))) {
IConsolePrintF(CC_WARNING, "'%s' is an unknown setting.", name); IConsolePrintF(CC_WARNING, "'%s' is an unknown setting.", name);
return; return;
} }
@ -2487,7 +2485,7 @@ void IConsoleGetSetting(const char *name, bool force_newgame)
{ {
const SettingDesc *sd = GetSettingFromName(name); const SettingDesc *sd = GetSettingFromName(name);
if (sd == nullptr || ((sd->flags & SGF_NO_NEWGAME) && (_game_mode == GM_MENU || force_newgame))) { if (sd == nullptr || ((sd->flags & SF_NO_NEWGAME) && (_game_mode == GM_MENU || force_newgame))) {
IConsolePrintF(CC_WARNING, "'%s' is an unknown setting.", name); IConsolePrintF(CC_WARNING, "'%s' is an unknown setting.", name);
return; return;
} }
@ -2502,7 +2500,7 @@ void IConsoleGetSetting(const char *name, bool force_newgame)
bool show_min_max = true; bool show_min_max = true;
int64 min_value = int_setting->min; int64 min_value = int_setting->min;
int64 max_value = int_setting->max; int64 max_value = int_setting->max;
if (sd->flags & SGF_ENUM) { if (sd->flags & SF_ENUM) {
min_value = INT64_MAX; min_value = INT64_MAX;
max_value = INT64_MIN; max_value = INT64_MIN;
int count = 0; int count = 0;
@ -2522,7 +2520,7 @@ void IConsoleGetSetting(const char *name, bool force_newgame)
if (show_min_max) { if (show_min_max) {
IConsolePrintF(CC_WARNING, "Current value for '%s' is: '%s' (min: %s" OTTD_PRINTF64 ", max: " OTTD_PRINTF64 ")", IConsolePrintF(CC_WARNING, "Current value for '%s' is: '%s' (min: %s" OTTD_PRINTF64 ", max: " OTTD_PRINTF64 ")",
name, value, (sd->flags & SGF_0ISDISABLED) ? "(0) " : "", min_value, max_value); name, value, (sd->flags & SF_GUI_0_IS_SPECIAL) ? "(0) " : "", min_value, max_value);
} else { } else {
IConsolePrintF(CC_WARNING, "Current value for '%s' is: '%s'", IConsolePrintF(CC_WARNING, "Current value for '%s' is: '%s'",
name, value); name, value);
@ -2542,7 +2540,7 @@ void IConsoleListSettings(const char *prefilter)
for (auto &sd : _settings) { for (auto &sd : _settings) {
if (!SlIsObjectCurrentlyValid(sd->save.version_from, sd->save.version_to, sd->save.ext_feature_test)) continue; if (!SlIsObjectCurrentlyValid(sd->save.version_from, sd->save.version_to, sd->save.ext_feature_test)) continue;
if (prefilter != nullptr && strstr(sd->name, prefilter) == nullptr) continue; if (prefilter != nullptr && strstr(sd->name, prefilter) == nullptr) continue;
if ((sd->flags & SGF_NO_NEWGAME) && _game_mode == GM_MENU) continue; if ((sd->flags & SF_NO_NEWGAME) && _game_mode == GM_MENU) continue;
char value[80]; char value[80];
sd->FormatValue(value, lastof(value), &GetGameSettings()); sd->FormatValue(value, lastof(value), &GetGameSettings());
IConsolePrintF(CC_DEFAULT, "%s = %s", sd->name, value); IConsolePrintF(CC_DEFAULT, "%s = %s", sd->name, value);
@ -3009,12 +3007,14 @@ static void Save_PATX()
SaveSettingsPatx(_settings, &_settings_game); SaveSettingsPatx(_settings, &_settings_game);
} }
extern const ChunkHandler _setting_chunk_handlers[] = { static const ChunkHandler setting_chunk_handlers[] = {
{ 'OPTS', nullptr, Load_OPTS, nullptr, nullptr, CH_RIFF}, { 'OPTS', nullptr, Load_OPTS, nullptr, nullptr, CH_RIFF },
{ 'PATS', Save_PATS, Load_PATS, nullptr, Check_PATS, CH_RIFF}, { 'PATS', Save_PATS, Load_PATS, nullptr, Check_PATS, CH_RIFF },
{ 'PATX', Save_PATX, Load_PATX, nullptr, Check_PATX, CH_RIFF | CH_LAST}, { 'PATX', Save_PATX, Load_PATX, nullptr, Check_PATX, CH_RIFF },
}; };
extern const ChunkHandlerTable _setting_chunk_handlers(setting_chunk_handlers);
static bool IsSignedVarMemType(VarType vt) static bool IsSignedVarMemType(VarType vt)
{ {
switch (GetVarMemType(vt)) { switch (GetVarMemType(vt)) {

@ -1169,7 +1169,7 @@ bool SettingEntry::IsVisibleByRestrictionMode(RestrictionMode mode) const
*/ */
bool SettingEntry::UpdateFilterState(SettingFilter &filter, bool force_visible) bool SettingEntry::UpdateFilterState(SettingFilter &filter, bool force_visible)
{ {
if (this->setting->flags & SGF_NO_NEWGAME && _game_mode == GM_MENU) { if (this->setting->flags & SF_NO_NEWGAME && _game_mode == GM_MENU) {
SETBITS(this->flags, SEF_FILTERED); SETBITS(this->flags, SEF_FILTERED);
return false; return false;
} }
@ -1206,7 +1206,7 @@ bool SettingEntry::UpdateFilterState(SettingFilter &filter, bool force_visible)
static const void *ResolveObject(const GameSettings *settings_ptr, const IntSettingDesc *sd) static const void *ResolveObject(const GameSettings *settings_ptr, const IntSettingDesc *sd)
{ {
if ((sd->flags & SGF_PER_COMPANY) != 0) { if ((sd->flags & SF_PER_COMPANY) != 0) {
if (Company::IsValidID(_local_company) && _game_mode != GM_MENU) { if (Company::IsValidID(_local_company) && _game_mode != GM_MENU) {
return &Company::Get(_local_company)->settings; return &Company::Get(_local_company)->settings;
} }
@ -1224,7 +1224,7 @@ void SettingEntry::SetValueDParams(uint first_param, int32 value, std::unique_pt
{ {
if (this->setting->IsBoolSetting()) { if (this->setting->IsBoolSetting()) {
SetDParam(first_param++, value != 0 ? STR_CONFIG_SETTING_ON : STR_CONFIG_SETTING_OFF); SetDParam(first_param++, value != 0 ? STR_CONFIG_SETTING_ON : STR_CONFIG_SETTING_OFF);
} else if (this->setting->flags & SGF_DEC1SCALE) { } else if (this->setting->flags & SF_DEC1SCALE) {
tempdata.reset(new SettingEntry::SetValueDParamsTempData()); tempdata.reset(new SettingEntry::SetValueDParamsTempData());
double scale = std::exp2(((double)value) / 10); double scale = std::exp2(((double)value) / 10);
int log = -std::min(0, (int)std::floor(std::log10(scale)) - 2); int log = -std::min(0, (int)std::floor(std::log10(scale)) - 2);
@ -1235,7 +1235,7 @@ void SettingEntry::SetValueDParams(uint first_param, int32 value, std::unique_pt
SetDParam(first_param++, STR_JUST_RAW_STRING); SetDParam(first_param++, STR_JUST_RAW_STRING);
SetDParamStr(first_param++, tempdata->buffer); SetDParamStr(first_param++, tempdata->buffer);
} else { } else {
if ((this->setting->flags & SGF_ENUM) != 0) { if ((this->setting->flags & SF_ENUM) != 0) {
StringID str = STR_UNDEFINED; StringID str = STR_UNDEFINED;
for (const SettingDescEnumEntry *enumlist = this->setting->enumlist; enumlist != nullptr && enumlist->str != STR_NULL; enumlist++) { for (const SettingDescEnumEntry *enumlist = this->setting->enumlist; enumlist != nullptr && enumlist->str != STR_NULL; enumlist++) {
if (enumlist->val == value) { if (enumlist->val == value) {
@ -1244,13 +1244,13 @@ void SettingEntry::SetValueDParams(uint first_param, int32 value, std::unique_pt
} }
} }
SetDParam(first_param++, str); SetDParam(first_param++, str);
} else if ((this->setting->flags & SGF_MULTISTRING) != 0) { } else if ((this->setting->flags & SF_GUI_DROPDOWN) != 0) {
SetDParam(first_param++, this->setting->str_val - this->setting->min + value); SetDParam(first_param++, this->setting->str_val - this->setting->min + value);
} else if ((this->setting->flags & SGF_DISPLAY_ABS) != 0) { } else if ((this->setting->flags & SF_GUI_NEGATIVE_IS_SPECIAL) != 0) {
SetDParam(first_param++, this->setting->str_val + ((value >= 0) ? 1 : 0)); SetDParam(first_param++, this->setting->str_val + ((value >= 0) ? 1 : 0));
value = abs(value); value = abs(value);
} else { } else {
SetDParam(first_param++, this->setting->str_val + ((value == 0 && (this->setting->flags & SGF_0ISDISABLED) != 0) ? 1 : 0)); SetDParam(first_param++, this->setting->str_val + ((value == 0 && (this->setting->flags & SF_GUI_0_IS_SPECIAL) != 0) ? 1 : 0));
} }
SetDParam(first_param++, value); SetDParam(first_param++, value);
} }
@ -1283,13 +1283,13 @@ void SettingEntry::DrawSetting(GameSettings *settings_ptr, int left, int right,
if (sd->IsBoolSetting()) { if (sd->IsBoolSetting()) {
/* Draw checkbox for boolean-value either on/off */ /* Draw checkbox for boolean-value either on/off */
DrawBoolButton(buttons_left, button_y, value != 0, editable); DrawBoolButton(buttons_left, button_y, value != 0, editable);
} else if ((sd->flags & (SGF_MULTISTRING | SGF_ENUM)) != 0) { } else if ((sd->flags & (SF_GUI_DROPDOWN | SF_ENUM)) != 0) {
/* Draw [v] button for settings of an enum-type */ /* Draw [v] button for settings of an enum-type */
DrawDropDownButton(buttons_left, button_y, COLOUR_YELLOW, state != 0, editable); DrawDropDownButton(buttons_left, button_y, COLOUR_YELLOW, state != 0, editable);
} else { } else {
/* Draw [<][>] boxes for settings of an integer-type */ /* Draw [<][>] boxes for settings of an integer-type */
DrawArrowButtons(buttons_left, button_y, COLOUR_YELLOW, state, DrawArrowButtons(buttons_left, button_y, COLOUR_YELLOW, state,
editable && value != (sd->flags & SGF_0ISDISABLED ? 0 : sd->min), editable && (uint32)value != sd->max); editable && value != (sd->flags & SF_GUI_0_IS_SPECIAL ? 0 : sd->min), editable && (uint32)value != sd->max);
} }
this->DrawSettingString(text_left, text_right, y + (SETTING_HEIGHT - FONT_HEIGHT_NORMAL) / 2, highlight, value); this->DrawSettingString(text_left, text_right, y + (SETTING_HEIGHT - FONT_HEIGHT_NORMAL) / 2, highlight, value);
} }
@ -2532,7 +2532,7 @@ struct GameSettingsWindow : Window {
int32 value = sd->Read(ResolveObject(settings_ptr, sd)); int32 value = sd->Read(ResolveObject(settings_ptr, sd));
/* clicked on the icon on the left side. Either scroller, bool on/off or dropdown */ /* clicked on the icon on the left side. Either scroller, bool on/off or dropdown */
if (x < SETTING_BUTTON_WIDTH && (sd->flags & (SGF_MULTISTRING | SGF_ENUM))) { if (x < SETTING_BUTTON_WIDTH && (sd->flags & (SF_GUI_DROPDOWN | SF_ENUM))) {
this->SetDisplayedHelpText(pe); this->SetDisplayedHelpText(pe);
if (this->valuedropdown_entry == pe) { if (this->valuedropdown_entry == pe) {
@ -2560,12 +2560,12 @@ struct GameSettingsWindow : Window {
this->valuedropdown_entry->SetButtons(SEF_LEFT_DEPRESSED); this->valuedropdown_entry->SetButtons(SEF_LEFT_DEPRESSED);
DropDownList list; DropDownList list;
if (sd->flags & SGF_MULTISTRING) { if (sd->flags & SF_GUI_DROPDOWN) {
for (int i = sd->min; i <= (int)sd->max; i++) { for (int i = sd->min; i <= (int)sd->max; i++) {
int val = i; int val = i;
if (sd->guiproc != nullptr) { if (sd->guiproc != nullptr) {
SettingOnGuiCtrlData data; SettingOnGuiCtrlData data;
data.type = SOGCT_MULTISTRING_ORDER; data.type = SOGCT_GUI_DROPDOWN_ORDER;
data.val = i - sd->min; data.val = i - sd->min;
if (sd->guiproc(data)) { if (sd->guiproc(data)) {
val = data.val; val = data.val;
@ -2574,7 +2574,7 @@ struct GameSettingsWindow : Window {
assert_msg(val >= sd->min && val <= (int)sd->max, "min: %d, max: %d, val: %d", sd->min, sd->max, val); assert_msg(val >= sd->min && val <= (int)sd->max, "min: %d, max: %d, val: %d", sd->min, sd->max, val);
list.emplace_back(new DropDownListStringItem(sd->str_val + val - sd->min, val, false)); list.emplace_back(new DropDownListStringItem(sd->str_val + val - sd->min, val, false));
} }
} else if ((sd->flags & SGF_ENUM)) { } else if ((sd->flags & SF_ENUM)) {
for (const SettingDescEnumEntry *enumlist = sd->enumlist; enumlist != nullptr && enumlist->str != STR_NULL; enumlist++) { for (const SettingDescEnumEntry *enumlist = sd->enumlist; enumlist != nullptr && enumlist->str != STR_NULL; enumlist++) {
list.emplace_back(new DropDownListStringItem(enumlist->str, enumlist->val, false)); list.emplace_back(new DropDownListStringItem(enumlist->str, enumlist->val, false));
} }
@ -2616,7 +2616,7 @@ struct GameSettingsWindow : Window {
if (value < sd->min) value = sd->min; // skip between "disabled" and minimum if (value < sd->min) value = sd->min; // skip between "disabled" and minimum
} else { } else {
value -= step; value -= step;
if (value < sd->min) value = (sd->flags & SGF_0ISDISABLED) ? 0 : sd->min; if (value < sd->min) value = (sd->flags & SF_GUI_0_IS_SPECIAL) ? 0 : sd->min;
} }
/* Set up scroller timeout for numeric values */ /* Set up scroller timeout for numeric values */
@ -2637,13 +2637,13 @@ struct GameSettingsWindow : Window {
} }
} else { } else {
/* Only open editbox if clicked for the second time, and only for types where it is sensible for. */ /* Only open editbox if clicked for the second time, and only for types where it is sensible for. */
if (this->last_clicked == pe && !sd->IsBoolSetting() && !(sd->flags & (SGF_MULTISTRING | SGF_ENUM))) { if (this->last_clicked == pe && !sd->IsBoolSetting() && !(sd->flags & (SF_GUI_DROPDOWN | SF_ENUM))) {
int64 value64 = value; int64 value64 = value;
/* Show the correct currency-translated value */ /* Show the correct currency-translated value */
if (sd->flags & SGF_CURRENCY) value64 *= _currency->rate; if (sd->flags & SF_GUI_CURRENCY) value64 *= _currency->rate;
this->valuewindow_entry = pe; this->valuewindow_entry = pe;
if (sd->flags & SGF_DECIMAL1) { if (sd->flags & SF_DECIMAL1) {
SetDParam(0, value64); SetDParam(0, value64);
ShowQueryString(STR_JUST_DECIMAL1, STR_CONFIG_SETTING_QUERY_CAPTION, 10, this, CS_NUMERAL_DECIMAL, QSF_ENABLE_DEFAULT); ShowQueryString(STR_JUST_DECIMAL1, STR_CONFIG_SETTING_QUERY_CAPTION, 10, this, CS_NUMERAL_DECIMAL, QSF_ENABLE_DEFAULT);
} else { } else {
@ -2676,14 +2676,14 @@ struct GameSettingsWindow : Window {
int32 value; int32 value;
if (!StrEmpty(str)) { if (!StrEmpty(str)) {
long long llvalue; long long llvalue;
if (sd->flags & SGF_DECIMAL1) { if (sd->flags & SF_DECIMAL1) {
llvalue = atof(str) * 10; llvalue = atof(str) * 10;
} else { } else {
llvalue = atoll(str); llvalue = atoll(str);
} }
/* Save the correct currency-translated value */ /* Save the correct currency-translated value */
if (sd->flags & SGF_CURRENCY) llvalue /= _currency->rate; if (sd->flags & SF_GUI_CURRENCY) llvalue /= _currency->rate;
value = (int32)ClampToI32(llvalue); value = (int32)ClampToI32(llvalue);
} else { } else {
@ -2724,7 +2724,7 @@ struct GameSettingsWindow : Window {
/* Deal with drop down boxes on the panel. */ /* Deal with drop down boxes on the panel. */
assert(this->valuedropdown_entry != nullptr); assert(this->valuedropdown_entry != nullptr);
const IntSettingDesc *sd = this->valuedropdown_entry->setting; const IntSettingDesc *sd = this->valuedropdown_entry->setting;
assert(sd->flags & (SGF_MULTISTRING | SGF_ENUM)); assert(sd->flags & (SF_GUI_DROPDOWN | SF_ENUM));
SetSettingValue(sd, index); SetSettingValue(sd, index);
this->SetDirty(); this->SetDirty();

@ -12,25 +12,24 @@
#include "saveload/saveload.h" #include "saveload/saveload.h"
enum SettingGuiFlag : uint16 { enum SettingFlag : uint16 {
/* 2 bytes allocated for a maximum of 16 flags. */ SF_NONE = 0,
SGF_NONE = 0, SF_GUI_0_IS_SPECIAL = 1 << 0, ///< A value of zero is possible and has a custom string (the one after "strval").
SGF_0ISDISABLED = 1 << 0, ///< a value of zero means the feature is disabled SF_GUI_NEGATIVE_IS_SPECIAL = 1 << 1, ///< A negative value has another string (the one after "strval").
SGF_DISPLAY_ABS = 1 << 1, ///< display absolute value of the setting SF_GUI_DROPDOWN = 1 << 2, ///< The value represents a limited number of string-options (internally integer) presented as dropdown.
SGF_MULTISTRING = 1 << 2, ///< the value represents a limited number of string-options (internally integer) SF_GUI_CURRENCY = 1 << 3, ///< The number represents money, so when reading value multiply by exchange rate.
SGF_NETWORK_ONLY = 1 << 3, ///< this setting only applies to network games SF_NETWORK_ONLY = 1 << 4, ///< This setting only applies to network games.
SGF_CURRENCY = 1 << 4, ///< the number represents money, so when reading value multiply by exchange rate SF_NO_NETWORK = 1 << 5, ///< This setting does not apply to network games; it may not be changed during the game.
SGF_NO_NETWORK = 1 << 5, ///< this setting does not apply to network games; it may not be changed during the game SF_NEWGAME_ONLY = 1 << 6, ///< This setting cannot be changed in a game.
SGF_NEWGAME_ONLY = 1 << 6, ///< this setting cannot be changed in a game SF_SCENEDIT_TOO = 1 << 7, ///< This setting can be changed in the scenario editor (only makes sense when SF_NEWGAME_ONLY is set).
SGF_SCENEDIT_TOO = 1 << 7, ///< this setting can be changed in the scenario editor (only makes sense when SGF_NEWGAME_ONLY is set) SF_SCENEDIT_ONLY = 1 << 8, ///< This setting can only be changed in the scenario editor.
SGF_PER_COMPANY = 1 << 8, ///< this setting can be different for each company (saved in company struct) SF_PER_COMPANY = 1 << 9, ///< This setting can be different for each company (saved in company struct).
SGF_SCENEDIT_ONLY = 1 << 9, ///< this setting can only be changed in the scenario editor SF_DECIMAL1 = 1 << 10,///< display a decimal representation of the setting value divided by 10
SGF_DECIMAL1 = 1 << 10,///< display a decimal representation of the setting value divided by 10 SF_ENUM = 1 << 11,///< the setting can take one of the values given by an array of struct SettingDescEnumEntry
SGF_ENUM = 1 << 11,///< the setting can take one of the values given by an array of struct SettingDescEnumEntry SF_NO_NEWGAME = 1 << 12,///< the setting does not apply and is not shown in a new game context
SGF_NO_NEWGAME = 1 << 12,///< the setting does not apply and is not shown in a new game context SF_DEC1SCALE = 1 << 13,///< also display a float representation of the scale of a decimal1 scale parameter
SGF_DEC1SCALE = 1 << 13,///< also display a float representation of the scale of a decimal1 scale parameter
}; };
DECLARE_ENUM_AS_BIT_SET(SettingGuiFlag) DECLARE_ENUM_AS_BIT_SET(SettingFlag)
/** /**
* A SettingCategory defines a grouping of the settings. * A SettingCategory defines a grouping of the settings.
@ -69,7 +68,7 @@ enum SettingType {
enum SettingOnGuiCtrlType { enum SettingOnGuiCtrlType {
SOGCT_DESCRIPTION_TEXT, ///< Description text callback SOGCT_DESCRIPTION_TEXT, ///< Description text callback
SOGCT_MULTISTRING_ORDER, ///< SGF_MULTISTRING reordering callback SOGCT_GUI_DROPDOWN_ORDER, ///< SF_GUI_DROPDOWN reordering callback
}; };
struct SettingOnGuiCtrlData { struct SettingOnGuiCtrlData {
@ -99,16 +98,16 @@ struct SettingsXref {
/** Properties of config file settings. */ /** Properties of config file settings. */
struct SettingDesc { struct SettingDesc {
struct XrefContructorTag {}; struct XrefContructorTag {};
SettingDesc(SaveLoad save, const char *name, SettingGuiFlag flags, OnGuiCtrl *guiproc, bool startup, const char *patx_name) : SettingDesc(SaveLoad save, const char *name, SettingFlag flags, OnGuiCtrl *guiproc, bool startup, const char *patx_name) :
name(name), flags(flags), guiproc(guiproc), startup(startup), save(save), patx_name(patx_name) {} name(name), flags(flags), guiproc(guiproc), startup(startup), save(save), patx_name(patx_name) {}
SettingDesc(XrefContructorTag tag, SaveLoad save, SettingsXref xref) : SettingDesc(XrefContructorTag tag, SaveLoad save, SettingsXref xref) :
name(nullptr), flags(SGF_NONE), guiproc(nullptr), startup(false), save(save), patx_name(nullptr), xref(xref) {} name(nullptr), flags(SF_NONE), guiproc(nullptr), startup(false), save(save), patx_name(nullptr), xref(xref) {}
virtual ~SettingDesc() {} virtual ~SettingDesc() {}
const char *name; ///< name of the setting. Used in configuration file and for console const char *name; ///< Name of the setting. Used in configuration file and for console
SettingGuiFlag flags; ///< handles how a setting would show up in the GUI (text/currency, etc.) SettingFlag flags; ///< Handles how a setting would show up in the GUI (text/currency, etc.)
OnGuiCtrl *guiproc; ///< callback procedure for GUI operations OnGuiCtrl *guiproc; ///< Callback procedure for GUI operations
bool startup; ///< setting has to be loaded directly at startup? bool startup; ///< Setting has to be loaded directly at startup?
SaveLoad save; ///< Internal structure (going to savegame, parts to config) SaveLoad save; ///< Internal structure (going to savegame, parts to config)
const char *patx_name; ///< Name to save/load setting from in PATX chunk, if nullptr save/load from PATS chunk as normal const char *patx_name; ///< Name to save/load setting from in PATX chunk, if nullptr save/load from PATS chunk as normal
@ -176,7 +175,7 @@ struct IntSettingDesc : SettingDesc {
*/ */
typedef void PostChangeCallback(int32 value); typedef void PostChangeCallback(int32 value);
IntSettingDesc(SaveLoad save, const char *name, SettingGuiFlag flags, OnGuiCtrl *guiproc, bool startup, const char *patx_name, int32 def, IntSettingDesc(SaveLoad save, const char *name, SettingFlag flags, OnGuiCtrl *guiproc, bool startup, const char *patx_name, int32 def,
int32 min, uint32 max, int32 interval, StringID str, StringID str_help, StringID str_val, int32 min, uint32 max, int32 interval, StringID str, StringID str_help, StringID str_val,
SettingCategory cat, PreChangeCheck pre_check, PostChangeCallback post_callback, const SettingDescEnumEntry *enumlist) : SettingCategory cat, PreChangeCheck pre_check, PostChangeCallback post_callback, const SettingDescEnumEntry *enumlist) :
SettingDesc(save, name, flags, guiproc, startup, patx_name), def(def), min(min), max(max), interval(interval), SettingDesc(save, name, flags, guiproc, startup, patx_name), def(def), min(min), max(max), interval(interval),
@ -195,7 +194,7 @@ struct IntSettingDesc : SettingDesc {
PreChangeCheck *pre_check; ///< Callback to check for the validity of the setting. PreChangeCheck *pre_check; ///< Callback to check for the validity of the setting.
PostChangeCallback *post_callback; ///< Callback when the setting has been changed. PostChangeCallback *post_callback; ///< Callback when the setting has been changed.
const SettingDescEnumEntry *enumlist; ///< For SGF_ENUM. The last entry must use STR_NULL const SettingDescEnumEntry *enumlist; ///< For SF_ENUM. The last entry must use STR_NULL
/** /**
* Check whether this setting is a boolean type setting. * Check whether this setting is a boolean type setting.
@ -220,7 +219,7 @@ private:
/** Boolean setting. */ /** Boolean setting. */
struct BoolSettingDesc : IntSettingDesc { struct BoolSettingDesc : IntSettingDesc {
BoolSettingDesc(SaveLoad save, const char *name, SettingGuiFlag flags, OnGuiCtrl *guiproc, bool startup, const char *patx_name, bool def, BoolSettingDesc(SaveLoad save, const char *name, SettingFlag flags, OnGuiCtrl *guiproc, bool startup, const char *patx_name, bool def,
StringID str, StringID str_help, StringID str_val, SettingCategory cat, StringID str, StringID str_help, StringID str_val, SettingCategory cat,
PreChangeCheck pre_check, PostChangeCallback post_callback) : PreChangeCheck pre_check, PostChangeCallback post_callback) :
IntSettingDesc(save, name, flags, guiproc, startup, patx_name, def, 0, 1, 0, str, str_help, str_val, cat, pre_check, post_callback, nullptr) {} IntSettingDesc(save, name, flags, guiproc, startup, patx_name, def, 0, 1, 0, str, str_help, str_val, cat, pre_check, post_callback, nullptr) {}
@ -235,7 +234,7 @@ struct BoolSettingDesc : IntSettingDesc {
struct OneOfManySettingDesc : IntSettingDesc { struct OneOfManySettingDesc : IntSettingDesc {
typedef size_t OnConvert(const char *value); ///< callback prototype for conversion error typedef size_t OnConvert(const char *value); ///< callback prototype for conversion error
OneOfManySettingDesc(SaveLoad save, const char *name, SettingGuiFlag flags, OnGuiCtrl *guiproc, bool startup, const char *patx_name, OneOfManySettingDesc(SaveLoad save, const char *name, SettingFlag flags, OnGuiCtrl *guiproc, bool startup, const char *patx_name,
int32 def, int32 max, StringID str, StringID str_help, StringID str_val, SettingCategory cat, int32 def, int32 max, StringID str, StringID str_help, StringID str_val, SettingCategory cat,
PreChangeCheck pre_check, PostChangeCallback post_callback, PreChangeCheck pre_check, PostChangeCallback post_callback,
std::initializer_list<const char *> many, OnConvert *many_cnvt) : std::initializer_list<const char *> many, OnConvert *many_cnvt) :
@ -258,7 +257,7 @@ struct OneOfManySettingDesc : IntSettingDesc {
/** Many of many setting. */ /** Many of many setting. */
struct ManyOfManySettingDesc : OneOfManySettingDesc { struct ManyOfManySettingDesc : OneOfManySettingDesc {
ManyOfManySettingDesc(SaveLoad save, const char *name, SettingGuiFlag flags, OnGuiCtrl *guiproc, bool startup, const char *patx_name, ManyOfManySettingDesc(SaveLoad save, const char *name, SettingFlag flags, OnGuiCtrl *guiproc, bool startup, const char *patx_name,
int32 def, StringID str, StringID str_help, StringID str_val, SettingCategory cat, int32 def, StringID str, StringID str_help, StringID str_val, SettingCategory cat,
PreChangeCheck pre_check, PostChangeCallback post_callback, PreChangeCheck pre_check, PostChangeCallback post_callback,
std::initializer_list<const char *> many, OnConvert *many_cnvt) : std::initializer_list<const char *> many, OnConvert *many_cnvt) :
@ -287,7 +286,7 @@ struct StringSettingDesc : SettingDesc {
*/ */
typedef void PostChangeCallback(const std::string &value); typedef void PostChangeCallback(const std::string &value);
StringSettingDesc(SaveLoad save, const char *name, SettingGuiFlag flags, OnGuiCtrl *guiproc, bool startup, const char *patx_name, const char *def, StringSettingDesc(SaveLoad save, const char *name, SettingFlag flags, OnGuiCtrl *guiproc, bool startup, const char *patx_name, const char *def,
uint32 max_length, PreChangeCheck pre_check, PostChangeCallback post_callback) : uint32 max_length, PreChangeCheck pre_check, PostChangeCallback post_callback) :
SettingDesc(save, name, flags, guiproc, startup, patx_name), def(def == nullptr ? "" : def), max_length(max_length), SettingDesc(save, name, flags, guiproc, startup, patx_name), def(def == nullptr ? "" : def), max_length(max_length),
pre_check(pre_check), post_callback(post_callback) {} pre_check(pre_check), post_callback(post_callback) {}
@ -313,7 +312,7 @@ private:
/** List/array settings. */ /** List/array settings. */
struct ListSettingDesc : SettingDesc { struct ListSettingDesc : SettingDesc {
ListSettingDesc(SaveLoad save, const char *name, SettingGuiFlag flags, OnGuiCtrl *guiproc, bool startup, const char *patx_name, const char *def) : ListSettingDesc(SaveLoad save, const char *name, SettingFlag flags, OnGuiCtrl *guiproc, bool startup, const char *patx_name, const char *def) :
SettingDesc(save, name, flags, guiproc, startup, patx_name), def(def) {} SettingDesc(save, name, flags, guiproc, startup, patx_name), def(def) {}
virtual ~ListSettingDesc() {} virtual ~ListSettingDesc() {}
@ -327,7 +326,7 @@ struct ListSettingDesc : SettingDesc {
/** Placeholder for settings that have been removed, but might still linger in the savegame. */ /** Placeholder for settings that have been removed, but might still linger in the savegame. */
struct NullSettingDesc : SettingDesc { struct NullSettingDesc : SettingDesc {
NullSettingDesc(SaveLoad save) : NullSettingDesc(SaveLoad save) :
SettingDesc(save, "", SGF_NONE, nullptr, false, nullptr) {} SettingDesc(save, "", SF_NONE, nullptr, false, nullptr) {}
virtual ~NullSettingDesc() {} virtual ~NullSettingDesc() {}
void FormatValue(char *buf, const char *last, const void *object) const override { NOT_REACHED(); } void FormatValue(char *buf, const char *last, const void *object) const override { NOT_REACHED(); }

@ -316,9 +316,7 @@ static void ResizeSpriteOut(SpriteLoader::Sprite *sprite, ZoomLevel zoom)
SpriteLoader::CommonPixel *dst = sprite[zoom].data; SpriteLoader::CommonPixel *dst = sprite[zoom].data;
const SpriteLoader::CommonPixel *src = sprite[zoom - 1].data; const SpriteLoader::CommonPixel *src = sprite[zoom - 1].data;
#ifdef WITH_ASSERT [[maybe_unused]] const SpriteLoader::CommonPixel *src_end = src + sprite[zoom - 1].height * sprite[zoom - 1].width;
const SpriteLoader::CommonPixel *src_end = src + sprite[zoom - 1].height * sprite[zoom - 1].width;
#endif
for (uint y = 0; y < sprite[zoom].height; y++) { for (uint y = 0; y < sprite[zoom].height; y++) {
const SpriteLoader::CommonPixel *src_ln = src + sprite[zoom - 1].width; const SpriteLoader::CommonPixel *src_ln = src + sprite[zoom - 1].width;

@ -468,7 +468,6 @@ const char *assert_tile_info(uint32 tile);
/* Asserts are enabled if NDEBUG isn't defined or WITH_ASSERT is defined. */ /* Asserts are enabled if NDEBUG isn't defined or WITH_ASSERT is defined. */
#if !defined(NDEBUG) || defined(WITH_ASSERT) #if !defined(NDEBUG) || defined(WITH_ASSERT)
# define OTTD_ASSERT
# define assert_msg(expression, ...) if (unlikely(!(expression))) assert_msg_error(__LINE__, __FILE__, #expression, nullptr, __VA_ARGS__); # define assert_msg(expression, ...) if (unlikely(!(expression))) assert_msg_error(__LINE__, __FILE__, #expression, nullptr, __VA_ARGS__);
# define assert_msg_tile(expression, tile, ...) if (unlikely(!(expression))) assert_msg_error(__LINE__, __FILE__, #expression, assert_tile_info(tile), __VA_ARGS__); # define assert_msg_tile(expression, tile, ...) if (unlikely(!(expression))) assert_msg_error(__LINE__, __FILE__, #expression, assert_tile_info(tile), __VA_ARGS__);
# define assert_tile(expression, tile) if (unlikely(!(expression))) error("Assertion failed at line %i of %s: %s\n\t%s", __LINE__, __FILE__, #expression, assert_tile_info(tile)); # define assert_tile(expression, tile) if (unlikely(!(expression))) error("Assertion failed at line %i of %s: %s\n\t%s", __LINE__, __FILE__, #expression, assert_tile_info(tile));

@ -85,7 +85,7 @@ static size_t ConvertLandscape(const char *value);
NSD(Int, SLE_GENERAL_X(SL_VAR, base, var, type | flags, 1, from, to, extver), #var, guiflags, guiproc, startup, patxname, def, min, max, interval, str, strhelp, strval, cat, pre_check, post_callback, nullptr) NSD(Int, SLE_GENERAL_X(SL_VAR, base, var, type | flags, 1, from, to, extver), #var, guiflags, guiproc, startup, patxname, def, min, max, interval, str, strhelp, strval, cat, pre_check, post_callback, nullptr)
#define SDT_ENUM(base, var, type, flags, guiflags, def, str, strhelp, pre_check, post_callback, from, to, extver, cat, guiproc, startup, patxname, enumlist)\ #define SDT_ENUM(base, var, type, flags, guiflags, def, str, strhelp, pre_check, post_callback, from, to, extver, cat, guiproc, startup, patxname, enumlist)\
NSD(Int, SLE_GENERAL_X(SL_VAR, base, var, type | flags, 1, from, to, extver), #var, guiflags | SGF_ENUM, guiproc, startup, patxname, def, 0, 0, 0, str, strhelp, STR_NULL, cat, pre_check, post_callback, enumlist) NSD(Int, SLE_GENERAL_X(SL_VAR, base, var, type | flags, 1, from, to, extver), #var, guiflags | SF_ENUM, guiproc, startup, patxname, def, 0, 0, 0, str, strhelp, STR_NULL, cat, pre_check, post_callback, enumlist)
#define SDT_BOOL(base, var, flags, guiflags, def, str, strhelp, strval, pre_check, post_callback, from, to, extver, cat, guiproc, startup, patxname)\ #define SDT_BOOL(base, var, flags, guiflags, def, str, strhelp, strval, pre_check, post_callback, from, to, extver, cat, guiproc, startup, patxname)\
NSD(Bool, SLE_GENERAL_X(SL_VAR, base, var, SLE_BOOL | flags, 1, from, to, extver), #var, guiflags, guiproc, startup, patxname, def, str, strhelp, strval, cat, pre_check, post_callback) NSD(Bool, SLE_GENERAL_X(SL_VAR, base, var, SLE_BOOL | flags, 1, from, to, extver), #var, guiflags, guiproc, startup, patxname, def, str, strhelp, strval, cat, pre_check, post_callback)

@ -25,7 +25,7 @@ SDT_VAR = static_assert($max <= MAX_$type, "Maximum value for CompanySettings.$v
[defaults] [defaults]
flags = 0 flags = 0
guiflags = SGF_PER_COMPANY guiflags = SF_PER_COMPANY
interval = 0 interval = 0
str = STR_NULL str = STR_NULL
strhelp = STR_CONFIG_SETTING_NO_EXPLANATION_AVAILABLE_HELPTEXT strhelp = STR_CONFIG_SETTING_NO_EXPLANATION_AVAILABLE_HELPTEXT
@ -53,7 +53,7 @@ cat = SC_BASIC
[SDT_VAR] [SDT_VAR]
var = engine_renew_months var = engine_renew_months
type = SLE_INT16 type = SLE_INT16
guiflags = SGF_PER_COMPANY | SGF_DISPLAY_ABS guiflags = SF_PER_COMPANY | SF_GUI_NEGATIVE_IS_SPECIAL
def = 6 def = 6
min = -12 min = -12
max = 12 max = 12
@ -64,7 +64,7 @@ strval = STR_CONFIG_SETTING_AUTORENEW_MONTHS_VALUE_BEFORE
[SDT_VAR] [SDT_VAR]
var = engine_renew_money var = engine_renew_money
type = SLE_UINT type = SLE_UINT
guiflags = SGF_PER_COMPANY | SGF_CURRENCY guiflags = SF_PER_COMPANY | SF_GUI_CURRENCY
def = 100000 def = 100000
min = 0 min = 0
max = 2000000 max = 2000000
@ -91,7 +91,7 @@ post_cb = UpdateServiceInterval
[SDT_VAR] [SDT_VAR]
var = vehicle.servint_trains var = vehicle.servint_trains
type = SLE_UINT16 type = SLE_UINT16
guiflags = SGF_PER_COMPANY | SGF_0ISDISABLED guiflags = SF_PER_COMPANY | SF_GUI_0_IS_SPECIAL
def = 150 def = 150
min = 5 min = 5
max = 800 max = 800
@ -104,7 +104,7 @@ post_cb = [](auto new_value) { UpdateServiceInterval(VEH_TRAIN, new_value); }
[SDT_VAR] [SDT_VAR]
var = vehicle.servint_roadveh var = vehicle.servint_roadveh
type = SLE_UINT16 type = SLE_UINT16
guiflags = SGF_PER_COMPANY | SGF_0ISDISABLED guiflags = SF_PER_COMPANY | SF_GUI_0_IS_SPECIAL
def = 150 def = 150
min = 5 min = 5
max = 800 max = 800
@ -117,7 +117,7 @@ post_cb = [](auto new_value) { UpdateServiceInterval(VEH_ROAD, new_value); }
[SDT_VAR] [SDT_VAR]
var = vehicle.servint_ships var = vehicle.servint_ships
type = SLE_UINT16 type = SLE_UINT16
guiflags = SGF_PER_COMPANY | SGF_0ISDISABLED guiflags = SF_PER_COMPANY | SF_GUI_0_IS_SPECIAL
def = 360 def = 360
min = 5 min = 5
max = 800 max = 800
@ -130,7 +130,7 @@ post_cb = [](auto new_value) { UpdateServiceInterval(VEH_SHIP, new_value); }
[SDT_VAR] [SDT_VAR]
var = vehicle.servint_aircraft var = vehicle.servint_aircraft
type = SLE_UINT16 type = SLE_UINT16
guiflags = SGF_PER_COMPANY | SGF_0ISDISABLED guiflags = SF_PER_COMPANY | SF_GUI_0_IS_SPECIAL
def = 100 def = 100
min = 5 min = 5
max = 800 max = 800
@ -143,7 +143,7 @@ post_cb = [](auto new_value) { UpdateServiceInterval(VEH_AIRCRAFT, new_value);
[SDT_BOOL] [SDT_BOOL]
base = CompanySettings base = CompanySettings
var = vehicle.auto_timetable_by_default var = vehicle.auto_timetable_by_default
guiflags = SGF_PER_COMPANY guiflags = SF_PER_COMPANY
def = false def = false
str = STR_CONFIG_SETTING_AUTO_TIMETABLE_BY_DEFAULT str = STR_CONFIG_SETTING_AUTO_TIMETABLE_BY_DEFAULT
strhelp = STR_CONFIG_SETTING_AUTO_TIMETABLE_BY_DEFAULT_HELPTEXT strhelp = STR_CONFIG_SETTING_AUTO_TIMETABLE_BY_DEFAULT_HELPTEXT
@ -152,7 +152,7 @@ patxname = ""vehicle.auto_timetable_by_default""
[SDT_BOOL] [SDT_BOOL]
base = CompanySettings base = CompanySettings
var = vehicle.auto_separation_by_default var = vehicle.auto_separation_by_default
guiflags = SGF_PER_COMPANY guiflags = SF_PER_COMPANY
def = true def = true
str = STR_CONFIG_SETTING_TIMETABLE_SEPARATION_BY_DEFAULT str = STR_CONFIG_SETTING_TIMETABLE_SEPARATION_BY_DEFAULT
strhelp = STR_CONFIG_SETTING_TIMETABLE_SEPARATION_BY_DEFAULT_HELPTEXT strhelp = STR_CONFIG_SETTING_TIMETABLE_SEPARATION_BY_DEFAULT_HELPTEXT
@ -162,7 +162,7 @@ patxname = ""vehicle.auto_separation_by_default""
base = CompanySettings base = CompanySettings
var = auto_timetable_separation_rate var = auto_timetable_separation_rate
type = SLE_UINT8 type = SLE_UINT8
guiflags = SGF_PER_COMPANY guiflags = SF_PER_COMPANY
def = 40 def = 40
min = 0 min = 0
max = 100 max = 100
@ -177,7 +177,7 @@ patxname = ""auto_timetable_separation_rate""
base = CompanySettings base = CompanySettings
var = timetable_autofill_rounding var = timetable_autofill_rounding
type = SLE_UINT16 type = SLE_UINT16
guiflags = SGF_PER_COMPANY guiflags = SF_PER_COMPANY
def = 74 def = 74
min = 1 min = 1
max = 1000 max = 1000
@ -192,7 +192,7 @@ patxname = ""timetable_autofill_rounding""
base = CompanySettings base = CompanySettings
var = order_occupancy_smoothness var = order_occupancy_smoothness
type = SLE_UINT8 type = SLE_UINT8
guiflags = SGF_PER_COMPANY guiflags = SF_PER_COMPANY
def = 75 def = 75
min = 0 min = 0
max = 100 max = 100
@ -206,7 +206,7 @@ patxname = ""order_occupancy_smoothness""
[SDT_BOOL] [SDT_BOOL]
base = CompanySettings base = CompanySettings
var = infra_others_buy_in_depot[0] var = infra_others_buy_in_depot[0]
guiflags = SGF_PER_COMPANY guiflags = SF_PER_COMPANY
def = false def = false
str = STR_CONFIG_SETTING_INFRA_OTHERS_BUY_IN_DEPOT_RAIL str = STR_CONFIG_SETTING_INFRA_OTHERS_BUY_IN_DEPOT_RAIL
patxname = ""infra_sharing.infra_others_buy_in_depot.rail"" patxname = ""infra_sharing.infra_others_buy_in_depot.rail""
@ -214,7 +214,7 @@ patxname = ""infra_sharing.infra_others_buy_in_depot.rail""
[SDT_BOOL] [SDT_BOOL]
base = CompanySettings base = CompanySettings
var = infra_others_buy_in_depot[1] var = infra_others_buy_in_depot[1]
guiflags = SGF_PER_COMPANY guiflags = SF_PER_COMPANY
def = false def = false
str = STR_CONFIG_SETTING_INFRA_OTHERS_BUY_IN_DEPOT_ROAD str = STR_CONFIG_SETTING_INFRA_OTHERS_BUY_IN_DEPOT_ROAD
patxname = ""infra_sharing.infra_others_buy_in_depot.road"" patxname = ""infra_sharing.infra_others_buy_in_depot.road""
@ -222,7 +222,7 @@ patxname = ""infra_sharing.infra_others_buy_in_depot.road""
[SDT_BOOL] [SDT_BOOL]
base = CompanySettings base = CompanySettings
var = infra_others_buy_in_depot[2] var = infra_others_buy_in_depot[2]
guiflags = SGF_PER_COMPANY guiflags = SF_PER_COMPANY
def = false def = false
str = STR_CONFIG_SETTING_INFRA_OTHERS_BUY_IN_DEPOT_WATER str = STR_CONFIG_SETTING_INFRA_OTHERS_BUY_IN_DEPOT_WATER
patxname = ""infra_sharing.infra_others_buy_in_depot.water"" patxname = ""infra_sharing.infra_others_buy_in_depot.water""
@ -230,7 +230,7 @@ patxname = ""infra_sharing.infra_others_buy_in_depot.water""
[SDT_BOOL] [SDT_BOOL]
base = CompanySettings base = CompanySettings
var = infra_others_buy_in_depot[3] var = infra_others_buy_in_depot[3]
guiflags = SGF_PER_COMPANY guiflags = SF_PER_COMPANY
def = false def = false
str = STR_CONFIG_SETTING_INFRA_OTHERS_BUY_IN_DEPOT_AIR str = STR_CONFIG_SETTING_INFRA_OTHERS_BUY_IN_DEPOT_AIR
patxname = ""infra_sharing.infra_others_buy_in_depot.air"" patxname = ""infra_sharing.infra_others_buy_in_depot.air""
@ -239,7 +239,7 @@ patxname = ""infra_sharing.infra_others_buy_in_depot.air""
[SDT_BOOL] [SDT_BOOL]
base = CompanySettings base = CompanySettings
var = advance_order_on_clone var = advance_order_on_clone
guiflags = SGF_PER_COMPANY guiflags = SF_PER_COMPANY
def = false def = false
str = STR_CONFIG_SETTING_ADVANCE_ORDER_ON_CLONE str = STR_CONFIG_SETTING_ADVANCE_ORDER_ON_CLONE
strhelp = STR_CONFIG_SETTING_ADVANCE_ORDER_ON_CLONE_HELPTEXT strhelp = STR_CONFIG_SETTING_ADVANCE_ORDER_ON_CLONE_HELPTEXT
@ -248,7 +248,7 @@ patxname = ""advance_order_on_clone""
[SDT_BOOL] [SDT_BOOL]
base = CompanySettings base = CompanySettings
var = copy_clone_add_to_group var = copy_clone_add_to_group
guiflags = SGF_PER_COMPANY guiflags = SF_PER_COMPANY
def = true def = true
str = STR_CONFIG_SETTING_COPY_CLONE_ADD_TO_GROUP str = STR_CONFIG_SETTING_COPY_CLONE_ADD_TO_GROUP
strhelp = STR_CONFIG_SETTING_COPY_CLONE_ADD_TO_GROUP_HELPTEXT strhelp = STR_CONFIG_SETTING_COPY_CLONE_ADD_TO_GROUP_HELPTEXT
@ -258,7 +258,7 @@ patxname = ""copy_clone_add_to_group""
base = CompanySettings base = CompanySettings
var = simulated_wormhole_signals var = simulated_wormhole_signals
type = SLE_UINT8 type = SLE_UINT8
guiflags = SGF_PER_COMPANY guiflags = SF_PER_COMPANY
def = 4 def = 4
min = 1 min = 1
max = 16 max = 16

@ -19,7 +19,7 @@ SDT_VAR = static_assert($max <= MAX_$type, "Maximum value for CurrencySpec.$var
[defaults] [defaults]
flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC
guiflags = SGF_NONE guiflags = SF_NONE
interval = 0 interval = 0
str = STR_NULL str = STR_NULL
strhelp = STR_CONFIG_SETTING_NO_EXPLANATION_AVAILABLE_HELPTEXT strhelp = STR_CONFIG_SETTING_NO_EXPLANATION_AVAILABLE_HELPTEXT

@ -64,7 +64,7 @@ SDT_VAR = static_assert($max <= MAX_$type, "Maximum value for GameSettings.$var
[defaults] [defaults]
flags = 0 flags = 0
guiflags = SGF_NONE guiflags = SF_NONE
interval = 0 interval = 0
str = STR_NULL str = STR_NULL
strhelp = STR_CONFIG_SETTING_NO_EXPLANATION_AVAILABLE_HELPTEXT strhelp = STR_CONFIG_SETTING_NO_EXPLANATION_AVAILABLE_HELPTEXT

@ -38,7 +38,7 @@ SDTG_OMANY = static_assert($max <= MAX_$type, "Maximum value for $var exceeds st
[defaults] [defaults]
flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC
guiflags = SGF_NONE guiflags = SF_NONE
interval = 0 interval = 0
str = STR_NULL str = STR_NULL
strhelp = STR_CONFIG_SETTING_NO_EXPLANATION_AVAILABLE_HELPTEXT strhelp = STR_CONFIG_SETTING_NO_EXPLANATION_AVAILABLE_HELPTEXT

File diff suppressed because it is too large Load Diff

@ -25,7 +25,7 @@ SDTG_VAR = static_assert($max <= MAX_$type, "Maximum value for $var exceeds stor
[defaults] [defaults]
flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC
guiflags = SGF_NONE guiflags = SF_NONE
interval = 0 interval = 0
str = STR_NULL str = STR_NULL
strhelp = STR_CONFIG_SETTING_NO_EXPLANATION_AVAILABLE_HELPTEXT strhelp = STR_CONFIG_SETTING_NO_EXPLANATION_AVAILABLE_HELPTEXT

@ -21,7 +21,7 @@ SDT_VAR = static_assert($max <= MAX_$type, "Maximum value for WindowDesc.$var ex
[defaults] [defaults]
flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC
guiflags = SGF_NONE guiflags = SF_NONE
interval = 0 interval = 0
str = STR_NULL str = STR_NULL
strhelp = STR_CONFIG_SETTING_NO_EXPLANATION_AVAILABLE_HELPTEXT strhelp = STR_CONFIG_SETTING_NO_EXPLANATION_AVAILABLE_HELPTEXT

@ -659,9 +659,7 @@ static void HeightMapCurves(uint level)
for (uint t = 0; t < lengthof(curve_maps); t++) { for (uint t = 0; t < lengthof(curve_maps); t++) {
if (!HasBit(corner_bits, t)) continue; if (!HasBit(corner_bits, t)) continue;
#ifdef WITH_ASSERT [[maybe_unused]] bool found = false;
bool found = false;
#endif
const control_point_t *cm = curve_maps[t].list; const control_point_t *cm = curve_maps[t].list;
for (uint i = 0; i < curve_maps[t].length - 1; i++) { for (uint i = 0; i < curve_maps[t].length - 1; i++) {
const control_point_t &p1 = cm[i]; const control_point_t &p1 = cm[i];

@ -114,13 +114,17 @@ Town::~Town()
* and remove from list of sorted towns */ * and remove from list of sorted towns */
DeleteWindowById(WC_TOWN_VIEW, this->index); DeleteWindowById(WC_TOWN_VIEW, this->index);
/* Check no industry is related to us. */
#ifdef WITH_ASSERT #ifdef WITH_ASSERT
for (const Industry *i : Industry::Iterate()) assert(i->town != this); /* Check no industry is related to us. */
for (const Industry *i : Industry::Iterate()) {
assert(i->town != this);
}
/* ... and no object is related to us. */ /* ... and no object is related to us. */
for (const Object *o : Object::Iterate()) assert(o->town != this); for (const Object *o : Object::Iterate()) {
#endif assert(o->town != this);
}
#endif /* WITH_ASSERT */
/* Check no tile is related to us. */ /* Check no tile is related to us. */
for (TileIndex tile = 0; tile < MapSize(); ++tile) { for (TileIndex tile = 0; tile < MapSize(); ++tile) {
@ -2420,8 +2424,7 @@ static Town *CreateRandomTown(uint attempts, uint32 townnameparts, TownSize size
if (t->cache.population > 0) return t; if (t->cache.population > 0) return t;
Backup<CompanyID> cur_company(_current_company, OWNER_TOWN, FILE_LINE); Backup<CompanyID> cur_company(_current_company, OWNER_TOWN, FILE_LINE);
CommandCost rc = DoCommand(t->xy, t->index, 0, DC_EXEC, CMD_DELETE_TOWN); [[maybe_unused]] CommandCost rc = DoCommand(t->xy, t->index, 0, DC_EXEC, CMD_DELETE_TOWN);
(void)rc; // assert only
cur_company.Restore(); cur_company.Restore();
assert(rc.Succeeded()); assert(rc.Succeeded());
@ -2542,8 +2545,7 @@ HouseZonesBits GetTownRadiusGroup(const Town *t, TileIndex tile)
*/ */
static inline void ClearMakeHouseTile(TileIndex tile, Town *t, byte counter, byte stage, HouseID type, byte random_bits) static inline void ClearMakeHouseTile(TileIndex tile, Town *t, byte counter, byte stage, HouseID type, byte random_bits)
{ {
CommandCost cc = DoCommand(tile, 0, 0, DC_EXEC | DC_AUTO | DC_NO_WATER | DC_TOWN, CMD_LANDSCAPE_CLEAR); [[maybe_unused]] CommandCost cc = DoCommand(tile, 0, 0, DC_EXEC | DC_AUTO | DC_NO_WATER | DC_TOWN, CMD_LANDSCAPE_CLEAR);
(void)cc; // assert only
assert(cc.Succeeded()); assert(cc.Succeeded());
IncreaseBuildingCount(t, type); IncreaseBuildingCount(t, type);

@ -600,9 +600,7 @@ static char *MakeCzechTownName(char *buf, const char *last, uint32 seed)
return strecpy(buf, _name_czech_real[SeedModChance(4, lengthof(_name_czech_real), seed)], last); return strecpy(buf, _name_czech_real[SeedModChance(4, lengthof(_name_czech_real), seed)], last);
} }
#ifdef WITH_ASSERT [[maybe_unused]] const char *orig = buf;
const char *orig = buf;
#endif
/* Probability of prefixes/suffixes /* Probability of prefixes/suffixes
* 0..11 prefix, 12..13 prefix+suffix, 14..17 suffix, 18..31 nothing */ * 0..11 prefix, 12..13 prefix+suffix, 14..17 suffix, 18..31 nothing */

@ -2903,8 +2903,7 @@ static void ChangeTileOwner_TunnelBridge(TileIndex tile, Owner old_owner, Owner
if (tt == TRANSPORT_RAIL) { if (tt == TRANSPORT_RAIL) {
/* Since all of our vehicles have been removed, it is safe to remove the rail /* Since all of our vehicles have been removed, it is safe to remove the rail
* bridge / tunnel. */ * bridge / tunnel. */
CommandCost ret = DoCommand(tile, 0, 0, DC_EXEC | DC_BANKRUPT, CMD_LANDSCAPE_CLEAR); [[maybe_unused]] CommandCost ret = DoCommand(tile, 0, 0, DC_EXEC | DC_BANKRUPT, CMD_LANDSCAPE_CLEAR);
(void)ret; // assert only
assert(ret.Succeeded()); assert(ret.Succeeded());
} else { } else {
/* In any other case, we can safely reassign the ownership to OWNER_NONE. */ /* In any other case, we can safely reassign the ownership to OWNER_NONE. */

@ -54,8 +54,7 @@ bool VehicleListIdentifier::UnpackIfValid(uint32 data)
/* static */ VehicleListIdentifier VehicleListIdentifier::UnPack(uint32 data) /* static */ VehicleListIdentifier VehicleListIdentifier::UnPack(uint32 data)
{ {
VehicleListIdentifier result; VehicleListIdentifier result;
bool ret = result.UnpackIfValid(data); [[maybe_unused]] bool ret = result.UnpackIfValid(data);
(void)ret; // assert only
assert(ret); assert(ret);
return result; return result;
} }

@ -1306,9 +1306,7 @@ void NWidgetHorizontal::SetupSmallestSize(Window *w, bool init_array)
this->smallest_y = std::max(this->smallest_y, child_wid->smallest_y + child_wid->padding_top + child_wid->padding_bottom); this->smallest_y = std::max(this->smallest_y, child_wid->smallest_y + child_wid->padding_top + child_wid->padding_bottom);
} }
/* 1b. Make the container higher if needed to accommodate all children nicely. */ /* 1b. Make the container higher if needed to accommodate all children nicely. */
#ifdef WITH_ASSERT [[maybe_unused]] uint max_smallest = this->smallest_y + 3 * max_vert_fill; // Upper limit to computing smallest height.
uint max_smallest = this->smallest_y + 3 * max_vert_fill; // Upper limit to computing smallest height.
#endif
uint cur_height = this->smallest_y; uint cur_height = this->smallest_y;
for (;;) { for (;;) {
for (NWidgetBase *child_wid = this->head; child_wid != nullptr; child_wid = child_wid->next) { for (NWidgetBase *child_wid = this->head; child_wid != nullptr; child_wid = child_wid->next) {
@ -1473,9 +1471,7 @@ void NWidgetVertical::SetupSmallestSize(Window *w, bool init_array)
this->smallest_x = std::max(this->smallest_x, child_wid->smallest_x + child_wid->padding_left + child_wid->padding_right); this->smallest_x = std::max(this->smallest_x, child_wid->smallest_x + child_wid->padding_left + child_wid->padding_right);
} }
/* 1b. Make the container wider if needed to accommodate all children nicely. */ /* 1b. Make the container wider if needed to accommodate all children nicely. */
#ifdef WITH_ASSERT [[maybe_unused]] uint max_smallest = this->smallest_x + 3 * max_hor_fill; // Upper limit to computing smallest height.
uint max_smallest = this->smallest_x + 3 * max_hor_fill; // Upper limit to computing smallest height.
#endif
uint cur_width = this->smallest_x; uint cur_width = this->smallest_x;
for (;;) { for (;;) {
for (NWidgetBase *child_wid = this->head; child_wid != nullptr; child_wid = child_wid->next) { for (NWidgetBase *child_wid = this->head; child_wid != nullptr; child_wid = child_wid->next) {

Loading…
Cancel
Save