Annotation of researchv10no/games/rogue/move.c, revision 1.1.1.1

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

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.