diff --git a/adcore.cpp b/adcore.cpp index 95b0996..80eb8b5 100644 --- a/adcore.cpp +++ b/adcore.cpp @@ -1,12 +1,13 @@ #include "adcore.h" adCore::adCore(QObject *parent) : - QThread(parent) + QThread(parent) { step = 0; //admap = new Map(1); //addata = new Game_Data(admap); adloader = new Loader(); + adloader->load("data2.xml"); addata = adloader->loadlevel(1); if (addata != 0) qDebug("Sucsess"); else qDebug("Error"); diff --git a/aliendefender.pro.user b/aliendefender.pro.user index 70767dc..b421708 100644 --- a/aliendefender.pro.user +++ b/aliendefender.pro.user @@ -47,7 +47,7 @@ Qt4ProjectManager.Qt4BuildConfiguration 2 C:/Users/Andrey/Desktop/aliendefender-build-desktop - 5 + 9 2 true @@ -81,7 +81,7 @@ Qt4ProjectManager.Qt4BuildConfiguration 0 C:/Users/Andrey/Desktop/aliendefender-build-desktop - 5 + 9 2 true @@ -96,8 +96,8 @@ false false - false - + true + C:\Users\Andrey\Desktop\aliendefender 1 diff --git a/base_types.h b/base_types.h index cb13bc0..b80f342 100644 --- a/base_types.h +++ b/base_types.h @@ -72,6 +72,14 @@ struct srcTriggerType onTimer, onAlienInRadius }; + + enum aimType + { + noAim, + parentAim, + allSide, + nearlestAlien + }; int childId; // =-1 for non birth splash (e.q. only damage) bool delParent; float damage; diff --git a/data2.xml b/data2.xml new file mode 100644 index 0000000..5fef992 --- /dev/null +++ b/data2.xml @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/loader.cpp b/loader.cpp index 8fcd349..ece9314 100644 --- a/loader.cpp +++ b/loader.cpp @@ -188,13 +188,13 @@ void Loader::save(QString filename) elem.setAttribute("randomPosRadius",trig.randomPosRadius); switch (trig.childAim) { - case tbTrigger::allSide : + case srcTriggerType::allSide : elem.setAttribute("childAim","allSide"); break; - case tbTrigger::nearlestAlien : + case srcTriggerType::nearlestAlien : elem.setAttribute("childAim","nearlestAlien"); break; - case tbTrigger::parentAim : + case srcTriggerType::parentAim : elem.setAttribute("childAim","parentAim"); break; default: @@ -203,15 +203,15 @@ void Loader::save(QString filename) } switch (trig.type) { - case tbTrigger::onTimer : - elem.setAttribute("type","onTimer"); - break; - case tbTrigger::onDestination : - elem.setAttribute("type","onDestination"); - break; - case tbTrigger::onAlienInRadius : - elem.setAttribute("type","onAlienInRadius"); - break; + case srcTriggerType::onTimer : + elem.setAttribute("type","onTimer"); + break; + case srcTriggerType::onDestination : + elem.setAttribute("type","onDestination"); + break; + case srcTriggerType::onAlienInRadius : + elem.setAttribute("type","onAlienInRadius"); + break; } } child = data.createElement("chains"); @@ -243,84 +243,151 @@ void Loader::save(QString filename) } -//Game_Data * Loader::loadlevel(int id) -//{ -// if (!levels.contains(id)) -// { -// qCritical() << tr("Error Level %1 not found!").arg(id); -// return 0; -// } -// qDebug() << tr("Loading level %1 ...").arg(levels.value(id).name); -// tbMap tbm = maps.value(levels.value(id).mapId); -// Map * map = new Map(tbm.data,tbm.size,tbm.name,tbm.maxPlayers,tbm.imgType); -// Game_Data * gd = new Game_Data(map); -// QList wollist = levWaves.values(id); -// if (wollist.isEmpty()) -// { -// qCritical() << tr("Error no waves on level!"); -// return 0; -// } -// tbWave tbw; -// tbWavePart tbwpt; -// QList wplist; -// QList alienIds; -// for (int i=0; iwaves.prepend(wt); -// wplist.clear(); -// } -// for (int i=0; iwaves.size(); i++) -// qDebug() << tr("load wave #%1 prise=%2 timeout=%3").arg(i+1).arg(gd->waves.at(i).prise).arg(gd->waves.at(i).timeout) << gd->waves.at(i).types << gd->waves.at(i).counts; -// wollist.clear(); -// for (int i=0; isrcAliens.append(salt); -// qDebug() << tr("Alien %1 #%2 ").arg(salt.name).arg(i); -// } -// QList tollist = levTowers.values(id); -// tbTower tbt; -// for (int i=0; i wollist = levWaves.values(id); + if (wollist.isEmpty()) + { + qCritical() << tr("Error no waves on level!"); + return 0; + } + tbWave tbw; + tbWavePart tbwpt; + QList wplist; + QList alienIds; + for (int i=0; iwaves.prepend(wt); + wplist.clear(); + } + for (int i=0; iwaves.size(); i++) + qDebug() << tr("load wave #%1 prise=%2 timeout=%3").arg(i+1).arg(gd->waves.at(i).prise).arg(gd->waves.at(i).timeout) << gd->waves.at(i).types << gd->waves.at(i).counts; + wollist.clear(); + for (int i=0; isrcAliens.append(salt); + qDebug() << tr("Alien %1 #%2 ").arg(salt.name).arg(i); + } + QList tollist = levTowers.values(id); + tbTower tbt; + for (int i=0; i chlist = chains.values(tbt.id); + QList trigIds; + tbSplash tbs = splashes.value(tbt.splashId); + srcSplashType sst; + sst.autoControl = tbs.autoControl; + sst.imgType = tbs.imgType; + sst.lifetime = tbs.lifetime; + sst.name = tbs.name; + sst.speed = tbs.speed; + stt.splashes.append(sst); + int recursiveCheck = 1; + fillTowerChains(&chlist,&trigIds,&stt,tbt.splashId,0,&recursiveCheck); + qDebug() << tr("Tower %1 trig=%2 splash=%3").arg(stt.name).arg(stt.triggers.size()).arg(stt.splashes.size()) << tr("chain lenght %1").arg(recursiveCheck); + } + return gd; +} +void Loader::fillTowerChains(QList * chlist, QList * trigIds, srcTowerType * stt, int parId, int parIndex, int * recursiveCheck) +{ + if (*recursiveCheck > 100) + { + qCritical("circle dependencies detected!"); + return; + } + for (int i=0; isize(); i++) + { + if (chlist->at(i).parentSplashId == parId) + { + int trigid = chlist->at(i).triggerId; + if (!(trigIds->contains(trigid))) + { + srcTriggerType strigt; + tbTrigger tbtrig = triggers.value(trigid); + strigt.count = tbtrig.count; + strigt.damage = tbtrig.damage; + strigt.delParent = tbtrig.delParent; + strigt.radius = tbtrig.radius; + strigt.randomPosRadius = tbtrig.randomPosRadius; + strigt.timer = tbtrig.timer; + strigt.type = tbtrig.type; + stt->triggers.append(strigt); + trigIds->append(trigid); + } + stt->splashes[parIndex].triggerIndexes.append(trigIds->indexOf(trigid)); + if (chlist->at(i).childSplashId > 0 && stt->triggers.at(trigIds->indexOf(trigid)).count > 0) + { + tbSplash tbs = splashes.value(chlist->at(i).childSplashId); + srcSplashType sst; + sst.autoControl = tbs.autoControl; + sst.imgType = tbs.imgType; + sst.lifetime = tbs.lifetime; + sst.name = tbs.name; + sst.speed = tbs.speed; + stt->splashes.append(sst); + stt->triggers[stt->splashes.at(parIndex).triggerIndexes.size()-1].childId = stt->splashes.size() - 1; + *recursiveCheck += 1; + fillTowerChains(chlist,trigIds,stt,chlist->at(i).childSplashId, stt->splashes.size()-1,recursiveCheck); + } + } + } +} + QString Loader::CreateMapExample() { QVector < QVector < int > > Cells; @@ -611,19 +678,19 @@ void Loader::readTriggers() trig.delParent = (str == "true"); str = nm.namedItem("type").nodeValue(); if (str == "onDestination") - trig.type = tbTrigger::onDestination; + trig.type = srcTriggerType::onDestination; if (str == "onTimer") - trig.type = tbTrigger::onTimer; + trig.type = srcTriggerType::onTimer; if (str == "onAlienInRadius") - trig.type = tbTrigger::onAlienInRadius; + trig.type = srcTriggerType::onAlienInRadius; str = nm.namedItem("childAim").nodeValue(); - trig.childAim = tbTrigger::noAim; + trig.childAim = srcTriggerType::noAim; if (str == "allSide") - trig.childAim = tbTrigger::allSide; + trig.childAim = srcTriggerType::allSide; if (str == "parentAim") - trig.childAim = tbTrigger::parentAim; + trig.childAim = srcTriggerType::parentAim; if (str == "nearlestAlien") - trig.childAim = tbTrigger::nearlestAlien; + trig.childAim = srcTriggerType::nearlestAlien; triggers.insert(trig.id,trig); qDebug() << tr("Trigger %1 id=%2 damage=%3 radius=%4 delParent=%5 timer=%6").arg(trig.name).arg(trig.id).arg(trig.damage).arg(trig.radius).arg(trig.delParent).arg(trig.timer) << tr("count=%1 chance=%2 randomPosRadius=%3 type=%4 childAim=%5").arg(trig.count).arg(trig.chance).arg(trig.randomPosRadius).arg(trig.type).arg(trig.childAim); @@ -726,7 +793,7 @@ void Loader::readMaps() void Loader::validate(QString filename) { - QFile sfile("schema.xml"); + QFile sfile("schema.xml"); if (!sfile.open(QIODevice::ReadOnly)) qFatal("No file schema.xml found!"); QXmlSchema schema; diff --git a/loader.h b/loader.h index d4fa9cb..2ab547c 100644 --- a/loader.h +++ b/loader.h @@ -10,8 +10,8 @@ struct tbHeader { - int id; - QString name; + int id; + QString name; }; struct tbAlien : tbHeader @@ -36,26 +36,12 @@ struct tbSplash : tbHeader struct tbTrigger : tbHeader { - enum triggerType - { - onDestination, - onTimer, - onAlienInRadius - }; - - enum aimType - { - noAim, - parentAim, - allSide, - nearlestAlien - }; float damage; float radius; int chance; bool delParent; - aimType childAim; - triggerType type; + srcTriggerType::aimType childAim; + srcTriggerType::triggerType type; unsigned int timer; int count; float randomPosRadius; @@ -191,6 +177,7 @@ private: void readWaveParts(); void readUpgrades(); + void fillTowerChains(QList * chlist, QList * trigIds, srcTowerType * stt, int parId, int parIndex, int * recursiveCheck); void validate(QString filename); QString CreateMapExample(); }; diff --git a/main.cpp b/main.cpp index 90d76b6..476e369 100644 --- a/main.cpp +++ b/main.cpp @@ -12,4 +12,5 @@ int main(int argc, char *argv[]) //QObject::connect(timer,SIGNAL(timeout()),&core,SLOT(next())); //timer->start(100); //return a.exec(); + return 0; }