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

Annotation of early-roguelike/rogue3/move.c, Revision 1.1.1.1

1.1       rubenllo    1: /*
                      2:  * Hero movement commands
                      3:  *
                      4:  * @(#)move.c  3.26 (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 <ctype.h>
                     15: #include "rogue.h"
                     16:
                     17: /*
                     18:  * Used to hold the new hero position
                     19:  */
                     20:
                     21: coord nh;
                     22:
                     23: /*
                     24:  * do_run:
                     25:  *     Start the hero running
                     26:  */
                     27:
                     28: void
                     29: do_run(int ch)
                     30: {
                     31:     running = TRUE;
                     32:     after = FALSE;
                     33:     runch = ch;
                     34: }
                     35:
                     36: /*
                     37:  * do_move:
                     38:  *     Check to see that a move is legal.  If it is handle the
                     39:  * consequences (fighting, picking up, etc.)
                     40:  */
                     41:
                     42: void
                     43: do_move(int dy, int dx)
                     44: {
                     45:     int ch;
                     46:
                     47:     firstmove = FALSE;
                     48:     if (no_move)
                     49:     {
                     50:        no_move--;
                     51:        msg("You are still stuck in the bear trap");
                     52:        return;
                     53:     }
                     54:     /*
                     55:      * Do a confused move (maybe)
                     56:      */
                     57:     if (rnd(100) < 80 && on(player, ISHUH))
                     58:        nh = *rndmove(&player);
                     59:     else
                     60:     {
                     61:        nh.y = hero.y + dy;
                     62:        nh.x = hero.x + dx;
                     63:     }
                     64:
                     65:     /*
                     66:      * Check if he tried to move off the screen or make an illegal
                     67:      * diagonal move, and stop him if he did.
                     68:      */
                     69:     if (nh.x < 0 || nh.x > COLS-1 || nh.y < 0 || nh.y > LINES - 1
                     70:        || !diag_ok(&hero, &nh))
                     71:     {
                     72:        after = FALSE;
                     73:        running = FALSE;
                     74:        return;
                     75:     }
                     76:     if (running && ce(hero, nh))
                     77:        after = running = FALSE;
                     78:     ch = winat(nh.y, nh.x);
                     79:     if (on(player, ISHELD) && ch != 'F')
                     80:     {
                     81:        msg("You are being held");
                     82:        return;
                     83:     }
                     84:     switch(ch)
                     85:     {
                     86:        case ' ':
                     87:        case '|':
                     88:        case '-':
                     89:        case SECRETDOOR:
                     90:            after = running = FALSE;
                     91:            return;
                     92:        case TRAP:
                     93:            ch = be_trapped(&nh);
                     94:            if (ch == TRAPDOOR || ch == TELTRAP)
                     95:                return;
                     96:            goto move_stuff;
                     97:        case GOLD:
                     98:        case POTION:
                     99:        case SCROLL:
                    100:        case FOOD:
                    101:        case WEAPON:
                    102:        case ARMOR:
                    103:        case RING:
                    104:        case AMULET:
                    105:        case STICK:
                    106:            running = FALSE;
                    107:            take = ch;
                    108:        default:
                    109: move_stuff:
                    110:            if (ch == PASSAGE && winat(hero.y, hero.x) == DOOR)
                    111:                light(&hero);
                    112:            else if (ch == DOOR)
                    113:            {
                    114:                running = FALSE;
                    115:                if (winat(hero.y, hero.x) == PASSAGE)
                    116:                    light(&nh);
                    117:            }
                    118:            else if (ch == STAIRS)
                    119:                running = FALSE;
                    120:            else if (isupper(ch))
                    121:            {
                    122:                running = FALSE;
                    123:                fight(&nh, ch, cur_weapon, FALSE);
                    124:                return;
                    125:            }
                    126:            ch = winat(hero.y, hero.x);
                    127:            wmove(cw, unc(hero));
                    128:            waddch(cw, ch);
                    129:            hero = nh;
                    130:            wmove(cw, unc(hero));
                    131:            waddch(cw, PLAYER);
                    132:     }
                    133: }
                    134:
                    135: /*
                    136:  * Called to illuminate a room.
                    137:  * If it is dark, remove anything that might move.
                    138:  */
                    139:
                    140: void
                    141: light(coord *cp)
                    142: {
                    143:     struct room *rp;
                    144:     int j, k;
                    145:     int ch;
                    146:     int rch;
                    147:     struct linked_list *item;
                    148:
                    149:     if ((rp = roomin(cp)) != NULL && !on(player, ISBLIND))
                    150:     {
                    151:        for (j = 0; j < rp->r_max.y; j++)
                    152:        {
                    153:            for (k = 0; k < rp->r_max.x; k++)
                    154:            {
                    155:                ch = show(rp->r_pos.y + j, rp->r_pos.x + k);
                    156:                wmove(cw, rp->r_pos.y + j, rp->r_pos.x + k);
                    157:                /*
                    158:                 * Figure out how to display a secret door
                    159:                 */
                    160:                if (ch == SECRETDOOR)
                    161:                {
                    162:                    if (j == 0 || j == rp->r_max.y - 1)
                    163:                        ch = '-';
                    164:                    else
                    165:                        ch = '|';
                    166:                }
                    167:                /*
                    168:                 * If the room is a dark room, we might want to remove
                    169:                 * monsters and the like from it (since they might
                    170:                 * move)
                    171:                 */
                    172:                if (isupper(ch))
                    173:                {
                    174:                    item = wake_monster(rp->r_pos.y+j, rp->r_pos.x+k);
                    175:                    if (((struct thing *) ldata(item))->t_oldch == ' ')
                    176:                        if (!(rp->r_flags & ISDARK))
                    177:                            ((struct thing *) ldata(item))->t_oldch =
                    178:                                mvwinch(stdscr, rp->r_pos.y+j, rp->r_pos.x+k);
                    179:                }
                    180:                if (rp->r_flags & ISDARK)
                    181:                {
                    182:                    rch = mvwinch(cw, rp->r_pos.y+j, rp->r_pos.x+k);
                    183:                    switch (rch)
                    184:                    {
                    185:                        case DOOR:
                    186:                        case STAIRS:
                    187:                        case TRAP:
                    188:                        case '|':
                    189:                        case '-':
                    190:                        case ' ':
                    191:                            ch = rch;
                    192:                        when FLOOR:
                    193:                            ch = (on(player, ISBLIND) ? FLOOR : ' ');
                    194:                        otherwise:
                    195:                            ch = ' ';
                    196:                    }
                    197:                }
                    198:                mvwaddch(cw, rp->r_pos.y+j, rp->r_pos.x+k, ch);
                    199:            }
                    200:        }
                    201:     }
                    202: }
                    203:
                    204: /*
                    205:  * show:
                    206:  *     returns what a certain thing will display as to the un-initiated
                    207:  */
                    208:
                    209: int
                    210: show(int y, int x)
                    211: {
                    212:     int ch = winat(y, x);
                    213:     struct linked_list *it;
                    214:     struct thing *tp;
                    215:
                    216:     if (ch == TRAP)
                    217:        return (trap_at(y, x)->tr_flags & ISFOUND) ? TRAP : FLOOR;
                    218:     else if (ch == 'M' || ch == 'I')
                    219:     {
                    220:        if ((it = find_mons(y, x)) == NULL)
                    221:            fatal("Can't find monster in show");
                    222:        tp = (struct thing *) ldata(it);
                    223:        if (ch == 'M')
                    224:            ch = tp->t_disguise;
                    225:        /*
                    226:         * Hide invisible monsters
                    227:         */
                    228:        else if (off(player, CANSEE))
                    229:            ch = mvwinch(stdscr, y, x);
                    230:     }
                    231:     return ch;
                    232: }
                    233:
                    234: /*
                    235:  * be_trapped:
                    236:  *     The guy stepped on a trap.... Make him pay.
                    237:  */
                    238:
                    239: int
                    240: be_trapped(coord *tc)
                    241: {
                    242:     struct trap *tp;
                    243:     int ch;
                    244:
                    245:     tp = trap_at(tc->y, tc->x);
                    246:     count = running = FALSE;
                    247:     mvwaddch(cw, tp->tr_pos.y, tp->tr_pos.x, TRAP);
                    248:     tp->tr_flags |= ISFOUND;
                    249:     switch (ch = tp->tr_type)
                    250:     {
                    251:        case TRAPDOOR:
                    252:            level++;
                    253:            new_level();
                    254:            msg("You fell into a trap!");
                    255:        when BEARTRAP:
                    256:            no_move += BEARTIME;
                    257:            msg("You are caught in a bear trap");
                    258:        when SLEEPTRAP:
                    259:            no_command += SLEEPTIME;
                    260:            msg("A strange white mist envelops you and you fall asleep");
                    261:        when ARROWTRAP:
                    262:            if (swing(pstats.s_lvl-1, pstats.s_arm, 1))
                    263:            {
                    264:                msg("Oh no! An arrow shot you");
                    265:                if ((pstats.s_hpt -= roll(1, 6)) <= 0)
                    266:                {
                    267:                    msg("The arrow killed you.");
                    268:                    death('a');
                    269:                }
                    270:            }
                    271:            else
                    272:            {
                    273:                struct linked_list *item;
                    274:                struct object *arrow;
                    275:
                    276:                msg("An arrow shoots past you.");
                    277:                item = new_item(sizeof *arrow);
                    278:                arrow = (struct object *) ldata(item);
                    279:                arrow->o_type = WEAPON;
                    280:                arrow->o_which = ARROW;
                    281:                init_weapon(arrow, ARROW);
                    282:                arrow->o_count = 1;
                    283:                arrow->o_pos = hero;
                    284:                arrow->o_hplus = arrow->o_dplus = 0; /* "arrow bug" FIX */
                    285:                fall(item, FALSE);
                    286:            }
                    287:        when TELTRAP:
                    288:            teleport();
                    289:        when DARTTRAP:
                    290:            if (swing(pstats.s_lvl+1, pstats.s_arm, 1))
                    291:            {
                    292:                msg("A small dart just hit you in the shoulder");
                    293:                if ((pstats.s_hpt -= roll(1, 4)) <= 0)
                    294:                {
                    295:                    msg("The dart killed you.");
                    296:                    death('d');
                    297:                }
                    298:                if (!ISWEARING(R_SUSTSTR))
                    299:                    chg_str(-1);
                    300:            }
                    301:            else
                    302:                msg("A small dart whizzes by your ear and vanishes.");
                    303:     }
                    304:     flush_type();      /* flush typeahead */
                    305:     return(ch);
                    306: }
                    307:
                    308: /*
                    309:  * trap_at:
                    310:  *     find the trap at (y,x) on screen.
                    311:  */
                    312:
                    313: struct trap *
                    314: trap_at(int y, int x)
                    315: {
                    316:     struct trap *tp, *ep;
                    317:
                    318:     ep = &traps[ntraps];
                    319:     for (tp = traps; tp < ep; tp++)
                    320:        if (tp->tr_pos.y == y && tp->tr_pos.x == x)
                    321:            break;
                    322:     if (tp == ep)
                    323:     {
                    324:        sprintf(prbuf, "Trap at %d,%d not in array", y, x);
                    325:        fatal(prbuf);
                    326:     }
                    327:     return tp;
                    328: }
                    329:
                    330: /*
                    331:  * rndmove:
                    332:  *     move in a random direction if the monster/person is confused
                    333:  */
                    334:
                    335: coord *
                    336: rndmove(struct thing *who)
                    337: {
                    338:     int x, y;
                    339:     int ch;
                    340:     int ex, ey, nopen = 0;
                    341:     struct linked_list *item;
                    342:     struct object *obj = NULL;
                    343:     static coord ret;  /* what we will be returning */
                    344:     static coord dest;
                    345:
                    346:     ret = who->t_pos;
                    347:     /*
                    348:      * Now go through the spaces surrounding the player and
                    349:      * set that place in the array to true if the space can be
                    350:      * moved into
                    351:      */
                    352:     ey = ret.y + 1;
                    353:     ex = ret.x + 1;
                    354:     for (y = who->t_pos.y - 1; y <= ey; y++)
                    355:        if (y >= 0 && y < LINES)
                    356:            for (x = who->t_pos.x - 1; x <= ex; x++)
                    357:            {
                    358:                if (x < 0 || x >= COLS)
                    359:                    continue;
                    360:                ch = winat(y, x);
                    361:                if (step_ok(ch))
                    362:                {
                    363:                    dest.y = y;
                    364:                    dest.x = x;
                    365:                    if (!diag_ok(&who->t_pos, &dest))
                    366:                        continue;
                    367:                    if (ch == SCROLL)
                    368:                    {
                    369:                        item = NULL;
                    370:                        for (item = lvl_obj; item != NULL; item = next(item))
                    371:                        {
                    372:                            obj = (struct object *) ldata(item);
                    373:                            if (y == obj->o_pos.y && x == obj->o_pos.x)
                    374:                                break;
                    375:                        }
                    376:                        if (item != NULL && obj->o_which == S_SCARE)
                    377:                            continue;
                    378:                    }
                    379:                    if (rnd(++nopen) == 0)
                    380:                        ret = dest;
                    381:                }
                    382:            }
                    383:     return &ret;
                    384: }

CVSweb