diff --git a/src/settings.cpp b/src/settings.cpp --- a/src/settings.cpp +++ b/src/settings.cpp @@ -41,6 +41,7 @@ #include "date.h" #include "rail.h" #include "helpers.hpp" +#include "news.h" #ifdef WITH_FREETYPE #include "gfx.h" #include "fontcache.h" @@ -1183,7 +1184,6 @@ static const SettingDescGlobVarList _win static const SettingDescGlobVarList _misc_settings[] = { SDTG_MMANY("display_opt", SLE_UINT8, S, 0, _display_opt, (DO_SHOW_TOWN_NAMES|DO_SHOW_STATION_NAMES|DO_SHOW_SIGNS|DO_FULL_ANIMATION|DO_FULL_DETAIL|DO_TRANS_BUILDINGS|DO_WAYPOINTS), "SHOW_TOWN_NAMES|SHOW_STATION_NAMES|SHOW_SIGNS|FULL_ANIMATION|TRANS_BUILDINGS|FULL_DETAIL|WAYPOINTS", STR_NULL, NULL), - SDTG_VAR("news_display_opt", SLE_UINT, S, 0, _news_display_opt,0xAAAAAAAA,0,0xAAAAAAAA,0,STR_NULL, NULL), // default to all full messages: 10101010101010101010 = 0xAAAAAAAA SDTG_BOOL("news_ticker_sound", S, 0, _news_ticker_sound, true, STR_NULL, NULL), SDTG_BOOL("fullscreen", S, 0, _fullscreen, false, STR_NULL, NULL), SDTG_STR("videodriver", SLE_STRB,C|S,0, _ini_videodriver, NULL, STR_NULL, NULL), @@ -1502,6 +1502,43 @@ static const SettingDesc _currency_setti #undef NO #undef CR +static uint NewsDisplayLoadConfig(IniFile *ini, const char *grpname) +{ + IniGroup *group = ini_getgroup(ini, grpname, -1); + IniItem *item; + /* By default, set everything to full (0xAAAAAAAA = 1010101010101010) */ + uint res = 0xAAAAAAAA; + + /* If no group exists, return everything full */ + if (group == NULL) return res; + + for (item = group->item; item != NULL; item = item->next) { + int news_item = -1; + for (int i = 0; i < NT_END; i++) { + if (strcasecmp(item->name, _news_display_name[i]) == 0) { + news_item = i; + break; + } + } + if (news_item == -1) { + DEBUG(misc, 0, "Invalid display option: %s", item->name); + continue; + } + + if (strcasecmp(item->value, "full") == 0) { + SB(res, news_item * 2, 2, 2); + } else if (strcasecmp(item->value, "off") == 0) { + SB(res, news_item * 2, 2, 0); + } else if (strcasecmp(item->value, "summarized") == 0) { + SB(res, news_item * 2, 2, 1); + } else { + DEBUG(misc, 0, "Invalid display value: %s", item->value); + continue; + } + } + + return res; +} /* Load a GRF configuration from the given group name */ static GRFConfig *GRFLoadConfig(IniFile *ini, const char *grpname, bool is_static) @@ -1556,6 +1593,26 @@ static GRFConfig *GRFLoadConfig(IniFile return first; } +static void NewsDisplaySaveConfig(IniFile *ini, const char *grpname, uint news_display) +{ + IniGroup *group = ini_getgroup(ini, grpname, -1); + IniItem **item; + + if (group == NULL) return; + group->item = NULL; + item = &group->item; + + for (int i = 0; i < NT_END; i++) { + const char *value; + int v = GB(news_display, i * 2, 2); + + value = (v == 0 ? "off" : (v == 1 ? "summarized" : "full")); + + *item = ini_item_alloc(group, _news_display_name[i], strlen(_news_display_name[i])); + (*item)->value = (char*)pool_strdup(&ini->pool, value, strlen(value)); + item = &(*item)->next; + } +} /* Save a GRF configuration to the given group name */ static void GRFSaveConfig(IniFile *ini, const char *grpname, const GRFConfig *list) @@ -1605,6 +1662,7 @@ void LoadFromConfig() HandleSettingDescs(ini, ini_load_settings, ini_load_setting_list); _grfconfig_newgame = GRFLoadConfig(ini, "newgrf", false); _grfconfig_static = GRFLoadConfig(ini, "newgrf-static", true); + _news_display_opt = NewsDisplayLoadConfig(ini, "news_display"); ini_free(ini); } @@ -1615,6 +1673,7 @@ void SaveToConfig() HandleSettingDescs(ini, ini_save_settings, ini_save_setting_list); GRFSaveConfig(ini, "newgrf", _grfconfig_newgame); GRFSaveConfig(ini, "newgrf-static", _grfconfig_static); + NewsDisplaySaveConfig(ini, "news_display", _news_display_opt); ini_save(_config_file, ini); ini_free(ini); } @@ -1824,16 +1883,6 @@ static void Save_PATS() void CheckConfig() { - // fix up news_display_opt from old to new - int i; - uint32 tmp; - for (i = 0, tmp = _news_display_opt; i != 10; i++, tmp >>= 2) { - if ((tmp & 0x3) == 0x3) { // old settings - _news_display_opt = 0xAAAAAAAA; // set all news-messages to full 1010101010... - break; - } - } - // Increase old default values for pf_maxdepth and pf_maxlength // to support big networks. if (_patches_newgame.pf_maxdepth == 16 && _patches_newgame.pf_maxlength == 512) {