Mercurial > hg > early-roguelike
diff srogue/misc.c @ 36:2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
author | elwin |
---|---|
date | Thu, 25 Nov 2010 12:21:41 +0000 |
parents | |
children | 94a0d9dd5ce1 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/srogue/misc.c Thu Nov 25 12:21:41 2010 +0000 @@ -0,0 +1,401 @@ +/* + * all sorts of miscellaneous routines + * + * @(#)misc.c 9.0 (rdk) 7/17/84 + * + * Super-Rogue + * Copyright (C) 1984 Robert D. Kindelberger + * All rights reserved. + * + * Based on "Rogue: Exploring the Dungeons of Doom" + * Copyright (C) 1980, 1981 Michael Toy, Ken Arnold and Glenn Wichman + * All rights reserved. + * + * See the file LICENSE.TXT for full copyright and licensing information. + */ + +#include "rogue.h" +#include <ctype.h> +#include "rogue.ext" + +/* + * waste_time: + * Do nothing but let other things happen + */ +waste_time() +{ + if (inwhgt) /* if from wghtchk, then done */ + return; + do_daemons(BEFORE); + do_daemons(AFTER); + do_fuses(); +} + +/* + * getindex: + * Convert a type into an index for the things structures + */ +getindex(what) +char what; +{ + int index = -1; + + switch (what) { + case POTION: index = TYP_POTION; + when SCROLL: index = TYP_SCROLL; + when FOOD: index = TYP_FOOD; + when RING: index = TYP_RING; + when AMULET: index = TYP_AMULET; + when ARMOR: index = TYP_ARMOR; + when WEAPON: index = TYP_WEAPON; + when STICK: index = TYP_STICK; + } + return index; +} + +/* + * tr_name: + * print the name of a trap + */ +char * +tr_name(ch) +char ch; +{ + reg char *s; + + switch (ch) { + case TRAPDOOR: + s = "A trapdoor."; + when BEARTRAP: + s = "A beartrap."; + when SLEEPTRAP: + s = "A sleeping gas trap."; + when ARROWTRAP: + s = "An arrow trap."; + when TELTRAP: + s = "A teleport trap."; + when DARTTRAP: + s = "A dart trap."; + when POOL: + s = "A magic pool."; + when POST: + s = "A trading post."; + when MAZETRAP: + s = "A maze trap."; + otherwise: + s = "A bottomless pit."; /* shouldn't get here */ + } + return s; +} + +/* + * Look: + * A quick glance all around the player + */ +look(wakeup) +bool wakeup; +{ + reg char ch; + reg int oldx, oldy, y, x; + reg struct room *rp; + int ey, ex, oex, oey; + int passcount = 0; + bool inpass, blind; + + getyx(cw, oldy, oldx); + oex = player.t_oldpos.x; + oey = player.t_oldpos.y; + blind = pl_on(ISBLIND); + if ((oldrp != NULL && rf_on(oldrp,ISDARK)) || blind) { + for (x = oex - 1; x <= oex + 1; x += 1) + for (y = oey - 1; y <= oey + 1; y += 1) + if ((y != hero.y || x != hero.x) && show(y, x) == FLOOR) + mvwaddch(cw, y, x, ' '); + } + rp = player.t_room; + inpass = (rp == NULL); /* TRUE when not in a room */ + ey = hero.y + 1; + ex = hero.x + 1; + for (x = hero.x - 1; x <= ex; x += 1) { + if (x >= 0 && x <= COLS - 1) { + for (y = hero.y - 1; y <= ey; y += 1) { + if (y <= 0 || y >= LINES - 2) + continue; + if (isalpha(mvwinch(mw, y, x))) { + reg struct linked_list *it; + reg struct thing *tp; + + if (wakeup || (!inpass && rf_on(rp, ISTREAS))) + it = wake_monster(y, x); + else + it = find_mons(y, x); + if (it == NULL) /* lost monster */ + mvaddch(y, x, FLOOR); + else { + tp = THINGPTR(it); + if (isatrap(tp->t_oldch = mvinch(y, x))) { + struct trap *trp; + + if ((trp = trap_at(y,x)) == NULL) + break; + if (trp->tr_flags & ISFOUND) + tp->t_oldch = trp->tr_type; + else + tp->t_oldch = FLOOR; + } + if (tp->t_oldch == FLOOR && rf_on(rp,ISDARK)) + if (!blind) + tp->t_oldch = ' '; + } + } + /* + * Secret doors show as walls + */ + if ((ch = show(y, x)) == SECRETDOOR) { + if (inpass || y == rp->r_pos.y || y == rp->r_pos.y + rp->r_max.y - 1) + ch = '-'; + else + ch = '|'; + } + /* + * Don't show room walls if he is in a passage + */ + if (!blind) { + if ((y == hero.y && x == hero.x) || (inpass && (ch == '-' || ch == '|'))) + continue; + } + else + ch = ' '; + wmove(cw, y, x); + waddch(cw, ch); + if (door_stop && !firstmove && running) { + switch (runch) { + case 'h': + if (x == ex) + continue; + when 'j': + if (y == hero.y - 1) + continue; + when 'k': + if (y == ey) + continue; + when 'l': + if (x == hero.x - 1) + continue; + when 'y': + if ((x + y) - (hero.x + hero.y) >= 1) + continue; + when 'u': + if ((y - x) - (hero.y - hero.x) >= 1) + continue; + when 'n': + if ((x + y) - (hero.x + hero.y) <= -1) + continue; + when 'b': + if ((y - x) - (hero.y - hero.x) <= -1) + continue; + } + switch (ch) { + case DOOR: + if (x == hero.x || y == hero.y) + running = FALSE; + break; + case PASSAGE: + if (x == hero.x || y == hero.y) + passcount += 1; + break; + case FLOOR: + case '|': + case '-': + case ' ': + break; + default: + running = FALSE; + break; + } + } + } + } + } + if (door_stop && !firstmove && passcount > 1) + running = FALSE; + mvwaddch(cw, hero.y, hero.x, PLAYER); + wmove(cw, oldy, oldx); + player.t_oldpos = hero; + oldrp = rp; +} + +/* + * find_obj: + * find the unclaimed object at y, x + */ +struct linked_list * +find_obj(y, x) +int y, x; +{ + reg struct linked_list *obj; + reg struct object *op; + + for (obj = lvl_obj; obj != NULL; obj = next(obj)) { + op = OBJPTR(obj); + if (op->o_pos.y == y && op->o_pos.x == x) + return obj; + } + return NULL; +} + +/* + * eat: + * Let the hero eat some food. + */ +eat() +{ + reg struct linked_list *item; + reg struct object *obj; + reg int goodfood, cursed; + + if ((item = get_item("eat", FOOD)) == NULL) + return; + obj = OBJPTR(item); + if (obj->o_type != FOOD) { + msg("That's Inedible!"); + after = FALSE; + return; + } + cursed = 1; + if (o_on(obj, ISCURSED)) + cursed += 1; + else if (o_on(obj, ISBLESS)) + cursed -= 1; + if (obj->o_which == FRUITFOOD) { + msg("My, that was a yummy %s.", fruit); + goodfood = 100; + } + else { + if (rnd(100) > 80 || o_on(obj, ISCURSED)) { + msg("Yuk, this food tastes like ARA."); + goodfood = 300; + him->s_exp += 1; + check_level(); + } + else { + msg("Yum, that tasted good."); + goodfood = 200; + } + } + goodfood *= cursed; + if ((food_left += HUNGERTIME + rnd(400) - goodfood) > STOMACHSIZE) + food_left = STOMACHSIZE; + hungry_state = F_OKAY; + updpack(); /* update pack */ + if (obj == cur_weapon) + cur_weapon = NULL; + del_pack(item); /* get rid of the food */ +} + +/* + * aggravate: + * aggravate all the monsters on this level + */ +aggravate() +{ + reg struct linked_list *mi; + + for (mi = mlist; mi != NULL; mi = next(mi)) + runto(&(THINGPTR(mi))->t_pos, &hero); +} + +/* + * vowelstr: + * If string starts with a vowel, return "n" for an "an" + */ +char * +vowelstr(str) +char *str; +{ + switch (tolower(*str)) { + case 'a': + case 'e': + case 'i': + case 'o': + case 'u': + return "n"; + default: + return ""; + } +} + +/* + * is_current: + * See if the object is one of the currently used items + */ +is_current(obj) +struct object *obj; +{ + if (obj == NULL) + return FALSE; + if (obj == cur_armor || obj == cur_weapon || obj == cur_ring[LEFT] + || obj == cur_ring[RIGHT]) { + msg("Already in use."); + return TRUE; + } + return FALSE; +} + +/* + * get_dir: + * Set up the direction coordinates + */ +get_dir() +{ + reg char *prompt; + reg bool gotit; + + prompt = "Direction: "; + do { + gotit = TRUE; + switch (readchar()) { + case 'h': case'H': delta.y = 0; delta.x = -1; + when 'j': case'J': delta.y = 1; delta.x = 0; + when 'k': case'K': delta.y = -1; delta.x = 0; + when 'l': case'L': delta.y = 0; delta.x = 1; + when 'y': case'Y': delta.y = -1; delta.x = -1; + when 'u': case'U': delta.y = -1; delta.x = 1; + when 'b': case'B': delta.y = 1; delta.x = -1; + when 'n': case'N': delta.y = 1; delta.x = 1; + when ESCAPE: return FALSE; + otherwise: + mpos = 0; + msg(prompt); + gotit = FALSE; + } + } until (gotit); + if (pl_on(ISHUH) && rnd(100) > 80) { + do { + delta.y = rnd(3) - 1; + delta.x = rnd(3) - 1; + } while (delta.y == 0 && delta.x == 0); + } + mpos = 0; + return TRUE; +} + +/* + * initfood: + * Set up stuff for a food-type object + */ +initfood(what) +struct object *what; +{ + what->o_type = FOOD; + what->o_group = NORMFOOD; + if (rnd(100) < 15) + what->o_group = FRUITFOOD; + what->o_which = what->o_group; + what->o_count = 1 + extras(); + what->o_flags = ISKNOW; + what->o_weight = things[TYP_FOOD].mi_wght; + what->o_typname = things[TYP_FOOD].mi_name; + what->o_hplus = what->o_dplus = 0; + what->o_vol = itemvol(what); +}