File: Assist.cpp

package info (click to toggle)
spring 88.0%2Bdfsg1-1.1
  • links: PTS, VCS
  • area: main
  • in suites: wheezy
  • size: 41,524 kB
  • sloc: cpp: 343,114; ansic: 38,414; python: 12,257; java: 12,203; awk: 5,748; sh: 1,204; xml: 997; perl: 405; objc: 192; makefile: 181; php: 134; sed: 2
file content (93 lines) | stat: -rwxr-xr-x 2,005 bytes parent folder | download | duplicates (4)
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
85
86
87
88
89
90
91
92
93
#include "Assist.h"

#include "../CGroup.h"
#include "../CPathfinder.h"

AssistTask::AssistTask(AIClasses *_ai, ATask& toAssist, CGroup& group): ATask(_ai) {
	t = TASK_ASSIST;
	assist = &toAssist;
	toAssist.assisters.push_back(this);
	assisting = false;
	pos = toAssist.pos;
	targetAlt = -1;

	addGroup(group);
}

void AssistTask::remove() {
	LOG_II("AssistTask::remove " << (*this))

	// NOTE: we have to remove manually because assisting tasks are not
	// completely built upon ARegistrar pattern
	assist->assisters.remove(this);

	ATask::remove();
}

bool AssistTask::onValidate() {
	if (targetAlt >= 0) {
		if (ai->cbc->IsUnitCloaked(targetAlt)) {
			firstGroup()->stop();
		}
	}

	return true;
}

void AssistTask::onUpdate() {
	CGroup *group = firstGroup();

	if (group->isMicroing() && group->isIdle()) {
		targetAlt = -1; // for sure
		group->micro(false);
	}

	if (!assisting) {
		if (isMoving) {
			/* Keep tracking the target */
			pos = assist->pos;

			float3 gpos = group->pos();
			float dist = gpos.distance2D(pos);
			float range = group->getRange();

			if (dist <= range) {
				bool canAssist = true;
				/*
				// for ground units prevent assisting across hill...
				if ((group->cats&AIR).none()) {
					dist = ai->pathfinder->getPathLength(*group, pos);
					canAssist = (dist <= range * 1.1f);
				}
				*/
				if (canAssist) {
					isMoving = false;
					ai->pathfinder->remove(*group);
				}
			}
		}

		if (!isMoving) {
			group->assist(*assist);
			group->micro(true);
			assisting = true;
		}
	}

	if (!group->isMicroing()) {
		if ((group->cats&BUILDER).any())
			resourceScan(); // builders should not be too aggressive
		else if ((group->cats&AIR).none()) {
			enemyScan(targetAlt);
		}
	}
}

void AssistTask::toStream(std::ostream& out) const {
	out << "AssistTask(" << key << ") groups(" << groups.size() << ") { ";
	std::list<CGroup*>::const_iterator i;
	for (i = groups.begin(); i != groups.end(); ++i) {
		out << (*(*i)) << " ";
	}
	out << "} assisting " << (*assist);
}