summaryrefslogtreecommitdiffstats
path: root/sigencore/Arena.cpp
diff options
context:
space:
mode:
authorBen Boeckel <MathStuf@gmail.com>2009-02-12 00:32:19 -0500
committerBen Boeckel <MathStuf@gmail.com>2009-02-12 00:32:19 -0500
commite1fa409b0f878486faf1c0a1389f3864e2576db1 (patch)
treebfb5054de4a540048bce1e60c752059d11788d1b /sigencore/Arena.cpp
parentb6bfa18b230b8c5f35a79ff3a711c4d54662b42a (diff)
downloadsigen-e1fa409b0f878486faf1c0a1389f3864e2576db1.tar.gz
sigen-e1fa409b0f878486faf1c0a1389f3864e2576db1.tar.xz
sigen-e1fa409b0f878486faf1c0a1389f3864e2576db1.zip
Reorganized query methods for team structure
Diffstat (limited to 'sigencore/Arena.cpp')
-rw-r--r--sigencore/Arena.cpp62
1 files changed, 51 insertions, 11 deletions
diff --git a/sigencore/Arena.cpp b/sigencore/Arena.cpp
index 7556d1d7..c7de5f7c 100644
--- a/sigencore/Arena.cpp
+++ b/sigencore/Arena.cpp
@@ -46,6 +46,7 @@
const int Sigencore::Arena::Spectator = -1;
const int Sigencore::Arena::Fighters = -2;
const int Sigencore::Arena::AllTeams = -3;
+const int Sigencore::Arena::NoTeam = -4;
Sigencore::TeamMember::RequestedAction Sigencore::requestDecision(TeamMember* teamMember)
{
@@ -90,7 +91,16 @@ QList<Sigencore::TeamMember*> Sigencore::Arena::active(const int team) const
return active;
}
-QList<Sigencore::Client*> Sigencore::Arena::teamMembers(const int team) const
+QList<Sigencore::TeamMember*> Sigencore::Arena::active(Client* client) const
+{
+ QList<Sigencore::TeamMember*> active;
+ Player* player = qobject_cast<Player*>(client);
+ if (player)
+ active += player->active();
+ return active;
+}
+
+QList<Sigencore::Client*> Sigencore::Arena::teamPlayers(const int team) const
{
switch (team)
{
@@ -111,6 +121,23 @@ QList<Sigencore::Client*> Sigencore::Arena::teamMembers(const int team) const
}
}
+Sigencore::Player* Sigencore::Arena::player(TeamMember* teamMember) const
+{
+ return qobject_cast<Player*>(teamMember->client());
+}
+
+int Sigencore::Arena::team(TeamMember* teamMember) const
+{
+ return team(teamMember->client());
+}
+
+int Sigencore::Arena::team(Client* client) const
+{
+ if (m_teams.contains(client))
+ return m_teams[client];
+ return NoTeam;
+}
+
int Sigencore::Arena::numTeams() const
{
QSet<int> teams = m_teams.values().toSet();
@@ -118,13 +145,26 @@ int Sigencore::Arena::numTeams() const
return teams.size();
}
-int Sigencore::Arena::numActiveTeams() const
+int Sigencore::Arena::numPlayers() const
{
- int activeTeams = 0;
- QSet<int> teams = m_teams.values().toSet();
- foreach (int team, teams)
- activeTeams += !active(team).isEmpty();
- return activeTeams;
+ QList<Client*> clients = m_teams.keys();
+ int players = 0;
+ foreach (Client* client, clients)
+ players += !!qobject_cast<Player*>(client);
+ return players;
+}
+
+int Sigencore::Arena::numTeamMembers() const
+{
+ QList<Client*> clients = m_teams.keys();
+ int teamMembers = 0;
+ foreach (Client* client, clients)
+ {
+ Player* player = qobject_cast<Player*>(client);
+ if (player)
+ teamMembers += !!player->active().size();
+ }
+ return teamMembers;
}
Sigencore::Arena::State Sigencore::Arena::state() const
@@ -168,7 +208,7 @@ Sigscript::SigmodWrapper* Sigencore::Arena::sigmod() const
bool Sigencore::Arena::addClient(Client* client, const int team)
{
- if (((team < 0) || ((m_state == Setup) && qobject_cast<Player*>(client) && (teamMembers(Fighters).size() < m_sigmod->rules()->maxPlayers()))) && client->enterArena(this))
+ if (((team < 0) || ((m_state == Setup) && qobject_cast<Player*>(client) && (active(Fighters).size() < m_sigmod->rules()->maxPlayers()))) && client->enterArena(this))
{
m_teams[client] = team;
emit(clientAdded(client, team));
@@ -286,7 +326,7 @@ void Sigencore::Arena::handleAction(TeamMember* teamMember, TeamMember::Action a
self->valueOfType("runchance", &selfRunChance);
bool canRun = true;
self->valueOfType("canflee", &canRun);
- QList<Client*> clients = teamMembers(Fighters);
+ QList<Client*> clients = teamPlayers(Fighters);
foreach (Client* client, clients)
{
if (!canRun)
@@ -386,7 +426,7 @@ void Sigencore::Arena::checkForLosers()
{
if (team == teamPot)
continue;
- QList<Client*> members = teamMembers(team);
+ QList<Client*> members = teamPlayers(team);
QList<Player*> survivors;
foreach (Client* member, members)
{
@@ -400,7 +440,7 @@ void Sigencore::Arena::checkForLosers()
}
}
m_losers += roundLosers;
- if (numActiveTeams() == 1)
+ if (numTeams() == 1)
cleanUp();
}