comparison urogue/init.c @ 256:c495a4f288c6

Import UltraRogue from the Roguelike Restoration Project (r1490)
author John "Elwin" Edwards
date Tue, 31 Jan 2017 19:56:04 -0500
parents
children
comparison
equal deleted inserted replaced
253:d9badb9c0179 256:c495a4f288c6
1 /*
2 init.c - global variable initializaton
3
4 UltraRogue: The Ultimate Adventure in the Dungeons of Doom
5 Copyright (C) 1985, 1986, 1992, 1993, 1995 Herb Chong
6 All rights reserved.
7
8 Based on "Advanced Rogue"
9 Copyright (C) 1984, 1985 Michael Morgan, Ken Dalka
10 All rights reserved.
11
12 Based on "Rogue: Exploring the Dungeons of Doom"
13 Copyright (C) 1980, 1981 Michael Toy, Ken Arnold and Glenn Wichman
14 All rights reserved.
15
16 See the file LICENSE.TXT for full copyright and licensing information.
17 */
18
19 /*
20 Notes
21
22 Need to add ring of maintain armor (same as ring of prot, armor only)
23 Resplit file into one just for data, one just for functions
24 */
25
26 #define _ALL_SOURCE /* Need to remove need for this AIXism */
27
28 #include <string.h>
29 #include <stdlib.h>
30 #include <ctype.h>
31 #include "rogue.h"
32
33 static char *rainbow[] =
34 {
35 "Red", "Blue", "Green", "Yellow",
36 "Black", "Brown", "Orange", "Pink",
37 "Purple", "Grey", "White", "Silver",
38 "Gold", "Violet", "Clear", "Vermilion",
39 "Ecru", "Turquoise", "Magenta", "Amber",
40 "Topaz", "Plaid", "Tan", "Tangerine",
41 "Aquamarine", "Scarlet", "Khaki", "Crimson",
42 "Indigo", "Beige", "Lavender", "Saffron"
43 };
44
45 #define NCOLORS (sizeof rainbow / sizeof (char *))
46
47 static char *sylls[] =
48 {
49 "a", "ab", "ag", "aks", "ala", "an", "ankh", "app", "arg", "arze",
50 "ash", "ban", "bar", "bat", "bek", "bie", "bin", "bit", "bjor",
51 "blu", "bot", "bu", "byt", "comp", "con", "cos", "cre", "dalf",
52 "dan", "den", "do", "e", "eep", "el", "eng", "er", "ere", "erk",
53 "esh", "evs", "fa", "fid", "for", "fri", "fu", "gan", "gar",
54 "glen", "gop", "gre", "ha", "he", "hyd", "i", "ing", "ion", "ip",
55 "ish", "it", "ite", "iv", "jo", "kho", "kli", "klis", "la", "lech",
56 "man", "mar", "me", "mi", "mic", "mik", "mon", "mung", "mur",
57 "nej", "nelg", "nep", "ner", "nes", "nes", "nih", "nin", "o", "od",
58 "ood", "org", "orn", "ox", "oxy", "pay", "pet", "ple", "plu", "po",
59 "pot", "prok", "re", "rea", "rhov", "ri", "ro", "rog", "rok", "rol",
60 "sa", "san", "sat", "see", "sef", "seh", "shu", "ski", "sna",
61 "sne", "snik", "sno", "so", "sol", "sri", "sta", "sun", "ta",
62 "tab", "tem", "ther", "ti", "tox", "trol", "tue", "turs", "u",
63 "ulk", "um", "un", "uni", "ur", "val", "viv", "vly", "vom", "wah",
64 "wed", "werg", "wex", "whon", "wun", "xo", "y", "yot", "yu",
65 "zant", "zap", "zeb", "zim", "zok", "zon", "zum"
66 };
67
68 static char *stones[] =
69 {
70 "Agate", "Alexandrite", "Amethyst",
71 "Azurite", "Carnelian", "Chrysoberyl",
72 "Chrysoprase", "Citrine", "Diamond",
73 "Emerald", "Garnet", "Hematite",
74 "Jacinth", "Jade", "Kryptonite",
75 "Lapus lazuli", "Malachite", "Moonstone",
76 "Obsidian", "Olivine", "Onyx",
77 "Opal", "Pearl", "Peridot",
78 "Quartz", "Rhodochrosite", "Ruby",
79 "Sapphire", "Sardonyx", "Serpentine",
80 "Spinel", "Tiger eye", "Topaz",
81 "Tourmaline", "Turquoise"
82 };
83
84 #define NSTONES (sizeof stones / sizeof (char *))
85
86 static char *wood[] =
87 {
88 "Avocado wood", "Balsa", "Banyan", "Birch",
89 "Cedar", "Cherry", "Cinnibar", "Dogwood",
90 "Driftwood", "Ebony", "Eucalyptus", "Hemlock",
91 "Ironwood", "Mahogany", "Manzanita", "Maple",
92 "Oak", "Pine", "Redwood", "Rosewood",
93 "Teak", "Walnut", "Zebra wood", "Persimmon wood"
94 };
95
96 #define NWOOD (sizeof wood / sizeof (char *))
97
98 static char *metal[] =
99 {
100 "Aluminium", "Bone", "Brass", "Bronze",
101 "Copper", "Chromium", "Iron", "Lead",
102 "Magnesium", "Pewter", "Platinum", "Steel",
103 "Tin", "Titanium", "Zinc", "Carbon",
104 "Plastic", "Glass", "Ice", "Chocolate",
105 "Gold", "Silver", "Invisible"
106 };
107
108 #define NMETAL (sizeof metal / sizeof (char *))
109
110 const char *monstern = "monster";
111 char *spacemsg = "--Press SPACE to continue--";
112 char *morestr = "--More--";
113 char *retstr = "[Press RETURN to continue]";
114
115 /* 15 named levels */
116
117 const char *cnames[C_NOTSET][15] =
118 {
119 { "Veteran", "Warrior",
120 "Swordsman", "Hero", /* Fighter */
121 "Swashbuckler", "Myrmidon",
122 "Champion", "Superhero",
123 "Lord", "Lord",
124 "Lord", "Lord",
125 "Lord", "Lord",
126 "Lord"
127 },
128
129 { "Gallant", "Keeper",
130 "Protector", "Defender", /* Paladin */
131 "Warder", "Guardian",
132 "Chevalier", "Justiciar",
133 "Paladin", "Paladin",
134 "Paladin", "Paladin",
135 "Paladin", "Paladin",
136 "Paladin"
137 },
138
139 { "Runner", "Strider",
140 "Scout", "Courser", /* Ranger */
141 "Tracker", "Guide",
142 "Pathfinder", "Ranger",
143 "Ranger Knight", "Ranger Lord",
144 "Ranger Lord", "Ranger Lord",
145 "Ranger Lord", "Ranger Lord",
146 "Ranger Lord"
147 },
148
149 { "Acolyte", "Adept",
150 "Priest", "Curate", /* Cleric */
151 "Prefect", "Canon",
152 "Lama", "Patriarch",
153 "High Priest", "High Priest",
154 "High Priest", "High Priest",
155 "High Priest", "High Priest",
156 "High Priest"
157 },
158
159 { "Aspirant", "Ovate", /* Druid */
160 "Initiate of the 1st Circle", "Initiate of the 2nd Circle",
161 "Initiate of the 3rd Circle", "Initiate of the 4th Circle",
162 "Initiate of the 5th Circle", "Initiate of the 6th Circle",
163 "Initiate of the 7th Circle", "Initiate of the 8th Circle",
164 "Initiate of the 9th Circle", "Druid",
165 "Archdruid", "The Great Druid",
166 "The Grand Druid"
167 },
168
169 { "Prestidigitator", "Evoker",
170 "Conjurer", "Theurgist", /* Magic User */
171 "Thaumaturgist", "Magician",
172 "Enchanter", "Warlock",
173 "Sorcerer", "Necromancer",
174 "Wizard", "Wizard",
175 "Wizard", "Wizard",
176 "Wizard"
177 },
178
179 { "Prestidigitator", "Minor Trickster",
180 "Trickster", "Master Trickster", /* Illusionist */
181 "Cabalist", "Visionist",
182 "Phantasmist", "Apparitionist",
183 "Spellbinder", "Illusionist",
184 "Illusionist", "Illusionist",
185 "Illusionist", "Illusionist",
186 "Illusionist"
187 },
188
189 { "Rogue", "Footpad",
190 "Cutpurse", "Robber", /* Thief */
191 "Burglar", "Filcher",
192 "Sharper", "Magsman",
193 "Thief", "Master Thief",
194 "Master Thief", "Master Thief",
195 "Master Thief", "Master Thief",
196 "Master Thief"
197 },
198
199 { "Bravo", "Rutterkin",
200 "Waghalter", "Murderer", /* Assasin */
201 "Thug", "Killer",
202 "Cutthroat", "Executioner",
203 "Assassin", "Expert Assassin",
204 "Senior Assassin", "Chief Assassin",
205 "Prime Assassin", "Guildmaster Assassin",
206 "Grandfather of Assassins"
207 },
208
209 { "Ninja", "Ninja",
210 "Ninja", "Ninja", /* Ninja */
211 "Ninja", "Ninja",
212 "Ninja", "Ninja",
213 "Ninja", "Ninja",
214 "Ninja", "Ninja",
215 "Ninja", "Ninja",
216 "Ninja"
217 }
218 };
219
220 const struct h_list helpstr[] =
221 {
222 { '?', " prints help" },
223 { '/', " identify object" },
224 { 'h', " left" },
225 { 'j', " down" },
226 { 'k', " up" },
227 { 'l', " right" },
228 { 'y', " up & left" },
229 { 'u', " up & right" },
230 { 'b', " down & left" },
231 { 'n', " down & right" },
232 { '<', "SHIFT><dir> run that way" },
233 { 'm', "<dir> move onto without picking up" },
234 { 't', "<dir> throw something" },
235 { 'z', "<dir> zap a wand or staff" },
236 { '>', " go down a staircase" },
237 { 's', " search for trap/secret door" },
238 { '.', " rest for a while" },
239 { ',', " pick up an object" },
240 { 'i', " inventory all items" },
241 { 'I', " inventory type of item" },
242 { 'q', " quaff potion" },
243 { 'r', " read paper" },
244 { 'e', " eat food" },
245 { 'w', " wield a weapon" },
246 { 'W', " wear armor" },
247 { 'T', " take armor off" },
248 { 'P', " put on ring" },
249 { 'R', " remove ring" },
250 { 'A', " activate/apply an artifact" },
251 { 'd', " drop object" },
252 { 'C', " call object (generic)" },
253 { 'M', " mark object (specific)" },
254 { 'o', " examine/set options" },
255 { 'c', " cast a spell/say a prayer" },
256 { 'p', " pray for help (risky)" },
257 { 'a', " affect the undead" },
258 { '^', " set a trap" },
259 { 'D', " dip something (into a pool)" },
260 { 20, "<dir> take (steal) from (direction)" }, /* ctrl-t */
261 { 18, " redraw screen" }, /* ctrl-r */
262 { 16, " back up to 10 previous messages" }, /* ctrl-p */
263 { ESCAPE, " cancel command" },
264 { 'v', " print program version number" },
265 { 'S', " save game" },
266 { 'Q', " quit" },
267 { '=', " listen for monsters" },
268 { 'f', "<dir> fight monster" },
269 { 'F', "<dir> fight monster to the death" },
270
271 /* Wizard commands. Identified by (h_ch != 0 && h_desc == 0). */
272
273 {'-', 0 },
274 { 23, " enter wizard mode" }, /* ctrl-w */
275 { 23, "v toggle wizard verbose mode" },
276 { 23, "e exit wizard mode" },
277 { 23, "r random number check" },
278 { 23, "s system statistics" },
279 { 23, "F food statistics" },
280 { 23, "f floor map" },
281 { 23, "m see monster" },
282 { 23, "M create monster" },
283 { 23, "c create item" },
284 { 23, "i inventory level" },
285 { 23, "I identify item" },
286 { 23, "t random teleport" },
287 { 23, "g goto level" },
288 { 23, "C charge item" },
289 { 23, "w print worth of object" },
290 { 23, "o improve stats and pack" },
291 { 0, 0 }
292 };
293
294 struct magic_item things[] =
295 {
296 {"potion", "POTION", 250, 5}, /* potion */
297 {"scroll", "SCROLL", 260, 30},/* scroll */
298 {"ring", "RING", 70, 5}, /* ring */
299 {"stick", "STICK", 60, 0}, /* stick */
300 {"food", "FOOD", 210, 7}, /* food */
301 {"weapon", "WEAPON", 60, 0}, /* weapon */
302 {"armor", "ARMOR", 90, 0}, /* armor */
303 {"artifact","ARTIFACT", 0, 0} /* special artifacts*/
304 };
305
306 int numthings = NUMTHINGS;
307
308 struct magic_item s_magic[] =
309 {
310 {"monster confusion", "CON", 50, 125, 0, 0 },
311 {"magic mapping", "MAP", 45, 150, 20, 10 },
312 {"light", "WATT", 0, 0, 0, 0 },
313 {"hold monster", "HOLD", 25, 200, 33, 10 },
314 {"sleep", "SNOOZE", 23, 50, 20, 10 },
315 {"enchantment", "ENCHANT", 110,400, 15, 10 },
316 {"identify", "ID", 150,50, 0, 15 },
317 {"scare monster", "SCARE", 35, 250, 27, 21 },
318 {"detect gold", "GOLD", 0, 0, 0, 0 },
319 {"teleportation", "TELEP", 50, 165, 10, 20 },
320 {"create monster", "CREATE", 25, 75, 30, 0 },
321 {"remove curse", "REM", 75, 220, 10, 15 },
322 {"petrification", "PET", 25, 285, 0, 0 },
323 {"genocide", "GEN", 10, 1200, 0, 0 },
324 {"cure disease", "CURE", 70, 80, 0, 0 },
325 {"acquirement", "MAKE", 5, 2500, 50, 15 },
326 {"protection", "PROT", 50, 1150, 0, 0 },
327 {"nothing", "NOTHING", 75, 50, 50, 50 },
328 {"magic hitting", "SILVER", 25, 1875, 45, 10 },
329 {"ownership", "OWN", 15, 1550, 45, 10 },
330 {"detect food", "FOOD", 0, 0, 0, 0 },
331 {"electrification", "ELECTRIFY",20, 1450, 0, 0 },
332 {"charm monster", "CHARM", 26, 1500, 25, 15 },
333 {"summon monster", "SUMMON", 26, 1500, 25, 15 },
334 {"gaze reflection", "REFLECT", 25, 400, 25, 15 },
335 {"summon familiar", "SUMFAM", 0, 0, 0, 0 },
336 {"fear", "FEAR", 20, 200, 20, 10 },
337 {"missile protection", "MSHIELD", 20, 300, 20, 10 }
338 };
339
340 int maxscrolls = MAXSCROLLS;
341
342 struct magic_item p_magic[] =
343 {
344 {"clear thought", "CLEAR", 90, 380, 27, 15 },
345 {"gain ability", "GAINABIL", 40, 1250, 15, 15 },
346 {"see invisible", "SEE", 0, 0, 0, 0 },
347 {"healing", "HEAL", 120,330, 27, 27 },
348 {"detect monster", "MON", 0, 0, 0, 0 },
349 {"detect magic", "MAG", 0, 0, 0, 0 },
350 {"raise level", "RAISE", 1, 1900, 11, 10 },
351 {"haste self", "HASTE", 140,300, 30, 5 },
352 {"restore abilities", "RESTORE", 130,120, 0, 0 },
353 {"phasing", "PHASE", 45, 340, 21, 20 },
354 {"invisibility", "INVIS", 30, 300, 0, 15 },
355 {"acute scent", "SMELL", 30, 100, 20, 15 },
356 {"acute hearing", "HEAR", 30, 100, 20, 15 },
357 {"super heroism", "SUPER", 10, 800, 20, 15 },
358 {"disguise", "DISGUISE", 30, 500, 0, 15 },
359 {"fire resistance", "NOFIRE", 40, 350, 20, 15 },
360 {"cold resistance", "NOCOLD", 40, 300, 20, 15 },
361 {"continuous breathing","BREATHE", 10, 200, 20, 15 },
362 {"flying", "FLY", 30, 300, 20, 15 },
363 {"regeneration", "REGEN", 20, 500, 20, 15 },
364 {"shield", "SHIELD", 100,200, 20, 10 },
365 {"true sight", "TRUESEE", 64, 570, 25, 15 }
366 };
367
368 int maxpotions = MAXPOTIONS;
369
370 struct magic_item r_magic[] =
371 {
372 {"protection", "", 70, 500, 33, 25 },
373 {"add strength", "", 65, 300, 33, 25 },
374 {"sustain ability", "", 40, 380, 10, 0 },
375 {"searching", "", 65, 250, 10, 0 },
376 {"see invisible", "", 30, 175, 10, 0 },
377 {"alertness", "", 40, 190, 10, 0 },
378 {"aggravate monster", "", 35, 100, 100,0 },
379 {"dexterity", "", 65, 220, 33, 25 },
380 {"increase damage", "", 65, 320, 33, 25 },
381 {"regeneration", "", 35, 860, 10, 0 },
382 {"slow digestion", "", 40, 340, 15, 10 },
383 {"teleportation", "", 35, 100, 100,0 },
384 {"stealth", "", 50, 700, 10, 0 },
385 {"add intelligence", "", 60, 540, 33, 25 },
386 {"increase wisdom", "", 60, 540, 33, 25 },
387 {"sustain health", "", 60, 250, 10, 0 },
388 {"vampiric regeneration", "", 20, 900, 25, 10 },
389 {"illumination", "", 20, 300, 10, 0 },
390 {"delusion", "", 20, 100, 75, 0 },
391 {"carrying", "", 20, 400, 30, 30 },
392 {"adornment", "", 15, 10000, 10, 0 },
393 {"levitation", "", 20, 450, 30, 0 },
394 {"fire resistance", "", 10, 750, 10, 0 },
395 {"cold resistance", "", 10, 650, 10, 0 },
396 {"lightning resistance", "", 10, 750, 10, 0 },
397 {"resurrection", "", 1, 8000, 10, 0 },
398 {"breathing", "", 10, 250, 10, 0 },
399 {"free action", "", 10, 225, 10, 0 },
400 {"wizardry", "", 2, 1950, 10, 0 },
401 {"piety", "", 2, 1950, 10, 0 },
402 {"teleport control", "", 5, 450, 10, 0 },
403 {"true sight", "", 10, 775, 10, 0 }
404 };
405
406 int maxrings = MAXRINGS;
407
408 struct magic_item ws_magic[] =
409 {
410 {"light", "LIGHT", 90, 150, 20, 20 },
411 {"striking", "HIT", 58, 400, 0, 0 },
412 {"lightning", "BOLT", 25, 800, 0, 0 },
413 {"fire", "FIRE", 25, 600, 0, 0 },
414 {"cold", "COLD", 30, 600, 0, 0 },
415 {"polymorph", "POLY", 90, 210, 0, 0 },
416 {"magic missile", "MLE", 90, 500, 0, 0 },
417 {"slow monster", "SLOW", 76, 320, 25, 20 },
418 {"drain life", "DRAIN", 90, 310, 20, 0 },
419 {"charging", "CHARGE", 70, 1100, 0, 0 },
420 {"teleport monster","RANDOM", 90, 240, 25, 20 },
421 {"cancellation", "CANCEL", 38, 230, 0, 0 },
422 {"confuse monster", "CONFMON", 50, 200, 0, 0 },
423 {"disintegration", "KILL-O-ZAP", 10, 1550, 33, 0 },
424 {"anti-matter", "BLACKHOLE", 30, 980, 0, 0 },
425 {"paralyze monster","PARAL", 38, 200, 0, 0 },
426 {"heal monster", "XENOHEAL", 30, 200, 40, 10 },
427 {"nothing", "NOTHING", 30, 100, 0, 0 },
428 {"invisibility", "WS_INVIS", 30, 150, 30, 5 },
429 {"blasting", "BLAST", 10, 220, 0, 0 },
430 {"webbing", "WEB", 0, 0, 0, 0 },
431 {"door opening", "KNOCK", 0, 0, 0, 0 },
432 {"hold portal", "CLOSE", 0, 0, 0, 0 }
433 };
434
435 int maxsticks = MAXSTICKS;
436
437 struct magic_item fd_data[] =
438 {
439 {"food ration", "RATION", 400, 20, 20, 20 },
440 {"random fruit","FRUIT", 300, 10, 0, 0},
441 {"cram", "CRAM", 120, 30, 0, 0 },
442 {"honey cake", "CAKES", 80, 10, 0, 0 },
443 {"lemba", "LEMBA", 50, 80, 0, 0 },
444 {"miruvor", "MIRUVOR", 50, 200, 0, 0 }
445 };
446
447 int maxfoods = MAXFOODS;
448
449 /*
450 * weapons and their attributes
451 * Average Damage = (min_damage + max_damage) / 2)
452 * AD of 2D5+3 = (5 + 13) / 2 = 9
453 * AD of 3D6 = (3 + 18) / 2 = 10.5
454 */
455
456 #define ISSHARPMETAL (ISSHARP | ISMETAL)
457 #define ISCRYSKNIFE (ISSHARP | ISPOISON | ISMANY | ISLITTLE)
458
459 struct init_weps weaps[] =
460 {
461 /* Missile weapons */
462 {"sling", "0d0", "0d0", NONE, 5, 1,
463 ISLAUNCHER | ISLITTLE, },
464 {"rock", "1d2", "1d4", SLING, 5, 1,
465 ISMANY | ISMISL | ISLITTLE },
466 {"sling bullet", "1d1", "1d8", SLING, 3, 1,
467 ISSHARP | ISMANY | ISMISL | ISMETAL | ISLITTLE },
468 {"short bow", "1d1", "1d1", NONE, 40, 75,
469 ISLAUNCHER },
470 {"arrow", "1d1", "2d3", BOW, 5, 1,
471 ISSHARP | ISMANY | ISMISL | ISLITTLE },
472 {"arrow", "1d2", "2d8", BOW, 10, 5,
473 ISSHARP | ISSILVER | ISMANY | ISMISL | ISLITTLE },
474 {"fire arrow", "1d2", "2d8", BOW, 10, 3,
475 ISSHARP | CANBURN | ISMANY | ISMISL | ISLITTLE },
476 {"footbow", "1d1", "1d1", NONE, 90, 125,
477 ISLAUNCHER },
478 {"footbow bolt", "1d2", "1d10", FOOTBOW, 5, 1,
479 ISSHARP | ISMANY | ISMISL | ISLITTLE },
480 {"crossbow", "1d1", "1d1", NONE, 100,175,
481 ISLAUNCHER },
482 {"crossbow bolt", "1d2", "2d5", CROSSBOW, 7, 3,
483 ISSHARP | ISMANY | ISMISL | ISLITTLE },
484
485 /* Useful throwing weapons */
486 {"dart", "1d1", "1d3", NONE, 5, 1,
487 ISSHARP | ISMANY | ISMISL | ISLITTLE },
488 {"dagger", "1d6", "1d4", NONE, 10, 2,
489 ISSHARP | ISMETAL | ISMANY | ISMISL | ISLITTLE },
490 {"hammer", "1d3", "1d5", NONE, 50, 3,
491 ISMETAL | ISMISL },
492 {"leuku", "1d6", "1d5", NONE, 40, 4,
493 ISSHARP | ISMETAL | ISTWOH },
494 {"javelin", "1d4", "1d6", NONE, 10, 5,
495 ISSHARP | ISMISL | ISTWOH },
496 {"tomahawk", "1d6", "1d6", NONE, 45, 7,
497 ISSHARP | ISMISL },
498 {"machete", "1d7", "1d6", NONE, 45, 4,
499 ISSHARP | ISMETAL | ISMISL },
500 {"throwing axe","1d3", "1d6+2", NONE, 50, 8,
501 ISSHARP | ISMETAL | ISMISL },
502 {"spear", "2d3", "1d6", NONE, 50, 2,
503 ISSHARP | ISMETAL | ISMISL },
504 {"boomerang", "1d1", "1d8", NONE, 10, 13,
505 CANRETURN | ISMANY | ISMISL | ISLITTLE },
506 {"long spear", "1d8", "1d10", NONE, 50, 20,
507 ISSHARP | ISMETAL | ISMISL | ISTWOH },
508 {"shuriken", "1d1", "2d5", NONE, 4, 20,
509 ISSHARP | ISMETAL | ISMANY | ISMISL | ISLITTLE },
510 {"burning oil", "0d0", "2d10+5", NONE, 20, 30,
511 CANBURN | ISMANY | ISMISL | ISLITTLE },
512 {"grenade", "1d1", "1d2/4d8", NONE, 10, 50,
513 ISMANY | ISSMALL },
514
515 /* other weapons */
516 {"club", "1d4", "1d2", NONE, 30, 2, 0 },
517 {"pitchfork", "1d5", "2d2", NONE, 15, 5, ISSHARPMETAL },
518 {"short sword", "1d6", "1d2", NONE, 50, 10, ISSHARPMETAL },
519 {"hand axe", "1d6", "1d2", NONE, 40, 15, ISSHARPMETAL },
520 {"partisan", "1d6", "1d2", NONE, 75, 4, ISSHARPMETAL | ISTWOH },
521 {"grain flail", "1d6", "1d4", NONE, 100, 2, ISSHARPMETAL },
522 {"singlestick", "1d4+2", "1d2", NONE, 30, 20, 0 },
523 {"rapier", "1d6+1", "1d2", NONE, 7, 75, ISSHARPMETAL },
524 {"sickle", "1d6+1", "1d2", NONE, 30, 15, ISSHARPMETAL },
525 {"hatchet", "1d6+1", "1d4", NONE, 50, 10, ISSHARPMETAL },
526 {"scimitar", "1d8", "1d2", NONE, 40, 10, ISSHARPMETAL },
527 {"mace", "2d4", "1d3", NONE, 100, 40, 0 },
528 {"morning star", "2d4", "1d3", NONE, 125, 35, ISMETAL },
529 {"broad sword", "2d4", "1d3", NONE, 75, 50, ISSHARPMETAL },
530 {"miner's pick", "2d4", "1d2", NONE, 85, 40, ISSHARPMETAL },
531 {"guisarme", "2d4", "1d3", NONE, 100, 25, ISSHARPMETAL | ISTWOH },
532 {"war flail", "1d6+2", "1d4", NONE, 150, 50, ISSHARPMETAL | ISTWOH },
533 {"crysknife", "3d3", "1d3", NONE, 12, 100, ISCRYSKNIFE },
534 {"battle axe", "1d8+2", "1d3", NONE, 80, 100, ISSHARPMETAL },
535 {"cutlass", "1d10", "1d2", NONE, 55, 120, ISSHARPMETAL },
536 {"glaive", "1d10", "1d3", NONE, 80, 80, ISSHARPMETAL | ISTWOH },
537 {"pertuska", "2d5", "1d3", NONE, 130, 100, ISSHARPMETAL | ISTWOH },
538 {"long sword", "3d4", "1d2", NONE, 100, 150, ISSHARPMETAL },
539 {"lance", "1d12", "1d8", NONE, 80, 140, ISSHARP | ISTWOH },
540 {"ranseur", "1d12", "1d8", NONE, 100, 130, ISSHARPMETAL | ISTWOH },
541 {"sabre", "2d6", "1d3", NONE, 50, 200, ISSHARPMETAL },
542 {"spetum", "2d6", "1d3", NONE, 50, 180, ISSHARPMETAL | ISTWOH },
543 {"halberd", "2d6", "1d3", NONE, 150, 125, ISSHARPMETAL | ISTWOH },
544 {"trident", "3d4", "1d4", NONE, 50, 200, ISSHARPMETAL | ISTWOH },
545 {"war pick", "3d4", "1d2", NONE, 75, 175, ISSHARPMETAL | ISTWOH },
546 {"bardiche", "3d4", "1d2", NONE, 125, 125, ISSHARPMETAL | ISTWOH },
547 {"heavy mace", "3d4", "1d3", NONE, 200, 50, ISTWOH },
548 {"great scythe", "2d6+2", "1d2", NONE, 100, 200, ISSHARP | ISTWOH },
549 {"quarter staff", "3d5", "1d2", NONE, 70, 250, 0 },
550 {"bastard sword", "2d8", "1d2", NONE, 150, 300, ISSHARPMETAL },
551 {"pike", "2d8", "2d6", NONE, 200, 275, ISSHARPMETAL | ISTWOH },
552 {"great flail", "2d6+2", "1d4", NONE, 200, 275, ISSHARPMETAL | ISTWOH },
553 {"great maul", "4d4", "1d3", NONE, 400, 250, ISTWOH },
554 {"great pick", "2d9", "1d2", NONE, 175, 330, ISSHARPMETAL | ISTWOH },
555 {"two handed sword","4d4", "1d2", NONE, 250, 300, ISSHARPMETAL | ISTWOH },
556 {"claymore", "3d7", "1d2", NONE, 200, 500, ISSHARPMETAL | ISTWOH }
557 };
558
559 int maxweapons = MAXWEAPONS;
560
561 struct init_armor armors[] =
562 {
563 { "soft leather", 75, 20, 9, 50 },
564 { "cuirboilli", 150, 30, 8, 130 },
565 { "leather armor", 175, 40, 8, 100 },
566 { "ring mail", 350, 49, 7, 250 },
567 { "studded leather armor",400,58, 7, 200 },
568 { "scale mail", 500, 66, 6, 250 },
569 { "padded armor", 550, 72, 6, 150 },
570 { "chain mail", 750, 78, 5, 300 },
571 { "brigandine", 800, 84, 5, 280 },
572 { "splint mail", 1000, 88, 4, 350 },
573 { "banded mail", 1250, 90, 4, 300 },
574 { "superior chain", 1500, 93, 3, 350 },
575 { "plate mail", 1400, 96, 3, 400 },
576 { "plate armor", 1650, 98, 2, 450 },
577 { "mithril", 30000, 99, 2, 200 },
578 { "crystalline armor", 15000, 100, 0, 300 }
579 };
580
581 int maxarmors = MAXARMORS;
582
583 struct init_artifact arts[] = {
584 { "Magic Purse of Yendor", 15, 1, 1, 1, 1, 4600L, 50 },
585 { "Phial of Galadriel", 20, 2, 2, 2, 1, 12500L, 10 },
586 { "Amulet of Yendor", 25, 4, 1, 1, 2, 16000L, 10 },
587 { "Palantir of Might", 30, 1, 4, 1, 2, 18500L, 70 },
588 { "Crown of Might", 35, 6, 2, 1, 1, 23500L, 50 },
589 { "Sceptre of Might", 40, 2, 2, 1, 6, 38000L, 50 },
590 { "Silmaril of Ea", 45, 4, 2, 5, 1, 50000L, 50 },
591 { "Wand of Yendor", 50, 4, 2, 3, 10, 80000L, 50 }
592 };
593
594 int maxartifact = MAXARTIFACT;
595
596 /*
597 init_player()
598 roll up the rogue
599 */
600
601 void
602 init_player(void)
603 {
604 int special = rnd(100) < 20;
605 struct linked_list *item;
606 struct object *obj;
607 int which_armor = 0, which_weapon = 0;
608 int other_weapon_flags = 0;
609
610 pstats.s_lvl = 1;
611 pstats.s_exp = 0L;
612 pstats.s_arm = 10;
613
614 if (!geta_player())
615 {
616 do_getplayer(); /* get character class */
617 pstats.s_str = 8 + rnd(5);
618 pstats.s_intel = 8 + rnd(5);
619 pstats.s_wisdom = 8 + rnd(5);
620 pstats.s_dext = 8 + rnd(5);
621 pstats.s_const = 10 + rnd(8);
622 pstats.s_charisma = 8 + rnd(4);
623 pstats.s_power = 5 + rnd(5);
624 pstats.s_hpt = 15 + rnd(5);
625
626 switch (char_type) /* Class-specific abilities */
627 {
628 case C_FIGHTER:
629 pstats.s_str = 17;
630 pstats.s_const += rnd(4) + 1;
631 if (special)
632 {
633 pstats.s_str += rnd(3);
634 pstats.s_dext += rnd(4);
635 }
636 pstats.s_const = max(pstats.s_const, 16);
637 break;
638
639 case C_PALADIN:
640 pstats.s_charisma = 17;
641
642 if (special)
643 {
644 pstats.s_charisma += rnd(3);
645 pstats.s_wisdom += rnd(4);
646 pstats.s_str += rnd(5);
647 }
648
649 pstats.s_str = max(pstats.s_str, 16);
650 pstats.s_wisdom = max(pstats.s_wisdom, 16);
651 break;
652
653 case C_RANGER:
654 if (special)
655 {
656 pstats.s_wisdom += rnd(4);
657 pstats.s_intel += rnd(4);
658 pstats.s_str += rnd(5);
659 }
660
661 pstats.s_str = max(pstats.s_str, 16);
662 pstats.s_wisdom = max(pstats.s_wisdom, 16);
663 pstats.s_const = max(pstats.s_const, 14);
664 break;
665
666 case C_MAGICIAN:
667 pstats.s_intel = (special) ? 18 : 16;
668 pstats.s_power += 5 + rnd(10);
669 break;
670
671 case C_ILLUSION:
672 pstats.s_intel = (special) ? 18 : 16;
673 pstats.s_dext = (special) ? 18 : 14;
674 pstats.s_power += 5 + rnd(10);
675 break;
676
677 case C_CLERIC:
678 pstats.s_wisdom = (special) ? 18 : 16;
679 pstats.s_str += rnd(4);
680 pstats.s_power += 5 + rnd(10);
681 break;
682
683 case C_DRUID:
684 if (special)
685 {
686 pstats.s_wisdom += rnd(5);
687 pstats.s_charisma += rnd(4);
688 }
689 pstats.s_str += rnd(4);
690 pstats.s_power += 5 + rnd(10);
691 pstats.s_wisdom = max(pstats.s_wisdom, 16);
692 break;
693
694 case C_THIEF:
695 pstats.s_dext = 18;
696 if (special)
697 pstats.s_const += rnd(4) + 1;
698 break;
699
700 case C_ASSASIN:
701 pstats.s_dext = (special) ? 18 : 16;
702 pstats.s_intel = (special) ? 18 : 16;
703 break;
704
705 case C_NINJA:
706 if (special)
707 {
708 pstats.s_dext += rnd(5);
709 pstats.s_str += rnd(4);
710 pstats.s_intel += rnd(3);
711 pstats.s_wisdom += rnd(3);
712 }
713 pstats.s_dext = max(pstats.s_dext, 16);
714 pstats.s_str = max(pstats.s_str, 15);
715 pstats.s_wisdom = max(pstats.s_wisdom, 15);
716 pstats.s_const = max(pstats.s_const, 15);
717 pstats.s_charisma = max(pstats.s_charisma, 11);
718 }
719
720 puta_player();
721 }
722
723 if (char_type == C_ASSASIN || char_type == C_NINJA
724 || char_type == C_FIGHTER)
725 pstats.s_dmg = "2d6";
726 else
727 pstats.s_dmg = "1d4";
728
729 if (char_type == C_NINJA || char_type == C_FIGHTER)
730 pstats.s_arm = 8;
731
732 if (pstats.s_const > 15)
733 pstats.s_hpt += pstats.s_const - 15;
734
735 max_stats = pstats;
736 player.t_rest_hpt = player.t_rest_pow = 0;
737 player.t_praycnt = 0;
738 pstats.s_carry = totalenc();
739 pack = NULL;
740
741 switch (player.t_ctype) /* now outfit pack */
742 {
743 case C_PALADIN:
744 purse = roll(20, 60);
745 which_armor = CHAIN_MAIL;
746 which_weapon = LONG_SWORD;
747 break;
748
749 case C_FIGHTER:
750 purse = roll(50, 60);
751 which_armor = SCALE_MAIL;
752 which_weapon = BROAD_SWORD;
753 break;
754
755 case C_RANGER:
756 purse = roll(50, 60);
757 which_armor = PADDED_ARMOR;
758 which_weapon = LONG_SPEAR;
759 other_weapon_flags |= ISOWNED | CANRETURN;
760 break;
761
762 case C_CLERIC:
763 purse = roll(30, 80);
764 which_armor = RING_MAIL;
765 which_weapon = MORNINGSTAR;
766 break;
767
768 case C_DRUID:
769 purse = roll(30, 80);
770 which_armor = STUDDED_LEATHER;
771 which_weapon = LIGHT_MACE;
772 break;
773
774 case C_THIEF:
775 purse = roll(40, 80);
776 which_armor = HEAVY_LEATHER;
777 which_weapon = CUTLASS;
778 break;
779
780 case C_ASSASIN:
781 purse = roll(20, 80);
782 which_armor = CUIRBOLILLI;
783 which_weapon = SABRE;
784 other_weapon_flags |= ISPOISON;
785 break;
786
787 case C_NINJA:
788 purse = roll(20, 80);
789 which_armor = CUIRBOLILLI;
790 which_weapon = CRYSKNIFE;
791 other_weapon_flags |= ISPOISON;
792 item = spec_item(WEAPON, SHURIKEN, 1, 1);
793 obj = OBJPTR(item);
794 obj->o_count = 1;
795 obj->o_flags |= ISKNOW | ISPOISON | ISOWNED | CANRETURN;
796 add_pack(item, NOMESSAGE);
797 break;
798
799 case C_MAGICIAN:
800 case C_ILLUSION:
801 purse = roll(20, 60);
802 which_armor = SOFT_LEATHER;
803 which_weapon = SINGLESTICK;
804 break;
805
806 default:
807 break;
808 }
809
810 /* Add weapon to pack */
811
812 item = spec_item(WEAPON, which_weapon, 1, 1);
813 obj = OBJPTR(item);
814
815 obj->o_flags |= ISKNOW;
816 obj->o_flags |= other_weapon_flags;
817 obj->o_count = 1;
818 add_pack(item, NOMESSAGE);
819 cur_weapon = obj;
820
821 /* Add armor to pack */
822
823 item = spec_item(ARMOR, which_armor, 0, 0);
824 obj = OBJPTR(item);
825
826 obj->o_flags |= ISKNOW;
827 obj->o_weight = armors[which_armor].a_wght;
828 add_pack(item, NOMESSAGE);
829 cur_armor = obj;
830
831 /* Add some food to pack */
832
833 item = spec_item(FOOD, FD_CRAM, 0, 0);
834 obj = OBJPTR(item);
835
836 obj->o_weight = things[TYP_FOOD].mi_wght;
837 obj->o_count = 3;
838 add_pack(item, NOMESSAGE);
839 }
840
841 /*
842 init_flags()
843 Initialize flags on startup
844 */
845
846 void
847 init_flags(void)
848 {
849 switch (player.t_ctype)
850 {
851 case C_MAGICIAN:
852 case C_ILLUSION:
853 case C_CLERIC:
854 case C_DRUID:
855 case C_RANGER:
856 case C_PALADIN:
857 turn_on(player, CANSUMMON);
858 break;
859
860 default:
861 break;
862 }
863
864 turn_on(player, CANCAST);
865 turn_on(player, CANWIELD);
866 }
867
868 /*
869 * Contains definitions and functions for dealing with things like potions
870 * and scrolls
871 */
872
873 /*
874 init_things()
875 Initialize the probabilities for types of things
876 */
877
878 void
879 init_things(void)
880 {
881 struct magic_item *mp;
882
883 for (mp = &things[1]; mp < &things[numthings]; mp++)
884 mp->mi_prob += (mp - 1)->mi_prob;
885
886 badcheck("things", things, numthings);
887 }
888
889 /*
890 init_fd()
891 Initialize the probabilities for types of food
892 */
893
894 void
895 init_fd(void)
896 {
897 struct magic_item *mp;
898
899 for (mp = &fd_data[1]; mp < &fd_data[maxfoods]; mp++)
900 mp->mi_prob += (mp - 1)->mi_prob;
901
902 badcheck("food", fd_data, maxfoods);
903 }
904
905 /*
906 init_colors()
907 Initialize the potion color scheme for this time
908 */
909
910 void
911 init_colors(void)
912 {
913 int i;
914 char *str;
915
916 for (i = 0; i < maxpotions; i++)
917 {
918 do
919 str = rainbow[rnd(NCOLORS)];
920 while( !isupper(*str) );
921
922 p_colors[i] = md_strdup(str);
923 p_colors[i][0] = (char) tolower(p_colors[i][0]);
924
925 know_items[TYP_POTION][i] = FALSE;
926 guess_items[TYP_POTION][i] = NULL;
927
928 if (i > 0)
929 p_magic[i].mi_prob += p_magic[i - 1].mi_prob;
930 }
931
932 badcheck("potions", p_magic, maxpotions);
933 }
934
935 /*
936 init_names()
937 Generate the names of the various scrolls
938 */
939
940 void
941 init_names(void)
942 {
943 int nsyl;
944 char *cp, *sp;
945 int i, nwords;
946
947 for (i = 0; i < maxscrolls; i++)
948 {
949 cp = prbuf;
950 nwords = rnd(COLS / 20) + 1 + (COLS > 40 ? 1 : 0);
951
952 while (nwords--)
953 {
954 nsyl = rnd(3) + 1;
955
956 while (nsyl--)
957 {
958 sp = sylls[rnd((sizeof sylls) /
959 (sizeof(char *)))];
960
961 while (*sp)
962 *cp++ = *sp++;
963 }
964 *cp++ = ' ';
965 }
966
967 *--cp = '\0';
968 s_names[i] = (char *) new_alloc(strlen(prbuf) + 1);
969
970 know_items[TYP_SCROLL][i] = FALSE;
971 guess_items[TYP_SCROLL][i] = 0;
972
973 strcpy(s_names[i], prbuf);
974
975 if (i > 0)
976 s_magic[i].mi_prob += s_magic[i - 1].mi_prob;
977 }
978
979 badcheck("scrolls", s_magic, maxscrolls);
980 }
981
982 /*
983 init_stones()
984 Initialize the ring stone setting scheme for this time
985 */
986
987 void
988 init_stones(void)
989 {
990 int i;
991 char *str;
992
993 for (i = 0; i < maxrings; i++)
994 {
995 do
996 str = stones[rnd(NSTONES)];
997 while(!isupper(*str));
998
999 r_stones[i] = md_strdup(str);
1000 r_stones[i][0] = (char) tolower( r_stones[i][0] );
1001
1002 know_items[TYP_RING][i] = FALSE;
1003 guess_items[TYP_RING][i] = NULL;
1004
1005 if (i > 0)
1006 r_magic[i].mi_prob += r_magic[i - 1].mi_prob;
1007 }
1008
1009 badcheck("rings", r_magic, maxrings);
1010 }
1011
1012 /*
1013 init_materials()
1014 Initialize the construction materials for wands and staffs
1015 */
1016
1017 void
1018 init_materials(void)
1019 {
1020 int i;
1021 char *str;
1022
1023 for (i = 0; i < maxsticks; i++)
1024 {
1025 do
1026 {
1027 if (rnd(100) > 50)
1028 {
1029 str = metal[rnd(NMETAL)];
1030
1031 if (isupper(*str))
1032 ws_type[i] = "wand";
1033 }
1034 else
1035 {
1036 str = wood[rnd(NWOOD)];
1037
1038 if (isupper(*str))
1039 ws_type[i] = "staff";
1040 }
1041 }
1042 while(!isupper(*str));
1043
1044 ws_made[i] = md_strdup(str);
1045 ws_made[i][0] = (char) tolower( ws_made[i][0] );
1046
1047 know_items[TYP_STICK][i] = FALSE;
1048 guess_items[TYP_STICK][i] = 0;
1049
1050 if (i > 0)
1051 ws_magic[i].mi_prob += ws_magic[i - 1].mi_prob;
1052 }
1053
1054 badcheck("sticks", ws_magic, maxsticks);
1055 }
1056
1057 void
1058 badcheck(char *name, struct magic_item *magic, int bound)
1059 {
1060 struct magic_item *end;
1061
1062 if (magic[bound - 1].mi_prob == 1000)
1063 return;
1064
1065 printf("\nBad percentages for %s:\n", name);
1066
1067 for (end = &magic[bound]; magic < end; magic++)
1068 printf("%3d%% %s\n", magic->mi_prob, magic->mi_name);
1069
1070 printf("[Hit RETURN to continue]");
1071 fflush(stdout);
1072
1073 while ((readchar() & 0177) != '\n')
1074 continue;
1075 }