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