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

Annotation of early-roguelike/srogue/misc.c, Revision 1.1.1.1

1.1       rubenllo    1: /*
                      2:  * all sorts of miscellaneous routines
                      3:  *
                      4:  * @(#)misc.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 "rogue.h"
                     18: #include <ctype.h>
                     19: #include "rogue.ext"
                     20:
                     21: /*
                     22:  * waste_time:
                     23:  *     Do nothing but let other things happen
                     24:  */
                     25: void
                     26: waste_time(void)
                     27: {
                     28:        if (inwhgt)             /* if from wghtchk, then done */
                     29:             return;
                     30:        do_daemons(BEFORE);
                     31:        do_daemons(AFTER);
                     32:        do_fuses();
                     33: }
                     34:
                     35: /*
                     36:  * getindex:
                     37:  *     Convert a type into an index for the things structures
                     38:  */
                     39: int
                     40: getindex(char what)
                     41: {
                     42:        int index = -1;
                     43:
                     44:        switch (what) {
                     45:                case POTION:    index = TYP_POTION;
                     46:                when SCROLL:    index = TYP_SCROLL;
                     47:                when FOOD:              index = TYP_FOOD;
                     48:                when RING:              index = TYP_RING;
                     49:                when AMULET:    index = TYP_AMULET;
                     50:                when ARMOR:             index = TYP_ARMOR;
                     51:                when WEAPON:    index = TYP_WEAPON;
                     52:                when STICK:             index = TYP_STICK;
                     53:        }
                     54:        return index;
                     55: }
                     56:
                     57: /*
                     58:  * tr_name:
                     59:  *     print the name of a trap
                     60:  */
                     61: char *
                     62: tr_name(char ch)
                     63: {
                     64:        reg char *s;
                     65:
                     66:        switch (ch) {
                     67:                case TRAPDOOR:
                     68:                        s = "A trapdoor.";
                     69:                when BEARTRAP:
                     70:                        s = "A beartrap.";
                     71:                when SLEEPTRAP:
                     72:                        s = "A sleeping gas trap.";
                     73:                when ARROWTRAP:
                     74:                        s = "An arrow trap.";
                     75:                when TELTRAP:
                     76:                        s = "A teleport trap.";
                     77:                when DARTTRAP:
                     78:                        s = "A dart trap.";
                     79:                when POOL:
                     80:                        s = "A magic pool.";
                     81:                when POST:
                     82:                        s = "A trading post.";
                     83:                when MAZETRAP:
                     84:                        s = "A maze trap.";
                     85:        otherwise:
                     86:                s = "A bottomless pit.";                /* shouldn't get here */
                     87:        }
                     88:        return s;
                     89: }
                     90:
                     91: /*
                     92:  * Look:
                     93:  *     A quick glance all around the player
                     94:  */
                     95: void
                     96: look(bool wakeup)
                     97: {
                     98:        reg char ch;
                     99:        reg int oldx, oldy, y, x;
                    100:        reg struct room *rp;
                    101:        int ey, ex, oex, oey;
                    102:        int passcount = 0;
                    103:        bool inpass, blind;
                    104:
                    105:        getyx(cw, oldy, oldx);
                    106:        oex = player.t_oldpos.x;
                    107:        oey = player.t_oldpos.y;
                    108:        blind = pl_on(ISBLIND);
                    109:        if ((oldrp != NULL && rf_on(oldrp,ISDARK)) || blind) {
                    110:                for (x = oex - 1; x <= oex + 1; x += 1)
                    111:                        for (y = oey - 1; y <= oey + 1; y += 1)
                    112:                                if ((y != hero.y || x != hero.x) && show(y, x) == FLOOR)
                    113:                                        mvwaddch(cw, y, x, ' ');
                    114:        }
                    115:        rp = player.t_room;
                    116:        inpass = (rp == NULL);                          /* TRUE when not in a room */
                    117:        ey = hero.y + 1;
                    118:        ex = hero.x + 1;
                    119:        for (x = hero.x - 1; x <= ex; x += 1) {
                    120:                if (x >= 0 && x <= COLS - 1) {
                    121:                        for (y = hero.y - 1; y <= ey; y += 1) {
                    122:                                if (y <= 0 || y >= LINES - 2)
                    123:                                        continue;
                    124:                                if (isalpha(mvwinch(mw, y, x))) {
                    125:                                        reg struct linked_list *it;
                    126:                                        reg struct thing *tp;
                    127:
                    128:                                        if (wakeup || (!inpass && rf_on(rp, ISTREAS)))
                    129:                                                it = wake_monster(y, x);
                    130:                                        else
                    131:                                                it = find_mons(y, x);
                    132:                                        if (it == NULL)                         /* lost monster */
                    133:                                                mvaddch(y, x, FLOOR);
                    134:                                        else {
                    135:                                                tp = THINGPTR(it);
                    136:                                                if (isatrap(tp->t_oldch = mvinch(y, x))) {
                    137:                                                        struct trap *trp;
                    138:
                    139:                                                        if ((trp = trap_at(y,x)) == NULL)
                    140:                                                                break;
                    141:                                                        if (trp->tr_flags & ISFOUND)
                    142:                                                                tp->t_oldch = trp->tr_type;
                    143:                                                        else
                    144:                                                                tp->t_oldch = FLOOR;
                    145:                                                }
                    146:                                                if (tp->t_oldch == FLOOR && rf_on(rp,ISDARK))
                    147:                                                        if (!blind)
                    148:                                                                tp->t_oldch = ' ';
                    149:                                        }
                    150:                                }
                    151:                                /*
                    152:                                 * Secret doors show as walls
                    153:                                 */
                    154:                                if ((ch = show(y, x)) == SECRETDOOR) {
                    155:                                        if (inpass || y == rp->r_pos.y || y == rp->r_pos.y + rp->r_max.y - 1)
                    156:                                                ch = '-';
                    157:                                        else
                    158:                                                ch = '|';
                    159:                                }
                    160:                                /*
                    161:                                 * Don't show room walls if he is in a passage
                    162:                                 */
                    163:                                if (!blind) {
                    164:                                        if ((y == hero.y && x == hero.x) || (inpass && (ch == '-' || ch == '|')))
                    165:                                                continue;
                    166:                                }
                    167:                                else
                    168:                                        ch = ' ';
                    169:                                wmove(cw, y, x);
                    170:                                waddch(cw, ch);
                    171:                                if (door_stop && !firstmove && running) {
                    172:                                        switch (runch) {
                    173:                                                case 'h':
                    174:                                                        if (x == ex)
                    175:                                                                continue;
                    176:                                                when 'j':
                    177:                                                        if (y == hero.y - 1)
                    178:                                                                continue;
                    179:                                                when 'k':
                    180:                                                        if (y == ey)
                    181:                                                                continue;
                    182:                                                when 'l':
                    183:                                                        if (x == hero.x - 1)
                    184:                                                                continue;
                    185:                                                when 'y':
                    186:                                                        if ((x + y) - (hero.x + hero.y) >= 1)
                    187:                                                                continue;
                    188:                                                when 'u':
                    189:                                                        if ((y - x) - (hero.y - hero.x) >= 1)
                    190:                                                                continue;
                    191:                                                when 'n':
                    192:                                                        if ((x + y) - (hero.x + hero.y) <= -1)
                    193:                                                                continue;
                    194:                                                when 'b':
                    195:                                                        if ((y - x) - (hero.y - hero.x) <= -1)
                    196:                                                                continue;
                    197:                                        }
                    198:                                        switch (ch) {
                    199:                                                case DOOR:
                    200:                                                        if (x == hero.x || y == hero.y)
                    201:                                                                running = FALSE;
                    202:                                                        break;
                    203:                                                case PASSAGE:
                    204:                                                        if (x == hero.x || y == hero.y)
                    205:                                                                passcount += 1;
                    206:                                                        break;
                    207:                                                case FLOOR:
                    208:                                                case '|':
                    209:                                                case '-':
                    210:                                                case ' ':
                    211:                                                        break;
                    212:                                                default:
                    213:                                                        running = FALSE;
                    214:                                                        break;
                    215:                                        }
                    216:                                }
                    217:                        }
                    218:                }
                    219:        }
                    220:        if (door_stop && !firstmove && passcount > 1)
                    221:                running = FALSE;
                    222:        mvwaddch(cw, hero.y, hero.x, PLAYER);
                    223:        wmove(cw, oldy, oldx);
                    224:        player.t_oldpos = hero;
                    225:        oldrp = rp;
                    226: }
                    227:
                    228: /*
                    229:  * find_obj:
                    230:  *     find the unclaimed object at y, x
                    231:  */
                    232: struct linked_list *
                    233: find_obj(int y, int x)
                    234: {
                    235:        reg struct linked_list *obj;
                    236:        reg struct object *op;
                    237:
                    238:        for (obj = lvl_obj; obj != NULL; obj = next(obj)) {
                    239:                op = OBJPTR(obj);
                    240:                if (op->o_pos.y == y && op->o_pos.x == x)
                    241:                        return obj;
                    242:        }
                    243:        return NULL;
                    244: }
                    245:
                    246: /*
                    247:  * eat:
                    248:  *     Let the hero eat some food.
                    249:  */
                    250: void
                    251: eat(void)
                    252: {
                    253:        reg struct linked_list *item;
                    254:        reg struct object *obj;
                    255:        reg int goodfood, cursed;
                    256:
                    257:        if ((item = get_item("eat", FOOD)) == NULL)
                    258:                return;
                    259:        obj = OBJPTR(item);
                    260:        if (obj->o_type != FOOD) {
                    261:                msg("That's Inedible!");
                    262:                after = FALSE;
                    263:                return;
                    264:        }
                    265:        cursed = 1;
                    266:        if (o_on(obj, ISCURSED))
                    267:                cursed += 1;
                    268:        else if (o_on(obj, ISBLESS))
                    269:                cursed -= 1;
                    270:        if (obj->o_which == FRUITFOOD) {
                    271:                msg("My, that was a yummy %s.", fruit);
                    272:                goodfood = 100;
                    273:        }
                    274:        else {
                    275:                if (rnd(100) > 80 || o_on(obj, ISCURSED)) {
                    276:                        msg("Yuk, this food tastes like ARA.");
                    277:                        goodfood = 300;
                    278:                        him->s_exp += 1;
                    279:                        check_level();
                    280:                }
                    281:                else {
                    282:                        msg("Yum, that tasted good.");
                    283:                        goodfood = 200;
                    284:                }
                    285:        }
                    286:        goodfood *= cursed;
                    287:        if ((food_left += HUNGERTIME + rnd(400) - goodfood) > STOMACHSIZE)
                    288:                food_left = STOMACHSIZE;
                    289:        hungry_state = F_OKAY;
                    290:        updpack();                                      /* update pack */
                    291:        if (obj == cur_weapon)
                    292:                cur_weapon = NULL;
                    293:        del_pack(item);         /* get rid of the food */
                    294: }
                    295:
                    296: /*
                    297:  * aggravate:
                    298:  *     aggravate all the monsters on this level
                    299:  */
                    300: void
                    301: aggravate(void)
                    302: {
                    303:        reg struct linked_list *mi;
                    304:
                    305:        for (mi = mlist; mi != NULL; mi = next(mi))
                    306:                runto(&(THINGPTR(mi))->t_pos, &hero);
                    307: }
                    308:
                    309: /*
                    310:  * vowelstr:
                    311:  *     If string starts with a vowel, return "n" for an "an"
                    312:  */
                    313: char *
                    314: vowelstr(char *str)
                    315: {
                    316:        switch (tolower(*str)) {
                    317:                case 'a':
                    318:                case 'e':
                    319:                case 'i':
                    320:                case 'o':
                    321:                case 'u':
                    322:                        return "n";
                    323:                default:
                    324:                        return "";
                    325:        }
                    326: }
                    327:
                    328: /*
                    329:  * is_current:
                    330:  *     See if the object is one of the currently used items
                    331:  */
                    332: bool
                    333: is_current(struct object *obj)
                    334: {
                    335:        if (obj == NULL)
                    336:                return FALSE;
                    337:        if (obj == cur_armor || obj == cur_weapon || obj == cur_ring[LEFT]
                    338:          || obj == cur_ring[RIGHT]) {
                    339:                msg("Already in use.");
                    340:                return TRUE;
                    341:        }
                    342:        return FALSE;
                    343: }
                    344:
                    345: /*
                    346:  * get_dir:
                    347:  *     Set up the direction coordinates
                    348:  */
                    349: bool
                    350: get_dir(void)
                    351: {
                    352:        reg char *prompt;
                    353:        reg bool gotit;
                    354:
                    355:        prompt = "Direction: ";
                    356:        do {
                    357:                gotit = TRUE;
                    358:                switch (readchar()) {
                    359:                        case 'h': case'H': delta.y =  0; delta.x = -1;
                    360:                        when 'j': case'J': delta.y =  1; delta.x =  0;
                    361:                        when 'k': case'K': delta.y = -1; delta.x =  0;
                    362:                        when 'l': case'L': delta.y =  0; delta.x =  1;
                    363:                        when 'y': case'Y': delta.y = -1; delta.x = -1;
                    364:                        when 'u': case'U': delta.y = -1; delta.x =  1;
                    365:                        when 'b': case'B': delta.y =  1; delta.x = -1;
                    366:                        when 'n': case'N': delta.y =  1; delta.x =  1;
                    367:                        when ESCAPE: return FALSE;
                    368:                        otherwise:
                    369:                                mpos = 0;
                    370:                                msg(prompt);
                    371:                                gotit = FALSE;
                    372:                }
                    373:        } until (gotit);
                    374:        if (pl_on(ISHUH) && rnd(100) > 80) {
                    375:                do {
                    376:                        delta.y = rnd(3) - 1;
                    377:                        delta.x = rnd(3) - 1;
                    378:                } while (delta.y == 0 && delta.x == 0);
                    379:        }
                    380:        mpos = 0;
                    381:        return TRUE;
                    382: }
                    383:
                    384: /*
                    385:  * initfood:
                    386:  *     Set up stuff for a food-type object
                    387:  */
                    388: void
                    389: initfood(struct object *what)
                    390: {
                    391:        what->o_type = FOOD;
                    392:        what->o_group = NORMFOOD;
                    393:        if (rnd(100) < 15)
                    394:                what->o_group = FRUITFOOD;
                    395:        what->o_which = what->o_group;
                    396:        what->o_count = 1 + extras();
                    397:        what->o_flags = ISKNOW;
                    398:        what->o_weight = things[TYP_FOOD].mi_wght;
                    399:        what->o_typname = things[TYP_FOOD].mi_name;
                    400:        what->o_hplus = what->o_dplus = 0;
                    401:        what->o_vol = itemvol(what);
                    402: }

CVSweb