]>
git.cameronkatri.com Git - bsdgames-darwin.git/blob - rogue/trap.c
2 * Copyright (c) 1988 The Regents of the University of California.
5 * This code is derived from software contributed to Berkeley by
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions
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.
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
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 $";
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
56 trap traps
[MAX_TRAPS
];
57 boolean trap_door
= 0;
60 char *trap_strings
[TRAPS
* 2] = {
62 "you fell down a trap",
64 "you are caught in a bear trap",
68 "a small dart just hit you in the shoulder",
70 "a strange white mist envelops you and you fall asleep",
72 "a gush of water hits you on the head"
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
;
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
);
100 if ((t
= trap_at(row
, col
)) == NO_TRAP
) {
103 dungeon
[row
][col
] &= (~HIDDEN
);
104 if (rand_percent(rogue
.exp
+ ring_exp
)) {
105 message("the trap failed", 1);
111 new_level_message
= trap_strings
[(t
*2)+1];
114 message(trap_strings
[(t
*2)+1], 1);
115 bear_trap
= get_rand(4, 7);
118 mvaddch(rogue
.row
, rogue
.col
, '^');
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;
127 if ((!sustain_strength
) && rand_percent(40) &&
128 (rogue
.str_current
>= 3)) {
131 print_stats(STAT_HP
| STAT_STRENGTH
);
132 if (rogue
.hp_current
<= 0) {
133 killed_by((object
*) 0, POISON_DART
);
136 case SLEEPING_GAS_TRAP
:
137 message(trap_strings
[(t
*2)+1], 1);
141 message(trap_strings
[(t
*2)+1], 1);
149 short i
, n
, tries
= 0;
152 if (cur_level
<= 2) {
154 } else if (cur_level
<= 7) {
156 } else if (cur_level
<= 11) {
158 } else if (cur_level
<= 16) {
160 } else if (cur_level
<= 21) {
162 } else if (cur_level
<= (AMULET_LEVEL
+ 2)) {
165 n
= get_rand(5, MAX_TRAPS
);
167 for (i
= 0; i
< n
; i
++) {
168 traps
[i
].trap_type
= get_rand(0, (TRAPS
- 1));
170 if ((i
== 0) && (party_room
!= NO_ROOM
)) {
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));
177 } while (((dungeon
[row
][col
] & (OBJECT
|STAIRS
|TRAP
|TUNNEL
)) ||
178 (dungeon
[row
][col
] == NOTHING
)) && (tries
< 15));
180 gr_row_col(&row
, &col
, (FLOOR
| MONSTER
));
183 gr_row_col(&row
, &col
, (FLOOR
| MONSTER
));
185 traps
[i
].trap_row
= row
;
186 traps
[i
].trap_col
= col
;
187 dungeon
[row
][col
] |= (TRAP
| HIDDEN
);
193 short dir
, row
, col
, d
, t
;
195 message("direction? ", 0);
197 while (!is_direction(dir
= rgetchar(), &d
)) {
208 get_dir_rc(d
, &row
, &col
, 0);
210 if ((dungeon
[row
][col
] & TRAP
) && (!(dungeon
[row
][col
] & HIDDEN
))) {
211 t
= trap_at(row
, col
);
212 message(trap_strings
[t
*2], 0);
214 message("no trap there", 0);
222 for (i
= 0; i
< DROWS
; i
++) {
223 for (j
= 0; j
< DCOLS
; j
++) {
224 if (dungeon
[i
][j
] & TRAP
) {
235 short s
, i
, j
, row
, col
, t
;
236 short shown
= 0, found
= 0;
237 static boolean reg_search
;
239 for (i
= -1; i
<= 1; i
++) {
240 for (j
= -1; j
<= 1; j
++) {
243 if ((row
< MIN_ROW
) || (row
>= (DROWS
-1)) ||
244 (col
< 0) || (col
>= DCOLS
)) {
247 if (dungeon
[row
][col
] & HIDDEN
) {
252 for (s
= 0; s
< n
; s
++) {
253 for (i
= -1; i
<= 1; i
++) {
254 for (j
= -1; j
<= 1; j
++) {
256 col
= rogue
.col
+ j
;
257 if ((row
< MIN_ROW
) || (row
>= (DROWS
-1)) ||
258 (col
< 0) || (col
>= DCOLS
)) {
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
));
269 if (dungeon
[row
][col
] & TRAP
) {
270 t
= trap_at(row
, col
);
271 message(trap_strings
[t
*2], 1);
275 if (((shown
== found
) && (found
> 0)) || interrupted
) {
280 if ((!is_auto
) && (reg_search
= !reg_search
)) {