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

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

1.1     ! rubenllo    1: /*
        !             2:  * Hero movement commands
        !             3:  *
        !             4:  * @(#)move.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 <string.h>
        !            18: #include <ctype.h>
        !            19: #include "rogue.h"
        !            20: #include "rogue.ext"
        !            21:
        !            22: /*
        !            23:  * Used to hold the new hero position
        !            24:  */
        !            25:
        !            26: struct coord nh;
        !            27:
        !            28: /*
        !            29:  * do_run:
        !            30:  *     Start the hero running
        !            31:  */
        !            32:
        !            33: void
        !            34: do_run(char ch)
        !            35: {
        !            36:        running = TRUE;
        !            37:        after = FALSE;
        !            38:        runch = ch;
        !            39: }
        !            40:
        !            41: /*
        !            42:  * do_move:
        !            43:  *     Check to see that a move is legal.  If it is handle the
        !            44:  *     consequences (fighting, picking up, etc.)
        !            45:  */
        !            46:
        !            47: void
        !            48: do_move(int dy, int dx)
        !            49: {
        !            50:        reg int ch;
        !            51:        reg struct room *rp;
        !            52:
        !            53:        firstmove = FALSE;
        !            54:        curprice = -1;
        !            55:        inpool = FALSE;
        !            56:
        !            57:        if (player.t_nomove > 0) {
        !            58:                player.t_nomove -= 1;
        !            59:                msg("You are still stuck in the bear trap.");
        !            60:                return;
        !            61:        }
        !            62:        /*
        !            63:         * Do a confused move (maybe)
        !            64:         */
        !            65:        if ((rnd(100) < 80 && pl_on(ISHUH)) ||
        !            66:          (iswearing(R_DELUS) && rnd(100) < 25))
        !            67:                nh = *rndmove(&player);
        !            68:        else {
        !            69:                nh.y = hero.y + dy;
        !            70:                nh.x = hero.x + dx;
        !            71:        }
        !            72:        /*
        !            73:         * Check if he tried to move off the screen or make
        !            74:         *  an illegal diagonal move, and stop him if he did.
        !            75:         */
        !            76:        if (!cordok(nh.y, nh.x) ||
        !            77:          (pl_off(ISETHER) && !diag_ok(&hero, &nh))) {
        !            78:                after = running = FALSE;
        !            79:                return;
        !            80:        }
        !            81:        if (running) {
        !            82:                ch = winat(nh.y, nh.x);
        !            83:                if (dead_end(ch)) {
        !            84:                        reg int gox, goy, apsg, whichway;
        !            85:
        !            86:                        gox = goy = apsg = 0;
        !            87:                        if (dy == 0) {
        !            88:                                ch = show(hero.y+1,hero.x);
        !            89:                                if (ch == PASSAGE) {
        !            90:                                        apsg += 1;
        !            91:                                        goy = 1;
        !            92:                                }
        !            93:                                ch = show(hero.y-1,hero.x);
        !            94:                                if (ch == PASSAGE) {
        !            95:                                        apsg += 1;
        !            96:                                        goy = -1;
        !            97:                                }
        !            98:                        }
        !            99:                        else if (dx == 0) {
        !           100:                                ch = show(hero.y,hero.x+1);
        !           101:                                if (ch == PASSAGE) {
        !           102:                                        gox = 1;
        !           103:                                        apsg += 1;
        !           104:                                }
        !           105:                                ch = show(hero.y,hero.x-1);
        !           106:                                if (ch == PASSAGE) {
        !           107:                                        gox = -1;
        !           108:                                        apsg += 1;
        !           109:                                }
        !           110:                        }
        !           111:                        if (apsg != 1) {
        !           112:                                running = after = FALSE;
        !           113:                                return;
        !           114:                        }
        !           115:                        else {                  /* can still run here */
        !           116:                                nh.y = hero.y + goy;
        !           117:                                nh.x = hero.x + gox;
        !           118:                                whichway = (goy + 1) * 3 + gox + 1;
        !           119:                                switch(whichway) {
        !           120:                                        case 0: runch = 'y';
        !           121:                                        when 1: runch = 'k';
        !           122:                                        when 2: runch = 'u';
        !           123:                                        when 3: runch = 'h';
        !           124:                                        when 4: runch = '.';    /* shouldn't do */
        !           125:                                        when 5: runch = 'l';
        !           126:                                        when 6: runch = 'b';
        !           127:                                        when 7: runch = 'j';
        !           128:                                        when 8: runch = 'n';
        !           129:                                }
        !           130:                        }
        !           131:                }
        !           132:        }
        !           133:        if (running && ce(hero, nh))
        !           134:                after = running = FALSE;
        !           135:        ch = winat(nh.y, nh.x);
        !           136:        if (pl_on(ISHELD) && ch != 'F' && ch != 'd') {
        !           137:                msg("You are being held.");
        !           138:                return;
        !           139:        }
        !           140:        if (pl_off(ISETHER)) {
        !           141:                if (isatrap(ch)) {
        !           142:                        ch = be_trapped(&nh, &player);
        !           143:                        if (nlmove) {
        !           144:                                nlmove = FALSE;
        !           145:                                return;
        !           146:                        }
        !           147:                        else if (ch == POOL)
        !           148:                                inpool = TRUE;
        !           149:                }
        !           150:                else if (dead_end(ch)) {
        !           151:                        after = running = FALSE;
        !           152:                        return;
        !           153:                }
        !           154:                else {
        !           155:                        switch(ch) {
        !           156:                                case GOLD:      case POTION:    case SCROLL:
        !           157:                                case FOOD:      case WEAPON:    case ARMOR:
        !           158:                                case RING:      case AMULET:    case STICK:
        !           159:                                        running = FALSE;
        !           160:                                        take = ch;
        !           161:                                default:
        !           162:                                        if (illeg_ch(ch)) {
        !           163:                                                running = FALSE;
        !           164:                                                mvaddch(nh.y, nh.x, FLOOR);
        !           165:                                                teleport(rndspot, &player);
        !           166:                                                light(&nh);
        !           167:                                                msg("The spatial warp disappears !");
        !           168:                                                return;
        !           169:                                        }
        !           170:                        }
        !           171:                }
        !           172:        }
        !           173:        rp = roomin(&nh);
        !           174:        if (ch == DOOR) {               /* just stepped on a door */
        !           175:                running = FALSE;
        !           176:                if (rp != NULL && rf_on(rp, ISTREAS)) {
        !           177:                        struct linked_list *item;
        !           178:                        struct thing *tp;
        !           179:
        !           180:                        for (item = mlist; item != NULL; item = next(item)) {
        !           181:                                tp = THINGPTR(item);
        !           182:                                if (tp->t_room == rp)
        !           183:                                        runto(&tp->t_pos, &hero);
        !           184:                        }
        !           185:                }
        !           186:        }
        !           187:        else if (ch == STAIRS && pl_off(ISETHER))
        !           188:                running = FALSE;
        !           189:        else if (isalpha(ch) && pl_off(ISETHER)) {
        !           190:                running = FALSE;
        !           191:                fight(&nh, cur_weapon, FALSE);
        !           192:                return;
        !           193:        }
        !           194:        if (rp == NULL && player.t_room != NULL)
        !           195:                light(&hero);           /* exiting a room */
        !           196:        else if (rp != NULL && player.t_room == NULL)
        !           197:                light(&nh);                     /* just entering a room */
        !           198:        if (pl_on(ISBLIND))
        !           199:                ch = ' ';
        !           200:        else
        !           201:                ch = player.t_oldch;
        !           202:        mvwaddch(cw, hero.y, hero.x, ch);
        !           203:        mvwaddch(cw, nh.y, nh.x, PLAYER);
        !           204:        hero = nh;
        !           205:        player.t_room = rp;
        !           206:        player.t_oldch = mvinch(hero.y, hero.x);
        !           207: }
        !           208:
        !           209: /*
        !           210:  * Called to illuminate a room.
        !           211:  * If it is dark, remove anything that might move.
        !           212:  */
        !           213: void
        !           214: light(struct coord *cp)
        !           215: {
        !           216:        reg struct room *rp;
        !           217:        reg int j, k, x, y;
        !           218:        reg char ch, rch;
        !           219:        reg struct linked_list *item;
        !           220:
        !           221:        rp = roomin(cp);
        !           222:        if (rp == NULL)
        !           223:                return;
        !           224:        if (pl_on(ISBLIND)) {
        !           225:                for (j = 0; j < rp->r_max.y; j += 1) {
        !           226:                        for (k = 0; k < rp->r_max.x; k += 1) {
        !           227:                                y = rp->r_pos.y + j;
        !           228:                                x = rp->r_pos.x + k;
        !           229:                                mvwaddch(cw, y, x, ' ');
        !           230:                        }
        !           231:                }
        !           232:                look(FALSE);
        !           233:                return;
        !           234:        }
        !           235:        if (iswearing(R_LIGHT))
        !           236:                rp->r_flags &= ~ISDARK;
        !           237:        for (j = 0; j < rp->r_max.y; j += 1) {
        !           238:                for (k = 0; k < rp->r_max.x; k += 1) {
        !           239:                        y = rp->r_pos.y + j;
        !           240:                        x = rp->r_pos.x + k;
        !           241:                        if (levtype == MAZELEV && !cansee(y, x))
        !           242:                                continue;
        !           243:                        ch = show(y, x);
        !           244:                        wmove(cw, y, x);
        !           245:                        /*
        !           246:                         * Figure out how to display a secret door
        !           247:                         */
        !           248:                        if (ch == SECRETDOOR) {
        !           249:                                if (j == 0 || j == rp->r_max.y - 1)
        !           250:                                        ch = '-';
        !           251:                                else
        !           252:                                        ch = '|';
        !           253:                        }
        !           254:                        if (isalpha(ch)) {
        !           255:                                struct thing *mit;
        !           256:
        !           257:                                item = wake_monster(y, x);
        !           258:                                if (item == NULL) {
        !           259:                                        ch = FLOOR;
        !           260:                                        mvaddch(y, x, ch);
        !           261:                                }
        !           262:                                else {
        !           263:                                        mit = THINGPTR(item);
        !           264:                                        if (mit->t_oldch == ' ')
        !           265:                                                if (!rf_on(rp,ISDARK))
        !           266:                                                        mit->t_oldch = mvinch(y, x);
        !           267:                                        if (levtype == MAZELEV)
        !           268:                                                ch = mvinch(y, x);
        !           269:                                }
        !           270:                        }
        !           271:                        if (rf_on(rp,ISDARK)) {
        !           272:                                rch = mvwinch(cw, y, x);
        !           273:                                if (isatrap(rch)) {
        !           274:                                        ch = rch;                       /* if its a trap */
        !           275:                                }
        !           276:                                else {                                  /* try other things */
        !           277:                                        switch (rch) {
        !           278:                                                case DOOR:      case STAIRS:    case '|':
        !           279:                                                case '-':
        !           280:                                                        ch = rch;
        !           281:                                                otherwise:
        !           282:                                                        ch = ' ';
        !           283:                                        }
        !           284:                                }
        !           285:                        }
        !           286:                        mvwaddch(cw, y, x, ch);
        !           287:                }
        !           288:        }
        !           289: }
        !           290:
        !           291: /*
        !           292:  * show:
        !           293:  *     returns what a certain thing will display as to the un-initiated
        !           294:  */
        !           295: char
        !           296: show(int y, int x)
        !           297: {
        !           298:        reg char ch = winat(y, x);
        !           299:        reg struct linked_list *it;
        !           300:        reg struct thing *tp;
        !           301:        reg struct trap *ta;
        !           302:
        !           303:        if (isatrap(ch)) {
        !           304:                if ((ta = trap_at(y, x)) == NULL)
        !           305:                        return FLOOR;
        !           306:                if (iswearing(R_FTRAPS))
        !           307:                        ta->tr_flags |= ISFOUND;
        !           308:                return ((ta->tr_flags & ISFOUND) ? ta->tr_type : FLOOR);
        !           309:        }
        !           310:        if (ch == SECRETDOOR && iswearing(R_FTRAPS)) {
        !           311:                mvaddch(y,x,DOOR);
        !           312:                return DOOR;
        !           313:        }
        !           314:        if ((it = find_mons(y, x)) != NULL) {   /* maybe a monster */
        !           315:                tp = THINGPTR(it);
        !           316:                if (ch == 'M' || (tp->t_flags & ISINVIS)) {
        !           317:                        if (ch == 'M')
        !           318:                                ch = tp->t_disguise;
        !           319:                        else if (pl_off(CANSEE)) {
        !           320:                                if (ch == 's')
        !           321:                                        ch = ' ';               /* shadows show as a blank */
        !           322:                                else
        !           323:                                        ch = mvinch(y, x);      /* hide invisibles */
        !           324:                        }
        !           325:                }
        !           326:        }
        !           327:        return ch;
        !           328: }
        !           329:
        !           330: /*
        !           331:  * be_trapped:
        !           332:  *     Hero or monster stepped on a trap.
        !           333:  */
        !           334: int
        !           335: be_trapped(struct coord *tc, struct thing *th)
        !           336: {
        !           337:        reg struct trap *trp;
        !           338:        reg int ch, ishero;
        !           339:        struct linked_list *mon;
        !           340:        char stuckee[35], seeit, sayso;
        !           341:
        !           342:        if ((trp = trap_at(tc->y, tc->x)) == NULL)
        !           343:                return 0;
        !           344:        ishero = (th == &player);
        !           345:        if (ishero) {
        !           346:                strcpy(stuckee, "You");
        !           347:                count = running = FALSE;
        !           348:        }
        !           349:        else {
        !           350:                sprintf(stuckee, "The %s", monsters[th->t_indx].m_name);
        !           351:        }
        !           352:        seeit = cansee(tc->y, tc->x);
        !           353:        if (seeit)
        !           354:                mvwaddch(cw, tc->y, tc->x, trp->tr_type);
        !           355:        trp->tr_flags |= ISFOUND;
        !           356:        sayso = TRUE;
        !           357:        switch (ch = trp->tr_type) {
        !           358:                case POST:
        !           359:                        if (ishero) {
        !           360:                                nlmove = TRUE;
        !           361:                                new_level(POSTLEV);
        !           362:                        }
        !           363:                        else
        !           364:                                goto goner;
        !           365:                when MAZETRAP:
        !           366:                        if (ishero) {
        !           367:                                nlmove = TRUE;
        !           368:                                level += 1;
        !           369:                                new_level(MAZELEV);
        !           370:                                msg("You are surrounded by twisty passages!");
        !           371:                        }
        !           372:                        else
        !           373:                                goto goner;
        !           374:                when TELTRAP:
        !           375:                        nlmove = TRUE;
        !           376:                        teleport(trp->tr_goto, th);
        !           377:                when TRAPDOOR:
        !           378:                        if (ishero) {
        !           379:                                level += 1;
        !           380:                                new_level(NORMLEV);
        !           381:                        }
        !           382:                        else {          /* monsters get lost */
        !           383: goner:
        !           384:                                ch = GONER;
        !           385:                        }
        !           386:                        nlmove = TRUE;
        !           387:                        if (seeit && sayso)
        !           388:                                msg("%s fell into a trap!", stuckee);
        !           389:                when BEARTRAP:
        !           390:                        th->t_nomove += BEARTIME;
        !           391:                        if (seeit) {
        !           392:                                strcat(stuckee, (ishero ? " are" : " is"));
        !           393:                                msg("%s caught in a bear trap.", stuckee);
        !           394:                        }
        !           395:                when SLEEPTRAP:
        !           396:                        if (ishero && pl_on(ISINVINC))
        !           397:                                msg("You feel momentarily dizzy.");
        !           398:                        else {
        !           399:                                if (ishero)
        !           400:                                        th->t_nocmd += SLEEPTIME;
        !           401:                                else
        !           402:                                        th->t_nomove += SLEEPTIME;
        !           403:                                if (seeit)
        !           404:                                        msg("%s fall%s asleep in a strange white mist.",
        !           405:                                          stuckee, (ishero ? "":"s"));
        !           406:                        }
        !           407:                when ARROWTRAP: {
        !           408:                        int resist, ac;
        !           409:                        struct stats *it;
        !           410:
        !           411:                        stuckee[0] = tolower(stuckee[0]);
        !           412:                        it = &th->t_stats;
        !           413:                        if (ishero && cur_armor != NULL)
        !           414:                                ac = cur_armor->o_ac;
        !           415:                        else
        !           416:                                ac = it->s_arm;
        !           417:                        resist = ac + getpdex(it, FALSE);
        !           418:                        if (ishero && pl_on(ISINVINC))
        !           419:                                resist = -100;          /* invincible is impossible to hit */
        !           420:                        if (swing(3 + (level / 4), resist, 1)) {
        !           421:                                if (seeit)
        !           422:                                        msg("%sAn arrow shot %s.", (ishero ? "Oh no! " : ""),
        !           423:                                          stuckee);
        !           424:                                if (ishero)
        !           425:                                        chg_hpt(-roll(1,6),FALSE,K_ARROW);
        !           426:                                else {
        !           427:                                        it->s_hpt -= roll(1,6);
        !           428:                                        if (it->s_hpt < 1) {
        !           429:                                                sayso = FALSE;
        !           430:                                                goto goner;
        !           431:                                        }
        !           432:                                }
        !           433:                        }
        !           434:                        else {
        !           435:                                struct linked_list *item;
        !           436:                                struct object *arrow;
        !           437:
        !           438:                                if (seeit)
        !           439:                                        msg("An arrow shoots past %s.", stuckee);
        !           440:                                item = new_thing(FALSE, WEAPON, ARROW);
        !           441:                                arrow = OBJPTR(item);
        !           442:                                arrow->o_hplus = 3;
        !           443:                                arrow->o_dplus = rnd(2);
        !           444:                                arrow->o_count = 1;
        !           445:                                arrow->o_pos = th->t_pos;
        !           446:                                fall(item, FALSE);
        !           447:                        }
        !           448:                }
        !           449:                when DARTTRAP: {
        !           450:                        int resist, ac;
        !           451:                        struct stats *it;
        !           452:
        !           453:                        stuckee[0] = tolower(stuckee[0]);
        !           454:                        it = &th->t_stats;
        !           455:                        if (ishero && cur_armor != NULL)
        !           456:                                ac = cur_armor->o_ac;
        !           457:                        else
        !           458:                                ac = it->s_arm;
        !           459:                        resist = ac + getpdex(it, FALSE);
        !           460:                        if (ishero && pl_on(ISINVINC))
        !           461:                                resist = -100;          /* invincible is impossible to hit */
        !           462:                        if (swing(3 + (level / 4), resist, 0)) {
        !           463:                                if (seeit)
        !           464:                                        msg("A small dart just hit %s.", stuckee);
        !           465:                                if (ishero) {
        !           466:                                        if (!save(VS_POISON))
        !           467:                                                chg_abil(CON,-1,TRUE);
        !           468:                                        if (!iswearing(R_SUSTSTR))
        !           469:                                                chg_abil(STR,-1,TRUE);
        !           470:                                        chg_hpt(-roll(1, 4),FALSE,K_DART);
        !           471:                                }
        !           472:                                else {
        !           473:                                        if (!save_throw(VS_POISON, th))
        !           474:                                                it->s_ef.a_str -= 1;
        !           475:                                        it->s_hpt -= roll(1, 4);
        !           476:                                        if (it->s_hpt < 1) {
        !           477:                                                sayso = FALSE;
        !           478:                                                goto goner;
        !           479:                                        }
        !           480:                                }
        !           481:                        }
        !           482:                        else if (seeit)
        !           483:                                msg("A small dart whizzes by %s.", stuckee);
        !           484:                }
        !           485:            when POOL:
        !           486:                        if (!ishero && rnd(100) < 10) {
        !           487:                                if (seeit)
        !           488:                                        msg("The %s drowns !!", stuckee);
        !           489:                                goto goner;
        !           490:                        }
        !           491:                        if ((trp->tr_flags & ISGONE) && rnd(100) < 10) {
        !           492:                                nlmove = TRUE;
        !           493:                                if (rnd(100) < 15)
        !           494:                                        teleport(rndspot, th);     /* teleport away */
        !           495:                                else if(rnd(100) < 15 && level > 2) {
        !           496:                                        level -= rnd(2) + 1;
        !           497:                                        new_level(NORMLEV);
        !           498:                                        msg("You here a faint groan from below.");
        !           499:                                }
        !           500:                                else if(rnd(100) < 40) {
        !           501:                                        level += rnd(4);
        !           502:                                        new_level(NORMLEV);
        !           503:                                        msg("You find yourself in strange surroundings.");
        !           504:                                }
        !           505:                                else if(rnd(100) < 6 && pl_off(ISINVINC)) {
        !           506:                                        msg("Oh no!!! You drown in the pool!!! --More--");
        !           507:                                        wait_for(cw, ' ');
        !           508:                                        death(K_POOL);
        !           509:                                }
        !           510:                                else
        !           511:                                         nlmove = FALSE;
        !           512:                }
        !           513:        }
        !           514:        flushinp();             /* flush typeahead */
        !           515:        return ch;
        !           516: }
        !           517:
        !           518: /*
        !           519:  * dip_it:
        !           520:  *     Dip an object into a magic pool
        !           521:  */
        !           522: void
        !           523: dip_it(void)
        !           524: {
        !           525:        reg struct linked_list *what;
        !           526:        reg struct object *ob;
        !           527:        reg struct trap *tp;
        !           528:        reg int wh;
        !           529:
        !           530:        tp = trap_at(hero.y,hero.x);
        !           531:        if (tp == NULL || inpool == FALSE || (tp->tr_flags & ISGONE))
        !           532:                return;
        !           533:
        !           534:        if ((what = get_item("dip",0)) == NULL)
        !           535:                return;
        !           536:        ob = OBJPTR(what);
        !           537:        mpos = 0;
        !           538:        /*
        !           539:         * If hero is trying to dip an object OTHER than his
        !           540:         * current weapon, make sure that he could drop his
        !           541:         * current weapon
        !           542:         */
        !           543:        if (ob != cur_weapon) {
        !           544:                if (cur_weapon != NULL && o_on(cur_weapon, ISCURSED)) {
        !           545:                        msg("You are unable to release your weapon.");
        !           546:                        after = FALSE;
        !           547:                        return;
        !           548:                }
        !           549:        }
        !           550:        if (ob == cur_armor) {
        !           551:                msg("You have to take off your armor before you can dip it.");
        !           552:                after = FALSE;
        !           553:                return;
        !           554:        }
        !           555:        else if (ob == cur_ring[LEFT] || ob == cur_ring[RIGHT]) {
        !           556:                msg("You have to take that ring off before you can dip it.");
        !           557:                after = FALSE;
        !           558:                return;
        !           559:        }
        !           560:        wh = ob->o_which;
        !           561:        tp->tr_flags |= ISGONE;
        !           562:        if (ob != NULL && o_off(ob,ISPROT)) {
        !           563:                setoflg(ob,ISKNOW);
        !           564:                switch(ob->o_type) {
        !           565:                case WEAPON:
        !           566:                        if(rnd(100) < 20) {             /* enchant weapon here */
        !           567:                                if (o_off(ob,ISCURSED)) {
        !           568:                                        ob->o_hplus += 1;
        !           569:                                        ob->o_dplus += 1;
        !           570:                                }
        !           571:                                else {          /* weapon was prev cursed here */
        !           572:                                        ob->o_hplus = rnd(2);
        !           573:                                        ob->o_dplus = rnd(2);
        !           574:                                }
        !           575:                                resoflg(ob,ISCURSED);
        !           576:                        }
        !           577:                        else if(rnd(100) < 10) {        /* curse weapon here */
        !           578:                                if (o_off(ob,ISCURSED)) {
        !           579:                                        ob->o_hplus = -(rnd(2)+1);
        !           580:                                        ob->o_dplus = -(rnd(2)+1);
        !           581:                                }
        !           582:                                else {                  /* if already cursed */
        !           583:                                        ob->o_hplus--;
        !           584:                                        ob->o_dplus--;
        !           585:                                }
        !           586:                                setoflg(ob,ISCURSED);
        !           587:                        }
        !           588:                        msg("The %s glows for a moment.",w_magic[wh].mi_name);
        !           589:                when ARMOR:
        !           590:                        if (rnd(100) < 30) {                    /* enchant armor */
        !           591:                                if(o_off(ob,ISCURSED))
        !           592:                                        ob->o_ac -= rnd(2) + 1;
        !           593:                                else
        !           594:                                        ob->o_ac = -rnd(3)+ armors[wh].a_class;
        !           595:                                resoflg(ob,ISCURSED);
        !           596:                        }
        !           597:                        else if(rnd(100) < 15){                 /* curse armor */
        !           598:                                if (o_off(ob,ISCURSED))
        !           599:                                        ob->o_ac = rnd(3)+ armors[wh].a_class;
        !           600:                                else
        !           601:                                        ob->o_ac += rnd(2) + 1;
        !           602:                                setoflg(ob,ISCURSED);
        !           603:                        }
        !           604:                        msg("The %s glows for a moment.",a_magic[wh].mi_name);
        !           605:                when STICK: {
        !           606:                        int i;
        !           607:                        struct rod *rd;
        !           608:
        !           609:                        i = rnd(8) + 1;
        !           610:                        if(rnd(100) < 25)               /* add charges */
        !           611:                                ob->o_charges += i;
        !           612:                        else if(rnd(100) < 10) {        /* remove charges */
        !           613:                                if ((ob->o_charges -= i) < 0)
        !           614:                                        ob->o_charges = 0;
        !           615:                        }
        !           616:                        ws_know[wh] = TRUE;
        !           617:                        rd = &ws_stuff[wh];
        !           618:                        msg("The %s %s glows for a moment.",rd->ws_made,rd->ws_type);
        !           619:                }
        !           620:                when SCROLL:
        !           621:                        s_know[wh] = TRUE;
        !           622:                        msg("The '%s' scroll unfurls.",s_names[wh]);
        !           623:                when POTION:
        !           624:                        p_know[wh] = TRUE;
        !           625:                        msg("The %s potion bubbles for a moment.",p_colors[wh]);
        !           626:                when RING:
        !           627:                        r_know[wh] = TRUE;
        !           628:                        if (magring(ob)) {
        !           629:                                if(rnd(100) < 25) {                     /* enchant ring */
        !           630:                                        if (o_off(ob,ISCURSED))
        !           631:                                                ob->o_ac += rnd(2) + 1;
        !           632:                                        else
        !           633:                                                ob->o_ac = rnd(2) + 1;
        !           634:                                        resoflg(ob,ISCURSED);
        !           635:                                }
        !           636:                                else if(rnd(100) < 10) {         /* curse ring */
        !           637:                                        if (o_off(ob,ISCURSED))
        !           638:                                                ob->o_ac = -(rnd(2) + 1);
        !           639:                                        else
        !           640:                                                ob->o_ac -= (rnd(2) + 1);
        !           641:                                        setoflg(ob,ISCURSED);
        !           642:                                }
        !           643:                        }
        !           644:                        msg("The %s ring vibrates for a moment.",r_stones[wh]);
        !           645:                otherwise:
        !           646:                        msg("The pool bubbles for a moment.");
        !           647:                }
        !           648:        }
        !           649:        cur_weapon = ob;        /* hero has to weild item to dip it */
        !           650: }
        !           651:
        !           652:
        !           653: /*
        !           654:  * trap_at:
        !           655:  *     Find the trap at (y,x) on screen.
        !           656:  */
        !           657: struct trap *
        !           658: trap_at(int y, int x)
        !           659: {
        !           660:        reg struct trap *tp, *ep;
        !           661:
        !           662:        ep = &traps[ntraps];
        !           663:        for (tp = traps; tp < ep; tp += 1)
        !           664:                if (tp->tr_pos.y == y && tp->tr_pos.x == x)
        !           665:                        break;
        !           666:        if (tp >= ep)
        !           667:                tp = NULL;
        !           668:        return tp;
        !           669: }
        !           670:
        !           671: /*
        !           672:  * rndmove:
        !           673:  *     move in a random direction if the monster/person is confused
        !           674:  */
        !           675: struct coord *
        !           676: rndmove(struct thing *who)
        !           677: {
        !           678:        reg int x, y, ex, ey, ch;
        !           679:        int nopen = 0;
        !           680:        struct linked_list *item;
        !           681:        static struct coord ret;  /* what we will be returning */
        !           682:        static struct coord dest;
        !           683:
        !           684:        ret = who->t_pos;
        !           685:        /*
        !           686:         * Now go through the spaces surrounding the player and
        !           687:         * set that place in the array to true if the space can be
        !           688:         * moved into
        !           689:         */
        !           690:        ey = ret.y + 1;
        !           691:        ex = ret.x + 1;
        !           692:        for (y = who->t_pos.y - 1; y <= ey; y += 1) {
        !           693:                for (x = who->t_pos.x - 1; x <= ex; x += 1) {
        !           694:                        if (!cordok(y, x))
        !           695:                                continue;
        !           696:                        ch = winat(y, x);
        !           697:                        if (step_ok(ch)) {
        !           698:                                dest.y = y;
        !           699:                                dest.x = x;
        !           700:                                if (!diag_ok(&who->t_pos, &dest))
        !           701:                                        continue;
        !           702:                                if (ch == SCROLL && who != &player) {
        !           703:                                        /*
        !           704:                                         * check for scare monster scrolls
        !           705:                                         */
        !           706:                                        item = find_obj(y, x);
        !           707:                                        if (item != NULL && (OBJPTR(item))->o_which == S_SCARE)
        !           708:                                                continue;
        !           709:                                }
        !           710:                                if (rnd(++nopen) == 0)
        !           711:                                        ret = dest;
        !           712:                        }
        !           713:                }
        !           714:        }
        !           715:        return &ret;
        !           716: }
        !           717:
        !           718: /*
        !           719:  * isatrap:
        !           720:  *     Returns TRUE if this character is some kind of trap
        !           721:  */
        !           722: bool
        !           723: isatrap(char ch)
        !           724: {
        !           725:        switch(ch) {
        !           726:                case POST:
        !           727:                case DARTTRAP:
        !           728:                case POOL:
        !           729:                case TELTRAP:
        !           730:                case TRAPDOOR:
        !           731:                case ARROWTRAP:
        !           732:                case SLEEPTRAP:
        !           733:                case BEARTRAP:
        !           734:                case MAZETRAP:
        !           735:                        return TRUE;
        !           736:                default:
        !           737:                        return FALSE;
        !           738:        }
        !           739: }

CVSweb