home *** CD-ROM | disk | FTP | other *** search
/ Gambler 19 / GAMBLERCD19.BIN / UTILS / 3D / BRONIE / DUAL_LAU.ZIP / src / m_mutant.c < prev    next >
C/C++ Source or Header  |  1997-11-25  |  14KB  |  641 lines

  1. /*
  2. ==============================================================================
  3.  
  4. mutant
  5.  
  6. ==============================================================================
  7. */
  8.  
  9. #include "g_local.h"
  10. #include "m_mutant.h"
  11.  
  12.  
  13. static int    sound_swing;
  14. static int    sound_hit;
  15. static int    sound_hit2;
  16. static int    sound_death;
  17. static int    sound_idle;
  18. static int    sound_pain1;
  19. static int    sound_pain2;
  20. static int    sound_sight;
  21. static int    sound_search;
  22. static int    sound_step1;
  23. static int    sound_step2;
  24. static int    sound_step3;
  25. static int    sound_thud;
  26.  
  27. //
  28. // SOUNDS
  29. //
  30.  
  31. void mutant_step (edict_t *self)
  32. {
  33.     int        n;
  34.     n = (rand() + 1) % 3;
  35.     if (n == 0)
  36.         gi.sound (self, CHAN_VOICE, sound_step1, 1, ATTN_NORM, 0);        
  37.     else if (n == 1)
  38.         gi.sound (self, CHAN_VOICE, sound_step2, 1, ATTN_NORM, 0);
  39.     else
  40.         gi.sound (self, CHAN_VOICE, sound_step3, 1, ATTN_NORM, 0);
  41. }
  42.  
  43. void mutant_sight (edict_t *self, edict_t *other)
  44. {
  45.     gi.sound (self, CHAN_VOICE, sound_sight, 1, ATTN_NORM, 0);
  46. }
  47.  
  48. void mutant_search (edict_t *self)
  49. {
  50.     gi.sound (self, CHAN_VOICE, sound_search, 1, ATTN_NORM, 0);
  51. }
  52.  
  53. void mutant_swing (edict_t *self)
  54. {
  55.     gi.sound (self, CHAN_VOICE, sound_swing, 1, ATTN_NORM, 0);
  56. }
  57.  
  58.  
  59. //
  60. // STAND
  61. //
  62.  
  63. mframe_t mutant_frames_stand [] =
  64. {
  65.     ai_stand, 0, NULL,
  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, NULL,        // 10
  75.  
  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,        // 20
  86.  
  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.     ai_stand, 0, NULL,        // 30
  97.  
  98.     ai_stand, 0, NULL,
  99.     ai_stand, 0, NULL,
  100.     ai_stand, 0, NULL,
  101.     ai_stand, 0, NULL,
  102.     ai_stand, 0, NULL,
  103.     ai_stand, 0, NULL,
  104.     ai_stand, 0, NULL,
  105.     ai_stand, 0, NULL,
  106.     ai_stand, 0, NULL,
  107.     ai_stand, 0, NULL,        // 40
  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,        // 50
  119.  
  120.     ai_stand, 0, NULL
  121. };
  122. mmove_t mutant_move_stand = {FRAME_stand101, FRAME_stand151, mutant_frames_stand, NULL};
  123.  
  124. void mutant_stand (edict_t *self)
  125. {
  126.     self->monsterinfo.currentmove = &mutant_move_stand;
  127. }
  128.  
  129.  
  130. //
  131. // IDLE
  132. //
  133.  
  134. void mutant_idle_loop (edict_t *self)
  135. {
  136.     if (random() < 0.75)
  137.         self->monsterinfo.nextframe = FRAME_stand155;
  138. }
  139.  
  140. mframe_t mutant_frames_idle [] =
  141. {
  142.     ai_stand, 0, NULL,
  143.     ai_stand, 0, NULL,
  144.     ai_stand, 0, NULL,
  145.     ai_stand, 0, NULL,                    // scratch loop start
  146.     ai_stand, 0, NULL,
  147.     ai_stand, 0, NULL,
  148.     ai_stand, 0, mutant_idle_loop,        // scratch loop end
  149.     ai_stand, 0, NULL,
  150.     ai_stand, 0, NULL,
  151.     ai_stand, 0, NULL,
  152.     ai_stand, 0, NULL,
  153.     ai_stand, 0, NULL,
  154.     ai_stand, 0, NULL
  155. };
  156. mmove_t mutant_move_idle = {FRAME_stand152, FRAME_stand164, mutant_frames_idle, mutant_stand};
  157.  
  158. void mutant_idle (edict_t *self)
  159. {
  160.     self->monsterinfo.currentmove = &mutant_move_idle;
  161.     gi.sound (self, CHAN_VOICE, sound_idle, 1, ATTN_IDLE, 0);
  162. }
  163.  
  164.  
  165. //
  166. // WALK
  167. //
  168.  
  169. void mutant_walk (edict_t *self);
  170.  
  171. mframe_t mutant_frames_walk [] =
  172. {
  173.     ai_walk,    3,        NULL,
  174.     ai_walk,    1,        NULL,
  175.     ai_walk,    5,        NULL,
  176.     ai_walk,    10,        NULL,
  177.     ai_walk,    13,        NULL,
  178.     ai_walk,    10,        NULL,
  179.     ai_walk,    0,        NULL,
  180.     ai_walk,    5,        NULL,
  181.     ai_walk,    6,        NULL,
  182.     ai_walk,    16,        NULL,
  183.     ai_walk,    15,        NULL,
  184.     ai_walk,    6,        NULL
  185. };
  186. mmove_t mutant_move_walk = {FRAME_walk05, FRAME_walk16, mutant_frames_walk, NULL};
  187.  
  188. void mutant_walk_loop (edict_t *self)
  189. {
  190.     self->monsterinfo.currentmove = &mutant_move_walk;
  191. }
  192.  
  193. mframe_t mutant_frames_start_walk [] =
  194. {
  195.     ai_walk,    5,        NULL,
  196.     ai_walk,    5,        NULL,
  197.     ai_walk,    -2,        NULL,
  198.     ai_walk,    1,        NULL
  199. };
  200. mmove_t mutant_move_start_walk = {FRAME_walk01, FRAME_walk04, mutant_frames_start_walk, mutant_walk_loop};
  201.  
  202. void mutant_walk (edict_t *self)
  203. {
  204.     self->monsterinfo.currentmove = &mutant_move_start_walk;
  205. }
  206.  
  207.  
  208. //
  209. // RUN
  210. //
  211.  
  212. mframe_t mutant_frames_run [] =
  213. {
  214.     ai_run,    40,        NULL,
  215.     ai_run,    40,        mutant_step,
  216.     ai_run,    24,        NULL,
  217.     ai_run,    5,        mutant_step,
  218.     ai_run,    17,        NULL,
  219.     ai_run,    10,        NULL
  220. };
  221. mmove_t mutant_move_run = {FRAME_run03, FRAME_run08, mutant_frames_run, NULL};
  222.  
  223. void mutant_run (edict_t *self)
  224. {
  225.     if (self->monsterinfo.aiflags & AI_STAND_GROUND)
  226.         self->monsterinfo.currentmove = &mutant_move_stand;
  227.     else
  228.         self->monsterinfo.currentmove = &mutant_move_run;
  229. }
  230.  
  231.  
  232. //
  233. // MELEE
  234. //
  235.  
  236. void mutant_hit_left (edict_t *self)
  237. {
  238.     vec3_t    aim;
  239.  
  240.     VectorSet (aim, MELEE_DISTANCE, self->mins[0], 8);
  241.     if (fire_hit (self, aim, (10 + (rand() %5)), 100))
  242.         gi.sound (self, CHAN_WEAPON, sound_hit, 1, ATTN_NORM, 0);
  243.     else
  244.         gi.sound (self, CHAN_WEAPON, sound_swing, 1, ATTN_NORM, 0);
  245. }
  246.  
  247. void mutant_hit_right (edict_t *self)
  248. {
  249.     vec3_t    aim;
  250.  
  251.     VectorSet (aim, MELEE_DISTANCE, self->maxs[0], 8);
  252.     if (fire_hit (self, aim, (10 + (rand() %5)), 100))
  253.         gi.sound (self, CHAN_WEAPON, sound_hit2, 1, ATTN_NORM, 0);
  254.     else
  255.         gi.sound (self, CHAN_WEAPON, sound_swing, 1, ATTN_NORM, 0);
  256. }
  257.  
  258. void mutant_check_refire (edict_t *self)
  259. {
  260.     if (!self->enemy || !self->enemy->inuse || self->enemy->health <= 0)
  261.         return;
  262.  
  263.     if ( ((skill->value == 3) && (random() < 0.5)) || (range(self, self->enemy) == RANGE_MELEE) )
  264.         self->monsterinfo.nextframe = FRAME_attack09;
  265. }
  266.  
  267. mframe_t mutant_frames_attack [] =
  268. {
  269.     ai_charge,    0,    NULL,
  270.     ai_charge,    0,    NULL,
  271.     ai_charge,    0,    mutant_hit_left,
  272.     ai_charge,    0,    NULL,
  273.     ai_charge,    0,    NULL,
  274.     ai_charge,    0,    mutant_hit_right,
  275.     ai_charge,    0,    mutant_check_refire
  276. };
  277. mmove_t mutant_move_attack = {FRAME_attack09, FRAME_attack15, mutant_frames_attack, mutant_run};
  278.  
  279. void mutant_melee (edict_t *self)
  280. {
  281.     self->monsterinfo.currentmove = &mutant_move_attack;
  282. }
  283.  
  284.  
  285. //
  286. // ATTACK
  287. //
  288.  
  289. void mutant_jump_touch (edict_t *self, edict_t *other, cplane_t *plane, csurface_t *surf)
  290. {
  291.     if (self->health <= 0)
  292.     {
  293.         self->touch = NULL;
  294.         return;
  295.     }
  296.  
  297.     if (other->takedamage)
  298.     {
  299.         if (VectorLength(self->velocity) > 400)
  300.         {
  301.             vec3_t    point;
  302.             vec3_t    normal;
  303.             int        damage;
  304.  
  305.             VectorCopy (self->velocity, normal);
  306.             VectorNormalize(normal);
  307.             VectorMA (self->s.origin, self->maxs[0], normal, point);
  308.             damage = 40 + 10 * random();
  309.             T_Damage (other, self, self, self->velocity, point, normal, damage, damage, 0);
  310.         }
  311.     }
  312.  
  313.     if (!M_CheckBottom (self))
  314.     {
  315.         if (self->groundentity)
  316.         {
  317.             self->monsterinfo.nextframe = FRAME_attack02;
  318.             self->touch = NULL;
  319.         }
  320.         return;
  321.     }
  322.  
  323.     self->touch = NULL;
  324. }
  325.  
  326. void mutant_jump_takeoff (edict_t *self)
  327. {
  328.     vec3_t    forward;
  329.  
  330.     gi.sound (self, CHAN_VOICE, sound_sight, 1, ATTN_NORM, 0);
  331.     AngleVectors (self->s.angles, forward, NULL, NULL);
  332.     self->s.origin[2] += 1;
  333.     VectorScale (forward, 600, self->velocity);
  334.     self->velocity[2] = 250;
  335.     self->groundentity = NULL;
  336.     self->monsterinfo.aiflags |= AI_DUCKED;
  337.     self->monsterinfo.attack_finished = level.time + 3;
  338.     self->touch = mutant_jump_touch;
  339. }
  340.  
  341. void mutant_check_landing (edict_t *self)
  342. {
  343.     if (self->groundentity)
  344.     {
  345.         gi.sound (self, CHAN_WEAPON, sound_thud, 1, ATTN_NORM, 0);
  346.         self->monsterinfo.attack_finished = 0;
  347.         self->monsterinfo.aiflags &= ~AI_DUCKED;
  348.         return;
  349.     }
  350.  
  351.     if (level.time > self->monsterinfo.attack_finished)
  352.         self->monsterinfo.nextframe = FRAME_attack02;
  353.     else
  354.         self->monsterinfo.nextframe = FRAME_attack05;
  355. }
  356.  
  357. mframe_t mutant_frames_jump [] =
  358. {
  359.     ai_charge,     0,    NULL,
  360.     ai_charge,    17,    NULL,
  361.     ai_charge,    15,    mutant_jump_takeoff,
  362.     ai_charge,    15,    NULL,
  363.     ai_charge,    15,    mutant_check_landing,
  364.     ai_charge,     0,    NULL,
  365.     ai_charge,     3,    NULL,
  366.     ai_charge,     0,    NULL
  367. };
  368. mmove_t mutant_move_jump = {FRAME_attack01, FRAME_attack08, mutant_frames_jump, mutant_run};
  369.  
  370. void mutant_jump (edict_t *self)
  371. {
  372.     self->monsterinfo.currentmove = &mutant_move_jump;
  373. }
  374.  
  375.  
  376. //
  377. // CHECKATTACK
  378. //
  379.  
  380. qboolean mutant_check_melee (edict_t *self)
  381. {
  382.     if (range (self, self->enemy) == RANGE_MELEE)
  383.         return true;
  384.     return false;
  385. }
  386.  
  387. qboolean mutant_check_jump (edict_t *self)
  388. {
  389.     vec3_t    v;
  390.     float    distance;
  391.  
  392.     if (self->absmin[2] > (self->enemy->absmin[2] + 0.75 * self->enemy->size[2]))
  393.         return false;
  394.  
  395.     if (self->absmax[2] < (self->enemy->absmin[2] + 0.25 * self->enemy->size[2]))
  396.         return false;
  397.  
  398.     v[0] = self->s.origin[0] - self->enemy->s.origin[0];
  399.     v[1] = self->s.origin[1] - self->enemy->s.origin[1];
  400.     v[2] = 0;
  401.     distance = VectorLength(v);
  402.  
  403.     if (distance < 100)
  404.         return false;
  405.     if (distance > 100)
  406.     {
  407.         if (random() < 0.9)
  408.             return false;
  409.     }
  410.  
  411.     return true;
  412. }
  413.  
  414. qboolean mutant_checkattack (edict_t *self)
  415. {
  416.     if (!self->enemy || self->enemy->health <= 0)
  417.         return false;
  418.  
  419.     if (mutant_check_melee(self))
  420.     {
  421.         self->monsterinfo.attack_state = AS_MELEE;
  422.         return true;
  423.     }
  424.  
  425.     if (mutant_check_jump(self))
  426.     {
  427.         self->monsterinfo.attack_state = AS_MISSILE;
  428.         // FIXME play a jump sound here
  429.         return true;
  430.     }
  431.  
  432.     return false;
  433. }
  434.  
  435.  
  436. //
  437. // PAIN
  438. //
  439.  
  440. mframe_t mutant_frames_pain1 [] =
  441. {
  442.     ai_move,    4,    NULL,
  443.     ai_move,    -3,    NULL,
  444.     ai_move,    -8,    NULL,
  445.     ai_move,    2,    NULL,
  446.     ai_move,    5,    NULL
  447. };
  448. mmove_t mutant_move_pain1 = {FRAME_pain101, FRAME_pain105, mutant_frames_pain1, mutant_run};
  449.  
  450. mframe_t mutant_frames_pain2 [] =
  451. {
  452.     ai_move,    -24,NULL,
  453.     ai_move,    11,    NULL,
  454.     ai_move,    5,    NULL,
  455.     ai_move,    -2,    NULL,
  456.     ai_move,    6,    NULL,
  457.     ai_move,    4,    NULL
  458. };
  459. mmove_t mutant_move_pain2 = {FRAME_pain201, FRAME_pain206, mutant_frames_pain2, mutant_run};
  460.  
  461. mframe_t mutant_frames_pain3 [] =
  462. {
  463.     ai_move,    -22,NULL,
  464.     ai_move,    3,    NULL,
  465.     ai_move,    3,    NULL,
  466.     ai_move,    2,    NULL,
  467.     ai_move,    1,    NULL,
  468.     ai_move,    1,    NULL,
  469.     ai_move,    6,    NULL,
  470.     ai_move,    3,    NULL,
  471.     ai_move,    2,    NULL,
  472.     ai_move,    0,    NULL,
  473.     ai_move,    1,    NULL
  474. };
  475. mmove_t mutant_move_pain3 = {FRAME_pain301, FRAME_pain311, mutant_frames_pain3, mutant_run};
  476.  
  477. void mutant_pain (edict_t *self, edict_t *other, float kick, int damage)
  478. {
  479.     float    r;
  480.  
  481.     if (self->health < (self->max_health / 2))
  482.         self->s.skinnum = 1;
  483.  
  484.     if (level.time < self->pain_debounce_time)
  485.         return;
  486.  
  487.     self->pain_debounce_time = level.time + 3;
  488.  
  489.     r = random();
  490.     if (r < 0.33)
  491.     {
  492.         gi.sound (self, CHAN_VOICE, sound_pain1, 1, ATTN_NORM, 0);
  493.         self->monsterinfo.currentmove = &mutant_move_pain1;
  494.     }
  495.     else if (r < 0.66)
  496.     {
  497.         gi.sound (self, CHAN_VOICE, sound_pain2, 1, ATTN_NORM, 0);
  498.         self->monsterinfo.currentmove = &mutant_move_pain2;
  499.     }
  500.     else
  501.     {
  502.         gi.sound (self, CHAN_VOICE, sound_pain1, 1, ATTN_NORM, 0);
  503.         self->monsterinfo.currentmove = &mutant_move_pain3;
  504.     }
  505. }
  506.  
  507.  
  508. //
  509. // DEATH
  510. //
  511.  
  512. void mutant_dead (edict_t *self)
  513. {
  514.     VectorSet (self->mins, -16, -16, -24);
  515.     VectorSet (self->maxs, 16, 16, -8);
  516.     self->movetype = MOVETYPE_TOSS;
  517.     gi.linkentity (self);
  518.  
  519.     M_FlyCheck (self);
  520. }
  521.  
  522. mframe_t mutant_frames_death1 [] =
  523. {
  524.     ai_move,    0,    NULL,
  525.     ai_move,    0,    NULL,
  526.     ai_move,    0,    NULL,
  527.     ai_move,    0,    NULL,
  528.     ai_move,    0,    NULL,
  529.     ai_move,    0,    NULL,
  530.     ai_move,    0,    NULL,
  531.     ai_move,    0,    NULL,
  532.     ai_move,    0,    NULL
  533. };
  534. mmove_t mutant_move_death1 = {FRAME_death101, FRAME_death109, mutant_frames_death1, mutant_dead};
  535.  
  536. mframe_t mutant_frames_death2 [] =
  537. {
  538.     ai_move,    0,    NULL,
  539.     ai_move,    0,    NULL,
  540.     ai_move,    0,    NULL,
  541.     ai_move,    0,    NULL,
  542.     ai_move,    0,    NULL,
  543.     ai_move,    0,    NULL,
  544.     ai_move,    0,    NULL,
  545.     ai_move,    0,    NULL,
  546.     ai_move,    0,    NULL,
  547.     ai_move,    0,    NULL
  548. };
  549. mmove_t mutant_move_death2 = {FRAME_death201, FRAME_death210, mutant_frames_death2, mutant_dead};
  550.  
  551. void mutant_die (edict_t *self, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point)
  552. {
  553.     int        n;
  554.  
  555.     if (self->health <= self->gib_health)
  556.     {
  557.         gi.sound (self, CHAN_VOICE, gi.soundindex ("misc/udeath.wav"), 1, ATTN_NORM, 0);
  558.         for (n= 0; n < 2; n++)
  559.             ThrowGib (self, "models/objects/gibs/bone/tris.md2", damage, GIB_ORGANIC);
  560.         for (n= 0; n < 4; n++)
  561.             ThrowGib (self, "models/objects/gibs/sm_meat/tris.md2", damage, GIB_ORGANIC);
  562.         ThrowHead (self, "models/objects/gibs/head2/tris.md2", damage, GIB_ORGANIC);
  563.         self->deadflag = DEAD_DEAD;
  564.         return;
  565.     }
  566.  
  567.     if (self->deadflag == DEAD_DEAD)
  568.         return;
  569.  
  570.     gi.sound (self, CHAN_VOICE, sound_death, 1, ATTN_NORM, 0);
  571.     self->deadflag = DEAD_DEAD;
  572.     self->takedamage = DAMAGE_YES;
  573.     self->s.skinnum = 1;
  574.  
  575.     if (random() < 0.5)
  576.         self->monsterinfo.currentmove = &mutant_move_death1;
  577.     else
  578.         self->monsterinfo.currentmove = &mutant_move_death2;
  579. }
  580.  
  581.  
  582. //
  583. // SPAWN
  584. //
  585.  
  586. /*QUAKED monster_mutant (1 .5 0) (-32 -32 -24) (32 32 32) Ambush Trigger_Spawn Sight
  587. */
  588. void SP_monster_mutant (edict_t *self)
  589. {
  590.     if (deathmatch->value)
  591.     {
  592.         G_FreeEdict (self);
  593.         return;
  594.     }
  595.  
  596.     sound_swing = gi.soundindex ("mutant/mutatck1.wav");
  597.     sound_hit = gi.soundindex ("mutant/mutatck2.wav");
  598.     sound_hit2 = gi.soundindex ("mutant/mutatck3.wav");
  599.     sound_death = gi.soundindex ("mutant/mutdeth1.wav");
  600.     sound_idle = gi.soundindex ("mutant/mutidle1.wav");
  601.     sound_pain1 = gi.soundindex ("mutant/mutpain1.wav");
  602.     sound_pain2 = gi.soundindex ("mutant/mutpain2.wav");
  603.     sound_sight = gi.soundindex ("mutant/mutsght1.wav");
  604.     sound_search = gi.soundindex ("mutant/mutsrch1.wav");
  605.     sound_step1 = gi.soundindex ("mutant/step1.wav");
  606.     sound_step2 = gi.soundindex ("mutant/step2.wav");
  607.     sound_step3 = gi.soundindex ("mutant/step3.wav");
  608.     sound_thud = gi.soundindex ("mutant/thud1.wav");
  609.     
  610.     self->movetype = MOVETYPE_STEP;
  611.     self->solid = SOLID_BBOX;
  612.     self->s.modelindex = gi.modelindex ("models/monsters/mutant/tris.md2");
  613.     VectorSet (self->mins, -32, -32, -24);
  614.     VectorSet (self->maxs, 32, 32, 48);
  615.  
  616.     self->health = 300;
  617.     self->gib_health = -120;
  618.     self->mass = 300;
  619.  
  620.     self->pain = mutant_pain;
  621.     self->die = mutant_die;
  622.  
  623.     self->monsterinfo.stand = mutant_stand;
  624.     self->monsterinfo.walk = mutant_walk;
  625.     self->monsterinfo.run = mutant_run;
  626.     self->monsterinfo.dodge = NULL;
  627.     self->monsterinfo.attack = mutant_jump;
  628.     self->monsterinfo.melee = mutant_melee;
  629.     self->monsterinfo.sight = mutant_sight;
  630.     self->monsterinfo.search = mutant_search;
  631.     self->monsterinfo.idle = mutant_idle;
  632.     self->monsterinfo.checkattack = mutant_checkattack;
  633.  
  634.     gi.linkentity (self);
  635.     
  636.     self->monsterinfo.currentmove = &mutant_move_stand;
  637.  
  638.     self->monsterinfo.scale = MODEL_SCALE;
  639.     walkmonster_start (self);
  640. }
  641.