home *** CD-ROM | disk | FTP | other *** search
/ Gold Fish 1 / GoldFishApril1994_CD1.img / d1xx / d190 / nethack / een.zoo / search.c < prev    next >
C/C++ Source or Header  |  1988-07-11  |  4KB  |  146 lines

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