forked from Error323/E323AI
-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathCWishList.cpp
More file actions
82 lines (72 loc) · 2.43 KB
/
CWishList.cpp
File metadata and controls
82 lines (72 loc) · 2.43 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
#include "CWishList.h"
#include "CAI.h"
#include "CUnitTable.h"
#include "CUnit.h"
#include "CConfigParser.h"
#include "CEconomy.h"
CWishList::CWishList(AIClasses *ai) {
this->ai = ai;
maxWishlistSize = 0;
}
CWishList::~CWishList() {
LOG_II("CWishList::Stats MaxWishListSize = " << maxWishlistSize)
}
void CWishList::push(unsigned categories, buildPriority p) {
std::map<int, CUnit*>::iterator itFac = ai->unittable->factories.begin();
UnitType *fac;
for (;itFac != ai->unittable->factories.end(); ++itFac) {
fac = itFac->second->type;
std::multimap<float, UnitType*> candidates;
ai->unittable->getBuildables(fac, categories, 0, candidates);
if (!candidates.empty()) {
/* Initialize new std::vector */
if (wishlist.find(fac->id) == wishlist.end()) {
std::vector<Wish> L;
wishlist[fac->id] = L;
}
/* Determine which buildables we can afford */
std::multimap<float, UnitType*>::iterator i;
bool affordable = false;
for(i = candidates.begin(); i!= candidates.end(); i++) {
UnitType* ut = i->second;
affordable=ai->economy->canAffordToBuild(fac, ut, 0);
if (affordable) break;
}
if (!affordable) i--;
// 'i' here is either most expensive, but affordable unit or just the cheapest
wishlist[fac->id].push_back(Wish(i->second, p, categories));
unique(wishlist[fac->id]);
std::stable_sort(wishlist[fac->id].begin(), wishlist[fac->id].end());
}
else {
CUnit *unit = ai->unittable->getUnit(itFac->first);
LOG_WW("CWishList::push failed for " << (*unit) << " categories: " << ai->unittable->debugCategories(categories))
}
}
maxWishlistSize = std::max<int>(maxWishlistSize, wishlist.size());
}
Wish CWishList::top(int factory) {
const UnitDef *udef = ai->cb->GetUnitDef(factory);
return wishlist[udef->id].front();
}
void CWishList::pop(int factory) {
const UnitDef *udef = ai->cb->GetUnitDef(factory);
wishlist[udef->id].erase(wishlist[udef->id].begin());
}
bool CWishList::empty(int factory) {
std::map<int, std::vector<Wish> >::iterator itList;
const UnitDef *udef = ai->cb->GetUnitDef(factory);
itList = wishlist.find(udef->id);
return itList == wishlist.end() || itList->second.empty();
}
void CWishList::unique(std::vector<Wish> &vector) {
std::vector<Wish>::iterator i;
Wish *w = &(vector.back());
for (i = vector.begin(); i != --vector.end(); i++) {
if (i->ut->id == w->ut->id) {
i->p = (i->p > w->p) ? i->p : w->p;
vector.pop_back();
return;
}
}
}