Mercurial > hg > early-roguelike
diff rogue3/rings.c @ 0:527e2150eaf0
Import Rogue 3.6 from the Roguelike Restoration Project (r1490)
author | edwarj4 |
---|---|
date | Tue, 13 Oct 2009 13:33:34 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/rogue3/rings.c Tue Oct 13 13:33:34 2009 +0000 @@ -0,0 +1,213 @@ +/* + * routines dealing specifically with rings + * + * @(#)rings.c 3.17 (Berkeley) 6/15/81 + * + * 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 "curses.h" +#include <stdlib.h> +#include <string.h> +#include "rogue.h" + +void +ring_on() +{ + struct object *obj; + struct linked_list *item; + int ring; + str_t save_max; + char buf[80]; + + item = get_item("put on", RING); + /* + * Make certain that it is somethings that we want to wear + */ + if (item == NULL) + return; + obj = (struct object *) ldata(item); + 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: + save_max = max_stats.s_str; + chg_str(obj->o_ac); + max_stats.s_str = save_max; + break; + case R_SEEINVIS: + player.t_flags |= CANSEE; + light(&hero); + mvwaddch(cw, hero.y, hero.x, PLAYER); + break; + case R_AGGR: + aggravate(); + break; + } + status(); + + if (obj->o_which >= MAXRINGS) + return; + + if (r_know[obj->o_which] && r_guess[obj->o_which]) + { + free(r_guess[obj->o_which]); + r_guess[obj->o_which] = NULL; + } + else if (!r_know[obj->o_which] && askme && r_guess[obj->o_which] == NULL) + { + mpos = 0; + msg(terse ? "Call it: " : "What do you want to call it? "); + if (get_str(buf, cw) == NORM) + { + r_guess[obj->o_which] = malloc(strlen(buf) + 1); + if (r_guess[obj->o_which] != NULL) + strcpy(r_guess[obj->o_which], buf); + } + msg(""); + } +} + +void +ring_off() +{ + int ring; + struct object *obj; + + 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; + } + if (dropcheck(obj)) + msg("Was wearing %s", inv_name(obj, TRUE)); +} + +int +gethand() +{ + int c; + + for (;;) + { + if (terse) + msg("Left or Right ring? "); + else + msg("Left hand or right hand? "); + if ((c = readchar(cw)) == 'l' || c == 'L') + return LEFT; + else if (c == 'r' || c == 'R') + return RIGHT; + else if (c == ESCAPE) + return -1; + mpos = 0; + if (terse) + msg("L or R"); + else + msg("Please type L or R"); + } +} + +/* + * how much food does this ring use up? + */ +int +ring_eat(int hand) +{ + if (cur_ring[hand] == NULL) + return 0; + switch (cur_ring[hand]->o_which) + { + case R_REGEN: + return 2; + case R_SUSTSTR: + return 1; + case R_SEARCH: + return (rnd(100) < 33); + case R_DIGEST: + return -(rnd(100) < 50); + default: + return 0; + } +} + +/* + * print ring bonuses + */ +char * +ring_num(struct object *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)); + otherwise: + return ""; + } + return buf; +}