]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/commitdiff
Remove enforcer & all W_ attack functions from the monster code
authorMario <mario.mario@y7mail.com>
Sun, 14 Apr 2013 03:46:11 +0000 (13:46 +1000)
committerMario <mario.mario@y7mail.com>
Sun, 14 Apr 2013 03:46:11 +0000 (13:46 +1000)
13 files changed:
monsters.cfg
qcsrc/client/monsters.qc
qcsrc/common/deathtypes.qh
qcsrc/common/notifications.qh
qcsrc/menu/xonotic/dialog_monstertools.c
qcsrc/server/monsters/lib/monsters_early.qh
qcsrc/server/monsters/monster/enforcer.qc [deleted file]
qcsrc/server/monsters/monster/knight.qc
qcsrc/server/monsters/monster/ogre.qc
qcsrc/server/monsters/monster/spider.qc
qcsrc/server/monsters/monsters.qh
qcsrc/server/mutators/gamemode_towerdefense.qc
qcsrc/server/mutators/gamemode_towerdefense.qh

index 815cfabd85d08ecf0566aaea7c2600a448d6e629..7b329d437e72c227ec881ed6b615d4eabb68b922 100644 (file)
@@ -25,16 +25,7 @@ set g_monsters_skill_normal 4 "Monster normal skill level (used for skill based
 set g_monsters_skill_hard 5 "Monster hard skill level (used for skill based functions)"
 set g_monsters_skill_insane 7 "Monster insane skill level (used for skill based functions)"
 set g_monsters_skill_nightmare 10 "Monster nightmare skill level (used for skill based functions)"
-set g_monsters_spawn_list "ogre demon shambler knight soldier scrag dog spawn hellknight fish vore enforcer zombie spider" "monsters not listed here will spawn as knights"
-
-// Enforcer
-set g_monster_enforcer 1 "Enable Enforcers"
-set g_monster_enforcer_health 80 "Enforcer health"
-set g_monster_enforcer_drop armor "Enforcer drops this item on death"
-set g_monster_enforcer_drop_size large "Size of the item Enforcers drop. Possible values are: small, medium, large"
-set g_monster_enforcer_speed_walk 75 "Enforcer walk speed"
-set g_monster_enforcer_speed_run 100 "Enforcer run speed"
-set g_monster_enforcer_attack_uzi_bullets 3 "Number of machine gun bullets Enforcer fires"
+set g_monsters_spawn_list "ogre demon shambler knight soldier scrag dog spawn hellknight fish vore zombie spider" "monsters not listed here will spawn as knights"
 
 // Ogre
 set g_monster_ogre 1 "Enable Ogres"
@@ -223,6 +214,11 @@ set g_monster_spider_attack_type 0 "Spider attack type (0 = ice, 1 = fire, ...)"
 set g_monster_spider_attack_leap_delay 1.5 "Delay after spider attack leap"
 set g_monster_spider_attack_stand_damage 35 "Damage when spider hits from a standing position"
 set g_monster_spider_attack_stand_delay 1.2 "Delay after a spider hits from a standing position"
+set g_monster_spider_attack_fire_time 2 "Spider fire attack burn time"
+set g_monster_spider_attack_web_speed 1000 "Spider web fly speed"
+set g_monster_spider_attack_web_speed_up 150 "Spider web upwards fly speed"
+set g_monster_spider_attack_web_spread 0 "Spider web spread"
+set g_monster_spider_attack_web_speed_z 0 "Spider web upwards angle"
 set g_monster_spider_health 200 "Spider health"
 set g_monster_spider_idle_timer_min 1 "Minimum time a spider can stay idle"
 set g_monster_spider_speed_walk 150 "Spider walk speed"
index ec1919d62a31ac5683ca35485adcfd5fde347e67..53292d28ea1e74d3907a428dbc40ca7256641c9f 100644 (file)
@@ -80,12 +80,6 @@ void monster_precache(float _mid)
                        precache_model(SHALRATH_MODEL);
                        break;
                }
-               case MONSTER_ENFORCER:
-               {
-                       precache_model(ENFORCER_MODEL);
-                       precache_model("models/turrets/ewheel-gun1.md3");
-                       break;
-               }
                case MONSTER_SPIDER:
                {
                        precache_model(SPIDER_MODEL);
@@ -203,14 +197,6 @@ void monster_mid2info(float _mid)
                        mid2info_max = SHALRATH_MAX;
                        break;
                }
-               case MONSTER_ENFORCER:
-               {
-                       mid2info_model = ENFORCER_MODEL;
-                       mid2info_name = "Enforcer";
-                       mid2info_min = ENFORCER_MIN;
-                       mid2info_max = ENFORCER_MAX;
-                       break;
-               }
                case MONSTER_SPIDER:
                {
                        mid2info_model = SPIDER_MODEL;
index 0e088ea5c18a2e4b0ddd1c270fc396454a422cdc..5b84d63ec6221efd5c33578ff09575a009e45ba9 100644 (file)
@@ -17,7 +17,6 @@
        DEATHTYPE(DEATH_MIRRORDAMAGE,           DEATH_SELF_BETRAYAL,                NO_MSG,                        NORMAL_POS) \
        DEATHTYPE(DEATH_MONSTER_DOG_BITE,               DEATH_SELF_MON_DOG_BITE,                        NO_MSG,                                            DEATH_MONSTER_FIRST) \
        DEATHTYPE(DEATH_MONSTER_DOG_JUMP,               DEATH_SELF_MON_DOG_JUMP,                        NO_MSG,                                            NORMAL_POS) \
-       DEATHTYPE(DEATH_MONSTER_ENFORCER,               DEATH_SELF_MON_ENFORCER,                        NO_MSG,                                            NORMAL_POS) \
        DEATHTYPE(DEATH_MONSTER_FIEND,                  DEATH_SELF_MON_FIEND,                           NO_MSG,                                            NORMAL_POS) \
        DEATHTYPE(DEATH_MONSTER_FISH,                   DEATH_SELF_MON_FISH,                            NO_MSG,                                            NORMAL_POS) \
        DEATHTYPE(DEATH_MONSTER_HKNIGHT_CRUSH,  DEATH_SELF_MON_HKNIGHT_CRUSH,           NO_MSG,                                            NORMAL_POS) \
@@ -36,6 +35,7 @@
        DEATHTYPE(DEATH_MONSTER_MARINE,                 DEATH_SELF_MON_MARINE,                          NO_MSG,                                            NORMAL_POS) \
        DEATHTYPE(DEATH_MONSTER_MARINE_SLAP,    DEATH_SELF_MON_MARINE_SLAP,                     NO_MSG,                                            NORMAL_POS) \
        DEATHTYPE(DEATH_MONSTER_SPIDER,                 DEATH_SELF_MON_SPIDER,                          NO_MSG,                                            NORMAL_POS) \
+       DEATHTYPE(DEATH_MONSTER_SPIDER_FIRE,    DEATH_SELF_MON_SPIDER_FIRE,                     NO_MSG,                                            NORMAL_POS) \
        DEATHTYPE(DEATH_MONSTER_TARBABY,                DEATH_SELF_MON_TARBABY,                         NO_MSG,                                            NORMAL_POS) \
        DEATHTYPE(DEATH_MONSTER_SCRAG,                  DEATH_SELF_MON_SCRAG,                           NO_MSG,                                            NORMAL_POS) \
        DEATHTYPE(DEATH_MONSTER_ZOMBIE_JUMP,    DEATH_SELF_MON_ZOMBIE_JUMP,                     NO_MSG,                                            NORMAL_POS) \
index 368123fc74152e444852a6b1482f84918a1cd5b7..f1b2efa4199613d6e50c579cacad52fa60e77efc 100644 (file)
@@ -228,7 +228,6 @@ void Send_Notification_WOVA(
        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\n"), _("^BG%s^K1 found a hot place%s%s\n")) \
        MSG_INFO_NOTIF(1, INFO_DEATH_SELF_MON_DOG_BITE,            2, 1, "s1 s2loc spree_lost", "s1",           "notify_death",                 _("^BG%s^K1 was mauled by a Rottweiler%s%s\n"), "") \
        MSG_INFO_NOTIF(1, INFO_DEATH_SELF_MON_DOG_JUMP,            2, 1, "s1 s2loc spree_lost", "s1",           "notify_death",                 _("^BG%s^K1 didn't see the pouncing Rottweiler%s%s\n"), "") \
-       MSG_INFO_NOTIF(1, INFO_DEATH_SELF_MON_ENFORCER,            2, 1, "s1 s2loc spree_lost", "s1",           "notify_death",                 _("^BG%s^K1 was blasted by an Enforcer%s%s\n"), "") \
        MSG_INFO_NOTIF(1, INFO_DEATH_SELF_MON_FIEND,           2, 1, "s1 s2loc spree_lost", "s1",               "notify_death",                 _("^BG%s^K1 was eviscerated by a Fiend%s%s\n"), "") \
        MSG_INFO_NOTIF(1, INFO_DEATH_SELF_MON_FISH,                2, 1, "s1 s2loc spree_lost", "s1",           "notify_death",                 _("^BG%s^K1 was fed to the Rotfish%s%s\n"), "") \
        MSG_INFO_NOTIF(1, INFO_DEATH_SELF_MON_HKNIGHT_CRUSH,   2, 1, "s1 s2loc spree_lost", "s1",               "notify_death",                 _("^BG%s^K1 was crushed by a pouncing Hell-Knight%s%s\n"), "") \
@@ -247,6 +246,7 @@ void Send_Notification_WOVA(
        MSG_INFO_NOTIF(1, INFO_DEATH_SELF_MON_MARINE_SLAP,     2, 1, "s1 s2loc spree_lost", "s1",               "notify_death",                 _("^BG%s^K1 was slapped to death by a Marine%s%s\n"), "") \
        MSG_INFO_NOTIF(1, INFO_DEATH_SELF_MON_MARINE,              2, 1, "s1 s2loc spree_lost", "s1",           "notify_death",                 _("^BG%s^K1 was gunned down by a Marine%s%s\n"), "") \
        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\n"), "") \
+       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\n"), "") \
        MSG_INFO_NOTIF(1, INFO_DEATH_SELF_MON_TARBABY,         2, 1, "s1 s2loc spree_lost", "s1",               "notify_death",                 _("^BG%s^K1 came too close to an exploding Pumpkin%s%s\n"), "") \
        MSG_INFO_NOTIF(1, INFO_DEATH_SELF_MON_SCRAG,           2, 1, "s1 s2loc spree_lost", "s1",               "notify_death",                 _("^BG%s^K1 was cursed by a Scrag%s%s\n"), "") \
        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\n"), "") \
@@ -569,7 +569,6 @@ void Send_Notification_WOVA(
        MSG_MULTI_NOTIF(1, DEATH_SELF_LAVA,                      INFO_DEATH_SELF_LAVA,                      CENTER_DEATH_SELF_LAVA) \
        MSG_MULTI_NOTIF(1, DEATH_SELF_MON_DOG_BITE,                              INFO_DEATH_SELF_MON_DOG_BITE,                          CENTER_DEATH_SELF_MONSTER) \
        MSG_MULTI_NOTIF(1, DEATH_SELF_MON_DOG_JUMP,                              INFO_DEATH_SELF_MON_DOG_JUMP,                          CENTER_DEATH_SELF_MONSTER) \
-       MSG_MULTI_NOTIF(1, DEATH_SELF_MON_ENFORCER,                              INFO_DEATH_SELF_MON_ENFORCER,                          CENTER_DEATH_SELF_MONSTER) \
        MSG_MULTI_NOTIF(1, DEATH_SELF_MON_FIEND,                                 INFO_DEATH_SELF_MON_FIEND,                                     CENTER_DEATH_SELF_MONSTER) \
        MSG_MULTI_NOTIF(1, DEATH_SELF_MON_FISH,                                  INFO_DEATH_SELF_MON_FISH,                                      CENTER_DEATH_SELF_MONSTER) \
        MSG_MULTI_NOTIF(1, DEATH_SELF_MON_HKNIGHT_CRUSH,                 INFO_DEATH_SELF_MON_HKNIGHT_CRUSH,                     CENTER_DEATH_SELF_MONSTER) \
@@ -588,6 +587,7 @@ void Send_Notification_WOVA(
        MSG_MULTI_NOTIF(1, DEATH_SELF_MON_MARINE_SLAP,                   INFO_DEATH_SELF_MON_MARINE_SLAP,                       CENTER_DEATH_SELF_MONSTER) \
        MSG_MULTI_NOTIF(1, DEATH_SELF_MON_MARINE,                                INFO_DEATH_SELF_MON_MARINE,                            CENTER_DEATH_SELF_MONSTER) \
        MSG_MULTI_NOTIF(1, DEATH_SELF_MON_SPIDER,                                INFO_DEATH_SELF_MON_SPIDER,                            CENTER_DEATH_SELF_MONSTER) \
+       MSG_MULTI_NOTIF(1, DEATH_SELF_MON_SPIDER_FIRE,                   INFO_DEATH_SELF_MON_SPIDER_FIRE,                       CENTER_DEATH_SELF_MONSTER) \
        MSG_MULTI_NOTIF(1, DEATH_SELF_MON_TARBABY,                               INFO_DEATH_SELF_MON_TARBABY,                           CENTER_DEATH_SELF_MONSTER) \
        MSG_MULTI_NOTIF(1, DEATH_SELF_MON_SCRAG,                                 INFO_DEATH_SELF_MON_SCRAG,                                     CENTER_DEATH_SELF_MONSTER) \
        MSG_MULTI_NOTIF(1, DEATH_SELF_MON_ZOMBIE_JUMP,                   INFO_DEATH_SELF_MON_ZOMBIE_JUMP,                       CENTER_DEATH_SELF_MONSTER) \
index e448a8be81a6aaf041203a70a6a96a634b0dc3c2..89e3f4d192055a0e6278fce1ab48b555300c7818 100644 (file)
@@ -31,7 +31,6 @@ void XonoticMonsterToolsDialog_fill(entity me)
                me.TD(me, 1, 0.4, e = makeXonoticRadioButton(2, "menu_monsters_edit_spawn", "spawn", _("Tarbaby")));
                me.TD(me, 1, 0.4, e = makeXonoticRadioButton(2, "menu_monsters_edit_spawn", "fish", _("Rotfish")));
                me.TD(me, 1, 0.4, e = makeXonoticRadioButton(2, "menu_monsters_edit_spawn", "vore", _("Mage")));
-               me.TD(me, 1, 0.4, e = makeXonoticRadioButton(2, "menu_monsters_edit_spawn", "enforcer", _("Enforcer")));
                me.TD(me, 1, 0.4, e = makeXonoticRadioButton(2, "menu_monsters_edit_spawn", "scrag", _("Scrag")));
        me.TR(me);
                me.TD(me, 1, 0.25, e = makeXonoticTextLabel(0, _("Name:")));
index 5a2f2b7bc39bb34dd0433d21fb8c8d94642556c8..3493b44a78f9ad3c246c2732e598727a9186a00d 100644 (file)
@@ -34,9 +34,8 @@ float MONSTER_TARBABY                 = 10;
 float MONSTER_HELLKNIGHT       = 11;
 float MONSTER_FISH                     = 12;
 float MONSTER_MAGE                     = 13;
-float MONSTER_ENFORCER                 = 14;
-float MONSTER_SPIDER           = 15;
-float MONSTER_LAST                     = 16;
+float MONSTER_SPIDER           = 14;
+float MONSTER_LAST                     = 15;
 
 float MSF_UPDATE       = 2;
 float MSF_STATUS       = 4;
diff --git a/qcsrc/server/monsters/monster/enforcer.qc b/qcsrc/server/monsters/monster/enforcer.qc
deleted file mode 100644 (file)
index 1f8b176..0000000
+++ /dev/null
@@ -1,172 +0,0 @@
-#ifndef MENUQC
-// size
-const vector ENFORCER_MIN = '-32 -32 0';
-const vector ENFORCER_MAX = '32 32 64';
-
-// model
-string ENFORCER_MODEL = "models/turrets/ewheel-base2.md3";
-
-#endif
-
-#ifdef SVQC
-// cvars
-float autocvar_g_monster_enforcer;
-float autocvar_g_monster_enforcer_health;
-float autocvar_g_monster_enforcer_speed_walk;
-float autocvar_g_monster_enforcer_speed_run;
-float autocvar_g_monster_enforcer_attack_uzi_bullets;
-
-// animations
-const float enforcer_anim_stop                 = 0;
-const float enforcer_anim_walk                 = 1;
-const float enforcer_anim_run          = 2;
-const float enforcer_anim_walkback     = 3;
-const float enforcer_anim_runback      = 4;
-
-void enforcer_think ()
-{
-       self.think = enforcer_think;
-       self.nextthink = time + self.ticrate;
-       
-       if(self.delay != -1)
-               self.nextthink = self.delay;
-       
-       monster_move(autocvar_g_monster_enforcer_speed_run, autocvar_g_monster_enforcer_speed_walk, 100, enforcer_anim_run, enforcer_anim_walk, enforcer_anim_stop);
-}
-
-.float enf_cycles;
-void enforcer_uzi_fire ()
-{
-       self.enf_cycles += 1;
-       
-       if(self.enf_cycles > autocvar_g_monster_enforcer_attack_uzi_bullets)
-       {
-               self.monster_delayedattack = func_null;
-               self.delay = -1;
-               return;
-       }
-       W_UZI_Attack(DEATH_MONSTER_ENFORCER);
-       self.delay = time + 0.1;
-       self.monster_delayedattack = enforcer_uzi_fire;
-}
-
-float enforcer_attack()
-{
-       makevectors(self.angles);
-       switch(self.weapon)
-       {
-               case WEP_ROCKET_LAUNCHER:
-               {
-                       self.attack_finished_single = time + 0.8;
-                       W_Rocket_Attack();
-                       return TRUE;
-               }
-               case WEP_ELECTRO:
-               {
-                       self.attack_finished_single = time + 0.8;
-                       W_Electro_Attack();
-                       return TRUE;
-               }
-               case WEP_SHOTGUN:
-               {
-                       self.attack_finished_single = time + 0.8;
-                       W_Shotgun_Attack();
-                       return TRUE;
-               }
-               case WEP_UZI:
-               {
-                       self.enf_cycles = 0;
-                       self.attack_finished_single = time + 0.8;
-                       self.delay = time + 0.1;
-                       self.monster_delayedattack = enforcer_uzi_fire;
-                       return TRUE;
-               }
-               case WEP_LASER:
-               {
-                       self.attack_finished_single = time + 0.8;
-                       W_Laser_Attack(0);
-               }
-               default:
-                       return FALSE; // no weapon?
-       }
-       
-       // never gets here
-}
-
-void enforcer_die ()
-{
-       Monster_CheckDropCvars ("enforcer");
-       
-       self.think = Monster_Fade;
-       self.nextthink = time + 5;
-       monsters_setframe(enforcer_anim_stop);
-               
-       monster_hook_death(); // for post-death mods
-}
-
-void enforcer_spawn ()
-{
-       if not(self.health)
-               self.health = autocvar_g_monster_enforcer_health * self.scale;
-
-       self.damageforcescale   = 0;
-       self.classname                  = "monster_enforcer";
-       self.checkattack                = GenericCheckAttack;
-       self.nextthink                  = time + random() * 0.5 + 0.1;
-       self.think                              = enforcer_think;
-       self.items                              = (IT_SHELLS | IT_ROCKETS | IT_NAILS | IT_CELLS);
-       self.sprite_height              = 45;
-       self.attack_ranged              = enforcer_attack;
-       self.view_ofs              *= 0.5;
-       
-       monsters_setframe(enforcer_anim_stop);
-       
-       monster_setupsounds("enforcer");
-       
-       setmodel(self, ENFORCER_MODEL); // for weapon entity
-       
-       self.weaponentity = spawn();
-       self.weaponentity.owner = self;
-       self.weaponentity.team = self.team;
-       self.weaponentity.solid = SOLID_NOT;
-       self.weaponentity.owner = self.weaponentity.realowner = self;
-       self.weaponentity.movetype = MOVETYPE_NOCLIP;
-       setmodel(self.weaponentity, "models/turrets/ewheel-gun1.md3");
-       setattachment(self.weaponentity, self, "tag_head");
-       
-       RandomSelection_Init();
-       RandomSelection_Add(world, WEP_ROCKET_LAUNCHER, "", 1, 1);
-       RandomSelection_Add(world, WEP_ELECTRO, "", 1, 1);
-       RandomSelection_Add(world, WEP_SHOTGUN, "", 1, 1);
-       RandomSelection_Add(world, WEP_UZI, "", 1, 1);
-       RandomSelection_Add(world, WEP_LASER, "", 1, 1);
-       
-       self.weapon = RandomSelection_chosen_float;
-               
-       monster_hook_spawn(); // for post-spawn mods
-}
-
-void spawnfunc_monster_enforcer ()
-{      
-       if not(autocvar_g_monster_enforcer) { remove(self); return; }
-       
-       self.monster_spawnfunc = spawnfunc_monster_enforcer;
-       
-       if(Monster_CheckAppearFlags(self))
-               return;
-               
-       precache_model("models/turrets/ewheel-gun1.md3");
-       precache_model(ENFORCER_MODEL);
-       
-       if not (monster_initialize(
-                        "Enforcer", MONSTER_ENFORCER,
-                        ENFORCER_MIN, ENFORCER_MAX,
-                        FALSE,
-                        enforcer_die, enforcer_spawn))
-       {
-               remove(self);
-               return;
-       }
-}
-
-#endif // SVQC
index 93cbe663cd8e594ebbd471541f65d1bf1369199a..48845d457ed627a76b761952ce4e65ffa95e8468 100644 (file)
@@ -12,7 +12,7 @@ string KNIGHT_MODEL = "models/monsters/knight.mdl";
 // cvars
 float autocvar_g_monster_knight;
 float autocvar_g_monster_knight_health;
-//float autocvar_g_monster_knight_melee_damage;
+float autocvar_g_monster_knight_melee_damage;
 float autocvar_g_monster_knight_speed_walk;
 float autocvar_g_monster_knight_speed_run;
 
@@ -40,14 +40,12 @@ void knight_think ()
 void knight_attack ()
 {
        float len = vlen(self.velocity);
-       
-       W_Shotgun_Attack2();
 
        monsters_setframe((len < 50) ? knight_anim_attack : knight_anim_runattack);
        
        self.attack_finished_single = time + 1.25;
        
-       //monster_melee(self.enemy, autocvar_g_monster_knight_melee_damage, 0.3, DEATH_MONSTER_KNIGHT);
+       monster_melee(self.enemy, autocvar_g_monster_knight_melee_damage, 0.3, DEATH_MONSTER_KNIGHT, FALSE);
 }
 
 void knight_die ()
index af2005bbfaf542904b93d6d64b6c1aff722b5eae..ed947bb8b6fd6e6fae2dcd5d3601dfb8aef90b98 100644 (file)
@@ -146,7 +146,7 @@ void ogre_grenade_think()
        if (time > self.cnt)
        {
                other = world;
-               W_Grenade_Explode ();
+               ogre_grenade_explode();
                return;
        }
 }
index be1e7b77e9fee272f6e3cea4dfa5d08fe4c943b3..62c968e1211ae8952692d1192cef81d7c56841a5 100644 (file)
@@ -15,6 +15,7 @@ float autocvar_g_monster_spider_stopspeed;
 float autocvar_g_monster_spider_attack_leap_delay;
 float autocvar_g_monster_spider_attack_stand_damage;
 float autocvar_g_monster_spider_attack_stand_delay;
+float autocvar_g_monster_spider_attack_fire_time;
 float autocvar_g_monster_spider_health;
 float autocvar_g_monster_spider_speed_walk;
 float autocvar_g_monster_spider_speed_run;
@@ -49,32 +50,69 @@ void spider_attack_standing()
 
 void spider_web_explode ()
 {
-       RadiusDamage (self, self.realowner, 0, 0, 1, world, 0, self.projectiledeathtype, other);
+       float damg = 0, edamg = 0, rad = 1;
+       switch(self.realowner.spider_type)
+       {
+               case SPIDER_TYPE_ICE:
+                       break; // no change
+               case SPIDER_TYPE_FIRE:
+                       damg = 15;
+                       rad = 25;
+                       edamg = 6;
+                       break;
+       }
+       
+       RadiusDamage (self, self.realowner, damg, edamg, rad, world, 0, self.projectiledeathtype, other);
+       
        remove (self);
 }
 
 void spider_web_touch ()
 {
        PROJECTILE_TOUCH;
-       if (other.takedamage == DAMAGE_AIM)
-               Freeze(other, 0.3);
+       
+       if(other.takedamage == DAMAGE_AIM)
+       switch(self.realowner.spider_type)
+       {
+               case SPIDER_TYPE_ICE:
+                       Freeze(other, 0.3);
+                       break;
+               case SPIDER_TYPE_FIRE:
+                       Fire_AddDamage(other, self.realowner, 5 * monster_skill, autocvar_g_monster_spider_attack_fire_time, DEATH_MONSTER_SPIDER_FIRE);
+                       break;
+       }
                
        spider_web_explode();
 }
 
-void spider_shootweb()
+void spider_shootweb(float ptype)
 {
-       // clone of the electro secondary attack, with less bouncing
+       float p = 0, dt = 0;
+       string snd = "";
+       switch(ptype)
+       {
+               case SPIDER_TYPE_ICE:
+                       p = PROJECTILE_ELECTRO;
+                       dt = WEP_ELECTRO;
+                       snd = "weapons/electro_fire2.wav";
+                       break;
+               case SPIDER_TYPE_FIRE:
+                       p = ((self.scale >= 2) ? PROJECTILE_FIREBALL : PROJECTILE_FIREMINE);
+                       dt = WEP_FIREBALL;
+                       snd = "weapons/fireball_fire.wav";
+                       break;
+       }
+       
+       vector fmins = ((self.scale >= 2) ? '-16 -16 -16' : '-4 -4 -4'), fmaxs = ((self.scale >= 2) ? '16 16 16' : '4 4 4');    
+       
        entity proj = world;
        
        makevectors(self.angles);
 
-       W_SetupShot_ProjectileSize (self, '0 0 -4', '0 0 -4', FALSE, 2, "weapons/electro_fire2.wav", CH_WEAPON_A, 0);
+       W_SetupShot_ProjectileSize(self, fmins, fmaxs, FALSE, 2, snd, CH_WEAPON_A, 0);
 
        w_shotdir = v_forward; // no TrueAim for grenades please
 
-       pointparticles(particleeffectnum("electro_muzzleflash"), w_shotorg, w_shotdir * 1000, 1);
-
        proj = spawn ();
        proj.classname = "plasma";
        proj.owner = proj.realowner = self;
@@ -82,21 +120,21 @@ void spider_shootweb()
        proj.think = adaptor_think2use_hittype_splash;
        proj.bot_dodge = TRUE;
        proj.bot_dodgerating = 0;
-       proj.nextthink = time + autocvar_g_balance_electro_secondary_lifetime;
+       proj.nextthink = time + 5;
        PROJECTILE_MAKETRIGGER(proj);
-       proj.projectiledeathtype = WEP_ELECTRO | HITTYPE_SECONDARY;
+       proj.projectiledeathtype = dt | HITTYPE_SECONDARY;
        setorigin(proj, w_shotorg);
 
        //proj.glow_size = 50;
        //proj.glow_color = 45;
        proj.movetype = MOVETYPE_BOUNCE;
-       W_SETUPPROJECTILEVELOCITY_UP(proj, g_balance_electro_secondary);
+       W_SETUPPROJECTILEVELOCITY_UP(proj, g_monster_spider_attack_web);
        proj.touch = spider_web_touch;
-       setsize(proj, '0 0 -4', '0 0 -4');
-       proj.takedamage = DAMAGE_YES;
+       setsize(proj, fmins, fmaxs);
+       proj.takedamage = DAMAGE_NO;
        proj.damageforcescale = 0;
        proj.health = 500;
-       proj.event_damage = W_Plasma_Damage;
+       proj.event_damage = func_null;
        proj.flags = FL_PROJECTILE;
        proj.damagedbycontents = TRUE;
 
@@ -104,9 +142,7 @@ void spider_shootweb()
        proj.bouncestop = 0.05;
        proj.missile_flags = MIF_SPLASH | MIF_ARC;
 
-       CSQCProjectile(proj, TRUE, PROJECTILE_ELECTRO, FALSE); // no culling, it has sound
-
-       other = proj; MUTATOR_CALLHOOK(EditProjectile);
+       CSQCProjectile(proj, TRUE, p, FALSE); // no culling, it has sound
 }
 
 void spider_attack_leap()
@@ -120,14 +156,7 @@ void spider_attack_leap()
        
        makevectors(self.angles);
        
-       switch(self.spider_type)
-       {
-               default:
-               case SPIDER_TYPE_ICE:
-                       spider_shootweb(); break; // must... remember... breaks!
-               case SPIDER_TYPE_FIRE:
-                       W_Fireball_Attack2(); break;
-       }
+       spider_shootweb(self.spider_type);
 }
 
 float spider_attack_ranged()
index c43a999d026a76a4981ac2c65e581cc48936ff78..014d3251ff4e078772583b8361104518c36fbacf 100644 (file)
@@ -17,6 +17,5 @@
 #include "monster/hknight.qc"
 #include "monster/fish.qc"
 #include "monster/shalrath.qc"
-#include "monster/enforcer.qc"
 #include "monster/zombie.qc"
 #include "monster/spider.qc"
index 1f8a9c33ab9008513c1e14ec1764f6e238f038fa..8c15233954453e46dce9b88e23f74cfa08edade7 100644 (file)
@@ -362,7 +362,6 @@ float Monster_GetStrength(string mnster)
                case "knight":
                case "wizard":
                case "soldier":
-               case "enforcer":
                case "zombie":
                case "tarbaby":
                case "dog":
@@ -387,7 +386,6 @@ float Monster_GetType(string mnster)
                default:
                case "knight":
                case "soldier":
-               case "enforcer":
                case "zombie":
                case "spider":
                case "tarbaby":
@@ -413,7 +411,6 @@ string RandomMonster()
        if(n_shalraths) RandomSelection_Add(world, 0, "vore", 1, 1);
        if(n_soldiers) RandomSelection_Add(world, 0, "soldier", 1, 1);
        if(n_hknights) RandomSelection_Add(world, 0, "hellknight", 1, 1);
-       if(n_enforcers) RandomSelection_Add(world, 0, "enforcer", 1, 1);
        if(n_zombies) RandomSelection_Add(world, 0, "zombie", 1, 1);
        if(n_spiders) RandomSelection_Add(world, 0, "spider", 1, 1);
        if(n_ogres) RandomSelection_Add(world, 0, "ogre", 1, 1);
@@ -458,7 +455,7 @@ void combat_phase()
 
 void queue_monsters(float maxmonsters)
 {
-       float mc = 11; // note: shambler + tarbaby = 1
+       float mc = 10; // note: shambler + tarbaby = 1
        
        if(waterspawns_count > 0)
                mc += 1;
@@ -473,7 +470,6 @@ void queue_monsters(float maxmonsters)
        n_shalraths = DistributeEvenly_Get(1);
        n_soldiers  = DistributeEvenly_Get(1);
        n_hknights  = DistributeEvenly_Get(1);
-       n_enforcers = DistributeEvenly_Get(1);
        n_zombies   = DistributeEvenly_Get(1);
        n_spiders   = DistributeEvenly_Get(1);
        n_tarbabies = DistributeEvenly_Get(0.7);
@@ -815,7 +811,6 @@ MUTATOR_HOOKFUNCTION(td_MonsterSpawn)
                case MONSTER_HELLKNIGHT: n_hknights -= 1; break;
                case MONSTER_FISH: n_fish -= 1; break;
                case MONSTER_MAGE: n_shalraths -= 1; break;
-               case MONSTER_ENFORCER: n_enforcers -= 1; break;
                case MONSTER_SPIDER: n_spiders -= 1; break;
        }
        
index b199fd5e84c481eae65812ba429a3c65d13bd4ab..513cb9287490b5e4ee2bbf59a2cbb3c0e05d3069 100644 (file)
@@ -1,6 +1,6 @@
 // Counters
 float monster_count, totalmonsters;
-float n_knights, n_dogs, n_ogres, n_shamblers, n_wizards, n_shalraths, n_soldiers, n_hknights, n_enforcers, n_demons, n_zombies, n_tarbabies, n_fish, n_spiders;
+float n_knights, n_dogs, n_ogres, n_shamblers, n_wizards, n_shalraths, n_soldiers, n_hknights, n_demons, n_zombies, n_tarbabies, n_fish, n_spiders;
 float current_monsters;
 float waterspawns_count, flyspawns_count;
 float wave_count, max_waves;