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: }