/*
* 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;
}