date and time created 90/05/02 08:40:05 by bostic
authorKeith Bostic <bostic@ucbvax.Berkeley.EDU>
Wed, 2 May 1990 23:40:05 +0000 (15:40 -0800)
committerKeith Bostic <bostic@ucbvax.Berkeley.EDU>
Wed, 2 May 1990 23:40:05 +0000 (15:40 -0800)
SCCS-vsn: games/hack/hack.mkobj.c 5.1

usr/src/games/hack/hack.mkobj.c [new file with mode: 0644]

diff --git a/usr/src/games/hack/hack.mkobj.c b/usr/src/games/hack/hack.mkobj.c
new file mode 100644 (file)
index 0000000..18a6914
--- /dev/null
@@ -0,0 +1,148 @@
+/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
+/* hack.mkobj.c - version 1.0.3 */
+
+#include "hack.h"
+
+char mkobjstr[] = "))[[!!!!????%%%%/=**))[[!!!!????%%%%/=**(%";
+struct obj *mkobj(), *mksobj();
+
+struct obj *
+mkobj_at(let,x,y)
+register let,x,y;
+{
+       register struct obj *otmp = mkobj(let);
+       otmp->ox = x;
+       otmp->oy = y;
+       otmp->nobj = fobj;
+       fobj = otmp;
+       return(otmp);
+}
+
+mksobj_at(otyp,x,y)
+register otyp,x,y;
+{
+       register struct obj *otmp = mksobj(otyp);
+       otmp->ox = x;
+       otmp->oy = y;
+       otmp->nobj = fobj;
+       fobj = otmp;
+}
+
+struct obj *
+mkobj(let) {
+       if(!let)
+               let = mkobjstr[rn2(sizeof(mkobjstr) - 1)];
+       return(
+           mksobj(
+               letter(let) ?
+                   CORPSE + ((let > 'Z') ? (let-'a'+'Z'-'@'+1) : (let-'@'))
+               :   probtype(let)
+           )
+       );
+}
+       
+
+struct obj zeroobj;
+
+struct obj *
+mksobj(otyp)
+register otyp;
+{
+       register struct obj *otmp;
+       char let = objects[otyp].oc_olet;
+
+       otmp = newobj(0);
+       *otmp = zeroobj;
+       otmp->age = moves;
+       otmp->o_id = flags.ident++;
+       otmp->quan = 1;
+       otmp->olet = let;
+       otmp->otyp = otyp;
+       otmp->dknown = index("/=!?*", let) ? 0 : 1;
+       switch(let) {
+       case WEAPON_SYM:
+               otmp->quan = (otmp->otyp <= ROCK) ? rn1(6,6) : 1;
+               if(!rn2(11)) otmp->spe = rnd(3);
+               else if(!rn2(10)) {
+                       otmp->cursed = 1;
+                       otmp->spe = -rnd(3);
+               }
+               break;
+       case FOOD_SYM:
+               if(otmp->otyp >= CORPSE) break;
+#ifdef NOT_YET_IMPLEMENTED
+               /* if tins are to be identified, need to adapt doname() etc */
+               if(otmp->otyp == TIN)
+                       otmp->spe = rnd(...);
+#endif NOT_YET_IMPLEMENTED
+               /* fall into next case */
+       case GEM_SYM:
+               otmp->quan = rn2(6) ? 1 : 2;
+       case TOOL_SYM:
+       case CHAIN_SYM:
+       case BALL_SYM:
+       case ROCK_SYM:
+       case POTION_SYM:
+       case SCROLL_SYM:
+       case AMULET_SYM:
+               break;
+       case ARMOR_SYM:
+               if(!rn2(8)) otmp->cursed = 1;
+               if(!rn2(10)) otmp->spe = rnd(3);
+               else if(!rn2(9)) {
+                       otmp->spe = -rnd(3);
+                       otmp->cursed = 1;
+               }
+               break;
+       case WAND_SYM:
+               if(otmp->otyp == WAN_WISHING) otmp->spe = 3; else
+               otmp->spe = rn1(5,
+                       (objects[otmp->otyp].bits & NODIR) ? 11 : 4);
+               break;
+       case RING_SYM:
+               if(objects[otmp->otyp].bits & SPEC) {
+                       if(!rn2(3)) {
+                               otmp->cursed = 1;
+                               otmp->spe = -rnd(2);
+                       } else otmp->spe = rnd(2);
+               } else if(otmp->otyp == RIN_TELEPORTATION ||
+                         otmp->otyp == RIN_AGGRAVATE_MONSTER ||
+                         otmp->otyp == RIN_HUNGER || !rn2(9))
+                       otmp->cursed = 1;
+               break;
+       default:
+               panic("impossible mkobj");
+       }
+       otmp->owt = weight(otmp);
+       return(otmp);
+}
+
+letter(c) {
+       return(('@' <= c && c <= 'Z') || ('a' <= c && c <= 'z'));
+}
+
+weight(obj)
+register struct obj *obj;
+{
+register int wt = objects[obj->otyp].oc_weight;
+       return(wt ? wt*obj->quan : (obj->quan + 1)/2);
+}
+
+mkgold(num,x,y)
+register long num;
+{
+       register struct gold *gold;
+       register long amount = (num ? num : 1 + (rnd(dlevel+2) * rnd(30)));
+
+       if(gold = g_at(x,y))
+               gold->amount += amount;
+       else {
+               gold = newgold();
+               gold->ngold = fgold;
+               gold->gx = x;
+               gold->gy = y;
+               gold->amount = amount;
+               fgold = gold;
+               /* do sth with display? */
+       }
+}