2 float autocvar_g_monster_demon;
3 float autocvar_g_monster_demon_health;
4 float autocvar_g_monster_demon_attack_jump_damage;
5 float autocvar_g_monster_demon_damage;
6 float autocvar_g_monster_demon_speed_walk;
7 float autocvar_g_monster_demon_speed_run;
10 const vector DEMON_MIN = '-32 -32 -24';
11 const vector DEMON_MAX = '32 32 24';
14 #define demon_anim_stand 0
15 #define demon_anim_walk 1
16 #define demon_anim_run 2
17 #define demon_anim_leap 3
18 #define demon_anim_pain 4
19 #define demon_anim_death 5
20 #define demon_anim_attack 6
24 self.think = demon_think;
25 self.nextthink = time + 0.1;
27 monster_move(autocvar_g_monster_demon_speed_run, autocvar_g_monster_demon_speed_walk, 100, demon_anim_run, demon_anim_walk, demon_anim_stand);
30 void demon_attack_melee ()
32 float bigdmg = autocvar_g_monster_demon_damage * self.scale;
34 self.frame = demon_anim_attack;
35 self.attack_finished_single = time + 1;
37 monster_melee(self.enemy, bigdmg * monster_skill, 120, DEATH_MONSTER_DEMON_MELEE);
40 void Demon_JumpTouch ()
45 float bigdmg = autocvar_g_monster_demon_attack_jump_damage * self.scale;
47 if (monster_isvalidtarget(other, self, FALSE))
49 if (vlen(self.velocity) > 300)
51 Damage(other, self, self, bigdmg * monster_skill, DEATH_MONSTER_DEMON_JUMP, other.origin, normalize(other.origin - self.origin));
52 self.touch = MonsterTouch; // instantly turn it off to stop damage spam
56 if(self.flags & FL_ONGROUND)
57 self.touch = MonsterTouch;
62 makevectors(self.angles);
63 if(monster_leap(demon_anim_leap, Demon_JumpTouch, v_forward * 700 + '0 0 300', 0.8))
71 Monster_CheckDropCvars ("demon");
73 self.frame = demon_anim_death;
74 self.think = Monster_Fade;
75 self.solid = SOLID_NOT;
76 self.takedamage = DAMAGE_NO;
77 self.event_damage = func_null;
78 self.movetype = MOVETYPE_TOSS;
80 self.nextthink = time + 3;
81 self.pain_finished = self.nextthink;
83 monster_hook_death(); // for post-death mods
89 self.health = autocvar_g_monster_demon_health * self.scale;
91 self.damageforcescale = 0;
92 self.classname = "monster_demon";
93 self.checkattack = GenericCheckAttack;
94 self.attack_melee = demon_attack_melee;
95 self.attack_ranged = demon_jump;
96 self.nextthink = time + random() * 0.5 + 0.1;
97 self.frame = demon_anim_stand;
98 self.think = demon_think;
99 self.sprite_height = 30 * self.scale;
101 monster_hook_spawn(); // for post-spawn mods
104 /* QUAKED monster_demon (1 0 0) (-32 -32 -24) (32 32 64) Ambush */
105 void spawnfunc_monster_demon ()
107 if not(autocvar_g_monster_demon)
113 self.monster_spawnfunc = spawnfunc_monster_demon;
115 if(self.spawnflags & MONSTERFLAG_APPEAR)
117 self.think = func_null;
119 self.use = Monster_Appear;
125 if not (monster_initialize(
127 "models/monsters/demon.mdl",
128 DEMON_MIN, DEMON_MAX,
130 demon_die, demon_spawn))
137 // Compatibility with old spawns
138 void spawnfunc_monster_demon1 () { spawnfunc_monster_demon(); }