File: SpecialAction.cpp

package info (click to toggle)
vcmi 1.6.5%2Bdfsg-2
  • links: PTS, VCS
  • area: contrib
  • in suites: forky, sid, trixie
  • size: 32,060 kB
  • sloc: cpp: 238,971; python: 265; sh: 224; xml: 157; ansic: 78; objc: 61; makefile: 49
file content (93 lines) | stat: -rw-r--r-- 1,875 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
85
86
87
88
89
90
91
92
93
/*
* SpecialAction.cpp, part of VCMI engine
*
* Authors: listed in file AUTHORS in main folder
*
* License: GNU General Public License v2.0 or later
* Full text of license available in license.txt file, in main folder
*
*/

#include "StdInc.h"
#include "SpecialAction.h"
#include "../../AIGateway.h"
#include "../../Goals/CGoal.h"
#include "../../Goals/Invalid.h"

namespace NKAI
{

Goals::TSubgoal SpecialAction::decompose(const Nullkiller * ai, const CGHeroInstance * hero) const
{
	return Goals::sptr(Goals::Invalid());
}

void SpecialAction::execute(AIGateway * ai, const CGHeroInstance * hero) const
{
	throw cannotFulfillGoalException("Can not execute " + toString());
}

bool CompositeAction::canAct(const Nullkiller * ai, const AIPathNode * source) const
{
	for(auto part : parts)
	{
		if(!part->canAct(ai, source)) return false;
	}

	return true;
}

Goals::TSubgoal CompositeAction::decompose(const Nullkiller * ai, const CGHeroInstance * hero) const
{
	for(auto part : parts)
	{
		auto goal = part->decompose(ai, hero);

		if(!goal->invalid()) return goal;
	}

	return SpecialAction::decompose(ai, hero);
}

void CompositeAction::execute(AIGateway * ai, const CGHeroInstance * hero) const
{
	for(auto part : parts)
	{
		part->execute(ai, hero);
	}
}

void CompositeAction::applyOnDestination(
	const CGHeroInstance * hero,
	CDestinationNodeInfo & destination,
	const PathNodeInfo & source,
	AIPathNode * dstNode,
	const AIPathNode * srcNode) const
{
	for(auto part : parts)
	{
		part->applyOnDestination(hero, destination, source, dstNode, srcNode);
	}
}

std::string CompositeAction::toString() const
{
	std::string result = "";

	for(auto part : parts)
	{
		result += ", " + part->toString();
	}

	return result;
}

const CGObjectInstance * CompositeAction::targetObject() const
{
	if(parts.empty())
		return nullptr;

	return parts.front()->targetObject();
}

}