57
void AI_Allocation::deleteStack(guint32 id)
67
StackReflist::iterator AI_Allocation::eraseStack(StackReflist::iterator it)
59
// we need to remove collaterally eradicated stacks before they make
62
s_instance->d_stacks->flRemove(id);
70
return d_stacks->eraseStack(it);
64
72
void AI_Allocation::deleteStack(Stack* s)
74
//this method deletes it from our list of stacks to consider.
75
//it doesn't really delete the stack from the game.
66
76
// we need to remove collaterally eradicated stacks before they make
69
s_instance->d_stacks->flRemove(s->getId());
72
int AI_Allocation::move()
74
Citylist *allCities = Citylist::getInstance();
77
d_stacks = new Stacklist(d_owner->getStacklist());
79
debug(d_owner->getName() << " starts with " << d_stacks->size() << " stacks to do something with")
81
int count = allocateDefensiveStacks(allCities);
82
debug(d_owner->getName() << " has " << d_stacks->size() << " stacks after assigning defenders")
84
//do we have any left for offense?
87
// stacks which are assigned to defence are no longer in 'stacks',
88
// so we can tell the rest to do something
89
count += allocateStacksToThreats();
90
debug(d_owner->getName() << " still has " << d_stacks->size() << " stacks after allocating stacks to threats")
93
count += defaultStackMovements();
80
s_instance->setParked(s, true);
81
s_instance->d_stacks->removeStack(s->getId());
85
int AI_Allocation::allocateStackToCapacityBuilding(Threat *threat, City *first_city, bool take_neutrals)
90
pos = threat->getClosestPoint(first_city->getPos());
91
else if (d_owner->getStacklist()->size() > 0)
92
pos = threat->getClosestPoint(d_owner->getStacklist()->front()->getPos());
95
City *c =GameMap::getEnemyCity(pos);
98
if (c->isBurnt() == true)
100
if (c->getOwner() == Playerlist::getInstance()->getNeutral() && take_neutrals == false)
102
Stack *attacker = findClosestStackToEnemyCity(c, take_neutrals);
105
Vector<int> dest = threat->getClosestPoint(attacker->getPos());
107
//only take what we need.
108
std::list<guint32> armies = attacker->determineStrongArmies(3.0);
109
if (armies.size() > 0 && armies.size() != attacker->size())
111
Stack *stack = d_owner->stackSplitArmies(attacker, armies);
112
moved = moveStack(stack, dest, killed);
115
if (stack->hasPath() == false)
116
d_stacks->addStack(stack);
121
moved = moveStack(attacker, dest, killed);
124
if (attacker->hasPath() == true)
125
deleteStack(attacker);
131
int AI_Allocation::allocateStacksToCapacityBuilding(City *first_city,
136
for (Threatlist::const_iterator it = d_threats->begin();
137
it != d_threats->end(); it++)
140
if (d_stacks->size() == 0)
142
if (t->isCity() && t->getStrength() <= 0.5003)
144
if (allocateStackToCapacityBuilding(*it, first_city, take_neutrals))
153
bool AI_Allocation::continueQuest(Quest *quest, Stack *stack)
155
Vector<int> dest = d_owner->AI_getQuestDestination(quest, stack);
156
if (dest == Vector<int>(-1,-1))
159
bool moved = moveStack(stack, dest, killed);
168
int AI_Allocation::continueQuests()
171
if (GameScenarioOptions::s_play_with_quests == GameParameters::NO_QUESTING)
174
std::vector<Quest*> quest =
175
QuestsManager::getInstance()->getPlayerQuests(d_owner);
176
for (std::vector<Quest*>::iterator i = quest.begin(); i != quest.end(); i++)
179
if (quest->isPendingDeletion())
181
Stack *s = d_owner->getStacklist()->getArmyStackById(quest->getHeroId());
182
bool moved = continueQuest(quest, s);
189
int AI_Allocation::continueAttacks()
192
for (StackReflist::iterator i = d_stacks->begin(); i != d_stacks->end(); i++)
195
if (s->getParked() == false && s->isOnCity() == false &&
196
s->hasPath() == true &&
197
GameMap::getEnemyCity(s->getLastPointInPath()) != NULL)
200
bool moved = moveStack(s, killed);
205
if (s->hasPath() == true)
211
if (s->isOnCity() == true)
212
shuffleStacksWithinCity(GameMap::getCity(s), s,
222
int AI_Allocation::attackNearbyEnemies()
225
Citylist *cl = Citylist::getInstance();
226
for (Citylist::iterator i = cl->begin(); i != cl->end(); i++)
229
if (d_owner->abortRequested())
231
if (d_stacks->size() == 0)
234
if (city->getOwner() == d_owner || city->isBurnt() == true)
236
std::list<Vector<int> > p = GameMap::getNearbyPoints(city->getPos(), 2);
237
for (std::list<Vector<int> >::iterator j = p.begin(); j != p.end(); j++)
239
Stack *s = GameMap::getFriendlyStack(*j);
242
if (s->getParked() == false && s->getMoves() >= 4)
246
moved = moveStack(s, city->getNearestPos(s->getPos()), killed);
249
if (s->hasPath() == true)
251
else if (s->isOnCity() == true)
254
shuffleStacksWithinCity(GameMap::getCity(s), s,
267
Stacklist *sl = d_owner->getStacklist();
268
std::list<Vector<int> > pos = sl->getPositions();
269
for (std::list<Vector<int> >::iterator i = pos.begin(); i != pos.end(); i++)
272
if (d_owner->abortRequested())
274
Stack *s = GameMap::getFriendlyStack(*i);
277
if (d_stacks->size() == 0)
279
if (s->isOnCity() == true)
281
if (s->getParked() == true)
283
std::list<Vector<int> > p = GameMap::getNearbyPoints(*i, 2);
284
for (std::list<Vector<int> >::iterator j = p.begin(); j != p.end(); j++)
286
Stack *enemy = GameMap::getEnemyStack(*j);
291
if (enemy->isOnCity() == true)
293
if (s->size() < enemy->size())
295
if (s->hasShip() != enemy->hasShip())
297
moved = moveStack(s, enemy->getPos(), killed);
302
if (s->hasPath() == true)
312
bool AI_Allocation::emptyOutCities()
314
//everybody out on the dancefloor.
315
Citylist *cl = Citylist::getInstance();
316
for (Citylist::iterator it = cl->begin(); it != cl->end(); it++)
320
if (d_owner->abortRequested())
323
if (c->getOwner() != d_owner || c->isBurnt() == true)
326
guint32 num_defenders = c->countDefenders();
327
for (guint i = 0; i < c->getSize(); i++)
329
for (guint j = 0; j < c->getSize(); j++)
331
Stack *s = GameMap::getStack(c->getPos() + Vector<int>(i,j));
334
if ((s->getMoves() > 3 && s->size() >= 4 &&
335
(num_defenders - s->size()) >= 3) || (rand() % 10) == 0)
337
City *target = cl->getNearestEnemyCity(s->getPos());
341
if (d_stacks->contains(s->getId()) == false)
342
d_stacks->addStack(s);
343
moveStack(s, target->getNearestPos(s->getPos()), killed);
351
if (d_owner->getGold() < 20)
360
int AI_Allocation::visitTemples(bool get_quests)
363
Stacklist *sl = d_owner->getStacklist();
364
std::list<Vector<int> > pos = sl->getPositions();
365
for (std::list<Vector<int> >::iterator i = pos.begin(); i != pos.end(); i++)
367
Stack *s = GameMap::getFriendlyStack(*i);
370
if (s->isOnCity() == true)
372
if (s->hasHero() && get_quests)
374
//debug("Player " << d_owner->getName() << " moving hero-laden stack " << s->getId() << " towards a temple");
377
moved = d_owner->AI_maybeVisitTempleForQuest(s, s->getMoves(),
389
bool blessed = false;
390
//debug("Player " << d_owner->getName() << " moving stack " << s->getId() << " towards a temple");
391
moved = d_owner->AI_maybeVisitTempleForBlessing(s, s->getMoves(),
393
50.0, blessed, killed);
403
int AI_Allocation::visitRuins()
406
Stacklist *sl = d_owner->getStacklist();
407
std::list<Vector<int> > pos = sl->getPositions();
408
for (std::list<Vector<int> >::iterator i = pos.begin(); i != pos.end(); i++)
410
Stack *s = GameMap::getFriendlyStack(*i);
413
if (s->isOnCity() == true)
419
moved = d_owner->AI_maybeVisitRuin(s, s->getMoves(),
420
s->getMoves() + 17, killed);
430
int AI_Allocation::pickupItems()
433
if (d_owner->getHeroes().size() == 0)
435
std::vector<Vector<int> > items = GameMap::getInstance()->getItems();
436
for (std::vector<Vector<int> >::iterator i = items.begin(); i != items.end();
439
std::list<Stack*> s = GameMap::getNearbyFriendlyStacks(*i, 8);
440
for (std::list<Stack*>::iterator j = s.begin(); j != s.end(); j++)
443
if (s->hasHero() == false)
445
if (GameMap::getEnemyCity(*i) != NULL)
447
if (s->isOnCity() == false)
450
if (moveStack(s, *i, killed))
455
if (s->getPos() == *i)
457
Hero *hero = dynamic_cast<Hero*>(s->getFirstHero());
458
d_owner->heroPickupAllItems (hero, *i);
466
City *c = GameMap::getCity(s->getPos());
467
if (c->contains(*i) == true)
470
if (moveStack(s, *i, killed))
475
if (s->getPos() == *i)
477
Hero *hero = dynamic_cast<Hero*>(s->getFirstHero());
478
d_owner->heroPickupAllItems (hero, *i);
491
int AI_Allocation::move(City *first_city, bool take_neutrals)
493
int temple_moved = 0, ruin_moved = 0, pickup_moved = 0, attack_moved = 0, quest_moved = 0, immediate_moved = 0, defensive_moved = 0, capacity_moved = 0, offensive_moved = 0, default_moved= 0;
494
int temple_alloc = 0, ruin_alloc = 0, pickup_alloc = 0, attack_alloc = 0, quest_alloc = 0, immediate_alloc = 0, defensive_alloc = 0, capacity_alloc = 0, offensive_alloc = 0, default_alloc= 0;
497
d_stacks = new StackReflist(d_owner->getStacklist(), true);
499
int total = d_stacks->size();
500
debug("Player " << d_owner->getName() << " starts with " << d_stacks->size() << " stacks to do something with");
505
if (d_owner->abortRequested())
509
quest_alloc = d_stacks->size();
510
moved = continueQuests();
512
quest_alloc -= d_stacks->size();
513
debug("Player " << d_owner->getName() << " still has " << d_stacks->size() << " stacks after allocating stacks to fulfilling quests");
514
debug("Player " << d_owner->getName() << " moved " << moved << " stacks in quest mode.");
517
if (d_owner->abortRequested())
519
//move stacks to temples for blessing, or ones with heroes for a quest.
520
temple_alloc = d_stacks->size();
521
moved = visitTemples(GameScenarioOptions::s_play_with_quests != GameParameters::NO_QUESTING);
522
temple_moved = moved;
523
temple_alloc -= d_stacks->size();
524
debug("Player " << d_owner->getName() << " still has " << d_stacks->size() << " stacks after allocating stacks to visiting temples");
525
debug("Player " << d_owner->getName() << " moved " << moved << " stacks in temple-visiting mode.");
528
if (d_owner->abortRequested())
530
//move hero stacks to ruins for searching.
531
ruin_alloc = d_stacks->size();
532
moved = visitRuins();
534
ruin_alloc -= d_stacks->size();
535
debug("Player " << d_owner->getName() << " still has " << d_stacks->size() << " stacks after allocating stacks to visiting ruins");
536
debug("Player " << d_owner->getName() << " moved " << moved << " stacks in ruin-visiting mode.");
539
if (d_owner->abortRequested())
541
//if we're near a bag of stuff, go pick it up.
542
pickup_alloc = d_stacks->size();
543
moved = pickupItems();
544
pickup_moved = moved;
545
pickup_alloc -= d_stacks->size();
546
debug("Player " << d_owner->getName() << " still has " << d_stacks->size() << " stacks after allocating stacks to picking up items");
547
debug("Player " << d_owner->getName() << " moved " << moved << " stacks in pickup-items mode.");
550
if (d_owner->abortRequested())
552
// if a stack has a path for an enemy city and is outside of a city, then keep going.
553
attack_alloc = d_stacks->size();
554
moved = continueAttacks();
555
attack_moved = moved;
556
attack_alloc -= d_stacks->size();
557
debug("Player " << d_owner->getName() << " still has " << d_stacks->size() << " stacks after allocating stacks to continuing attacks");
558
debug("Player " << d_owner->getName() << " moved " << moved << " stacks in continuing-attacks mode.");
561
if (d_owner->abortRequested())
563
// if a stack is 2 tiles away from another enemy city, then attack it.
564
immediate_alloc = d_stacks->size();
565
moved = attackNearbyEnemies();
566
immediate_moved = moved;
567
immediate_alloc -= d_stacks->size();
568
debug("Player " << d_owner->getName() << " still has " << d_stacks->size() << " stacks after allocating stacks to attacking nearby stacks");
569
debug("Player " << d_owner->getName() << " moved " << moved << " stacks in attack-nearby-stacks mode.");
572
if (d_owner->abortRequested())
576
capacity_alloc = d_stacks->size();
577
moved = allocateStacksToCapacityBuilding(first_city, take_neutrals);
578
capacity_moved = moved;
579
capacity_alloc -= d_stacks->size();
580
debug("Player " << d_owner->getName() << " still has " << d_stacks->size() << " stacks after allocating stacks to capacity building");
581
debug("Player " << d_owner->getName() << " moved " << moved << " stacks in capacity building mode.");
588
if (d_owner->abortRequested())
590
defensive_alloc = d_stacks->size();
591
moved = allocateDefensiveStacks(Citylist::getInstance());
592
defensive_moved = moved;
593
defensive_alloc -= d_stacks->size();
595
debug("Player " << d_owner->getName() << " has " << d_stacks->size() << " stacks after assigning defenders");
596
debug("Player " << d_owner->getName() << " moved " << count << " stacks in defensive mode.");
600
if (d_stacks->size() == 0)
607
if (d_owner->abortRequested())
609
offensive_alloc = d_stacks->size();
610
moved = allocateStacksToThreats();
611
offensive_moved = moved;
612
offensive_alloc -= d_stacks->size();
614
debug("Player " << d_owner->getName() << " still has " << d_stacks->size() << " stacks after allocating stacks to threats")
615
debug("Player " << d_owner->getName() << " moved " << moved << " stacks in offensive mode.");
619
if (d_stacks->size() == 0)
626
if (d_owner->abortRequested())
628
default_alloc = d_stacks->size();
629
moved = defaultStackMovements();
630
default_moved = moved;
631
default_alloc -= d_stacks->size();
632
debug("Player " << d_owner->getName() << " moved " << moved << " stacks in Default stack movements.");
636
if (d_owner->abortRequested())
638
//empty out the cities damnit.
642
debug("Player " << d_owner->getName() << " moved totals: " << attack_moved << "," << capacity_moved <<"," <<defensive_moved<<"," << offensive_moved <<"," << default_moved <<".");
643
debug("Player " << d_owner->getName() << " alloc totals: " << attack_alloc << "," << capacity_alloc <<"," <<defensive_alloc<<"," << offensive_alloc <<"," << default_alloc <<" (" << total <<").");
646
//if (IIId_owner->getId() == 0)
651
int AI_Allocation::allocateDefensiveStacksToCity(City *city)
654
float cityDanger = d_analysis->getCityDanger(city);
655
//if city is not endangered, we keep a skeleton crew.
656
//if a city has 10 strength in it, it's probably pretty safe.
657
if (cityDanger < 3.0)
659
else if (cityDanger > 10.0)
662
// Look how many defenders the city already has
663
float totalDefenderStrength = 0.0;
664
for (guint32 i = 0; i < city->getSize(); i++)
665
for (guint32 j = 0; j < city->getSize(); j++)
667
Stack *d = GameMap::getFriendlyStack(city->getPos() + Vector<int>(i,j));
668
if (d && d->getParked() == false)
669
shuffleStacksWithinCity(city, d, Vector<int>(0,0));
671
std::vector<Stack*> defenders = city->getDefenders();
672
vector<Stack*>::iterator it;
673
for (it = defenders.begin(); it != defenders.end(); it++)
675
Stack *defender = *it;
676
if (defender->getParked() == true)
678
//shuffleStacksWithinCity(city, defender, Vector<int>(0,0));
679
float stackStrength = d_analysis->assessStackStrength(defender);
680
debug("Player " << d_owner->getName() << " assigns some or all of stack " << defender->getId() << " with strength " << stackStrength
681
<< " to " << city->getName() << " because its danger is " << cityDanger)
683
totalDefenderStrength += stackStrength;
684
if (totalDefenderStrength > cityDanger)
686
float diff = totalDefenderStrength - cityDanger;
687
//we need to excise DIFF points from this stack.
688
std::list<guint32> armies = (*it)->determineWeakArmies(diff);
689
//split off some armies in this stack.
690
if (armies.size() > 0 && armies.size() != defender->size())
692
Vector<int> dest = getFreeOtherSpotInCity(city, defender);
693
if (dest != Vector<int>(-1,-1))
695
Stack *stack = d_owner->stackSplitArmies(defender,
697
if (stack->getMoves() > 0)
699
if (shuffleStack(stack, dest, false))
702
if (stack->getParked() == false)
703
d_stacks->addStack(stack);
707
groupStacks(defender);
711
deleteStack(defender);
716
deleteStack(defender);
718
// if we get here, we have assigned defenders but not enough to
719
// counter the danger that the city is in
722
// allocate nearby stacks to come back to the city,
723
// because we don't have enough defence
724
// this is disabled for now.
725
while (totalDefenderStrength < cityDanger )
728
Stack *s = findClosestStackToCity(city);
731
debug("City " << city->getName() << " is endangered but no stacks are close enough to go defend it (or no more space available in city).")
734
debug("Stack " << s->getId() << " at " << s->getPos().x << "," << s->getPos().y << " should return to " << city->getName() << " to defend")
735
Vector<int> dest = getFreeSpotInCity(city, s->size());
736
if (dest == Vector<int>(-1,-1))
738
float stackStrength = d_analysis->assessStackStrength(s);
739
totalDefenderStrength += stackStrength;
741
if (totalDefenderStrength > cityDanger)
743
float diff = totalDefenderStrength - cityDanger;
744
//we need to excise DIFF points from this stack.
745
std::list<guint32> armies = s->determineWeakArmies(diff);
746
//split off some armies in this stack.
747
if (armies.size() > 0 && armies.size() != s->size())
749
Stack *stack = d_owner->stackSplitArmies(s, armies);
750
d_stacks->addStack(stack);
757
if (moveStack(s, dest, killed))
763
if (totalDefenderStrength < cityDanger)
765
debug(city->getName() << " cannot be adequately defended")
103
770
// for each city, if it is in danger at all, allocate a stack to be its
104
771
// defender. These stacks sit in the NW corner and don't move out of the city.
105
int AI_Allocation::allocateDefensiveStacks(Citylist *allCities)
772
int AI_Allocation::allocateDefensiveStacks(Citylist *cities)
774
//we need to split the stacks and add the newly split ones to d_stacks.
108
for (Citylist::iterator cit = allCities->begin(); cit != allCities->end(); ++cit)
776
for (Citylist::iterator it = cities->begin(); it != cities->end(); ++it)
111
779
if (!city->isFriend(d_owner) || city->isBurnt())
114
float cityDanger = d_analysis->getCityDanger(city);
115
//if city is not endangered, don't move any existing stacks into it
116
if (cityDanger <= 0.0) continue;
118
// Look how many defenders the city already has
119
std::vector<Stack*> defenders = Stacklist::defendersInCity(city);
120
vector<Stack*>::iterator it;
121
float totalDefenderStrength = 0.0;
122
for (it = defenders.begin(); it != defenders.end(); it++)
124
Stack *defender = *it;
125
float stackStrength = d_analysis->assessStackStrength(defender);
126
debug("assign stack " << defender->getId() << " with strength " << stackStrength
127
<< " to " << city->getName() << " because its danger is " << cityDanger)
129
d_stacks->flRemove(defender->getId());
130
totalDefenderStrength += stackStrength;
131
if (totalDefenderStrength > cityDanger)
133
// if we get here, we have assigned defenders but not enough to
134
// counter the danger that the city is in
137
// allocate nearby stacks to come back to the city,
138
// because we don't have enough defence
139
while (totalDefenderStrength < cityDanger)
141
Stack *s = findClosestStackToCity(city, 2);
144
debug("City " << city->getName() << " is endangered but no stacks are close enough to go defend it (or no more space available in city).")
147
debug("Stack " << s->getId() << " should return to " << city->getName() << " to defend")
148
Vector<int> dest = getFreeSpotInCity(city, s->size());
150
d_owner->getStacklist()->setActivestack(GameMap::getStack(s->getPos()));
151
d_stacks->flRemove(s->getId());
152
s = d_owner->getActivestack();
154
int mp = s->getPath()->calculate(s, dest);
155
if (mp >= 0 && d_owner->stackMove(s))
159
if (totalDefenderStrength < cityDanger)
161
debug(city->getName() << " cannot be adequately defended")
781
count += allocateDefensiveStacksToCity(city);
783
if (d_owner->abortRequested())
790
int AI_Allocation::allocateStacksToThreat(Threat *threat)
793
float threat_danger = threat->getDanger() * 1.000;
794
if (threat_danger > 32.0) //e.g. 32 light infantry in a city.
795
threat_danger = 32.0;
796
City *city = GameMap::getCity(threat->getClosestPoint(Vector<int>(0,0)));
799
if (city && city->getOwner() == d_owner)
801
guint32 num_city_defenders = 0;
802
Stack *attacker = findBestAttackerFor(threat, num_city_defenders);
803
//if (attacker && attacker->getId() == 4207)
805
//printf("4207 was chosen for threat: `%s'\n", threat->toString().c_str());
807
// if there is nobody to attack the threat, go onto the next one
810
float score = d_analysis->assessStackStrength(attacker);
812
Vector<int> dest = threat->getClosestPoint(attacker->getPos());
813
//if (attacker->getId() == 4207)
815
//printf("dest is %d,%d\n", dest.x, dest.y);
818
if (num_city_defenders == 0 || num_city_defenders - attacker->size() > 3)
821
debug("Player " << d_owner->getName() << " thinking about attacking threat at (" << dest.x <<"," << dest.y << ") with stack " << attacker->getId() <<" at ("<<attacker->getPos().x<<","<<attacker->getPos().y<<")");
822
deleteStack(attacker);
823
if (moveStack(attacker, dest, killed))
828
if (attacker->isOnCity())
830
shuffleStacksWithinCity (GameMap::getCity(attacker),
831
attacker, Vector<int>(0,0));
832
//setParked(attacker, true);
840
std::list<guint32> armies = attacker->determineStrongArmies(3.0);
841
if (armies.size() > 0 && armies.size() != attacker->size())
843
Stack *stack = d_owner->stackSplitArmies(attacker, armies);
844
score = d_analysis->assessStackStrength(stack);
845
debug("Player " << d_owner->getName() << " thinking about attacking threat at (" << dest.x <<"," << dest.y << ") with split stack " << stack->getId() <<" at ("<<stack->getPos().x<<","<<stack->getPos().y<<")");
846
bool moved = moveStack(stack, dest, killed);
849
if (stack->hasPath() == false)
850
d_stacks->addStack(stack);
857
threat_danger -= score;
858
// if the threat has been removed, go onto the next one
859
if (threat->getStrength() == 0.0)
861
if (threat_danger <= 0)
167
867
int AI_Allocation::allocateStacksToThreats()
169
const Threatlist *threats ;
171
City *city = Citylist::getInstance()->getFirstCity(d_owner);
173
threats = d_analysis->getThreatsInOrder();
175
threats = d_analysis->getThreatsInOrder(city->getPos());
177
//debug("Threats to " << d_owner->getName() << " are " << threats->toString())
178
debug("We start with " <<threats->size() <<" threats.")
180
for (Threatlist::const_iterator it = threats->begin(); it != threats->end(); ++it)
871
for (Threatlist::const_iterator it = d_threats->begin();
872
it != d_threats->end(); ++it)
875
count += allocateStacksToThreat(*it);
877
if (d_stacks->size() == 0)
880
if (d_owner->abortRequested())
887
Vector<int> AI_Allocation::getFreeOtherSpotInCity(City *city, Stack *stack)
890
Vector<int> best = Vector<int>(-1,-1);
891
assert (city->contains(stack->getPos()) == true);
892
for (unsigned int i = 0; i < city->getSize(); i++)
893
for (unsigned int j = 0; j < city->getSize(); j++)
182
if (d_stacks->size() == 0)
185
Threat *threat = (*it);
188
Stack *attacker = findBestAttackerFor(threat);
189
// if there is nobody to attack the threat, go onto the next one
190
if (!attacker) break;
193
d_owner->getStacklist()->setActivestack(GameMap::getStack(attacker->getPos()));
194
d_stacks->flRemove(attacker->getId());
195
attacker = d_owner->getActivestack();
196
Vector<int> dest = threat->getClosestPoint(attacker->getPos());
198
int mp = attacker->getPath()->calculate(attacker, dest);
199
if (mp >= 0 && d_owner->stackMove(attacker))
202
// if the threat has been removed, go onto the next one
203
if (threat->strength() == 0.0)
895
Vector<int> pos = city->getPos() + Vector<int>(i,j);
896
if (pos == stack->getPos())
898
if (GameMap::canAddArmies(pos, stack->size()) == false)
900
std::list<Stack*> f = GameMap::getFriendlyStacks(pos);
903
for (std::list<Stack*>::iterator i = f.begin(); i != f.end(); i++)
905
if ((*i)->size() > size)
210
920
Vector<int> AI_Allocation::getFreeSpotInCity(City *city, int stackSize)
212
922
for (unsigned int i = 0; i < city->getSize(); i++)
213
923
for (unsigned int j = 0; j < city->getSize(); j++)
215
925
Vector<int> pos = city->getPos() + Vector<int>(i,j);
216
Stack *s = Stacklist::getObjectAt(pos);
221
if (s->size() + stackSize < MAX_STACK_SIZE)
926
if (GameMap::canAddArmies(pos, stackSize) == false)
225
930
//there's no room in the inn.
226
931
return Vector<int>(-1,-1);
229
Stack *AI_Allocation::findClosestStackToCity(City *city, int limitInMoves)
231
Vector<int> pos = city->getPos();
234
for (Stacklist::iterator it = d_stacks->begin(); it != d_stacks->end(); ++it)
934
Stack *AI_Allocation::findClosestStackToEnemyCity(City *city, bool try_harder)
936
Vector<int> pos = city->getPos();
939
for (StackReflist::iterator it = d_stacks->begin(); it != d_stacks->end(); ++it)
942
if (s->getParked() == true)
945
int tiles = dist(city->getPos(), s->getPos());
948
int moves = (tiles + 6) / 7;
950
if (try_harder == false && s->isOnCity())
952
City *source_city = GameMap::getCity(s);
955
if (d_analysis->getNumberOfDefendersInCity(source_city) <=
961
if (moves < lowest_mp || lowest_mp == -1)
970
Stack *AI_Allocation::findClosestStackToCity(City *city)
972
Vector<int> pos = city->getPos();
975
for (StackReflist::iterator it = d_stacks->begin(); it != d_stacks->end(); ++it)
978
if (s->getParked() == true)
237
980
//don't consider the stack if it's already in the city
238
981
Vector<int> spos = s->getPos();
239
982
if (city->contains(spos))