aboutsummaryrefslogtreecommitdiff
path: root/engines/scumm/he/moonbase/ai_targetacquisition.h
blob: 8c27c06e15792608fdc623140a7955cb2f76a47e (plain)
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
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
/* ScummVM - Graphic Adventure Engine
 *
 * ScummVM is the legal property of its developers, whose names
 * are too numerous to list here. Please refer to the COPYRIGHT
 * file distributed with this source distribution.
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 2
 * of the License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
 *
 */

#ifndef SCUMM_HE_MOONBASE_AI_TARGETACQUISITION_H
#define SCUMM_HE_MOONBASE_AI_TARGETACQUISITION_H

#include "scumm/he/moonbase/ai_defenseunit.h"
#include "scumm/he/moonbase/ai_node.h"
#include "scumm/he/moonbase/ai_tree.h"

namespace Scumm {

const int NUM_IMPT_UNITS = 3;
const int NUM_SHOT_POSITIONS = 1;
const int NUM_WEAPONS = 3;

class Sortie : public IContainedObject {
private:
	static int _sSourceX;
	static int _sSourceY;

	static int _sTargetX;
	static int _sTargetY;

	int _unitType;
	int _shotPosX, _shotPosY;
	Common::Array<DefenseUnit *> _enemyDefenses;
	AI *_ai;

public:
	Sortie(AI *ai) { _ai = ai; _unitType = 0; _shotPosX = _shotPosY = 0; }
	virtual ~Sortie();

	static void setSourcePos(int x, int y) {
		_sSourceX = x;
		_sSourceY = y;
	}
	static void setTargetPos(int x, int y) {
		_sTargetX = x;
		_sTargetY = y;
	}

	void setUnitType(int unitType) { _unitType = unitType; }

	void setShotPosX(int shotPosX) { _shotPosX = shotPosX; }
	void setShotPosY(int shotPosY) { _shotPosY = shotPosY; }
	void setShotPos(int shotPosX, int shotPosY) {
		_shotPosX = shotPosX;
		_shotPosY = shotPosY;
	}

	void setEnemyDefenses(Common::Array<DefenseUnit *> enemyDefenses) {
		_enemyDefenses = enemyDefenses;
	}
	void setEnemyDefenses(int enemyDefensesScummArray, int defendX, int defendY);

	void printEnemyDefenses();

	static int getSourcePosX() { return _sSourceX; }
	static int getSourcePosY() { return _sSourceY; }
	static int getTargetPosX() { return _sTargetX; }
	static int getTargetPosY() { return _sTargetY; }

	int getUnitType() const { return _unitType; }

	int getShotPosX() const { return _shotPosX; }
	int getShotPosY() const { return _shotPosY; }
	int *getShotPos() const;

	Common::Array<DefenseUnit *> getEnemyDefenses() const { return _enemyDefenses; }

	virtual IContainedObject *duplicate();

	virtual int numChildrenToGen();
	virtual IContainedObject *createChildObj(int, int &completionFlag);


	virtual float calcH();
	virtual int checkSuccess();
	virtual float calcT();
};

class Defender {
private:
	int _sourceX;
	int _sourceY;
	int _targetX;
	int _targetY;
	int _sourceUnit;
	int _power;
	int _angle;
	int _unit;
	AI *_ai;

public:
	Defender(AI *ai);
	void setSourceX(int sourceX) { _sourceX = sourceX; }
	void setSourceY(int sourceY) { _sourceY = sourceY; }
	void setTargetX(int targetX) { _targetX = targetX; }
	void setTargetY(int targetY) { _targetY = targetY; }
	void setSourceUnit(int sourceUnit) { _sourceUnit = sourceUnit; }
	void setPower(int power) { _power = power; }
	void setAngle(int angle) { _angle = angle; }
	void setUnit(int unit) { _unit = unit; }

	int getSourceX() const { return _sourceX; }
	int getSourceY() const { return _sourceY; }
	int getTargetX() const { return _targetX; }
	int getTargetY() const { return _targetY; }
	int getSourceUnit() const { return _sourceUnit; }
	int getPower() const { return _power; }
	int getAngle() const { return _angle; }
	int getUnit() const { return _unit; }

	int calculateDefenseUnitPosition(int targetX, int targetY, int index);
};

class defenseUnitCompare {
public:
	bool operator()(DefenseUnit *x, DefenseUnit *y) {
		//disabled units go at the end
		if (x->getState() == DUS_OFF) {
			debugC(DEBUG_MOONBASE_AI, "OFF");
			return 0;
		}

		return x->getDistanceTo() < y->getDistanceTo();
	}
};

} // End of namespace Scumm

#endif