Commit | Line | Data |
---|---|---|
15637ed4 RG |
1 | /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ |
2 | /* hack.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 | } |