From 714154a6fd4d8869cec90e284059a6e286373329 Mon Sep 17 00:00:00 2001 From: blizer Date: Sun, 11 Sep 2011 01:26:06 +0400 Subject: [PATCH] some improve game ui and bugfixes --- ADeditor/ADeditor.pro.user.1.3 | 431 +++++++++++++-------------------- ADeditor/mainwindow.cpp | 2 +- ad_graphics.cpp | 7 +- ad_graphics.h | 2 +- adcore.cpp | 27 ++- aliendefender.pro.user | 4 +- aliendefender.pro.user.2.3pre1 | 4 +- base_types.h | 1 + data2.xml | 84 ++++--- form.cpp | 89 ++++--- form.h | 5 +- form.ui | 25 +- game_data.cpp | 2 +- loader.cpp | 20 +- player.cpp | 8 +- splashes.cpp | 26 +- splashes.h | 3 +- touchbuttframe.h | 2 +- towers.h | 13 +- 19 files changed, 363 insertions(+), 392 deletions(-) diff --git a/ADeditor/ADeditor.pro.user.1.3 b/ADeditor/ADeditor.pro.user.1.3 index a597870..0464c13 100644 --- a/ADeditor/ADeditor.pro.user.1.3 +++ b/ADeditor/ADeditor.pro.user.1.3 @@ -1,287 +1,184 @@ - RunConfiguration0-BaseEnvironmentBase - 2 - - - RunConfiguration0-CommandLineArguments - - - - RunConfiguration0-ProFile - ADeditor.pro - - - RunConfiguration0-RunConfiguration.name - ADeditor - - - RunConfiguration0-UseDyldImageSuffix - false - - - RunConfiguration0-UseTerminal - false - - - RunConfiguration0-UserEnvironmentChanges - - - - RunConfiguration0-UserSetName - false - - - RunConfiguration0-UserSetWorkingDirectory - true - - - RunConfiguration0-UserWorkingDirectory - /home/andrey/AD/aliendefender - - - RunConfiguration0-type - Qt4ProjectManager.Qt4RunConfiguration - - - activeRunConfiguration + ProjectExplorer.Project.ActiveTarget 0 - activebuildconfiguration - Debug - - - buildConfiguration-Debug + ProjectExplorer.Project.EditorSettings - Debug - 0 - 0 - - 2 + true + false + UTF-8 + false + false + 4 + true + 1 + true + false + true + 0 + 8 + true + 1 + true + true + true + false - buildConfiguration-Release + ProjectExplorer.Project.Target.0 - Release - 0 - - 0 + + + Qt4ProjectManager.Target.DesktopTarget + 0 + 0 + 0 + + ProjectExplorer.ToolChain.Mingw:C:/Qt/qtcreator-2.2.0/mingw/bin/gcc.exe.x86-windows-msys-pe-32bit.C:/Qt/qtcreator-2.2.0/pythongdb/gdb-i686-pc-mingw32.exe + + + qmake + + QtProjectManager.QMakeBuildStep + false + + false + + + Сборка + + Qt4ProjectManager.MakeStep + false + -j2 + + + 2 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + Сборка + + Qt4ProjectManager.MakeStep + true + clean + + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + Debug + Debug + Qt4ProjectManager.Qt4BuildConfiguration + 2 + C:/Users/Dima/Desktop/aliendefender/ADeditor-build-desktop + 5 + ProjectExplorer.ToolChain.Mingw:C:/Qt/qtcreator-2.2.0/mingw/bin/gcc.exe.x86-windows-msys-pe-32bit.C:/Qt/qtcreator-2.2.0/pythongdb/gdb-i686-pc-mingw32.exe + false + + + ProjectExplorer.ToolChain.Mingw:C:/Qt/qtcreator-2.2.0/mingw/bin/gcc.exe.x86-windows-msys-pe-32bit.C:/Qt/qtcreator-2.2.0/pythongdb/gdb-i686-pc-mingw32.exe + + + qmake + + QtProjectManager.QMakeBuildStep + false + + false + + + Сборка + + Qt4ProjectManager.MakeStep + false + + + + 2 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + Сборка + + Qt4ProjectManager.MakeStep + true + + + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + Release + Release + Qt4ProjectManager.Qt4BuildConfiguration + 0 + C:/Users/Dima/Desktop/aliendefender/ADeditor-build-desktop + 5 + ProjectExplorer.ToolChain.Mingw:C:/Qt/qtcreator-2.2.0/mingw/bin/gcc.exe.x86-windows-msys-pe-32bit.C:/Qt/qtcreator-2.2.0/pythongdb/gdb-i686-pc-mingw32.exe + false + + 2 + + + 0 + Установка + Deploy + ProjectExplorer.BuildSteps.Deploy + + 1 + Без установки + Без установки + ProjectExplorer.DefaultDeployConfiguration + + 1 + + Конфигурация запуска Qt4 + ADeditor + Qt4ProjectManager.Qt4RunConfiguration + 2 + + ADeditor.pro + false + false + + C:/Users/Dima/Desktop/aliendefender/ + 3768 + true + false + + 1 - buildconfiguration-Debug-buildstep0 - - Debug - - DBUS_SESSION_BUS_ADDRESS=unix:abstract=/tmp/dbus-2HAd2azpnh,guid=fd81c6d6610b4c57717ec20c4c90d3de - 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-vNW3fv - 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/1158,unix/buull-eeePC:/tmp/.ICE-unix/1158 - SHELL=/bin/bash - SPEECHD_PORT=6561 - SSH_AGENT_PID=1195 - SSH_AUTH_SOCK=/tmp/keyring-vNW3fv/ssh - USER=andrey - USERNAME=andrey - XAUTHORITY=/var/run/gdm/auth-for-andrey-Len9P0/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-1284559837.801731-819619931 - - - /home/andrey/AD/aliendefender/ADeditor/ADeditor.pro - -spec - linux-g++ - -r - CONFIG+=debug - - /usr/bin/qmake-qt4 - false - /home/andrey/AD/aliendefender/ADeditor - + ProjectExplorer.Project.TargetCount + 1 - buildconfiguration-Debug-buildstep1 - - Debug - - DBUS_SESSION_BUS_ADDRESS=unix:abstract=/tmp/dbus-2HAd2azpnh,guid=fd81c6d6610b4c57717ec20c4c90d3de - 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-vNW3fv - 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/1158,unix/buull-eeePC:/tmp/.ICE-unix/1158 - SHELL=/bin/bash - SPEECHD_PORT=6561 - SSH_AGENT_PID=1195 - SSH_AUTH_SOCK=/tmp/keyring-vNW3fv/ssh - USER=andrey - USERNAME=andrey - XAUTHORITY=/var/run/gdm/auth-for-andrey-Len9P0/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-1284559837.801731-819619931 - - false - - -j2 - -w - - /usr/bin/make - true - /home/andrey/AD/aliendefender/ADeditor - - -j2 - - + ProjectExplorer.Project.Updater.EnvironmentId + {0f364aaa-5a2f-49c5-b7a5-6b296e2f6fd0} - 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/ADeditor - true - - clean - - - - - buildconfiguration-Release-buildstep0 - - Release - - - - buildconfiguration-Release-buildstep1 - - Release - - - - buildconfiguration-Release-cleanstep0 - - Release - - - - buildconfigurations - - Debug - Release - - - - buildstep0 - - - - - - - buildstep1 - - - - - - buildsteps - - trolltech.qt4projectmanager.qmake - trolltech.qt4projectmanager.make - - - - cleanstep0 - - - true - - - - cleansteps - - trolltech.qt4projectmanager.make - - - - defaultFileEncoding - UTF-8 - - - project - + ProjectExplorer.Project.Updater.FileVersion + 9 diff --git a/ADeditor/mainwindow.cpp b/ADeditor/mainwindow.cpp index 31616f2..696e6a5 100644 --- a/ADeditor/mainwindow.cpp +++ b/ADeditor/mainwindow.cpp @@ -28,7 +28,7 @@ MainWindow::MainWindow(QWidget *parent) : ui->pbImgDel->setIcon(QIcon::fromTheme("list-remove", QIcon(":/icons/icons/list-remove.png"))); ui->pbTwSplashEdit->setIcon(QIcon::fromTheme("edit", QIcon(":/icons/icons/edit.png"))); ui->pbMapEdit->setIcon(QIcon::fromTheme("edit", QIcon(":/icons/icons/edit.png"))); - adloader = new Loader(this); + adloader = new Loader(); adloader->load("data2.xml"); animModel = new AnimationModel(adloader->animations); diff --git a/ad_graphics.cpp b/ad_graphics.cpp index 0d1f631..67f08e5 100644 --- a/ad_graphics.cpp +++ b/ad_graphics.cpp @@ -73,7 +73,9 @@ void AD_Graphics::mousePressEvent(QMouseEvent *event) // scene->clearSelection(); if (event->button() == Qt::LeftButton) { - if (m_building) emit add_tow((QPointF(event->pos())/cellSize).toPoint()); + if (m_building) + emit add_tow((QPointF(event->pos())/cellSize).toPoint(), + event->modifiers().testFlag(Qt::ShiftModifier)); else { QList list = scene->items(event->pos(), Qt::IntersectsItemBoundingRect, Qt::AscendingOrder); @@ -126,7 +128,7 @@ void AD_Graphics::timerEvent(QTimerEvent * ) } else selection_tow->hide(); selection_tow->next(); selection_al->next(); - if (!core->isWaveEnd()) + if (core->isWaveEnd()) scene->update(); } @@ -185,6 +187,7 @@ void AD_Graphics::alienKilled(int id) { if (select_al != 0) if (select_al->id() == id) select_al = 0; QPainter p(mapimg); + p.setCompositionMode(QPainter::CompositionMode_Plus); p.translate((core->addata->aliens->curAliens[id].pos+QPointF(0.5,0.5))*cellSize); p.drawImage(core->addata->bloodrect, *(core->addata->blood)); p.end(); diff --git a/ad_graphics.h b/ad_graphics.h index 3a491f1..1644688 100644 --- a/ad_graphics.h +++ b/ad_graphics.h @@ -50,7 +50,7 @@ protected: signals: void cancel(); - void add_tow(QPoint pnt); + void add_tow(QPoint pnt, bool shift); void selected_tower_changed(QPoint id); }; diff --git a/adcore.cpp b/adcore.cpp index f346428..f196b3a 100644 --- a/adcore.cpp +++ b/adcore.cpp @@ -16,7 +16,7 @@ AD_Core::AD_Core(QObject *parent) : connect(adtowers,SIGNAL(shot(TowerType)),adsplashes,SLOT(addSplash(TowerType))); connect(adsplashes,SIGNAL(killAlien(int,int)),this,SLOT(killAlien(int,int))); waveInProgress = false; - waveEnd = false; + waveEnd = true; timer = startTimer(40); } @@ -26,10 +26,10 @@ void AD_Core::next() adtowers->update(); adsplashes->update(); addata->aliens->update(); - foreach(Player * p, addata->players) - { - if (!addata->aliens->curAliens.contains(p->selectAlienId)) p->selectAlienId = -1; - } +// foreach(Player * p, addata->players) +// { +// if (!addata->aliens->curAliens.contains(p->selectAlienId)) p->selectAlienId = -1; +// } waveProcessing(); step++; } @@ -43,26 +43,31 @@ void AD_Core::timerEvent(QTimerEvent * ) void AD_Core::nextWave() { - if (waveInProgress) return; + if (!waveEnd && waveInProgress) + { + qDebug("wave in progress"); + return; + } if (addata->curWave >= addata->waves.size()) { qDebug("level finished"); - waveEnd = false; return; } //wavetime = addata->waves.at(addata->curWave).timeout; - qDebug() << tr("Next wave %1").arg(addata->curWave+1); wavetime = 0; + addata->curWave++; waveInProgress = true; + waveEnd = false; + qDebug() << tr("Next wave %1").arg(addata->curWave+1); } void AD_Core::waveProcessing() { /// FIXME : resolve problem with prise for finish wave, it is calculated wrong! - if (addata->aliens->curAliens.isEmpty() && waveEnd) + if (addata->aliens->curAliens.isEmpty() && !waveInProgress && !waveEnd) { if(addata->curWave > 0) addata->players.at(0)->money += addata->waves.at(addata->curWave-1).prise; - waveEnd = false; + waveEnd = true; } if (!waveInProgress) return; if (wavetime <= 0) { @@ -71,11 +76,9 @@ void AD_Core::waveProcessing() addata->aliens->addAlien(addata->waves.at(addata->curWave).types.at(i)); addata->waves[addata->curWave].counts[i]--; wavetime = addata->waves.at(addata->curWave).timeout; - waveEnd = true; return; } } - addata->curWave++; waveInProgress = false; } else { wavetime--; diff --git a/aliendefender.pro.user b/aliendefender.pro.user index 5b632d5..0437ec9 100644 --- a/aliendefender.pro.user +++ b/aliendefender.pro.user @@ -1,6 +1,6 @@ - + ProjectExplorer.Project.ActiveTarget @@ -87,7 +87,7 @@ Qt4ProjectManager.Target.DesktopTarget - 1 + 0 0 0 diff --git a/aliendefender.pro.user.2.3pre1 b/aliendefender.pro.user.2.3pre1 index de64635..277afe4 100644 --- a/aliendefender.pro.user.2.3pre1 +++ b/aliendefender.pro.user.2.3pre1 @@ -83,7 +83,7 @@ Qt4ProjectManager.Qt4BuildConfiguration 2 D:/Dropbox/My Dropbox/projects/aliendefender-build-desktop - 7 + 5 ProjectExplorer.ToolChain.Mingw:D:/Qt/2010.04/mingw/bin/g++.exe.x86-windows-msys-pe-32bit.C:/Qt/qtcreator-2.2.0/pythongdb/gdb-i686-pc-mingw32.exe false @@ -175,7 +175,7 @@ ProjectExplorer.Project.Updater.EnvironmentId - {00000000-0000-0000-0000-000000000000} + {0f364aaa-5a2f-49c5-b7a5-6b296e2f6fd0} ProjectExplorer.Project.Updater.FileVersion diff --git a/base_types.h b/base_types.h index c0fe569..aa2ad38 100644 --- a/base_types.h +++ b/base_types.h @@ -43,6 +43,7 @@ struct srcAlienType struct AlienType { int id; // uses for QHash + int wave; srcAlienType * src; QPointF pos; float angle; // -180 .. 180 diff --git a/data2.xml b/data2.xml index df9f4e9..30917ad 100644 --- a/data2.xml +++ b/data2.xml @@ -1,12 +1,12 @@ - + + + - - - - + + @@ -14,47 +14,47 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + - - + + @@ -63,7 +63,6 @@ - @@ -99,7 +98,6 @@ - @@ -163,9 +161,9 @@ - - - + + + diff --git a/form.cpp b/form.cpp index e8cced3..d17dc67 100644 --- a/form.cpp +++ b/form.cpp @@ -8,39 +8,40 @@ Form::Form(QWidget *parent) : { buildTowerId = -1; ui->setupUi(this); + ui->pbSell->hide(); graphics = new AD_Graphics(&core); ui->widget->layout()->addWidget(graphics); tbf = new TouchButtFrame(); tbf->setOrientation(Qt::Vertical); morphtbf = new TouchButtFrame(); morphtbf->setOrientation(Qt::Vertical); - tbf->addButton(tr("delete")); - foreach (srcTowerType i, core.addata->players.at(0)->srcTowers) + //tbf->addButton(tr("delete")); + for(int j=0; jplayers.at(0)->srcTowers.size(); ++j) { - QPixmap pix(32,32); - pix.fill(Qt::transparent); - QPainter p; - p.begin(&pix); - //p.fillRect(pix.rect(),Qt::transparent); - p.setRenderHints(QPainter::SmoothPixmapTransform); - p.drawImage(pix.rect(),*(i.image)); - p.end(); - cursors.append(pix); - tbf->addButton(i.name+tr("\n %1 $").arg(i.cost)); - tbf->Button(cursors.size())->setIcon(QIcon(pix)); - //QPushButton * butt = new QPushButton(i.name); - //towerButtons << butt; - //butt->setAutoDefault(true); - //butt->setAutoExclusive(true); - //butt->setCheckable(true); + srcTowerType i = core.addata->players.at(0)->srcTowers.at(j); + if (i.isRoot) + { + QPixmap pix(32,32); + pix.fill(Qt::transparent); + QPainter p; + p.begin(&pix); + //p.fillRect(pix.rect(),Qt::transparent); + p.setRenderHints(QPainter::SmoothPixmapTransform); + p.drawImage(pix.rect(),*(i.image)); + p.end(); + cursors.append(pix); + tbf->addButton(i.name+tr("\n %1 $").arg(i.cost)); + tbf->Button(cursors.size()-1)->setIcon(QIcon(pix)); + buildTowers.append(j); + } } ui->gbTowers->layout()->addWidget(tbf); ui->verticalLayout_2->addWidget(morphtbf); connect(tbf,SIGNAL(click(int)),this,SLOT(towerBuild(int))); connect(tbf,SIGNAL(click(int)),tbf,SLOT(set_green(int))); connect(morphtbf,SIGNAL(click(int)),this,SLOT(towerMorph(int))); - connect(graphics,SIGNAL(add_tow(QPoint)),this,SLOT(add_tow(QPoint))); -// connect(core.adtowers,SIGNAL(tower_killed(QPoint)),graphics,SLOT(towerKilled(QPoint))); + connect(graphics,SIGNAL(add_tow(QPoint,bool)),this,SLOT(add_tow(QPoint,bool))); + // connect(core.adtowers,SIGNAL(tower_killed(QPoint)),graphics,SLOT(towerKilled(QPoint))); connect(core.addata->aliens,SIGNAL(alien_killed(int)),graphics,SLOT(alienKilled(int))); connect(graphics,SIGNAL(cancel()),this,SLOT(cancel())); connect(graphics,SIGNAL(selected_tower_changed(QPoint)),this,SLOT(selectedTowerChanged(QPoint))); @@ -62,25 +63,23 @@ void Form::on_pbNextWave_clicked() void Form::towerBuild(int index) { - buildTowerId = index-1; - if (index == 0) buildTowerId = -9; + buildTowerId = buildTowers.at(index); graphics->setBuilding(true); - if (index != 0) - setCursor(QCursor(cursors.at(index-1))); - else setCursor(Qt::ForbiddenCursor); + setCursor(QCursor(cursors.at(index))); } -void Form::add_tow(QPoint pnt) +void Form::add_tow(QPoint pnt, bool shift) { if (buildTowerId == -1) return; - if (buildTowerId == -9) - { - graphics->towerKilled(pnt); - core.adtowers->delTower(pnt); - return; - } + // if (buildTowerId == -9) + // { + // graphics->towerKilled(pnt); + // core.adtowers->delTower(pnt); + // return; + // } core.adtowers->addTower(0,buildTowerId,pnt); + if (!shift) cancel(); } @@ -94,9 +93,9 @@ void Form::cancel() void Form::timerEvent(QTimerEvent *) { - for (int i=1; ibuttCount(); ++i) + for (int i=0; ibuttCount(); ++i) { - bool b = core.adtowers->canBuild(i-1,0); + bool b = core.adtowers->canBuild(buildTowers.at(i),0); tbf->Button(i)->setEnabled(b); if (b) tbf->set_green(i); else tbf->set_red(i); @@ -111,6 +110,8 @@ void Form::timerEvent(QTimerEvent *) twstr += tr("\n player %1\n exp %2").arg(tw.PlayerId).arg(tw.experience); twstr += tr("\n reload %1/%2\n alien %3").arg(tw.reload).arg(tw.src->reload).arg(tw.aim); twstr += tr("\n cost %1\n radius %2").arg(tw.src->cost).arg(tw.src->radius-1); + if (!tw.src->triggers.isEmpty()) + twstr += tr("\n damage %1").arg(tw.src->triggers.at(0).damage); for (int i=0; imorphs.size(); ++i) { bool m = core.adtowers->canMorph(tw.pos,i); @@ -131,6 +132,7 @@ void Form::timerEvent(QTimerEvent *) alstr += tr("\n prise %1").arg(al.src->prise); } ui->lbInfo->setText(tr(" money %1 \n missing %2").arg(core.addata->players.at(0)->money).arg(core.addata->aliens->missingAliens()) + + tr("\n wave %1").arg(core.addata->curWave+1) + tr("\n aliens %1").arg(core.addata->aliens->curAliens.size()) + tr("\n towers %1").arg(core.addata->curTowers.size()) + tr("\n splashes %1").arg(core.addata->curSplashes.size()) @@ -148,7 +150,12 @@ void Form::on_sbSpeed_valueChanged(double val) void Form::selectedTowerChanged(QPoint id) { morphtbf->deleteButtons(); - if (id.isNull()) return; + if (id.isNull()) + { + ui->pbSell->hide(); + return; + } + ui->pbSell->show(); srcTowerType * t = core.addata->curTowers[id].src; piForeachCA(i, t->morphs) morphtbf->addButton(i.morph->name+tr("\n %1 $, %2 exp").arg(i.cost).arg(i.expRequired)); @@ -163,3 +170,15 @@ void Form::towerMorph(int index) graphics->selectTower(core.addata->curTowers[id].item); selectedTowerChanged(graphics->selectedTower()); } + + +void Form::on_pbSell_clicked() +{ + QPoint pnt = graphics->selectedTower(); + if (!pnt.isNull()) + { + graphics->towerKilled(pnt); + core.adtowers->delTower(pnt); + return; + } +} diff --git a/form.h b/form.h index f678ab4..ec391f4 100644 --- a/form.h +++ b/form.h @@ -23,12 +23,14 @@ private slots: void on_pbNextWave_clicked(); void towerBuild(int index); void towerMorph(int index); - void add_tow(QPoint pnt); + void add_tow(QPoint pnt, bool shift); void selectedTowerChanged(QPoint id); void cancel(); void on_sbSpeed_valueChanged(double arg1); + void on_pbSell_clicked(); + private: void timerEvent(QTimerEvent *); Ui::Form *ui; @@ -37,6 +39,7 @@ private: AD_Graphics * graphics; TouchButtFrame * morphtbf, * tbf; QList cursors; + QList buildTowers; //signals: // void tower_killed(); diff --git a/form.ui b/form.ui index 0ef15a2..f750905 100644 --- a/form.ui +++ b/form.ui @@ -6,7 +6,7 @@ 0 0 - 700 + 796 448 @@ -85,6 +85,29 @@ + + + + Qt::Vertical + + + QSizePolicy::Preferred + + + + 20 + 40 + + + + + + + + Sell + + + diff --git a/game_data.cpp b/game_data.cpp index 25f83f1..55593b5 100644 --- a/game_data.cpp +++ b/game_data.cpp @@ -4,7 +4,7 @@ Game_Data::Game_Data(Map *mapp, QObject *parent) : QObject(parent) { map = mapp; - curWave = 0; + curWave = -1; // alienSelect.images = towerSelect.images = 0; aliens = new Aliens(map); } diff --git a/loader.cpp b/loader.cpp index 6c769a2..6d1b95c 100644 --- a/loader.cpp +++ b/loader.cpp @@ -421,6 +421,12 @@ Game_Data * Loader::loadlevel(int id) sst.compositionMode = tbs.compositionMode; sst.keepOnAlien = tbs.keepOnAlien; stt.splashes.append(sst); + stt.isRoot=true; + for (QMultiHash::iterator m = morphs.begin(); + m != morphs.end(); ++m) + { + if (tbt.id == (*m).toId) stt.isRoot=false; + } int recursiveCheck = 1; fillTowerChains(&animIds,&chlist,&trigIds,&stt, tbt.splashId,0,&recursiveCheck); @@ -440,10 +446,13 @@ Game_Data * Loader::loadlevel(int id) break; } } - m.cost = tmh.cost; - m.expRequired = tmh.expRequired; - m.morph = (srcTowerType*)tollist.indexOf(j); - if (contain) morph_indexes[i].append(m); + if (contain) + { + m.cost = tmh.cost; + m.expRequired = tmh.expRequired; + m.morph = (srcTowerType*)tollist.indexOf(j); + morph_indexes[i].append(m); + } } for (int k=0; kmaxPlayers(); ++k) gd->players[k]->srcTowers.append(stt); @@ -464,7 +473,8 @@ Game_Data * Loader::loadlevel(int id) QString morphtree; foreach (srcTowerType i, gd->players[0]->srcTowers) { - printMorphs(&i,morphtree,""); + if (i.isRoot) + printMorphs(&i,morphtree,""); } qDebug() << morphtree + "\n"; diff --git a/player.cpp b/player.cpp index 4ae812f..1a012d0 100644 --- a/player.cpp +++ b/player.cpp @@ -1,9 +1,9 @@ #include "player.h" Player::Player(int Id, QObject *parent) : - QObject(parent) + QObject(parent) { - playerId = Id; - money = 50; - selectAlienId = -1; + playerId = Id; + money = 100; + selectAlienId = -1; } diff --git a/splashes.cpp b/splashes.cpp index 6088bd6..a5edd7a 100644 --- a/splashes.cpp +++ b/splashes.cpp @@ -81,16 +81,16 @@ void Splashes::addSplash(SplashType * spl) case srcTriggerType::onDestination : tod.src = trig; spl->trigsOnDest.append(tod); - break; + break; case srcTriggerType::onAlienInRadius : toa.src = trig; spl->trigsOnAlien.append(toa); - break; + break; case srcTriggerType::onTimer : tot.src = trig; tot.timer = 0; spl->trigsOnTimer.append(tot); - break; + break; } } @@ -177,7 +177,10 @@ void Splashes::update() delSplash(*j); for (QHash::iterator j = dead.begin(); j != dead.end(); ++j) + { + gameData->curTowers[j->tower].experience += gameData->curTowers[j->tower].src->expByKill; emit killAlien(j->player,j->id); + } dead.clear(); } @@ -212,7 +215,8 @@ void Splashes::doTriggerOnTimer(QHash::iterator if (gameData->aliens->curAliens.contains(spl->AlienId)) { hh = gameData->aliens->curAliens[spl->AlienId].health -= dmg; - if (hh <= 0) dead.insert(spl->AlienId, DeadAlienIndex(spl->AlienId, spl->PlayerId)); + if (hh <= 0) dead.insert(spl->AlienId, DeadAlienIndex(spl->AlienId, spl->PlayerId, spl->towerId)); + else gameData->curTowers[spl->towerId].experience += hh * gameData->curTowers[spl->towerId].src->expByDamage; } } else { for (QHash::iterator @@ -222,7 +226,8 @@ void Splashes::doTriggerOnTimer(QHash::iterator if (distance2(spl->pos, a->pos) < rad*rad) { hh = a->health -= dmg; - if (hh <= 0) dead.insert(a->id, DeadAlienIndex(a->id, spl->PlayerId)); + if (hh <= 0) dead.insert(a->id, DeadAlienIndex(a->id, spl->PlayerId, spl->towerId)); + else gameData->curTowers[spl->towerId].experience += hh * gameData->curTowers[spl->towerId].src->expByDamage; } } } @@ -263,7 +268,7 @@ void Splashes::doTriggerOnDest(QHash::iterator { case srcTriggerType::parentAim : aim = spl->AlienId; - break; + break; /// TODO : other aim types case srcTriggerType::nearestAlien : @@ -289,7 +294,8 @@ void Splashes::doTriggerOnDest(QHash::iterator if (!badAl) { hh = gameData->aliens->curAliens[spl->AlienId].health -= dmg; - if (hh <= 0) dead.insert(spl->AlienId, DeadAlienIndex(spl->AlienId, spl->PlayerId)); + if (hh <= 0) dead.insert(spl->AlienId, DeadAlienIndex(spl->AlienId, spl->PlayerId, spl->towerId)); + else gameData->curTowers[spl->towerId].experience += hh * gameData->curTowers[spl->towerId].src->expByDamage; } } else { for (QHash::iterator @@ -299,7 +305,8 @@ void Splashes::doTriggerOnDest(QHash::iterator if (distance2(spl->pos, i->pos) < rad*rad) { hh = i->health -= dmg; - if (hh <= 0) dead.insert(i->id, DeadAlienIndex(i->id, spl->PlayerId)); + if (hh <= 0) dead.insert(i->id, DeadAlienIndex(i->id, spl->PlayerId, spl->towerId)); + else gameData->curTowers[spl->towerId].experience += hh * gameData->curTowers[spl->towerId].src->expByDamage; } } } @@ -326,7 +333,8 @@ void Splashes::doTriggerOnAlien(QHash::iterator spl, QHashpos, i->pos) < rad*rad) { hh = i->health -= dmg; - if (hh <= 0) dead.insert(i->id, DeadAlienIndex(i->id, spl->PlayerId)); + if (hh <= 0) dead.insert(i->id, DeadAlienIndex(i->id, spl->PlayerId, spl->towerId)); + else gameData->curTowers[spl->towerId].experience += hh * gameData->curTowers[spl->towerId].src->expByDamage; if (t.src->count > 0 && t.src->childId > 0) { if (!t.triggerAliens.contains(i->id)) diff --git a/splashes.h b/splashes.h index 331d74c..122094f 100644 --- a/splashes.h +++ b/splashes.h @@ -28,9 +28,10 @@ private: int nextId; struct DeadAlienIndex { - DeadAlienIndex(int i, int p) {id = i; player = p;} + DeadAlienIndex(int i, int p, QPoint t) {id = i; player = p; tower = t;} int player; int id; + QPoint tower; }; QHash dead; diff --git a/touchbuttframe.h b/touchbuttframe.h index 9f16763..8c743f0 100644 --- a/touchbuttframe.h +++ b/touchbuttframe.h @@ -19,7 +19,7 @@ class TouchButtFrame : public QFrame Q_PROPERTY(Qt::Orientation orientation READ orientation WRITE setOrientation) public: TouchButtFrame(QWidget * parent = 0, - QColor red = Qt::darkRed, QColor green = Qt::green, QColor white = Qt::white, QColor push = Qt::yellow, + QColor red = Qt::gray, QColor green = Qt::green, QColor white = Qt::white, QColor push = Qt::yellow, Qt::Orientation orientation = Qt::Horizontal); void setButtons(const QStringList &captions); QStringList buttons(); diff --git a/towers.h b/towers.h index 5d0c027..3eb0a42 100644 --- a/towers.h +++ b/towers.h @@ -5,21 +5,26 @@ class Towers : public QObject { -Q_OBJECT + Q_OBJECT public: explicit Towers(Game_Data * gd, QObject *parent = 0); bool addTower(int playerId, int srcId, QPoint pos); void delTower(QPoint pos); bool morphTower(QPoint id, int index); bool canBuild(int id, int player) {return gameData->players[player]->money >= gameData->players[player]->srcTowers[id].cost;} - bool canMorph(QPoint id, int index) {return gameData->players[gameData->curTowers[id].PlayerId]->money >= gameData->curTowers[id].src->morphs[index].cost && - gameData->curTowers[id].experience >= gameData->curTowers[id].src->morphs[index].expRequired;} + bool canMorph(QPoint id, int index) + { + TowerType * t = &(gameData->curTowers[id]); + return gameData->players[t->PlayerId]->money >= t->src->morphs[index].cost && + t->experience >= t->src->morphs[index].expRequired && + !t->isBilding; + } void update(); void setScene(QGraphicsScene * scene_) {scene = scene_;} signals: void shot(const TowerType &tow); -// void tower_killed(QPoint id); + // void tower_killed(QPoint id); public slots: