#include "towers.h" #include Towers::Towers(Game_Data *gd, QObject *parent) : QObject(parent) { gameData = gd; } bool Towers::addTower(int playerId, int srcId, QPoint pos) { //QByteArray ar; //ar << pos; if (playerId < 0 || playerId >= gameData->players.size()) { qCritical("ERROR out of players range"); return false; } if (srcId < 0 || srcId >= gameData->players.at(playerId)->srcTowers.size()) { qCritical("ERROR out of towers range"); return false; } QRect alrec(pos,QSize(2,2)); for (QHash::iterator i = gameData->curAliens.begin(); i != gameData->curAliens.end(); ++i) if (alrec.contains((*i).pos.toPoint())) return false; 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.experience = 0; //tw .oldAim = -1; if (gameData->map->addTowerOnMap(playerId,pos)) { tw.pos = pos; //qDebug() << "tw" << pos; //gameData->map->printMap(); gameData->curTowers.insert(tw.pos,tw); return true; } return false; } void Towers::delTower(QPoint pos) { if (gameData->curTowers.contains(pos)) { gameData->map->delTowerOnMap(gameData->curTowers.value(pos).PlayerId,pos); gameData->curTowers.remove(pos); } } void Towers::update() { for (QHash::iterator i = gameData->curTowers.begin(); i != gameData->curTowers.end(); ++i) { srcTowerType stw = gameData->players.at((*i).PlayerId)->srcTowers.at((*i).src); if ((*i).build < stw.buildTime) { (*i).build++; //qDebug() << "building tower ..." << (*i).build; } else { if (!(gameData->curAliens.contains((*i).aim))) (*i).aim = -1; else { if (distance2((*i).pos,gameData->curAliens.value((*i).aim).pos) > stw.radius*stw.radius) (*i).aim = -1; } if (gameData->players.at((*i).PlayerId)->selectAlienId > 0) { AlienType al = gameData->curAliens.value(gameData->players.at((*i).PlayerId)->selectAlienId); if (distance2(al.pos, (*i).pos) < stw.radius*stw.radius) (*i).aim = al.id; } if ((*i).aim < 0) { for (QHash::iterator j = gameData->curAliens.begin(); j != gameData->curAliens.end(); ++j) { float dist = distance2((*i).pos, (*j).pos); //qDebug() << "dist=" << dist << "radius=" << stw.radius*stw.radius; if (dist < stw.radius*stw.radius) (*i).aim = (*j).id; //else (*i).aim = -1; } } // TODO: calculate tower angl if ((*i).aim > 0) { float arctg = std::atan2((*i).pos.x() - gameData->curAliens.value((*i).aim).pos.x(),(*i).pos.y() - gameData->curAliens.value((*i).aim).pos.y()); //if (tmpdy < 0) arctg=arctg+M_PI; (*i).angle = 180.0f*(-arctg)/M_PI; } // TODO: smooth rotate tower to aim if ((*i).reload < stw.reload) (*i).reload++; else { if ((*i).aim > 0) { (*i).reload = 0; (*i).experience += stw.expByShot; emit shot((*i).pos); //qDebug("shot!"); } } } //qDebug() << "aim=" << (*i).aim; } }