last changes

This commit is contained in:
2020-06-15 22:22:46 +03:00
parent 5f405ca403
commit 259f321df4
53 changed files with 3368 additions and 842 deletions

View File

@@ -1,5 +1,7 @@
#include "loader.h"
bool tbWaveOnLevel_lessThan(const tbWaveOnLevel &a, const tbWaveOnLevel &b) {return a.waveId < b.waveId;}
Loader::Loader()
{
doc = new QDomDocument("data");
@@ -30,7 +32,7 @@ void Loader::load(QString filename)
readLevTowers();
readMorphs();
readWaves();
readWaveParts();
// readWaveParts();
readLevWaves();
file->close();
@@ -93,6 +95,15 @@ void Loader::save(QString filename)
elem.setAttribute("id",w.id);
elem.setAttribute("prise",w.prise);
elem.setAttribute("timeout",w.timeout);
QDomElement cc;
for (int k=0; k<w.parts.size(); k++)
{
tbWavePart wp = w.parts.at(k);
cc = data.createElement("wavePart");
elem.appendChild(cc);
cc.setAttribute("alien",wp.alienId);
cc.setAttribute("count",wp.count);
}
}
child = data.createElement("levels");
root.appendChild(child);
@@ -105,18 +116,19 @@ void Loader::save(QString filename)
elem.setAttribute("map",lev.mapId);
elem.setAttribute("name",lev.name);
elem.setAttribute("score",lev.score);
elem.setAttribute("startMoney",lev.money);
}
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("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++)
@@ -149,41 +161,41 @@ void Loader::save(QString filename)
{
case QPainter::RasterOp_NotSource :
elem.setAttribute("compositionMode","NotSource");
break;
break;
case QPainter::CompositionMode_Plus :
elem.setAttribute("compositionMode","Plus");
break;
break;
case QPainter::CompositionMode_Multiply :
elem.setAttribute("compositionMode","Multiply");
break;
break;
case QPainter::CompositionMode_Screen :
elem.setAttribute("compositionMode","Screen");
break;
break;
case QPainter::CompositionMode_Darken :
elem.setAttribute("compositionMode","Darken");
break;
break;
case QPainter::CompositionMode_Lighten :
elem.setAttribute("compositionMode","Lighten");
break;
break;
case QPainter::CompositionMode_ColorDodge :
elem.setAttribute("compositionMode","ColorDodge");
break;
break;
case QPainter::CompositionMode_ColorBurn :
elem.setAttribute("compositionMode","ColorBurn");
break;
break;
case QPainter::CompositionMode_HardLight :
elem.setAttribute("compositionMode","HardLight");
break;
break;
case QPainter::CompositionMode_SoftLight :
elem.setAttribute("compositionMode","SoftLight");
break;
break;
case QPainter::CompositionMode_Difference :
elem.setAttribute("compositionMode","Difference");
break;
break;
case QPainter::CompositionMode_SourceOver :
default:
elem.setAttribute("compositionMode","Source");
break;
break;
}
}
child = data.createElement("towers");
@@ -233,29 +245,29 @@ void Loader::save(QString filename)
{
case srcTriggerType::allSide :
elem.setAttribute("childAim","allSide");
break;
break;
case srcTriggerType::nearestAlien :
elem.setAttribute("childAim","nearestAlien");
break;
break;
case srcTriggerType::parentAim :
elem.setAttribute("childAim","parentAim");
break;
break;
default:
elem.setAttribute("childAim","noAim");
break;
break;
}
switch (trig.type)
{
case srcTriggerType::onTimer :
elem.setAttribute("type","onTimer");
elem.setAttribute("timer",trig.timer);
break;
break;
case srcTriggerType::onDestination :
elem.setAttribute("type","onDestination");
break;
break;
case srcTriggerType::onAlienInRadius :
elem.setAttribute("type","onAlienInRadius");
break;
break;
}
}
child = data.createElement("chains");
@@ -325,6 +337,7 @@ Game_Data * Loader::loadlevel(int id)
{
Player * pl = new Player(i);
gd->players.append(pl);
gd->players.at(i)->money = levels.value(id).money/tbm.maxPlayers;
}
qDebug() << gd->players.size();
for (int i=0; i<map->maxPlayers(); ++i)
@@ -332,41 +345,42 @@ Game_Data * Loader::loadlevel(int id)
QList <tbWaveOnLevel> wollist = levWaves.values(id);
if (wollist.isEmpty())
{
qCritical() << tr("Error no waves on level!");
qCritical() << tr("Error: no waves on level!");
return 0;
}
tbWave tbw;
tbWavePart tbwpt;
QList <tbWavePart> wplist;
//QList <tbWavePart> wplist;
QList <int> alienIds;
QList <int> animIds;
qSort(wollist.begin(),wollist.end(),tbWaveOnLevel_lessThan);
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())
//wplist = waveParts.values(tbw.id);
if (tbw.parts.isEmpty())
{
qCritical() << tr("Error wave %1 is empty!").arg(tbw.id);
qCritical() << tr("Error: wave %1 is empty!").arg(tbw.id);
//return 0;
}
for (int j=0; j<wplist.size(); j++)
for (int j=0; j<tbw.parts.size(); j++)
{
tbwpt = wplist.at(j);
tbwpt = tbw.parts.at(j);
if (alienIds.contains(tbwpt.alienId))
{
wt.types.prepend(alienIds.indexOf(tbwpt.alienId));
wt.types.append(alienIds.indexOf(tbwpt.alienId));
} else {
alienIds.append(tbwpt.alienId);
wt.types.prepend(alienIds.size()-1);
wt.types.append(alienIds.size()-1);
}
wt.counts.prepend(tbwpt.count);
wt.counts.append(tbwpt.count);
}
gd->waves.prepend(wt);
gd->waves.append(wt);
qDebug() << tr("load wave #%1 prise=%2 timeout=%3").arg(i+1).arg(wt.prise).arg(wt.timeout) << wt.types << wt.counts;
wplist.clear();
//wplist.clear();
}
wollist.clear();
for (int i=0; i<alienIds.size(); ++i)
@@ -385,7 +399,7 @@ Game_Data * Loader::loadlevel(int id)
salt.score = tbal.score;
salt.speed = tbal.speed;
gd->aliens->srcAliens.append(salt);
qDebug() << tr("Alien %1 #%2 ").arg(salt.name).arg(i);
//qDebug() << tr("Alien %1 #%2 ").arg(salt.name).arg(i);
}
QList <tbTowerOnLevel> tollist = levTowers.values(id);
tbTower tbt;
@@ -462,7 +476,7 @@ Game_Data * Loader::loadlevel(int id)
{
piForeachA (j, morph_indexes[i])
{
int index = (int)j.morph;
long int index = (long int)j.morph;
for (int k=0; k<map->maxPlayers(); ++k)
{
j.morph = &(gd->players[k]->srcTowers[index]);
@@ -607,10 +621,10 @@ void Loader::fillTowerChains(QList <int> * animIds, QList <tbChain> * chlist,
QString Loader::createMapExample()
{
QVector < QVector < int > > Cells;
Cells.resize(25);
Cells.resize(32);
for (int i=0; i<Cells.size(); i++)
{
Cells[i].resize(11);
Cells[i].resize(32);
Cells[i][0]=Map::Wall;
Cells[i][Cells[i].size()-1]=Map::Wall;
}
@@ -627,10 +641,20 @@ QString Loader::createMapExample()
Cells[i][j]=Map::Player;
//for (int i=2; i<Cells.size()-2; i++)
//Cells[i][Cells[i].size()/2] = Map::Wall;
Cells[0][Cells[0].size()/2]=Map::Start;
//Cells[0][Cells[0].size()/2]=Map::Start;
//Cells[Cells.size()/2-1][0]=Map::Start;
Cells[Cells.size()-1][Cells[Cells.size()-1].size()/2]=Map::Finish;
//Cells[Cells.size()-1][Cells[Cells.size()-1].size()/2]=Map::Finish;
//Cells[Cells.size()/2-1][Cells[Cells.size()/2].size()-1]=Map::Finish;
for (int i=4; i<6; i++)
{
Cells[0][i]=Map::Start;
Cells[Cells.size()-1][Cells.size()-1-i]=Map::Finish;
}
for (int i=4; i<6; i++)
{
Cells[i][0]=Map::Start;
Cells[Cells.size()-1-i][Cells.size()-1]=Map::Finish;
}
QByteArray ba;
QDataStream tmps(&ba,QIODevice::ReadWrite);
tmps << Cells;
@@ -690,6 +714,28 @@ void Loader::readWaves()
if (waves.contains(w.id)) qCritical("Same wave ID detected, replacing...");
w.prise = nm.namedItem("prise").nodeValue().toInt();
w.timeout = nm.namedItem("timeout").nodeValue().toInt();
QDomNodeList wpelems = welems.at(i).childNodes();
for (int j=0; j<wpelems.size(); j++)
{
if (wpelems.at(j).nodeName() == "wavePart")
{
bool OK = true;
tbWavePart wp;
QDomNamedNodeMap nm = wpelems.at(j).attributes();
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)
{
w.parts.append(wp);
//qDebug() << tr("Wave=%1 alien=%2 count=%3").arg(wp.waveId).arg(wp.alienId).arg(wp.count);
}
}
}
waves.insert(w.id,w);
//qDebug() << tr("Wave %1 prise=%2 timeout=%3").arg(w.id).arg(w.prise).arg(w.timeout);
}
@@ -699,38 +745,38 @@ void Loader::readWaves()
}
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::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)
// {
// waves[wp.waveId].parts.append(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()
@@ -895,6 +941,7 @@ void Loader::readLevels()
l.name = nm.namedItem("name").nodeValue();
if (levels.contains(l.id)) qCritical("Same wave ID detected, replacing...");
l.mapId = nm.namedItem("map").nodeValue().toInt();
l.money = nm.namedItem("startMoney").nodeValue().toUInt();
if (!maps.contains(l.mapId))
{
qCritical("invalid map Id");