Home | History | Annotate | Line # | Download | only in hack
      1 /*	$NetBSD: hack.search.c,v 1.6 2009/06/07 18:30:39 dholland Exp $	*/
      2 
      3 /*
      4  * Copyright (c) 1985, Stichting Centrum voor Wiskunde en Informatica,
      5  * Amsterdam
      6  * All rights reserved.
      7  *
      8  * Redistribution and use in source and binary forms, with or without
      9  * modification, are permitted provided that the following conditions are
     10  * met:
     11  *
     12  * - Redistributions of source code must retain the above copyright notice,
     13  * this list of conditions and the following disclaimer.
     14  *
     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.
     18  *
     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
     22  * written permission.
     23  *
     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.
     35  */
     36 
     37 /*
     38  * Copyright (c) 1982 Jay Fenlason <hack (at) gnu.org>
     39  * All rights reserved.
     40  *
     41  * Redistribution and use in source and binary forms, with or without
     42  * modification, are permitted provided that the following conditions
     43  * are met:
     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.
     51  *
     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.
     62  */
     63 
     64 #include <sys/cdefs.h>
     65 #ifndef lint
     66 __RCSID("$NetBSD: hack.search.c,v 1.6 2009/06/07 18:30:39 dholland Exp $");
     67 #endif				/* not lint */
     68 
     69 #include "hack.h"
     70 #include "extern.h"
     71 
     72 int
     73 findit(void)
     74 {				/* returns number of things found */
     75 	int             num;
     76 	xchar           zx, zy;
     77 	struct trap    *ttmp;
     78 	struct monst   *mtmp;
     79 	xchar           lx, hx, ly, hy;
     80 
     81 	if (u.uswallow)
     82 		return (0);
     83 	for (lx = u.ux; (num = levl[lx - 1][u.uy].typ) && num != CORR; lx--);
     84 	for (hx = u.ux; (num = levl[hx + 1][u.uy].typ) && num != CORR; hx++);
     85 	for (ly = u.uy; (num = levl[u.ux][ly - 1].typ) && num != CORR; ly--);
     86 	for (hy = u.uy; (num = levl[u.ux][hy + 1].typ) && num != CORR; hy++);
     87 	num = 0;
     88 	for (zy = ly; zy <= hy; zy++)
     89 		for (zx = lx; zx <= hx; zx++) {
     90 			if (levl[zx][zy].typ == SDOOR) {
     91 				levl[zx][zy].typ = DOOR;
     92 				atl(zx, zy, '+');
     93 				num++;
     94 			} else if (levl[zx][zy].typ == SCORR) {
     95 				levl[zx][zy].typ = CORR;
     96 				atl(zx, zy, CORR_SYM);
     97 				num++;
     98 			} else if ((ttmp = t_at(zx, zy)) != NULL) {
     99 				if (ttmp->ttyp == PIERC) {
    100 					(void) makemon(PM_PIERCER, zx, zy);
    101 					num++;
    102 					deltrap(ttmp);
    103 				} else if (!ttmp->tseen) {
    104 					ttmp->tseen = 1;
    105 					if (!vism_at(zx, zy))
    106 						atl(zx, zy, '^');
    107 					num++;
    108 				}
    109 			} else if ((mtmp = m_at(zx, zy)) != NULL)
    110 				if (mtmp->mimic) {
    111 					seemimic(mtmp);
    112 					num++;
    113 				}
    114 		}
    115 	return (num);
    116 }
    117 
    118 int
    119 dosearch(void)
    120 {
    121 	xchar           x, y;
    122 	struct trap    *trap;
    123 	struct monst   *mtmp;
    124 
    125 	if (u.uswallow)
    126 		pline("What are you looking for? The exit?");
    127 	else
    128 		for (x = u.ux - 1; x < u.ux + 2; x++)
    129 			for (y = u.uy - 1; y < u.uy + 2; y++)
    130 				if (x != u.ux || y != u.uy) {
    131 					if (levl[x][y].typ == SDOOR) {
    132 						if (rn2(7))
    133 							continue;
    134 						levl[x][y].typ = DOOR;
    135 						levl[x][y].seen = 0;	/* force prl */
    136 						prl(x, y);
    137 						nomul(0);
    138 					} else if (levl[x][y].typ == SCORR) {
    139 						if (rn2(7))
    140 							continue;
    141 						levl[x][y].typ = CORR;
    142 						levl[x][y].seen = 0;	/* force prl */
    143 						prl(x, y);
    144 						nomul(0);
    145 					} else {
    146 						/*
    147 						 * Be careful not to find
    148 						 * anything in an SCORR or
    149 						 * SDOOR
    150 						 */
    151 						if ((mtmp = m_at(x, y)) != NULL)
    152 							if (mtmp->mimic) {
    153 								seemimic(mtmp);
    154 								pline("You find a mimic.");
    155 								return (1);
    156 							}
    157 						for (trap = ftrap; trap; trap = trap->ntrap)
    158 							if (trap->tx == x && trap->ty == y &&
    159 							    !trap->tseen && !rn2(8)) {
    160 								nomul(0);
    161 								pline("You find a%s.", traps[trap->ttyp]);
    162 								if (trap->ttyp == PIERC) {
    163 									deltrap(trap);
    164 									(void) makemon(PM_PIERCER, x, y);
    165 									return (1);
    166 								}
    167 								trap->tseen = 1;
    168 								if (!vism_at(x, y))
    169 									atl(x, y, '^');
    170 							}
    171 					}
    172 				}
    173 	return (1);
    174 }
    175 
    176 int
    177 doidtrap(void)
    178 {
    179 	struct trap    *trap;
    180 	int             x, y;
    181 	if (!getdir(1))
    182 		return (0);
    183 	x = u.ux + u.dx;
    184 	y = u.uy + u.dy;
    185 	for (trap = ftrap; trap; trap = trap->ntrap)
    186 		if (trap->tx == x && trap->ty == y && trap->tseen) {
    187 			if (u.dz)
    188 				if ((u.dz < 0) != (!xdnstair && trap->ttyp == TRAPDOOR))
    189 					continue;
    190 			pline("That is a%s.", traps[trap->ttyp]);
    191 			return (0);
    192 		}
    193 	pline("I can't see a trap there.");
    194 	return (0);
    195 }
    196 
    197 void
    198 wakeup(struct monst *mtmp)
    199 {
    200 	mtmp->msleep = 0;
    201 	setmangry(mtmp);
    202 	if (mtmp->mimic)
    203 		seemimic(mtmp);
    204 }
    205 
    206 /* NOTE: we must check if(mtmp->mimic) before calling this routine */
    207 void
    208 seemimic(struct monst *mtmp)
    209 {
    210 	mtmp->mimic = 0;
    211 	mtmp->mappearance = 0;
    212 	unpmon(mtmp);
    213 	pmon(mtmp);
    214 }
    215