playerslist.cpp
1 //------------------------------------------------------------------------------
2 // playerslist.cpp
3 //------------------------------------------------------------------------------
4 //
5 // This library is free software; you can redistribute it and/or
6 // modify it under the terms of the GNU Lesser General Public
7 // License as published by the Free Software Foundation; either
8 // version 2.1 of the License, or (at your option) any later version.
9 //
10 // This library is distributed in the hope that it will be useful,
11 // but WITHOUT ANY WARRANTY; without even the implied warranty of
12 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 // Lesser General Public License for more details.
14 //
15 // You should have received a copy of the GNU Lesser General Public
16 // License along with this library; if not, write to the Free Software
17 // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
18 // 02110-1301 USA
19 //
20 //------------------------------------------------------------------------------
21 // Copyright (C) 2010 "Zalewa" <zalewapl@gmail.com>
22 //------------------------------------------------------------------------------
23 #include "playerslist.h"
24 
25 DClass<PlayersList>
26 {
27 public:
28  QList<Player> players;
29 };
30 
31 DPointered(PlayersList)
32 
34 {
35  // Nothing to store yet. Future backward compatibility with plugins.
36 }
37 
38 PlayersList::PlayersList(const PlayersList &other)
39 {
40  d = other.d;
41 }
42 
43 PlayersList &PlayersList::operator=(const PlayersList &other)
44 {
45  d = other.d;
46  return *this;
47 }
48 
49 PlayersList::~PlayersList()
50 {
51 }
52 
53 void PlayersList::bots(PlayersList &botsList) const
54 {
55  botsList.clear();
56 
57  for (Player player : players())
58  {
59  if (player.isBot())
60  {
61  botsList << player;
62  }
63  }
64 }
65 
67 {
68  botsList.clear();
69 
70  for (Player player : players())
71  {
72  if (player.isBot() && player.teamNum() == Player::TEAM_NONE)
73  {
74  botsList << player;
75  }
76  }
77 }
78 
79 void PlayersList::clear()
80 {
81  d->players.clear();
82 }
83 
84 int PlayersList::numBots() const
85 {
86  int bots = 0;
87  for (Player player : players())
88  {
89  if (player.isBot())
90  {
91  ++bots;
92  }
93  }
94 
95  return bots;
96 }
97 
98 int PlayersList::numBotsOnTeam(int team) const
99 {
100  int bots = 0;
101  for (Player player : players())
102  {
103  if (player.isBot() && player.teamNum() == team)
104  {
105  ++bots;
106  }
107  }
108 
109  return bots;
110 }
111 
112 int PlayersList::numBotsWithoutTeam() const
113 {
114  int bots = 0;
115  for (Player player : players())
116  {
117  if (player.isBot() && player.teamNum() == Player::TEAM_NONE)
118  {
119  ++bots;
120  }
121  }
122 
123  return bots;
124 }
125 
127 {
128  return size();
129 }
130 
131 int PlayersList::numClientsWithoutBots() const
132 {
133  return size() - numBots();
134 }
135 
136 int PlayersList::numHumansInGame() const
137 {
138  int humansInGame = 0;
139 
140  for (Player player : players())
141  {
142  if (!player.isBot() && !player.isSpectating())
143  {
144  ++humansInGame;
145  }
146  }
147 
148  return humansInGame;
149 }
150 
151 int PlayersList::numHumansOnTeam(int team) const
152 {
153  int humans = 0;
154  for (Player player : players())
155  {
156  if (!player.isBot()
157  && !player.isSpectating()
158  && player.teamNum() == team)
159  {
160  ++humans;
161  }
162  }
163 
164  return humans;
165 }
166 
167 int PlayersList::numHumansWithoutTeam() const
168 {
169  int humans = 0;
170  for (Player player : players())
171  {
172  if (!player.isBot()
173  && !player.isSpectating()
174  && player.teamNum() == Player::TEAM_NONE)
175  {
176  ++humans;
177  }
178  }
179 
180  return humans;
181 }
182 
183 int PlayersList::numPlayersInGame() const
184 {
185  int playersInGame = 0;
186 
187  for (Player player : players())
188  {
189  if (!player.isSpectating())
190  {
191  ++playersInGame;
192  }
193  }
194 
195  return playersInGame;
196 }
197 
198 int PlayersList::numPlayersOnTeam(int team) const
199 {
200  int teamSize = 0;
201  for (Player player : players())
202  {
203  if (player.teamNum() == team)
204  {
205  ++teamSize;
206  }
207  }
208 
209  return teamSize;
210 }
211 
212 int PlayersList::numSpectators() const
213 {
214  int spectators = 0;
215 
216  for (Player player : players())
217  {
218  if (player.isSpectating())
219  {
220  ++spectators;
221  }
222  }
223 
224  return spectators;
225 }
226 
227 PlayersList &PlayersList::operator<<(const Player &player)
228 {
229  d->players << player;
230  return *this;
231 }
232 
233 Player &PlayersList::operator[](int index)
234 {
235  return d->players[index];
236 }
237 
238 const Player &PlayersList::operator[](int index) const
239 {
240  return d->players[index];
241 }
242 
243 const QList<Player> &PlayersList::players() const
244 {
245  return d->players;
246 }
247 
248 void PlayersList::inGamePlayersByTeams(PlayersByTeams &playersListMap) const
249 {
250  playersListMap.clear();
251 
252  for (const Player &player : players())
253  {
254  if (!player.isSpectating() && !player.isTeamlessBot())
255  {
256  int teamIndex = player.teamNum();
257  if (playersListMap.contains(teamIndex))
258  {
259  playersListMap[teamIndex] << player;
260  }
261  else
262  {
263  PlayersList newList;
264  newList << player;
265  playersListMap.insert(teamIndex, newList);
266  }
267  }
268  }
269 }
270 
271 int PlayersList::size() const
272 {
273  return d->players.size();
274 }
275 
276 void PlayersList::spectators(PlayersList &spectatorsList) const
277 {
278  spectatorsList.clear();
279 
280  for (Player player : players())
281  {
282  if (player.isSpectating())
283  {
284  spectatorsList << player;
285  }
286  }
287 }