File: CWishList.cpp

package info (click to toggle)
spring 0.81.2.1%2Bdfsg1-6
  • links: PTS, VCS
  • area: main
  • in suites: squeeze
  • size: 28,496 kB
  • ctags: 37,096
  • sloc: cpp: 238,659; ansic: 13,784; java: 12,175; awk: 3,428; python: 1,159; xml: 738; perl: 405; sh: 297; makefile: 267; pascal: 228; objc: 192
file content (84 lines) | stat: -rw-r--r-- 2,351 bytes parent folder | download
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
83
84
#include "CWishList.h"

#include "CAI.h"
#include "CUnitTable.h"
#include "CUnit.h"
#include "CRNG.h"
#include "CConfigParser.h"
#include "CEconomy.h"

CWishList::CWishList(AIClasses *ai) {
	this->ai = ai;
}

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 = UT(ai->cb->GetUnitDef(itFac->first)->id);
		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 = candidates.begin();
			int iterations = candidates.size();
			bool affordable = false;
			while(iterations >= 0) {
				if (ai->economy->canAffordToBuild(fac, i->second))
					affordable = true;
				else
					break;

				if (i == --candidates.end())
					break;
				iterations--;
				i++;
			}
			
			wishlist[fac->id].push_back(Wish(i->second, p));
			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))
		}
	}
}

UnitType* CWishList::top(int factory) {
	UnitType *fac = UT(ai->cb->GetUnitDef(factory)->id);
	Wish *w = &(wishlist[fac->id].front());
	return w->ut;
}

void CWishList::pop(int factory) {
	UnitType *fac = UT(ai->cb->GetUnitDef(factory)->id);
	wishlist[fac->id].erase(wishlist[fac->id].begin());
}

bool CWishList::empty(int factory) {
	std::map<int, std::vector<Wish> >::iterator itList;
	UnitType *fac = UT(ai->cb->GetUnitDef(factory)->id);
	itList = wishlist.find(fac->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;
		}
	}
}