File: AirBaseHandler.h

package info (click to toggle)
spring 98.0%2Bdfsg-1
  • links: PTS, VCS
  • area: main
  • in suites: jessie, jessie-kfreebsd
  • size: 41,928 kB
  • ctags: 60,665
  • sloc: cpp: 356,167; ansic: 39,434; python: 12,228; java: 12,203; awk: 5,856; sh: 1,719; xml: 997; perl: 405; php: 253; objc: 194; makefile: 72; sed: 2
file content (90 lines) | stat: -rw-r--r-- 2,094 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
/* This file is part of the Spring engine (GPL v2 or later), see LICENSE.html */

#ifndef AIR_BASE_HANDLER_H
#define AIR_BASE_HANDLER_H

#include <list>
#include <set>
#include <boost/noncopyable.hpp>

#include "System/Object.h"
#include "System/float3.h"

class CUnit;

class CAirBaseHandler : public boost::noncopyable
{
	CR_DECLARE_STRUCT(CAirBaseHandler)
	CR_DECLARE_SUB(LandingPad)
	CR_DECLARE_SUB(AirBase)

private:
	struct AirBase;

public:

	class LandingPad: public CObject, public boost::noncopyable {
		CR_DECLARE(LandingPad)

	public:
		LandingPad(int p, CUnit* u, AirBase* b):
			piece(p), unit(u), base(b) {}

		int GetPiece() const { return piece; }
		CUnit* GetUnit() const { return unit; }
		AirBase* GetBase() const { return base; }

	private:
		int piece;
		CUnit* unit;
		AirBase* base;
	};

private:

	struct AirBase: public boost::noncopyable {
		CR_DECLARE_STRUCT(AirBase)
		AirBase(CUnit* u) : unit(u) {}

		CUnit* unit;
		std::list<LandingPad*> freePads;
		std::list<LandingPad*> pads;
	};

public:
	CAirBaseHandler();
	~CAirBaseHandler();

	void RegisterAirBase(CUnit* base);
	void DeregisterAirBase(CUnit* base);
	void LeaveLandingPad(LandingPad* pad);

	/**
	 * @brief Try to find an airbase and reserve it if one can be found
	 * Caller must call LeaveLandingPad() if it gets one
	 * and is finished with it or dies.
	 * It is the callers responsibility to detect if the base dies
	 * while its reserved.
	 */
	LandingPad* FindAirBase(CUnit* unit, float minPower, bool wantFreePad);

	/** @brief Try to find the closest airbase even if it's reserved */
	float3 FindClosestAirBasePos(CUnit* unit, float minPower);

	bool HaveAirBase(int allyTeam) const { return (!bases[allyTeam].empty()); }

private:
	typedef std::list<AirBase*> AirBaseLst;
	typedef std::list<AirBase*>::iterator AirBaseLstIt;
	typedef std::list<LandingPad*> PadLst;
	typedef std::list<LandingPad*>::iterator PadLstIt;

	std::vector<AirBaseLst> bases;

	// IDs of units registered as airbases
	std::set<int> airBaseIDs;
};

extern CAirBaseHandler* airBaseHandler;

#endif /* AIR_BASE_HANDLER_H */