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