Mercurial > hg > early-roguelike
comparison rogue4/misc.c @ 12:9535a08ddc39
Import Rogue 5.2 from the Roguelike Restoration Project (r1490)
| author | edwarj4 |
|---|---|
| date | Sat, 24 Oct 2009 16:52:52 +0000 |
| parents | |
| children | 1b73a8641b37 |
comparison
equal
deleted
inserted
replaced
| 11:949d558c2162 | 12:9535a08ddc39 |
|---|---|
| 1 /* | |
| 2 * All sorts of miscellaneous routines | |
| 3 * | |
| 4 * @(#)misc.c 4.30 (Berkeley) 4/6/82 | |
| 5 * | |
| 6 * Rogue: Exploring the Dungeons of Doom | |
| 7 * Copyright (C) 1980, 1981, 1982 Michael Toy, Ken Arnold and Glenn Wichman | |
| 8 * All rights reserved. | |
| 9 * | |
| 10 * See the file LICENSE.TXT for full copyright and licensing information. | |
| 11 */ | |
| 12 | |
| 13 #include <stdlib.h> | |
| 14 #include <curses.h> | |
| 15 #include <ctype.h> | |
| 16 #include <string.h> | |
| 17 #include "rogue.h" | |
| 18 | |
| 19 /* | |
| 20 * tr_name: | |
| 21 * Print the name of a trap | |
| 22 */ | |
| 23 char * | |
| 24 tr_name(type) | |
| 25 char type; | |
| 26 { | |
| 27 switch (type) | |
| 28 { | |
| 29 case T_DOOR: | |
| 30 return terse ? "a trapdoor" : "you found a trapdoor"; | |
| 31 case T_BEAR: | |
| 32 return terse ? "a beartrap" : "you found a beartrap"; | |
| 33 case T_SLEEP: | |
| 34 return terse ? "a sleeping gas trap":"you found a sleeping gas trap"; | |
| 35 case T_ARROW: | |
| 36 return terse ? "an arrow trap" : "you found an arrow trap"; | |
| 37 case T_TELEP: | |
| 38 return terse ? "a teleport trap" : "you found a teleport trap"; | |
| 39 case T_DART: | |
| 40 return terse ? "a dart trap" : "you found a poison dart trap"; | |
| 41 } | |
| 42 msg("wierd trap: %d", type); | |
| 43 return NULL; | |
| 44 } | |
| 45 | |
| 46 /* | |
| 47 * look: | |
| 48 * A quick glance all around the player | |
| 49 */ | |
| 50 look(wakeup) | |
| 51 bool wakeup; | |
| 52 { | |
| 53 register int x, y; | |
| 54 register unsigned char ch; | |
| 55 register int index; | |
| 56 register THING *tp; | |
| 57 register struct room *rp; | |
| 58 register int ey, ex; | |
| 59 register int passcount = 0; | |
| 60 register char pfl, *fp, pch; | |
| 61 register int sy, sx, sumhero = 0, diffhero = 0; | |
| 62 register int oldx, oldy; | |
| 63 | |
| 64 getyx(stdscr, oldy, oldx); | |
| 65 rp = proom; | |
| 66 if (!ce(oldpos, hero)) | |
| 67 { | |
| 68 if ((oldrp->r_flags & (ISGONE|ISDARK)) == ISDARK && !on(player,ISBLIND)) | |
| 69 { | |
| 70 ey = oldpos.y + 1; | |
| 71 ex = oldpos.x + 1; | |
| 72 sy = oldpos.y - 1; | |
| 73 for (x = oldpos.x - 1; x <= ex; x++) | |
| 74 for (y = sy; y <= ey; y++) | |
| 75 { | |
| 76 if (y == hero.y && x == hero.x) | |
| 77 continue; | |
| 78 move(y, x); | |
| 79 if (inch() == FLOOR) | |
| 80 addch(' '); | |
| 81 } | |
| 82 } | |
| 83 oldpos = hero; | |
| 84 oldrp = rp; | |
| 85 } | |
| 86 ey = hero.y + 1; | |
| 87 ex = hero.x + 1; | |
| 88 sx = hero.x - 1; | |
| 89 sy = hero.y - 1; | |
| 90 if (door_stop && !firstmove && running) | |
| 91 { | |
| 92 sumhero = hero.y + hero.x; | |
| 93 diffhero = hero.y - hero.x; | |
| 94 } | |
| 95 index = INDEX(hero.y, hero.x); | |
| 96 pfl = _flags[index]; | |
| 97 pch = _level[index]; | |
| 98 for (y = sy; y <= ey; y++) | |
| 99 if (y > 0 && y < LINES - 1) for (x = sx; x <= ex; x++) | |
| 100 { | |
| 101 if (x <= 0 || x >= COLS) | |
| 102 continue; | |
| 103 if (!on(player, ISBLIND)) | |
| 104 { | |
| 105 if (y == hero.y && x == hero.x) | |
| 106 continue; | |
| 107 } | |
| 108 else if (y != hero.y || x != hero.x) | |
| 109 continue; | |
| 110 | |
| 111 index = INDEX(y, x); | |
| 112 /* | |
| 113 * THIS REPLICATES THE moat() MACRO. IF MOAT IS CHANGED, | |
| 114 * THIS MUST BE CHANGED ALSO | |
| 115 */ | |
| 116 fp = &_flags[index]; | |
| 117 ch = _level[index]; | |
| 118 if (pch != DOOR && ch != DOOR) | |
| 119 if ((pfl & F_PASS) != (*fp & F_PASS)) | |
| 120 continue; | |
| 121 else if ((*fp & F_PASS) && (*fp & F_PNUM) != (pfl & F_PNUM)) | |
| 122 continue; | |
| 123 | |
| 124 if ((tp = _monst[index]) != NULL) | |
| 125 if (on(player, SEEMONST) && on(*tp, ISINVIS)) | |
| 126 { | |
| 127 if (door_stop && !firstmove) | |
| 128 running = FALSE; | |
| 129 continue; | |
| 130 } | |
| 131 else | |
| 132 { | |
| 133 if (wakeup) | |
| 134 wake_monster(y, x); | |
| 135 if (tp->t_oldch != ' ' || | |
| 136 (!(rp->r_flags & ISDARK) && !on(player, ISBLIND))) | |
| 137 tp->t_oldch = _level[index]; | |
| 138 if (see_monst(tp)) | |
| 139 ch = tp->t_disguise; | |
| 140 } | |
| 141 | |
| 142 move(y, x); | |
| 143 if (ch != inch()) | |
| 144 addch(ch); | |
| 145 | |
| 146 if (door_stop && !firstmove && running) | |
| 147 { | |
| 148 switch (runch) | |
| 149 { | |
| 150 case 'h': | |
| 151 if (x == ex) | |
| 152 continue; | |
| 153 when 'j': | |
| 154 if (y == sy) | |
| 155 continue; | |
| 156 when 'k': | |
| 157 if (y == ey) | |
| 158 continue; | |
| 159 when 'l': | |
| 160 if (x == sx) | |
| 161 continue; | |
| 162 when 'y': | |
| 163 if ((y + x) - sumhero >= 1) | |
| 164 continue; | |
| 165 when 'u': | |
| 166 if ((y - x) - diffhero >= 1) | |
| 167 continue; | |
| 168 when 'n': | |
| 169 if ((y + x) - sumhero <= -1) | |
| 170 continue; | |
| 171 when 'b': | |
| 172 if ((y - x) - diffhero <= -1) | |
| 173 continue; | |
| 174 } | |
| 175 switch (ch) | |
| 176 { | |
| 177 case DOOR: | |
| 178 if (x == hero.x || y == hero.y) | |
| 179 running = FALSE; | |
| 180 break; | |
| 181 case PASSAGE: | |
| 182 if (x == hero.x || y == hero.y) | |
| 183 passcount++; | |
| 184 break; | |
| 185 case FLOOR: | |
| 186 case '|': | |
| 187 case '-': | |
| 188 case ' ': | |
| 189 break; | |
| 190 default: | |
| 191 running = FALSE; | |
| 192 break; | |
| 193 } | |
| 194 } | |
| 195 } | |
| 196 if (door_stop && !firstmove && passcount > 1) | |
| 197 running = FALSE; | |
| 198 move(hero.y, hero.x); | |
| 199 addch(PLAYER); | |
| 200 } | |
| 201 | |
| 202 /* | |
| 203 * find_obj: | |
| 204 * Find the unclaimed object at y, x | |
| 205 */ | |
| 206 THING * | |
| 207 find_obj(y, x) | |
| 208 register int y, x; | |
| 209 { | |
| 210 register THING *op; | |
| 211 | |
| 212 for (op = lvl_obj; op != NULL; op = next(op)) | |
| 213 { | |
| 214 if (op->o_pos.y == y && op->o_pos.x == x) | |
| 215 return op; | |
| 216 } | |
| 217 #ifdef WIZARD | |
| 218 sprintf(prbuf, "Non-object %d,%d", y, x); | |
| 219 debug(prbuf); | |
| 220 #endif | |
| 221 return NULL; | |
| 222 } | |
| 223 | |
| 224 /* | |
| 225 * eat: | |
| 226 * She wants to eat something, so let her try | |
| 227 */ | |
| 228 eat() | |
| 229 { | |
| 230 register THING *obj; | |
| 231 | |
| 232 if ((obj = get_item("eat", FOOD)) == NULL) | |
| 233 return; | |
| 234 if (obj->o_type != FOOD) | |
| 235 { | |
| 236 if (!terse) | |
| 237 msg("ugh, you would get ill if you ate that"); | |
| 238 else | |
| 239 msg("that's Inedible!"); | |
| 240 return; | |
| 241 } | |
| 242 inpack--; | |
| 243 | |
| 244 if (food_left < 0) | |
| 245 food_left = 0; | |
| 246 if ((food_left += HUNGERTIME - 200 + rnd(400)) > STOMACHSIZE) | |
| 247 food_left = STOMACHSIZE; | |
| 248 hungry_state = 0; | |
| 249 if (obj == cur_weapon) | |
| 250 cur_weapon = NULL; | |
| 251 if (obj->o_which == 1) | |
| 252 msg("my, that was a yummy %s", fruit); | |
| 253 else | |
| 254 if (rnd(100) > 70) | |
| 255 { | |
| 256 pstats.s_exp++; | |
| 257 msg("yuk, this food tastes awful"); | |
| 258 check_level(); | |
| 259 } | |
| 260 else | |
| 261 msg("yum, that tasted good"); | |
| 262 | |
| 263 if (--obj->o_count < 1) | |
| 264 { | |
| 265 detach(pack, obj); | |
| 266 discard(obj); | |
| 267 } | |
| 268 } | |
| 269 | |
| 270 /* | |
| 271 * chg_str: | |
| 272 * Used to modify the playes strength. It keeps track of the | |
| 273 * highest it has been, just in case | |
| 274 */ | |
| 275 chg_str(amt) | |
| 276 register int amt; | |
| 277 { | |
| 278 str_t comp; | |
| 279 | |
| 280 if (amt == 0) | |
| 281 return; | |
| 282 add_str(&pstats.s_str, amt); | |
| 283 comp = pstats.s_str; | |
| 284 if (ISRING(LEFT, R_ADDSTR)) | |
| 285 add_str(&comp, -cur_ring[LEFT]->o_ac); | |
| 286 if (ISRING(RIGHT, R_ADDSTR)) | |
| 287 add_str(&comp, -cur_ring[RIGHT]->o_ac); | |
| 288 if (comp > max_stats.s_str) | |
| 289 max_stats.s_str = comp; | |
| 290 } | |
| 291 | |
| 292 /* | |
| 293 * add_str: | |
| 294 * Perform the actual add, checking upper and lower bound limits | |
| 295 */ | |
| 296 add_str(sp, amt) | |
| 297 register str_t *sp; | |
| 298 int amt; | |
| 299 { | |
| 300 if ((*sp += amt) < 3) | |
| 301 *sp = 3; | |
| 302 else if (*sp > 31) | |
| 303 *sp = 31; | |
| 304 } | |
| 305 | |
| 306 /* | |
| 307 * add_haste: | |
| 308 * Add a haste to the player | |
| 309 */ | |
| 310 add_haste(potion) | |
| 311 bool potion; | |
| 312 { | |
| 313 if (on(player, ISHASTE)) | |
| 314 { | |
| 315 no_command += rnd(8); | |
| 316 player.t_flags &= ~ISRUN; | |
| 317 extinguish(nohaste); | |
| 318 player.t_flags &= ~ISHASTE; | |
| 319 msg("you faint from exhaustion"); | |
| 320 return FALSE; | |
| 321 } | |
| 322 else | |
| 323 { | |
| 324 player.t_flags |= ISHASTE; | |
| 325 if (potion) | |
| 326 fuse(nohaste, 0, rnd(4)+4, AFTER); | |
| 327 return TRUE; | |
| 328 } | |
| 329 } | |
| 330 | |
| 331 /* | |
| 332 * aggravate: | |
| 333 * Aggravate all the monsters on this level | |
| 334 */ | |
| 335 aggravate() | |
| 336 { | |
| 337 register THING *mi; | |
| 338 | |
| 339 for (mi = mlist; mi != NULL; mi = next(mi)) | |
| 340 runto(&mi->t_pos, &hero); | |
| 341 } | |
| 342 | |
| 343 /* | |
| 344 * vowelstr: | |
| 345 * For printfs: if string starts with a vowel, return "n" for an | |
| 346 * "an". | |
| 347 */ | |
| 348 char * | |
| 349 vowelstr(str) | |
| 350 register char *str; | |
| 351 { | |
| 352 switch (*str) | |
| 353 { | |
| 354 case 'a': case 'A': | |
| 355 case 'e': case 'E': | |
| 356 case 'i': case 'I': | |
| 357 case 'o': case 'O': | |
| 358 case 'u': case 'U': | |
| 359 return "n"; | |
| 360 default: | |
| 361 return ""; | |
| 362 } | |
| 363 } | |
| 364 | |
| 365 /* | |
| 366 * is_current: | |
| 367 * See if the object is one of the currently used items | |
| 368 */ | |
| 369 is_current(obj) | |
| 370 register THING *obj; | |
| 371 { | |
| 372 if (obj == NULL) | |
| 373 return FALSE; | |
| 374 if (obj == cur_armor || obj == cur_weapon || obj == cur_ring[LEFT] | |
| 375 || obj == cur_ring[RIGHT]) | |
| 376 { | |
| 377 if (!terse) | |
| 378 addmsg("That's already "); | |
| 379 msg("in use"); | |
| 380 return TRUE; | |
| 381 } | |
| 382 return FALSE; | |
| 383 } | |
| 384 | |
| 385 /* | |
| 386 * get_dir: | |
| 387 * Set up the direction co_ordinate for use in varios "prefix" | |
| 388 * commands | |
