Source:NetHack 3.1.0/u init.c

From NetHackWiki
Revision as of 07:43, 4 March 2008 by Kernigh bot (talk | contribs) (NetHack 3.1.0/u init.c moved to Source:NetHack 3.1.0/u init.c: Robot: moved page)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search

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

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

The NetHack General Public License applies to screenshots, source code and other content from NetHack.

This content was modified from the original NetHack source code distribution (by splitting up NetHack content between wiki pages, and possibly further editing). See the page history for a list of who changed it, and on what dates.

1.    /*	SCCS Id: @(#)u_init.c	3.1	92/11/13	*/
2.    /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
3.    /* NetHack may be freely redistributed.  See license for details. */
4.    
5.    #include "hack.h"
6.    
7.    struct trobj {
8.    	unsigned short int trotyp;
9.    	schar trspe;
10.   	char trclass;
11.   	Bitfield(trquan,6);
12.   	Bitfield(trknown,1);
13.   	Bitfield(trbless,2);
14.   };
15.   
16.   static void FDECL(ini_inv, (struct trobj *));
17.   static void FDECL(knows_object,(int));
18.   static void FDECL(knows_class,(CHAR_P));
19.   static int FDECL(role_index,(CHAR_P));
20.   
21.   #define	UNDEF_TYP	0
22.   #define	UNDEF_SPE	'\177'
23.   #define	UNDEF_BLESS	2
24.   
25.   /* all roles must all have distinct first letter */
26.   const char *roles[] = {	/* also used in options.c and winxxx.c */
27.   			/* roles[2] and [6] are changed for females */
28.   			/* in all cases, the corresponding male and female */
29.   			/* roles must start with the same letter */
30.   	"Archeologist", "Barbarian", "Caveman", "Elf", "Healer", "Knight",
31.   	"Priest", "Rogue", "Samurai",
32.   #ifdef TOURIST
33.   	"Tourist",
34.   #endif
35.   	"Valkyrie", "Wizard", 0
36.   };
37.   
38.   static struct trobj Cave_man[] = {
39.   #define C_ARROWS	2
40.   	{ CLUB, 1, WEAPON_CLASS, 1, 1, UNDEF_BLESS },
41.   	{ BOW, 1, WEAPON_CLASS, 1, 1, UNDEF_BLESS },
42.   	{ ARROW, 0, WEAPON_CLASS, 25, 1, UNDEF_BLESS },	/* quan is variable */
43.   	{ LEATHER_ARMOR, 0, ARMOR_CLASS, 1, 1, UNDEF_BLESS },
44.   	{ 0, 0, 0, 0, 0, 0 }
45.   };
46.   
47.   static struct trobj Barbarian[] = {
48.   #define B_MAJOR 0	/* two-handed sword or battle-axe  */
49.   #define B_MINOR 1	/* matched with axe or short sword */
50.   	{ TWO_HANDED_SWORD, 0, WEAPON_CLASS, 1, 1, UNDEF_BLESS },
51.   	{ AXE, 0, WEAPON_CLASS, 1, 1, UNDEF_BLESS },
52.   	{ RING_MAIL, 0, ARMOR_CLASS, 1, 1, UNDEF_BLESS },
53.   	{ FOOD_RATION, 0, FOOD_CLASS, 1, 1, 0 },
54.   	{ 0, 0, 0, 0, 0, 0 }
55.   };
56.   
57.   static struct trobj Knight[] = {
58.   	{ LONG_SWORD, 0, WEAPON_CLASS, 1, 1, UNDEF_BLESS },
59.   	{ SPEAR, 2, WEAPON_CLASS, 1, 1, UNDEF_BLESS },
60.   	{ RING_MAIL, 1, ARMOR_CLASS, 1, 1, UNDEF_BLESS },
61.   	{ HELMET, 0, ARMOR_CLASS, 1, 1, UNDEF_BLESS },
62.   	{ SMALL_SHIELD, 0, ARMOR_CLASS, 1, 1, UNDEF_BLESS },
63.   	{ LEATHER_GLOVES, 0, ARMOR_CLASS, 1, 1, UNDEF_BLESS },
64.   	{ 0, 0, 0, 0, 0, 0 }
65.   };
66.   
67.   static struct trobj Elf[] = {
68.   #define E_ARROWS	2
69.   #define E_ARMOR		3
70.   	{ ELVEN_SHORT_SWORD, 0, WEAPON_CLASS, 1, 1, UNDEF_BLESS },
71.   	{ ELVEN_BOW, 0, WEAPON_CLASS, 1, 1, UNDEF_BLESS },
72.   	{ ELVEN_ARROW, 0, WEAPON_CLASS, 25, 1, UNDEF_BLESS },
73.   	{ UNDEF_TYP, 0, ARMOR_CLASS, 1, 1, UNDEF_BLESS },
74.   	{ LEMBAS_WAFER, 0, FOOD_CLASS, 2, 1, 0 },
75.   	{ 0, 0, 0, 0, 0, 0 }
76.   };
77.   
78.   static struct trobj Valkyrie[] = {
79.   	{ LONG_SWORD, 1, WEAPON_CLASS, 1, 1, UNDEF_BLESS },
80.   	{ DAGGER, 0, WEAPON_CLASS, 1, 1, UNDEF_BLESS },
81.   	{ SMALL_SHIELD, 3, ARMOR_CLASS, 1, 1, UNDEF_BLESS },
82.   	{ FOOD_RATION, 0, FOOD_CLASS, 1, 1, 0 },
83.   	{ 0, 0, 0, 0, 0, 0 }
84.   };
85.   
86.   static struct trobj Healer[] = {
87.   	{ SCALPEL, 0, WEAPON_CLASS, 1, 1, UNDEF_BLESS },
88.   	{ LEATHER_GLOVES, 1, ARMOR_CLASS, 1, 1, UNDEF_BLESS },
89.   	{ STETHOSCOPE, 0, TOOL_CLASS, 1, 1, 0 },
90.   	{ POT_HEALING, 0, POTION_CLASS, 4, 1, UNDEF_BLESS },
91.   	{ POT_EXTRA_HEALING, 0, POTION_CLASS, 4, 1, UNDEF_BLESS },
92.   	{ WAN_SLEEP, UNDEF_SPE, WAND_CLASS, 1, 1, UNDEF_BLESS },
93.   	/* always blessed, so it's guaranteed readable */
94.   	{ SPE_HEALING, 0, SPBOOK_CLASS, 1, 1, 1 },
95.   	{ SPE_EXTRA_HEALING, 0, SPBOOK_CLASS, 1, 1, 1 },
96.   	{ APPLE, 0, FOOD_CLASS, 5, 1, 0 },
97.   	{ 0, 0, 0, 0, 0, 0 }
98.   };
99.   
100.  static struct trobj Archeologist[] = {
101.  	/* if adventure has a name...  idea from tan@uvm-gen */
102.  	{ BULLWHIP, 2, WEAPON_CLASS, 1, 1, UNDEF_BLESS },
103.  	{ LEATHER_JACKET, 0, ARMOR_CLASS, 1, 1, UNDEF_BLESS },
104.  	{ FEDORA, 0, ARMOR_CLASS, 1, 1, UNDEF_BLESS },
105.  	{ FOOD_RATION, 0, FOOD_CLASS, 3, 1, 0 },
106.  	{ PICK_AXE, UNDEF_SPE, TOOL_CLASS, 1, 1, UNDEF_BLESS },
107.  	{ TINNING_KIT, 0, TOOL_CLASS, 1, 1, UNDEF_BLESS },
108.  	{ SACK, 0, TOOL_CLASS, 1, 0, 0 },
109.  	{ 0, 0, 0, 0, 0, 0 }
110.  };
111.  
112.  static struct trobj Tinopener[] = {
113.  	{ TIN_OPENER, 0, TOOL_CLASS, 1, 1, 0 },
114.  	{ 0, 0, 0, 0, 0, 0 }
115.  };
116.  
117.  static struct trobj Magicmarker[] = {
118.  	{ MAGIC_MARKER, UNDEF_SPE, TOOL_CLASS, 1, 1, 0 },
119.  	{ 0, 0, 0, 0, 0, 0 }
120.  };
121.  
122.  static struct trobj Lamp[] = {
123.  	{ OIL_LAMP, 1, TOOL_CLASS, 1, 1, 0 },
124.  	{ 0, 0, 0, 0, 0, 0 }
125.  };
126.  
127.  #ifdef TOURIST
128.  # ifdef WALKIES
129.  static struct trobj Leash[] = {
130.  	{ LEASH, 0, TOOL_CLASS, 1, 1, 0 },
131.  	{ 0, 0, 0, 0, 0, 0 }
132.  };
133.  # endif
134.  
135.  static struct trobj Towel[] = {
136.  	{ TOWEL, 0, TOOL_CLASS, 1, 1, 0 },
137.  	{ 0, 0, 0, 0, 0, 0 }
138.  };
139.  #endif
140.  
141.  #ifdef EXPLORE_MODE
142.  static struct trobj Wishing[] = {
143.  	{ WAN_WISHING, 3, WAND_CLASS, 1, 1, 0 },
144.  	{ 0, 0, 0, 0, 0, 0 }
145.  };
146.  #endif
147.  
148.  static struct trobj Instrument[] = {
149.  	{ WOODEN_FLUTE, 0, TOOL_CLASS, 1, 1, 0 },
150.  	{ 0, 0, 0, 0, 0, 0 }
151.  };
152.  
153.  static struct trobj Blindfold[] = {
154.  	{ BLINDFOLD, 0, TOOL_CLASS, 1, 1, 0 },
155.  	{ 0, 0, 0, 0, 0, 0 }
156.  };
157.  
158.  #ifdef TOURIST
159.  static struct trobj Tourist[] = {
160.  #define	T_DARTS		0
161.  	{ DART, 2, WEAPON_CLASS, 25, 1, UNDEF_BLESS },	/* quan is variable */
162.  	{ UNDEF_TYP, UNDEF_SPE, FOOD_CLASS, 10, 1, 0 },
163.  	{ POT_EXTRA_HEALING, 0, POTION_CLASS, 2, 1, UNDEF_BLESS },
164.  	{ SCR_MAGIC_MAPPING, 0, SCROLL_CLASS, 4, 1, UNDEF_BLESS },
165.  	{ HAWAIIAN_SHIRT, 0, ARMOR_CLASS, 1, 1, UNDEF_BLESS },
166.  	{ EXPENSIVE_CAMERA, 0, TOOL_CLASS, 1, 1, 0 },
167.  	{ CREDIT_CARD, 0, TOOL_CLASS, 1, 1, 0 },
168.  	{ 0, 0, 0, 0, 0, 0 }
169.  };
170.  #endif
171.  
172.  static struct trobj Rogue[] = {
173.  #define R_DAGGERS	1
174.  	{ SHORT_SWORD, 0, WEAPON_CLASS, 1, 1, UNDEF_BLESS },
175.  	{ DAGGER, 0, WEAPON_CLASS, 10, 1, 0 },	/* quan is variable */
176.  	{ LEATHER_ARMOR, 1, ARMOR_CLASS, 1, 1, UNDEF_BLESS },
177.  	{ POT_SICKNESS, 0, POTION_CLASS, 1, 1, 0 },
178.  	{ LOCK_PICK, 9, TOOL_CLASS, 1, 1, 0 },
179.  	{ SACK, 0, TOOL_CLASS, 1, 0, 0 },
180.  	{ 0, 0, 0, 0, 0, 0 }
181.  };
182.  
183.  static struct trobj Wizard[] = {
184.  #define W_MULTSTART	2
185.  #define W_MULTEND	6
186.  	{ ATHAME, 1, WEAPON_CLASS, 1, 1, 1 },	/* for dealing with ghosts */
187.  	{ CLOAK_OF_MAGIC_RESISTANCE, 0, ARMOR_CLASS, 1, 1, UNDEF_BLESS },
188.  	{ UNDEF_TYP, UNDEF_SPE, WAND_CLASS, 1, 1, UNDEF_BLESS },
189.  	{ UNDEF_TYP, UNDEF_SPE, RING_CLASS, 2, 1, UNDEF_BLESS },
190.  	{ UNDEF_TYP, UNDEF_SPE, POTION_CLASS, 3, 1, UNDEF_BLESS },
191.  	{ UNDEF_TYP, UNDEF_SPE, SCROLL_CLASS, 3, 1, UNDEF_BLESS },
192.  	{ UNDEF_TYP, UNDEF_SPE, SPBOOK_CLASS, 1, 1, UNDEF_BLESS },
193.  	{ 0, 0, 0, 0, 0, 0 }
194.  };
195.  
196.  static struct trobj Samurai[] = {
197.  #define S_ARROWS	3
198.  	{ KATANA, 0, WEAPON_CLASS, 1, 1, UNDEF_BLESS },
199.  	{ SHORT_SWORD, 0, WEAPON_CLASS, 1, 1, UNDEF_BLESS }, /* wakizashi */
200.  	{ YUMI, 0, WEAPON_CLASS, 1, 1, UNDEF_BLESS },
201.  	{ YA, 0, WEAPON_CLASS, 25, 1, UNDEF_BLESS }, /* variable quan */
202.  	{ SPLINT_MAIL, 0, ARMOR_CLASS, 1, 1, UNDEF_BLESS },
203.  	{ FORTUNE_COOKIE, 0, FOOD_CLASS, 3, 1, 0 },
204.  	{ 0, 0, 0, 0, 0, 0 }
205.  };
206.  
207.  static struct trobj Priest[] = {
208.  	{ MACE, 1, WEAPON_CLASS, 1, 1, 1 },
209.  	{ CHAIN_MAIL, 0, ARMOR_CLASS, 1, 1, UNDEF_BLESS },
210.  	{ SMALL_SHIELD, 0, ARMOR_CLASS, 1, 1, UNDEF_BLESS },
211.  	{ POT_WATER, 0, POTION_CLASS, 4, 1, 1 },	/* holy water */
212.  	{ CLOVE_OF_GARLIC, 0, FOOD_CLASS, 1, 1, 0 },
213.  	{ SPRIG_OF_WOLFSBANE, 0, FOOD_CLASS, 1, 1, 0 },
214.  	{ UNDEF_TYP, UNDEF_SPE, SPBOOK_CLASS, 2, 1, UNDEF_BLESS },
215.  	{ 0, 0, 0, 0, 0, 0 }
216.  };
217.  
218.  static void
219.  knows_object(obj)
220.  register int obj;
221.  {
222.  	makeknown(obj);
223.  	objects[obj].oc_descr_idx = 0;		/* not a "discovery" */
224.  }
225.  
226.  /* Know ordinary (non-magical) objects of a certain class,
227.   * like all gems except the loadstone and luckstone.
228.   */
229.  static void
230.  knows_class(sym)
231.  register char sym;
232.  {
233.  	register int ct;
234.  	for (ct = 1; ct <= NROFOBJECTS; ct++)
235.  		if (objects[ct].oc_class == sym && !objects[ct].oc_magic)
236.  			knows_object(ct);
237.  }
238.  
239.  static int
240.  role_index(pc)
241.  char pc;
242.  {
243.  	register const char *cp;
244.  
245.  	if ((cp = index(pl_classes, pc)) != 0)
246.  		return(cp - pl_classes);
247.  	return(-1);
248.  }
249.  
250.  void
251.  u_init()
252.  {
253.  	register int i;
254.  	char pc;
255.  
256.  	pc = pl_character[0];
257.  	if(pc == '\0') {
258.  	    /* should be unnecessary now */
259.  	    exit_nhwindows(NULL);
260.  	    terminate(0);
261.  	}
262.  	i = role_index(pc);
263.  
264.  	(void) strncpy(pl_character, roles[i], PL_CSIZ-1);
265.  	pl_character[PL_CSIZ-1] = 0;
266.  	flags.beginner = 1;
267.  
268.  	/* zero u, including pointer values --
269.  	 * necessary when aborting from a failed restore */
270.  	(void) memset((genericptr_t)&u, 0, sizeof(u));
271.  	for (i = 0; i < LAST_PROP+1; i++) u.uprops[i].p_tofn = 0;
272.  	u.ustuck = (struct monst *)0;
273.  
274.  #if 0	/* documentation of more zero values as desirable */
275.  	u.uluck  = u.moreluck = 0;
276.  # ifdef TOURIST
277.  	uarmu = 0;
278.  # endif
279.  	uarm = uarmc = uarmh = uarms = uarmg = uarmf = 0;
280.  	uwep = uball = uchain = uleft = uright = 0;
281.  	u.ublessed = 0;				/* not worthy yet */
282.  	u.ugangr   = 0;				/* gods not angry */
283.  # ifdef ELBERETH
284.  	u.uevent.uhand_of_elbereth = 0;
285.  # endif
286.  	u.uevent.uheard_tune = 0;
287.  	u.uevent.uopened_dbridge = 0;
288.  	u.uevent.udemigod = 0;		/* not a demi-god yet... */
289.  	u.udg_cnt = 0;
290.  # ifdef POLYSELF
291.  	u.mh = u.mhmax = u.mtimedone = 0;
292.  # endif
293.  	u.uz.dnum = u.uz0.dnum = 0;
294.  	u.utotype = 0;
295.  #endif	/* 0 */
296.  	u.uz.dlevel = u.uz0.dlevel = 1;
297.  	u.utolev = u.uz;
298.  
299.  	u.usym = S_HUMAN;
300.  	u.umoved = FALSE;
301.  	u.ugrave_arise = -1;
302.  
303.  	u.ulevel = 0;	/* set up some of the initial attributes */
304.  	u.uhp = u.uhpmax = newhp();
305.  	adjabil(0,1);
306.  	u.ulevel = 1;
307.  
308.  	init_uhunger();
309.  	u.uen = u.uenmax = 1;
310.  	for (i = 0; i <= MAXSPELL; i++) spl_book[i].sp_id = NO_SPELL;
311.  	u.ublesscnt = 300;			/* no prayers just yet */
312.  #ifdef POLYSELF
313.  	u.umonnum = -1;
314.  	u.ulycn = -1;
315.  	set_uasmon();
316.  #endif
317.  
318.  	/*
319.  	 *  For now, everyone starts out with a night vision range of 1 and
320.  	 *  their xray range disabled.
321.  	 */
322.  	u.nv_range   =  1;
323.  	u.xray_range = -1;
324.  
325.  
326.  	switch(pc) {
327.  	/* pc will always be in uppercase by this point */
328.  	case 'A':
329.  		u.umonster = PM_ARCHEOLOGIST;
330.  		ini_inv(Archeologist);
331.  		if(!rn2(10)) ini_inv(Tinopener);
332.  		else if(!rn2(4)) ini_inv(Lamp);
333.  		else if(!rn2(10)) ini_inv(Magicmarker);
334.  		knows_class(GEM_CLASS);
335.  		knows_object(SACK);
336.  		/* We can't set trknown for it, then it'd be "uncursed"
337.  		 * sack...
338.  		 */
339.  		break;
340.  	case 'B':
341.  		u.umonster = PM_BARBARIAN;
342.  		if (rn2(100) >= 50) {	/* see Elf comment */
343.  		    Barbarian[B_MAJOR].trotyp = BATTLE_AXE;
344.  		    Barbarian[B_MINOR].trotyp = SHORT_SWORD;
345.  		}
346.  		ini_inv(Barbarian);
347.  		if(!rn2(6)) ini_inv(Lamp);
348.  		knows_class(WEAPON_CLASS);
349.  		knows_class(ARMOR_CLASS);
350.  		break;
351.  	case 'C':
352.  		u.umonster = PM_CAVEMAN;
353.  		Cave_man[C_ARROWS].trquan = rn1(30, 13);
354.  		ini_inv(Cave_man);
355.  		break;
356.  	case 'E':
357.  		u.umonster = PM_ELF;
358.  		Elf[E_ARROWS].trquan = rn1(20, 16);
359.  		Elf[E_ARMOR].trotyp = ((rn2(100) >= 50)
360.  				 ? ELVEN_MITHRIL_COAT : ELVEN_CLOAK);
361.  			/* rn2(100) > 50 necessary because some random number
362.  			 * generators are bad enough to seriously skew the
363.  			 * results if we use rn2(2)...  --KAA
364.  			 */
365.  
366.  		/*
367.  		 * Elves are people of music and song, or they are warriors.
368.  		 * Warriors get mithril coats; non-warriors MAY get an
369.  		 * instrument.  We use a kludge to get only non-magic
370.  		 * instruments.
371.  		 */
372.  		if (Elf[E_ARMOR].trotyp == ELVEN_CLOAK) {
373.  			if (!rn2(5)) {
374.  		    	static int trotyp[] = {
375.  					WOODEN_FLUTE, TOOLED_HORN, WOODEN_HARP,
376.  					BELL, BUGLE, LEATHER_DRUM
377.  				};
378.  
379.  				Instrument[0].trotyp = trotyp[rn2(SIZE(trotyp))];
380.  #ifdef DEBUG
381.  				debugpline("Elf got instrument %d",
382.  					Instrument[0].trotyp);
383.  #endif
384.  				ini_inv(Instrument);
385.  			}
386.  		}
387.  		ini_inv(Elf);
388.  		if(!rn2(5)) ini_inv(Blindfold);
389.  		else if(!rn2(6)) ini_inv(Lamp);
390.  		knows_object(ELVEN_SHORT_SWORD);
391.  		knows_object(ELVEN_ARROW);
392.  		knows_object(ELVEN_BOW);
393.  		knows_object(ELVEN_SPEAR);
394.  		knows_object(ELVEN_DAGGER);
395.  		knows_object(ELVEN_BROADSWORD);
396.  		knows_object(ELVEN_MITHRIL_COAT);
397.  		knows_object(ELVEN_LEATHER_HELM);
398.  		knows_object(ELVEN_SHIELD);
399.  		knows_object(ELVEN_BOOTS);
400.  		knows_object(ELVEN_CLOAK);
401.  		break;
402.  	case 'H':
403.  		u.umonster = PM_HEALER;
404.  		u.ugold = u.ugold0 = rn1(1000, 1001);
405.  		ini_inv(Healer);
406.  		if(!rn2(25)) ini_inv(Lamp);
407.  		break;
408.  	case 'K':
409.  		u.umonster = PM_KNIGHT;
410.  		ini_inv(Knight);
411.  		knows_class(WEAPON_CLASS);
412.  		knows_class(ARMOR_CLASS);
413.  		/* give knights chess-like mobility
414.  		 * -- idea from wooledge@skybridge.scl.cwru.edu */
415.  		Jumping |= FROMOUTSIDE;
416.  		break;
417.  	case 'P':
418.  		u.umonster = PM_PRIEST;
419.  		u.uen = u.uenmax += rn2(4);
420.  		ini_inv(Priest);
421.  		if(!rn2(10)) ini_inv(Magicmarker);
422.  		else if(!rn2(10)) ini_inv(Lamp);
423.  		knows_object(POT_WATER);
424.  		break;
425.  	case 'R':
426.  		u.umonster = PM_ROGUE;
427.  		Rogue[R_DAGGERS].trquan = rn1(10, 6);
428.  		u.ugold = u.ugold0 = 0;
429.  		ini_inv(Rogue);
430.  		if(!rn2(5)) ini_inv(Blindfold);
431.  		knows_object(SACK);
432.  		break;
433.  	case 'S':
434.  		u.umonster = PM_SAMURAI;
435.  		Samurai[S_ARROWS].trquan = rn1(20, 26);
436.  		ini_inv(Samurai);
437.  		if(!rn2(5)) ini_inv(Blindfold);
438.  		knows_class(WEAPON_CLASS);
439.  		knows_class(ARMOR_CLASS);
440.  		break;
441.  #ifdef TOURIST
442.  	case 'T':
443.  		u.umonster = PM_TOURIST;
444.  		Tourist[T_DARTS].trquan = rn1(20, 21);
445.  		u.ugold = u.ugold0 = rnd(1000);
446.  		ini_inv(Tourist);
447.  		if(!rn2(25)) ini_inv(Tinopener);
448.  #ifdef WALKIES
449.  		else if(!rn2(25)) ini_inv(Leash);
450.  #endif
451.  		else if(!rn2(25)) ini_inv(Towel);
452.  		else if(!rn2(25)) ini_inv(Magicmarker);
453.  		break;
454.  #endif
455.  	case 'V':
456.  		u.umonster = PM_VALKYRIE;
457.  		flags.female = TRUE;
458.  		ini_inv(Valkyrie);
459.  		if(!rn2(6)) ini_inv(Lamp);
460.  		knows_class(WEAPON_CLASS);
461.  		knows_class(ARMOR_CLASS);
462.  		break;
463.  	case 'W':
464.  		u.umonster = PM_WIZARD;
465.  		u.uen = u.uenmax += rn2(4);
466.  		ini_inv(Wizard);
467.  		if(!rn2(5)) ini_inv(Magicmarker);
468.  		if(!rn2(5)) ini_inv(Blindfold);
469.  		break;
470.  
471.  	default:	/* impossible */
472.  		break;
473.  	}
474.  #ifdef EXPLORE_MODE
475.  	if (discover)
476.  		ini_inv(Wishing);
477.  #endif
478.  	find_ac();			/* get initial ac value */
479.  	init_attr(75);			/* init attribute values */
480.  	max_rank_sz();			/* set max str size for class ranks */
481.  /*
482.   *	Do we really need this?
483.   */
484.  	for(i = 0; i < A_MAX; i++)
485.  	    if(!rn2(20)) {
486.  		register int xd = rn2(7) - 2;	/* biased variation */
487.  		(void) adjattrib(i, xd, TRUE);
488.  		if (ABASE(i) < AMAX(i)) AMAX(i) = ABASE(i);
489.  	    }
490.  
491.  	/* make sure you can carry all you have - especially for Tourists */
492.  	while(inv_weight() > 0 && ACURR(A_STR) < 118)
493.  		(void) adjattrib(A_STR, 1, TRUE);
494.  
495.  	u.ualignbase[0] = u.ualignbase[1] = u.ualign.type;
496.  }
497.  
498.  static void
499.  ini_inv(trop)
500.  register struct trobj *trop;
501.  {
502.  	struct obj *obj;
503.  	while(trop->trclass) {
504.  		boolean undefined = (trop->trotyp == UNDEF_TYP);
505.  
506.  		if (!undefined)
507.  			obj = mksobj((int)trop->trotyp, TRUE, FALSE);
508.  		else obj = mkobj(trop->trclass,FALSE);
509.  
510.  		/* For random objects, do not create certain overly powerful
511.  		 * items: wand of wishing, ring of levitation, or the
512.  		 * polymorph/polymorph control combination.  Specific objects,
513.  		 * i.e. the discovery wishing, are still OK.
514.  		 * Also, don't get a couple of really useless items.  (Note:
515.  		 * punishment isn't "useless".  Some players who start out with
516.  		 * one will immediately read it and use the iron ball as a
517.  		 * weapon.)
518.  		 */
519.  		if (undefined) {
520.  #ifdef POLYSELF
521.  			static unsigned NEARDATA nocreate = STRANGE_OBJECT;
522.  			static unsigned NEARDATA nocreate2 = STRANGE_OBJECT;
523.  #endif
524.  			static unsigned NEARDATA nocreate3 = STRANGE_OBJECT;
525.  
526.  			while(obj->otyp == WAN_WISHING
527.  #ifdef POLYSELF
528.  				|| obj->otyp == nocreate
529.  				|| obj->otyp == nocreate2
530.  #endif
531.  				|| obj->otyp == nocreate3
532.  #ifdef ELBERETH
533.  				|| obj->otyp == RIN_LEVITATION
534.  #endif
535.  				/* 'useless' items */
536.  				|| obj->otyp == POT_HALLUCINATION
537.  				|| obj->otyp == SCR_AMNESIA
538.  				|| obj->otyp == SCR_FIRE
539.  				|| obj->otyp == RIN_AGGRAVATE_MONSTER
540.  				|| obj->otyp == RIN_HUNGER
541.  				|| obj->otyp == WAN_NOTHING
542.  				/* powerful spells are either useless to
543.  				   low level players or unbalancing */
544.  				|| (obj->oclass == SPBOOK_CLASS &&
545.  				    objects[obj->otyp].oc_level > 3)
546.  							) {
547.  				dealloc_obj(obj);
548.  				obj = mkobj(trop->trclass, FALSE);
549.  			}
550.  
551.  			/* Don't start with +0 or negative rings */
552.  			if(objects[obj->otyp].oc_charged && obj->spe <= 0)
553.  				obj->spe = rne(3);
554.  
555.  			/* Heavily relies on the fact that 1) we create wands
556.  			 * before rings, 2) that we create rings before
557.  			 * spellbooks, and that 3) not more than 1 object of a
558.  			 * particular symbol is to be prohibited.  (For more
559.  			 * objects, we need more nocreate variables...)
560.  			 */
561.  #ifdef POLYSELF
562.  			switch (obj->otyp) {
563.  			    case WAN_POLYMORPH:
564.  			    case RIN_POLYMORPH:
565.  				nocreate = RIN_POLYMORPH_CONTROL;
566.  				break;
567.  			    case RIN_POLYMORPH_CONTROL:
568.  				nocreate = RIN_POLYMORPH;
569.  				nocreate2 = SPE_POLYMORPH;
570.  			}
571.  #endif /* POLYSELF */
572.  			/* Don't have 2 of the same ring */
573.  			if (obj->oclass == RING_CLASS)
574.  				nocreate3 = obj->otyp;
575.  		}
576.  
577.  		obj->bknown = trop->trknown;
578.  		if(objects[obj->otyp].oc_uses_known) obj->known = trop->trknown;
579.  		/* not obj->dknown = 1; - let him look at it at least once */
580.  		obj->cursed = 0;
581.  		if(obj->oclass == WEAPON_CLASS || obj->oclass == TOOL_CLASS) {
582.  			obj->quan = (long) trop->trquan;
583.  			trop->trquan = 1;
584.  		}
585.  		if(obj->oclass == FOOD_CLASS && undefined) {
586.  			obj->known = 1;
587.  			/* needed for tins and eggs; harmless otherwise */
588.  			obj->bknown = 1;
589.  		}
590.  		/*
591.  		 * The below lines not needed because they don't correspond
592.  		 * to any actual inventory; nobody gets random tools.
593.  		else if(obj->oclass == TOOL_CLASS && undefined) {
594.  			obj->bknown = (obj->otyp != BAG_OF_TRICKS
595.  				&& obj->otyp != SACK
596.  				&& obj->otyp != CHEST
597.  				&& obj->otyp != LARGE_BOX
598.  				&& obj->otyp != ICE_BOX);
599.  		}
600.  		*/
601.  		if(trop->trspe != UNDEF_SPE)
602.  			obj->spe = trop->trspe;
603.  		if(trop->trbless != UNDEF_BLESS)
604.  			obj->blessed = trop->trbless;
605.  
606.  		/* defined after setting otyp+quan + blessedness */
607.  		obj->owt = weight(obj);
608.  		obj = addinv(obj);
609.  
610.  		/* Make the type known if necessary */
611.  		if (OBJ_DESCR(objects[obj->otyp]) && obj->known)
612.  			makeknown(obj->otyp);
613.  
614.  		if(obj->oclass == ARMOR_CLASS){
615.  			if (is_shield(obj) && !uarms)
616.  				setworn(obj, W_ARMS);
617.  			else if (is_helmet(obj) && !uarmh)
618.  				setworn(obj, W_ARMH);
619.  			else if (is_gloves(obj) && !uarmg)
620.  				setworn(obj, W_ARMG);
621.  #ifdef TOURIST
622.  			else if (obj->otyp == HAWAIIAN_SHIRT && !uarmu)
623.  				setworn(obj, W_ARMU);
624.  #endif
625.  			else if (is_cloak(obj) && !uarmc)
626.  				setworn(obj, W_ARMC);
627.  			else if (is_boots(obj) && !uarmf)
628.  				setworn(obj, W_ARMF);
629.  			else if (!uarm)
630.  				setworn(obj, W_ARM);
631.  		}
632.  		/* below changed by GAN 01/09/87 to allow wielding of
633.  		 * pick-axe or can-opener if there is no weapon
634.  		 */
635.  		if(obj->oclass == WEAPON_CLASS || obj->otyp == PICK_AXE ||
636.  		   obj->otyp == TIN_OPENER)
637.  			if(!uwep) setuwep(obj);
638.  #if !defined(PYRAMID_BUG) && !defined(MAC)
639.  		if(--trop->trquan) continue;	/* make a similar object */
640.  #else
641.  		if(trop->trquan) {		/* check if zero first */
642.  			--trop->trquan;
643.  			if(trop->trquan)
644.  				continue;	/* make a similar object */
645.  		}
646.  #endif
647.  		trop++;
648.  	}
649.  }
650.  
651.  void
652.  plnamesuffix() {
653.  	register char *p;
654.  	if ((p = rindex(plname, '-')) != 0) {
655.  		*p = 0;
656.  		pl_character[0] = p[1];
657.  		pl_character[1] = 0;
658.  		if(!plname[0]) {
659.  			askname();
660.  			plnamesuffix();
661.  		}
662.  	}
663.  }
664.  
665.  /*u_init.c*/