/* * Copyright 2008 Ben Boeckel * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . */ // Header include #include "ATBTimer.h" // Sigbattle includes #include "ATBArena.h" // Sigscript includes #include "../sigscript/RulesWrapper.h" #include "../sigscript/SigmodWrapper.h" // Qt includes #include #include #include #include #include #include bool Sigbattle::compareTimers(TeamMember* const & member1, TeamMember* const & member2) { return member1->timer() < member2->timer(); } void Sigbattle::increaseMeter(TeamMember* teamMember) { // TODO: Tweak this? teamMember->advanceTimer(teamMember->statValue(Sigmod::ST_Speed) / 10); } bool Sigbattle::isOverflowed(const TeamMember* teamMember) { // TODO: Tweak threshold? return 1000. < teamMember->timer(); } Sigbattle::ATBTimer::ATBTimer(ATBArena* arena, ActionQueue& actions) : QThread(arena), m_arena(arena), m_actions(actions), m_timer(new QTimer(this)) { connect(m_timer, SIGNAL(timeout()), this, SLOT(update())); } void Sigbattle::ATBTimer::update() { const QList active = m_arena->active(); QList actions; QtConcurrent::blockingMap(active, increaseMeter); QList 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()) { m_timer->stop(); for (QMutableListIterator i(actions); i.hasNext(); i.next()) i.value().second.waitForFinished(); m_timer->start(50); } } void Sigbattle::ATBTimer::run() { m_timer->start(50); exec(); }