summaryrefslogtreecommitdiffstats
path: root/sigencore
diff options
context:
space:
mode:
authorBen Boeckel <MathStuf@gmail.com>2009-03-17 23:24:33 -0400
committerBen Boeckel <MathStuf@gmail.com>2009-03-17 23:24:33 -0400
commited169e4c8af82fee9ab3178f016c06db93e10c43 (patch)
treef61c6645e086daf5b562a4882417a3f8f9e5aede /sigencore
parentf43d0650ee0635e3a644a22171aa560078c9b35b (diff)
downloadsigen-ed169e4c8af82fee9ab3178f016c06db93e10c43.tar.gz
sigen-ed169e4c8af82fee9ab3178f016c06db93e10c43.tar.xz
sigen-ed169e4c8af82fee9ab3178f016c06db93e10c43.zip
Fix up the timer for ATBArena to be a lot cleaner
Diffstat (limited to 'sigencore')
-rw-r--r--sigencore/plugins/arenas/atb/ATBArena.cpp21
-rw-r--r--sigencore/plugins/arenas/atb/ATBArena.h3
-rw-r--r--sigencore/plugins/arenas/atb/ATBTimer.cpp78
-rw-r--r--sigencore/plugins/arenas/atb/ATBTimer.h8
4 files changed, 47 insertions, 63 deletions
diff --git a/sigencore/plugins/arenas/atb/ATBArena.cpp b/sigencore/plugins/arenas/atb/ATBArena.cpp
index 034b05f7..e3e75bbf 100644
--- a/sigencore/plugins/arenas/atb/ATBArena.cpp
+++ b/sigencore/plugins/arenas/atb/ATBArena.cpp
@@ -30,9 +30,9 @@ using namespace Sigencore;
ATBArena::ATBArena(GameWrapper* sigmod, Config* parent) :
Arena(sigmod, parent),
- m_atbTimer(NULL),
- m_processTicker(NULL)
+ m_atbTimer(new ATBTimer(this, m_decisions))
{
+ connect(m_atbTimer, SIGNAL(actionReady(Sigencore::TeamMember*)), this, SLOT(processAction(Sigencore::TeamMember*)));
setupBattle();
}
@@ -65,24 +65,13 @@ void ATBArena::handleAction(TeamMember* teamMember, TeamMember::Action action)
void ATBArena::setupBattle()
{
- m_atbTimer = new ATBTimer(this, m_decisions);
- m_processTicker = new QTimer(this);
- m_processTicker->setInterval(100);
- connect(m_processTicker, SIGNAL(timeout()), this, SLOT(processActions()));
- connect(this, SIGNAL(battleStarted()), m_processTicker, SLOT(start()));
Arena::setupBattle();
}
-void ATBArena::processActions()
+void ATBArena::processAction(TeamMember* teamMember)
{
- if (!m_decisions.isEmpty())
- {
-// while (m_decisions.head().second.isFinished())
-// {
-// TeamMember::RequestedAction action = m_decisions.dequeue();
-// handleAction(action.first, action.second.result());
-// }
- }
+ handleAction(teamMember, m_decisions[teamMember].second);
+ m_decisions.remove(teamMember);
}
void ATBArena::cleanUp()
diff --git a/sigencore/plugins/arenas/atb/ATBArena.h b/sigencore/plugins/arenas/atb/ATBArena.h
index 1b3ec9af..6e781ab1 100644
--- a/sigencore/plugins/arenas/atb/ATBArena.h
+++ b/sigencore/plugins/arenas/atb/ATBArena.h
@@ -51,7 +51,7 @@ class ATBArena : public Sigencore::Arena
Kross::ActionCollection* m_priorityScripts;
protected slots:
- void processActions();
+ void processAction(Sigencore::TeamMember* teamMember);
virtual void registerScript(const Sigcore::Script& script);
@@ -59,7 +59,6 @@ class ATBArena : public Sigencore::Arena
private:
ActionMap m_decisions;
ATBTimer* m_atbTimer;
- QTimer* m_processTicker;
};
#endif
diff --git a/sigencore/plugins/arenas/atb/ATBTimer.cpp b/sigencore/plugins/arenas/atb/ATBTimer.cpp
index faf93786..6f32d312 100644
--- a/sigencore/plugins/arenas/atb/ATBTimer.cpp
+++ b/sigencore/plugins/arenas/atb/ATBTimer.cpp
@@ -27,15 +27,48 @@
#include <sigscript/RulesWrapper.h>
// Qt includes
-#include <QtCore/QtAlgorithms>
#include <QtCore/QtConcurrentFilter>
-#include <QtCore/QtConcurrentMap>
#include <QtCore/QFuture>
#include <QtCore/QSignalMapper>
#include <QtCore/QTimerEvent>
using namespace Sigencore;
+struct ATBTimer::TimerIncrementFunctor
+{
+ TimerIncrementFunctor(ATBTimer* timer) :
+ m_timer(timer)
+ {
+ }
+
+ typedef bool result_type;
+
+ bool operator()(TeamMember* teamMember)
+ {
+ double factor = .1;
+ m_timer->m_arena->valueOfType("meter-factor", &factor);
+ if (!m_timer->m_actions.contains(teamMember))
+ {
+ m_timer->m_timers[teamMember] += teamMember->statValue(Sigmod::ST_Speed) * factor;
+ int threshold = 1000;
+ m_timer->m_arena->valueOfType("meter-threshold", &threshold);
+ if (threshold <= m_timer->m_timers[teamMember])
+ {
+ QFutureWatcher<TeamMember::Action>* watcher = new QFutureWatcher<TeamMember::Action>(m_timer);
+ TeamMember::RequestedAction action = requestDecision(teamMember);
+ watcher->setFuture(action.second);
+ m_timer->connect(watcher, SIGNAL(finished()), m_timer->m_actionMapper, SLOT(map()));
+ m_timer->connect(watcher, SIGNAL(finished()), SLOT(deleteLater()));
+ m_timer->m_actionMapper->setMapping(watcher, teamMember);
+ m_timer->m_actions.set(teamMember, action);
+ }
+ }
+ return false;
+ }
+
+ ATBTimer* m_timer;
+};
+
ATBTimer::ATBTimer(ATBArena* arena, ActionMap& actions) :
QThread(arena),
m_arena(arena),
@@ -55,46 +88,7 @@ void ATBTimer::run()
void ATBTimer::timerEvent(QTimerEvent* event)
{
- // TODO: Rewrite this
Q_UNUSED(event)
const QList<TeamMember*> active = m_arena->active(Arena::Fighters);
- QList<TeamMember::RequestedAction> actions;
-// QtConcurrent::blockingMap(active, increaseMeter);
-// QList<TeamMember*> overflow = QtConcurrent::blockingFiltered(active, isOverflowed);
-// qSort(overflow.begin(), overflow.end(), compareTimers);
-// foreach (TeamMember* teamMember, overflow)
-// {
-// TeamMember::RequestedAction action = requestDecision(teamMember);
-// m_actions.enqueue(action);
-// if (m_arena->sigmod()->rules()->pausedATB())
-// actions.append(action);
-// }
-// if (m_arena->sigmod()->rules()->pausedATB())
-// {
-// killTimer(event->timerId());
-// for (QMutableListIterator<TeamMember::RequestedAction> i(actions); i.hasNext(); i.next())
-// i.value().second.waitForFinished();
-// startTimer(50);
-// }
-}
-
-void ATBTimer::increaseMeter(TeamMember* teamMember)
-{
- double factor = .1;
- m_arena->valueOfType("meter-factor", &factor);
- if (!m_actions.contains(teamMember))
- {
- m_timers[teamMember] += teamMember->statValue(Sigmod::ST_Speed) * factor;
- int threshold = 1000;
- m_arena->valueOfType("meter-threshold", &threshold);
- if (threshold <= m_timers[teamMember])
- {
- QFutureWatcher<TeamMember::Action>* watcher = new QFutureWatcher<TeamMember::Action>(this);
- TeamMember::RequestedAction action = requestDecision(teamMember);
- watcher->setFuture(action.second);
- connect(watcher, SIGNAL(finished()), m_signalMapper, SLOT(map()));
- m_signalMapper->setMapping(watcher, teamMember);
- m_actions.set(teamMember, action);
- }
- }
+ QtConcurrent::blockingFiltered(active, TimerIncrementFunctor(this));
}
diff --git a/sigencore/plugins/arenas/atb/ATBTimer.h b/sigencore/plugins/arenas/atb/ATBTimer.h
index bad0b8f8..61cbe5a1 100644
--- a/sigencore/plugins/arenas/atb/ATBTimer.h
+++ b/sigencore/plugins/arenas/atb/ATBTimer.h
@@ -38,17 +38,19 @@ class ATBTimer : public QThread
public:
ATBTimer(ATBArena* arena, ActionMap& actions);
~ATBTimer();
+ signals:
+ void actionReady(Sigencore::TeamMember* teamMember);
protected:
void run();
void timerEvent(QTimerEvent* event);
protected slots:
- void increaseMeter(Sigencore::TeamMember* teamMember);
private:
+ struct TimerIncrementFunctor;
+
ATBArena* m_arena;
- QSignalMapper* m_signalMapper;
+ QSignalMapper* m_actionMapper;
QMap<Sigencore::TeamMember*, int> m_timers;
- QList<QFutureWatcher<Sigencore::TeamMember::Action> > m_watchers;
ActionMap& m_actions;
};