|
|
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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.