From 191e5ed1a14bafa326cafbe51d1269714874c6e6 Mon Sep 17 00:00:00 2001 From: buull Date: Sun, 22 Aug 2010 21:55:29 +0300 Subject: [PATCH] I think finished structures and some changes in loading and changes in map class we have 2 TODO now --- aliens.cpp | 24 +++---- base_types.h | 10 +-- data.xml | 2 +- game_data.h | 11 ++-- loader.cpp | 10 ++- loader.h | 8 ++- map.cpp | 172 ++++++++++++++++++++++++++++----------------------- map.h | 30 +++++---- player.cpp | 2 +- player.h | 6 +- schema.xml | 2 + splashes.h | 1 + towers.cpp | 31 ++++++++-- towers.h | 2 +- 14 files changed, 178 insertions(+), 133 deletions(-) diff --git a/aliens.cpp b/aliens.cpp index 3fe8ca8..054d866 100644 --- a/aliens.cpp +++ b/aliens.cpp @@ -17,31 +17,33 @@ void Aliens::AddAlien(int srcId) qCritical("ERROR out of aliens range"); return; } - Alien al = gameData->srcAliens.at(srcId); + AlienType al;// = gameData->srcAliens.at(srcId); al.Id = nextId; - al.finish = gameData->map->finishs.at(qrand()%gameData->map->finishs.size()); - qDebug()<map->finishs.size()<map->finishs.size(); - al.pos = QPointF(gameData->map->starts.at(qrand()%gameData->map->starts.size())); + al.src = srcId; + al.finish = gameData->map->Finishs().at(qrand()%gameData->map->Finishs().size()); + al.pos = QPointF(gameData->map->Starts().at(qrand()%gameData->map->Starts().size())); al.path = gameData->map->CreatePath(al.pos.toPoint(),al.finish); al.pathIndex = 1; if (al.path.isEmpty()) qFatal("ERROR create path"); qDebug() << al.path; + al.health = gameData->srcAliens.at(srcId).health; + al.speed = gameData->srcAliens.at(srcId).speed; + al.imgType = gameData->srcAliens.at(srcId).imgType; //gameData->map->printMap(); gameData->curAliens.insert(al.Id,al); nextId++; } -void Aliens::retrace(bool *OK) +void Aliens::retrace(bool * OK) { qDebug("re-trace!"); gameData->map->removeAliensPath(); for (int i=0; icurAliens.size(); i++) { - Alien al = gameData->curAliens.take(i); - al.path = gameData->map->CreatePath(al.pos.toPoint(),al.finish); - al.pathIndex = 1; - if (al.path.isEmpty()) *OK = false; + gameData->curAliens.values()[i].path = gameData->map->CreatePath(gameData->curAliens.values()[i].pos.toPoint(),gameData->curAliens.values()[i].finish); + gameData->curAliens.values()[i].pathIndex = 1; + if (gameData->curAliens.values()[i].path.isEmpty()) *OK = false; } } @@ -57,7 +59,7 @@ void Aliens::update() QList missIndex; for (int i=0; icurAliens.size(); i++) { - Alien al = gameData->curAliens.values().at(i); + AlienType al = gameData->curAliens.values().at(i); //qDebug() << i; //if (al.health < 0) emit AlienKill(); float tmpdx,tmpdy,angl,arctg = 0; @@ -101,7 +103,7 @@ void Aliens::update() al.pos.setY(al.pos.y() -al.speed*std::cos(arctg)); //return true; - gameData->curAliens[al.Id] = al; + gameData->curAliens.insert(al.Id,al); } for (int j=0; j types; // some types of aliens (e.g. 2 fly and 3 grount in one wave) QList counts; // count aliens of each type - int wait_time; // time in ticks - unsigned int gold; + unsigned int timeout; // time in ticks + unsigned int prise; }; diff --git a/data.xml b/data.xml index 3d203a0..021672b 100644 --- a/data.xml +++ b/data.xml @@ -6,7 +6,7 @@ - + diff --git a/game_data.h b/game_data.h index bfd0e7d..b0e85a8 100644 --- a/game_data.h +++ b/game_data.h @@ -11,12 +11,11 @@ class Game_Data : public QObject Q_OBJECT public: explicit Game_Data(Map * map, QObject *parent = 0); - QList srcAliens; - QList srcTowers; - QHash curAliens; - QHash curTowers; - QHash curSplashes; - QList waves; + QList srcAliens; + QHash curAliens; + QHash curTowers; + QHash curSplashes; + QList waves; QList players; Map * map; int curWave; diff --git a/loader.cpp b/loader.cpp index ccb2735..40d037c 100644 --- a/loader.cpp +++ b/loader.cpp @@ -491,13 +491,11 @@ void Loader::readMaps() m.name = mn.namedItem("name").nodeValue(); m.imgType = mn.namedItem("imageType").nodeValue().toInt(); m.maxPlayers = mn.namedItem("maxPlayers").nodeValue().toInt(); - QByteArray ba = QByteArray::fromBase64(mn.namedItem("data").nodeValue().toUtf8()); - ba = qUncompress(ba); - QDataStream s(ba); - s >> m.cells; + 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").arg(m.name).arg(m.id).arg(m.imgType).arg(m.maxPlayers); - for (int k=0; k > cells; + //QVector < QVector > cells; + QByteArray data; + QSize size; int imgType; }; @@ -158,7 +160,7 @@ public: explicit Loader(QObject *parent = 0); void create(); void reload(); - void loadlevel(Game_Data * gd); + Game_Data * loadlevel(); signals: public slots: diff --git a/map.cpp b/map.cpp index f0890e1..45b41c4 100644 --- a/map.cpp +++ b/map.cpp @@ -1,18 +1,30 @@ #include "map.h" -Map::Map(int Id, QObject *parent) : +Map::Map(QByteArray data, QSize size, QString name, int maxPlayers, int image, QObject *parent) : QObject(parent) { - mapId=Id; -} - - -void Map::load() -{ - //ReadSettings(); - //CreateMapExample(); + QByteArray ba = QByteArray::fromBase64(data); + ba = qUncompress(ba); + QDataStream s(ba); + mapName = name; + s >> Cells; + int chei; + if (Cells.size() <= 0) + qFatal("Map has invalid width"); + if (Cells.size() != size.width()) + qCritical("Map has wrong width"); + mapSize.setWidth(Cells.size()); + chei = Cells.at(0).size(); for (int i=0; igetValue("cells path"); - maxPlayers = sreader->getValue("max players","1").toInt(); - QFile * f = new QFile(str); - f->open(QIODevice::ReadOnly); - QDataStream s(f); - s >> Cells; - if (Cells.size()>0) - { - mapsize.setWidth(Cells.size()); - mapsize.setHeight(Cells[0].size()); - //qDebug() << "Map size" << mapsize; - //printMap(); - } else qDebug("invalid size"); - delete f; - delete sreader; -} +//void Map::ReadSettings() +//{ +// QString str; +// SettingsReader * sreader = new SettingsReader("map.conf"); +// str = sreader->getValue("cells path"); +// maxPlayers = sreader->getValue("max players","1").toInt(); +// QFile * f = new QFile(str); +// f->open(QIODevice::ReadOnly); +// QDataStream s(f); +// s >> Cells; +// if (Cells.size()>0) +// { +// mapsize.setWidth(Cells.size()); +// mapsize.setHeight(Cells[0].size()); +// //qDebug() << "Map size" << mapsize; +// //printMap(); +// } else qDebug("invalid size"); +// delete f; +// delete sreader; +//} void Map::printMap() @@ -64,8 +79,8 @@ void Map::removeAliensPath() bool Map::addTowerOnMap(int playerId, QPoint pos) { - if (playerId < 0 || playerId > maxPlayers) return false; - QRect r(QPoint(),mapsize); + if (playerId < 0 || playerId > players) return false; + QRect r(QPoint(),mapSize); if (!r.contains(pos)) return false; if (Cells[pos.x()][pos.y()]==Player+playerId) { @@ -95,6 +110,7 @@ bool Map::addTowerOnMap(int playerId, QPoint pos) if (!pathOK) { Cells[pos.x()][pos.y()]=PlayerAlien+playerId; + emit RecreateAlienPath(pathOK); return false; } return true; @@ -104,50 +120,50 @@ bool Map::addTowerOnMap(int playerId, QPoint pos) } -void Map::CreateMapExample() -{ - Cells.resize(16); - for (int i=0; iopen(QIODevice::ReadWrite); - f->resize(0); - QByteArray ba; - QDataStream tmps(&ba,QIODevice::ReadWrite); - tmps << Cells; - ba = qCompress(ba); - ba = ba.toBase64(); - QString str(ba); -// QDataStream s(f); -// s << ba; - f->write(str.toUtf8()); - f->close(); - delete f; -} +//void Map::CreateMapExample() +//{ +// Cells.resize(16); +// for (int i=0; iopen(QIODevice::ReadWrite); +// f->resize(0); +// QByteArray ba; +// QDataStream tmps(&ba,QIODevice::ReadWrite); +// tmps << Cells; +// ba = qCompress(ba); +// ba = ba.toBase64(); +// QString str(ba); +//// QDataStream s(f); +//// s << ba; +// f->write(str.toUtf8()); +// f->close(); +// delete f; +//} QVector Map::CreatePath(QPoint start, QPoint finish) @@ -207,7 +223,7 @@ int Map::WaveTrace(QPoint start, QPoint finish) bool stop = false; int step = 2; QPoint cp, tp; - QRect fr(QPoint(), mapsize); + QRect fr(QPoint(), mapSize); QVector tmpp, curp; TmpCells << Cells; for (int i = 0; i < Cells.size(); i++) @@ -293,7 +309,7 @@ QVector Map::InvWaveTrace(QPoint finish, int cnt) chk = chk | 0x01; c++; } - if (wp.x() + 1 < mapsize.width() && TmpCells[wp.x()+1][wp.y()] == cnt) + if (wp.x() + 1 < mapSize.width() && TmpCells[wp.x()+1][wp.y()] == cnt) { chk = chk | 0x02; c++; @@ -303,7 +319,7 @@ QVector Map::InvWaveTrace(QPoint finish, int cnt) chk = chk | 0x04; c++; } - if (wp.y() + 1 < mapsize.height() && TmpCells[wp.x()][wp.y()+1] == cnt) + if (wp.y() + 1 < mapSize.height() && TmpCells[wp.x()][wp.y()+1] == cnt) { chk = chk | 0x08; c++; diff --git a/map.h b/map.h index f9684b4..b8f11f9 100644 --- a/map.h +++ b/map.h @@ -17,7 +17,6 @@ class Map : public QObject { Q_OBJECT public: - enum CellType { Player = 1, @@ -38,33 +37,38 @@ public: // -3 - -/- // -1000 - it is wall or some place where you can't build - QVector < QVector > Cells; - QList starts; - QList finishs; - int maxPlayers; - explicit Map(int Id, QObject *parent = 0); - int Id() const {return mapId;} + explicit Map(QByteArray data, QSize size, QString name, int maxPlayers, int image, QObject *parent = 0); bool addTowerOnMap(int playerId, QPoint pos); + bool isFreePlace(QPoint pos); void delTowerOnMap(QPoint pos); void removeAliensPath(); QVector CreatePath(QPoint start, QPoint finish); - QSize size() const {return mapsize;} - void load(); +// QSize size() const {return mapsize;} +// QString name() const {return mapName;} + QList Starts() const {return starts;} + QList Finishs() const {return finishs;} + int Image() const {return imageType;} signals: void RecreateAlienPath(bool * pathOK); public slots: void printMap(); private: - int mapId; - QSize mapsize; + QSize mapSize; + QString mapName; + int players; + int imageType; + QVector < QVector > Cells; + QList starts; + QList finishs; + QVector < QVector > TmpCells; QVector InvWaveTrace(QPoint finish, int cnt); int WaveTrace(QPoint start, QPoint finish); - void CreateMapExample(); - void ReadSettings(); + //void CreateMapExample(); + //void ReadSettings(); }; #endif // MAP_H diff --git a/player.cpp b/player.cpp index 0a29f9a..871a632 100644 --- a/player.cpp +++ b/player.cpp @@ -4,5 +4,5 @@ Player::Player(int Id, QObject *parent) : QObject(parent) { playerId = Id; - adMoney = 100; + money = 100; } diff --git a/player.h b/player.h index 675ff13..39f510d 100644 --- a/player.h +++ b/player.h @@ -10,10 +10,10 @@ class Player : public QObject Q_OBJECT public: explicit Player(int Id, QObject *parent = 0); - unsigned long int adMoney; + unsigned long int money; + unsigned long int score; int selectAlienId; - QList srcTowers; - QList srcSplashes; + QList srcTowers; int playerId; signals: diff --git a/schema.xml b/schema.xml index 2278e89..a65f70e 100644 --- a/schema.xml +++ b/schema.xml @@ -155,6 +155,8 @@ + + diff --git a/splashes.h b/splashes.h index 174b017..834cc9d 100644 --- a/splashes.h +++ b/splashes.h @@ -11,6 +11,7 @@ Q_OBJECT public: explicit Splashes(Game_Data * gd, QObject *parent = 0); void AddSplash(int srcId); + void AddSplash(srcSplashType src,TowerType tw); void DelSplashById(int Id); void DelSplash(int index); void update(); diff --git a/towers.cpp b/towers.cpp index 8d7e89a..24ddcb9 100644 --- a/towers.cpp +++ b/towers.cpp @@ -4,9 +4,6 @@ Towers::Towers(Game_Data *gd, QObject *parent) : QObject(parent) { gameData = gd; - Tower tw; - for (int i=0; iplayers.size(); i++) - gameData->players[i]->srcTowers.push_back(tw); } bool Towers::AddTower(int playerId, int srcId, QPoint pos) @@ -23,7 +20,15 @@ bool Towers::AddTower(int playerId, int srcId, QPoint pos) qCritical("ERROR out of towers range"); return false; } - Tower tw = gameData->players.at(playerId)->srcTowers.at(srcId); + TowerType tw; + tw.src = srcId; + tw.imgType = gameData->players.at(playerId)->srcTowers.at(srcId).imgType; + tw.PlayerId = playerId; + tw.angle = 0; + tw.build = 0; + tw.reload = 0; + tw.aim = -1; + tw .oldAim = -1; if (gameData->map->addTowerOnMap(playerId,pos)) { tw.pos = pos; @@ -43,5 +48,21 @@ void Towers::DelTower(QPoint pos) void Towers::update() { - + for (int i; icurTowers.size(); i++) + { + TowerType tw = gameData->curTowers.values().at(i); + srcTowerType stw = gameData->players.at(tw.PlayerId)->srcTowers.at(tw.src); + if (tw.build < stw.buildTime) + { + tw.build++; + } else { + // TODO: finding aim alien in this place + if (tw.reload < stw.reload) + { + tw.reload++; + } else { + emit shot(stw.splashes.at(0),tw); + } + } + } } diff --git a/towers.h b/towers.h index ce7c36d..cba3da0 100644 --- a/towers.h +++ b/towers.h @@ -15,7 +15,7 @@ public: void update(); int size() const {return gameData->curTowers.size();} signals: - //void Shot(); + void shot(srcSplashType src, TowerType tw); public slots: private: