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

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

1.1       rubenllo    1: /*
                      2:  * Routines dealing specifically with rings
                      3:  *
                      4:  * @(#)rings.c 4.19 (Berkeley) 05/29/83
                      5:  *
                      6:  * Rogue: Exploring the Dungeons of Doom
                      7:  * Copyright (C) 1980-1983, 1985, 1999 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 "rogue.h"
                     15:
                     16: /*
                     17:  * ring_on:
                     18:  *     Put a ring on a hand
                     19:  */
                     20:
                     21: void
                     22: ring_on(void)
                     23: {
                     24:     THING *obj;
                     25:     int ring;
                     26:
                     27:     obj = get_item("put on", RING);
                     28:     /*
                     29:      * Make certain that it is somethings that we want to wear
                     30:      */
                     31:     if (obj == NULL)
                     32:        return;
                     33:     if (obj->o_type != RING)
                     34:     {
                     35:        if (!terse)
                     36:            msg("it would be difficult to wrap that around a finger");
                     37:        else
                     38:            msg("not a ring");
                     39:        return;
                     40:     }
                     41:
                     42:     /*
                     43:      * find out which hand to put it on
                     44:      */
                     45:     if (is_current(obj))
                     46:        return;
                     47:
                     48:     if (cur_ring[LEFT] == NULL && cur_ring[RIGHT] == NULL)
                     49:     {
                     50:        if ((ring = gethand()) < 0)
                     51:            return;
                     52:     }
                     53:     else if (cur_ring[LEFT] == NULL)
                     54:        ring = LEFT;
                     55:     else if (cur_ring[RIGHT] == NULL)
                     56:        ring = RIGHT;
                     57:     else
                     58:     {
                     59:        if (!terse)
                     60:            msg("you already have a ring on each hand");
                     61:        else
                     62:            msg("wearing two");
                     63:        return;
                     64:     }
                     65:     cur_ring[ring] = obj;
                     66:
                     67:     /*
                     68:      * Calculate the effect it has on the poor guy.
                     69:      */
                     70:     switch (obj->o_which)
                     71:     {
                     72:        case R_ADDSTR:
                     73:            chg_str(obj->o_arm);
                     74:            break;
                     75:        case R_SEEINVIS:
                     76:            invis_on();
                     77:            break;
                     78:        case R_AGGR:
                     79:            aggravate();
                     80:            break;
                     81:     }
                     82:
                     83:     if (!terse)
                     84:        addmsg("you are now wearing ");
                     85:     msg("%s (%c)", inv_name(obj, TRUE), obj->o_packch);
                     86: }
                     87:
                     88: /*
                     89:  * ring_off:
                     90:  *     take off a ring
                     91:  */
                     92:
                     93: void
                     94: ring_off(void)
                     95: {
                     96:     int ring;
                     97:     THING *obj;
                     98:
                     99:     if (cur_ring[LEFT] == NULL && cur_ring[RIGHT] == NULL)
                    100:     {
                    101:        if (terse)
                    102:            msg("no rings");
                    103:        else
                    104:            msg("you aren't wearing any rings");
                    105:        return;
                    106:     }
                    107:     else if (cur_ring[LEFT] == NULL)
                    108:        ring = RIGHT;
                    109:     else if (cur_ring[RIGHT] == NULL)
                    110:        ring = LEFT;
                    111:     else
                    112:        if ((ring = gethand()) < 0)
                    113:            return;
                    114:     mpos = 0;
                    115:     obj = cur_ring[ring];
                    116:     if (obj == NULL)
                    117:     {
                    118:        msg("not wearing such a ring");
                    119:        return;
                    120:     }
                    121:     if (dropcheck(obj))
                    122:        msg("was wearing %s(%c)", inv_name(obj, TRUE), obj->o_packch);
                    123: }
                    124:
                    125: /*
                    126:  * gethand:
                    127:  *     Which hand is the hero interested in?
                    128:  */
                    129: int
                    130: gethand(void)
                    131: {
                    132:     int c;
                    133:
                    134:     for (;;)
                    135:     {
                    136:        if (terse)
                    137:            msg("left or right ring? ");
                    138:        else
                    139:            msg("left hand or right hand? ");
                    140:        if ((c = readchar()) == ESCAPE)
                    141:            return -1;
                    142:        mpos = 0;
                    143:        if (c == 'l' || c == 'L')
                    144:            return LEFT;
                    145:        else if (c == 'r' || c == 'R')
                    146:            return RIGHT;
                    147:        if (terse)
                    148:            msg("L or R");
                    149:        else
                    150:            msg("please type L or R");
                    151:     }
                    152: }
                    153:
                    154: /*
                    155:  * ring_eat:
                    156:  *     How much food does this ring use up?
                    157:  */
                    158: int
                    159: ring_eat(int hand)
                    160: {
                    161:     THING *ring;
                    162:     int eat;
                    163:     int uses[] = {
                    164:         1,     /* R_PROTECT */          1,     /* R_ADDSTR */
                    165:         1,     /* R_SUSTSTR */         -3,     /* R_SEARCH */
                    166:        -5,     /* R_SEEINVIS */         0,     /* R_NOP */
                    167:         0,     /* R_AGGR */            -3,     /* R_ADDHIT */
                    168:        -3,     /* R_ADDDAM */           2,     /* R_REGEN */
                    169:        -2,     /* R_DIGEST */           0,     /* R_TELEPORT */
                    170:         1,     /* R_STEALTH */          1      /* R_SUSTARM */
                    171:     };
                    172:
                    173:     if ((ring = cur_ring[hand]) == NULL)
                    174:        return 0;
                    175:     if ((eat = uses[ring->o_which]) < 0)
                    176:        eat = (rnd(-eat) == 0);
                    177:     if (ring->o_which == R_DIGEST)
                    178:        eat = -eat;
                    179:     return eat;
                    180: }
                    181:
                    182: /*
                    183:  * ring_num:
                    184:  *     Print ring bonuses
                    185:  */
                    186: const char *
                    187: ring_num(const THING *obj)
                    188: {
                    189:     static char buf[10];
                    190:
                    191:     if (!(obj->o_flags & ISKNOW))
                    192:        return "";
                    193:     switch (obj->o_which)
                    194:     {
                    195:        case R_PROTECT:
                    196:        case R_ADDSTR:
                    197:        case R_ADDDAM:
                    198:        case R_ADDHIT:
                    199:            sprintf(buf, " [%s]", num(obj->o_arm, 0, RING));
                    200:        otherwise:
                    201:            return "";
                    202:     }
                    203:     return buf;
                    204: }

CVSweb