Quake-2

Quake 2 GPL Source Release
Log | Files | Refs

m_chick.c (15888B)


      1 /*
      2 Copyright (C) 1997-2001 Id Software, Inc.
      3 
      4 This program is free software; you can redistribute it and/or
      5 modify it under the terms of the GNU General Public License
      6 as published by the Free Software Foundation; either version 2
      7 of the License, or (at your option) any later version.
      8 
      9 This program is distributed in the hope that it will be useful,
     10 but WITHOUT ANY WARRANTY; without even the implied warranty of
     11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  
     12 
     13 See the GNU General Public License for more details.
     14 
     15 You should have received a copy of the GNU General Public License
     16 along with this program; if not, write to the Free Software
     17 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
     18 
     19 */
     20 /*
     21 ==============================================================================
     22 
     23 chick
     24 
     25 ==============================================================================
     26 */
     27 
     28 #include "g_local.h"
     29 #include "m_chick.h"
     30 
     31 qboolean visible (edict_t *self, edict_t *other);
     32 
     33 void chick_stand (edict_t *self);
     34 void chick_run (edict_t *self);
     35 void chick_reslash(edict_t *self);
     36 void chick_rerocket(edict_t *self);
     37 void chick_attack1(edict_t *self);
     38 
     39 static int	sound_missile_prelaunch;
     40 static int	sound_missile_launch;
     41 static int	sound_melee_swing;
     42 static int	sound_melee_hit;
     43 static int	sound_missile_reload;
     44 static int	sound_death1;
     45 static int	sound_death2;
     46 static int	sound_fall_down;
     47 static int	sound_idle1;
     48 static int	sound_idle2;
     49 static int	sound_pain1;
     50 static int	sound_pain2;
     51 static int	sound_pain3;
     52 static int	sound_sight;
     53 static int	sound_search;
     54 
     55 
     56 void ChickMoan (edict_t *self)
     57 {
     58 	if (random() < 0.5)
     59 		gi.sound (self, CHAN_VOICE, sound_idle1, 1, ATTN_IDLE, 0);
     60 	else
     61 		gi.sound (self, CHAN_VOICE, sound_idle2, 1, ATTN_IDLE, 0);
     62 }
     63 
     64 mframe_t chick_frames_fidget [] =
     65 {
     66 	ai_stand, 0,  NULL,
     67 	ai_stand, 0,  NULL,
     68 	ai_stand, 0,  NULL,
     69 	ai_stand, 0,  NULL,
     70 	ai_stand, 0,  NULL,
     71 	ai_stand, 0,  NULL,
     72 	ai_stand, 0,  NULL,
     73 	ai_stand, 0,  NULL,
     74 	ai_stand, 0,  ChickMoan,
     75 	ai_stand, 0,  NULL,
     76 	ai_stand, 0,  NULL,
     77 	ai_stand, 0,  NULL,
     78 	ai_stand, 0,  NULL,
     79 	ai_stand, 0,  NULL,
     80 	ai_stand, 0,  NULL,
     81 	ai_stand, 0,  NULL,
     82 	ai_stand, 0,  NULL,
     83 	ai_stand, 0,  NULL,
     84 	ai_stand, 0,  NULL,
     85 	ai_stand, 0,  NULL,
     86 	ai_stand, 0,  NULL,
     87 	ai_stand, 0,  NULL,
     88 	ai_stand, 0,  NULL,
     89 	ai_stand, 0,  NULL,
     90 	ai_stand, 0,  NULL,
     91 	ai_stand, 0,  NULL,
     92 	ai_stand, 0,  NULL,
     93 	ai_stand, 0,  NULL,
     94 	ai_stand, 0,  NULL,
     95 	ai_stand, 0,  NULL
     96 };
     97 mmove_t chick_move_fidget = {FRAME_stand201, FRAME_stand230, chick_frames_fidget, chick_stand};
     98 
     99 void chick_fidget (edict_t *self)
    100 {
    101 	if (self->monsterinfo.aiflags & AI_STAND_GROUND)
    102 		return;
    103 	if (random() <= 0.3)
    104 		self->monsterinfo.currentmove = &chick_move_fidget;
    105 }
    106 
    107 mframe_t chick_frames_stand [] =
    108 {
    109 	ai_stand, 0, NULL,
    110 	ai_stand, 0, NULL,
    111 	ai_stand, 0, NULL,
    112 	ai_stand, 0, NULL,
    113 	ai_stand, 0, NULL,
    114 	ai_stand, 0, NULL,
    115 	ai_stand, 0, NULL,
    116 	ai_stand, 0, NULL,
    117 	ai_stand, 0, NULL,
    118 	ai_stand, 0, NULL,
    119 	ai_stand, 0, NULL,
    120 	ai_stand, 0, NULL,
    121 	ai_stand, 0, NULL,
    122 	ai_stand, 0, NULL,
    123 	ai_stand, 0, NULL,
    124 	ai_stand, 0, NULL,
    125 	ai_stand, 0, NULL,
    126 	ai_stand, 0, NULL,
    127 	ai_stand, 0, NULL,
    128 	ai_stand, 0, NULL,
    129 	ai_stand, 0, NULL,
    130 	ai_stand, 0, NULL,
    131 	ai_stand, 0, NULL,
    132 	ai_stand, 0, NULL,
    133 	ai_stand, 0, NULL,
    134 	ai_stand, 0, NULL,
    135 	ai_stand, 0, NULL,
    136 	ai_stand, 0, NULL,
    137 	ai_stand, 0, NULL,
    138 	ai_stand, 0, chick_fidget,
    139 
    140 };
    141 mmove_t chick_move_stand = {FRAME_stand101, FRAME_stand130, chick_frames_stand, NULL};
    142 
    143 void chick_stand (edict_t *self)
    144 {
    145 	self->monsterinfo.currentmove = &chick_move_stand;
    146 }
    147 
    148 mframe_t chick_frames_start_run [] =
    149 {
    150 	ai_run, 1,  NULL,
    151 	ai_run, 0,  NULL,
    152 	ai_run, 0,	 NULL,
    153 	ai_run, -1, NULL, 
    154 	ai_run, -1, NULL, 
    155 	ai_run, 0,  NULL,
    156 	ai_run, 1,  NULL,
    157 	ai_run, 3,  NULL,
    158 	ai_run, 6,	 NULL,
    159 	ai_run, 3,	 NULL
    160 };
    161 mmove_t chick_move_start_run = {FRAME_walk01, FRAME_walk10, chick_frames_start_run, chick_run};
    162 
    163 mframe_t chick_frames_run [] =
    164 {
    165 	ai_run, 6,	NULL,
    166 	ai_run, 8,  NULL,
    167 	ai_run, 13, NULL,
    168 	ai_run, 5,  NULL,
    169 	ai_run, 7,  NULL,
    170 	ai_run, 4,  NULL,
    171 	ai_run, 11, NULL,
    172 	ai_run, 5,  NULL,
    173 	ai_run, 9,  NULL,
    174 	ai_run, 7,  NULL
    175 
    176 };
    177 
    178 mmove_t chick_move_run = {FRAME_walk11, FRAME_walk20, chick_frames_run, NULL};
    179 
    180 mframe_t chick_frames_walk [] =
    181 {
    182 	ai_walk, 6,	 NULL,
    183 	ai_walk, 8,  NULL,
    184 	ai_walk, 13, NULL,
    185 	ai_walk, 5,  NULL,
    186 	ai_walk, 7,  NULL,
    187 	ai_walk, 4,  NULL,
    188 	ai_walk, 11, NULL,
    189 	ai_walk, 5,  NULL,
    190 	ai_walk, 9,  NULL,
    191 	ai_walk, 7,  NULL
    192 };
    193 
    194 mmove_t chick_move_walk = {FRAME_walk11, FRAME_walk20, chick_frames_walk, NULL};
    195 
    196 void chick_walk (edict_t *self)
    197 {
    198 	self->monsterinfo.currentmove = &chick_move_walk;
    199 }
    200 
    201 void chick_run (edict_t *self)
    202 {
    203 	if (self->monsterinfo.aiflags & AI_STAND_GROUND)
    204 	{
    205 		self->monsterinfo.currentmove = &chick_move_stand;
    206 		return;
    207 	}
    208 
    209 	if (self->monsterinfo.currentmove == &chick_move_walk ||
    210 		self->monsterinfo.currentmove == &chick_move_start_run)
    211 	{
    212 		self->monsterinfo.currentmove = &chick_move_run;
    213 	}
    214 	else
    215 	{
    216 		self->monsterinfo.currentmove = &chick_move_start_run;
    217 	}
    218 }
    219 
    220 mframe_t chick_frames_pain1 [] =
    221 {
    222 	ai_move, 0, NULL,
    223 	ai_move, 0, NULL,
    224 	ai_move, 0, NULL,
    225 	ai_move, 0, NULL,
    226 	ai_move, 0, NULL
    227 };
    228 mmove_t chick_move_pain1 = {FRAME_pain101, FRAME_pain105, chick_frames_pain1, chick_run};
    229 
    230 mframe_t chick_frames_pain2 [] =
    231 {
    232 	ai_move, 0, NULL,
    233 	ai_move, 0, NULL,
    234 	ai_move, 0, NULL,
    235 	ai_move, 0, NULL,
    236 	ai_move, 0, NULL
    237 };
    238 mmove_t chick_move_pain2 = {FRAME_pain201, FRAME_pain205, chick_frames_pain2, chick_run};
    239 
    240 mframe_t chick_frames_pain3 [] =
    241 {
    242 	ai_move, 0,		NULL,
    243 	ai_move, 0,		NULL,
    244 	ai_move, -6,	NULL,
    245 	ai_move, 3,		NULL,
    246 	ai_move, 11,	NULL,
    247 	ai_move, 3,		NULL,
    248 	ai_move, 0,		NULL,
    249 	ai_move, 0,		NULL,
    250 	ai_move, 4,		NULL,
    251 	ai_move, 1,		NULL,
    252 	ai_move, 0,		NULL,
    253 	ai_move, -3,	NULL,
    254 	ai_move, -4,	NULL,
    255 	ai_move, 5,		NULL,
    256 	ai_move, 7,		NULL,
    257 	ai_move, -2,	NULL,
    258 	ai_move, 3,		NULL,
    259 	ai_move, -5,	NULL,
    260 	ai_move, -2,	NULL,
    261 	ai_move, -8,	NULL,
    262 	ai_move, 2,		NULL
    263 };
    264 mmove_t chick_move_pain3 = {FRAME_pain301, FRAME_pain321, chick_frames_pain3, chick_run};
    265 
    266 void chick_pain (edict_t *self, edict_t *other, float kick, int damage)
    267 {
    268 	float	r;
    269 
    270 	if (self->health < (self->max_health / 2))
    271 		self->s.skinnum = 1;
    272 
    273 	if (level.time < self->pain_debounce_time)
    274 		return;
    275 
    276 	self->pain_debounce_time = level.time + 3;
    277 
    278 	r = random();
    279 	if (r < 0.33)
    280 		gi.sound (self, CHAN_VOICE, sound_pain1, 1, ATTN_NORM, 0);
    281 	else if (r < 0.66)
    282 		gi.sound (self, CHAN_VOICE, sound_pain2, 1, ATTN_NORM, 0);
    283 	else
    284 		gi.sound (self, CHAN_VOICE, sound_pain3, 1, ATTN_NORM, 0);
    285 
    286 	if (skill->value == 3)
    287 		return;		// no pain anims in nightmare
    288 
    289 	if (damage <= 10)
    290 		self->monsterinfo.currentmove = &chick_move_pain1;
    291 	else if (damage <= 25)
    292 		self->monsterinfo.currentmove = &chick_move_pain2;
    293 	else
    294 		self->monsterinfo.currentmove = &chick_move_pain3;
    295 }
    296 
    297 void chick_dead (edict_t *self)
    298 {
    299 	VectorSet (self->mins, -16, -16, 0);
    300 	VectorSet (self->maxs, 16, 16, 16);
    301 	self->movetype = MOVETYPE_TOSS;
    302 	self->svflags |= SVF_DEADMONSTER;
    303 	self->nextthink = 0;
    304 	gi.linkentity (self);
    305 }
    306 
    307 mframe_t chick_frames_death2 [] =
    308 {
    309 	ai_move, -6, NULL,
    310 	ai_move, 0,  NULL,
    311 	ai_move, -1,  NULL,
    312 	ai_move, -5, NULL,
    313 	ai_move, 0, NULL,
    314 	ai_move, -1,  NULL,
    315 	ai_move, -2,  NULL,
    316 	ai_move, 1,  NULL,
    317 	ai_move, 10, NULL,
    318 	ai_move, 2,  NULL,
    319 	ai_move, 3,  NULL,
    320 	ai_move, 1,  NULL,
    321 	ai_move, 2, NULL,
    322 	ai_move, 0,  NULL,
    323 	ai_move, 3,  NULL,
    324 	ai_move, 3,  NULL,
    325 	ai_move, 1,  NULL,
    326 	ai_move, -3,  NULL,
    327 	ai_move, -5, NULL,
    328 	ai_move, 4, NULL,
    329 	ai_move, 15, NULL,
    330 	ai_move, 14, NULL,
    331 	ai_move, 1, NULL
    332 };
    333 mmove_t chick_move_death2 = {FRAME_death201, FRAME_death223, chick_frames_death2, chick_dead};
    334 
    335 mframe_t chick_frames_death1 [] =
    336 {
    337 	ai_move, 0,  NULL,
    338 	ai_move, 0,  NULL,
    339 	ai_move, -7, NULL,
    340 	ai_move, 4,  NULL,
    341 	ai_move, 11, NULL,
    342 	ai_move, 0,  NULL,
    343 	ai_move, 0,  NULL,
    344 	ai_move, 0,  NULL,
    345 	ai_move, 0,  NULL,
    346 	ai_move, 0,  NULL,
    347 	ai_move, 0,  NULL,
    348 	ai_move, 0,  NULL
    349 	
    350 };
    351 mmove_t chick_move_death1 = {FRAME_death101, FRAME_death112, chick_frames_death1, chick_dead};
    352 
    353 void chick_die (edict_t *self, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point)
    354 {
    355 	int		n;
    356 
    357 // check for gib
    358 	if (self->health <= self->gib_health)
    359 	{
    360 		gi.sound (self, CHAN_VOICE, gi.soundindex ("misc/udeath.wav"), 1, ATTN_NORM, 0);
    361 		for (n= 0; n < 2; n++)
    362 			ThrowGib (self, "models/objects/gibs/bone/tris.md2", damage, GIB_ORGANIC);
    363 		for (n= 0; n < 4; n++)
    364 			ThrowGib (self, "models/objects/gibs/sm_meat/tris.md2", damage, GIB_ORGANIC);
    365 		ThrowHead (self, "models/objects/gibs/head2/tris.md2", damage, GIB_ORGANIC);
    366 		self->deadflag = DEAD_DEAD;
    367 		return;
    368 	}
    369 
    370 	if (self->deadflag == DEAD_DEAD)
    371 		return;
    372 
    373 // regular death
    374 	self->deadflag = DEAD_DEAD;
    375 	self->takedamage = DAMAGE_YES;
    376 
    377 	n = rand() % 2;
    378 	if (n == 0)
    379 	{
    380 		self->monsterinfo.currentmove = &chick_move_death1;
    381 		gi.sound (self, CHAN_VOICE, sound_death1, 1, ATTN_NORM, 0);
    382 	}
    383 	else
    384 	{
    385 		self->monsterinfo.currentmove = &chick_move_death2;
    386 		gi.sound (self, CHAN_VOICE, sound_death2, 1, ATTN_NORM, 0);
    387 	}
    388 }
    389 
    390 
    391 void chick_duck_down (edict_t *self)
    392 {
    393 	if (self->monsterinfo.aiflags & AI_DUCKED)
    394 		return;
    395 	self->monsterinfo.aiflags |= AI_DUCKED;
    396 	self->maxs[2] -= 32;
    397 	self->takedamage = DAMAGE_YES;
    398 	self->monsterinfo.pausetime = level.time + 1;
    399 	gi.linkentity (self);
    400 }
    401 
    402 void chick_duck_hold (edict_t *self)
    403 {
    404 	if (level.time >= self->monsterinfo.pausetime)
    405 		self->monsterinfo.aiflags &= ~AI_HOLD_FRAME;
    406 	else
    407 		self->monsterinfo.aiflags |= AI_HOLD_FRAME;
    408 }
    409 
    410 void chick_duck_up (edict_t *self)
    411 {
    412 	self->monsterinfo.aiflags &= ~AI_DUCKED;
    413 	self->maxs[2] += 32;
    414 	self->takedamage = DAMAGE_AIM;
    415 	gi.linkentity (self);
    416 }
    417 
    418 mframe_t chick_frames_duck [] =
    419 {
    420 	ai_move, 0, chick_duck_down,
    421 	ai_move, 1, NULL,
    422 	ai_move, 4, chick_duck_hold,
    423 	ai_move, -4,  NULL,
    424 	ai_move, -5,  chick_duck_up,
    425 	ai_move, 3, NULL,
    426 	ai_move, 1,  NULL
    427 };
    428 mmove_t chick_move_duck = {FRAME_duck01, FRAME_duck07, chick_frames_duck, chick_run};
    429 
    430 void chick_dodge (edict_t *self, edict_t *attacker, float eta)
    431 {
    432 	if (random() > 0.25)
    433 		return;
    434 
    435 	if (!self->enemy)
    436 		self->enemy = attacker;
    437 
    438 	self->monsterinfo.currentmove = &chick_move_duck;
    439 }
    440 
    441 void ChickSlash (edict_t *self)
    442 {
    443 	vec3_t	aim;
    444 
    445 	VectorSet (aim, MELEE_DISTANCE, self->mins[0], 10);
    446 	gi.sound (self, CHAN_WEAPON, sound_melee_swing, 1, ATTN_NORM, 0);
    447 	fire_hit (self, aim, (10 + (rand() %6)), 100);
    448 }
    449 
    450 
    451 void ChickRocket (edict_t *self)
    452 {
    453 	vec3_t	forward, right;
    454 	vec3_t	start;
    455 	vec3_t	dir;
    456 	vec3_t	vec;
    457 
    458 	AngleVectors (self->s.angles, forward, right, NULL);
    459 	G_ProjectSource (self->s.origin, monster_flash_offset[MZ2_CHICK_ROCKET_1], forward, right, start);
    460 
    461 	VectorCopy (self->enemy->s.origin, vec);
    462 	vec[2] += self->enemy->viewheight;
    463 	VectorSubtract (vec, start, dir);
    464 	VectorNormalize (dir);
    465 
    466 	monster_fire_rocket (self, start, dir, 50, 500, MZ2_CHICK_ROCKET_1);
    467 }	
    468 
    469 void Chick_PreAttack1 (edict_t *self)
    470 {
    471 	gi.sound (self, CHAN_VOICE, sound_missile_prelaunch, 1, ATTN_NORM, 0);
    472 }
    473 
    474 void ChickReload (edict_t *self)
    475 {
    476 	gi.sound (self, CHAN_VOICE, sound_missile_reload, 1, ATTN_NORM, 0);
    477 }
    478 
    479 
    480 mframe_t chick_frames_start_attack1 [] =
    481 {
    482 	ai_charge, 0,	Chick_PreAttack1,
    483 	ai_charge, 0,	NULL,
    484 	ai_charge, 0,	NULL,
    485 	ai_charge, 4,	NULL,
    486 	ai_charge, 0,	NULL,
    487 	ai_charge, -3,  NULL,
    488 	ai_charge, 3,	NULL,
    489 	ai_charge, 5,	NULL,
    490 	ai_charge, 7,	NULL,
    491 	ai_charge, 0,	NULL,
    492 	ai_charge, 0,	NULL,
    493 	ai_charge, 0,	NULL,
    494 	ai_charge, 0,	chick_attack1
    495 };
    496 mmove_t chick_move_start_attack1 = {FRAME_attak101, FRAME_attak113, chick_frames_start_attack1, NULL};
    497 
    498 
    499 mframe_t chick_frames_attack1 [] =
    500 {
    501 	ai_charge, 19,	ChickRocket,
    502 	ai_charge, -6,	NULL,
    503 	ai_charge, -5,	NULL,
    504 	ai_charge, -2,	NULL,
    505 	ai_charge, -7,	NULL,
    506 	ai_charge, 0,	NULL,
    507 	ai_charge, 1,	NULL,
    508 	ai_charge, 10,	ChickReload,
    509 	ai_charge, 4,	NULL,
    510 	ai_charge, 5,	NULL,
    511 	ai_charge, 6,	NULL,
    512 	ai_charge, 6,	NULL,
    513 	ai_charge, 4,	NULL,
    514 	ai_charge, 3,	chick_rerocket
    515 
    516 };
    517 mmove_t chick_move_attack1 = {FRAME_attak114, FRAME_attak127, chick_frames_attack1, NULL};
    518 
    519 mframe_t chick_frames_end_attack1 [] =
    520 {
    521 	ai_charge, -3,	NULL,
    522 	ai_charge, 0,	NULL,
    523 	ai_charge, -6,	NULL,
    524 	ai_charge, -4,	NULL,
    525 	ai_charge, -2,  NULL
    526 };
    527 mmove_t chick_move_end_attack1 = {FRAME_attak128, FRAME_attak132, chick_frames_end_attack1, chick_run};
    528 
    529 void chick_rerocket(edict_t *self)
    530 {
    531 	if (self->enemy->health > 0)
    532 	{
    533 		if (range (self, self->enemy) > RANGE_MELEE)
    534 			if ( visible (self, self->enemy) )
    535 				if (random() <= 0.6)
    536 				{
    537 					self->monsterinfo.currentmove = &chick_move_attack1;
    538 					return;
    539 				}
    540 	}	
    541 	self->monsterinfo.currentmove = &chick_move_end_attack1;
    542 }
    543 
    544 void chick_attack1(edict_t *self)
    545 {
    546 	self->monsterinfo.currentmove = &chick_move_attack1;
    547 }
    548 
    549 mframe_t chick_frames_slash [] =
    550 {
    551 	ai_charge, 1,	NULL,
    552 	ai_charge, 7,	ChickSlash,
    553 	ai_charge, -7,	NULL,
    554 	ai_charge, 1,	NULL,
    555 	ai_charge, -1,	NULL,
    556 	ai_charge, 1,	NULL,
    557 	ai_charge, 0,	NULL,
    558 	ai_charge, 1,	NULL,
    559 	ai_charge, -2,	chick_reslash
    560 };
    561 mmove_t chick_move_slash = {FRAME_attak204, FRAME_attak212, chick_frames_slash, NULL};
    562 
    563 mframe_t chick_frames_end_slash [] =
    564 {
    565 	ai_charge, -6,	NULL,
    566 	ai_charge, -1,	NULL,
    567 	ai_charge, -6,	NULL,
    568 	ai_charge, 0,	NULL
    569 };
    570 mmove_t chick_move_end_slash = {FRAME_attak213, FRAME_attak216, chick_frames_end_slash, chick_run};
    571 
    572 
    573 void chick_reslash(edict_t *self)
    574 {
    575 	if (self->enemy->health > 0)
    576 	{
    577 		if (range (self, self->enemy) == RANGE_MELEE)
    578 			if (random() <= 0.9)
    579 			{				
    580 				self->monsterinfo.currentmove = &chick_move_slash;
    581 				return;
    582 			}
    583 			else
    584 			{
    585 				self->monsterinfo.currentmove = &chick_move_end_slash;
    586 				return;
    587 			}
    588 	}
    589 	self->monsterinfo.currentmove = &chick_move_end_slash;
    590 }
    591 
    592 void chick_slash(edict_t *self)
    593 {
    594 	self->monsterinfo.currentmove = &chick_move_slash;
    595 }
    596 
    597 
    598 mframe_t chick_frames_start_slash [] =
    599 {	
    600 	ai_charge, 1,	NULL,
    601 	ai_charge, 8,	NULL,
    602 	ai_charge, 3,	NULL
    603 };
    604 mmove_t chick_move_start_slash = {FRAME_attak201, FRAME_attak203, chick_frames_start_slash, chick_slash};
    605 
    606 
    607 
    608 void chick_melee(edict_t *self)
    609 {
    610 	self->monsterinfo.currentmove = &chick_move_start_slash;
    611 }
    612 
    613 
    614 void chick_attack(edict_t *self)
    615 {
    616 	self->monsterinfo.currentmove = &chick_move_start_attack1;
    617 }
    618 
    619 void chick_sight(edict_t *self, edict_t *other)
    620 {
    621 	gi.sound (self, CHAN_VOICE, sound_sight, 1, ATTN_NORM, 0);
    622 }
    623 
    624 /*QUAKED monster_chick (1 .5 0) (-16 -16 -24) (16 16 32) Ambush Trigger_Spawn Sight
    625 */
    626 void SP_monster_chick (edict_t *self)
    627 {
    628 	if (deathmatch->value)
    629 	{
    630 		G_FreeEdict (self);
    631 		return;
    632 	}
    633 
    634 	sound_missile_prelaunch	= gi.soundindex ("chick/chkatck1.wav");	
    635 	sound_missile_launch	= gi.soundindex ("chick/chkatck2.wav");	
    636 	sound_melee_swing		= gi.soundindex ("chick/chkatck3.wav");	
    637 	sound_melee_hit			= gi.soundindex ("chick/chkatck4.wav");	
    638 	sound_missile_reload	= gi.soundindex ("chick/chkatck5.wav");	
    639 	sound_death1			= gi.soundindex ("chick/chkdeth1.wav");	
    640 	sound_death2			= gi.soundindex ("chick/chkdeth2.wav");	
    641 	sound_fall_down			= gi.soundindex ("chick/chkfall1.wav");	
    642 	sound_idle1				= gi.soundindex ("chick/chkidle1.wav");	
    643 	sound_idle2				= gi.soundindex ("chick/chkidle2.wav");	
    644 	sound_pain1				= gi.soundindex ("chick/chkpain1.wav");	
    645 	sound_pain2				= gi.soundindex ("chick/chkpain2.wav");	
    646 	sound_pain3				= gi.soundindex ("chick/chkpain3.wav");	
    647 	sound_sight				= gi.soundindex ("chick/chksght1.wav");	
    648 	sound_search			= gi.soundindex ("chick/chksrch1.wav");	
    649 
    650 	self->movetype = MOVETYPE_STEP;
    651 	self->solid = SOLID_BBOX;
    652 	self->s.modelindex = gi.modelindex ("models/monsters/bitch/tris.md2");
    653 	VectorSet (self->mins, -16, -16, 0);
    654 	VectorSet (self->maxs, 16, 16, 56);
    655 
    656 	self->health = 175;
    657 	self->gib_health = -70;
    658 	self->mass = 200;
    659 
    660 	self->pain = chick_pain;
    661 	self->die = chick_die;
    662 
    663 	self->monsterinfo.stand = chick_stand;
    664 	self->monsterinfo.walk = chick_walk;
    665 	self->monsterinfo.run = chick_run;
    666 	self->monsterinfo.dodge = chick_dodge;
    667 	self->monsterinfo.attack = chick_attack;
    668 	self->monsterinfo.melee = chick_melee;
    669 	self->monsterinfo.sight = chick_sight;
    670 
    671 	gi.linkentity (self);
    672 
    673 	self->monsterinfo.currentmove = &chick_move_stand;
    674 	self->monsterinfo.scale = MODEL_SCALE;
    675 
    676 	walkmonster_start (self);
    677 }