1 /* moreobj.c Larn is copyrighted 1986 by Noah Morgan. 2 * 3 * Routines in this file: 4 * 5 * oaltar() 6 * othrone() 7 * ochest() 8 * ofountain() 9 */ 10 #include "header.h" 11 12 /* 13 * ****** 14 * OALTAR 15 * ****** 16 * 17 * subroutine to process an altar object 18 */ 19 oaltar() 20 { 21 unsigned long k; 22 23 lprcat("\nDo you (p) pray (d) desecrate"); iopts(); 24 while (1) 25 { 26 while (1) switch(getchar()) 27 { 28 case 'p': lprcat(" pray\nDo you (m) give money or (j) just pray? "); 29 while (1) switch(getchar()) 30 { 31 case 'j': if (rnd(100)<75) 32 lprcat("\nnothing happens"); 33 else if (rnd(13)<4) ohear(); 34 else if (rnd(43) == 10) 35 { 36 if (c[WEAR]) lprcat("\nYou feel your armor vibrate for a moment"); 37 enchantarmor(); return; 38 } 39 else if (rnd(43) == 10) 40 { 41 if (c[WIELD]) lprcat("\nYou feel your weapon vibrate for a moment"); 42 enchweapon(); return; 43 } 44 else createmonster(makemonst(level+1)); 45 return; 46 47 case 'm': lprcat("\n\n"); cursor(1,24); cltoeoln(); 48 cursor(1,23); cltoeoln(); 49 lprcat("how much do you donate? "); 50 k = readnum((long)c[GOLD]); 51 if (c[GOLD]<k) 52 { 53 lprcat("\nYou don't have that much!"); 54 return; 55 } 56 c[GOLD] -= k; 57 if (k < c[GOLD]/10 || k<rnd(50)) 58 { createmonster(makemonst(level+1)); c[AGGRAVATE] += 200; } 59 else if (rnd(101) > 50) { ohear(); return; } 60 else if (rnd(43) == 5) 61 { 62 if (c[WEAR]) lprcat("\nYou feel your armor vibrate for a moment"); 63 enchantarmor(); return; 64 } 65 else if (rnd(43) == 8) 66 { 67 if (c[WIELD]) lprcat("\nYou feel your weapon vibrate for a moment"); 68 enchweapon(); return; 69 } 70 else lprcat("\nThank You."); 71 bottomline(); return; 72 73 case '\33': return; 74 }; 75 76 case 'd': lprcat(" desecrate"); 77 if (rnd(100)<60) 78 { createmonster(makemonst(level+2)+8); c[AGGRAVATE] += 2500; } 79 else 80 if (rnd(101)<30) 81 { 82 lprcat("\nThe altar crumbles into a pile of dust before your eyes"); 83 forget(); /* remember to destroy the altar */ 84 } 85 else 86 lprcat("\nnothing happens"); 87 return; 88 89 case 'i': 90 case '\33': ignore(); 91 if (rnd(100)<30) { createmonster(makemonst(level+1)); c[AGGRAVATE] += rnd(450); } 92 else lprcat("\nnothing happens"); 93 return; 94 }; 95 } 96 } 97 98 /* 99 function to cast a +3 protection on the player 100 */ 101 static ohear() 102 { 103 lprcat("\nYou have been heard!"); 104 if (c[ALTPRO]==0) c[MOREDEFENSES]+=3; 105 c[ALTPRO] += 500; /* protection field */ 106 bottomline(); 107 } 108 109 /* 110 ******* 111 OTHRONE 112 ******* 113 114 subroutine to process a throne object 115 */ 116 othrone(arg) 117 int arg; 118 { 119 register int i,k; 120 121 lprcat("\nDo you (p) pry off jewels, (s) sit down"); iopts(); 122 while (1) 123 { 124 while (1) switch(getchar()) 125 { 126 case 'p': lprcat(" pry off"); k=rnd(101); 127 if (k<25) 128 { 129 for (i=0; i<rnd(4); i++) creategem(); /* gems pop off the throne */ 130 item[playerx][playery]=ODEADTHRONE; 131 know[playerx][playery]=0; 132 } 133 else if (k<40 && arg==0) 134 { 135 createmonster(GNOMEKING); 136 item[playerx][playery]=OTHRONE2; 137 know[playerx][playery]=0; 138 } 139 else lprcat("\nnothing happens"); 140 return; 141 142 case 's': lprcat(" sit down"); k=rnd(101); 143 if (k<30 && arg==0) 144 { 145 createmonster(GNOMEKING); 146 item[playerx][playery]=OTHRONE2; 147 know[playerx][playery]=0; 148 } 149 else if (k<35) { lprcat("\nZaaaappp! You've been teleported!\n"); beep(); oteleport(0); } 150 else lprcat("\nnothing happens"); 151 return; 152 153 case 'i': 154 case '\33': ignore(); return; 155 }; 156 } 157 } 158 159 odeadthrone() 160 { 161 register int k; 162 163 lprcat("\nDo you (s) sit down"); iopts(); 164 while (1) 165 { 166 while (1) switch(getchar()) 167 { 168 case 's': lprcat(" sit down"); k=rnd(101); 169 if (k<35) { lprcat("\nZaaaappp! You've been teleported!\n"); beep(); oteleport(0); } 170 else lprcat("\nnothing happens"); 171 return; 172 173 case 'i': 174 case '\33': ignore(); return; 175 }; 176 } 177 } 178 179 /* 180 ****** 181 OCHEST 182 ****** 183 184 subroutine to process a throne object 185 */ 186 ochest() 187 { 188 register int i,k; 189 lprcat("\nDo you (t) take it, (o) try to open it"); iopts(); 190 while (1) 191 { 192 while (1) switch(getchar()) 193 { 194 case 'o': lprcat(" open it"); k=rnd(101); 195 if (k<40) 196 { 197 lprcat("\nThe chest explodes as you open it"); beep(); 198 i = rnd(10); lastnum=281; /* in case he dies */ 199 lprintf("\nYou suffer %d hit points damage!",(long)i); 200 checkloss(i); 201 switch(rnd(10)) /* see if he gets a curse */ 202 { 203 case 1: c[ITCHING]+= rnd(1000)+100; 204 lprcat("\nYou feel an irritation spread over your skin!"); 205 beep(); 206 break; 207 208 case 2: c[CLUMSINESS]+= rnd(1600)+200; 209 lprcat("\nYou begin to lose hand to eye coordination!"); 210 beep(); 211 break; 212 213 case 3: c[HALFDAM]+= rnd(1600)+200; 214 beep(); 215 lprcat("\nA sickness engulfs you!"); break; 216 }; 217 item[playerx][playery]=know[playerx][playery]=0; 218 if (rnd(100)<69) creategem(); /* gems from the chest */ 219 dropgold(rnd(110*iarg[playerx][playery]+200)); 220 for (i=0; i<rnd(4); i++) something(iarg[playerx][playery]+2); 221 } 222 else lprcat("\nnothing happens"); 223 return; 224 225 case 't': lprcat(" take"); 226 if (take(OCHEST,iarg[playerx][playery])==0) 227 item[playerx][playery]=know[playerx][playery]=0; 228 return; 229 230 case 'i': 231 case '\33': ignore(); return; 232 }; 233 } 234 } 235 236 /* 237 ********* 238 OFOUNTAIN 239 ********* 240 */ 241 242 ofountain() 243 { 244 register int x; 245 cursors(); 246 lprcat("\nDo you (d) drink, (w) wash yourself"); iopts(); 247 while (1) switch(getchar()) 248 { 249 case 'd': lprcat("drink"); 250 if (rnd(1501)<2) 251 { 252 lprcat("\nOops! You seem to have caught the dreadful sleep!"); 253 beep(); lflush(); sleep(3); died(280); return; 254 } 255 x = rnd(100); 256 if (x<7) 257 { 258 c[HALFDAM] += 200+rnd(200); 259 lprcat("\nYou feel a sickness coming on"); 260 } 261 else if (x<13) quaffpotion(23); /* see invisible */ 262 else if (x < 45) 263 lprcat("\nnothing seems to have happened"); 264 else if (rnd(3) != 2) 265 fntchange(1); /* change char levels upward */ 266 else 267 fntchange(-1); /* change char levels downward */ 268 if (rnd(12)<3) 269 { 270 lprcat("\nThe fountains bubbling slowly quiets"); 271 item[playerx][playery]=ODEADFOUNTAIN; /* dead fountain */ 272 know[playerx][playery]=0; 273 } 274 return; 275 276 case '\33': 277 case 'i': ignore(); return; 278 279 case 'w': lprcat("wash yourself"); 280 if (rnd(100) < 11) 281 { 282 x=rnd((level<<2)+2); 283 lprintf("\nOh no! The water was foul! You suffer %d hit points!",(long)x); 284 lastnum=273; losehp(x); bottomline(); cursors(); 285 } 286 else 287 if (rnd(100) < 29) 288 lprcat("\nYou got the dirt off!"); 289 else 290 if (rnd(100) < 31) 291 lprcat("\nThis water seems to be hard water! The dirt didn't come off!"); 292 else 293 if (rnd(100) < 34) 294 createmonster(WATERLORD); /* make water lord */ 295 else 296 lprcat("\nnothing seems to have happened"); 297 return; 298 } 299 } 300 301 /* 302 a subroutine to raise or lower character levels 303 if x > 0 they are raised if x < 0 they are lowered 304 */ 305 fntchange(how) 306 int how; 307 { 308 register long j; 309 lprc('\n'); 310 switch(rnd(9)) 311 { 312 case 1: lprcat("Your strength"); fch(how,&c[0]); break; 313 case 2: lprcat("Your intelligence"); fch(how,&c[1]); break; 314 case 3: lprcat("Your wisdom"); fch(how,&c[2]); break; 315 case 4: lprcat("Your constitution"); fch(how,&c[3]); break; 316 case 5: lprcat("Your dexterity"); fch(how,&c[4]); break; 317 case 6: lprcat("Your charm"); fch(how,&c[5]); break; 318 case 7: j=rnd(level+1); 319 if (how < 0) 320 { lprintf("You lose %d hit point",(long)j); if (j>1) lprcat("s!"); else lprc('!'); losemhp((int)j); } 321 else 322 { lprintf("You gain %d hit point",(long)j); if (j>1) lprcat("s!"); else lprc('!'); raisemhp((int)j); } 323 bottomline(); break; 324 325 case 8: j=rnd(level+1); 326 if (how > 0) 327 { 328 lprintf("You just gained %d spell",(long)j); raisemspells((int)j); 329 if (j>1) lprcat("s!"); else lprc('!'); 330 } 331 else 332 { 333 lprintf("You just lost %d spell",(long)j); losemspells((int)j); 334 if (j>1) lprcat("s!"); else lprc('!'); 335 } 336 bottomline(); break; 337 338 case 9: j = 5*rnd((level+1)*(level+1)); 339 if (how < 0) 340 { 341 lprintf("You just lost %d experience point",(long)j); 342 if (j>1) lprcat("s!"); else lprc('!'); loseexperience((long)j); 343 } 344 else 345 { 346 lprintf("You just gained %d experience point",(long)j); 347 if (j>1) lprcat("s!"); else lprc('!'); raiseexperience((long)j); 348 } 349 break; 350 } 351 cursors(); 352 } 353 354 /* 355 *** 356 FCH 357 *** 358 359 subroutine to process an up/down of a character attribute for ofountain 360 */ 361 static fch(how,x) 362 int how; 363 long *x; 364 { 365 if (how < 0) { lprcat(" went down by one!"); --(*x); } 366 else { lprcat(" went up by one!"); (*x)++; } 367 bottomline(); 368 } 369