3 const vector DEMON_MIN = '-32 -32 -24';
4 const vector DEMON_MAX = '32 32 24';
7 string DEMON_MODEL = "models/monsters/demon.mdl";
13 float autocvar_g_monster_demon;
14 float autocvar_g_monster_demon_health;
15 float autocvar_g_monster_demon_attack_jump_damage;
16 float autocvar_g_monster_demon_damage;
17 float autocvar_g_monster_demon_speed_walk;
18 float autocvar_g_monster_demon_speed_run;
21 const float demon_anim_stand = 0;
22 const float demon_anim_walk = 1;
23 const float demon_anim_run = 2;
24 const float demon_anim_leap = 3;
25 const float demon_anim_pain = 4;
26 const float demon_anim_death = 5;
27 const float demon_anim_attack = 6;
31 self.think = demon_think;
32 self.nextthink = time + self.ticrate;
34 monster_move(autocvar_g_monster_demon_speed_run, autocvar_g_monster_demon_speed_walk, 100, demon_anim_run, demon_anim_walk, demon_anim_stand);
37 void demon_attack_melee ()
39 monsters_setframe(demon_anim_attack);
40 self.attack_finished_single = time + 1;
42 monster_melee(self.enemy, autocvar_g_monster_demon_damage, 0.3, DEATH_MONSTER_FIEND, TRUE);
45 void Demon_JumpTouch ()
50 float bigdmg = autocvar_g_monster_demon_attack_jump_damage * self.scale;
52 if (monster_isvalidtarget(other, self))
54 if (vlen(self.velocity) > 300)
56 Damage(other, self, self, bigdmg * monster_skill, DEATH_MONSTER_FIEND, other.origin, normalize(other.origin - self.origin));
57 self.touch = MonsterTouch; // instantly turn it off to stop damage spam
61 if(self.flags & FL_ONGROUND)
62 self.touch = MonsterTouch;
67 makevectors(self.angles);
68 if(monster_leap(demon_anim_leap, Demon_JumpTouch, v_forward * 700 + '0 0 300', 0.8))
76 Monster_CheckDropCvars ("demon");
78 self.think = monster_dead_think;
79 self.nextthink = time + self.ticrate;
80 self.ltime = time + 5;
81 monsters_setframe(demon_anim_death);
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.think = demon_think;
99 monsters_setframe(demon_anim_stand);
101 monster_setupsounds("demon");
103 monster_hook_spawn(); // for post-spawn mods
106 void spawnfunc_monster_demon ()
108 if not(autocvar_g_monster_demon) { remove(self); return; }
110 self.monster_spawnfunc = spawnfunc_monster_demon;
112 if(Monster_CheckAppearFlags(self))
117 if not (monster_initialize(
118 "Fiend", MONSTER_DEMON,
119 DEMON_MIN, DEMON_MAX,
121 demon_die, demon_spawn))
128 // Compatibility with old spawns
129 void spawnfunc_monster_demon1 () { spawnfunc_monster_demon(); }