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

Annotation of early-roguelike/rogue3/misc.c, Revision 1.1

1.1     ! rubenllo    1: /*
        !             2:  * all sorts of miscellaneous routines
        !             3:  *
        !             4:  * @(#)misc.c  3.13 (Berkeley) 6/15/81
        !             5:  *
        !             6:  * Rogue: Exploring the Dungeons of Doom
        !             7:  * Copyright (C) 1980, 1981 Michael Toy, Ken Arnold and Glenn Wichman
        !             8:  * All rights reserved.
        !             9:  *
        !            10:  * See the file LICENSE.TXT for full copyright and licensing information.
        !            11:  */
        !            12:
        !            13: #include "curses.h"
        !            14: #include "rogue.h"
        !            15: #include <ctype.h>
        !            16:
        !            17: /*
        !            18:  * tr_name:
        !            19:  *     print the name of a trap
        !            20:  */
        !            21:
        !            22: char *
        !            23: tr_name(int ch)
        !            24: {
        !            25:     char *s = "";
        !            26:
        !            27:     switch (ch)
        !            28:     {
        !            29:        case TRAPDOOR:
        !            30:            s = terse ? "A trapdoor." : "You found a trapdoor.";
        !            31:        when BEARTRAP:
        !            32:            s = terse ? "A beartrap." : "You found a beartrap.";
        !            33:        when SLEEPTRAP:
        !            34:            s = terse ? "A sleeping gas trap.":"You found a sleeping gas trap.";
        !            35:        when ARROWTRAP:
        !            36:            s = terse ? "An arrow trap." : "You found an arrow trap.";
        !            37:        when TELTRAP:
        !            38:            s = terse ? "A teleport trap." : "You found a teleport trap.";
        !            39:        when DARTTRAP:
        !            40:            s = terse ? "A dart trap." : "You found a poison dart trap.";
        !            41:     }
        !            42:     return s;
        !            43: }
        !            44:
        !            45: /*
        !            46:  * Look:
        !            47:  *     A quick glance all around the player
        !            48:  */
        !            49:
        !            50: void
        !            51: look(int wakeup)
        !            52: {
        !            53:     int x, y;
        !            54:     int ch;
        !            55:     int oldx, oldy;
        !            56:     int inpass;
        !            57:     int passcount = 0;
        !            58:     struct room *rp;
        !            59:     int ey, ex;
        !            60:
        !            61:     getyx(cw, oldy, oldx);
        !            62:     if (oldrp != NULL && (oldrp->r_flags & ISDARK) && off(player, ISBLIND))
        !            63:     {
        !            64:        for (x = oldpos.x - 1; x <= oldpos.x + 1; x++)
        !            65:            for (y = oldpos.y - 1; y <= oldpos.y + 1; y++)
        !            66:                if ((y != hero.y || x != hero.x) && show(y, x) == FLOOR)
        !            67:                    mvwaddch(cw, y, x, ' ');
        !            68:     }
        !            69:     inpass = ((rp = roomin(&hero)) == NULL);
        !            70:     ey = hero.y + 1;
        !            71:     ex = hero.x + 1;
        !            72:     for (x = hero.x - 1; x <= ex; x++)
        !            73:        if (x >= 0 && x < COLS) for (y = hero.y - 1; y <= ey; y++)
        !            74:        {
        !            75:            if (y <= 0 || y >= LINES - 1)
        !            76:                continue;
        !            77:            if (isupper(mvwinch(mw, y, x)))
        !            78:            {
        !            79:                struct linked_list *it;
        !            80:                struct thing *tp;
        !            81:
        !            82:                if (wakeup)
        !            83:                    it = wake_monster(y, x);
        !            84:                else
        !            85:                    it = find_mons(y, x);
        !            86:                tp = (struct thing *) ldata(it);
        !            87:                if ((tp->t_oldch = mvinch(y, x)) == TRAP)
        !            88:                    tp->t_oldch =
        !            89:                        (trap_at(y,x)->tr_flags&ISFOUND) ? TRAP : FLOOR;
        !            90:                if (tp->t_oldch == FLOOR && (rp != NULL) && (rp->r_flags & ISDARK)
        !            91:                    && off(player, ISBLIND))
        !            92:                        tp->t_oldch = ' ';
        !            93:            }
        !            94:            /*
        !            95:             * Secret doors show as walls
        !            96:             */
        !            97:            if ((ch = show(y, x)) == SECRETDOOR)
        !            98:                ch = secretdoor(y, x);
        !            99:            /*
        !           100:             * Don't show room walls if he is in a passage
        !           101:             */
        !           102:            if (off(player, ISBLIND))
        !           103:            {
        !           104:                if (y == hero.y && x == hero.x
        !           105:                 || (inpass && (ch == '-' || ch == '|')))
        !           106:                        continue;
        !           107:            }
        !           108:            else if (y != hero.y || x != hero.x)
        !           109:                continue;
        !           110:            wmove(cw, y, x);
        !           111:            waddch(cw, ch);
        !           112:            if (door_stop && !firstmove && running)
        !           113:            {
        !           114:                switch (runch)
        !           115:                {
        !           116:                    case 'h':
        !           117:                        if (x == ex)
        !           118:                            continue;
        !           119:                    when 'j':
        !           120:                        if (y == hero.y - 1)
        !           121:                            continue;
        !           122:                    when 'k':
        !           123:                        if (y == ey)
        !           124:                            continue;
        !           125:                    when 'l':
        !           126:                        if (x == hero.x - 1)
        !           127:                            continue;
        !           128:                    when 'y':
        !           129:                        if ((x + y) - (hero.x + hero.y) >= 1)
        !           130:                            continue;
        !           131:                    when 'u':
        !           132:                        if ((y - x) - (hero.y - hero.x) >= 1)
        !           133:                            continue;
        !           134:                    when 'n':
        !           135:                        if ((x + y) - (hero.x + hero.y) <= -1)
        !           136:                            continue;
        !           137:                    when 'b':
        !           138:                        if ((y - x) - (hero.y - hero.x) <= -1)
        !           139:                            continue;
        !           140:                }
        !           141:                switch (ch)
        !           142:                {
        !           143:                    case DOOR:
        !           144:                        if (x == hero.x || y == hero.y)
        !           145:                            running = FALSE;
        !           146:                        break;
        !           147:                    case PASSAGE:
        !           148:                        if (x == hero.x || y == hero.y)
        !           149:                            passcount++;
        !           150:                        break;
        !           151:                    case FLOOR:
        !           152:                    case '|':
        !           153:                    case '-':
        !           154:                    case ' ':
        !           155:                        break;
        !           156:                    default:
        !           157:                        running = FALSE;
        !           158:                        break;
        !           159:                }
        !           160:            }
        !           161:        }
        !           162:     if (door_stop && !firstmove && passcount > 1)
        !           163:        running = FALSE;
        !           164:     mvwaddch(cw, hero.y, hero.x, PLAYER);
        !           165:     wmove(cw, oldy, oldx);
        !           166:     oldpos = hero;
        !           167:     oldrp = rp;
        !           168: }
        !           169:
        !           170: /*
        !           171:  * secret_door:
        !           172:  *     Figure out what a secret door looks like.
        !           173:  */
        !           174:
        !           175: int
        !           176: secretdoor(int y, int x)
        !           177: {
        !           178:     int i;
        !           179:     struct room *rp;
        !           180:     coord *cpp;
        !           181:     static coord cp;
        !           182:
        !           183:     cp.y = y;
        !           184:     cp.x = x;
        !           185:     cpp = &cp;
        !           186:     for (rp = rooms, i = 0; i < MAXROOMS; rp++, i++)
        !           187:        if (inroom(rp, cpp))
        !           188:            if (y == rp->r_pos.y || y == rp->r_pos.y + rp->r_max.y - 1)
        !           189:                return('-');
        !           190:            else
        !           191:                return('|');
        !           192:
        !           193:     return('p');
        !           194: }
        !           195:
        !           196: /*
        !           197:  * find_obj:
        !           198:  *     find the unclaimed object at y, x
        !           199:  */
        !           200:
        !           201: struct linked_list *
        !           202: find_obj(int y, int x)
        !           203: {
        !           204:     struct linked_list *obj;
        !           205:     struct object *op;
        !           206:
        !           207:     for (obj = lvl_obj; obj != NULL; obj = next(obj))
        !           208:     {
        !           209:        op = (struct object *) ldata(obj);
        !           210:        if (op->o_pos.y == y && op->o_pos.x == x)
        !           211:                return obj;
        !           212:     }
        !           213:     sprintf(prbuf, "Non-object %d,%d", y, x);
        !           214:     debug(prbuf);
        !           215:     return NULL;
        !           216: }
        !           217:
        !           218: /*
        !           219:  * eat:
        !           220:  *     She wants to eat something, so let her try
        !           221:  */
        !           222:
        !           223: void
        !           224: eat()
        !           225: {
        !           226:     struct linked_list *item;
        !           227:     struct object *obj;
        !           228:
        !           229:     if ((item = get_item("eat", FOOD)) == NULL)
        !           230:        return;
        !           231:     obj = (struct object *) ldata(item);
        !           232:     if (obj->o_type != FOOD)
        !           233:     {
        !           234:        if (!terse)
        !           235:            msg("Ugh, you would get ill if you ate that.");
        !           236:        else
        !           237:            msg("That's Inedible!");
        !           238:        return;
        !           239:     }
        !           240:     inpack--;
        !           241:     if (obj->o_which == 1)
        !           242:        msg("My, that was a yummy %s", fruit);
        !           243:     else
        !           244:        if (rnd(100) > 70)
        !           245:        {
        !           246:            msg("Yuk, this food tastes awful");
        !           247:            pstats.s_exp++;
        !           248:            check_level();
        !           249:        }
        !           250:        else
        !           251:            msg("Yum, that tasted good");
        !           252:     if ((food_left += HUNGERTIME + rnd(400) - 200) > STOMACHSIZE)
        !           253:        food_left = STOMACHSIZE;
        !           254:     hungry_state = 0;
        !           255:     if (obj == cur_weapon)
        !           256:        cur_weapon = NULL;
        !           257:     if (--obj->o_count < 1)
        !           258:     {
        !           259:        detach(pack, item);
        !           260:        discard(item);
        !           261:     }
        !           262: }
        !           263:
        !           264: /*
        !           265:  * Used to modify the playes strength
        !           266:  * it keeps track of the highest it has been, just in case
        !           267:  */
        !           268:
        !           269: void
        !           270: chg_str(int amt)
        !           271: {
        !           272:     if (amt == 0)
        !           273:        return;
        !           274:     if (amt > 0)
        !           275:     {
        !           276:        while (amt--)
        !           277:        {
        !           278:            if (pstats.s_str.st_str < 18)
        !           279:                pstats.s_str.st_str++;
        !           280:            else if (pstats.s_str.st_add == 0)
        !           281:                pstats.s_str.st_add = rnd(50) + 1;
        !           282:            else if (pstats.s_str.st_add <= 50)
        !           283:                pstats.s_str.st_add = 51 + rnd(24);
        !           284:            else if (pstats.s_str.st_add <= 75)
        !           285:                pstats.s_str.st_add = 76 + rnd(14);
        !           286:            else if (pstats.s_str.st_add <= 90)
        !           287:                pstats.s_str.st_add = 91;
        !           288:            else if (pstats.s_str.st_add < 100)
        !           289:                pstats.s_str.st_add++;
        !           290:        }
        !           291:        if (pstats.s_str.st_str > max_stats.s_str.st_str ||
        !           292:            (pstats.s_str.st_str == 18 &&
        !           293:             pstats.s_str.st_add > max_stats.s_str.st_add))
        !           294:                max_stats.s_str = pstats.s_str;
        !           295:     }
        !           296:     else
        !           297:     {
        !           298:        while (amt++)
        !           299:        {
        !           300:            if (pstats.s_str.st_str < 18 || pstats.s_str.st_add == 0)
        !           301:                pstats.s_str.st_str--;
        !           302:            else if (pstats.s_str.st_add < 51)
        !           303:                pstats.s_str.st_add = 0;
        !           304:            else if (pstats.s_str.st_add < 76)
        !           305:                pstats.s_str.st_add = 1 + rnd(50);
        !           306:            else if (pstats.s_str.st_add < 91)
        !           307:                pstats.s_str.st_add = 51 + rnd(25);
        !           308:            else if (pstats.s_str.st_add < 100)
        !           309:                pstats.s_str.st_add = 76 + rnd(14);
        !           310:            else
        !           311:                pstats.s_str.st_add = 91 + rnd(8);
        !           312:        }
        !           313:        if (pstats.s_str.st_str < 3)
        !           314:            pstats.s_str.st_str = 3;
        !           315:     }
        !           316: }
        !           317:
        !           318: /*
        !           319:  * add_haste:
        !           320:  *     add a haste to the player
        !           321:  */
        !           322:
        !           323: bool
        !           324: add_haste(int potion)
        !           325: {
        !           326:     if (on(player, ISHASTE))
        !           327:     {
        !           328:        msg("You faint from exhaustion.");
        !           329:        no_command += rnd(8);
        !           330:        player.t_flags &= ~ISHASTE;
        !           331:        extinguish(nohaste);
        !           332:        return FALSE;
        !           333:     }
        !           334:     else
        !           335:     {
        !           336:        player.t_flags |= ISHASTE;
        !           337:        if (potion)
        !           338:            fuse(nohaste, 0, rnd(4)+4, AFTER);
        !           339:        return TRUE;
        !           340:     }
        !           341: }
        !           342:
        !           343: /*
        !           344:  * aggravate:
        !           345:  *     aggravate all the monsters on this level
        !           346:  */
        !           347:
        !           348: void
        !           349: aggravate()
        !           350: {
        !           351:     struct linked_list *mi;
        !           352:
        !           353:     for (mi = mlist; mi != NULL; mi = next(mi))
        !           354:        runto(&((struct thing *) ldata(mi))->t_pos, &hero);
        !           355: }
        !           356:
        !           357: /*
        !           358:  * for printfs: if string starts with a vowel, return "n" for an "an"
        !           359:  */
        !           360: char *
        !           361: vowelstr(char *str)
        !           362: {
        !           363:     switch (*str)
        !           364:     {
        !           365:        case 'a':
        !           366:        case 'e':
        !           367:        case 'i':
        !           368:        case 'o':
        !           369:        case 'u':
        !           370:            return "n";
        !           371:        default:
        !           372:            return "";
        !           373:     }
        !           374: }
        !           375:
        !           376: /*
        !           377:  * see if the object is one of the currently used items
        !           378:  */
        !           379: int
        !           380: is_current(struct object *obj)
        !           381: {
        !           382:     if (obj == NULL)
        !           383:        return FALSE;
        !           384:     if (obj == cur_armor || obj == cur_weapon || obj == cur_ring[LEFT]
        !           385:        || obj == cur_ring[RIGHT])
        !           386:     {
        !           387:        msg(terse ? "In use." : "That's already in use.");
        !           388:        return TRUE;
        !           389:     }
        !           390:     return FALSE;
        !           391: }
        !           392:
        !           393: /*
        !           394:  * set up the direction co_ordinate for use in varios "prefix" commands
        !           395:  */
        !           396: int
        !           397: get_dir()
        !           398: {
        !           399:     char *prompt;
        !           400:     int gotit;
        !           401:
        !           402:     if (!terse)
        !           403:        msg(prompt = "Which direction? ");
        !           404:     else
        !           405:        prompt = "Direction: ";
        !           406:     do
        !           407:     {
        !           408:        gotit = TRUE;
        !           409:        switch (readchar(cw))
        !           410:        {
        !           411:            case 'h': case'H': delta.y =  0; delta.x = -1;
        !           412:            when 'j': case'J': delta.y =  1; delta.x =  0;
        !           413:            when 'k': case'K': delta.y = -1; delta.x =  0;
        !           414:            when 'l': case'L': delta.y =  0; delta.x =  1;
        !           415:            when 'y': case'Y': delta.y = -1; delta.x = -1;
        !           416:            when 'u': case'U': delta.y = -1; delta.x =  1;
        !           417:            when 'b': case'B': delta.y =  1; delta.x = -1;
        !           418:            when 'n': case'N': delta.y =  1; delta.x =  1;
        !           419:            when ESCAPE: return FALSE;
        !           420:            otherwise:
        !           421:                mpos = 0;
        !           422:                msg(prompt);
        !           423:                gotit = FALSE;
        !           424:        }
        !           425:     } until (gotit);
        !           426:     if (on(player, ISHUH) && rnd(100) > 80)
        !           427:        do
        !           428:        {
        !           429:            delta.y = rnd(3) - 1;
        !           430:            delta.x = rnd(3) - 1;
        !           431:        } while (delta.y == 0 && delta.x == 0);
        !           432:     mpos = 0;
        !           433:     return TRUE;
        !           434: }

CVSweb