Mercurial > hg > early-roguelike
annotate srogue/chase.c @ 181:d53b13637783
rogue4: rearrange some includes.
Using MSVC with pdcurses, curses.h has to be included after windows.h
and before process.h. This is apparently because bool is now a
built-in type which pdcurses is not allowed to redefine. But I don't
entirely understand how the headers are interacting, and I don't think
the MSDN page does either.
author | John "Elwin" Edwards |
---|---|
date | Fri, 31 Jul 2015 20:01:44 -0400 |
parents | 2128c7dc8a40 |
children | 94a0d9dd5ce1 |
rev | line source |
---|---|
36
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
1 /* |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
2 * Code for one object to chase another |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
3 * |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
4 * @(#)chase.c 9.0 (rdk) 7/17/84 |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
5 * |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
6 * Super-Rogue |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
7 * Copyright (C) 1984 Robert D. Kindelberger |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
8 * All rights reserved. |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
9 * |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
10 * Based on "Rogue: Exploring the Dungeons of Doom" |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
11 * Copyright (C) 1980, 1981 Michael Toy, Ken Arnold and Glenn Wichman |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
12 * All rights reserved. |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
13 * |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
14 * See the file LICENSE.TXT for full copyright and licensing information. |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
15 */ |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
16 |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
17 #include "rogue.h" |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
18 #include "rogue.ext" |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
19 |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
20 #define FARAWAY 32767 |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
21 #define RDIST(a, b) (DISTANCE((a)->y, (a)->x, (b).y, (b).x)) |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
22 |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
23 struct coord ch_ret; /* Where chasing takes you */ |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
24 |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
25 /* |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
26 * runners: |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
27 * Make all the running monsters move. |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
28 */ |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
29 runners() |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
30 { |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
31 reg struct thing *tp; |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
32 reg struct linked_list *mon,*nextmon; |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
33 |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
34 for (mon = mlist; mon != NULL; mon = nextmon) { |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
35 tp = THINGPTR(mon); |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
36 nextmon = next(mon); |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
37 if (off(*tp, ISHELD) && on(*tp, ISRUN)) { |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
38 if (tp->t_nomove > 0) |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
39 if (--tp->t_nomove > 0) |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
40 continue; |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
41 if (on(*tp, ISHASTE)) |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
42 if (do_chase(mon) == -1) |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
43 continue; |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
44 if (off(*tp, ISSLOW) || tp->t_turn) |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
45 if (do_chase(mon) == -1) |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
46 continue; |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
47 tp->t_turn ^= TRUE; |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
48 } |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
49 } |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
50 } |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
51 |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
52 |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
53 /* |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
54 * do_chase: |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
55 * Make one thing chase another. |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
56 */ |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
57 do_chase(mon) |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
58 struct linked_list *mon; |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
59 { |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
60 reg struct thing *th; |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
61 reg struct room *rer, *ree, *rxx; |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
62 reg int mindist, i, dist; |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
63 struct stats *st; |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
64 bool stoprun = FALSE, ondoor = FALSE, link = FALSE; |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
65 char runaway, dofight, wound, sch, ch; |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
66 struct coord this; |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
67 struct trap *trp; |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
68 |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
69 th = THINGPTR(mon); |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
70 wound = th->t_flags & ISWOUND; |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
71 if (wound) |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
72 mindist = 0; |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
73 else |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
74 mindist = FARAWAY; |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
75 runaway = wound; |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
76 dofight = !runaway; |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
77 rer = th->t_room; |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
78 if (th->t_type == 'V') { |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
79 if (rer != NULL && !rf_on(rer, ISDARK)) { |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
80 /* |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
81 * Vampires can't stand the light |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
82 */ |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
83 if (cansee(th->t_pos.y, th->t_pos.x)) |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
84 msg("The vampire vaporizes into thin air !"); |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
85 killed(mon, FALSE); |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
86 return(-1); |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
87 } |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
88 } |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
89 ree = roomin(th->t_dest); /* room of chasee */ |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
90 this = *th->t_dest; |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
91 /* |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
92 * If the object of our desire is in a different |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
93 * room, then run to the door nearest to our goal. |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
94 */ |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
95 if (mvinch(th->t_pos.y, th->t_pos.x) == DOOR) |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
96 ondoor = TRUE; |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
97 rxx = NULL; |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
98 if (rer != NULL || ree != NULL) { |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
99 /* |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
100 * Monster not in room, hero in room. Run to closest door |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
101 * in hero's room if not wounded. Run away if wounded. |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
102 */ |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
103 if (rer == NULL && ree != NULL) { |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
104 if (!wound) |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
105 rxx = ree; |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
106 } |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
107 /* |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
108 * Monster in a room, hero not in room. If on a door, |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
109 * then use closest distance. If not on a door, then |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
110 * run to closest door in monsters room. |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
111 */ |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
112 else if (rer != NULL && ree == NULL) { |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
113 if (!ondoor) { |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
114 rxx = rer; |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
115 if (wound) |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
116 runaway = FALSE; |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
117 } |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
118 } |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
119 /* |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
120 * Both hero and monster in a DIFFERENT room. Set flag to |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
121 * check for links between the monster's and hero's rooms. |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
122 * If no links are found, then the closest door in the |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
123 * monster's room is used. |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
124 */ |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
125 else if (rer != ree) { |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
126 if (!wound) { |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
127 link = TRUE; |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
128 if (ondoor) |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
129 rxx = ree; /* if on door, run to heros room */ |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
130 else |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
131 rxx = rer; /* else to nearest door this room */ |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
132 } |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
133 } |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
134 /* |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
135 * Both hero and monster in same room. If monster is |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
136 * wounded, find the best door to run to. |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
137 */ |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
138 else if (wound) { |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
139 struct coord *ex; |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
140 int poss, mdtd, hdtd, ghdtd, nx, gx = 0, best; |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
141 |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
142 best = ghdtd = -FARAWAY; |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
143 for (nx = 0; nx < ree->r_nexits; nx++) { |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
144 ex = &ree->r_exit[nx]; |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
145 if (mvinch(ex->y, ex->x) == SECRETDOOR) |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
146 continue; |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
147 gx += 1; |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
148 mdtd = abs(th->t_pos.y - ex->y) + abs(th->t_pos.x - ex->x); |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
149 hdtd = abs(hero.y - ex->y) + abs(hero.x - ex->x); |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
150 poss = hdtd - mdtd; /* possible move */ |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
151 if (poss > best) { |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
152 best = poss; |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
153 this = *ex; |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
154 } |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
155 else if (poss == best && hdtd > ghdtd) { |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
156 ghdtd = hdtd; |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
157 best = poss; |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
158 this = *ex; |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
159 } |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
160 } |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
161 runaway = FALSE; /* go for target */ |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
162 if (best < 1) |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
163 dofight = TRUE; /* fight if we must */ |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
164 mdtd = (gx <= 1 && best < 1); |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
165 if (ondoor || mdtd) { |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
166 this = hero; |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
167 runaway = TRUE; |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
168 if (!mdtd) |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
169 dofight = FALSE; |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
170 } |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
171 } |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
172 if (rxx != NULL) { |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
173 for (i = 0; i < rxx->r_nexits; i += 1) { |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
174 dist = RDIST(th->t_dest, rxx->r_exit[i]); |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
175 if (link && rxx->r_ptr[i] == ree) |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
176 dist = -1; |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
177 if ((!wound && dist < mindist) || |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
178 (wound && dist > mindist)) { |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
179 this = rxx->r_exit[i]; |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
180 mindist = dist; |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
181 } |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
182 } |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
183 } |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
184 } |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
185 else if (DISTANCE(hero.y, hero.x, th->t_pos.y, th->t_pos.x) <= 3) |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
186 dofight = TRUE; |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
187 /* |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
188 * this now contains what we want to run to this time |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
189 * so we run to it. If we hit it we either want to |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
190 * fight it or stop running. |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
191 */ |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
192 if (chase(th, &this, runaway, dofight) == FIGHT) { |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
193 return( attack(th) ); |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
194 } |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
195 else if ((th->t_flags & (ISSTUCK | ISPARA))) |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
196 return(0); /* if paralyzed or stuck */ |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
197 if ((trp = trap_at(ch_ret.y, ch_ret.x)) != NULL) { |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
198 ch = be_trapped(&ch_ret, th); |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
199 if (ch == GONER || nlmove) { |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
200 if (ch == GONER) |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
201 remove_monster(&th->t_pos, mon); |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
202 nlmove = FALSE; |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
203 return((ch == GONER) ? -1 : 0); |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
204 } |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
205 } |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
206 if (pl_off(ISBLIND)) |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
207 mvwaddch(cw,th->t_pos.y,th->t_pos.x,th->t_oldch); |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
208 sch = mvwinch(cw, ch_ret.y, ch_ret.x); |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
209 if (rer != NULL && rf_on(rer,ISDARK) && sch == FLOOR && |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
210 DISTANCE(ch_ret.y,ch_ret.x,th->t_pos.y,th->t_pos.x) < 3 && |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
211 pl_off(ISBLIND)) |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
212 th->t_oldch = ' '; |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
213 else |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
214 th->t_oldch = sch; |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
215 if (cansee(unc(ch_ret)) && off(*th, ISINVIS)) |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
216 mvwaddch(cw, ch_ret.y, ch_ret.x, th->t_type); |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
217 mvwaddch(mw, th->t_pos.y, th->t_pos.x, ' '); |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
218 mvwaddch(mw, ch_ret.y, ch_ret.x, th->t_type); |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
219 th->t_oldpos = th->t_pos; |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
220 th->t_pos = ch_ret; |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
221 th->t_room = roomin(&ch_ret); |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
222 i = 5; |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
223 if (th->t_flags & ISREGEN) |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
224 i = 40; |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
225 st = &th->t_stats; |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
226 if (rnd(100) < i) { |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
227 if (++st->s_hpt > st->s_maxhp) |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
228 st->s_hpt = st->s_maxhp; |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
229 if (!monhurt(th)) |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
230 th->t_flags &= ~ISWOUND; |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
231 } |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
232 if (stoprun && ce(th->t_pos, *(th->t_dest))) |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
233 th->t_flags &= ~ISRUN; |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
234 return CHASE; |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
235 } |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
236 |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
237 |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
238 /* |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
239 * chase: |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
240 * Find the spot for the chaser to move closer to the |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
241 * chasee. Returns TRUE if we want to keep on chasing |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
242 * later FALSE if we reach the goal. |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
243 */ |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
244 chase(tp, ee, runaway, dofight) |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
245 struct thing *tp; |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
246 struct coord *ee; |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
247 bool runaway, dofight; |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
248 { |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
249 reg int x, y, ch; |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
250 reg int dist, thisdist, closest; |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
251 reg struct coord *er = &tp->t_pos; |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
252 struct coord try, closecoord; |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
253 int numsteps, onscare; |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
254 |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
255 /* |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
256 * If the thing is confused, let it move randomly. |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
257 */ |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
258 ch = CHASE; |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
259 onscare = FALSE; |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
260 if (on(*tp, ISHUH)) { |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
261 ch_ret = *rndmove(tp); |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
262 dist = DISTANCE(hero.y, hero.x, ch_ret.y, ch_ret.x); |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
263 if (rnd(1000) < 5) |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
264 tp->t_flags &= ~ISHUH; |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
265 if (dist == 0) |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
266 ch = FIGHT; |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
267 } |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
268 else { |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
269 /* |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
270 * Otherwise, find the the best spot to run to |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
271 * in order to get to your goal. |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
272 */ |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
273 numsteps = 0; |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
274 if (runaway) |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
275 closest = 0; |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
276 else |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
277 closest = FARAWAY; |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
278 ch_ret = *er; |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
279 closecoord = tp->t_oldpos; |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
280 for (y = er->y - 1; y <= er->y + 1; y += 1) { |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
281 for (x = er->x - 1; x <= er->x + 1; x += 1) { |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
282 if (!cordok(y, x)) |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
283 continue; |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
284 try.x = x; |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
285 try.y = y; |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
286 if (!diag_ok(er, &try)) |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
287 continue; |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
288 ch = winat(y, x); |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
289 if (step_ok(ch)) { |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
290 struct trap *trp; |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
291 |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
292 if (isatrap(ch)) { |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
293 trp = trap_at(y, x); |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
294 if (trp != NULL && off(*tp, ISHUH)) { |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
295 /* |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
296 * Dont run over found traps unless |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
297 * the hero is standing on it. If confused, |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
298 * then he can run into them. |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
299 */ |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
300 if (trp->tr_flags & ISFOUND) { |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
301 if (trp->tr_type == POOL && rnd(100) < 80) |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
302 continue; |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
303 else if (y != hero.y || x != hero.x) |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
304 continue; |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
305 } |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
306 } |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
307 } |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
308 /* |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
309 * Check for scare monster scrolls. |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
310 */ |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
311 if (ch == SCROLL) { |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
312 struct linked_list *item; |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
313 |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
314 item = find_obj(y, x); |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
315 if (item != NULL) |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
316 if ((OBJPTR(item))->o_which == S_SCARE) { |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
317 if (ce(hero, try)) |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
318 onscare = TRUE; |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
319 continue; |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
320 } |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
321 } |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
322 /* |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
323 * Vampires will not run into a lit room. |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
324 */ |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
325 if (tp->t_type == 'V') { |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
326 struct room *lr; |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
327 |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
328 lr = roomin(&try); |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
329 if (lr != NULL && !rf_on(lr, ISDARK)) |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
330 continue; |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
331 } |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
332 /* |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
333 * This is a valid place to step |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
334 */ |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
335 if (y == hero.y && x == hero.x) { |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
336 if (dofight) { |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
337 ch_ret = try; /* if fighting */ |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
338 return FIGHT; /* hit hero */ |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
339 } |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
340 else |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
341 continue; |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
342 } |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
343 thisdist = DISTANCE(y, x, ee->y, ee->x); |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
344 if (thisdist <= 0) { |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
345 ch_ret = try; /* got here but */ |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
346 return CHASE; /* dont fight */ |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
347 } |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
348 numsteps += 1; |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
349 if ((!runaway && thisdist < closest) || |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
350 (runaway && thisdist > closest)) { |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
351 /* |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
352 * dont count the monsters last position as |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
353 * the closest spot, unless running away and |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
354 * in the same room. |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
355 */ |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
356 if (!ce(try, tp->t_oldpos) || (runaway |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
357 && player.t_room == tp->t_room |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
358 && tp->t_room != NULL)) { |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
359 closest = thisdist; |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
360 closecoord = try; |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
361 } |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
362 } |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
363 } |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
364 } |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
365 } |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
366 /* |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
367 * If dead end, then go back from whence you came. |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
368 * Otherwise, pick the closest of the remaining spots. |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
369 */ |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
370 if (numsteps > 0) /* move to best spot */ |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
371 ch_ret = closecoord; |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
372 else { /* nowhere to go */ |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
373 if (DISTANCE(tp->t_pos.y, tp->t_pos.x, hero.y, hero.x) < 2) |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
374 if (!onscare) |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
375 ch_ret = hero; |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
376 } |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
377 if (ce(hero, ch_ret)) |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
378 ch = FIGHT; |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
379 } |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
380 return ch; |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
381 } |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
382 |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
383 |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
384 /* |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
385 * runto: |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
386 * Set a monster running after something |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
387 */ |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
388 runto(runner, spot) |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
389 struct coord *runner; |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
390 struct coord *spot; |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
391 { |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
392 reg struct linked_list *item; |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
393 reg struct thing *tp; |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
394 |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
395 if ((item = find_mons(runner->y, runner->x)) == NULL) |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
396 return; |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
397 tp = THINGPTR(item); |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
398 if (tp->t_flags & ISPARA) |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
399 return; |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
400 tp->t_dest = spot; |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
401 tp->t_flags |= ISRUN; |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
402 tp->t_flags &= ~ISHELD; |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
403 } |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
404 |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
405 |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
406 /* |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
407 * roomin: |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
408 * Find what room some coordinates are in. |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
409 * NULL means they aren't in any room. |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
410 */ |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
411 struct room * |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
412 roomin(cp) |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
413 struct coord *cp; |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
414 { |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
415 reg struct room *rp; |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
416 |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
417 if (cordok(cp->y, cp->x)) { |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
418 for (rp = rooms; rp < &rooms[MAXROOMS]; rp += 1) |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
419 if (inroom(rp, cp)) |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
420 return rp; |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
421 } |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
422 return NULL; |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
423 } |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
424 |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
425 |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
426 /* |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
427 * find_mons: |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
428 * Find the monster from his coordinates |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
429 */ |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
430 struct linked_list * |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
431 find_mons(y, x) |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
432 int y, x; |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
433 { |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
434 reg struct linked_list *item; |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
435 reg struct thing *th; |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
436 |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
437 for (item = mlist; item != NULL; item = next(item)) { |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
438 th = THINGPTR(item); |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
439 if (th->t_pos.y == y && th->t_pos.x == x) |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
440 return item; |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
441 } |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
442 return NULL; |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
443 } |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
444 |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
445 |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
446 /* |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
447 * diag_ok: |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
448 * Check to see if the move is legal if it is diagonal |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
449 */ |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
450 diag_ok(sp, ep) |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
451 struct coord *sp, *ep; |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
452 { |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
453 if (ep->x == sp->x || ep->y == sp->y) |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
454 return TRUE; |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
455 if (step_ok(mvinch(ep->y,sp->x)) && step_ok(mvinch(sp->y,ep->x))) |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
456 return TRUE; |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
457 return FALSE; |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
458 } |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
459 |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
460 |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
461 /* |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
462 * cansee: |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
463 * returns true if the hero can see a certain coordinate. |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
464 */ |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
465 cansee(y, x) |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
466 int y, x; |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
467 { |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
468 reg struct room *rer; |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
469 struct coord tp; |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
470 |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
471 if (pl_on(ISBLIND)) |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
472 return FALSE; |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
473 /* |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
474 * We can only see if the hero in the same room as |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
475 * the coordinate and the room is lit or if it is close. |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
476 */ |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
477 if (DISTANCE(y, x, hero.y, hero.x) < 3) |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
478 return TRUE; |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
479 tp.y = y; |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
480 tp.x = x; |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
481 rer = roomin(&tp); |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
482 if (rer != NULL && levtype != MAZELEV) |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
483 if (rer == player.t_room && !rf_on(rer,ISDARK)) |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
484 return TRUE; |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
485 return FALSE; |
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
elwin
parents:
diff
changeset
|
486 } |