xref: /openbsd-src/games/hack/hack.u_init.c (revision aed906e4b20d9afbda31247cdb6acf6f29da8819)
1*aed906e4Smestre /*	$OpenBSD: hack.u_init.c,v 1.11 2016/01/09 18:33:15 mestre Exp $	*/
2d0b779f3Sniklas 
3df930be7Sderaadt /*
4d25013f2Scamield  * Copyright (c) 1985, Stichting Centrum voor Wiskunde en Informatica,
5d25013f2Scamield  * Amsterdam
6d25013f2Scamield  * All rights reserved.
7d25013f2Scamield  *
8d25013f2Scamield  * Redistribution and use in source and binary forms, with or without
9d25013f2Scamield  * modification, are permitted provided that the following conditions are
10d25013f2Scamield  * met:
11d25013f2Scamield  *
12d25013f2Scamield  * - Redistributions of source code must retain the above copyright notice,
13d25013f2Scamield  * this list of conditions and the following disclaimer.
14d25013f2Scamield  *
15d25013f2Scamield  * - Redistributions in binary form must reproduce the above copyright
16d25013f2Scamield  * notice, this list of conditions and the following disclaimer in the
17d25013f2Scamield  * documentation and/or other materials provided with the distribution.
18d25013f2Scamield  *
19d25013f2Scamield  * - Neither the name of the Stichting Centrum voor Wiskunde en
20d25013f2Scamield  * Informatica, nor the names of its contributors may be used to endorse or
21d25013f2Scamield  * promote products derived from this software without specific prior
22d25013f2Scamield  * written permission.
23d25013f2Scamield  *
24d25013f2Scamield  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
25d25013f2Scamield  * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
26d25013f2Scamield  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
27d25013f2Scamield  * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
28d25013f2Scamield  * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
29d25013f2Scamield  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
30d25013f2Scamield  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
31d25013f2Scamield  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
32d25013f2Scamield  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
33d25013f2Scamield  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
34d25013f2Scamield  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
35d25013f2Scamield  */
36d25013f2Scamield 
37d25013f2Scamield /*
38d25013f2Scamield  * Copyright (c) 1982 Jay Fenlason <hack@gnu.org>
39d25013f2Scamield  * All rights reserved.
40d25013f2Scamield  *
41d25013f2Scamield  * Redistribution and use in source and binary forms, with or without
42d25013f2Scamield  * modification, are permitted provided that the following conditions
43d25013f2Scamield  * are met:
44d25013f2Scamield  * 1. Redistributions of source code must retain the above copyright
45d25013f2Scamield  *    notice, this list of conditions and the following disclaimer.
46d25013f2Scamield  * 2. Redistributions in binary form must reproduce the above copyright
47d25013f2Scamield  *    notice, this list of conditions and the following disclaimer in the
48d25013f2Scamield  *    documentation and/or other materials provided with the distribution.
49d25013f2Scamield  * 3. The name of the author may not be used to endorse or promote products
50d25013f2Scamield  *    derived from this software without specific prior written permission.
51d25013f2Scamield  *
52d25013f2Scamield  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
53d25013f2Scamield  * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
54d25013f2Scamield  * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL
55d25013f2Scamield  * THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
56d25013f2Scamield  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
57d25013f2Scamield  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
58d25013f2Scamield  * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
59d25013f2Scamield  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
60d25013f2Scamield  * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
61d25013f2Scamield  * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
62df930be7Sderaadt  */
63df930be7Sderaadt 
644a5fbbc4Spjanzen #include <ctype.h>
65df930be7Sderaadt #include <stdio.h>
664a5fbbc4Spjanzen #include <stdlib.h>
67*aed906e4Smestre 
684a5fbbc4Spjanzen #include "hack.h"
69*aed906e4Smestre 
70df930be7Sderaadt #define	UNDEF_TYP	0
71df930be7Sderaadt #define	UNDEF_SPE	'\177'
72df930be7Sderaadt extern char plname[];
73df930be7Sderaadt 
74df930be7Sderaadt struct you zerou;
75df930be7Sderaadt char pl_character[PL_CSIZ];
76df930be7Sderaadt char *(roles[]) = {	/* must all have distinct first letter */
77df930be7Sderaadt 			/* roles[4] may be changed to -woman */
78df930be7Sderaadt 	"Tourist", "Speleologist", "Fighter", "Knight",
79df930be7Sderaadt 	"Cave-man", "Wizard"
80df930be7Sderaadt };
81df930be7Sderaadt #define	NR_OF_ROLES	SIZE(roles)
82df930be7Sderaadt char rolesyms[NR_OF_ROLES + 1];		/* filled by u_init() */
83df930be7Sderaadt 
84df930be7Sderaadt struct trobj {
85df930be7Sderaadt 	uchar trotyp;
86df930be7Sderaadt 	schar trspe;
87df930be7Sderaadt 	char trolet;
88df930be7Sderaadt 	Bitfield(trquan,6);
89df930be7Sderaadt 	Bitfield(trknown,1);
90df930be7Sderaadt };
91df930be7Sderaadt 
92df930be7Sderaadt #ifdef WIZARD
93df930be7Sderaadt struct trobj Extra_objs[] = {
94df930be7Sderaadt 	{ 0, 0, 0, 0, 0 },
95df930be7Sderaadt 	{ 0, 0, 0, 0, 0 }
96df930be7Sderaadt };
9754da88e4Spjanzen #endif /* WIZARD */
98df930be7Sderaadt 
99df930be7Sderaadt struct trobj Cave_man[] = {
100df930be7Sderaadt 	{ MACE, 1, WEAPON_SYM, 1, 1 },
101df930be7Sderaadt 	{ BOW, 1, WEAPON_SYM, 1, 1 },
102df930be7Sderaadt 	{ ARROW, 0, WEAPON_SYM, 25, 1 },	/* quan is variable */
103df930be7Sderaadt 	{ LEATHER_ARMOR, 0, ARMOR_SYM, 1, 1 },
104df930be7Sderaadt 	{ 0, 0, 0, 0, 0}
105df930be7Sderaadt };
106df930be7Sderaadt 
107df930be7Sderaadt struct trobj Fighter[] = {
108df930be7Sderaadt 	{ TWO_HANDED_SWORD, 0, WEAPON_SYM, 1, 1 },
109df930be7Sderaadt 	{ RING_MAIL, 0, ARMOR_SYM, 1, 1 },
110df930be7Sderaadt 	{ 0, 0, 0, 0, 0 }
111df930be7Sderaadt };
112df930be7Sderaadt 
113df930be7Sderaadt struct trobj Knight[] = {
114df930be7Sderaadt 	{ LONG_SWORD, 0, WEAPON_SYM, 1, 1 },
115df930be7Sderaadt 	{ SPEAR, 2, WEAPON_SYM, 1, 1 },
116df930be7Sderaadt 	{ RING_MAIL, 1, ARMOR_SYM, 1, 1 },
117df930be7Sderaadt 	{ HELMET, 0, ARMOR_SYM, 1, 1 },
118df930be7Sderaadt 	{ SHIELD, 0, ARMOR_SYM, 1, 1 },
119df930be7Sderaadt 	{ PAIR_OF_GLOVES, 0, ARMOR_SYM, 1, 1 },
120df930be7Sderaadt 	{ 0, 0, 0, 0, 0 }
121df930be7Sderaadt };
122df930be7Sderaadt 
123df930be7Sderaadt struct trobj Speleologist[] = {
124df930be7Sderaadt 	{ STUDDED_LEATHER_ARMOR, 0, ARMOR_SYM, 1, 1 },
125df930be7Sderaadt 	{ UNDEF_TYP, 0, POTION_SYM, 2, 0 },
126df930be7Sderaadt 	{ FOOD_RATION, 0, FOOD_SYM, 3, 1 },
127df930be7Sderaadt 	{ PICK_AXE, UNDEF_SPE, TOOL_SYM, 1, 0 },
128df930be7Sderaadt 	{ ICE_BOX, 0, TOOL_SYM, 1, 0 },
129df930be7Sderaadt 	{ 0, 0, 0, 0, 0}
130df930be7Sderaadt };
131df930be7Sderaadt 
132df930be7Sderaadt struct trobj Tinopener[] = {
133df930be7Sderaadt 	{ CAN_OPENER, 0, TOOL_SYM, 1, 1 },
134df930be7Sderaadt 	{ 0, 0, 0, 0, 0 }
135df930be7Sderaadt };
136df930be7Sderaadt 
137df930be7Sderaadt struct trobj Tourist[] = {
138df930be7Sderaadt 	{ UNDEF_TYP, 0, FOOD_SYM, 10, 1 },
139df930be7Sderaadt 	{ POT_EXTRA_HEALING, 0, POTION_SYM, 2, 0 },
140df930be7Sderaadt 	{ EXPENSIVE_CAMERA, 0, TOOL_SYM, 1, 1 },
141df930be7Sderaadt 	{ DART, 2, WEAPON_SYM, 25, 1 },	/* quan is variable */
142df930be7Sderaadt 	{ 0, 0, 0, 0, 0 }
143df930be7Sderaadt };
144df930be7Sderaadt 
145df930be7Sderaadt struct trobj Wizard[] = {
146df930be7Sderaadt 	{ ELVEN_CLOAK, 0, ARMOR_SYM, 1, 1 },
147df930be7Sderaadt 	{ UNDEF_TYP, UNDEF_SPE, WAND_SYM, 2, 0 },
148df930be7Sderaadt 	{ UNDEF_TYP, UNDEF_SPE, RING_SYM, 2, 0 },
149df930be7Sderaadt 	{ UNDEF_TYP, UNDEF_SPE, POTION_SYM, 2, 0 },
150df930be7Sderaadt 	{ UNDEF_TYP, UNDEF_SPE, SCROLL_SYM, 3, 0 },
151df930be7Sderaadt 	{ 0, 0, 0, 0, 0 }
152df930be7Sderaadt };
153df930be7Sderaadt 
1544a5fbbc4Spjanzen static void ini_inv(struct trobj *);
1554a5fbbc4Spjanzen static int  role_index(char);
1564a5fbbc4Spjanzen #ifdef WIZARD
1574a5fbbc4Spjanzen static void wiz_inv(void);
1584a5fbbc4Spjanzen #endif
1594a5fbbc4Spjanzen 
1604a5fbbc4Spjanzen void
u_init(void)161*aed906e4Smestre u_init(void)
1624a5fbbc4Spjanzen {
1634a5fbbc4Spjanzen 	int i;
164df930be7Sderaadt 	char exper = 'y', pc;
1654a5fbbc4Spjanzen 
166df930be7Sderaadt 	if(flags.female)	/* should have been set in HACKOPTIONS */
167df930be7Sderaadt 		roles[4] = "Cave-woman";
168df930be7Sderaadt 	for(i = 0; i < NR_OF_ROLES; i++)
169df930be7Sderaadt 		rolesyms[i] = roles[i][0];
170df930be7Sderaadt 	rolesyms[i] = 0;
171df930be7Sderaadt 
1724a5fbbc4Spjanzen 	if ((pc = pl_character[0])) {
1738a97e63eSmmcc 		if (islower((unsigned char)pc))
1748a97e63eSmmcc 			pc = toupper((unsigned char)pc);
175df930be7Sderaadt 		if ((i = role_index(pc)) >= 0)
176df930be7Sderaadt 			goto got_suffix;	/* implies experienced */
177df930be7Sderaadt 		printf("\nUnknown role: %c\n", pc);
178df930be7Sderaadt 		pl_character[0] = pc = 0;
179df930be7Sderaadt 	}
180df930be7Sderaadt 
181df930be7Sderaadt 	printf("\nAre you an experienced player? [ny] ");
182df930be7Sderaadt 
183180acc8fSmillert 	while(!strchr("ynYN \n\004", (exper = readchar())))
1844a5fbbc4Spjanzen 		hackbell();
185df930be7Sderaadt 	if(exper == '\004')		/* Give him an opportunity to get out */
186df930be7Sderaadt 		end_of_input();
187df930be7Sderaadt 	printf("%c\n", exper);		/* echo */
188180acc8fSmillert 	if(strchr("Nn \n", exper)) {
189df930be7Sderaadt 		exper = 0;
190df930be7Sderaadt 		goto beginner;
191df930be7Sderaadt 	}
192df930be7Sderaadt 
193df930be7Sderaadt 	printf("\nTell me what kind of character you are:\n");
194df930be7Sderaadt 	printf("Are you");
195df930be7Sderaadt 	for(i = 0; i < NR_OF_ROLES; i++) {
196df930be7Sderaadt 		printf(" a %s", roles[i]);
197df930be7Sderaadt 		if(i == 2)			/* %% */
198df930be7Sderaadt 			printf(",\n\t");
199df930be7Sderaadt 		else if(i < NR_OF_ROLES - 2)
200df930be7Sderaadt 			printf(",");
201df930be7Sderaadt 		else if(i == NR_OF_ROLES - 2)
202df930be7Sderaadt 			printf(" or");
203df930be7Sderaadt 	}
204df930be7Sderaadt 	printf("? [%s] ", rolesyms);
205df930be7Sderaadt 
2064a5fbbc4Spjanzen 	while ((pc = readchar())) {
2078a97e63eSmmcc 		if(islower((unsigned char)pc))
2088a97e63eSmmcc 			pc = toupper((unsigned char)pc);
209df930be7Sderaadt 		if((i = role_index(pc)) >= 0) {
210df930be7Sderaadt 			printf("%c\n", pc);	/* echo */
211df930be7Sderaadt 			(void) fflush(stdout);	/* should be seen */
212df930be7Sderaadt 			break;
213df930be7Sderaadt 		}
214df930be7Sderaadt 		if(pc == '\n')
215df930be7Sderaadt 			break;
216df930be7Sderaadt 		if(pc == '\004')    /* Give him the opportunity to get out */
217df930be7Sderaadt 			end_of_input();
2184a5fbbc4Spjanzen 		hackbell();
219df930be7Sderaadt 	}
220df930be7Sderaadt 	if(pc == '\n')
221df930be7Sderaadt 		pc = 0;
222df930be7Sderaadt 
223df930be7Sderaadt beginner:
224df930be7Sderaadt 	if(!pc) {
225df930be7Sderaadt 		printf("\nI'll choose a character for you.\n");
226df930be7Sderaadt 		i = rn2(NR_OF_ROLES);
227df930be7Sderaadt 		pc = rolesyms[i];
228df930be7Sderaadt 		printf("This game you will be a%s %s.\n",
229df930be7Sderaadt 			exper ? "n experienced" : "",
230df930be7Sderaadt 			roles[i]);
231df930be7Sderaadt 		getret();
232df930be7Sderaadt 		/* give him some feedback in case mklev takes much time */
233df930be7Sderaadt 		(void) putchar('\n');
234df930be7Sderaadt 		(void) fflush(stdout);
235df930be7Sderaadt 	}
236df930be7Sderaadt #if 0
237df930be7Sderaadt 	/* Given the above code, I can't see why this would ever change
238df930be7Sderaadt 	   anything; it does core pretty well, though.  - cmh 4/20/93 */
239df930be7Sderaadt 	if(exper) {
240df930be7Sderaadt 		roles[i][0] = pc;
241df930be7Sderaadt 	}
242df930be7Sderaadt #endif
243df930be7Sderaadt 
244df930be7Sderaadt got_suffix:
245df930be7Sderaadt 
246479daa62Savsm 	(void) strlcpy(pl_character, roles[i], sizeof pl_character);
247df930be7Sderaadt 	flags.beginner = 1;
248df930be7Sderaadt 	u = zerou;
249df930be7Sderaadt 	u.usym = '@';
250df930be7Sderaadt 	u.ulevel = 1;
251df930be7Sderaadt 	init_uhunger();
252df930be7Sderaadt #ifdef QUEST
253df930be7Sderaadt 	u.uhorizon = 6;
25454da88e4Spjanzen #endif /* QUEST */
255df930be7Sderaadt 	uarm = uarm2 = uarmh = uarms = uarmg = uwep = uball = uchain =
256df930be7Sderaadt 	uleft = uright = 0;
257df930be7Sderaadt 
258df930be7Sderaadt 	switch(pc) {
259df930be7Sderaadt 	case 'c':
260df930be7Sderaadt 	case 'C':
261df930be7Sderaadt 		Cave_man[2].trquan = 12 + rnd(9)*rnd(9);
262df930be7Sderaadt 		u.uhp = u.uhpmax = 16;
263df930be7Sderaadt 		u.ustr = u.ustrmax = 18;
264df930be7Sderaadt 		ini_inv(Cave_man);
265df930be7Sderaadt 		break;
266df930be7Sderaadt 	case 't':
267df930be7Sderaadt 	case 'T':
268df930be7Sderaadt 		Tourist[3].trquan = 20 + rnd(20);
269df930be7Sderaadt 		u.ugold = u.ugold0 = rnd(1000);
270df930be7Sderaadt 		u.uhp = u.uhpmax = 10;
271df930be7Sderaadt 		u.ustr = u.ustrmax = 8;
272df930be7Sderaadt 		ini_inv(Tourist);
273df930be7Sderaadt 		if(!rn2(25)) ini_inv(Tinopener);
274df930be7Sderaadt 		break;
275df930be7Sderaadt 	case 'w':
276df930be7Sderaadt 	case 'W':
277df930be7Sderaadt 		for(i=1; i<=4; i++) if(!rn2(5))
278df930be7Sderaadt 			Wizard[i].trquan += rn2(3) - 1;
279df930be7Sderaadt 		u.uhp = u.uhpmax = 15;
280df930be7Sderaadt 		u.ustr = u.ustrmax = 16;
281df930be7Sderaadt 		ini_inv(Wizard);
282df930be7Sderaadt 		break;
283df930be7Sderaadt 	case 's':
284df930be7Sderaadt 	case 'S':
285df930be7Sderaadt 		Fast = INTRINSIC;
286df930be7Sderaadt 		Stealth = INTRINSIC;
287df930be7Sderaadt 		u.uhp = u.uhpmax = 12;
288df930be7Sderaadt 		u.ustr = u.ustrmax = 10;
289df930be7Sderaadt 		ini_inv(Speleologist);
290df930be7Sderaadt 		if(!rn2(10)) ini_inv(Tinopener);
291df930be7Sderaadt 		break;
292df930be7Sderaadt 	case 'k':
293df930be7Sderaadt 	case 'K':
294df930be7Sderaadt 		u.uhp = u.uhpmax = 12;
295df930be7Sderaadt 		u.ustr = u.ustrmax = 10;
296df930be7Sderaadt 		ini_inv(Knight);
297df930be7Sderaadt 		break;
298df930be7Sderaadt 	case 'f':
299df930be7Sderaadt 	case 'F':
300df930be7Sderaadt 		u.uhp = u.uhpmax = 14;
301df930be7Sderaadt 		u.ustr = u.ustrmax = 17;
302df930be7Sderaadt 		ini_inv(Fighter);
303df930be7Sderaadt 		break;
304df930be7Sderaadt 	default:	/* impossible */
305df930be7Sderaadt 		u.uhp = u.uhpmax = 12;
306df930be7Sderaadt 		u.ustr = u.ustrmax = 16;
307df930be7Sderaadt 	}
308df930be7Sderaadt 	find_ac();
309df930be7Sderaadt 	if(!rn2(20)) {
3104a5fbbc4Spjanzen 		int d = rn2(7) - 2;	/* biased variation */
311df930be7Sderaadt 		u.ustr += d;
312df930be7Sderaadt 		u.ustrmax += d;
313df930be7Sderaadt 	}
314df930be7Sderaadt 
315df930be7Sderaadt #ifdef WIZARD
316df930be7Sderaadt 	if(wizard) wiz_inv();
31754da88e4Spjanzen #endif /* WIZARD */
318df930be7Sderaadt 
319df930be7Sderaadt 	/* make sure he can carry all he has - especially for T's */
320df930be7Sderaadt 	while(inv_weight() > 0 && u.ustr < 118)
321df930be7Sderaadt 		u.ustr++, u.ustrmax++;
322df930be7Sderaadt }
323df930be7Sderaadt 
3244a5fbbc4Spjanzen static void
ini_inv(struct trobj * trop)3254a5fbbc4Spjanzen ini_inv(struct trobj *trop)
3264a5fbbc4Spjanzen {
3274a5fbbc4Spjanzen 	struct obj *obj;
3284a5fbbc4Spjanzen 
329df930be7Sderaadt 	while(trop->trolet) {
330df930be7Sderaadt 		obj = mkobj(trop->trolet);
331df930be7Sderaadt 		obj->known = trop->trknown;
332df930be7Sderaadt 		/* not obj->dknown = 1; - let him look at it at least once */
333df930be7Sderaadt 		obj->cursed = 0;
334df930be7Sderaadt 		if(obj->olet == WEAPON_SYM){
335df930be7Sderaadt 			obj->quan = trop->trquan;
336df930be7Sderaadt 			trop->trquan = 1;
337df930be7Sderaadt 		}
338df930be7Sderaadt 		if(trop->trspe != UNDEF_SPE)
339df930be7Sderaadt 			obj->spe = trop->trspe;
340df930be7Sderaadt 		if(trop->trotyp != UNDEF_TYP)
341df930be7Sderaadt 			obj->otyp = trop->trotyp;
342df930be7Sderaadt 		else
343df930be7Sderaadt 			if(obj->otyp == WAN_WISHING)	/* gitpyr!robert */
344df930be7Sderaadt 				obj->otyp = WAN_DEATH;
345df930be7Sderaadt 		obj->owt = weight(obj);	/* defined after setting otyp+quan */
346df930be7Sderaadt 		obj = addinv(obj);
347df930be7Sderaadt 		if(obj->olet == ARMOR_SYM){
348df930be7Sderaadt 			switch(obj->otyp){
349df930be7Sderaadt 			case SHIELD:
350df930be7Sderaadt 				if(!uarms) setworn(obj, W_ARMS);
351df930be7Sderaadt 				break;
352df930be7Sderaadt 			case HELMET:
353df930be7Sderaadt 				if(!uarmh) setworn(obj, W_ARMH);
354df930be7Sderaadt 				break;
355df930be7Sderaadt 			case PAIR_OF_GLOVES:
356df930be7Sderaadt 				if(!uarmg) setworn(obj, W_ARMG);
357df930be7Sderaadt 				break;
358df930be7Sderaadt 			case ELVEN_CLOAK:
359df930be7Sderaadt 				if(!uarm2)
360df930be7Sderaadt 					setworn(obj, W_ARM);
361df930be7Sderaadt 				break;
362df930be7Sderaadt 			default:
363df930be7Sderaadt 				if(!uarm) setworn(obj, W_ARM);
364df930be7Sderaadt 			}
365df930be7Sderaadt 		}
366df930be7Sderaadt 		if(obj->olet == WEAPON_SYM)
367df930be7Sderaadt 			if(!uwep) setuwep(obj);
368df930be7Sderaadt #ifndef PYRAMID_BUG
369df930be7Sderaadt 		if(--trop->trquan) continue;	/* make a similar object */
370df930be7Sderaadt #else
371df930be7Sderaadt 		if(trop->trquan) {		/* check if zero first */
372df930be7Sderaadt 			--trop->trquan;
373df930be7Sderaadt 			if(trop->trquan)
374df930be7Sderaadt 				continue;	/* make a similar object */
375df930be7Sderaadt 		}
37654da88e4Spjanzen #endif /* PYRAMID_BUG */
377df930be7Sderaadt 		trop++;
378df930be7Sderaadt 	}
379df930be7Sderaadt }
380df930be7Sderaadt 
381df930be7Sderaadt #ifdef WIZARD
3824a5fbbc4Spjanzen static void
wiz_inv(void)383*aed906e4Smestre wiz_inv(void)
3844a5fbbc4Spjanzen {
3854a5fbbc4Spjanzen 	struct trobj *trop = &Extra_objs[0];
3864a5fbbc4Spjanzen 	char *ep = getenv("INVENT");
3874a5fbbc4Spjanzen 	int type;
3884a5fbbc4Spjanzen 
389df930be7Sderaadt 	while(ep && *ep) {
390df930be7Sderaadt 		type = atoi(ep);
391180acc8fSmillert 		ep = strchr(ep, ',');
392df930be7Sderaadt 		if(ep) while(*ep == ',' || *ep == ' ') ep++;
393df930be7Sderaadt 		if(type <= 0 || type > NROFOBJECTS) continue;
394df930be7Sderaadt 		trop->trotyp = type;
395df930be7Sderaadt 		trop->trolet = objects[type].oc_olet;
396df930be7Sderaadt 		trop->trspe = 4;
397df930be7Sderaadt 		trop->trknown = 1;
398df930be7Sderaadt 		trop->trquan = 1;
399df930be7Sderaadt 		ini_inv(trop);
400df930be7Sderaadt 	}
401df930be7Sderaadt 	/* give him a wand of wishing by default */
402df930be7Sderaadt 	trop->trotyp = WAN_WISHING;
403df930be7Sderaadt 	trop->trolet = WAND_SYM;
404df930be7Sderaadt 	trop->trspe = 20;
405df930be7Sderaadt 	trop->trknown = 1;
406df930be7Sderaadt 	trop->trquan = 1;
407df930be7Sderaadt 	ini_inv(trop);
408df930be7Sderaadt }
40954da88e4Spjanzen #endif /* WIZARD */
410df930be7Sderaadt 
4114a5fbbc4Spjanzen void
plnamesuffix(void)412*aed906e4Smestre plnamesuffix(void)
4134a5fbbc4Spjanzen {
4144a5fbbc4Spjanzen 	char *p;
4154a5fbbc4Spjanzen 
4164a5fbbc4Spjanzen 	if ((p = strrchr(plname, '-'))) {
417df930be7Sderaadt 		*p = 0;
418df930be7Sderaadt 		pl_character[0] = p[1];
419df930be7Sderaadt 		pl_character[1] = 0;
420df930be7Sderaadt 		if(!plname[0]) {
421df930be7Sderaadt 			askname();
422df930be7Sderaadt 			plnamesuffix();
423df930be7Sderaadt 		}
424df930be7Sderaadt 	}
425df930be7Sderaadt }
426df930be7Sderaadt 
4274a5fbbc4Spjanzen /* must be called only from u_init() */
428df930be7Sderaadt /* so that rolesyms[] is defined */
4294a5fbbc4Spjanzen static int
role_index(char pc)4304a5fbbc4Spjanzen role_index(char pc)
4314a5fbbc4Spjanzen {
4324a5fbbc4Spjanzen 	char *cp;
433df930be7Sderaadt 
4344a5fbbc4Spjanzen 	if ((cp = strchr(rolesyms, pc)))
435df930be7Sderaadt 		return(cp - rolesyms);
436df930be7Sderaadt 	return(-1);
437df930be7Sderaadt }
438