|
|
1.1 ! root 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: #ifndef lint ! 8: static char sccsid[] = "@(#)com7.c 1.3 4/24/85"; ! 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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.