+++ /dev/null
-1 12 10 1 // demon stand\r14 7 10 1 // demon walk\r22 5 10 1 // demon run\r28 11 10 0 // demon leap\r40 5 10 0 // demon pain\r46 8 10 0 // demon death\r55 14 10 1 // demon melee
\ No newline at end of file
+++ /dev/null
-/*
-Generated framegroups file for dog
-Used by DarkPlaces to simulate frame groups in DPM models.
-*/
-
-1 25 60 1 // dog idle
-26 37 60 1 // dog walk
-63 37 120 1 // dog run
-100 50 60 1 // dog attack
-150 42 60 0 // dog die
-192 25 60 1 // dog pain
+++ /dev/null
-1 17 10 1 // fish attack\r19 19 10 0 // fish death\r41 16 10 1 // fish swim\r59 8 10 0 // fish pain
\ No newline at end of file
+++ /dev/null
-1 8 10 1 // hellknight stand\r10 19 10 1 // hellknight walk\r30 7 10 1 // hellknight run\r38 4 10 0 // hellknight pain\r43 11 10 0 // hellknight death1\r55 8 10 0 // hellknight death2\r64 15 10 1 // hellknight charge1\r80 13 10 1 // hellknight magic1\r94 12 10 1 // hellknight magic2\r107 5 10 1 // hellknight charge2\r113 9 10 1 // hellknight slice\r123 9 10 1 // hellknight smash\r133 21 10 1 // hellknight weapon attack\r155 10 10 1 //hellknight magic3
\ No newline at end of file
+++ /dev/null
-1 8 10 1 // knight stand\r10 7 10 1 // knight run\r18 10 10 1 // knight run attack\r29 2 10 0 // knight pain1\r32 10 10 0 // knight pain2\r43 9 10 1 // knight attack\r53 13 10 1 // knight walk\r67 4 10 0 // knight kneel\r72 4 10 1 // knight standing\r77 9 10 0 // knight death1\r88 10 10 0 // knight death2
\ No newline at end of file
+++ /dev/null
-/*
-Generated framegroups file for ogre
-Used by DarkPlaces to simulate frame groups in DPM models.
-*/
-
-1 31 60 1 // ogre idle
-32 31 60 1 // ogre walk
-63 31 120 1 // ogre walk
-94 31 60 1 // ogre pain
-125 101 60 1 // ogre swing
-226 76 60 0 // ogre die
+++ /dev/null
-/*
-Generated framegroups file for slime
-Used by DarkPlaces to simulate frame groups in DPM models.
-*/
-
-1 36 30 1 // slime idle
-37 71 30 1 // slime walk
-108 51 30 1 // slime attack
-159 2 30 1 // slime fly
-161 61 30 1 // slime pain
-222 61 30 0 // slime die
-// {{{ #1: Brute
-set g_monster_brute_attack_chainsaw_damage 15
-set g_monster_brute_attack_grenade_damage 40
-set g_monster_brute_attack_grenade_edgedamage 20
-set g_monster_brute_attack_grenade_force 15
-set g_monster_brute_attack_grenade_radius 200
-set g_monster_brute_attack_grenade_speed 1400
-set g_monster_brute_attack_grenade_speed_up 150
-set g_monster_brute_attack_uzi_bullets 3
-set g_monster_brute_attack_uzi_chance 0.1
-set g_monster_brute_attack_uzi_damage 10
-set g_monster_brute_attack_uzi_force 5
-set g_monster_brute_health 300
-set g_monster_brute_speed_run 200
-set g_monster_brute_speed_stop 300
-set g_monster_brute_speed_walk 100
-// }}}
-// {{{ #2: Animus
-set g_monster_animus_attack_jump_damage 80
-set g_monster_animus_attack_melee_damage 45
-set g_monster_animus_health 150
-set g_monster_animus_speed_run 350
-set g_monster_animus_speed_stop 100
-set g_monster_animus_speed_walk 150
-// }}}
-// {{{ #3: Shambler
-set g_monster_shambler_attack_claw_damage 50
-set g_monster_shambler_attack_lightning_damage 15
-set g_monster_shambler_attack_smash_damage 50
-set g_monster_shambler_health 500
-set g_monster_shambler_speed_run 150
-set g_monster_shambler_speed_stop 300
-set g_monster_shambler_speed_walk 100
-// }}}
-// {{{ #4: Bruiser
-set g_monster_bruiser_attack_melee_damage 50
-set g_monster_bruiser_health 200
-set g_monster_bruiser_speed_run 360
-set g_monster_bruiser_speed_stop 50
-set g_monster_bruiser_speed_walk 40
-// }}}
-// {{{ #5: Wyvern
-set g_monster_wyvern_attack_fireball_damage 30
-set g_monster_wyvern_attack_fireball_damagetime 3
-set g_monster_wyvern_attack_fireball_edgedamage 20
-set g_monster_wyvern_attack_fireball_force 50
-set g_monster_wyvern_attack_fireball_radius 120
-set g_monster_wyvern_attack_fireball_speed 900
-set g_monster_wyvern_health 95
-set g_monster_wyvern_speed_run 120
-set g_monster_wyvern_speed_stop 300
-set g_monster_wyvern_speed_walk 40
-// }}}
-// {{{ #6: Cerberus
-set g_monster_cerberus_attack_bite_damage 30
-set g_monster_cerberus_attack_jump_damage 40
-set g_monster_cerberus_health 100
-set g_monster_cerberus_speed_run 250
-set g_monster_cerberus_speed_stop 50
-set g_monster_cerberus_speed_walk 60
-// }}}
-// {{{ #7: Slime
-set g_monster_slime_attack_explode_damage 250
-set g_monster_slime_health 80
-set g_monster_slime_speed_run 400
-set g_monster_slime_speed_stop 20
-set g_monster_slime_speed_walk 20
-// }}}
-// {{{ #8: Knight
-set g_monster_knight_attack_fireball_chance 0.3
-set g_monster_knight_attack_fireball_damage 30
-set g_monster_knight_attack_fireball_damagetime 1
-set g_monster_knight_attack_fireball_edgedamage 10
-set g_monster_knight_attack_fireball_force 50
-set g_monster_knight_attack_fireball_radius 70
-set g_monster_knight_attack_inferno_chance 0.4
-set g_monster_knight_attack_inferno_damage 40
-set g_monster_knight_attack_inferno_damagetime 3
-set g_monster_knight_attack_jump_chance 0.2
-set g_monster_knight_attack_jump_damage 25
-set g_monster_knight_attack_jump_distance 500
-set g_monster_knight_attack_melee_damage 20
-set g_monster_knight_attack_spike_chance 0.5
-set g_monster_knight_attack_spike_damage 20
-set g_monster_knight_attack_spike_edgedamage 10
-set g_monster_knight_attack_spike_force 5
-set g_monster_knight_attack_spike_radius 20
-set g_monster_knight_health 300
-set g_monster_knight_speed_run 150
-set g_monster_knight_speed_stop 100
-set g_monster_knight_speed_walk 75
+// {{{ #1: Zombie
+set g_monster_zombie_attack_leap_damage 50
+set g_monster_zombie_attack_leap_delay 1.5
+set g_monster_zombie_attack_leap_force 55
+set g_monster_zombie_attack_leap_speed 500
+set g_monster_zombie_attack_melee_damage 40
+set g_monster_zombie_attack_melee_delay 1.2
+set g_monster_zombie_health 150
+set g_monster_zombie_speed_run 400
+set g_monster_zombie_speed_stop 100
+set g_monster_zombie_speed_walk 150
// }}}
-// {{{ #9: Stingray
-set g_monster_stingray_attack_bite_damage 25
-set g_monster_stingray_attack_bite_delay 0.5
-set g_monster_stingray_health 115
-set g_monster_stingray_speed_run 200
-set g_monster_stingray_speed_stop 10
-set g_monster_stingray_speed_walk 40
+// {{{ #2: Spider
+set g_monster_spider_attack_bite_damage 35
+set g_monster_spider_attack_bite_delay 1.2
+set g_monster_spider_attack_type 0
+set g_monster_spider_attack_web_damagetime 2
+set g_monster_spider_attack_web_delay 1.5
+set g_monster_spider_attack_web_speed 1000
+set g_monster_spider_attack_web_speed_up 150
+set g_monster_spider_health 160
+set g_monster_spider_speed_run 400
+set g_monster_spider_speed_stop 100
+set g_monster_spider_speed_walk 150
// }}}
-// {{{ #10: Mage
+// {{{ #3: Mage
set g_monster_mage_attack_spike_accel 400
set g_monster_mage_attack_spike_damage 30
set g_monster_mage_attack_spike_decel 400
set g_monster_mage_speed_stop 50
set g_monster_mage_speed_walk 50
// }}}
-// {{{ #11: Zombie
-set g_monster_zombie_attack_leap_damage 50
-set g_monster_zombie_attack_leap_delay 1.5
-set g_monster_zombie_attack_leap_force 55
-set g_monster_zombie_attack_leap_speed 500
-set g_monster_zombie_attack_melee_damage 40
-set g_monster_zombie_attack_melee_delay 1.2
-set g_monster_zombie_health 150
-set g_monster_zombie_speed_run 400
-set g_monster_zombie_speed_stop 100
-set g_monster_zombie_speed_walk 150
+// {{{ #4: Wyvern
+set g_monster_wyvern_attack_fireball_damage 30
+set g_monster_wyvern_attack_fireball_damagetime 3
+set g_monster_wyvern_attack_fireball_edgedamage 20
+set g_monster_wyvern_attack_fireball_force 50
+set g_monster_wyvern_attack_fireball_radius 120
+set g_monster_wyvern_attack_fireball_speed 900
+set g_monster_wyvern_health 95
+set g_monster_wyvern_speed_run 120
+set g_monster_wyvern_speed_stop 300
+set g_monster_wyvern_speed_walk 40
// }}}
-// {{{ #12: Spider
-set g_monster_spider_attack_bite_damage 35
-set g_monster_spider_attack_bite_delay 1.2
-set g_monster_spider_attack_type 0
-set g_monster_spider_attack_web_damagetime 2
-set g_monster_spider_attack_web_delay 1.5
-set g_monster_spider_attack_web_speed 1000
-set g_monster_spider_attack_web_speed_up 150
-set g_monster_spider_health 160
-set g_monster_spider_speed_run 400
-set g_monster_spider_speed_stop 100
-set g_monster_spider_speed_walk 150
+// {{{ #5: Shambler
+set g_monster_shambler_attack_claw_damage 50
+set g_monster_shambler_attack_lightning_damage 15
+set g_monster_shambler_attack_smash_damage 50
+set g_monster_shambler_health 500
+set g_monster_shambler_speed_run 150
+set g_monster_shambler_speed_stop 300
+set g_monster_shambler_speed_walk 100
// }}}
// {{{ Misc
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_MAGE, DEATH_SELF_MON_MAGE, DEATH_MURDER_MONSTER, DEATH_MONSTER_FIRST) \
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) \
-#include "monster/brute.qc"
-#include "monster/animus.qc"
-#include "monster/shambler.qc"
-#include "monster/bruiser.qc"
-#include "monster/wyvern.qc"
-#include "monster/cerberus.qc"
-#include "monster/slime.qc"
-#include "monster/knight.qc"
-#include "monster/stingray.qc"
-#include "monster/mage.qc"
#include "monster/zombie.qc"
#include "monster/spider.qc"
+#include "monster/mage.qc"
+#include "monster/wyvern.qc"
+#include "monster/shambler.qc"
+++ /dev/null
-#ifdef REGISTER_MONSTER
-REGISTER_MONSTER(
-/* MON_##id */ ANIMUS,
-/* function */ m_animus,
-/* spawnflags */ MONSTER_SIZE_BROKEN | MON_FLAG_MELEE | MON_FLAG_MUTATORBLOCKED,
-/* mins,maxs */ '-41 -41 -31', '41 41 31',
-/* model */ "demon.mdl",
-/* netname */ "animus",
-/* fullname */ _("Animus")
-);
-
-#define ANIMUS_SETTINGS(monster) \
- MON_ADD_CVAR(monster, health) \
- MON_ADD_CVAR(monster, attack_jump_damage) \
- MON_ADD_CVAR(monster, attack_melee_damage) \
- MON_ADD_CVAR(monster, speed_stop) \
- MON_ADD_CVAR(monster, speed_run) \
- MON_ADD_CVAR(monster, speed_walk)
-
-#ifdef SVQC
-ANIMUS_SETTINGS(animus)
-#endif // SVQC
-#else
-#ifdef SVQC
-const float animus_anim_stand = 0;
-const float animus_anim_walk = 1;
-const float animus_anim_run = 2;
-const float animus_anim_leap = 3;
-const float animus_anim_pain = 4;
-const float animus_anim_death = 5;
-const float animus_anim_attack = 6;
-
-void animus_touch_jump()
-{
- if (self.health <= 0)
- return;
-
- if (monster_isvalidtarget(other, self))
- {
- if (vlen(self.velocity) > 300)
- {
- Damage(other, self, self, MON_CVAR(animus, attack_jump_damage) * monster_skill, DEATH_MONSTER_ANIMUS, other.origin, normalize(other.origin - self.origin));
- self.touch = MonsterTouch; // instantly turn it off to stop damage spam
- }
- }
-
- if(trace_dphitcontents)
- self.touch = MonsterTouch;
-}
-
-float animus_attack(float attack_type)
-{
- switch(attack_type)
- {
- case MONSTER_ATTACK_MELEE:
- {
- return monster_melee(self.enemy, MON_CVAR(animus, attack_melee_damage), animus_anim_attack, self.attack_range, 1, DEATH_MONSTER_ANIMUS, TRUE);
- }
- case MONSTER_ATTACK_RANGED:
- {
- makevectors(self.angles);
- return monster_leap(animus_anim_leap, animus_touch_jump, v_forward * 700 + '0 0 300', 0.8);
- }
- }
-
- return FALSE;
-}
-
-void spawnfunc_monster_animus()
-{
- self.classname = "monster_animus";
-
- self.monster_spawnfunc = spawnfunc_monster_animus;
-
- if(Monster_CheckAppearFlags(self))
- return;
-
- if not(monster_initialize(MON_ANIMUS, FALSE)) { remove(self); return; }
-}
-
-// compatibility with old spawns
-void spawnfunc_monster_demon1() { spawnfunc_monster_animus(); }
-void spawnfunc_monster_demon() { spawnfunc_monster_animus(); }
-
-float m_animus(float req)
-{
- switch(req)
- {
- case MR_THINK:
- {
- monster_move(MON_CVAR(animus, speed_run), MON_CVAR(animus, speed_walk), MON_CVAR(animus, speed_stop), animus_anim_run, animus_anim_walk, animus_anim_stand);
- return TRUE;
- }
- case MR_DEATH:
- {
- self.frame = animus_anim_death;
- return TRUE;
- }
- case MR_SETUP:
- {
- if not(self.health) self.health = MON_CVAR(animus, health);
-
- self.monster_loot = spawnfunc_item_health_medium;
- self.monster_attackfunc = animus_attack;
- self.frame = animus_anim_stand;
-
- return TRUE;
- }
- case MR_PRECACHE:
- {
- precache_model ("models/monsters/demon.mdl");
- return TRUE;
- }
- case MR_CONFIG:
- {
- MON_CONFIG_SETTINGS(ANIMUS_SETTINGS(animus))
- return TRUE;
- }
- }
-
- return TRUE;
-}
-
-#endif // SVQC
-#ifdef CSQC
-float m_animus(float req)
-{
- switch(req)
- {
- case MR_PRECACHE:
- {
- precache_model ("models/monsters/demon.mdl");
- return TRUE;
- }
- }
-
- return TRUE;
-}
-
-#endif // CSQC
-#endif // REGISTER_MONSTER
+++ /dev/null
-#ifdef REGISTER_MONSTER
-REGISTER_MONSTER(
-/* MON_##id */ BRUISER,
-/* function */ m_bruiser,
-/* spawnflags */ MONSTER_SIZE_BROKEN | MON_FLAG_MELEE | MON_FLAG_MUTATORBLOCKED,
-/* mins,maxs */ '-20 -20 -31', '20 20 53',
-/* model */ "knight.mdl",
-/* netname */ "bruiser",
-/* fullname */ _("Bruiser")
-);
-
-#define BRUISER_SETTINGS(monster) \
- MON_ADD_CVAR(monster, health) \
- MON_ADD_CVAR(monster, attack_melee_damage) \
- MON_ADD_CVAR(monster, speed_stop) \
- MON_ADD_CVAR(monster, speed_run) \
- MON_ADD_CVAR(monster, speed_walk)
-
-#ifdef SVQC
-BRUISER_SETTINGS(bruiser)
-#endif // SVQC
-#else
-#ifdef SVQC
-const float bruiser_anim_stand = 0;
-const float bruiser_anim_run = 1;
-const float bruiser_anim_runattack = 2;
-const float bruiser_anim_pain1 = 3;
-const float bruiser_anim_pain2 = 4;
-const float bruiser_anim_attack = 5;
-const float bruiser_anim_walk = 6;
-const float bruiser_anim_kneel = 7;
-const float bruiser_anim_standing = 8;
-const float bruiser_anim_death1 = 9;
-const float bruiser_anim_death2 = 10;
-
-float bruiser_attack(float attack_type)
-{
- switch(attack_type)
- {
- case MONSTER_ATTACK_MELEE:
- {
- float len = vlen(self.velocity);
-
- return monster_melee(self.enemy, MON_CVAR(bruiser, attack_melee_damage), ((len < 50) ? bruiser_anim_attack : bruiser_anim_runattack), self.attack_range, 1.25, DEATH_MONSTER_BRUISER, FALSE);
- }
- case MONSTER_ATTACK_RANGED:
- {
- // no ranged attacks for bruiser
- return FALSE;
- }
- }
-
- return FALSE;
-}
-
-void spawnfunc_monster_bruiser()
-{
- self.classname = "monster_bruiser";
-
- self.monster_spawnfunc = spawnfunc_monster_bruiser;
-
- if(Monster_CheckAppearFlags(self))
- return;
-
- if not(monster_initialize(MON_BRUISER, FALSE)) { remove(self); return; }
-}
-
-float m_bruiser(float req)
-{
- switch(req)
- {
- case MR_THINK:
- {
- entity pet = world;
- pet = findentity(pet, monster_owner, self);
- float rspeed = MON_CVAR(bruiser, speed_run);
-
- if(pet)
- if(self.enemy)
- if(vlen(self.enemy.origin - pet.origin) < vlen(self.enemy.origin - self.origin))
- rspeed = 0;
-
- monster_move(rspeed, MON_CVAR(bruiser, speed_walk), MON_CVAR(bruiser, speed_stop), bruiser_anim_run, bruiser_anim_walk, bruiser_anim_stand);
- return TRUE;
- }
- case MR_DEATH:
- {
- self.frame = ((random() > 0.5) ? bruiser_anim_death1 : bruiser_anim_death2);
- return TRUE;
- }
- case MR_SETUP:
- {
- if not(self.health) self.health = MON_CVAR(bruiser, health);
-
- self.monster_loot = spawnfunc_item_armor_medium;
- self.monster_attackfunc = bruiser_attack;
- self.frame = bruiser_anim_stand;
-
- return TRUE;
- }
- case MR_PRECACHE:
- {
- precache_model ("models/monsters/knight.mdl");
- return TRUE;
- }
- case MR_CONFIG:
- {
- MON_CONFIG_SETTINGS(BRUISER_SETTINGS(bruiser))
- return TRUE;
- }
- }
-
- return TRUE;
-}
-
-#endif // SVQC
-#ifdef CSQC
-float m_bruiser(float req)
-{
- switch(req)
- {
- case MR_PRECACHE:
- {
- precache_model ("models/monsters/knight.mdl");
- return TRUE;
- }
- }
-
- return TRUE;
-}
-
-#endif // CSQC
-#endif // REGISTER_MONSTER
+++ /dev/null
-#ifdef REGISTER_MONSTER
-REGISTER_MONSTER(
-/* MON_##id */ BRUTE,
-/* function */ m_brute,
-/* spawnflags */ MON_FLAG_MELEE | MON_FLAG_RANGED | MON_FLAG_MUTATORBLOCKED,
-/* mins,maxs */ '-36 -36 -20', '36 36 50',
-/* model */ "ogre.dpm",
-/* netname */ "brute",
-/* fullname */ _("Brute")
-);
-
-#define BRUTE_SETTINGS(monster) \
- MON_ADD_CVAR(monster, health) \
- MON_ADD_CVAR(monster, attack_chainsaw_damage) \
- MON_ADD_CVAR(monster, attack_uzi_bullets) \
- MON_ADD_CVAR(monster, attack_uzi_damage) \
- MON_ADD_CVAR(monster, attack_uzi_force) \
- MON_ADD_CVAR(monster, attack_uzi_chance) \
- MON_ADD_CVAR(monster, attack_grenade_damage) \
- MON_ADD_CVAR(monster, attack_grenade_edgedamage) \
- MON_ADD_CVAR(monster, attack_grenade_force) \
- MON_ADD_CVAR(monster, attack_grenade_radius) \
- MON_ADD_CVAR(monster, attack_grenade_speed) \
- MON_ADD_CVAR(monster, attack_grenade_speed_up) \
- MON_ADD_CVAR(monster, speed_stop) \
- MON_ADD_CVAR(monster, speed_run) \
- MON_ADD_CVAR(monster, speed_walk)
-
-#ifdef SVQC
-BRUTE_SETTINGS(brute)
-#endif // SVQC
-#else
-#ifdef SVQC
-const float brute_anim_idle = 0;
-const float brute_anim_walk = 1;
-const float brute_anim_run = 2;
-const float brute_anim_pain = 3;
-const float brute_anim_swing = 4;
-const float brute_anim_die = 5;
-
-.float brute_cycles;
-
-void brute_blade()
-{
- self.brute_cycles += 1;
- self.angles_y = self.angles_y + random()* 25;
-
- monster_melee(self.enemy, MON_CVAR(brute, attack_chainsaw_damage), brute_anim_swing, self.attack_range, 0, DEATH_MONSTER_BRUTE_BLADE, TRUE);
-
- if(self.brute_cycles <= 4)
- defer(0.2, brute_blade);
-}
-
-void brute_uzi()
-{
- self.brute_cycles += 1;
-
- monster_makevectors(self.enemy);
-
- sound(self, CH_WEAPON_A, "weapons/uzi_fire.wav", VOL_BASE, ATTEN_NORM);
- fireBallisticBullet(CENTER_OR_VIEWOFS(self), v_forward, 0.02, 18000, 5, MON_CVAR(brute, attack_uzi_damage), MON_CVAR(brute, attack_uzi_force), DEATH_MONSTER_BRUTE_UZI, 0, 1, 115);
- endFireBallisticBullet();
-
- if(self.brute_cycles <= MON_CVAR(brute, attack_uzi_bullets))
- defer(0.1, brute_uzi);
-}
-
-void brute_grenade_explode()
-{
- pointparticles(particleeffectnum("grenade_explode"), self.origin, '0 0 0', 1);
- sound(self, CH_SHOTS, "weapons/grenade_impact.wav", VOL_BASE, ATTEN_NORM);
-
- self.event_damage = func_null;
- self.takedamage = DAMAGE_NO;
-
- if(self.movetype == MOVETYPE_NONE)
- self.velocity = self.oldvelocity;
-
- RadiusDamage (self, self.realowner, MON_CVAR(brute, attack_grenade_damage), MON_CVAR(brute, attack_grenade_edgedamage), MON_CVAR(brute, attack_grenade_radius), world, MON_CVAR(brute, attack_grenade_force), self.projectiledeathtype, other);
-
- remove (self);
-}
-
-void brute_grenade_damage(entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector force)
-{
- if (self.health <= 0)
- return;
-
- if (!W_CheckProjectileDamage(inflictor.realowner, self.realowner, deathtype, -1)) // no exceptions
- return; // g_projectiles_damage says to halt
-
- self.health = self.health - damage;
-
- if (self.health <= 0)
- W_PrepareExplosionByDamage(attacker, self.use);
-}
-
-void brute_grenade_touch()
-{
- PROJECTILE_TOUCH;
-
- self.use ();
-}
-
-void brute_grenade_think()
-{
- self.nextthink = time;
- if (time > self.cnt)
- {
- other = world;
- brute_grenade_explode();
- return;
- }
-}
-
-void brute_grenade()
-{
- entity gren;
-
- monster_makevectors(self.enemy);
-
- sound(self, CH_WEAPON_A, "weapons/grenade_fire.wav", VOL_BASE, ATTEN_NORM);
-
- gren = spawn ();
- gren.owner = gren.realowner = self;
- gren.classname = "grenade";
- gren.bot_dodge = TRUE;
- gren.bot_dodgerating = MON_CVAR(brute, attack_grenade_damage);
- gren.movetype = MOVETYPE_BOUNCE;
- PROJECTILE_MAKETRIGGER(gren);
- gren.projectiledeathtype = DEATH_MONSTER_BRUTE_GRENADE;
- setorigin(gren, CENTER_OR_VIEWOFS(self));
- setsize(gren, '-3 -3 -3', '3 3 3');
-
- gren.cnt = time + 5;
- gren.nextthink = time;
- gren.think = brute_grenade_think;
- gren.use = brute_grenade_explode;
- gren.touch = brute_grenade_touch;
-
- gren.takedamage = DAMAGE_YES;
- gren.health = 50;
- gren.damageforcescale = 0;
- gren.event_damage = brute_grenade_damage;
- gren.damagedbycontents = TRUE;
- gren.missile_flags = MIF_SPLASH | MIF_ARC;
- W_SetupProjectileVelocityEx(gren, v_forward, v_up, MON_CVAR(brute, attack_grenade_speed), MON_CVAR(brute, attack_grenade_speed_up), 0, 0, FALSE);
-
- gren.angles = vectoangles (gren.velocity);
- gren.flags = FL_PROJECTILE;
-
- CSQCProjectile(gren, TRUE, PROJECTILE_GRENADE, TRUE);
-}
-
-float brute_attack(float attack_type)
-{
- switch(attack_type)
- {
- case MONSTER_ATTACK_MELEE:
- {
- self.brute_cycles = 0;
- self.attack_finished_single = time + 1.3;
- brute_blade();
-
- return TRUE;
- }
- case MONSTER_ATTACK_RANGED:
- {
- self.brute_cycles = 0;
- if(random() <= MON_CVAR(brute, attack_uzi_chance))
- {
- self.frame = brute_anim_pain;
- self.attack_finished_single = time + 0.8;
- defer(0.1, brute_uzi);
- }
- else
- {
- monster_makevectors(self.enemy);
- brute_grenade();
- self.frame = brute_anim_pain;
- self.attack_finished_single = time + 1.2;
- }
-
- return TRUE;
- }
- }
-
- return FALSE;
-}
-
-void spawnfunc_monster_brute()
-{
- self.classname = "monster_brute";
-
- self.monster_spawnfunc = spawnfunc_monster_brute;
-
- if(Monster_CheckAppearFlags(self))
- return;
-
- if not(monster_initialize(MON_BRUTE, FALSE)) { remove(self); return; }
-}
-
-// compatibility with old spawns
-void spawnfunc_monster_ogre() { spawnfunc_monster_brute(); }
-
-float m_brute(float req)
-{
- switch(req)
- {
- case MR_THINK:
- {
- monster_move(MON_CVAR(brute, speed_run), MON_CVAR(brute, speed_walk), MON_CVAR(brute, speed_stop), brute_anim_run, brute_anim_walk, brute_anim_idle);
- return TRUE;
- }
- case MR_DEATH:
- {
- self.frame = brute_anim_die;
- return TRUE;
- }
- case MR_SETUP:
- {
- if not(self.health) self.health = MON_CVAR(brute, health);
-
- self.monster_loot = spawnfunc_item_bullets;
- self.monster_attackfunc = brute_attack;
- self.frame = brute_anim_idle;
- self.weapon = WEP_GRENADE_LAUNCHER;
-
- return TRUE;
- }
- case MR_PRECACHE:
- {
- precache_model ("models/monsters/ogre.dpm");
- precache_sound ("weapons/uzi_fire.wav");
- precache_sound ("weapons/grenade_impact.wav");
- precache_sound ("weapons/grenade_fire.wav");
- return TRUE;
- }
- case MR_CONFIG:
- {
- MON_CONFIG_SETTINGS(BRUTE_SETTINGS(brute))
- return TRUE;
- }
- }
-
- return TRUE;
-}
-
-#endif // SVQC
-#ifdef CSQC
-float m_brute(float req)
-{
- switch(req)
- {
- case MR_PRECACHE:
- {
- precache_model ("models/monsters/ogre.dpm");
- return TRUE;
- }
- }
-
- return TRUE;
-}
-
-#endif // CSQC
-#endif // REGISTER_MONSTER
+++ /dev/null
-#ifdef REGISTER_MONSTER
-REGISTER_MONSTER(
-/* MON_##id */ CERBERUS,
-/* function */ m_cerberus,
-/* spawnflags */ MON_FLAG_MELEE | MON_FLAG_MUTATORBLOCKED,
-/* mins,maxs */ '-16 -16 -24', '16 16 12',
-/* model */ "dog.dpm",
-/* netname */ "cerberus",
-/* fullname */ _("Cerberus")
-);
-
-#define CERBERUS_SETTINGS(monster) \
- MON_ADD_CVAR(monster, health) \
- MON_ADD_CVAR(monster, attack_bite_damage) \
- MON_ADD_CVAR(monster, attack_jump_damage) \
- MON_ADD_CVAR(monster, speed_stop) \
- MON_ADD_CVAR(monster, speed_run) \
- MON_ADD_CVAR(monster, speed_walk)
-
-#ifdef SVQC
-CERBERUS_SETTINGS(cerberus)
-#endif // SVQC
-#else
-#ifdef SVQC
-const float cerberus_anim_idle = 0;
-const float cerberus_anim_walk = 1;
-const float cerberus_anim_run = 2;
-const float cerberus_anim_attack = 3;
-const float cerberus_anim_die = 4;
-const float cerberus_anim_pain = 5;
-
-.float cerberus_last_trace;
-
-void cerberus_findowner()
-{
- if(time < self.cerberus_last_trace || self.monster_owner)
- return;
-
- entity head;
-
- FOR_EACH_MONSTER(head)
- if(head.health > 0)
- if(head.monsterid == MON_BRUISER)
- if(findentity(world, monster_owner, head) == world)
- if(vlen(head.origin - self.origin) < self.target_range)
- if(SAME_TEAM(head, self))
- if(head.enemy == world)
- {
- self.monster_owner = head;
- break;
- }
-
- self.cerberus_last_trace = time + 3;
-}
-
-void cerberus_checkowner()
-{
- if(time < self.cerberus_last_trace)
- return;
- if(IS_PLAYER(self.monster_owner))
- return; // don't check player masters
-
- if(vlen(self.origin - self.monster_owner.origin) > self.target_range)
- self.monster_owner = world;
- if(self.monster_owner.health < 1)
- self.monster_owner = world;
- if(DIFF_TEAM(self.monster_owner, self))
- self.monster_owner = world;
-
- self.cerberus_last_trace = time + 3;
-}
-
-void cerberus_touch_jump()
-{
- if (other.takedamage)
- if (vlen(self.velocity) > 300)
- {
- Damage(self.enemy, self, self, MON_CVAR(cerberus, attack_jump_damage) * monster_skill, DEATH_MONSTER_CERBERUS_JUMP, self.enemy.origin, normalize(self.enemy.origin - self.origin));
- self.touch = MonsterTouch;
- }
-
- if(trace_dphitcontents)
- self.touch = MonsterTouch;
-}
-
-float cerberus_attack(float attack_type)
-{
- switch(attack_type)
- {
- case MONSTER_ATTACK_MELEE:
- {
- return monster_melee(self.enemy, MON_CVAR(cerberus, attack_bite_damage), cerberus_anim_attack, self.attack_range, 0.7, DEATH_MONSTER_CERBERUS_BITE, TRUE);
- }
- case MONSTER_ATTACK_RANGED:
- {
- makevectors(self.angles);
- return monster_leap(cerberus_anim_attack, cerberus_touch_jump, v_forward * 300 + '0 0 200', 0.8);
- }
- }
-
- return FALSE;
-}
-
-void spawnfunc_monster_cerberus()
-{
- self.classname = "monster_cerberus";
-
- self.monster_spawnfunc = spawnfunc_monster_cerberus;
-
- if(Monster_CheckAppearFlags(self))
- return;
-
- if not(monster_initialize(MON_CERBERUS, FALSE)) { remove(self); return; }
-}
-
-// compatibility with old spawns
-void spawnfunc_monster_dog() { spawnfunc_monster_cerberus(); }
-
-float m_cerberus(float req)
-{
- switch(req)
- {
- case MR_THINK:
- {
- if(self.monster_owner)
- cerberus_checkowner();
- else
- cerberus_findowner();
- monster_move(MON_CVAR(cerberus, speed_run), MON_CVAR(cerberus, speed_walk), MON_CVAR(cerberus, speed_stop), cerberus_anim_run, cerberus_anim_walk, cerberus_anim_idle);
- return TRUE;
- }
- case MR_DEATH:
- {
- if(self.monster_owner.flags & FL_MONSTER)
- self.monster_owner = world;
- self.frame = cerberus_anim_die;
- return TRUE;
- }
- case MR_SETUP:
- {
- if not(self.health) self.health = MON_CVAR(cerberus, health);
-
- self.monster_loot = spawnfunc_item_health_small;
- self.monster_attackfunc = cerberus_attack;
- self.frame = cerberus_anim_idle;
-
- return TRUE;
- }
- case MR_PRECACHE:
- {
- precache_model ("models/monsters/dog.dpm");
- return TRUE;
- }
- case MR_CONFIG:
- {
- MON_CONFIG_SETTINGS(CERBERUS_SETTINGS(cerberus))
- return TRUE;
- }
- }
-
- return TRUE;
-}
-
-#endif // SVQC
-#ifdef CSQC
-float m_cerberus(float req)
-{
- switch(req)
- {
- case MR_PRECACHE:
- {
- precache_model ("models/monsters/dog.dpm");
- return TRUE;
- }
- }
-
- return TRUE;
-}
-
-#endif // CSQC
-#endif // REGISTER_MONSTER
\ No newline at end of file
+++ /dev/null
-#ifdef REGISTER_MONSTER
-REGISTER_MONSTER(
-/* MON_##id */ KNIGHT,
-/* function */ m_knight,
-/* spawnflags */ MONSTER_SIZE_BROKEN | MON_FLAG_MELEE | MON_FLAG_RANGED | MON_FLAG_MUTATORBLOCKED,
-/* mins,maxs */ '-20 -20 -32', '20 20 41',
-/* model */ "hknight.mdl",
-/* netname */ "knight",
-/* fullname */ _("Knight")
-);
-
-#define KNIGHT_SETTINGS(monster) \
- MON_ADD_CVAR(monster, health) \
- MON_ADD_CVAR(monster, attack_melee_damage) \
- MON_ADD_CVAR(monster, attack_inferno_damage) \
- MON_ADD_CVAR(monster, attack_inferno_damagetime) \
- MON_ADD_CVAR(monster, attack_inferno_chance) \
- MON_ADD_CVAR(monster, attack_fireball_damage) \
- MON_ADD_CVAR(monster, attack_fireball_edgedamage) \
- MON_ADD_CVAR(monster, attack_fireball_damagetime) \
- MON_ADD_CVAR(monster, attack_fireball_force) \
- MON_ADD_CVAR(monster, attack_fireball_radius) \
- MON_ADD_CVAR(monster, attack_fireball_chance) \
- MON_ADD_CVAR(monster, attack_spike_damage) \
- MON_ADD_CVAR(monster, attack_spike_edgedamage) \
- MON_ADD_CVAR(monster, attack_spike_force) \
- MON_ADD_CVAR(monster, attack_spike_radius) \
- MON_ADD_CVAR(monster, attack_spike_chance) \
- MON_ADD_CVAR(monster, attack_jump_damage) \
- MON_ADD_CVAR(monster, attack_jump_distance) \
- MON_ADD_CVAR(monster, attack_jump_chance) \
- MON_ADD_CVAR(monster, speed_stop) \
- MON_ADD_CVAR(monster, speed_run) \
- MON_ADD_CVAR(monster, speed_walk)
-
-#ifdef SVQC
-KNIGHT_SETTINGS(knight)
-#endif // SVQC
-#else
-#ifdef SVQC
-const float knight_anim_stand = 0;
-const float knight_anim_walk = 1;
-const float knight_anim_run = 2;
-const float knight_anim_pain = 3;
-const float knight_anim_death1 = 4;
-const float knight_anim_death2 = 5;
-const float knight_anim_charge1 = 6;
-const float knight_anim_magic1 = 7;
-const float knight_anim_magic2 = 8;
-const float knight_anim_charge2 = 9;
-const float knight_anim_slice = 10;
-const float knight_anim_smash = 11;
-const float knight_anim_wattack = 12;
-const float knight_anim_magic3 = 13;
-
-.float knight_cycles;
-
-void knight_inferno()
-{
- if not(self.enemy)
- return;
-
- traceline((self.absmin + self.absmax) * 0.5, (self.enemy.absmin + self.enemy.absmax) * 0.5, TRUE, world);
- if (trace_fraction != 1)
- return; // not visible
-
- self.enemy.effects |= EF_MUZZLEFLASH;
- sound(self.enemy, CHAN_AUTO, "player/lava.wav", 1, ATTEN_NORM);
-
- if(vlen(self.enemy.origin - self.origin) <= 2000)
- Fire_AddDamage(self.enemy, self, MON_CVAR(knight, attack_inferno_damage) * monster_skill, MON_CVAR(knight, attack_inferno_damagetime), DEATH_MONSTER_KNIGHT_INFERNO);
-}
-
-void knight_fireball_explode()
-{
- entity e;
- if(self)
- {
- pointparticles(particleeffectnum("fireball_explode"), self.origin, '0 0 0', 1);
-
- RadiusDamage(self, self.realowner, MON_CVAR(knight, attack_fireball_damage), MON_CVAR(knight, attack_fireball_edgedamage), MON_CVAR(knight, attack_fireball_force), world, MON_CVAR(knight, attack_fireball_radius), self.projectiledeathtype, world);
-
- for(e = world; (e = findfloat(e, takedamage, DAMAGE_AIM)); ) if(vlen(e.origin - self.origin) <= MON_CVAR(knight, attack_inferno_damage))
- Fire_AddDamage(e, self, 5 * monster_skill, MON_CVAR(knight, attack_fireball_damagetime), self.projectiledeathtype);
-
- remove(self);
- }
-}
-
-void knight_fireball_touch()
-{
- PROJECTILE_TOUCH;
-
- knight_fireball_explode();
-}
-
-void knight_fireball()
-{
- entity missile = spawn();
- vector dir = normalize((self.enemy.origin + '0 0 10') - self.origin);
-
- monster_makevectors(self.enemy);
-
- self.effects |= EF_MUZZLEFLASH;
- sound(self, CHAN_WEAPON, "weapons/fireball2.wav", 1, ATTEN_NORM);
-
- missile.owner = missile.realowner = self;
- missile.solid = SOLID_TRIGGER;
- missile.movetype = MOVETYPE_FLYMISSILE;
- missile.projectiledeathtype = DEATH_MONSTER_KNIGHT_FBALL;
- setsize(missile, '-6 -6 -6', '6 6 6');
- setorigin(missile, self.origin + self.view_ofs + v_forward * 14);
- missile.flags = FL_PROJECTILE;
- missile.velocity = dir * 400;
- missile.avelocity = '300 300 300';
- missile.nextthink = time + 5;
- missile.think = knight_fireball_explode;
- missile.enemy = self.enemy;
- missile.touch = knight_fireball_touch;
- CSQCProjectile(missile, TRUE, PROJECTILE_FIREMINE, TRUE);
-}
-
-void knight_spike_explode()
-{
- if(self)
- {
- pointparticles(particleeffectnum("TE_WIZSPIKE"), self.origin, '0 0 0', 1);
-
- RadiusDamage (self, self.realowner, MON_CVAR(knight, attack_spike_damage), MON_CVAR(knight, attack_spike_edgedamage), MON_CVAR(knight, attack_spike_force), world, MON_CVAR(knight, attack_spike_radius), DEATH_MONSTER_KNIGHT_SPIKE, other);
- remove(self);
- }
-}
-
-void knight_spike_touch()
-{
- PROJECTILE_TOUCH;
-
- knight_spike_explode();
-}
-
-void knight_spike()
-{
- entity missile;
- vector dir = normalize((self.enemy.origin + '0 0 10') - self.origin);
-
- self.effects |= EF_MUZZLEFLASH;
-
- missile = spawn ();
- missile.owner = missile.realowner = self;
- missile.solid = SOLID_TRIGGER;
- missile.movetype = MOVETYPE_FLYMISSILE;
- setsize (missile, '0 0 0', '0 0 0');
- setorigin(missile, self.origin + '0 0 10' + v_forward * 14);
- missile.scale = self.scale;
- missile.flags = FL_PROJECTILE;
- missile.velocity = dir * 400;
- missile.avelocity = '300 300 300';
- missile.nextthink = time + 5;
- missile.think = knight_spike_explode;
- missile.enemy = self.enemy;
- missile.touch = knight_spike_touch;
- CSQCProjectile(missile, TRUE, PROJECTILE_CRYLINK, TRUE);
-}
-
-void knight_spikes()
-{
- self.knight_cycles += 1;
- knight_spike();
-
- if(self.knight_cycles <= 7)
- defer(0.1, knight_spikes);
-}
-
-float knight_attack_ranged()
-{
- if not(self.flags & FL_ONGROUND)
- return FALSE;
-
- self.knight_cycles = 0;
-
- RandomSelection_Init();
- RandomSelection_Add(world, 1, "", MON_CVAR(knight, attack_fireball_chance), 1);
- RandomSelection_Add(world, 2, "", MON_CVAR(knight, attack_inferno_chance), 1);
- RandomSelection_Add(world, 3, "", MON_CVAR(knight, attack_spike_chance), 1);
- if(self.health >= 100) RandomSelection_Add(world, 4, "", ((vlen(self.enemy.origin - self.origin) > MON_CVAR(knight, attack_jump_distance)) ? 1 : MON_CVAR(knight, attack_jump_chance)), 1);
-
- switch(RandomSelection_chosen_float)
- {
- case 1:
- {
- self.frame = knight_anim_magic2;
- self.attack_finished_single = time + 2;
- defer(0.4, knight_fireball);
-
- return TRUE;
- }
- case 2:
- {
- self.attack_finished_single = time + 3;
- defer(0.5, knight_inferno);
- return TRUE;
- }
- case 3:
- {
- self.frame = knight_anim_magic3;
- self.attack_finished_single = time + 3;
- defer(0.4, knight_spikes);
-
- return TRUE;
- }
- case 4:
- {
- float er = vlen(self.enemy.origin - self.origin);
-
- if(er >= 400 && er < 1200)
- if(findtrajectorywithleading(self.origin, self.mins, self.maxs, self.enemy, 1000, 0, 10, 0, self))
- {
- self.velocity = findtrajectory_velocity;
- Damage(self.enemy, self, self, MON_CVAR(knight, attack_jump_damage) * monster_skill, DEATH_MONSTER_KNIGHT_CRUSH, self.enemy.origin, normalize(self.enemy.origin - self.origin));
- self.attack_finished_single = time + 2;
- return TRUE;
- }
- return FALSE;
- }
- }
-
- return FALSE;
-}
-
-float knight_attack(float attack_type)
-{
- switch(attack_type)
- {
- case MONSTER_ATTACK_MELEE:
- {
- float anim;
- if(random() < 0.3)
- anim = knight_anim_slice;
- else if(random() < 0.6)
- anim = knight_anim_smash;
- else
- anim = knight_anim_wattack;
-
- return monster_melee(self.enemy, MON_CVAR(knight, attack_melee_damage), anim, self.attack_range, 0.7, DEATH_MONSTER_KNIGHT_MELEE, TRUE);
- }
- case MONSTER_ATTACK_RANGED:
- {
- return knight_attack_ranged();
- }
- }
-
- return FALSE;
-}
-
-void spawnfunc_monster_knight()
-{
- self.classname = "monster_knight";
-
- self.monster_spawnfunc = spawnfunc_monster_knight;
-
- if(Monster_CheckAppearFlags(self))
- return;
-
- if not(monster_initialize(MON_KNIGHT, FALSE)) { remove(self); return; }
-}
-
-// compatibility with old spawns
-void spawnfunc_monster_hell_knight() { spawnfunc_monster_knight(); }
-
-float m_knight(float req)
-{
- switch(req)
- {
- case MR_THINK:
- {
- monster_move(MON_CVAR(knight, speed_run), MON_CVAR(knight, speed_walk), MON_CVAR(knight, speed_stop), knight_anim_run, knight_anim_walk, knight_anim_stand);
- return TRUE;
- }
- case MR_DEATH:
- {
- float chance = random();
- self.frame = ((random() > 0.5) ? knight_anim_death1 : knight_anim_death2);
- if(chance < 0.10 || self.spawnflags & MONSTERFLAG_MINIBOSS)
- if(self.candrop)
- {
- self.superweapons_finished = time + autocvar_g_balance_superweapons_time + 5; // give the player a few seconds to find the weapon
- self.weapon = WEP_FIREBALL;
- }
- return TRUE;
- }
- case MR_SETUP:
- {
- if not(self.health) self.health = MON_CVAR(knight, health);
-
- self.monster_loot = spawnfunc_item_armor_big;
- self.monster_attackfunc = knight_attack;
- self.frame = knight_anim_stand;
-
- return TRUE;
- }
- case MR_PRECACHE:
- {
- precache_model ("models/monsters/hknight.mdl");
- precache_sound ("player/lava.wav");
- precache_sound ("weapons/fireball2.wav");
- return TRUE;
- }
- case MR_CONFIG:
- {
- MON_CONFIG_SETTINGS(KNIGHT_SETTINGS(knight))
- return TRUE;
- }
- }
-
- return TRUE;
-}
-
-#endif // SVQC
-#ifdef CSQC
-float m_knight(float req)
-{
- switch(req)
- {
- case MR_PRECACHE:
- {
- precache_model ("models/monsters/hknight.mdl");
- return TRUE;
- }
- }
-
- return TRUE;
-}
-
-#endif // CSQC
-#endif // REGISTER_MONSTER
+++ /dev/null
-#ifdef REGISTER_MONSTER
-REGISTER_MONSTER(
-/* MON_##id */ SLIME,
-/* function */ m_slime,
-/* spawnflags */ MON_FLAG_MUTATORBLOCKED,
-/* mins,maxs */ '-16 -16 -24', '16 16 16',
-/* model */ "slime.dpm",
-/* netname */ "slime",
-/* fullname */ _("Slime")
-);
-
-#define SLIME_SETTINGS(monster) \
- MON_ADD_CVAR(monster, health) \
- MON_ADD_CVAR(monster, attack_explode_damage) \
- MON_ADD_CVAR(monster, speed_stop) \
- MON_ADD_CVAR(monster, speed_run) \
- MON_ADD_CVAR(monster, speed_walk)
-
-#ifdef SVQC
-SLIME_SETTINGS(slime)
-#endif // SVQC
-#else
-#ifdef SVQC
-const float slime_anim_walk = 0;
-const float slime_anim_idle = 1;
-const float slime_anim_jump = 2;
-const float slime_anim_fly = 3;
-const float slime_anim_die = 4;
-const float slime_anim_pain = 5;
-
-void slime_touch_jump()
-{
- if(self.health > 0)
- if(other.health > 0)
- if(other.takedamage)
- if(vlen(self.velocity) > 200)
- {
- Damage (self, world, world, MON_CVAR(slime, attack_explode_damage), DEATH_MONSTER_SLIME, self.origin, '0 0 0');
-
- return;
- }
-
- if(trace_dphitcontents)
- {
- self.touch = MonsterTouch;
- self.movetype = MOVETYPE_WALK;
- }
-}
-
-float slime_attack(float attack_type)
-{
- switch(attack_type)
- {
- case MONSTER_ATTACK_MELEE:
- case MONSTER_ATTACK_RANGED:
- {
- makevectors(self.angles);
- return monster_leap(slime_anim_jump, slime_touch_jump, v_forward * 600 + '0 0 200', 0.5);
- }
- }
-
- return FALSE;
-}
-
-void slime_explode()
-{
- RadiusDamage(self, self, MON_CVAR(slime, attack_explode_damage), 15, MON_CVAR(slime, attack_explode_damage) * 0.7, world, 250, DEATH_MONSTER_SLIME, world);
- pointparticles(particleeffectnum("explosion_medium"), self.origin, '0 0 0', 1);
- sound(self, CH_SHOTS, "weapons/rocket_impact.wav", VOL_BASE, ATTEN_NORM);
-
- setmodel(self, "null");
-}
-
-void slime_dead()
-{
- self.health = -100; // gibbed
- slime_explode();
-
- self.deadflag = DEAD_DEAD;
- self.think = Monster_Fade;
- self.nextthink = time + 0.1;
-
- CSQCMODEL_AUTOUPDATE(); // called now to update model
-}
-
-void spawnfunc_monster_slime()
-{
- self.classname = "monster_slime";
-
- self.monster_spawnfunc = spawnfunc_monster_slime;
-
- if(Monster_CheckAppearFlags(self))
- return;
-
- if not(monster_initialize(MON_SLIME, FALSE)) { remove(self); return; }
-}
-
-// compatibility with old spawns
-void spawnfunc_monster_tarbaby() { spawnfunc_monster_slime(); }
-
-float m_slime(float req)
-{
- switch(req)
- {
- case MR_THINK:
- {
- monster_move(MON_CVAR(slime, speed_run), MON_CVAR(slime, speed_walk), MON_CVAR(slime, speed_stop), slime_anim_walk, slime_anim_walk, slime_anim_idle);
- return TRUE;
- }
- case MR_DEATH:
- {
- self.think = slime_dead;
- self.nextthink = time;
- self.event_damage = func_null;
- self.movetype = MOVETYPE_NONE;
- self.takedamage = DAMAGE_NO;
- self.enemy = world;
- self.health = 0;
-
- return TRUE;
- }
- case MR_SETUP:
- {
- if not(self.health) self.health = MON_CVAR(slime, health);
-
- self.monster_loot = spawnfunc_item_rockets;
- self.monster_attackfunc = slime_attack;
- self.frame = slime_anim_idle;
-
- return TRUE;
- }
- case MR_PRECACHE:
- {
- precache_model ("models/monsters/slime.dpm");
- precache_sound ("weapons/rocket_impact.wav");
- return TRUE;
- }
- case MR_CONFIG:
- {
- MON_CONFIG_SETTINGS(SLIME_SETTINGS(slime))
- return TRUE;
- }
- }
-
- return TRUE;
-}
-
-#endif // SVQC
-#ifdef CSQC
-float m_slime(float req)
-{
- switch(req)
- {
- case MR_PRECACHE:
- {
- precache_model ("models/monsters/slime.dpm");
- return TRUE;
- }
- }
-
- return TRUE;
-}
-
-#endif // CSQC
-#endif // REGISTER_MONSTER
+++ /dev/null
-#ifdef REGISTER_MONSTER
-REGISTER_MONSTER(
-/* MON_##id */ STINGRAY,
-/* function */ m_stingray,
-/* spawnflags */ MONSTER_TYPE_SWIM | MONSTER_SIZE_BROKEN | MON_FLAG_MELEE | MON_FLAG_MUTATORBLOCKED,
-/* mins,maxs */ '-20 -20 -31', '20 20 20',
-/* model */ "fish.mdl",
-/* netname */ "stingray",
-/* fullname */ _("Stingray")
-);
-
-#define STINGRAY_SETTINGS(monster) \
- MON_ADD_CVAR(monster, health) \
- MON_ADD_CVAR(monster, attack_bite_damage) \
- MON_ADD_CVAR(monster, attack_bite_delay) \
- MON_ADD_CVAR(monster, speed_stop) \
- MON_ADD_CVAR(monster, speed_run) \
- MON_ADD_CVAR(monster, speed_walk)
-
-#ifdef SVQC
-STINGRAY_SETTINGS(stingray)
-#endif // SVQC
-#else
-#ifdef SVQC
-const float stingray_anim_attack = 0;
-const float stingray_anim_death = 1;
-const float stingray_anim_swim = 2;
-const float stingray_anim_pain = 3;
-
-float stingray_attack(float attack_type)
-{
- switch(attack_type)
- {
- case MONSTER_ATTACK_MELEE:
- {
- return monster_melee(self.enemy, MON_CVAR(stingray, attack_bite_damage), stingray_anim_attack, self.attack_range, MON_CVAR(stingray, attack_bite_delay), DEATH_MONSTER_STINGRAY, FALSE);
- }
- case MONSTER_ATTACK_RANGED:
- {
- // no ranged attack for stingray (yet?)
- return FALSE;
- }
- }
-
- return FALSE;
-}
-
-void spawnfunc_monster_stingray()
-{
- self.classname = "monster_stingray";
-
- self.monster_spawnfunc = spawnfunc_monster_stingray;
-
- if(Monster_CheckAppearFlags(self))
- return;
-
- if not(monster_initialize(MON_STINGRAY, TRUE)) { remove(self); return; }
-}
-
-float m_stingray(float req)
-{
- switch(req)
- {
- case MR_THINK:
- {
- monster_move(MON_CVAR(stingray, speed_run), MON_CVAR(stingray, speed_walk), MON_CVAR(stingray, speed_stop), stingray_anim_swim, stingray_anim_swim, stingray_anim_swim);
- return TRUE;
- }
- case MR_DEATH:
- {
- self.frame = stingray_anim_death;
- return TRUE;
- }
- case MR_SETUP:
- {
- if not(self.health) self.health = MON_CVAR(stingray, health);
-
- self.monster_loot = spawnfunc_item_health_small;
- self.monster_attackfunc = stingray_attack;
- self.frame = stingray_anim_swim;
-
- return TRUE;
- }
- case MR_PRECACHE:
- {
- precache_model ("models/monsters/fish.mdl");
- return TRUE;
- }
- case MR_CONFIG:
- {
- MON_CONFIG_SETTINGS(STINGRAY_SETTINGS(stingray))
- return TRUE;
- }
- }
-
- return TRUE;
-}
-
-#endif // SVQC
-#ifdef CSQC
-float m_stingray(float req)
-{
- switch(req)
- {
- case MR_PRECACHE:
- {
- precache_model ("models/monsters/fish.mdl");
- return TRUE;
- }
- }
-
- return TRUE;
-}
-
-#endif // CSQC
-#endif // REGISTER_MONSTER
const float MON_FLAG_SUPERMONSTER = 256; // incredibly powerful monster
const float MON_FLAG_RANGED = 512; // monster shoots projectiles
const float MON_FLAG_MELEE = 1024;
-const float MON_FLAG_MUTATORBLOCKED = 2048;
// entity properties of monsterinfo:
.float monsterid; // MON_...
return FALSE;
entity mon = get_monsterinfo(mon_id);
-
- if(mon.spawnflags & MON_FLAG_MUTATORBLOCKED && !(self.spawnflags & MONSTERFLAG_SPAWNED))
- {
- dprint("Attempted to spawn a mutator-blocked monster rejected");
- return FALSE;
- }
// support for quake style removing monsters based on skill
if(monster_skill <= 1) if(self.spawnflags & MONSTERSKILL_NOTEASY) { return FALSE; }
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_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) \
me.TD(me, 1, 0.25, e = makeXonoticTextLabel(0, _("Monster:")));
me.TR(me);
me.TD(me, 1, 0.4, e = makeXonoticRadioButton(2, "menu_monsters_edit_spawn", "zombie", _("Zombie")));
- me.TD(me, 1, 0.4, e = makeXonoticRadioButton(2, "menu_monsters_edit_spawn", "brute", _("Brute")));
- me.TD(me, 1, 0.4, e = makeXonoticRadioButton(2, "menu_monsters_edit_spawn", "animus", _("Animus")));
me.TD(me, 1, 0.4, e = makeXonoticRadioButton(2, "menu_monsters_edit_spawn", "spider", _("Spider")));
- me.TD(me, 1, 0.4, e = makeXonoticRadioButton(2, "menu_monsters_edit_spawn", "bruiser", _("Bruiser")));
- me.TD(me, 1, 0.4, e = makeXonoticRadioButton(2, "menu_monsters_edit_spawn", "knight", _("Knight")));
me.TD(me, 1, 0.4, e = makeXonoticRadioButton(2, "menu_monsters_edit_spawn", "shambler", _("Shambler")));
- me.TR(me);
- me.TD(me, 1, 0.4, e = makeXonoticRadioButton(2, "menu_monsters_edit_spawn", "cerberus", _("Cerberus")));
- me.TD(me, 1, 0.4, e = makeXonoticRadioButton(2, "menu_monsters_edit_spawn", "slime", _("Slime")));
- me.TD(me, 1, 0.4, e = makeXonoticRadioButton(2, "menu_monsters_edit_spawn", "stingray", _("Stingray")));
me.TD(me, 1, 0.4, e = makeXonoticRadioButton(2, "menu_monsters_edit_spawn", "mage", _("Mage")));
me.TD(me, 1, 0.4, e = makeXonoticRadioButton(2, "menu_monsters_edit_spawn", "wyvern", _("Wyvern")));
me.TR(me);
MUTATOR_ONADD
{
- float i;
-
if(time > 1) // game loads at time 1
error("This is a game type and it cannot be added at runtime.");
invasion_Initialize();
cvar_settemp("g_monsters", "1");
-
- for(i = MON_FIRST; i <= MON_LAST; ++i)
- get_monsterinfo(i).spawnflags &= ~MON_FLAG_MUTATORBLOCKED;
}
MUTATOR_ONROLLBACK_OR_REMOVE
float nt_IsNewToy(float w)
{
- if((get_weaponinfo(w)).weapon)
- {
- switch(w)
- {
- case WEP_SEEKER:
- case WEP_MINE_LAYER:
- case WEP_HLAC:
- case WEP_RIFLE:
- return TRUE;
- }
- }
- else
+ switch(w)
{
- switch(w)
- {
- case MON_ANIMUS:
- case MON_BRUISER:
- case MON_BRUTE:
- case MON_CERBERUS:
- case MON_KNIGHT:
- case MON_SLIME:
- case MON_STINGRAY:
- return TRUE;
- }
+ case WEP_SEEKER:
+ case WEP_MINE_LAYER:
+ case WEP_HLAC:
+ case WEP_RIFLE:
+ return TRUE;
+ default:
+ return FALSE;
}
-
- return FALSE;
}
string nt_GetFullReplacement(string w)
for(i = WEP_FIRST; i <= WEP_LAST; ++i)
if(nt_IsNewToy(i))
get_weaponinfo(i).spawnflags &= ~WEP_FLAG_MUTATORBLOCKED;
-
- for(i = MON_FIRST; i <= MON_LAST; ++i)
- if(nt_IsNewToy(i))
- get_monsterinfo(i).spawnflags &= ~MON_FLAG_MUTATORBLOCKED;
}
MUTATOR_ONROLLBACK_OR_REMOVE
for(i = WEP_FIRST; i <= WEP_LAST; ++i)
if(nt_IsNewToy(i))
get_weaponinfo(i).spawnflags |= WEP_FLAG_MUTATORBLOCKED;
-
- for(i = MON_FIRST; i <= MON_LAST; ++i)
- if(nt_IsNewToy(i))
- get_monsterinfo(i).spawnflags |= MON_FLAG_MUTATORBLOCKED;
}
MUTATOR_ONREMOVE
map textures/spidertex
}
}
-textures/cerberus/cerberus_text
-{
- cull none
-
- {
- map textures/cerberus
- }
-}
-textures/berzerker_texture
-{
- cull none
-
- {
- map textures/ogre
- }
-}
mage
{
cull none
{
map textures/mage
}
-}
-slimeDiffuse
-{
- {
- map textures/slime
- alphaFunc GT0
- rgbGen Vertex
- }
}
\ No newline at end of file