diff urogue/rings.c @ 256:c495a4f288c6

Import UltraRogue from the Roguelike Restoration Project (r1490)
author John "Elwin" Edwards
date Tue, 31 Jan 2017 19:56:04 -0500
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/urogue/rings.c	Tue Jan 31 19:56:04 2017 -0500
@@ -0,0 +1,354 @@
+/*
+    rings.c - Routines dealing specificaly with rings
+        
+    UltraRogue: The Ultimate Adventure in the Dungeons of Doom
+    Copyright (C) 1985, 1986, 1992, 1993, 1995 Herb Chong
+    All rights reserved.
+
+    Based on "Advanced Rogue"
+    Copyright (C) 1984, 1985 Michael Morgan, Ken Dalka
+    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 <string.h>
+#include <stdlib.h>
+#include "rogue.h"
+
+void
+ring_on(void)
+{
+    struct object   *obj;
+    struct linked_list  *item;
+    int ring;
+    char buf[2 * LINELEN];
+
+    if ((item = get_item("put on", RING)) == NULL)
+        return;
+
+    obj = OBJPTR(item);
+
+    if (obj->o_type != RING)
+    {
+        msg("You can't put that on!");
+        return;
+    }
+
+    /* find out which hand to put it on */
+
+    if (is_current(obj))
+    {
+        msg("Already wearing that!");
+        return;
+    }
+
+    if (cur_ring[LEFT_1] == NULL)
+        ring = LEFT_1;
+    else if (cur_ring[LEFT_2] == NULL)
+        ring = LEFT_2;
+    else if (cur_ring[LEFT_3] == NULL)
+        ring = LEFT_3;
+    else if (cur_ring[LEFT_4] == NULL)
+        ring = LEFT_4;
+    else if (cur_ring[LEFT_5] == NULL)
+        ring = LEFT_5;
+    else if (cur_ring[RIGHT_1] == NULL)
+        ring = RIGHT_1;
+    else if (cur_ring[RIGHT_2] == NULL)
+        ring = RIGHT_2;
+    else if (cur_ring[RIGHT_3] == NULL)
+        ring = RIGHT_3;
+    else if (cur_ring[RIGHT_4] == NULL)
+        ring = RIGHT_4;
+    else if (cur_ring[RIGHT_5] == NULL)
+        ring = RIGHT_5;
+    else
+    {
+        msg("You already have on ten rings.");
+        return;
+    }
+
+    cur_ring[ring] = obj;
+
+    /* Calculate the effect it has on the poor guy. */
+
+    switch (obj->o_which)
+    {
+        case R_ADDSTR:
+            pstats.s_str += obj->o_ac;
+            break;
+        case R_ADDHIT:
+            pstats.s_dext += obj->o_ac;
+            break;
+        case R_ADDINTEL:
+            pstats.s_intel += obj->o_ac;
+            break;
+        case R_ADDWISDOM:
+            pstats.s_wisdom += obj->o_ac;
+            break;
+        case R_FREEDOM:
+            turn_off(player, ISHELD);
+            hold_count = 0;
+            break;
+        case R_TRUESEE:
+            if (off(player, PERMBLIND))
+            {
+                turn_on(player, CANTRUESEE);
+                msg("You become more aware of your surroundings.");
+                sight(NULL);
+                light(&hero);
+                mvwaddch(cw, hero.y, hero.x, PLAYER);
+            }
+            break;
+
+        case R_SEEINVIS:
+            if (off(player, PERMBLIND))
+            {
+                turn_on(player, CANTRUESEE);
+                msg("Your eyes begin to tingle.");
+                sight(NULL);
+                light(&hero);
+                mvwaddch(cw, hero.y, hero.x, PLAYER);
+            }
+            break;
+
+        case R_AGGR:
+            aggravate();
+            break;
+
+        case R_CARRYING:
+            updpack();
+            break;
+
+        case R_LEVITATION:
+            msg("You begin to float in the air!");
+            break;
+
+        case R_LIGHT:
+            if (roomin(hero) != NULL)
+            {
+                light(&hero);
+                mvwaddch(cw, hero.y, hero.x, PLAYER);
+            }
+    }
+
+    status(FALSE);
+
+    if (know_items[TYP_RING][obj->o_which] &&
+        guess_items[TYP_RING][obj->o_which])
+    {
+        mem_free(guess_items[TYP_RING][obj->o_which]);
+        guess_items[TYP_RING][obj->o_which] = NULL;
+    }
+    else if (!know_items[TYP_RING][obj->o_which] &&
+         askme &&
+         (obj->o_flags & ISKNOW) == 0 &&
+         guess_items[TYP_RING][obj->o_which] == NULL)
+    {
+        mpos = 0;
+        msg("What do you want to call it? ");
+
+        if (get_string(buf, cw) == NORM)
+        {
+            guess_items[TYP_RING][obj->o_which] =
+                new_alloc(strlen(buf) + 1);
+            strcpy(guess_items[TYP_RING][obj->o_which], buf);
+        }
+        msg("");
+    }
+}
+
+void
+ring_off(void)
+{
+    struct object   *obj;
+    struct linked_list  *item;
+
+    if (cur_ring[LEFT_1] == NULL && cur_ring[LEFT_2] == NULL &&
+        cur_ring[LEFT_3] == NULL && cur_ring[LEFT_4] == NULL &&
+        cur_ring[LEFT_5] == NULL &&
+        cur_ring[RIGHT_1] == NULL && cur_ring[RIGHT_2] == NULL &&
+        cur_ring[RIGHT_3] == NULL && cur_ring[RIGHT_4] == NULL &&
+        cur_ring[RIGHT_5] == NULL)
+    {
+        msg("You aren't wearing any rings.");
+        return;
+    }
+    else if ((item = get_item("remove", RING)) == NULL)
+        return;
+
+    mpos = 0;
+    obj = OBJPTR(item);
+
+    if ((obj = OBJPTR(item)) == NULL)
+        msg("You are not wearing that!");
+
+    if (dropcheck(obj))
+    {
+        switch (obj->o_which)
+        {
+            case R_SEEINVIS:
+                msg("Your eyes stop tingling.");
+                break;
+
+            case R_CARRYING:
+                updpack();
+                break;
+
+            case R_LEVITATION:
+                msg("You float gently to the ground.");
+                break;
+
+            case R_LIGHT:
+                if (roomin(hero) != NULL)
+                {
+                    light(&hero);
+                    mvwaddch(cw, hero.y, hero.x, PLAYER);
+                }
+                break;
+
+            case R_TRUESEE:
+                msg("Your sensory perceptions return to normal.");
+                break;
+        }
+
+        msg("Was wearing %s.", inv_name(obj, LOWERCASE));
+    }
+}
+
+/*
+    ring_eat()
+        how much food does this ring use up?
+*/
+
+int
+ring_eat(int hand)
+{
+    int ret_val = 0;
+    int ac;
+
+    if (cur_ring[hand] != NULL)
+    {
+        switch (cur_ring[hand]->o_which)
+        {
+            case R_REGEN:
+            case R_VREGEN:
+                ret_val = rnd(pstats.s_lvl > 10 ? 10 : pstats.s_lvl);
+
+            case R_DIGEST:
+
+                ac = cur_ring[hand]->o_ac;
+
+                if (ac < 0 && rnd(1 - (ac / 3)) == 0)
+                    ret_val = -ac + 1;
+                else if (rnd((ac / 2) + 2) == 0)
+                    ret_val = -1 - ac;
+                break;
+
+            case R_SEARCH:
+                ret_val = rnd(100) < 33;
+                break;
+				
+			default:
+			    ret_val = 1;
+        }
+    }
+
+    ret_val += rnd(luck);
+
+    return(ret_val);
+}
+
+/*
+    ring_num()
+        print ring bonuses
+*/
+
+char *
+ring_num(struct object *obj, char *buf)
+{
+    char buffer[1024];
+
+    if (buf == NULL)
+        return("A bug in UltraRogue #101");
+
+    buf[0] = 0;
+
+    if (obj->o_flags & ISKNOW)
+    {
+        switch (obj->o_which)
+        {
+            case R_SEARCH:
+            case R_PROTECT:
+            case R_ADDSTR:
+            case R_ADDDAM:
+            case R_ADDHIT:
+            case R_ADDINTEL:
+            case R_ADDWISDOM:
+            case R_CARRYING:
+            case R_VREGEN:
+            case R_RESURRECT:
+            case R_TELCONTROL:
+            case R_REGEN:
+            case R_PIETY:
+            case R_WIZARD:
+                buf[0] = ' ';
+                strcpy(&buf[1], num(obj->o_ac, 0,buffer));
+                break;
+
+            case R_DIGEST:
+                buf[0] = ' ';
+                strcpy(&buf[1], num(obj->o_ac < 0 ?
+                obj->o_ac : obj->o_ac - 1, 0, buffer));
+                break;
+
+            default:
+                if (obj->o_flags & ISCURSED)
+                    strcpy(buf, " cursed");
+                break;
+        }
+    }
+
+    return(buf);
+}
+
+/*
+    ring_value()
+        Return the effect of the specified ring
+*/
+
+#define ISRING(h, r) (cur_ring[h] != NULL && cur_ring[h]->o_which == r)
+
+int
+ring_value(int type)
+{
+    int result = 0;
+
+    if (ISRING(LEFT_1, type))
+        result += cur_ring[LEFT_1]->o_ac;
+    if (ISRING(LEFT_2, type))
+        result += cur_ring[LEFT_2]->o_ac;
+    if (ISRING(LEFT_3, type))
+        result += cur_ring[LEFT_3]->o_ac;
+    if (ISRING(LEFT_4, type))
+        result += cur_ring[LEFT_4]->o_ac;
+    if (ISRING(LEFT_5, type))
+        result += cur_ring[LEFT_5]->o_ac;
+    if (ISRING(RIGHT_1, type))
+        result += cur_ring[RIGHT_1]->o_ac;
+    if (ISRING(RIGHT_2, type))
+        result += cur_ring[RIGHT_2]->o_ac;
+    if (ISRING(RIGHT_3, type))
+        result += cur_ring[RIGHT_3]->o_ac;
+    if (ISRING(RIGHT_4, type))
+        result += cur_ring[RIGHT_4]->o_ac;
+    if (ISRING(RIGHT_5, type))
+        result += cur_ring[RIGHT_5]->o_ac;
+
+    return(result);
+}