Mercurial > hg > early-roguelike
diff rogue4/rings.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 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/rogue4/rings.c Sat Oct 24 16:52:52 2009 +0000 @@ -0,0 +1,208 @@ +/* + * Routines dealing specifically with rings + * + * @(#)rings.c 4.13 (Berkeley) 1/28/82 + * + * Rogue: Exploring the Dungeons of Doom + * Copyright (C) 1980, 1981, 1982 Michael Toy, Ken Arnold and Glenn Wichman + * All rights reserved. + * + * See the file LICENSE.TXT for full copyright and licensing information. + */ + +#include <curses.h> +#include <string.h> +#include "rogue.h" + +/* + * ring_on: + * Put a ring on a hand + */ +ring_on() +{ + register THING *obj; + register int ring; + + obj = get_item("put on", RING); + /* + * Make certain that it is somethings that we want to wear + */ + if (obj == NULL) + return; + if (obj->o_type != RING) + { + if (!terse) + msg("it would be difficult to wrap that around a finger"); + else + msg("not a ring"); + return; + } + + /* + * find out which hand to put it on + */ + if (is_current(obj)) + return; + + if (cur_ring[LEFT] == NULL && cur_ring[RIGHT] == NULL) + { + if ((ring = gethand()) < 0) + return; + } + else if (cur_ring[LEFT] == NULL) + ring = LEFT; + else if (cur_ring[RIGHT] == NULL) + ring = RIGHT; + else + { + if (!terse) + msg("you already have a ring on each hand"); + else + msg("wearing two"); + return; + } + cur_ring[ring] = obj; + + /* + * Calculate the effect it has on the poor guy. + */ + switch (obj->o_which) + { + case R_ADDSTR: + chg_str(obj->o_ac); + break; + case R_SEEINVIS: + invis_on(); + break; + case R_AGGR: + aggravate(); + break; + } + + if (!terse) + addmsg("you are now wearing "); + msg("%s (%c)", inv_name(obj, TRUE), pack_char(obj)); +} + +/* + * ring_off: + * Take off a ring + */ +ring_off() +{ + register int ring; + register THING *obj; + register char packchar; + + if (cur_ring[LEFT] == NULL && cur_ring[RIGHT] == NULL) + { + if (terse) + msg("no rings"); + else + msg("you aren't wearing any rings"); + return; + } + else if (cur_ring[LEFT] == NULL) + ring = RIGHT; + else if (cur_ring[RIGHT] == NULL) + ring = LEFT; + else + if ((ring = gethand()) < 0) + return; + mpos = 0; + obj = cur_ring[ring]; + if (obj == NULL) + { + msg("not wearing such a ring"); + return; + } + packchar = pack_char(obj); + if (dropcheck(obj)) + msg("was wearing %s(%c)", inv_name(obj, TRUE), packchar); +} + +/* + * gethand: + * Which hand is the hero interested in? + */ +gethand() +{ + register int c; + + for (;;) + { + if (terse) + msg("left or right ring? "); + else + msg("left hand or right hand? "); + if ((c = readchar()) == ESCAPE) + return -1; + mpos = 0; + if (c == 'l' || c == 'L') + return LEFT; + else if (c == 'r' || c == 'R') + return RIGHT; + if (terse) + msg("L or R"); + else + msg("please type L or R"); + } +} + +/* + * ring_eat: + * How much food does this ring use up? + */ +ring_eat(hand) +register int hand; +{ + if (cur_ring[hand] == NULL) + return 0; + switch (cur_ring[hand]->o_which) + { + case R_REGEN: + return 2; + case R_SUSTSTR: + case R_SUSTARM: + case R_PROTECT: + case R_ADDSTR: + case R_STEALTH: + return 1; + case R_SEARCH: + case R_ADDHIT: + case R_ADDDAM: + return (rnd(3) == 0); + case R_DIGEST: + return -rnd(2); + case R_SEEINVIS: + return (rnd(5) == 0); + default: + return 0; + } +} + +/* + * ring_num: + * Print ring bonuses + */ +char * +ring_num(obj) +register THING *obj; +{ + static char buf[5]; + + if (!(obj->o_flags & ISKNOW)) + return ""; + switch (obj->o_which) + { + case R_PROTECT: + case R_ADDSTR: + case R_ADDDAM: + case R_ADDHIT: + buf[0] = ' '; + strcpy(&buf[1], num(obj->o_ac, 0, RING)); + otherwise: + return ""; + } + return buf; +}