[BACK]Return to rings.c CVS log [TXT][DIR] Up to [contributed] / early-roguelike / rogue3

Annotation of early-roguelike/rogue3/rings.c, Revision 1.1.1.1

1.1       rubenllo    1: /*
                      2:  * routines dealing specifically with rings
                      3:  *
                      4:  * @(#)rings.c 3.17 (Berkeley) 6/15/81
                      5:  *
                      6:  * Rogue: Exploring the Dungeons of Doom
                      7:  * Copyright (C) 1980, 1981 Michael Toy, Ken Arnold and Glenn Wichman
                      8:  * All rights reserved.
                      9:  *
                     10:  * See the file LICENSE.TXT for full copyright and licensing information.
                     11:  */
                     12:
                     13: #include "curses.h"
                     14: #include <stdlib.h>
                     15: #include <string.h>
                     16: #include "rogue.h"
                     17:
                     18: void
                     19: ring_on()
                     20: {
                     21:     struct object *obj;
                     22:     struct linked_list *item;
                     23:     int ring;
                     24:     str_t save_max;
                     25:     char buf[80];
                     26:
                     27:     item = get_item("put on", RING);
                     28:     /*
                     29:      * Make certain that it is somethings that we want to wear
                     30:      */
                     31:     if (item == NULL)
                     32:        return;
                     33:     obj = (struct object *) ldata(item);
                     34:     if (obj->o_type != RING)
                     35:     {
                     36:        if (!terse)
                     37:            msg("It would be difficult to wrap that around a finger");
                     38:        else
                     39:            msg("Not a ring");
                     40:        return;
                     41:     }
                     42:
                     43:     /*
                     44:      * find out which hand to put it on
                     45:      */
                     46:     if (is_current(obj))
                     47:        return;
                     48:
                     49:     if (cur_ring[LEFT] == NULL && cur_ring[RIGHT] == NULL)
                     50:     {
                     51:        if ((ring = gethand()) < 0)
                     52:            return;
                     53:     }
                     54:     else if (cur_ring[LEFT] == NULL)
                     55:        ring = LEFT;
                     56:     else if (cur_ring[RIGHT] == NULL)
                     57:        ring = RIGHT;
                     58:     else
                     59:     {
                     60:        if (!terse)
                     61:            msg("You already have a ring on each hand");
                     62:        else
                     63:            msg("Wearing two");
                     64:        return;
                     65:     }
                     66:     cur_ring[ring] = obj;
                     67:
                     68:     /*
                     69:      * Calculate the effect it has on the poor guy.
                     70:      */
                     71:     switch (obj->o_which)
                     72:     {
                     73:        case R_ADDSTR:
                     74:            save_max = max_stats.s_str;
                     75:            chg_str(obj->o_ac);
                     76:            max_stats.s_str = save_max;
                     77:            break;
                     78:        case R_SEEINVIS:
                     79:            player.t_flags |= CANSEE;
                     80:            light(&hero);
                     81:            mvwaddch(cw, hero.y, hero.x, PLAYER);
                     82:            break;
                     83:        case R_AGGR:
                     84:            aggravate();
                     85:            break;
                     86:     }
                     87:     status();
                     88:
                     89:     if (obj->o_which >= MAXRINGS)
                     90:         return;
                     91:
                     92:     if (r_know[obj->o_which] && r_guess[obj->o_which])
                     93:     {
                     94:        free(r_guess[obj->o_which]);
                     95:        r_guess[obj->o_which] = NULL;
                     96:     }
                     97:     else if (!r_know[obj->o_which] && askme && r_guess[obj->o_which] == NULL)
                     98:     {
                     99:        mpos = 0;
                    100:        msg(terse ? "Call it: " : "What do you want to call it? ");
                    101:        if (get_str(buf, cw) == NORM)
                    102:        {
                    103:            r_guess[obj->o_which] = malloc(strlen(buf) + 1);
                    104:            if (r_guess[obj->o_which] != NULL)
                    105:                strcpy(r_guess[obj->o_which], buf);
                    106:        }
                    107:        msg("");
                    108:     }
                    109: }
                    110:
                    111: void
                    112: ring_off()
                    113: {
                    114:     int ring;
                    115:     struct object *obj;
                    116:
                    117:     if (cur_ring[LEFT] == NULL && cur_ring[RIGHT] == NULL)
                    118:     {
                    119:        if (terse)
                    120:            msg("No rings");
                    121:        else
                    122:            msg("You aren't wearing any rings");
                    123:        return;
                    124:     }
                    125:     else if (cur_ring[LEFT] == NULL)
                    126:        ring = RIGHT;
                    127:     else if (cur_ring[RIGHT] == NULL)
                    128:        ring = LEFT;
                    129:     else
                    130:        if ((ring = gethand()) < 0)
                    131:            return;
                    132:     mpos = 0;
                    133:     obj = cur_ring[ring];
                    134:     if (obj == NULL)
                    135:     {
                    136:        msg("Not wearing such a ring");
                    137:        return;
                    138:     }
                    139:     if (dropcheck(obj))
                    140:        msg("Was wearing %s", inv_name(obj, TRUE));
                    141: }
                    142:
                    143: int
                    144: gethand()
                    145: {
                    146:     int c;
                    147:
                    148:     for (;;)
                    149:     {
                    150:        if (terse)
                    151:            msg("Left or Right ring? ");
                    152:        else
                    153:            msg("Left hand or right hand? ");
                    154:        if ((c = readchar(cw)) == 'l' || c == 'L')
                    155:            return LEFT;
                    156:        else if (c == 'r' || c == 'R')
                    157:            return RIGHT;
                    158:        else if (c == ESCAPE)
                    159:            return -1;
                    160:        mpos = 0;
                    161:        if (terse)
                    162:            msg("L or R");
                    163:        else
                    164:            msg("Please type L or R");
                    165:     }
                    166: }
                    167:
                    168: /*
                    169:  * how much food does this ring use up?
                    170:  */
                    171: int
                    172: ring_eat(int hand)
                    173: {
                    174:     if (cur_ring[hand] == NULL)
                    175:        return 0;
                    176:     switch (cur_ring[hand]->o_which)
                    177:     {
                    178:        case R_REGEN:
                    179:            return 2;
                    180:        case R_SUSTSTR:
                    181:            return 1;
                    182:        case R_SEARCH:
                    183:            return (rnd(100) < 33);
                    184:        case R_DIGEST:
                    185:            return -(rnd(100) < 50);
                    186:        default:
                    187:            return 0;
                    188:     }
                    189: }
                    190:
                    191: /*
                    192:  * print ring bonuses
                    193:  */
                    194: char *
                    195: ring_num(struct object *obj)
                    196: {
                    197:     static char buf[5];
                    198:
                    199:     if (!(obj->o_flags & ISKNOW))
                    200:        return "";
                    201:     switch (obj->o_which)
                    202:     {
                    203:        case R_PROTECT:
                    204:        case R_ADDSTR:
                    205:        case R_ADDDAM:
                    206:        case R_ADDHIT:
                    207:            buf[0] = ' ';
                    208:            strcpy(&buf[1], num(obj->o_ac, 0));
                    209:        otherwise:
                    210:            return "";
                    211:     }
                    212:     return buf;
                    213: }

CVSweb