|
|
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.