(svn r24786) -Codechange: Add SettingsProfile enum for difficulty profiles and highscore tables.

pull/155/head
frosch 12 years ago
parent 18b97fa062
commit 903294f2bb

@ -80,13 +80,13 @@ int AIConfig::GetSetting(const char *name) const
{ {
if (this->info == NULL) { if (this->info == NULL) {
SettingValueList::const_iterator it = this->settings.find(name); SettingValueList::const_iterator it = this->settings.find(name);
if (it == this->settings.end() || GetGameSettings().difficulty.diff_level != 3) { if (it == this->settings.end() || GetGameSettings().difficulty.diff_level != SP_CUSTOM) {
assert(strcmp("start_date", name) == 0); assert(strcmp("start_date", name) == 0);
switch (GetGameSettings().difficulty.diff_level) { switch (GetGameSettings().difficulty.diff_level) {
case 0: return AI::START_NEXT_EASY; case SP_EASY: return AI::START_NEXT_EASY;
case 1: return AI::START_NEXT_MEDIUM; case SP_MEDIUM: return AI::START_NEXT_MEDIUM;
case 2: return AI::START_NEXT_HARD; case SP_HARD: return AI::START_NEXT_HARD;
case 3: return AI::START_NEXT_MEDIUM; case SP_CUSTOM: return AI::START_NEXT_MEDIUM;
default: NOT_REACHED(); default: NOT_REACHED();
} }
} }

@ -422,12 +422,12 @@ struct AISettingsWindow : public Window {
void CheckDifficultyLevel() void CheckDifficultyLevel()
{ {
if (_game_mode == GM_MENU) { if (_game_mode == GM_MENU) {
if (_settings_newgame.difficulty.diff_level != 3) { if (_settings_newgame.difficulty.diff_level != SP_CUSTOM) {
_settings_newgame.difficulty.diff_level = 3; _settings_newgame.difficulty.diff_level = SP_CUSTOM;
ShowErrorMessage(STR_WARNING_DIFFICULTY_TO_CUSTOM, INVALID_STRING_ID, WL_WARNING); ShowErrorMessage(STR_WARNING_DIFFICULTY_TO_CUSTOM, INVALID_STRING_ID, WL_WARNING);
} }
} else if (_settings_game.difficulty.diff_level != 3) { } else if (_settings_game.difficulty.diff_level != SP_CUSTOM) {
IConsoleSetSetting("difficulty.diff_level", 3); IConsoleSetSetting("difficulty.diff_level", SP_CUSTOM);
} }
} }

@ -20,7 +20,7 @@
#include "core/sort_func.hpp" #include "core/sort_func.hpp"
#include "debug.h" #include "debug.h"
HighScore _highscore_table[5][5]; // 4 difficulty-settings (+ network); top 5 HighScore _highscore_table[SP_HIGHSCORE_END][5]; ///< various difficulty-settings; top 5
char *_highscore_file; ///< The file to store the highscore data in. char *_highscore_file; ///< The file to store the highscore data in.
static const StringID _endgame_perf_titles[] = { static const StringID _endgame_perf_titles[] = {
@ -82,8 +82,10 @@ static int CDECL HighScoreSorter(const Company * const *a, const Company * const
return (*b)->old_economy[0].performance_history - (*a)->old_economy[0].performance_history; return (*b)->old_economy[0].performance_history - (*a)->old_economy[0].performance_history;
} }
/* Save the highscores in a network game when it has ended */ /**
#define LAST_HS_ITEM lengthof(_highscore_table) - 1 * Save the highscores in a network game when it has ended
* @return Position of the local company in the highscore list.
*/
int8 SaveHighScoreValueNetwork() int8 SaveHighScoreValueNetwork()
{ {
const Company *c; const Company *c;
@ -99,11 +101,11 @@ int8 SaveHighScoreValueNetwork()
{ {
uint i; uint i;
memset(_highscore_table[LAST_HS_ITEM], 0, sizeof(_highscore_table[0])); memset(_highscore_table[SP_MULTIPLAYER], 0, sizeof(_highscore_table[SP_MULTIPLAYER]));
/* Copy over Top5 companies */ /* Copy over Top5 companies */
for (i = 0; i < lengthof(_highscore_table[LAST_HS_ITEM]) && i < count; i++) { for (i = 0; i < lengthof(_highscore_table[SP_MULTIPLAYER]) && i < count; i++) {
HighScore *hs = &_highscore_table[LAST_HS_ITEM][i]; HighScore *hs = &_highscore_table[SP_MULTIPLAYER][i];
SetDParam(0, cl[i]->index); SetDParam(0, cl[i]->index);
SetDParam(1, cl[i]->index); SetDParam(1, cl[i]->index);
@ -129,7 +131,7 @@ void SaveToHighScore()
uint i; uint i;
HighScore *hs; HighScore *hs;
for (i = 0; i < LAST_HS_ITEM; i++) { // don't save network highscores for (i = 0; i < SP_SAVED_HIGHSCORE_END; i++) {
for (hs = _highscore_table[i]; hs != endof(_highscore_table[i]); hs++) { for (hs = _highscore_table[i]; hs != endof(_highscore_table[i]); hs++) {
/* First character is a command character, so strlen will fail on that */ /* First character is a command character, so strlen will fail on that */
byte length = min(sizeof(hs->company), StrEmpty(hs->company) ? 0 : (int)strlen(&hs->company[1]) + 1); byte length = min(sizeof(hs->company), StrEmpty(hs->company) ? 0 : (int)strlen(&hs->company[1]) + 1);
@ -139,7 +141,7 @@ void SaveToHighScore()
fwrite(&hs->score, sizeof(hs->score), 1, fp) != 1 || fwrite(&hs->score, sizeof(hs->score), 1, fp) != 1 ||
fwrite(" ", 2, 1, fp) != 1) { // XXX - placeholder for hs->title, not saved anymore; compatibility fwrite(" ", 2, 1, fp) != 1) { // XXX - placeholder for hs->title, not saved anymore; compatibility
DEBUG(misc, 1, "Could not save highscore."); DEBUG(misc, 1, "Could not save highscore.");
i = LAST_HS_ITEM; i = SP_SAVED_HIGHSCORE_END;
break; break;
} }
} }
@ -159,7 +161,7 @@ void LoadFromHighScore()
uint i; uint i;
HighScore *hs; HighScore *hs;
for (i = 0; i < LAST_HS_ITEM; i++) { // don't load network highscores for (i = 0; i < SP_SAVED_HIGHSCORE_END; i++) {
for (hs = _highscore_table[i]; hs != endof(_highscore_table[i]); hs++) { for (hs = _highscore_table[i]; hs != endof(_highscore_table[i]); hs++) {
byte length; byte length;
if (fread(&length, sizeof(length), 1, fp) != 1 || if (fread(&length, sizeof(length), 1, fp) != 1 ||
@ -167,7 +169,7 @@ void LoadFromHighScore()
fread(&hs->score, sizeof(hs->score), 1, fp) != 1 || fread(&hs->score, sizeof(hs->score), 1, fp) != 1 ||
fseek(fp, 2, SEEK_CUR) == -1) { // XXX - placeholder for hs->title, not saved anymore; compatibility fseek(fp, 2, SEEK_CUR) == -1) { // XXX - placeholder for hs->title, not saved anymore; compatibility
DEBUG(misc, 1, "Highscore corrupted"); DEBUG(misc, 1, "Highscore corrupted");
i = LAST_HS_ITEM; i = SP_SAVED_HIGHSCORE_END;
break; break;
} }
*lastof(hs->company) = '\0'; *lastof(hs->company) = '\0';

@ -14,6 +14,7 @@
#include "strings_type.h" #include "strings_type.h"
#include "company_type.h" #include "company_type.h"
#include "settings_type.h"
struct HighScore { struct HighScore {
char company[100]; char company[100];
@ -21,7 +22,7 @@ struct HighScore {
uint16 score; ///< do NOT change type, will break hs.dat uint16 score; ///< do NOT change type, will break hs.dat
}; };
extern HighScore _highscore_table[5][5]; // 4 difficulty-settings (+ network); top 5 extern HighScore _highscore_table[SP_HIGHSCORE_END][5];
void SaveToHighScore(); void SaveToHighScore();
void LoadFromHighScore(); void LoadFromHighScore();

@ -103,10 +103,10 @@ struct EndGameWindow : EndGameHighScoreBaseWindow {
} }
} }
/* In a network game show the endscores of the custom difficulty 'network' which is the last one /* In a network game show the endscores of the custom difficulty 'network' which is
* as well as generate a TOP5 of that game, and not an all-time top5. */ * a TOP5 of that game, and not an all-time TOP5. */
if (_networking) { if (_networking) {
this->window_number = lengthof(_highscore_table) - 1; this->window_number = SP_MULTIPLAYER;
this->rank = SaveHighScoreValueNetwork(); this->rank = SaveHighScoreValueNetwork();
} else { } else {
/* in single player _local company is always valid */ /* in single player _local company is always valid */

@ -87,7 +87,7 @@ void ScriptConfig::ClearConfigList()
int ScriptConfig::GetSetting(const char *name) const int ScriptConfig::GetSetting(const char *name) const
{ {
/* Return default values if the difficulty is not set to Custom */ /* Return default values if the difficulty is not set to Custom */
if (GetGameSettings().difficulty.diff_level != 3) { if (GetGameSettings().difficulty.diff_level != SP_CUSTOM) {
return this->info->GetSettingDefaultValue(name); return this->info->GetSettingDefaultValue(name);
} }

@ -294,10 +294,10 @@ int ScriptInfo::GetSettingDefaultValue(const char *name) const
if (strcmp((*it).name, name) != 0) continue; if (strcmp((*it).name, name) != 0) continue;
/* The default value depends on the difficulty level */ /* The default value depends on the difficulty level */
switch (GetGameSettings().difficulty.diff_level) { switch (GetGameSettings().difficulty.diff_level) {
case 0: return (*it).easy_value; case SP_EASY: return (*it).easy_value;
case 1: return (*it).medium_value; case SP_MEDIUM: return (*it).medium_value;
case 2: return (*it).hard_value; case SP_HARD: return (*it).hard_value;
case 3: return (*it).custom_value; case SP_CUSTOM: return (*it).custom_value;
default: NOT_REACHED(); default: NOT_REACHED();
} }
} }

@ -1032,7 +1032,7 @@ static bool InvalidateCompanyInfrastructureWindow(int32 p1)
* R: area restructuring (0 = permissive, 2 = hostile) * R: area restructuring (0 = permissive, 2 = hostile)
* S: the difficulty level * S: the difficulty level
*/ */
static const DifficultySettings _default_game_diff[3] = { /* static const DifficultySettings _default_game_diff[SP_END] = { /*
A, C, D, E, F, G, H, J, K, L, M, N, O, P, Q, R, S*/ A, C, D, E, F, G, H, J, K, L, M, N, O, P, Q, R, S*/
{2, 2, 4, 300000, 2, 0, 2, 1, 2, 0, 1, 0, 0, 0, 0, 0, 0}, ///< easy {2, 2, 4, 300000, 2, 0, 2, 1, 2, 0, 1, 0, 0, 0, 0, 0, 0}, ///< easy
{4, 2, 3, 150000, 3, 1, 3, 2, 1, 1, 2, 1, 1, 1, 1, 1, 1}, ///< medium {4, 2, 3, 150000, 3, 1, 3, 2, 1, 1, 2, 1, 1, 1, 1, 1, 1}, ///< medium
@ -1041,12 +1041,11 @@ static const DifficultySettings _default_game_diff[3] = { /*
void SetDifficultyLevel(int mode, DifficultySettings *gm_opt) void SetDifficultyLevel(int mode, DifficultySettings *gm_opt)
{ {
assert(mode <= 3); if (mode != SP_CUSTOM) {
assert(mode >= SP_BEGIN && mode < SP_END);
if (mode != 3) {
*gm_opt = _default_game_diff[mode]; *gm_opt = _default_game_diff[mode];
} else { } else {
gm_opt->diff_level = 3; gm_opt->diff_level = SP_CUSTOM;
} }
} }
@ -1054,7 +1053,7 @@ void SetDifficultyLevel(int mode, DifficultySettings *gm_opt)
static void ValidateSettings() static void ValidateSettings()
{ {
/* Force the difficulty levels to correct values if they are invalid. */ /* Force the difficulty levels to correct values if they are invalid. */
if (_settings_newgame.difficulty.diff_level != 3) { if (_settings_newgame.difficulty.diff_level != SP_CUSTOM) {
SetDifficultyLevel(_settings_newgame.difficulty.diff_level, &_settings_newgame.difficulty); SetDifficultyLevel(_settings_newgame.difficulty.diff_level, &_settings_newgame.difficulty);
} }
@ -1077,13 +1076,13 @@ static bool DifficultyReset(int32 level)
static bool DifficultyChange(int32) static bool DifficultyChange(int32)
{ {
if (_game_mode == GM_MENU) { if (_game_mode == GM_MENU) {
if (_settings_newgame.difficulty.diff_level != 3) { if (_settings_newgame.difficulty.diff_level != SP_CUSTOM) {
ShowErrorMessage(STR_WARNING_DIFFICULTY_TO_CUSTOM, INVALID_STRING_ID, WL_WARNING); ShowErrorMessage(STR_WARNING_DIFFICULTY_TO_CUSTOM, INVALID_STRING_ID, WL_WARNING);
_settings_newgame.difficulty.diff_level = 3; _settings_newgame.difficulty.diff_level = SP_CUSTOM;
} }
SetWindowClassesDirty(WC_SELECT_GAME); SetWindowClassesDirty(WC_SELECT_GAME);
} else { } else {
_settings_game.difficulty.diff_level = 3; _settings_game.difficulty.diff_level = SP_CUSTOM;
} }
/* If we are a network-client, update the difficult setting (if it is open). /* If we are a network-client, update the difficult setting (if it is open).

@ -20,6 +20,23 @@
#include "zoom_type.h" #include "zoom_type.h"
#include "openttd.h" #include "openttd.h"
/** Settings profiles and highscore tables. */
enum SettingsProfile {
SP_BEGIN = 0,
SP_EASY = SP_BEGIN, ///< Easy difficulty.
SP_MEDIUM, ///< Medium difficulty.
SP_HARD, ///< Hard difficulty.
SP_END, ///< End of setting profiles.
SP_CUSTOM = SP_END, ///< No profile, special "custom" highscore.
SP_SAVED_HIGHSCORE_END, ///< End of saved highscore tables.
SP_MULTIPLAYER = SP_SAVED_HIGHSCORE_END, ///< Special "multiplayer" highscore. Not saved, always specific to the current game.
SP_HIGHSCORE_END, ///< End of highscore tables.
};
/** Available industry map generation densities. */ /** Available industry map generation densities. */
enum IndustryDensity { enum IndustryDensity {
ID_FUND_ONLY, ///< The game does not build industries. ID_FUND_ONLY, ///< The game does not build industries.
@ -50,7 +67,7 @@ struct DifficultySettings {
byte line_reverse_mode; ///< reversing at stations or not byte line_reverse_mode; ///< reversing at stations or not
byte disasters; ///< are disasters enabled byte disasters; ///< are disasters enabled
byte town_council_tolerance; ///< minimum required town ratings to be allowed to demolish stuff byte town_council_tolerance; ///< minimum required town ratings to be allowed to demolish stuff
byte diff_level; ///< the difficulty level byte diff_level; ///< the difficulty level. @see SettingsProfile
}; };
/** Settings related to the GUI and other stuff that is not saved in the savegame. */ /** Settings related to the GUI and other stuff that is not saved in the savegame. */

@ -92,9 +92,9 @@ from = 4
base = GameSettings base = GameSettings
var = difficulty.diff_level var = difficulty.diff_level
type = SLE_UINT8 type = SLE_UINT8
def = 3 def = SP_CUSTOM
min = 0 min = SP_EASY
max = 3 max = SP_CUSTOM
cat = SC_BASIC cat = SC_BASIC
[SDT_OMANY] [SDT_OMANY]

Loading…
Cancel
Save