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;
+}