git repos / blockattack-game

blame: source/code/highscore.cpp

normal view · raw

ecef5838 sago007 2015-11-24 20:01 1
/*
ecef5838 sago007 2015-11-24 20:01 2
===========================================================================
ecef5838 sago007 2015-11-24 20:01 3
blockattack - Block Attack - Rise of the Blocks
ecef5838 sago007 2015-11-24 20:01 4
Copyright (C) 2005-2012 Poul Sander
ecef5838 sago007 2015-11-24 20:01 5
ecef5838 sago007 2015-11-24 20:01 6
This program is free software: you can redistribute it and/or modify
ecef5838 sago007 2015-11-24 20:01 7
it under the terms of the GNU General Public License as published by
ecef5838 sago007 2015-11-24 20:01 8
the Free Software Foundation, either version 2 of the License, or
ecef5838 sago007 2015-11-24 20:01 9
(at your option) any later version.
ecef5838 sago007 2015-11-24 20:01 10
ecef5838 sago007 2015-11-24 20:01 11
This program is distributed in the hope that it will be useful,
ecef5838 sago007 2015-11-24 20:01 12
but WITHOUT ANY WARRANTY; without even the implied warranty of
ecef5838 sago007 2015-11-24 20:01 13
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
ecef5838 sago007 2015-11-24 20:01 14
GNU General Public License for more details.
ecef5838 sago007 2015-11-24 20:01 15
ecef5838 sago007 2015-11-24 20:01 16
You should have received a copy of the GNU General Public License
ecef5838 sago007 2015-11-24 20:01 17
along with this program.  If not, see http://www.gnu.org/licenses/
ecef5838 sago007 2015-11-24 20:01 18
ecef5838 sago007 2015-11-24 20:01 19
Source information and contacts persons can be found at
7a956470 sago007 2016-02-14 17:09 20
http://www.blockattack.net
ecef5838 sago007 2015-11-24 20:01 21
===========================================================================
ecef5838 sago007 2015-11-24 20:01 22
*/
ecef5838 sago007 2015-11-24 20:01 23
ecef5838 sago007 2015-11-24 20:01 24
#include "highscore.h"
1f50b970 sago007 2015-12-30 21:00 25
#include "os.hpp"
6e1cb0b4 sago007 2016-02-13 09:26 26
#include "physfs_stream.hpp"
7a956470 sago007 2016-02-14 17:09 27
#include "cereal/cereal.hpp"
7a956470 sago007 2016-02-14 17:09 28
#include "cereal/types/vector.hpp"
7a956470 sago007 2016-02-14 17:09 29
#include "cereal/archives/json.hpp"
7a956470 sago007 2016-02-14 17:09 30
#include "sago/SagoMisc.hpp"
c7f2082f sago007 2016-03-13 11:48 31
#include <algorithm>
ecef5838 sago007 2015-11-24 20:01 32
7a956470 sago007 2016-02-14 17:09 33
namespace cereal {
c7f2082f sago007 2016-03-13 11:48 34
7a956470 sago007 2016-02-14 17:09 35
template<class Archive>
c7f2082f sago007 2016-03-13 11:48 36
void save(Archive& archive, record const& m) {
7a956470 sago007 2016-02-14 17:09 37
	archive( cereal::make_nvp("Name", m.name), cereal::make_nvp("Score", m.score) );
7a956470 sago007 2016-02-14 17:09 38
}
ecef5838 sago007 2015-11-24 20:01 39
7a956470 sago007 2016-02-14 17:09 40
template<class Archive>
c7f2082f sago007 2016-03-13 11:48 41
void load(Archive& archive, record& m) {
7a956470 sago007 2016-02-14 17:09 42
	archive( cereal::make_nvp("Name", m.name), cereal::make_nvp("Score", m.score) );
7a956470 sago007 2016-02-14 17:09 43
}
7a956470 sago007 2016-02-14 17:09 44
7a956470 sago007 2016-02-14 17:09 45
}
7a956470 sago007 2016-02-14 17:09 46
7a956470 sago007 2016-02-14 17:09 47
/*
7a956470 sago007 2016-02-14 17:09 48
 This sorts in reverse order. So the highest will be first
7a956470 sago007 2016-02-14 17:09 49
 */
c7f2082f sago007 2016-03-13 11:48 50
bool record_sorter (const record& i,const record& j) {
c7f2082f sago007 2016-03-13 11:48 51
	return (i.score > j.score);
c7f2082f sago007 2016-03-13 11:48 52
}
7a956470 sago007 2016-02-14 17:09 53
7a956470 sago007 2016-02-14 17:09 54
Highscore::Highscore(const std::string& type) {
7a956470 sago007 2016-02-14 17:09 55
	this->type = type;
7a956470 sago007 2016-02-14 17:09 56
	filename = type+".json.dat";
7a956470 sago007 2016-02-14 17:09 57
	std::string readFileContent = sago::GetFileContent(filename.c_str());
e567627f Poul Sander 2016-02-17 18:47 58
	if (readFileContent.length() > 0) {
ad2d11ab Poul Sander 2016-02-17 19:06 59
		try {
ad2d11ab Poul Sander 2016-02-17 19:06 60
			std::stringstream ss(readFileContent);
ad2d11ab Poul Sander 2016-02-17 19:06 61
			{
ad2d11ab Poul Sander 2016-02-17 19:06 62
				cereal::JSONInputArchive archive(ss);
ad2d11ab Poul Sander 2016-02-17 19:06 63
				archive(cereal::make_nvp("highscore", table));
ad2d11ab Poul Sander 2016-02-17 19:06 64
			}
ad2d11ab Poul Sander 2016-02-17 19:06 65
		}
c7f2082f sago007 2016-03-13 11:48 66
		catch (cereal::Exception& e) {
ad2d11ab Poul Sander 2016-02-17 19:06 67
			std::cerr << "Failed to read highscore " << filename << " due to formatting errors. Resetting the file. Reason: " <<
c7f2082f sago007 2016-03-13 11:48 68
			          e.what() << std::endl;
ad2d11ab Poul Sander 2016-02-17 19:06 69
			table.clear();
e567627f Poul Sander 2016-02-17 18:47 70
		}
ecef5838 sago007 2015-11-24 20:01 71
	}
7a956470 sago007 2016-02-14 17:09 72
	if (table.size() < top) {
ecef5838 sago007 2015-11-24 20:01 73
		for (int i = 0; i<top; i++) {
7a956470 sago007 2016-02-14 17:09 74
			record r;
7a956470 sago007 2016-02-14 17:09 75
			r.name = "Poul Sander";
7a956470 sago007 2016-02-14 17:09 76
			r.score = 2000 - i*100;
7a956470 sago007 2016-02-14 17:09 77
			table.push_back(r);
ecef5838 sago007 2015-11-24 20:01 78
		}
ecef5838 sago007 2015-11-24 20:01 79
	}
7a956470 sago007 2016-02-14 17:09 80
	std::stable_sort(table.begin(), table.end(), record_sorter);
7a956470 sago007 2016-02-14 17:09 81
	table.resize(top);
ecef5838 sago007 2015-11-24 20:01 82
	writeFile();
ecef5838 sago007 2015-11-24 20:01 83
}
ecef5838 sago007 2015-11-24 20:01 84
ecef5838 sago007 2015-11-24 20:01 85
7a956470 sago007 2016-02-14 17:09 86
void Highscore::writeFile() {
ad2d11ab Poul Sander 2016-02-17 19:06 87
	std::stringstream ss;
7a956470 sago007 2016-02-14 17:09 88
	{
7a956470 sago007 2016-02-14 17:09 89
		cereal::JSONOutputArchive archive(ss);
7a956470 sago007 2016-02-14 17:09 90
		archive(cereal::make_nvp("highscore", table));
ecef5838 sago007 2015-11-24 20:01 91
	}
7a956470 sago007 2016-02-14 17:09 92
	sago::WriteFileContent(filename.c_str(), ss.str());
ecef5838 sago007 2015-11-24 20:01 93
}
ecef5838 sago007 2015-11-24 20:01 94
ecef5838 sago007 2015-11-24 20:01 95
bool Highscore::isHighScore(int newScore) {
7a956470 sago007 2016-02-14 17:09 96
	if (newScore>table.back().score) {
ecef5838 sago007 2015-11-24 20:01 97
		return true;
ecef5838 sago007 2015-11-24 20:01 98
	}
ecef5838 sago007 2015-11-24 20:01 99
	else {
ecef5838 sago007 2015-11-24 20:01 100
		return false;
ecef5838 sago007 2015-11-24 20:01 101
	}
ecef5838 sago007 2015-11-24 20:01 102
}
ecef5838 sago007 2015-11-24 20:01 103
7a956470 sago007 2016-02-14 17:09 104
void Highscore::addScore(const std::string& newName, int newScore) {
7a956470 sago007 2016-02-14 17:09 105
	record r;
7a956470 sago007 2016-02-14 17:09 106
	r.name = newName;
7a956470 sago007 2016-02-14 17:09 107
	r.score = newScore;
7a956470 sago007 2016-02-14 17:09 108
	table.push_back(r);
7a956470 sago007 2016-02-14 17:09 109
	std::stable_sort(table.begin(), table.end(), record_sorter);
7a956470 sago007 2016-02-14 17:09 110
	table.resize(top);
ecef5838 sago007 2015-11-24 20:01 111
	Highscore::writeFile();
ecef5838 sago007 2015-11-24 20:01 112
}
ecef5838 sago007 2015-11-24 20:01 113
7a956470 sago007 2016-02-14 17:09 114
record Highscore::getScoreNumber(int room) {
7a956470 sago007 2016-02-14 17:09 115
	record ret;
c7f2082f sago007 2016-03-13 11:48 116
	if (room < static_cast<int>(table.size()) ) {
7a956470 sago007 2016-02-14 17:09 117
		ret = table.at(room);
7a956470 sago007 2016-02-14 17:09 118
	}
7a956470 sago007 2016-02-14 17:09 119
	return ret;
ecef5838 sago007 2015-11-24 20:01 120
}
ecef5838 sago007 2015-11-24 20:01 121
1970-01-01 00:00 122