git repos / blockattack-game

blame: source/code/puzzlehandler.cpp

normal view · raw

1899da11 sago007 2015-12-30 19:04 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
1899da11 sago007 2015-12-30 19:04 20
http://blockattack.net
1899da11 sago007 2015-12-30 19:04 21
===========================================================================
1899da11 sago007 2015-12-30 19:04 22
*/
1899da11 sago007 2015-12-30 19:04 23
055218be sago007 2015-08-22 18:44 24
#include "puzzlehandler.hpp"
055218be sago007 2015-08-22 18:44 25
#include <vector>
055218be sago007 2015-08-22 18:44 26
#include <iostream>
055218be sago007 2015-08-22 18:44 27
#include "stats.h"
055218be sago007 2015-08-22 18:44 28
#include <physfs.h>         //Abstract file system. To use containers
63acc19f sago007 2016-02-15 17:48 29
#include "cereal/cereal.hpp"
63acc19f sago007 2016-02-15 17:48 30
#include "cereal/types/vector.hpp"
63acc19f sago007 2016-02-15 17:48 31
#include "cereal/archives/json.hpp"
63acc19f sago007 2016-02-15 17:48 32
#include "sago/SagoMisc.hpp"
055218be sago007 2015-08-22 18:44 33
96eb7a16 sago007 2016-04-29 17:01 34
using std::string;
96eb7a16 sago007 2016-04-29 17:01 35
using std::cerr;
96eb7a16 sago007 2016-04-29 17:01 36
using std::endl;
96eb7a16 sago007 2016-04-29 17:01 37
using std::vector;
53001fa2 sago007 2015-11-08 15:13 38
63acc19f sago007 2016-02-15 17:48 39
const int maxNrOfPuzzleStages = 50; //Maximum number of puzzle stages
63acc19f sago007 2016-02-15 17:48 40
055218be sago007 2015-08-22 18:44 41
static std::string puzzleSavePath;
055218be sago007 2015-08-22 18:44 42
static std::string puzzleName;              //The filename of
055218be sago007 2015-08-22 18:44 43
static std::vector<bool> puzzleCleared(maxNrOfPuzzleStages); //vector that tells if puzzle cleared
055218be sago007 2015-08-22 18:44 44
static std::vector<int> nrOfMovesAllowed(maxNrOfPuzzleStages);  //Moves to clear
055218be sago007 2015-08-22 18:44 45
static int puzzleLevels[maxNrOfPuzzleStages][6][12]; //Contains board layout;
055218be sago007 2015-08-22 18:44 46
static int nrOfPuzzles;    //How many are there actually?
055218be sago007 2015-08-22 18:44 47
055218be sago007 2015-08-22 18:44 48
int PuzzleNumberOfMovesAllowed(int level) {
055218be sago007 2015-08-22 18:44 49
	return nrOfMovesAllowed.at(level);
055218be sago007 2015-08-22 18:44 50
}
055218be sago007 2015-08-22 18:44 51
055218be sago007 2015-08-22 18:44 52
int PuzzleGetBrick(int level, int x, int y) {
055218be sago007 2015-08-22 18:44 53
	return puzzleLevels[level][x][y];
055218be sago007 2015-08-22 18:44 54
}
055218be sago007 2015-08-22 18:44 55
055218be sago007 2015-08-22 18:44 56
int PuzzleGetNumberOfPuzzles() {
055218be sago007 2015-08-22 18:44 57
	return nrOfPuzzles;
055218be sago007 2015-08-22 18:44 58
}
055218be sago007 2015-08-22 18:44 59
055218be sago007 2015-08-22 18:44 60
bool PuzzleIsCleared(int level) {
055218be sago007 2015-08-22 18:44 61
	return puzzleCleared.at(level);
055218be sago007 2015-08-22 18:44 62
}
055218be sago007 2015-08-22 18:44 63
055218be sago007 2015-08-22 18:44 64
const std::string& PuzzleGetName() {
055218be sago007 2015-08-22 18:44 65
	return puzzleName;
055218be sago007 2015-08-22 18:44 66
}
055218be sago007 2015-08-22 18:44 67
055218be sago007 2015-08-22 18:44 68
void PuzzleSetName(const std::string& name) {
055218be sago007 2015-08-22 18:44 69
	puzzleName = name;
63acc19f sago007 2016-02-15 17:48 70
	puzzleSavePath = name + ".json.save";
63acc19f sago007 2016-02-15 17:48 71
}
63acc19f sago007 2016-02-15 17:48 72
63acc19f sago007 2016-02-15 17:48 73
void LoadClearData() {
63acc19f sago007 2016-02-15 17:48 74
	std::string readFileContent = sago::GetFileContent(puzzleSavePath.c_str());
63acc19f sago007 2016-02-15 17:48 75
	if (readFileContent.length() > 0) {
63acc19f sago007 2016-02-15 17:48 76
		std::stringstream ss(readFileContent);
63acc19f sago007 2016-02-15 17:48 77
		{
ad2d11ab Poul Sander 2016-02-17 19:06 78
			try {
ad2d11ab Poul Sander 2016-02-17 19:06 79
				cereal::JSONInputArchive archive(ss);
ad2d11ab Poul Sander 2016-02-17 19:06 80
				archive(cereal::make_nvp("cleared", puzzleCleared));
ad2d11ab Poul Sander 2016-02-17 19:06 81
			}
c7f2082f sago007 2016-03-13 11:48 82
			catch (cereal::Exception& e) {
ad2d11ab Poul Sander 2016-02-17 19:06 83
				std::cerr << "Failed to read \"" << puzzleSavePath << "\". File will be regenerated. Reason: " << e.what() << std::endl;
ad2d11ab Poul Sander 2016-02-17 19:06 84
				puzzleCleared.clear();
ad2d11ab Poul Sander 2016-02-17 19:06 85
			}
63acc19f sago007 2016-02-15 17:48 86
		}
63acc19f sago007 2016-02-15 17:48 87
	}
63acc19f sago007 2016-02-15 17:48 88
	else {
63acc19f sago007 2016-02-15 17:48 89
		puzzleCleared.clear();
63acc19f sago007 2016-02-15 17:48 90
	}
63acc19f sago007 2016-02-15 17:48 91
	puzzleCleared.resize(nrOfPuzzles);
63acc19f sago007 2016-02-15 17:48 92
}
63acc19f sago007 2016-02-15 17:48 93
63acc19f sago007 2016-02-15 17:48 94
void SaveClearData() {
63acc19f sago007 2016-02-15 17:48 95
	std::stringstream ss;
63acc19f sago007 2016-02-15 17:48 96
	{
63acc19f sago007 2016-02-15 17:48 97
		cereal::JSONOutputArchive archive(ss);
63acc19f sago007 2016-02-15 17:48 98
		archive(cereal::make_nvp("cleared", puzzleCleared));
63acc19f sago007 2016-02-15 17:48 99
	}
63acc19f sago007 2016-02-15 17:48 100
	sago::WriteFileContent(puzzleSavePath.c_str(), ss.str());
055218be sago007 2015-08-22 18:44 101
}
055218be sago007 2015-08-22 18:44 102
055218be sago007 2015-08-22 18:44 103
void PuzzleSetClear(int Level) {
ecef5838 sago007 2015-11-24 20:01 104
	if (puzzleCleared[Level]==false) {
055218be sago007 2015-08-22 18:44 105
		Stats::getInstance()->addOne("puzzlesSolved");
acd79baf sago007 2015-11-22 19:37 106
	}
055218be sago007 2015-08-22 18:44 107
	puzzleCleared[Level] = true;
63acc19f sago007 2016-02-15 17:48 108
	SaveClearData();
055218be sago007 2015-08-22 18:44 109
}
055218be sago007 2015-08-22 18:44 110
055218be sago007 2015-08-22 18:44 111
/*Loads all the puzzle levels*/
ecef5838 sago007 2015-11-24 20:01 112
int LoadPuzzleStages( ) {
ecef5838 sago007 2015-11-24 20:01 113
	if (!PHYSFS_exists(((std::string)("puzzles/"+puzzleName)).c_str())) {
055218be sago007 2015-08-22 18:44 114
		std::cerr << "Warning: File not in blockattack.data: " << ("puzzles/"+puzzleName) << endl;
055218be sago007 2015-08-22 18:44 115
		return -1; //file doesn't exist
055218be sago007 2015-08-22 18:44 116
	}
f1091f34 sago007 2016-03-25 20:56 117
	std::string fileContent = sago::GetFileContent(((std::string)("puzzles/"+puzzleName)).c_str());
f1091f34 sago007 2016-03-25 20:56 118
	std::stringstream inFile(fileContent);
055218be sago007 2015-08-22 18:44 119
055218be sago007 2015-08-22 18:44 120
	inFile >> nrOfPuzzles;
acd79baf sago007 2015-11-22 19:37 121
	if (nrOfPuzzles>maxNrOfPuzzleStages) {
055218be sago007 2015-08-22 18:44 122
		nrOfPuzzles=maxNrOfPuzzleStages;
acd79baf sago007 2015-11-22 19:37 123
	}
c35c2b10 sago007 2016-03-31 18:49 124
	if (nrOfPuzzles < 0) {
c35c2b10 sago007 2016-03-31 18:49 125
		nrOfPuzzles = 0;
c35c2b10 sago007 2016-03-31 18:49 126
	}
c35c2b10 sago007 2016-03-31 18:49 127
	for (int k=0; k<nrOfPuzzles ; k++) {
c35c2b10 sago007 2016-03-31 18:49 128
		inFile >> nrOfMovesAllowed.at(k);
055218be sago007 2015-08-22 18:44 129
		for (int i=11; i>=0; i--)
ecef5838 sago007 2015-11-24 20:01 130
			for (int j=0; j<6; j++) {
055218be sago007 2015-08-22 18:44 131
				inFile >> puzzleLevels[k][j][i];
055218be sago007 2015-08-22 18:44 132
			}
055218be sago007 2015-08-22 18:44 133
	}
63acc19f sago007 2016-02-15 17:48 134
	LoadClearData();
055218be sago007 2015-08-22 18:44 135
	return 0;
63acc19f sago007 2016-02-15 17:48 136
}
1970-01-01 00:00 137