Source:NetHack 2.3e/u init.c

From NetHackWiki
Jump to navigation Jump to search

Below is the full text to u_init.c from the source code of NetHack 2.3e. To link to a particular line, write [[NetHack 2.3e/u_init.c#line123]], for example.

Warning! This is the source code from an old release. For the latest release, see Source code

Screenshots and source code from Hack are used under the CWI license.

1.    /*	SCCS Id: @(#)u_init.c	2.3	88/01/21
2.    /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
3.    
4.    #include <stdio.h>
5.    #include <signal.h>
6.    #include "hack.h"
7.    #ifdef GENIX
8.    #define	void	int
9.    #endif
10.   
11.   #define Strcpy	(void) strcpy
12.   #define	Strcat	(void) strcat
13.   #define	UNDEF_TYP	0
14.   #define	UNDEF_SPE	'\177'
15.   extern struct obj *addinv();
16.   extern char *eos();
17.   extern char plname[];
18.   #define IS_MAGIC(x)	((x)->olet == WAND_SYM || (x)->olet == POTION_SYM || \
19.   			 (x)->olet == RING_SYM || (x)->olet == SCROLL_SYM || \
20.   			 (x)->olet == SPBOOK_SYM)
21.   
22.   struct you zerou;
23.   char pl_character[PL_CSIZ];
24.   char *(roles[]) = {	/* must all have distinct first letter */
25.   			/* roles[4] & [7] may be changed for females */
26.   	"Archeologist", "Tourist", "Barbarian", "Knight", "Cave-man",
27.   #ifdef NEWCLASS
28.   	"Samurai", "Ninja", "Priest",
29.   #endif
30.   #ifdef KAA
31.   	"Valkyrie", "Elf", "Healer",
32.   #endif
33.   	"Wizard"
34.   };
35.   #define	NR_OF_ROLES	SIZE(roles)
36.   char rolesyms[NR_OF_ROLES + 1];		/* filled by u_init() */
37.   
38.   struct trobj {
39.   	unsigned short trotyp;
40.   	schar trspe;
41.   	char trolet;
42.   	Bitfield(trquan,6);
43.   	Bitfield(trknown,1);
44.   };
45.   
46.   #ifdef WIZARD
47.   struct trobj Extra_objs[] = {
48.   	{ 0, 0, 0, 0, 0 },
49.   	{ 0, 0, 0, 0, 0 }
50.   };
51.   #endif
52.   
53.   struct trobj Cave_man[] = {
54.   #define C_ARROWS	2
55.   	{ CLUB, 1, WEAPON_SYM, 1, 1 },
56.   	{ BOW, 1, WEAPON_SYM, 1, 1 },
57.   	{ ARROW, 0, WEAPON_SYM, 25, 1 },	/* quan is variable */
58.   	{ LEATHER_ARMOR, 0, ARMOR_SYM, 1, 1 },
59.   	{ 0, 0, 0, 0, 0}
60.   };
61.   
62.   struct trobj Barbarian[] = {
63.   	{ TWO_HANDED_SWORD, 0, WEAPON_SYM, 1, 1 },
64.   	{ RING_MAIL, 0, ARMOR_SYM, 1, 1 },
65.   	{ 0, 0, 0, 0, 0 }
66.   };
67.   
68.   struct trobj Knight[] = {
69.   	{ LONG_SWORD, 0, WEAPON_SYM, 1, 1 },
70.   	{ SPEAR, 2, WEAPON_SYM, 1, 1 },
71.   	{ RING_MAIL, 1, ARMOR_SYM, 1, 1 },
72.   	{ HELMET, 0, ARMOR_SYM, 1, 1 },
73.   	{ SHIELD, 0, ARMOR_SYM, 1, 1 },
74.   	{ PAIR_OF_GLOVES, 0, ARMOR_SYM, 1, 1 },
75.   	{ 0, 0, 0, 0, 0 }
76.   };
77.   
78.   #ifdef KAA
79.   struct trobj Elf[] = {
80.   #define E_ARROWS	2
81.   #define E_ARMOR		3
82.   	{ SHORT_SWORD, 0, WEAPON_SYM, 1, 1 },
83.   	{ BOW, 0, WEAPON_SYM, 1, 1 },
84.   	{ ARROW, 0, WEAPON_SYM, 25, 1 },
85.   	{ UNDEF_TYP, 0, ARMOR_SYM, 1, 1 },
86.   	{ 0, 0, 0, 0, 0 }
87.   };
88.   
89.   struct trobj Valkyrie[] = {
90.   	{ LONG_SWORD, 1, WEAPON_SYM, 1, 1 },
91.   	{ SHIELD, 3, ARMOR_SYM, 1, 1 },
92.   	{ FOOD_RATION, 0, FOOD_SYM, 1, 1 },
93.   	{ 0, 0, 0, 0, 0 }
94.   };
95.   
96.   struct trobj Healer[] = {
97.   	{ STETHOSCOPE, 0, TOOL_SYM, 1, 0 },
98.   	{ POT_HEALING, 0, POTION_SYM, 4, 1 },
99.   	{ POT_EXTRA_HEALING, 0, POTION_SYM, 4, 1 },
100.  	{ APPLE, 0, FOOD_SYM, 5, 0 },
101.  	{ 0, 0, 0, 0, 0}
102.  };
103.  #endif /* KAA /**/
104.  
105.  struct trobj Archeologist[] = {
106.  	{ STUDDED_LEATHER_ARMOR, 0, ARMOR_SYM, 1, 1 },
107.  	{ UNDEF_TYP, 0, POTION_SYM, 2, 0 },
108.  	{ FOOD_RATION, 0, FOOD_SYM, 3, 1 },
109.  	{ PICK_AXE, UNDEF_SPE, TOOL_SYM, 1, 0 },
110.  	{ ICE_BOX, 0, TOOL_SYM, 1, 0 },
111.  	{ 0, 0, 0, 0, 0}
112.  };
113.  
114.  struct trobj Tinopener[] = {
115.  	{ CAN_OPENER, 0, TOOL_SYM, 1, 1 },
116.  	{ 0, 0, 0, 0, 0 }
117.  };
118.  
119.  #ifdef MARKER
120.  struct trobj Magicmarker[] = {
121.  	{ MAGIC_MARKER, 50, TOOL_SYM, 1, 0 },
122.  	{ 0, 0, 0, 0, 0 }
123.  };
124.  #endif
125.  
126.  struct trobj Lamp[] = {
127.  	{ LAMP, 5, TOOL_SYM, 1, 0 },
128.  	{ 0, 0, 0, 0, 0 }
129.  };
130.  
131.  #ifdef WALKIES
132.  struct trobj Leash[] = {
133.  	{ LEASH, 0, TOOL_SYM, 1, 0 },
134.  	{ 0, 0, 0, 0, 0 }
135.  };
136.  #endif
137.  
138.  struct trobj Blindfold[] = {
139.  	{ BLINDFOLD, 0, TOOL_SYM, 1, 0 },
140.  	{ 0, 0, 0, 0, 0 }
141.  };
142.  
143.  struct trobj Tourist[] = {
144.  #define	T_DARTS		3
145.  	{ UNDEF_TYP, 0, FOOD_SYM, 10, 1 },
146.  	{ POT_EXTRA_HEALING, 0, POTION_SYM, 2, 0 },
147.  	{ EXPENSIVE_CAMERA, 0, TOOL_SYM, 1, 1 },
148.  	{ DART, 2, WEAPON_SYM, 25, 1 },	/* quan is variable */
149.  #ifdef SHIRT
150.  	{ HAWAIIAN_SHIRT, 0, ARMOR_SYM, 1, 1 },
151.  #endif
152.  	{ 0, 0, 0, 0, 0 }
153.  };
154.  
155.  struct trobj Wizard[] = {
156.  #define W_MULTSTART	2
157.  #define W_MULTEND	6
158.  	{ ELVEN_CLOAK, 0, ARMOR_SYM, 1, 1 },
159.  	{ DAGGER, 0, WEAPON_SYM, 1, 1 },	/* for dealing with ghosts */
160.  	{ UNDEF_TYP, UNDEF_SPE, WAND_SYM, 2, 1 },
161.  	{ UNDEF_TYP, UNDEF_SPE, RING_SYM, 2, 1 },
162.  	{ UNDEF_TYP, UNDEF_SPE, POTION_SYM, 2, 1 },
163.  	{ UNDEF_TYP, UNDEF_SPE, SCROLL_SYM, 3, 1 },
164.  #ifdef SPELLS
165.  	{ UNDEF_TYP, UNDEF_SPE, SPBOOK_SYM, 3, 1 },
166.  #endif
167.  	{ 0, 0, 0, 0, 0 }
168.  };
169.  
170.  #ifdef NEWCLASS
171.  struct	trobj	Samurai[] = {
172.  #define S_ARROWS	3
173.  	{ KATANA, 0, WEAPON_SYM, 1, 1 },
174.  	{ SHORT_SWORD, 0, WEAPON_SYM, 1, 1 },	/* the wakizashi */
175.  	{ BOW,    1, WEAPON_SYM, 1, 1 },
176.  	{ ARROW,  0, WEAPON_SYM, 25, 1 },	/* quan is variable */
177.  	{ SPLINT_MAIL, 0, ARMOR_SYM, 1, 1},
178.  	{ 0, 0, 0, 0, 0 }
179.  };
180.  
181.  struct	trobj	Ninja[] = {
182.  #define N_SHURIKEN	1
183.  	{ KATANA, 0, WEAPON_SYM, 1, 1 },
184.  	{ SHURIKEN, 0, WEAPON_SYM, 25, 1 },	/* quan is variable */
185.  	{ LEATHER_ARMOR, 1, ARMOR_SYM, 1, 1},
186.  	{ 0, 0, 0, 0, 0 }
187.  };
188.  
189.  struct	trobj	Priest[] = {
190.  	{ CHAIN_MAIL, 0, ARMOR_SYM, 1, 1 },
191.  	{ SHIELD, 0, ARMOR_SYM, 1, 1 },
192.  	{ MACE, 1, WEAPON_SYM, 1, 1 },
193.  	{ POT_HOLY_WATER, 0, POTION_SYM, 4, 1 },
194.  #ifdef SPELLS
195.  	{ UNDEF_TYP, UNDEF_SPE, SPBOOK_SYM, 2, 0 },
196.  #endif
197.  	{ 0, 0, 0, 0, 0 }
198.  };
199.  #endif /* NEWCLASS /**/
200.  
201.  u_init(){
202.  register int i;
203.  char exper = 'y', pc;
204.  extern char readchar();
205.  	if(flags.female)  {	/* should have been set in HACKOPTIONS */
206.  		roles[4] = "Cave-woman";
207.  #ifdef NEWCLASS
208.  		roles[7] = "Priestess";
209.  #endif
210.  	}
211.  	for(i = 0; i < NR_OF_ROLES; i++)
212.  		rolesyms[i] = roles[i][0];
213.  	rolesyms[i] = 0;
214.  
215.  	if(pc = pl_character[0]) {
216.  		if('a' <= pc && pc <= 'z') pc += 'A'-'a';
217.  		if((i = role_index(pc)) >= 0)
218.  			goto got_suffix;	/* implies experienced */
219.  		printf("\nUnknown role: %c\n", pc);
220.  		pl_character[0] = pc = 0;
221.  	}
222.  
223.  	printf("\nShall I pick a character for you (yes, no, or quit) ? [ynq] ");
224.  
225.  	while(!index("yYnNqQ", (exper = readchar())))	bell();
226.  
227.  	printf("%c\n", exper);		/* echo */
228.  
229.  	if (index("qQ", exper)) {
230.  		clearlocks();
231.  		settty((char *) 0);
232.  		exit(0);
233.  	}
234.  
235.  	if(index("Yy", exper)) {
236.  		exper = 0;
237.  		goto beginner;
238.  	}
239.  
240.  	printf("\n Tell me what kind of character you are:\n");
241.  	printf(" Are you");
242.  	for(i = 0; i < NR_OF_ROLES; i++) {
243.  		printf(" %s %s", index("AEIOU",roles[i][0]) ? "an" : "a", roles[i]);
244.  		if((((i + 1) % 4) == 0) && (i != NR_OF_ROLES -1)) printf(",\n        ");
245.  		else if(i < NR_OF_ROLES - 2)	printf(",");
246.  		if(i == NR_OF_ROLES - 2)	printf(" or");
247.  	}
248.  	printf("? [%s or q(quit)] ", rolesyms);
249.  
250.  	while(pc = readchar()) {
251.  		if (pc == 'q' || pc == 'Q') {
252.  
253.  			clearlocks();
254.  			settty((char *) 0);
255.  			exit(0);
256.  		}
257.  		if('a' <= pc && pc <= 'z') pc += 'A'-'a';
258.  		if((i = role_index(pc)) >= 0) {
259.  			printf("%c\n", pc);	/* echo */
260.  			(void) fflush(stdout);	/* should be seen */
261.  			break;
262.  		}
263.  		if(pc == '\n') break;
264.  		bell();
265.  	}
266.  	if(pc == '\n')	pc = 0;
267.  
268.  beginner:
269.  	if(!pc) {
270.  		i = rn2(NR_OF_ROLES);
271.  		pc = rolesyms[i];
272.  		printf("\nThis game you will be %s %s%s.\n",
273.  			(exper || index("AEIOU", roles[i][0])) ? "an" : "a",
274.  			exper ? "experienced " : "", roles[i]);
275.  		getret();
276.  		/* give him some feedback in case mklev takes much time */
277.  		(void) putchar('\n');
278.  		(void) fflush(stdout);
279.  	}
280.  	if(exper) {
281.  		roles[i][0] = pc;
282.  	}
283.  
284.  got_suffix:
285.  
286.  	(void) strncpy(pl_character, roles[i], PL_CSIZ-1);
287.  	pl_character[PL_CSIZ-1] = 0;
288.  	flags.beginner = 1;
289.  	u = zerou;
290.  	u.usym = '@';
291.  	u.ulevel = 1;
292.  	u.uluck  = 0;
293.  	init_uhunger();
294.  	uarm = uarm2 = uarmh = uarms = uarmg = uwep =
295.  #ifdef SHIRT
296.  	uarmu =
297.  #endif
298.  	uball = uchain = uleft = uright = 0;
299.  
300.  #ifdef SPELLS
301.  	u.uen = u.uenmax = 1;
302.  	for (i = 0; i <= MAXSPELL; i++) spl_book[i].sp_id = NO_SPELL;
303.  #endif
304.  #ifdef PRAYERS
305.  	u.ublesscnt = 300;			/* no prayers just yet */
306.  	u.ublessed = 0;				/* not worthy yet */
307.  	u.ugangr   = 0;				/* gods not angry */
308.  #endif
309.  #ifdef HARD
310.  	u.udemigod = u.udg_cnt = 0;		/* not a demi-god yet... */
311.  #endif
312.  #ifdef KAA
313.  	u.mh = u.mhmax = u.umonnum = u.mtimedone = 0;
314.  #endif
315.  #ifdef QUEST
316.  	u.uhorizon = 6;
317.  #endif
318.  	switch(pc) {
319.  	case 'c':
320.  	case 'C':
321.  		Cave_man[C_ARROWS].trquan = 12 + rnd(9)*rnd(9);
322.  		u.uhp = u.uhpmax = 16;
323.  		u.ustr = u.ustrmax = 18;
324.  		ini_inv(Cave_man);
325.  		break;
326.  	case 't':
327.  	case 'T':
328.  #ifdef KAA
329.  		objects[POT_EXTRA_HEALING].oc_name_known=1;
330.  #endif
331.  		Tourist[T_DARTS].trquan = 20 + rnd(20);
332.  		u.ugold = u.ugold0 = rnd(1000);
333.  		u.uhp = u.uhpmax = 10;
334.  		u.ustr = u.ustrmax = 8;
335.  		ini_inv(Tourist);
336.  		if(!rn2(25)) ini_inv(Tinopener);
337.  		else if(!rn2(4)) ini_inv(Lamp);
338.  #ifdef MARKER
339.  		else if(!rn2(25)) ini_inv(Magicmarker);
340.  #endif
341.  #ifdef WALKIES
342.  		else if(!rn2(25)) ini_inv(Leash);
343.  #endif
344.  		break;
345.  	case 'w':
346.  	case 'W':
347.  		for(i = W_MULTSTART; i <= W_MULTEND; i++)
348.  		    if(!rn2(5))
349.  			Wizard[i].trquan += rn2(3) - 1;
350.  		u.uhp = u.uhpmax = 15;
351.  		u.ustr = u.ustrmax = 16;
352.  #ifdef SPELLS
353.  		u.uen = u.uenmax += rn2(4);
354.  #endif
355.  		ini_inv(Wizard);
356.  #ifdef MARKER
357.  		if(!rn2(5)) ini_inv(Magicmarker);
358.  #endif
359.  		if(!rn2(5)) ini_inv(Blindfold);
360.  		break;
361.  	case 'a':
362.  	case 'A':
363.  		Fast = INTRINSIC;
364.  		Stealth = INTRINSIC;
365.  		u.uhp = u.uhpmax = 12;
366.  		u.ustr = u.ustrmax = 10;
367.  		ini_inv(Archeologist);
368.  		if(!rn2(10)) ini_inv(Tinopener);
369.  #ifdef MARKER
370.  		else if(!rn2(10)) ini_inv(Magicmarker);
371.  #endif
372.  		break;
373.  #ifdef KAA
374.  	case 'e':
375.  	case 'E':
376.  		Elf[E_ARROWS].trquan = 15+rnd(20);
377.  		Elf[E_ARMOR].trotyp = (rn2(2) ? ELFIN_CHAIN_MAIL : ELVEN_CLOAK);
378.  		Fast = INTRINSIC;
379.  		HSee_invisible = INTRINSIC;
380.  		u.uhp = u.uhpmax = 16;
381.  		u.ustr = u.ustrmax = 16;
382.  		ini_inv(Elf);
383.  		if(!rn2(5)) ini_inv(Blindfold);
384.  		else if(!rn2(6)) ini_inv(Lamp);
385.  		break;
386.  	case 'v':
387.  	case 'V':
388.  		Stealth = INTRINSIC;
389.  		HCold_resistance = INTRINSIC;
390.  		flags.female = TRUE;
391.  		u.uhp = u.uhpmax = 16;
392.  		u.ustr = u.ustrmax = 17;
393.  		ini_inv(Valkyrie);
394.  		if(!rn2(6)) ini_inv(Lamp);
395.  		break;
396.  	case 'h':
397.  	case 'H':
398.  		objects[POT_HEALING].oc_name_known=1;
399.  		objects[POT_EXTRA_HEALING].oc_name_known=1;
400.  		HPoison_resistance = INTRINSIC;
401.  		u.uhp = u.uhpmax = 16;
402.  		u.ustr = u.ustrmax = 15;
403.  		ini_inv(Healer);
404.  		if(!rn2(25)) ini_inv(Lamp);
405.  		break;
406.  #endif
407.  	case 'k':
408.  	case 'K':
409.  		u.uhp = u.uhpmax = 12;
410.  		u.ustr = u.ustrmax = 10;
411.  		ini_inv(Knight);
412.  		break;
413.  	case 'b':
414.  	case 'B':
415.  		u.uhp = u.uhpmax = 14;
416.  		u.ustr = u.ustrmax = 17;
417.  		ini_inv(Barbarian);
418.  		if(!rn2(6)) ini_inv(Lamp);
419.  		break;
420.  #ifdef NEWCLASS
421.  	case 's':
422.  	case 'S':
423.  		Fast = INTRINSIC;
424.  		u.uhp = u.uhpmax = 16;
425.  		u.ustr = u.ustrmax = 16;
426.  		Samurai[S_ARROWS].trquan = 12 + rnd(9)*rnd(9);
427.  		ini_inv(Samurai);
428.  		break;
429.  	case 'n':
430.  	case 'N':
431.  		Fast = INTRINSIC;
432.  		Stealth = INTRINSIC;
433.  		u.uhp = u.uhpmax = 15;
434.  		u.ustr = u.ustrmax = 10;
435.  		Ninja[N_SHURIKEN].trquan = 12 + rnd(9)*rnd(9);
436.  		ini_inv(Ninja);
437.  		if(!rn2(5)) ini_inv(Blindfold);
438.  		break;
439.  	case 'p':
440.  	case 'P':
441.  		u.uhp = u.uhpmax = 13;
442.  		u.ustr = u.ustrmax = 15;
443.  # ifdef SPELLS
444.  		u.uen = u.uenmax += rn2(4);
445.  # endif
446.  		ini_inv(Priest);
447.  # ifdef KAA
448.  		uwep->dknown = 1;	/* bless his primary weapon */
449.  # endif
450.  # ifdef MARKER
451.  		if(!rn2(10)) ini_inv(Magicmarker);
452.  # endif
453.  		else if(!rn2(10)) ini_inv(Lamp);
454.  		objects[POT_HOLY_WATER].oc_name_known = 1;
455.  		break;
456.  #endif /* NEWCLASS /**/
457.  	default:	/* impossible */
458.  		u.uhp = u.uhpmax = 12;
459.  		u.ustr = u.ustrmax = 16;
460.  	}
461.  	find_ac();
462.  	if(!rn2(20)) {
463.  		register int d = rn2(7) - 2;	/* biased variation */
464.  		u.ustr += d;
465.  		u.ustrmax += d;
466.  	}
467.  
468.  #ifdef WIZARD
469.  	wiz_inv();
470.  #endif
471.  	/* make sure he can carry all he has - especially for T's */
472.  	while(inv_weight() > 0 && u.ustr < 118)
473.  		u.ustr++, u.ustrmax++;
474.  }
475.  
476.  ini_inv(trop) register struct trobj *trop; {
477.  register struct obj *obj;
478.  extern struct obj *mkobj();
479.  	while(trop->trolet) {
480.  		obj = mkobj(trop->trolet);
481.  		obj->known = trop->trknown;
482.  		/* not obj->dknown = 1; - let him look at it at least once */
483.  		obj->cursed = 0;
484.  		if(obj->olet == WEAPON_SYM){
485.  			obj->quan = trop->trquan;
486.  			trop->trquan = 1;
487.  		}
488.  		if(trop->trspe != UNDEF_SPE)
489.  			obj->spe = trop->trspe;
490.  		if(trop->trotyp != UNDEF_TYP)
491.  			obj->otyp = trop->trotyp;
492.  		else
493.  			if(obj->otyp == WAN_WISHING)	/* gitpyr!robert */
494.  				obj->otyp = WAN_DEATH;
495.  		obj->owt = weight(obj);	/* defined after setting otyp+quan */
496.  		obj = addinv(obj);
497.  
498.  		/*
499.  		 * if a magic item's 'known' bit is on, set its name known
500.  		 */
501.  		if (IS_MAGIC(obj) && obj->known)
502.  		    objects[obj->otyp].oc_name_known=1;
503.  
504.  		if(obj->olet == ARMOR_SYM){
505.  			switch(obj->otyp){
506.  			case SHIELD:
507.  				if(!uarms) setworn(obj, W_ARMS);
508.  				break;
509.  			case HELMET:
510.  				if(!uarmh) setworn(obj, W_ARMH);
511.  				break;
512.  			case PAIR_OF_GLOVES:
513.  				if(!uarmg) setworn(obj, W_ARMG);
514.  				break;
515.  #ifdef SHIRT
516.  			case HAWAIIAN_SHIRT:
517.  				if(!uarmu) setworn(obj, W_ARMU);
518.  				break;
519.  #endif
520.  			case ELVEN_CLOAK:
521.  				if(!uarm2)
522.  					setworn(obj, W_ARM);
523.  				break;
524.  			default:
525.  				if(!uarm) setworn(obj, W_ARM);
526.  			}
527.  		}
528.  		/* below changed by GAN 01/09/87 to allow wielding of
529.  		 * pick-axe or can-opener if there is no weapon
530.  		 */
531.  		if(obj->olet == WEAPON_SYM || obj->otyp == PICK_AXE ||
532.  		   obj->otyp == CAN_OPENER)
533.  			if(!uwep) setuwep(obj);
534.  #ifndef PYRAMID_BUG
535.  		if(--trop->trquan) continue;	/* make a similar object */
536.  #else
537.  		if(trop->trquan) {		/* check if zero first */
538.  			--trop->trquan;
539.  			if(trop->trquan)
540.  				continue;	/* make a similar object */
541.  		}
542.  #endif
543.  		trop++;
544.  	}
545.  }
546.  
547.  #ifdef WIZARD
548.  wiz_inv(){
549.  register struct trobj *trop = &Extra_objs[0];
550.  extern char *getenv();
551.  register char *ep = getenv("INVENT");
552.  register int type;
553.  	while(ep && *ep) {
554.  		type = atoi(ep);
555.  		ep = index(ep, ',');
556.  		if(ep) while(*ep == ',' || *ep == ' ') ep++;
557.  		if(type <= 0 || type > NROFOBJECTS) continue;
558.  		trop->trotyp = type;
559.  		trop->trolet = objects[type].oc_olet;
560.  		trop->trspe = 4;
561.  		trop->trknown = 1;
562.  		trop->trquan = 1;
563.  		ini_inv(trop);
564.  	}
565.  }
566.  #endif /* WIZARD /**/
567.  
568.  plnamesuffix() {
569.  register char *p;
570.  	if(p = rindex(plname, '-')) {
571.  		*p = 0;
572.  		pl_character[0] = p[1];
573.  		pl_character[1] = 0;
574.  		if(!plname[0]) {
575.  			askname();
576.  			plnamesuffix();
577.  		}
578.  	}
579.  }
580.  
581.  role_index(pc)
582.  char pc;
583.  {		/* must be called only from u_init() */
584.  		/* so that rolesyms[] is defined */
585.  	register char *cp;
586.  
587.  	if(cp = index(rolesyms, pc))
588.  		return(cp - rolesyms);
589.  	return(-1);
590.  }