clarified highscore submission when internet connection fails
This commit is contained in:
		
							parent
							
								
									21239c9962
								
							
						
					
					
						commit
						e2fd3393d3
					
				@ -42,25 +42,6 @@ int Model::OnInit (int argc, char* argv[]) {
 | 
			
		||||
	if (InitLevelList() == 0)
 | 
			
		||||
		Engine::LogError ("No levels found!");
 | 
			
		||||
 | 
			
		||||
	// First we reset the highscore list
 | 
			
		||||
	mHighscoreList.clear();
 | 
			
		||||
	// then we try to load values from the file
 | 
			
		||||
//	LoadHighscoreList();
 | 
			
		||||
 | 
			
		||||
	// if we have less than the usual number of entries we add default values
 | 
			
		||||
	if (mHighscoreList.size() < 10) {
 | 
			
		||||
		AddLocalHighscoreEntry ("Imperator",      1000000);
 | 
			
		||||
		AddLocalHighscoreEntry ("Darth Vader",     800000);
 | 
			
		||||
		AddLocalHighscoreEntry ("Luke Skywalker",  600000);
 | 
			
		||||
		AddLocalHighscoreEntry ("Han Solo",        400000);
 | 
			
		||||
		AddLocalHighscoreEntry ("Princess Leia",   200000);
 | 
			
		||||
		AddLocalHighscoreEntry ("C3PO",            100000);
 | 
			
		||||
		AddLocalHighscoreEntry ("R2-D2",            50000);
 | 
			
		||||
		AddLocalHighscoreEntry ("Chewy",            10000);
 | 
			
		||||
		AddLocalHighscoreEntry ("Mr. Ewok",          5000);
 | 
			
		||||
		AddLocalHighscoreEntry ("Jabba the Hutt",    1000);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Reset the newest highscore entry index which may be used for highlighting
 | 
			
		||||
	// the newest entry.
 | 
			
		||||
	mNewestHighscoreEntryIndex = std::numeric_limits<unsigned int>::max();
 | 
			
		||||
@ -79,8 +60,6 @@ int Model::OnInit (int argc, char* argv[]) {
 | 
			
		||||
		Engine::LogError("SDLNet_Init: %s\n", SDLNet_GetError());
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	SubmitGlobalHigscoreEntry ("asteroids_full", 321321321);
 | 
			
		||||
 | 
			
		||||
	Engine::RegisterListener (this, EventAccelerateStart);
 | 
			
		||||
	Engine::RegisterListener (this, EventAccelerateStop);
 | 
			
		||||
 | 
			
		||||
@ -196,34 +175,53 @@ void Model::ParseHighscoreStream (std::istream &highscore_stream) {
 | 
			
		||||
void Model::LoadHighscoreList () {
 | 
			
		||||
	mHighscoreList.clear();
 | 
			
		||||
 | 
			
		||||
	if (mHighscoreList.size() < 10) {
 | 
			
		||||
		AddLocalHighscoreEntry ("Imperator",      1000000);
 | 
			
		||||
		AddLocalHighscoreEntry ("Darth Vader",     800000);
 | 
			
		||||
		AddLocalHighscoreEntry ("Luke Skywalker",  600000);
 | 
			
		||||
		AddLocalHighscoreEntry ("Han Solo",        400000);
 | 
			
		||||
		AddLocalHighscoreEntry ("Princess Leia",   200000);
 | 
			
		||||
		AddLocalHighscoreEntry ("C3PO",            100000);
 | 
			
		||||
		AddLocalHighscoreEntry ("R2-D2",            50000);
 | 
			
		||||
		AddLocalHighscoreEntry ("Chewy",            10000);
 | 
			
		||||
		AddLocalHighscoreEntry ("Mr. Ewok",          5000);
 | 
			
		||||
		AddLocalHighscoreEntry ("Jabba the Hutt",    1000);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (Model::UseServerHighscore.GetBoolValue()) {
 | 
			
		||||
		Engine::LogMessage ("Retrieving Highscore from server");
 | 
			
		||||
		Engine::LogDebug ("Retrieving Highscore from server");
 | 
			
		||||
		std::stringstream global_highscore_stream;
 | 
			
		||||
 | 
			
		||||
		if (PullGlobalHighscore(global_highscore_stream)) {
 | 
			
		||||
			ParseHighscoreStream(global_highscore_stream);
 | 
			
		||||
			return;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		Engine::LogMessage ("Could not load highscore from server, falling back to local.");
 | 
			
		||||
	} 
 | 
			
		||||
 | 
			
		||||
	LoadLocalHighscoreList();
 | 
			
		||||
	SaveLocalHighscoreList();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void Model::LoadLocalHighscoreList () {
 | 
			
		||||
	Engine::LogDebug ("Loading local highscore file");
 | 
			
		||||
	boost::filesystem::path highscore_file(Engine::GetUserDirFullPath("/highscore.dat"));
 | 
			
		||||
	std::string highscore_filename = Engine::GetUserDirFullPath("/highscore.dat").c_str();
 | 
			
		||||
	boost::filesystem::path highscore_file(highscore_filename);
 | 
			
		||||
 | 
			
		||||
	// if the file does not exist, we create it and write standard values into
 | 
			
		||||
	// it.
 | 
			
		||||
	if (!boost::filesystem::exists(highscore_file))
 | 
			
		||||
	return;
 | 
			
		||||
 | 
			
		||||
	if (!boost::filesystem::is_regular_file(highscore_file)) {
 | 
			
		||||
	Engine::LogError ("Could not load highscore file: %s is not a regular file!", highscore_file.filename().c_str());
 | 
			
		||||
	if (!boost::filesystem::exists(highscore_file)) {
 | 
			
		||||
		Engine::LogDebug ("Local highscore file not found!");
 | 
			
		||||
		return;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	std::ifstream score_stream (highscore_file.filename().c_str());
 | 
			
		||||
	if (!boost::filesystem::is_regular_file(highscore_file)) {
 | 
			
		||||
		Engine::LogError ("Could not load highscore file: %s is not a regular file!", highscore_file.filename().c_str());
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	Engine::LogDebug ("Loading highscore file '%s'", highscore_filename.c_str());
 | 
			
		||||
 | 
			
		||||
	std::ifstream score_stream (highscore_filename.c_str());
 | 
			
		||||
	ParseHighscoreStream (score_stream);
 | 
			
		||||
 | 
			
		||||
	score_stream.close();
 | 
			
		||||
@ -256,9 +254,14 @@ unsigned int Model::AddLocalHighscoreEntry(const std::string &name, const unsign
 | 
			
		||||
	entry.name = name;
 | 
			
		||||
	entry.points = points;
 | 
			
		||||
 | 
			
		||||
	Engine::LogDebug ("Adding entry %s points = %d", name.c_str(), points);
 | 
			
		||||
 | 
			
		||||
	unsigned int counter = 0;
 | 
			
		||||
	std::list<HighscoreEntry>::iterator iter = mHighscoreList.begin();
 | 
			
		||||
	while (iter != mHighscoreList.end()) {
 | 
			
		||||
		if (name == iter->name && points == iter->points)
 | 
			
		||||
			break;
 | 
			
		||||
 | 
			
		||||
		if (points >= iter->points) {
 | 
			
		||||
			mHighscoreList.insert (iter, entry);
 | 
			
		||||
			mNewestHighscoreEntryIndex = counter;
 | 
			
		||||
@ -281,10 +284,6 @@ unsigned int Model::AddLocalHighscoreEntry(const std::string &name, const unsign
 | 
			
		||||
	if (counter < 10)
 | 
			
		||||
		return counter;
 | 
			
		||||
 | 
			
		||||
	// if we have all 10 entries then we can save
 | 
			
		||||
	// the highscore
 | 
			
		||||
	SaveLocalHighscoreList();
 | 
			
		||||
 | 
			
		||||
	mNewestHighscoreEntryIndex = 99999;
 | 
			
		||||
 | 
			
		||||
	return 99999;
 | 
			
		||||
@ -296,7 +295,8 @@ bool Model::PullGlobalHighscore(std::stringstream &highscore_stream) {
 | 
			
		||||
	IPaddress server_address;
 | 
			
		||||
 | 
			
		||||
	if (SDLNet_ResolveHost (&server_address, Model::HighscoreServerName.GetStringValue().c_str(), 80) == -1) {
 | 
			
		||||
		Engine::LogWarning ("SDL_net resolve host: %s", SDLNet_GetError());
 | 
			
		||||
		Engine::LogWarning ("Could not retrieve global highscore list: host name resolution for server %s failed!",
 | 
			
		||||
				Model::HighscoreServerName.GetStringValue().c_str());
 | 
			
		||||
		return false;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
@ -370,7 +370,8 @@ bool Model::SubmitGlobalHigscoreEntry (const std::string &name, const unsigned i
 | 
			
		||||
	IPaddress server_address;
 | 
			
		||||
 | 
			
		||||
	if (SDLNet_ResolveHost (&server_address, Model::HighscoreServerName.GetStringValue().c_str(), 80) == -1) {
 | 
			
		||||
		Engine::LogWarning ("SDL_net resolve host: %s", SDLNet_GetError());
 | 
			
		||||
		Engine::LogWarning ("Cannot submit highscore entry: host name resolution for server %s failed!",
 | 
			
		||||
				Model::HighscoreServerName.GetStringValue().c_str());
 | 
			
		||||
		return false;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
@ -461,12 +462,17 @@ bool Model::SubmitGlobalHigscoreEntry (const std::string &name, const unsigned i
 | 
			
		||||
 | 
			
		||||
void Model::SubmitHighscoreEntry (const std::string &name, const unsigned int points) {
 | 
			
		||||
	if (Model::UseServerHighscore.GetBoolValue()) {
 | 
			
		||||
		Engine::LogMessage ("Sending highscore entry to the server");
 | 
			
		||||
		if (SubmitGlobalHigscoreEntry (name, points)) {
 | 
			
		||||
			return;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		SubmitGlobalHigscoreEntry (name, points);
 | 
			
		||||
	} else {
 | 
			
		||||
		AddLocalHighscoreEntry (name, points);
 | 
			
		||||
	}
 | 
			
		||||
		Engine::LogWarning ("Could not send highscore entry to server!");
 | 
			
		||||
	} 
 | 
			
		||||
 | 
			
		||||
	// if it did not succeed or we do not want to use the global highscore
 | 
			
		||||
	// fall back to the local highscore system.
 | 
			
		||||
	AddLocalHighscoreEntry (name, points);
 | 
			
		||||
	SaveLocalHighscoreList();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int Model::DoLoadLevel (const char* filename) {
 | 
			
		||||
 | 
			
		||||
@ -496,6 +496,7 @@ void View::DrawUiMainMenu() {
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (Engine::GUI::Button (3, "Highscores", screen_right * 0.5 - 100, 300, button_width, button_height)) {
 | 
			
		||||
		GetModel()->LoadHighscoreList();
 | 
			
		||||
		PushViewState(ViewStateShowHighscore);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -114,7 +114,7 @@ int main (int argc, char* argv[]) {
 | 
			
		||||
	engine.SetPhysics (new asteroids::Physics);
 | 
			
		||||
	engine.SetView (new asteroids::View);
 | 
			
		||||
 | 
			
		||||
	SetLogPrintLevel (Engine::LogLevelMessage);
 | 
			
		||||
	SetLogPrintLevel (Engine::LogLevelWarning);
 | 
			
		||||
 | 
			
		||||
	std::string user_path = ".";
 | 
			
		||||
	std::string game_data_path = ".";
 | 
			
		||||
@ -130,6 +130,7 @@ int main (int argc, char* argv[]) {
 | 
			
		||||
 | 
			
		||||
	cout << "User Data Dir = " << user_path << endl;
 | 
			
		||||
	engine.SetUserDataPath (user_path);
 | 
			
		||||
 | 
			
		||||
	Engine::SetLogFilename (log_file_path.c_str());
 | 
			
		||||
 | 
			
		||||
	engine.SetGameDataPath (game_data_path);
 | 
			
		||||
@ -165,6 +166,7 @@ int main (int argc, char* argv[]) {
 | 
			
		||||
 | 
			
		||||
	Engine::PlayMusic (Engine::GetResourceFullPath("/data/sounds/intro_music.ogg"));
 | 
			
		||||
 | 
			
		||||
	// load highscore list (either remote or local, depending on settings)
 | 
			
		||||
	asteroids::GetModel()->LoadHighscoreList();
 | 
			
		||||
 | 
			
		||||
	engine.MainLoop ();
 | 
			
		||||
 | 
			
		||||
@ -100,11 +100,12 @@ bool Variable::ParseBoolValue (std::string value) {
 | 
			
		||||
	unsigned int i;
 | 
			
		||||
	for (i = 0; i < value.size(); i++)
 | 
			
		||||
		value[i] = tolower (value[i]);
 | 
			
		||||
//	std::transform (value.begin(), value.end(), value.begin(), ::tolower);	
 | 
			
		||||
 | 
			
		||||
	if (value == "true"
 | 
			
		||||
			|| value == "yes")
 | 
			
		||||
		return true;
 | 
			
		||||
 | 
			
		||||
	return false;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user