#include <common/animdecide.qh>
#include <common/ent_cs.qh>
#include <common/physics/movetypes/movetypes.qh>
+#include <common/physics/player.qh>
#include <common/viewloc.qh>
#include <common/effects/all.qh>
#include <common/effects/all.inc>
do {
if (IS_PLAYER(player))
{
- if (radar_showennemies) break;
+ if (radar_showenemies) break;
if (SAME_TEAM(to, player)) break;
if (!(IS_PLAYER(to) || to.caplayer) && time > game_starttime) break;
}
#include "sv_assault.qh"
#include <common/mapobjects/func/breakable.qh>
+#include <server/spawnpoints.qh>
.entity sprite;
#define AS_ROUND_DELAY 5
#include <common/effects/all.qh>
#include <common/vehicles/all.qh>
#include <server/gamelog.qh>
+#include <server/g_damage.qh>
#include <server/teamplay.qh>
#include <lib/warpzone/common.qh>
#include <common/effects/all.qh>
#include <server/gamelog.qh>
+#include <server/g_damage.qh>
.entity ballcarried;
CVTOV(g_nexball_delay_idle); //10
CVTOV(g_nexball_football_physics); //0
*/
- radar_showennemies = autocvar_g_nexball_radar_showallplayers;
+ radar_showenemies = autocvar_g_nexball_radar_showallplayers;
InitializeEntity(NULL, nb_delayedinit, INITPRIO_GAMETYPE);
WEP_NEXBALL.spawnflags &= ~WEP_FLAG_MUTATORBLOCKED;
race_ScoreRules();
if(g_race_qualifying == 2)
warmup_stage = 0;
- radar_showennemies = true;
+ radar_showenemies = true;
}
void rc_SetLimits()
const int STATE_UP = 2;
const int STATE_DOWN = 3;
+.int active;
+.void (entity this, int act_state) setactive;
const int ACTIVE_NOT = 0;
const int ACTIVE_ACTIVE = 1;
const int ACTIVE_IDLE = 2;
classfield(Wall) .float loddistance1, loddistance2;
classfield(Wall) .vector saved;
+void Ent_Wall_Draw(entity this);
+
+void Ent_Wall_Remove(entity this);
+#endif
+
// Needed for interactive clientwalls
.bool inactive; // Clientwall disappears when inactive
.float alpha_max, alpha_min;
// fade_vertical_offset is a vertival offset for player position
.float fade_start, fade_end, fade_vertical_offset;
.float default_solid;
-
-void Ent_Wall_Draw(entity this);
-
-void Ent_Wall_Remove(entity this);
-#endif
#pragma once
+#ifdef SVQC
const int HURT_SLOW = BIT(4);
+
+bool tracebox_hits_trigger_hurt(vector start, vector e_min, vector e_max, vector end);
+#endif
void trigger_common_read(entity this, bool withtarget);
void trigger_remove_generic(entity this);
-.float active;
.string target;
.string targetname;
#endif
#include "../weapons/_mod.qh"
#include <server/autocvars.qh>
#include <server/defs.qh>
+#include <server/g_damage.qh>
#include "../deathtypes/all.qh"
+#include <server/items/items.qh>
#include <server/mutators/_mod.qh>
#include <server/steerlib.qh>
#include "../turrets/sv_turrets.qh"
int animbits = deadbits;
if(STAT(FROZEN, this))
animbits |= ANIMSTATE_FROZEN;
- if(this.crouch)
+ if(IS_DUCKED(this))
animbits |= ANIMSTATE_DUCK; // not that monsters can crouch currently...
animdecide_setstate(this, animbits, false);
animdecide_setimplicitstate(this, (IS_ONGROUND(this)));
#include "sv_spawn_near_teammate.qh"
+#include <common/mapobjects/trigger/hurt.qh>
+
#include <lib/float.qh>
string autocvar_g_spawn_near_teammate;
#include <common/teams.qh>
#include <server/autocvars.qh>
#include <server/constants.qh>
- #include <server/defs.qh>
+ #include <server/g_world.qh>
#include <server/mutators/_mod.qh>
#endif
#ifdef SVQC
#include <server/miscfunctions.qh>
+#include <common/mapobjects/defs.qh>
#include "../mapobjects/trigger/viewloc.qh"
// client side physics
STAT(MOVEVARS_HIGHSPEED, this) = autocvar_g_movement_highspeed;
MUTATOR_CALLHOOK(PlayerPhysics_UpdateStats, this);
- float maxspd_mod = PHYS_HIGHSPEED(this) * ((this.swampslug.active) ? this.swampslug.swamp_slowdown : 1);
+ float maxspd_mod = PHYS_HIGHSPEED(this) * ((this.swampslug.active == ACTIVE_ACTIVE) ? this.swampslug.swamp_slowdown : 1);
STAT(MOVEVARS_MAXSPEED, this) = Physics_ClientOption(this, "maxspeed", autocvar_sv_maxspeed) * maxspd_mod; // also slow walking
if (autocvar_g_movement_highspeed_q3_compat) {
STAT(MOVEVARS_AIRACCEL_QW, this) = Physics_ClientOption(this, "airaccel_qw", autocvar_sv_airaccel_qw);
#include <common/state.qh>
#endif
+const int FL_DUCKED = BIT(19);
+
.entity conveyor;
.float race_penalty;
#define WAS_ONGROUND(s) boolean((s).lastflags & FL_ONGROUND)
#define WAS_ONSLICK(s) boolean((s).lastflags & FL_ONSLICK)
+#define IS_DUCKED(s) (boolean((s).flags & FL_DUCKED))
+#define SET_DUCKED(s) ((s).flags |= FL_DUCKED)
+#define UNSET_DUCKED(s) ((s).flags &= ~FL_DUCKED)
+
#define ITEMS_STAT(s) ((s).items)
.float teleport_time;
#define PHYS_INPUT_BUTTON_BUTTON15(s) boolean(input_buttons & BIT(17))
#define PHYS_INPUT_BUTTON_BUTTON16(s) boolean(input_buttons & BIT(18))
- #define IS_DUCKED(s) (boolean((s).flags & FL_DUCKED))
- #define SET_DUCKED(s) ((s).flags |= FL_DUCKED)
- #define UNSET_DUCKED(s) ((s).flags &= ~FL_DUCKED)
-
#define PHYS_INVEHICLE(s) (boolean(hud != HUD_NORMAL))
#define PHYS_JUMPSPEEDCAP_MIN autocvar_cl_jumpspeedcap_min
#define PHYS_INPUT_BUTTON_BUTTON15(s) (CS(s).button15)
#define PHYS_INPUT_BUTTON_BUTTON16(s) (CS(s).button16)
- #define IS_DUCKED(s) ((s).crouch)
- #define SET_DUCKED(s) ((s).crouch = true)
- #define UNSET_DUCKED(s) ((s).crouch = false)
-
#define PHYS_INVEHICLE(s) (boolean((s).vehicle != NULL))
#define PHYS_JUMPSPEEDCAP_MIN autocvar_sv_jumpspeedcap_min
#include "sv_turrets.qh"
#ifdef SVQC
#include <server/autocvars.qh>
+#include <server/g_damage.qh>
#include <server/weapons/weaponsystem.qh>
#include <common/mapobjects/defs.qh>
this.event_damage = func_null;
#ifdef TURRET_DEBUG
float d;
- d = RadiusDamage (this, this.owner, this.owner.shot_dmg, 0, this.owner.shot_radius, this, NULL, this.owner.shot_force, this.totalfrags, DMG_NOWEP, NULL);
+ d = RadiusDamage (this, this.owner, this.owner.shot_dmg, 0, this.owner.shot_radius, this, NULL, this.owner.shot_force, this.projectiledeathtype, DMG_NOWEP, NULL);
this.owner.tur_debug_dmg_t_h = this.owner.tur_debug_dmg_t_h + d;
this.owner.tur_debug_dmg_t_f = this.owner.tur_debug_dmg_t_f + this.owner.shot_dmg;
#else
- RadiusDamage (this, this.realowner, this.owner.shot_dmg, 0, this.owner.shot_radius, this, NULL, this.owner.shot_force, this.totalfrags, DMG_NOWEP, NULL);
+ RadiusDamage (this, this.realowner, this.owner.shot_dmg, 0, this.owner.shot_radius, this, NULL, this.owner.shot_force, this.projectiledeathtype, DMG_NOWEP, NULL);
#endif
delete(this);
}
IL_PUSH(g_projectiles, proj);
IL_PUSH(g_bot_dodge, proj);
proj.enemy = actor.enemy;
- proj.totalfrags = _death;
+ proj.projectiledeathtype = _death;
PROJECTILE_MAKETRIGGER(proj);
if(_health)
{
setorigin(this, this.enemy.origin + randomvec() * this.owner.shot_radius);
#ifdef TURRET_DEBUG
- float d = RadiusDamage (this, this.owner, this.owner.shot_dmg, this.owner.shot_dmg, this.owner.shot_radius, this, NULL, this.owner.shot_force, this.totalfrags, DMG_NOWEP, NULL);
+ float d = RadiusDamage (this, this.owner, this.owner.shot_dmg, this.owner.shot_dmg, this.owner.shot_radius, this, NULL, this.owner.shot_force, this.projectiledeathtype, DMG_NOWEP, NULL);
this.owner.tur_debug_dmg_t_h = this.owner.tur_debug_dmg_t_h + d;
this.owner.tur_debug_dmg_t_f = this.owner.tur_debug_dmg_t_f + this.owner.shot_dmg;
#else
- RadiusDamage (this, this.realowner, this.owner.shot_dmg, this.owner.shot_dmg, this.owner.shot_radius, this, NULL, this.owner.shot_force, this.totalfrags, DMG_NOWEP, NULL);
+ RadiusDamage (this, this.realowner, this.owner.shot_dmg, this.owner.shot_dmg, this.owner.shot_radius, this, NULL, this.owner.shot_force, this.projectiledeathtype, DMG_NOWEP, NULL);
#endif
delete(this);
}
#include "sv_vehicles.qh"
+#include <server/g_damage.qh>
#include <common/mapobjects/defs.qh>
bool SendAuxiliaryXhair(entity this, entity to, int sf)
PROJECTILE_TOUCH(this, toucher);
this.event_damage = func_null;
- RadiusDamage (this, this.realowner, this.shot_dmg, 0, this.shot_radius, this, NULL, this.shot_force, this.totalfrags, DMG_NOWEP, toucher);
+ RadiusDamage (this, this.realowner, this.shot_dmg, 0, this.shot_radius, this, NULL, this.shot_force, this.projectiledeathtype, DMG_NOWEP, toucher);
delete(this);
}
proj.shot_dmg = _dmg;
proj.shot_radius = _radi;
proj.shot_force = _force;
- proj.totalfrags = _deahtype;
+ proj.projectiledeathtype = _deahtype;
proj.solid = SOLID_BBOX;
set_movetype(proj, MOVETYPE_FLYMISSILE);
proj.flags = FL_PROJECTILE;
veh.vehicle_hudmodel.viewmodelforclient = pl;
- pl.crouch = false;
+ UNSET_DUCKED(pl);
pl.view_ofs = STAT(PL_VIEW_OFS, pl);
setsize(pl, STAT(PL_MIN, pl), STAT(PL_MAX, pl));
spread = WEP_CVAR_PRI(hlac, spread_min) + (WEP_CVAR_PRI(hlac, spread_add) * actor.(weaponentity).misc_bulletcounter);
spread = min(spread,WEP_CVAR_PRI(hlac, spread_max));
- if(actor.crouch)
+ if(IS_DUCKED(actor))
spread = spread * WEP_CVAR_PRI(hlac, spread_crouchmod);
W_SetupShot(actor, weaponentity, false, 3, SND_LASERGUN_FIRE, CH_WEAPON_A, WEP_CVAR_PRI(hlac, damage), thiswep.m_id);
spread = WEP_CVAR_SEC(hlac, spread);
- if(actor.crouch)
+ if(IS_DUCKED(actor))
spread = spread * WEP_CVAR_SEC(hlac, spread_crouchmod);
W_SetupShot(actor, weaponentity, false, 3, SND_LASERGUN_FIRE, CH_WEAPON_A, WEP_CVAR_SEC(hlac, damage), thiswep.m_id | HITTYPE_SECONDARY);
.float porto_forbidden;
void W_Porto_Fail(entity this, float failhard);
+void W_Porto_Remove (entity p);
#endif
//const int PMF_DUCKED = 4;
//const int PMF_ONGROUND = 8;
-const int FL_DUCKED = BIT(19);
-
void CSQCPlayer_SetCamera();
float CSQCPlayer_PreUpdate(entity this);
float CSQCPlayer_PostUpdate(entity this);
#include "autocvars.qh"
#include "defs.qh"
#include <server/gamelog.qh>
+#include <server/sv_main.qh>
#include "miscfunctions.qh"
#include "command/common.qh"
.float ignoregoaltime;
.entity ignoregoal;
+bool bots_would_leave;
+
+int player_count;
+int currentbots;
+
.entity bot_basewaypoint;
.bool navigation_dynamicgoal;
void navigation_dynamicgoal_init(entity this, bool initially_static);
#include "../../client.qh"
#include "../../constants.qh"
#include "../../defs.qh"
+#include <server/g_damage.qh>
#include "../../race.qh"
#include <server/items/items.qh>
#include <common/mapobjects/func/ladder.qh>
#include <common/mapobjects/teleporters.qh>
+#include <common/mapobjects/trigger/hurt.qh>
#include <common/mapobjects/trigger/jumppads.qh>
#include <lib/warpzone/common.qh>
#include <common/constants.qh>
#include <common/net_linked.qh>
#include <common/mapobjects/func/ladder.qh>
+#include <common/mapobjects/trigger/hurt.qh>
#include <common/mapobjects/trigger/jumppads.qh>
.float speed;
#include <server/miscfunctions.qh>
#include <common/effects/all.qh>
#include <server/resources.qh>
+#include <server/sv_main.qh>
#include "g_damage.qh"
#include "clientkill.qh"
setthink(this, func_null);
this.nextthink = 0;
this.deadflag = DEAD_NO;
- this.crouch = false;
+ UNSET_DUCKED(this);
STAT(REVIVE_PROGRESS, this) = 0;
this.revival_time = 0;
this.draggable = drag_undraggable;
this.spawnpoint_targ = NULL;
- this.crouch = false;
+ UNSET_DUCKED(this);
this.view_ofs = STAT(PL_VIEW_OFS, this);
setsize(this, STAT(PL_MIN, this), STAT(PL_MAX, this));
this.spawnorigin = spot.origin;
return false;
}
+//flood fields
+.float nickspamtime; // time of last nick change
+.float nickspamcount;
+.float floodcontrol_chat;
+.float floodcontrol_chatteam;
+.float floodcontrol_chattell;
+.float floodcontrol_voice;
+.float floodcontrol_voiceteam;
+
+// respawning
.int respawn_flags;
.float respawn_time;
.float respawn_time_max;
+.float respawn_countdown; // next number to count
+
// g_<gametype>_str:
// If 0, default is used.
// If <0, 0 is used.
void ClientData_Touch(entity e);
+int nJoinAllowed(entity this, entity ignore);
+
+void FixIntermissionClient(entity e);
+
+void checkSpectatorBlock(entity this);
+
+void PlayerUseKey(entity this);
+
+void FixClientCvars(entity e);
+
+// called when a client connects, useful for updating sounds and such of static objects
+.void(entity this, entity player) init_for_player;
+
/// \brief Print the string to the client's chat.
/// \param[in] client Client to print to.
/// \param[in] text Text to print.
#include "common.qh"
+#include <server/client.qh>
#include <server/defs.qh>
#include <server/miscfunctions.qh>
float sv_clones;
float sv_foginterval;
-float player_count;
-float currentbots;
-float bots_would_leave;
-
-.int totalfrags; // NOTE: reused for multiple purposes
-
-// flag set on worldspawn so that the code knows if it is dedicated or not
-float server_is_dedicated;
-
// Fields
.void(entity this, entity inflictor, entity attacker, float damage, int deathtype, .entity weaponentity, vector hitloc, vector force) event_damage;
//.string map;
//.float worldtype;
-// Needed for dynamic clientwalls
-.bool inactive; // Clientwall disappears when inactive
-.float alpha_max, alpha_min;
-.float fade_start, fade_end, fade_vertical_offset;
-.float default_solid; // Variable to store default .solid for clientwalls
.float pain_finished; //Added by Supajoe
.float pain_frame; //"
-.float crouch; // Crouching or not?
.float superweapons_finished; // NOTE: this field is used only by map entities, it does not directly apply the superweapons stat
const .float air_finished = _STAT(AIR_FINISHED);
.float respawntimestart;
//.float chasecam;
-.float damageforcescale;
-const float MIN_DAMAGEEXTRARADIUS = 2;
-const float MAX_DAMAGEEXTRARADIUS = 16;
-.float damageextraradius;
-
//.float gravity;
.float dmg;
float blockSpectators; //if set, new or existing spectators or observers will be removed unless they become a player within g_maxplayers_spectator_blocktime seconds
.float spectatortime; //point in time since the client is spectating or observing
-void checkSpectatorBlock(entity this);
.float winning;
.float jointime; // time of connecting
.float alivetime; // time of being alive
.float motd_actived_time; // used for both motd and campaign_message
-int nJoinAllowed(entity this, entity ignore);
-
.float spawnshieldtime;
-.float item_spawnshieldtime;
.int playerid;
.float noalign; // if set to 1, the item or spawnpoint won't be dropped to the floor
string gamemode_name;
-void FixIntermissionClient(entity e);
-void FixClientCvars(entity e);
-
-.float respawn_countdown; // next number to count
-
float bot_waypoints_for_items;
// speedrun: when 1, player auto teleports back when capture timeout happens
.bool canteamdamage;
-void Damage (entity targ, entity inflictor, entity attacker, float damage, int deathtype, .entity weaponentity, vector hitloc, vector force);
-
// WEAPONTODO
#define DMG_NOWEP (weaponentities[0])
int sv_maxidle_slots;
bool sv_maxidle_slots_countbots;
-float tracebox_hits_trigger_hurt(vector start, vector mi, vector ma, vector end);
-
// autotaunt system
.float cvar_cl_autotaunt;
.float cvar_cl_voice_directional;
//float game_starttime; //point in time when the countdown to game start is over
//float round_starttime; //point in time when the countdown to round start is over
-void W_Porto_Remove (entity p);
-
.int projectiledeathtype;
.string message2;
.void(entity this) reset; // if set, an entity is reset using this
.void(entity this) reset2; // if set, an entity is reset using this (after calling ALL the reset functions for other entities)
-//vector debug_shotorg; // if non-zero, overrides the shot origin of all weapons
-
.bool wasplayer;
-float servertime, serverprevtime, serverframetime;
-
-.float ammo_fuel;
-
-//flood fields
-.float nickspamtime; // time of last nick change
-.float nickspamcount;
-.float floodcontrol_chat;
-.float floodcontrol_chatteam;
-.float floodcontrol_chattell;
-.float floodcontrol_voice;
-.float floodcontrol_voiceteam;
-
string matchid;
-bool radar_showennemies;
+bool radar_showenemies;
.int minelayer_mines;
.float vortex_charge;
const int FROZEN_TEMP_REVIVING = 2;
const int FROZEN_TEMP_DYING = 3;
-.int active;
-.void (entity this, int act_state) setactive;
.entity realowner;
//float serverflags;
.float misc_bulletcounter; // replaces uzi & hlac bullet counter.
-void PlayerUseKey(entity this);
-
-USING(spawn_evalfunc_t, vector(entity this, entity player, entity spot, vector current));
-.spawn_evalfunc_t spawn_evalfunc;
-
string modname;
-.int missile_flags;
-const int MIF_SPLASH = BIT(1);
-const int MIF_ARC = BIT(2);
-const int MIF_PROXY = BIT(3);
-const int MIF_GUIDED_MANUAL = BIT(4);
-const int MIF_GUIDED_HEAT = BIT(5);
-const int MIF_GUIDED_LASER = BIT(6);
-const int MIF_GUIDED_AI = BIT(7);
-const int MIF_GUIDED_TAG = BIT(7);
-const int MIF_GUIDED_ALL = MIF_GUIDED_MANUAL | MIF_GUIDED_HEAT | MIF_GUIDED_LASER | MIF_GUIDED_AI | MIF_GUIDED_TAG;
-const int MIF_GUIDED_TRACKING = MIF_GUIDED_HEAT | MIF_GUIDED_LASER | MIF_GUIDED_AI | MIF_GUIDED_TAG;
-const int MIF_GUIDED_CONFUSABLE = MIF_GUIDED_HEAT | MIF_GUIDED_AI;
-
////
.string cvar_cl_physics;
-.void(entity this, entity player) init_for_player;
-
.WepSet dual_weapons;
IntrusiveList g_monsters;
.bool istypefrag;
.float taunt_soundtime;
+.int totalfrags;
+
float IsFlying(entity a);
void UpdateFrags(entity player, int f);
float RadiusDamage (entity inflictor, entity attacker, float coredamage, float edgedamage, float rad, entity cantbe, entity mustbe, float forceintensity, int deathtype, .entity weaponentity, entity directhitentity);
+.float damageforcescale;
+const float MIN_DAMAGEEXTRARADIUS = 2;
+const float MAX_DAMAGEEXTRARADIUS = 16;
+.float damageextraradius;
+
// Calls .event_heal on the target so that they can handle healing themselves
// a limit of RES_LIMIT_NONE should be handled by the entity as its max health (if applicable)
bool Heal(entity targ, entity inflictor, float amount, float limit);
#include "g_hook.qh"
#include <server/defs.qh>
+#include <server/g_damage.qh>
#include <server/miscfunctions.qh>
#include <common/effects/all.qh>
#include "weapons/common.qh"
float checkrules_suddendeathend;
float checkrules_overtimesadded; //how many overtimes have been already added
+// flag set on worldspawn so that the code knows if it is dedicated or not
+bool server_is_dedicated;
+
string cache_mutatormsg;
string cache_lastmutatormsg;
#include "weapons/throwing.qh"
#include "command/common.qh"
#include "cheats.qh"
+#include "client.qh"
#include "clientkill.qh"
#include "weapons/selection.qh"
#include "weapons/tracing.qh"
.float item_respawncounter;
+// delay before this item can be picked up
+.float item_spawnshieldtime;
+
void Item_Show (entity e, int mode);
void Item_Respawn (entity this);
#include "mapvoting.qh"
+#include <server/client.qh>
#include <server/defs.qh>
#include <server/gamelog.qh>
#include <server/miscfunctions.qh>
#include "command/common.qh"
#include "constants.qh"
#include "g_hook.qh"
+#include "g_world.qh"
#include <server/gamelog.qh>
#include "ipban.qh"
#include <server/items/items.qh>
#include "../common/playerstats.qh"
#include "../common/teams.qh"
#include "../common/mapobjects/subs.qh"
+#include <common/mapobjects/trigger/hurt.qh>
#include "../common/util.qh"
#include "../common/turrets/sv_turrets.qh"
#include <common/weapons/_all.qh>
animbits |= ANIMSTATE_FROZEN;
if(this.move_movetype == MOVETYPE_FOLLOW)
animbits |= ANIMSTATE_FOLLOW;
- if(this.crouch)
+ if(IS_DUCKED(this))
animbits |= ANIMSTATE_DUCK;
animdecide_setstate(this, animbits, false);
animdecide_setimplicitstate(this, IS_ONGROUND(this));
#include "../lib/warpzone/common.qh"
#include "../common/vehicles/vehicle.qh"
#include "../common/vehicles/sv_vehicles.qh"
+#include <common/weapons/weapon/porto.qh>
#include <server/player.qh>
#define PORTALS_ARE_NOT_SOLID
#include "race.qh"
#include <server/defs.qh>
+#include <server/g_damage.qh>
#include <server/miscfunctions.qh>
#include "client.qh"
#include "portals.qh"
#include "command/common.qh"
#include "defs.qh"
+#include "client.qh"
#include <server/g_world.qh>
#include <server/miscfunctions.qh>
#include <server/mutators/_mod.qh>
entity SelectSpawnPoint(entity this, bool anypoint);
spawnfunc(info_player_deathmatch);
void spawnpoint_use(entity this, entity actor, entity trigger);
+
+USING(spawn_evalfunc_t, vector(entity this, entity player, entity spot, vector current));
+.spawn_evalfunc_t spawn_evalfunc;
float client_cefc_accumulatortime;
#endif
+float servertime, serverprevtime, serverframetime;
+
/*
==================
main
#include "client.qh"
#include <server/gamelog.qh>
+#include <server/g_damage.qh>
#include "race.qh"
#include "scores.qh"
#include "scores_rules.qh"
void W_PlayStrengthSound(entity player);
float W_CheckProjectileDamage(entity inflictor, entity projowner, int deathtype, float exception);
void W_PrepareExplosionByDamage(entity this, entity attacker, void(entity this) explode);
+
+.int missile_flags;
+const int MIF_SPLASH = BIT(1);
+const int MIF_ARC = BIT(2);
+const int MIF_PROXY = BIT(3);
+const int MIF_GUIDED_MANUAL = BIT(4);
+const int MIF_GUIDED_HEAT = BIT(5);
+const int MIF_GUIDED_LASER = BIT(6);
+const int MIF_GUIDED_AI = BIT(7);
+const int MIF_GUIDED_TAG = BIT(7);
+const int MIF_GUIDED_ALL = MIF_GUIDED_MANUAL | MIF_GUIDED_HEAT | MIF_GUIDED_LASER | MIF_GUIDED_AI | MIF_GUIDED_TAG;
+const int MIF_GUIDED_TRACKING = MIF_GUIDED_HEAT | MIF_GUIDED_LASER | MIF_GUIDED_AI | MIF_GUIDED_TAG;
+const int MIF_GUIDED_CONFUSABLE = MIF_GUIDED_HEAT | MIF_GUIDED_AI;