1 #ifndef SOLDIER_MACROS_H
2 #define SOLDIER_MACROS_H
3 
4 // MACROS FOR EASIER SOLDIER CONTROL
5 #include "TeamTurns.h"
6 #include "Soldier_Profile.h"
7 #include "Assignments.h"
8 #include "Animation_Data.h"
9 
RPC_RECRUITED(SOLDIERTYPE const * const s)10 static inline bool RPC_RECRUITED(SOLDIERTYPE const* const s)
11 {
12 	UINT8 const pid = s->ubProfile;
13 	return pid != NO_PROFILE && GetProfile(pid).ubMiscFlags & PROFILE_MISC_FLAG_RECRUITED;
14 }
15 
AM_AN_EPC(SOLDIERTYPE const * const s)16 static inline bool AM_AN_EPC(SOLDIERTYPE const* const s)
17 {
18 	UINT8 const pid = s->ubProfile;
19 	return pid != NO_PROFILE && GetProfile(pid).ubMiscFlags & PROFILE_MISC_FLAG_EPCACTIVE;
20 }
21 
AM_A_ROBOT(SOLDIERTYPE const * const s)22 static inline bool AM_A_ROBOT(SOLDIERTYPE const* const s)
23 {
24 	UINT8 const pid = s->ubProfile;
25 	return pid != NO_PROFILE && GetProfile(pid).ubBodyType == ROBOTNOWEAPON;
26 }
27 
IsMechanical(SOLDIERTYPE const & s)28 static inline bool IsMechanical(SOLDIERTYPE const& s)
29 {
30 	return s.uiStatusFlags & SOLDIER_VEHICLE || AM_A_ROBOT(&s);
31 }
32 
OK_ENEMY_MERC(SOLDIERTYPE const * const s)33 static inline bool OK_ENEMY_MERC(SOLDIERTYPE const* const s)
34 {
35 	return !s->bNeutral && s->bSide != OUR_TEAM && s->bLife >= OKLIFE;
36 }
37 
38 // Checks if our guy can be controllable .... checks bInSector, team, on duty, etc...
OkControllableMerc(const SOLDIERTYPE * const s)39 static inline BOOLEAN OkControllableMerc(const SOLDIERTYPE* const s)
40 {
41 	Assert(s->bActive);
42 	return s->bLife >= OKLIFE &&
43 		s->bInSector &&
44 		s->bTeam == OUR_TEAM &&
45 		s->bAssignment < ON_DUTY;
46 }
47 #define OK_CONTROLLABLE_MERC(s)	((s)->bActive && OkControllableMerc((s)))
48 
49 // Check if our guy can be selected and is not in a position where our team has an interupt and he does not have one
50 #define OK_INTERRUPT_MERC(p)	(!INTERRUPT_QUEUED || !(p)->bMoved)
51 
52 #define CREATURE_OR_BLOODCAT(p)	((p)->uiStatusFlags & SOLDIER_MONSTER || (p)->ubBodyType == BLOODCAT)
53 
54 #define TANK(p)			((p)->ubBodyType == TANK_NE || (p)->ubBodyType == TANK_NW)
55 
56 #define OK_ENTERABLE_VEHICLE(p)	((p)->uiStatusFlags & SOLDIER_VEHICLE && !TANK((p)) && (p)->bLife >= OKLIFE)
57 
58 #endif
59