Changeset - r19831:07fe1952f9c0
[Not reviewed]
master
0 10 0
frosch - 11 years ago 2012-12-05 19:34:45
frosch@openttd.org
(svn r24786) -Codechange: Add SettingsProfile enum for difficulty profiles and highscore tables.
10 files changed with 60 insertions and 41 deletions:
0 comments (0 inline, 0 general)
src/ai/ai_config.cpp
Show inline comments
 
@@ -80,13 +80,13 @@ int AIConfig::GetSetting(const char *nam
 
{
 
	if (this->info == NULL) {
 
		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);
 
			switch (GetGameSettings().difficulty.diff_level) {
 
				case 0: return AI::START_NEXT_EASY;
 
				case 1: return AI::START_NEXT_MEDIUM;
 
				case 2: return AI::START_NEXT_HARD;
 
				case 3: return AI::START_NEXT_MEDIUM;
 
				case SP_EASY:   return AI::START_NEXT_EASY;
 
				case SP_MEDIUM: return AI::START_NEXT_MEDIUM;
 
				case SP_HARD:   return AI::START_NEXT_HARD;
 
				case SP_CUSTOM: return AI::START_NEXT_MEDIUM;
 
				default: NOT_REACHED();
 
			}
 
		}
src/ai/ai_gui.cpp
Show inline comments
 
@@ -422,12 +422,12 @@ struct AISettingsWindow : public Window 
 
	void CheckDifficultyLevel()
 
	{
 
		if (_game_mode == GM_MENU) {
 
			if (_settings_newgame.difficulty.diff_level != 3) {
 
				_settings_newgame.difficulty.diff_level = 3;
 
			if (_settings_newgame.difficulty.diff_level != SP_CUSTOM) {
 
				_settings_newgame.difficulty.diff_level = SP_CUSTOM;
 
				ShowErrorMessage(STR_WARNING_DIFFICULTY_TO_CUSTOM, INVALID_STRING_ID, WL_WARNING);
 
			}
 
		} else if (_settings_game.difficulty.diff_level != 3) {
 
			IConsoleSetSetting("difficulty.diff_level", 3);
 
		} else if (_settings_game.difficulty.diff_level != SP_CUSTOM) {
 
			IConsoleSetSetting("difficulty.diff_level", SP_CUSTOM);
 
		}
 
	}
 

	
src/highscore.cpp
Show inline comments
 
@@ -20,7 +20,7 @@
 
#include "core/sort_func.hpp"
 
#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.
 

	
 
static const StringID _endgame_perf_titles[] = {
 
@@ -82,8 +82,10 @@ static int CDECL HighScoreSorter(const C
 
	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()
 
{
 
	const Company *c;
 
@@ -99,11 +101,11 @@ int8 SaveHighScoreValueNetwork()
 
	{
 
		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 */
 
		for (i = 0; i < lengthof(_highscore_table[LAST_HS_ITEM]) && i < count; i++) {
 
			HighScore *hs = &_highscore_table[LAST_HS_ITEM][i];
 
		for (i = 0; i < lengthof(_highscore_table[SP_MULTIPLAYER]) && i < count; i++) {
 
			HighScore *hs = &_highscore_table[SP_MULTIPLAYER][i];
 

	
 
			SetDParam(0, cl[i]->index);
 
			SetDParam(1, cl[i]->index);
 
@@ -129,7 +131,7 @@ void SaveToHighScore()
 
		uint i;
 
		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++) {
 
				/* 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);
 
@@ -139,7 +141,7 @@ void SaveToHighScore()
 
						fwrite(&hs->score, sizeof(hs->score), 1, fp) != 1 ||
 
						fwrite("  ", 2, 1, fp)                       != 1) { // XXX - placeholder for hs->title, not saved anymore; compatibility
 
					DEBUG(misc, 1, "Could not save highscore.");
 
					i = LAST_HS_ITEM;
 
					i = SP_SAVED_HIGHSCORE_END;
 
					break;
 
				}
 
			}
 
@@ -159,7 +161,7 @@ void LoadFromHighScore()
 
		uint i;
 
		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++) {
 
				byte length;
 
				if (fread(&length, sizeof(length), 1, fp)       !=  1 ||
 
@@ -167,7 +169,7 @@ void LoadFromHighScore()
 
						fread(&hs->score, sizeof(hs->score), 1, fp) !=  1 ||
 
						fseek(fp, 2, SEEK_CUR)                      == -1) { // XXX - placeholder for hs->title, not saved anymore; compatibility
 
					DEBUG(misc, 1, "Highscore corrupted");
 
					i = LAST_HS_ITEM;
 
					i = SP_SAVED_HIGHSCORE_END;
 
					break;
 
				}
 
				*lastof(hs->company) = '\0';
src/highscore.h
Show inline comments
 
@@ -14,6 +14,7 @@
 

	
 
#include "strings_type.h"
 
#include "company_type.h"
 
#include "settings_type.h"
 

	
 
struct HighScore {
 
	char company[100];
 
@@ -21,7 +22,7 @@ struct HighScore {
 
	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 LoadFromHighScore();
src/highscore_gui.cpp
Show inline comments
 
@@ -103,10 +103,10 @@ struct EndGameWindow : EndGameHighScoreB
 
			}
 
		}
 

	
 
		/* In a network game show the endscores of the custom difficulty 'network' which is the last one
 
		 * as well as generate a TOP5 of that game, and not an all-time top5. */
 
		/* In a network game show the endscores of the custom difficulty 'network' which is
 
		 * a TOP5 of that game, and not an all-time TOP5. */
 
		if (_networking) {
 
			this->window_number = lengthof(_highscore_table) - 1;
 
			this->window_number = SP_MULTIPLAYER;
 
			this->rank = SaveHighScoreValueNetwork();
 
		} else {
 
			/* in single player _local company is always valid */
src/script/script_config.cpp
Show inline comments
 
@@ -87,7 +87,7 @@ void ScriptConfig::ClearConfigList()
 
int ScriptConfig::GetSetting(const char *name) const
 
{
 
	/* 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);
 
	}
 

	
src/script/script_info.cpp
Show inline comments
 
@@ -294,10 +294,10 @@ int ScriptInfo::GetSettingDefaultValue(c
 
		if (strcmp((*it).name, name) != 0) continue;
 
		/* The default value depends on the difficulty level */
 
		switch (GetGameSettings().difficulty.diff_level) {
 
			case 0: return (*it).easy_value;
 
			case 1: return (*it).medium_value;
 
			case 2: return (*it).hard_value;
 
			case 3: return (*it).custom_value;
 
			case SP_EASY:   return (*it).easy_value;
 
			case SP_MEDIUM: return (*it).medium_value;
 
			case SP_HARD:   return (*it).hard_value;
 
			case SP_CUSTOM: return (*it).custom_value;
 
			default: NOT_REACHED();
 
		}
 
	}
src/settings.cpp
Show inline comments
 
@@ -1032,7 +1032,7 @@ static bool InvalidateCompanyInfrastruct
 
 * R: area restructuring (0 = permissive, 2 = hostile)
 
 * 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*/
 
	{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
 
@@ -1041,12 +1041,11 @@ static const DifficultySettings _default
 

	
 
void SetDifficultyLevel(int mode, DifficultySettings *gm_opt)
 
{
 
	assert(mode <= 3);
 

	
 
	if (mode != 3) {
 
	if (mode != SP_CUSTOM) {
 
		assert(mode >= SP_BEGIN && mode < SP_END);
 
		*gm_opt = _default_game_diff[mode];
 
	} else {
 
		gm_opt->diff_level = 3;
 
		gm_opt->diff_level = SP_CUSTOM;
 
	}
 
}
 

	
 
@@ -1054,7 +1053,7 @@ void SetDifficultyLevel(int mode, Diffic
 
static void ValidateSettings()
 
{
 
	/* 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);
 
	}
 

	
 
@@ -1077,13 +1076,13 @@ static bool DifficultyReset(int32 level)
 
static bool DifficultyChange(int32)
 
{
 
	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);
 
			_settings_newgame.difficulty.diff_level = 3;
 
			_settings_newgame.difficulty.diff_level = SP_CUSTOM;
 
		}
 
		SetWindowClassesDirty(WC_SELECT_GAME);
 
	} 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).
src/settings_type.h
Show inline comments
 
@@ -20,6 +20,23 @@
 
#include "zoom_type.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. */
 
enum IndustryDensity {
 
	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   disasters;                        ///< are disasters enabled
 
	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. */
src/table/gameopt_settings.ini
Show inline comments
 
@@ -92,9 +92,9 @@ from     = 4
 
base     = GameSettings
 
var      = difficulty.diff_level
 
type     = SLE_UINT8
 
def      = 3
 
min      = 0
 
max      = 3
 
def      = SP_CUSTOM
 
min      = SP_EASY
 
max      = SP_CUSTOM
 
cat      = SC_BASIC
 

	
 
[SDT_OMANY]
0 comments (0 inline, 0 general)