From 92133b9b6d8820aad2273c155fadb5ab00be9ead Mon Sep 17 00:00:00 2001 From: buull Date: Tue, 31 Aug 2010 00:12:48 +0400 Subject: [PATCH] some bugfix in splashes --- adcore.cpp | 2 +- aliendefender.pro.user | 42 +++++++++++++ base_types.h | 22 ++++++- loader.cpp | 2 + splashes.cpp | 131 ++++++++++++++++++++++++++--------------- splashes.h | 2 +- towers.cpp | 2 +- towers.h | 2 +- 8 files changed, 152 insertions(+), 53 deletions(-) diff --git a/adcore.cpp b/adcore.cpp index 3618daf..9e579a6 100644 --- a/adcore.cpp +++ b/adcore.cpp @@ -20,7 +20,7 @@ AD_Core::AD_Core(QObject *parent) : adtowers = new Towers(addata); adsplashes = new Splashes(addata); connect(addata->map,SIGNAL(recreateAlienPath(bool*)),adaliens,SLOT(retrace(bool*))); - connect(adtowers,SIGNAL(shot(srcSplashType,int,TowerType)),adsplashes,SLOT(addSplash(srcSplashType,int,TowerType))); + connect(adtowers,SIGNAL(shot(QPoint)),adsplashes,SLOT(addSplash(QPoint))); // adaliens->addAlien(0); // adaliens->AddAlien(0); // adaliens->AddAlien(0); diff --git a/aliendefender.pro.user b/aliendefender.pro.user index be6236a..31ed8bf 100644 --- a/aliendefender.pro.user +++ b/aliendefender.pro.user @@ -58,6 +58,7 @@ Debug 0 0 + 2 @@ -66,6 +67,7 @@ Release 0 + 0 @@ -166,6 +168,46 @@ buildconfiguration-Debug-cleanstep0 Debug + + DBUS_SESSION_BUS_ADDRESS=unix:abstract=/tmp/dbus-wExeabp7q4,guid=18815993df3603fdc64a3f6d4c7b5822 + DEFAULTS_PATH=/usr/share/gconf/gnome.default.path + DESKTOP_SESSION=gnome + DISPLAY=:0.0 + GDMSESSION=gnome + GDM_KEYBOARD_LAYOUT=us + GDM_LANG=ru_RU.UTF-8 + GNOME_DESKTOP_SESSION_ID=this-is-deprecated + GNOME_KEYRING_CONTROL=/tmp/keyring-4vN5uf + GTK_MODULES=canberra-gtk-module + HOME=/home/andrey + LANG=ru_RU.UTF-8 + LD_LIBRARY_PATH=/usr/lib/qtcreator: + LOGNAME=andrey + MANDATORY_PATH=/usr/share/gconf/gnome.mandatory.path + ORBIT_SOCKETDIR=/tmp/orbit-andrey + PATH=/usr/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games + PWD=/home/andrey + QTDIR=/usr/share/qt4 + SESSION_MANAGER=local/buull-eeePC:@/tmp/.ICE-unix/1205,unix/buull-eeePC:/tmp/.ICE-unix/1205 + SHELL=/bin/bash + SPEECHD_PORT=6561 + SSH_AGENT_PID=1239 + SSH_AUTH_SOCK=/tmp/keyring-4vN5uf/ssh + USER=andrey + USERNAME=andrey + XAUTHORITY=/var/run/gdm/auth-for-andrey-x9URui/database + XDG_CONFIG_DIRS=/etc/xdg/xdg-gnome:/etc/xdg + XDG_DATA_DIRS=/usr/share/gnome:/usr/local/share/:/usr/share/ + XDG_SESSION_COOKIE=f0649decca52f2beb55c9ea74ad1d028-1283151906.338331-318132279 + + true + + clean + -w + + /usr/bin/make + true + /home/andrey/AD/aliendefender true clean diff --git a/base_types.h b/base_types.h index fe4ca1f..975c9f2 100644 --- a/base_types.h +++ b/base_types.h @@ -62,6 +62,7 @@ struct srcTriggerType nearlestAlien }; int childId; // =-1 for none birth splash (e.q. only damage) + aimType childAim; bool delParent; float damage; float radius; @@ -72,13 +73,26 @@ struct srcTriggerType }; -struct TriggerType +struct TriggerOnDest +{ + int src; +}; + + +struct TriggerOnTimer { int src; unsigned int timer; }; +struct TriggerOnAlien +{ + int src; + QList triggerAliens; +}; + + struct srcSplashType { QString name; @@ -96,12 +110,16 @@ struct SplashType int imgType; int src; QPoint TowerId; // parent tower (-1;-1) for null parent + int srcTower; + int PlayerId; int AlienId; // aim alien (different from tower.AlienId) QPointF destination; int life; // in ticks float angle; // -180 .. 180 QPointF pos; - QList triggers; + QList trigsOnAlien; + QList trigsOnDest; + QList trigsOnTimer; }; diff --git a/loader.cpp b/loader.cpp index 88662b5..652f8ee 100644 --- a/loader.cpp +++ b/loader.cpp @@ -372,6 +372,8 @@ void Loader::fillTowerChains(QList * chlist, QList * trigIds, sr strigt.randomPosRadius = tbtrig.randomPosRadius; strigt.timer = tbtrig.timer; strigt.type = tbtrig.type; + strigt.childAim = tbtrig.childAim; + strigt.childId = -1; stt->triggers.append(strigt); trigIds->append(trigid); } diff --git a/splashes.cpp b/splashes.cpp index 07a9667..7b99a0b 100644 --- a/splashes.cpp +++ b/splashes.cpp @@ -11,8 +11,11 @@ Splashes::Splashes(Game_Data *gd, QObject *parent) : bool Splashes::addSplash(int srcId, QPointF pos) { - qFatal("don't use this function addSplash(int srcId, QPointF pos)"); - if (srcId < 0 || srcId >= gameData->srcSplashes.size()) + qDebug("don't use this function addSplash(int srcId, QPointF pos)"); + return false; + // FIXME: говнокод + // TODO: find and correct errors here + /* if (srcId < 0 || srcId >= gameData->srcSplashes.size()) { qCritical("ERROR out of splashes range"); return false; @@ -42,36 +45,61 @@ bool Splashes::addSplash(int srcId, QPointF pos) } gameData->curSplashes.insert(spl.id,spl); nextId++; - return true; + return true;*/ } -void Splashes::addSplash(srcSplashType src, int index, TowerType tw) +void Splashes::addSplash(QPoint curTowerId) { - SplashType spl; - spl.id = nextId; - spl.TowerId = tw.pos; - if (!gameData->curAliens.contains(tw.aim)) - qFatal("Error finding splash aim! Tower has nvalid aim!"); - spl.destination = gameData->curAliens.value(tw.aim).pos; - if (src.autoControl) - spl.AlienId = tw.aim; - else - spl.AlienId = -1; - spl.angle = tw.angle; // FIXME: tower not rotate - spl.pos = tw.pos; // FIXME: pos not in center or left-angle of tower - spl.imgType = src.imgType; - spl.life = 0; - spl.src = index; - TriggerType trig; - for(int i=0; icurTowers.contains(curTowerId)) { - trig.timer = gameData->players.at(tw.PlayerId)->srcTowers.at(tw.src).triggers.at(src.triggerIndexes.at(i)).timer; - trig.src = src.triggerIndexes.at(i); - spl.triggers.push_back(trig); + TowerType tw = gameData->curTowers.value(curTowerId); + srcSplashType src = gameData->players.at(tw.PlayerId)->srcTowers.at(tw.src).splashes.at(0); + SplashType spl; + spl.id = nextId; + spl.TowerId = curTowerId; + spl.srcTower = tw.src; + spl.PlayerId = tw.PlayerId; + if (!gameData->curAliens.contains(tw.aim)) + qFatal("Error finding splash aim! Tower has nvalid aim!"); + spl.destination = gameData->curAliens.value(tw.aim).pos; + if (src.autoControl) + spl.AlienId = tw.aim; + else + spl.AlienId = -1; + spl.angle = tw.angle; + spl.pos = tw.pos; // FIXME: splash do not create in center or left-angle of tower, it must be in tower's side + spl.imgType = src.imgType; + spl.life = 0; + spl.src = 0; + //TriggerType trig; + for(int i=0; iplayers.at(tw.PlayerId)->srcTowers.at(tw.src).triggers.at(src.triggerIndexes.at(i)); + switch (trig.type) + { + case srcTriggerType::onDestination : + tod.src = src.triggerIndexes.at(i); + spl.trigsOnDest.append(tod); + break; + case srcTriggerType::onAlienInRadius : + toa.src = src.triggerIndexes.at(i); + spl.trigsOnAlien.append(toa); + break; + case srcTriggerType::onTimer : + tot.src = src.triggerIndexes.at(i); + tot.timer = trig.timer; + spl.trigsOnTimer.append(tot); + break; + } + } + gameData->curSplashes.insert(spl.id,spl); + nextId++; } - gameData->curSplashes.insert(spl.id,spl); - nextId++; } @@ -94,30 +122,39 @@ void Splashes::update() //isTowerSplash = true; //if (!isTowerSplash) // src = gameData->srcSplashes.at(spl.src); - if (src.autoControl) + if (src.autoControl) + { + bool badAl = false; + if (gameData->curAliens.contains(spl.AlienId)) + spl.destination = gameData->curAliens.value(spl.AlienId).pos; + else + badAl = true; + if (distance2(spl.pos, spl.destination) < src.speed*src.speed) { - if (distance2(spl.pos, spl.destination) < src.speed*src.speed) + if (badAl) deadIndexes.push_back(spl.id); - if (gameData->curAliens.contains(spl.AlienId)) - spl.destination = gameData->curAliens.value(spl.AlienId).pos; - arctg = std::atan2(spl.pos.x() - spl.destination.x(),spl.pos.y() - spl.destination.y()); - //if (tmpdy < 0) arctg=arctg+M_PI; - angl = 180.0f*(-arctg)/M_PI; - - spl.angle = angl; - - spl.pos.setX(spl.pos.x() - -src.speed*std::sin(arctg)); - spl.pos.setY(spl.pos.y() - -src.speed*std::cos(arctg)); - } else { - if (!gameData->map->rect().contains(spl.pos.toPoint())) - deadIndexes.push_back(spl.id); - spl.pos.setX(spl.pos.x() - -src.speed*std::sin(-spl.angle*M_PI/180.f)); - spl.pos.setY(spl.pos.y() - -src.speed*std::cos(-spl.angle*M_PI/180.f)); + spl.pos = spl.destination; + for (int k=0; kmap->rect().contains(spl.pos.toPoint())) + deadIndexes.push_back(spl.id); + spl.pos.setX(spl.pos.x() + -src.speed*std::sin(-spl.angle*M_PI/180.f)); + spl.pos.setY(spl.pos.y() + -src.speed*std::cos(-spl.angle*M_PI/180.f)); + } // TODO: smooth splash rotate // TODO: activate trigger and more... gameData->curSplashes.insert(spl.id,spl); diff --git a/splashes.h b/splashes.h index d8bc002..01f809b 100644 --- a/splashes.h +++ b/splashes.h @@ -14,7 +14,7 @@ public: signals: public slots: - void addSplash(srcSplashType src, int index, TowerType tw); + void addSplash(QPoint towerId); private: Game_Data *gameData; diff --git a/towers.cpp b/towers.cpp index 8e499ce..8445e0e 100644 --- a/towers.cpp +++ b/towers.cpp @@ -96,7 +96,7 @@ void Towers::update() if ((*i).aim > 0) { (*i).reload = 0; - emit shot(stw.splashes.at(0), 0, (*i)); + emit shot((*i).pos); //qDebug("shot!"); } } diff --git a/towers.h b/towers.h index 23aeab4..02bb8c4 100644 --- a/towers.h +++ b/towers.h @@ -12,7 +12,7 @@ public: void delTower(QPoint pos); void update(); signals: - void shot(srcSplashType src, int index, TowerType tw); + void shot(QPoint towerId); public slots: private: