]> git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/commitdiff
Merge branch 'master' into Mario/monsters
authorMario <mario.mario@y7mail.com>
Wed, 2 Oct 2013 04:24:15 +0000 (21:24 -0700)
committerMario <mario.mario@y7mail.com>
Wed, 2 Oct 2013 04:24:15 +0000 (21:24 -0700)
1  2 
commands.cfg
qcsrc/common/deathtypes.qh
qcsrc/common/mapinfo.qh
qcsrc/common/monsters/monsters.qh
qcsrc/common/notifications.qh

diff --combined commands.cfg
index 67f5f343e3e65a0d3d462bddc8438318f90a2f9b,dca2334bc745a8a1a0f1cb869aec1b1ede7b5d4c..ac7316f07514bf9e14f35ced0cf88d1d6d3354ae
@@@ -56,7 -56,6 +56,7 @@@ alias who                  "qc_cmd_svcm
  // generic commands (across all programs)
  alias addtolist            "qc_cmd_svmenu addtolist            ${* ?}" // Add a string to a cvar
  alias dumpcommands         "qc_cmd_svmenu dumpcommands         ${* ?}" // Dump all commands on the program to *_cmd_dump.txt
 +alias dumpmonsters         "qc_cmd_svmenu dumpmonsters         ${* ?}" // Dump all monsters into monsters_dump.txt
  alias dumpnotifs           "qc_cmd_svcl   dumpnotifs           ${* ?}" // Dump all notifications into notifications_dump.txt
  alias maplist              "qc_cmd_svmenu maplist              ${* ?}" // Automatic control of maplist
  alias nextframe            "qc_cmd_svmenu nextframe            ${* ?}" // Execute the given command next frame of this VM
@@@ -104,7 -103,6 +104,7 @@@ alias menu_showhudexit "menu_cmd direct
  alias menu_showhudoptions "menu_cmd directpanelhudmenu ${* ?}"
  alias menu_showsandboxtools "menu_cmd directmenu SandboxTools"
  alias menu_showquitdialog "menu_cmd directmenu Quit"
 +alias menu_showmonstertools "menu_cmd directmenu MonsterTools"
  
  // command executed before loading a map by the menu
  // makes sure maxplayers is at least minplayers or bot_number + 1
@@@ -157,9 -155,6 +157,9 @@@ alias reportcvar           "qc_cmd_cm
  alias selectteam           "qc_cmd_cmd    selectteam           ${* ?}" // Attempt to choose a team to join into
  alias selfstuff            "qc_cmd_cmd    selfstuff            ${* ?}" // Stuffcmd a command to your own client
  alias sentcvar             "qc_cmd_cmd    sentcvar             ${* ?}" // New system for sending a client cvar to the server
- alias editmob                    "qc_cmd_cmd    mobedit                          ${* ?}" // Edit a monster's properties
- alias killmob                    "qc_cmd_cmd    mobkill                          ${* ?}" // Kill a monster
++alias editmob              "qc_cmd_cmd          mobedit                          ${* ?}" // Edit a monster's properties
++alias killmob              "qc_cmd_cmd          mobkill                          ${* ?}" // Kill a monster
 +alias spawnmob             "qc_cmd_cmd    mobspawn             ${* ?}" // Spawn a monster infront of the player
  alias spectate             "qc_cmd_cmd    spectate             ${* ?}" // Become an observer
  alias suggestmap           "qc_cmd_cmd    suggestmap           ${* ?}" // Suggest a map to the mapvote at match end
  //alias tell               "qc_cmd_cmd    tell                 ${* ?}" // Send a message directly to a player
@@@ -189,7 -184,6 +189,7 @@@ alias allspec              "qc_cmd_s
  alias anticheat            "qc_cmd_sv     anticheat            ${* ?}" // Create an anticheat report for a client
  alias bbox                 "qc_cmd_sv     bbox                 ${* ?}" // Print detailed information about world size
  alias bot_cmd              "qc_cmd_sv     bot_cmd              ${* ?}" // Control and send commands to bots
 +alias butcher              "qc_cmd_sv     butcher              ${* ?}" // Remove all monsters on the map
  alias cointoss             "qc_cmd_sv     cointoss             ${* ?}" // Flip a virtual coin and give random result
  alias database             "qc_cmd_sv     database             ${* ?}" // Extra controls of the serverprogs database
  alias defer_clear          "qc_cmd_sv     defer_clear          ${* ?}" // Clear all queued defer commands for a specific client
index 8ea53b5e749d7c6d21a2433a797b425d4c1dafcc,cc7154d4b6a8713de9236413ecdb01adcf2d0db1..5e4b0870c9c02d78fb4a4609b3a92d7369c95fea
        DEATHTYPE(DEATH_KILL,                   DEATH_SELF_SUICIDE,                 NO_MSG,                        NORMAL_POS) \
        DEATHTYPE(DEATH_LAVA,                   DEATH_SELF_LAVA,                    DEATH_MURDER_LAVA,             NORMAL_POS) \
        DEATHTYPE(DEATH_MIRRORDAMAGE,           DEATH_SELF_BETRAYAL,                NO_MSG,                        NORMAL_POS) \
 +      DEATHTYPE(DEATH_MONSTER_CERBERUS_BITE,  DEATH_SELF_MON_CERBERUS_BITE,           DEATH_MURDER_MONSTER,              DEATH_MONSTER_FIRST) \
 +      DEATHTYPE(DEATH_MONSTER_CERBERUS_JUMP,  DEATH_SELF_MON_CERBERUS_JUMP,           DEATH_MURDER_MONSTER,              NORMAL_POS) \
 +      DEATHTYPE(DEATH_MONSTER_ANIMUS,                 DEATH_SELF_MON_ANIMUS,                          DEATH_MURDER_MONSTER,              NORMAL_POS) \
 +      DEATHTYPE(DEATH_MONSTER_STINGRAY,               DEATH_SELF_MON_STINGRAY,                        DEATH_MURDER_MONSTER,              NORMAL_POS) \
 +      DEATHTYPE(DEATH_MONSTER_KNIGHT_CRUSH,   DEATH_SELF_MON_KNIGHT_CRUSH,            DEATH_MURDER_MONSTER,              NORMAL_POS) \
 +      DEATHTYPE(DEATH_MONSTER_KNIGHT_FBALL,   DEATH_SELF_MON_KNIGHT_FBALL,            DEATH_MURDER_MONSTER,              NORMAL_POS) \
 +      DEATHTYPE(DEATH_MONSTER_KNIGHT_INFERNO, DEATH_SELF_MON_KNIGHT_INFERNO,          DEATH_MURDER_MONSTER,              NORMAL_POS) \
 +      DEATHTYPE(DEATH_MONSTER_KNIGHT_MELEE,   DEATH_SELF_MON_KNIGHT_MELEE,            DEATH_MURDER_MONSTER,              NORMAL_POS) \
 +      DEATHTYPE(DEATH_MONSTER_KNIGHT_SPIKE,   DEATH_SELF_MON_KNIGHT_SPIKE,            DEATH_MURDER_MONSTER,              NORMAL_POS) \
 +      DEATHTYPE(DEATH_MONSTER_BRUISER,                DEATH_SELF_MON_BRUISER,                         DEATH_MURDER_MONSTER,              NORMAL_POS) \
 +      DEATHTYPE(DEATH_MONSTER_BRUTE_BLADE,    DEATH_SELF_MON_BRUTE_BLADE,                     DEATH_MURDER_MONSTER,              NORMAL_POS) \
 +      DEATHTYPE(DEATH_MONSTER_BRUTE_GRENADE,  DEATH_SELF_MON_BRUTE_GRENADE,           DEATH_MURDER_MONSTER,              NORMAL_POS) \
 +      DEATHTYPE(DEATH_MONSTER_BRUTE_UZI,              DEATH_SELF_MON_BRUTE_UZI,                       DEATH_MURDER_MONSTER,              NORMAL_POS) \
 +      DEATHTYPE(DEATH_MONSTER_MAGE,                   DEATH_SELF_MON_MAGE,                            DEATH_MURDER_MONSTER,              NORMAL_POS) \
 +      DEATHTYPE(DEATH_MONSTER_SHAMBLER_CLAW,  DEATH_SELF_MON_SHAMBLER_CLAW,           DEATH_MURDER_MONSTER,              NORMAL_POS) \
 +      DEATHTYPE(DEATH_MONSTER_SHAMBLER_SMASH, DEATH_SELF_MON_SHAMBLER_SMASH,          DEATH_MURDER_MONSTER,              NORMAL_POS) \
 +      DEATHTYPE(DEATH_MONSTER_SHAMBLER_ZAP,   DEATH_SELF_MON_SHAMBLER_ZAP,            DEATH_MURDER_MONSTER,              NORMAL_POS) \
 +      DEATHTYPE(DEATH_MONSTER_SPIDER,                 DEATH_SELF_MON_SPIDER,                          DEATH_MURDER_MONSTER,              NORMAL_POS) \
 +      DEATHTYPE(DEATH_MONSTER_SPIDER_FIRE,    DEATH_SELF_MON_SPIDER_FIRE,                     DEATH_MURDER_MONSTER,              NORMAL_POS) \
 +      DEATHTYPE(DEATH_MONSTER_SLIME,                  DEATH_SELF_MON_SLIME,                           DEATH_MURDER_MONSTER,              NORMAL_POS) \
 +      DEATHTYPE(DEATH_MONSTER_WYVERN,                 DEATH_SELF_MON_WYVERN,                          DEATH_MURDER_MONSTER,              NORMAL_POS) \
 +      DEATHTYPE(DEATH_MONSTER_ZOMBIE_JUMP,    DEATH_SELF_MON_ZOMBIE_JUMP,                     DEATH_MURDER_MONSTER,              NORMAL_POS) \
 +      DEATHTYPE(DEATH_MONSTER_ZOMBIE_MELEE,   DEATH_SELF_MON_ZOMBIE_MELEE,            DEATH_MURDER_MONSTER,              DEATH_MONSTER_LAST) \
        DEATHTYPE(DEATH_NADE,                                   DEATH_SELF_NADE,                                        DEATH_MURDER_NADE,                         NORMAL_POS) \
        DEATHTYPE(DEATH_NOAMMO,                 DEATH_SELF_NOAMMO,                  NO_MSG,                        NORMAL_POS) \
        DEATHTYPE(DEATH_ROT,                    DEATH_SELF_ROT,                     NO_MSG,                        NORMAL_POS) \
@@@ -96,14 -73,12 +96,12 @@@ entity deathtypes[DT_MAX]
                deathtypes[(name - DT_FIRST)] = deathent; \
                deathent.classname = "deathtype"; \
                deathent.nent_name = #name; \
-               #if (msg_death != NO_MSG) \
+               if (msg_death != NO_MSG) \
                        deathent.death_msgself = msg_multi_notifs[msg_death - 1]; \
-               #endif \
-               #if (msg_death_by != NO_MSG) \
+               if (msg_death_by != NO_MSG) \
                        deathent.death_msgmurder = msg_multi_notifs[msg_death_by - 1]; \
-               #endif \
        } \
-       ACCUMULATE_FUNCTION(RegisterDeathtypes, RegisterDeathtype_##name)
+       ACCUMULATE_FUNCTION(RegisterDeathtypes, RegisterDeathtype_##name);
  
  DEATHTYPES
  #undef DEATHTYPE
  #define DEATH_ISSPECIAL(t)            ((t) >= DEATH_SPECIAL_START)
  #define DEATH_ISVEHICLE(t)            ((t) >= DEATH_VHFIRST && (t) <= DEATH_VHLAST)
  #define DEATH_ISTURRET(t)             ((t) >= DEATH_TURRET_FIRST && (t) <= DEATH_TURRET_LAST)
 +#define DEATH_ISMONSTER(t)                      ((t) >= DEATH_MONSTER_FIRST && (t) <= DEATH_MONSTER_LAST)
  #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))
diff --combined qcsrc/common/mapinfo.qh
index d2a9409e310213df929f572f6713558d73e74e01,40fea4fc284f5eba57bda906a25b91d929b726e3..4e3e81b66d5743a54cb03db2aa326505b1655610
@@@ -33,54 -33,51 +33,54 @@@ entity MapInfo_Type_last
  #define IS_GAMETYPE(NAME) \
        (MapInfo_LoadedGametype == MAPINFO_TYPE_##NAME)
  
- REGISTER_GAMETYPE(_("Deathmatch"),dm,g_dm,DEATHMATCH,"timelimit=20 pointlimit=30 leadlimit=0")
+ REGISTER_GAMETYPE(_("Deathmatch"),dm,g_dm,DEATHMATCH,"timelimit=20 pointlimit=30 leadlimit=0");
  #define g_dm IS_GAMETYPE(DEATHMATCH)
  
- REGISTER_GAMETYPE(_("Last Man Standing"),lms,g_lms,LMS,"timelimit=20 lives=9 leadlimit=0")
+ REGISTER_GAMETYPE(_("Last Man Standing"),lms,g_lms,LMS,"timelimit=20 lives=9 leadlimit=0");
  #define g_lms IS_GAMETYPE(LMS)
  
- REGISTER_GAMETYPE(_("Arena"),arena,g_arena,ARENA,"timelimit=20 pointlimit=10 leadlimit=0")
+ REGISTER_GAMETYPE(_("Arena"),arena,g_arena,ARENA,"timelimit=20 pointlimit=10 leadlimit=0");
  #define g_arena IS_GAMETYPE(ARENA)
  
- REGISTER_GAMETYPE(_("Race"),rc,g_race,RACE,"timelimit=20 qualifying_timelimit=5 laplimit=7 teamlaplimit=15 leadlimit=0")
+ REGISTER_GAMETYPE(_("Race"),rc,g_race,RACE,"timelimit=20 qualifying_timelimit=5 laplimit=7 teamlaplimit=15 leadlimit=0");
  #define g_race IS_GAMETYPE(RACE)
  
- REGISTER_GAMETYPE(_("Race CTS"),cts,g_cts,CTS,"timelimit=20 skill=-1")
+ REGISTER_GAMETYPE(_("Race CTS"),cts,g_cts,CTS,"timelimit=20 skill=-1");
  #define g_cts IS_GAMETYPE(CTS)
  
- REGISTER_GAMETYPE(_("Team Deathmatch"),tdm,g_tdm,TEAM_DEATHMATCH,"timelimit=20 pointlimit=50 teams=2 leadlimit=0")
+ REGISTER_GAMETYPE(_("Team Deathmatch"),tdm,g_tdm,TEAM_DEATHMATCH,"timelimit=20 pointlimit=50 teams=2 leadlimit=0");
  #define g_tdm IS_GAMETYPE(TEAM_DEATHMATCH)
  
- REGISTER_GAMETYPE(_("Capture the Flag"),ctf,g_ctf,CTF,"timelimit=20 caplimit=10 leadlimit=0")
+ REGISTER_GAMETYPE(_("Capture the Flag"),ctf,g_ctf,CTF,"timelimit=20 caplimit=10 leadlimit=0");
  #define g_ctf IS_GAMETYPE(CTF)
  
- REGISTER_GAMETYPE(_("Clan Arena"),ca,g_ca,CA,"timelimit=20 pointlimit=10 leadlimit=0")
+ REGISTER_GAMETYPE(_("Clan Arena"),ca,g_ca,CA,"timelimit=20 pointlimit=10 leadlimit=0");
  #define g_ca IS_GAMETYPE(CA)
  
- REGISTER_GAMETYPE(_("Domination"),dom,g_domination,DOMINATION,"timelimit=20 pointlimit=200 teams=2 leadlimit=0")
+ REGISTER_GAMETYPE(_("Domination"),dom,g_domination,DOMINATION,"timelimit=20 pointlimit=200 teams=2 leadlimit=0");
  #define g_domination IS_GAMETYPE(DOMINATION)
  
- REGISTER_GAMETYPE(_("Key Hunt"),kh,g_keyhunt,KEYHUNT,"timelimit=20 pointlimit=1000 teams=3 leadlimit=0")
+ REGISTER_GAMETYPE(_("Key Hunt"),kh,g_keyhunt,KEYHUNT,"timelimit=20 pointlimit=1000 teams=3 leadlimit=0");
  #define g_keyhunt IS_GAMETYPE(KEYHUNT)
  
- REGISTER_GAMETYPE(_("Assault"),as,g_assault,ASSAULT,"timelimit=20")
+ REGISTER_GAMETYPE(_("Assault"),as,g_assault,ASSAULT,"timelimit=20");
  #define g_assault IS_GAMETYPE(ASSAULT)
  
- REGISTER_GAMETYPE(_("Onslaught"),ons,g_onslaught,ONSLAUGHT,"timelimit=20")
+ REGISTER_GAMETYPE(_("Onslaught"),ons,g_onslaught,ONSLAUGHT,"timelimit=20");
  #define g_onslaught IS_GAMETYPE(ONSLAUGHT)
  
- REGISTER_GAMETYPE(_("Nexball"),nb,g_nexball,NEXBALL,"timelimit=20 pointlimit=5 leadlimit=0")
+ REGISTER_GAMETYPE(_("Nexball"),nb,g_nexball,NEXBALL,"timelimit=20 pointlimit=5 leadlimit=0");
  #define g_nexball IS_GAMETYPE(NEXBALL)
  
- REGISTER_GAMETYPE(_("Freeze Tag"),ft,g_freezetag,FREEZETAG,"timelimit=20 pointlimit=10 teams=2 leadlimit=0")
+ REGISTER_GAMETYPE(_("Freeze Tag"),ft,g_freezetag,FREEZETAG,"timelimit=20 pointlimit=10 teams=2 leadlimit=0");
  #define g_freezetag IS_GAMETYPE(FREEZETAG)
  
- REGISTER_GAMETYPE(_("Keepaway"),ka,g_keepaway,KEEPAWAY,"timelimit=20 pointlimit=30")
+ REGISTER_GAMETYPE(_("Keepaway"),ka,g_keepaway,KEEPAWAY,"timelimit=20 pointlimit=30");
  #define g_keepaway IS_GAMETYPE(KEEPAWAY)
  
- REGISTER_GAMETYPE(_("Invasion"),invasion,g_invasion,INVASION,"pointlimit=5")
++REGISTER_GAMETYPE(_("Invasion"),invasion,g_invasion,INVASION,"pointlimit=5");
 +#define g_invasion IS_GAMETYPE(INVASION)
 +
  const float MAPINFO_FEATURE_WEAPONS       = 1; // not defined for minstagib-only maps
  const float MAPINFO_FEATURE_VEHICLES      = 2;
  const float MAPINFO_FEATURE_TURRETS       = 4;
index 61e2e536453840c283a1fb026906f781e7567b8b,0000000000000000000000000000000000000000..e9a942b45790470f67dc690dd2e48e90d25c1950
mode 100644,000000..100644
--- /dev/null
@@@ -1,82 -1,0 +1,82 @@@
- ACCUMULATE_FUNCTION(RegisterMonsters, register_monsters_done)
 +// monster requests
 +#define MR_SETUP          1 // (SERVER) setup monster data
 +#define MR_THINK                2 // (SERVER) logic to run every frame
 +#define MR_DEATH          3 // (SERVER) called when monster dies
 +#define MR_PRECACHE       4 // (BOTH) precaches models/sounds used by this monster
 +#define MR_CONFIG         5 // (ALL)
 +
 +// functions:
 +entity get_monsterinfo(float id);
 +
 +// special spawn flags
 +const float MONSTER_RESPAWN_DEATHPOINT = 16; // re-spawn where we died
 +const float MONSTER_TYPE_FLY = 32;
 +const float MONSTER_TYPE_SWIM = 64;
 +const float MONSTER_SIZE_BROKEN = 128; // TODO: remove when bad models are replaced
 +const float MON_FLAG_SUPERMONSTER = 256; // incredibly powerful monster
 +const float MON_FLAG_RANGED = 512; // monster shoots projectiles
 +const float MON_FLAG_MELEE = 1024;
 +
 +// entity properties of monsterinfo:
 +.float monsterid; // MON_...
 +.string netname; // short name
 +.string monster_name; // human readable name
 +.float(float) monster_func; // m_...
 +.string mdl; // currently a copy of the model
 +.string model; // full name of model
 +.float spawnflags;
 +.vector mins, maxs; // monster hitbox size
 +
 +// other useful macros
 +#define MON_ACTION(monstertype,mrequest) (get_monsterinfo(monstertype)).monster_func(mrequest)
 +#define M_NAME(monstertype) (get_monsterinfo(monstertype)).monster_name
 +
 +// =====================
 +//  Monster Registration
 +// =====================
 +
 +float m_null(float dummy);
 +void register_monster(float id, float(float) func, float monsterflags, vector min_s, vector max_s, string modelname, string shortname, string mname);
 +void register_monsters_done();
 +
 +const float MON_MAXCOUNT = 24;
 +#define MON_FIRST 1
 +float MON_COUNT;
 +float MON_LAST;
 +
 +#define REGISTER_MONSTER_2(id,func,monsterflags,min_s,max_s,modelname,shortname,mname) \
 +      float id; \
 +      float func(float); \
 +      void RegisterMonsters_##id() \
 +      { \
 +              MON_LAST = (id = MON_FIRST + MON_COUNT); \
 +              ++MON_COUNT; \
 +              register_monster(id,func,monsterflags,min_s,max_s,modelname,shortname,mname); \
 +      } \
 +      ACCUMULATE_FUNCTION(RegisterMonsters, RegisterMonsters_##id)
 +#ifdef MENUQC
 +#define REGISTER_MONSTER(id,func,monsterflags,min_s,max_s,modelname,shortname,mname) \
 +      REGISTER_MONSTER_2(MON_##id,m_null,monsterflags,min_s,max_s,modelname,shortname,mname)
 +#else
 +#define REGISTER_MONSTER(id,func,monsterflags,min_s,max_s,modelname,shortname,mname) \
 +      REGISTER_MONSTER_2(MON_##id,func,monsterflags,min_s,max_s,modelname,shortname,mname)
 +#endif
 +
 +#define MON_DUPECHECK(dupecheck,cvar) \
 +      #ifndef dupecheck \
 +              #define dupecheck \
 +              float cvar; \
 +      #else \
 +              #error DUPLICATE MONSTER CVAR: cvar \
 +      #endif
 +
 +#define MON_ADD_CVAR(monster,name) \
 +              MON_DUPECHECK(MON_CVAR_##monster##_##name, autocvar_g_monster_##monster##_##name)
 +
 +#define MON_CVAR(monster,name) autocvar_g_monster_##monster##_##name
 +
 +#include "all.qh"
 +
 +#undef MON_ADD_CVAR
 +#undef REGISTER_MONSTER
++ACCUMULATE_FUNCTION(RegisterMonsters, register_monsters_done);
index 1a58afb78ae00b9bbc9981b9583d4a883ceaad44,0214ec3d6122c2e596ca84b8e8b8c92f524d2f6a..f078e69b3422b0024f16b5b91e998fe59e4ca9d1
@@@ -217,15 -217,21 +217,21 @@@ void Send_Notification_WOCOVA
        If you send a notification with mismatching arguments, Send_Notification() will error.
  */
  
- #define MULTITEAM_ANNCE(default,prefix,teams,channel,sound,volume,position) \
+ #define MULTITEAM_ANNCE2(default,prefix,channel,sound,volume,position) \
+       MSG_ANNCE_NOTIF(default, prefix##RED, channel, sprintf(sound, strtolower(STATIC_NAME_TEAM_1)), volume, position) \
+       MSG_ANNCE_NOTIF(default, prefix##BLUE, channel, sprintf(sound, strtolower(STATIC_NAME_TEAM_2)), volume, position)
+ #define MULTITEAM_ANNCE3(default,prefix,channel,sound,volume,position) \
        MSG_ANNCE_NOTIF(default, prefix##RED, channel, sprintf(sound, strtolower(STATIC_NAME_TEAM_1)), volume, position) \
        MSG_ANNCE_NOTIF(default, prefix##BLUE, channel, sprintf(sound, strtolower(STATIC_NAME_TEAM_2)), volume, position) \
-       #if teams >= 3 \
-               MSG_ANNCE_NOTIF(default, prefix##YELLOW, channel, sprintf(sound, strtolower(STATIC_NAME_TEAM_3)), volume, position) \
-       #endif \
-       #if teams >= 4 \
-               MSG_ANNCE_NOTIF(default, prefix##PINK, channel, sprintf(sound, strtolower(STATIC_NAME_TEAM_4)), volume, position) \
-       #endif
+       MSG_ANNCE_NOTIF(default, prefix##YELLOW, channel, sprintf(sound, strtolower(STATIC_NAME_TEAM_3)), volume, position)
+ #define MULTITEAM_ANNCE4(default,prefix,channel,sound,volume,position) \
+       MSG_ANNCE_NOTIF(default, prefix##RED, channel, sprintf(sound, strtolower(STATIC_NAME_TEAM_1)), volume, position) \
+       MSG_ANNCE_NOTIF(default, prefix##BLUE, channel, sprintf(sound, strtolower(STATIC_NAME_TEAM_2)), volume, position) \
+       MSG_ANNCE_NOTIF(default, prefix##YELLOW, channel, sprintf(sound, strtolower(STATIC_NAME_TEAM_3)), volume, position) \
+       MSG_ANNCE_NOTIF(default, prefix##PINK, channel, sprintf(sound, strtolower(STATIC_NAME_TEAM_4)), volume, position)
+ #define MULTITEAM_ANNCE(default,prefix,teams,channel,sound,volume,position) \
+       MSG_ANNCE_NOTIF_##teams(default,prefix,channel,sound,volume,position) \
  #define MSG_ANNCE_NOTIFICATIONS \
        MSG_ANNCE_NOTIF(1, ANNCE_ACHIEVEMENT_AIRSHOT,       CH_INFO, "airshot",           VOL_BASEVOICE, ATTEN_NONE) \
        MSG_ANNCE_NOTIF(1, ANNCE_ACHIEVEMENT_AMAZING,       CH_INFO, "amazing",           VOL_BASEVOICE, ATTEN_NONE) \
        MSG_ANNCE_NOTIF(2, ANNCE_VOTE_CALL,                 CH_INFO, "votecall",          VOL_BASEVOICE, ATTEN_NONE) \
        MSG_ANNCE_NOTIF(2, ANNCE_VOTE_FAIL,                 CH_INFO, "votefail",          VOL_BASEVOICE, ATTEN_NONE)
  
- #define MULTITEAM_INFO(default,prefix,teams,strnum,flnum,args,hudargs,icon,normal,gentle) \
+ #define MULTITEAM_INFO2(default,prefix,strnum,flnum,args,hudargs,icon,normal,gentle) \
+       MSG_INFO_NOTIF(default, prefix##RED, strnum, flnum, args, hudargs, sprintf(icon, strtolower(STATIC_NAME_TEAM_1)), TCR(normal, COL_TEAM_1, strtoupper(NAME_TEAM_1)), TCR(gentle, COL_TEAM_1, strtoupper(NAME_TEAM_1))) \
+       MSG_INFO_NOTIF(default, prefix##BLUE, strnum, flnum, args, hudargs, sprintf(icon, strtolower(STATIC_NAME_TEAM_2)), TCR(normal, COL_TEAM_2, strtoupper(NAME_TEAM_2)), TCR(gentle, COL_TEAM_2, strtoupper(NAME_TEAM_2)))
+ #define MULTITEAM_INFO3(default,prefix,strnum,flnum,args,hudargs,icon,normal,gentle) \
        MSG_INFO_NOTIF(default, prefix##RED, strnum, flnum, args, hudargs, sprintf(icon, strtolower(STATIC_NAME_TEAM_1)), TCR(normal, COL_TEAM_1, strtoupper(NAME_TEAM_1)), TCR(gentle, COL_TEAM_1, strtoupper(NAME_TEAM_1))) \
        MSG_INFO_NOTIF(default, prefix##BLUE, strnum, flnum, args, hudargs, sprintf(icon, strtolower(STATIC_NAME_TEAM_2)), TCR(normal, COL_TEAM_2, strtoupper(NAME_TEAM_2)), TCR(gentle, COL_TEAM_2, strtoupper(NAME_TEAM_2))) \
-       #if teams >= 3 \
-               MSG_INFO_NOTIF(default, prefix##YELLOW, strnum, flnum, args, hudargs, sprintf(icon, strtolower(STATIC_NAME_TEAM_3)), TCR(normal, COL_TEAM_3, strtoupper(NAME_TEAM_3)), TCR(gentle, COL_TEAM_3, strtoupper(NAME_TEAM_3))) \
-       #endif \
-       #if teams >= 4 \
-               MSG_INFO_NOTIF(default, prefix##PINK, strnum, flnum, args, hudargs, sprintf(icon, strtolower(STATIC_NAME_TEAM_4)), TCR(normal, COL_TEAM_4, strtoupper(NAME_TEAM_4)), TCR(gentle, COL_TEAM_4, strtoupper(NAME_TEAM_4))) \
-       #endif
+       MSG_INFO_NOTIF(default, prefix##YELLOW, strnum, flnum, args, hudargs, sprintf(icon, strtolower(STATIC_NAME_TEAM_3)), TCR(normal, COL_TEAM_3, strtoupper(NAME_TEAM_3)), TCR(gentle, COL_TEAM_3, strtoupper(NAME_TEAM_3)))
+ #define MULTITEAM_INFO4(default,prefix,strnum,flnum,args,hudargs,icon,normal,gentle) \
+       MSG_INFO_NOTIF(default, prefix##RED, strnum, flnum, args, hudargs, sprintf(icon, strtolower(STATIC_NAME_TEAM_1)), TCR(normal, COL_TEAM_1, strtoupper(NAME_TEAM_1)), TCR(gentle, COL_TEAM_1, strtoupper(NAME_TEAM_1))) \
+       MSG_INFO_NOTIF(default, prefix##BLUE, strnum, flnum, args, hudargs, sprintf(icon, strtolower(STATIC_NAME_TEAM_2)), TCR(normal, COL_TEAM_2, strtoupper(NAME_TEAM_2)), TCR(gentle, COL_TEAM_2, strtoupper(NAME_TEAM_2))) \
+       MSG_INFO_NOTIF(default, prefix##YELLOW, strnum, flnum, args, hudargs, sprintf(icon, strtolower(STATIC_NAME_TEAM_3)), TCR(normal, COL_TEAM_3, strtoupper(NAME_TEAM_3)), TCR(gentle, COL_TEAM_3, strtoupper(NAME_TEAM_3))) \
+       MSG_INFO_NOTIF(default, prefix##PINK, strnum, flnum, args, hudargs, sprintf(icon, strtolower(STATIC_NAME_TEAM_4)), TCR(normal, COL_TEAM_4, strtoupper(NAME_TEAM_4)), TCR(gentle, COL_TEAM_4, strtoupper(NAME_TEAM_4)))
+ #define MULTITEAM_INFO(default,prefix,teams,strnum,flnum,args,hudargs,icon,normal,gentle) \
+       MULTITEAM_INFO##teams(default,prefix,strnum,flnum,args,hudargs,icon,normal,gentle)
  #define MSG_INFO_NOTIFICATIONS \
        MULTITEAM_INFO(1, INFO_CTF_CAPTURE_, 2,                1, 0, "s1", "s1",                        "notify_%s_captured",   _("^BG%s^BG captured the ^TC^TT^BG flag"), "") \
        MULTITEAM_INFO(1, INFO_CTF_CAPTURE_BROKEN_, 2,         2, 2, "s1 f1p2dec s2 f2p2dec", "s1",     "notify_%s_captured",   _("^BG%s^BG captured the ^TC^TT^BG flag in ^F1%s^BG seconds, breaking ^BG%s^BG's previous record of ^F2%s^BG seconds"), "") \
        MSG_INFO_NOTIF(1, INFO_DEATH_MURDER_FALL,              3, 2, "spree_inf s1 s2 s3loc spree_end", "s2 s1",  "notify_fall",          _("^BG%s%s^K1 was grounded by ^BG%s^K1%s%s"), "") \
        MSG_INFO_NOTIF(1, INFO_DEATH_MURDER_FIRE,              3, 2, "spree_inf s1 s2 s3loc spree_end", "s2 s1",  "notify_death",         _("^BG%s%s^K1 was burnt up into a crisp by ^BG%s^K1%s%s"), _("^BG%s%s^K1 felt a little hot from ^BG%s^K1's fire^K1%s%s")) \
        MSG_INFO_NOTIF(1, INFO_DEATH_MURDER_LAVA,              3, 2, "spree_inf s1 s2 s3loc spree_end", "s2 s1",  "notify_lava",          _("^BG%s%s^K1 was cooked by ^BG%s^K1%s%s"), "") \
 +      MSG_INFO_NOTIF(1, INFO_DEATH_MURDER_MONSTER,           3, 2, "spree_inf s1 s2 s3loc spree_end", "",       "",                             _("^BG%s%s^K1 was pushed infront of a monster by ^BG%s^K1%s%s"), "") \
        MSG_INFO_NOTIF(1, INFO_DEATH_MURDER_NADE,              3, 2, "spree_inf s1 s2 s3loc spree_end", "s2 s1",  "notify_death",         _("^BG%s%s^K1 was blown up by ^BG%s^K1's Nade%s%s"), "") \
        MSG_INFO_NOTIF(1, INFO_DEATH_MURDER_SHOOTING_STAR,     3, 2, "spree_inf s1 s2 s3loc spree_end", "s2 s1",  "notify_shootingstar",  _("^BG%s%s^K1 was shot into space by ^BG%s^K1%s%s"), "") \
        MSG_INFO_NOTIF(1, INFO_DEATH_MURDER_SLIME,             3, 2, "spree_inf s1 s2 s3loc spree_end", "s2 s1",  "notify_slime",         _("^BG%s%s^K1 was slimed by ^BG%s^K1%s%s"), "") \
        MSG_INFO_NOTIF(1, INFO_DEATH_SELF_GENERIC,             2, 1, "s1 s2loc spree_lost", "s1",       "notify_selfkill",      _("^BG%s^K1 died%s%s"), "") \
        MSG_INFO_NOTIF(1, INFO_DEATH_SELF_LAVA,                2, 1, "s1 s2loc spree_lost", "s1",       "notify_lava",          _("^BG%s^K1 turned into hot slag%s%s"), _("^BG%s^K1 found a hot place%s%s")) \
        MSG_INFO_NOTIF(1, INFO_DEATH_SELF_NADE,                2, 1, "s1 s2loc spree_lost", "s1",       "notify_death",         _("^BG%s^K1 mastered the art of self-nading%s%s"), "") \
 +      MSG_INFO_NOTIF(1, INFO_DEATH_SELF_MON_CERBERUS_BITE,   2, 1, "s1 s2loc spree_lost", "s1",               "notify_death",                 _("^BG%s^K1 was mauled by a Cerberus%s%s"), "") \
 +      MSG_INFO_NOTIF(1, INFO_DEATH_SELF_MON_CERBERUS_JUMP,   2, 1, "s1 s2loc spree_lost", "s1",               "notify_death",                 _("^BG%s^K1 didn't see the pouncing Cerberus%s%s"), "") \
 +      MSG_INFO_NOTIF(1, INFO_DEATH_SELF_MON_ANIMUS,          2, 1, "s1 s2loc spree_lost", "s1",               "notify_death",                 _("^BG%s^K1 was eviscerated by an Animus%s%s"), "") \
 +      MSG_INFO_NOTIF(1, INFO_DEATH_SELF_MON_STINGRAY,        2, 1, "s1 s2loc spree_lost", "s1",               "notify_death",                 _("^BG%s^K1 was fatally wounded by a Stingray%s%s"), "") \
 +      MSG_INFO_NOTIF(1, INFO_DEATH_SELF_MON_KNIGHT_CRUSH,    2, 1, "s1 s2loc spree_lost", "s1",               "notify_death",                 _("^BG%s^K1 was crushed by a pouncing Knight%s%s"), "") \
 +      MSG_INFO_NOTIF(1, INFO_DEATH_SELF_MON_KNIGHT_FBALL,    2, 1, "s1 s2loc spree_lost", "s1",               "notify_death",                 _("^BG%s^K1 was turned to ash by a Knight%s%s"), "") \
 +      MSG_INFO_NOTIF(1, INFO_DEATH_SELF_MON_KNIGHT_INFERNO,  2, 1, "s1 s2loc spree_lost", "s1",               "notify_death",                 _("^BG%s^K1 was burned to death by a Knight%s%s"), "") \
 +      MSG_INFO_NOTIF(1, INFO_DEATH_SELF_MON_KNIGHT_MELEE,    2, 1, "s1 s2loc spree_lost", "s1",               "notify_death",                 _("^BG%s^K1 was slain by a Knight%s%s"), "") \
 +      MSG_INFO_NOTIF(1, INFO_DEATH_SELF_MON_KNIGHT_SPIKE,    2, 1, "s1 s2loc spree_lost", "s1",               "notify_death",                 _("^BG%s^K1 was cursed by a Knight%s%s"), "") \
 +      MSG_INFO_NOTIF(1, INFO_DEATH_SELF_MON_BRUISER,             2, 1, "s1 s2loc spree_lost", "s1",           "notify_death",                 _("^BG%s^K1 was beaten in a fistfight by a Bruiser%s%s"), "") \
 +      MSG_INFO_NOTIF(1, INFO_DEATH_SELF_MON_BRUTE_BLADE,     2, 1, "s1 s2loc spree_lost", "s1",               "notify_death",                 _("^BG%s^K1 was cut down by a Brute%s%s"), "") \
 +      MSG_INFO_NOTIF(1, INFO_DEATH_SELF_MON_BRUTE_GRENADE,   2, 1, "s1 s2loc spree_lost", "s1",               "notify_death",                 _("^BG%s^K1 almost dodged a Brute's grenade%s%s"), "") \
 +      MSG_INFO_NOTIF(1, INFO_DEATH_SELF_MON_BRUTE_UZI,           2, 1, "s1 s2loc spree_lost", "s1",           "notify_death",                 _("^BG%s^K1 was nailed by a Brute%s%s"), "") \
 +      MSG_INFO_NOTIF(1, INFO_DEATH_SELF_MON_MAGE,                2, 1, "s1 s2loc spree_lost", "s1",           "notify_death",                 _("^BG%s^K1 was exploded by a Mage%s%s"), "") \
 +      MSG_INFO_NOTIF(1, INFO_DEATH_SELF_MON_SHAMBLER_CLAW,   2, 1, "s1 s2loc spree_lost", "s1",               "notify_death",                 _("^BG%s^K1's innards became outwards by a Shambler%s%s"), "") \
 +      MSG_INFO_NOTIF(1, INFO_DEATH_SELF_MON_SHAMBLER_SMASH,  2, 1, "s1 s2loc spree_lost", "s1",               "notify_death",                 _("^BG%s^K1 was smashed by a Shambler%s%s"), "") \
 +      MSG_INFO_NOTIF(1, INFO_DEATH_SELF_MON_SHAMBLER_ZAP,    2, 1, "s1 s2loc spree_lost", "s1",               "notify_death",                 _("^BG%s^K1 was zapped to death by a Shambler%s%s"), "") \
 +      MSG_INFO_NOTIF(1, INFO_DEATH_SELF_MON_SPIDER,              2, 1, "s1 s2loc spree_lost", "s1",           "notify_death",                 _("^BG%s^K1 was bitten by a Spider%s%s"), "") \
 +      MSG_INFO_NOTIF(1, INFO_DEATH_SELF_MON_SPIDER_FIRE,     2, 1, "s1 s2loc spree_lost", "s1",               "notify_death",                 _("^BG%s^K1 was incinerated by a Spider%s%s"), "") \
 +      MSG_INFO_NOTIF(1, INFO_DEATH_SELF_MON_SLIME,           2, 1, "s1 s2loc spree_lost", "s1",               "notify_death",                 _("^BG%s^K1 was blown up by a Slime%s%s"), "") \
 +      MSG_INFO_NOTIF(1, INFO_DEATH_SELF_MON_WYVERN,          2, 1, "s1 s2loc spree_lost", "s1",               "notify_death",                 _("^BG%s^K1 was fireballed by a Wyvern%s%s"), "") \
 +      MSG_INFO_NOTIF(1, INFO_DEATH_SELF_MON_ZOMBIE_JUMP,     2, 1, "s1 s2loc spree_lost", "s1",               "notify_death",                 _("^BG%s^K1 joins the Zombies%s%s"), "") \
 +      MSG_INFO_NOTIF(1, INFO_DEATH_SELF_MON_ZOMBIE_MELEE,    2, 1, "s1 s2loc spree_lost", "s1",               "notify_death",                 _("^BG%s^K1 was given kung fu lessons by a Zombie%s%s"), "") \
        MSG_INFO_NOTIF(1, INFO_DEATH_SELF_NOAMMO,              2, 1, "s1 s2loc spree_lost", "s1",       "notify_outofammo",     _("^BG%s^K1 died%s%s. What's the point of living without ammo?"), _("^BG%s^K1 ran out of ammo%s%s")) \
        MSG_INFO_NOTIF(1, INFO_DEATH_SELF_ROT,                 2, 1, "s1 s2loc spree_lost", "s1",       "notify_death",         _("^BG%s^K1 rotted away%s%s"), "") \
        MSG_INFO_NOTIF(1, INFO_DEATH_SELF_SHOOTING_STAR,       2, 1, "s1 s2loc spree_lost", "s1",       "notify_shootingstar",  _("^BG%s^K1 became a shooting star%s%s"), "") \
        MULTITEAM_INFO(1, INFO_KEYHUNT_PICKUP_, 4,             1, 0, "s1", "",                          "",                     _("^BG%s^BG picked up the ^TC^TT Key"), "") \
        MSG_INFO_NOTIF(1, INFO_LMS_FORFEIT,                    1, 0, "s1", "",                          "",                     _("^BG%s^F3 forfeited"), "") \
        MSG_INFO_NOTIF(1, INFO_LMS_NOLIVES,                    1, 0, "s1", "",                          "",                     _("^BG%s^F3 has no more lives left"), "") \
 +      MSG_INFO_NOTIF(1, INFO_MONSTERS_DISABLED,              0, 0, "", "",                            "",                     _("^BGMonsters are currently disabled"), "") \
        MSG_INFO_NOTIF(1, INFO_POWERUP_INVISIBILITY,           1, 0, "s1", "s1",                        "strength",             _("^BG%s^K1 picked up Invisibility"), "") \
        MSG_INFO_NOTIF(1, INFO_POWERUP_SHIELD,                 1, 0, "s1", "s1",                        "shield",               _("^BG%s^K1 picked up Shield"), "") \
        MSG_INFO_NOTIF(1, INFO_POWERUP_SPEED,                  1, 0, "s1", "s1",                        "shield",               _("^BG%s^K1 picked up Speed"), "") \
        MSG_INFO_NOTIF(1, INFO_WEAPON_UZI_MURDER_SNIPE,              3, 2, "spree_inf s1 s2 s3loc spree_end", "s2 s1",  "weaponuzi",              _("^BG%s%s^K1 was sniped by ^BG%s^K1's Machine Gun%s%s"), "") \
        MSG_INFO_NOTIF(1, INFO_WEAPON_UZI_MURDER_SPRAY,              3, 2, "spree_inf s1 s2 s3loc spree_end", "s2 s1",  "weaponuzi",              _("^BG%s%s^K1 was riddled full of holes by ^BG%s^K1's Machine Gun%s%s"), "") 
  
- #define MULTITEAM_CENTER(default,prefix,teams,strnum,flnum,args,cpid,durcnt,normal,gentle) \
+ #define MULTITEAM_CENTER2(default,prefix,strnum,flnum,args,cpid,durcnt,normal,gentle) \
+       MSG_CENTER_NOTIF(default, prefix##RED, strnum, flnum, args, cpid, durcnt, TCR(normal, COL_TEAM_1, strtoupper(NAME_TEAM_1)), TCR(gentle, COL_TEAM_1, strtoupper(NAME_TEAM_1))) \
+       MSG_CENTER_NOTIF(default, prefix##BLUE, strnum, flnum, args, cpid, durcnt, TCR(normal, COL_TEAM_2, strtoupper(NAME_TEAM_2)), TCR(gentle, COL_TEAM_2, strtoupper(NAME_TEAM_2)))
+ #define MULTITEAM_CENTER3(default,prefix,strnum,flnum,args,cpid,durcnt,normal,gentle) \
        MSG_CENTER_NOTIF(default, prefix##RED, strnum, flnum, args, cpid, durcnt, TCR(normal, COL_TEAM_1, strtoupper(NAME_TEAM_1)), TCR(gentle, COL_TEAM_1, strtoupper(NAME_TEAM_1))) \
        MSG_CENTER_NOTIF(default, prefix##BLUE, strnum, flnum, args, cpid, durcnt, TCR(normal, COL_TEAM_2, strtoupper(NAME_TEAM_2)), TCR(gentle, COL_TEAM_2, strtoupper(NAME_TEAM_2))) \
-       #if teams >= 3 \
-               MSG_CENTER_NOTIF(default, prefix##YELLOW, strnum, flnum, args, cpid, durcnt, TCR(normal, COL_TEAM_3, strtoupper(NAME_TEAM_3)), TCR(gentle, COL_TEAM_3, strtoupper(NAME_TEAM_3))) \
-       #endif \
-       #if teams >= 4 \
-               MSG_CENTER_NOTIF(default, prefix##PINK, strnum, flnum, args, cpid, durcnt, TCR(normal, COL_TEAM_4, strtoupper(NAME_TEAM_4)), TCR(gentle, COL_TEAM_4, strtoupper(NAME_TEAM_4))) \
-       #endif
+       MSG_CENTER_NOTIF(default, prefix##YELLOW, strnum, flnum, args, cpid, durcnt, TCR(normal, COL_TEAM_3, strtoupper(NAME_TEAM_3)), TCR(gentle, COL_TEAM_3, strtoupper(NAME_TEAM_3)))
+ #define MULTITEAM_CENTER4(default,prefix,strnum,flnum,args,cpid,durcnt,normal,gentle) \
+       MSG_CENTER_NOTIF(default, prefix##RED, strnum, flnum, args, cpid, durcnt, TCR(normal, COL_TEAM_1, strtoupper(NAME_TEAM_1)), TCR(gentle, COL_TEAM_1, strtoupper(NAME_TEAM_1))) \
+       MSG_CENTER_NOTIF(default, prefix##BLUE, strnum, flnum, args, cpid, durcnt, TCR(normal, COL_TEAM_2, strtoupper(NAME_TEAM_2)), TCR(gentle, COL_TEAM_2, strtoupper(NAME_TEAM_2))) \
+       MSG_CENTER_NOTIF(default, prefix##YELLOW, strnum, flnum, args, cpid, durcnt, TCR(normal, COL_TEAM_3, strtoupper(NAME_TEAM_3)), TCR(gentle, COL_TEAM_3, strtoupper(NAME_TEAM_3))) \
+       MSG_CENTER_NOTIF(default, prefix##PINK, strnum, flnum, args, cpid, durcnt, TCR(normal, COL_TEAM_4, strtoupper(NAME_TEAM_4)), TCR(gentle, COL_TEAM_4, strtoupper(NAME_TEAM_4)))
+ #define MULTITEAM_CENTER(default,prefix,teams,strnum,flnum,args,cpid,durcnt,normal,gentle) \
+       MULTITEAM_CENTER##teams(default,prefix,strnum,flnum,args,cpid,durcnt,normal,gentle)
  #define MSG_CENTER_NOTIFICATIONS \
        MSG_CENTER_NOTIF(1, CENTER_ASSAULT_ATTACKING,           0, 0, "",             CPID_ASSAULT_ROLE,   "0 0", _("^BGYou are attacking!"), "") \
        MSG_CENTER_NOTIF(1, CENTER_ASSAULT_DEFENDING,           0, 0, "",             CPID_ASSAULT_ROLE,   "0 0", _("^BGYou are defending!"), "") \
        MSG_CENTER_NOTIF(1, CENTER_DEATH_SELF_FIRE,             0, 0, "",             NO_CPID,             "0 0", _("^K1You got a little bit too crispy!"), _("^K1You felt a little too hot!")) \
        MSG_CENTER_NOTIF(1, CENTER_DEATH_SELF_GENERIC,          0, 0, "",             NO_CPID,             "0 0", _("^K1You killed your own dumb self!"), _("^K1You need to be more careful!")) \
        MSG_CENTER_NOTIF(1, CENTER_DEATH_SELF_LAVA,             0, 0, "",             NO_CPID,             "0 0", _("^K1You couldn't stand the heat!"), "") \
 +      MSG_CENTER_NOTIF(1, CENTER_DEATH_SELF_MONSTER,          0, 0, "",             NO_CPID,             "0 0", _("^K1You were killed by a monster!"), _("^K1You need to watch out for monsters!")) \
        MSG_CENTER_NOTIF(1, CENTER_DEATH_SELF_NADE,                             0, 0, "",                         NO_CPID,                         "0 0", _("^K1You forgot to put the pin back in!"), _("^K1Tastes like chicken!")) \
        MSG_CENTER_NOTIF(1, CENTER_DEATH_SELF_NOAMMO,           0, 0, "",             NO_CPID,             "0 0", _("^K1You were killed for running out of ammo..."), _("^K1You are respawning for running out of ammo...")) \
        MSG_CENTER_NOTIF(1, CENTER_DEATH_SELF_ROT,              0, 0, "",             NO_CPID,             "0 0", _("^K1You grew too old without taking your medicine"), _("^K1You need to preserve your health")) \
        MSG_CENTER_NOTIF(1, CENTER_TIMEOUT_BEGINNING,           0, 1, "",              CPID_TIMEOUT,          "1 f1", _("^F4Timeout begins in ^COUNT"), "") \
        MSG_CENTER_NOTIF(1, CENTER_TIMEOUT_ENDING,              0, 1, "",              CPID_TIMEOUT,          "1 f1", _("^F4Timeout ends in ^COUNT"), "")
  
- #define MULTITEAM_MULTI(default,prefix,teams,anncepre,infopre,centerpre) \
+ #define MULTITEAM_MULTI2(default,prefix,anncepre,infopre,centerpre) \
+       MSG_MULTI_NOTIF(default, prefix##RED, anncepre##RED, infopre##RED, centerpre##RED) \
+       MSG_MULTI_NOTIF(default, prefix##BLUE, anncepre##BLUE, infopre##BLUE, centerpre##BLUE)
+ #define MULTITEAM_MULTI3(default,prefix,anncepre,infopre,centerpre) \
        MSG_MULTI_NOTIF(default, prefix##RED, anncepre##RED, infopre##RED, centerpre##RED) \
        MSG_MULTI_NOTIF(default, prefix##BLUE, anncepre##BLUE, infopre##BLUE, centerpre##BLUE) \
-       #if teams >= 3 \
-               MSG_MULTI_NOTIF(default, prefix##YELLOW, anncepre##YELLOW, infopre##YELLOW, centerpre##YELLOW) \
-       #endif \
-       #if teams >= 4 \
-               MSG_MULTI_NOTIF(default, prefix##PINK, anncepre##PINK, infopre##PINK, centerpre##PINK) \
-       #endif
+       MSG_MULTI_NOTIF(default, prefix##YELLOW, anncepre##YELLOW, infopre##YELLOW, centerpre##YELLOW)
+ #define MULTITEAM_MULTI4(default,prefix,anncepre,infopre,centerpre) \
+       MSG_MULTI_NOTIF(default, prefix##RED, anncepre##RED, infopre##RED, centerpre##RED) \
+       MSG_MULTI_NOTIF(default, prefix##BLUE, anncepre##BLUE, infopre##BLUE, centerpre##BLUE) \
+       MSG_MULTI_NOTIF(default, prefix##YELLOW, anncepre##YELLOW, infopre##YELLOW, centerpre##YELLOW) \
+       MSG_MULTI_NOTIF(default, prefix##PINK, anncepre##PINK, infopre##PINK, centerpre##PINK)
+ #define MULTITEAM_MULTI(default,prefix,teams,anncepre,infopre,centerpre) \
+       MULTITEAM_MULTI##teams(default,prefix,anncepre,infopre,centerpre)
  #define MSG_MULTI_NOTIFICATIONS \
        MSG_MULTI_NOTIF(1, DEATH_MURDER_CHEAT,                   NO_MSG,        INFO_DEATH_MURDER_CHEAT,                   NO_MSG) \
        MSG_MULTI_NOTIF(1, DEATH_MURDER_DROWN,                   NO_MSG,        INFO_DEATH_MURDER_DROWN,                   NO_MSG) \
        MSG_MULTI_NOTIF(1, DEATH_MURDER_FALL,                    NO_MSG,        INFO_DEATH_MURDER_FALL,                    NO_MSG) \
        MSG_MULTI_NOTIF(1, DEATH_MURDER_FIRE,                    NO_MSG,        INFO_DEATH_MURDER_FIRE,                    NO_MSG) \
        MSG_MULTI_NOTIF(1, DEATH_MURDER_LAVA,                    NO_MSG,        INFO_DEATH_MURDER_LAVA,                    NO_MSG) \
 +      MSG_MULTI_NOTIF(1, DEATH_MURDER_MONSTER,                 NO_MSG,        INFO_DEATH_MURDER_MONSTER,                 CENTER_DEATH_SELF_MONSTER) \
        MSG_MULTI_NOTIF(1, DEATH_MURDER_NADE,                    NO_MSG,        INFO_DEATH_MURDER_NADE,                    NO_MSG) \
        MSG_MULTI_NOTIF(1, DEATH_MURDER_SHOOTING_STAR,           NO_MSG,        INFO_DEATH_MURDER_SHOOTING_STAR,           NO_MSG) \
        MSG_MULTI_NOTIF(1, DEATH_MURDER_SLIME,                   NO_MSG,        INFO_DEATH_MURDER_SLIME,                   NO_MSG) \
        MSG_MULTI_NOTIF(1, DEATH_SELF_FIRE,                      NO_MSG,        INFO_DEATH_SELF_FIRE,                      CENTER_DEATH_SELF_FIRE) \
        MSG_MULTI_NOTIF(1, DEATH_SELF_GENERIC,                   NO_MSG,        INFO_DEATH_SELF_GENERIC,                   CENTER_DEATH_SELF_GENERIC) \
        MSG_MULTI_NOTIF(1, DEATH_SELF_LAVA,                      NO_MSG,        INFO_DEATH_SELF_LAVA,                      CENTER_DEATH_SELF_LAVA) \
 +      MSG_MULTI_NOTIF(1, DEATH_SELF_MON_CERBERUS_BITE,                 NO_MSG,        INFO_DEATH_SELF_MON_CERBERUS_BITE,                 CENTER_DEATH_SELF_MONSTER) \
 +      MSG_MULTI_NOTIF(1, DEATH_SELF_MON_CERBERUS_JUMP,                 NO_MSG,        INFO_DEATH_SELF_MON_CERBERUS_JUMP,                 CENTER_DEATH_SELF_MONSTER) \
 +      MSG_MULTI_NOTIF(1, DEATH_SELF_MON_ANIMUS,                                NO_MSG,        INFO_DEATH_SELF_MON_ANIMUS,                                CENTER_DEATH_SELF_MONSTER) \
 +      MSG_MULTI_NOTIF(1, DEATH_SELF_MON_STINGRAY,                              NO_MSG,        INFO_DEATH_SELF_MON_STINGRAY,                      CENTER_DEATH_SELF_MONSTER) \
 +      MSG_MULTI_NOTIF(1, DEATH_SELF_MON_KNIGHT_CRUSH,                  NO_MSG,        INFO_DEATH_SELF_MON_KNIGHT_CRUSH,                  CENTER_DEATH_SELF_MONSTER) \
 +      MSG_MULTI_NOTIF(1, DEATH_SELF_MON_KNIGHT_FBALL,              NO_MSG,        INFO_DEATH_SELF_MON_KNIGHT_FBALL,              CENTER_DEATH_SELF_MONSTER) \
 +      MSG_MULTI_NOTIF(1, DEATH_SELF_MON_KNIGHT_INFERNO,                NO_MSG,        INFO_DEATH_SELF_MON_KNIGHT_INFERNO,            CENTER_DEATH_SELF_MONSTER) \
 +      MSG_MULTI_NOTIF(1, DEATH_SELF_MON_KNIGHT_MELEE,              NO_MSG,        INFO_DEATH_SELF_MON_KNIGHT_MELEE,              CENTER_DEATH_SELF_MONSTER) \
 +      MSG_MULTI_NOTIF(1, DEATH_SELF_MON_KNIGHT_SPIKE,              NO_MSG,        INFO_DEATH_SELF_MON_KNIGHT_SPIKE,              CENTER_DEATH_SELF_MONSTER) \
 +      MSG_MULTI_NOTIF(1, DEATH_SELF_MON_BRUISER,                               NO_MSG,        INFO_DEATH_SELF_MON_BRUISER,                       CENTER_DEATH_SELF_MONSTER) \
 +      MSG_MULTI_NOTIF(1, DEATH_SELF_MON_BRUTE_BLADE,                   NO_MSG,        INFO_DEATH_SELF_MON_BRUTE_BLADE,                   CENTER_DEATH_SELF_MONSTER) \
 +      MSG_MULTI_NOTIF(1, DEATH_SELF_MON_BRUTE_GRENADE,                 NO_MSG,        INFO_DEATH_SELF_MON_BRUTE_GRENADE,                 CENTER_DEATH_SELF_MONSTER) \
 +      MSG_MULTI_NOTIF(1, DEATH_SELF_MON_BRUTE_UZI,                     NO_MSG,        INFO_DEATH_SELF_MON_BRUTE_UZI,                     CENTER_DEATH_SELF_MONSTER) \
 +      MSG_MULTI_NOTIF(1, DEATH_SELF_MON_MAGE,                                  NO_MSG,        INFO_DEATH_SELF_MON_MAGE,                                  CENTER_DEATH_SELF_MONSTER) \
 +      MSG_MULTI_NOTIF(1, DEATH_SELF_MON_SHAMBLER_CLAW,                 NO_MSG,        INFO_DEATH_SELF_MON_SHAMBLER_CLAW,                 CENTER_DEATH_SELF_MONSTER) \
 +      MSG_MULTI_NOTIF(1, DEATH_SELF_MON_SHAMBLER_SMASH,                NO_MSG,        INFO_DEATH_SELF_MON_SHAMBLER_SMASH,                CENTER_DEATH_SELF_MONSTER) \
 +      MSG_MULTI_NOTIF(1, DEATH_SELF_MON_SHAMBLER_ZAP,                  NO_MSG,        INFO_DEATH_SELF_MON_SHAMBLER_ZAP,                  CENTER_DEATH_SELF_MONSTER) \
 +      MSG_MULTI_NOTIF(1, DEATH_SELF_MON_SPIDER,                                NO_MSG,        INFO_DEATH_SELF_MON_SPIDER,                                CENTER_DEATH_SELF_MONSTER) \
 +      MSG_MULTI_NOTIF(1, DEATH_SELF_MON_SPIDER_FIRE,                   NO_MSG,        INFO_DEATH_SELF_MON_SPIDER_FIRE,                   CENTER_DEATH_SELF_MONSTER) \
 +      MSG_MULTI_NOTIF(1, DEATH_SELF_MON_SLIME,                                 NO_MSG,        INFO_DEATH_SELF_MON_SLIME,                                 CENTER_DEATH_SELF_MONSTER) \
 +      MSG_MULTI_NOTIF(1, DEATH_SELF_MON_WYVERN,                                NO_MSG,        INFO_DEATH_SELF_MON_WYVERN,                                CENTER_DEATH_SELF_MONSTER) \
 +      MSG_MULTI_NOTIF(1, DEATH_SELF_MON_ZOMBIE_JUMP,                   NO_MSG,        INFO_DEATH_SELF_MON_ZOMBIE_JUMP,                   CENTER_DEATH_SELF_MONSTER) \
 +      MSG_MULTI_NOTIF(1, DEATH_SELF_MON_ZOMBIE_MELEE,                  NO_MSG,        INFO_DEATH_SELF_MON_ZOMBIE_MELEE,                  CENTER_DEATH_SELF_MONSTER) \
        MSG_MULTI_NOTIF(1, DEATH_SELF_NADE,                                              NO_MSG,                INFO_DEATH_SELF_NADE,                                      CENTER_DEATH_SELF_NADE) \
        MSG_MULTI_NOTIF(1, DEATH_SELF_NOAMMO,                    NO_MSG,        INFO_DEATH_SELF_NOAMMO,                    CENTER_DEATH_SELF_NOAMMO) \
        MSG_MULTI_NOTIF(1, DEATH_SELF_ROT,                       NO_MSG,        INFO_DEATH_SELF_ROT,                       CENTER_DEATH_SELF_ROT) \
        MSG_MULTI_NOTIF(1, WEAPON_UZI_MURDER_SNIPE,              NO_MSG,        INFO_WEAPON_UZI_MURDER_SNIPE,              NO_MSG) \
        MSG_MULTI_NOTIF(1, WEAPON_UZI_MURDER_SPRAY,              NO_MSG,        INFO_WEAPON_UZI_MURDER_SPRAY,              NO_MSG)
  
- #define MULTITEAM_CHOICE(default,challow,prefix,teams,chtype,optiona,optionb) \
+ #define MULTITEAM_CHOICE2(default,challow,prefix,chtype,optiona,optionb) \
+       MSG_CHOICE_NOTIF(default, challow, prefix##RED, chtype, optiona##RED, optionb##RED) \
+       MSG_CHOICE_NOTIF(default, challow, prefix##BLUE, chtype, optiona##BLUE, optionb##BLUE)
+ #define MULTITEAM_CHOICE3(default,challow,prefix,chtype,optiona,optionb) \
        MSG_CHOICE_NOTIF(default, challow, prefix##RED, chtype, optiona##RED, optionb##RED) \
        MSG_CHOICE_NOTIF(default, challow, prefix##BLUE, chtype, optiona##BLUE, optionb##BLUE) \
-       #if teams >= 3 \
-               MSG_CHOICE_NOTIF(default, challow, prefix##YELLOW, chtype, optiona##YELLOW, optionb##YELLOW) \
-       #endif \
-       #if teams >= 4 \
-               MSG_CHOICE_NOTIF(default, challow, prefix##PINK, chtype, optiona##PINK, optionb##PINK) \
-       #endif
+       MSG_CHOICE_NOTIF(default, challow, prefix##YELLOW, chtype, optiona##YELLOW, optionb##YELLOW)
+ #define MULTITEAM_CHOICE4(default,challow,prefix,chtype,optiona,optionb) \
+       MSG_CHOICE_NOTIF(default, challow, prefix##RED, chtype, optiona##RED, optionb##RED) \
+       MSG_CHOICE_NOTIF(default, challow, prefix##BLUE, chtype, optiona##BLUE, optionb##BLUE) \
+       MSG_CHOICE_NOTIF(default, challow, prefix##YELLOW, chtype, optiona##YELLOW, optionb##YELLOW) \
+       MSG_CHOICE_NOTIF(default, challow, prefix##PINK, chtype, optiona##PINK, optionb##PINK)
+ #define MULTITEAM_CHOICE(default,challow,prefix,teams,chtype,optiona,optionb) \
+       MULTITEAM_CHOICE##teams(default,challow,prefix,chtype,optiona,optionb)
  #define MSG_CHOICE_NOTIFICATIONS \
        MULTITEAM_CHOICE(1, 2, CHOICE_CTF_CAPTURE_BROKEN_, 2,    MSG_INFO,    INFO_CTF_CAPTURE_,                INFO_CTF_CAPTURE_BROKEN_) \
        MULTITEAM_CHOICE(1, 2, CHOICE_CTF_CAPTURE_TIME_, 2,      MSG_INFO,    INFO_CTF_CAPTURE_,                INFO_CTF_CAPTURE_TIME_) \
@@@ -1300,7 -1280,7 +1330,7 @@@ float notif_global_error
                        NO_MSG,   /* optiona     */ \
                        NO_MSG);  /* optionb     */ \
        } \
-       ACCUMULATE_FUNCTION(RegisterNotifications, RegisterNotification_##name)
+       ACCUMULATE_FUNCTION(RegisterNotifications, RegisterNotification_##name);
  
  #define MSG_INFO_NOTIF(default,name,strnum,flnum,args,hudargs,icon,normal,gentle) \
        NOTIF_ADD_AUTOCVAR(name, default) \
                        NO_MSG,   /* optiona     */ \
                        NO_MSG);  /* optionb     */ \
        } \
-       ACCUMULATE_FUNCTION(RegisterNotifications, RegisterNotification_##name)
+       ACCUMULATE_FUNCTION(RegisterNotifications, RegisterNotification_##name);
  
  #define MSG_CENTER_NOTIF(default,name,strnum,flnum,args,cpid,durcnt,normal,gentle) \
        NOTIF_ADD_AUTOCVAR(name, default) \
                        NO_MSG,   /* optiona     */ \
                        NO_MSG);  /* optionb     */ \
        } \
-       ACCUMULATE_FUNCTION(RegisterNotifications, RegisterNotification_##name)
+       ACCUMULATE_FUNCTION(RegisterNotifications, RegisterNotification_##name);
  
  #define MSG_MULTI_NOTIF(default,name,anncename,infoname,centername) \
        NOTIF_ADD_AUTOCVAR(name, default) \
                        NO_MSG,   /* optiona     */ \
                        NO_MSG);  /* optionb     */ \
        } \
-       ACCUMULATE_FUNCTION(RegisterNotifications, RegisterNotification_##name)
+       ACCUMULATE_FUNCTION(RegisterNotifications, RegisterNotification_##name);
  
  #define ACVNN(name) autocvar_notification_##name
  
                        optiona,                                 /* optiona     */ \
                        optionb);                                /* optionb     */ \
        } \
-       ACCUMULATE_FUNCTION(RegisterNotifications, RegisterNotification_##name)
+       ACCUMULATE_FUNCTION(RegisterNotifications, RegisterNotification_##name);
  
  void RegisterNotifications_First()
  {
@@@ -1516,13 -1496,13 +1546,13 @@@ void RegisterNotifications_Done(
  }
  
  // NOW we actually activate the declarations
- ACCUMULATE_FUNCTION(RegisterNotifications, RegisterNotifications_First)
+ ACCUMULATE_FUNCTION(RegisterNotifications, RegisterNotifications_First);
  MSG_ANNCE_NOTIFICATIONS
  MSG_INFO_NOTIFICATIONS
  MSG_CENTER_NOTIFICATIONS
  MSG_MULTI_NOTIFICATIONS
  MSG_CHOICE_NOTIFICATIONS
- ACCUMULATE_FUNCTION(RegisterNotifications, RegisterNotifications_Done)
+ ACCUMULATE_FUNCTION(RegisterNotifications, RegisterNotifications_Done);
  #undef MSG_ANNCE_NOTIF
  #undef MSG_INFO_NOTIF
  #undef MSG_CENTER_NOTIF