home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / games / volume5 / omega2 / part17 / ommelee.c < prev    next >
C/C++ Source or Header  |  1988-07-26  |  8KB  |  296 lines

  1. /* omega copyright (c) 1987,1988 by Laurence Raphael Brothers */
  2. /* ommelee */
  3. /* various functions to do with monster melee */
  4.  
  5. #include "oglob.h"
  6.  
  7.  
  8. void m_hit(m,dtype)
  9. struct monster *m;
  10. int dtype;
  11. {
  12.   if (m->uniqueness == COMMON) {
  13.     strcpy(Str3,"a ");
  14.     strcat(Str3,m->monstring);
  15.   }
  16.   else strcpy(Str3,m->monstring);
  17.   if ((Player.status[DISPLACED] > 0) && (random_range(2) == 1))
  18.     mprint("The attack was displaced!");
  19.   else  p_damage(random_range(m->dmg),dtype,Str3);
  20. }
  21.  
  22.  
  23.  
  24. /* execute monster attacks versus player */
  25. void tacmonster(m)
  26. struct monster *m;
  27. {
  28.   int i=0;
  29.   drawvision(Player.x,Player.y);
  30.   transcribe_monster_actions(m);
  31.   while ((i < strlen(m->meleestr)) && (m->hp > 0)) {
  32.     if (m->uniqueness == COMMON) {
  33.       strcpy(Str4,"The ");
  34.       strcat(Str4,m->monstring);
  35.     }
  36.     else strcpy(Str4,m->monstring);
  37.     if (m->meleestr[i] == 'A') {
  38.       strcat(Str4," attacks ");
  39.       strcat(Str4,actionlocstr(m->meleestr[i+1]));
  40.       if (Verbosity == VERBOSE) mprint(Str4);
  41.       monster_melee(m,m->meleestr[i+1],0);
  42.     }
  43.     else if (m->meleestr[i] == 'L') {
  44.       strcat(Str4," lunges ");
  45.       strcat(Str4,actionlocstr(m->meleestr[i+1]));
  46.       if (Verbosity == VERBOSE) mprint(Str4);
  47.       monster_melee(m,m->meleestr[i+1],m->level);
  48.     }
  49.     i+=2;
  50.   }
  51. }
  52.  
  53.  
  54.  
  55. void monster_melee(m,hitloc,bonus)
  56. struct monster *m;
  57. char hitloc;
  58. int bonus;
  59. {
  60.   if (player_on_sanctuary())
  61.     print1("The aegis of your deity protects you!");
  62.   else {
  63.     /* It's lawful to wait to be attacked */
  64.     if (m->attacked==0) Player.alignment++;
  65.     m->attacked++;
  66.     if (m->uniqueness == COMMON) {
  67.       strcpy(Str2,"The ");
  68.       strcat(Str2,m->monstring);
  69.     }
  70.     else strcpy(Str2,m->monstring);
  71.     if (monster_hit(m,hitloc,bonus))
  72.       switch(m->meleef) {
  73.       case M_NO_OP: 
  74.     strcat(Str2," touches you.");
  75.     mprint(Str2);
  76.     break;
  77.       case M_MELEE_NORMAL:
  78.     strcat(Str2," hits you.");
  79.     mprint(Str2);
  80.     m_hit(m,NORMAL_DAMAGE);
  81.     break;
  82.       case M_MELEE_NG:
  83.     strcat(Str2," hits you.");
  84.     mprint(Str2);
  85.     m_hit(m,NORMAL_DAMAGE);
  86.     if (random_range(5)==3) m_sp_ng(m);
  87.     break;
  88.       case M_MELEE_FIRE:
  89.     strcat(Str2," blasts you with fire.");
  90.     mprint(Str2);
  91.     m_hit(m,FLAME);
  92.     break;
  93.       case M_MELEE_DRAGON:
  94.     strcat(Str2," hits you and blasts you with fire.");
  95.     mprint(Str2);
  96.     m_hit(m,NORMAL_DAMAGE);
  97.     m_hit(m,FLAME);
  98.     break;
  99.       case M_MELEE_ELEC:
  100.     strcat(Str2," lashes you with electricity.");
  101.     mprint(Str2);
  102.     m_hit(m,ELECTRICITY);
  103.     break;
  104.       case M_MELEE_COLD:
  105.     strcat(Str2," freezes you with cold.");
  106.     mprint(Str2);
  107.     m_hit(m,ELECTRICITY);
  108.     break;
  109.       case M_MELEE_POISON:
  110.     strcat(Str2," hits you.");
  111.     mprint(Str2);
  112.     m_hit(m,NORMAL_DAMAGE);
  113.     if (random_range(10) < m->level) {
  114.       mprint("You've been poisoned!");
  115.       p_poison(m->dmg);
  116.     }
  117.     break;
  118.       case M_MELEE_GRAPPLE:
  119.     strcat(Str2," grabs you.");
  120.     mprint(Str2);
  121.     m_hit(m,NORMAL_DAMAGE);
  122.     Player.status[IMMOBILE]++;
  123.     break;
  124.       case M_MELEE_SPIRIT:
  125.     strcat(Str2," touches you.");
  126.     mprint(Str2);
  127.     m_hit(m,NORMAL_DAMAGE);
  128.     drain_life(m->level);
  129.     break;
  130.       case M_MELEE_DISEASE:
  131.     strcat(Str2," hits you.");
  132.     mprint(Str2);
  133.     m_hit(m,NORMAL_DAMAGE);
  134.     if (random_range(10) < m->level) {
  135.       mprint("You've been infected!");
  136.       disease(m->level);
  137.     }
  138.     break;
  139.       case M_MELEE_SLEEP:
  140.     strcat(Str2," hit you.");
  141.     mprint(Str2);
  142.     m_hit(m,NORMAL_DAMAGE);
  143.     if (random_range(10) < m->level) {
  144.       mprint("You feel drowsy");
  145.       sleep_player(m->level);
  146.     }
  147.     break;
  148.       }
  149.     else {
  150.       if (random_range(10)) strcat(Str2," missed you.");
  151.       else switch(random_range(10)) {
  152.       case 0: strcat(Str2," flailed stupidly at you."); break;
  153.       case 1: strcat(Str2," made you laugh."); break;
  154.       case 2: strcat(Str2," blundered severely.");
  155.     m_damage(m,m->dmg,UNSTOPPABLE); break;
  156.       case 3: strcat(Str2," tripped while attacking.");m_dropstuff(m);break;
  157.       case 4: strcat(Str2," seems seriously confused.");
  158.     m->speed = min(30,m->speed*2); break;
  159.       case 5: strcat(Str2," is seriously ashamed."); break;
  160.       case 6: strcat(Str2," made a boo-boo."); break;
  161.       case 7: strcat(Str2," blundered."); break;
  162.       case 8: strcat(Str2," cries out in anger and frustration."); break;
  163.       case 9: strcat(Str2," curses your ancestry."); break;
  164.       }
  165.       mprint(Str2);
  166.     }
  167.   }
  168. }
  169.  
  170.  
  171.  
  172. /* checks to see if player hits with hitmod vs. monster m at location hitloc */
  173. int monster_hit(m,hitloc,bonus)
  174. struct monster *m;
  175. char hitloc;
  176. int bonus;
  177. {
  178.   int i=0,blocks=FALSE,goodblocks=0,hit,riposte=FALSE;
  179.   while (i<strlen(Player.meleestr)) {
  180.     if ((Player.meleestr[i] == 'B') || (Player.meleestr[i] == 'R')) {
  181.       blocks = TRUE;
  182.       if (hitloc == Player.meleestr[i+1]) {
  183.     goodblocks++;
  184.     if (Player.meleestr[i] == 'R') riposte = TRUE;
  185.       }
  186.     }
  187.     i+=2;
  188.   }
  189.   if (! blocks) goodblocks = -1;
  190.   hit = hitp(m->hit+bonus,Player.defense+goodblocks*10);
  191.   if ((! hit) && (goodblocks > 0)) {
  192.     if (Verbosity == VERBOSE) mprint("You blocked it!");
  193.     if (riposte) {
  194.       if (Verbosity != TERSE) mprint("You got a riposte!");
  195.       if (hitp(Player.hit,m->ac)) {
  196.     mprint("You hit!");
  197.     weapon_use(0,Player.possessions[O_WEAPON_HAND],m);
  198.       }
  199.       else mprint("You missed.");
  200.     }
  201.   }
  202.   return(hit);
  203. }
  204.  
  205.  
  206.  
  207. /* decide monster actions in tactical combat mode */
  208. /* if monster is skilled, it can try see the player's attacks coming and
  209.    try to block appropriately. */
  210.  
  211. void transcribe_monster_actions(m)
  212. struct monster *m;
  213. {
  214.   int i;
  215.   char attack_loc,block_loc;
  216.   static char mmstr[80];
  217.   
  218.   int p_blocks[3];
  219.   int p_attacks[3];
  220.  
  221.   for(i=0;i<3;i++)p_blocks[i] = p_attacks[i] = 0;
  222.  
  223.   /* Find which area player blocks and attacks least in */
  224.   i = 0;
  225.   while (i<strlen(Player.meleestr)) {
  226.     if ((Player.meleestr[i] == 'B') ||
  227.     (Player.meleestr[i] == 'R')) {
  228.       if (Player.meleestr[i+1] == 'H') p_blocks[0]++;
  229.       if (Player.meleestr[i+1] == 'C') p_blocks[1]++;
  230.       if (Player.meleestr[i+1] == 'L') p_blocks[2]++;
  231.     }
  232.     else if ((Player.meleestr[i] == 'A') ||
  233.          (Player.meleestr[i] == 'L')) {
  234.       if (Player.meleestr[i+1] == 'H') p_attacks[0]++;
  235.       if (Player.meleestr[i+1] == 'C') p_attacks[1]++;
  236.       if (Player.meleestr[i+1] == 'L') p_attacks[2]++;
  237.     }
  238.     i+=2;
  239.   }
  240.  
  241.   if ((p_blocks[2] <= p_blocks[1]) &&
  242.       (p_blocks[2] <= p_blocks[0]))
  243.     attack_loc = 'L';
  244.   else if ((p_blocks[1] <= p_blocks[2]) &&
  245.        (p_blocks[1] <= p_blocks[0]))
  246.     block_loc = 'C';
  247.   else attack_loc = 'H';
  248.   if ((p_attacks[2] <= p_attacks[1]) &&
  249.       (p_attacks[2] <= p_attacks[0]))
  250.     block_loc = 'L';
  251.   else if ((p_attacks[1] <= p_attacks[2]) &&
  252.        (p_attacks[1] <= p_attacks[0]))
  253.     block_loc = 'C';
  254.   else block_loc = 'H';
  255.  
  256.   m->meleestr = mmstr;
  257.  
  258.   if (m->id != NPC)
  259.     strcpy(m->meleestr,Monsters[m->id].meleestr);
  260.   else {
  261.     strcpy(m->meleestr,"");
  262.     for(i=0;i<m->level;i+=2) 
  263.       strcat(m->meleestr,"L?R?");
  264.   }
  265.  
  266.   i = 0;
  267.   while (i<strlen(m->meleestr)) {
  268.     if ((m->meleestr[i] == 'A') || (m->meleestr[i] == 'L')) {
  269.       if (m->meleestr[i+1] == '?') {
  270.     if (m->level+random_range(30) > Player.level+random_range(20))
  271.       m->meleestr[i+1] = attack_loc;
  272.     else m->meleestr[i+1] = random_loc();
  273.       }
  274.       else if (m->meleestr[i+1] == 'X') m->meleestr[i+1] = random_loc();
  275.     }
  276.     else if ((m->meleestr[i] == 'B') || (m->meleestr[i] == 'R')) {
  277.       if (m->meleestr[i+1] == '?') { 
  278.     if (m->level+random_range(30) > Player.level+random_range(20))
  279.       m->meleestr[i+1] = block_loc;
  280.     else m->meleestr[i+1] = random_loc();
  281.       }
  282.       else if (m->meleestr[i+1] == 'X') m->meleestr[i+1] = random_loc();
  283.     }
  284.     i+=2;
  285.   }
  286. }
  287.  
  288. char random_loc()
  289. {
  290.   switch(random_range(3)) {
  291.   case 0:return('H'); break;
  292.   case 1:return('C'); break;
  293.   case 2:return('L'); break;
  294.   }
  295. }
  296.