1: /* 2: * Copyright (c) 1983 Regents of the University of California, 3: * All rights reserved. Redistribution permitted subject to 4: * the terms of the Berkeley Software License Agreement. 5: */ 6: 7: #if !defined(lint) && !defined(pdp11) 8: static char sccsid[] = "@(#)com7.c 1.3.1 1996/10/26"; 9: #endif 10: 11: #include "externs.h" 12: 13: fight(enemy,strength) 14: int enemy,strength; 15: { 16: int lifeline = 0; 17: int hurt; 18: char auxbuf[LINELENGTH]; 19: char *next; 20: int i; 21: int exhaustion; 22: 23: fighton: 24: Time++; 25: snooze -= 5; 26: if (snooze > Time) 27: exhaustion = CYCLE/(snooze - Time); 28: else { 29: puts("You collapse exhausted, and he pulverizes your skull."); 30: die(); 31: } 32: if (snooze - Time < 20) 33: puts("You look tired! I hope you're able to fight."); 34: next = getcom(auxbuf, LINELENGTH, "<fight!>-: ", 0); 35: for (i=0; next && i < 10; i++) 36: next = getword(next, words[i], -1); 37: parse(); 38: switch(wordvalue[wordnumber]){ 39: 40: case KILL: 41: case SMITE: 42: if (testbit(inven,TWO_HANDED)) 43: hurt = rnd(70) - 2 * card(injuries,NUMOFINJURIES) - ucard(wear) - exhaustion; 44: else if (testbit(inven,SWORD) || testbit(inven, BROAD)) 45: hurt = rnd(50)%(WEIGHT-carrying)-card(injuries,NUMOFINJURIES)-encumber - exhaustion; 46: else if (testbit(inven,KNIFE) || testbit(inven,MALLET) || testbit(inven,CHAIN) || testbit(inven,MACE) || testbit(inven,HALBERD)) 47: hurt = rnd(15) - card(injuries,NUMOFINJURIES) - exhaustion; 48: else 49: hurt = rnd(7) - encumber; 50: if (hurt < 5) 51: switch(rnd(3)){ 52: 53: case 0: 54: puts("You swung wide and missed."); 55: break; 56: case 1: 57: puts("He checked your blow. CLASH! CLANG!"); 58: break; 59: case 2: 60: puts("His filthy tunic hangs by one less thread."); 61: break; 62: } 63: else if (hurt < 10){ 64: switch(rnd(3)){ 65: case 0: 66: puts("He's bleeding."); 67: break; 68: case 1: 69: puts("A trickle of blood runs down his face."); 70: break; 71: case 2: 72: puts("A huge purple bruise is forming on the side of his face."); 73: break; 74: } 75: lifeline++; 76: } 77: else if (hurt < 20){ 78: switch(rnd(3)){ 79: case 0: 80: puts("He staggers back quavering."); 81: break; 82: case 1: 83: puts("He jumps back with his hand over the wound."); 84: break; 85: case 2: 86: puts("His shirt falls open with a swath across the chest."); 87: break; 88: } 89: lifeline += 5; 90: } 91: else if (hurt < 30){ 92: switch(rnd(3)){ 93: case 0: 94: printf("A bloody gash opens up on his %s side.\n",(rnd(2) ? "left" : "right")); 95: break; 96: case 1: 97: puts("The steel bites home and scrapes along his ribs."); 98: break; 99: case 2: 100: puts("You pierce him, and his breath hisses through clenched teeth."); 101: break; 102: } 103: lifeline += 10; 104: } 105: else if (hurt < 40){ 106: switch(rnd(3)){ 107: case 0: 108: puts("You smite him to the ground."); 109: if (strength - lifeline > 20) 110: puts("But in a flurry of steel he regains his feet!"); 111: break; 112: case 1: 113: puts("The force of your blow sends him to his knees."); 114: puts("His arm swings lifeless at his side."); 115: break; 116: case 2: 117: puts("Clutching his blood drenched shirt, he collapses stunned."); 118: break; 119: } 120: lifeline += 20; 121: } 122: else { 123: switch(rnd(3)){ 124: case 0: 125: puts("His ribs crack under your powerful swing, flooding his lungs with blood."); 126: break; 127: case 1: 128: puts("You shatter his upheld arm in a spray of blood. The blade continues deep"); 129: puts("into his back, severing the spinal cord."); 130: lifeline += 25; 131: break; 132: case 2: 133: puts("With a mighty lunge the steel slides in, and gasping, he falls to the ground."); 134: lifeline += 25; 135: break; 136: } 137: lifeline += 30; 138: } 139: break; 140: 141: case BACK: 142: if (enemy == DARK && lifeline > strength * 0.33){ 143: puts("He throws you back against the rock and pummels your face."); 144: if (testbit(inven,AMULET) || testbit(wear,AMULET)){ 145: printf("Lifting the amulet from you, "); 146: if (testbit(inven,MEDALION) || testbit(wear,MEDALION)){ 147: puts("his power grows and the walls of\nthe earth tremble."); 148: puts("When he touches the medallion, your chest explodes and the foundations of the\nearth collapse."); 149: puts("The planet is consumed by darkness."); 150: die(); 151: } 152: if (testbit(inven,AMULET)){ 153: clearbit(inven,AMULET); 154: carrying -= objwt[AMULET]; 155: encumber -= objcumber[AMULET]; 156: } 157: else 158: clearbit(wear,AMULET); 159: puts("he flees down the dark caverns."); 160: clearbit(location[position].objects,DARK); 161: injuries[SKULL] = 1; 162: followfight = Time; 163: return (0); 164: } 165: else{ 166: puts("I'm afraid you have been killed."); 167: die(); 168: } 169: } 170: else{ 171: puts("You escape stunned and disoriented from the fight."); 172: puts("A victorious bellow echoes from the battlescene."); 173: if (back && position != back) 174: move(back,BACK); 175: else if (ahead &&position != ahead) 176: move(ahead,AHEAD); 177: else if (left && position != left) 178: move(left,LEFT); 179: else if (right && position != right) 180: move(right,RIGHT); 181: else 182: move(location[position].down,AHEAD); 183: return(0); 184: } 185: 186: case SHOOT: 187: if (testbit(inven,LASER)){ 188: if (strength - lifeline <= 50){ 189: printf("The %s took a direct hit!\n",objsht[enemy]); 190: lifeline += 50; 191: } 192: else { 193: puts("With his bare hand he deflects the laser blast and whips the pistol from you!"); 194: clearbit(inven,LASER); 195: setbit(location[position].objects,LASER); 196: carrying -= objwt[LASER]; 197: encumber -= objcumber[LASER]; 198: } 199: } 200: else 201: puts("Unfortunately, you don't have a blaster handy."); 202: break; 203: 204: case DROP: 205: case DRAW: 206: cypher(); 207: Time--; 208: break; 209: 210: default: 211: puts("You don't have a chance, he is too quick."); 212: break; 213: 214: } 215: if (lifeline >= strength){ 216: printf("You have killed the %s.\n", objsht[enemy]); 217: if (enemy == ELF || enemy == DARK) 218: puts("A watery black smoke consumes his body and then vanishes with a peal of thunder!"); 219: clearbit(location[position].objects,enemy); 220: power += 2; 221: notes[JINXED]++; 222: return(0); 223: } 224: puts("He attacks..."); 225: /* some embellisments */ 226: hurt = rnd(NUMOFINJURIES) - (testbit(inven,SHIELD) != 0) - (testbit(wear,MAIL) != 0) - (testbit(wear,HELM) != 0); 227: hurt += (testbit(wear,AMULET) != 0) + (testbit(wear,MEDALION) != 0) + (testbit(wear,TALISMAN) != 0); 228: hurt = hurt < 0 ? 0 : hurt; 229: hurt = hurt >= NUMOFINJURIES ? NUMOFINJURIES -1 : hurt; 230: if (!injuries[hurt]){ 231: injuries[hurt] = 1; 232: printf("I'm afraid you have suffered %s.\n", ouch[hurt]); 233: } 234: else 235: puts("You emerge unscathed."); 236: if (injuries[SKULL] && injuries[INCISE] && injuries[NECK]){ 237: puts("I'm afraid you have suffered fatal injuries."); 238: die(); 239: } 240: goto fighton; 241: }