git repos / blockattack-game

blame: source/code/puzzlehandler.cpp

normal view · raw

055218be sago007 2015-08-22 18:44 1
#include "puzzlehandler.hpp"
055218be sago007 2015-08-22 18:44 2
#include <vector>
055218be sago007 2015-08-22 18:44 3
#include <fstream>
055218be sago007 2015-08-22 18:44 4
#include <iostream>
055218be sago007 2015-08-22 18:44 5
#include "stats.h"
055218be sago007 2015-08-22 18:44 6
#include <physfs.h>         //Abstract file system. To use containers
055218be sago007 2015-08-22 18:44 7
#include "physfs_stream.hpp" //To use C++ style file streams
055218be sago007 2015-08-22 18:44 8
53001fa2 sago007 2015-11-08 15:13 9
using namespace std;
53001fa2 sago007 2015-11-08 15:13 10
055218be sago007 2015-08-22 18:44 11
static const int maxNrOfPuzzleStages = 50; //Maximum number of puzzle stages
055218be sago007 2015-08-22 18:44 12
static std::string puzzleSavePath;
055218be sago007 2015-08-22 18:44 13
static std::string puzzleName;              //The filename of
055218be sago007 2015-08-22 18:44 14
static std::vector<bool> puzzleCleared(maxNrOfPuzzleStages); //vector that tells if puzzle cleared
055218be sago007 2015-08-22 18:44 15
static std::vector<int> nrOfMovesAllowed(maxNrOfPuzzleStages);  //Moves to clear
055218be sago007 2015-08-22 18:44 16
static int puzzleLevels[maxNrOfPuzzleStages][6][12]; //Contains board layout;
055218be sago007 2015-08-22 18:44 17
static int nrOfPuzzles;    //How many are there actually?
055218be sago007 2015-08-22 18:44 18
055218be sago007 2015-08-22 18:44 19
int PuzzleNumberOfMovesAllowed(int level) {
055218be sago007 2015-08-22 18:44 20
	return nrOfMovesAllowed.at(level);
055218be sago007 2015-08-22 18:44 21
}
055218be sago007 2015-08-22 18:44 22
055218be sago007 2015-08-22 18:44 23
int PuzzleGetBrick(int level, int x, int y) {
055218be sago007 2015-08-22 18:44 24
	return puzzleLevels[level][x][y];
055218be sago007 2015-08-22 18:44 25
}
055218be sago007 2015-08-22 18:44 26
055218be sago007 2015-08-22 18:44 27
int PuzzleGetNumberOfPuzzles() {
055218be sago007 2015-08-22 18:44 28
	return nrOfPuzzles;
055218be sago007 2015-08-22 18:44 29
}
055218be sago007 2015-08-22 18:44 30
055218be sago007 2015-08-22 18:44 31
bool PuzzleIsCleared(int level) {
055218be sago007 2015-08-22 18:44 32
	return puzzleCleared.at(level);
055218be sago007 2015-08-22 18:44 33
}
055218be sago007 2015-08-22 18:44 34
055218be sago007 2015-08-22 18:44 35
const std::string& PuzzleGetName() {
055218be sago007 2015-08-22 18:44 36
	return puzzleName;
055218be sago007 2015-08-22 18:44 37
}
055218be sago007 2015-08-22 18:44 38
055218be sago007 2015-08-22 18:44 39
void PuzzleSetName(const std::string& name) {
055218be sago007 2015-08-22 18:44 40
	puzzleName = name;
055218be sago007 2015-08-22 18:44 41
}
055218be sago007 2015-08-22 18:44 42
055218be sago007 2015-08-22 18:44 43
void PuzzleSetSavePath(const std::string& filepath) {
055218be sago007 2015-08-22 18:44 44
	puzzleSavePath = filepath;
055218be sago007 2015-08-22 18:44 45
}
055218be sago007 2015-08-22 18:44 46
055218be sago007 2015-08-22 18:44 47
void PuzzleSetClear(int Level) {
055218be sago007 2015-08-22 18:44 48
	if(puzzleCleared[Level]==false)
055218be sago007 2015-08-22 18:44 49
		Stats::getInstance()->addOne("puzzlesSolved");
055218be sago007 2015-08-22 18:44 50
	puzzleCleared[Level] = true;
055218be sago007 2015-08-22 18:44 51
	std::ofstream outfile;
055218be sago007 2015-08-22 18:44 52
	outfile.open(puzzleSavePath.c_str(), ios::binary |ios::trunc);
055218be sago007 2015-08-22 18:44 53
	if (!outfile)
055218be sago007 2015-08-22 18:44 54
	{
055218be sago007 2015-08-22 18:44 55
		std::cerr << "Error writing to file: " << puzzleSavePath << endl;
055218be sago007 2015-08-22 18:44 56
	}
055218be sago007 2015-08-22 18:44 57
	else
055218be sago007 2015-08-22 18:44 58
	{
055218be sago007 2015-08-22 18:44 59
		for (int i=0; i<nrOfPuzzles; i++)
055218be sago007 2015-08-22 18:44 60
		{
055218be sago007 2015-08-22 18:44 61
			bool tempBool = puzzleCleared[i];
055218be sago007 2015-08-22 18:44 62
			outfile.write(reinterpret_cast<char*>(&tempBool), sizeof(bool));
055218be sago007 2015-08-22 18:44 63
		}
055218be sago007 2015-08-22 18:44 64
		outfile.close();
055218be sago007 2015-08-22 18:44 65
	}
055218be sago007 2015-08-22 18:44 66
}
055218be sago007 2015-08-22 18:44 67
055218be sago007 2015-08-22 18:44 68
/*Loads all the puzzle levels*/
055218be sago007 2015-08-22 18:44 69
int LoadPuzzleStages( )
055218be sago007 2015-08-22 18:44 70
{
055218be sago007 2015-08-22 18:44 71
	if (!PHYSFS_exists(((std::string)("puzzles/"+puzzleName)).c_str()))
055218be sago007 2015-08-22 18:44 72
	{
055218be sago007 2015-08-22 18:44 73
		std::cerr << "Warning: File not in blockattack.data: " << ("puzzles/"+puzzleName) << endl;
055218be sago007 2015-08-22 18:44 74
		return -1; //file doesn't exist
055218be sago007 2015-08-22 18:44 75
	}
055218be sago007 2015-08-22 18:44 76
	PhysFS::ifstream inFile(((std::string)("puzzles/"+puzzleName)).c_str());
055218be sago007 2015-08-22 18:44 77
055218be sago007 2015-08-22 18:44 78
	inFile >> nrOfPuzzles;
055218be sago007 2015-08-22 18:44 79
	if (nrOfPuzzles>maxNrOfPuzzleStages)
055218be sago007 2015-08-22 18:44 80
		nrOfPuzzles=maxNrOfPuzzleStages;
055218be sago007 2015-08-22 18:44 81
	for (int k=0; (k<nrOfPuzzles) /*&&(!inFile.eof())*/ ; k++)
055218be sago007 2015-08-22 18:44 82
	{
055218be sago007 2015-08-22 18:44 83
		inFile >> nrOfMovesAllowed[k];
055218be sago007 2015-08-22 18:44 84
		for (int i=11; i>=0; i--)
055218be sago007 2015-08-22 18:44 85
			for (int j=0; j<6; j++)
055218be sago007 2015-08-22 18:44 86
			{
055218be sago007 2015-08-22 18:44 87
				inFile >> puzzleLevels[k][j][i];
055218be sago007 2015-08-22 18:44 88
			}
055218be sago007 2015-08-22 18:44 89
	}
055218be sago007 2015-08-22 18:44 90
	bool tempBool;
055218be sago007 2015-08-22 18:44 91
	std::ifstream puzzleFile(puzzleSavePath.c_str(), std::ios::binary);
055218be sago007 2015-08-22 18:44 92
	if (puzzleFile)
055218be sago007 2015-08-22 18:44 93
	{
055218be sago007 2015-08-22 18:44 94
		for (int i=0; (i<nrOfPuzzles)&&(!puzzleFile.eof()); i++)
055218be sago007 2015-08-22 18:44 95
		{
055218be sago007 2015-08-22 18:44 96
			puzzleFile.read(reinterpret_cast<char*>(&tempBool),sizeof(bool));
055218be sago007 2015-08-22 18:44 97
			puzzleCleared[i] = tempBool;
055218be sago007 2015-08-22 18:44 98
		}
055218be sago007 2015-08-22 18:44 99
		puzzleFile.close();
055218be sago007 2015-08-22 18:44 100
	}
055218be sago007 2015-08-22 18:44 101
	else
055218be sago007 2015-08-22 18:44 102
	{
055218be sago007 2015-08-22 18:44 103
		tempBool = false;
055218be sago007 2015-08-22 18:44 104
		for (int i=0; i<nrOfPuzzles; i++)
055218be sago007 2015-08-22 18:44 105
			puzzleCleared[i] = tempBool;
055218be sago007 2015-08-22 18:44 106
	}
055218be sago007 2015-08-22 18:44 107
	return 0;
055218be sago007 2015-08-22 18:44 108
}