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;
}