comparison arogue5/init.c @ 63:0ed67132cf10

Import Advanced Rogue 5.8 from the Roguelike Restoration Project (r1490)
author elwin
date Thu, 09 Aug 2012 22:58:48 +0000
parents
children c49f7927b0fa
comparison
equal deleted inserted replaced
62:0ef99244acb8 63:0ed67132cf10
1 /*
2 * global variable initializaton
3 *
4 * Advanced Rogue
5 * Copyright (C) 1984, 1985 Michael Morgan, Ken Dalka and AT&T
6 * All rights reserved.
7 *
8 * Based on "Rogue: Exploring the Dungeons of Doom"
9 * Copyright (C) 1980, 1981 Michael Toy, Ken Arnold and Glenn Wichman
10 * All rights reserved.
11 *
12 * See the file LICENSE.TXT for full copyright and licensing information.
13 */
14
15 #include "curses.h"
16 #include <ctype.h>
17 #include "rogue.h"
18 #include "mach_dep.h"
19
20
21 char *rainbow[NCOLORS] = {
22
23 "amber", "aquamarine", "beige",
24 "black", "blue", "brown",
25 "clear", "crimson", "ecru",
26 "gold", "green", "grey",
27 "indigo", "khaki", "lavender",
28 "magenta", "orange", "pink",
29 "plaid", "purple", "red",
30 "silver", "saffron", "scarlet",
31 "tan", "tangerine", "topaz",
32 "turquoise", "vermilion", "violet",
33 "white", "yellow",
34 };
35
36 char *sylls[NSYLLS] = {
37 "a", "ab", "ag", "aks", "ala", "an", "ankh","app", "arg", "arze",
38 "ash", "ban", "bar", "bat", "bek", "bie", "bin", "bit", "bjor",
39 "blu", "bot", "bu", "byt", "comp","con", "cos", "cre", "dalf",
40 "dan", "den", "do", "e", "eep", "el", "eng", "er", "ere", "erk",
41 "esh", "evs", "fa", "fid", "for", "fri", "fu", "gan", "gar",
42 "glen","gop", "gre", "ha", "he", "hyd", "i", "ing", "ion", "ip",
43 "ish", "it", "ite", "iv", "jo", "kho", "kli", "klis","la", "lech",
44 "man", "mar", "me", "mi", "mic", "mik", "mon", "mung","mur",
45 "nej", "nelg","nep", "ner", "nes", "nes", "nih", "nin", "o", "od",
46 "ood", "org", "orn", "ox", "oxy", "pay", "pet", "ple", "plu", "po",
47 "pot", "prok","re", "rea", "rhov","ri", "ro", "rog", "rok", "rol",
48 "sa", "san", "sat", "see", "sef", "seh", "shu", "ski", "sna",
49 "sne", "snik","sno", "so", "sol", "sri", "sta", "sun", "ta",
50 "tab", "tem", "ther","ti", "tox", "trol","tue", "turs","u",
51 "ulk", "um", "un", "uni", "ur", "val", "viv", "vly", "vom", "wah",
52 "wed", "werg","wex", "whon","wun", "xo", "y", "yot", "yu",
53 "zant","zap", "zeb", "zim", "zok", "zon", "zum",
54 };
55
56 char *stones[NSTONES] = {
57 "agate", "alexandrite", "amethyst",
58 "azurite", "bloodstone", "cairngorm",
59 "carnelian", "chalcedony", "chrysoberyl",
60 "chrysolite", "chrysoprase", "citrine",
61 "coral", "diamond", "emerald",
62 "garnet", "heliotrope", "hematite",
63 "hyacinth", "jacinth", "jade",
64 "jargoon", "jasper", "kryptonite",
65 "lapus lazuli", "malachite", "mocca stone",
66 "moonstone", "obsidian", "olivine",
67 "onyx", "opal", "pearl",
68 "peridot", "quartz", "rhodochrosite",
69 "rhodolite", "ruby", "sapphire",
70 "sardonyx", "serpintine", "spinel",
71 "tiger eye", "topaz", "tourmaline",
72 "turquoise", "zircon",
73 };
74
75 char *wood[NWOOD] = {
76 "avocado wood", "balsa", "banyan", "birch",
77 "cedar", "cherry", "cinnibar", "dogwood",
78 "driftwood", "ebony", "eucalyptus", "hemlock",
79 "ironwood", "mahogany", "manzanita", "maple",
80 "oak", "pine", "redwood", "rosewood",
81 "teak", "walnut", "zebra wood", "persimmon wood",
82 };
83
84 char *metal[NMETAL] = {
85 "aluminium", "bone", "brass", "bronze",
86 "copper", "chromium", "iron", "lead",
87 "magnesium", "pewter", "platinum", "silver",
88 "steel", "tin", "titanium", "zinc",
89 };
90
91
92
93
94 /*
95 * make sure all the percentages specified in the tables add up to the
96 * right amounts
97 */
98 badcheck(name, magic, bound)
99 char *name;
100 register struct magic_item *magic;
101 register int bound;
102 {
103 register struct magic_item *end;
104
105 if (magic[bound - 1].mi_prob == 1000)
106 return;
107 printf("\nBad percentages for %s:\n", name);
108 for (end = &magic[bound] ; magic < end ; magic++)
109 printf("%4d%% %s\n", magic->mi_prob, magic->mi_name);
110 printf(retstr);
111 fflush(stdout);
112 while (getchar() != '\n')
113 continue;
114 }
115
116 /*
117 * init_colors:
118 * Initialize the potion color scheme for this time
119 */
120
121 init_colors()
122 {
123 register int i, j;
124 bool used[NCOLORS];
125
126 for(i = 0; i < NCOLORS; i++)
127 used[i] = FALSE;
128
129 for (i = 0 ; i < MAXPOTIONS ; i++)
130 {
131 do
132 j = rnd(NCOLORS);
133 until (!used[j]);
134 used[j] = TRUE;
135 p_colors[i] = rainbow[j];
136 p_know[i] = FALSE;
137 p_guess[i] = NULL;
138 if (i > 0)
139 p_magic[i].mi_prob += p_magic[i-1].mi_prob;
140 }
141 badcheck("potions", p_magic, MAXPOTIONS);
142 }
143
144 /*
145 * init_materials:
146 * Initialize the construction materials for wands and staffs
147 */
148
149 init_materials()
150 {
151 register int i, j;
152 register char *str;
153 bool metused[NMETAL], woodused[NWOOD];
154
155 for(i = 0; i < NWOOD; i++)
156 woodused[i] = FALSE;
157
158 for(i = 0; i < NMETAL; i++)
159 metused[i] = FALSE;
160
161 for (i = 0 ; i < MAXSTICKS ; i++)
162 {
163 for (;;)
164 if (rnd(100) > 50)
165 {
166 j = rnd(NMETAL);
167
168 if (!metused[j])
169 {
170 ws_type[i] = "wand";
171 str = metal[j];
172 metused[j] = TRUE;
173 break;
174 }
175 }
176 else
177 {
178 j = rnd(NWOOD);
179
180 if (!woodused[j])
181 {
182 ws_type[i] = "staff";
183 str = wood[j];
184 woodused[j] = TRUE;
185 break;
186 }
187 }
188
189 ws_made[i] = str;
190 ws_know[i] = FALSE;
191 ws_guess[i] = NULL;
192 if (i > 0)
193 ws_magic[i].mi_prob += ws_magic[i-1].mi_prob;
194 }
195 badcheck("sticks", ws_magic, MAXSTICKS);
196 }
197
198 /*
199 * do any initialization for miscellaneous magic
200 */
201
202 init_misc()
203 {
204 register int i;
205
206 for (i=0; i < MAXMM; i++) {
207 m_know[i] = FALSE;
208 m_guess[i] = NULL;
209 if (i > 0)
210 m_magic[i].mi_prob += m_magic[i-1].mi_prob;
211 }
212
213 badcheck("miscellaneous magic", m_magic, MAXMM);
214 }
215
216
217 /*
218 * init_names:
219 * Generate the names of the various scrolls
220 */
221
222 init_names()
223 {
224 register int nsyl;
225 register char *cp, *sp;
226 register int i, nwords;
227
228 for (i = 0 ; i < MAXSCROLLS ; i++)
229 {
230 cp = prbuf;
231 nwords = rnd(COLS/20) + 1 + (COLS > 40 ? 1 : 0);
232 while(nwords--)
233 {
234 nsyl = rnd(3)+1;
235 while(nsyl--)
236 {
237 sp = sylls[rnd((sizeof sylls) / (sizeof (char *)))];
238 while(*sp)
239 *cp++ = *sp++;
240 }
241 *cp++ = ' ';
242 }
243 *--cp = '\0';
244 s_names[i] = (char *) new(strlen(prbuf)+1);
245 s_know[i] = FALSE;
246 s_guess[i] = NULL;
247 strcpy(s_names[i], prbuf);
248 if (i > 0)
249 s_magic[i].mi_prob += s_magic[i-1].mi_prob;
250 }
251 badcheck("scrolls", s_magic, MAXSCROLLS);
252 }
253
254 /*
255 * init_player:
256 * roll up the rogue
257 */
258
259 init_player()
260 {
261 int stat_total, ch = 0, wpt = 0, i, j;
262 struct linked_list *weap_item, *armor_item, *food_item;
263 struct object *obj;
264 char *class;
265
266 weap_item = armor_item = NULL;
267
268 if (char_type == -1) {
269 /* See what type character will be */
270 wclear(hw);
271 touchwin(hw);
272 mvwaddstr(hw,2,0,"[1] Fighter\n[2] Magician\n[3] Cleric\n[4] Thief");
273 mvwaddstr(hw, 0, 0, "What character class do you desire? ");
274 draw(hw);
275 char_type = (wgetch(hw) - '0');
276 while (char_type < 1 || char_type > 4) {
277 mvwaddstr(hw,0,0,"Please enter a character type between 1 and 4: ");
278 draw(hw);
279 char_type = (wgetch(hw) - '0');
280 }
281 char_type--;
282 }
283 player.t_ctype = char_type;
284 player.t_quiet = 0;
285 pack = NULL;
286
287 #ifdef WIZARD
288 /*
289 * allow me to describe a super character
290 */
291 if (wizard && md_getuid() == AUTHOR && strcmp(getenv("SUPER"),"YES") == 0) {
292 pstats.s_str = 25;
293 pstats.s_intel = 25;
294 pstats.s_wisdom = 25;
295 pstats.s_dext = 25;
296 pstats.s_const = 25;
297 pstats.s_charisma = 25;
298 pstats.s_exp = 7500000L;
299 pstats.s_lvl = 20;
300 pstats.s_hpt = 500;
301 pstats.s_carry = totalenc();
302 strcpy(pstats.s_dmg,"3d4");
303 if (player.t_ctype == C_FIGHTER)
304 weap_item = spec_item(WEAPON, TWOSWORD, 5, 5);
305 else
306 weap_item = spec_item(WEAPON, SWORD, 5, 5);
307 obj = OBJPTR(weap_item);
308 obj->o_flags |= ISKNOW;
309 add_pack(weap_item, TRUE, NULL);
310 cur_weapon = obj;
311 j = PLATE_ARMOR;
312 if (player.t_ctype == C_THIEF)
313 j = STUDDED_LEATHER;
314 armor_item = spec_item(ARMOR, j, 10, 0);
315 obj = OBJPTR(armor_item);
316 obj->o_flags |= (ISKNOW | ISPROT);
317 obj->o_weight = armors[j].a_wght;
318 add_pack(armor_item, TRUE, NULL);
319 cur_armor = obj;
320 purse += 10000;
321 }
322 else
323 #endif
324
325 {
326 wclear(hw);
327 do {
328 if (armor_item != NULL) {
329 o_discard(armor_item);
330 armor_item = NULL;
331 }
332 if (weap_item != NULL) {
333 o_discard(weap_item);
334 weap_item = NULL;
335 }
336 pstats.s_lvl = 1;
337 pstats.s_exp = 0L;
338 pstats.s_hpt = 12 + rnd(10);
339 pstats.s_str = 7 + rnd(5);
340 pstats.s_intel = 7 + rnd(5);
341 pstats.s_wisdom = 7 + rnd(5);
342 pstats.s_dext = 7 + rnd(5);
343 pstats.s_const = 14 + rnd(5);
344 pstats.s_charisma = 7 + rnd(5);
345
346 /* Now for the special ability */
347 switch (char_type) {
348 case C_FIGHTER: pstats.s_str = (rnd(10) == 7) ? 18 : 16;
349 when C_MAGICIAN: pstats.s_intel = (rnd(10) == 7) ? 18 : 16;
350 when C_CLERIC: pstats.s_wisdom= (rnd(10) == 7) ? 18 : 16;
351 when C_THIEF: pstats.s_dext = (rnd(10) == 7) ? 18 : 16;
352 }
353 strcpy(pstats.s_dmg,"1d4");
354 stat_total =pstats.s_str + pstats.s_intel + pstats.s_wisdom +
355 pstats.s_dext + pstats.s_const;
356 /*
357 * since the player can re-roll stats at will, keep the maximum
358 * to some reasonable limit
359 */
360 if (stat_total > MAXSTATS)
361 pstats.s_const -= (stat_total - MAXSTATS);
362 pstats.s_carry = totalenc();
363
364 /*
365 * Give the rogue his weaponry.
366 */
367 do {
368 i = rnd(8); /* number of acceptable weapons */
369 switch(i) {
370 case 0: ch = 25; wpt = MACE;
371 when 1: ch = 25; wpt = SWORD;
372 when 2: ch = 20; wpt = BATTLEAXE;
373 when 3: ch = 20; wpt = TRIDENT;
374 when 4: ch = 20; wpt = SPETUM;
375 when 5: ch = 20; wpt = BARDICHE;
376 when 6: ch = 15; wpt = PIKE;
377 when 7: ch = 20; wpt = HALBERD;
378 }
379 } while(rnd(100) > ch);
380 if (player.t_ctype == C_FIGHTER)
381 wpt = TWOSWORD;
382 weap_item = spec_item(WEAPON, wpt, rnd(2), rnd(2)+1);
383 obj = OBJPTR(weap_item);
384 obj->o_flags |= ISKNOW;
385 /*
386 * And his suit of armor.......
387 * Thieves can only wear leather armor
388 * fighters get better armor on an average
389 */
390 if (player.t_ctype == C_THIEF)
391 j = STUDDED_LEATHER;
392 else {
393 if (player.t_ctype == C_FIGHTER)
394 i = 50 + rnd(50);
395 else
396 i = rnd(100);
397 j = 0;
398 while (armors[j].a_prob < i)
399 j++;
400 }
401 armor_item = spec_item(ARMOR, j, 0, 0);
402 obj = OBJPTR(armor_item);
403 obj->o_flags |= ISKNOW;
404 obj->o_weight = armors[j].a_wght;
405 switch(player.t_ctype) {
406 case C_FIGHTER: class = "fighter";
407 when C_MAGICIAN:class = "magic user";
408 when C_CLERIC: class = "cleric";
409 when C_THIEF: class = "thief";
410 otherwise: class = "unknown";
411 }
412 wmove(hw, 2, 0);
413 wprintw(hw, "You have rolled a %s with the following attributes:",class);
414 wmove(hw,4,0);
415 wprintw(hw, " Int: %2d", pstats.s_intel);
416 wprintw(hw, " Str: %2d", pstats.s_str);
417 wprintw(hw, " Wis: %2d", pstats.s_wisdom);
418 wprintw(hw, " Dex: %2d", pstats.s_dext);
419 wprintw(hw, " Const: %2d", pstats.s_const);
420 wclrtoeol(hw);
421 wmove(hw, 6, 0);
422 wprintw(hw, " Hp: %2d", pstats.s_hpt);
423 wclrtoeol(hw);
424 mvwaddstr(hw, 8, 5, inv_name(OBJPTR(weap_item), FALSE));
425 wclrtoeol(hw);
426 mvwaddstr(hw, 9, 5, inv_name(OBJPTR(armor_item), FALSE));
427 wclrtoeol(hw);
428 mvwaddstr(hw,0,0,"Would you like to re-roll the character? ");
429 draw(hw);
430 } while(wgetch(hw) == 'y');
431
432 obj = OBJPTR(weap_item);
433 add_pack(weap_item, TRUE, NULL);
434 cur_weapon = obj;
435 obj = OBJPTR(armor_item);
436 add_pack(armor_item, TRUE, NULL);
437 cur_armor = obj;
438 }
439 /*
440 * Give him some food
441 */
442 food_item = spec_item(FOOD, 0, 0, 0);
443 obj = OBJPTR(food_item);
444 obj->o_weight = things[TYP_FOOD].mi_wght;
445 add_pack(food_item, TRUE, NULL);
446 pstats.s_arm = 10;
447 max_stats = pstats;
448 }
449
450
451
452
453
454
455 /*
456 * init_stones:
457 * Initialize the ring stone setting scheme for this time
458 */
459
460 init_stones()
461 {
462 register int i, j;
463 bool used[NSTONES];
464
465 for (i = 0; i < NSTONES; i++)
466 used[i] = FALSE;
467
468 for (i = 0 ; i < MAXRINGS ; i++)
469 {
470 do
471 j = rnd(NSTONES);
472 until (!used[j]);
473
474 used[j] = TRUE;
475 r_stones[i] = stones[j];
476 r_know[i] = FALSE;
477 r_guess[i] = NULL;
478 if (i > 0)
479 r_magic[i].mi_prob += r_magic[i-1].mi_prob;
480 }
481 badcheck("rings", r_magic, MAXRINGS);
482 }
483
484 /*
485 * init_things
486 * Initialize the probabilities for types of things
487 */
488 init_things()
489 {
490 register struct magic_item *mp;
491
492 for (mp = &things[1] ; mp < &things[NUMTHINGS] ; mp++)
493 mp->mi_prob += (mp-1)->mi_prob;
494 badcheck("things", things, NUMTHINGS);
495 }
496
497