Esempio n. 1
0
/**
 * @brief BoardParser::wczytajLegende		Wczytuje legendę zawierającą symbole hexów
 * @param wejscie	QTextStream, z którego odczytywane są dane
 * @return		true, jeśli wystąpił błąd, false w p.p.
 */
bool BoardParser::wczytajLegende(QTextStream* wejscie)
{
	bool ok = true;
	int dlLegendy = nastepny(wejscie).toInt(&ok);

	if(!ok)
	{
		trescBledu = QString::fromUtf8("Wystąpił błąd przy wczytywaniu długości legendy");
		return true;
	}

	for(int i = 0; i < dlLegendy; ++i)
	{
		QString linia = nastepny(wejscie);
		QStringList podzial = linia.split(";");

		if(podzial.size() != 7)
		{
			trescBledu = QString::fromUtf8("Wystąpił błąd przy wczytywaniu legendy.\nZła ilość pol. Wadliwy element: ") + QString::number(i + 1);
			return true;
		}

		bool bezBledu = true;
		bool bezBledu2 = true;
		info informacje;
		informacje.name = podzial.at(1);
		informacje.plik = podzial.at(2);
		informacje.wspolczynnik = podzial.at(5).toInt(&bezBledu);
		informacje.frakcja = podzial.at(6).toInt(&bezBledu2);

		if(podzial.at(3) == "1")
			informacje.czyPoleZEnemyiem = true;
		else if(podzial.at(3) == "0")
			informacje.czyPoleZEnemyiem = false;
		else bezBledu = false;

		if(podzial.at(4) == "1")
			informacje.czyPoleZMiastem = true;
		else if(podzial.at(4) == "0")
			informacje.czyPoleZMiastem = false;
		else bezBledu = false;

		if(!bezBledu || !bezBledu2 || podzial.at(0).isEmpty())
		{
			trescBledu = QString::fromUtf8("Wystąpił błąd przy wczytywaniu legendy.\nZły element: ") + QString::number(i + 1);
			return true;
		}
		legenda.insert(podzial.at(0), informacje);
	}
	return false;
}
Esempio n. 2
0
BoardParser::BoardParser(Board* plansza)
{
	bylBlad = false;
	this->plansza = plansza;
	QFile ustawienie(PLIK_USTAWIENIA_PLANSZY);

	if(!ustawienie.open(QIODevice::ReadOnly))
	{
		trescBledu = QString::fromUtf8("Nie udało się wczytać pliku.");
		bylBlad = true;
		return;
	}
	QTextStream wejscie(&ustawienie);

	bylBlad = wczytajWymiary(&wejscie);
	if(!bylBlad)
		bylBlad = wczytajLegende(&wejscie);
	if(!bylBlad)
		bylBlad = wczytajUstawienie(&wejscie);

	if(!bylBlad && !nastepny(&wejscie).isEmpty())
	{
		trescBledu = QString::fromUtf8("Plik wejściowy jest za długi.");
		bylBlad = true;
	}
	ustawienie.close();
}
Esempio n. 3
0
/**
 * @brief BoardParser::wczytajUstawienie	Wczytuje ustawienie planszy
 *						zgodnie z wcześniej wczytaną legendą i wymiarami.
 * @param wejscie	QTextStream, z którego odczytywane są dane
 * @return		true, jeśli wystąpił błąd, false w p.p.
 */
bool BoardParser::wczytajUstawienie(QTextStream* wejscie)
{
	QList<Field*>* listaPol = new QList<Field*>;

	for(int i = 0; i < wysokosc; ++i)
	{
		QString linia = nastepny(wejscie);
		QStringList podzial = linia.split(";");
		if(podzial.size() != szerokosc)
		{
			trescBledu = QString::fromUtf8("Wystąpił błąd przy wczytywaniu odwzorowania.\nZła ilosc danych. Wadliwy wiersz: ") + QString::number(i + 1);
			return true;
		}
		for(int j = 0; j < szerokosc; ++j)
		{
			QString symbol = (podzial.at(j));
			symbol.remove(QChar(' '));

			if(!legenda.contains(symbol))
			{
				trescBledu = QString::fromUtf8("Wystąpił błąd przy wczytywaniu odwzorowania.\nNie znaleniono odpowiedniego symbolu.\nWadliwy wiersz: ")  + QString::number(i + 1) + QString(". Symbol: ") + symbol;
				return true;
			}
			info dane = legenda[symbol];
			FieldId miejsce = {j,i};
			listaPol->push_back(new Field(miejsce, dane.name, dane.wspolczynnik, dane.czyPoleZEnemyiem, dane.czyPoleZMiastem, dane.plik, dane.frakcja));

			if(dane.czyPoleZMiastem)
				plansza->cities_.push_back(plansza->fieldIdToIndex(miejsce));
		}
	}
	plansza->fields_ = listaPol;
	return false;
}
Esempio n. 4
0
/**
 * @brief BoardParser::wczytajWymiary	Wczytuje wymiary planszy, znajdujące się w pierwszej linijce
 * @param wejscie	QTextStream, z którego odczytywane są dane
 * @return		true, jeśli wystąpił błąd, false w p.p.
 */
bool BoardParser::wczytajWymiary(QTextStream* wejscie)
{
	QString linia = nastepny(wejscie);

	QStringList podzial = linia.split(";");
	if(podzial.size() != 2)
	{
		trescBledu = QString::fromUtf8("Wystąpił błąd przy wczytaniu wymiarów");
		return true;
	}

	bool ok1 = true;
	bool ok2 = true;
	szerokosc = podzial.at(0).toUInt(&ok1);
	plansza->boardWidth_ = szerokosc;
	wysokosc = podzial.at(1).toUInt(&ok2);
	plansza->boardHeight_ = wysokosc;
	if(!ok1 || !ok2 || szerokosc < 1 || wysokosc < 1)
	{
		trescBledu = QString::fromUtf8("Podane wymiary nie są poprawne.");
		return true;
	}
	return false;
}
Esempio n. 5
0
/**
 * @brief ItemParser::wczytajDane Wczytuje dane o przedmiotach korzystając z podanego wejścia
 * @param wejscie
 * @return true, jeśli wystąpił błąd, false w p.p.
 */
bool ItemParser::wczytajDane(QTextStream *wejscie)
{
	QString linia;
	int numerLinii = 1;
	while((linia = nastepny(wejscie)) != "")
	{
//-----------NAZWA GRUPY
		if(linia[0] == '$')
		{
			aktualnaGrupa = linia.right(linia.size() - 1);
			continue;
		}
//-----------ILOSC ARGUMENTÓW
		QStringList podzial = linia.split(";");
		if(podzial.size() != 15)
		{
			trescBledu = QString::fromUtf8("Zła ilość pól. Wadliwa linia: ") + QString::number(numerLinii);
			return true;
		}
		informacje info;
//-----------NAZWA I DŁUGOŚĆ SMBOLI
		info.name = podzial.at(1);
		if(podzial.at(2).size()!= 1 && podzial.at(14).size() != 1)
		{
			trescBledu = QString::fromUtf8("Niepoprawne symbole. Wadliwa linia: ") + QString::number(numerLinii);
			return true;
		}
		info.typ = podzial.at(2)[0].toLatin1();

//-----------WARTOŚCI BOOL-OWSKIE
		bool blad = false;

		QString tmp2 = podzial.at(11);
		tmp2.remove(" ");
		if(tmp2 == "0")
			info.czy1Reczna = false;
		else if(tmp2 == "1")
			info.czy1Reczna = true;
		else blad = true;

		tmp2 = podzial.at(12);
		tmp2.remove(" ");
		if(tmp2 == "0")
			info.czyMocny = false;
		else if(tmp2 == "1")
			info.czyMocny = true;
		else blad = true;

		if(blad)
		{
			trescBledu = QString::fromUtf8("Niepoprawne wartości. Wadliwa linia: ") + QString::number(numerLinii);
			return true;
		}
//-----------LICZBY CAŁKOWITE
		bool okID;
		bool okWrecz;
		bool okDystans;
		bool okMagia;
		bool okObrona;
		bool okPercepcja;
		bool okHP;
		bool okHPRegen;
		bool okOgraniczenia;
		bool okWartosc;
		bool okJakosc;

		info.id = podzial.at(0).toInt(&okID);
		info.wrecz = podzial.at(3).toInt(&okWrecz);
		info.dystans = podzial.at(4).toInt(&okDystans);
		info.magia = podzial.at(5).toInt(&okMagia);
		info.defence = podzial.at(6).toInt(&okObrona);
		info.perception = podzial.at(7).toInt(&okPercepcja);
		info.HP = podzial.at(8).toInt(&okHP);
		info.HPregen = podzial.at(9).toInt(&okHPRegen);
		info.ograniczenie = podzial.at(10).toInt(&okOgraniczenia);
		info.wartosc = podzial.at(13).toInt(&okWartosc);
		info.jakosc = podzial.at(14).toInt(&okJakosc);

		if(!okID ||!okWrecz || !okDystans || !okMagia || !okObrona || !okPercepcja || !okHP || !okHPRegen || !okOgraniczenia || !okWartosc || !okJakosc)
		{
			trescBledu = QString::fromUtf8("Niepoprawne dane w linii ") + QString::number(numerLinii);
			return true;
		}

		if( info.wartosc < 0)
		{
			trescBledu = QString::fromUtf8("Niepoprawna wartość przedmiotu w linii ") + QString::number(numerLinii);
			return true;
		}

		if( info.jakosc < 0 || info.jakosc >= NUMBER_OF_POSSIBLE_QUALITIES)
		{
			trescBledu = QString::fromUtf8("Niepoprawna wartość jakości w linii ") + QString::number(numerLinii);
			return true;
		}
//-----------POPRAWNOŚĆ OGRANICZENIA
		blad = false;
		int tmp = info.ograniczenie;
		for(int i = 0; i < PlayerClassCount; ++i, tmp /= 10)
			if(tmp % 10 != 0 && tmp % 10 != 1)
				blad = true;
		if(blad || podzial.at(10).size() != PlayerClassCount)
		{
			trescBledu = QString::fromUtf8("Niepoprawne ograniczenia w linii ") + QString::number(numerLinii);
			return true;
		}
//-----------POPRAWNOŚĆ TYPU
		//można było zamiast czy1ręczna dołożyć 1 typ przy wczytywaniu, ale teraz już jest za dużo pracy przy zamianie.
		//na dłuższą metę nie ma to znaczenia
		ItemType rodzaj;
		switch (info.typ) {
		case 'w':
			if(info.czy1Reczna)
				rodzaj = bronJednoreczna;
			else
				rodzaj = bronDwureczna;
			break;
		case 't':
			rodzaj = tarcza;
			break;
		case 'p':
			rodzaj = pancerz;
			break;
		case 'h':
			rodzaj = helm;
			break;
		case 'a':
			rodzaj = artefakt;
			break;
		case 'm':
			rodzaj = mikstura;
			break;
		default:
			trescBledu = QString::fromUtf8("Niepoprawny symbol typu w linii ") + QString::number(numerLinii);
			return true;
			break;
		}

//-----------ZAPISANIE DANYCH
		QList<int>* poprzednie;
		if(mistrzGry->itemGroups_.contains(aktualnaGrupa))
			poprzednie = mistrzGry->itemGroups_[aktualnaGrupa];
		else
		{
			poprzednie = new QList<int>;
			mistrzGry->itemGroups_.insert(aktualnaGrupa, poprzednie);
		}
		poprzednie->push_back(info.id);
		Item* nowy = new Item(info.name,
		                      rodzaj,
		                      info.wrecz,
		                      info.dystans,
		                      info.magia,
		                      info.defence,
		                      info.perception,
		                      info.HP,
		                      info.HPregen,
		                      info.ograniczenie,
		                      info.wartosc,
		                      info.czyMocny,
		                      (ItemQuality)info.jakosc);
		mistrzGry->items_.insert(info.id, nowy);

		++numerLinii;

	}
	return false;
}
/**
 * @brief EnemyParser::wczytajDane Wczytuje dane o przeciwnikach korzystając z podanego wejscia
 * @param wejscie
 * @return true, jeśli wystąpił błąd, false, w p.p.
 */
bool EnemyParser::wczytajDane(QTextStream* wejscie)
{
	QString linia;
	int numerLinii = 1;

	while((linia = nastepny(wejscie)) != "")
	{
//-----------NAZWA GRUPY
		if(linia[0] == '$')
		{
			if(aktualnaGrupa != -1 && !mistrzGry->enemyGroups_.contains(aktualnaGrupa))
			{
				trescBledu = QString::fromUtf8("Grupa nie może być pusta.\nPusta jest grupa: ") + aktualnaGrupa;
				return true;
			}
			QString grupa = linia.right(linia.size() - 1);
			bool okGrupa;
			aktualnaGrupa = grupa.toInt(&okGrupa);
			if(!okGrupa)
			{
				trescBledu = QString::fromUtf8("Nieprawidłowa name grupy.\nPodano: ") + grupa;
				return true;
			}

			continue;
		} else if(aktualnaGrupa == -1)
		{
			trescBledu = QString::fromUtf8("Nie podano nazwy grupy.");
			return true;
		}

//-----------ILOŚĆ ARGUMENTÓW
		QStringList podzial = linia.split(";");
		if(podzial.size() != 8)
		{
			trescBledu = QString::fromUtf8( "Zła ilość pol. Wadliwa linia: ") + QString::number(numerLinii);
			return true;
		}

		QStringList atak = podzial.at(3).split(",");
		if (atak.size() != 2)
		{
			trescBledu = QString::fromUtf8("Niepoprawne dane dot. ataku w wierszu ") + QString::number(numerLinii);
			return true;
		}
//-----------ZAPISANIE TEKSTÓW
		informacje info;
		info.name = podzial.at(1);
		info.nameObrazka = podzial.at(2);
//-----------LICZBY CAŁKOWITE
		bool okID;
		bool okMin;
		bool okMaks;
		bool okObrona;
		bool okHP;
		bool okIDNagrody;
		bool okPercepcja;
		info.id = podzial.at(0).toInt(&okID);
		info.atakMin = atak.at(0).toInt(&okMin);
		info.atakMaks = atak.at(1).toInt(&okMaks);
		info.defence = podzial.at(4).toInt(&okObrona);
		info.zdrowie = podzial.at(5).toInt(&okHP);
		info.idNagrody = podzial.at(6).toInt(&okIDNagrody);
		info.perception = podzial.at(7).toInt(&okPercepcja);

		if(!okID ||!okMin || !okMaks || !okObrona || !okHP || !okIDNagrody || !okPercepcja)
		{
			trescBledu = QString::fromUtf8("Niepoprawne dane w linii ") + QString::number(numerLinii);
			return true;
		}
		if(!mistrzGry->prizes_.contains(info.idNagrody))
		{
			trescBledu = QString::fromUtf8("Niepoprawny identyfikator nagrody w linii ") + QString::number(numerLinii);
			return true;
		}

		if(info.atakMin > info.atakMaks || info.atakMin < 0 || info.defence < 0 || info.zdrowie < 0 || info.perception < 0)
		{
			trescBledu = QString::fromUtf8("Niepoprawne wartosci w linii ") + QString::number(numerLinii);
			return true;
		}

//-----------ZAPISANIE DANYCH
		QList<int>* poprzednia;
		if(mistrzGry->enemyGroups_.contains(aktualnaGrupa))
			poprzednia = mistrzGry->enemyGroups_[aktualnaGrupa];
		else
		{
			poprzednia = new QList<int>;
			mistrzGry->enemyGroups_.insert(aktualnaGrupa, poprzednia);
		}
		poprzednia->push_back(info.id);
		Enemy* nowy = new Enemy(info.name, info.nameObrazka, info.atakMin, info.atakMaks, info.defence, info.perception, info.zdrowie, mistrzGry->prizes_[info.idNagrody]);
		mistrzGry->enemies_.insert(info.id, nowy);

		++numerLinii;
	}
	return false;

}