summaryrefslogtreecommitdiff
path: root/games/hack/hack.mkobj.c
diff options
context:
space:
mode:
authorTheo de Raadt <deraadt@cvs.openbsd.org>1995-10-18 08:53:40 +0000
committerTheo de Raadt <deraadt@cvs.openbsd.org>1995-10-18 08:53:40 +0000
commitd6583bb2a13f329cf0332ef2570eb8bb8fc0e39c (patch)
treeece253b876159b39c620e62b6c9b1174642e070e /games/hack/hack.mkobj.c
initial import of NetBSD tree
Diffstat (limited to 'games/hack/hack.mkobj.c')
-rw-r--r--games/hack/hack.mkobj.c153
1 files changed, 153 insertions, 0 deletions
diff --git a/games/hack/hack.mkobj.c b/games/hack/hack.mkobj.c
new file mode 100644
index 00000000000..d4e37fd7928
--- /dev/null
+++ b/games/hack/hack.mkobj.c
@@ -0,0 +1,153 @@
+/*
+ * Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985.
+ */
+
+#ifndef lint
+static char rcsid[] = "$NetBSD: hack.mkobj.c,v 1.3 1995/03/23 08:30:47 cgd Exp $";
+#endif /* not lint */
+
+#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? */
+ }
+}