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