1 /* $NetBSD: hack.search.c,v 1.4 1997/10/19 16:58:59 christos Exp $ */ 2 3 /* 4 * Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. 5 */ 6 7 #include <sys/cdefs.h> 8 #ifndef lint 9 __RCSID("$NetBSD: hack.search.c,v 1.4 1997/10/19 16:58:59 christos Exp $"); 10 #endif /* not lint */ 11 12 #include "hack.h" 13 #include "extern.h" 14 15 int 16 findit() 17 { /* returns number of things found */ 18 int num; 19 xchar zx, zy; 20 struct trap *ttmp; 21 struct monst *mtmp; 22 xchar lx, hx, ly, hy; 23 24 if (u.uswallow) 25 return (0); 26 for (lx = u.ux; (num = levl[lx - 1][u.uy].typ) && num != CORR; lx--); 27 for (hx = u.ux; (num = levl[hx + 1][u.uy].typ) && num != CORR; hx++); 28 for (ly = u.uy; (num = levl[u.ux][ly - 1].typ) && num != CORR; ly--); 29 for (hy = u.uy; (num = levl[u.ux][hy + 1].typ) && num != CORR; hy++); 30 num = 0; 31 for (zy = ly; zy <= hy; zy++) 32 for (zx = lx; zx <= hx; zx++) { 33 if (levl[zx][zy].typ == SDOOR) { 34 levl[zx][zy].typ = DOOR; 35 atl(zx, zy, '+'); 36 num++; 37 } else if (levl[zx][zy].typ == SCORR) { 38 levl[zx][zy].typ = CORR; 39 atl(zx, zy, CORR_SYM); 40 num++; 41 } else if ((ttmp = t_at(zx, zy)) != NULL) { 42 if (ttmp->ttyp == PIERC) { 43 (void) makemon(PM_PIERCER, zx, zy); 44 num++; 45 deltrap(ttmp); 46 } else if (!ttmp->tseen) { 47 ttmp->tseen = 1; 48 if (!vism_at(zx, zy)) 49 atl(zx, zy, '^'); 50 num++; 51 } 52 } else if ((mtmp = m_at(zx, zy)) != NULL) 53 if (mtmp->mimic) { 54 seemimic(mtmp); 55 num++; 56 } 57 } 58 return (num); 59 } 60 61 int 62 dosearch() 63 { 64 xchar x, y; 65 struct trap *trap; 66 struct monst *mtmp; 67 68 if (u.uswallow) 69 pline("What are you looking for? The exit?"); 70 else 71 for (x = u.ux - 1; x < u.ux + 2; x++) 72 for (y = u.uy - 1; y < u.uy + 2; y++) 73 if (x != u.ux || y != u.uy) { 74 if (levl[x][y].typ == SDOOR) { 75 if (rn2(7)) 76 continue; 77 levl[x][y].typ = DOOR; 78 levl[x][y].seen = 0; /* force prl */ 79 prl(x, y); 80 nomul(0); 81 } else if (levl[x][y].typ == SCORR) { 82 if (rn2(7)) 83 continue; 84 levl[x][y].typ = CORR; 85 levl[x][y].seen = 0; /* force prl */ 86 prl(x, y); 87 nomul(0); 88 } else { 89 /* 90 * Be careful not to find 91 * anything in an SCORR or 92 * SDOOR 93 */ 94 if ((mtmp = m_at(x, y)) != NULL) 95 if (mtmp->mimic) { 96 seemimic(mtmp); 97 pline("You find a mimic."); 98 return (1); 99 } 100 for (trap = ftrap; trap; trap = trap->ntrap) 101 if (trap->tx == x && trap->ty == y && 102 !trap->tseen && !rn2(8)) { 103 nomul(0); 104 pline("You find a%s.", traps[trap->ttyp]); 105 if (trap->ttyp == PIERC) { 106 deltrap(trap); 107 (void) makemon(PM_PIERCER, x, y); 108 return (1); 109 } 110 trap->tseen = 1; 111 if (!vism_at(x, y)) 112 atl(x, y, '^'); 113 } 114 } 115 } 116 return (1); 117 } 118 119 int 120 doidtrap() 121 { 122 struct trap *trap; 123 int x, y; 124 if (!getdir(1)) 125 return (0); 126 x = u.ux + u.dx; 127 y = u.uy + u.dy; 128 for (trap = ftrap; trap; trap = trap->ntrap) 129 if (trap->tx == x && trap->ty == y && trap->tseen) { 130 if (u.dz) 131 if ((u.dz < 0) != (!xdnstair && trap->ttyp == TRAPDOOR)) 132 continue; 133 pline("That is a%s.", traps[trap->ttyp]); 134 return (0); 135 } 136 pline("I can't see a trap there."); 137 return (0); 138 } 139 140 void 141 wakeup(mtmp) 142 struct monst *mtmp; 143 { 144 mtmp->msleep = 0; 145 setmangry(mtmp); 146 if (mtmp->mimic) 147 seemimic(mtmp); 148 } 149 150 /* NOTE: we must check if(mtmp->mimic) before calling this routine */ 151 void 152 seemimic(mtmp) 153 struct monst *mtmp; 154 { 155 mtmp->mimic = 0; 156 mtmp->mappearance = 0; 157 unpmon(mtmp); 158 pmon(mtmp); 159 } 160