1*e3b78ef1SRobin Karlsson /* $NetBSD: object.c,v 1.14 2009/08/12 08:44:45 dholland Exp $ */
2*e3b78ef1SRobin Karlsson
3*e3b78ef1SRobin Karlsson /*
4*e3b78ef1SRobin Karlsson * Copyright (c) 1988, 1993
5*e3b78ef1SRobin Karlsson * The Regents of the University of California. All rights reserved.
6*e3b78ef1SRobin Karlsson *
7*e3b78ef1SRobin Karlsson * This code is derived from software contributed to Berkeley by
8*e3b78ef1SRobin Karlsson * Timothy C. Stoehr.
9*e3b78ef1SRobin Karlsson *
10*e3b78ef1SRobin Karlsson * Redistribution and use in source and binary forms, with or without
11*e3b78ef1SRobin Karlsson * modification, are permitted provided that the following conditions
12*e3b78ef1SRobin Karlsson * are met:
13*e3b78ef1SRobin Karlsson * 1. Redistributions of source code must retain the above copyright
14*e3b78ef1SRobin Karlsson * notice, this list of conditions and the following disclaimer.
15*e3b78ef1SRobin Karlsson * 2. Redistributions in binary form must reproduce the above copyright
16*e3b78ef1SRobin Karlsson * notice, this list of conditions and the following disclaimer in the
17*e3b78ef1SRobin Karlsson * documentation and/or other materials provided with the distribution.
18*e3b78ef1SRobin Karlsson * 3. Neither the name of the University nor the names of its contributors
19*e3b78ef1SRobin Karlsson * may be used to endorse or promote products derived from this software
20*e3b78ef1SRobin Karlsson * without specific prior written permission.
21*e3b78ef1SRobin Karlsson *
22*e3b78ef1SRobin Karlsson * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
23*e3b78ef1SRobin Karlsson * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
24*e3b78ef1SRobin Karlsson * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
25*e3b78ef1SRobin Karlsson * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
26*e3b78ef1SRobin Karlsson * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
27*e3b78ef1SRobin Karlsson * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
28*e3b78ef1SRobin Karlsson * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
29*e3b78ef1SRobin Karlsson * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
30*e3b78ef1SRobin Karlsson * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
31*e3b78ef1SRobin Karlsson * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
32*e3b78ef1SRobin Karlsson * SUCH DAMAGE.
33*e3b78ef1SRobin Karlsson */
34*e3b78ef1SRobin Karlsson
35*e3b78ef1SRobin Karlsson #include <sys/cdefs.h>
36*e3b78ef1SRobin Karlsson #ifndef lint
37*e3b78ef1SRobin Karlsson #if 0
38*e3b78ef1SRobin Karlsson static char sccsid[] = "@(#)object.c 8.1 (Berkeley) 5/31/93";
39*e3b78ef1SRobin Karlsson #else
40*e3b78ef1SRobin Karlsson __RCSID("$NetBSD: object.c,v 1.14 2009/08/12 08:44:45 dholland Exp $");
41*e3b78ef1SRobin Karlsson #endif
42*e3b78ef1SRobin Karlsson #endif /* not lint */
43*e3b78ef1SRobin Karlsson
44*e3b78ef1SRobin Karlsson /*
45*e3b78ef1SRobin Karlsson * object.c
46*e3b78ef1SRobin Karlsson *
47*e3b78ef1SRobin Karlsson * This source herein may be modified and/or distributed by anybody who
48*e3b78ef1SRobin Karlsson * so desires, with the following restrictions:
49*e3b78ef1SRobin Karlsson * 1.) No portion of this notice shall be removed.
50*e3b78ef1SRobin Karlsson * 2.) Credit shall not be taken for the creation of this source.
51*e3b78ef1SRobin Karlsson * 3.) This code is not to be traded, sold, or used for personal
52*e3b78ef1SRobin Karlsson * gain or profit.
53*e3b78ef1SRobin Karlsson *
54*e3b78ef1SRobin Karlsson */
55*e3b78ef1SRobin Karlsson
56*e3b78ef1SRobin Karlsson #include "rogue.h"
57*e3b78ef1SRobin Karlsson
58*e3b78ef1SRobin Karlsson object level_objects;
59*e3b78ef1SRobin Karlsson unsigned short dungeon[DROWS][DCOLS];
60*e3b78ef1SRobin Karlsson short foods = 0;
61*e3b78ef1SRobin Karlsson char *fruit = NULL;
62*e3b78ef1SRobin Karlsson
63*e3b78ef1SRobin Karlsson static object *free_list = NULL;
64*e3b78ef1SRobin Karlsson
65*e3b78ef1SRobin Karlsson fighter rogue = {
66*e3b78ef1SRobin Karlsson INIT_AW, /* armor */
67*e3b78ef1SRobin Karlsson INIT_AW, /* weapon */
68*e3b78ef1SRobin Karlsson INIT_RINGS, /* left ring */
69*e3b78ef1SRobin Karlsson INIT_RINGS, /* right ring */
70*e3b78ef1SRobin Karlsson INIT_HP, /* Hp current */
71*e3b78ef1SRobin Karlsson INIT_HP, /* Hp max */
72*e3b78ef1SRobin Karlsson INIT_STR, /* Str current */
73*e3b78ef1SRobin Karlsson INIT_STR, /* Str max */
74*e3b78ef1SRobin Karlsson INIT_PACK, /* pack */
75*e3b78ef1SRobin Karlsson INIT_GOLD, /* gold */
76*e3b78ef1SRobin Karlsson INIT_EXPLEVEL, /* exp level */
77*e3b78ef1SRobin Karlsson INIT_EXP, /* exp points */
78*e3b78ef1SRobin Karlsson 0, 0, /* row, col */
79*e3b78ef1SRobin Karlsson INIT_CHAR, /* char */
80*e3b78ef1SRobin Karlsson INIT_MOVES /* moves */
81*e3b78ef1SRobin Karlsson };
82*e3b78ef1SRobin Karlsson
83*e3b78ef1SRobin Karlsson struct id id_potions[POTIONS] = {
84*e3b78ef1SRobin Karlsson {100, "blue ", "of increase strength ", 0},
85*e3b78ef1SRobin Karlsson {250, "red ", "of restore strength ", 0},
86*e3b78ef1SRobin Karlsson {100, "green ", "of healing ", 0},
87*e3b78ef1SRobin Karlsson {200, "grey ", "of extra healing ", 0},
88*e3b78ef1SRobin Karlsson {10, "brown ", "of poison ", 0},
89*e3b78ef1SRobin Karlsson {300, "clear ", "of raise level ", 0},
90*e3b78ef1SRobin Karlsson {10, "pink ", "of blindness ", 0},
91*e3b78ef1SRobin Karlsson {25, "white ", "of hallucination ", 0},
92*e3b78ef1SRobin Karlsson {100, "purple ", "of detect monster ", 0},
93*e3b78ef1SRobin Karlsson {100, "black ", "of detect things ", 0},
94*e3b78ef1SRobin Karlsson {10, "yellow ", "of confusion ", 0},
95*e3b78ef1SRobin Karlsson {80, "plaid ", "of levitation ", 0},
96*e3b78ef1SRobin Karlsson {150, "burgundy ", "of haste self ", 0},
97*e3b78ef1SRobin Karlsson {145, "beige ", "of see invisible ", 0}
98*e3b78ef1SRobin Karlsson };
99*e3b78ef1SRobin Karlsson
100*e3b78ef1SRobin Karlsson struct id id_scrolls[SCROLS] = {
101*e3b78ef1SRobin Karlsson {505, "", "of protect armor ", 0},
102*e3b78ef1SRobin Karlsson {200, "", "of hold monster ", 0},
103*e3b78ef1SRobin Karlsson {235, "", "of enchant weapon ", 0},
104*e3b78ef1SRobin Karlsson {235, "", "of enchant armor ", 0},
105*e3b78ef1SRobin Karlsson {175, "", "of identify ", 0},
106*e3b78ef1SRobin Karlsson {190, "", "of teleportation ", 0},
107*e3b78ef1SRobin Karlsson {25, "", "of sleep ", 0},
108*e3b78ef1SRobin Karlsson {610, "", "of scare monster ", 0},
109*e3b78ef1SRobin Karlsson {210, "", "of remove curse ", 0},
110*e3b78ef1SRobin Karlsson {80, "", "of create monster ",0},
111*e3b78ef1SRobin Karlsson {25, "", "of aggravate monster ",0},
112*e3b78ef1SRobin Karlsson {180, "", "of magic mapping ", 0},
113*e3b78ef1SRobin Karlsson {90, "", "of confuse monster ", 0}
114*e3b78ef1SRobin Karlsson };
115*e3b78ef1SRobin Karlsson
116*e3b78ef1SRobin Karlsson struct id id_weapons[WEAPONS] = {
117*e3b78ef1SRobin Karlsson {150, "short bow ", "", 0},
118*e3b78ef1SRobin Karlsson {8, "darts ", "", 0},
119*e3b78ef1SRobin Karlsson {15, "arrows ", "", 0},
120*e3b78ef1SRobin Karlsson {27, "daggers ", "", 0},
121*e3b78ef1SRobin Karlsson {35, "shurikens ", "", 0},
122*e3b78ef1SRobin Karlsson {360, "mace ", "", 0},
123*e3b78ef1SRobin Karlsson {470, "long sword ", "", 0},
124*e3b78ef1SRobin Karlsson {580, "two-handed sword ", "", 0}
125*e3b78ef1SRobin Karlsson };
126*e3b78ef1SRobin Karlsson
127*e3b78ef1SRobin Karlsson struct id id_armors[ARMORS] = {
128*e3b78ef1SRobin Karlsson {300, "leather armor ", "", (UNIDENTIFIED)},
129*e3b78ef1SRobin Karlsson {300, "ring mail ", "", (UNIDENTIFIED)},
130*e3b78ef1SRobin Karlsson {400, "scale mail ", "", (UNIDENTIFIED)},
131*e3b78ef1SRobin Karlsson {500, "chain mail ", "", (UNIDENTIFIED)},
132*e3b78ef1SRobin Karlsson {600, "banded mail ", "", (UNIDENTIFIED)},
133*e3b78ef1SRobin Karlsson {600, "splint mail ", "", (UNIDENTIFIED)},
134*e3b78ef1SRobin Karlsson {700, "plate mail ", "", (UNIDENTIFIED)}
135*e3b78ef1SRobin Karlsson };
136*e3b78ef1SRobin Karlsson
137*e3b78ef1SRobin Karlsson struct id id_wands[WANDS] = {
138*e3b78ef1SRobin Karlsson {25, "", "of teleport away ",0},
139*e3b78ef1SRobin Karlsson {50, "", "of slow monster ", 0},
140*e3b78ef1SRobin Karlsson {8, "", "of invisibility ",0},
141*e3b78ef1SRobin Karlsson {55, "", "of polymorph ",0},
142*e3b78ef1SRobin Karlsson {2, "", "of haste monster ",0},
143*e3b78ef1SRobin Karlsson {20, "", "of magic missile ",0},
144*e3b78ef1SRobin Karlsson {20, "", "of cancellation ",0},
145*e3b78ef1SRobin Karlsson {0, "", "of do nothing ",0},
146*e3b78ef1SRobin Karlsson {35, "", "of drain life ",0},
147*e3b78ef1SRobin Karlsson {20, "", "of cold ",0},
148*e3b78ef1SRobin Karlsson {20, "", "of fire ",0}
149*e3b78ef1SRobin Karlsson };
150*e3b78ef1SRobin Karlsson
151*e3b78ef1SRobin Karlsson struct id id_rings[RINGS] = {
152*e3b78ef1SRobin Karlsson {250, "", "of stealth ",0},
153*e3b78ef1SRobin Karlsson {100, "", "of teleportation ", 0},
154*e3b78ef1SRobin Karlsson {255, "", "of regeneration ",0},
155*e3b78ef1SRobin Karlsson {295, "", "of slow digestion ",0},
156*e3b78ef1SRobin Karlsson {200, "", "of add strength ",0},
157*e3b78ef1SRobin Karlsson {250, "", "of sustain strength ",0},
158*e3b78ef1SRobin Karlsson {250, "", "of dexterity ",0},
159*e3b78ef1SRobin Karlsson {25, "", "of adornment ",0},
160*e3b78ef1SRobin Karlsson {300, "", "of see invisible ",0},
161*e3b78ef1SRobin Karlsson {290, "", "of maintain armor ",0},
162*e3b78ef1SRobin Karlsson {270, "", "of searching ",0},
163*e3b78ef1SRobin Karlsson };
164*e3b78ef1SRobin Karlsson
165*e3b78ef1SRobin Karlsson static void gr_armor(object *);
166*e3b78ef1SRobin Karlsson static void gr_potion(object *);
167*e3b78ef1SRobin Karlsson static void gr_scroll(object *);
168*e3b78ef1SRobin Karlsson static void gr_wand(object *);
169*e3b78ef1SRobin Karlsson static void gr_weapon(object *, int);
170*e3b78ef1SRobin Karlsson static unsigned short gr_what_is(void);
171*e3b78ef1SRobin Karlsson static void make_party(void);
172*e3b78ef1SRobin Karlsson static void plant_gold(short, short, boolean);
173*e3b78ef1SRobin Karlsson static void put_gold(void);
174*e3b78ef1SRobin Karlsson static void rand_place(object *);
175*e3b78ef1SRobin Karlsson
176*e3b78ef1SRobin Karlsson void
put_objects(void)177*e3b78ef1SRobin Karlsson put_objects(void)
178*e3b78ef1SRobin Karlsson {
179*e3b78ef1SRobin Karlsson short i, n;
180*e3b78ef1SRobin Karlsson object *obj;
181*e3b78ef1SRobin Karlsson
182*e3b78ef1SRobin Karlsson if (cur_level < max_level) {
183*e3b78ef1SRobin Karlsson return;
184*e3b78ef1SRobin Karlsson }
185*e3b78ef1SRobin Karlsson n = coin_toss() ? get_rand(2, 4) : get_rand(3, 5);
186*e3b78ef1SRobin Karlsson while (rand_percent(33)) {
187*e3b78ef1SRobin Karlsson n++;
188*e3b78ef1SRobin Karlsson }
189*e3b78ef1SRobin Karlsson if (party_room != NO_ROOM) {
190*e3b78ef1SRobin Karlsson make_party();
191*e3b78ef1SRobin Karlsson }
192*e3b78ef1SRobin Karlsson for (i = 0; i < n; i++) {
193*e3b78ef1SRobin Karlsson obj = gr_object();
194*e3b78ef1SRobin Karlsson rand_place(obj);
195*e3b78ef1SRobin Karlsson }
196*e3b78ef1SRobin Karlsson put_gold();
197*e3b78ef1SRobin Karlsson }
198*e3b78ef1SRobin Karlsson
199*e3b78ef1SRobin Karlsson static void
put_gold(void)200*e3b78ef1SRobin Karlsson put_gold(void)
201*e3b78ef1SRobin Karlsson {
202*e3b78ef1SRobin Karlsson short i, j;
203*e3b78ef1SRobin Karlsson short row,col;
204*e3b78ef1SRobin Karlsson boolean is_maze, is_room;
205*e3b78ef1SRobin Karlsson
206*e3b78ef1SRobin Karlsson for (i = 0; i < MAXROOMS; i++) {
207*e3b78ef1SRobin Karlsson is_maze = (rooms[i].is_room & R_MAZE) ? 1 : 0;
208*e3b78ef1SRobin Karlsson is_room = (rooms[i].is_room & R_ROOM) ? 1 : 0;
209*e3b78ef1SRobin Karlsson
210*e3b78ef1SRobin Karlsson if (!(is_room || is_maze)) {
211*e3b78ef1SRobin Karlsson continue;
212*e3b78ef1SRobin Karlsson }
213*e3b78ef1SRobin Karlsson if (is_maze || rand_percent(GOLD_PERCENT)) {
214*e3b78ef1SRobin Karlsson for (j = 0; j < 50; j++) {
215*e3b78ef1SRobin Karlsson row = get_rand(rooms[i].top_row+1,
216*e3b78ef1SRobin Karlsson rooms[i].bottom_row-1);
217*e3b78ef1SRobin Karlsson col = get_rand(rooms[i].left_col+1,
218*e3b78ef1SRobin Karlsson rooms[i].right_col-1);
219*e3b78ef1SRobin Karlsson if ((dungeon[row][col] == FLOOR) ||
220*e3b78ef1SRobin Karlsson (dungeon[row][col] == TUNNEL)) {
221*e3b78ef1SRobin Karlsson plant_gold(row, col, is_maze);
222*e3b78ef1SRobin Karlsson break;
223*e3b78ef1SRobin Karlsson }
224*e3b78ef1SRobin Karlsson }
225*e3b78ef1SRobin Karlsson }
226*e3b78ef1SRobin Karlsson }
227*e3b78ef1SRobin Karlsson }
228*e3b78ef1SRobin Karlsson
229*e3b78ef1SRobin Karlsson static void
plant_gold(short row,short col,boolean is_maze)230*e3b78ef1SRobin Karlsson plant_gold(short row, short col, boolean is_maze)
231*e3b78ef1SRobin Karlsson {
232*e3b78ef1SRobin Karlsson object *obj;
233*e3b78ef1SRobin Karlsson
234*e3b78ef1SRobin Karlsson obj = alloc_object();
235*e3b78ef1SRobin Karlsson obj->row = row; obj->col = col;
236*e3b78ef1SRobin Karlsson obj->what_is = GOLD;
237*e3b78ef1SRobin Karlsson obj->quantity = get_rand((2 * cur_level), (16 * cur_level));
238*e3b78ef1SRobin Karlsson if (is_maze) {
239*e3b78ef1SRobin Karlsson obj->quantity += obj->quantity / 2;
240*e3b78ef1SRobin Karlsson }
241*e3b78ef1SRobin Karlsson dungeon[row][col] |= OBJECT;
242*e3b78ef1SRobin Karlsson (void)add_to_pack(obj, &level_objects, 0);
243*e3b78ef1SRobin Karlsson }
244*e3b78ef1SRobin Karlsson
245*e3b78ef1SRobin Karlsson void
place_at(object * obj,int row,int col)246*e3b78ef1SRobin Karlsson place_at(object *obj, int row, int col)
247*e3b78ef1SRobin Karlsson {
248*e3b78ef1SRobin Karlsson obj->row = row;
249*e3b78ef1SRobin Karlsson obj->col = col;
250*e3b78ef1SRobin Karlsson dungeon[row][col] |= OBJECT;
251*e3b78ef1SRobin Karlsson (void)add_to_pack(obj, &level_objects, 0);
252*e3b78ef1SRobin Karlsson }
253*e3b78ef1SRobin Karlsson
254*e3b78ef1SRobin Karlsson object *
object_at(object * pack,short row,short col)255*e3b78ef1SRobin Karlsson object_at(object *pack, short row, short col)
256*e3b78ef1SRobin Karlsson {
257*e3b78ef1SRobin Karlsson object *obj = NULL;
258*e3b78ef1SRobin Karlsson
259*e3b78ef1SRobin Karlsson if (dungeon[row][col] & (MONSTER | OBJECT)) {
260*e3b78ef1SRobin Karlsson obj = pack->next_object;
261*e3b78ef1SRobin Karlsson
262*e3b78ef1SRobin Karlsson while (obj && ((obj->row != row) || (obj->col != col))) {
263*e3b78ef1SRobin Karlsson obj = obj->next_object;
264*e3b78ef1SRobin Karlsson }
265*e3b78ef1SRobin Karlsson if (!obj) {
266*e3b78ef1SRobin Karlsson messagef(1, "object_at(): inconsistent");
267*e3b78ef1SRobin Karlsson }
268*e3b78ef1SRobin Karlsson }
269*e3b78ef1SRobin Karlsson return(obj);
270*e3b78ef1SRobin Karlsson }
271*e3b78ef1SRobin Karlsson
272*e3b78ef1SRobin Karlsson object *
get_letter_object(int ch)273*e3b78ef1SRobin Karlsson get_letter_object(int ch)
274*e3b78ef1SRobin Karlsson {
275*e3b78ef1SRobin Karlsson object *obj;
276*e3b78ef1SRobin Karlsson
277*e3b78ef1SRobin Karlsson obj = rogue.pack.next_object;
278*e3b78ef1SRobin Karlsson
279*e3b78ef1SRobin Karlsson while (obj && (obj->ichar != ch)) {
280*e3b78ef1SRobin Karlsson obj = obj->next_object;
281*e3b78ef1SRobin Karlsson }
282*e3b78ef1SRobin Karlsson return(obj);
283*e3b78ef1SRobin Karlsson }
284*e3b78ef1SRobin Karlsson
285*e3b78ef1SRobin Karlsson void
free_stuff(object * objlist)286*e3b78ef1SRobin Karlsson free_stuff(object *objlist)
287*e3b78ef1SRobin Karlsson {
288*e3b78ef1SRobin Karlsson object *obj;
289*e3b78ef1SRobin Karlsson
290*e3b78ef1SRobin Karlsson while (objlist->next_object) {
291*e3b78ef1SRobin Karlsson obj = objlist->next_object;
292*e3b78ef1SRobin Karlsson objlist->next_object =
293*e3b78ef1SRobin Karlsson objlist->next_object->next_object;
294*e3b78ef1SRobin Karlsson free_object(obj);
295*e3b78ef1SRobin Karlsson }
296*e3b78ef1SRobin Karlsson }
297*e3b78ef1SRobin Karlsson
298*e3b78ef1SRobin Karlsson const char *
name_of(const object * obj)299*e3b78ef1SRobin Karlsson name_of(const object *obj)
300*e3b78ef1SRobin Karlsson {
301*e3b78ef1SRobin Karlsson const char *retstring;
302*e3b78ef1SRobin Karlsson
303*e3b78ef1SRobin Karlsson switch(obj->what_is) {
304*e3b78ef1SRobin Karlsson case SCROL:
305*e3b78ef1SRobin Karlsson retstring = obj->quantity > 1 ? "scrolls " : "scroll ";
306*e3b78ef1SRobin Karlsson break;
307*e3b78ef1SRobin Karlsson case POTION:
308*e3b78ef1SRobin Karlsson retstring = obj->quantity > 1 ? "potions " : "potion ";
309*e3b78ef1SRobin Karlsson break;
310*e3b78ef1SRobin Karlsson case FOOD:
311*e3b78ef1SRobin Karlsson if (obj->which_kind == RATION) {
312*e3b78ef1SRobin Karlsson retstring = "food ";
313*e3b78ef1SRobin Karlsson } else {
314*e3b78ef1SRobin Karlsson retstring = fruit;
315*e3b78ef1SRobin Karlsson }
316*e3b78ef1SRobin Karlsson break;
317*e3b78ef1SRobin Karlsson case WAND:
318*e3b78ef1SRobin Karlsson retstring = is_wood[obj->which_kind] ? "staff " : "wand ";
319*e3b78ef1SRobin Karlsson break;
320*e3b78ef1SRobin Karlsson case WEAPON:
321*e3b78ef1SRobin Karlsson switch(obj->which_kind) {
322*e3b78ef1SRobin Karlsson case DART:
323*e3b78ef1SRobin Karlsson retstring=obj->quantity > 1 ? "darts " : "dart ";
324*e3b78ef1SRobin Karlsson break;
325*e3b78ef1SRobin Karlsson case ARROW:
326*e3b78ef1SRobin Karlsson retstring=obj->quantity > 1 ? "arrows " : "arrow ";
327*e3b78ef1SRobin Karlsson break;
328*e3b78ef1SRobin Karlsson case DAGGER:
329*e3b78ef1SRobin Karlsson retstring=obj->quantity > 1 ? "daggers " : "dagger ";
330*e3b78ef1SRobin Karlsson break;
331*e3b78ef1SRobin Karlsson case SHURIKEN:
332*e3b78ef1SRobin Karlsson retstring=obj->quantity > 1?"shurikens ":"shuriken ";
333*e3b78ef1SRobin Karlsson break;
334*e3b78ef1SRobin Karlsson default:
335*e3b78ef1SRobin Karlsson retstring = id_weapons[obj->which_kind].title;
336*e3b78ef1SRobin Karlsson }
337*e3b78ef1SRobin Karlsson break;
338*e3b78ef1SRobin Karlsson case ARMOR:
339*e3b78ef1SRobin Karlsson retstring = "armor ";
340*e3b78ef1SRobin Karlsson break;
341*e3b78ef1SRobin Karlsson case RING:
342*e3b78ef1SRobin Karlsson retstring = "ring ";
343*e3b78ef1SRobin Karlsson break;
344*e3b78ef1SRobin Karlsson case AMULET:
345*e3b78ef1SRobin Karlsson retstring = "amulet ";
346*e3b78ef1SRobin Karlsson break;
347*e3b78ef1SRobin Karlsson default:
348*e3b78ef1SRobin Karlsson retstring = "unknown ";
349*e3b78ef1SRobin Karlsson break;
350*e3b78ef1SRobin Karlsson }
351*e3b78ef1SRobin Karlsson return(retstring);
352*e3b78ef1SRobin Karlsson }
353*e3b78ef1SRobin Karlsson
354*e3b78ef1SRobin Karlsson object *
gr_object(void)355*e3b78ef1SRobin Karlsson gr_object(void)
356*e3b78ef1SRobin Karlsson {
357*e3b78ef1SRobin Karlsson object *obj;
358*e3b78ef1SRobin Karlsson
359*e3b78ef1SRobin Karlsson obj = alloc_object();
360*e3b78ef1SRobin Karlsson
361*e3b78ef1SRobin Karlsson if (foods < (cur_level / 3)) {
362*e3b78ef1SRobin Karlsson obj->what_is = FOOD;
363*e3b78ef1SRobin Karlsson foods++;
364*e3b78ef1SRobin Karlsson } else {
365*e3b78ef1SRobin Karlsson obj->what_is = gr_what_is();
366*e3b78ef1SRobin Karlsson }
367*e3b78ef1SRobin Karlsson switch(obj->what_is) {
368*e3b78ef1SRobin Karlsson case SCROL:
369*e3b78ef1SRobin Karlsson gr_scroll(obj);
370*e3b78ef1SRobin Karlsson break;
371*e3b78ef1SRobin Karlsson case POTION:
372*e3b78ef1SRobin Karlsson gr_potion(obj);
373*e3b78ef1SRobin Karlsson break;
374*e3b78ef1SRobin Karlsson case WEAPON:
375*e3b78ef1SRobin Karlsson gr_weapon(obj, 1);
376*e3b78ef1SRobin Karlsson break;
377*e3b78ef1SRobin Karlsson case ARMOR:
378*e3b78ef1SRobin Karlsson gr_armor(obj);
379*e3b78ef1SRobin Karlsson break;
380*e3b78ef1SRobin Karlsson case WAND:
381*e3b78ef1SRobin Karlsson gr_wand(obj);
382*e3b78ef1SRobin Karlsson break;
383*e3b78ef1SRobin Karlsson case FOOD:
384*e3b78ef1SRobin Karlsson get_food(obj, 0);
385*e3b78ef1SRobin Karlsson break;
386*e3b78ef1SRobin Karlsson case RING:
387*e3b78ef1SRobin Karlsson gr_ring(obj, 1);
388*e3b78ef1SRobin Karlsson break;
389*e3b78ef1SRobin Karlsson }
390*e3b78ef1SRobin Karlsson return(obj);
391*e3b78ef1SRobin Karlsson }
392*e3b78ef1SRobin Karlsson
393*e3b78ef1SRobin Karlsson static unsigned short
gr_what_is(void)394*e3b78ef1SRobin Karlsson gr_what_is(void)
395*e3b78ef1SRobin Karlsson {
396*e3b78ef1SRobin Karlsson short percent;
397*e3b78ef1SRobin Karlsson unsigned short what_is;
398*e3b78ef1SRobin Karlsson
399*e3b78ef1SRobin Karlsson percent = get_rand(1, 91);
400*e3b78ef1SRobin Karlsson
401*e3b78ef1SRobin Karlsson if (percent <= 30) {
402*e3b78ef1SRobin Karlsson what_is = SCROL;
403*e3b78ef1SRobin Karlsson } else if (percent <= 60) {
404*e3b78ef1SRobin Karlsson what_is = POTION;
405*e3b78ef1SRobin Karlsson } else if (percent <= 64) {
406*e3b78ef1SRobin Karlsson what_is = WAND;
407*e3b78ef1SRobin Karlsson } else if (percent <= 74) {
408*e3b78ef1SRobin Karlsson what_is = WEAPON;
409*e3b78ef1SRobin Karlsson } else if (percent <= 83) {
410*e3b78ef1SRobin Karlsson what_is = ARMOR;
411*e3b78ef1SRobin Karlsson } else if (percent <= 88) {
412*e3b78ef1SRobin Karlsson what_is = FOOD;
413*e3b78ef1SRobin Karlsson } else {
414*e3b78ef1SRobin Karlsson what_is = RING;
415*e3b78ef1SRobin Karlsson }
416*e3b78ef1SRobin Karlsson return(what_is);
417*e3b78ef1SRobin Karlsson }
418*e3b78ef1SRobin Karlsson
419*e3b78ef1SRobin Karlsson static void
gr_scroll(object * obj)420*e3b78ef1SRobin Karlsson gr_scroll(object *obj)
421*e3b78ef1SRobin Karlsson {
422*e3b78ef1SRobin Karlsson short percent;
423*e3b78ef1SRobin Karlsson
424*e3b78ef1SRobin Karlsson percent = get_rand(0, 91);
425*e3b78ef1SRobin Karlsson
426*e3b78ef1SRobin Karlsson obj->what_is = SCROL;
427*e3b78ef1SRobin Karlsson
428*e3b78ef1SRobin Karlsson if (percent <= 5) {
429*e3b78ef1SRobin Karlsson obj->which_kind = PROTECT_ARMOR;
430*e3b78ef1SRobin Karlsson } else if (percent <= 10) {
431*e3b78ef1SRobin Karlsson obj->which_kind = HOLD_MONSTER;
432*e3b78ef1SRobin Karlsson } else if (percent <= 20) {
433*e3b78ef1SRobin Karlsson obj->which_kind = CREATE_MONSTER;
434*e3b78ef1SRobin Karlsson } else if (percent <= 35) {
435*e3b78ef1SRobin Karlsson obj->which_kind = IDENTIFY;
436*e3b78ef1SRobin Karlsson } else if (percent <= 43) {
437*e3b78ef1SRobin Karlsson obj->which_kind = TELEPORT;
438*e3b78ef1SRobin Karlsson } else if (percent <= 50) {
439*e3b78ef1SRobin Karlsson obj->which_kind = SLEEP;
440*e3b78ef1SRobin Karlsson } else if (percent <= 55) {
441*e3b78ef1SRobin Karlsson obj->which_kind = SCARE_MONSTER;
442*e3b78ef1SRobin Karlsson } else if (percent <= 64) {
443*e3b78ef1SRobin Karlsson obj->which_kind = REMOVE_CURSE;
444*e3b78ef1SRobin Karlsson } else if (percent <= 69) {
445*e3b78ef1SRobin Karlsson obj->which_kind = ENCH_ARMOR;
446*e3b78ef1SRobin Karlsson } else if (percent <= 74) {
447*e3b78ef1SRobin Karlsson obj->which_kind = ENCH_WEAPON;
448*e3b78ef1SRobin Karlsson } else if (percent <= 80) {
449*e3b78ef1SRobin Karlsson obj->which_kind = AGGRAVATE_MONSTER;
450*e3b78ef1SRobin Karlsson } else if (percent <= 86) {
451*e3b78ef1SRobin Karlsson obj->which_kind = CON_MON;
452*e3b78ef1SRobin Karlsson } else {
453*e3b78ef1SRobin Karlsson obj->which_kind = MAGIC_MAPPING;
454*e3b78ef1SRobin Karlsson }
455*e3b78ef1SRobin Karlsson }
456*e3b78ef1SRobin Karlsson
457*e3b78ef1SRobin Karlsson static void
gr_potion(object * obj)458*e3b78ef1SRobin Karlsson gr_potion(object *obj)
459*e3b78ef1SRobin Karlsson {
460*e3b78ef1SRobin Karlsson short percent;
461*e3b78ef1SRobin Karlsson
462*e3b78ef1SRobin Karlsson percent = get_rand(1, 118);
463*e3b78ef1SRobin Karlsson
464*e3b78ef1SRobin Karlsson obj->what_is = POTION;
465*e3b78ef1SRobin Karlsson
466*e3b78ef1SRobin Karlsson if (percent <= 5) {
467*e3b78ef1SRobin Karlsson obj->which_kind = RAISE_LEVEL;
468*e3b78ef1SRobin Karlsson } else if (percent <= 15) {
469*e3b78ef1SRobin Karlsson obj->which_kind = DETECT_OBJECTS;
470*e3b78ef1SRobin Karlsson } else if (percent <= 25) {
471*e3b78ef1SRobin Karlsson obj->which_kind = DETECT_MONSTER;
472*e3b78ef1SRobin Karlsson } else if (percent <= 35) {
473*e3b78ef1SRobin Karlsson obj->which_kind = INCREASE_STRENGTH;
474*e3b78ef1SRobin Karlsson } else if (percent <= 45) {
475*e3b78ef1SRobin Karlsson obj->which_kind = RESTORE_STRENGTH;
476*e3b78ef1SRobin Karlsson } else if (percent <= 55) {
477*e3b78ef1SRobin Karlsson obj->which_kind = HEALING;
478*e3b78ef1SRobin Karlsson } else if (percent <= 65) {
479*e3b78ef1SRobin Karlsson obj->which_kind = EXTRA_HEALING;
480*e3b78ef1SRobin Karlsson } else if (percent <= 75) {
481*e3b78ef1SRobin Karlsson obj->which_kind = BLINDNESS;
482*e3b78ef1SRobin Karlsson } else if (percent <= 85) {
483*e3b78ef1SRobin Karlsson obj->which_kind = HALLUCINATION;
484*e3b78ef1SRobin Karlsson } else if (percent <= 95) {
485*e3b78ef1SRobin Karlsson obj->which_kind = CONFUSION;
486*e3b78ef1SRobin Karlsson } else if (percent <= 105) {
487*e3b78ef1SRobin Karlsson obj->which_kind = POISON;
488*e3b78ef1SRobin Karlsson } else if (percent <= 110) {
489*e3b78ef1SRobin Karlsson obj->which_kind = LEVITATION;
490*e3b78ef1SRobin Karlsson } else if (percent <= 114) {
491*e3b78ef1SRobin Karlsson obj->which_kind = HASTE_SELF;
492*e3b78ef1SRobin Karlsson } else {
493*e3b78ef1SRobin Karlsson obj->which_kind = SEE_INVISIBLE;
494*e3b78ef1SRobin Karlsson }
495*e3b78ef1SRobin Karlsson }
496*e3b78ef1SRobin Karlsson
497*e3b78ef1SRobin Karlsson static void
gr_weapon(object * obj,int assign_wk)498*e3b78ef1SRobin Karlsson gr_weapon(object *obj, int assign_wk)
499*e3b78ef1SRobin Karlsson {
500*e3b78ef1SRobin Karlsson short percent;
501*e3b78ef1SRobin Karlsson short i;
502*e3b78ef1SRobin Karlsson short blessing, increment;
503*e3b78ef1SRobin Karlsson
504*e3b78ef1SRobin Karlsson obj->what_is = WEAPON;
505*e3b78ef1SRobin Karlsson if (assign_wk) {
506*e3b78ef1SRobin Karlsson obj->which_kind = get_rand(0, (WEAPONS - 1));
507*e3b78ef1SRobin Karlsson }
508*e3b78ef1SRobin Karlsson if ((obj->which_kind == ARROW) || (obj->which_kind == DAGGER) ||
509*e3b78ef1SRobin Karlsson (obj->which_kind == SHURIKEN) || (obj->which_kind == DART)) {
510*e3b78ef1SRobin Karlsson obj->quantity = get_rand(3, 15);
511*e3b78ef1SRobin Karlsson obj->quiver = get_rand(0, 126);
512*e3b78ef1SRobin Karlsson } else {
513*e3b78ef1SRobin Karlsson obj->quantity = 1;
514*e3b78ef1SRobin Karlsson }
515*e3b78ef1SRobin Karlsson obj->hit_enchant = obj->d_enchant = 0;
516*e3b78ef1SRobin Karlsson
517*e3b78ef1SRobin Karlsson percent = get_rand(1, 96);
518*e3b78ef1SRobin Karlsson blessing = get_rand(1, 3);
519*e3b78ef1SRobin Karlsson
520*e3b78ef1SRobin Karlsson if (percent <= 32) {
521*e3b78ef1SRobin Karlsson if (percent <= 16) {
522*e3b78ef1SRobin Karlsson increment = 1;
523*e3b78ef1SRobin Karlsson } else {
524*e3b78ef1SRobin Karlsson increment = -1;
525*e3b78ef1SRobin Karlsson obj->is_cursed = 1;
526*e3b78ef1SRobin Karlsson }
527*e3b78ef1SRobin Karlsson for (i = 0; i < blessing; i++) {
528*e3b78ef1SRobin Karlsson if (coin_toss()) {
529*e3b78ef1SRobin Karlsson obj->hit_enchant += increment;
530*e3b78ef1SRobin Karlsson } else {
531*e3b78ef1SRobin Karlsson obj->d_enchant += increment;
532*e3b78ef1SRobin Karlsson }
533*e3b78ef1SRobin Karlsson }
534*e3b78ef1SRobin Karlsson }
535*e3b78ef1SRobin Karlsson switch(obj->which_kind) {
536*e3b78ef1SRobin Karlsson case BOW:
537*e3b78ef1SRobin Karlsson case DART:
538*e3b78ef1SRobin Karlsson obj->damage = "1d1";
539*e3b78ef1SRobin Karlsson break;
540*e3b78ef1SRobin Karlsson case ARROW:
541*e3b78ef1SRobin Karlsson obj->damage = "1d2";
542*e3b78ef1SRobin Karlsson break;
543*e3b78ef1SRobin Karlsson case DAGGER:
544*e3b78ef1SRobin Karlsson obj->damage = "1d3";
545*e3b78ef1SRobin Karlsson break;
546*e3b78ef1SRobin Karlsson case SHURIKEN:
547*e3b78ef1SRobin Karlsson obj->damage = "1d4";
548*e3b78ef1SRobin Karlsson break;
549*e3b78ef1SRobin Karlsson case MACE:
550*e3b78ef1SRobin Karlsson obj->damage = "2d3";
551*e3b78ef1SRobin Karlsson break;
552*e3b78ef1SRobin Karlsson case LONG_SWORD:
553*e3b78ef1SRobin Karlsson obj->damage = "3d4";
554*e3b78ef1SRobin Karlsson break;
555*e3b78ef1SRobin Karlsson case TWO_HANDED_SWORD:
556*e3b78ef1SRobin Karlsson obj->damage = "4d5";
557*e3b78ef1SRobin Karlsson break;
558*e3b78ef1SRobin Karlsson }
559*e3b78ef1SRobin Karlsson }
560*e3b78ef1SRobin Karlsson
561*e3b78ef1SRobin Karlsson static void
gr_armor(object * obj)562*e3b78ef1SRobin Karlsson gr_armor(object *obj)
563*e3b78ef1SRobin Karlsson {
564*e3b78ef1SRobin Karlsson short percent;
565*e3b78ef1SRobin Karlsson short blessing;
566*e3b78ef1SRobin Karlsson
567*e3b78ef1SRobin Karlsson obj->what_is = ARMOR;
568*e3b78ef1SRobin Karlsson obj->which_kind = get_rand(0, (ARMORS - 1));
569*e3b78ef1SRobin Karlsson obj->class = obj->which_kind + 2;
570*e3b78ef1SRobin Karlsson if ((obj->which_kind == PLATE) || (obj->which_kind == SPLINT)) {
571*e3b78ef1SRobin Karlsson obj->class--;
572*e3b78ef1SRobin Karlsson }
573*e3b78ef1SRobin Karlsson obj->is_protected = 0;
574*e3b78ef1SRobin Karlsson obj->d_enchant = 0;
575*e3b78ef1SRobin Karlsson
576*e3b78ef1SRobin Karlsson percent = get_rand(1, 100);
577*e3b78ef1SRobin Karlsson blessing = get_rand(1, 3);
578*e3b78ef1SRobin Karlsson
579*e3b78ef1SRobin Karlsson if (percent <= 16) {
580*e3b78ef1SRobin Karlsson obj->is_cursed = 1;
581*e3b78ef1SRobin Karlsson obj->d_enchant -= blessing;
582*e3b78ef1SRobin Karlsson } else if (percent <= 33) {
583*e3b78ef1SRobin Karlsson obj->d_enchant += blessing;
584*e3b78ef1SRobin Karlsson }
585*e3b78ef1SRobin Karlsson }
586*e3b78ef1SRobin Karlsson
587*e3b78ef1SRobin Karlsson static void
gr_wand(object * obj)588*e3b78ef1SRobin Karlsson gr_wand(object *obj)
589*e3b78ef1SRobin Karlsson {
590*e3b78ef1SRobin Karlsson obj->what_is = WAND;
591*e3b78ef1SRobin Karlsson obj->which_kind = get_rand(0, (WANDS - 1));
592*e3b78ef1SRobin Karlsson obj->class = get_rand(3, 7);
593*e3b78ef1SRobin Karlsson }
594*e3b78ef1SRobin Karlsson
595*e3b78ef1SRobin Karlsson void
get_food(object * obj,boolean force_ration)596*e3b78ef1SRobin Karlsson get_food(object *obj, boolean force_ration)
597*e3b78ef1SRobin Karlsson {
598*e3b78ef1SRobin Karlsson obj->what_is = FOOD;
599*e3b78ef1SRobin Karlsson
600*e3b78ef1SRobin Karlsson if (force_ration || rand_percent(80)) {
601*e3b78ef1SRobin Karlsson obj->which_kind = RATION;
602*e3b78ef1SRobin Karlsson } else {
603*e3b78ef1SRobin Karlsson obj->which_kind = FRUIT;
604*e3b78ef1SRobin Karlsson }
605*e3b78ef1SRobin Karlsson }
606*e3b78ef1SRobin Karlsson
607*e3b78ef1SRobin Karlsson void
put_stairs(void)608*e3b78ef1SRobin Karlsson put_stairs(void)
609*e3b78ef1SRobin Karlsson {
610*e3b78ef1SRobin Karlsson short row, col;
611*e3b78ef1SRobin Karlsson
612*e3b78ef1SRobin Karlsson gr_row_col(&row, &col, (FLOOR | TUNNEL));
613*e3b78ef1SRobin Karlsson dungeon[row][col] |= STAIRS;
614*e3b78ef1SRobin Karlsson }
615*e3b78ef1SRobin Karlsson
616*e3b78ef1SRobin Karlsson int
get_armor_class(const object * obj)617*e3b78ef1SRobin Karlsson get_armor_class(const object *obj)
618*e3b78ef1SRobin Karlsson {
619*e3b78ef1SRobin Karlsson if (obj) {
620*e3b78ef1SRobin Karlsson return(obj->class + obj->d_enchant);
621*e3b78ef1SRobin Karlsson }
622*e3b78ef1SRobin Karlsson return(0);
623*e3b78ef1SRobin Karlsson }
624*e3b78ef1SRobin Karlsson
625*e3b78ef1SRobin Karlsson object *
alloc_object(void)626*e3b78ef1SRobin Karlsson alloc_object(void)
627*e3b78ef1SRobin Karlsson {
628*e3b78ef1SRobin Karlsson object *obj;
629*e3b78ef1SRobin Karlsson
630*e3b78ef1SRobin Karlsson if (free_list) {
631*e3b78ef1SRobin Karlsson obj = free_list;
632*e3b78ef1SRobin Karlsson free_list = free_list->next_object;
633*e3b78ef1SRobin Karlsson } else if (!(obj = md_malloc(sizeof(object)))) {
634*e3b78ef1SRobin Karlsson messagef(0, "cannot allocate object, saving game");
635*e3b78ef1SRobin Karlsson save_into_file(error_file);
636*e3b78ef1SRobin Karlsson clean_up("alloc_object: save failed");
637*e3b78ef1SRobin Karlsson }
638*e3b78ef1SRobin Karlsson obj->quantity = 1;
639*e3b78ef1SRobin Karlsson obj->ichar = 'L';
640*e3b78ef1SRobin Karlsson obj->picked_up = obj->is_cursed = 0;
641*e3b78ef1SRobin Karlsson obj->in_use_flags = NOT_USED;
642*e3b78ef1SRobin Karlsson obj->identified = UNIDENTIFIED;
643*e3b78ef1SRobin Karlsson obj->damage = "1d1";
644*e3b78ef1SRobin Karlsson return(obj);
645*e3b78ef1SRobin Karlsson }
646*e3b78ef1SRobin Karlsson
647*e3b78ef1SRobin Karlsson void
free_object(object * obj)648*e3b78ef1SRobin Karlsson free_object(object *obj)
649*e3b78ef1SRobin Karlsson {
650*e3b78ef1SRobin Karlsson obj->next_object = free_list;
651*e3b78ef1SRobin Karlsson free_list = obj;
652*e3b78ef1SRobin Karlsson }
653*e3b78ef1SRobin Karlsson
654*e3b78ef1SRobin Karlsson static void
make_party(void)655*e3b78ef1SRobin Karlsson make_party(void)
656*e3b78ef1SRobin Karlsson {
657*e3b78ef1SRobin Karlsson short n;
658*e3b78ef1SRobin Karlsson
659*e3b78ef1SRobin Karlsson party_room = gr_room();
660*e3b78ef1SRobin Karlsson
661*e3b78ef1SRobin Karlsson n = rand_percent(99) ? party_objects(party_room) : 11;
662*e3b78ef1SRobin Karlsson if (rand_percent(99)) {
663*e3b78ef1SRobin Karlsson party_monsters(party_room, n);
664*e3b78ef1SRobin Karlsson }
665*e3b78ef1SRobin Karlsson }
666*e3b78ef1SRobin Karlsson
667*e3b78ef1SRobin Karlsson void
show_objects(void)668*e3b78ef1SRobin Karlsson show_objects(void)
669*e3b78ef1SRobin Karlsson {
670*e3b78ef1SRobin Karlsson object *obj;
671*e3b78ef1SRobin Karlsson short mc, rc, row, col;
672*e3b78ef1SRobin Karlsson object *monster;
673*e3b78ef1SRobin Karlsson
674*e3b78ef1SRobin Karlsson obj = level_objects.next_object;
675*e3b78ef1SRobin Karlsson
676*e3b78ef1SRobin Karlsson while (obj) {
677*e3b78ef1SRobin Karlsson row = obj->row;
678*e3b78ef1SRobin Karlsson col = obj->col;
679*e3b78ef1SRobin Karlsson
680*e3b78ef1SRobin Karlsson rc = get_mask_char(obj->what_is);
681*e3b78ef1SRobin Karlsson
682*e3b78ef1SRobin Karlsson if (dungeon[row][col] & MONSTER) {
683*e3b78ef1SRobin Karlsson if ((monster =
684*e3b78ef1SRobin Karlsson object_at(&level_monsters, row, col)) != NULL) {
685*e3b78ef1SRobin Karlsson monster->trail_char = rc;
686*e3b78ef1SRobin Karlsson }
687*e3b78ef1SRobin Karlsson }
688*e3b78ef1SRobin Karlsson mc = mvinch(row, col);
689*e3b78ef1SRobin Karlsson if (((mc < 'A') || (mc > 'Z')) &&
690*e3b78ef1SRobin Karlsson ((row != rogue.row) || (col != rogue.col))) {
691*e3b78ef1SRobin Karlsson mvaddch(row, col, rc);
692*e3b78ef1SRobin Karlsson }
693*e3b78ef1SRobin Karlsson obj = obj->next_object;
694*e3b78ef1SRobin Karlsson }
695*e3b78ef1SRobin Karlsson
696*e3b78ef1SRobin Karlsson monster = level_monsters.next_object;
697*e3b78ef1SRobin Karlsson
698*e3b78ef1SRobin Karlsson while (monster) {
699*e3b78ef1SRobin Karlsson if (monster->m_flags & IMITATES) {
700*e3b78ef1SRobin Karlsson mvaddch(monster->row, monster->col, (int)monster->disguise);
701*e3b78ef1SRobin Karlsson }
702*e3b78ef1SRobin Karlsson monster = monster->next_monster;
703*e3b78ef1SRobin Karlsson }
704*e3b78ef1SRobin Karlsson }
705*e3b78ef1SRobin Karlsson
706*e3b78ef1SRobin Karlsson void
put_amulet(void)707*e3b78ef1SRobin Karlsson put_amulet(void)
708*e3b78ef1SRobin Karlsson {
709*e3b78ef1SRobin Karlsson object *obj;
710*e3b78ef1SRobin Karlsson
711*e3b78ef1SRobin Karlsson obj = alloc_object();
712*e3b78ef1SRobin Karlsson obj->what_is = AMULET;
713*e3b78ef1SRobin Karlsson rand_place(obj);
714*e3b78ef1SRobin Karlsson }
715*e3b78ef1SRobin Karlsson
716*e3b78ef1SRobin Karlsson static void
rand_place(object * obj)717*e3b78ef1SRobin Karlsson rand_place(object *obj)
718*e3b78ef1SRobin Karlsson {
719*e3b78ef1SRobin Karlsson short row, col;
720*e3b78ef1SRobin Karlsson
721*e3b78ef1SRobin Karlsson gr_row_col(&row, &col, (FLOOR | TUNNEL));
722*e3b78ef1SRobin Karlsson place_at(obj, row, col);
723*e3b78ef1SRobin Karlsson }
724*e3b78ef1SRobin Karlsson
725*e3b78ef1SRobin Karlsson void
c_object_for_wizard(void)726*e3b78ef1SRobin Karlsson c_object_for_wizard(void)
727*e3b78ef1SRobin Karlsson {
728*e3b78ef1SRobin Karlsson short ch, max, wk;
729*e3b78ef1SRobin Karlsson object *obj;
730*e3b78ef1SRobin Karlsson char buf[80];
731*e3b78ef1SRobin Karlsson
732*e3b78ef1SRobin Karlsson max = 0;
733*e3b78ef1SRobin Karlsson if (pack_count(NULL) >= MAX_PACK_COUNT) {
734*e3b78ef1SRobin Karlsson messagef(0, "pack full");
735*e3b78ef1SRobin Karlsson return;
736*e3b78ef1SRobin Karlsson }
737*e3b78ef1SRobin Karlsson messagef(0, "type of object?");
738*e3b78ef1SRobin Karlsson
739*e3b78ef1SRobin Karlsson while (r_index("!?:)]=/,\033", (ch = rgetchar()), 0) == -1) {
740*e3b78ef1SRobin Karlsson sound_bell();
741*e3b78ef1SRobin Karlsson }
742*e3b78ef1SRobin Karlsson check_message();
743*e3b78ef1SRobin Karlsson
744*e3b78ef1SRobin Karlsson if (ch == '\033') {
745*e3b78ef1SRobin Karlsson return;
746*e3b78ef1SRobin Karlsson }
747*e3b78ef1SRobin Karlsson obj = alloc_object();
748*e3b78ef1SRobin Karlsson
749*e3b78ef1SRobin Karlsson switch(ch) {
750*e3b78ef1SRobin Karlsson case '!':
751*e3b78ef1SRobin Karlsson obj->what_is = POTION;
752*e3b78ef1SRobin Karlsson max = POTIONS - 1;
753*e3b78ef1SRobin Karlsson break;
754*e3b78ef1SRobin Karlsson case '?':
755*e3b78ef1SRobin Karlsson obj->what_is = SCROL;
756*e3b78ef1SRobin Karlsson max = SCROLS - 1;
757*e3b78ef1SRobin Karlsson break;
758*e3b78ef1SRobin Karlsson case ',':
759*e3b78ef1SRobin Karlsson obj->what_is = AMULET;
760*e3b78ef1SRobin Karlsson break;
761*e3b78ef1SRobin Karlsson case ':':
762*e3b78ef1SRobin Karlsson get_food(obj, 0);
763*e3b78ef1SRobin Karlsson break;
764*e3b78ef1SRobin Karlsson case ')':
765*e3b78ef1SRobin Karlsson gr_weapon(obj, 0);
766*e3b78ef1SRobin Karlsson max = WEAPONS - 1;
767*e3b78ef1SRobin Karlsson break;
768*e3b78ef1SRobin Karlsson case ']':
769*e3b78ef1SRobin Karlsson gr_armor(obj);
770*e3b78ef1SRobin Karlsson max = ARMORS - 1;
771*e3b78ef1SRobin Karlsson break;
772*e3b78ef1SRobin Karlsson case '/':
773*e3b78ef1SRobin Karlsson gr_wand(obj);
774*e3b78ef1SRobin Karlsson max = WANDS - 1;
775*e3b78ef1SRobin Karlsson break;
776*e3b78ef1SRobin Karlsson case '=':
777*e3b78ef1SRobin Karlsson max = RINGS - 1;
778*e3b78ef1SRobin Karlsson obj->what_is = RING;
779*e3b78ef1SRobin Karlsson break;
780*e3b78ef1SRobin Karlsson }
781*e3b78ef1SRobin Karlsson if ((ch != ',') && (ch != ':')) {
782*e3b78ef1SRobin Karlsson GIL:
783*e3b78ef1SRobin Karlsson if (get_input_line("which kind?", "", buf, sizeof(buf), "", 0, 1)) {
784*e3b78ef1SRobin Karlsson wk = get_number(buf);
785*e3b78ef1SRobin Karlsson if ((wk >= 0) && (wk <= max)) {
786*e3b78ef1SRobin Karlsson obj->which_kind = wk;
787*e3b78ef1SRobin Karlsson if (obj->what_is == RING) {
788*e3b78ef1SRobin Karlsson gr_ring(obj, 0);
789*e3b78ef1SRobin Karlsson }
790*e3b78ef1SRobin Karlsson } else {
791*e3b78ef1SRobin Karlsson sound_bell();
792*e3b78ef1SRobin Karlsson goto GIL;
793*e3b78ef1SRobin Karlsson }
794*e3b78ef1SRobin Karlsson } else {
795*e3b78ef1SRobin Karlsson free_object(obj);
796*e3b78ef1SRobin Karlsson return;
797*e3b78ef1SRobin Karlsson }
798*e3b78ef1SRobin Karlsson }
799*e3b78ef1SRobin Karlsson get_desc(obj, buf, sizeof(buf));
800*e3b78ef1SRobin Karlsson messagef(0, "%s", buf);
801*e3b78ef1SRobin Karlsson (void)add_to_pack(obj, &rogue.pack, 1);
802*e3b78ef1SRobin Karlsson }
803