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