Wikihack
Advertisement

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

Top of file[]

1.    /*	SCCS Id: @(#)u_init.c	3.4	2002/10/22	*/
2.    /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
3.    /* NetHack may be freely redistributed.  See license for details. */
4.    
The NetHack General Public License applies to screenshots, source code and other content from NetHack.
5.    #include "hack.h"
6.    
7.    struct trobj {
8.    	short trotyp;
9.    	schar trspe;
10.   	char trclass;
11.   	Bitfield(trquan,6);
12.   	Bitfield(trbless,2);
13.   };
14.   
15.   STATIC_DCL void FDECL(ini_inv, (struct trobj *));
16.   STATIC_DCL void FDECL(knows_object,(int));
17.   STATIC_DCL void FDECL(knows_class,(CHAR_P));
18.   STATIC_DCL boolean FDECL(restricted_spell_discipline, (int));
19.   
20.   #define UNDEF_TYP	0
21.   #define UNDEF_SPE	'\177'
22.   #define UNDEF_BLESS	2
23.   

Initial inventories[]

24.   /*
25.    *	Initial inventory for the various roles.
26.    */
27.   

Archeologist initial inventory[]

28.   static struct trobj Archeologist[] = {
29.   	/* if adventure has a name...  idea from tan@uvm-gen */
30.   	{ BULLWHIP, 2, WEAPON_CLASS, 1, UNDEF_BLESS },
31.   	{ LEATHER_JACKET, 0, ARMOR_CLASS, 1, UNDEF_BLESS },
32.   	{ FEDORA, 0, ARMOR_CLASS, 1, UNDEF_BLESS },
33.   	{ FOOD_RATION, 0, FOOD_CLASS, 3, 0 },
34.   	{ PICK_AXE, UNDEF_SPE, TOOL_CLASS, 1, UNDEF_BLESS },
35.   	{ TINNING_KIT, UNDEF_SPE, TOOL_CLASS, 1, UNDEF_BLESS },
36.   	{ TOUCHSTONE, 0, GEM_CLASS, 1, 0 },
37.   	{ SACK, 0, TOOL_CLASS, 1, 0 },
38.   	{ 0, 0, 0, 0, 0 }
39.   };

Barbarian initial inventory[]

40.   static struct trobj Barbarian[] = {
41.   #define B_MAJOR	0	/* two-handed sword or battle-axe  */
42.   #define B_MINOR	1	/* matched with axe or short sword */
43.   	{ TWO_HANDED_SWORD, 0, WEAPON_CLASS, 1, UNDEF_BLESS },
44.   	{ AXE, 0, WEAPON_CLASS, 1, UNDEF_BLESS },
45.   	{ RING_MAIL, 0, ARMOR_CLASS, 1, UNDEF_BLESS },
46.   	{ FOOD_RATION, 0, FOOD_CLASS, 1, 0 },
47.   	{ 0, 0, 0, 0, 0 }
48.   };

Caveman initial inventory[]

49.   static struct trobj Cave_man[] = {
50.   #define C_AMMO	2
51.   	{ CLUB, 1, WEAPON_CLASS, 1, UNDEF_BLESS },
52.   	{ SLING, 2, WEAPON_CLASS, 1, UNDEF_BLESS },
53.   	{ FLINT, 0, GEM_CLASS, 15, UNDEF_BLESS },	/* quan is variable */
54.   	{ ROCK, 0, GEM_CLASS, 3, 0 },			/* yields 18..33 */
55.   	{ LEATHER_ARMOR, 0, ARMOR_CLASS, 1, UNDEF_BLESS },
56.   	{ 0, 0, 0, 0, 0 }
57.   };

Healer initial inventory[]

58.   static struct trobj Healer[] = {
59.   	{ SCALPEL, 0, WEAPON_CLASS, 1, UNDEF_BLESS },
60.   	{ LEATHER_GLOVES, 1, ARMOR_CLASS, 1, UNDEF_BLESS },
61.   	{ STETHOSCOPE, 0, TOOL_CLASS, 1, 0 },
62.   	{ POT_HEALING, 0, POTION_CLASS, 4, UNDEF_BLESS },
63.   	{ POT_EXTRA_HEALING, 0, POTION_CLASS, 4, UNDEF_BLESS },
64.   	{ WAN_SLEEP, UNDEF_SPE, WAND_CLASS, 1, UNDEF_BLESS },
65.   	/* always blessed, so it's guaranteed readable */
66.   	{ SPE_HEALING, 0, SPBOOK_CLASS, 1, 1 },
67.   	{ SPE_EXTRA_HEALING, 0, SPBOOK_CLASS, 1, 1 },
68.   	{ SPE_STONE_TO_FLESH, 0, SPBOOK_CLASS, 1, 1 },
69.   	{ APPLE, 0, FOOD_CLASS, 5, 0 },
70.   	{ 0, 0, 0, 0, 0 }
71.   };

Knight initial inventory[]

72.   static struct trobj Knight[] = {
73.   	{ LONG_SWORD, 1, WEAPON_CLASS, 1, UNDEF_BLESS },
74.   	{ LANCE, 1, WEAPON_CLASS, 1, UNDEF_BLESS },
75.   	{ RING_MAIL, 1, ARMOR_CLASS, 1, UNDEF_BLESS },
76.   	{ HELMET, 0, ARMOR_CLASS, 1, UNDEF_BLESS },
77.   	{ SMALL_SHIELD, 0, ARMOR_CLASS, 1, UNDEF_BLESS },
78.   	{ LEATHER_GLOVES, 0, ARMOR_CLASS, 1, UNDEF_BLESS },
79.   	{ APPLE, 0, FOOD_CLASS, 10, 0 },
80.   	{ CARROT, 0, FOOD_CLASS, 10, 0 },
81.   	{ 0, 0, 0, 0, 0 }
82.   };

Monk initial inventory[]

83.   static struct trobj Monk[] = {
84.   #define M_BOOK		2
85.   	{ LEATHER_GLOVES, 2, ARMOR_CLASS, 1, UNDEF_BLESS },
86.   	{ ROBE, 1, ARMOR_CLASS, 1, UNDEF_BLESS },
87.   	{ UNDEF_TYP, UNDEF_SPE, SPBOOK_CLASS, 1, 1 },
88.   	{ UNDEF_TYP, UNDEF_SPE, SCROLL_CLASS, 1, UNDEF_BLESS },
89.   	{ POT_HEALING, 0, POTION_CLASS, 3, UNDEF_BLESS },
90.   	{ FOOD_RATION, 0, FOOD_CLASS, 3, 0 },
91.   	{ APPLE, 0, FOOD_CLASS, 5, UNDEF_BLESS },
92.   	{ ORANGE, 0, FOOD_CLASS, 5, UNDEF_BLESS },
93.   	/* Yes, we know fortune cookies aren't really from China.  They were
94.   	 * invented by George Jung in Los Angeles, California, USA in 1916.
95.   	 */
96.   	{ FORTUNE_COOKIE, 0, FOOD_CLASS, 3, UNDEF_BLESS },
97.   	{ 0, 0, 0, 0, 0 }
98.   };

Priest initial inventory[]

99.   static struct trobj Priest[] = {
100.  	{ MACE, 1, WEAPON_CLASS, 1, 1 },
101.  	{ ROBE, 0, ARMOR_CLASS, 1, UNDEF_BLESS },
102.  	{ SMALL_SHIELD, 0, ARMOR_CLASS, 1, UNDEF_BLESS },
103.  	{ POT_WATER, 0, POTION_CLASS, 4, 1 },	/* holy water */
104.  	{ CLOVE_OF_GARLIC, 0, FOOD_CLASS, 1, 0 },
105.  	{ SPRIG_OF_WOLFSBANE, 0, FOOD_CLASS, 1, 0 },
106.  	{ UNDEF_TYP, UNDEF_SPE, SPBOOK_CLASS, 2, UNDEF_BLESS },
107.  	{ 0, 0, 0, 0, 0 }
108.  };

Ranger initial inventory[]

109.  static struct trobj Ranger[] = {
110.  #define RAN_BOW			1
111.  #define RAN_TWO_ARROWS	2
112.  #define RAN_ZERO_ARROWS	3
113.  	{ DAGGER, 1, WEAPON_CLASS, 1, UNDEF_BLESS },
114.  	{ BOW, 1, WEAPON_CLASS, 1, UNDEF_BLESS },
115.  	{ ARROW, 2, WEAPON_CLASS, 50, UNDEF_BLESS },
116.  	{ ARROW, 0, WEAPON_CLASS, 30, UNDEF_BLESS },
117.  	{ CLOAK_OF_DISPLACEMENT, 2, ARMOR_CLASS, 1, UNDEF_BLESS },
118.  	{ CRAM_RATION, 0, FOOD_CLASS, 4, 0 },
119.  	{ 0, 0, 0, 0, 0 }
120.  };

Rogue initial inventory[]

121.  static struct trobj Rogue[] = {
122.  #define R_DAGGERS	1
123.  	{ SHORT_SWORD, 0, WEAPON_CLASS, 1, UNDEF_BLESS },
124.  	{ DAGGER, 0, WEAPON_CLASS, 10, 0 },	/* quan is variable */
125.  	{ LEATHER_ARMOR, 1, ARMOR_CLASS, 1, UNDEF_BLESS },
126.  	{ POT_SICKNESS, 0, POTION_CLASS, 1, 0 },
127.  	{ LOCK_PICK, 9, TOOL_CLASS, 1, 0 },
128.  	{ SACK, 0, TOOL_CLASS, 1, 0 },
129.  	{ 0, 0, 0, 0, 0 }
130.  };

Samurai initial inventory[]

131.  static struct trobj Samurai[] = {
132.  #define S_ARROWS	3
133.  	{ KATANA, 0, WEAPON_CLASS, 1, UNDEF_BLESS },
134.  	{ SHORT_SWORD, 0, WEAPON_CLASS, 1, UNDEF_BLESS }, /* wakizashi */
135.  	{ YUMI, 0, WEAPON_CLASS, 1, UNDEF_BLESS },
136.  	{ YA, 0, WEAPON_CLASS, 25, UNDEF_BLESS }, /* variable quan */
137.  	{ SPLINT_MAIL, 0, ARMOR_CLASS, 1, UNDEF_BLESS },
138.  	{ 0, 0, 0, 0, 0 }
139.  };

Tourist initial inventory[]

140.  #ifdef TOURIST
141.  static struct trobj Tourist[] = {
142.  #define T_DARTS		0
143.  	{ DART, 2, WEAPON_CLASS, 25, UNDEF_BLESS },	/* quan is variable */
144.  	{ UNDEF_TYP, UNDEF_SPE, FOOD_CLASS, 10, 0 },
145.  	{ POT_EXTRA_HEALING, 0, POTION_CLASS, 2, UNDEF_BLESS },
146.  	{ SCR_MAGIC_MAPPING, 0, SCROLL_CLASS, 4, UNDEF_BLESS },
147.  	{ HAWAIIAN_SHIRT, 0, ARMOR_CLASS, 1, UNDEF_BLESS },
148.  	{ EXPENSIVE_CAMERA, UNDEF_SPE, TOOL_CLASS, 1, 0 },
149.  	{ CREDIT_CARD, 0, TOOL_CLASS, 1, 0 },
150.  	{ 0, 0, 0, 0, 0 }
151.  };
152.  #endif

Valkyrie initial inventory[]

153.  static struct trobj Valkyrie[] = {
154.  	{ LONG_SWORD, 1, WEAPON_CLASS, 1, UNDEF_BLESS },
155.  	{ DAGGER, 0, WEAPON_CLASS, 1, UNDEF_BLESS },
156.  	{ SMALL_SHIELD, 3, ARMOR_CLASS, 1, UNDEF_BLESS },
157.  	{ FOOD_RATION, 0, FOOD_CLASS, 1, 0 },
158.  	{ 0, 0, 0, 0, 0 }
159.  };

Wizard initial inventory[]

160.  static struct trobj Wizard[] = {
161.  #define W_MULTSTART	2
162.  #define W_MULTEND	6
163.  	{ QUARTERSTAFF, 1, WEAPON_CLASS, 1, 1 },
164.  	{ CLOAK_OF_MAGIC_RESISTANCE, 0, ARMOR_CLASS, 1, UNDEF_BLESS },
165.  	{ UNDEF_TYP, UNDEF_SPE, WAND_CLASS, 1, UNDEF_BLESS },
166.  	{ UNDEF_TYP, UNDEF_SPE, RING_CLASS, 2, UNDEF_BLESS },
167.  	{ UNDEF_TYP, UNDEF_SPE, POTION_CLASS, 3, UNDEF_BLESS },
168.  	{ UNDEF_TYP, UNDEF_SPE, SCROLL_CLASS, 3, UNDEF_BLESS },
169.  	{ SPE_FORCE_BOLT, 0, SPBOOK_CLASS, 1, 1 },
170.  	{ UNDEF_TYP, UNDEF_SPE, SPBOOK_CLASS, 1, UNDEF_BLESS },
171.  	{ 0, 0, 0, 0, 0 }
172.  };
173.  

Optional extra inventory items[]

174.  /*
175.   *	Optional extra inventory items.
176.   */
177.  
178.  static struct trobj Tinopener[] = {
179.  	{ TIN_OPENER, 0, TOOL_CLASS, 1, 0 },
180.  	{ 0, 0, 0, 0, 0 }
181.  };
182.  static struct trobj Magicmarker[] = {
183.  	{ MAGIC_MARKER, UNDEF_SPE, TOOL_CLASS, 1, 0 },
184.  	{ 0, 0, 0, 0, 0 }
185.  };
186.  static struct trobj Lamp[] = {
187.  	{ OIL_LAMP, 1, TOOL_CLASS, 1, 0 },
188.  	{ 0, 0, 0, 0, 0 }
189.  };
190.  static struct trobj Blindfold[] = {
191.  	{ BLINDFOLD, 0, TOOL_CLASS, 1, 0 },
192.  	{ 0, 0, 0, 0, 0 }
193.  };
194.  static struct trobj Instrument[] = {
195.  	{ WOODEN_FLUTE, 0, TOOL_CLASS, 1, 0 },
196.  	{ 0, 0, 0, 0, 0 }
197.  };
198.  static struct trobj Xtra_food[] = {
199.  	{ UNDEF_TYP, UNDEF_SPE, FOOD_CLASS, 2, 0 },
200.  	{ 0, 0, 0, 0, 0 }
201.  };
202.  #ifdef TOURIST
203.  static struct trobj Leash[] = {
204.  	{ LEASH, 0, TOOL_CLASS, 1, 0 },
205.  	{ 0, 0, 0, 0, 0 }
206.  };
207.  static struct trobj Towel[] = {
208.  	{ TOWEL, 0, TOOL_CLASS, 1, 0 },
209.  	{ 0, 0, 0, 0, 0 }
210.  };
211.  #endif	/* TOURIST */
212.  static struct trobj Wishing[] = {
213.  	{ WAN_WISHING, 3, WAND_CLASS, 1, 0 },
214.  	{ 0, 0, 0, 0, 0 }
215.  };
216.  #ifdef GOLDOBJ
217.  static struct trobj Money[] = {
218.  	{ GOLD_PIECE, 0 , COIN_CLASS, 1, 0 },
219.  	{ 0, 0, 0, 0, 0 }
220.  };
221.  #endif
222.  

Race-based substitutions for initial inventory[]

223.  /* race-based substitutions for initial inventory;
224.     the weaker cloak for elven rangers is intentional--they shoot better */
225.  static struct inv_sub { short race_pm, item_otyp, subs_otyp; } inv_subs[] = {
226.      { PM_ELF,	DAGGER,			ELVEN_DAGGER	      },
227.      { PM_ELF,	SPEAR,			ELVEN_SPEAR	      },
228.      { PM_ELF,	SHORT_SWORD,		ELVEN_SHORT_SWORD     },
229.      { PM_ELF,	BOW,			ELVEN_BOW	      },
230.      { PM_ELF,	ARROW,			ELVEN_ARROW	      },
231.      { PM_ELF,	HELMET,			ELVEN_LEATHER_HELM    },
232.   /* { PM_ELF,	SMALL_SHIELD,		ELVEN_SHIELD	      }, */
233.      { PM_ELF,	CLOAK_OF_DISPLACEMENT,	ELVEN_CLOAK	      },
234.      { PM_ELF,	CRAM_RATION,		LEMBAS_WAFER	      },
235.      { PM_ORC,	DAGGER,			ORCISH_DAGGER	      },
236.      { PM_ORC,	SPEAR,			ORCISH_SPEAR	      },
237.      { PM_ORC,	SHORT_SWORD,		ORCISH_SHORT_SWORD    },
238.      { PM_ORC,	BOW,			ORCISH_BOW	      },
239.      { PM_ORC,	ARROW,			ORCISH_ARROW	      },
240.      { PM_ORC,	HELMET,			ORCISH_HELM	      },
241.      { PM_ORC,	SMALL_SHIELD,		ORCISH_SHIELD	      },
242.      { PM_ORC,	RING_MAIL,		ORCISH_RING_MAIL      },
243.      { PM_ORC,	CHAIN_MAIL,		ORCISH_CHAIN_MAIL     },
244.      { PM_DWARF, SPEAR,			DWARVISH_SPEAR	      },
245.      { PM_DWARF, SHORT_SWORD,		DWARVISH_SHORT_SWORD  },
246.      { PM_DWARF, HELMET,			DWARVISH_IRON_HELM    },
247.   /* { PM_DWARF, SMALL_SHIELD,		DWARVISH_ROUNDSHIELD  }, */
248.   /* { PM_DWARF, PICK_AXE,		DWARVISH_MATTOCK      }, */
249.      { PM_GNOME, BOW,			CROSSBOW	      },
250.      { PM_GNOME, ARROW,			CROSSBOW_BOLT	      },
251.      { NON_PM,	STRANGE_OBJECT,		STRANGE_OBJECT	      }
252.  };
253.  

Maximum skill levels[]

Archeologist max skill levels[]

254.  static const struct def_skill Skill_A[] = {
255.      { P_DAGGER, P_BASIC },		{ P_KNIFE,  P_BASIC },
256.      { P_PICK_AXE, P_EXPERT },		{ P_SHORT_SWORD, P_BASIC },
257.      { P_SCIMITAR, P_SKILLED },		{ P_SABER, P_EXPERT },
258.      { P_CLUB, P_SKILLED },		{ P_QUARTERSTAFF, P_SKILLED },
259.      { P_SLING, P_SKILLED },		{ P_DART, P_BASIC },
260.      { P_BOOMERANG, P_EXPERT },		{ P_WHIP, P_EXPERT },
261.      { P_UNICORN_HORN, P_SKILLED },
262.      { P_ATTACK_SPELL, P_BASIC },	{ P_HEALING_SPELL, P_BASIC },
263.      { P_DIVINATION_SPELL, P_EXPERT},	{ P_MATTER_SPELL, P_BASIC},
264.  #ifdef STEED
265.      { P_RIDING, P_BASIC },
266.  #endif
267.      { P_TWO_WEAPON_COMBAT, P_BASIC },
268.      { P_BARE_HANDED_COMBAT, P_EXPERT },
269.      { P_NONE, 0 }
270.  };
271.  

Barbarian max skill levels[]

272.  static const struct def_skill Skill_B[] = {
273.      { P_DAGGER, P_BASIC },		{ P_AXE, P_EXPERT },
274.      { P_PICK_AXE, P_SKILLED },	{ P_SHORT_SWORD, P_EXPERT },
275.      { P_BROAD_SWORD, P_SKILLED },	{ P_LONG_SWORD, P_SKILLED },
276.      { P_TWO_HANDED_SWORD, P_EXPERT },	{ P_SCIMITAR, P_SKILLED },
277.      { P_SABER, P_BASIC },		{ P_CLUB, P_SKILLED },
278.      { P_MACE, P_SKILLED },		{ P_MORNING_STAR, P_SKILLED },
279.      { P_FLAIL, P_BASIC },		{ P_HAMMER, P_EXPERT },
280.      { P_QUARTERSTAFF, P_BASIC },	{ P_SPEAR, P_SKILLED },
281.      { P_TRIDENT, P_SKILLED },		{ P_BOW, P_BASIC },
282.      { P_ATTACK_SPELL, P_SKILLED },
283.  #ifdef STEED
284.      { P_RIDING, P_BASIC },
285.  #endif
286.      { P_TWO_WEAPON_COMBAT, P_BASIC },
287.      { P_BARE_HANDED_COMBAT, P_MASTER },
288.      { P_NONE, 0 }
289.  };
290.  

Caveman max skill levels[]

291.  static const struct def_skill Skill_C[] = {
292.      { P_DAGGER, P_BASIC },		{ P_KNIFE,  P_SKILLED },
293.      { P_AXE, P_SKILLED },		{ P_PICK_AXE, P_BASIC },
294.      { P_CLUB, P_EXPERT },		{ P_MACE, P_EXPERT },
295.      { P_MORNING_STAR, P_BASIC },	{ P_FLAIL, P_SKILLED },
296.      { P_HAMMER, P_SKILLED },		{ P_QUARTERSTAFF, P_EXPERT },
297.      { P_POLEARMS, P_SKILLED },		{ P_SPEAR, P_EXPERT },
298.      { P_JAVELIN, P_SKILLED },		{ P_TRIDENT, P_SKILLED },
299.      { P_BOW, P_SKILLED },		{ P_SLING, P_EXPERT },
300.      { P_ATTACK_SPELL, P_BASIC },	{ P_MATTER_SPELL, P_SKILLED },
301.      { P_BOOMERANG, P_EXPERT },		{ P_UNICORN_HORN, P_BASIC },
302.      { P_BARE_HANDED_COMBAT, P_MASTER },
303.      { P_NONE, 0 }
304.  };
305.  

Healer max skill levels[]

306.  static const struct def_skill Skill_H[] = {
307.      { P_DAGGER, P_SKILLED },		{ P_KNIFE, P_EXPERT },
308.      { P_SHORT_SWORD, P_SKILLED },	{ P_SCIMITAR, P_BASIC },
309.      { P_SABER, P_BASIC },		{ P_CLUB, P_SKILLED },
310.      { P_MACE, P_BASIC },		{ P_QUARTERSTAFF, P_EXPERT },
311.      { P_POLEARMS, P_BASIC },		{ P_SPEAR, P_BASIC },
312.      { P_JAVELIN, P_BASIC },		{ P_TRIDENT, P_BASIC },
313.      { P_SLING, P_SKILLED },		{ P_DART, P_EXPERT },
314.      { P_SHURIKEN, P_SKILLED },		{ P_UNICORN_HORN, P_EXPERT },
315.      { P_HEALING_SPELL, P_EXPERT },
316.      { P_BARE_HANDED_COMBAT, P_BASIC },
317.      { P_NONE, 0 }
318.  };
319.  

Knight max skill levels[]

320.  static const struct def_skill Skill_K[] = {
321.      { P_DAGGER, P_BASIC },		{ P_KNIFE, P_BASIC },
322.      { P_AXE, P_SKILLED },		{ P_PICK_AXE, P_BASIC },
323.      { P_SHORT_SWORD, P_SKILLED },	{ P_BROAD_SWORD, P_SKILLED },
324.      { P_LONG_SWORD, P_EXPERT },	{ P_TWO_HANDED_SWORD, P_SKILLED },
325.      { P_SCIMITAR, P_BASIC },		{ P_SABER, P_SKILLED },
326.      { P_CLUB, P_BASIC },		{ P_MACE, P_SKILLED },
327.      { P_MORNING_STAR, P_SKILLED },	{ P_FLAIL, P_BASIC },
328.      { P_HAMMER, P_BASIC },		{ P_POLEARMS, P_SKILLED },
329.      { P_SPEAR, P_SKILLED },		{ P_JAVELIN, P_SKILLED },
330.      { P_TRIDENT, P_BASIC },		{ P_LANCE, P_EXPERT },
331.      { P_BOW, P_BASIC },			{ P_CROSSBOW, P_SKILLED },
332.      { P_ATTACK_SPELL, P_SKILLED },	{ P_HEALING_SPELL, P_SKILLED },
333.      { P_CLERIC_SPELL, P_SKILLED },
334.  #ifdef STEED
335.      { P_RIDING, P_EXPERT },
336.  #endif
337.      { P_TWO_WEAPON_COMBAT, P_SKILLED },
338.      { P_BARE_HANDED_COMBAT, P_EXPERT },
339.      { P_NONE, 0 }
340.  };
341.  

Monk max skill levels[]

342.  static const struct def_skill Skill_Mon[] = {
343.      { P_QUARTERSTAFF, P_BASIC },    { P_SPEAR, P_BASIC },
344.      { P_JAVELIN, P_BASIC },		    { P_CROSSBOW, P_BASIC },
345.      { P_SHURIKEN, P_BASIC },
346.      { P_ATTACK_SPELL, P_BASIC },    { P_HEALING_SPELL, P_EXPERT },
347.      { P_DIVINATION_SPELL, P_BASIC },{ P_ENCHANTMENT_SPELL, P_BASIC },
348.      { P_CLERIC_SPELL, P_SKILLED },  { P_ESCAPE_SPELL, P_BASIC },
349.      { P_MATTER_SPELL, P_BASIC },
350.      { P_MARTIAL_ARTS, P_GRAND_MASTER },
351.      { P_NONE, 0 }
352.  };
353.  

Priest max skill levels[]

354.  static const struct def_skill Skill_P[] = {
355.      { P_CLUB, P_EXPERT },		{ P_MACE, P_EXPERT },
356.      { P_MORNING_STAR, P_EXPERT },	{ P_FLAIL, P_EXPERT },
357.      { P_HAMMER, P_EXPERT },		{ P_QUARTERSTAFF, P_EXPERT },
358.      { P_POLEARMS, P_SKILLED },		{ P_SPEAR, P_SKILLED },
359.      { P_JAVELIN, P_SKILLED },		{ P_TRIDENT, P_SKILLED },
360.      { P_LANCE, P_BASIC },		{ P_BOW, P_BASIC },
361.      { P_SLING, P_BASIC },		{ P_CROSSBOW, P_BASIC },
362.      { P_DART, P_BASIC },		{ P_SHURIKEN, P_BASIC },
363.      { P_BOOMERANG, P_BASIC },		{ P_UNICORN_HORN, P_SKILLED },
364.      { P_HEALING_SPELL, P_EXPERT },	{ P_DIVINATION_SPELL, P_EXPERT },
365.      { P_CLERIC_SPELL, P_EXPERT },
366.      { P_BARE_HANDED_COMBAT, P_BASIC },
367.      { P_NONE, 0 }
368.  };
369.  

Rogue max skill levels[]

370.  static const struct def_skill Skill_R[] = {
371.      { P_DAGGER, P_EXPERT },		{ P_KNIFE,  P_EXPERT },
372.      { P_SHORT_SWORD, P_EXPERT },	{ P_BROAD_SWORD, P_SKILLED },
373.      { P_LONG_SWORD, P_SKILLED },	{ P_TWO_HANDED_SWORD, P_BASIC },
374.      { P_SCIMITAR, P_SKILLED },		{ P_SABER, P_SKILLED },
375.      { P_CLUB, P_SKILLED },		{ P_MACE, P_SKILLED },
376.      { P_MORNING_STAR, P_BASIC },	{ P_FLAIL, P_BASIC },
377.      { P_HAMMER, P_BASIC },		{ P_POLEARMS, P_BASIC },
378.      { P_SPEAR, P_BASIC },		{ P_CROSSBOW, P_EXPERT },
379.      { P_DART, P_EXPERT },		{ P_SHURIKEN, P_SKILLED },
380.      { P_DIVINATION_SPELL, P_SKILLED },	{ P_ESCAPE_SPELL, P_SKILLED },
381.      { P_MATTER_SPELL, P_SKILLED },
382.  #ifdef STEED
383.      { P_RIDING, P_BASIC },
384.  #endif
385.      { P_TWO_WEAPON_COMBAT, P_EXPERT },
386.      { P_BARE_HANDED_COMBAT, P_EXPERT },
387.      { P_NONE, 0 }
388.  };
389.  

Ranger max skill levels[]

390.  static const struct def_skill Skill_Ran[] = {
391.      { P_DAGGER, P_EXPERT },		 { P_KNIFE,  P_SKILLED },
392.      { P_AXE, P_SKILLED },	 { P_PICK_AXE, P_BASIC },
393.      { P_SHORT_SWORD, P_BASIC },	 { P_MORNING_STAR, P_BASIC },
394.      { P_FLAIL, P_SKILLED },	 { P_HAMMER, P_BASIC },
395.      { P_QUARTERSTAFF, P_BASIC }, { P_POLEARMS, P_SKILLED },
396.      { P_SPEAR, P_SKILLED },	 { P_JAVELIN, P_EXPERT },
397.      { P_TRIDENT, P_BASIC },	 { P_BOW, P_EXPERT },
398.      { P_SLING, P_EXPERT },	 { P_CROSSBOW, P_EXPERT },
399.      { P_DART, P_EXPERT },	 { P_SHURIKEN, P_SKILLED },
400.      { P_BOOMERANG, P_EXPERT },	 { P_WHIP, P_BASIC },
401.      { P_HEALING_SPELL, P_BASIC },
402.      { P_DIVINATION_SPELL, P_EXPERT },
403.      { P_ESCAPE_SPELL, P_BASIC },
404.  #ifdef STEED
405.      { P_RIDING, P_BASIC },
406.  #endif
407.      { P_BARE_HANDED_COMBAT, P_BASIC },
408.      { P_NONE, 0 }
409.  };
410.  

Samurai max skill levels[]

411.  static const struct def_skill Skill_S[] = {
412.      { P_DAGGER, P_BASIC },		{ P_KNIFE,  P_SKILLED },
413.      { P_SHORT_SWORD, P_EXPERT },	{ P_BROAD_SWORD, P_SKILLED },
414.      { P_LONG_SWORD, P_EXPERT },		{ P_TWO_HANDED_SWORD, P_EXPERT },
415.      { P_SCIMITAR, P_BASIC },		{ P_SABER, P_BASIC },
416.      { P_FLAIL, P_SKILLED },		{ P_QUARTERSTAFF, P_BASIC },
417.      { P_POLEARMS, P_SKILLED },		{ P_SPEAR, P_BASIC },
418.      { P_JAVELIN, P_BASIC },		{ P_LANCE, P_SKILLED },
419.      { P_BOW, P_EXPERT },		{ P_SHURIKEN, P_EXPERT },
420.      { P_ATTACK_SPELL, P_SKILLED },	{ P_CLERIC_SPELL, P_SKILLED },
421.  #ifdef STEED
422.      { P_RIDING, P_SKILLED },
423.  #endif
424.      { P_TWO_WEAPON_COMBAT, P_EXPERT },
425.      { P_MARTIAL_ARTS, P_MASTER },
426.      { P_NONE, 0 }
427.  };
428.  

Tourist max skill levels[]

429.  #ifdef TOURIST
430.  static const struct def_skill Skill_T[] = {
431.      { P_DAGGER, P_EXPERT },		{ P_KNIFE,  P_SKILLED },
432.      { P_AXE, P_BASIC },			{ P_PICK_AXE, P_BASIC },
433.      { P_SHORT_SWORD, P_EXPERT },	{ P_BROAD_SWORD, P_BASIC },
434.      { P_LONG_SWORD, P_BASIC },		{ P_TWO_HANDED_SWORD, P_BASIC },
435.      { P_SCIMITAR, P_SKILLED },		{ P_SABER, P_SKILLED },
436.      { P_MACE, P_BASIC },		{ P_MORNING_STAR, P_BASIC },
437.      { P_FLAIL, P_BASIC },		{ P_HAMMER, P_BASIC },
438.      { P_QUARTERSTAFF, P_BASIC },	{ P_POLEARMS, P_BASIC },
439.      { P_SPEAR, P_BASIC },		{ P_JAVELIN, P_BASIC },
440.      { P_TRIDENT, P_BASIC },		{ P_LANCE, P_BASIC },
441.      { P_BOW, P_BASIC },			{ P_SLING, P_BASIC },
442.      { P_CROSSBOW, P_BASIC },		{ P_DART, P_EXPERT },
443.      { P_SHURIKEN, P_BASIC },		{ P_BOOMERANG, P_BASIC },
444.      { P_WHIP, P_BASIC },		{ P_UNICORN_HORN, P_SKILLED },
445.      { P_DIVINATION_SPELL, P_BASIC },	{ P_ENCHANTMENT_SPELL, P_BASIC },
446.      { P_ESCAPE_SPELL, P_SKILLED },
447.  #ifdef STEED
448.      { P_RIDING, P_BASIC },
449.  #endif
450.      { P_TWO_WEAPON_COMBAT, P_SKILLED },
451.      { P_BARE_HANDED_COMBAT, P_SKILLED },
452.      { P_NONE, 0 }
453.  };
454.  #endif /* TOURIST */
455.  

Valkyrie max skill levels[]

456.  static const struct def_skill Skill_V[] = {
457.      { P_DAGGER, P_EXPERT },		{ P_AXE, P_EXPERT },
458.      { P_PICK_AXE, P_SKILLED },		{ P_SHORT_SWORD, P_SKILLED },
459.      { P_BROAD_SWORD, P_SKILLED },	{ P_LONG_SWORD, P_EXPERT },
460.      { P_TWO_HANDED_SWORD, P_EXPERT },	{ P_SCIMITAR, P_BASIC },
461.      { P_SABER, P_BASIC },		{ P_HAMMER, P_EXPERT },
462.      { P_QUARTERSTAFF, P_BASIC },	{ P_POLEARMS, P_SKILLED },
463.      { P_SPEAR, P_SKILLED },		{ P_JAVELIN, P_BASIC },
464.      { P_TRIDENT, P_BASIC },		{ P_LANCE, P_SKILLED },
465.      { P_SLING, P_BASIC },
466.      { P_ATTACK_SPELL, P_BASIC },	{ P_ESCAPE_SPELL, P_BASIC },
467.  #ifdef STEED
468.      { P_RIDING, P_SKILLED },
469.  #endif
470.      { P_TWO_WEAPON_COMBAT, P_SKILLED },
471.      { P_BARE_HANDED_COMBAT, P_EXPERT },
472.      { P_NONE, 0 }
473.  };
474.  

Wizard max skill levels[]

475.  static const struct def_skill Skill_W[] = {
476.      { P_DAGGER, P_EXPERT },		{ P_KNIFE,  P_SKILLED },
477.      { P_AXE, P_SKILLED },		{ P_SHORT_SWORD, P_BASIC },
478.      { P_CLUB, P_SKILLED },		{ P_MACE, P_BASIC },
479.      { P_QUARTERSTAFF, P_EXPERT },	{ P_POLEARMS, P_SKILLED },
480.      { P_SPEAR, P_BASIC },		{ P_JAVELIN, P_BASIC },
481.      { P_TRIDENT, P_BASIC },		{ P_SLING, P_SKILLED },
482.      { P_DART, P_EXPERT },		{ P_SHURIKEN, P_BASIC },
483.      { P_ATTACK_SPELL, P_EXPERT },	{ P_HEALING_SPELL, P_SKILLED },
484.      { P_DIVINATION_SPELL, P_EXPERT },	{ P_ENCHANTMENT_SPELL, P_SKILLED },
485.      { P_CLERIC_SPELL, P_SKILLED },	{ P_ESCAPE_SPELL, P_EXPERT },
486.      { P_MATTER_SPELL, P_EXPERT },
487.  #ifdef STEED
488.      { P_RIDING, P_BASIC },
489.  #endif
490.      { P_BARE_HANDED_COMBAT, P_BASIC },
491.      { P_NONE, 0 }
492.  };
493.  
494.  

knows_object[]

495.  STATIC_OVL void
496.  knows_object(obj)
497.  register int obj;
498.  {
499.  	discover_object(obj,TRUE,FALSE);
500.  	objects[obj].oc_pre_discovered = 1;	/* not a "discovery" */
501.  }
502.  

knows_class[]

503.  /* Know ordinary (non-magical) objects of a certain class,
504.   * like all gems except the loadstone and luckstone.
505.   */
506.  STATIC_OVL void
507.  knows_class(sym)
508.  register char sym;
509.  {
510.  	register int ct;
511.  	for (ct = 1; ct < NUM_OBJECTS; ct++)
512.  		if (objects[ct].oc_class == sym && !objects[ct].oc_magic)
513.  			knows_object(ct);
514.  }
515.  

u_init[]

516.  void
517.  u_init()
518.  {
519.  	register int i;
520.  
521.  	flags.female = flags.initgend;
522.  	flags.beginner = 1;
523.  
524.  	/* zero u, including pointer values --
525.  	 * necessary when aborting from a failed restore */
526.  	(void) memset((genericptr_t)&u, 0, sizeof(u));
527.  	u.ustuck = (struct monst *)0;
528.  
529.  #if 0	/* documentation of more zero values as desirable */
530.  	u.usick_cause[0] = 0;
531.  	u.uluck  = u.moreluck = 0;
532.  # ifdef TOURIST
533.  	uarmu = 0;
534.  # endif
535.  	uarm = uarmc = uarmh = uarms = uarmg = uarmf = 0;
536.  	uwep = uball = uchain = uleft = uright = 0;
537.  	uswapwep = uquiver = 0;
538.  	u.twoweap = 0;
539.  	u.ublessed = 0;				/* not worthy yet */
540.  	u.ugangr   = 0;				/* gods not angry */
541.  	u.ugifts   = 0;				/* no divine gifts bestowed */
542.  # ifdef ELBERETH
543.  	u.uevent.uhand_of_elbereth = 0;
544.  # endif
545.  	u.uevent.uheard_tune = 0;
546.  	u.uevent.uopened_dbridge = 0;
547.  	u.uevent.udemigod = 0;		/* not a demi-god yet... */
548.  	u.udg_cnt = 0;
549.  	u.mh = u.mhmax = u.mtimedone = 0;
550.  	u.uz.dnum = u.uz0.dnum = 0;
551.  	u.utotype = 0;
552.  #endif	/* 0 */
553.  
554.  	u.uz.dlevel = 1;
555.  	u.uz0.dlevel = 0;
556.  	u.utolev = u.uz;
557.  
558.  	u.umoved = FALSE;
559.  	u.umortality = 0;
560.  	u.ugrave_arise = NON_PM;
561.  
562.  	u.umonnum = u.umonster = (flags.female &&
563.  			urole.femalenum != NON_PM) ? urole.femalenum :
564.  			urole.malenum;
565.  	set_uasmon();
566.  
567.  	u.ulevel = 0;	/* set up some of the initial attributes */
568.  	u.uhp = u.uhpmax = newhp();
569.  	u.uenmax = urole.enadv.infix + urace.enadv.infix;
570.  	if (urole.enadv.inrnd > 0)
571.  	    u.uenmax += rnd(urole.enadv.inrnd);
572.  	if (urace.enadv.inrnd > 0)
573.  	    u.uenmax += rnd(urace.enadv.inrnd);
574.  	u.uen = u.uenmax;
575.  	u.uspellprot = 0;
576.  	adjabil(0,1);
577.  	u.ulevel = u.ulevelmax = 1;
578.  
579.  	init_uhunger();
580.  	for (i = 0; i <= MAXSPELL; i++) spl_book[i].sp_id = NO_SPELL;
581.  	u.ublesscnt = 300;			/* no prayers just yet */
582.  	u.ualignbase[A_CURRENT] = u.ualignbase[A_ORIGINAL] = u.ualign.type =
583.  			aligns[flags.initalign].value;
584.  	u.ulycn = NON_PM;
585.  
586.  #if defined(BSD) && !defined(POSIX_TYPES)
587.  	(void) time((long *)&u.ubirthday);
588.  #else
589.  	(void) time(&u.ubirthday);
590.  #endif
591.  
592.  	/*
593.  	 *  For now, everyone starts out with a night vision range of 1 and
594.  	 *  their xray range disabled.
595.  	 */
596.  	u.nv_range   =  1;
597.  	u.xray_range = -1;
598.  
599.  

Role-specific initializations[]

600.  	/*** Role-specific initializations ***/
601.  	switch (Role_switch) {
602.  	/* rn2(100) > 50 necessary for some choices because some
603.  	 * random number generators are bad enough to seriously
604.  	 * skew the results if we use rn2(2)...  --KAA
605.  	 */

Archeologist initializations[]

606.  	case PM_ARCHEOLOGIST:
607.  		ini_inv(Archeologist);
608.  		if(!rn2(10)) ini_inv(Tinopener);
609.  		else if(!rn2(4)) ini_inv(Lamp);
610.  		else if(!rn2(10)) ini_inv(Magicmarker);
611.  		knows_object(SACK);
612.  		knows_object(TOUCHSTONE);
613.  		skill_init(Skill_A);
614.  		break;

Barbarian initializations[]

615.  	case PM_BARBARIAN:
616.  		if (rn2(100) >= 50) {	/* see above comment */
617.  		    Barbarian[B_MAJOR].trotyp = BATTLE_AXE;
618.  		    Barbarian[B_MINOR].trotyp = SHORT_SWORD;
619.  		}
620.  		ini_inv(Barbarian);
621.  		if(!rn2(6)) ini_inv(Lamp);
622.  		knows_class(WEAPON_CLASS);
623.  		knows_class(ARMOR_CLASS);
624.  		skill_init(Skill_B);
625.  		break;

Caveman initializations[]

626.  	case PM_CAVEMAN:
627.  		Cave_man[C_AMMO].trquan = rn1(11, 10);	/* 10..20 */
628.  		ini_inv(Cave_man);
629.  		skill_init(Skill_C);
630.  		break;

Healer initializations[]

631.  	case PM_HEALER:
632.  #ifndef GOLDOBJ
633.  		u.ugold = u.ugold0 = rn1(1000, 1001);
634.  #else
635.  		u.umoney0 = rn1(1000, 1001);
636.  #endif
637.  		ini_inv(Healer);
638.  		if(!rn2(25)) ini_inv(Lamp);
639.  		knows_object(POT_FULL_HEALING);
640.  		skill_init(Skill_H);
641.  		break;

Knight initializations[]

642.  	case PM_KNIGHT:
643.  		ini_inv(Knight);
644.  		knows_class(WEAPON_CLASS);
645.  		knows_class(ARMOR_CLASS);
646.  		/* give knights chess-like mobility
647.  		 * -- idea from wooledge@skybridge.scl.cwru.edu */
648.  		HJumping |= FROMOUTSIDE;
649.  		skill_init(Skill_K);
650.  		break;

Monk initializations[]

651.  	case PM_MONK:
652.  		switch (rn2(90) / 30) {
653.  		case 0: Monk[M_BOOK].trotyp = SPE_HEALING; break;
654.  		case 1: Monk[M_BOOK].trotyp = SPE_PROTECTION; break;
655.  		case 2: Monk[M_BOOK].trotyp = SPE_SLEEP; break;
656.  		}
657.  		ini_inv(Monk);
658.  		if(!rn2(5)) ini_inv(Magicmarker);
659.  		else if(!rn2(10)) ini_inv(Lamp);
660.  		knows_class(ARMOR_CLASS);
661.  		skill_init(Skill_Mon);
662.  		break;

Priest initializations[]

663.  	case PM_PRIEST:
664.  		ini_inv(Priest);
665.  		if(!rn2(10)) ini_inv(Magicmarker);
666.  		else if(!rn2(10)) ini_inv(Lamp);
667.  		knows_object(POT_WATER);
668.  		skill_init(Skill_P);
669.  		/* KMH, conduct --
670.  		 * Some may claim that this isn't agnostic, since they
671.  		 * are literally "priests" and they have holy water.
672.  		 * But we don't count it as such.  Purists can always
673.  		 * avoid playing priests and/or confirm another player's
674.  		 * role in their YAAP.
675.  		 */
676.  		break;

Ranger initializations[]

677.  	case PM_RANGER:
678.  		Ranger[RAN_TWO_ARROWS].trquan = rn1(10, 50);
679.  		Ranger[RAN_ZERO_ARROWS].trquan = rn1(10, 30);
680.  		ini_inv(Ranger);
681.  		skill_init(Skill_Ran);
682.  		break;

Rogue initializations[]

683.  	case PM_ROGUE:
684.  		Rogue[R_DAGGERS].trquan = rn1(10, 6);
685.  #ifndef GOLDOBJ
686.  		u.ugold = u.ugold0 = 0;
687.  #else
688.  		u.umoney0 = 0;
689.  #endif
690.  		ini_inv(Rogue);
691.  		if(!rn2(5)) ini_inv(Blindfold);
692.  		knows_object(SACK);
693.  		skill_init(Skill_R);
694.  		break;

Samurai initializations[]

695.  	case PM_SAMURAI:
696.  		Samurai[S_ARROWS].trquan = rn1(20, 26);
697.  		ini_inv(Samurai);
698.  		if(!rn2(5)) ini_inv(Blindfold);
699.  		knows_class(WEAPON_CLASS);
700.  		knows_class(ARMOR_CLASS);
701.  		skill_init(Skill_S);
702.  		break;

Tourist initializations[]

703.  #ifdef TOURIST
704.  	case PM_TOURIST:
705.  		Tourist[T_DARTS].trquan = rn1(20, 21);
706.  #ifndef GOLDOBJ
707.  		u.ugold = u.ugold0 = rnd(1000);
708.  #else
709.  		u.umoney0 = rnd(1000);
710.  #endif
711.  		ini_inv(Tourist);
712.  		if(!rn2(25)) ini_inv(Tinopener);
713.  		else if(!rn2(25)) ini_inv(Leash);
714.  		else if(!rn2(25)) ini_inv(Towel);
715.  		else if(!rn2(25)) ini_inv(Magicmarker);
716.  		skill_init(Skill_T);
717.  		break;
718.  #endif

Valkyrie initializations[]

719.  	case PM_VALKYRIE:
720.  		ini_inv(Valkyrie);
721.  		if(!rn2(6)) ini_inv(Lamp);
722.  		knows_class(WEAPON_CLASS);
723.  		knows_class(ARMOR_CLASS);
724.  		skill_init(Skill_V);
725.  		break;

Wizard initializations[]

726.  	case PM_WIZARD:
727.  		ini_inv(Wizard);
728.  		if(!rn2(5)) ini_inv(Magicmarker);
729.  		if(!rn2(5)) ini_inv(Blindfold);
730.  		skill_init(Skill_W);
731.  		break;
732.  
733.  	default:	/* impossible */
734.  		break;
735.  	}
736.  
737.  

Race-specific initializations[]

738.  	/*** Race-specific initializations ***/
739.  	switch (Race_switch) {

Human initializations[]

740.  	case PM_HUMAN:
741.  	    /* Nothing special */
742.  	    break;
743.  

Elf initializations[]

744.  	case PM_ELF:
745.  	    /*
746.  	     * Elves are people of music and song, or they are warriors.
747.  	     * Non-warriors get an instrument.  We use a kludge to
748.  	     * get only non-magic instruments.
749.  	     */
750.  	    if (Role_if(PM_PRIEST) || Role_if(PM_WIZARD)) {
751.  		static int trotyp[] = {
752.  		    WOODEN_FLUTE, TOOLED_HORN, WOODEN_HARP,
753.  		    BELL, BUGLE, LEATHER_DRUM
754.  		};
755.  		Instrument[0].trotyp = trotyp[rn2(SIZE(trotyp))];
756.  		ini_inv(Instrument);
757.  	    }
758.  
759.  	    /* Elves can recognize all elvish objects */
760.  	    knows_object(ELVEN_SHORT_SWORD);
761.  	    knows_object(ELVEN_ARROW);
762.  	    knows_object(ELVEN_BOW);
763.  	    knows_object(ELVEN_SPEAR);
764.  	    knows_object(ELVEN_DAGGER);
765.  	    knows_object(ELVEN_BROADSWORD);
766.  	    knows_object(ELVEN_MITHRIL_COAT);
767.  	    knows_object(ELVEN_LEATHER_HELM);
768.  	    knows_object(ELVEN_SHIELD);
769.  	    knows_object(ELVEN_BOOTS);
770.  	    knows_object(ELVEN_CLOAK);
771.  	    break;
772.  

Dwarf initializations[]

773.  	case PM_DWARF:
774.  	    /* Dwarves can recognize all dwarvish objects */
775.  	    knows_object(DWARVISH_SPEAR);
776.  	    knows_object(DWARVISH_SHORT_SWORD);
777.  	    knows_object(DWARVISH_MATTOCK);
778.  	    knows_object(DWARVISH_IRON_HELM);
779.  	    knows_object(DWARVISH_MITHRIL_COAT);
780.  	    knows_object(DWARVISH_CLOAK);
781.  	    knows_object(DWARVISH_ROUNDSHIELD);
782.  	    break;
783.  

Gnome initializations[]

784.  	case PM_GNOME:
785.  	    break;
786.  

Orc initializations[]

787.  	case PM_ORC:
788.  	    /* compensate for generally inferior equipment */
789.  	    if (!Role_if(PM_WIZARD))
790.  		ini_inv(Xtra_food);
791.  	    /* Orcs can recognize all orcish objects */
792.  	    knows_object(ORCISH_SHORT_SWORD);
793.  	    knows_object(ORCISH_ARROW);
794.  	    knows_object(ORCISH_BOW);
795.  	    knows_object(ORCISH_SPEAR);
796.  	    knows_object(ORCISH_DAGGER);
797.  	    knows_object(ORCISH_CHAIN_MAIL);
798.  	    knows_object(ORCISH_RING_MAIL);
799.  	    knows_object(ORCISH_HELM);
800.  	    knows_object(ORCISH_SHIELD);
801.  	    knows_object(URUK_HAI_SHIELD);
802.  	    knows_object(ORCISH_CLOAK);
803.  	    break;
804.  
805.  	default:	/* impossible */
806.  		break;
807.  	}
808.  
809.  	if (discover)
810.  		ini_inv(Wishing);
811.  
812.  #ifdef WIZARD
813.  	if (wizard)
814.  		read_wizkit();
815.  #endif
816.  
817.  #ifndef GOLDOBJ
818.  	u.ugold0 += hidden_gold();	/* in case sack has gold in it */
819.  #else
820.  	if (u.umoney0) ini_inv(Money);
821.  	u.umoney0 += hidden_gold();	/* in case sack has gold in it */
822.  #endif
823.  
824.  	find_ac();			/* get initial ac value */
825.  	init_attr(75);			/* init attribute values */
826.  	max_rank_sz();			/* set max str size for class ranks */
827.  /*
828.   *	Do we really need this?
829.   */
830.  	for(i = 0; i < A_MAX; i++)
831.  	    if(!rn2(20)) {
832.  		register int xd = rn2(7) - 2;	/* biased variation */
833.  		(void) adjattrib(i, xd, TRUE);
834.  		if (ABASE(i) < AMAX(i)) AMAX(i) = ABASE(i);
835.  	    }
836.  
837.  	/* make sure you can carry all you have - especially for Tourists */
838.  	while (inv_weight() > 0) {
839.  		if (adjattrib(A_STR, 1, TRUE)) continue;
840.  		if (adjattrib(A_CON, 1, TRUE)) continue;
841.  		/* only get here when didn't boost strength or constitution */
842.  		break;
843.  	}
844.  
845.  	return;
846.  }
847.  

restricted_spell_discipline[]

848.  /* skills aren't initialized, so we use the role-specific skill lists */
849.  STATIC_OVL boolean
850.  restricted_spell_discipline(otyp)
851.  int otyp;
852.  {
853.      const struct def_skill *skills;
854.      int this_skill = spell_skilltype(otyp);
855.  
856.      switch (Role_switch) {
857.       case PM_ARCHEOLOGIST:	skills = Skill_A; break;
858.       case PM_BARBARIAN:		skills = Skill_B; break;
859.       case PM_CAVEMAN:		skills = Skill_C; break;
860.       case PM_HEALER:		skills = Skill_H; break;
861.       case PM_KNIGHT:		skills = Skill_K; break;
862.       case PM_MONK:		skills = Skill_Mon; break;
863.       case PM_PRIEST:		skills = Skill_P; break;
864.       case PM_RANGER:		skills = Skill_Ran; break;
865.       case PM_ROGUE:		skills = Skill_R; break;
866.       case PM_SAMURAI:		skills = Skill_S; break;
867.  #ifdef TOURIST
868.       case PM_TOURIST:		skills = Skill_T; break;
869.  #endif
870.       case PM_VALKYRIE:		skills = Skill_V; break;
871.       case PM_WIZARD:		skills = Skill_W; break;
872.       default:			skills = 0; break;	/* lint suppression */
873.      }
874.  
875.      while (skills->skill != P_NONE) {
876.  	if (skills->skill == this_skill) return FALSE;
877.  	++skills;
878.      }
879.      return TRUE;
880.  }
881.  

ini_inv[]

882.  STATIC_OVL void
883.  ini_inv(trop)
884.  register struct trobj *trop;
885.  {
886.  	struct obj *obj;
887.  	int otyp, i;
888.  
889.  	while (trop->trclass) {
890.  		if (trop->trotyp != UNDEF_TYP) {
891.  			otyp = (int)trop->trotyp;
892.  			if (urace.malenum != PM_HUMAN) {
893.  			    /* substitute specific items for generic ones */
894.  			    for (i = 0; inv_subs[i].race_pm != NON_PM; ++i)
895.  				if (inv_subs[i].race_pm == urace.malenum &&
896.  					otyp == inv_subs[i].item_otyp) {
897.  				    otyp = inv_subs[i].subs_otyp;
898.  				    break;
899.  				}
900.  			}
901.  			obj = mksobj(otyp, TRUE, FALSE);
902.  		} else {	/* UNDEF_TYP */
903.  			static NEARDATA short nocreate = STRANGE_OBJECT;
904.  			static NEARDATA short nocreate2 = STRANGE_OBJECT;
905.  			static NEARDATA short nocreate3 = STRANGE_OBJECT;
906.  			static NEARDATA short nocreate4 = STRANGE_OBJECT;
907.  		/*
908.  		 * For random objects, do not create certain overly powerful
909.  		 * items: wand of wishing, ring of levitation, or the
910.  		 * polymorph/polymorph control combination.  Specific objects,
911.  		 * i.e. the discovery wishing, are still OK.
912.  		 * Also, don't get a couple of really useless items.  (Note:
913.  		 * punishment isn't "useless".  Some players who start out with
914.  		 * one will immediately read it and use the iron ball as a
915.  		 * weapon.)
916.  		 */
917.  			obj = mkobj(trop->trclass, FALSE);
918.  			otyp = obj->otyp;
919.  			while (otyp == WAN_WISHING
920.  				|| otyp == nocreate
921.  				|| otyp == nocreate2
922.  				|| otyp == nocreate3
923.  				|| otyp == nocreate4
924.  #ifdef ELBERETH
925.  				|| otyp == RIN_LEVITATION
926.  #endif
927.  				/* 'useless' items */
928.  				|| otyp == POT_HALLUCINATION
929.  				|| otyp == POT_ACID
930.  				|| otyp == SCR_AMNESIA
931.  				|| otyp == SCR_FIRE
932.  				|| otyp == SCR_BLANK_PAPER
933.  				|| otyp == SPE_BLANK_PAPER
934.  				|| otyp == RIN_AGGRAVATE_MONSTER
935.  				|| otyp == RIN_HUNGER
936.  				|| otyp == WAN_NOTHING
937.  				/* Monks don't use weapons */
938.  				|| (otyp == SCR_ENCHANT_WEAPON &&
939.  				    Role_if(PM_MONK))
940.  				/* wizard patch -- they already have one */
941.  				|| (otyp == SPE_FORCE_BOLT &&
942.  				    Role_if(PM_WIZARD))
943.  				/* powerful spells are either useless to
944.  				   low level players or unbalancing; also
945.  				   spells in restricted skill categories */
946.  				|| (obj->oclass == SPBOOK_CLASS &&
947.  				    (objects[otyp].oc_level > 3 ||
948.  				    restricted_spell_discipline(otyp)))
949.  							) {
950.  				dealloc_obj(obj);
951.  				obj = mkobj(trop->trclass, FALSE);
952.  				otyp = obj->otyp;
953.  			}
954.  
955.  			/* Don't start with +0 or negative rings */
956.  			if (objects[otyp].oc_charged && obj->spe <= 0)
957.  				obj->spe = rne(3);
958.  
959.  			/* Heavily relies on the fact that 1) we create wands
960.  			 * before rings, 2) that we create rings before
961.  			 * spellbooks, and that 3) not more than 1 object of a
962.  			 * particular symbol is to be prohibited.  (For more
963.  			 * objects, we need more nocreate variables...)
964.  			 */
965.  			switch (otyp) {
966.  			    case WAN_POLYMORPH:
967.  			    case RIN_POLYMORPH:
968.  			    case POT_POLYMORPH:
969.  				nocreate = RIN_POLYMORPH_CONTROL;
970.  				break;
971.  			    case RIN_POLYMORPH_CONTROL:
972.  				nocreate = RIN_POLYMORPH;
973.  				nocreate2 = SPE_POLYMORPH;
974.  				nocreate3 = POT_POLYMORPH;
975.  			}
976.  			/* Don't have 2 of the same ring or spellbook */
977.  			if (obj->oclass == RING_CLASS ||
978.  			    obj->oclass == SPBOOK_CLASS)
979.  				nocreate4 = otyp;
980.  		}
981.  
982.  #ifdef GOLDOBJ
983.  		if (trop->trclass == COIN_CLASS) {
984.  			/* no "blessed" or "identified" money */
985.  			obj->quan = u.umoney0;
986.  		} else {
987.  #endif
988.  			obj->dknown = obj->bknown = obj->rknown = 1;
989.  			if (objects[otyp].oc_uses_known) obj->known = 1;
990.  			obj->cursed = 0;
991.  			if (obj->opoisoned && u.ualign.type != A_CHAOTIC)
992.  			    obj->opoisoned = 0;
993.  			if (obj->oclass == WEAPON_CLASS ||
994.  				obj->oclass == TOOL_CLASS) {
995.  			    obj->quan = (long) trop->trquan;
996.  			    trop->trquan = 1;
997.  			} else if (obj->oclass == GEM_CLASS &&
998.  				is_graystone(obj) && obj->otyp != FLINT) {
999.  			    obj->quan = 1L;
1000. 			}
1001. 			if (trop->trspe != UNDEF_SPE)
1002. 			    obj->spe = trop->trspe;
1003. 			if (trop->trbless != UNDEF_BLESS)
1004. 			    obj->blessed = trop->trbless;
1005. #ifdef GOLDOBJ
1006. 		}
1007. #endif
1008. 		/* defined after setting otyp+quan + blessedness */
1009. 		obj->owt = weight(obj);
1010. 		obj = addinv(obj);
1011. 
1012. 		/* Make the type known if necessary */
1013. 		if (OBJ_DESCR(objects[otyp]) && obj->known)
1014. 			discover_object(otyp, TRUE, FALSE);
1015. 		if (otyp == OIL_LAMP)
1016. 			discover_object(POT_OIL, TRUE, FALSE);
1017. 
1018. 		if(obj->oclass == ARMOR_CLASS){
1019. 			if (is_shield(obj) && !uarms) {
1020. 				setworn(obj, W_ARMS);
1021. 				if (uswapwep) setuswapwep((struct obj *) 0);
1022. 			} else if (is_helmet(obj) && !uarmh)
1023. 				setworn(obj, W_ARMH);
1024. 			else if (is_gloves(obj) && !uarmg)
1025. 				setworn(obj, W_ARMG);
1026. #ifdef TOURIST
1027. 			else if (is_shirt(obj) && !uarmu)
1028. 				setworn(obj, W_ARMU);
1029. #endif
1030. 			else if (is_cloak(obj) && !uarmc)
1031. 				setworn(obj, W_ARMC);
1032. 			else if (is_boots(obj) && !uarmf)
1033. 				setworn(obj, W_ARMF);
1034. 			else if (is_suit(obj) && !uarm)
1035. 				setworn(obj, W_ARM);
1036. 		}
1037. 
1038. 		if (obj->oclass == WEAPON_CLASS || is_weptool(obj) ||
1039. 			otyp == TIN_OPENER || otyp == FLINT || otyp == ROCK) {
1040. 		    if (is_ammo(obj) || is_missile(obj)) {
1041. 			if (!uquiver) setuqwep(obj);
1042. 		    } else if (!uwep) setuwep(obj);
1043. 		    else if (!uswapwep) setuswapwep(obj);
1044. 		}
1045. 		if (obj->oclass == SPBOOK_CLASS &&
1046. 				obj->otyp != SPE_BLANK_PAPER)
1047. 		    initialspell(obj);
1048. 
1049. #if !defined(PYRAMID_BUG) && !defined(MAC)
1050. 		if(--trop->trquan) continue;	/* make a similar object */
1051. #else
1052. 		if(trop->trquan) {		/* check if zero first */
1053. 			--trop->trquan;
1054. 			if(trop->trquan)
1055. 				continue;	/* make a similar object */
1056. 		}
1057. #endif
1058. 		trop++;
1059. 	}
1060. }
1061. 
1062. /*u_init.c*/
Advertisement