]> git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blob - qcsrc/common/monsters/monster/bruiser.qc
Add a cvar to control monster attack range
[xonotic/xonotic-data.pk3dir.git] / qcsrc / common / monsters / monster / bruiser.qc
1 #ifdef REGISTER_MONSTER
2 REGISTER_MONSTER(
3 /* MON_##id   */ BRUISER,
4 /* function   */ m_bruiser,
5 /* spawnflags */ MONSTER_SIZE_BROKEN,
6 /* mins,maxs  */ '-20 -20 -31', '20 20 53',
7 /* model      */ "knight.mdl",
8 /* netname    */ "bruiser",
9 /* fullname   */ _("Bruiser")
10 );
11
12 #define BRUISER_SETTINGS(monster) \
13         MON_ADD_CVAR(monster, health) \
14         MON_ADD_CVAR(monster, attack_melee_damage) \
15         MON_ADD_CVAR(monster, speed_stop) \
16         MON_ADD_CVAR(monster, speed_run) \
17         MON_ADD_CVAR(monster, speed_walk) 
18
19 #ifdef SVQC
20 BRUISER_SETTINGS(bruiser)
21 #endif // SVQC
22 #else
23 #ifdef SVQC
24 const float bruiser_anim_stand          = 0;
25 const float bruiser_anim_run            = 1;
26 const float bruiser_anim_runattack      = 2;
27 const float bruiser_anim_pain1          = 3;
28 const float bruiser_anim_pain2          = 4;
29 const float bruiser_anim_attack         = 5;
30 const float bruiser_anim_walk           = 6;
31 const float bruiser_anim_kneel          = 7;
32 const float bruiser_anim_standing       = 8;
33 const float bruiser_anim_death1         = 9;
34 const float bruiser_anim_death2         = 10;
35
36 float bruiser_attack(float attack_type)
37 {
38         switch(attack_type)
39         {
40                 case MONSTER_ATTACK_MELEE:
41                 {
42                         float len = vlen(self.velocity);
43                         monsters_setframe((len < 50) ? bruiser_anim_attack : bruiser_anim_runattack);
44                         self.attack_finished_single = time + 1.25;
45                         
46                         monster_melee(self.enemy, MON_CVAR(bruiser, attack_melee_damage), self.attack_range, DEATH_MONSTER_BRUISER, FALSE);
47                         
48                         return TRUE;
49                 }
50                 case MONSTER_ATTACK_RANGED:
51                 {
52                         // no ranged attacks for bruiser
53                         return FALSE;
54                 }
55         }
56         
57         return FALSE;
58 }
59
60 void spawnfunc_monster_bruiser()
61 {
62         self.classname = "monster_bruiser";
63         
64         self.monster_spawnfunc = spawnfunc_monster_bruiser;
65         
66         if(Monster_CheckAppearFlags(self))
67                 return;
68         
69         if not(monster_initialize(MON_BRUISER, FALSE)) { remove(self); return; }
70 }
71
72 float m_bruiser(float req)
73 {
74         switch(req)
75         {
76                 case MR_THINK:
77                 {
78                         entity pet = world;
79                         pet = findentity(pet, monster_owner, self);
80                         float rspeed = MON_CVAR(bruiser, speed_run);
81                         
82                         if(pet)
83                         if(self.enemy)
84                         if(vlen(self.enemy.origin - pet.origin) < vlen(self.enemy.origin - self.origin))
85                                 rspeed = 0;
86                                 
87                         monster_move(rspeed, MON_CVAR(bruiser, speed_walk), MON_CVAR(bruiser, speed_stop), bruiser_anim_run, bruiser_anim_walk, bruiser_anim_stand);
88                         return TRUE;
89                 }
90                 case MR_DEATH:
91                 {
92                         monsters_setframe((random() > 0.5) ? bruiser_anim_death1 : bruiser_anim_death2);
93                         return TRUE;
94                 }
95                 case MR_SETUP:
96                 {
97                         if not(self.health) self.health = MON_CVAR(bruiser, health);
98                         
99                         self.monster_loot = spawnfunc_item_armor_medium;
100                         self.monster_attackfunc = bruiser_attack;
101                         monsters_setframe(bruiser_anim_stand);
102                         
103                         return TRUE;
104                 }
105                 case MR_INIT:
106                 {
107                         // nothing
108                         return TRUE;
109                 }
110                 case MR_CONFIG:
111                 {
112                         MON_CONFIG_SETTINGS(BRUISER_SETTINGS(bruiser))
113                         return TRUE;
114                 }
115         }
116         
117         return TRUE;
118 }
119
120 #endif // SVQC
121 #ifdef CSQC
122 float m_bruiser(float req)
123 {
124         switch(req)
125         {
126                 case MR_DEATH:
127                 {
128                         // nothing
129                         return TRUE;
130                 }
131                 case MR_INIT:
132                 {
133                         precache_model ("models/monsters/knight.mdl");
134                         return TRUE;
135                 }
136         }
137         
138         return TRUE;
139 }
140
141 #endif // CSQC
142 #endif // REGISTER_MONSTER