]>
git.cameronkatri.com Git - bsdgames-darwin.git/blob - rogue/spec_hit.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: @(#)spec_hit.c 5.3 (Berkeley) 6/1/90";*/
39 static char rcsid
[] = "$Id: spec_hit.c,v 1.2 1993/08/01 18:52:12 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
59 extern short cur_level
, max_level
, blind
, levitate
, ring_exp
;
60 extern long level_points
[];
61 extern boolean detect_monster
, mon_disappeared
;
62 extern boolean sustain_strength
, maintain_armor
;
63 extern char *you_can_move_again
;
68 if ((monster
->m_flags
& CONFUSED
) && rand_percent(66)) {
71 if (monster
->m_flags
& RUSTS
) {
74 if ((monster
->m_flags
& HOLDS
) && !levitate
) {
77 if (monster
->m_flags
& FREEZES
) {
80 if (monster
->m_flags
& STINGS
) {
83 if (monster
->m_flags
& DRAINS_LIFE
) {
86 if (monster
->m_flags
& DROPS_LEVEL
) {
89 if (monster
->m_flags
& STEALS_GOLD
) {
91 } else if (monster
->m_flags
& STEALS_ITEM
) {
99 if ((!rogue
.armor
) || (get_armor_class(rogue
.armor
) <= 1) ||
100 (rogue
.armor
->which_kind
== LEATHER
)) {
103 if ((rogue
.armor
->is_protected
) || maintain_armor
) {
104 if (monster
&& (!(monster
->m_flags
& RUST_VANISHED
))) {
105 message("the rust vanishes instantly", 0);
106 monster
->m_flags
|= RUST_VANISHED
;
109 rogue
.armor
->d_enchant
--;
110 message("your armor weakens", 0);
111 print_stats(STAT_ARMOR
);
118 short freeze_percent
= 99;
121 if (rand_percent(12)) {
124 freeze_percent
-= (rogue
.str_current
+(rogue
.str_current
/ 2));
125 freeze_percent
-= ((rogue
.exp
+ ring_exp
) * 4);
126 freeze_percent
-= (get_armor_class(rogue
.armor
) * 5);
127 freeze_percent
-= (rogue
.hp_max
/ 3);
129 if (freeze_percent
> 10) {
130 monster
->m_flags
|= FREEZING_ROGUE
;
131 message("you are frozen", 1);
134 for (i
= 0; i
< n
; i
++) {
137 if (rand_percent(freeze_percent
)) {
138 for (i
= 0; i
< 50; i
++) {
141 killed_by((object
*)0, HYPOTHERMIA
);
143 message(you_can_move_again
, 1);
144 monster
->m_flags
&= (~FREEZING_ROGUE
);
153 if ((rogue
.gold
<= 0) || rand_percent(10)) {
157 amount
= get_rand((cur_level
* 10), (cur_level
* 30));
159 if (amount
> rogue
.gold
) {
162 rogue
.gold
-= amount
;
163 message("your purse feels lighter", 0);
164 print_stats(STAT_GOLD
);
174 boolean has_something
= 0;
176 if (rand_percent(15)) {
179 obj
= rogue
.pack
.next_object
;
185 if (!(obj
->in_use_flags
& BEING_USED
)) {
189 obj
= obj
->next_object
;
191 if (!has_something
) {
194 n
= get_rand(0, MAX_PACK_COUNT
);
195 obj
= rogue
.pack
.next_object
;
197 for (i
= 0; i
<= n
; i
++) {
198 obj
= obj
->next_object
;
199 while ((!obj
) || (obj
->in_use_flags
& BEING_USED
)) {
201 obj
= rogue
.pack
.next_object
;
203 obj
= obj
->next_object
;
207 (void) strcpy(desc
, "she stole ");
208 if (obj
->what_is
!= WEAPON
) {
212 get_desc(obj
, desc
+10);
215 obj
->quantity
= ((obj
->what_is
!= WEAPON
) ? t
: 1);
217 vanish(obj
, 0, &rogue
.pack
);
230 dungeon
[row
][col
] &= ~MONSTER
;
231 if (rogue_can_see(row
, col
)) {
232 mvaddch(row
, col
, get_dungeon_char(row
, col
));
234 take_from_pack(monster
, &level_monsters
);
235 free_object(monster
);
243 short row
, col
, i
, n
;
245 if (cur_level
< max_level
) {
249 if (monster
->m_flags
& STEALS_GOLD
) {
250 obj
= alloc_object();
252 obj
->quantity
= get_rand((cur_level
* 15), (cur_level
* 30));
254 if (!rand_percent((int) monster
->drop_percent
)) {
262 for (n
= 0; n
<= 5; n
++) {
263 for (i
= -n
; i
<= n
; i
++) {
264 if (try_to_cough(row
+n
, col
+i
, obj
)) {
267 if (try_to_cough(row
-n
, col
+i
, obj
)) {
271 for (i
= -n
; i
<= n
; i
++) {
272 if (try_to_cough(row
+i
, col
-n
, obj
)) {
275 if (try_to_cough(row
+i
, col
+n
, obj
)) {
283 try_to_cough(row
, col
, obj
)
287 if ((row
< MIN_ROW
) || (row
> (DROWS
-2)) || (col
< 0) || (col
>(DCOLS
-1))) {
290 if ((!(dungeon
[row
][col
] & (OBJECT
| STAIRS
| TRAP
))) &&
291 (dungeon
[row
][col
] & (TUNNEL
| FLOOR
| DOOR
))) {
292 place_at(obj
, row
, col
);
293 if (((row
!= rogue
.row
) || (col
!= rogue
.col
)) &&
294 (!(dungeon
[row
][col
] & MONSTER
))) {
295 mvaddch(row
, col
, get_dungeon_char(row
, col
));
307 if ((rn
= get_room_number(monster
->row
, monster
->col
)) < 0) {
310 for (i
= rooms
[rn
].top_row
+1; i
< rooms
[rn
].bottom_row
; i
++) {
311 for (j
= rooms
[rn
].left_col
+1; j
< rooms
[rn
].right_col
; j
++) {
312 if ((gold_at(i
, j
)) && !(dungeon
[i
][j
] & MONSTER
)) {
313 monster
->m_flags
|= CAN_FLIT
;
314 s
= mon_can_go(monster
, i
, j
);
315 monster
->m_flags
&= (~CAN_FLIT
);
317 move_mon_to(monster
, i
, j
);
318 monster
->m_flags
|= ASLEEP
;
319 monster
->m_flags
&= (~(WAKENS
| SEEKS_GOLD
));
322 monster
->m_flags
&= (~SEEKS_GOLD
);
323 monster
->m_flags
|= CAN_FLIT
;
324 mv_1_monster(monster
, i
, j
);
325 monster
->m_flags
&= (~CAN_FLIT
);
326 monster
->m_flags
|= SEEKS_GOLD
;
337 if (dungeon
[row
][col
] & OBJECT
) {
340 if ((obj
= object_at(&level_objects
, row
, col
)) &&
341 (obj
->what_is
== GOLD
)) {
348 check_gold_seeker(monster
)
351 monster
->m_flags
&= (~SEEKS_GOLD
);
354 check_imitator(monster
)
359 if (monster
->m_flags
& IMITATES
) {
362 mvaddch(monster
->row
, monster
->col
,
363 get_dungeon_char(monster
->row
, monster
->col
));
365 sprintf(msg
, "wait, that's a %s!", mon_name(monster
));
374 register short row
, col
;
376 if (dungeon
[row
][col
] & MONSTER
) {
377 object
*object_at(), *monster
;
379 if (monster
= object_at(&level_monsters
, row
, col
)) {
380 if (monster
->m_flags
& IMITATES
) {
391 short sting_chance
= 35;
394 if ((rogue
.str_current
<= 3) || sustain_strength
) {
397 sting_chance
+= (6 * (6 - get_armor_class(rogue
.armor
)));
399 if ((rogue
.exp
+ ring_exp
) > 8) {
400 sting_chance
-= (6 * ((rogue
.exp
+ ring_exp
) - 8));
402 if (rand_percent(sting_chance
)) {
403 sprintf(msg
, "the %s's bite has weakened you",
407 print_stats(STAT_STRENGTH
);
415 if (rand_percent(80) || (rogue
.exp
<= 5)) {
418 rogue
.exp_points
= level_points
[rogue
.exp
-2] - get_rand(9, 29);
421 if ((rogue
.hp_current
-= hp
) <= 0) {
422 rogue
.hp_current
= 1;
424 if ((rogue
.hp_max
-= hp
) <= 0) {
434 if (rand_percent(60) || (rogue
.hp_max
<= 30) || (rogue
.hp_current
< 10)) {
437 n
= get_rand(1, 3); /* 1 Hp, 2 Str, 3 both */
439 if ((n
!= 2) || (!sustain_strength
)) {
440 message("you feel weaker", 0);
448 if ((rogue
.str_current
> 3) && (!sustain_strength
)) {
455 print_stats((STAT_STRENGTH
| STAT_HP
));
463 if (!rogue_can_see(monster
->row
, monster
->col
)) {
466 if (rand_percent(45)) {
467 monster
->m_flags
&= (~CONFUSES
); /* will not confuse the rogue */
470 if (rand_percent(55)) {
471 monster
->m_flags
&= (~CONFUSES
);
472 sprintf(msg
, "the gaze of the %s has confused you", mon_name(monster
));
485 if ((!mon_sees(monster
, rogue
.row
, rogue
.col
)) || coin_toss()) {
488 row
= rogue
.row
- monster
->row
;
489 col
= rogue
.col
- monster
->col
;
496 if (((row
!= 0) && (col
!= 0) && (row
!= col
)) ||
497 ((row
> 7) || (col
> 7))) {
500 dir
= get_dir(monster
->row
, monster
->col
, row
, col
);
501 bounce(FIRE
, dir
, monster
->row
, monster
->col
, 0);
506 get_dir(srow
, scol
, drow
, dcol
)
507 short srow
, scol
, drow
, dcol
;
523 if ((srow
> drow
) && (scol
> dcol
)) {
526 if ((srow
< drow
) && (scol
< dcol
)) {
529 if ((srow
< drow
) && (scol
> dcol
)) {
532 /*if ((srow > drow) && (scol < dcol)) {*/