+// Deathtypes (weapon deathtypes are the IT_* constants below)
+// NOTE: when adding death types, please add an explanation to Docs/spamlog.txt too.
+#define DT_FIRST 10000
+#define DT_MAX 1024 // limit of recursive functions with ACCUMULATE_FUNCTION
+float DT_COUNT;
+
+float DEATH_VHFIRST = DT_FIRST;
+float DEATH_VHLAST = DT_FIRST;
+
+#define DEATHTYPE(name,type,notification,first,last) \
+ float name; \
+ float first; \
+ float last; \
+ void DecDeathtype_##name() \
+ { \
+ SET_FIRST_OR_LAST(first, DT_FIRST, DT_COUNT) \
+ SET_FIRST_OR_LAST(last, DT_FIRST, DT_COUNT) \
+ SET_FIELD_COUNT(name, DT_FIRST, DT_COUNT) \
+ CHECK_MAX_COUNT(name, DT_MAX, DT_COUNT, "deathtypes") \
+ }
+ ACCUMULATE_FUNCTION(DecDeathtypes, DecDeathtype_##name)
+
+#define DEATHTYPES \
+ DEATHTYPE(DEATH_FALL, FALSE, FALSE, DEATH_SPECIAL_START, FALSE) \
+ DEATHTYPE(DEATH_TELEFRAG, FALSE, FALSE, FALSE, FALSE) \
+ DEATHTYPE(DEATH_DROWN, FALSE, FALSE, FALSE, FALSE) \
+ DEATHTYPE(DEATH_HURTTRIGGER, FALSE, FALSE, FALSE, FALSE) \
+ DEATHTYPE(DEATH_LAVA, FALSE, FALSE, FALSE, FALSE) \
+ DEATHTYPE(DEATH_SLIME, FALSE, FALSE, FALSE, FALSE) \
+ DEATHTYPE(DEATH_KILL, FALSE, FALSE, FALSE, FALSE) \
+ DEATHTYPE(DEATH_NOAMMO, FALSE, FALSE, FALSE, FALSE) \
+ DEATHTYPE(DEATH_SWAMP, FALSE, FALSE, FALSE, FALSE) \
+ DEATHTYPE(DEATH_TEAMCHANGE, FALSE, FALSE, FALSE, FALSE) \
+ DEATHTYPE(DEATH_AUTOTEAMCHANGE, FALSE, FALSE, FALSE, FALSE) \
+ DEATHTYPE(DEATH_CAMP, FALSE, FALSE, FALSE, FALSE) \
+ DEATHTYPE(DEATH_SHOOTING_STAR, FALSE, FALSE, FALSE, FALSE) \
+ DEATHTYPE(DEATH_ROT, FALSE, FALSE, FALSE, FALSE) \
+ DEATHTYPE(DEATH_MIRRORDAMAGE, FALSE, FALSE, FALSE, FALSE) \
+ DEATHTYPE(DEATH_TOUCHEXPLODE, FALSE, FALSE, FALSE, FALSE) \
+ DEATHTYPE(DEATH_CHEAT, FALSE, FALSE, FALSE, FALSE) \
+ DEATHTYPE(DEATH_FIRE, FALSE, FALSE, FALSE, FALSE) \
+ DEATHTYPE(DEATH_QUIET, FALSE, FALSE, FALSE, FALSE) \
+ #undef DEATHTYPE
+
+DEATHTYPES
+
+float DEATH_VHCRUSH = 10030;
+float DEATH_SBMINIGUN = 10031;
+float DEATH_SBROCKET = 10032;
+float DEATH_SBBLOWUP = 10033;
+float DEATH_WAKIGUN = 10034;
+float DEATH_WAKIROCKET = 10035;
+float DEATH_WAKIBLOWUP = 10036;
+float DEATH_RAPTOR_CANNON = 10037;
+float DEATH_RAPTOR_BOMB = 10038;
+float DEATH_RAPTOR_BOMB_SPLIT = 10039;
+float DEATH_RAPTOR_DEATH = 10040;
+float DEATH_BUMB_GUN = 10041;
+float DEATH_BUMB_RAY = 10042;
+float DEATH_BUMB_RAY_HEAL = 10043;
+float DEATH_BUMB_DEATH = 10044;
+#define DEATH_ISVEHICLE(t) ((t) >= DEATH_VHFIRST && (t) <= DEATH_VHLAST)
+
+float DEATH_GENERIC = 10050;
+
+float DEATH_WEAPON = 10100;
+
+float DEATH_CUSTOM = 10300;
+
+float DEATH_TURRET = 10500;
+float DEATH_TURRET_EWHEEL = 10501;
+float DEATH_TURRET_FLAC = 10502;
+float DEATH_TURRET_MACHINEGUN = 10503;
+float DEATH_TURRET_WALKER_GUN = 10504;
+float DEATH_TURRET_WALKER_MEELE = 10505;
+float DEATH_TURRET_WALKER_ROCKET = 10506;
+float DEATH_TURRET_HELLION = 10507;
+float DEATH_TURRET_HK = 10508;
+float DEATH_TURRET_MLRS = 10509;
+float DEATH_TURRET_PLASMA = 10510;
+float DEATH_TURRET_PHASER = 10511;
+float DEATH_TURRET_TESLA = 10512;
+float DEATH_TURRET_LAST = 10512;
+
+float DEATH_WEAPONMASK = 0xFF;
+float DEATH_HITTYPEMASK = 0x1F00; // which is WAY below 10000 used for normal deaths
+float HITTYPE_SECONDARY = 0x100;
+float HITTYPE_SPLASH = 0x200; // automatically set by RadiusDamage
+float HITTYPE_BOUNCE = 0x400;
+float HITTYPE_HEADSHOT = 0x800; // automatically set by Damage (if headshotbonus is set)
+float HITTYPE_RESERVED = 0x1000; // unused yet
+
+// macros to access these
+#define DEATH_ISTURRET(t) ((t) >= DEATH_TURRET && (t) <= DEATH_TURRET_LAST)
+#define DEATH_ISSPECIAL(t) ((t) >= DEATH_SPECIAL_START)
+#define DEATH_WEAPONOFWEAPONDEATH(t) ((t) & DEATH_WEAPONMASK)
+#define DEATH_ISWEAPON(t,w) (!DEATH_ISSPECIAL(t) && DEATH_WEAPONOFWEAPONDEATH(t) == (w))
+#define DEATH_WEAPONOF(t) (DEATH_ISSPECIAL(t) ? 0 : DEATH_WEAPONOFWEAPONDEATH(t))
+#define WEP_VALID(w) ((w) >= WEP_FIRST && (w) <= WEP_LAST)
+
+// CSQC centerprint/notify message types
+float MSG_SUICIDE = 0;
+float MSG_KILL = 1;
+float MSG_SPREE = 2;
+float MSG_KILL_ACTION = 3;
+float MSG_KILL_ACTION_SPREE = 4;
+float MSG_INFO = 5;
+float MSG_KA = 6;
+float MSG_RACE = 10;
+
+float KILL_TEAM_RED = 12001;
+float KILL_TEAM_BLUE = 12002;
+float KILL_TEAM_SPREE = 12003;
+float KILL_FIRST_BLOOD = 12004;
+float KILL_FIRST_VICTIM = 12005;
+float KILL_TYPEFRAG = 12006;
+float KILL_TYPEFRAGGED = 12007;
+float KILL_FRAG = 12008;
+float KILL_FRAGGED = 12009;
+float KILL_SPREE = 12010;
+float KILL_END_SPREE = 12011;
+float KILL_SPREE_3 = 12012;
+float KILL_SPREE_5 = 12013;
+float KILL_SPREE_10 = 12014;
+float KILL_SPREE_15 = 12015;
+float KILL_SPREE_20 = 12016;
+float KILL_SPREE_25 = 12017;
+float KILL_SPREE_30 = 12018;
+
+float INFO_GOTFLAG = 13001;
+float INFO_PICKUPFLAG = 13002;
+float INFO_LOSTFLAG = 13003;
+float INFO_RETURNFLAG = 13004;
+float INFO_CAPTUREFLAG = 13005;
+
+float KA_PICKUPBALL = 14001;
+float KA_DROPBALL = 14002;
+
+float RACE_SERVER_RECORD = 15001;
+float RACE_NEW_TIME = 15002;
+float RACE_NEW_RANK = 15003;
+float RACE_FAIL = 15004;
+
+ /*print("Obituary_Notification(): ", ftos(deathtype), ".\n");
+ switch(deathtype)
+ {
+ // suicide
+ case DEATH_AUTOTEAMCHANGE:
+ case DEATH_CAMP:
+ case DEATH_NOAMMO:
+ case DEATH_ROT:
+ case DEATH_TEAMCHANGE:
+
+ case KILL_TEAM_SUICIDE_RED:
+ case KILL_TEAM_SUICIDE_BLUE:
+
+ // murder
+ case KILL_TEAM_FRAG_RED:
+ case KILL_TEAM_FRAG_BLUE:
+
+ case KILL_FIRST_BLOOD:
+ case KILL_FIRST_VICTIM:
+
+ case KILL_FRAG:
+ case KILL_TYPEFRAG:
+ case KILL_FRAGGED:
+ case KILL_TYPEFRAGGED:
+
+ // accident
+ case WATCH_STEP:
+
+ case DEATH_QUIET: break;
+
+ // ideally we should have ALL deathtypes listed here
+ default:
+ backtrace(strcat("Unhandled deathtype: ", ftos(deathtype), ". Please notify Samual!\n"));
+ break;
+ }*/