Annotation of early-roguelike/arogue7/init.c, Revision 1.1.1.1
1.1 rubenllo 1: /*
2: * init.c - global variable initializaton
3: *
4: * Advanced Rogue
5: * Copyright (C) 1984, 1985, 1986 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: /*
16: * global variable initializaton
17: *
18: */
19:
20: #include "curses.h"
21: #include <ctype.h>
22: #include <string.h>
23: #include "rogue.h"
24: #include "mach_dep.h"
25:
26:
27: /*
28: * If there is any news, put it in a character string and assign it to
29: * rogue_news. Otherwise, assign NULL to rogue_news.
30: */
31: static char *rogue_news = "You no longer fall into trading posts. They are \
32: now entered like going down the stairs.";
33:
34: char *rainbow[] = {
35:
36: "amber", "aquamarine", "beige",
37: "black", "blue", "brown",
38: "clear", "crimson", "ecru",
39: "gold", "green", "grey",
40: "indigo", "khaki", "lavender",
41: "magenta", "orange", "pink",
42: "plaid", "purple", "red",
43: "silver", "saffron", "scarlet",
44: "tan", "tangerine", "topaz",
45: "turquoise", "vermilion", "violet",
46: "white", "yellow",
47: };
48: #define NCOLORS (sizeof rainbow / sizeof(char *))
49: int cNCOLORS = NCOLORS;
50:
51: static char *sylls[] = {
52: "a", "ab", "ag", "aks", "ala", "an", "ankh", "app", "arg", "arze",
53: "ash", "ban", "bar", "bat", "bek", "bie", "bin", "bit", "bjor",
54: "blu", "bot", "bu", "byt", "comp", "con", "cos", "cre", "dalf",
55: "dan", "den", "do", "e", "eep", "el", "eng", "er", "ere", "erk",
56: "esh", "evs", "fa", "fid", "for", "fri", "fu", "gan", "gar",
57: "glen", "gop", "gre", "ha", "he", "hyd", "i", "ing", "ion", "ip",
58: "ish", "it", "ite", "iv", "jo", "kho", "kli", "klis", "la", "lech",
59: "man", "mar", "me", "mi", "mic", "mik", "mon", "mung", "mur",
60: "nej", "nelg", "nep", "ner", "nes", "net", "nih", "nin", "o", "od",
61: "ood", "org", "orn", "ox", "oxy", "pay", "pet", "ple", "plu", "po",
62: "pot", "prok", "re", "rea", "rhov", "ri", "ro", "rog", "rok", "rol",
63: "sa", "san", "sat", "see", "sef", "seh", "shu", "ski", "sna",
64: "sne", "snik", "sno", "so", "sol", "sri", "sta", "sun", "ta",
65: "tab", "tem", "ther", "ti", "tox", "trol", "tue", "turs", "u",
66: "ulk", "um", "un", "uni", "ur", "val", "viv", "vly", "vom", "wah",
67: "wed", "werg", "wex", "whon", "wun", "xo", "y", "yot", "yu",
68: "zant", "zap", "zeb", "zim", "zok", "zon", "zum",
69: };
70:
71: char *stones[] = {
72: "agate", "alexandrite", "amethyst",
73: "azurite", "bloodstone", "cairngorm",
74: "carnelian", "chalcedony", "chrysoberyl",
75: "chrysolite", "chrysoprase", "citrine",
76: "coral", "diamond", "emerald",
77: "garnet", "heliotrope", "hematite",
78: "hyacinth", "jacinth", "jade",
79: "jargoon", "jasper", "kryptonite",
80: "lapus lazuli", "malachite", "mocca stone",
81: "moonstone", "obsidian", "olivine",
82: "onyx", "opal", "pearl",
83: "peridot", "quartz", "rhodochrosite",
84: "rhodolite", "ruby", "sapphire",
85: "sardonyx", "serpintine", "spinel",
86: "tiger eye", "topaz", "tourmaline",
87: "turquoise", "zircon",
88: };
89: #define NSTONES (sizeof stones / sizeof(char *))
90: int cNSTONES = NSTONES;
91:
92: char *wood[] = {
93: "avocado wood", "balsa", "banyan", "birch",
94: "cedar", "cherry", "cinnibar", "dogwood",
95: "driftwood", "ebony", "eucalyptus", "hemlock",
96: "ironwood", "mahogany", "manzanita", "maple",
97: "oak", "pine", "redwood", "rosewood",
98: "teak", "walnut", "zebra wood", "persimmon wood",
99: };
100: #define NWOOD (sizeof wood / sizeof(char *))
101: int cNWOOD = NWOOD;
102:
103: char *metal[] = {
104: "aluminium", "bone", "brass", "bronze",
105: "copper", "chromium", "iron", "lead",
106: "magnesium", "pewter", "platinum", "silver",
107: "steel", "tin", "titanium", "zinc",
108: };
109: #define NMETAL (sizeof metal / sizeof(char *))
110: int cNMETAL = NMETAL;
111: #define MAX3(a,b,c) (a > b ? (a > c ? a : c) : (b > c ? b : c))
112:
113: static bool used[MAX3(NCOLORS, NSTONES, NWOOD)];
114:
115:
116: /*
117: * make sure all the percentages specified in the tables add up to the
118: * right amounts
119: */
120: void
121: badcheck(char *name, struct magic_item *magic, int bound)
122: {
123: register struct magic_item *end;
124:
125: if (magic[bound - 1].mi_prob == 1000)
126: return;
127: printf("\nBad percentages for %s:\n", name);
128: for (end = &magic[bound] ; magic < end ; magic++)
129: printf("%4d%% %s\n", magic->mi_prob, magic->mi_name);
130: printf(retstr);
131: fflush(stdout);
132: while (getchar() != '\n')
133: continue;
134: }
135:
136: /*
137: * init_colors:
138: * Initialize the potion color scheme for this time
139: */
140:
141: void
142: init_colors(void)
143: {
144: register int i, j;
145:
146: for (i = 0; i < NCOLORS; i++)
147: used[i] = FALSE;
148:
149: for (i = 0 ; i < MAXPOTIONS ; i++)
150: {
151: do
152: j = rnd(NCOLORS);
153: until (!used[j]);
154: used[j] = TRUE;
155: p_colors[i] = rainbow[j];
156: p_know[i] = FALSE;
157: p_guess[i] = NULL;
158: if (i > 0)
159: p_magic[i].mi_prob += p_magic[i-1].mi_prob;
160: }
161: badcheck("potions", p_magic, MAXPOTIONS);
162: }
163:
164: /*
165: * do any initialization for food
166: */
167:
168: void
169: init_foods(void)
170: {
171: register int i;
172:
173: for (i=0; i < MAXFOODS; i++) {
174: if (i > 0)
175: foods[i].mi_prob += foods[i-1].mi_prob;
176: }
177: badcheck("foods", foods, MAXFOODS);
178: }
179:
180: /*
181: * init_materials:
182: * Initialize the construction materials for wands and staffs
183: */
184:
185: void
186: init_materials(void)
187: {
188: register int i, j;
189: register char *str;
190: static bool metused[NMETAL];
191:
192: for (i = 0; i < NWOOD; i++)
193: used[i] = FALSE;
194: for (i = 0; i < NMETAL; i++)
195: metused[i] = FALSE;
196:
197: for (i = 0 ; i < MAXSTICKS ; i++)
198: {
199: for (;;)
200: if (rnd(100) > 50)
201: {
202: j = rnd(NMETAL);
203: if (!metused[j])
204: {
205: ws_type[i] = "wand";
206: str = metal[j];
207: metused[j] = TRUE;
208: break;
209: }
210: }
211: else
212: {
213: j = rnd(NWOOD);
214: if (!used[j])
215: {
216: ws_type[i] = "staff";
217: str = wood[j];
218: used[j] = TRUE;
219: break;
220: }
221: }
222:
223: ws_made[i] = str;
224: ws_know[i] = FALSE;
225: ws_guess[i] = NULL;
226: if (i > 0)
227: ws_magic[i].mi_prob += ws_magic[i-1].mi_prob;
228: }
229: badcheck("sticks", ws_magic, MAXSTICKS);
230: }
231:
232: /*
233: * do any initialization for miscellaneous magic
234: */
235:
236: void
237: init_misc(void)
238: {
239: register int i;
240:
241: for (i=0; i < MAXMM; i++) {
242: m_know[i] = FALSE;
243: m_guess[i] = NULL;
244: if (i > 0)
245: m_magic[i].mi_prob += m_magic[i-1].mi_prob;
246: }
247: badcheck("miscellaneous magic", m_magic, MAXMM);
248: }
249:
250: /*
251: * init_names:
252: * Generate the names of the various scrolls
253: */
254:
255: void
256: init_names(void)
257: {
258: register int nsyl;
259: register char *cp, *sp;
260: register int i, nwords;
261:
262: for (i = 0 ; i < MAXSCROLLS ; i++)
263: {
264: cp = prbuf;
265: nwords = rnd(cols/20) + 1 + (cols > 40 ? 1 : 0);
266: while(nwords--)
267: {
268: nsyl = rnd(3)+1;
269: while(nsyl--)
270: {
271: sp = sylls[rnd((sizeof sylls) / (sizeof (char *)))];
272: while(*sp)
273: *cp++ = *sp++;
274: }
275: *cp++ = ' ';
276: }
277: *--cp = '\0';
278: s_names[i] = (char *) new(strlen(prbuf)+1);
279: s_know[i] = FALSE;
280: s_guess[i] = NULL;
281: strcpy(s_names[i], prbuf);
282: if (i > 0)
283: s_magic[i].mi_prob += s_magic[i-1].mi_prob;
284: }
285: badcheck("scrolls", s_magic, MAXSCROLLS);
286: }
287:
288: /*
289: * init_player:
290: * roll up the rogue
291: */
292:
293: void
294: init_player(void)
295: {
296: int stat_total, round, minimum, maximum, ch, i, j;
297: short do_escape, *our_stats[NUMABILITIES-1];
298: struct linked_list *weap_item, *armor_item;
299: struct object *obj;
300:
301: weap_item = armor_item = NULL;
302:
303: if (char_type == -1) {
304: /* See what type character will be */
305: wclear(hw);
306: touchwin(hw);
307: wmove(hw,2,0);
308: for(i=1; i<=NUM_CHARTYPES-1; i++) {
309: wprintw(hw,"[%d] %s\n",i,char_class[i-1].name);
310: }
311: mvwaddstr(hw, 0, 0, "What character class do you desire? ");
312: draw(hw);
313: char_type = (wgetch(hw) - '0');
314: while (char_type < 1 || char_type > NUM_CHARTYPES-1) {
315: wmove(hw,0,0);
316: wprintw(hw,"Please enter a character type between 1 and %d: ",
317: NUM_CHARTYPES-1);
318: draw(hw);
319: char_type = (wgetch(hw) - '0');
320: }
321: char_type--;
322: }
323: player.t_ctype = char_type;
324: player.t_quiet = 0;
325: pack = NULL;
326:
327: /* Select the gold */
328: purse = 2700;
329: switch (player.t_ctype) {
330: case C_FIGHTER:
331: purse += 1800;
332: when C_THIEF:
333: case C_ASSASIN:
334: purse += 600;
335: }
336: #ifdef WIZARD
337: /*
338: * allow me to describe a super character
339: */
340: if (wizard && strcmp(getenv("SUPER"),"YES") == 0) {
341: pstats.s_str = 25;
342: pstats.s_intel = 25;
343: pstats.s_wisdom = 25;
344: pstats.s_dext = 25;
345: pstats.s_const = 25;
346: pstats.s_charisma = 25;
347: pstats.s_exp = 10000000L;
348: pstats.s_lvladj = 0;
349: pstats.s_lvl = 1;
350: pstats.s_hpt = 500;
351: pstats.s_carry = totalenc(&player);
352: strncpy(pstats.s_dmg, "3d4", sizeof(pstats.s_dmg));
353: check_level();
354: mpos = 0;
355: if (player.t_ctype == C_FIGHTER ||
356: player.t_ctype == C_RANGER ||
357: player.t_ctype == C_PALADIN)
358: weap_item = spec_item(WEAPON, TWOSWORD, 5, 5);
359: else
360: weap_item = spec_item(WEAPON, SWORD, 5, 5);
361: obj = OBJPTR(weap_item);
362: obj->o_flags |= ISKNOW;
363: add_pack(weap_item, TRUE, NULL);
364: cur_weapon = obj;
365: if (player.t_ctype != C_MONK) {
366: j = PLATE_ARMOR;
367: if (player.t_ctype == C_THIEF || player.t_ctype == C_ASSASIN)
368: j = STUDDED_LEATHER;
369: armor_item = spec_item(ARMOR, j, 10, 0);
370: obj = OBJPTR(armor_item);
371: obj->o_flags |= (ISKNOW | ISPROT);
372: obj->o_weight = armors[j].a_wght;
373: add_pack(armor_item, TRUE, NULL);
374: cur_armor = obj;
375: }
376: purse += 10000;
377: }
378: else
379: #endif
380:
381: {
382: switch(player.t_ctype) {
383: case C_MAGICIAN:round = A_INTELLIGENCE;
384: when C_FIGHTER: round = A_STRENGTH;
385: when C_RANGER: round = A_STRENGTH;
386: when C_PALADIN: round = A_STRENGTH;
387: when C_CLERIC: round = A_WISDOM;
388: when C_DRUID: round = A_WISDOM;
389: when C_THIEF: round = A_DEXTERITY;
390: when C_ASSASIN: round = A_DEXTERITY;
391: when C_MONK: round = A_DEXTERITY;
392: }
393:
394: do {
395: wclear(hw);
396:
397: /* If there is any news, display it */
398: if (rogue_news) {
399: register int i;
400:
401: /* Print a separator line */
402: wmove(hw, 12, 0);
403: for (i=0; i<cols; i++) waddch(hw, '-');
404:
405: /* Print the news */
406: mvwaddstr(hw, 14, 0, rogue_news);
407: }
408:
409: stat_total = MAXSTATS;
410: do_escape = FALSE; /* No escape seen yet */
411:
412: /* Initialize abilities */
413: pstats.s_intel = 0;
414: pstats.s_str = 0;
415: pstats.s_wisdom = 0;
416: pstats.s_dext = 0;
417: pstats.s_const = 0;
418: pstats.s_charisma = 0;
419:
420: /* Initialize pointer into abilities */
421: our_stats[A_INTELLIGENCE] = &pstats.s_intel;
422: our_stats[A_STRENGTH] = &pstats.s_str;
423: our_stats[A_WISDOM] = &pstats.s_wisdom;
424: our_stats[A_DEXTERITY] = &pstats.s_dext;
425: our_stats[A_CONSTITUTION] = &pstats.s_const;
426:
427: /* Let player distribute attributes */
428: for (i=0; i<NUMABILITIES-1; i++) {
429: wmove(hw, 2, 0);
430: wprintw(hw, "You are creating a %s with %2d attribute points.",
431: char_class[player.t_ctype].name, stat_total);
432:
433: /*
434: * Player must have a minimum of 7 in any attribute and 11 in
435: * the player's primary attribute.
436: */
437: minimum = (round == i ? 11 : 7);
438:
439: /* Subtract out remaining minimums */
440: maximum = stat_total - (7 * (NUMABILITIES-1 - i));
441:
442: /* Subtract out remainder of profession minimum (11 - 7) */
443: if (round > i) maximum -= 4;
444:
445: /* Maximum can't be greater than 18 */
446: if (maximum > 18) maximum = 18;
447:
448: wmove(hw, 4, 0);
449: wprintw(hw,
450: "Minimum: %2d; Maximum: %2d (%s corrects previous entry)",
451: minimum, maximum, unctrl('\b'));
452:
453: wmove(hw, 6, 0);
454: wprintw(hw, " Int: %-2d", pstats.s_intel);
455: wprintw(hw, " Str: %-2d", pstats.s_str);
456: wprintw(hw, " Wis: %-2d", pstats.s_wisdom);
457: wprintw(hw, " Dex: %-2d", pstats.s_dext);
458: wprintw(hw, " Con: %-2d", pstats.s_const);
459: wprintw(hw, " Cha: %-2d", pstats.s_charisma);
460: wclrtoeol(hw);
461: wmove(hw, 6, 11*i + 9);
462: if (do_escape == FALSE) draw(hw);
463:
464: /* Get player's input */
465: if (do_escape || maximum == minimum) {
466: *our_stats[i] = maximum;
467: stat_total -= maximum;
468: }
469: else for (;;) {
470: ch = wgetch(hw);
471: if (ch == '\b') { /* Backspace */
472: if (i == 0) continue; /* Can't move back */
473: else {
474: stat_total += *our_stats[i-1];
475: *our_stats[i] = 0;
476: *our_stats[i-1] = 0;
477: i -= 2; /* Back out */
478: break;
479: }
480: }
481: if (ch == '\033') { /* Escape */
482: /*
483: * Escape will result in using all maximums for
484: * remaining abilities.
485: */
486: do_escape = TRUE;
487: *our_stats[i] = maximum;
488: stat_total -= maximum;
489: break;
490: }
491:
492: /* Do we have a legal digit? */
493: if (ch >= '0' && ch <= '9') {
494: ch -= '0'; /* Convert it to a number */
495: *our_stats[i] = 10 * *our_stats[i] + ch;
496:
497: /* Is the number in range? */
498: if (*our_stats[i] >= minimum &&
499: *our_stats[i] <= maximum) {
500: stat_total -= *our_stats[i];
501: break;
502: }
503:
504: /*
505: * If it's too small, get more - 1x is the only
506: * allowable case.
507: */
508: if (*our_stats[i] < minimum && *our_stats[i] == 1) {
509: /* Print the player's one */
510: waddch(hw, '1');
511: draw(hw);
512: continue;
513: }
514: }
515:
516: /* Error condition */
517: putchar('\007');
518: *our_stats[i] = 0;
519: i--; /* Rewind */
520: break;
521: }
522: }
523:
524: /* Discard extra points over 18 */
525: if (stat_total > 18) stat_total = 18;
526:
527: /* Charisma gets what's left */
528: pstats.s_charisma = stat_total;
529:
530: /* Intialize constants */
531: pstats.s_lvl = 1;
532: pstats.s_lvladj = 0;
533: pstats.s_exp = 0L;
534: strncpy(pstats.s_dmg, "1d4", sizeof(pstats.s_dmg));
535: pstats.s_carry = totalenc(&player);
536:
537: /* Get the hit points. */
538: pstats.s_hpt = 12 + const_bonus(); /* Base plus bonus */
539:
540: /* Add in the component that varies according to class */
541: pstats.s_hpt += char_class[player.t_ctype].hit_pts;
542:
543: /* Display the character */
544: wmove(hw, 2, 0);
545: wprintw(hw,"You are creating a %s.",
546: char_class[player.t_ctype].name);
547: wclrtoeol(hw);
548:
549: /* Get rid of max/min line */
550: wmove(hw, 4, 0);
551: wclrtoeol(hw);
552:
553: wmove(hw, 6, 0);
554: wprintw(hw, " Int: %2d", pstats.s_intel);
555: wprintw(hw, " Str: %2d", pstats.s_str);
556: wprintw(hw, " Wis: %2d", pstats.s_wisdom);
557: wprintw(hw, " Dex: %2d", pstats.s_dext);
558: wprintw(hw, " Con: %2d", pstats.s_const);
559: wprintw(hw, " Cha: %2d", pstats.s_charisma);
560: wclrtoeol(hw);
561:
562: wmove(hw, 8, 0);
563: wprintw(hw, " Hp: %2d", pstats.s_hpt);
564: wclrtoeol(hw);
565:
566: wmove(hw, 10, 0);
567: wprintw(hw, " Gold: %d", purse);
568:
569: mvwaddstr(hw, 0, 0, "Is this character okay? ");
570: draw(hw);
571: } while(wgetch(hw) != 'y');
572: }
573:
574: pstats.s_arm = 10;
575: max_stats = pstats;
576:
577: /* Set up the initial movement rate */
578: player.t_action = A_NIL;
579: player.t_movement = 6;
580: player.t_no_move = 0;
581: player.t_using = NULL;
582: }
583:
584:
585:
586:
587:
588:
589: /*
590: * init_stones:
591: * Initialize the ring stone setting scheme for this time
592: */
593:
594: void
595: init_stones(void)
596: {
597: register int i, j;
598:
599: for (i = 0; i < NSTONES; i++)
600: used[i] = FALSE;
601:
602: for (i = 0 ; i < MAXRINGS ; i++)
603: {
604: do
605: j = rnd(NSTONES);
606: until (!used[j]);
607: used[j] = TRUE;
608: r_stones[i] = stones[j];
609: r_know[i] = FALSE;
610: r_guess[i] = NULL;
611: if (i > 0)
612: r_magic[i].mi_prob += r_magic[i-1].mi_prob;
613: }
614: badcheck("rings", r_magic, MAXRINGS);
615: }
616:
617: /*
618: * init_things
619: * Initialize the probabilities for types of things
620: */
621: void
622: init_things(void)
623: {
624: register struct magic_item *mp;
625:
626: for (mp = &things[1] ; mp < &things[NUMTHINGS] ; mp++)
627: mp->mi_prob += (mp-1)->mi_prob;
628: badcheck("things", things, NUMTHINGS);
629: }
630:
631:
CVSweb