Files
aliendefender/loader.cpp
2010-08-26 14:39:52 +04:00

816 lines
24 KiB
C++

#include "loader.h"
Loader::Loader(QObject *parent) :
QObject(parent)
{
doc = new QDomDocument("data");
//create();
//load();
}
void Loader::load(QString filename)
{
validate(filename);
file = new QFile(filename);
if (!file->open(QIODevice::ReadOnly))
qFatal("No file data.xml found!");
if (!doc->setContent(file))
{
file->close();
qFatal("Error parsing data.xml");
}
readAliens();
readMaps();
readLevels();
//readMorphs();
readSplashes();
readTowers();
readTriggers();
readChains();
//readUpgrades();
readLevTowers();
readWaves();
readWaveParts();
readLevWaves();
file->close();
}
void Loader::save(QString filename)
{
QDomDocument data("data");
QFile cfile(filename);
if (!cfile.open(QIODevice::WriteOnly))
return;
cfile.resize(0);
QDomElement elem;
QDomElement root = data.createElement("ADdata");
data.appendChild(root);
QDomElement child = data.createElement("aliens");
root.appendChild(child);
for (int i=0; i<aliens.size(); i++)
{
tbAlien al = aliens.values().at(i);
elem = data.createElement("alien");
child.appendChild(elem);
elem.setAttribute("id",al.id);
elem.setAttribute("name",al.name);
elem.setAttribute("health",al.health);
if (al.armor > 0)
elem.setAttribute("armor",al.armor);
if (al.isFlying)
elem.setAttribute("flying","true");
elem.setAttribute("prise",al.prise);
if (al.regeneration > 0)
elem.setAttribute("regeneration",al.regeneration);
elem.setAttribute("score",al.score);
elem.setAttribute("speed",al.speed);
elem.setAttribute("imageType",al.imgType);
}
child = data.createElement("maps");
root.appendChild(child);
for (int i=0; i<maps.size(); i++)
{
tbMap map = maps.values().at(i);
elem = data.createElement("map");
child.appendChild(elem);
elem.setAttribute("name",map.name);
elem.setAttribute("maxPlayers",map.maxPlayers);
elem.setAttribute("id",map.id);
elem.setAttribute("imageType",map.imgType);
elem.setAttribute("width",map.size.width());
elem.setAttribute("height",map.size.height());
elem.setAttribute("data",QString(map.data));
}
child = data.createElement("waves");
root.appendChild(child);
for (int i=0; i<waves.size(); i++)
{
tbWave w = waves.values().at(i);
elem = data.createElement("wave");
child.appendChild(elem);
elem.setAttribute("id",w.id);
elem.setAttribute("prise",w.prise);
elem.setAttribute("timeout",w.timeout);
}
child = data.createElement("levels");
root.appendChild(child);
for (int i=0; i<levels.size(); i++)
{
tbLevel lev = levels.values().at(i);
elem = data.createElement("level");
child.appendChild(elem);
elem.setAttribute("id",lev.id);
elem.setAttribute("map",lev.mapId);
elem.setAttribute("name",lev.name);
elem.setAttribute("score",lev.score);
}
child = data.createElement("waveParts");
root.appendChild(child);
for (int i=0; i<waveParts.size(); i++)
{
tbWavePart wp = waveParts.values().at(i);
elem = data.createElement("wavePart");
child.appendChild(elem);
elem.setAttribute("wave",wp.waveId);
elem.setAttribute("alien",wp.alienId);
elem.setAttribute("count",wp.count);
}
child = data.createElement("wavesOnLevels");
root.appendChild(child);
for (int i=0; i<levWaves.size(); i++)
{
tbWaveOnLevel wol = levWaves.values().at(i);
elem = data.createElement("waveOnLevel");
child.appendChild(elem);
elem.setAttribute("level",wol.levelId);
elem.setAttribute("wave",wol.waveId);
}
child = data.createElement("splashes");
root.appendChild(child);
for (int i=0; i<splashes.size(); i++)
{
tbSplash spl = splashes.values().at(i);
elem = data.createElement("splash");
child.appendChild(elem);
elem.setAttribute("name",spl.name);
elem.setAttribute("id",spl.id);
elem.setAttribute("imageType",spl.imgType);
elem.setAttribute("lifetime",spl.lifetime);
elem.setAttribute("speed",spl.speed);
if (spl.autoControl)
elem.setAttribute("autoControl","true");
}
child = data.createElement("towers");
root.appendChild(child);
for (int i=0; i<towers.size(); i++)
{
tbTower tw = towers.values().at(i);
elem = data.createElement("tower");
child.appendChild(elem);
elem.setAttribute("name",tw.name);
elem.setAttribute("imageType",tw.imgType);
elem.setAttribute("reload",tw.reload);
elem.setAttribute("buildTime",tw.buildTime);
elem.setAttribute("cost",tw.cost);
elem.setAttribute("radius",tw.radius);
elem.setAttribute("splash",tw.splashId);
elem.setAttribute("id",tw.id);
if (tw.expByDamage > 0)
elem.setAttribute("expByDamage",tw.expByDamage);
if (tw.expByKill > 0)
elem.setAttribute("expByKill",tw.expByKill);
if (tw.expByShot > 0)
elem.setAttribute("expByShot",tw.expByShot);
}
child = data.createElement("triggers");
root.appendChild(child);
for (int i=0; i<triggers.size(); i++)
{
tbTrigger trig = triggers.values().at(i);
elem = data.createElement("trigger");
child.appendChild(elem);
elem.setAttribute("id",trig.id);
elem.setAttribute("name",trig.name);
if (trig.chance != 100)
elem.setAttribute("chance",trig.chance);
if (trig.count > 0)
elem.setAttribute("count",trig.count);
if (trig.damage > 0)
elem.setAttribute("damage",trig.damage);
if (trig.radius > 0)
elem.setAttribute("radius",trig.radius);
if (trig.delParent)
elem.setAttribute("delParent","true");
if (trig.randomPosRadius > 0)
elem.setAttribute("randomPosRadius",trig.randomPosRadius);
switch (trig.childAim)
{
case srcTriggerType::allSide :
elem.setAttribute("childAim","allSide");
break;
case srcTriggerType::nearlestAlien :
elem.setAttribute("childAim","nearlestAlien");
break;
case srcTriggerType::parentAim :
elem.setAttribute("childAim","parentAim");
break;
default:
elem.setAttribute("childAim","noAim");
break;
}
switch (trig.type)
{
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");
root.appendChild(child);
for (int i=0; i<chains.size(); i++)
{
tbChain ch = chains.values().at(i);
elem = data.createElement("chain");
child.appendChild(elem);
elem.setAttribute("tower",ch.towerId);
elem.setAttribute("trigger",ch.triggerId);
elem.setAttribute("parent",ch.parentSplashId);
if (ch.childSplashId > 0)
elem.setAttribute("child",ch.childSplashId);
}
child = data.createElement("towersOnLevels");
root.appendChild(child);
for (int i=0; i<levTowers.size(); i++)
{
tbTowerOnLevel tol = levTowers.values().at(i);
elem = data.createElement("towerOnLevel");
child.appendChild(elem);
elem.setAttribute("level",tol.levelId);
elem.setAttribute("tower",tol.towerId);
}
cfile.write(data.toByteArray());
cfile.close();
//qDebug() << data.toByteArray();
}
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 <tbWaveOnLevel> wollist = levWaves.values(id);
if (wollist.isEmpty())
{
qCritical() << tr("Error no waves on level!");
return 0;
}
tbWave tbw;
tbWavePart tbwpt;
QList <tbWavePart> wplist;
QList <int> alienIds;
for (int i=0; i<wollist.size(); i++)
{
WaveType wt;
tbw = waves.value(wollist.at(i).waveId);
wt.prise = tbw.prise;
wt.timeout = tbw.timeout;
wplist = waveParts.values(tbw.id);
if (wplist.isEmpty())
{
qCritical() << tr("Error wave %1 is empty!").arg(tbw.id);
return 0;
}
for (int j=0; j<wplist.size(); j++)
{
tbwpt = wplist.at(j);
if (alienIds.contains(tbwpt.alienId))
{
wt.types.prepend(alienIds.indexOf(tbwpt.alienId));
} else {
alienIds.append(tbwpt.alienId);
wt.types.prepend(alienIds.size()-1);
}
wt.counts.prepend(tbwpt.count);
}
gd->waves.prepend(wt);
wplist.clear();
}
for (int i=0; i<gd->waves.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; i<alienIds.size(); i++)
{
srcAlienType salt;
tbAlien tbal = aliens.value(alienIds.at(i));
salt.armor = tbal.armor;
salt.health = tbal.health;
salt.imgType = tbal.imgType;
salt.isFlying = tbal.isFlying;
salt.name = tbal.name;
salt.prise = tbal.prise;
salt.regeneration = tbal.regeneration;
salt.score = tbal.score;
salt.speed = tbal.speed;
gd->srcAliens.append(salt);
qDebug() << tr("Alien %1 #%2 ").arg(salt.name).arg(i);
}
QList <tbTowerOnLevel> tollist = levTowers.values(id);
tbTower tbt;
for (int i=0; i<tollist.size(); i++)
{
srcTowerType stt;
tbt = towers.value(tollist.at(i).towerId);
stt.buildTime = tbt.buildTime;
stt.cost = tbt.cost;
stt.expByDamage = tbt.expByDamage;
stt.expByKill = tbt.expByKill;
stt.expByShot = tbt.expByShot;
stt.imgType = tbt.imgType;
stt.name = tbt.name;
stt.radius = tbt.radius;
stt.reload = tbt.reload;
QList <tbChain> chlist = chains.values(tbt.id);
QList <int> 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 <tbChain> * chlist, QList <int> * trigIds, srcTowerType * stt, int parId, int parIndex, int * recursiveCheck)
{
if (*recursiveCheck > 100)
{
qCritical("circle dependencies detected!");
return;
}
for (int i=0; i<chlist->size(); 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;
Cells.resize(16);
for (int i=0; i<Cells.size(); i++)
{
Cells[i].resize(16);
Cells[i][0]=Map::Wall;
Cells[i][Cells[i].size()-1]=Map::Wall;
}
for (int i=0; i<Cells.size(); i++)
{
for (int j=0; j<Cells[i].size(); j++)
{
Cells[0][j]=Map::Wall;
Cells[Cells.size()-1][j]=Map::Wall;
}
}
for (int i=1; i<Cells.size()/2; i++)
for (int j=1; j<Cells[i].size()-1; j++)
Cells[i][j]=Map::Player;
for (int i=Cells.size()/2; i<Cells.size()-1; i++)
for (int j=1; j<Cells[i].size()-1; j++)
Cells[i][j]=Map::Player+1;
for (int i=2; i<Cells.size()-2; i++)
Cells[i][Cells[i].size()/2] = Map::Wall;
Cells[Cells.size()/2][0]=Map::Start;
Cells[Cells.size()/2-1][0]=Map::Start;
Cells[Cells.size()/2][Cells[Cells.size()/2].size()-1]=Map::Finish;
Cells[Cells.size()/2-1][Cells[Cells.size()/2].size()-1]=Map::Finish;
QByteArray ba;
QDataStream tmps(&ba,QIODevice::ReadWrite);
tmps << Cells;
ba = qCompress(ba);
ba = ba.toBase64();
QString str(ba);
return str;
}
void Loader::readAliens()
{
aliens.clear();
QDomNodeList alelems = doc->elementsByTagName("alien");
for (int i=0; i<alelems.size(); i++)
{
tbAlien al;
QDomNamedNodeMap nm = alelems.at(i).attributes();
al.id = nm.namedItem("id").nodeValue().toInt();
if (aliens.contains(al.id)) qCritical("Same alien ID dedected, replacing...");
al.name = nm.namedItem("name").nodeValue();
al.speed = nm.namedItem("speed").nodeValue().toFloat();
al.health = nm.namedItem("health").nodeValue().toFloat();
al.prise = nm.namedItem("prise").nodeValue().toInt();
al.armor = nm.namedItem("armor").nodeValue().toFloat();
al.imgType = nm.namedItem("imageType").nodeValue().toInt();
al.regeneration = nm.namedItem("regeneration").nodeValue().toFloat();
al.score = nm.namedItem("score").nodeValue().toInt();
al.isFlying = (nm.namedItem("flying").nodeValue() == "true");
aliens.insert(al.id,al);
qDebug() << tr("Alien %1 id=%2 health=%3 speed=%4 prise=%5 imgType=%6 armor=%7 regeneration=%8 score=%10").arg(al.name).arg(al.id).arg(al.health).arg(al.speed).arg(al.prise).arg(al.imgType).arg(al.armor).arg(al.regeneration).arg(al.score);
}
qDebug("================");
qDebug() << tr("Found %1 aliens").arg(aliens.size());
qDebug("================");
}
void Loader::readWaves()
{
waves.clear();
QDomNodeList welems = doc->elementsByTagName("wave");
for (int i=0; i<welems.size(); i++)
{
tbWave w;
QDomNamedNodeMap nm = welems.at(i).attributes();
w.id = nm.namedItem("id").nodeValue().toInt();
if (waves.contains(w.id)) qCritical("Same wave ID dedected, replacing...");
w.prise = nm.namedItem("prise").nodeValue().toInt();
w.timeout = nm.namedItem("timeout").nodeValue().toInt();
waves.insert(w.id,w);
qDebug() << tr("Wave %1 prise=%2 timeout=%3").arg(w.id).arg(w.prise).arg(w.timeout);
}
qDebug("================");
qDebug() << tr("Found %1 waves").arg(waves.size());
qDebug("================");
}
void Loader::readWaveParts()
{
waveParts.clear();
QDomNodeList wpelems = doc->elementsByTagName("wavePart");
for (int i=0; i<wpelems.size(); i++)
{
bool OK = true;
tbWavePart wp;
QDomNamedNodeMap nm = wpelems.at(i).attributes();
wp.waveId = nm.namedItem("wave").nodeValue().toInt();
if (!waves.contains(wp.waveId))
{
qCritical("invalid wave Id");
OK = false;
}
wp.alienId = nm.namedItem("alien").nodeValue().toInt();
if (!aliens.contains(wp.alienId))
{
qCritical("invalid alien Id");
OK = false;
}
wp.count = nm.namedItem("count").nodeValue().toInt();
if (OK)
{
waveParts.insert(wp.waveId,wp);
qDebug() << tr("Wave=%1 alien=%2 count=%3").arg(wp.waveId).arg(wp.alienId).arg(wp.count);
}
}
qDebug("================");
qDebug() << tr("Found %1 waveParts").arg(waveParts.size());
qDebug("================");
}
void Loader::readChains()
{
chains.clear();
QDomNodeList celems = doc->elementsByTagName("chain");
for (int i=0; i<celems.size(); i++)
{
bool OK = true;
tbChain chain;
QDomNamedNodeMap nm = celems.at(i).attributes();
chain.towerId = nm.namedItem("tower").nodeValue().toInt();
if (!towers.contains(chain.towerId))
{
qCritical("invalid tower Id");
OK = false;
}
chain.childSplashId = nm.namedItem("child").nodeValue().toInt();
if (chain.childSplashId > 0)
{
if (!splashes.contains(chain.childSplashId))
{
qCritical("invalid child splash Id");
OK = false;
}
}
chain.parentSplashId = nm.namedItem("parent").nodeValue().toInt();
if (!splashes.contains(chain.parentSplashId))
{
qCritical("invalid parent splash Id");
OK = false;
}
chain.triggerId = nm.namedItem("trigger").nodeValue().toInt();
if (!triggers.contains(chain.triggerId))
{
qCritical("invalid parent splash Id");
OK = false;
}
if (OK)
{
chains.insert(chain.towerId,chain);
qDebug() << tr("Tower=%1 parent=%2 child=%3 trigger=%4").arg(chain.towerId).arg(chain.parentSplashId).arg(chain.childSplashId).arg(chain.triggerId);
}
}
qDebug("================");
qDebug() << tr("Found %1 chains").arg(chains.size());
qDebug("================");
}
void Loader::readLevWaves()
{
levWaves.clear();
QDomNodeList lwelems = doc->elementsByTagName("waveOnLevel");
for (int i=0; i<lwelems.size(); i++)
{
bool OK = true;
tbWaveOnLevel lw;
QDomNamedNodeMap nm = lwelems.at(i).attributes();
lw.levelId= nm.namedItem("level").nodeValue().toInt();
if (!levels.contains(lw.levelId))
{
qCritical("invalid level Id");
OK = false;
}
lw.waveId = nm.namedItem("wave").nodeValue().toInt();
if (!waves.contains(lw.waveId))
{
qCritical("invalid wave Id");
OK = false;
}
if (OK)
{
levWaves.insert(lw.levelId,lw);
qDebug() << tr("level=%1 wave=%2").arg(lw.levelId).arg(lw.waveId);
}
}
qDebug("================");
qDebug() << tr("Found %1 Waves On Level").arg(levWaves.size());
qDebug("================");
}
void Loader::readLevTowers()
{
levTowers.clear();
QDomNodeList ltelems = doc->elementsByTagName("towerOnLevel");
for (int i=0; i<ltelems.size(); i++)
{
bool OK = true;
tbTowerOnLevel lt;
QDomNamedNodeMap nm = ltelems.at(i).attributes();
lt.levelId= nm.namedItem("level").nodeValue().toInt();
if (!levels.contains(lt.levelId))
{
qCritical("invalid level Id");
OK = false;
}
lt.towerId = nm.namedItem("tower").nodeValue().toInt();
if (!towers.contains(lt.towerId))
{
qCritical("invalid tower Id");
OK = false;
}
if (OK)
{
levTowers.insert(lt.levelId,lt);
qDebug() << tr("level=%1 tower=%2").arg(lt.levelId).arg(lt.towerId);
}
}
qDebug("================");
qDebug() << tr("Found %1 Towers On Level").arg(levTowers.size());
qDebug("================");
}
void Loader::readLevels()
{
levels.clear();
QDomNodeList lelems = doc->elementsByTagName("level");
for (int i=0; i<lelems.size(); i++)
{
bool OK = true;
tbLevel l;
QDomNamedNodeMap nm = lelems.at(i).attributes();
l.id = nm.namedItem("id").nodeValue().toInt();
l.name = nm.namedItem("name").nodeValue();
if (levels.contains(l.id)) qCritical("Same wave ID dedected, replacing...");
l.mapId = nm.namedItem("map").nodeValue().toInt();
if (!maps.contains(l.mapId))
{
qCritical("invalid map Id");
OK = false;
}
if (OK)
{
levels.insert(l.id,l);
qDebug() << tr("Level %1 id=%2 map=%3 ").arg(l.name).arg(l.id).arg(l.mapId);
}
}
qDebug("================");
qDebug() << tr("Found %1 levels").arg(levels.size());
qDebug("================");
}
void Loader::readTriggers()
{
triggers.clear();
QString str;
QDomNodeList trelems = doc->elementsByTagName("trigger");
for (int i=0; i<trelems.size(); i++)
{
tbTrigger trig;
QDomNamedNodeMap nm = trelems.at(i).attributes();
trig.id = nm.namedItem("id").nodeValue().toInt();
if (triggers.contains(trig.id)) qCritical("Same splash ID dedected, replacing...");
trig.name = nm.namedItem("name").nodeValue();
trig.damage = nm.namedItem("damage").nodeValue().toFloat();
trig.radius = nm.namedItem("radius").nodeValue().toFloat();
trig.randomPosRadius = nm.namedItem("randomPosRadius").nodeValue().toFloat();
trig.count = nm.namedItem("count").nodeValue().toInt();
trig.timer = nm.namedItem("timer").nodeValue().toInt();
trig.chance = nm.namedItem("chance").nodeValue().toInt();
if (!(trig.chance>0)) trig.chance = 100;
str = nm.namedItem("delParent").nodeValue();
trig.delParent = (str == "true");
str = nm.namedItem("type").nodeValue();
if (str == "onDestination")
trig.type = srcTriggerType::onDestination;
if (str == "onTimer")
trig.type = srcTriggerType::onTimer;
if (str == "onAlienInRadius")
trig.type = srcTriggerType::onAlienInRadius;
str = nm.namedItem("childAim").nodeValue();
trig.childAim = srcTriggerType::noAim;
if (str == "allSide")
trig.childAim = srcTriggerType::allSide;
if (str == "parentAim")
trig.childAim = srcTriggerType::parentAim;
if (str == "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);
}
qDebug("================");
qDebug() << tr("Found %1 triggers").arg(triggers.size());
qDebug("================");
}
void Loader::readSplashes()
{
splashes.clear();
QString str;
QDomNodeList selems = doc->elementsByTagName("splash");
for (int i=0; i<selems.size(); i++)
{
tbSplash s;
QDomNamedNodeMap nm = selems.at(i).attributes();
s.id = nm.namedItem("id").nodeValue().toInt();
if (splashes.contains(s.id)) qCritical("Same splash ID dedected, replacing...");
s.name = nm.namedItem("name").nodeValue();
s.speed = nm.namedItem("speed").nodeValue().toFloat();
s.lifetime = nm.namedItem("lifetime").nodeValue().toInt();
s.imgType = nm.namedItem("imageType").nodeValue().toInt();
str = nm.namedItem("autoControl").nodeValue();
s.autoControl = (str == "true");
splashes.insert(s.id,s);
qDebug() << tr("Splash %1 id=%2 speed=%3 imgType=%4 autoControl=%5 lifetime=%6").arg(s.name).arg(s.id).arg(s.speed).arg(s.imgType).arg(s.autoControl).arg(s.lifetime);
}
qDebug("================");
qDebug() << tr("Found %1 splashes").arg(splashes.size());
qDebug("================");
}
void Loader::readTowers()
{
towers.clear();
QDomNodeList twelems = doc->elementsByTagName("tower");
for (int i=0; i<twelems.size(); i++)
{
bool OK = true;
tbTower tw;
QDomNamedNodeMap nm = twelems.at(i).attributes();
tw.id = nm.namedItem("id").nodeValue().toInt();
if (towers.contains(tw.id)) qCritical("Same tower ID dedected, replacing...");
tw.name = nm.namedItem("name").nodeValue();
tw.radius = nm.namedItem("radius").nodeValue().toFloat();
tw.expByDamage = nm.namedItem("expByDamage").nodeValue().toFloat();
tw.expByKill = nm.namedItem("expByKill").nodeValue().toFloat();
tw.expByShot = nm.namedItem("expByShot").nodeValue().toFloat();
tw.imgType = nm.namedItem("imageType").nodeValue().toInt();
tw.reload = nm.namedItem("reload").nodeValue().toInt();
tw.cost = nm.namedItem("cost").nodeValue().toInt();
tw.buildTime = nm.namedItem("buildTime").nodeValue().toInt();
tw.splashId = nm.namedItem("splash").nodeValue().toInt();
if (!splashes.contains(tw.splashId))
{
qCritical("Invalid splash Id");
OK = false;
}
if (OK)
{
towers.insert(tw.id,tw);
qDebug() << tr("Tower %1 id=%2 radius=%3 cost=%4 reload=%5 buildTime=%6 splash=%7").arg(tw.name).arg(tw.id).arg(tw.radius).arg(tw.cost).arg(tw.reload).arg(tw.buildTime).arg(tw.splashId)
<< tr("imgType=%1 expByKill=%2 expByShot=%3 expByDamage=%4").arg(tw.imgType).arg(tw.expByKill).arg(tw.expByShot).arg(tw.expByDamage);
}
}
qDebug("================");
qDebug() << tr("Found %1 towers").arg(towers.size());
qDebug("================");
}
void Loader::readMaps()
{
maps.clear();
QDomNodeList melems = doc->elementsByTagName("map");
for (int i=0; i<melems.size(); i++)
{
tbMap m;
QDomNamedNodeMap mn = melems.at(i).attributes();
m.id = mn.namedItem("id").nodeValue().toInt();
if (maps.contains(m.id)) qCritical("Same map ID dedected, replacing...");
m.name = mn.namedItem("name").nodeValue();
m.imgType = mn.namedItem("imageType").nodeValue().toInt();
m.maxPlayers = mn.namedItem("maxPlayers").nodeValue().toInt();
m.data=mn.namedItem("data").nodeValue().toUtf8();
m.size.setWidth(mn.namedItem("width").nodeValue().toInt());
m.size.setHeight(mn.namedItem("height").nodeValue().toInt());
maps.insert(m.id,m);
qDebug() << tr("Map %1 id=%2 imgType=%3 maxPlayers=%5 data=%6 ").arg(m.name).arg(m.id).arg(m.imgType).arg(m.maxPlayers).arg(QString(m.data)) << m.size;
}
qDebug("================");
qDebug() << tr("Found %1 maps").arg(maps.size());
qDebug("================");
}
void Loader::validate(QString filename)
{
QFile sfile("schema.xml");
if (!sfile.open(QIODevice::ReadOnly))
qFatal("No file schema.xml found!");
QXmlSchema schema;
if (!schema.load(&sfile))
qFatal("Error parsing schema.xml");
QXmlSchemaValidator sval(schema);
QFile dfile(filename);
if (!dfile.open(QIODevice::ReadOnly))
qFatal("ERROR File not found!");
if (!sval.validate(&dfile))
qFatal("Validation failure!");
else
{
sfile.close();
dfile.close();
qDebug("Validation SUCSESS!!!");
qDebug("================");
}
}