[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

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