mirror of https://github.com/OpenTTD/OpenTTD.git
(svn r13255) -Codechange: move _opt to _settings.
This commit is contained in:
parent
51ca426c4b
commit
8c9cc415e3
|
@ -184,8 +184,8 @@ void AI_RunGameLoop()
|
|||
_ai.tick++;
|
||||
|
||||
/* Make sure the AI follows the difficulty rule.. */
|
||||
assert(_opt.diff.competitor_speed <= 4);
|
||||
if ((_ai.tick & ((1 << (4 - _opt.diff.competitor_speed)) - 1)) != 0) return;
|
||||
assert(_settings.difficulty.competitor_speed <= 4);
|
||||
if ((_ai.tick & ((1 << (4 - _settings.difficulty.competitor_speed)) - 1)) != 0) return;
|
||||
|
||||
/* Check for AI-client (so joining a network with an AI) */
|
||||
if (!_networking || _network_server) {
|
||||
|
|
|
@ -2550,7 +2550,7 @@ handle_nocash:
|
|||
bool is_pass = (
|
||||
_players_ai[p->index].cargo_type == CT_PASSENGERS ||
|
||||
_players_ai[p->index].cargo_type == CT_MAIL ||
|
||||
(_opt.landscape == LT_TEMPERATE && _players_ai[p->index].cargo_type == CT_VALUABLES)
|
||||
(_settings.game_creation.landscape == LT_TEMPERATE && _players_ai[p->index].cargo_type == CT_VALUABLES)
|
||||
);
|
||||
Order order;
|
||||
|
||||
|
@ -3285,7 +3285,7 @@ static void AiStateBuildRoadVehicles(Player *p)
|
|||
bool is_pass = (
|
||||
_players_ai[p->index].cargo_type == CT_PASSENGERS ||
|
||||
_players_ai[p->index].cargo_type == CT_MAIL ||
|
||||
(_opt.landscape == LT_TEMPERATE && _players_ai[p->index].cargo_type == CT_VALUABLES)
|
||||
(_settings.game_creation.landscape == LT_TEMPERATE && _players_ai[p->index].cargo_type == CT_VALUABLES)
|
||||
);
|
||||
Order order;
|
||||
|
||||
|
|
|
@ -1017,7 +1017,7 @@ static void AiNew_State_BuildPath(Player *p)
|
|||
if (_players_ainew[p->index].temp == -1) {
|
||||
DEBUG(ai, 1, "Starting to build new path");
|
||||
// Init the counter
|
||||
_players_ainew[p->index].counter = (4 - _opt.diff.competitor_speed) * AI_BUILDPATH_PAUSE + 1;
|
||||
_players_ainew[p->index].counter = (4 - _settings.difficulty.competitor_speed) * AI_BUILDPATH_PAUSE + 1;
|
||||
// Set the position to the startingplace (-1 because in a minute we do ++)
|
||||
_players_ainew[p->index].path_info.position = -1;
|
||||
// And don't do this again
|
||||
|
@ -1026,7 +1026,7 @@ static void AiNew_State_BuildPath(Player *p)
|
|||
// Building goes very fast on normal rate, so we are going to slow it down..
|
||||
// By let the counter count from AI_BUILDPATH_PAUSE to 0, we have a nice way :)
|
||||
if (--_players_ainew[p->index].counter != 0) return;
|
||||
_players_ainew[p->index].counter = (4 - _opt.diff.competitor_speed) * AI_BUILDPATH_PAUSE + 1;
|
||||
_players_ainew[p->index].counter = (4 - _settings.difficulty.competitor_speed) * AI_BUILDPATH_PAUSE + 1;
|
||||
|
||||
// Increase the building position
|
||||
_players_ainew[p->index].path_info.position++;
|
||||
|
|
|
@ -64,9 +64,9 @@ static int32 ClickChangeClimateCheat(int32 p1, int32 p2)
|
|||
{
|
||||
if (p1 == -1) p1 = 3;
|
||||
if (p1 == 4) p1 = 0;
|
||||
_opt.landscape = p1;
|
||||
_settings.game_creation.landscape = p1;
|
||||
ReloadNewGRFData();
|
||||
return _opt.landscape;
|
||||
return _settings.game_creation.landscape;
|
||||
}
|
||||
|
||||
extern void EnginesMonthlyLoop();
|
||||
|
@ -100,15 +100,15 @@ struct CheatEntry {
|
|||
};
|
||||
|
||||
static const CheatEntry _cheats_ui[] = {
|
||||
{SLE_INT32, STR_CHEAT_MONEY, &_money_cheat_amount, &_cheats.money.been_used, &ClickMoneyCheat },
|
||||
{SLE_UINT8, STR_CHEAT_CHANGE_PLAYER, &_local_player, &_cheats.switch_player.been_used, &ClickChangePlayerCheat },
|
||||
{SLE_BOOL, STR_CHEAT_EXTRA_DYNAMITE, &_cheats.magic_bulldozer.value, &_cheats.magic_bulldozer.been_used, NULL },
|
||||
{SLE_BOOL, STR_CHEAT_CROSSINGTUNNELS, &_cheats.crossing_tunnels.value, &_cheats.crossing_tunnels.been_used, NULL },
|
||||
{SLE_BOOL, STR_CHEAT_BUILD_IN_PAUSE, &_cheats.build_in_pause.value, &_cheats.build_in_pause.been_used, NULL },
|
||||
{SLE_BOOL, STR_CHEAT_NO_JETCRASH, &_cheats.no_jetcrash.value, &_cheats.no_jetcrash.been_used, NULL },
|
||||
{SLE_BOOL, STR_CHEAT_SETUP_PROD, &_cheats.setup_prod.value, &_cheats.setup_prod.been_used, NULL },
|
||||
{SLE_UINT8, STR_CHEAT_SWITCH_CLIMATE, &_opt.landscape, &_cheats.switch_climate.been_used, &ClickChangeClimateCheat},
|
||||
{SLE_INT32, STR_CHEAT_CHANGE_DATE, &_cur_year, &_cheats.change_date.been_used, &ClickChangeDateCheat },
|
||||
{SLE_INT32, STR_CHEAT_MONEY, &_money_cheat_amount, &_cheats.money.been_used, &ClickMoneyCheat },
|
||||
{SLE_UINT8, STR_CHEAT_CHANGE_PLAYER, &_local_player, &_cheats.switch_player.been_used, &ClickChangePlayerCheat },
|
||||
{SLE_BOOL, STR_CHEAT_EXTRA_DYNAMITE, &_cheats.magic_bulldozer.value, &_cheats.magic_bulldozer.been_used, NULL },
|
||||
{SLE_BOOL, STR_CHEAT_CROSSINGTUNNELS, &_cheats.crossing_tunnels.value, &_cheats.crossing_tunnels.been_used, NULL },
|
||||
{SLE_BOOL, STR_CHEAT_BUILD_IN_PAUSE, &_cheats.build_in_pause.value, &_cheats.build_in_pause.been_used, NULL },
|
||||
{SLE_BOOL, STR_CHEAT_NO_JETCRASH, &_cheats.no_jetcrash.value, &_cheats.no_jetcrash.been_used, NULL },
|
||||
{SLE_BOOL, STR_CHEAT_SETUP_PROD, &_cheats.setup_prod.value, &_cheats.setup_prod.been_used, NULL },
|
||||
{SLE_UINT8, STR_CHEAT_SWITCH_CLIMATE, &_settings.game_creation.landscape, &_cheats.switch_climate.been_used, &ClickChangeClimateCheat},
|
||||
{SLE_INT32, STR_CHEAT_CHANGE_DATE, &_cur_year, &_cheats.change_date.been_used, &ClickChangeDateCheat },
|
||||
};
|
||||
|
||||
|
||||
|
|
|
@ -218,7 +218,7 @@ static void TileLoop_Clear(TileIndex tile)
|
|||
{
|
||||
TileLoopClearHelper(tile);
|
||||
|
||||
switch (_opt.landscape) {
|
||||
switch (_settings.game_creation.landscape) {
|
||||
case LT_TROPIC: TileLoopClearDesert(tile); break;
|
||||
case LT_ARCTIC: TileLoopClearAlps(tile); break;
|
||||
}
|
||||
|
@ -346,7 +346,7 @@ static void ChangeTileOwner_Clear(TileIndex tile, PlayerID old_player, PlayerID
|
|||
|
||||
void InitializeClearLand()
|
||||
{
|
||||
_opt.snow_line = _settings.game_creation.snow_line_height * TILE_HEIGHT;
|
||||
_settings.game_creation.snow_line = _settings.game_creation.snow_line_height * TILE_HEIGHT;
|
||||
}
|
||||
|
||||
static CommandCost TerraformTile_Clear(TileIndex tile, uint32 flags, uint z_new, Slope tileh_new)
|
||||
|
|
|
@ -150,10 +150,10 @@ uint GetMaskOfAllowedCurrencies()
|
|||
**/
|
||||
void CheckSwitchToEuro()
|
||||
{
|
||||
if (_currency_specs[_opt.currency].to_euro != CF_NOEURO &&
|
||||
_currency_specs[_opt.currency].to_euro != CF_ISEURO &&
|
||||
_cur_year >= _currency_specs[_opt.currency].to_euro) {
|
||||
_opt.currency = 2; // this is the index of euro above.
|
||||
if (_currency_specs[_settings.gui.currency].to_euro != CF_NOEURO &&
|
||||
_currency_specs[_settings.gui.currency].to_euro != CF_ISEURO &&
|
||||
_cur_year >= _currency_specs[_settings.gui.currency].to_euro) {
|
||||
_settings.gui.currency = 2; // this is the index of euro above.
|
||||
AddNewsItem(STR_EURO_INTRODUCE, NS_ECONOMY, 0, 0);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -39,7 +39,7 @@ extern CurrencySpec _currency_specs[NUM_CURRENCY];
|
|||
|
||||
// XXX small hack, but makes the rest of the code a bit nicer to read
|
||||
#define _custom_currency (_currency_specs[CUSTOM_CURRENCY_ID])
|
||||
#define _currency ((const CurrencySpec*)&_currency_specs[(_game_mode == GM_MENU) ? _opt_newgame.currency : _opt.currency])
|
||||
#define _currency ((const CurrencySpec*)&_currency_specs[(_game_mode == GM_MENU) ? _settings_newgame.gui.currency : _settings.gui.currency])
|
||||
|
||||
uint GetMaskOfAllowedCurrencies();
|
||||
void CheckSwitchToEuro();
|
||||
|
|
|
@ -257,7 +257,7 @@ void IncreaseDate()
|
|||
SaveOrLoad(name, SL_SAVE, AUTOSAVE_DIR);
|
||||
DebugDumpCommands("ddc:save:%s\n", name);
|
||||
#endif /* DUMP_COMMANDS */
|
||||
if (_opt.autosave != 0 && (_cur_month % _autosave_months[_opt.autosave]) == 0) {
|
||||
if (_settings.gui.autosave != 0 && (_cur_month % _autosave_months[_settings.gui.autosave]) == 0) {
|
||||
_do_autosave = true;
|
||||
RedrawAutosave();
|
||||
}
|
||||
|
|
|
@ -1050,7 +1050,7 @@ void DisasterDailyLoop()
|
|||
|
||||
ResetDisasterDelay();
|
||||
|
||||
if (_opt.diff.disasters != 0) DoDisaster();
|
||||
if (_settings.difficulty.disasters != 0) DoDisaster();
|
||||
}
|
||||
|
||||
void StartupDisasters()
|
||||
|
|
|
@ -704,7 +704,7 @@ static void PlayersPayInterest()
|
|||
|
||||
static void HandleEconomyFluctuations()
|
||||
{
|
||||
if (_opt.diff.economy == 0) return;
|
||||
if (_settings.difficulty.economy == 0) return;
|
||||
|
||||
if (--_economy.fluct == 0) {
|
||||
_economy.fluct = -(int)GB(Random(), 0, 2);
|
||||
|
@ -813,7 +813,7 @@ void StartupEconomy()
|
|||
for (i = 0; i != NUM_PRICES; i++) {
|
||||
Money price = _price_base[i];
|
||||
if (_price_category[i] != 0) {
|
||||
uint mod = _price_category[i] == 1 ? _opt.diff.vehicle_costs : _opt.diff.construction_cost;
|
||||
uint mod = _price_category[i] == 1 ? _settings.difficulty.vehicle_costs : _settings.difficulty.construction_cost;
|
||||
if (mod < 1) {
|
||||
price = price * 3 >> 2;
|
||||
} else if (mod > 1) {
|
||||
|
@ -829,10 +829,10 @@ void StartupEconomy()
|
|||
_price_frac[i] = 0;
|
||||
}
|
||||
|
||||
_economy.interest_rate = _opt.diff.initial_interest;
|
||||
_economy.infl_amount = _opt.diff.initial_interest;
|
||||
_economy.infl_amount_pr = max(0, _opt.diff.initial_interest - 1);
|
||||
_economy.max_loan_unround = _economy.max_loan = _opt.diff.max_loan * 1000;
|
||||
_economy.interest_rate = _settings.difficulty.initial_interest;
|
||||
_economy.infl_amount = _settings.difficulty.initial_interest;
|
||||
_economy.infl_amount_pr = max(0, _settings.difficulty.initial_interest - 1);
|
||||
_economy.max_loan_unround = _economy.max_loan = _settings.difficulty.max_loan * 1000;
|
||||
_economy.fluct = GB(Random(), 0, 8) + 168;
|
||||
}
|
||||
|
||||
|
@ -1162,7 +1162,7 @@ Money GetTransportedGoodsIncome(uint num_pieces, uint dist, byte transit_days, C
|
|||
}
|
||||
|
||||
/* zero the distance (thus income) if it's the bank and very short transport. */
|
||||
if (_opt.landscape == LT_TEMPERATE && cs->label == 'VALU' && dist < 10) return 0;
|
||||
if (_settings.game_creation.landscape == LT_TEMPERATE && cs->label == 'VALU' && dist < 10) return 0;
|
||||
|
||||
|
||||
static const int MIN_TIME_FACTOR = 31;
|
||||
|
@ -1313,7 +1313,7 @@ static bool CheckSubsidised(Station *from, Station *to, CargoID cargo_type)
|
|||
|
||||
SetDParam(0, _current_player);
|
||||
AddNewsItem(
|
||||
STR_2031_SERVICE_SUBSIDY_AWARDED + _opt.diff.subsidy_multiplier,
|
||||
STR_2031_SERVICE_SUBSIDY_AWARDED + _settings.difficulty.subsidy_multiplier,
|
||||
NS_SUBSIDIES,
|
||||
pair.a, pair.b
|
||||
);
|
||||
|
@ -1360,7 +1360,7 @@ static Money DeliverGoods(int num_pieces, CargoID cargo_type, StationID source,
|
|||
|
||||
/* Modify profit if a subsidy is in effect */
|
||||
if (subsidised) {
|
||||
switch (_opt.diff.subsidy_multiplier) {
|
||||
switch (_settings.difficulty.subsidy_multiplier) {
|
||||
case 0: profit += profit >> 1; break;
|
||||
case 1: profit *= 2; break;
|
||||
case 2: profit *= 3; break;
|
||||
|
|
|
@ -296,7 +296,7 @@ void StartupEngines()
|
|||
e->lifelength = ei->lifelength + _settings.vehicle.extend_vehicle_life;
|
||||
|
||||
/* prevent certain engines from ever appearing. */
|
||||
if (!HasBit(ei->climates, _opt.landscape)) {
|
||||
if (!HasBit(ei->climates, _settings.game_creation.landscape)) {
|
||||
e->flags |= ENGINE_AVAILABLE;
|
||||
e->player_avail = 0;
|
||||
}
|
||||
|
|
|
@ -48,7 +48,7 @@ extern void SwitchMode(int new_mode);
|
|||
|
||||
static inline void SetNewLandscapeType(byte landscape)
|
||||
{
|
||||
_opt_newgame.landscape = landscape;
|
||||
_settings.game_creation.landscape = landscape;
|
||||
InvalidateWindowClasses(WC_SELECT_GAME);
|
||||
InvalidateWindowClasses(WC_GENERATE_LANDSCAPE);
|
||||
}
|
||||
|
@ -206,7 +206,6 @@ void StartGeneratingLandscape(glwp_modes mode)
|
|||
|
||||
/* Copy all XXX_newgame to XXX when coming from outside the editor */
|
||||
UpdatePatches();
|
||||
_opt = _opt_newgame;
|
||||
ResetGRFConfig(true);
|
||||
|
||||
SndPlayFx(SND_15_BEEP);
|
||||
|
@ -254,7 +253,7 @@ struct GenerateLandscapeWindow : public QueryStringBaseWindow {
|
|||
|
||||
GenerateLandscapeWindow(const WindowDesc *desc, WindowNumber number = 0) : QueryStringBaseWindow(desc, number)
|
||||
{
|
||||
this->LowerWidget(_opt_newgame.landscape + GLAND_TEMPERATE);
|
||||
this->LowerWidget(_settings.game_creation.landscape + GLAND_TEMPERATE);
|
||||
|
||||
snprintf(this->edit_str_buf, sizeof(this->edit_str_buf), "%u", _settings_newgame.game_creation.generation_seed);
|
||||
InitializeTextBuffer(&this->text, this->edit_str_buf, lengthof(this->edit_str_buf), 120);
|
||||
|
@ -273,7 +272,7 @@ struct GenerateLandscapeWindow : public QueryStringBaseWindow {
|
|||
this->SetWidgetDisabledState(GLAND_SMOOTHNESS_PULLDOWN, _settings_newgame.game_creation.land_generator == 0);
|
||||
}
|
||||
/* Disable snowline if not hilly */
|
||||
this->SetWidgetDisabledState(GLAND_SNOW_LEVEL_TEXT, _opt_newgame.landscape != LT_ARCTIC);
|
||||
this->SetWidgetDisabledState(GLAND_SNOW_LEVEL_TEXT, _settings.game_creation.landscape != LT_ARCTIC);
|
||||
/* Disable town, industry and trees in SE */
|
||||
this->SetWidgetDisabledState(GLAND_TOWN_PULLDOWN, _game_mode == GM_EDITOR);
|
||||
this->SetWidgetDisabledState(GLAND_INDUSTRY_PULLDOWN, _game_mode == GM_EDITOR);
|
||||
|
@ -281,27 +280,27 @@ struct GenerateLandscapeWindow : public QueryStringBaseWindow {
|
|||
|
||||
this->SetWidgetDisabledState(GLAND_START_DATE_DOWN, _settings_newgame.game_creation.starting_year <= MIN_YEAR);
|
||||
this->SetWidgetDisabledState(GLAND_START_DATE_UP, _settings_newgame.game_creation.starting_year >= MAX_YEAR);
|
||||
this->SetWidgetDisabledState(GLAND_SNOW_LEVEL_DOWN, _settings_newgame.game_creation.snow_line_height <= 2 || _opt_newgame.landscape != LT_ARCTIC);
|
||||
this->SetWidgetDisabledState(GLAND_SNOW_LEVEL_UP, _settings_newgame.game_creation.snow_line_height >= MAX_SNOWLINE_HEIGHT || _opt_newgame.landscape != LT_ARCTIC);
|
||||
this->SetWidgetDisabledState(GLAND_SNOW_LEVEL_DOWN, _settings_newgame.game_creation.snow_line_height <= 2 || _settings.game_creation.landscape != LT_ARCTIC);
|
||||
this->SetWidgetDisabledState(GLAND_SNOW_LEVEL_UP, _settings_newgame.game_creation.snow_line_height >= MAX_SNOWLINE_HEIGHT || _settings.game_creation.landscape != LT_ARCTIC);
|
||||
|
||||
this->SetWidgetLoweredState(GLAND_TEMPERATE, _opt_newgame.landscape == LT_TEMPERATE);
|
||||
this->SetWidgetLoweredState(GLAND_ARCTIC, _opt_newgame.landscape == LT_ARCTIC);
|
||||
this->SetWidgetLoweredState(GLAND_TROPICAL, _opt_newgame.landscape == LT_TROPIC);
|
||||
this->SetWidgetLoweredState(GLAND_TOYLAND, _opt_newgame.landscape == LT_TOYLAND);
|
||||
this->SetWidgetLoweredState(GLAND_TEMPERATE, _settings.game_creation.landscape == LT_TEMPERATE);
|
||||
this->SetWidgetLoweredState(GLAND_ARCTIC, _settings.game_creation.landscape == LT_ARCTIC);
|
||||
this->SetWidgetLoweredState(GLAND_TROPICAL, _settings.game_creation.landscape == LT_TROPIC);
|
||||
this->SetWidgetLoweredState(GLAND_TOYLAND, _settings.game_creation.landscape == LT_TOYLAND);
|
||||
|
||||
if (_game_mode == GM_EDITOR) {
|
||||
this->widget[GLAND_TOWN_PULLDOWN].data = STR_6836_OFF;
|
||||
this->widget[GLAND_INDUSTRY_PULLDOWN].data = STR_6836_OFF;
|
||||
} else {
|
||||
this->widget[GLAND_TOWN_PULLDOWN].data = _num_towns[_opt_newgame.diff.number_towns];
|
||||
this->widget[GLAND_INDUSTRY_PULLDOWN].data = _num_inds[_opt_newgame.diff.number_industries];
|
||||
this->widget[GLAND_TOWN_PULLDOWN].data = _num_towns[_settings_newgame.difficulty.number_towns];
|
||||
this->widget[GLAND_INDUSTRY_PULLDOWN].data = _num_inds[_settings_newgame.difficulty.number_industries];
|
||||
}
|
||||
|
||||
if (mode == GLWP_GENERATE) {
|
||||
this->widget[GLAND_LANDSCAPE_PULLDOWN].data = _landscape[_settings_newgame.game_creation.land_generator];
|
||||
this->widget[GLAND_TREE_PULLDOWN].data = _tree_placer[_settings_newgame.game_creation.tree_placer];
|
||||
this->widget[GLAND_TERRAIN_PULLDOWN].data = _elevations[_opt_newgame.diff.terrain_type];
|
||||
this->widget[GLAND_WATER_PULLDOWN].data = _sea_lakes[_opt_newgame.diff.quantity_sea_lakes];
|
||||
this->widget[GLAND_TERRAIN_PULLDOWN].data = _elevations[_settings_newgame.difficulty.terrain_type];
|
||||
this->widget[GLAND_WATER_PULLDOWN].data = _sea_lakes[_settings_newgame.difficulty.quantity_sea_lakes];
|
||||
this->widget[GLAND_SMOOTHNESS_PULLDOWN].data = _smoothness[_settings_newgame.game_creation.tgen_smoothness];
|
||||
} else {
|
||||
this->widget[GLAND_TREE_PULLDOWN].data = _tree_placer[_settings_newgame.game_creation.tree_placer];
|
||||
|
@ -346,7 +345,7 @@ struct GenerateLandscapeWindow : public QueryStringBaseWindow {
|
|||
case GLAND_ARCTIC:
|
||||
case GLAND_TROPICAL:
|
||||
case GLAND_TOYLAND:
|
||||
this->RaiseWidget(_opt_newgame.landscape + GLAND_TEMPERATE);
|
||||
this->RaiseWidget(_settings.game_creation.landscape + GLAND_TEMPERATE);
|
||||
SetNewLandscapeType(widget - GLAND_TEMPERATE);
|
||||
break;
|
||||
|
||||
|
@ -359,11 +358,11 @@ struct GenerateLandscapeWindow : public QueryStringBaseWindow {
|
|||
break;
|
||||
|
||||
case GLAND_TOWN_PULLDOWN: // Number of towns
|
||||
ShowDropDownMenu(this, _num_towns, _opt_newgame.diff.number_towns, GLAND_TOWN_PULLDOWN, 0, 0);
|
||||
ShowDropDownMenu(this, _num_towns, _settings_newgame.difficulty.number_towns, GLAND_TOWN_PULLDOWN, 0, 0);
|
||||
break;
|
||||
|
||||
case GLAND_INDUSTRY_PULLDOWN: // Number of industries
|
||||
ShowDropDownMenu(this, _num_inds, _opt_newgame.diff.number_industries, GLAND_INDUSTRY_PULLDOWN, 0, 0);
|
||||
ShowDropDownMenu(this, _num_inds, _settings_newgame.difficulty.number_industries, GLAND_INDUSTRY_PULLDOWN, 0, 0);
|
||||
break;
|
||||
|
||||
case GLAND_RANDOM_BUTTON: // Random seed
|
||||
|
@ -451,11 +450,11 @@ struct GenerateLandscapeWindow : public QueryStringBaseWindow {
|
|||
break;
|
||||
|
||||
case GLAND_TERRAIN_PULLDOWN: // Terrain type
|
||||
ShowDropDownMenu(this, _elevations, _opt_newgame.diff.terrain_type, GLAND_TERRAIN_PULLDOWN, 0, 0);
|
||||
ShowDropDownMenu(this, _elevations, _settings_newgame.difficulty.terrain_type, GLAND_TERRAIN_PULLDOWN, 0, 0);
|
||||
break;
|
||||
|
||||
case GLAND_WATER_PULLDOWN: // Water quantity
|
||||
ShowDropDownMenu(this, _sea_lakes, _opt_newgame.diff.quantity_sea_lakes, GLAND_WATER_PULLDOWN, 0, 0);
|
||||
ShowDropDownMenu(this, _sea_lakes, _settings_newgame.difficulty.quantity_sea_lakes, GLAND_WATER_PULLDOWN, 0, 0);
|
||||
break;
|
||||
|
||||
case GLAND_SMOOTHNESS_PULLDOWN: // Map smoothness
|
||||
|
@ -491,15 +490,15 @@ struct GenerateLandscapeWindow : public QueryStringBaseWindow {
|
|||
case GLAND_SMOOTHNESS_PULLDOWN: _settings_newgame.game_creation.tgen_smoothness = index; break;
|
||||
|
||||
case GLAND_TOWN_PULLDOWN:
|
||||
_opt_newgame.diff.number_towns = index;
|
||||
if (_opt_newgame.diff_level != 3) ShowErrorMessage(INVALID_STRING_ID, STR_DIFFICULTY_TO_CUSTOM, 0, 0);
|
||||
DoCommandP(0, 2, _opt_newgame.diff.number_towns, NULL, CMD_CHANGE_DIFFICULTY_LEVEL);
|
||||
_settings_newgame.difficulty.number_towns = index;
|
||||
if (_settings_newgame.difficulty.diff_level != 3) ShowErrorMessage(INVALID_STRING_ID, STR_DIFFICULTY_TO_CUSTOM, 0, 0);
|
||||
DoCommandP(0, 2, _settings_newgame.difficulty.number_towns, NULL, CMD_CHANGE_DIFFICULTY_LEVEL);
|
||||
break;
|
||||
|
||||
case GLAND_INDUSTRY_PULLDOWN:
|
||||
_opt_newgame.diff.number_industries = index;
|
||||
if (_opt_newgame.diff_level != 3) ShowErrorMessage(INVALID_STRING_ID, STR_DIFFICULTY_TO_CUSTOM, 0, 0);
|
||||
DoCommandP(0, 3, _opt_newgame.diff.number_industries, NULL, CMD_CHANGE_DIFFICULTY_LEVEL);
|
||||
_settings_newgame.difficulty.number_industries = index;
|
||||
if (_settings_newgame.difficulty.diff_level != 3) ShowErrorMessage(INVALID_STRING_ID, STR_DIFFICULTY_TO_CUSTOM, 0, 0);
|
||||
DoCommandP(0, 3, _settings_newgame.difficulty.number_industries, NULL, CMD_CHANGE_DIFFICULTY_LEVEL);
|
||||
break;
|
||||
|
||||
case GLAND_LANDSCAPE_PULLDOWN:
|
||||
|
@ -512,15 +511,15 @@ struct GenerateLandscapeWindow : public QueryStringBaseWindow {
|
|||
break;
|
||||
|
||||
case GLAND_TERRAIN_PULLDOWN:
|
||||
_opt_newgame.diff.terrain_type = index;
|
||||
if (_opt_newgame.diff_level != 3) ShowErrorMessage(INVALID_STRING_ID, STR_DIFFICULTY_TO_CUSTOM, 0, 0);
|
||||
DoCommandP(0, 12, _opt_newgame.diff.terrain_type, NULL, CMD_CHANGE_DIFFICULTY_LEVEL);
|
||||
_settings_newgame.difficulty.terrain_type = index;
|
||||
if (_settings_newgame.difficulty.diff_level != 3) ShowErrorMessage(INVALID_STRING_ID, STR_DIFFICULTY_TO_CUSTOM, 0, 0);
|
||||
DoCommandP(0, 12, _settings_newgame.difficulty.terrain_type, NULL, CMD_CHANGE_DIFFICULTY_LEVEL);
|
||||
break;
|
||||
|
||||
case GLAND_WATER_PULLDOWN:
|
||||
_opt_newgame.diff.quantity_sea_lakes = index;
|
||||
if (_opt_newgame.diff_level != 3) ShowErrorMessage(INVALID_STRING_ID, STR_DIFFICULTY_TO_CUSTOM, 0, 0);
|
||||
DoCommandP(0, 13, _opt_newgame.diff.quantity_sea_lakes, NULL, CMD_CHANGE_DIFFICULTY_LEVEL);
|
||||
_settings_newgame.difficulty.quantity_sea_lakes = index;
|
||||
if (_settings_newgame.difficulty.diff_level != 3) ShowErrorMessage(INVALID_STRING_ID, STR_DIFFICULTY_TO_CUSTOM, 0, 0);
|
||||
DoCommandP(0, 13, _settings_newgame.difficulty.quantity_sea_lakes, NULL, CMD_CHANGE_DIFFICULTY_LEVEL);
|
||||
break;
|
||||
}
|
||||
this->SetDirty();
|
||||
|
@ -643,7 +642,7 @@ struct CreateScenarioWindow : public Window
|
|||
|
||||
CreateScenarioWindow(const WindowDesc *desc, WindowNumber window_number) : Window(desc, window_number)
|
||||
{
|
||||
this->LowerWidget(_opt_newgame.landscape + CSCEN_TEMPERATE);
|
||||
this->LowerWidget(_settings.game_creation.landscape + CSCEN_TEMPERATE);
|
||||
this->FindWindowPlacementAndResize(desc);
|
||||
}
|
||||
|
||||
|
@ -654,10 +653,10 @@ struct CreateScenarioWindow : public Window
|
|||
this->SetWidgetDisabledState(CSCEN_FLAT_LAND_HEIGHT_DOWN, _settings_newgame.game_creation.se_flat_world_height <= 0);
|
||||
this->SetWidgetDisabledState(CSCEN_FLAT_LAND_HEIGHT_UP, _settings_newgame.game_creation.se_flat_world_height >= MAX_TILE_HEIGHT);
|
||||
|
||||
this->SetWidgetLoweredState(CSCEN_TEMPERATE, _opt_newgame.landscape == LT_TEMPERATE);
|
||||
this->SetWidgetLoweredState(CSCEN_ARCTIC, _opt_newgame.landscape == LT_ARCTIC);
|
||||
this->SetWidgetLoweredState(CSCEN_TROPICAL, _opt_newgame.landscape == LT_TROPIC);
|
||||
this->SetWidgetLoweredState(CSCEN_TOYLAND, _opt_newgame.landscape == LT_TOYLAND);
|
||||
this->SetWidgetLoweredState(CSCEN_TEMPERATE, _settings.game_creation.landscape == LT_TEMPERATE);
|
||||
this->SetWidgetLoweredState(CSCEN_ARCTIC, _settings.game_creation.landscape == LT_ARCTIC);
|
||||
this->SetWidgetLoweredState(CSCEN_TROPICAL, _settings.game_creation.landscape == LT_TROPIC);
|
||||
this->SetWidgetLoweredState(CSCEN_TOYLAND, _settings.game_creation.landscape == LT_TOYLAND);
|
||||
|
||||
/* Set parameters for widget text that requires them */
|
||||
SetDParam(0, ConvertYMDToDate(_settings_newgame.game_creation.starting_year, 0, 1)); // CSCEN_START_DATE_TEXT
|
||||
|
@ -675,7 +674,7 @@ struct CreateScenarioWindow : public Window
|
|||
case CSCEN_ARCTIC:
|
||||
case CSCEN_TROPICAL:
|
||||
case CSCEN_TOYLAND:
|
||||
this->RaiseWidget(_opt_newgame.landscape + CSCEN_TEMPERATE);
|
||||
this->RaiseWidget(_settings.game_creation.landscape + CSCEN_TEMPERATE);
|
||||
SetNewLandscapeType(widget - CSCEN_TEMPERATE);
|
||||
break;
|
||||
|
||||
|
|
|
@ -807,7 +807,7 @@ void DoPaletteAnimations()
|
|||
memcpy(old_val, d, c * sizeof(*old_val));
|
||||
|
||||
/* Dark blue water */
|
||||
s = (_opt.landscape == LT_TOYLAND) ? ev->ac : ev->a;
|
||||
s = (_settings.game_creation.landscape == LT_TOYLAND) ? ev->ac : ev->a;
|
||||
j = EXTR(320, 5);
|
||||
for (i = 0; i != 5; i++) {
|
||||
*d++ = s[j];
|
||||
|
@ -816,7 +816,7 @@ void DoPaletteAnimations()
|
|||
}
|
||||
|
||||
/* Glittery water */
|
||||
s = (_opt.landscape == LT_TOYLAND) ? ev->bc : ev->b;
|
||||
s = (_settings.game_creation.landscape == LT_TOYLAND) ? ev->bc : ev->b;
|
||||
j = EXTR(128, 15);
|
||||
for (i = 0; i != 5; i++) {
|
||||
*d++ = s[j];
|
||||
|
@ -876,7 +876,7 @@ void DoPaletteAnimations()
|
|||
/* Animate water for old DOS graphics */
|
||||
if (_use_dos_palette) {
|
||||
/* Dark blue water DOS */
|
||||
s = (_opt.landscape == LT_TOYLAND) ? ev->ac : ev->a;
|
||||
s = (_settings.game_creation.landscape == LT_TOYLAND) ? ev->ac : ev->a;
|
||||
j = EXTR(320, 5);
|
||||
for (i = 0; i != 5; i++) {
|
||||
*d++ = s[j];
|
||||
|
@ -885,7 +885,7 @@ void DoPaletteAnimations()
|
|||
}
|
||||
|
||||
/* Glittery water DOS */
|
||||
s = (_opt.landscape == LT_TOYLAND) ? ev->bc : ev->b;
|
||||
s = (_settings.game_creation.landscape == LT_TOYLAND) ? ev->bc : ev->b;
|
||||
j = EXTR(128, 15);
|
||||
for (i = 0; i != 5; i++) {
|
||||
*d++ = s[j];
|
||||
|
|
|
@ -214,10 +214,10 @@ static void LoadSpriteTables()
|
|||
* This overwrites some of the temperate sprites, such as foundations
|
||||
* and the ground sprites.
|
||||
*/
|
||||
if (_opt.landscape != LT_TEMPERATE) {
|
||||
if (_settings.game_creation.landscape != LT_TEMPERATE) {
|
||||
LoadGrfIndexed(
|
||||
files->landscape[_opt.landscape - 1].filename,
|
||||
_landscape_spriteindexes[_opt.landscape - 1],
|
||||
files->landscape[_settings.game_creation.landscape - 1].filename,
|
||||
_landscape_spriteindexes[_settings.game_creation.landscape - 1],
|
||||
i++
|
||||
);
|
||||
}
|
||||
|
@ -248,7 +248,7 @@ static void LoadSpriteTables()
|
|||
|
||||
void GfxLoadSprites()
|
||||
{
|
||||
DEBUG(sprite, 2, "Loading sprite set %d", _opt.landscape);
|
||||
DEBUG(sprite, 2, "Loading sprite set %d", _settings.game_creation.landscape);
|
||||
|
||||
GfxInitSpriteMem();
|
||||
LoadSpriteTables();
|
||||
|
|
|
@ -70,7 +70,7 @@ void ResetIndustries()
|
|||
/* once performed, enable only the current climate industries */
|
||||
for (IndustryType i = 0; i < NUM_INDUSTRYTYPES; i++) {
|
||||
_industry_specs[i].enabled = i < NEW_INDUSTRYOFFSET &&
|
||||
HasBit(_origin_industry_specs[i].climate_availability, _opt.landscape);
|
||||
HasBit(_origin_industry_specs[i].climate_availability, _settings.game_creation.landscape);
|
||||
}
|
||||
|
||||
memset(&_industry_tile_specs, 0, sizeof(_industry_tile_specs));
|
||||
|
@ -84,7 +84,7 @@ void ResetIndustries()
|
|||
void ResetIndustryCreationProbility(IndustryType type)
|
||||
{
|
||||
assert(type < INVALID_INDUSTRYTYPE);
|
||||
_industry_specs[type].appear_creation[_opt.landscape] = 0;
|
||||
_industry_specs[type].appear_creation[_settings.game_creation.landscape] = 0;
|
||||
}
|
||||
|
||||
DEFINE_OLD_POOL_GENERIC(Industry, Industry)
|
||||
|
@ -888,14 +888,14 @@ static void PlantFarmField(TileIndex tile, IndustryID industry)
|
|||
uint field_type;
|
||||
int type;
|
||||
|
||||
if (_opt.landscape == LT_ARCTIC) {
|
||||
if (_settings.game_creation.landscape == LT_ARCTIC) {
|
||||
if (GetTileZ(tile) + TILE_HEIGHT * 2 >= GetSnowLine())
|
||||
return;
|
||||
}
|
||||
|
||||
/* determine field size */
|
||||
r = (Random() & 0x303) + 0x404;
|
||||
if (_opt.landscape == LT_ARCTIC) r += 0x404;
|
||||
if (_settings.game_creation.landscape == LT_ARCTIC) r += 0x404;
|
||||
size_x = GB(r, 0, 8);
|
||||
size_y = GB(r, 8, 8);
|
||||
|
||||
|
@ -926,7 +926,7 @@ static void PlantFarmField(TileIndex tile, IndustryID industry)
|
|||
END_TILE_LOOP(cur_tile, size_x, size_y, tile)
|
||||
|
||||
type = 3;
|
||||
if (_opt.landscape != LT_ARCTIC && _opt.landscape != LT_TROPIC) {
|
||||
if (_settings.game_creation.landscape != LT_ARCTIC && _settings.game_creation.landscape != LT_TROPIC) {
|
||||
type = _plantfarmfield_type[Random() & 0xF];
|
||||
}
|
||||
|
||||
|
@ -1063,7 +1063,7 @@ static bool CheckNewIndustry_NULL(TileIndex tile)
|
|||
|
||||
static bool CheckNewIndustry_Forest(TileIndex tile)
|
||||
{
|
||||
if (_opt.landscape == LT_ARCTIC) {
|
||||
if (_settings.game_creation.landscape == LT_ARCTIC) {
|
||||
if (GetTileZ(tile) < HighestSnowLine() + TILE_HEIGHT * 2U) {
|
||||
_error_message = STR_4831_FOREST_CAN_ONLY_BE_PLANTED;
|
||||
return false;
|
||||
|
@ -1095,7 +1095,7 @@ static bool CheckNewIndustry_OilRig(TileIndex tile)
|
|||
|
||||
static bool CheckNewIndustry_Farm(TileIndex tile)
|
||||
{
|
||||
if (_opt.landscape == LT_ARCTIC) {
|
||||
if (_settings.game_creation.landscape == LT_ARCTIC) {
|
||||
if (GetTileZ(tile) + TILE_HEIGHT * 2 >= HighestSnowLine()) {
|
||||
_error_message = STR_0239_SITE_UNSUITABLE;
|
||||
return false;
|
||||
|
@ -1700,13 +1700,13 @@ static void PlaceInitialIndustry(IndustryType type, int amount)
|
|||
{
|
||||
/* We need to bypass the amount given in parameter if it exceeds the maximum dimension of the
|
||||
* _numof_industry_table. newgrf can specify a big amount */
|
||||
int num = (amount > NB_NUMOFINDUSTRY) ? amount : _numof_industry_table[_opt.diff.number_industries][amount];
|
||||
int num = (amount > NB_NUMOFINDUSTRY) ? amount : _numof_industry_table[_settings.difficulty.number_industries][amount];
|
||||
const IndustrySpec *ind_spc = GetIndustrySpec(type);
|
||||
|
||||
/* These are always placed next to the coastline, so we scale by the perimeter instead. */
|
||||
num = (ind_spc->check_proc == CHECK_REFINERY || ind_spc->check_proc == CHECK_OIL_RIG) ? ScaleByMapSize1D(num) : ScaleByMapSize(num);
|
||||
|
||||
if (_opt.diff.number_industries != 0) {
|
||||
if (_settings.difficulty.number_industries != 0) {
|
||||
PlayerID old_player = _current_player;
|
||||
_current_player = OWNER_NONE;
|
||||
assert(num > 0);
|
||||
|
@ -1735,7 +1735,7 @@ void GenerateIndustries()
|
|||
const IndustrySpec *ind_spc;
|
||||
|
||||
/* Find the total amount of industries */
|
||||
if (_opt.diff.number_industries > 0) {
|
||||
if (_settings.difficulty.number_industries > 0) {
|
||||
for (it = 0; it < NUM_INDUSTRYTYPES; it++) {
|
||||
|
||||
ind_spc = GetIndustrySpec(it);
|
||||
|
@ -1744,12 +1744,12 @@ void GenerateIndustries()
|
|||
ResetIndustryCreationProbility(it);
|
||||
}
|
||||
|
||||
chance = ind_spc->appear_creation[_opt.landscape];
|
||||
chance = ind_spc->appear_creation[_settings.game_creation.landscape];
|
||||
if (ind_spc->enabled && chance > 0) {
|
||||
/* once the chance of appearance is determind, it have to be scaled by
|
||||
* the difficulty level. The "chance" in question is more an index into
|
||||
* the _numof_industry_table,in fact */
|
||||
int num = (chance > NB_NUMOFINDUSTRY) ? chance : _numof_industry_table[_opt.diff.number_industries][chance];
|
||||
int num = (chance > NB_NUMOFINDUSTRY) ? chance : _numof_industry_table[_settings.difficulty.number_industries][chance];
|
||||
|
||||
/* These are always placed next to the coastline, so we scale by the perimeter instead. */
|
||||
num = (ind_spc->check_proc == CHECK_REFINERY || ind_spc->check_proc == CHECK_OIL_RIG) ? ScaleByMapSize1D(num) : ScaleByMapSize(num);
|
||||
|
@ -1760,7 +1760,7 @@ void GenerateIndustries()
|
|||
|
||||
SetGeneratingWorldProgress(GWP_INDUSTRY, i);
|
||||
|
||||
if (_opt.diff.number_industries > 0) {
|
||||
if (_settings.difficulty.number_industries > 0) {
|
||||
for (it = 0; it < NUM_INDUSTRYTYPES; it++) {
|
||||
/* Once the number of industries has been determined, let's really create them.
|
||||
* The test for chance allows us to try create industries that are available only
|
||||
|
@ -1769,7 +1769,7 @@ void GenerateIndustries()
|
|||
* processed that scaling above? No, don't think so. Will find a way. */
|
||||
ind_spc = GetIndustrySpec(it);
|
||||
if (ind_spc->enabled) {
|
||||
chance = ind_spc->appear_creation[_opt.landscape];
|
||||
chance = ind_spc->appear_creation[_settings.game_creation.landscape];
|
||||
if (chance > 0) PlaceInitialIndustry(it, chance);
|
||||
}
|
||||
}
|
||||
|
@ -1823,7 +1823,7 @@ static void MaybeNewIndustry(void)
|
|||
/* Generate a list of all possible industries that can be built. */
|
||||
for (j = 0; j < NUM_INDUSTRYTYPES; j++) {
|
||||
ind_spc = GetIndustrySpec(j);
|
||||
byte chance = ind_spc->appear_ingame[_opt.landscape];
|
||||
byte chance = ind_spc->appear_ingame[_settings.game_creation.landscape];
|
||||
|
||||
if (!ind_spc->enabled || chance == 0) continue;
|
||||
|
||||
|
@ -1881,7 +1881,7 @@ static bool CheckIndustryCloseDownProtection(IndustryType type)
|
|||
const IndustrySpec *indspec = GetIndustrySpec(type);
|
||||
|
||||
/* oil wells (or the industries with that flag set) are always allowed to closedown */
|
||||
if (indspec->behaviour & INDUSTRYBEH_DONT_INCR_PROD && _opt.landscape == LT_TEMPERATE) return false;
|
||||
if (indspec->behaviour & INDUSTRYBEH_DONT_INCR_PROD && _settings.game_creation.landscape == LT_TEMPERATE) return false;
|
||||
return (indspec->behaviour & INDUSTRYBEH_CANCLOSE_LASTINSTANCE) == 0 && GetIndustryTypeCount(type) <= 1;
|
||||
}
|
||||
|
||||
|
@ -2072,7 +2072,7 @@ static void ChangeIndustryProduction(Industry *i, bool monthly)
|
|||
|
||||
if (standard && (indspec->life_type & (INDUSTRYLIFE_ORGANIC | INDUSTRYLIFE_EXTRACTIVE)) != 0) {
|
||||
/* decrease or increase */
|
||||
bool only_decrease = (indspec->behaviour & INDUSTRYBEH_DONT_INCR_PROD) && _opt.landscape == LT_TEMPERATE;
|
||||
bool only_decrease = (indspec->behaviour & INDUSTRYBEH_DONT_INCR_PROD) && _settings.game_creation.landscape == LT_TEMPERATE;
|
||||
|
||||
if (smooth_economy) {
|
||||
closeit = true;
|
||||
|
|
|
@ -195,7 +195,7 @@ public:
|
|||
* In Editor, you just build, while ingame, or you fund or you prospect */
|
||||
if (_game_mode == GM_EDITOR) {
|
||||
/* We've chosen many random industries but no industries have been specified */
|
||||
if (indsp == NULL) this->enabled[this->selected_index] = _opt.diff.number_industries != 0;
|
||||
if (indsp == NULL) this->enabled[this->selected_index] = _settings.difficulty.number_industries != 0;
|
||||
this->widget[DPIW_FUND_WIDGET].data = STR_BUILD_NEW_INDUSTRY;
|
||||
} else {
|
||||
this->widget[DPIW_FUND_WIDGET].data = (_settings.construction.raw_industry_construction == 2 && indsp->IsRawIndustry()) ? STR_PROSPECT_NEW_INDUSTRY : STR_FUND_NEW_INDUSTRY;
|
||||
|
|
|
@ -49,7 +49,7 @@ static const Widget _select_game_widgets[] = {
|
|||
|
||||
static inline void SetNewLandscapeType(byte landscape)
|
||||
{
|
||||
_opt_newgame.landscape = landscape;
|
||||
_settings_newgame.game_creation.landscape = landscape;
|
||||
InvalidateWindowClasses(WC_SELECT_GAME);
|
||||
}
|
||||
|
||||
|
@ -76,17 +76,17 @@ private:
|
|||
public:
|
||||
SelectGameWindow(const WindowDesc *desc) : Window(desc)
|
||||
{
|
||||
this->LowerWidget(_opt_newgame.landscape + SGI_TEMPERATE_LANDSCAPE);
|
||||
this->LowerWidget(_settings_newgame.game_creation.landscape + SGI_TEMPERATE_LANDSCAPE);
|
||||
this->FindWindowPlacementAndResize(desc);
|
||||
}
|
||||
|
||||
virtual void OnPaint()
|
||||
{
|
||||
this->SetWidgetLoweredState(SGI_TEMPERATE_LANDSCAPE, _opt_newgame.landscape == LT_TEMPERATE);
|
||||
this->SetWidgetLoweredState(SGI_ARCTIC_LANDSCAPE, _opt_newgame.landscape == LT_ARCTIC);
|
||||
this->SetWidgetLoweredState(SGI_TROPIC_LANDSCAPE, _opt_newgame.landscape == LT_TROPIC);
|
||||
this->SetWidgetLoweredState(SGI_TOYLAND_LANDSCAPE, _opt_newgame.landscape == LT_TOYLAND);
|
||||
SetDParam(0, STR_6801_EASY + _opt_newgame.diff_level);
|
||||
this->SetWidgetLoweredState(SGI_TEMPERATE_LANDSCAPE, _settings_newgame.game_creation.landscape == LT_TEMPERATE);
|
||||
this->SetWidgetLoweredState(SGI_ARCTIC_LANDSCAPE, _settings_newgame.game_creation.landscape == LT_ARCTIC);
|
||||
this->SetWidgetLoweredState(SGI_TROPIC_LANDSCAPE, _settings_newgame.game_creation.landscape == LT_TROPIC);
|
||||
this->SetWidgetLoweredState(SGI_TOYLAND_LANDSCAPE, _settings_newgame.game_creation.landscape == LT_TOYLAND);
|
||||
SetDParam(0, STR_6801_EASY + _settings_newgame.difficulty.diff_level);
|
||||
this->DrawWidgets();
|
||||
}
|
||||
|
||||
|
@ -115,7 +115,7 @@ public:
|
|||
|
||||
case SGI_TEMPERATE_LANDSCAPE: case SGI_ARCTIC_LANDSCAPE:
|
||||
case SGI_TROPIC_LANDSCAPE: case SGI_TOYLAND_LANDSCAPE:
|
||||
this->RaiseWidget(_opt_newgame.landscape + SGI_TEMPERATE_LANDSCAPE);
|
||||
this->RaiseWidget(_settings_newgame.game_creation.landscape + SGI_TEMPERATE_LANDSCAPE);
|
||||
SetNewLandscapeType(widget - SGI_TEMPERATE_LANDSCAPE);
|
||||
break;
|
||||
|
||||
|
|
|
@ -526,7 +526,7 @@ void SetSnowLine(byte table[SNOW_LINE_MONTHS][SNOW_LINE_DAYS])
|
|||
*/
|
||||
byte GetSnowLine(void)
|
||||
{
|
||||
if (_snow_line == NULL) return _opt.snow_line;
|
||||
if (_snow_line == NULL) return _settings.game_creation.snow_line;
|
||||
|
||||
YearMonthDay ymd;
|
||||
ConvertDateToYMD(_date, &ymd);
|
||||
|
@ -539,7 +539,7 @@ byte GetSnowLine(void)
|
|||
*/
|
||||
byte HighestSnowLine(void)
|
||||
{
|
||||
return _snow_line == NULL ? _opt.snow_line : _snow_line->highest_value;
|
||||
return _snow_line == NULL ? _settings.game_creation.snow_line : _snow_line->highest_value;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -818,14 +818,14 @@ void GenerateLandscape(byte mode)
|
|||
static const int gwp_desert_amount = 4 + 8;
|
||||
|
||||
if (mode == GW_HEIGHTMAP) {
|
||||
SetGeneratingWorldProgress(GWP_LANDSCAPE, (_opt.landscape == LT_TROPIC) ? 1 + gwp_desert_amount : 1);
|
||||
SetGeneratingWorldProgress(GWP_LANDSCAPE, (_settings.game_creation.landscape == LT_TROPIC) ? 1 + gwp_desert_amount : 1);
|
||||
LoadHeightmap(_file_to_saveload.name);
|
||||
IncreaseGeneratingWorldProgress(GWP_LANDSCAPE);
|
||||
} else if (_settings.game_creation.land_generator == LG_TERRAGENESIS) {
|
||||
SetGeneratingWorldProgress(GWP_LANDSCAPE, (_opt.landscape == LT_TROPIC) ? 3 + gwp_desert_amount : 3);
|
||||
SetGeneratingWorldProgress(GWP_LANDSCAPE, (_settings.game_creation.landscape == LT_TROPIC) ? 3 + gwp_desert_amount : 3);
|
||||
GenerateTerrainPerlin();
|
||||
} else {
|
||||
switch (_opt.landscape) {
|
||||
switch (_settings.game_creation.landscape) {
|
||||
case LT_ARCTIC: {
|
||||
SetGeneratingWorldProgress(GWP_LANDSCAPE, 2);
|
||||
|
||||
|
@ -872,9 +872,9 @@ void GenerateLandscape(byte mode)
|
|||
|
||||
uint32 r = Random();
|
||||
|
||||
uint i = ScaleByMapSize(GB(r, 0, 7) + (3 - _opt.diff.quantity_sea_lakes) * 256 + 100);
|
||||
uint i = ScaleByMapSize(GB(r, 0, 7) + (3 - _settings.difficulty.quantity_sea_lakes) * 256 + 100);
|
||||
for (; i != 0; --i) {
|
||||
GenerateTerrain(_opt.diff.terrain_type, 0);
|
||||
GenerateTerrain(_settings.difficulty.terrain_type, 0);
|
||||
}
|
||||
IncreaseGeneratingWorldProgress(GWP_LANDSCAPE);
|
||||
} break;
|
||||
|
@ -883,7 +883,7 @@ void GenerateLandscape(byte mode)
|
|||
|
||||
ConvertGroundTilesIntoWaterTiles();
|
||||
|
||||
if (_opt.landscape == LT_TROPIC) CreateDesertOrRainForest();
|
||||
if (_settings.game_creation.landscape == LT_TROPIC) CreateDesertOrRainForest();
|
||||
}
|
||||
|
||||
void OnTick_Town();
|
||||
|
|
|
@ -395,11 +395,11 @@ CommandCost CmdChangeDifficultyLevel(TileIndex tile, uint32 flags, uint32 p1, ui
|
|||
{
|
||||
if (p1 != (uint32)-1L && ((int32)p1 >= GAME_DIFFICULTY_NUM || (int32)p1 < 0)) return CMD_ERROR;
|
||||
|
||||
GameOptions *opt_ptr = (_game_mode == GM_MENU) ? &_opt_newgame : &_opt;
|
||||
DifficultySettings *opt_ptr = (_game_mode == GM_MENU) ? &_settings_newgame.difficulty : &_settings.difficulty;
|
||||
|
||||
if (flags & DC_EXEC) {
|
||||
if (p1 != (uint32)-1L) {
|
||||
((GDType*)&opt_ptr->diff)[p1] = p2;
|
||||
((GDType*)opt_ptr)[p1] = p2;
|
||||
opt_ptr->diff_level = 3; // custom difficulty level
|
||||
} else {
|
||||
opt_ptr->diff_level = p2;
|
||||
|
|
|
@ -1012,7 +1012,7 @@ static void NetworkInitGameInfo()
|
|||
_network_game_info.start_date = ConvertYMDToDate(_settings.game_creation.starting_year, 0, 1);
|
||||
_network_game_info.map_width = MapSizeX();
|
||||
_network_game_info.map_height = MapSizeY();
|
||||
_network_game_info.map_set = _opt.landscape;
|
||||
_network_game_info.map_set = _settings.game_creation.landscape;
|
||||
|
||||
_network_game_info.use_password = (_network_server_password[0] != '\0');
|
||||
|
||||
|
|
|
@ -77,7 +77,7 @@ DEF_UDP_RECEIVE_COMMAND(Server, PACKET_UDP_CLIENT_FIND_SERVER)
|
|||
_network_game_info.game_date = _date;
|
||||
_network_game_info.map_width = MapSizeX();
|
||||
_network_game_info.map_height = MapSizeY();
|
||||
_network_game_info.map_set = _opt.landscape;
|
||||
_network_game_info.map_set = _settings.game_creation.landscape;
|
||||
_network_game_info.companies_on = ActivePlayerCount();
|
||||
_network_game_info.spectators_on = NetworkSpectatorCount();
|
||||
_network_game_info.grfconfig = _grfconfig;
|
||||
|
|
|
@ -1437,8 +1437,8 @@ static bool TownHouseChangeInfo(uint hid, int numinfo, int prop, byte **bufp, in
|
|||
|
||||
/* If value of goods is negative, it means in fact food or, if in toyland, fizzy_drink acceptance.
|
||||
* Else, we have "standard" 3rd cargo type, goods or candy, for toyland once more */
|
||||
CargoID cid = (goods >= 0) ? ((_opt.landscape == LT_TOYLAND) ? CT_CANDY : CT_GOODS) :
|
||||
((_opt.landscape == LT_TOYLAND) ? CT_FIZZY_DRINKS : CT_FOOD);
|
||||
CargoID cid = (goods >= 0) ? ((_settings.game_creation.landscape == LT_TOYLAND) ? CT_CANDY : CT_GOODS) :
|
||||
((_settings.game_creation.landscape == LT_TOYLAND) ? CT_FIZZY_DRINKS : CT_FOOD);
|
||||
|
||||
/* Make sure the cargo type is valid in this climate. */
|
||||
if (!GetCargo(cid)->IsValid()) goods = 0;
|
||||
|
@ -2167,11 +2167,11 @@ static bool IndustriesChangeInfo(uint indid, int numinfo, int prop, byte **bufp,
|
|||
break;
|
||||
|
||||
case 0x17: // Probability in random game
|
||||
indsp->appear_creation[_opt.landscape] = grf_load_byte(&buf);
|
||||
indsp->appear_creation[_settings.game_creation.landscape] = grf_load_byte(&buf);
|
||||
break;
|
||||
|
||||
case 0x18: // Probability during gameplay
|
||||
indsp->appear_ingame[_opt.landscape] = grf_load_byte(&buf);
|
||||
indsp->appear_ingame[_settings.game_creation.landscape] = grf_load_byte(&buf);
|
||||
break;
|
||||
|
||||
case 0x19: // Map color
|
||||
|
@ -3557,11 +3557,11 @@ bool GetGlobalVariable(byte param, uint32 *value)
|
|||
return true;
|
||||
|
||||
case 0x03: // current climate, 0=temp, 1=arctic, 2=trop, 3=toyland
|
||||
*value = _opt.landscape;
|
||||
*value = _settings.game_creation.landscape;
|
||||
return true;
|
||||
|
||||
case 0x06: // road traffic side, bit 4 clear=left, set=right
|
||||
*value = _opt.road_side << 4;
|
||||
*value = _settings.vehicle.road_side << 4;
|
||||
return true;
|
||||
|
||||
case 0x09: // date fraction
|
||||
|
@ -3635,7 +3635,7 @@ bool GetGlobalVariable(byte param, uint32 *value)
|
|||
/* case 0x1F: // locale dependent settings not implemented */
|
||||
|
||||
case 0x20: // snow line height
|
||||
*value = _opt.landscape == LT_ARCTIC ? GetSnowLine() : 0xFF;
|
||||
*value = _settings.game_creation.landscape == LT_ARCTIC ? GetSnowLine() : 0xFF;
|
||||
return true;
|
||||
|
||||
case 0x21: // OpenTTD version
|
||||
|
@ -3643,7 +3643,7 @@ bool GetGlobalVariable(byte param, uint32 *value)
|
|||
return true;
|
||||
|
||||
case 0x22: // difficulty level
|
||||
*value = _opt.diff_level;
|
||||
*value = _settings.difficulty.diff_level;
|
||||
return true;
|
||||
|
||||
default: return false;
|
||||
|
@ -5352,7 +5352,7 @@ static void ResetNewGRFData()
|
|||
ResetNewGRFErrors();
|
||||
|
||||
/* Set up the default cargo types */
|
||||
SetupCargoForClimate(_opt.landscape);
|
||||
SetupCargoForClimate(_settings.game_creation.landscape);
|
||||
|
||||
/* Reset misc GRF features and train list display variables */
|
||||
_misc_grf_features = 0;
|
||||
|
|
|
@ -278,7 +278,7 @@ void IndustryTileOverrideManager::SetEntitySpec(const IndustryTileSpec *its)
|
|||
* Terrain type: 0 normal, 1 desert, 2 rainforest, 4 on or above snowline */
|
||||
uint32 GetTerrainType(TileIndex tile)
|
||||
{
|
||||
switch (_opt.landscape) {
|
||||
switch (_settings.game_creation.landscape) {
|
||||
case LT_TROPIC: return GetTropicZone(tile);
|
||||
case LT_ARCTIC: return GetTileZ(tile) > GetSnowLine() ? 4 : 0;
|
||||
default: return 0;
|
||||
|
|
|
@ -319,8 +319,8 @@ static void FixOldTowns()
|
|||
/* Convert town-names if needed */
|
||||
FOR_ALL_TOWNS(town) {
|
||||
if (IsInsideMM(town->townnametype, 0x20C1, 0x20C3)) {
|
||||
town->townnametype = SPECSTR_TOWNNAME_ENGLISH + _opt.town_name;
|
||||
town->townnameparts = GetOldTownName(town->townnameparts, _opt.town_name);
|
||||
town->townnametype = SPECSTR_TOWNNAME_ENGLISH + _settings.game_creation.town_name;
|
||||
town->townnameparts = GetOldTownName(town->townnameparts, _settings.game_creation.town_name);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1370,29 +1370,29 @@ static inline bool LoadOldSubsidy(LoadgameState *ls, int num)
|
|||
}
|
||||
|
||||
static const OldChunks game_difficulty_chunk[] = {
|
||||
OCL_SVAR( OC_UINT16, GameDifficulty, max_no_competitors ),
|
||||
OCL_SVAR( OC_UINT16, GameDifficulty, competitor_start_time ),
|
||||
OCL_SVAR( OC_UINT16, GameDifficulty, number_towns ),
|
||||
OCL_SVAR( OC_UINT16, GameDifficulty, number_industries ),
|
||||
OCL_SVAR( OC_UINT16, GameDifficulty, max_loan ),
|
||||
OCL_SVAR( OC_UINT16, GameDifficulty, initial_interest ),
|
||||
OCL_SVAR( OC_UINT16, GameDifficulty, vehicle_costs ),
|
||||
OCL_SVAR( OC_UINT16, GameDifficulty, competitor_speed ),
|
||||
OCL_SVAR( OC_UINT16, GameDifficulty, competitor_intelligence ),
|
||||
OCL_SVAR( OC_UINT16, GameDifficulty, vehicle_breakdowns ),
|
||||
OCL_SVAR( OC_UINT16, GameDifficulty, subsidy_multiplier ),
|
||||
OCL_SVAR( OC_UINT16, GameDifficulty, construction_cost ),
|
||||
OCL_SVAR( OC_UINT16, GameDifficulty, terrain_type ),
|
||||
OCL_SVAR( OC_UINT16, GameDifficulty, quantity_sea_lakes ),
|
||||
OCL_SVAR( OC_UINT16, GameDifficulty, economy ),
|
||||
OCL_SVAR( OC_UINT16, GameDifficulty, line_reverse_mode ),
|
||||
OCL_SVAR( OC_UINT16, GameDifficulty, disasters ),
|
||||
OCL_SVAR( OC_FILE_U16 | OC_VAR_U8, DifficultySettings, max_no_competitors ),
|
||||
OCL_SVAR( OC_FILE_U16 | OC_VAR_U8, DifficultySettings, competitor_start_time ),
|
||||
OCL_SVAR( OC_FILE_U16 | OC_VAR_U8, DifficultySettings, number_towns ),
|
||||
OCL_SVAR( OC_FILE_U16 | OC_VAR_U8, DifficultySettings, number_industries ),
|
||||
OCL_SVAR( OC_FILE_U16 | OC_VAR_U16, DifficultySettings, max_loan ),
|
||||
OCL_SVAR( OC_FILE_U16 | OC_VAR_U8, DifficultySettings, initial_interest ),
|
||||
OCL_SVAR( OC_FILE_U16 | OC_VAR_U8, DifficultySettings, vehicle_costs ),
|
||||
OCL_SVAR( OC_FILE_U16 | OC_VAR_U8, DifficultySettings, competitor_speed ),
|
||||
OCL_SVAR( OC_FILE_U16 | OC_VAR_U8, DifficultySettings, competitor_intelligence ),
|
||||
OCL_SVAR( OC_FILE_U16 | OC_VAR_U8, DifficultySettings, vehicle_breakdowns ),
|
||||
OCL_SVAR( OC_FILE_U16 | OC_VAR_U8, DifficultySettings, subsidy_multiplier ),
|
||||
OCL_SVAR( OC_FILE_U16 | OC_VAR_U8, DifficultySettings, construction_cost ),
|
||||
OCL_SVAR( OC_FILE_U16 | OC_VAR_U8, DifficultySettings, terrain_type ),
|
||||
OCL_SVAR( OC_FILE_U16 | OC_VAR_U8, DifficultySettings, quantity_sea_lakes ),
|
||||
OCL_SVAR( OC_FILE_U16 | OC_VAR_U8, DifficultySettings, economy ),
|
||||
OCL_SVAR( OC_FILE_U16 | OC_VAR_U8, DifficultySettings, line_reverse_mode ),
|
||||
OCL_SVAR( OC_FILE_U16 | OC_VAR_U8, DifficultySettings, disasters ),
|
||||
OCL_END()
|
||||
};
|
||||
|
||||
static inline bool LoadOldGameDifficulty(LoadgameState *ls, int num)
|
||||
{
|
||||
return LoadChunk(ls, &_opt.diff, game_difficulty_chunk);
|
||||
return LoadChunk(ls, &_settings.difficulty, game_difficulty_chunk);
|
||||
}
|
||||
|
||||
|
||||
|
@ -1570,8 +1570,8 @@ static const OldChunks main_chunk[] = {
|
|||
|
||||
OCL_VAR ( OC_FILE_U8 | OC_VAR_U16, 1, &_station_tick_ctr ),
|
||||
|
||||
OCL_VAR ( OC_UINT8, 1, &_opt.currency ),
|
||||
OCL_VAR ( OC_UINT8, 1, &_opt.units ),
|
||||
OCL_VAR ( OC_UINT8, 1, &_settings.gui.currency ),
|
||||
OCL_VAR ( OC_UINT8, 1, &_settings.gui.units ),
|
||||
OCL_VAR ( OC_FILE_U8 | OC_VAR_U32, 1, &_cur_player_tick_index ),
|
||||
|
||||
OCL_NULL( 2 ), ///< Date stuff, calculated automatically
|
||||
|
@ -1581,19 +1581,19 @@ static const OldChunks main_chunk[] = {
|
|||
OCL_VAR ( OC_UINT8, 1, &_economy.infl_amount_pr ),
|
||||
OCL_VAR ( OC_UINT8, 1, &_economy.interest_rate ),
|
||||
OCL_NULL( 1 ), // available airports
|
||||
OCL_VAR ( OC_UINT8, 1, &_opt.road_side ),
|
||||
OCL_VAR ( OC_UINT8, 1, &_opt.town_name ),
|
||||
OCL_VAR ( OC_UINT8, 1, &_settings.vehicle.road_side ),
|
||||
OCL_VAR ( OC_UINT8, 1, &_settings.game_creation.town_name ),
|
||||
|
||||
OCL_CHUNK( 1, LoadOldGameDifficulty ),
|
||||
|
||||
OCL_ASSERT( 0x77130 ),
|
||||
|
||||
OCL_VAR ( OC_UINT8, 1, &_opt.diff_level ),
|
||||
OCL_VAR ( OC_UINT8, 1, &_opt.landscape ),
|
||||
OCL_VAR ( OC_UINT8, 1, &_settings.difficulty.diff_level ),
|
||||
OCL_VAR ( OC_UINT8, 1, &_settings.game_creation.landscape ),
|
||||
OCL_VAR ( OC_UINT8, 1, &_trees_tick_ctr ),
|
||||
|
||||
OCL_NULL( 1 ), ///< Custom vehicle types yes/no, no longer used
|
||||
OCL_VAR ( OC_UINT8, 1, &_opt.snow_line ),
|
||||
OCL_VAR ( OC_UINT8, 1, &_settings.game_creation.snow_line ),
|
||||
|
||||
OCL_NULL( 32 ), ///< new_industry_randtable, no longer used (because of new design)
|
||||
OCL_NULL( 36 ), ///< cargo-stuff, calculated in InitializeLandscapeVariables
|
||||
|
@ -1628,7 +1628,7 @@ static bool LoadOldMain(LoadgameState *ls)
|
|||
DEBUG(oldloader, 3, "Done, converting game data...");
|
||||
|
||||
/* Fix some general stuff */
|
||||
_opt.landscape = _opt.landscape & 0xF;
|
||||
_settings.game_creation.landscape = _settings.game_creation.landscape & 0xF;
|
||||
|
||||
/* Remap some pointers */
|
||||
_cur_town_ctr = REMAP_TOWN_IDX(_old_cur_town_ctr);
|
||||
|
@ -1690,7 +1690,7 @@ static bool LoadOldMain(LoadgameState *ls)
|
|||
FixOldVehicles();
|
||||
|
||||
/* We have a new difficulty setting */
|
||||
_opt.diff.town_council_tolerance = Clamp(_opt.diff_level, 0, 2);
|
||||
_settings.difficulty.town_council_tolerance = Clamp(_settings.difficulty.diff_level, 0, 2);
|
||||
|
||||
DEBUG(oldloader, 3, "Finished converting game data");
|
||||
DEBUG(oldloader, 1, "TTD(Patch) savegame successfully converted");
|
||||
|
|
|
@ -99,7 +99,7 @@ void ResetOldNames();
|
|||
void ProcessAsyncSaveFinish();
|
||||
void CallWindowTickEvent();
|
||||
|
||||
extern void SetDifficultyLevel(int mode, GameOptions *gm_opt);
|
||||
extern void SetDifficultyLevel(int mode, DifficultySettings *gm_opt);
|
||||
extern Player* DoStartupNewPlayer(bool is_ai);
|
||||
extern void ShowOSErrorBox(const char *buf);
|
||||
extern void InitializeRailGUI();
|
||||
|
@ -586,11 +586,10 @@ int ttd_main(int argc, char *argv[])
|
|||
ResetGRFConfig(false);
|
||||
|
||||
/* XXX - ugly hack, if diff_level is 9, it means we got no setting from the config file */
|
||||
if (_opt_newgame.diff_level == 9) SetDifficultyLevel(0, &_opt_newgame);
|
||||
if (_settings_newgame.difficulty.diff_level == 9) SetDifficultyLevel(0, &_settings_newgame.difficulty);
|
||||
|
||||
/* Make sure _patches is filled with _patches_newgame if we switch to a game directly */
|
||||
if (_switch_mode != SM_NONE) {
|
||||
_opt = _opt_newgame;
|
||||
UpdatePatches();
|
||||
}
|
||||
|
||||
|
@ -767,8 +766,7 @@ static void StartScenario()
|
|||
ShowErrorMessage(INVALID_STRING_ID, STR_012D, 0, 0);
|
||||
}
|
||||
|
||||
_opt.diff = _opt_newgame.diff;
|
||||
_opt.diff_level = _opt_newgame.diff_level;
|
||||
_settings.difficulty = _settings_newgame.difficulty;
|
||||
|
||||
/* Inititalize data */
|
||||
StartupEconomy();
|
||||
|
@ -838,7 +836,6 @@ void SwitchMode(int new_mode)
|
|||
if (_network_reload_cfg) {
|
||||
LoadFromConfig();
|
||||
_settings = _settings_newgame;
|
||||
_opt = _opt_newgame;
|
||||
ResetGRFConfig(false);
|
||||
}
|
||||
NetworkServerStart();
|
||||
|
@ -1259,7 +1256,7 @@ static const byte convert_currency[] = {
|
|||
/* since savegame version 4.2 the currencies are arranged differently */
|
||||
static void UpdateCurrencies()
|
||||
{
|
||||
_opt.currency = convert_currency[_opt.currency];
|
||||
_settings.gui.currency = convert_currency[_settings.gui.currency];
|
||||
}
|
||||
|
||||
/* Up to revision 1413 the invisible tiles at the southern border have not been
|
||||
|
@ -1394,7 +1391,7 @@ bool AfterLoadGame()
|
|||
Town *t;
|
||||
FOR_ALL_TOWNS(t) {
|
||||
t->name = CopyFromOldName(t->townnametype);
|
||||
if (t->name != NULL) t->townnametype = SPECSTR_TOWNNAME_START + _opt.town_name;
|
||||
if (t->name != NULL) t->townnametype = SPECSTR_TOWNNAME_START + _settings.game_creation.town_name;
|
||||
}
|
||||
|
||||
Waypoint *wp;
|
||||
|
@ -1408,7 +1405,7 @@ bool AfterLoadGame()
|
|||
ResetOldNames();
|
||||
|
||||
/* convert road side to my format. */
|
||||
if (_opt.road_side) _opt.road_side = 1;
|
||||
if (_settings.vehicle.road_side) _settings.vehicle.road_side = 1;
|
||||
|
||||
/* Check if all NewGRFs are present, we are very strict in MP mode */
|
||||
GRFListCompatibility gcf_res = IsGoodGRFConfigList();
|
||||
|
@ -2226,12 +2223,12 @@ bool AfterLoadGame()
|
|||
if (CheckSavegameVersion(58)) {
|
||||
/* patch difficulty number_industries other then zero get bumped to +1
|
||||
* since a new option (very low at position1) has been added */
|
||||
if (_opt.diff.number_industries > 0) {
|
||||
_opt.diff.number_industries++;
|
||||
if (_settings.difficulty.number_industries > 0) {
|
||||
_settings.difficulty.number_industries++;
|
||||
}
|
||||
|
||||
/* Same goes for number of towns, although no test is needed, just an increment */
|
||||
_opt.diff.number_towns++;
|
||||
_settings.difficulty.number_towns++;
|
||||
}
|
||||
|
||||
if (CheckSavegameVersion(64)) {
|
||||
|
|
|
@ -1477,7 +1477,7 @@ struct EndGameWindow : EndGameHighScoreBaseWindow {
|
|||
} else {
|
||||
/* in single player _local player is always valid */
|
||||
const Player *p = GetPlayer(_local_player);
|
||||
this->window_number = _opt.diff_level;
|
||||
this->window_number = _settings.difficulty.diff_level;
|
||||
this->rank = SaveHighScoreValue(p);
|
||||
}
|
||||
|
||||
|
|
|
@ -563,7 +563,7 @@ Player *DoStartupNewPlayer(bool is_ai)
|
|||
void StartupPlayers()
|
||||
{
|
||||
/* The AI starts like in the setting with +2 month max */
|
||||
_next_competitor_start = _opt.diff.competitor_start_time * 90 * DAY_TICKS + RandomRange(60 * DAY_TICKS) + 1;
|
||||
_next_competitor_start = _settings.difficulty.competitor_start_time * 90 * DAY_TICKS + RandomRange(60 * DAY_TICKS) + 1;
|
||||
}
|
||||
|
||||
static void MaybeStartNewPlayer()
|
||||
|
@ -578,10 +578,10 @@ static void MaybeStartNewPlayer()
|
|||
}
|
||||
|
||||
/* when there's a lot of computers in game, the probability that a new one starts is lower */
|
||||
if (n < (uint)_opt.diff.max_no_competitors &&
|
||||
if (n < (uint)_settings.difficulty.max_no_competitors &&
|
||||
n < (_network_server ?
|
||||
InteractiveRandomRange(_opt.diff.max_no_competitors + 2) :
|
||||
RandomRange(_opt.diff.max_no_competitors + 2)
|
||||
InteractiveRandomRange(_settings.difficulty.max_no_competitors + 2) :
|
||||
RandomRange(_settings.difficulty.max_no_competitors + 2)
|
||||
)) {
|
||||
/* Send a command to all clients to start up a new AI.
|
||||
* Works fine for Multiplayer and Singleplayer */
|
||||
|
@ -589,7 +589,7 @@ static void MaybeStartNewPlayer()
|
|||
}
|
||||
|
||||
/* The next AI starts like the difficulty setting said, with +2 month max */
|
||||
_next_competitor_start = _opt.diff.competitor_start_time * 90 * DAY_TICKS + 1;
|
||||
_next_competitor_start = _settings.difficulty.competitor_start_time * 90 * DAY_TICKS + 1;
|
||||
_next_competitor_start += _network_server ? InteractiveRandomRange(60 * DAY_TICKS) : RandomRange(60 * DAY_TICKS);
|
||||
}
|
||||
|
||||
|
@ -994,7 +994,7 @@ StringID EndGameGetPerformanceTitleFromValue(uint value)
|
|||
/** Save the highscore for the player */
|
||||
int8 SaveHighScoreValue(const Player *p)
|
||||
{
|
||||
HighScore *hs = _highscore_table[_opt.diff_level];
|
||||
HighScore *hs = _highscore_table[_settings.difficulty.diff_level];
|
||||
uint i;
|
||||
uint16 score = p->old_economy[0].performance_history;
|
||||
|
||||
|
|
|
@ -207,7 +207,7 @@ RailTypes GetPlayerRailtypes(PlayerID p)
|
|||
FOR_ALL_ENGINES_OF_TYPE(e, VEH_TRAIN) {
|
||||
const EngineInfo *ei = &e->info;
|
||||
|
||||
if (HasBit(ei->climates, _opt.landscape) &&
|
||||
if (HasBit(ei->climates, _settings.game_creation.landscape) &&
|
||||
(HasBit(e->player_avail, p) || _date >= e->intro_date + 365)) {
|
||||
const RailVehicleInfo *rvi = &e->u.rail;
|
||||
|
||||
|
|
|
@ -1420,7 +1420,7 @@ static uint GetSaveSlopeZ(uint x, uint y, Track track)
|
|||
|
||||
static void DrawSingleSignal(TileIndex tile, Track track, byte condition, uint image, uint pos)
|
||||
{
|
||||
bool side = (_opt.road_side != 0) && _settings.construction.signal_side;
|
||||
bool side = (_settings.vehicle.road_side != 0) && _settings.construction.signal_side;
|
||||
static const Point SignalPositions[2][12] = {
|
||||
{ /* Signals on the left side */
|
||||
/* LEFT LEFT RIGHT RIGHT UPPER UPPER */
|
||||
|
@ -1789,7 +1789,7 @@ static void DrawTile_Track(TileInfo *ti)
|
|||
|
||||
/* adjust ground tile for desert
|
||||
* don't adjust for snow, because snow in depots looks weird */
|
||||
if (IsSnowRailGround(ti->tile) && _opt.landscape == LT_TROPIC) {
|
||||
if (IsSnowRailGround(ti->tile) && _settings.game_creation.landscape == LT_TROPIC) {
|
||||
if (image != SPR_FLAT_GRASS_TILE) {
|
||||
image += rti->snow_offset; // tile with tracks
|
||||
} else {
|
||||
|
@ -1953,7 +1953,7 @@ static void TileLoop_Track(TileIndex tile)
|
|||
return;
|
||||
}
|
||||
|
||||
switch (_opt.landscape) {
|
||||
switch (_settings.game_creation.landscape) {
|
||||
case LT_ARCTIC: {
|
||||
uint z;
|
||||
Slope slope = GetTileSlope(tile, &z);
|
||||
|
|
|
@ -103,7 +103,7 @@ RoadTypes GetPlayerRoadtypes(PlayerID p)
|
|||
FOR_ALL_ENGINES_OF_TYPE(e, VEH_ROAD) {
|
||||
const EngineInfo *ei = &e->info;
|
||||
|
||||
if (HasBit(ei->climates, _opt.landscape) &&
|
||||
if (HasBit(ei->climates, _settings.game_creation.landscape) &&
|
||||
(HasBit(e->player_avail, p) || _date >= e->intro_date + 365)) {
|
||||
SetBit(rt, HasBit(ei->misc_flags, EF_ROAD_TRAM) ? ROADTYPE_TRAM : ROADTYPE_ROAD);
|
||||
}
|
||||
|
|
|
@ -69,9 +69,9 @@ CommandCost CmdSetRoadDriveSide(TileIndex tile, uint32 flags, uint32 p1, uint32
|
|||
|
||||
if (flags & DC_EXEC) {
|
||||
if (_game_mode == GM_MENU) {
|
||||
_opt_newgame.road_side = p1;
|
||||
_settings.vehicle.road_side = p1;
|
||||
} else {
|
||||
_opt.road_side = p1;
|
||||
_settings.vehicle.road_side = p1;
|
||||
}
|
||||
InvalidateWindow(WC_GAME_OPTIONS, 0);
|
||||
}
|
||||
|
@ -1000,7 +1000,7 @@ const byte _road_sloped_sprites[14] = {
|
|||
static bool AlwaysDrawUnpavedRoads(TileIndex tile, Roadside roadside)
|
||||
{
|
||||
return (IsOnSnow(tile) &&
|
||||
!(_opt.landscape == LT_TROPIC && HasGrfMiscBit(GMB_DESERT_PAVED_ROADS) &&
|
||||
!(_settings.game_creation.landscape == LT_TROPIC && HasGrfMiscBit(GMB_DESERT_PAVED_ROADS) &&
|
||||
roadside != ROADSIDE_BARREN && roadside != ROADSIDE_GRASS && roadside != ROADSIDE_GRASS_ROAD_WORKS));
|
||||
}
|
||||
|
||||
|
@ -1291,7 +1291,7 @@ static const Roadside _town_road_types_2[][2] = {
|
|||
|
||||
static void TileLoop_Road(TileIndex tile)
|
||||
{
|
||||
switch (_opt.landscape) {
|
||||
switch (_settings.game_creation.landscape) {
|
||||
case LT_ARCTIC:
|
||||
if (IsOnSnow(tile) != (GetTileZ(tile) > GetSnowLine())) {
|
||||
ToggleSnow(tile);
|
||||
|
@ -1337,7 +1337,7 @@ static void TileLoop_Road(TileIndex tile)
|
|||
|
||||
{
|
||||
/* Adjust road ground type depending on 'grp' (grp is the distance to the center) */
|
||||
const Roadside* new_rs = (_opt.landscape == LT_TOYLAND) ? _town_road_types_2[grp] : _town_road_types[grp];
|
||||
const Roadside* new_rs = (_settings.game_creation.landscape == LT_TOYLAND) ? _town_road_types_2[grp] : _town_road_types[grp];
|
||||
Roadside cur_rs = GetRoadside(tile);
|
||||
|
||||
/* We have our desired type, do nothing */
|
||||
|
|
|
@ -702,7 +702,7 @@ static void HandleBrokenRoadVeh(Vehicle *v)
|
|||
InvalidateWindow(WC_VEHICLE_DETAILS, v->index);
|
||||
|
||||
if (!PlayVehicleSound(v, VSE_BREAKDOWN)) {
|
||||
SndPlayVehicleFx((_opt.landscape != LT_TOYLAND) ?
|
||||
SndPlayVehicleFx((_settings.game_creation.landscape != LT_TOYLAND) ?
|
||||
SND_0F_VEHICLE_BREAKDOWN : SND_35_COMEDY_BREAKDOWN, v);
|
||||
}
|
||||
|
||||
|
@ -1273,7 +1273,7 @@ static bool RoadVehLeaveDepot(Vehicle *v, bool first)
|
|||
v->direction = DiagDirToDir(dir);
|
||||
|
||||
Trackdir tdir = _roadveh_depot_exit_trackdir[dir];
|
||||
const RoadDriveEntry *rdp = _road_drive_data[v->u.road.roadtype][(_opt.road_side << RVS_DRIVE_SIDE) + tdir];
|
||||
const RoadDriveEntry *rdp = _road_drive_data[v->u.road.roadtype][(_settings.vehicle.road_side << RVS_DRIVE_SIDE) + tdir];
|
||||
|
||||
int x = TileX(v->tile) * TILE_SIZE + (rdp[RVC_DEPOT_START_FRAME].x & 0xF);
|
||||
int y = TileY(v->tile) * TILE_SIZE + (rdp[RVC_DEPOT_START_FRAME].y & 0xF);
|
||||
|
@ -1451,7 +1451,7 @@ static bool IndividualRoadVehicleController(Vehicle *v, const Vehicle *prev)
|
|||
* In this case v->u.road.state is masked to give the road stop entry direction. */
|
||||
rd = _road_drive_data[v->u.road.roadtype][(
|
||||
(HasBit(v->u.road.state, RVS_IN_DT_ROAD_STOP) ? v->u.road.state & RVSB_ROAD_STOP_TRACKDIR_MASK : v->u.road.state) +
|
||||
(_opt.road_side << RVS_DRIVE_SIDE)) ^ v->u.road.overtaking][v->u.road.frame + 1];
|
||||
(_settings.vehicle.road_side << RVS_DRIVE_SIDE)) ^ v->u.road.overtaking][v->u.road.frame + 1];
|
||||
|
||||
if (rd.x & RDE_NEXT_TILE) {
|
||||
TileIndex tile = v->tile + TileOffsByDiagDir((DiagDirection)(rd.x & 3));
|
||||
|
@ -1529,7 +1529,7 @@ again:
|
|||
}
|
||||
|
||||
/* Get position data for first frame on the new tile */
|
||||
rdp = _road_drive_data[v->u.road.roadtype][(dir + (_opt.road_side << RVS_DRIVE_SIDE)) ^ v->u.road.overtaking];
|
||||
rdp = _road_drive_data[v->u.road.roadtype][(dir + (_settings.vehicle.road_side << RVS_DRIVE_SIDE)) ^ v->u.road.overtaking];
|
||||
|
||||
x = TileX(tile) * TILE_SIZE + rdp[start_frame].x;
|
||||
y = TileY(tile) * TILE_SIZE + rdp[start_frame].y;
|
||||
|
@ -1632,7 +1632,7 @@ again:
|
|||
return false;
|
||||
}
|
||||
|
||||
rdp = _road_drive_data[v->u.road.roadtype][(_opt.road_side << RVS_DRIVE_SIDE) + dir];
|
||||
rdp = _road_drive_data[v->u.road.roadtype][(_settings.vehicle.road_side << RVS_DRIVE_SIDE) + dir];
|
||||
|
||||
x = TileX(v->tile) * TILE_SIZE + rdp[turn_around_start_frame].x;
|
||||
y = TileY(v->tile) * TILE_SIZE + rdp[turn_around_start_frame].y;
|
||||
|
@ -1711,7 +1711,7 @@ again:
|
|||
* (the station test and stop type test ensure that other vehicles, using the road stop as
|
||||
* a through route, do not stop) */
|
||||
if (IsRoadVehFront(v) && ((IsInsideMM(v->u.road.state, RVSB_IN_ROAD_STOP, RVSB_IN_ROAD_STOP_END) &&
|
||||
_road_veh_data_1[v->u.road.state - RVSB_IN_ROAD_STOP + (_opt.road_side << RVS_DRIVE_SIDE)] == v->u.road.frame) ||
|
||||
_road_veh_data_1[v->u.road.state - RVSB_IN_ROAD_STOP + (_settings.vehicle.road_side << RVS_DRIVE_SIDE)] == v->u.road.frame) ||
|
||||
(IsInsideMM(v->u.road.state, RVSB_IN_DT_ROAD_STOP, RVSB_IN_DT_ROAD_STOP_END) &&
|
||||
v->current_order.ShouldStopAtStation(v, GetStationIndex(v->tile)) &&
|
||||
GetRoadStopType(v->tile) == (IsCargoInClass(v->cargo_type, CC_PASSENGERS) ? ROADSTOP_BUS : ROADSTOP_TRUCK) &&
|
||||
|
|
|
@ -63,8 +63,6 @@
|
|||
|
||||
#include "table/strings.h"
|
||||
|
||||
GameOptions _opt;
|
||||
GameOptions _opt_newgame;
|
||||
Settings _settings;
|
||||
Settings _settings_newgame;
|
||||
|
||||
|
@ -1429,18 +1427,18 @@ static const SettingDesc _gameopt_settings[] = {
|
|||
* and why not byte for example?
|
||||
* 'SLE_FILE_I16 | SLE_VAR_U16' in "diff_custom" is needed to get around SlArray() hack
|
||||
* for savegames version 0 - though it is an array, it has to go through the byteswap process */
|
||||
SDT_GENERAL("diff_custom", SDT_INTLIST, SL_ARR, SLE_FILE_I16 | SLE_VAR_U16, 0, 0, GameOptions, diff, 17, 0, 0, 0, 0, NULL, STR_NULL, NULL, NULL, 0, 3),
|
||||
SDT_GENERAL("diff_custom", SDT_INTLIST, SL_ARR, SLE_UINT16, 0, 0, GameOptions, diff, 18, 0, 0, 0, 0, NULL, STR_NULL, NULL, NULL, 4, SL_MAX_VERSION),
|
||||
SDT_VAR(GameOptions, diff_level, SLE_UINT8, 0, 0, 0, 0, 3, 0, STR_NULL, NULL),
|
||||
SDT_OMANY(GameOptions, currency, SLE_UINT8, N, 0, 0, CUSTOM_CURRENCY_ID, "GBP|USD|EUR|YEN|ATS|BEF|CHF|CZK|DEM|DKK|ESP|FIM|FRF|GRD|HUF|ISK|ITL|NLG|NOK|PLN|ROL|RUR|SIT|SEK|YTL|SKK|BRR|custom", STR_NULL, NULL, NULL),
|
||||
SDT_OMANY(GameOptions, units, SLE_UINT8, N, 0, 1, 2, "imperial|metric|si", STR_NULL, NULL, NULL),
|
||||
SDT_GENERAL("diff_custom", SDT_INTLIST, SL_ARR, SLE_FILE_I16 | SLE_VAR_U16, 0, 0, Settings, difficulty, 17, 0, 0, 0, 0, NULL, STR_NULL, NULL, NULL, 0, 3),
|
||||
SDT_GENERAL("diff_custom", SDT_INTLIST, SL_ARR, SLE_UINT16, 0, 0, Settings, difficulty, 18, 0, 0, 0, 0, NULL, STR_NULL, NULL, NULL, 4, SL_MAX_VERSION),
|
||||
SDT_VAR(Settings, difficulty.diff_level, SLE_UINT8, 0, 0, 0, 0, 3, 0, STR_NULL, NULL),
|
||||
SDT_OMANY(Settings, gui.currency, SLE_UINT8, N, 0, 0, CUSTOM_CURRENCY_ID, "GBP|USD|EUR|YEN|ATS|BEF|CHF|CZK|DEM|DKK|ESP|FIM|FRF|GRD|HUF|ISK|ITL|NLG|NOK|PLN|ROL|RUR|SIT|SEK|YTL|SKK|BRR|custom", STR_NULL, NULL, NULL),
|
||||
SDT_OMANY(Settings, gui.units, SLE_UINT8, N, 0, 1, 2, "imperial|metric|si", STR_NULL, NULL, NULL),
|
||||
/* There are only 21 predefined town_name values (0-20), but you can have more with newgrf action F so allow these bigger values (21-255). Invalid values will fallback to english on use and (undefined string) in GUI. */
|
||||
SDT_OMANY(GameOptions, town_name, SLE_UINT8, 0, 0, 0, 255, "english|french|german|american|latin|silly|swedish|dutch|finnish|polish|slovakish|norwegian|hungarian|austrian|romanian|czech|swiss|danish|turkish|italian|catalan", STR_NULL, NULL, NULL),
|
||||
SDT_OMANY(GameOptions, landscape, SLE_UINT8, 0, 0, 0, 3, "temperate|arctic|tropic|toyland", STR_NULL, NULL, ConvertLandscape),
|
||||
SDT_VAR(GameOptions, snow_line, SLE_UINT8, 0, 0, 7 * TILE_HEIGHT, 2 * TILE_HEIGHT, 13 * TILE_HEIGHT, 0, STR_NULL, NULL),
|
||||
SDT_CONDOMANY(GameOptions,autosave, SLE_UINT8, 0, 22, N, 0, 0, 0, "", STR_NULL, NULL, NULL),
|
||||
SDT_CONDOMANY(GameOptions,autosave, SLE_UINT8,23, SL_MAX_VERSION, S, 0, 1, 4, "off|monthly|quarterly|half year|yearly", STR_NULL, NULL, NULL),
|
||||
SDT_OMANY(GameOptions, road_side, SLE_UINT8, 0, 0, 1, 1, "left|right", STR_NULL, NULL, NULL),
|
||||
SDT_OMANY(Settings, game_creation.town_name, SLE_UINT8, 0, 0, 0, 255, "english|french|german|american|latin|silly|swedish|dutch|finnish|polish|slovakish|norwegian|hungarian|austrian|romanian|czech|swiss|danish|turkish|italian|catalan", STR_NULL, NULL, NULL),
|
||||
SDT_OMANY(Settings, game_creation.landscape, SLE_UINT8, 0, 0, 0, 3, "temperate|arctic|tropic|toyland", STR_NULL, NULL, ConvertLandscape),
|
||||
SDT_VAR(Settings, game_creation.snow_line, SLE_UINT8, 0, 0, 7 * TILE_HEIGHT, 2 * TILE_HEIGHT, 13 * TILE_HEIGHT, 0, STR_NULL, NULL),
|
||||
SDT_CONDOMANY(Settings,gui.autosave, SLE_UINT8, 0, 22, N, 0, 0, 0, "", STR_NULL, NULL, NULL),
|
||||
SDT_CONDOMANY(Settings,gui.autosave, SLE_UINT8,23, SL_MAX_VERSION, S, 0, 1, 4, "off|monthly|quarterly|half year|yearly", STR_NULL, NULL, NULL),
|
||||
SDT_OMANY(Settings, vehicle.road_side, SLE_UINT8, 0, 0, 1, 1, "left|right", STR_NULL, NULL, NULL),
|
||||
SDT_END()
|
||||
};
|
||||
|
||||
|
@ -1838,7 +1836,7 @@ static void HandleSettingDescs(IniFile *ini, SettingDescProc *proc, SettingDescP
|
|||
proc(ini, (const SettingDesc*)_win32_settings, "win32", NULL);
|
||||
#endif /* WIN32 */
|
||||
|
||||
proc(ini, _gameopt_settings, "gameopt", &_opt_newgame);
|
||||
proc(ini, _gameopt_settings, "gameopt", &_settings_newgame);
|
||||
proc(ini, _patch_settings, "patches", &_settings_newgame);
|
||||
proc(ini, _currency_settings,"currency", &_custom_currency);
|
||||
|
||||
|
@ -2086,13 +2084,12 @@ static void Load_OPTS()
|
|||
/* Copy over default setting since some might not get loaded in
|
||||
* a networking environment. This ensures for example that the local
|
||||
* autosave-frequency stays when joining a network-server */
|
||||
_opt = _opt_newgame;
|
||||
LoadSettings(_gameopt_settings, &_opt);
|
||||
LoadSettings(_gameopt_settings, &_settings);
|
||||
}
|
||||
|
||||
static void Save_OPTS()
|
||||
{
|
||||
SaveSettings(_gameopt_settings, &_opt);
|
||||
SaveSettings(_gameopt_settings, &_settings);
|
||||
}
|
||||
|
||||
static void Load_PATS()
|
||||
|
@ -2100,7 +2097,6 @@ static void Load_PATS()
|
|||
/* Copy over default setting since some might not get loaded in
|
||||
* a networking environment. This ensures for example that the local
|
||||
* signal_side stays when joining a network-server */
|
||||
_settings = _settings_newgame;
|
||||
LoadSettings(_patch_settings, &_settings);
|
||||
}
|
||||
|
||||
|
|
|
@ -142,11 +142,11 @@ static void ShowTownnameDropdown(Window *w, int sel)
|
|||
static void ShowCustCurrency();
|
||||
|
||||
struct GameOptionsWindow : Window {
|
||||
GameOptions *opt;
|
||||
Settings *opt;
|
||||
|
||||
GameOptionsWindow(const WindowDesc *desc) : Window(desc)
|
||||
{
|
||||
this->opt = (_game_mode == GM_MENU) ? &_opt_newgame : &_opt;
|
||||
this->opt = (_game_mode == GM_MENU) ? &_settings_newgame : &_settings;
|
||||
this->FindWindowPlacementAndResize(desc);
|
||||
}
|
||||
|
||||
|
@ -162,11 +162,11 @@ struct GameOptionsWindow : Window {
|
|||
this->SetWidgetDisabledState(GAMEOPT_VEHICLENAME_SAVE, !(_vehicle_design_names & 1));
|
||||
if (!this->IsWidgetDisabled(GAMEOPT_VEHICLENAME_SAVE)) str = STR_02BF_CUSTOM;
|
||||
SetDParam(0, str);
|
||||
SetDParam(1, _currency_specs[this->opt->currency].name);
|
||||
SetDParam(2, STR_UNITS_IMPERIAL + this->opt->units);
|
||||
SetDParam(3, STR_02E9_DRIVE_ON_LEFT + this->opt->road_side);
|
||||
SetDParam(4, TownName(this->opt->town_name));
|
||||
SetDParam(5, _autosave_dropdown[this->opt->autosave]);
|
||||
SetDParam(1, _currency_specs[this->opt->gui.currency].name);
|
||||
SetDParam(2, STR_UNITS_IMPERIAL + this->opt->gui.units);
|
||||
SetDParam(3, STR_02E9_DRIVE_ON_LEFT + this->opt->vehicle.road_side);
|
||||
SetDParam(4, TownName(this->opt->game_creation.town_name));
|
||||
SetDParam(5, _autosave_dropdown[this->opt->gui.autosave]);
|
||||
SetDParam(6, SPECSTR_LANGUAGE_START + _dynlang.curr);
|
||||
int i = GetCurRes();
|
||||
SetDParam(7, i == _num_resolutions ? STR_RES_OTHER : SPECSTR_RESOLUTION_START + i);
|
||||
|
@ -181,11 +181,11 @@ struct GameOptionsWindow : Window {
|
|||
{
|
||||
switch (widget) {
|
||||
case GAMEOPT_CURRENCY_BTN: // Setup currencies dropdown
|
||||
ShowDropDownMenu(this, BuildCurrencyDropdown(), this->opt->currency, GAMEOPT_CURRENCY_BTN, _game_mode == GM_MENU ? 0 : ~GetMaskOfAllowedCurrencies(), 0);
|
||||
ShowDropDownMenu(this, BuildCurrencyDropdown(), this->opt->gui.currency, GAMEOPT_CURRENCY_BTN, _game_mode == GM_MENU ? 0 : ~GetMaskOfAllowedCurrencies(), 0);
|
||||
break;
|
||||
|
||||
case GAMEOPT_DISTANCE_BTN: // Setup distance unit dropdown
|
||||
ShowDropDownMenu(this, _units_dropdown, this->opt->units, GAMEOPT_DISTANCE_BTN, 0, 0);
|
||||
ShowDropDownMenu(this, _units_dropdown, this->opt->gui.units, GAMEOPT_DISTANCE_BTN, 0, 0);
|
||||
break;
|
||||
|
||||
case GAMEOPT_ROADSIDE_BTN: { // Setup road-side dropdown
|
||||
|
@ -195,18 +195,18 @@ struct GameOptionsWindow : Window {
|
|||
/* You can only change the drive side if you are in the menu or ingame with
|
||||
* no vehicles present. In a networking game only the server can change it */
|
||||
if ((_game_mode != GM_MENU && RoadVehiclesAreBuilt()) || (_networking && !_network_server)) {
|
||||
i = (-1) ^ (1 << this->opt->road_side); // disable the other value
|
||||
i = (-1) ^ (1 << this->opt->vehicle.road_side); // disable the other value
|
||||
}
|
||||
|
||||
ShowDropDownMenu(this, _driveside_dropdown, this->opt->road_side, GAMEOPT_ROADSIDE_BTN, i, 0);
|
||||
ShowDropDownMenu(this, _driveside_dropdown, this->opt->vehicle.road_side, GAMEOPT_ROADSIDE_BTN, i, 0);
|
||||
} break;
|
||||
|
||||
case GAMEOPT_TOWNNAME_BTN: // Setup townname dropdown
|
||||
ShowTownnameDropdown(this, this->opt->town_name);
|
||||
ShowTownnameDropdown(this, this->opt->game_creation.town_name);
|
||||
break;
|
||||
|
||||
case GAMEOPT_AUTOSAVE_BTN: // Setup autosave dropdown
|
||||
ShowDropDownMenu(this, _autosave_dropdown, this->opt->autosave, GAMEOPT_AUTOSAVE_BTN, 0, 0);
|
||||
ShowDropDownMenu(this, _autosave_dropdown, this->opt->gui.autosave, GAMEOPT_AUTOSAVE_BTN, 0, 0);
|
||||
break;
|
||||
|
||||
case GAMEOPT_VEHICLENAME_BTN: // Setup customized vehicle-names dropdown
|
||||
|
@ -265,17 +265,17 @@ struct GameOptionsWindow : Window {
|
|||
|
||||
case GAMEOPT_CURRENCY_BTN: /* Currency */
|
||||
if (index == CUSTOM_CURRENCY_ID) ShowCustCurrency();
|
||||
this->opt->currency = index;
|
||||
this->opt->gui.currency = index;
|
||||
MarkWholeScreenDirty();
|
||||
break;
|
||||
|
||||
case GAMEOPT_DISTANCE_BTN: // Measuring units
|
||||
this->opt->units = index;
|
||||
this->opt->gui.units = index;
|
||||
MarkWholeScreenDirty();
|
||||
break;
|
||||
|
||||
case GAMEOPT_ROADSIDE_BTN: // Road side
|
||||
if (this->opt->road_side != index) { // only change if setting changed
|
||||
if (this->opt->vehicle.road_side != index) { // only change if setting changed
|
||||
DoCommandP(0, index, 0, NULL, CMD_SET_ROAD_DRIVE_SIDE | CMD_MSG(STR_00B4_CAN_T_DO_THIS));
|
||||
MarkWholeScreenDirty();
|
||||
}
|
||||
|
@ -283,13 +283,13 @@ struct GameOptionsWindow : Window {
|
|||
|
||||
case GAMEOPT_TOWNNAME_BTN: // Town names
|
||||
if (_game_mode == GM_MENU) {
|
||||
this->opt->town_name = index;
|
||||
this->opt->game_creation.town_name = index;
|
||||
InvalidateWindow(WC_GAME_OPTIONS, 0);
|
||||
}
|
||||
break;
|
||||
|
||||
case GAMEOPT_AUTOSAVE_BTN: // Autosave options
|
||||
_opt.autosave = _opt_newgame.autosave = index;
|
||||
_settings.gui.autosave = _settings.gui.autosave = index;
|
||||
this->SetDirty();
|
||||
break;
|
||||
|
||||
|
@ -416,7 +416,7 @@ static const GDType _default_game_diff[3][GAME_DIFFICULTY_NUM] = { /*
|
|||
{7, 0, 3, 3, 100, 4, 1, 3, 2, 2, 0, 2, 3, 2, 1, 1, 1, 2}, ///< hard
|
||||
};
|
||||
|
||||
void SetDifficultyLevel(int mode, GameOptions *gm_opt)
|
||||
void SetDifficultyLevel(int mode, DifficultySettings *gm_opt)
|
||||
{
|
||||
int i;
|
||||
assert(mode <= 3);
|
||||
|
@ -424,7 +424,7 @@ void SetDifficultyLevel(int mode, GameOptions *gm_opt)
|
|||
gm_opt->diff_level = mode;
|
||||
if (mode != 3) { // not custom
|
||||
for (i = 0; i != GAME_DIFFICULTY_NUM; i++)
|
||||
((GDType*)&gm_opt->diff)[i] = _default_game_diff[mode][i];
|
||||
((GDType*)gm_opt)[i] = _default_game_diff[mode][i];
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -434,11 +434,11 @@ void SetDifficultyLevel(int mode, GameOptions *gm_opt)
|
|||
*/
|
||||
void CheckDifficultyLevels()
|
||||
{
|
||||
if (_opt_newgame.diff_level != 3) {
|
||||
SetDifficultyLevel(_opt_newgame.diff_level, &_opt_newgame);
|
||||
if (_settings_newgame.difficulty.diff_level != 3) {
|
||||
SetDifficultyLevel(_settings_newgame.difficulty.diff_level, &_settings_newgame.difficulty);
|
||||
} else {
|
||||
for (uint i = 0; i < GAME_DIFFICULTY_NUM; i++) {
|
||||
GDType *diff = ((GDType*)&_opt_newgame.diff) + i;
|
||||
GDType *diff = ((GDType*)&_settings_newgame.difficulty) + i;
|
||||
*diff = Clamp(*diff, _game_setting_info[i].min, _game_setting_info[i].max);
|
||||
*diff -= *diff % _game_setting_info[i].step;
|
||||
}
|
||||
|
@ -479,7 +479,7 @@ private:
|
|||
uint8 timeout;
|
||||
|
||||
/* Temporary holding place of values in the difficulty window until 'Save' is clicked */
|
||||
GameOptions opt_mod_temp;
|
||||
DifficultySettings opt_mod_temp;
|
||||
|
||||
enum {
|
||||
GAMEDIFF_WND_TOP_OFFSET = 45,
|
||||
|
@ -510,7 +510,7 @@ public:
|
|||
{
|
||||
/* Copy current settings (ingame or in intro) to temporary holding place
|
||||
* change that when setting stuff, copy back on clicking 'OK' */
|
||||
this->opt_mod_temp = (_game_mode == GM_MENU) ? _opt_newgame : _opt;
|
||||
this->opt_mod_temp = (_game_mode == GM_MENU) ? _settings_newgame.difficulty : _settings.difficulty;
|
||||
this->clicked_increase = false;
|
||||
this->clicked_button = NO_SETTINGS_BUTTON;
|
||||
this->timeout = 0;
|
||||
|
@ -549,7 +549,7 @@ public:
|
|||
int y = GAMEDIFF_WND_TOP_OFFSET;
|
||||
for (uint i = 0; i != GAME_DIFFICULTY_NUM; i++) {
|
||||
const GameSettingData *gsd = &_game_setting_info[i];
|
||||
value = ((GDType*)&this->opt_mod_temp.diff)[i];
|
||||
value = ((GDType*)&this->opt_mod_temp)[i];
|
||||
|
||||
DrawArrowButtons(5, y, 3,
|
||||
(this->clicked_button == i) ? 1 + !!this->clicked_increase : 0,
|
||||
|
@ -587,7 +587,7 @@ public:
|
|||
|
||||
this->timeout = 5;
|
||||
|
||||
int16 val = ((GDType*)&this->opt_mod_temp.diff)[btn];
|
||||
int16 val = ((GDType*)&this->opt_mod_temp)[btn];
|
||||
|
||||
const GameSettingData *info = &_game_setting_info[btn]; // get information about the difficulty setting
|
||||
if (x >= 10) {
|
||||
|
@ -603,7 +603,7 @@ public:
|
|||
this->clicked_button = btn;
|
||||
|
||||
/* save value in temporary variable */
|
||||
((GDType*)&this->opt_mod_temp.diff)[btn] = val;
|
||||
((GDType*)&this->opt_mod_temp)[btn] = val;
|
||||
this->RaiseWidget(GDW_LVL_EASY + this->opt_mod_temp.diff_level);
|
||||
SetDifficultyLevel(3, &this->opt_mod_temp); // set difficulty level to custom
|
||||
this->LowerWidget(GDW_LVL_CUSTOM);
|
||||
|
@ -627,11 +627,11 @@ public:
|
|||
|
||||
case GDW_ACCEPT: { // Save button - save changes
|
||||
GDType btn, val;
|
||||
GameOptions *opt_ptr = (_game_mode == GM_MENU) ? &_opt_newgame : &_opt;
|
||||
Settings *opt_ptr = (_game_mode == GM_MENU) ? &_settings_newgame : &_settings;
|
||||
for (btn = 0; btn != GAME_DIFFICULTY_NUM; btn++) {
|
||||
val = ((GDType*)&this->opt_mod_temp.diff)[btn];
|
||||
val = ((GDType*)&this->opt_mod_temp)[btn];
|
||||
/* if setting has changed, change it */
|
||||
if (val != ((GDType*)&opt_ptr->diff)[btn]) {
|
||||
if (val != ((GDType*)&opt_ptr->difficulty)[btn]) {
|
||||
DoCommandP(0, btn, val, NULL, CMD_CHANGE_DIFFICULTY_LEVEL);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -33,46 +33,29 @@ enum {
|
|||
|
||||
/** Specific type for Game Difficulty to ease changing the type */
|
||||
typedef uint16 GDType;
|
||||
struct GameDifficulty {
|
||||
GDType max_no_competitors;
|
||||
GDType competitor_start_time;
|
||||
GDType number_towns;
|
||||
GDType number_industries;
|
||||
GDType max_loan;
|
||||
GDType initial_interest;
|
||||
GDType vehicle_costs;
|
||||
GDType competitor_speed;
|
||||
GDType competitor_intelligence; ///< no longer in use
|
||||
GDType vehicle_breakdowns;
|
||||
GDType subsidy_multiplier;
|
||||
GDType construction_cost;
|
||||
GDType terrain_type;
|
||||
GDType quantity_sea_lakes;
|
||||
GDType economy;
|
||||
GDType line_reverse_mode;
|
||||
GDType disasters;
|
||||
GDType town_council_tolerance; ///< minimum required town ratings to be allowed to demolish stuff
|
||||
/** Settings related to the difficulty of the game */
|
||||
struct DifficultySettings {
|
||||
GDType max_no_competitors; ///< the number of competitors (AIs)
|
||||
GDType competitor_start_time; ///< how long to wait for the first competitors (AIs)
|
||||
GDType number_towns; ///< the amount of towns
|
||||
GDType number_industries; ///< the amount of industries
|
||||
GDType max_loan; ///< the maximum initial loan
|
||||
GDType initial_interest; ///< amount of interest (to pay over the loan)
|
||||
GDType vehicle_costs; ///< amount of money spent on vehicle running cost
|
||||
GDType competitor_speed; ///< the speed at which the AI builds
|
||||
GDType competitor_intelligence; ///< the competior's (AI) intelligence
|
||||
GDType vehicle_breakdowns; ///< likelihood of vehicles breaking down
|
||||
GDType subsidy_multiplier; ///< amount of subsidy
|
||||
GDType construction_cost; ///< how expensive is building
|
||||
GDType terrain_type; ///< the mountainousness of the landscape
|
||||
GDType quantity_sea_lakes; ///< the amount of seas/lakes
|
||||
GDType economy; ///< how volatile is the economy
|
||||
GDType line_reverse_mode; ///< reversing at stations or not
|
||||
GDType disasters; ///< are disasters enabled
|
||||
GDType town_council_tolerance; ///< minimum required town ratings to be allowed to demolish stuff
|
||||
GDType diff_level; ///< the difficulty level
|
||||
};
|
||||
|
||||
struct GameOptions {
|
||||
GameDifficulty diff;
|
||||
byte diff_level;
|
||||
byte currency;
|
||||
byte units;
|
||||
byte town_name;
|
||||
byte landscape;
|
||||
byte snow_line;
|
||||
byte autosave;
|
||||
byte road_side;
|
||||
};
|
||||
|
||||
/* These are the options for the current game
|
||||
* either ingame, or loaded. Also used for networking games */
|
||||
extern GameOptions _opt;
|
||||
|
||||
/* These are the default options for a new game */
|
||||
extern GameOptions _opt_newgame;
|
||||
|
||||
/** Settings related to the GUI and other stuff that is not saved in the savegame. */
|
||||
struct GUISettings {
|
||||
bool vehicle_speed; ///< show vehicle speed
|
||||
|
@ -98,6 +81,7 @@ struct GUISettings {
|
|||
uint8 toolbar_pos; ///< position of toolbars, 0=left, 1=center, 2=right
|
||||
uint8 window_snap_radius; ///< windows snap at each other if closer than this
|
||||
bool always_build_infrastructure; ///< always allow building of infrastructure, even when you do not have the vehicles for it
|
||||
byte autosave; ///< how often should we do autosaves?
|
||||
bool keep_all_autosave; ///< name the autosave in a different way
|
||||
bool autosave_on_exit; ///< save an autosave when you quit the game, but do not ask "Do you really want to quit?"
|
||||
byte max_num_autosaves; ///< controls how many autosavegames are made before the game starts to overwrite (names them 0 to max_num_autosaves - 1)
|
||||
|
@ -117,6 +101,8 @@ struct GUISettings {
|
|||
bool autorenew; ///< should autorenew be enabled for new companies?
|
||||
int16 autorenew_months; ///< how many months from EOL of vehicles should autorenew trigger for new companies?
|
||||
int32 autorenew_money; ///< how much money before autorenewing for new companies?
|
||||
byte currency; ///< currency we currently use
|
||||
byte units; ///< unit system we show everything
|
||||
};
|
||||
|
||||
/** Settings related to the creation of games. */
|
||||
|
@ -132,6 +118,9 @@ struct GameCreationSettings {
|
|||
byte tree_placer; ///< the tree placer algorithm
|
||||
byte heightmap_rotation; ///< rotation director for the heightmap
|
||||
byte se_flat_world_height; ///< land height a flat world gets in SE
|
||||
byte town_name; ///< the town name generator used for town names
|
||||
byte landscape; ///< the landscape we're currently in
|
||||
byte snow_line; ///< the snowline level in this game
|
||||
};
|
||||
|
||||
/** Settings related to construction in-game */
|
||||
|
@ -266,6 +255,7 @@ struct VehicleSettings {
|
|||
bool dynamic_engines; ///< enable dynamic allocation of engine data
|
||||
bool never_expire_vehicles; ///< never expire vehicles
|
||||
byte extend_vehicle_life; ///< extend vehicle life by this many years
|
||||
byte road_side; ///< the side of the road vehicles drive on
|
||||
};
|
||||
|
||||
/** Settings related to the economy. */
|
||||
|
@ -300,6 +290,7 @@ struct StationSettings {
|
|||
|
||||
/** All settings together. */
|
||||
struct Settings {
|
||||
DifficultySettings difficulty; ///< settings related to the difficulty
|
||||
GUISettings gui; ///< settings related to the GUI
|
||||
GameCreationSettings game_creation; ///< settings used during the creation of a game (map)
|
||||
ConstructionSettings construction; ///< construction of things in-game
|
||||
|
@ -311,9 +302,10 @@ struct Settings {
|
|||
StationSettings station; ///< settings related to station management
|
||||
};
|
||||
|
||||
/** The current settings. */
|
||||
extern Settings _settings;
|
||||
|
||||
/** The patch values that are used for new games and/or modified in config file */
|
||||
/** The settings values that are used for new games and/or modified in config file */
|
||||
extern Settings _settings_newgame;
|
||||
|
||||
#endif /* SETTINGS_TYPE_H */
|
||||
|
|
|
@ -196,7 +196,7 @@ static void HandleBrokenShip(Vehicle *v)
|
|||
InvalidateWindow(WC_VEHICLE_DETAILS, v->index);
|
||||
|
||||
if (!PlayVehicleSound(v, VSE_BREAKDOWN)) {
|
||||
SndPlayVehicleFx((_opt.landscape != LT_TOYLAND) ?
|
||||
SndPlayVehicleFx((_settings.game_creation.landscape != LT_TOYLAND) ?
|
||||
SND_10_TRAIN_BREAKDOWN : SND_3A_COMEDY_BREAKDOWN_2, v);
|
||||
}
|
||||
|
||||
|
|
|
@ -459,7 +459,7 @@ static inline uint32 GetSmallMapVegetationPixels(TileIndex tile)
|
|||
|
||||
case MP_TREES:
|
||||
if (GetTreeGround(tile) == TREE_GROUND_SNOW_DESERT) {
|
||||
bits = (_opt.landscape == LT_ARCTIC) ? MKCOLOR(0x98575798) : MKCOLOR(0xC25757C2);
|
||||
bits = (_settings.game_creation.landscape == LT_ARCTIC) ? MKCOLOR(0x98575798) : MKCOLOR(0xC25757C2);
|
||||
} else {
|
||||
bits = MKCOLOR(0x54575754);
|
||||
}
|
||||
|
|
|
@ -296,7 +296,7 @@ static StringID GenerateStationName(Station *st, TileIndex tile, int flag)
|
|||
CountMapSquareAround(tile, CMSATree) >= 8 ||
|
||||
CountMapSquareAround(tile, CMSAForest) >= 2)
|
||||
) {
|
||||
return _opt.landscape == LT_TROPIC ? STR_SV_STNAME_FOREST : STR_SV_STNAME_WOODS;
|
||||
return _settings.game_creation.landscape == LT_TROPIC ? STR_SV_STNAME_FOREST : STR_SV_STNAME_WOODS;
|
||||
}
|
||||
|
||||
/* check elevation compared to town */
|
||||
|
@ -1681,7 +1681,7 @@ uint8 GetAirportNoiseLevelForTown(const AirportFTAClass *afc, TileIndex town_til
|
|||
* adding the town_council_tolerance 4 times, as a way to graduate, depending of the tolerance.
|
||||
* Basically, it says that the less tolerant a town is, the bigger the distance before
|
||||
* an actual decrease can be granted */
|
||||
uint8 town_tolerance_distance = 8 + (_opt.diff.town_council_tolerance * 4);
|
||||
uint8 town_tolerance_distance = 8 + (_settings.difficulty.town_council_tolerance * 4);
|
||||
|
||||
/* The airport is in the "inner" distance where there is no noise reduction */
|
||||
if (distance < town_tolerance_distance) return afc->noise_level;
|
||||
|
|
|
@ -546,7 +546,7 @@ static const Units units[] = {
|
|||
*/
|
||||
uint ConvertSpeedToDisplaySpeed(uint speed)
|
||||
{
|
||||
return (speed * units[_opt.units].s_m) >> units[_opt.units].s_s;
|
||||
return (speed * units[_settings.gui.units].s_m) >> units[_settings.gui.units].s_s;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -556,7 +556,7 @@ uint ConvertSpeedToDisplaySpeed(uint speed)
|
|||
*/
|
||||
uint ConvertDisplaySpeedToSpeed(uint speed)
|
||||
{
|
||||
return ((speed << units[_opt.units].s_s) + units[_opt.units].s_m / 2) / units[_opt.units].s_m;
|
||||
return ((speed << units[_settings.gui.units].s_s) + units[_settings.gui.units].s_m / 2) / units[_settings.gui.units].s_m;
|
||||
}
|
||||
|
||||
static char* FormatString(char* buff, const char* str, const int64* argv, uint casei, const char* last)
|
||||
|
@ -602,9 +602,9 @@ static char* FormatString(char* buff, const char* str, const int64* argv, uint c
|
|||
|
||||
case SCC_VELOCITY: {// {VELOCITY}
|
||||
int64 args[1];
|
||||
assert(_opt.units < lengthof(units));
|
||||
assert(_settings.gui.units < lengthof(units));
|
||||
args[0] = ConvertSpeedToDisplaySpeed(GetInt32(&argv));
|
||||
buff = FormatString(buff, GetStringPtr(units[_opt.units].velocity), args, modifier >> 24, last);
|
||||
buff = FormatString(buff, GetStringPtr(units[_settings.gui.units].velocity), args, modifier >> 24, last);
|
||||
modifier = 0;
|
||||
break;
|
||||
}
|
||||
|
@ -625,18 +625,18 @@ static char* FormatString(char* buff, const char* str, const int64* argv, uint c
|
|||
switch (cargo_str) {
|
||||
case STR_TONS: {
|
||||
int64 args[1];
|
||||
assert(_opt.units < lengthof(units));
|
||||
args[0] = GetInt32(&argv) * units[_opt.units].w_m >> units[_opt.units].w_s;
|
||||
buff = FormatString(buff, GetStringPtr(units[_opt.units].l_weight), args, modifier >> 24, last);
|
||||
assert(_settings.gui.units < lengthof(units));
|
||||
args[0] = GetInt32(&argv) * units[_settings.gui.units].w_m >> units[_settings.gui.units].w_s;
|
||||
buff = FormatString(buff, GetStringPtr(units[_settings.gui.units].l_weight), args, modifier >> 24, last);
|
||||
modifier = 0;
|
||||
break;
|
||||
}
|
||||
|
||||
case STR_LITERS: {
|
||||
int64 args[1];
|
||||
assert(_opt.units < lengthof(units));
|
||||
args[0] = GetInt32(&argv) * units[_opt.units].v_m >> units[_opt.units].v_s;
|
||||
buff = FormatString(buff, GetStringPtr(units[_opt.units].l_volume), args, modifier >> 24, last);
|
||||
assert(_settings.gui.units < lengthof(units));
|
||||
args[0] = GetInt32(&argv) * units[_settings.gui.units].v_m >> units[_settings.gui.units].v_s;
|
||||
buff = FormatString(buff, GetStringPtr(units[_settings.gui.units].l_volume), args, modifier >> 24, last);
|
||||
modifier = 0;
|
||||
break;
|
||||
}
|
||||
|
@ -718,9 +718,9 @@ static char* FormatString(char* buff, const char* str, const int64* argv, uint c
|
|||
|
||||
case SCC_VOLUME: { // {VOLUME}
|
||||
int64 args[1];
|
||||
assert(_opt.units < lengthof(units));
|
||||
args[0] = GetInt32(&argv) * units[_opt.units].v_m >> units[_opt.units].v_s;
|
||||
buff = FormatString(buff, GetStringPtr(units[_opt.units].l_volume), args, modifier >> 24, last);
|
||||
assert(_settings.gui.units < lengthof(units));
|
||||
args[0] = GetInt32(&argv) * units[_settings.gui.units].v_m >> units[_settings.gui.units].v_s;
|
||||
buff = FormatString(buff, GetStringPtr(units[_settings.gui.units].l_volume), args, modifier >> 24, last);
|
||||
modifier = 0;
|
||||
break;
|
||||
}
|
||||
|
@ -763,45 +763,45 @@ static char* FormatString(char* buff, const char* str, const int64* argv, uint c
|
|||
|
||||
case SCC_POWER: { // {POWER}
|
||||
int64 args[1];
|
||||
assert(_opt.units < lengthof(units));
|
||||
args[0] = GetInt32(&argv) * units[_opt.units].p_m >> units[_opt.units].p_s;
|
||||
buff = FormatString(buff, GetStringPtr(units[_opt.units].power), args, modifier >> 24, last);
|
||||
assert(_settings.gui.units < lengthof(units));
|
||||
args[0] = GetInt32(&argv) * units[_settings.gui.units].p_m >> units[_settings.gui.units].p_s;
|
||||
buff = FormatString(buff, GetStringPtr(units[_settings.gui.units].power), args, modifier >> 24, last);
|
||||
modifier = 0;
|
||||
break;
|
||||
}
|
||||
|
||||
case SCC_VOLUME_SHORT: { // {VOLUME_S}
|
||||
int64 args[1];
|
||||
assert(_opt.units < lengthof(units));
|
||||
args[0] = GetInt32(&argv) * units[_opt.units].v_m >> units[_opt.units].v_s;
|
||||
buff = FormatString(buff, GetStringPtr(units[_opt.units].s_volume), args, modifier >> 24, last);
|
||||
assert(_settings.gui.units < lengthof(units));
|
||||
args[0] = GetInt32(&argv) * units[_settings.gui.units].v_m >> units[_settings.gui.units].v_s;
|
||||
buff = FormatString(buff, GetStringPtr(units[_settings.gui.units].s_volume), args, modifier >> 24, last);
|
||||
modifier = 0;
|
||||
break;
|
||||
}
|
||||
|
||||
case SCC_WEIGHT: { // {WEIGHT}
|
||||
int64 args[1];
|
||||
assert(_opt.units < lengthof(units));
|
||||
args[0] = GetInt32(&argv) * units[_opt.units].w_m >> units[_opt.units].w_s;
|
||||
buff = FormatString(buff, GetStringPtr(units[_opt.units].l_weight), args, modifier >> 24, last);
|
||||
assert(_settings.gui.units < lengthof(units));
|
||||
args[0] = GetInt32(&argv) * units[_settings.gui.units].w_m >> units[_settings.gui.units].w_s;
|
||||
buff = FormatString(buff, GetStringPtr(units[_settings.gui.units].l_weight), args, modifier >> 24, last);
|
||||
modifier = 0;
|
||||
break;
|
||||
}
|
||||
|
||||
case SCC_WEIGHT_SHORT: { // {WEIGHT_S}
|
||||
int64 args[1];
|
||||
assert(_opt.units < lengthof(units));
|
||||
args[0] = GetInt32(&argv) * units[_opt.units].w_m >> units[_opt.units].w_s;
|
||||
buff = FormatString(buff, GetStringPtr(units[_opt.units].s_weight), args, modifier >> 24, last);
|
||||
assert(_settings.gui.units < lengthof(units));
|
||||
args[0] = GetInt32(&argv) * units[_settings.gui.units].w_m >> units[_settings.gui.units].w_s;
|
||||
buff = FormatString(buff, GetStringPtr(units[_settings.gui.units].s_weight), args, modifier >> 24, last);
|
||||
modifier = 0;
|
||||
break;
|
||||
}
|
||||
|
||||
case SCC_FORCE: { // {FORCE}
|
||||
int64 args[1];
|
||||
assert(_opt.units < lengthof(units));
|
||||
args[0] = GetInt32(&argv) * units[_opt.units].f_m >> units[_opt.units].f_s;
|
||||
buff = FormatString(buff, GetStringPtr(units[_opt.units].force), args, modifier >> 24, last);
|
||||
assert(_settings.gui.units < lengthof(units));
|
||||
args[0] = GetInt32(&argv) * units[_settings.gui.units].f_m >> units[_settings.gui.units].f_s;
|
||||
buff = FormatString(buff, GetStringPtr(units[_settings.gui.units].force), args, modifier >> 24, last);
|
||||
modifier = 0;
|
||||
break;
|
||||
}
|
||||
|
@ -1137,7 +1137,7 @@ static char *GenAndCoName(char *buff, uint32 arg, const char* last)
|
|||
const char* const* base;
|
||||
uint num;
|
||||
|
||||
if (_opt.landscape == LT_TOYLAND) {
|
||||
if (_settings.game_creation.landscape == LT_TOYLAND) {
|
||||
base = _silly_surname_list;
|
||||
num = lengthof(_silly_surname_list);
|
||||
} else {
|
||||
|
@ -1167,7 +1167,7 @@ static char *GenPresidentName(char *buff, uint32 x, const char* last)
|
|||
buff = strecpy(buff, initial, last);
|
||||
}
|
||||
|
||||
if (_opt.landscape == LT_TOYLAND) {
|
||||
if (_settings.game_creation.landscape == LT_TOYLAND) {
|
||||
base = _silly_surname_list;
|
||||
num = lengthof(_silly_surname_list);
|
||||
} else {
|
||||
|
|
|
@ -550,7 +550,7 @@ static void EditorTerraformClick_RockyArea(Window *w)
|
|||
|
||||
static void EditorTerraformClick_DesertLightHouse(Window *w)
|
||||
{
|
||||
HandlePlacePushButton(w, ETTW_PLACE_DESERT_LIGHTHOUSE, SPR_CURSOR_LIGHTHOUSE, VHM_RECT, (_opt.landscape == LT_TROPIC) ? PlaceProc_DesertArea : PlaceProc_LightHouse);
|
||||
HandlePlacePushButton(w, ETTW_PLACE_DESERT_LIGHTHOUSE, SPR_CURSOR_LIGHTHOUSE, VHM_RECT, (_settings.game_creation.landscape == LT_TROPIC) ? PlaceProc_DesertArea : PlaceProc_LightHouse);
|
||||
}
|
||||
|
||||
static void EditorTerraformClick_Transmitter(Window *w)
|
||||
|
@ -615,7 +615,7 @@ static void ResetLandscapeConfirmationCallback(Window *w, bool confirmed)
|
|||
struct ScenarioEditorLandscapeGenerationWindow : Window {
|
||||
ScenarioEditorLandscapeGenerationWindow(const WindowDesc *desc, WindowNumber window_number) : Window(desc, window_number)
|
||||
{
|
||||
this->widget[ETTW_PLACE_DESERT_LIGHTHOUSE].tooltips = (_opt.landscape == LT_TROPIC) ? STR_028F_DEFINE_DESERT_AREA : STR_028D_PLACE_LIGHTHOUSE;
|
||||
this->widget[ETTW_PLACE_DESERT_LIGHTHOUSE].tooltips = (_settings.game_creation.landscape == LT_TROPIC) ? STR_028F_DEFINE_DESERT_AREA : STR_028D_PLACE_LIGHTHOUSE;
|
||||
this->FindWindowPlacementAndResize(desc);
|
||||
}
|
||||
|
||||
|
|
10
src/tgp.cpp
10
src/tgp.cpp
|
@ -211,10 +211,10 @@ static const amplitude_t _amplitudes_by_smoothness_and_frequency[4][12] = {
|
|||
{1500, 1000, 1200, 1000, 500, 32, 20, 0, 0, 0, 0, 0},
|
||||
};
|
||||
|
||||
/** Desired water percentage (100% == 1024) - indexed by _opt.diff.quantity_sea_lakes */
|
||||
/** Desired water percentage (100% == 1024) - indexed by _settings.difficulty.quantity_sea_lakes */
|
||||
static const amplitude_t _water_percent[4] = {20, 80, 250, 400};
|
||||
|
||||
/** Desired maximum height - indexed by _opt.diff.terrain_type */
|
||||
/** Desired maximum height - indexed by _settings.difficulty.terrain_type */
|
||||
static const int8 _max_height[4] = {
|
||||
6, ///< Very flat
|
||||
9, ///< Flat
|
||||
|
@ -402,7 +402,7 @@ static void HeightMapSineTransform(height_t h_min, height_t h_max)
|
|||
/* Transform height into 0..1 space */
|
||||
fheight = (double)(*h - h_min) / (double)(h_max - h_min);
|
||||
/* Apply sine transform depending on landscape type */
|
||||
switch(_opt.landscape) {
|
||||
switch(_settings.game_creation.landscape) {
|
||||
case LT_TOYLAND:
|
||||
case LT_TEMPERATE:
|
||||
/* Move and scale 0..1 into -1..+1 */
|
||||
|
@ -661,8 +661,8 @@ static void HeightMapSmoothSlopes(height_t dh_max)
|
|||
* - height histogram redistribution by sine wave transform */
|
||||
static void HeightMapNormalize()
|
||||
{
|
||||
const amplitude_t water_percent = _water_percent[_opt.diff.quantity_sea_lakes];
|
||||
const height_t h_max_new = I2H(_max_height[_opt.diff.terrain_type]);
|
||||
const amplitude_t water_percent = _water_percent[_settings.difficulty.quantity_sea_lakes];
|
||||
const height_t h_max_new = I2H(_max_height[_settings.difficulty.terrain_type]);
|
||||
const height_t roughness = 7 + 3 * _settings.game_creation.tgen_smoothness;
|
||||
|
||||
HeightMapAdjustWaterLevel(water_percent, h_max_new);
|
||||
|
|
|
@ -197,7 +197,7 @@ struct Town : PoolItem<Town, TownID, &_Town_pool> {
|
|||
inline uint16 MaxTownNoise() const {
|
||||
if (this->population == 0) return 0; // no population? no noise
|
||||
|
||||
return ((this->population / _settings.economy.town_noise_population[_opt.diff.town_council_tolerance]) + 3);
|
||||
return ((this->population / _settings.economy.town_noise_population[_settings.difficulty.town_council_tolerance]) + 3);
|
||||
}
|
||||
};
|
||||
|
||||
|
|
|
@ -596,7 +596,7 @@ static void GetAcceptedCargo_Town(TileIndex tile, AcceptedCargo ac)
|
|||
if (callback != CALLBACK_FAILED) {
|
||||
if (accepts[0] != CT_INVALID) ac[accepts[0]] = GB(callback, 0, 4);
|
||||
if (accepts[1] != CT_INVALID) ac[accepts[1]] = GB(callback, 4, 4);
|
||||
if (_opt.landscape != LT_TEMPERATE && HasBit(callback, 12)) {
|
||||
if (_settings.game_creation.landscape != LT_TEMPERATE && HasBit(callback, 12)) {
|
||||
/* The 'S' bit indicates food instead of goods */
|
||||
ac[CT_FOOD] = GB(callback, 8, 4);
|
||||
} else {
|
||||
|
@ -1367,9 +1367,9 @@ static bool CreateTownName(uint32 *townnameparts)
|
|||
* the other towns may take considerable amount of time (10000 is
|
||||
* too much). */
|
||||
int tries = 1000;
|
||||
bool grf = (_opt.town_name >= _nb_orig_names);
|
||||
uint32 grfid = grf ? GetGRFTownNameId(_opt.town_name - _nb_orig_names) : 0;
|
||||
uint16 townnametype = grf ? GetGRFTownNameType(_opt.town_name - _nb_orig_names) : SPECSTR_TOWNNAME_START + _opt.town_name;
|
||||
bool grf = (_settings.game_creation.town_name >= _nb_orig_names);
|
||||
uint32 grfid = grf ? GetGRFTownNameId(_settings.game_creation.town_name - _nb_orig_names) : 0;
|
||||
uint16 townnametype = grf ? GetGRFTownNameType(_settings.game_creation.town_name - _nb_orig_names) : SPECSTR_TOWNNAME_START + _settings.game_creation.town_name;
|
||||
|
||||
assert(townnameparts != NULL);
|
||||
|
||||
|
@ -1453,14 +1453,14 @@ static void DoCreateTown(Town *t, TileIndex tile, uint32 townnameparts, TownSize
|
|||
t->exclusive_counter = 0;
|
||||
t->statues = 0;
|
||||
|
||||
if (_opt.town_name < _nb_orig_names) {
|
||||
if (_settings.game_creation.town_name < _nb_orig_names) {
|
||||
/* Original town name */
|
||||
t->townnamegrfid = 0;
|
||||
t->townnametype = SPECSTR_TOWNNAME_START + _opt.town_name;
|
||||
t->townnametype = SPECSTR_TOWNNAME_START + _settings.game_creation.town_name;
|
||||
} else {
|
||||
/* Newgrf town name */
|
||||
t->townnamegrfid = GetGRFTownNameId(_opt.town_name - _nb_orig_names);
|
||||
t->townnametype = GetGRFTownNameType(_opt.town_name - _nb_orig_names);
|
||||
t->townnamegrfid = GetGRFTownNameId(_settings.game_creation.town_name - _nb_orig_names);
|
||||
t->townnametype = GetGRFTownNameType(_settings.game_creation.town_name - _nb_orig_names);
|
||||
}
|
||||
t->townnameparts = townnameparts;
|
||||
|
||||
|
@ -1585,7 +1585,7 @@ static const byte _num_initial_towns[4] = {5, 11, 23, 46}; // very low, low, no
|
|||
bool GenerateTowns()
|
||||
{
|
||||
uint num = 0;
|
||||
uint n = ScaleByMapSize(_num_initial_towns[_opt.diff.number_towns] + (Random() & 7));
|
||||
uint n = ScaleByMapSize(_num_initial_towns[_settings.difficulty.number_towns] + (Random() & 7));
|
||||
uint num_cities = _settings.economy.larger_towns == 0 ? 0 : n / _settings.economy.larger_towns;
|
||||
|
||||
SetGeneratingWorldProgress(GWP_TOWN, n);
|
||||
|
@ -1879,8 +1879,8 @@ static bool BuildTownHouse(Town *t, TileIndex tile)
|
|||
HouseZonesBits rad = GetTownRadiusGroup(t, tile);
|
||||
|
||||
/* Above snow? */
|
||||
int land = _opt.landscape;
|
||||
if (land == LT_ARCTIC && z >= _opt.snow_line) land = -1;
|
||||
int land = _settings.game_creation.landscape;
|
||||
if (land == LT_ARCTIC && z >= _settings.game_creation.snow_line) land = -1;
|
||||
|
||||
uint bitmask = (1 << rad) + (1 << (land + 12));
|
||||
|
||||
|
@ -2352,10 +2352,10 @@ static void UpdateTownGrowRate(Town *t)
|
|||
if (n == 0 && !Chance16(1, 12)) return;
|
||||
}
|
||||
|
||||
if (_opt.landscape == LT_ARCTIC) {
|
||||
if (_settings.game_creation.landscape == LT_ARCTIC) {
|
||||
if (TilePixelHeight(t->xy) >= GetSnowLine() && t->act_food == 0 && t->population > 90)
|
||||
return;
|
||||
} else if (_opt.landscape == LT_TROPIC) {
|
||||
} else if (_settings.game_creation.landscape == LT_TROPIC) {
|
||||
if (GetTropicZone(t->xy) == TROPICZONE_DESERT && (t->act_food == 0 || t->act_water == 0) && t->population > 60)
|
||||
return;
|
||||
}
|
||||
|
@ -2524,7 +2524,7 @@ bool CheckforTownRating(uint32 flags, Town *t, byte type)
|
|||
* owned by a town no removal if rating is lower than ... depends now on
|
||||
* difficulty setting. Minimum town rating selected by difficulty level
|
||||
*/
|
||||
int modemod = _default_rating_settings[_opt.diff.town_council_tolerance][type];
|
||||
int modemod = _default_rating_settings[_settings.difficulty.town_council_tolerance][type];
|
||||
|
||||
if (GetRating(t) < 16 + modemod && !(flags & DC_NO_TOWN_RATING)) {
|
||||
SetDParam(0, t->index);
|
||||
|
|
|
@ -2474,7 +2474,7 @@ static Track ChooseTrainTrack(Vehicle *v, TileIndex tile, DiagDirection enterdir
|
|||
|
||||
static bool CheckReverseTrain(Vehicle *v)
|
||||
{
|
||||
if (_opt.diff.line_reverse_mode != 0 ||
|
||||
if (_settings.difficulty.line_reverse_mode != 0 ||
|
||||
v->u.rail.track == TRACK_BIT_DEPOT || v->u.rail.track == TRACK_BIT_WORMHOLE ||
|
||||
!(v->direction & 1)) {
|
||||
return false;
|
||||
|
@ -3246,7 +3246,7 @@ static void HandleBrokenTrain(Vehicle *v)
|
|||
InvalidateWindow(WC_VEHICLE_DETAILS, v->index);
|
||||
|
||||
if (!PlayVehicleSound(v, VSE_BREAKDOWN)) {
|
||||
SndPlayVehicleFx((_opt.landscape != LT_TOYLAND) ?
|
||||
SndPlayVehicleFx((_settings.game_creation.landscape != LT_TOYLAND) ?
|
||||
SND_10_TRAIN_BREAKDOWN : SND_3A_COMEDY_BREAKDOWN_2, v);
|
||||
}
|
||||
|
||||
|
|
|
@ -112,7 +112,7 @@ static void PlantTreesOnTile(TileIndex tile, TreeType treetype, uint count, uint
|
|||
*/
|
||||
static TreeType GetRandomTreeType(TileIndex tile, uint seed)
|
||||
{
|
||||
switch (_opt.landscape) {
|
||||
switch (_settings.game_creation.landscape) {
|
||||
case LT_TEMPERATE:
|
||||
return (TreeType)(seed * TREE_COUNT_TEMPERATE / 256 + TREE_TEMPERATE);
|
||||
|
||||
|
@ -259,7 +259,7 @@ void PlaceTreesRandomly()
|
|||
j = GetTileZ(tile) / TILE_HEIGHT * 2;
|
||||
while (j--) {
|
||||
/* Above snowline more trees! */
|
||||
if (_opt.landscape == LT_ARCTIC && ht > GetSnowLine()) {
|
||||
if (_settings.game_creation.landscape == LT_ARCTIC && ht > GetSnowLine()) {
|
||||
PlaceTreeAtSameHeight(tile, ht);
|
||||
PlaceTreeAtSameHeight(tile, ht);
|
||||
};
|
||||
|
@ -270,7 +270,7 @@ void PlaceTreesRandomly()
|
|||
} while (--i);
|
||||
|
||||
/* place extra trees at rainforest area */
|
||||
if (_opt.landscape == LT_TROPIC) {
|
||||
if (_settings.game_creation.landscape == LT_TROPIC) {
|
||||
i = ScaleByMapSize(15000);
|
||||
|
||||
do {
|
||||
|
@ -298,16 +298,16 @@ void GenerateTrees()
|
|||
|
||||
if (_settings.game_creation.tree_placer == TP_NONE) return;
|
||||
|
||||
if (_opt.landscape != LT_TOYLAND) PlaceMoreTrees();
|
||||
if (_settings.game_creation.landscape != LT_TOYLAND) PlaceMoreTrees();
|
||||
|
||||
switch (_settings.game_creation.tree_placer) {
|
||||
case TP_ORIGINAL: i = _opt.landscape == LT_ARCTIC ? 15 : 6; break;
|
||||
case TP_IMPROVED: i = _opt.landscape == LT_ARCTIC ? 4 : 2; break;
|
||||
case TP_ORIGINAL: i = _settings.game_creation.landscape == LT_ARCTIC ? 15 : 6; break;
|
||||
case TP_IMPROVED: i = _settings.game_creation.landscape == LT_ARCTIC ? 4 : 2; break;
|
||||
default: NOT_REACHED(); return;
|
||||
}
|
||||
|
||||
total = ScaleByMapSize(1000);
|
||||
if (_opt.landscape == LT_TROPIC) total += ScaleByMapSize(15000);
|
||||
if (_settings.game_creation.landscape == LT_TROPIC) total += ScaleByMapSize(15000);
|
||||
total *= i;
|
||||
SetGeneratingWorldProgress(GWP_TREE, total);
|
||||
|
||||
|
@ -332,7 +332,7 @@ CommandCost CmdPlantTree(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
|
|||
|
||||
if (p2 >= MapSize()) return CMD_ERROR;
|
||||
/* Check the tree type. It can be random or some valid value within the current climate */
|
||||
if (p1 != (uint)-1 && p1 - _tree_base_by_landscape[_opt.landscape] >= _tree_count_by_landscape[_opt.landscape]) return CMD_ERROR;
|
||||
if (p1 != (uint)-1 && p1 - _tree_base_by_landscape[_settings.game_creation.landscape] >= _tree_count_by_landscape[_settings.game_creation.landscape]) return CMD_ERROR;
|
||||
|
||||
// make sure sx,sy are smaller than ex,ey
|
||||
ex = TileX(tile);
|
||||
|
@ -626,7 +626,7 @@ static void TileLoop_Trees(TileIndex tile)
|
|||
if (GetTreeGround(tile) == TREE_GROUND_SHORE) {
|
||||
TileLoop_Water(tile);
|
||||
} else {
|
||||
switch (_opt.landscape) {
|
||||
switch (_settings.game_creation.landscape) {
|
||||
case LT_TROPIC: TileLoopTreesDesert(tile); break;
|
||||
case LT_ARCTIC: TileLoopTreesAlps(tile); break;
|
||||
}
|
||||
|
@ -652,7 +652,7 @@ static void TileLoop_Trees(TileIndex tile)
|
|||
|
||||
switch (GetTreeGrowth(tile)) {
|
||||
case 3: /* regular sized tree */
|
||||
if (_opt.landscape == LT_TROPIC &&
|
||||
if (_settings.game_creation.landscape == LT_TROPIC &&
|
||||
GetTreeType(tile) != TREE_CACTUS &&
|
||||
GetTropicZone(tile) == TROPICZONE_DESERT) {
|
||||
AddTreeGrowth(tile, 1);
|
||||
|
@ -704,7 +704,7 @@ static void TileLoop_Trees(TileIndex tile)
|
|||
case TREE_GROUND_GRASS: MakeClear(tile, CLEAR_GRASS, GetTreeDensity(tile)); break;
|
||||
case TREE_GROUND_ROUGH: MakeClear(tile, CLEAR_ROUGH, 3); break;
|
||||
default: // snow or desert
|
||||
MakeClear(tile, _opt.landscape == LT_TROPIC ? CLEAR_DESERT : CLEAR_SNOW, GetTreeDensity(tile));
|
||||
MakeClear(tile, _settings.game_creation.landscape == LT_TROPIC ? CLEAR_DESERT : CLEAR_SNOW, GetTreeDensity(tile));
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -725,7 +725,7 @@ void OnTick_Trees()
|
|||
TreeType tree;
|
||||
|
||||
/* place a tree at a random rainforest spot */
|
||||
if (_opt.landscape == LT_TROPIC &&
|
||||
if (_settings.game_creation.landscape == LT_TROPIC &&
|
||||
(r = Random(), tile = RandomTileSeed(r), GetTropicZone(tile) == TROPICZONE_RAINFOREST) &&
|
||||
CanPlantTreesOnTile(tile, false) &&
|
||||
(tree = GetRandomTreeType(tile, GB(r, 24, 8))) != TREE_INVALID) {
|
||||
|
|
|
@ -74,8 +74,8 @@ public:
|
|||
|
||||
this->DrawWidgets();
|
||||
|
||||
int i = this->base = _tree_base_by_landscape[_opt.landscape];
|
||||
int count = this->count = _tree_count_by_landscape[_opt.landscape];
|
||||
int i = this->base = _tree_base_by_landscape[_settings.game_creation.landscape];
|
||||
int count = this->count = _tree_count_by_landscape[_settings.game_creation.landscape];
|
||||
|
||||
int x = 18;
|
||||
int y = 54;
|
||||
|
|
|
@ -1200,7 +1200,7 @@ static void AnimateTile_TunnelBridge(TileIndex tile)
|
|||
static void TileLoop_TunnelBridge(TileIndex tile)
|
||||
{
|
||||
bool snow_or_desert = HasTunnelBridgeSnowOrDesert(tile);
|
||||
switch (_opt.landscape) {
|
||||
switch (_settings.game_creation.landscape) {
|
||||
case LT_ARCTIC:
|
||||
if (snow_or_desert != (GetTileZ(tile) > GetSnowLine())) {
|
||||
SetTunnelBridgeSnowOrDesert(tile, !snow_or_desert);
|
||||
|
|
|
@ -375,11 +375,11 @@ static bool IsRadioTowerNearby(TileIndex tile)
|
|||
|
||||
void GenerateUnmovables()
|
||||
{
|
||||
if (_opt.landscape == LT_TOYLAND) return;
|
||||
if (_settings.game_creation.landscape == LT_TOYLAND) return;
|
||||
|
||||
/* add radio tower */
|
||||
int radiotowser_to_build = ScaleByMapSize(15); // maximum number of radio towers on the map
|
||||
int lighthouses_to_build = _opt.landscape == LT_TROPIC ? 0 : ScaleByMapSize1D((Random() & 3) + 7);
|
||||
int lighthouses_to_build = _settings.game_creation.landscape == LT_TROPIC ? 0 : ScaleByMapSize1D((Random() & 3) + 7);
|
||||
SetGeneratingWorldProgress(GWP_UNMOVABLE, radiotowser_to_build + lighthouses_to_build);
|
||||
|
||||
for (uint i = ScaleByMapSize(1000); i != 0; i--) {
|
||||
|
@ -395,7 +395,7 @@ void GenerateUnmovables()
|
|||
}
|
||||
}
|
||||
|
||||
if (_opt.landscape == LT_TROPIC) return;
|
||||
if (_settings.game_creation.landscape == LT_TROPIC) return;
|
||||
|
||||
/* add lighthouses */
|
||||
uint maxx = MapMaxX();
|
||||
|
|
|
@ -127,7 +127,7 @@ bool Vehicle::NeedsServicing() const
|
|||
{
|
||||
if (this->vehstatus & (VS_STOPPED | VS_CRASHED)) return false;
|
||||
|
||||
if (_settings.order.no_servicing_if_no_breakdowns && _opt.diff.vehicle_breakdowns == 0) {
|
||||
if (_settings.order.no_servicing_if_no_breakdowns && _settings.difficulty.vehicle_breakdowns == 0) {
|
||||
/* Vehicles set for autoreplacing needs to go to a depot even if breakdowns are turned off.
|
||||
* Note: If servicing is enabled, we postpone replacement till next service. */
|
||||
return EngineHasReplacementForPlayer(GetPlayer(this->owner), this->engine_type, this->group_id);
|
||||
|
@ -913,7 +913,7 @@ void CheckVehicleBreakdown(Vehicle *v)
|
|||
if ((rel_old >> 8) != (rel >> 8)) InvalidateWindow(WC_VEHICLE_DETAILS, v->index);
|
||||
|
||||
if (v->breakdown_ctr != 0 || v->vehstatus & VS_STOPPED ||
|
||||
_opt.diff.vehicle_breakdowns < 1 ||
|
||||
_settings.difficulty.vehicle_breakdowns < 1 ||
|
||||
v->cur_speed < 5 || _game_mode == GM_MENU) {
|
||||
return;
|
||||
}
|
||||
|
@ -930,7 +930,7 @@ void CheckVehicleBreakdown(Vehicle *v)
|
|||
if (v->type == VEH_SHIP) rel += 0x6666;
|
||||
|
||||
/* reduced breakdowns? */
|
||||
if (_opt.diff.vehicle_breakdowns == 1) rel += 0x6666;
|
||||
if (_settings.difficulty.vehicle_breakdowns == 1) rel += 0x6666;
|
||||
|
||||
/* check if to break down */
|
||||
if (_breakdown_chance[(uint)min(rel, 0xffff) >> 10] <= v->breakdown_chance) {
|
||||
|
|
Loading…
Reference in New Issue