]>
git.cameronkatri.com Git - bsdgames-darwin.git/blob - hack/hack.vault.c
1 /* $NetBSD: hack.vault.c,v 1.9 2011/08/16 09:26:22 christos Exp $ */
4 * Copyright (c) 1985, Stichting Centrum voor Wiskunde en Informatica,
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions are
12 * - Redistributions of source code must retain the above copyright notice,
13 * this list of conditions and the following disclaimer.
15 * - Redistributions in binary form must reproduce the above copyright
16 * notice, this list of conditions and the following disclaimer in the
17 * documentation and/or other materials provided with the distribution.
19 * - Neither the name of the Stichting Centrum voor Wiskunde en
20 * Informatica, nor the names of its contributors may be used to endorse or
21 * promote products derived from this software without specific prior
24 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
25 * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
26 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
27 * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
28 * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
29 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
30 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
31 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
32 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
33 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
34 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
38 * Copyright (c) 1982 Jay Fenlason <hack@gnu.org>
39 * All rights reserved.
41 * Redistribution and use in source and binary forms, with or without
42 * modification, are permitted provided that the following conditions
44 * 1. Redistributions of source code must retain the above copyright
45 * notice, this list of conditions and the following disclaimer.
46 * 2. Redistributions in binary form must reproduce the above copyright
47 * notice, this list of conditions and the following disclaimer in the
48 * documentation and/or other materials provided with the distribution.
49 * 3. The name of the author may not be used to endorse or promote products
50 * derived from this software without specific prior written permission.
52 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
53 * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
54 * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
55 * THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
56 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
57 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
58 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
59 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
60 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
61 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
64 #include <sys/cdefs.h>
66 __RCSID("$NetBSD: hack.vault.c,v 1.9 2011/08/16 09:26:22 christos Exp $");
89 replgd(struct monst
*mtmp __unused
, struct monst
*mtmp2 __unused
)
101 #include "def.mkroom.h"
102 #define FCSIZ (ROWNO+COLNO)
103 struct fakecorridor
{
108 int fcbeg
, fcend
; /* fcend: first unused pos */
109 xchar gdx
, gdy
; /* goal of guard's walk */
111 struct fakecorridor fakecorr
[FCSIZ
];
114 static const struct permonst pm_guard
=
115 {"guard", '@', 12, 12, -1, 4, 10, sizeof(struct egd
)};
117 static struct monst
*guard
;
120 static void restfakecorr(void);
121 static int goldincorridor(void);
128 struct egd
*egd
= monster_private(guard
);
130 while ((fcbeg
= egd
->fcbeg
) < egd
->fcend
) {
131 fcx
= egd
->fakecorr
[fcbeg
].fx
;
132 fcy
= egd
->fakecorr
[fcbeg
].fy
;
133 if ((u
.ux
== fcx
&& u
.uy
== fcy
) || cansee(fcx
, fcy
) ||
136 crm
= &levl
[fcx
][fcy
];
137 crm
->typ
= egd
->fakecorr
[fcbeg
].ftyp
;
143 /* it seems he left the corridor - let the guard disappear */
152 struct egd
*egd
= monster_private(guard
);
154 for (fci
= egd
->fcbeg
; fci
< egd
->fcend
; fci
++)
155 if (g_at(egd
->fakecorr
[fci
].fx
, egd
->fakecorr
[fci
].fy
))
164 for (mtmp
= fmon
; mtmp
; mtmp
= mtmp
->nmon
)
176 int tmp
= inroom(u
.ux
, u
.uy
);
178 if (tmp
< 0 || rooms
[tmp
].rtype
!= VAULT
) {
182 if (++u
.uinvault
% 50 == 0 && (!guard
|| gdlevel
!= dlevel
)) {
184 int x
, y
, dd
, gx
, gy
;
186 /* first find the goal for the guard */
187 for (dd
= 1; (dd
< ROWNO
|| dd
< COLNO
); dd
++) {
188 for (y
= u
.uy
- dd
; y
<= u
.uy
+ dd
; y
++) {
189 if (y
< 0 || y
> ROWNO
- 1)
191 for (x
= u
.ux
- dd
; x
<= u
.ux
+ dd
; x
++) {
192 if (y
!= u
.uy
- dd
&& y
!= u
.uy
+ dd
&& x
!= u
.ux
- dd
)
194 if (x
< 0 || x
> COLNO
- 1)
196 if (levl
[x
][y
].typ
== CORR
)
201 impossible("Not a single corridor on this level??");
208 /* next find a good place for a door in the wall */
211 while (levl
[x
][y
].typ
== ROOM
) {
214 dx
= (gx
> x
) ? 1 : (gx
< x
) ? -1 : 0;
215 dy
= (gy
> y
) ? 1 : (gy
< y
) ? -1 : 0;
216 if (abs(gx
- x
) >= abs(gy
- y
))
222 /* make something interesting happen */
223 if (!(guard
= makemon(&pm_guard
, x
, y
)))
225 guard
->isgd
= guard
->mpeaceful
= 1;
226 egd
= monster_private(guard
);
229 if (!cansee(guard
->mx
, guard
->my
)) {
234 pline("Suddenly one of the Vault's guards enters!");
237 pline("\"Hello stranger, who are you?\" - ");
239 } while (!letter(buf
[0]));
241 if (!strcmp(buf
, "Croesus") || !strcmp(buf
, "Kroisos")) {
242 pline("\"Oh, yes - of course. Sorry to have disturbed you.\"");
248 pline("\"I don't know you.\"");
250 pline("\"Please follow me.\"");
252 pline("\"Most likely all that gold was stolen from this vault.\"");
253 pline("\"Please drop your gold (say d$ ) and follow me.\"");
258 egd
->fakecorr
[0].fx
= x
;
259 egd
->fakecorr
[0].fy
= y
;
260 egd
->fakecorr
[0].ftyp
= levl
[x
][y
].typ
;
261 levl
[x
][y
].typ
= DOOR
;
269 int x
, y
, dx
, dy
, gx
, gy
, nx
, ny
, typ
;
270 struct fakecorridor
*fcp
;
272 struct egd
*egd
= monster_private(guard
);
273 if (!guard
|| gdlevel
!= dlevel
) {
274 impossible("Where is the guard?");
275 return (2); /* died */
277 if (u
.ugold
|| goldincorridor())
278 return (0); /* didnt move */
279 if (dist(guard
->mx
, guard
->my
) > 1 || egd
->gddone
) {
281 return (0); /* didnt move */
285 /* look around (hor & vert only) for accessible places */
286 for (nx
= x
- 1; nx
<= x
+ 1; nx
++)
287 for (ny
= y
- 1; ny
<= y
+ 1; ny
++) {
288 if (nx
== x
|| ny
== y
)
289 if (nx
!= x
|| ny
!= y
)
291 if (!IS_WALL(typ
= (crm
= &levl
[nx
][ny
])->typ
) && typ
!= POOL
) {
293 for (i
= egd
->fcbeg
; i
< egd
->fcend
; i
++)
294 if (egd
->fakecorr
[i
].fx
== nx
&&
295 egd
->fakecorr
[i
].fy
== ny
)
297 if ((i
= inroom(nx
, ny
)) >= 0 && rooms
[i
].rtype
== VAULT
)
307 crm
->typ
= (typ
== SCORR
) ? CORR
: DOOR
;
316 dx
= (gx
> x
) ? 1 : (gx
< x
) ? -1 : 0;
317 dy
= (gy
> y
) ? 1 : (gy
< y
) ? -1 : 0;
318 if (abs(gx
- x
) >= abs(gy
- y
))
323 while ((typ
= (crm
= &levl
[nx
][ny
])->typ
) != 0) {
325 * in view of the above we must have IS_WALL(typ) or typ ==
328 /* must be a wall here */
329 if (isok(nx
+ nx
- x
, ny
+ ny
- y
) && typ
!= POOL
&&
330 ZAP_POS(levl
[nx
+ nx
- x
][ny
+ ny
- y
].typ
)) {
345 /* I don't like this, but ... */
351 if (cansee(nx
, ny
)) {
355 fcp
= &(egd
->fakecorr
[egd
->fcend
]);
356 if (egd
->fcend
++ == FCSIZ
)
357 panic("fakecorr overflow");
378 replgd(struct monst
*mtmp
, struct monst
*mtmp2
)