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 04/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 } 242