1 /**
2  * @file
3  */
4 
5 /*
6 Copyright (C) 2002-2013 UFO: Alien Invasion.
7 
8 This program is free software; you can redistribute it and/or
9 modify it under the terms of the GNU General Public License
10 as published by the Free Software Foundation; either version 2
11 of the License, or (at your option) any later version.
12 
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
16 
17 See the GNU General Public License for more details.
18 
19 You should have received a copy of the GNU General Public License
20 along with this program; if not, write to the Free Software
21 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
22 
23 */
24 
25 #pragma once
26 
27 #include "g_local.h"
28 
29 #define G_IsState(ent, s)		((ent)->state & (s))
30 #define G_IsShaken(ent)			G_IsState(ent, STATE_SHAKEN)
31 #define G_IsStunned(ent)		(G_IsState(ent, STATE_STUN) & ~STATE_DEAD)
32 #define G_IsPanicked(ent)		G_IsState(ent, STATE_PANIC)
33 #define G_IsReaction(ent)		G_IsState(ent, STATE_REACTION)
34 #define G_IsRaged(ent)			G_IsState(ent, STATE_RAGE)
35 #define G_IsInsane(ent)			(G_IsState(ent, STATE_INSANE) & ~STATE_RAGE)
36 #define G_IsDazed(ent)			G_IsState(ent, STATE_DAZED)
37 #define G_IsCrouched(ent)		G_IsState(ent, STATE_CROUCHED)
38 /** @note This check also includes the IsStunned check - see the STATE_* bitmasks */
39 #define G_IsDead(ent)			G_IsState(ent, STATE_DEAD)
40 
41 #define G_SetState(ent, s)		(ent)->state |= (s)
42 #define G_SetShaken(ent)		G_SetState((ent), STATE_SHAKEN)
43 #define G_SetDazed(ent)			G_SetState((ent), STATE_DAZED)
44 #define G_SetStunned(ent)		G_SetState((ent), STATE_STUN)
45 #define G_SetDead(ent)			G_SetState((ent), STATE_DEAD)
46 #define G_SetInsane(ent)		G_SetState((ent), STATE_INSANE)
47 #define G_SetRage(ent)			G_SetState((ent), STATE_RAGE)
48 #define G_SetPanic(ent)			G_SetState((ent), STATE_PANIC)
49 #define G_SetCrouched(ent)		G_SetState((ent), STATE_CROUCHED)
50 
51 #define G_RemoveState(ent, s)	(ent)->state &= ~(s)
52 #define G_RemoveShaken(ent)		G_RemoveState((ent), STATE_SHAKEN)
53 #define G_RemoveDazed(ent)		G_RemoveState((ent), STATE_DAZED)
54 #define G_RemoveStunned(ent)	G_RemoveState((ent), STATE_STUN)
55 #define G_RemoveDead(ent)		G_RemoveState((ent), STATE_DEAD)
56 #define G_RemoveInsane(ent)		G_RemoveState((ent), STATE_INSANE)
57 #define G_RemoveRage(ent)		G_RemoveState((ent), STATE_RAGE)
58 #define G_RemovePanic(ent)		G_RemoveState((ent), STATE_PANIC)
59 #define G_RemoveCrouched(ent)	G_RemoveState((ent), STATE_CROUCHED)
60 #define G_RemoveReaction(ent)	G_RemoveState((ent), STATE_REACTION)
61 
62 #define G_ToggleState(ent, s)	(ent)->state ^= (s)
63 #define G_ToggleCrouched(ent)	G_ToggleState(ent, STATE_CROUCHED)
64 
65 bool G_IsLivingActor(const Edict* ent) __attribute__((nonnull));
66 void G_ActorUseDoor(Edict* actor, Edict* door);
67 bool G_ActorIsInRescueZone(const Edict* actor);
68 void G_ActorSetInRescueZone(Edict* actor, bool inRescueZone);
69 void G_ActorSetClientAction(Edict* actor, Edict* ent);
70 int G_ActorGetReservedTUs(const Edict* ent);
71 int G_ActorUsableTUs(const Edict* ent);
72 int G_ActorGetTUForReactionFire(const Edict* ent);
73 void G_ActorReserveTUs(Edict* ent, int resReaction, int resShot, int resCrouch);
74 int G_ActorDoTurn(Edict* ent, byte dir);
75 void G_ActorSetMaxs(Edict* ent);
76 int G_ActorCalculateMaxTU(const Edict* ent);
77 void G_ActorGiveTimeUnits(Edict* ent);
78 void G_ActorSetTU(Edict* ent, int tus);
79 void G_ActorUseTU(Edict* ent, int tus);
80 void G_ActorModifyCounters(const Edict* attacker, const Edict* victim, int deltaAlive, int deltaKills, int deltaStuns);
81 void G_ActorGetEyeVector(const Edict* actor, vec3_t eye);
82 void G_ActorCheckRevitalise(Edict* ent);
83 bool G_ActorDieOrStun(Edict* ent, Edict* attacker);
84 int G_ActorGetContentFlags(const vec3_t origin);
85 bool G_ActorInvMove(Edict* ent, const invDef_t* from, Item* fItem, const invDef_t* to, int tx, int ty, bool checkaction);
86 void G_ActorReload(Edict* ent, const invDef_t* invDef);
87 int G_ActorGetModifiedTimeForFiredef(const Edict* ent, const fireDef_t* const fd, bool reaction);
88