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
1e882510 Poul Sander 2024-05-11 19:46 24
#include "nlohmann/json.hpp"
ae5d6381 sago007 2015-12-29 13:26 25
#include "stageclearhandler.hpp"
ae5d6381 sago007 2015-12-29 13:26 26
#include "SDL.h"
ae5d6381 sago007 2015-12-29 13:26 27
#include <vector>
ae5d6381 sago007 2015-12-29 13:26 28
#include <iostream>
8ace9b0f sago007 2016-02-14 17:57 29
#include <sstream>
8ace9b0f sago007 2016-02-14 17:57 30
#include "sago/SagoMisc.hpp"
71866e6e Poul Sander 2024-05-11 14:14 31
71866e6e Poul Sander 2024-05-11 14:14 32
using json = nlohmann::json;
ae5d6381 sago007 2015-12-29 13:26 33
ae5d6381 sago007 2015-12-29 13:26 34
//paths
8ace9b0f sago007 2016-02-14 17:57 35
const char* const stageClearSaveName = "stageClear.json.SCsave";
8ace9b0f sago007 2016-02-14 17:57 36
8ace9b0f sago007 2016-02-14 17:57 37
struct StageClearElement {
8ace9b0f sago007 2016-02-14 17:57 38
	bool cleared = false;
8ace9b0f sago007 2016-02-14 17:57 39
	int time = 0;
8ace9b0f sago007 2016-02-14 17:57 40
	int score = 0;
8ace9b0f sago007 2016-02-14 17:57 41
};
8ace9b0f sago007 2016-02-14 17:57 42
71866e6e Poul Sander 2024-05-11 14:14 43
void to_json(json& j, const StageClearElement& p) {
71866e6e Poul Sander 2024-05-11 14:14 44
	j = json{ {"cleared", p.cleared}, {"time", p.time}, {"score", p.score}};
71866e6e Poul Sander 2024-05-11 14:14 45
}
71866e6e Poul Sander 2024-05-11 14:14 46
71866e6e Poul Sander 2024-05-11 14:14 47
void from_json(const json& j, StageClearElement& p) {
71866e6e Poul Sander 2024-05-11 14:14 48
	p.cleared = j.at("cleared").get<bool>();
71866e6e Poul Sander 2024-05-11 14:14 49
	p.time = j.at("time").get<int>();
71866e6e Poul Sander 2024-05-11 14:14 50
	p.score = j.at("score").get<int>();
71866e6e Poul Sander 2024-05-11 14:14 51
}
71866e6e Poul Sander 2024-05-11 14:14 52
8ace9b0f sago007 2016-02-14 17:57 53
std::vector<StageClearElement> stages(nrOfStageLevels);
ae5d6381 sago007 2015-12-29 13:26 54
c03502ad Poul Sander 2025-10-11 17:10 55
//std::vector<bool> stageCleared(nrOfStageLevels);        //vector that tells if a stage is cleared
c03502ad Poul Sander 2025-10-11 17:10 56
//std::vector<Sint32> stageTimes(nrOfStageLevels);             //For statistical puposes
c03502ad Poul Sander 2025-10-11 17:10 57
//std::vector<Sint32> stageScores(nrOfStageLevels);            //--||--
c03502ad Poul Sander 2025-10-11 17:10 58
std::vector<StageClearElement> parScores(nrOfStageLevels);
daa8f1cf sago007 2016-01-23 10:57 59
Sint32 totalScore = 0;
daa8f1cf sago007 2016-01-23 10:57 60
Sint32 totalTime = 0;
ae5d6381 sago007 2015-12-29 13:26 61
c7f2082f sago007 2016-03-13 11:48 62
8ace9b0f sago007 2016-02-14 17:57 63
static void SaveStageClearStages() {
71866e6e Poul Sander 2024-05-11 14:14 64
	json j = json{ {"stages", stages} };
71866e6e Poul Sander 2024-05-11 14:14 65
	std::string s = j.dump(4);
71866e6e Poul Sander 2024-05-11 14:14 66
	sago::WriteFileContent(stageClearSaveName, s);
8ace9b0f sago007 2016-02-14 17:57 67
}
ae5d6381 sago007 2015-12-29 13:26 68
ae5d6381 sago007 2015-12-29 13:26 69
void StageClearSetClear(int Level, int score, int time) {
c7f2082f sago007 2016-03-13 11:48 70
8ace9b0f sago007 2016-02-14 17:57 71
	stages.at(Level).cleared = true;
ae5d6381 sago007 2015-12-29 13:26 72
	int gameEndedAfter = time;
8ace9b0f sago007 2016-02-14 17:57 73
	if (stages.at(Level).score<score) {
8ace9b0f sago007 2016-02-14 17:57 74
		stages[Level].score = score;
8ace9b0f sago007 2016-02-14 17:57 75
		stages[Level].time = gameEndedAfter;
ae5d6381 sago007 2015-12-29 13:26 76
	}
8ace9b0f sago007 2016-02-14 17:57 77
	SaveStageClearStages();
ae5d6381 sago007 2015-12-29 13:26 78
}
ae5d6381 sago007 2015-12-29 13:26 79
8ace9b0f sago007 2016-02-14 17:57 80
8ace9b0f sago007 2016-02-14 17:57 81
ae5d6381 sago007 2015-12-29 13:26 82
void LoadStageClearStages() {
8ace9b0f sago007 2016-02-14 17:57 83
	std::string readFileContent = sago::GetFileContent(stageClearSaveName);
8ace9b0f sago007 2016-02-14 17:57 84
	if (readFileContent.length() > 0) {
71866e6e Poul Sander 2024-05-11 14:14 85
		json j = json::parse(readFileContent);
71866e6e Poul Sander 2024-05-11 14:14 86
		try {
71866e6e Poul Sander 2024-05-11 14:14 87
			j.at("stages").get_to(stages);
71866e6e Poul Sander 2024-05-11 14:14 88
		} catch (json::exception& e) {
71866e6e Poul Sander 2024-05-11 14:14 89
			std::cerr << "Failed to read highscore " << stageClearSaveName << " due to formatting errors. Resetting the file. Reason: " <<
71866e6e Poul Sander 2024-05-11 14:14 90
			          e.what() << "\n";
71866e6e Poul Sander 2024-05-11 14:14 91
			stages.clear();
ae5d6381 sago007 2015-12-29 13:26 92
		}
ae5d6381 sago007 2015-12-29 13:26 93
	}
ae5d6381 sago007 2015-12-29 13:26 94
	else {
8ace9b0f sago007 2016-02-14 17:57 95
		stages.clear();
8ace9b0f sago007 2016-02-14 17:57 96
	}
c03502ad Poul Sander 2025-10-11 17:10 97
	readFileContent = sago::GetFileContent("misc/stage_clear_par.json");
c03502ad Poul Sander 2025-10-11 17:10 98
	json j = json::parse(readFileContent);
c03502ad Poul Sander 2025-10-11 17:10 99
	try {
c03502ad Poul Sander 2025-10-11 17:10 100
		j.at("stages").get_to(parScores);
c03502ad Poul Sander 2025-10-11 17:10 101
	} catch (json::exception& e) {
c03502ad Poul Sander 2025-10-11 17:10 102
		std::cerr << "Failed to read par times. Reason: " << e.what() << "\n";
c03502ad Poul Sander 2025-10-11 17:10 103
	}
8ace9b0f sago007 2016-02-14 17:57 104
	stages.resize(nrOfStageLevels);
8ace9b0f sago007 2016-02-14 17:57 105
	totalScore = 0;
8ace9b0f sago007 2016-02-14 17:57 106
	totalTime = 0;
8ace9b0f sago007 2016-02-14 17:57 107
	for (const StageClearElement& s : stages) {
8ace9b0f sago007 2016-02-14 17:57 108
		totalScore += s.score;
8ace9b0f sago007 2016-02-14 17:57 109
		totalTime += s.time;
ae5d6381 sago007 2015-12-29 13:26 110
	}
ae5d6381 sago007 2015-12-29 13:26 111
}
ae5d6381 sago007 2015-12-29 13:26 112
ae5d6381 sago007 2015-12-29 13:26 113
int GetTotalScore() {
ae5d6381 sago007 2015-12-29 13:26 114
	return totalScore;
ae5d6381 sago007 2015-12-29 13:26 115
}
ae5d6381 sago007 2015-12-29 13:26 116
int GetTotalTime() {
ae5d6381 sago007 2015-12-29 13:26 117
	return totalTime;
ae5d6381 sago007 2015-12-29 13:26 118
}
ae5d6381 sago007 2015-12-29 13:26 119
ae5d6381 sago007 2015-12-29 13:26 120
int GetNrOfLevels() {
ae5d6381 sago007 2015-12-29 13:26 121
	return nrOfStageLevels;
ae5d6381 sago007 2015-12-29 13:26 122
}
ae5d6381 sago007 2015-12-29 13:26 123
ae5d6381 sago007 2015-12-29 13:26 124
bool IsStageCleared(int level) {
8ace9b0f sago007 2016-02-14 17:57 125
	return stages.at(level).cleared;
ae5d6381 sago007 2015-12-29 13:26 126
}
ae5d6381 sago007 2015-12-29 13:26 127
c03502ad Poul Sander 2025-10-11 17:10 128
int GetStageParScore(int level) {
c03502ad Poul Sander 2025-10-11 17:10 129
	return parScores.at(level).score;
c03502ad Poul Sander 2025-10-11 17:10 130
}
ae5d6381 sago007 2015-12-29 13:26 131
ae5d6381 sago007 2015-12-29 13:26 132
int GetStageScores(int level) {
8ace9b0f sago007 2016-02-14 17:57 133
	return stages.at(level).score;
ae5d6381 sago007 2015-12-29 13:26 134
}
ae5d6381 sago007 2015-12-29 13:26 135
ae5d6381 sago007 2015-12-29 13:26 136
int GetStageTime(int level) {
8ace9b0f sago007 2016-02-14 17:57 137
	return stages.at(level).time;
8ace9b0f sago007 2016-02-14 17:57 138
}
1970-01-01 00:00 139