]> git.cameronkatri.com Git - bsdgames-darwin.git/blob - rogue/trap.c
Add RCS identifiers.
[bsdgames-darwin.git] / rogue / trap.c
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, with or without
9 * modification, are permitted provided that the following conditions
10 * are met:
11 * 1. Redistributions of source code must retain the above copyright
12 * notice, this list of conditions and the following disclaimer.
13 * 2. Redistributions in binary form must reproduce the above copyright
14 * notice, this list of conditions and the following disclaimer in the
15 * documentation and/or other materials provided with the distribution.
16 * 3. All advertising materials mentioning features or use of this software
17 * must display the following acknowledgement:
18 * This product includes software developed by the University of
19 * California, Berkeley and its contributors.
20 * 4. Neither the name of the University nor the names of its contributors
21 * may be used to endorse or promote products derived from this software
22 * without specific prior written permission.
23 *
24 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
25 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
26 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
27 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
28 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
29 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
30 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
31 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
32 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
33 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
34 * SUCH DAMAGE.
35 */
36
37 #ifndef lint
38 /*static char sccsid[] = "from: @(#)trap.c 5.3 (Berkeley) 6/1/90";*/
39 static char rcsid[] = "$Id: trap.c,v 1.2 1993/08/01 18:52:09 mycroft Exp $";
40 #endif /* not lint */
41
42 /*
43 * trap.c
44 *
45 * This source herein may be modified and/or distributed by anybody who
46 * so desires, with the following restrictions:
47 * 1.) No portion of this notice shall be removed.
48 * 2.) Credit shall not be taken for the creation of this source.
49 * 3.) This code is not to be traded, sold, or used for personal
50 * gain or profit.
51 *
52 */
53
54 #include "rogue.h"
55
56 trap traps[MAX_TRAPS];
57 boolean trap_door = 0;
58 short bear_trap = 0;
59
60 char *trap_strings[TRAPS * 2] = {
61 "trap door",
62 "you fell down a trap",
63 "bear trap",
64 "you are caught in a bear trap",
65 "teleport trap",
66 "teleport",
67 "poison dart trap",
68 "a small dart just hit you in the shoulder",
69 "sleeping gas trap",
70 "a strange white mist envelops you and you fall asleep",
71 "rust trap",
72 "a gush of water hits you on the head"
73 };
74
75 extern short cur_level, party_room;
76 extern char *new_level_message;
77 extern boolean interrupted;
78 extern short ring_exp;
79 extern boolean sustain_strength;
80 extern short blind;
81
82 trap_at(row, col)
83 register row, col;
84 {
85 short i;
86
87 for (i = 0; ((i < MAX_TRAPS) && (traps[i].trap_type != NO_TRAP)); i++) {
88 if ((traps[i].trap_row == row) && (traps[i].trap_col == col)) {
89 return(traps[i].trap_type);
90 }
91 }
92 return(NO_TRAP);
93 }
94
95 trap_player(row, col)
96 short row, col;
97 {
98 short t;
99
100 if ((t = trap_at(row, col)) == NO_TRAP) {
101 return;
102 }
103 dungeon[row][col] &= (~HIDDEN);
104 if (rand_percent(rogue.exp + ring_exp)) {
105 message("the trap failed", 1);
106 return;
107 }
108 switch(t) {
109 case TRAP_DOOR:
110 trap_door = 1;
111 new_level_message = trap_strings[(t*2)+1];
112 break;
113 case BEAR_TRAP:
114 message(trap_strings[(t*2)+1], 1);
115 bear_trap = get_rand(4, 7);
116 break;
117 case TELE_TRAP:
118 mvaddch(rogue.row, rogue.col, '^');
119 tele();
120 break;
121 case DART_TRAP:
122 message(trap_strings[(t*2)+1], 1);
123 rogue.hp_current -= get_damage("1d6", 1);
124 if (rogue.hp_current <= 0) {
125 rogue.hp_current = 0;
126 }
127 if ((!sustain_strength) && rand_percent(40) &&
128 (rogue.str_current >= 3)) {
129 rogue.str_current--;
130 }
131 print_stats(STAT_HP | STAT_STRENGTH);
132 if (rogue.hp_current <= 0) {
133 killed_by((object *) 0, POISON_DART);
134 }
135 break;
136 case SLEEPING_GAS_TRAP:
137 message(trap_strings[(t*2)+1], 1);
138 take_a_nap();
139 break;
140 case RUST_TRAP:
141 message(trap_strings[(t*2)+1], 1);
142 rust((object *) 0);
143 break;
144 }
145 }
146
147 add_traps()
148 {
149 short i, n, tries = 0;
150 short row, col;
151
152 if (cur_level <= 2) {
153 n = 0;
154 } else if (cur_level <= 7) {
155 n = get_rand(0, 2);
156 } else if (cur_level <= 11) {
157 n = get_rand(1, 2);
158 } else if (cur_level <= 16) {
159 n = get_rand(2, 3);
160 } else if (cur_level <= 21) {
161 n = get_rand(2, 4);
162 } else if (cur_level <= (AMULET_LEVEL + 2)) {
163 n = get_rand(3, 5);
164 } else {
165 n = get_rand(5, MAX_TRAPS);
166 }
167 for (i = 0; i < n; i++) {
168 traps[i].trap_type = get_rand(0, (TRAPS - 1));
169
170 if ((i == 0) && (party_room != NO_ROOM)) {
171 do {
172 row = get_rand((rooms[party_room].top_row+1),
173 (rooms[party_room].bottom_row-1));
174 col = get_rand((rooms[party_room].left_col+1),
175 (rooms[party_room].right_col-1));
176 tries++;
177 } while (((dungeon[row][col] & (OBJECT|STAIRS|TRAP|TUNNEL)) ||
178 (dungeon[row][col] == NOTHING)) && (tries < 15));
179 if (tries >= 15) {
180 gr_row_col(&row, &col, (FLOOR | MONSTER));
181 }
182 } else {
183 gr_row_col(&row, &col, (FLOOR | MONSTER));
184 }
185 traps[i].trap_row = row;
186 traps[i].trap_col = col;
187 dungeon[row][col] |= (TRAP | HIDDEN);
188 }
189 }
190
191 id_trap()
192 {
193 short dir, row, col, d, t;
194
195 message("direction? ", 0);
196
197 while (!is_direction(dir = rgetchar(), &d)) {
198 sound_bell();
199 }
200 check_message();
201
202 if (dir == CANCEL) {
203 return;
204 }
205 row = rogue.row;
206 col = rogue.col;
207
208 get_dir_rc(d, &row, &col, 0);
209
210 if ((dungeon[row][col] & TRAP) && (!(dungeon[row][col] & HIDDEN))) {
211 t = trap_at(row, col);
212 message(trap_strings[t*2], 0);
213 } else {
214 message("no trap there", 0);
215 }
216 }
217
218 show_traps()
219 {
220 short i, j;
221
222 for (i = 0; i < DROWS; i++) {
223 for (j = 0; j < DCOLS; j++) {
224 if (dungeon[i][j] & TRAP) {
225 mvaddch(i, j, '^');
226 }
227 }
228 }
229 }
230
231 search(n, is_auto)
232 short n;
233 boolean is_auto;
234 {
235 short s, i, j, row, col, t;
236 short shown = 0, found = 0;
237 static boolean reg_search;
238
239 for (i = -1; i <= 1; i++) {
240 for (j = -1; j <= 1; j++) {
241 row = rogue.row + i;
242 col = rogue.col + j;
243 if ((row < MIN_ROW) || (row >= (DROWS-1)) ||
244 (col < 0) || (col >= DCOLS)) {
245 continue;
246 }
247 if (dungeon[row][col] & HIDDEN) {
248 found++;
249 }
250 }
251 }
252 for (s = 0; s < n; s++) {
253 for (i = -1; i <= 1; i++) {
254 for (j = -1; j <= 1; j++) {
255 row = rogue.row + i;
256 col = rogue.col + j ;
257 if ((row < MIN_ROW) || (row >= (DROWS-1)) ||
258 (col < 0) || (col >= DCOLS)) {
259 continue;
260 }
261 if (dungeon[row][col] & HIDDEN) {
262 if (rand_percent(17 + (rogue.exp + ring_exp))) {
263 dungeon[row][col] &= (~HIDDEN);
264 if ((!blind) && ((row != rogue.row) ||
265 (col != rogue.col))) {
266 mvaddch(row, col, get_dungeon_char(row, col));
267 }
268 shown++;
269 if (dungeon[row][col] & TRAP) {
270 t = trap_at(row, col);
271 message(trap_strings[t*2], 1);
272 }
273 }
274 }
275 if (((shown == found) && (found > 0)) || interrupted) {
276 return;
277 }
278 }
279 }
280 if ((!is_auto) && (reg_search = !reg_search)) {
281 (void) reg_move();
282 }
283 }
284 }