home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / HACKSRC.ZIP / STEAL.C < prev    next >
C/C++ Source or Header  |  1985-10-16  |  5KB  |  204 lines

  1. /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
  2. /* steal.c - version 1.0.3 */
  3.  
  4. #include "hack.h"
  5.  
  6. long        /* actually returns something that fits in an int */
  7. somegold(){
  8.     return( (u.ugold < 100) ? u.ugold :
  9.         (u.ugold > 10000) ? rnd(10000) : rnd((int) u.ugold) );
  10. }
  11.  
  12. stealgold(mtmp)  register struct monst *mtmp; {
  13. register struct gold *gold = g_at(u.ux, u.uy);
  14. register long tmp;
  15.     if(gold && ( !u.ugold || gold->amount > u.ugold || !rn2(5))) {
  16.         mtmp->mgold += gold->amount;
  17.         freegold(gold);
  18.         if(Invisible) newsym(u.ux, u.uy);
  19.         pline("%s quickly snatches some gold from between your feet!",
  20.             Monnam(mtmp));
  21.         if(!u.ugold || !rn2(5)) {
  22.             rloc(mtmp);
  23.             mtmp->mflee = 1;
  24.         }
  25.     } else if(u.ugold) {
  26.         u.ugold -= (tmp = somegold());
  27.         pline("Your purse feels lighter.");
  28.         mtmp->mgold += tmp;
  29.         rloc(mtmp);
  30.         mtmp->mflee = 1;
  31.         flags.botl = 1;
  32.     }
  33. }
  34.  
  35. /* steal armor after he finishes taking it off */
  36. unsigned stealoid;        /* object to be stolen */
  37. unsigned stealmid;        /* monster doing the stealing */
  38. stealarm(){
  39.     register struct monst *mtmp;
  40.     register struct obj *otmp;
  41.  
  42.     for(otmp = invent; otmp; otmp = otmp->nobj)
  43.       if(otmp->o_id == stealoid) {
  44.         for(mtmp = fmon; mtmp; mtmp = mtmp->nmon)
  45.           if(mtmp->m_id == stealmid) {
  46.         if(dist(mtmp->mx,mtmp->my) < 3) {
  47.           freeinv(otmp);
  48.           pline("%s steals %s!", Monnam(mtmp), doname(otmp));
  49.           mpickobj(mtmp,otmp);
  50.           mtmp->mflee = 1;
  51.           rloc(mtmp);
  52.         }
  53.         break;
  54.           }
  55.         break;
  56.       }
  57.     stealoid = 0;
  58. }
  59.  
  60. /* returns 1 when something was stolen */
  61. /* (or at least, when N should flee now) */
  62. /* avoid stealing the object stealoid */
  63. steal(mtmp)
  64. struct monst *mtmp;
  65. {
  66.     register struct obj *otmp;
  67.     register tmp;
  68.     register named = 0;
  69.  
  70.     if(!invent){
  71.         if(Blind)
  72.           pline("Somebody tries to rob you, but finds nothing to steal.");
  73.         else
  74.           pline("%s tries to rob you, but she finds nothing to steal!",
  75.         Monnam(mtmp));
  76.         return(1);    /* let her flee */
  77.     }
  78.     tmp = 0;
  79.     for(otmp = invent; otmp; otmp = otmp->nobj) if(otmp != uarm2)
  80.         tmp += ((otmp->owornmask & (W_ARMOR | W_RING)) ? 5 : 1);
  81.     tmp = rn2(tmp);
  82.     for(otmp = invent; otmp; otmp = otmp->nobj) if(otmp != uarm2)
  83.         if((tmp -= ((otmp->owornmask & (W_ARMOR | W_RING)) ? 5 : 1))
  84.             < 0) break;
  85.     if(!otmp) {
  86.         impossible("Steal fails!");
  87.         return(0);
  88.     }
  89.     if(otmp->o_id == stealoid)
  90.         return(0);
  91.     if((otmp->owornmask & (W_ARMOR | W_RING))){
  92.         switch(otmp->olet) {
  93.         case RING_SYM:
  94.             ringoff(otmp);
  95.             break;
  96.         case ARMOR_SYM:
  97.             if(multi < 0 || otmp == uarms){
  98.               setworn((struct obj *) 0, otmp->owornmask & W_ARMOR);
  99.               break;
  100.             }
  101.         { int curssv = otmp->cursed;
  102.             otmp->cursed = 0;
  103.             stop_occupation();
  104.             pline("%s seduces you and %s off your %s.",
  105.                 Amonnam(mtmp, Blind ? "gentle" : "beautiful"),
  106.                 otmp->cursed ? "helps you to take"
  107.                         : "you start taking",
  108.                 (otmp == uarmg) ? "gloves" :
  109.                 (otmp == uarmh) ? "helmet" : "armor");
  110.             named++;
  111.             (void) armoroff(otmp);
  112.             otmp->cursed = curssv;
  113.             if(multi < 0){
  114.                 extern char *nomovemsg;
  115.                 extern int (*afternmv)();
  116.                 /*
  117.                 multi = 0;
  118.                 nomovemsg = 0;
  119.                 afternmv = 0;
  120.                 */
  121.                 stealoid = otmp->o_id;
  122.                 stealmid = mtmp->m_id;
  123.                 afternmv = stealarm;
  124.                 return(0);
  125.             }
  126.             break;
  127.         }
  128.         default:
  129.             impossible("Tried to steal a strange worn thing.");
  130.         }
  131.     }
  132.     else if(otmp == uwep)
  133.         setuwep((struct obj *) 0);
  134.     if(otmp->olet == CHAIN_SYM) {
  135.         impossible("How come you are carrying that chain?");
  136.     }
  137.     if(Punished && otmp == uball){
  138.         Punished = 0;
  139.         freeobj(uchain);
  140.         free((char *) uchain);
  141.         uchain = (struct obj *) 0;
  142.         uball->spe = 0;
  143.         uball = (struct obj *) 0;    /* superfluous */
  144.     }
  145.     freeinv(otmp);
  146.     pline("%s stole %s.", named ? "She" : Monnam(mtmp), doname(otmp));
  147.     mpickobj(mtmp,otmp);
  148.     return((multi < 0) ? 0 : 1);
  149. }
  150.  
  151. mpickobj(mtmp,otmp)
  152. register struct monst *mtmp;
  153. register struct obj *otmp;
  154. {
  155.     otmp->nobj = mtmp->minvent;
  156.     mtmp->minvent = otmp;
  157. }
  158.  
  159. stealamulet(mtmp)
  160. register struct monst *mtmp;
  161. {
  162.     register struct obj *otmp;
  163.  
  164.     for(otmp = invent; otmp; otmp = otmp->nobj) {
  165.         if(otmp->olet == AMULET_SYM) {
  166.         /* might be an imitation one */
  167.         if(otmp == uwep) setuwep((struct obj *) 0);
  168.         freeinv(otmp);
  169.         mpickobj(mtmp,otmp);
  170.         pline("%s stole %s!", Monnam(mtmp), doname(otmp));
  171.         return(1);
  172.         }
  173.     }
  174.     return(0);
  175. }
  176.  
  177. /* release the objects the killed animal has stolen */
  178. relobj(mtmp,show)
  179. register struct monst *mtmp;
  180. register show;
  181. {
  182.     register struct obj *otmp, *otmp2;
  183.  
  184.     for(otmp = mtmp->minvent; otmp; otmp = otmp2){
  185.         otmp->ox = mtmp->mx;
  186.         otmp->oy = mtmp->my;
  187.         otmp2 = otmp->nobj;
  188.         otmp->nobj = fobj;
  189.         fobj = otmp;
  190.         stackobj(fobj);
  191.         if(show & cansee(mtmp->mx,mtmp->my))
  192.             atl(otmp->ox,otmp->oy,otmp->olet);
  193.     }
  194.     mtmp->minvent = (struct obj *) 0;
  195.     if(mtmp->mgold || mtmp->data->mlet == 'L') {
  196.         register long tmp;
  197.  
  198.         tmp = (mtmp->mgold > 10000) ? 10000 : mtmp->mgold;
  199.         mkgold((long)(tmp + d(dlevel,30)), mtmp->mx, mtmp->my);
  200.         if(show & cansee(mtmp->mx,mtmp->my))
  201.             atl(mtmp->mx,mtmp->my,'$');
  202.     }
  203. }
  204.