diff options
| author | Ben Boeckel <MathStuf@gmail.com> | 2009-02-12 00:32:19 -0500 |
|---|---|---|
| committer | Ben Boeckel <MathStuf@gmail.com> | 2009-02-12 00:32:19 -0500 |
| commit | e1fa409b0f878486faf1c0a1389f3864e2576db1 (patch) | |
| tree | bfb5054de4a540048bce1e60c752059d11788d1b /sigencore/Arena.cpp | |
| parent | b6bfa18b230b8c5f35a79ff3a711c4d54662b42a (diff) | |
| download | sigen-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.cpp | 62 |
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(); } |
