100 lines
2.3 KiB
C++
100 lines
2.3 KiB
C++
#include "towers.h"
|
|
|
|
#include <cmath>
|
|
|
|
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;
|
|
}
|
|
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;
|
|
qDebug() << "tw" << pos;
|
|
//gameData->map->printMap();
|
|
gameData->curTowers.insert(tw.pos,tw);
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
|
|
void Towers::delTower(QPoint pos)
|
|
{
|
|
gameData->curTowers.remove(pos);
|
|
}
|
|
|
|
|
|
void Towers::update()
|
|
{
|
|
for (QHash<QPoint, TowerType>::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<int, AlienType>::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: smooth rotate tower to aim
|
|
if ((*i).reload < stw.reload)
|
|
(*i).reload++;
|
|
else
|
|
{
|
|
if ((*i).aim > 0)
|
|
{
|
|
(*i).reload = 0;
|
|
emit shot(stw.splashes.at(0), 0, (*i));
|
|
qDebug("shot!");
|
|
}
|
|
}
|
|
}
|
|
qDebug() << "aim=" << (*i).aim;
|
|
}
|
|
}
|