|
|
1.1 ! root 1: /* ! 2: * Copyright (c) 1988 The Regents of the University of California. ! 3: * All rights reserved. ! 4: * ! 5: * This code is derived from software contributed to Berkeley by ! 6: * Timothy C. Stoehr. ! 7: * ! 8: * Redistribution and use in source and binary forms are permitted ! 9: * provided that: (1) source distributions retain this entire copyright ! 10: * notice and comment, and (2) distributions including binaries display ! 11: * the following acknowledgement: ``This product includes software ! 12: * developed by the University of California, Berkeley and its contributors'' ! 13: * in the documentation or other materials provided with the distribution ! 14: * and in all advertising materials mentioning features or use of this ! 15: * software. Neither the name of the University nor the names of its ! 16: * contributors may be used to endorse or promote products derived ! 17: * from this software without specific prior written permission. ! 18: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR ! 19: * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED ! 20: * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. ! 21: */ ! 22: ! 23: #ifndef lint ! 24: static char sccsid[] = "@(#)trap.c 5.3 (Berkeley) 6/1/90"; ! 25: #endif /* not lint */ ! 26: ! 27: /* ! 28: * trap.c ! 29: * ! 30: * This source herein may be modified and/or distributed by anybody who ! 31: * so desires, with the following restrictions: ! 32: * 1.) No portion of this notice shall be removed. ! 33: * 2.) Credit shall not be taken for the creation of this source. ! 34: * 3.) This code is not to be traded, sold, or used for personal ! 35: * gain or profit. ! 36: * ! 37: */ ! 38: ! 39: #include "rogue.h" ! 40: ! 41: trap traps[MAX_TRAPS]; ! 42: boolean trap_door = 0; ! 43: short bear_trap = 0; ! 44: ! 45: char *trap_strings[TRAPS * 2] = { ! 46: "trap door", ! 47: "you fell down a trap", ! 48: "bear trap", ! 49: "you are caught in a bear trap", ! 50: "teleport trap", ! 51: "teleport", ! 52: "poison dart trap", ! 53: "a small dart just hit you in the shoulder", ! 54: "sleeping gas trap", ! 55: "a strange white mist envelops you and you fall asleep", ! 56: "rust trap", ! 57: "a gush of water hits you on the head" ! 58: }; ! 59: ! 60: extern short cur_level, party_room; ! 61: extern char *new_level_message; ! 62: extern boolean interrupted; ! 63: extern short ring_exp; ! 64: extern boolean sustain_strength; ! 65: extern short blind; ! 66: ! 67: trap_at(row, col) ! 68: register row, col; ! 69: { ! 70: short i; ! 71: ! 72: for (i = 0; ((i < MAX_TRAPS) && (traps[i].trap_type != NO_TRAP)); i++) { ! 73: if ((traps[i].trap_row == row) && (traps[i].trap_col == col)) { ! 74: return(traps[i].trap_type); ! 75: } ! 76: } ! 77: return(NO_TRAP); ! 78: } ! 79: ! 80: trap_player(row, col) ! 81: short row, col; ! 82: { ! 83: short t; ! 84: ! 85: if ((t = trap_at(row, col)) == NO_TRAP) { ! 86: return; ! 87: } ! 88: dungeon[row][col] &= (~HIDDEN); ! 89: if (rand_percent(rogue.exp + ring_exp)) { ! 90: message("the trap failed", 1); ! 91: return; ! 92: } ! 93: switch(t) { ! 94: case TRAP_DOOR: ! 95: trap_door = 1; ! 96: new_level_message = trap_strings[(t*2)+1]; ! 97: break; ! 98: case BEAR_TRAP: ! 99: message(trap_strings[(t*2)+1], 1); ! 100: bear_trap = get_rand(4, 7); ! 101: break; ! 102: case TELE_TRAP: ! 103: mvaddch(rogue.row, rogue.col, '^'); ! 104: tele(); ! 105: break; ! 106: case DART_TRAP: ! 107: message(trap_strings[(t*2)+1], 1); ! 108: rogue.hp_current -= get_damage("1d6", 1); ! 109: if (rogue.hp_current <= 0) { ! 110: rogue.hp_current = 0; ! 111: } ! 112: if ((!sustain_strength) && rand_percent(40) && ! 113: (rogue.str_current >= 3)) { ! 114: rogue.str_current--; ! 115: } ! 116: print_stats(STAT_HP | STAT_STRENGTH); ! 117: if (rogue.hp_current <= 0) { ! 118: killed_by((object *) 0, POISON_DART); ! 119: } ! 120: break; ! 121: case SLEEPING_GAS_TRAP: ! 122: message(trap_strings[(t*2)+1], 1); ! 123: take_a_nap(); ! 124: break; ! 125: case RUST_TRAP: ! 126: message(trap_strings[(t*2)+1], 1); ! 127: rust((object *) 0); ! 128: break; ! 129: } ! 130: } ! 131: ! 132: add_traps() ! 133: { ! 134: short i, n, tries = 0; ! 135: short row, col; ! 136: ! 137: if (cur_level <= 2) { ! 138: n = 0; ! 139: } else if (cur_level <= 7) { ! 140: n = get_rand(0, 2); ! 141: } else if (cur_level <= 11) { ! 142: n = get_rand(1, 2); ! 143: } else if (cur_level <= 16) { ! 144: n = get_rand(2, 3); ! 145: } else if (cur_level <= 21) { ! 146: n = get_rand(2, 4); ! 147: } else if (cur_level <= (AMULET_LEVEL + 2)) { ! 148: n = get_rand(3, 5); ! 149: } else { ! 150: n = get_rand(5, MAX_TRAPS); ! 151: } ! 152: for (i = 0; i < n; i++) { ! 153: traps[i].trap_type = get_rand(0, (TRAPS - 1)); ! 154: ! 155: if ((i == 0) && (party_room != NO_ROOM)) { ! 156: do { ! 157: row = get_rand((rooms[party_room].top_row+1), ! 158: (rooms[party_room].bottom_row-1)); ! 159: col = get_rand((rooms[party_room].left_col+1), ! 160: (rooms[party_room].right_col-1)); ! 161: tries++; ! 162: } while (((dungeon[row][col] & (OBJECT|STAIRS|TRAP|TUNNEL)) || ! 163: (dungeon[row][col] == NOTHING)) && (tries < 15)); ! 164: if (tries >= 15) { ! 165: gr_row_col(&row, &col, (FLOOR | MONSTER)); ! 166: } ! 167: } else { ! 168: gr_row_col(&row, &col, (FLOOR | MONSTER)); ! 169: } ! 170: traps[i].trap_row = row; ! 171: traps[i].trap_col = col; ! 172: dungeon[row][col] |= (TRAP | HIDDEN); ! 173: } ! 174: } ! 175: ! 176: id_trap() ! 177: { ! 178: short dir, row, col, d, t; ! 179: ! 180: message("direction? ", 0); ! 181: ! 182: while (!is_direction(dir = rgetchar(), &d)) { ! 183: sound_bell(); ! 184: } ! 185: check_message(); ! 186: ! 187: if (dir == CANCEL) { ! 188: return; ! 189: } ! 190: row = rogue.row; ! 191: col = rogue.col; ! 192: ! 193: get_dir_rc(d, &row, &col, 0); ! 194: ! 195: if ((dungeon[row][col] & TRAP) && (!(dungeon[row][col] & HIDDEN))) { ! 196: t = trap_at(row, col); ! 197: message(trap_strings[t*2], 0); ! 198: } else { ! 199: message("no trap there", 0); ! 200: } ! 201: } ! 202: ! 203: show_traps() ! 204: { ! 205: short i, j; ! 206: ! 207: for (i = 0; i < DROWS; i++) { ! 208: for (j = 0; j < DCOLS; j++) { ! 209: if (dungeon[i][j] & TRAP) { ! 210: mvaddch(i, j, '^'); ! 211: } ! 212: } ! 213: } ! 214: } ! 215: ! 216: search(n, is_auto) ! 217: short n; ! 218: boolean is_auto; ! 219: { ! 220: short s, i, j, row, col, t; ! 221: short shown = 0, found = 0; ! 222: static boolean reg_search; ! 223: ! 224: for (i = -1; i <= 1; i++) { ! 225: for (j = -1; j <= 1; j++) { ! 226: row = rogue.row + i; ! 227: col = rogue.col + j; ! 228: if ((row < MIN_ROW) || (row >= (DROWS-1)) || ! 229: (col < 0) || (col >= DCOLS)) { ! 230: continue; ! 231: } ! 232: if (dungeon[row][col] & HIDDEN) { ! 233: found++; ! 234: } ! 235: } ! 236: } ! 237: for (s = 0; s < n; s++) { ! 238: for (i = -1; i <= 1; i++) { ! 239: for (j = -1; j <= 1; j++) { ! 240: row = rogue.row + i; ! 241: col = rogue.col + j ; ! 242: if ((row < MIN_ROW) || (row >= (DROWS-1)) || ! 243: (col < 0) || (col >= DCOLS)) { ! 244: continue; ! 245: } ! 246: if (dungeon[row][col] & HIDDEN) { ! 247: if (rand_percent(17 + (rogue.exp + ring_exp))) { ! 248: dungeon[row][col] &= (~HIDDEN); ! 249: if ((!blind) && ((row != rogue.row) || ! 250: (col != rogue.col))) { ! 251: mvaddch(row, col, get_dungeon_char(row, col)); ! 252: } ! 253: shown++; ! 254: if (dungeon[row][col] & TRAP) { ! 255: t = trap_at(row, col); ! 256: message(trap_strings[t*2], 1); ! 257: } ! 258: } ! 259: } ! 260: if (((shown == found) && (found > 0)) || interrupted) { ! 261: return; ! 262: } ! 263: } ! 264: } ! 265: if ((!is_auto) && (reg_search = !reg_search)) { ! 266: (void) reg_move(); ! 267: } ! 268: } ! 269: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.