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

  1. /*
  2. ==============================================================================
  3.  
  4. floater
  5.  
  6. ==============================================================================
  7. */
  8.  
  9. #include "g_local.h"
  10. #include "m_float.h"
  11.  
  12.  
  13. static int    sound_attack2;
  14. static int    sound_attack3;
  15. static int    sound_death1;
  16. static int    sound_idle;
  17. static int    sound_pain1;
  18. static int    sound_pain2;
  19. static int    sound_sight;
  20.  
  21.  
  22. void floater_sight (edict_t *self, edict_t *other)
  23. {
  24.     gi.sound (self, CHAN_VOICE, sound_sight, 1, ATTN_NORM, 0);
  25. }
  26.  
  27. void floater_idle (edict_t *self)
  28. {
  29.     gi.sound (self, CHAN_VOICE, sound_idle, 1, ATTN_IDLE, 0);
  30. }
  31.  
  32.  
  33. //void floater_stand1 (edict_t *self);
  34. void floater_dead (edict_t *self);
  35. void floater_die (edict_t *self, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point);
  36. void floater_run (edict_t *self);
  37. void floater_wham (edict_t *self);
  38. void floater_zap (edict_t *self);
  39.  
  40.  
  41. void floater_fire_blaster (edict_t *self)
  42. {
  43.     vec3_t    start;
  44.     vec3_t    forward, right;
  45.     vec3_t    end;
  46.     vec3_t    dir;
  47.     int        effect;
  48.  
  49.     if ((self->s.frame == FRAME_attak104) || (self->s.frame == FRAME_attak107))
  50.         effect = EF_HYPERBLASTER;
  51.     else
  52.         effect = 0;
  53.     AngleVectors (self->s.angles, forward, right, NULL);
  54.     G_ProjectSource (self->s.origin, monster_flash_offset[MZ2_FLOAT_BLASTER_1], forward, right, start);
  55.  
  56.     VectorCopy (self->enemy->s.origin, end);
  57.     end[2] += self->enemy->viewheight;
  58.     VectorSubtract (end, start, dir);
  59.  
  60.     monster_fire_blaster (self, start, dir, 1, 1000, MZ2_FLOAT_BLASTER_1, effect);
  61. }
  62.  
  63.  
  64. mframe_t floater_frames_stand1 [] =
  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, NULL,
  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.     ai_stand, 0, NULL,
  97.     ai_stand, 0, NULL,
  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,
  108.     ai_stand, 0, NULL,
  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. };
  119. mmove_t    floater_move_stand1 = {FRAME_stand101, FRAME_stand152, floater_frames_stand1, NULL};
  120.  
  121. mframe_t floater_frames_stand2 [] =
  122. {
  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, NULL,
  139.     ai_stand, 0, NULL,
  140.     ai_stand, 0, NULL,
  141.     ai_stand, 0, NULL,
  142.     ai_stand, 0, NULL,
  143.     ai_stand, 0, NULL,
  144.     ai_stand, 0, NULL,
  145.     ai_stand, 0, NULL,
  146.     ai_stand, 0, NULL,
  147.     ai_stand, 0, NULL,
  148.     ai_stand, 0, NULL,
  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.     ai_stand, 0, NULL,
  156.     ai_stand, 0, NULL,
  157.     ai_stand, 0, NULL,
  158.     ai_stand, 0, NULL,
  159.     ai_stand, 0, NULL,
  160.     ai_stand, 0, NULL,
  161.     ai_stand, 0, NULL,
  162.     ai_stand, 0, NULL,
  163.     ai_stand, 0, NULL,
  164.     ai_stand, 0, NULL,
  165.     ai_stand, 0, NULL,
  166.     ai_stand, 0, NULL,
  167.     ai_stand, 0, NULL,
  168.     ai_stand, 0, NULL,
  169.     ai_stand, 0, NULL,
  170.     ai_stand, 0, NULL,
  171.     ai_stand, 0, NULL,
  172.     ai_stand, 0, NULL,
  173.     ai_stand, 0, NULL,
  174.     ai_stand, 0, NULL
  175. };
  176. mmove_t    floater_move_stand2 = {FRAME_stand201, FRAME_stand252, floater_frames_stand2, NULL};
  177.  
  178. void floater_stand (edict_t *self)
  179. {
  180.     if (random() <= 0.5)        
  181.         self->monsterinfo.currentmove = &floater_move_stand1;
  182.     else
  183.         self->monsterinfo.currentmove = &floater_move_stand2;
  184. }
  185.  
  186. mframe_t floater_frames_activate [] =
  187. {
  188.     ai_move,    0,    NULL,    
  189.     ai_move,    0,    NULL,    
  190.     ai_move,    0,    NULL,    
  191.     ai_move,    0,    NULL,    
  192.     ai_move,    0,    NULL,    
  193.     ai_move,    0,    NULL,    
  194.     ai_move,    0,    NULL,    
  195.     ai_move,    0,    NULL,    
  196.     ai_move,    0,    NULL,    
  197.     ai_move,    0,    NULL,    
  198.     ai_move,    0,    NULL,    
  199.     ai_move,    0,    NULL,    
  200.     ai_move,    0,    NULL,    
  201.     ai_move,    0,    NULL,    
  202.     ai_move,    0,    NULL,    
  203.     ai_move,    0,    NULL,    
  204.     ai_move,    0,    NULL,    
  205.     ai_move,    0,    NULL,    
  206.     ai_move,    0,    NULL,    
  207.     ai_move,    0,    NULL,    
  208.     ai_move,    0,    NULL,    
  209.     ai_move,    0,    NULL,    
  210.     ai_move,    0,    NULL,    
  211.     ai_move,    0,    NULL,    
  212.     ai_move,    0,    NULL,    
  213.     ai_move,    0,    NULL,    
  214.     ai_move,    0,    NULL,    
  215.     ai_move,    0,    NULL,    
  216.     ai_move,    0,    NULL,    
  217.     ai_move,    0,    NULL
  218. };
  219. mmove_t floater_move_activate = {FRAME_actvat01, FRAME_actvat31, floater_frames_activate, NULL};
  220.  
  221. mframe_t floater_frames_attack1 [] =
  222. {
  223.     ai_charge,    0,    NULL,            // Blaster attack
  224.     ai_charge,    0,    NULL,
  225.     ai_charge,    0,    NULL,
  226.     ai_charge,    0,    floater_fire_blaster,            // BOOM (0, -25.8, 32.5)    -- LOOP Starts
  227.     ai_charge,    0,    floater_fire_blaster,
  228.     ai_charge,    0,    floater_fire_blaster,
  229.     ai_charge,    0,    floater_fire_blaster,
  230.     ai_charge,    0,    floater_fire_blaster,
  231.     ai_charge,    0,    floater_fire_blaster,
  232.     ai_charge,    0,    floater_fire_blaster,
  233.     ai_charge,    0,    NULL,
  234.     ai_charge,    0,    NULL,
  235.     ai_charge,    0,    NULL,
  236.     ai_charge,    0,    NULL            //                            -- LOOP Ends
  237. };
  238. mmove_t floater_move_attack1 = {FRAME_attak101, FRAME_attak114, floater_frames_attack1, floater_run};
  239.  
  240. mframe_t floater_frames_attack2 [] =
  241. {
  242.     ai_charge,    0,    NULL,            // Claws
  243.     ai_charge,    0,    NULL,
  244.     ai_charge,    0,    NULL,
  245.     ai_charge,    0,    NULL,
  246.     ai_charge,    0,    NULL,
  247.     ai_charge,    0,    NULL,
  248.     ai_charge,    0,    NULL,
  249.     ai_charge,    0,    NULL,
  250.     ai_charge,    0,    NULL,
  251.     ai_charge,    0,    NULL,
  252.     ai_charge,    0,    NULL,
  253.     ai_charge,    0,    floater_wham,            // WHAM (0, -45, 29.6)        -- LOOP Starts
  254.     ai_charge,    0,    NULL,
  255.     ai_charge,    0,    NULL,
  256.     ai_charge,    0,    NULL,
  257.     ai_charge,    0,    NULL,
  258.     ai_charge,    0,    NULL,
  259.     ai_charge,    0,    NULL,
  260.     ai_charge,    0,    NULL,            //                            -- LOOP Ends
  261.     ai_charge,    0,    NULL,
  262.     ai_charge,    0,    NULL,
  263.     ai_charge,    0,    NULL,
  264.     ai_charge,    0,    NULL,
  265.     ai_charge,    0,    NULL,
  266.     ai_charge,    0,    NULL
  267. };
  268. mmove_t floater_move_attack2 = {FRAME_attak201, FRAME_attak225, floater_frames_attack2, floater_run};
  269.  
  270. mframe_t floater_frames_attack3 [] =
  271. {
  272.     ai_charge,    0,    NULL,
  273.     ai_charge,    0,    NULL,
  274.     ai_charge,    0,    NULL,
  275.     ai_charge,    0,    NULL,
  276.     ai_charge,    0,    NULL,
  277.     ai_charge,    0,    NULL,
  278.     ai_charge,    0,    NULL,
  279.     ai_charge,    0,    NULL,
  280.     ai_charge,    0,    floater_zap,        //                                -- LOOP Starts
  281.     ai_charge,    0,    NULL,
  282.     ai_charge,    0,    NULL,
  283.     ai_charge,    0,    NULL,
  284.     ai_charge,    0,    NULL,
  285.     ai_charge,    0,    NULL,
  286.     ai_charge,    0,    NULL,
  287.     ai_charge,    0,    NULL,
  288.     ai_charge,    0,    NULL,
  289.     ai_charge,    0,    NULL,
  290.     ai_charge,    0,    NULL,
  291.     ai_charge,    0,    NULL,
  292.     ai_charge,    0,    NULL,
  293.     ai_charge,    0,    NULL,
  294.     ai_charge,    0,    NULL,
  295.     ai_charge,    0,    NULL,
  296.     ai_charge,    0,    NULL,
  297.     ai_charge,    0,    NULL,
  298.     ai_charge,    0,    NULL,
  299.     ai_charge,    0,    NULL,
  300.     ai_charge,    0,    NULL,        //                                -- LOOP Ends
  301.     ai_charge,    0,    NULL,
  302.     ai_charge,    0,    NULL,
  303.     ai_charge,    0,    NULL,
  304.     ai_charge,    0,    NULL,
  305.     ai_charge,    0,    NULL
  306. };
  307. mmove_t floater_move_attack3 = {FRAME_attak301, FRAME_attak334, floater_frames_attack3, floater_run};
  308.  
  309. mframe_t floater_frames_death [] =
  310. {
  311.     ai_move,    0,    NULL,
  312.     ai_move,    0,    NULL,
  313.     ai_move,    0,    NULL,
  314.     ai_move,    0,    NULL,
  315.     ai_move,    0,    NULL,
  316.     ai_move,    0,    NULL,
  317.     ai_move,    0,    NULL,
  318.     ai_move,    0,    NULL,
  319.     ai_move,    0,    NULL,
  320.     ai_move,    0,    NULL,
  321.     ai_move,    0,    NULL,
  322.     ai_move,    0,    NULL,
  323.     ai_move,    0,    NULL
  324. };
  325. mmove_t floater_move_death = {FRAME_death01, FRAME_death13, floater_frames_death, floater_dead};
  326.  
  327. mframe_t floater_frames_pain1 [] =
  328. {
  329.     ai_move,    0,    NULL,
  330.     ai_move,    0,    NULL,
  331.     ai_move,    0,    NULL,
  332.     ai_move,    0,    NULL,
  333.     ai_move,    0,    NULL,
  334.     ai_move,    0,    NULL,
  335.     ai_move,    0,    NULL
  336. };
  337. mmove_t floater_move_pain1 = {FRAME_pain101, FRAME_pain107, floater_frames_pain1, floater_run};
  338.  
  339. mframe_t floater_frames_pain2 [] =
  340. {
  341.     ai_move,    0,    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. mmove_t floater_move_pain2 = {FRAME_pain201, FRAME_pain208, floater_frames_pain2, floater_run};
  351.  
  352. mframe_t floater_frames_pain3 [] =
  353. {
  354.     ai_move,    0,    NULL,
  355.     ai_move,    0,    NULL,
  356.     ai_move,    0,    NULL,
  357.     ai_move,    0,    NULL,
  358.     ai_move,    0,    NULL,
  359.     ai_move,    0,    NULL,
  360.     ai_move,    0,    NULL,
  361.     ai_move,    0,    NULL,
  362.     ai_move,    0,    NULL,
  363.     ai_move,    0,    NULL,
  364.     ai_move,    0,    NULL,
  365.     ai_move,    0,    NULL
  366. };
  367. mmove_t floater_move_pain3 = {FRAME_pain301, FRAME_pain312, floater_frames_pain3, floater_run};
  368.  
  369. mframe_t floater_frames_walk [] =
  370. {
  371.     ai_walk, 5, NULL,
  372.     ai_walk, 5, NULL,
  373.     ai_walk, 5, NULL,
  374.     ai_walk, 5, NULL,
  375.     ai_walk, 5, NULL,
  376.     ai_walk, 5, NULL,
  377.     ai_walk, 5, NULL,
  378.     ai_walk, 5, NULL,
  379.     ai_walk, 5, NULL,
  380.     ai_walk, 5, NULL,
  381.     ai_walk, 5, NULL,
  382.     ai_walk, 5, NULL,
  383.     ai_walk, 5, NULL,
  384.     ai_walk, 5, NULL,
  385.     ai_walk, 5, NULL,
  386.     ai_walk, 5, NULL,
  387.     ai_walk, 5, NULL,
  388.     ai_walk, 5, NULL,
  389.     ai_walk, 5, NULL,
  390.     ai_walk, 5, NULL,
  391.     ai_walk, 5, NULL,
  392.     ai_walk, 5, NULL,
  393.     ai_walk, 5, NULL,
  394.     ai_walk, 5, NULL,
  395.     ai_walk, 5, NULL,
  396.     ai_walk, 5, NULL,
  397.     ai_walk, 5, NULL,
  398.     ai_walk, 5, NULL,
  399.     ai_walk, 5, NULL,
  400.     ai_walk, 5, NULL,
  401.     ai_walk, 5, NULL,
  402.     ai_walk, 5, NULL,
  403.     ai_walk, 5, NULL,
  404.     ai_walk, 5, NULL,
  405.     ai_walk, 5, NULL,
  406.     ai_walk, 5, NULL,
  407.     ai_walk, 5, NULL,
  408.     ai_walk, 5, NULL,
  409.     ai_walk, 5, NULL,
  410.     ai_walk, 5, NULL,
  411.     ai_walk, 5, NULL,
  412.     ai_walk, 5, NULL,
  413.     ai_walk, 5, NULL,
  414.     ai_walk, 5, NULL,
  415.     ai_walk, 5, NULL,
  416.     ai_walk, 5, NULL,
  417.     ai_walk, 5, NULL,
  418.     ai_walk, 5, NULL,
  419.     ai_walk, 5, NULL,
  420.     ai_walk, 5, NULL,
  421.     ai_walk, 5, NULL,
  422.     ai_walk, 5, NULL
  423. };
  424. mmove_t    floater_move_walk = {FRAME_stand101, FRAME_stand152, floater_frames_walk, NULL};
  425.  
  426. mframe_t floater_frames_run [] =
  427. {
  428.     ai_run, 13, NULL,
  429.     ai_run, 13, NULL,
  430.     ai_run, 13, NULL,
  431.     ai_run, 13, NULL,
  432.     ai_run, 13, NULL,
  433.     ai_run, 13, NULL,
  434.     ai_run, 13, NULL,
  435.     ai_run, 13, NULL,
  436.     ai_run, 13, NULL,
  437.     ai_run, 13, NULL,
  438.     ai_run, 13, NULL,
  439.     ai_run, 13, NULL,
  440.     ai_run, 13, NULL,
  441.     ai_run, 13, NULL,
  442.     ai_run, 13, NULL,
  443.     ai_run, 13, NULL,
  444.     ai_run, 13, NULL,
  445.     ai_run, 13, NULL,
  446.     ai_run, 13, NULL,
  447.     ai_run, 13, NULL,
  448.     ai_run, 13, NULL,
  449.     ai_run, 13, NULL,
  450.     ai_run, 13, NULL,
  451.     ai_run, 13, NULL,
  452.     ai_run, 13, NULL,
  453.     ai_run, 13, NULL,
  454.     ai_run, 13, NULL,
  455.     ai_run, 13, NULL,
  456.     ai_run, 13, NULL,
  457.     ai_run, 13, NULL,
  458.     ai_run, 13, NULL,
  459.     ai_run, 13, NULL,
  460.     ai_run, 13, NULL,
  461.     ai_run, 13, NULL,
  462.     ai_run, 13, NULL,
  463.     ai_run, 13, NULL,
  464.     ai_run, 13, NULL,
  465.     ai_run, 13, NULL,
  466.     ai_run, 13, NULL,
  467.     ai_run, 13, NULL,
  468.     ai_run, 13, NULL,
  469.     ai_run, 13, NULL,
  470.     ai_run, 13, NULL,
  471.     ai_run, 13, NULL,
  472.     ai_run, 13, NULL,
  473.     ai_run, 13, NULL,
  474.     ai_run, 13, NULL,
  475.     ai_run, 13, NULL,
  476.     ai_run, 13, NULL,
  477.     ai_run, 13, NULL,
  478.     ai_run, 13, NULL,
  479.     ai_run, 13, NULL
  480. };
  481. mmove_t    floater_move_run = {FRAME_stand101, FRAME_stand152, floater_frames_run, NULL};
  482.  
  483. void floater_run (edict_t *self)
  484. {
  485.     if (self->monsterinfo.aiflags & AI_STAND_GROUND)
  486.         self->monsterinfo.currentmove = &floater_move_stand1;
  487.     else
  488.         self->monsterinfo.currentmove = &floater_move_run;
  489. }
  490.  
  491. void floater_walk (edict_t *self)
  492. {
  493.     self->monsterinfo.currentmove = &floater_move_walk;
  494. }
  495.  
  496. void floater_wham (edict_t *self)
  497. {
  498.     static    vec3_t    aim = {MELEE_DISTANCE, 0, 0};
  499.     gi.sound (self, CHAN_WEAPON, sound_attack3, 1, ATTN_NORM, 0);
  500.     fire_hit (self, aim, 5 + rand() % 6, -50);
  501. }
  502.  
  503. void floater_zap (edict_t *self)
  504. {
  505.     vec3_t    forward, right;
  506.     vec3_t    origin;
  507.     vec3_t    dir;
  508.     vec3_t    offset;
  509.  
  510.     VectorSubtract (self->enemy->s.origin, self->s.origin, dir);
  511.  
  512.     AngleVectors (self->s.angles, forward, right, NULL);
  513.     //FIXME use a flash and replace these two lines with the commented one
  514.     VectorSet (offset, 18.5, -0.9, 10);
  515.     G_ProjectSource (self->s.origin, offset, forward, right, origin);
  516. //    G_ProjectSource (self->s.origin, monster_flash_offset[flash_number], forward, right, origin);
  517.  
  518.     gi.sound (self, CHAN_WEAPON, sound_attack2, 1, ATTN_NORM, 0);
  519.  
  520.     //FIXME use the flash, Luke
  521.     gi.WriteByte (svc_temp_entity);
  522.     gi.WriteByte (TE_SPLASH);
  523.     gi.WriteByte (32);
  524.     gi.WritePosition (origin);
  525.     gi.WriteDir (dir);
  526.     gi.WriteByte (1);    //sparks
  527.     gi.multicast (origin, MULTICAST_PVS);
  528.  
  529.     T_Damage (self->enemy, self, self, dir, self->enemy->s.origin, vec3_origin, 5 + rand() % 6, -10, DAMAGE_ENERGY);
  530. }
  531.  
  532. void floater_attack(edict_t *self)
  533. {
  534.     self->monsterinfo.currentmove = &floater_move_attack1;
  535. }
  536.  
  537.  
  538. void floater_melee(edict_t *self)
  539. {
  540.     if (random() < 0.5)        
  541.         self->monsterinfo.currentmove = &floater_move_attack3;
  542.     else
  543.         self->monsterinfo.currentmove = &floater_move_attack2;
  544. }
  545.  
  546.  
  547. void floater_pain (edict_t *self, edict_t *other, float kick, int damage)
  548. {
  549.     int        n;
  550.  
  551.     if (self->health < (self->max_health / 2))
  552.         self->s.skinnum = 1;
  553.  
  554.     if (level.time < self->pain_debounce_time)
  555.         return;
  556.  
  557.     self->pain_debounce_time = level.time + 3;
  558.  
  559.     n = (rand() + 1) % 3;
  560.     if (n == 0)
  561.     {
  562.         gi.sound (self, CHAN_VOICE, sound_pain1, 1, ATTN_NORM, 0);
  563.         self->monsterinfo.currentmove = &floater_move_pain1;
  564.     }
  565.     else
  566.     {
  567.         gi.sound (self, CHAN_VOICE, sound_pain2, 1, ATTN_NORM, 0);
  568.         self->monsterinfo.currentmove = &floater_move_pain2;
  569.     }
  570. }
  571.  
  572. void floater_dead (edict_t *self)
  573. {
  574.     VectorSet (self->mins, -16, -16, -24);
  575.     VectorSet (self->maxs, 16, 16, -8);
  576.     self->movetype = MOVETYPE_TOSS;
  577.     self->nextthink = 0;
  578.     gi.linkentity (self);
  579. }
  580.  
  581. void floater_die (edict_t *self, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point)
  582. {
  583.     gi.sound (self, CHAN_VOICE, sound_death1, 1, ATTN_NORM, 0);
  584.     BecomeExplosion1(self);
  585. }
  586.  
  587. /*QUAKED monster_floater (1 .5 0) (-16 -16 -24) (16 16 32) Ambush Trigger_Spawn Sight
  588. */
  589. void SP_monster_floater (edict_t *self)
  590. {
  591.     if (deathmatch->value)
  592.     {
  593.         G_FreeEdict (self);
  594.         return;
  595.     }
  596.  
  597.     sound_attack2 = gi.soundindex ("floater/fltatck2.wav");
  598.     sound_attack3 = gi.soundindex ("floater/fltatck3.wav");
  599.     sound_death1 = gi.soundindex ("floater/fltdeth1.wav");
  600.     sound_idle = gi.soundindex ("floater/fltidle1.wav");
  601.     sound_pain1 = gi.soundindex ("floater/fltpain1.wav");
  602.     sound_pain2 = gi.soundindex ("floater/fltpain2.wav");
  603.     sound_sight = gi.soundindex ("floater/fltsght1.wav");
  604.  
  605.     gi.soundindex ("floater/fltatck1.wav");
  606.  
  607.     self->s.sound = gi.soundindex ("floater/fltsrch1.wav");
  608.  
  609.     self->movetype = MOVETYPE_STEP;
  610.     self->solid = SOLID_BBOX;
  611.     self->s.modelindex = gi.modelindex ("models/monsters/float/tris.md2");
  612.     VectorSet (self->mins, -24, -24, -24);
  613.     VectorSet (self->maxs, 24, 24, 32);
  614.  
  615.     self->health = 200;
  616.     self->gib_health = -80;
  617.     self->mass = 300;
  618.  
  619.     self->pain = floater_pain;
  620.     self->die = floater_die;
  621.  
  622.     self->monsterinfo.stand = floater_stand;
  623.     self->monsterinfo.walk = floater_walk;
  624.     self->monsterinfo.run = floater_run;
  625. //    self->monsterinfo.dodge = floater_dodge;
  626.     self->monsterinfo.attack = floater_attack;
  627.     self->monsterinfo.melee = floater_melee;
  628.     self->monsterinfo.sight = floater_sight;
  629.     self->monsterinfo.idle = floater_idle;
  630.  
  631.     gi.linkentity (self);
  632.  
  633.     if (random() <= 0.5)        
  634.         self->monsterinfo.currentmove = &floater_move_stand1;    
  635.     else
  636.         self->monsterinfo.currentmove = &floater_move_stand2;    
  637.     
  638.     self->monsterinfo.scale = MODEL_SCALE;
  639.  
  640.     flymonster_start (self);
  641. }
  642.