biquadris / level.cc
level.cc
Raw
#include "level.h"
using namespace std;

const int Level::MAX_LEVEL = 4;
const int Level::MIN_LEVEL = 0;

default_random_engine Level::generator = default_random_engine{};

map<int,discrete_distribution<int>> Level::distributions = {
	{1, discrete_distribution<int>{2,2,2,2,1,1,2}},
	{2, discrete_distribution<int>{1,1,1,1,1,1,1}},
	{3, discrete_distribution<int>{1,1,1,1,2,2,1}},
	{4, discrete_distribution<int>{1,1,1,1,2,2,1}}
};

map<int, char> Level::blockTypes = {
	{0, 'I'}, {1, 'J'}, {2, 'L'}, {3, 'O'}, {4, 'S'},
	{5, 'Z'}, {6, 'T'}
};

Level::Level(int level, int seed, std::string file) :
	level{level}, isRandom{true}, defaultFile{file} {
	defaultStream.open(file);
	generator.seed(seed);
}

Level::~Level() { defaultStream.close(); sequenceStream.close(); }

char Level::nextBlock() {
	char type;
	if (level == 0) {
		if (!(defaultStream >> type)) {
			defaultStream.close();
			defaultStream.open(defaultFile);
			defaultStream >> type;
		}
		return type;
	} else if (level >= 3 && !isRandom) {
		if (!(sequenceStream >> type)) {
			sequenceStream.close();
			sequenceStream.open(sequenceFile);
			sequenceStream >> type;
		}
		return type;
	} else {
		const int random = distributions.find(level)->second(generator);
		return blockTypes.find(random)->second;
	}
}

void Level::setRandom(bool active) {
	this->isRandom = active;
}

void Level::setSequence(std::string file) {
	this->sequenceFile = file;
	sequenceStream.close();
	sequenceStream.open(file);
}

void Level::levelUp() {
	if (level == MAX_LEVEL) return;
    ++level;
}

void Level::levelDown() {
	if (level == MIN_LEVEL) return;
    --level;
}