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

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

1.1     ! rubenllo    1: /*
        !             2:  * routines dealing specifically with rings
        !             3:  *
        !             4:  * @(#)rings.c 9.0     (rdk)    7/17/84
        !             5:  *
        !             6:  * Super-Rogue
        !             7:  * Copyright (C) 1984 Robert D. Kindelberger
        !             8:  * All rights reserved.
        !             9:  *
        !            10:  * Based on "Rogue: Exploring the Dungeons of Doom"
        !            11:  * Copyright (C) 1980, 1981 Michael Toy, Ken Arnold and Glenn Wichman
        !            12:  * All rights reserved.
        !            13:  *
        !            14:  * See the file LICENSE.TXT for full copyright and licensing information.
        !            15:  */
        !            16:
        !            17: #include <stdlib.h>
        !            18: #include <string.h>
        !            19: #include "rogue.h"
        !            20: #include "rogue.ext"
        !            21:
        !            22: int gethand(bool isrmv);
        !            23: int ring_eat(void);
        !            24:
        !            25: /*
        !            26:  * ring_on:
        !            27:  *     Put on a ring
        !            28:  */
        !            29: void
        !            30: ring_on(void)
        !            31: {
        !            32:        reg struct object *obj;
        !            33:        reg struct linked_list *item;
        !            34:        reg int ring, wh;
        !            35:        char buf[LINLEN];
        !            36:        bool okring;
        !            37:
        !            38:        if (cur_ring[LEFT] != NULL && cur_ring[RIGHT] != NULL) {
        !            39:                msg("Already wearing two rings.");
        !            40:                after = FALSE;
        !            41:                return;
        !            42:        }
        !            43:        /*
        !            44:         * Make certain that it is somethings that we want to wear
        !            45:         */
        !            46:        if ((item = get_item("put on", RING)) == NULL)
        !            47:                return;
        !            48:        obj = OBJPTR(item);
        !            49:        if (obj->o_type != RING) {
        !            50:                msg("That won't fit on your finger.");
        !            51:                return;
        !            52:        }
        !            53:        /*
        !            54:         * find out which hand to put it on
        !            55:         */
        !            56:        if (is_current(obj))
        !            57:                return;
        !            58:        if (cur_ring[LEFT] == NULL && cur_ring[RIGHT] == NULL) {
        !            59:                if ((ring = gethand(FALSE)) < 0)
        !            60:                        return;
        !            61:        }
        !            62:        else if (cur_ring[LEFT] == NULL)
        !            63:                ring = LEFT;
        !            64:        else
        !            65:                ring = RIGHT;
        !            66:        cur_ring[ring] = obj;
        !            67:        wh = obj->o_which;
        !            68:        /*
        !            69:         * okring = FALSE when:
        !            70:         * 1) ring is cursed and benefit = plus
        !            71:         * 2) ring is blessed and benefit = minus
        !            72:         */
        !            73:        okring = !((obj->o_ac > 0 && o_on(obj, ISCURSED)) ||
        !            74:                  (obj->o_ac < 0 && o_on(obj, ISBLESS)));
        !            75:        /*
        !            76:         * Calculate the effect it has on the poor guy (if possible).
        !            77:         */
        !            78:        if (okring) {
        !            79:                switch (wh) {
        !            80:                        case R_SPEED:
        !            81:                                if (--obj->o_ac < 0) {
        !            82:                                        obj->o_ac = 0;
        !            83:                                        setoflg(obj,ISCURSED);
        !            84:                                }
        !            85:                                else {
        !            86:                                        add_haste(FALSE);
        !            87:                                }
        !            88:                        when R_GIANT:                           /* to 24 */
        !            89:                                him->s_ef.a_str = MAXSTR;
        !            90:                        when R_ADDSTR:
        !            91:                                chg_abil(STR,obj->o_ac,FROMRING);
        !            92:                        when R_KNOW:
        !            93:                                chg_abil(WIS,obj->o_ac,FROMRING);
        !            94:                        when R_DEX:
        !            95:                                chg_abil(DEX,obj->o_ac,FROMRING);
        !            96:                        when R_CONST:
        !            97:                                chg_abil(CON,obj->o_ac,FROMRING);
        !            98:                        when R_SEEINVIS:
        !            99:                                player.t_flags |= CANSEE;
        !           100:                                light(&hero);
        !           101:                                mvwaddch(cw, hero.y, hero.x, PLAYER);
        !           102:                        when R_AGGR:
        !           103:                                aggravate();
        !           104:                        when R_HEAVY:
        !           105:                                updpack();                      /* new pack weight */
        !           106:                        when R_BLIND:
        !           107:                                r_know[R_BLIND] = TRUE;
        !           108:                                player.t_flags |= ISBLIND;
        !           109:                                look(FALSE);
        !           110:                        when R_SLOW:
        !           111:                                player.t_flags |= ISSLOW;
        !           112:                        when R_SAPEM:
        !           113:                                fuse(sapem,TRUE,150);
        !           114:                        when R_LIGHT: {
        !           115:                                struct room *rop;
        !           116:
        !           117:                                r_know[R_LIGHT] = TRUE;
        !           118:                                if ((rop = player.t_room) != NULL) {
        !           119:                                        rop->r_flags &= ~ISDARK;
        !           120:                                        light(&hero);
        !           121:                                        mvwaddch(cw, hero.y, hero.x, PLAYER);
        !           122:                                }
        !           123:                        }
        !           124:                }
        !           125:        }
        !           126:        if (r_know[wh] && r_guess[wh]) {
        !           127:                free(r_guess[wh]);
        !           128:                r_guess[wh] = NULL;
        !           129:        }
        !           130:        else if(!r_know[wh] && r_guess[wh] == NULL) {
        !           131:                mpos = 0;
        !           132:                strcpy(buf, r_stones[wh]);
        !           133:                msg(callit);
        !           134:                if (get_str(buf, cw) == NORM) {
        !           135:                        r_guess[wh] = new(strlen(buf) + 1);
        !           136:                        strcpy(r_guess[wh], buf);
        !           137:                }
        !           138:        }
        !           139:        mpos = 0;
        !           140:        msg("Now wearing %s",inv_name(obj,TRUE));
        !           141:        ringfood = ring_eat();
        !           142:        nochange = FALSE;
        !           143: }
        !           144:
        !           145:
        !           146: /*
        !           147:  * ring_off:
        !           148:  *     Take off some ring
        !           149:  */
        !           150: void
        !           151: ring_off(void)
        !           152: {
        !           153:        reg int ring;
        !           154:        reg struct object *obj;
        !           155:
        !           156:        if (cur_ring[LEFT] == NULL && cur_ring[RIGHT] == NULL) {
        !           157:                msg("You're not wearing any rings.");
        !           158:                return;
        !           159:        }
        !           160:        else if (cur_ring[LEFT] == NULL)
        !           161:                ring = RIGHT;
        !           162:        else if (cur_ring[RIGHT] == NULL)
        !           163:                ring = LEFT;
        !           164:        else
        !           165:                if ((ring = gethand(TRUE)) < 0)
        !           166:                        return;
        !           167:        mpos = 0;
        !           168:        obj = cur_ring[ring];
        !           169:        if (obj == NULL) {
        !           170:                msg("Not wearing such a ring.");
        !           171:                return;
        !           172:        }
        !           173:        if (dropcheck(obj)) {
        !           174:                msg("Was wearing %s", inv_name(obj, TRUE));
        !           175:                nochange = FALSE;
        !           176:                ringfood = ring_eat();
        !           177:        }
        !           178: }
        !           179:
        !           180:
        !           181: /*
        !           182:  * toss_ring:
        !           183:  *     Remove a ring and stop its effects
        !           184:  */
        !           185: void
        !           186: toss_ring(struct object *what)
        !           187: {
        !           188:        bool okring;
        !           189:
        !           190:        /*
        !           191:         * okring = FALSE when:
        !           192:         * 1) ring is cursed and benefit = plus
        !           193:         * 2) ring is blessed and benefit = minus
        !           194:         */
        !           195:        okring = !((what->o_ac > 0 && o_on(what, ISCURSED)) ||
        !           196:                  (what->o_ac < 0 && o_on(what, ISBLESS)));
        !           197:
        !           198:        cur_ring[what == cur_ring[LEFT] ? LEFT : RIGHT] = NULL;
        !           199:        if (okring) {
        !           200:                switch (what->o_which) {
        !           201:                        case R_SPEED:
        !           202:                                extinguish(nohaste);
        !           203:                                nohaste(FALSE);
        !           204:                        when R_BLIND:
        !           205:                                sight(FALSE);
        !           206:                        when R_SLOW:
        !           207:                                player.t_flags &= ~ISSLOW;
        !           208:                        when R_SAPEM:
        !           209:                                extinguish(sapem);
        !           210:                        when R_GIANT:
        !           211:                                him->s_ef = him->s_re;
        !           212:                                ringabil();
        !           213:                        when R_ADDSTR:
        !           214:                                chg_abil(STR,-what->o_ac,FALSE);
        !           215:                        when R_KNOW:
        !           216:                                chg_abil(WIS,-what->o_ac,FALSE);
        !           217:                        when R_DEX:
        !           218:                                chg_abil(DEX,-what->o_ac,FALSE);
        !           219:                        when R_CONST:
        !           220:                                chg_abil(CON,-what->o_ac,FALSE);
        !           221:                        when R_SEEINVIS:
        !           222:                                player.t_flags &= ~CANSEE;
        !           223:                                extinguish(unsee);
        !           224:                                light(&hero);
        !           225:                                mvwaddch(cw, hero.y, hero.x, PLAYER);
        !           226:                }
        !           227:        }
        !           228: }
        !           229:
        !           230:
        !           231: /*
        !           232:  * gethand:
        !           233:  *     Get a hand to wear a ring
        !           234:  */
        !           235: int
        !           236: gethand(bool isrmv)
        !           237: {
        !           238:        reg int c;
        !           239:        char *ptr;
        !           240:        struct object *obj;
        !           241:
        !           242:        while(1) {
        !           243:                addmsg("Left or Right ring");
        !           244:                if (isrmv)
        !           245:                        addmsg(starlist);
        !           246:                addmsg("? ");
        !           247:                endmsg();
        !           248:                c = readchar();
        !           249:                if (isupper(c))
        !           250:                        c = tolower(c);
        !           251:                if (c == '*' && isrmv) {
        !           252:                        wclear(hw);
        !           253:                        obj = cur_ring[LEFT];
        !           254:                        if (obj != NULL)
        !           255:                                ptr = inv_name(obj, TRUE);
        !           256:                        else
        !           257:                                ptr = "none";
        !           258:                        wprintw(hw, "L)  %s\n\r",ptr);
        !           259:                        obj = cur_ring[RIGHT];
        !           260:                        if (obj != NULL)
        !           261:                                ptr = inv_name(obj, TRUE);
        !           262:                        else
        !           263:                                ptr = "none";
        !           264:                        wprintw(hw, "R)  %s\n\r", ptr);
        !           265:                        wprintw(hw, "\n\r\nWhich hand? ");
        !           266:                        draw(hw);
        !           267:                        c = readchar();
        !           268:                        if (isupper(c))
        !           269:                                c = tolower(c);
        !           270:                        restscr(cw);
        !           271:                }
        !           272:                if (c == 'l')
        !           273:                        return LEFT;
        !           274:                else if (c == 'r')
        !           275:                        return RIGHT;
        !           276:                else if (c == ESCAPE)
        !           277:                        return -1;
        !           278:                mpos = 0;
        !           279:                msg("L or R");
        !           280:        }
        !           281: }
        !           282:
        !           283: /*
        !           284:  * ring_eat:
        !           285:  *     How much food do the hero's rings use up?
        !           286:  */
        !           287: int
        !           288: ring_eat(void)
        !           289: {
        !           290:        reg struct object *lb;
        !           291:        reg int hand, i, howmuch;
        !           292:        bool addit;
        !           293:
        !           294:        howmuch = 0;
        !           295:        addit = TRUE;
        !           296:        for (i = LEFT; i <= RIGHT ; i += 1) {
        !           297:                lb = cur_ring[i];
        !           298:                if (lb != NULL) {
        !           299:                        switch (lb->o_which) {
        !           300:                                case R_REGEN:
        !           301:                                case R_GIANT:
        !           302:                                        howmuch += 2;
        !           303:                                when R_SPEED:
        !           304:                                case R_SUSTSTR:
        !           305:                                case R_SUSAB:
        !           306:                                        howmuch += 1;
        !           307:                                when R_SEARCH:
        !           308:                                        howmuch += (rnd(100) < 33);
        !           309:                                when R_DIGEST:
        !           310:                                        switch(lb->o_ac) {
        !           311:                                                case -3: if (rnd(100) < 25)
        !           312:                                                                        howmuch += 3;
        !           313:                                                when -2: if (rnd(100) < 50)
        !           314:                                                                        howmuch += 2;
        !           315:                                                when -1: howmuch += 1;
        !           316:                                                when  0: howmuch -= (rnd(100) < 50);
        !           317:                                                when  3: if (rnd(100) < 25)
        !           318:                                                                        howmuch -= 3;
        !           319:                                                when  2: if (rnd(100) < 50)
        !           320:                                                                        howmuch -= 2;
        !           321:                                                default: howmuch -= 1;
        !           322:                                        }
        !           323:                                otherwise:
        !           324:                                        addit = FALSE;
        !           325:                        }
        !           326:                        if (addit) {
        !           327:                                if (o_on(lb, ISBLESS))
        !           328:                                        howmuch -= 1;
        !           329:                                else if (o_on(lb, ISCURSED))
        !           330:                                        howmuch += 1;
        !           331:                        }
        !           332:                }
        !           333:        }
        !           334:        return howmuch;
        !           335: }
        !           336:
        !           337:
        !           338: /*
        !           339:  * ring_num:
        !           340:  *     Print ring bonuses
        !           341:  */
        !           342: char *
        !           343: ring_num(struct object *what)
        !           344: {
        !           345:        static char number[5];
        !           346:
        !           347:        number[0] = '\0';
        !           348:        if (o_on(what,ISKNOW) || o_on(what,ISPOST)) {
        !           349:                if (magring(what)) {    /* only rings with numbers */
        !           350:                        number[0] = ' ';
        !           351:                        strcpy(&number[1], num(what->o_ac, 0));
        !           352:                }
        !           353:        }
        !           354:        return number;
        !           355: }
        !           356:
        !           357:
        !           358: /*
        !           359:  * magring:
        !           360:  *     Returns TRUE if a ring has a number, i.e. +2
        !           361:  */
        !           362: bool
        !           363: magring(struct object *what)
        !           364: {
        !           365:        switch(what->o_which) {
        !           366:                case R_SPEED:
        !           367:                case R_ADDSTR:
        !           368:                case R_PROTECT:
        !           369:                case R_ADDHIT:
        !           370:                case R_ADDDAM:
        !           371:                case R_DIGEST:
        !           372:                case R_CONST:
        !           373:                case R_KNOW:
        !           374:                case R_DEX:
        !           375:                        return TRUE;
        !           376:                default:
        !           377:                        return FALSE;
        !           378:        }
        !           379: }
        !           380:
        !           381:
        !           382: /*
        !           383:  * ringabil:
        !           384:  *     Compute effective abilities due to rings
        !           385:  */
        !           386: void
        !           387: ringabil(void)
        !           388: {
        !           389:        reg struct object *rptr;
        !           390:        reg int i;
        !           391:
        !           392:        for(i = LEFT; i <= RIGHT; i++) {
        !           393:                rptr = cur_ring[i];
        !           394:                if (rptr != NULL) {
        !           395:                        switch(rptr->o_which) {
        !           396:                                case R_ADDSTR:
        !           397:                                        chg_abil(STR,rptr->o_ac,FROMRING);
        !           398:                                when R_DEX:
        !           399:                                        chg_abil(DEX,rptr->o_ac,FROMRING);
        !           400:                                when R_KNOW:
        !           401:                                        chg_abil(WIS,rptr->o_ac,FROMRING);
        !           402:                                when R_CONST:
        !           403:                                        chg_abil(CON,rptr->o_ac,FROMRING);
        !           404:                        }
        !           405:                }
        !           406:        }
        !           407: }
        !           408:
        !           409:
        !           410: /*
        !           411:  * init_ring:
        !           412:  *     Initialize a ring
        !           413:  */
        !           414: void
        !           415: init_ring(struct object *what, bool fromwiz)
        !           416: {
        !           417:        /* fromwiz: TRUE when from wizards */
        !           418:        reg int much;
        !           419:
        !           420:        switch (what->o_which) {
        !           421:                case R_DIGEST:          /* -3 to +3 rings */
        !           422:                case R_ADDSTR:
        !           423:                case R_PROTECT:
        !           424:                case R_ADDHIT:
        !           425:                case R_ADDDAM:
        !           426:                case R_DEX:
        !           427:                case R_KNOW:
        !           428:                case R_CONST:
        !           429:                        if (fromwiz) {
        !           430:                                much = getbless();              /* get wizards response */
        !           431:                        }
        !           432:                        else {                                          /* normal users */
        !           433:                                if (rnd(100) < 25)
        !           434:                                        much = -rnd(3) - 1;
        !           435:                                else
        !           436:                                        much = rnd(3) + 1;
        !           437:                        }
        !           438:                        what->o_ac = much;
        !           439:                        if (much < 0)
        !           440:                                setoflg(what,ISCURSED);
        !           441:                when R_SPEED:
        !           442:                        what->o_ac = rnd(4) + 1;
        !           443:                when R_AGGR:
        !           444:                case R_DELUS:
        !           445:                case R_HEAVY:
        !           446:                case R_BLIND:
        !           447:                case R_SLOW:
        !           448:                case R_SAPEM:
        !           449:                case R_TELEPORT:
        !           450:                        what->o_ac = 0;
        !           451:                        setoflg(what,ISCURSED);
        !           452:                when R_GIANT:
        !           453:                        what->o_ac = 25;                /* lots !! of STR */
        !           454:                otherwise:
        !           455:                        what->o_ac = 1;
        !           456:        }
        !           457:        what->o_type = RING;
        !           458:        what->o_weight = things[TYP_RING].mi_wght;
        !           459:        what->o_typname = things[TYP_RING].mi_name;
        !           460:        what->o_vol = itemvol(what);
        !           461: }
        !           462:
        !           463: /*
        !           464:  * ringex:
        !           465:  *     Get extra gains from rings
        !           466:  */
        !           467: int
        !           468: ringex(int rtype)
        !           469: {
        !           470:        reg int howmuch = 0;
        !           471:
        !           472:        if (isring(LEFT, rtype))
        !           473:                howmuch += cur_ring[LEFT]->o_ac;
        !           474:        if (isring(RIGHT, rtype))
        !           475:                howmuch += cur_ring[RIGHT]->o_ac;
        !           476:        return howmuch;
        !           477: }
        !           478:
        !           479: /*
        !           480:  * iswearing:
        !           481:  *     Returns TRUE when the hero is wearing a certain type of ring
        !           482:  */
        !           483: bool
        !           484: iswearing(int ring)
        !           485: {
        !           486:        return (isring(LEFT,ring) || isring(RIGHT,ring));
        !           487: }
        !           488:
        !           489: /*
        !           490:  * isring:
        !           491:  *     Returns TRUE if a ring is on a hand
        !           492:  */
        !           493: bool
        !           494: isring(int hand, int ring)
        !           495: {
        !           496:        if (cur_ring[hand] != NULL && cur_ring[hand]->o_which == ring)
        !           497:                return TRUE;
        !           498:        return FALSE;
        !           499: }

CVSweb