git repos / blockattack-game

blame: source/code/stageclearhandler.cpp

normal view · raw

ae5d6381 sago007 2015-12-29 13:26 1
/*
1899da11 sago007 2015-12-30 19:04 2
===========================================================================
1899da11 sago007 2015-12-30 19:04 3
blockattack - Block Attack - Rise of the Blocks
1899da11 sago007 2015-12-30 19:04 4
Copyright (C) 2005-2015 Poul Sander
1899da11 sago007 2015-12-30 19:04 5
1899da11 sago007 2015-12-30 19:04 6
This program is free software: you can redistribute it and/or modify
1899da11 sago007 2015-12-30 19:04 7
it under the terms of the GNU General Public License as published by
1899da11 sago007 2015-12-30 19:04 8
the Free Software Foundation, either version 2 of the License, or
1899da11 sago007 2015-12-30 19:04 9
(at your option) any later version.
1899da11 sago007 2015-12-30 19:04 10
1899da11 sago007 2015-12-30 19:04 11
This program is distributed in the hope that it will be useful,
1899da11 sago007 2015-12-30 19:04 12
but WITHOUT ANY WARRANTY; without even the implied warranty of
1899da11 sago007 2015-12-30 19:04 13
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
1899da11 sago007 2015-12-30 19:04 14
GNU General Public License for more details.
1899da11 sago007 2015-12-30 19:04 15
1899da11 sago007 2015-12-30 19:04 16
You should have received a copy of the GNU General Public License
1899da11 sago007 2015-12-30 19:04 17
along with this program.  If not, see http://www.gnu.org/licenses/
1899da11 sago007 2015-12-30 19:04 18
1899da11 sago007 2015-12-30 19:04 19
Source information and contacts persons can be found at
ad2d11ab Poul Sander 2016-02-17 19:06 20
http://www.blockattack.net
1899da11 sago007 2015-12-30 19:04 21
===========================================================================
1899da11 sago007 2015-12-30 19:04 22
*/
ae5d6381 sago007 2015-12-29 13:26 23
ae5d6381 sago007 2015-12-29 13:26 24
#include "stageclearhandler.hpp"
ae5d6381 sago007 2015-12-29 13:26 25
#include "SDL.h"
ae5d6381 sago007 2015-12-29 13:26 26
#include <vector>
ae5d6381 sago007 2015-12-29 13:26 27
#include <iostream>
8ace9b0f sago007 2016-02-14 17:57 28
#include <sstream>
8ace9b0f sago007 2016-02-14 17:57 29
#include "cereal/cereal.hpp"
8ace9b0f sago007 2016-02-14 17:57 30
#include "cereal/types/vector.hpp"
8ace9b0f sago007 2016-02-14 17:57 31
#include "cereal/archives/json.hpp"
8ace9b0f sago007 2016-02-14 17:57 32
#include "sago/SagoMisc.hpp"
ad2d11ab Poul Sander 2016-02-17 19:06 33
#include "Libs/include/cereal/details/helpers.hpp"
ae5d6381 sago007 2015-12-29 13:26 34
ae5d6381 sago007 2015-12-29 13:26 35
//paths
8ace9b0f sago007 2016-02-14 17:57 36
const char* const stageClearSaveName = "stageClear.json.SCsave";
8ace9b0f sago007 2016-02-14 17:57 37
8ace9b0f sago007 2016-02-14 17:57 38
struct StageClearElement {
8ace9b0f sago007 2016-02-14 17:57 39
	bool cleared = false;
8ace9b0f sago007 2016-02-14 17:57 40
	int time = 0;
8ace9b0f sago007 2016-02-14 17:57 41
	int score = 0;
c7f2082f sago007 2016-03-13 11:48 42
8ace9b0f sago007 2016-02-14 17:57 43
	template<class Archive>
c7f2082f sago007 2016-03-13 11:48 44
	void serialize(Archive& archive) {
c7f2082f sago007 2016-03-13 11:48 45
		archive( cereal::make_nvp("cleared", cleared), cereal::make_nvp("time", time), cereal::make_nvp("score", score) );
8ace9b0f sago007 2016-02-14 17:57 46
	}
8ace9b0f sago007 2016-02-14 17:57 47
};
8ace9b0f sago007 2016-02-14 17:57 48
8ace9b0f sago007 2016-02-14 17:57 49
std::vector<StageClearElement> stages(nrOfStageLevels);
ae5d6381 sago007 2015-12-29 13:26 50
335635ec sago007 2016-02-06 13:51 51
std::vector<bool> stageCleared(nrOfStageLevels);        //vector that tells if a stage is cleared
daa8f1cf sago007 2016-01-23 10:57 52
std::vector<Sint32> stageTimes(nrOfStageLevels);             //For statistical puposes
daa8f1cf sago007 2016-01-23 10:57 53
std::vector<Sint32> stageScores(nrOfStageLevels);            //--||--
daa8f1cf sago007 2016-01-23 10:57 54
Sint32 totalScore = 0;
daa8f1cf sago007 2016-01-23 10:57 55
Sint32 totalTime = 0;
ae5d6381 sago007 2015-12-29 13:26 56
96eb7a16 sago007 2016-04-29 17:01 57
using std::string;
96eb7a16 sago007 2016-04-29 17:01 58
using std::cerr;
96eb7a16 sago007 2016-04-29 17:01 59
using std::endl;
96eb7a16 sago007 2016-04-29 17:01 60
using std::vector;
c7f2082f sago007 2016-03-13 11:48 61
8ace9b0f sago007 2016-02-14 17:57 62
static void SaveStageClearStages() {
8ace9b0f sago007 2016-02-14 17:57 63
	std::stringstream ss;
8ace9b0f sago007 2016-02-14 17:57 64
	{
8ace9b0f sago007 2016-02-14 17:57 65
		cereal::JSONOutputArchive archive(ss);
8ace9b0f sago007 2016-02-14 17:57 66
		archive(cereal::make_nvp("stages", stages));
8ace9b0f sago007 2016-02-14 17:57 67
	}
8ace9b0f sago007 2016-02-14 17:57 68
	sago::WriteFileContent(stageClearSaveName, ss.str());
8ace9b0f sago007 2016-02-14 17:57 69
}
ae5d6381 sago007 2015-12-29 13:26 70
ae5d6381 sago007 2015-12-29 13:26 71
void StageClearSetClear(int Level, int score, int time) {
c7f2082f sago007 2016-03-13 11:48 72
8ace9b0f sago007 2016-02-14 17:57 73
	stages.at(Level).cleared = true;
ae5d6381 sago007 2015-12-29 13:26 74
	int gameEndedAfter = time;
8ace9b0f sago007 2016-02-14 17:57 75
	if (stages.at(Level).score<score) {
8ace9b0f sago007 2016-02-14 17:57 76
		stages[Level].score = score;
8ace9b0f sago007 2016-02-14 17:57 77
		stages[Level].time = gameEndedAfter;
ae5d6381 sago007 2015-12-29 13:26 78
	}
8ace9b0f sago007 2016-02-14 17:57 79
	SaveStageClearStages();
ae5d6381 sago007 2015-12-29 13:26 80
}
ae5d6381 sago007 2015-12-29 13:26 81
8ace9b0f sago007 2016-02-14 17:57 82
8ace9b0f sago007 2016-02-14 17:57 83
ae5d6381 sago007 2015-12-29 13:26 84
void LoadStageClearStages() {
8ace9b0f sago007 2016-02-14 17:57 85
	std::string readFileContent = sago::GetFileContent(stageClearSaveName);
8ace9b0f sago007 2016-02-14 17:57 86
	if (readFileContent.length() > 0) {
8ace9b0f sago007 2016-02-14 17:57 87
		std::stringstream ss(readFileContent);
8ace9b0f sago007 2016-02-14 17:57 88
		{
ad2d11ab Poul Sander 2016-02-17 19:06 89
			try {
ad2d11ab Poul Sander 2016-02-17 19:06 90
				cereal::JSONInputArchive archive(ss);
ad2d11ab Poul Sander 2016-02-17 19:06 91
				archive(cereal::make_nvp("stages", stages));
ad2d11ab Poul Sander 2016-02-17 19:06 92
			}
ad2d11ab Poul Sander 2016-02-17 19:06 93
			catch (cereal::Exception& e) {
ad2d11ab Poul Sander 2016-02-17 19:06 94
				std::cerr << "Failed to load file \"" << stageClearSaveName << "\". Reason: " << e.what() << std::endl;
ad2d11ab Poul Sander 2016-02-17 19:06 95
				stages.clear();
ad2d11ab Poul Sander 2016-02-17 19:06 96
			}
ae5d6381 sago007 2015-12-29 13:26 97
		}
ae5d6381 sago007 2015-12-29 13:26 98
	}
ae5d6381 sago007 2015-12-29 13:26 99
	else {
8ace9b0f sago007 2016-02-14 17:57 100
		stages.clear();
8ace9b0f sago007 2016-02-14 17:57 101
	}
8ace9b0f sago007 2016-02-14 17:57 102
	stages.resize(nrOfStageLevels);
8ace9b0f sago007 2016-02-14 17:57 103
	totalScore = 0;
8ace9b0f sago007 2016-02-14 17:57 104
	totalTime = 0;
8ace9b0f sago007 2016-02-14 17:57 105
	for (const StageClearElement& s : stages) {
8ace9b0f sago007 2016-02-14 17:57 106
		totalScore += s.score;
8ace9b0f sago007 2016-02-14 17:57 107
		totalTime += s.time;
ae5d6381 sago007 2015-12-29 13:26 108
	}
ae5d6381 sago007 2015-12-29 13:26 109
}
ae5d6381 sago007 2015-12-29 13:26 110
ae5d6381 sago007 2015-12-29 13:26 111
int GetTotalScore() {
ae5d6381 sago007 2015-12-29 13:26 112
	return totalScore;
ae5d6381 sago007 2015-12-29 13:26 113
}
ae5d6381 sago007 2015-12-29 13:26 114
int GetTotalTime() {
ae5d6381 sago007 2015-12-29 13:26 115
	return totalTime;
ae5d6381 sago007 2015-12-29 13:26 116
}
ae5d6381 sago007 2015-12-29 13:26 117
ae5d6381 sago007 2015-12-29 13:26 118
int GetNrOfLevels() {
ae5d6381 sago007 2015-12-29 13:26 119
	return nrOfStageLevels;
ae5d6381 sago007 2015-12-29 13:26 120
}
ae5d6381 sago007 2015-12-29 13:26 121
ae5d6381 sago007 2015-12-29 13:26 122
bool IsStageCleared(int level) {
8ace9b0f sago007 2016-02-14 17:57 123
	return stages.at(level).cleared;
ae5d6381 sago007 2015-12-29 13:26 124
}
ae5d6381 sago007 2015-12-29 13:26 125
ae5d6381 sago007 2015-12-29 13:26 126
ae5d6381 sago007 2015-12-29 13:26 127
int GetStageScores(int level) {
8ace9b0f sago007 2016-02-14 17:57 128
	return stages.at(level).score;
ae5d6381 sago007 2015-12-29 13:26 129
}
ae5d6381 sago007 2015-12-29 13:26 130
ae5d6381 sago007 2015-12-29 13:26 131
int GetStageTime(int level) {
8ace9b0f sago007 2016-02-14 17:57 132
	return stages.at(level).time;
8ace9b0f sago007 2016-02-14 17:57 133
}
1970-01-01 00:00 134