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

  1. /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
  2. /* mkobj.c - version 1.0.3 */
  3.  
  4. #include "hack.h"
  5.  
  6. char mkobjstr[] = "))[[!!!!????%%%%/=**))[[!!!!????%%%%/=**(%";
  7. struct obj *mkobj(), *mksobj();
  8.  
  9. struct obj *
  10. mkobj_at(let,x,y)
  11. register let,x,y;
  12. {
  13.     register struct obj *otmp = mkobj(let);
  14.     otmp->ox = x;
  15.     otmp->oy = y;
  16.     otmp->nobj = fobj;
  17.     fobj = otmp;
  18.     return(otmp);
  19. }
  20.  
  21. mksobj_at(otyp,x,y)
  22. register otyp,x,y;
  23. {
  24.     register struct obj *otmp = mksobj(otyp);
  25.     otmp->ox = x;
  26.     otmp->oy = y;
  27.     otmp->nobj = fobj;
  28.     fobj = otmp;
  29. }
  30.  
  31. struct obj *
  32. mkobj(let) {
  33.     if(!let)
  34.         let = mkobjstr[rn2(sizeof(mkobjstr) - 1)];
  35.     return(
  36.         mksobj(
  37.         letter(let) ?
  38.             CORPSE + ((let > 'Z') ? (let-'a'+'Z'-'@'+1) : (let-'@'))
  39.         :   probtype(let)
  40.         )
  41.     );
  42. }
  43.     
  44.  
  45. struct obj zeroobj;
  46.  
  47. struct obj *
  48. mksobj(otyp)
  49. register otyp;
  50. {
  51.     register struct obj *otmp;
  52.     char let = objects[otyp].oc_olet;
  53.  
  54.     otmp = newobj(0);
  55.     *otmp = zeroobj;
  56.     otmp->age = moves;
  57.     otmp->o_id = flags.ident++;
  58.     otmp->quan = 1;
  59.     otmp->olet = let;
  60.     otmp->otyp = otyp;
  61.     otmp->dknown = index("/=!?*", let) ? 0 : 1;
  62.     switch(let) {
  63.     case WEAPON_SYM:
  64.         otmp->quan = (otmp->otyp <= ROCK) ? rn1(6,6) : 1;
  65.         if(!rn2(11)) otmp->spe = rnd(3);
  66.         else if(!rn2(10)) {
  67.             otmp->cursed = 1;
  68.             otmp->spe = -rnd(3);
  69.         }
  70.         break;
  71.     case FOOD_SYM:
  72.         if(otmp->otyp >= CORPSE) break;
  73. #ifdef NOT_YET_IMPLEMENTED
  74.         /* if tins are to be identified, need to adapt doname() etc */
  75.         if(otmp->otyp == TIN)
  76.             otmp->spe = rnd(...);
  77. #endif NOT_YET_IMPLEMENTED
  78.         /* fall into next case */
  79.     case GEM_SYM:
  80.         otmp->quan = rn2(6) ? 1 : 2;
  81.     case TOOL_SYM:
  82.     case CHAIN_SYM:
  83.     case BALL_SYM:
  84.     case ROCK_SYM:
  85.     case POTION_SYM:
  86.     case SCROLL_SYM:
  87.     case AMULET_SYM:
  88.         break;
  89.     case ARMOR_SYM:
  90.         if(!rn2(8)) otmp->cursed = 1;
  91.         if(!rn2(10)) otmp->spe = rnd(3);
  92.         else if(!rn2(9)) {
  93.             otmp->spe = -rnd(3);
  94.             otmp->cursed = 1;
  95.         }
  96.         break;
  97.     case WAND_SYM:
  98.         if(otmp->otyp == WAN_WISHING) otmp->spe = 3; else
  99.         otmp->spe = rn1(5,
  100.             (objects[otmp->otyp].bits & NODIR) ? 11 : 4);
  101.         break;
  102.     case RING_SYM:
  103.         if(objects[otmp->otyp].bits & SPEC) {
  104.             if(!rn2(3)) {
  105.                 otmp->cursed = 1;
  106.                 otmp->spe = -rnd(2);
  107.             } else otmp->spe = rnd(2);
  108.         } else if(otmp->otyp == RIN_TELEPORTATION ||
  109.               otmp->otyp == RIN_AGGRAVATE_MONSTER ||
  110.               otmp->otyp == RIN_HUNGER || !rn2(9))
  111.             otmp->cursed = 1;
  112.         break;
  113.     default:
  114.         panic("impossible mkobj");
  115.     }
  116.     otmp->owt = weight(otmp);
  117.     return(otmp);
  118. }
  119.  
  120. letter(c) {
  121.     return(('@' <= c && c <= 'Z') || ('a' <= c && c <= 'z'));
  122. }
  123.  
  124. weight(obj)
  125. register struct obj *obj;
  126. {
  127. register int wt = objects[obj->otyp].oc_weight;
  128.     return(wt ? wt*obj->quan : (obj->quan + 1)/2);
  129. }
  130.  
  131. mkgold(num,x,y)
  132. register long num;
  133. {
  134.     register struct gold *gold;
  135.     register long amount = (num ? num : 1 + (rnd(dlevel+2) * rnd(30)));
  136.  
  137.     if(gold = g_at(x,y))
  138.         gold->amount += amount;
  139.     else {
  140.         gold = newgold();
  141.         gold->ngold = fgold;
  142.         gold->gx = x;
  143.         gold->gy = y;
  144.         gold->amount = amount;
  145.         fgold = gold;
  146.         /* do sth with display? */
  147.     }
  148. }
  149.