/* * Copyright 2008-2009 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) { } Sigbattle::ATBTimer::~ATBTimer() { } void Sigbattle::ATBTimer::run() { startTimer(50); exec(); } void Sigbattle::ATBTimer::timerEvent(QTimerEvent* event) { Q_UNUSED(event) 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()) // { // killTimer(event->timerId()); // for (QMutableListIterator i(actions); i.hasNext(); i.next()) // i.value().second.waitForFinished(); // startTimer(50); // } }