1/* $NetBSD: moreobj.c,v 1.13 2021/05/02 12:50:45 rillig Exp $ */ 2 3/* 4 * moreobj.c Larn is copyrighted 1986 by Noah Morgan. 5 * 6 * Routines in this file: 7 * 8 * oaltar() othrone() ochest() ofountain() 9 */ 10#include <sys/cdefs.h> 11#ifndef lint 12__RCSID("$NetBSD: moreobj.c,v 1.13 2021/05/02 12:50:45 rillig Exp $"); 13#endif /* not lint */ 14#include <stdlib.h> 15#include <unistd.h> 16#include "header.h" 17#include "extern.h" 18 19static void fch(int, long *); 20 21/* 22 * subroutine to process an altar object 23 */ 24void 25oaltar(void) 26{ 27 28 lprcat("\nDo you (p) pray (d) desecrate"); 29 iopts(); 30 while (1) { 31 while (1) 32 switch (ttgetch()) { 33 case 'p': 34 lprcat(" pray\nDo you (m) give money or (j) just pray? "); 35 while (1) 36 switch (ttgetch()) { 37 case 'j': 38 act_just_pray(); 39 return; 40 41 case 'm': 42 act_donation_pray(); 43 return; 44 45 case '\33': 46 return; 47 }; 48 49 case 'd': 50 lprcat(" desecrate"); 51 act_desecrate_altar(); 52 return; 53 54 case 'i': 55 case '\33': 56 ignore(); 57 act_ignore_altar(); 58 return; 59 }; 60 } 61} 62 63/* 64 subroutine to process a throne object 65 */ 66void 67othrone(int arg) 68{ 69 70 lprcat("\nDo you (p) pry off jewels, (s) sit down"); 71 iopts(); 72 while (1) { 73 while (1) 74 switch (ttgetch()) { 75 case 'p': 76 lprcat(" pry off"); 77 act_remove_gems(arg); 78 return; 79 80 case 's': 81 lprcat(" sit down"); 82 act_sit_throne(arg); 83 return; 84 85 case 'i': 86 case '\33': 87 ignore(); 88 return; 89 }; 90 } 91} 92 93void 94odeadthrone(void) 95{ 96 int k; 97 98 lprcat("\nDo you (s) sit down"); 99 iopts(); 100 while (1) { 101 while (1) 102 switch (ttgetch()) { 103 case 's': 104 lprcat(" sit down"); 105 k = rnd(101); 106 if (k < 35) { 107 lprcat("\nZaaaappp! You've been teleported!\n"); 108 beep(); 109 oteleport(0); 110 } else 111 lprcat("\nnothing happens"); 112 return; 113 114 case 'i': 115 case '\33': 116 ignore(); 117 return; 118 }; 119 } 120} 121 122/* 123 subroutine to process a throne object 124 */ 125void 126ochest(void) 127{ 128 129 lprcat("\nDo you (t) take it, (o) try to open it"); 130 iopts(); 131 while (1) { 132 while (1) 133 switch (ttgetch()) { 134 case 'o': 135 lprcat(" open it"); 136 act_open_chest(playerx, playery); 137 return; 138 139 case 't': 140 lprcat(" take"); 141 if (take(OCHEST, iarg[playerx][playery]) == 0) 142 item[playerx][playery] = know[playerx][playery] = 0; 143 return; 144 145 case 'i': 146 case '\33': 147 ignore(); 148 return; 149 }; 150 } 151} 152 153/* 154 process a fountain object 155 */ 156void 157ofountain(void) 158{ 159 160 cursors(); 161 lprcat("\nDo you (d) drink, (w) wash yourself"); 162 iopts(); 163 while (1) 164 switch (ttgetch()) { 165 case 'd': 166 lprcat("drink"); 167 act_drink_fountain(); 168 return; 169 170 case '\33': 171 case 'i': 172 ignore(); 173 return; 174 175 case 'w': 176 lprcat("wash yourself"); 177 act_wash_fountain(); 178 return; 179 } 180} 181 182/* 183 *** 184 FCH 185 *** 186 187 subroutine to process an up/down of a character attribute for ofountain 188 */ 189static void 190fch(int how, long *x) 191{ 192 if (how < 0) { 193 lprcat(" went down by one!"); 194 --(*x); 195 } else { 196 lprcat(" went up by one!"); 197 (*x)++; 198 } 199 bottomline(); 200} 201 202/* 203 a subroutine to raise or lower character levels 204 if x > 0 they are raised if x < 0 they are lowered 205 */ 206void 207fntchange(int how) 208{ 209 long j; 210 lprc('\n'); 211 switch (rnd(9)) { 212 case 1: 213 lprcat("Your strength"); 214 fch(how, &c[0]); 215 break; 216 case 2: 217 lprcat("Your intelligence"); 218 fch(how, &c[1]); 219 break; 220 case 3: 221 lprcat("Your wisdom"); 222 fch(how, &c[2]); 223 break; 224 case 4: 225 lprcat("Your constitution"); 226 fch(how, &c[3]); 227 break; 228 case 5: 229 lprcat("Your dexterity"); 230 fch(how, &c[4]); 231 break; 232 case 6: 233 lprcat("Your charm"); 234 fch(how, &c[5]); 235 break; 236 case 7: 237 j = rnd(level + 1); 238 if (how < 0) { 239 lprintf("You lose %ld hit point", (long) j); 240 if (j > 1) 241 lprcat("s!"); 242 else 243 lprc('!'); 244 losemhp((int) j); 245 } else { 246 lprintf("You gain %ld hit point", (long) j); 247 if (j > 1) 248 lprcat("s!"); 249 else 250 lprc('!'); 251 raisemhp((int) j); 252 } 253 bottomline(); 254 break; 255 256 case 8: 257 j = rnd(level + 1); 258 if (how > 0) { 259 lprintf("You just gained %ld spell", (long) j); 260 raisemspells((int) j); 261 if (j > 1) 262 lprcat("s!"); 263 else 264 lprc('!'); 265 } else { 266 lprintf("You just lost %ld spell", (long) j); 267 losemspells((int) j); 268 if (j > 1) 269 lprcat("s!"); 270 else 271 lprc('!'); 272 } 273 bottomline(); 274 break; 275 276 case 9: 277 j = 5 * rnd((level + 1) * (level + 1)); 278 if (how < 0) { 279 lprintf("You just lost %ld experience point", (long) j); 280 if (j > 1) 281 lprcat("s!"); 282 else 283 lprc('!'); 284 loseexperience((long) j); 285 } else { 286 lprintf("You just gained %ld experience point", (long) j); 287 if (j > 1) 288 lprcat("s!"); 289 else 290 lprc('!'); 291 raiseexperience((long) j); 292 } 293 break; 294 } 295 cursors(); 296} 297