From e1fa409b0f878486faf1c0a1389f3864e2576db1 Mon Sep 17 00:00:00 2001 From: Ben Boeckel Date: Thu, 12 Feb 2009 00:32:19 -0500 Subject: Reorganized query methods for team structure --- sigencore/Arena.cpp | 62 +++++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 51 insertions(+), 11 deletions(-) (limited to 'sigencore/Arena.cpp') 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::Arena::active(const int team) const return active; } -QList Sigencore::Arena::teamMembers(const int team) const +QList Sigencore::Arena::active(Client* client) const +{ + QList active; + Player* player = qobject_cast(client); + if (player) + active += player->active(); + return active; +} + +QList Sigencore::Arena::teamPlayers(const int team) const { switch (team) { @@ -111,6 +121,23 @@ QList Sigencore::Arena::teamMembers(const int team) const } } +Sigencore::Player* Sigencore::Arena::player(TeamMember* teamMember) const +{ + return qobject_cast(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 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 teams = m_teams.values().toSet(); - foreach (int team, teams) - activeTeams += !active(team).isEmpty(); - return activeTeams; + QList clients = m_teams.keys(); + int players = 0; + foreach (Client* client, clients) + players += !!qobject_cast(client); + return players; +} + +int Sigencore::Arena::numTeamMembers() const +{ + QList clients = m_teams.keys(); + int teamMembers = 0; + foreach (Client* client, clients) + { + Player* player = qobject_cast(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(client) && (teamMembers(Fighters).size() < m_sigmod->rules()->maxPlayers()))) && client->enterArena(this)) + if (((team < 0) || ((m_state == Setup) && qobject_cast(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 clients = teamMembers(Fighters); + QList clients = teamPlayers(Fighters); foreach (Client* client, clients) { if (!canRun) @@ -386,7 +426,7 @@ void Sigencore::Arena::checkForLosers() { if (team == teamPot) continue; - QList members = teamMembers(team); + QList members = teamPlayers(team); QList survivors; foreach (Client* member, members) { @@ -400,7 +440,7 @@ void Sigencore::Arena::checkForLosers() } } m_losers += roundLosers; - if (numActiveTeams() == 1) + if (numTeams() == 1) cleanUp(); } -- cgit