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