1
// Copyright (C) 2000, 2001, 2002, 2003 Michael Bartl
2
// Copyright (C) 2001, 2002, 2003, 2004, 2005 Ulf Lorenz
3
// Copyright (C) 2004 John Farrell
4
// Copyright (C) 2005 Andrea Paternesi
5
// Copyright (C) 2006, 2007, 2008 Ben Asselstine
6
// Copyright (C) 2007 Ole Laursen
1
8
// This program is free software; you can redistribute it and/or modify
2
9
// it under the terms of the GNU General Public License as published by
3
10
// the Free Software Foundation; either version 2 of the License, or
11
18
// You should have received a copy of the GNU General Public License
12
19
// along with this program; if not, write to the Free Software
13
// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
20
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
15
23
#include <sigc++/functors/mem_fun.h>
96
104
// add the gold in the first run, because then the player may come above 0
97
105
// gold, which means some cities produce units, others not.
98
106
for (const_iterator it = begin(); it != end(); it++)
99
if ((*it).getPlayer() == p)
107
if ((*it).getOwner() == p)
100
108
p->addGold((*it).getGold());
110
static bool isFogged(void *object)
112
return ((City*)object)->isFogged();
115
static bool isBurnt(void *object)
117
return ((City*)object)->isBurnt();
120
static bool isNotOwnedByNeutral(void *object)
122
return ((City*)object)->getOwner() != Playerlist::getInstance()->getNeutral();
125
static bool isNotOwnedByActivePlayer(void *object)
127
return ((City*)object)->getOwner() != Playerlist::getActiveplayer();
130
static bool isOwnedByActivePlayer(void *object)
132
return ((City*)object)->getOwner() == Playerlist::getActiveplayer();
135
static bool isNotOwnedByEnemy(void *object)
137
Player *p = Playerlist::getActiveplayer();
140
City *city = ((City*)object);
141
if (city->getOwner() != p &&
142
p->getDiplomaticState(city->getOwner()) == Player::AT_WAR)
103
147
City* Citylist::getNearestEnemyCity(const Vector<int>& pos)
107
Player* p = Playerlist::getInstance()->getActiveplayer();
109
for (iterator it = begin(); it != end(); ++it)
114
if ((*it).getPlayer() != p &&
115
p->getDiplomaticState((*it).getPlayer()) == Player::AT_WAR)
117
Vector<int> p = (*it).getPos();
118
int delta = abs(p.x - pos.x);
119
if (delta < abs(p.y - pos.y))
120
delta = abs(p.y - pos.y);
121
if ((diff > delta) || (diff == -1))
129
if (diff == -1) return 0;
149
std::list<bool (*)(void *)> filters;
150
filters.push_back(isBurnt);
151
filters.push_back(isNotOwnedByEnemy);
152
return getNearestObject(pos, &filters);
133
156
City* Citylist::getNearestForeignCity(const Vector<int>& pos)
137
Player* p = Playerlist::getInstance()->getActiveplayer();
139
for (iterator it = begin(); it != end(); ++it)
144
if ((*it).getPlayer() != p)
146
Vector<int> p = (*it).getPos();
147
int delta = abs(p.x - pos.x);
148
if (delta < abs(p.y - pos.y))
149
delta = abs(p.y - pos.y);
150
if ((diff > delta) || (diff == -1))
158
if (diff == -1) return 0;
158
std::list<bool (*)(void *)> filters;
159
filters.push_back(isBurnt);
160
filters.push_back(isOwnedByActivePlayer);
161
return getNearestObject(pos, &filters);
162
164
City* Citylist::getNearestCity(const Vector<int>& pos, int dist)
219
221
City* Citylist::getNearestCity(const Vector<int>& pos)
224
for (iterator it = begin(); it != end(); ++it)
229
Vector<int> p = (*it).getPos();
230
int delta = abs(p.x - pos.x);
231
if (delta < abs(p.y - pos.y))
232
delta = abs(p.y - pos.y);
234
if ((diff > delta) || (diff == -1))
241
if (diff == -1) return 0;
223
std::list<bool (*)(void *)> filters;
224
filters.push_back(isBurnt);
225
return getNearestObject(pos, &filters);
245
228
City* Citylist::getNearestVisibleCity(const Vector<int>& pos)
250
for (iterator it = begin(); it != end(); ++it)
255
if ((*it).isFogged() == true)
258
Vector<int> p = (*it).getPos();
259
int delta = abs(p.x - pos.x);
260
if (delta < abs(p.y - pos.y))
261
delta = abs(p.y - pos.y);
263
if ((diff > delta) || (diff == -1))
270
if (diff == -1) return 0;
230
std::list<bool (*)(void *)> filters;
231
filters.push_back(isBurnt);
232
filters.push_back(isFogged);
233
return getNearestObject(pos, &filters);
274
236
City* Citylist::getNearestVisibleCity(const Vector<int>& pos, int dist)
296
259
City* Citylist::getNearestVisibleFriendlyCity(const Vector<int>& pos)
300
Player* p = Playerlist::getInstance()->getActiveplayer();
302
for (iterator it = begin(); it != end(); ++it)
307
if ((*it).isFogged())
310
if ((*it).getPlayer() == p)
312
Vector<int> p = (*it).getPos();
313
int delta = abs(p.x - pos.x);
314
if (delta < abs(p.y - pos.y))
315
delta = abs(p.y - pos.y);
317
if ((diff > delta) || (diff == -1))
325
if (diff == -1) return 0;
261
std::list<bool (*)(void *)> filters;
262
filters.push_back(isBurnt);
263
filters.push_back(isFogged);
264
filters.push_back(isNotOwnedByActivePlayer);
265
return getNearestObject(pos, &filters);
329
268
City* Citylist::getNearestNeutralCity(const Vector<int>& pos)
334
for (iterator it = begin(); it != end(); ++it)
339
if ((*it).getPlayer() == Playerlist::getInstance()->getNeutral())
341
Vector<int> p = (*it).getPos();
342
int delta = abs(p.x - pos.x);
343
if (delta < abs(p.y - pos.y))
344
delta = abs(p.y - pos.y);
346
if ((diff > delta) || (diff == -1))
354
if (diff == -1) return 0;
270
std::list<bool (*)(void *)> filters;
271
filters.push_back(isBurnt);
272
filters.push_back(isNotOwnedByNeutral);
273
return getNearestObject(pos, &filters);
359
277
City* Citylist::getFirstCity(Player* p)
361
279
for (iterator it = begin(); it != end(); it++)
362
if ((*it).getPlayer() == p)
280
if ((*it).getOwner() == p)
403
321
void Citylist::changeOwnership(Player *old_owner, Player *new_owner)
405
323
for (iterator it = begin(); it != end(); it++)
406
if ((*it).getPlayer() == old_owner)
324
if ((*it).getOwner() == old_owner)
408
(*it).setPlayer(new_owner);
326
(*it).setOwner(new_owner);
409
327
if ((*it).isCapital())
410
328
if ((*it).getCapitalOwner() == old_owner)
411
329
(*it).setCapitalOwner(new_owner);
474
392
std::list<City*> cities;
475
393
for (iterator it = begin(); it != end(); it++)
477
if ((*it).getPlayer() != target->getPlayer())
395
if ((*it).getOwner() != target->getOwner())
479
397
if (target->contains((*it).getVectoring()))
480
398
cities.push_back(&(*it));
484
City* Citylist::getNearestCity(City *city)
489
for (iterator it = begin(); it != end(); ++it)
494
Vector<int> pos = city->getPos();
495
Vector<int> p = (*it).getPos();
496
int delta = abs(p.x - pos.x);
497
if (delta < abs(p.y - pos.y))
498
delta = abs(p.y - pos.y);
500
if ((diff > delta && delta != 0) || (diff == -1))
507
if (diff == -1) return 0;
511
403
City* Citylist::getNearestCityPast(const Vector<int>& pos, int dist)
516
for (iterator it = begin(); it != end(); ++it)
521
Vector<int> p = (*it).getPos();
522
int delta = abs(p.x - pos.x);
523
if (delta < abs(p.y - pos.y))
524
delta = abs(p.y - pos.y);
526
if ((diff > delta && delta >= dist) || (diff == -1))
533
if (diff == -1) return 0;
405
std::list<bool (*)(void *)> filters;
406
filters.push_back(isBurnt);
407
return getNearestObjectAfter(pos, dist, &filters);