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

Annotation of early-roguelike/urogue/rings.c, Revision 1.1

1.1     ! rubenllo    1: /*
        !             2:     rings.c - Routines dealing specificaly with rings
        !             3:
        !             4:     UltraRogue: The Ultimate Adventure in the Dungeons of Doom
        !             5:     Copyright (C) 1985, 1986, 1992, 1993, 1995 Herb Chong
        !             6:     All rights reserved.
        !             7:
        !             8:     Based on "Advanced Rogue"
        !             9:     Copyright (C) 1984, 1985 Michael Morgan, Ken Dalka
        !            10:     All rights reserved.
        !            11:
        !            12:     Based on "Rogue: Exploring the Dungeons of Doom"
        !            13:     Copyright (C) 1980, 1981 Michael Toy, Ken Arnold and Glenn Wichman
        !            14:     All rights reserved.
        !            15:
        !            16:     See the file LICENSE.TXT for full copyright and licensing information.
        !            17: */
        !            18:
        !            19: #include <string.h>
        !            20: #include <stdlib.h>
        !            21: #include "rogue.h"
        !            22:
        !            23: void
        !            24: ring_on(void)
        !            25: {
        !            26:     struct object   *obj;
        !            27:     struct linked_list  *item;
        !            28:     int ring;
        !            29:     char buf[2 * LINELEN];
        !            30:
        !            31:     if ((item = get_item("put on", RING)) == NULL)
        !            32:         return;
        !            33:
        !            34:     obj = OBJPTR(item);
        !            35:
        !            36:     if (obj->o_type != RING)
        !            37:     {
        !            38:         msg("You can't put that on!");
        !            39:         return;
        !            40:     }
        !            41:
        !            42:     /* find out which hand to put it on */
        !            43:
        !            44:     if (is_current(obj))
        !            45:     {
        !            46:         msg("Already wearing that!");
        !            47:         return;
        !            48:     }
        !            49:
        !            50:     if (cur_ring[LEFT_1] == NULL)
        !            51:         ring = LEFT_1;
        !            52:     else if (cur_ring[LEFT_2] == NULL)
        !            53:         ring = LEFT_2;
        !            54:     else if (cur_ring[LEFT_3] == NULL)
        !            55:         ring = LEFT_3;
        !            56:     else if (cur_ring[LEFT_4] == NULL)
        !            57:         ring = LEFT_4;
        !            58:     else if (cur_ring[LEFT_5] == NULL)
        !            59:         ring = LEFT_5;
        !            60:     else if (cur_ring[RIGHT_1] == NULL)
        !            61:         ring = RIGHT_1;
        !            62:     else if (cur_ring[RIGHT_2] == NULL)
        !            63:         ring = RIGHT_2;
        !            64:     else if (cur_ring[RIGHT_3] == NULL)
        !            65:         ring = RIGHT_3;
        !            66:     else if (cur_ring[RIGHT_4] == NULL)
        !            67:         ring = RIGHT_4;
        !            68:     else if (cur_ring[RIGHT_5] == NULL)
        !            69:         ring = RIGHT_5;
        !            70:     else
        !            71:     {
        !            72:         msg("You already have on ten rings.");
        !            73:         return;
        !            74:     }
        !            75:
        !            76:     cur_ring[ring] = obj;
        !            77:
        !            78:     /* Calculate the effect it has on the poor guy. */
        !            79:
        !            80:     switch (obj->o_which)
        !            81:     {
        !            82:         case R_ADDSTR:
        !            83:             pstats.s_str += obj->o_ac;
        !            84:             break;
        !            85:         case R_ADDHIT:
        !            86:             pstats.s_dext += obj->o_ac;
        !            87:             break;
        !            88:         case R_ADDINTEL:
        !            89:             pstats.s_intel += obj->o_ac;
        !            90:             break;
        !            91:         case R_ADDWISDOM:
        !            92:             pstats.s_wisdom += obj->o_ac;
        !            93:             break;
        !            94:         case R_FREEDOM:
        !            95:             turn_off(player, ISHELD);
        !            96:             hold_count = 0;
        !            97:             break;
        !            98:         case R_TRUESEE:
        !            99:             if (off(player, PERMBLIND))
        !           100:             {
        !           101:                 turn_on(player, CANTRUESEE);
        !           102:                 msg("You become more aware of your surroundings.");
        !           103:                 sight(NULL);
        !           104:                 light(&hero);
        !           105:                 mvwaddch(cw, hero.y, hero.x, PLAYER);
        !           106:             }
        !           107:             break;
        !           108:
        !           109:         case R_SEEINVIS:
        !           110:             if (off(player, PERMBLIND))
        !           111:             {
        !           112:                 turn_on(player, CANTRUESEE);
        !           113:                 msg("Your eyes begin to tingle.");
        !           114:                 sight(NULL);
        !           115:                 light(&hero);
        !           116:                 mvwaddch(cw, hero.y, hero.x, PLAYER);
        !           117:             }
        !           118:             break;
        !           119:
        !           120:         case R_AGGR:
        !           121:             aggravate();
        !           122:             break;
        !           123:
        !           124:         case R_CARRYING:
        !           125:             updpack();
        !           126:             break;
        !           127:
        !           128:         case R_LEVITATION:
        !           129:             msg("You begin to float in the air!");
        !           130:             break;
        !           131:
        !           132:         case R_LIGHT:
        !           133:             if (roomin(hero) != NULL)
        !           134:             {
        !           135:                 light(&hero);
        !           136:                 mvwaddch(cw, hero.y, hero.x, PLAYER);
        !           137:             }
        !           138:     }
        !           139:
        !           140:     status(FALSE);
        !           141:
        !           142:     if (know_items[TYP_RING][obj->o_which] &&
        !           143:         guess_items[TYP_RING][obj->o_which])
        !           144:     {
        !           145:         mem_free(guess_items[TYP_RING][obj->o_which]);
        !           146:         guess_items[TYP_RING][obj->o_which] = NULL;
        !           147:     }
        !           148:     else if (!know_items[TYP_RING][obj->o_which] &&
        !           149:          askme &&
        !           150:          (obj->o_flags & ISKNOW) == 0 &&
        !           151:          guess_items[TYP_RING][obj->o_which] == NULL)
        !           152:     {
        !           153:         mpos = 0;
        !           154:         msg("What do you want to call it? ");
        !           155:
        !           156:         if (get_string(buf, cw) == NORM)
        !           157:         {
        !           158:             guess_items[TYP_RING][obj->o_which] =
        !           159:                 new_alloc(strlen(buf) + 1);
        !           160:             strcpy(guess_items[TYP_RING][obj->o_which], buf);
        !           161:         }
        !           162:         msg("");
        !           163:     }
        !           164: }
        !           165:
        !           166: void
        !           167: ring_off(void)
        !           168: {
        !           169:     struct object   *obj;
        !           170:     struct linked_list  *item;
        !           171:
        !           172:     if (cur_ring[LEFT_1] == NULL && cur_ring[LEFT_2] == NULL &&
        !           173:         cur_ring[LEFT_3] == NULL && cur_ring[LEFT_4] == NULL &&
        !           174:         cur_ring[LEFT_5] == NULL &&
        !           175:         cur_ring[RIGHT_1] == NULL && cur_ring[RIGHT_2] == NULL &&
        !           176:         cur_ring[RIGHT_3] == NULL && cur_ring[RIGHT_4] == NULL &&
        !           177:         cur_ring[RIGHT_5] == NULL)
        !           178:     {
        !           179:         msg("You aren't wearing any rings.");
        !           180:         return;
        !           181:     }
        !           182:     else if ((item = get_item("remove", RING)) == NULL)
        !           183:         return;
        !           184:
        !           185:     mpos = 0;
        !           186:     obj = OBJPTR(item);
        !           187:
        !           188:     if ((obj = OBJPTR(item)) == NULL)
        !           189:         msg("You are not wearing that!");
        !           190:
        !           191:     if (dropcheck(obj))
        !           192:     {
        !           193:         switch (obj->o_which)
        !           194:         {
        !           195:             case R_SEEINVIS:
        !           196:                 msg("Your eyes stop tingling.");
        !           197:                 break;
        !           198:
        !           199:             case R_CARRYING:
        !           200:                 updpack();
        !           201:                 break;
        !           202:
        !           203:             case R_LEVITATION:
        !           204:                 msg("You float gently to the ground.");
        !           205:                 break;
        !           206:
        !           207:             case R_LIGHT:
        !           208:                 if (roomin(hero) != NULL)
        !           209:                 {
        !           210:                     light(&hero);
        !           211:                     mvwaddch(cw, hero.y, hero.x, PLAYER);
        !           212:                 }
        !           213:                 break;
        !           214:
        !           215:             case R_TRUESEE:
        !           216:                 msg("Your sensory perceptions return to normal.");
        !           217:                 break;
        !           218:         }
        !           219:
        !           220:         msg("Was wearing %s.", inv_name(obj, LOWERCASE));
        !           221:     }
        !           222: }
        !           223:
        !           224: /*
        !           225:     ring_eat()
        !           226:         how much food does this ring use up?
        !           227: */
        !           228:
        !           229: int
        !           230: ring_eat(int hand)
        !           231: {
        !           232:     int ret_val = 0;
        !           233:     int ac;
        !           234:
        !           235:     if (cur_ring[hand] != NULL)
        !           236:     {
        !           237:         switch (cur_ring[hand]->o_which)
        !           238:         {
        !           239:             case R_REGEN:
        !           240:             case R_VREGEN:
        !           241:                 ret_val = rnd(pstats.s_lvl > 10 ? 10 : pstats.s_lvl);
        !           242:
        !           243:             case R_DIGEST:
        !           244:
        !           245:                 ac = cur_ring[hand]->o_ac;
        !           246:
        !           247:                 if (ac < 0 && rnd(1 - (ac / 3)) == 0)
        !           248:                     ret_val = -ac + 1;
        !           249:                 else if (rnd((ac / 2) + 2) == 0)
        !           250:                     ret_val = -1 - ac;
        !           251:                 break;
        !           252:
        !           253:             case R_SEARCH:
        !           254:                 ret_val = rnd(100) < 33;
        !           255:                 break;
        !           256:
        !           257:                        default:
        !           258:                            ret_val = 1;
        !           259:         }
        !           260:     }
        !           261:
        !           262:     ret_val += rnd(luck);
        !           263:
        !           264:     return(ret_val);
        !           265: }
        !           266:
        !           267: /*
        !           268:     ring_num()
        !           269:         print ring bonuses
        !           270: */
        !           271:
        !           272: char *
        !           273: ring_num(struct object *obj, char *buf)
        !           274: {
        !           275:     char buffer[1024];
        !           276:
        !           277:     if (buf == NULL)
        !           278:         return("A bug in UltraRogue #101");
        !           279:
        !           280:     buf[0] = 0;
        !           281:
        !           282:     if (obj->o_flags & ISKNOW)
        !           283:     {
        !           284:         switch (obj->o_which)
        !           285:         {
        !           286:             case R_SEARCH:
        !           287:             case R_PROTECT:
        !           288:             case R_ADDSTR:
        !           289:             case R_ADDDAM:
        !           290:             case R_ADDHIT:
        !           291:             case R_ADDINTEL:
        !           292:             case R_ADDWISDOM:
        !           293:             case R_CARRYING:
        !           294:             case R_VREGEN:
        !           295:             case R_RESURRECT:
        !           296:             case R_TELCONTROL:
        !           297:             case R_REGEN:
        !           298:             case R_PIETY:
        !           299:             case R_WIZARD:
        !           300:                 buf[0] = ' ';
        !           301:                 strcpy(&buf[1], num(obj->o_ac, 0,buffer));
        !           302:                 break;
        !           303:
        !           304:             case R_DIGEST:
        !           305:                 buf[0] = ' ';
        !           306:                 strcpy(&buf[1], num(obj->o_ac < 0 ?
        !           307:                 obj->o_ac : obj->o_ac - 1, 0, buffer));
        !           308:                 break;
        !           309:
        !           310:             default:
        !           311:                 if (obj->o_flags & ISCURSED)
        !           312:                     strcpy(buf, " cursed");
        !           313:                 break;
        !           314:         }
        !           315:     }
        !           316:
        !           317:     return(buf);
        !           318: }
        !           319:
        !           320: /*
        !           321:     ring_value()
        !           322:         Return the effect of the specified ring
        !           323: */
        !           324:
        !           325: #define ISRING(h, r) (cur_ring[h] != NULL && cur_ring[h]->o_which == r)
        !           326:
        !           327: int
        !           328: ring_value(int type)
        !           329: {
        !           330:     int result = 0;
        !           331:
        !           332:     if (ISRING(LEFT_1, type))
        !           333:         result += cur_ring[LEFT_1]->o_ac;
        !           334:     if (ISRING(LEFT_2, type))
        !           335:         result += cur_ring[LEFT_2]->o_ac;
        !           336:     if (ISRING(LEFT_3, type))
        !           337:         result += cur_ring[LEFT_3]->o_ac;
        !           338:     if (ISRING(LEFT_4, type))
        !           339:         result += cur_ring[LEFT_4]->o_ac;
        !           340:     if (ISRING(LEFT_5, type))
        !           341:         result += cur_ring[LEFT_5]->o_ac;
        !           342:     if (ISRING(RIGHT_1, type))
        !           343:         result += cur_ring[RIGHT_1]->o_ac;
        !           344:     if (ISRING(RIGHT_2, type))
        !           345:         result += cur_ring[RIGHT_2]->o_ac;
        !           346:     if (ISRING(RIGHT_3, type))
        !           347:         result += cur_ring[RIGHT_3]->o_ac;
        !           348:     if (ISRING(RIGHT_4, type))
        !           349:         result += cur_ring[RIGHT_4]->o_ac;
        !           350:     if (ISRING(RIGHT_5, type))
        !           351:         result += cur_ring[RIGHT_5]->o_ac;
        !           352:
        !           353:     return(result);
        !           354: }

CVSweb