home *** CD-ROM | disk | FTP | other *** search
/ Action Games (2008) / akcnihry1.iso / Code RED / codered.exe / Data1.cab / M_martian_naked.c < prev    next >
Encoding:
C/C++ Source or Header  |  2002-12-19  |  10.7 KB  |  440 lines

  1. /*
  2. ==============================================================================
  3.  
  4. martian_naked
  5.  
  6. ==============================================================================
  7. */
  8.  
  9. #include "g_local.h"
  10. #include "m_martian_naked.h"
  11.  
  12.  
  13. static int sound_pain;
  14. static int sound_die;
  15. static int sound_idle;
  16. static int sound_punch;
  17. static int sound_sight;
  18. static int sound_search;
  19. static int sound_ack;
  20.  
  21. void martian_naked_fidget (edict_t *self);
  22.  
  23. void martian_naked_search (edict_t *self)
  24. {
  25.     gi.sound (self, CHAN_VOICE, sound_search, 1, ATTN_NORM, 0);
  26. }
  27.  
  28. void ack (edict_t *self)
  29. {
  30.     
  31.     gi.sound (self, CHAN_VOICE, sound_ack, 1, ATTN_IDLE, 0);
  32.  
  33. }
  34.  
  35. mframe_t martian_naked_frames_stand [] =
  36. {
  37.     ai_stand, 0, martian_naked_fidget,
  38.     ai_stand, 0, NULL,
  39.     ai_stand, 0, NULL,
  40.     ai_stand, 0, NULL,
  41.     ai_stand, 0, NULL,
  42.     ai_stand, 0, NULL,    
  43.     ai_stand, 0, NULL,
  44.     ai_stand, 0, NULL,
  45.     ai_stand, 0, NULL,
  46.     ai_stand, 0, NULL,
  47.     ai_stand, 0, NULL,
  48.     ai_stand, 0, NULL
  49.     
  50. };
  51. mmove_t martian_naked_move_stand = {FRAME_idle01, FRAME_idle12, martian_naked_frames_stand, NULL};
  52.  
  53. void martian_naked_stand (edict_t *self)
  54. {
  55.     self->monsterinfo.currentmove = &martian_naked_move_stand;
  56. }
  57.  
  58. mframe_t martian_naked_frames_karate [] =
  59. {
  60.     ai_stand, 0, NULL,
  61.     ai_stand, 0, NULL,
  62.     ai_stand, 0, NULL,
  63.     ai_stand, 0, NULL,
  64.     ai_stand, 0, NULL,
  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,
  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.     
  84. };
  85. mmove_t martian_naked_move_karate = {FRAME_karate01, FRAME_karate23, martian_naked_frames_karate, NULL};
  86.  
  87. void martian_naked_karate (edict_t *self)
  88. {
  89.     self->monsterinfo.currentmove = &martian_naked_move_karate;
  90. }
  91.  
  92. void martian_naked_idle(edict_t *self)
  93. {
  94.     if (self->spawnflags & 1)
  95.         martian_naked_karate(self);
  96.     else
  97.         martian_naked_stand(self);
  98. }
  99.  
  100. mframe_t martian_naked_frames_stand_fidget [] =
  101. {
  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. };
  115. mmove_t martian_naked_move_stand_fidget = {FRAME_idle01, FRAME_idle12, martian_naked_frames_stand_fidget, martian_naked_stand};
  116.  
  117. void martian_naked_fidget (edict_t *self)
  118. {
  119.     if (self->monsterinfo.aiflags & AI_STAND_GROUND)
  120.         return;
  121.     if (random() > 0.15)
  122.         return;
  123.  
  124.     self->monsterinfo.currentmove = &martian_naked_move_stand_fidget;
  125. //    gi.sound (self, CHAN_VOICE, sound_idle, 1, ATTN_IDLE, 0);
  126. }
  127.  
  128.  
  129. mframe_t martian_naked_frames_walk [] =
  130. {
  131.     ai_walk, 3.1, NULL,
  132.     ai_walk, 4.3, NULL,
  133.     ai_walk, 4.9, NULL,
  134.     ai_walk, 2.7, NULL,
  135.     ai_walk, 3.0, NULL,
  136.     ai_walk, 4.9, NULL,
  137.     ai_walk, 2.7, NULL,
  138.     ai_walk, 3.0, NULL,
  139.     ai_walk, 3.2, NULL,
  140.     ai_walk, 4.2, NULL,
  141.     ai_walk, 4.2, NULL,
  142.     ai_walk, 3.1, NULL
  143. };
  144. mmove_t martian_naked_move_walk = {FRAME_walk01, FRAME_walk12, martian_naked_frames_walk, NULL};
  145.  
  146. void martian_naked_walk (edict_t *self)
  147. {
  148.     self->monsterinfo.currentmove = &martian_naked_move_walk;
  149. }
  150.  
  151.  
  152. mframe_t martian_naked_frames_run1 [] =
  153. {
  154.     ai_run, 25, NULL,
  155.     ai_run, 10, NULL,
  156.     ai_run, 5, NULL,
  157.     ai_run, 24, NULL,
  158.     ai_run, 11, NULL,
  159.     ai_run, 5, NULL
  160. };
  161. mmove_t martian_naked_move_run1 = {FRAME_run01, FRAME_run06, martian_naked_frames_run1, NULL};
  162.  
  163. void martian_naked_run (edict_t *self)
  164. {
  165.     if (self->monsterinfo.aiflags & AI_STAND_GROUND)
  166.         self->monsterinfo.currentmove = &martian_naked_move_stand;
  167.     else
  168.         self->monsterinfo.currentmove = &martian_naked_move_run1;
  169. }
  170.  
  171. void martian_punch (edict_t *self)
  172. {
  173.     vec3_t    aim;
  174.  
  175.     VectorSet (aim, MELEE_DISTANCE, self->mins[0], -4);
  176.     gi.sound (self, CHAN_VOICE, sound_punch, 1, ATTN_NORM, 0);
  177.     fire_hit (self, aim, (5 + (rand() % 6)), 50);        // Slower attack
  178. }
  179.  
  180. mframe_t martian_naked_frames_melee [] =
  181. {
  182.     ai_charge, 0, NULL,
  183.     ai_charge, 0, NULL,
  184.     ai_charge, 0, NULL,
  185.     ai_charge, 0, NULL,
  186.     ai_charge, 0, NULL,
  187.     ai_charge, 0, NULL,
  188.     ai_charge, 0, NULL,
  189.     ai_charge, 0, NULL,
  190.     ai_charge, 0, NULL,
  191.     ai_charge, 0, NULL,
  192.     ai_charge, 0, NULL,
  193.     ai_charge, 0, NULL,
  194.     ai_charge, 0, NULL,
  195.     ai_charge, 0, NULL,
  196.     ai_charge, 0, NULL,
  197.     ai_charge, 0, martian_punch,    
  198.     ai_charge, 0, NULL,
  199.     ai_charge, 0, NULL,
  200.     ai_charge, 0, NULL
  201. };
  202. mmove_t martian_naked_move_melee = {FRAME_attack01, FRAME_attack19, martian_naked_frames_melee, martian_naked_run};
  203.  
  204. mframe_t martian_naked_frames_melee2 [] =
  205. {
  206.     ai_charge, 0, NULL,
  207.     ai_charge, 0, NULL,
  208.     ai_charge, 0, NULL,
  209.     ai_charge, 0, NULL,
  210.     ai_charge, 0, martian_punch,    
  211.     ai_charge, 0, NULL,
  212.     ai_charge, 0, NULL,
  213.     ai_charge, 0, NULL
  214. };
  215. mmove_t martian_naked_move_melee2 = {FRAME_attack12, FRAME_attack19, martian_naked_frames_melee2, martian_naked_run};
  216.  
  217. void martian_naked_melee (edict_t *self)
  218. {    
  219.     if (random() > 0.5)
  220.         self->monsterinfo.currentmove = &martian_naked_move_melee2;
  221.     else
  222.         self->monsterinfo.currentmove = &martian_naked_move_melee;
  223. }
  224.  
  225. void martian_naked_explode (edict_t *self)
  226. {
  227.     int n;
  228.     int damage = 20;
  229.         
  230.     for (n = 0; n < 4; n++)
  231.         ThrowGib (self, "models/objects/gibs/mart_gut/tris.md2", damage, GIB_ORGANIC, EF_GREENGIB);
  232.     ThrowHead (self, "models/objects/gibs/mart_head/tris.md2", damage, GIB_ORGANIC, EF_GREENGIB);
  233.     gi.sound (self, CHAN_VOICE, sound_die, 1, ATTN_NORM, 0);
  234.     return;
  235. }
  236.  
  237. void naked_martian_duck_down (edict_t *self)
  238. {
  239.     if (self->monsterinfo.aiflags & AI_DUCKED)
  240.         return;
  241.  
  242.     self->monsterinfo.aiflags |= AI_DUCKED;
  243.     self->maxs[2] -= 32;
  244.     self->takedamage = DAMAGE_YES;
  245.     self->monsterinfo.pausetime = level.time + 1;
  246.     gi.linkentity (self);
  247. }
  248.  
  249. void naked_martian_duck_up (edict_t *self)
  250. {
  251.     self->monsterinfo.aiflags &= ~AI_DUCKED;
  252.     self->maxs[2] += 32;
  253.     self->takedamage = DAMAGE_AIM;
  254.     gi.linkentity (self);
  255. }
  256.  
  257. mframe_t naked_martian_frames_duck [] =
  258. {
  259.     ai_move, 0, naked_martian_duck_down,
  260.     ai_move, 0, NULL,
  261.     ai_move, 0, NULL,
  262.     ai_move, 0, NULL,
  263.     ai_move, 0, NULL,
  264.     ai_move, 0, NULL,
  265.     ai_move, 0, NULL,
  266.     ai_move, 0, NULL,
  267.     ai_move, 0, NULL,
  268.     ai_move, 0, naked_martian_duck_up,
  269.     ai_move, 0, NULL
  270. };
  271. mmove_t    naked_martian_move_duck = {FRAME_duck01, FRAME_duck11, naked_martian_frames_duck, martian_naked_run};
  272.  
  273. void naked_martian_dodge (edict_t *self, edict_t *attacker, float eta)
  274. {
  275.     if (random() > 0.25)
  276.         return;
  277.  
  278.     if (!self->enemy)
  279.         self->enemy = attacker;
  280.  
  281.     self->monsterinfo.currentmove = &naked_martian_move_duck;
  282. }
  283.  
  284. mframe_t martian_naked_frames_pain1 [] =
  285. {
  286.     ai_move, 0, NULL,
  287.     ai_move, 0, NULL,
  288.     ai_move, 0, NULL,
  289.     ai_move, 0, NULL,
  290.     ai_move, 0, NULL,
  291.     ai_move, 0, NULL,
  292.     ai_move, 0, NULL
  293. };
  294. mmove_t martian_naked_move_pain1 = {FRAME_pain01, FRAME_pain07, martian_naked_frames_pain1, martian_naked_run};
  295.  
  296.  
  297. mframe_t martian_naked_frames_pain2 [] =
  298. {
  299.     ai_move, 0, NULL,
  300.     ai_move, 0, NULL,
  301.     ai_move, 0, NULL,
  302.     ai_move, 0, NULL,
  303.     ai_move, 0, NULL,
  304.     ai_move, 0, NULL,
  305.     ai_move, 0, NULL,
  306.     ai_move, 0, NULL,
  307.     ai_move, 0, NULL,
  308.     ai_move, 0, NULL,
  309.     ai_move, 0, NULL,
  310.     ai_move, 0, NULL
  311. };
  312. mmove_t martian_naked_move_pain2 = {FRAME_pain01, FRAME_pain10, martian_naked_frames_pain2, martian_naked_run};
  313.  
  314. void martian_naked_pain (edict_t *self, edict_t *other, float kick, int damage)
  315. {
  316.     if (self->health < (self->max_health / 2))
  317.         self->s.skinnum = 1;
  318.     
  319.     if (level.time < self->pain_debounce_time)
  320.         return;
  321.  
  322.     self->pain_debounce_time = level.time + 3;
  323.     gi.sound (self, CHAN_VOICE, sound_pain, 1, ATTN_NORM, 0);
  324.  
  325.     if (random() < 0.5)
  326.         self->monsterinfo.currentmove = &martian_naked_move_pain1;
  327.     else
  328.         self->monsterinfo.currentmove = &martian_naked_move_pain2;
  329. }
  330.  
  331. void martian_naked_dead (edict_t *self)
  332. {
  333.     VectorSet (self->mins, -16, -16, -42);
  334.     VectorSet (self->maxs, 16, 16, -8);
  335.     self->movetype = MOVETYPE_TOSS;
  336.     self->svflags |= SVF_DEADMONSTER;
  337.     self->nextthink = 0;
  338.     gi.linkentity (self);
  339. }
  340.  
  341.  
  342. mframe_t martian_naked_frames_death1 [] =
  343. {
  344.     
  345.     ai_move, 0, NULL,
  346.     ai_move, 0, NULL,
  347.     ai_move, 0, NULL,
  348.     ai_move, 0, NULL,
  349.     ai_move, 0, NULL,
  350.     ai_move, 0, NULL,
  351.     ai_move, 0, NULL,
  352.     ai_move, 0, NULL,
  353.     ai_move, 0, NULL,
  354.     ai_move, 0, martian_naked_explode
  355.     
  356. };
  357. mmove_t martian_naked_move_death1 = {FRAME_pain01, FRAME_pain10, martian_naked_frames_death1, martian_naked_dead};
  358.  
  359. void martian_naked_die (edict_t *self, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point)
  360. {
  361.     int        n;
  362.  
  363.     if (self->health <= self->gib_health)
  364.     {
  365.         gi.sound (self, CHAN_VOICE, sound_die, 1, ATTN_NORM, 0);
  366.         for (n = 0; n < 4; n++)
  367.             ThrowGib (self, "models/objects/gibs/mart_gut/tris.md2", damage, GIB_ORGANIC, EF_GREENGIB);
  368.         ThrowHead (self, "models/objects/gibs/mart_head/tris.md2", damage, GIB_ORGANIC, EF_GREENGIB);
  369.         self->deadflag = DEAD_DEAD;
  370.         return;
  371.     }
  372.  
  373.     if (self->deadflag == DEAD_DEAD)
  374.         return;
  375.  
  376.     self->deadflag = DEAD_DEAD;
  377.     self->takedamage = DAMAGE_YES;
  378.  
  379.     self->monsterinfo.currentmove = &martian_naked_move_death1;
  380. }
  381.  
  382.  
  383. /*QUAKED monster_martian_naked (1 .5 0) (-16 -16 -24) (16 16 32) Ambush Trigger_Spawn Sight
  384. */
  385. void SP_monster_martian_naked (edict_t *self)
  386. {
  387.     if (deathmatch->value)
  388.     {
  389.         G_FreeEdict (self);
  390.         return;
  391.     }
  392.  
  393.     // pre-caches
  394.     sound_pain  = gi.soundindex ("martian/ack2.wav");
  395.     sound_die   = gi.soundindex ("martian/death.wav");
  396.     sound_idle  = gi.soundindex ("martian/ack1.wav");
  397.     sound_punch = gi.soundindex ("martian/punch.wav");
  398.     sound_search = gi.soundindex ("martian/ack1.wav");
  399.     sound_sight = gi.soundindex ("martian/ack1.wav");
  400.     sound_ack = gi.soundindex ("martian/ack3.wav");
  401.  
  402.     if (self->spawnflags & 4)
  403.         self->s.modelindex = gi.modelindex("models/monsters/martian_karate/tris.md2");
  404.     else
  405.         self->s.modelindex = gi.modelindex("models/monsters/martian_naked/tris.md2");
  406.         
  407.     VectorSet (self->mins, -16, -16, 0);
  408.     VectorSet (self->maxs, 16, 16, 64);
  409.     self->movetype = MOVETYPE_STEP;
  410.     self->solid = SOLID_BBOX;
  411.  
  412.     self->max_health = 100;
  413.     self->health = self->max_health;
  414.     self->gib_health = -40;
  415.     self->mass = 150;
  416.  
  417.     self->pain = martian_naked_pain;
  418.     self->die = martian_naked_die;
  419.  
  420.     self->monsterinfo.stand = martian_naked_idle;
  421.     self->monsterinfo.walk = martian_naked_walk;
  422.     self->monsterinfo.run = martian_naked_run;
  423.     self->monsterinfo.dodge = naked_martian_dodge;
  424.     self->monsterinfo.attack = NULL;
  425.     self->monsterinfo.melee = martian_naked_melee;
  426.     self->monsterinfo.sight = NULL;
  427.     self->monsterinfo.search = NULL;
  428.  
  429.     self->monsterinfo.currentmove = &martian_naked_move_stand;
  430.     self->monsterinfo.scale = MODEL_SCALE;
  431.  
  432.     if ( random() < 0.5 ) {
  433.         self->monsterinfo.aiflags = AI_BRUTAL;
  434.     }
  435.  
  436.     gi.linkentity (self);
  437.  
  438.     walkmonster_start (self);
  439. }
  440.