Annotation of 43BSDTahoe/games/rogue/trap.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * trap.c
                      3:  *
                      4:  * This source herein may be modified and/or distributed by anybody who
                      5:  * so desires, with the following restrictions:
                      6:  *    1.)  No portion of this notice shall be removed.
                      7:  *    2.)  Credit shall not be taken for the creation of this source.
                      8:  *    3.)  This code is not to be traded, sold, or used for personal
                      9:  *         gain or profit.
                     10:  *
                     11:  */
                     12: 
                     13: #ifndef lint
                     14: static char sccsid[] = "@(#)trap.c     5.1 (Berkeley) 11/25/87";
                     15: #endif /* not lint */
                     16: 
                     17: #include "rogue.h"
                     18: 
                     19: trap traps[MAX_TRAPS];
                     20: boolean trap_door = 0;
                     21: short bear_trap = 0;
                     22: 
                     23: char *trap_strings[TRAPS * 2] = {
                     24:        "trap door",
                     25:                        "you fell down a trap",
                     26:        "bear trap",
                     27:                        "you are caught in a bear trap",
                     28:        "teleport trap",
                     29:                        "teleport",
                     30:        "poison dart trap",
                     31:                        "a small dart just hit you in the shoulder",
                     32:        "sleeping gas trap",
                     33:                        "a strange white mist envelops you and you fall asleep",
                     34:        "rust trap",
                     35:                        "a gush of water hits you on the head"
                     36: };
                     37: 
                     38: extern short cur_level, party_room;
                     39: extern char *new_level_message;
                     40: extern boolean interrupted;
                     41: extern short ring_exp;
                     42: extern boolean sustain_strength;
                     43: extern short blind;
                     44: 
                     45: trap_at(row, col)
                     46: register row, col;
                     47: {
                     48:        short i;
                     49: 
                     50:        for (i = 0; ((i < MAX_TRAPS) && (traps[i].trap_type != NO_TRAP)); i++) {
                     51:                if ((traps[i].trap_row == row) && (traps[i].trap_col == col)) {
                     52:                        return(traps[i].trap_type);
                     53:                }
                     54:        }
                     55:        return(NO_TRAP);
                     56: }
                     57: 
                     58: trap_player(row, col)
                     59: short row, col;
                     60: {
                     61:        short t;
                     62: 
                     63:        if ((t = trap_at(row, col)) == NO_TRAP) {
                     64:                return;
                     65:        }
                     66:        dungeon[row][col] &= (~HIDDEN);
                     67:        if (rand_percent(rogue.exp + ring_exp)) {
                     68:                message("the trap failed", 1);
                     69:                return;
                     70:        }
                     71:        switch(t) {
                     72:        case TRAP_DOOR:
                     73:                trap_door = 1;
                     74:                new_level_message = trap_strings[(t*2)+1];
                     75:                break;
                     76:        case BEAR_TRAP:
                     77:                message(trap_strings[(t*2)+1], 1);
                     78:                bear_trap = get_rand(4, 7);
                     79:                break;
                     80:        case TELE_TRAP:
                     81:                mvaddch(rogue.row, rogue.col, '^');
                     82:                tele();
                     83:                break;
                     84:        case DART_TRAP:
                     85:                message(trap_strings[(t*2)+1], 1);
                     86:                rogue.hp_current -= get_damage("1d6", 1);
                     87:                if (rogue.hp_current <= 0) {
                     88:                        rogue.hp_current = 0;
                     89:                }
                     90:                if ((!sustain_strength) && rand_percent(40) &&
                     91:                        (rogue.str_current >= 3)) {
                     92:                        rogue.str_current--;
                     93:                }
                     94:                print_stats(STAT_HP | STAT_STRENGTH);
                     95:                if (rogue.hp_current <= 0) {
                     96:                        killed_by((object *) 0, POISON_DART);
                     97:                }
                     98:                break;
                     99:        case SLEEPING_GAS_TRAP:
                    100:                message(trap_strings[(t*2)+1], 1);
                    101:                take_a_nap();
                    102:                break;
                    103:        case RUST_TRAP:
                    104:                message(trap_strings[(t*2)+1], 1);
                    105:                rust((object *) 0);
                    106:                break;
                    107:        }
                    108: }
                    109: 
                    110: add_traps()
                    111: {
                    112:        short i, n, tries = 0;
                    113:        short row, col;
                    114: 
                    115:        if (cur_level <= 2) {
                    116:                n = 0;
                    117:        } else if (cur_level <= 7) {
                    118:                n = get_rand(0, 2);
                    119:        } else if (cur_level <= 11) {
                    120:                n = get_rand(1, 2);
                    121:        } else if (cur_level <= 16) {
                    122:                n = get_rand(2, 3);
                    123:        } else if (cur_level <= 21) {
                    124:                n = get_rand(2, 4);
                    125:        } else if (cur_level <= (AMULET_LEVEL + 2)) {
                    126:                n = get_rand(3, 5);
                    127:        } else {
                    128:                n = get_rand(5, MAX_TRAPS);
                    129:        }
                    130:        for (i = 0; i < n; i++) {
                    131:                traps[i].trap_type = get_rand(0, (TRAPS - 1));
                    132: 
                    133:                if ((i == 0) && (party_room != NO_ROOM)) {
                    134:                        do {
                    135:                                row = get_rand((rooms[party_room].top_row+1),
                    136:                                                (rooms[party_room].bottom_row-1));
                    137:                                col = get_rand((rooms[party_room].left_col+1),
                    138:                                                (rooms[party_room].right_col-1));
                    139:                                tries++;
                    140:                        } while (((dungeon[row][col] & (OBJECT|STAIRS|TRAP|TUNNEL)) ||
                    141:                                        (dungeon[row][col] == NOTHING)) && (tries < 15));
                    142:                        if (tries >= 15) {
                    143:                                gr_row_col(&row, &col, (FLOOR | MONSTER));
                    144:                        }
                    145:                } else {
                    146:                        gr_row_col(&row, &col, (FLOOR | MONSTER));
                    147:                }
                    148:                traps[i].trap_row = row;
                    149:                traps[i].trap_col = col;
                    150:                dungeon[row][col] |= (TRAP | HIDDEN);
                    151:        }
                    152: }
                    153: 
                    154: id_trap()
                    155: {
                    156:        short dir, row, col, d, t;
                    157: 
                    158:        message("direction? ", 0);
                    159: 
                    160:        while (!is_direction(dir = rgetchar(), &d)) {
                    161:                sound_bell();
                    162:        }
                    163:        check_message();
                    164: 
                    165:        if (dir == CANCEL) {
                    166:                return;
                    167:        }
                    168:        row = rogue.row;
                    169:        col = rogue.col;
                    170: 
                    171:        get_dir_rc(d, &row, &col, 0);
                    172: 
                    173:        if ((dungeon[row][col] & TRAP) && (!(dungeon[row][col] & HIDDEN))) {
                    174:                t = trap_at(row, col);
                    175:                message(trap_strings[t*2], 0);
                    176:        } else {
                    177:                message("no trap there", 0);
                    178:        }
                    179: }
                    180: 
                    181: show_traps()
                    182: {
                    183:        short i, j;
                    184: 
                    185:        for (i = 0; i < DROWS; i++) {
                    186:                for (j = 0; j < DCOLS; j++) {
                    187:                        if (dungeon[i][j] & TRAP) {
                    188:                                mvaddch(i, j, '^');
                    189:                        }
                    190:                }
                    191:        }
                    192: }
                    193: 
                    194: search(n, is_auto)
                    195: short n;
                    196: boolean is_auto;
                    197: {
                    198:        short s, i, j, row, col, t;
                    199:        short shown = 0, found = 0;
                    200:        static boolean reg_search;
                    201: 
                    202:        for (i = -1; i <= 1; i++) {
                    203:                for (j = -1; j <= 1; j++) {
                    204:                        row = rogue.row + i;
                    205:                        col = rogue.col + j;
                    206:                        if ((row < MIN_ROW) || (row >= (DROWS-1)) ||
                    207:                                        (col < 0) || (col >= DCOLS)) {
                    208:                                continue;
                    209:                        }
                    210:                        if (dungeon[row][col] & HIDDEN) {
                    211:                                found++;
                    212:                        }
                    213:                }
                    214:        }
                    215:        for (s = 0; s < n; s++) {
                    216:                for (i = -1; i <= 1; i++) {
                    217:                        for (j = -1; j <= 1; j++) {
                    218:                                row = rogue.row + i;
                    219:                                col = rogue.col + j ;
                    220:                                if ((row < MIN_ROW) || (row >= (DROWS-1)) ||
                    221:                                                (col < 0) || (col >= DCOLS)) {
                    222:                                        continue;
                    223:                                }
                    224:                                if (dungeon[row][col] & HIDDEN) {
                    225:                                        if (rand_percent(17 + (rogue.exp + ring_exp))) {
                    226:                                                dungeon[row][col] &= (~HIDDEN);
                    227:                                                if ((!blind) && ((row != rogue.row) ||
                    228:                                                                (col != rogue.col))) {
                    229:                                                        mvaddch(row, col, get_dungeon_char(row, col));
                    230:                                                }
                    231:                                                shown++;
                    232:                                                if (dungeon[row][col] & TRAP) {
                    233:                                                        t = trap_at(row, col);
                    234:                                                        message(trap_strings[t*2], 1);
                    235:                                                }
                    236:                                        }
                    237:                                }
                    238:                                if (((shown == found) && (found > 0)) || interrupted) {
                    239:                                        return;
                    240:                                }
                    241:                        }
                    242:                }
                    243:                if ((!is_auto) && (reg_search = !reg_search)) {
                    244:                        (void) reg_move();
                    245:                }
                    246:        }
                    247: }

unix.superglobalmegacorp.com

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