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