/** * @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; }
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(); }
/** * @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; }
/** * @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; }
/** * @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; }