added AD editor (not work yet, just for test)
This commit is contained in:
359
loader.cpp
359
loader.cpp
@@ -5,14 +5,14 @@ Loader::Loader(QObject *parent) :
|
||||
{
|
||||
doc = new QDomDocument("data");
|
||||
//create();
|
||||
load();
|
||||
//load();
|
||||
}
|
||||
|
||||
|
||||
void Loader::load()
|
||||
void Loader::load(QString filename)
|
||||
{
|
||||
validate();
|
||||
file = new QFile("data.xml");
|
||||
validate(filename);
|
||||
file = new QFile(filename);
|
||||
if (!file->open(QIODevice::ReadOnly))
|
||||
qFatal("No file data.xml found!");
|
||||
if (!doc->setContent(file))
|
||||
@@ -38,80 +38,289 @@ void Loader::load()
|
||||
}
|
||||
|
||||
|
||||
void Loader::create()
|
||||
void Loader::save(QString filename)
|
||||
{
|
||||
QFile cfile("data.xml");
|
||||
QDomDocument data("data");
|
||||
QFile cfile(filename);
|
||||
if (!cfile.open(QIODevice::WriteOnly))
|
||||
return;
|
||||
cfile.resize(0);
|
||||
QDomElement elem;
|
||||
QDomElement root = doc->createElement("ADdata");
|
||||
doc->appendChild(root);
|
||||
QDomElement child = doc->createElement("aliens");
|
||||
QDomElement root = data.createElement("ADdata");
|
||||
data.appendChild(root);
|
||||
QDomElement child = data.createElement("aliens");
|
||||
root.appendChild(child);
|
||||
elem = doc->createElement("alien");
|
||||
child.appendChild(elem);
|
||||
elem.setAttribute("name","my alien");
|
||||
elem.setAttribute("speed",0.012);
|
||||
elem.setAttribute("health",100);
|
||||
elem.setAttribute("prise",0);
|
||||
elem.setAttribute("id",10);
|
||||
elem.setAttribute("imageType",1);
|
||||
elem = doc->createElement("alien");
|
||||
child.appendChild(elem);
|
||||
elem.setAttribute("name","MONSTR");
|
||||
elem.setAttribute("speed",0.0099);
|
||||
elem.setAttribute("health",200);
|
||||
elem.setAttribute("prise",1);
|
||||
elem.setAttribute("id",12);
|
||||
elem.setAttribute("imageType",1);
|
||||
child = doc->createElement("towers");
|
||||
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);
|
||||
elem = doc->createElement("tower");
|
||||
child.appendChild(elem);
|
||||
elem.setAttribute("name","my tower");
|
||||
elem.setAttribute("imageType",1);
|
||||
elem.setAttribute("reload",20);
|
||||
elem.setAttribute("buildTime",100);
|
||||
elem.setAttribute("price",10);
|
||||
elem.setAttribute("radius",1.2);
|
||||
elem.setAttribute("splashType",0);
|
||||
elem.setAttribute("id",0);
|
||||
elem = doc->createElement("tower");
|
||||
child.appendChild(elem);
|
||||
elem.setAttribute("name","Wall");
|
||||
elem.setAttribute("imageType",1);
|
||||
elem.setAttribute("buildTime",300);
|
||||
elem.setAttribute("reload",0);
|
||||
elem.setAttribute("price",9);
|
||||
elem.setAttribute("radius",0);
|
||||
elem.setAttribute("splashType",0);
|
||||
elem.setAttribute("id",1);
|
||||
child = doc->createElement("maps");
|
||||
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);
|
||||
elem = doc->createElement("map");
|
||||
child.appendChild(elem);
|
||||
elem.setAttribute("name","Map 16x16");
|
||||
elem.setAttribute("maxPlayers","2");
|
||||
elem.setAttribute("id",1);
|
||||
elem.setAttribute("imageType",1);
|
||||
elem.setAttribute("data",CreateMapExample());
|
||||
child = doc->createElement("splashes");
|
||||
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);
|
||||
elem = doc->createElement("splash");
|
||||
child.appendChild(elem);
|
||||
elem.setAttribute("name","shot");
|
||||
elem.setAttribute("imageType",1);
|
||||
elem.setAttribute("damage",2.5);
|
||||
elem.setAttribute("speed",100);
|
||||
elem.setAttribute("autoControl","true");
|
||||
elem.setAttribute("radius",1.2);
|
||||
elem.setAttribute("id",0);
|
||||
cfile.write(doc->toByteArray());
|
||||
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 tbTrigger::allSide :
|
||||
elem.setAttribute("childAim","allSide");
|
||||
break;
|
||||
case tbTrigger::nearlestAlien :
|
||||
elem.setAttribute("childAim","nearlestAlien");
|
||||
break;
|
||||
case tbTrigger::parentAim :
|
||||
elem.setAttribute("childAim","parentAim");
|
||||
break;
|
||||
default:
|
||||
elem.setAttribute("childAim","noAim");
|
||||
break;
|
||||
}
|
||||
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;
|
||||
}
|
||||
}
|
||||
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);
|
||||
// }
|
||||
// return gd;
|
||||
//}
|
||||
|
||||
|
||||
QString Loader::CreateMapExample()
|
||||
{
|
||||
QVector < QVector < int > > Cells;
|
||||
@@ -154,6 +363,7 @@ QString Loader::CreateMapExample()
|
||||
|
||||
void Loader::readAliens()
|
||||
{
|
||||
aliens.clear();
|
||||
QDomNodeList alelems = doc->elementsByTagName("alien");
|
||||
for (int i=0; i<alelems.size(); i++)
|
||||
{
|
||||
@@ -169,6 +379,7 @@ void Loader::readAliens()
|
||||
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);
|
||||
}
|
||||
@@ -180,6 +391,7 @@ void Loader::readAliens()
|
||||
|
||||
void Loader::readWaves()
|
||||
{
|
||||
waves.clear();
|
||||
QDomNodeList welems = doc->elementsByTagName("wave");
|
||||
for (int i=0; i<welems.size(); i++)
|
||||
{
|
||||
@@ -200,6 +412,7 @@ void Loader::readWaves()
|
||||
|
||||
void Loader::readWaveParts()
|
||||
{
|
||||
waveParts.clear();
|
||||
QDomNodeList wpelems = doc->elementsByTagName("wavePart");
|
||||
for (int i=0; i<wpelems.size(); i++)
|
||||
{
|
||||
@@ -233,6 +446,7 @@ void Loader::readWaveParts()
|
||||
|
||||
void Loader::readChains()
|
||||
{
|
||||
chains.clear();
|
||||
QDomNodeList celems = doc->elementsByTagName("chain");
|
||||
for (int i=0; i<celems.size(); i++)
|
||||
{
|
||||
@@ -280,6 +494,7 @@ void Loader::readChains()
|
||||
|
||||
void Loader::readLevWaves()
|
||||
{
|
||||
levWaves.clear();
|
||||
QDomNodeList lwelems = doc->elementsByTagName("waveOnLevel");
|
||||
for (int i=0; i<lwelems.size(); i++)
|
||||
{
|
||||
@@ -312,6 +527,7 @@ void Loader::readLevWaves()
|
||||
|
||||
void Loader::readLevTowers()
|
||||
{
|
||||
levTowers.clear();
|
||||
QDomNodeList ltelems = doc->elementsByTagName("towerOnLevel");
|
||||
for (int i=0; i<ltelems.size(); i++)
|
||||
{
|
||||
@@ -344,6 +560,7 @@ void Loader::readLevTowers()
|
||||
|
||||
void Loader::readLevels()
|
||||
{
|
||||
levels.clear();
|
||||
QDomNodeList lelems = doc->elementsByTagName("level");
|
||||
for (int i=0; i<lelems.size(); i++)
|
||||
{
|
||||
@@ -373,6 +590,7 @@ void Loader::readLevels()
|
||||
|
||||
void Loader::readTriggers()
|
||||
{
|
||||
triggers.clear();
|
||||
QString str;
|
||||
QDomNodeList trelems = doc->elementsByTagName("trigger");
|
||||
for (int i=0; i<trelems.size(); i++)
|
||||
@@ -388,7 +606,7 @@ void Loader::readTriggers()
|
||||
trig.count = nm.namedItem("count").nodeValue().toInt();
|
||||
trig.timer = nm.namedItem("timer").nodeValue().toInt();
|
||||
trig.chance = nm.namedItem("chance").nodeValue().toInt();
|
||||
if (!(trig.chance>1)) trig.chance = 100;
|
||||
if (!(trig.chance>0)) trig.chance = 100;
|
||||
str = nm.namedItem("delParent").nodeValue();
|
||||
trig.delParent = (str == "true");
|
||||
str = nm.namedItem("type").nodeValue();
|
||||
@@ -418,6 +636,7 @@ void Loader::readTriggers()
|
||||
|
||||
void Loader::readSplashes()
|
||||
{
|
||||
splashes.clear();
|
||||
QString str;
|
||||
QDomNodeList selems = doc->elementsByTagName("splash");
|
||||
for (int i=0; i<selems.size(); i++)
|
||||
@@ -443,6 +662,7 @@ void Loader::readSplashes()
|
||||
|
||||
void Loader::readTowers()
|
||||
{
|
||||
towers.clear();
|
||||
QDomNodeList twelems = doc->elementsByTagName("tower");
|
||||
for (int i=0; i<twelems.size(); i++)
|
||||
{
|
||||
@@ -481,6 +701,7 @@ void Loader::readTowers()
|
||||
|
||||
void Loader::readMaps()
|
||||
{
|
||||
maps.clear();
|
||||
QDomNodeList melems = doc->elementsByTagName("map");
|
||||
for (int i=0; i<melems.size(); i++)
|
||||
{
|
||||
@@ -503,7 +724,7 @@ void Loader::readMaps()
|
||||
}
|
||||
|
||||
|
||||
void Loader::validate()
|
||||
void Loader::validate(QString filename)
|
||||
{
|
||||
QFile sfile("schema.xml");
|
||||
if (!sfile.open(QIODevice::ReadOnly))
|
||||
@@ -512,9 +733,9 @@ void Loader::validate()
|
||||
if (!schema.load(&sfile))
|
||||
qFatal("Error parsing schema.xml");
|
||||
QXmlSchemaValidator sval(schema);
|
||||
QFile dfile("data.xml");
|
||||
QFile dfile(filename);
|
||||
if (!dfile.open(QIODevice::ReadOnly))
|
||||
qFatal("No file data.xml found!");
|
||||
qFatal("ERROR File not found!");
|
||||
if (!sval.validate(&dfile))
|
||||
qFatal("Validation failure!");
|
||||
else
|
||||
|
||||
Reference in New Issue
Block a user