added AD editor (not work yet, just for test)

This commit is contained in:
2010-08-25 03:10:15 +03:00
parent 68784b7e9e
commit d897bb8fa2
27 changed files with 2163 additions and 398 deletions

View File

@@ -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