|
|
1.1 root 1: /*
2: * global variable initializaton
3: *
4: * @(#)init.c 3.33 (Berkeley) 6/15/81
5: */
6:
7: #include <curses.h>
8: #include <ctype.h>
9: #include "rogue.h"
10:
11: bool playing = TRUE, running = FALSE, wizard = FALSE;
12: bool notify = TRUE, fight_flush = FALSE, terse = FALSE, door_stop = FALSE;
13: bool jump = FALSE, slow_invent = FALSE, firstmove = FALSE, askme = FALSE;
14: bool amulet = FALSE, in_shell = FALSE;
15: struct linked_list *lvl_obj = NULL, *mlist = NULL;
16: struct object *cur_weapon = NULL;
17: int mpos = 0, no_move = 0, no_command = 0, level = 1, purse = 0, inpack = 0;
18: int total = 0, no_food = 0, count = 0, fung_hit = 0, quiet = 0;
19: int food_left = HUNGERTIME, group = 1, hungry_state = 0;
20: int lastscore = -1;
21:
22: #define ___ 1
23: #define _x {1,1}
24: struct monster monsters[26] = {
25: /* Name CARRY FLAG str, exp, lvl, amr, hpt, dmg */
26: { "giant ant", 0, ISMEAN, { _x, 10, 2, 3, ___, "1d6" } },
27: { "bat", 0, 0, { _x, 1, 1, 3, ___, "1d2" } },
28: { "centaur", 15, 0, { _x, 15, 4, 4, ___, "1d6/1d6" } },
29: { "dragon", 100, ISGREED,{ _x,9000, 10, -1, ___, "1d8/1d8/3d10" } },
30: { "floating eye",0, 0, { _x, 5, 1, 9, ___, "0d0" } },
31: { "violet fungi",0, ISMEAN, { _x, 85, 8, 3, ___, "000d0" } },
32: { "gnome", 10, 0, { _x, 8, 1, 5, ___, "1d6" } },
33: { "hobgoblin", 0, ISMEAN, { _x, 3, 1, 5, ___, "1d8" } },
34: { "invisible stalker",0,ISINVIS,{ _x,120, 8, 3, ___, "4d4" } },
35: { "jackal", 0, ISMEAN, { _x, 2, 1, 7, ___, "1d2" } },
36: { "kobold", 0, ISMEAN, { _x, 1, 1, 7, ___, "1d4" } },
37: { "leprechaun", 0, 0, { _x, 10, 3, 8, ___, "1d1" } },
38: { "mimic", 30, 0, { _x,140, 7, 7, ___, "3d4" } },
39: { "nymph", 100, 0, { _x, 40, 3, 9, ___, "0d0" } },
40: { "orc", 15, ISBLOCK,{ _x, 5, 1, 6, ___, "1d8" } },
41: { "purple worm", 70, 0, { _x,7000, 15, 6, ___, "2d12/2d4" } },
42: { "quasit", 30, ISMEAN, { _x, 35, 3, 2, ___, "1d2/1d2/1d4" } },
43: { "rust monster",0, ISMEAN, { _x, 25, 5, 2, ___, "0d0/0d0" } },
44: { "snake", 0, ISMEAN, { _x, 3, 1, 5, ___, "1d3" } },
45: { "troll", 50, ISREGEN|ISMEAN,{ _x, 55, 6, 4, ___, "1d8/1d8/2d6" } },
46: { "umber hulk", 40, ISMEAN, { _x,130, 8, 2, ___, "3d4/3d4/2d5" } },
47: { "vampire", 20, ISREGEN|ISMEAN,{ _x,380, 8, 1, ___, "1d10" } },
48: { "wraith", 0, 0, { _x, 55, 5, 4, ___, "1d6" } },
49: { "xorn", 0, ISMEAN, { _x,120, 7, -2, ___, "1d3/1d3/1d3/4d6" } },
50: { "yeti", 30, 0, { _x, 50, 4, 6, ___, "1d6/1d6" } },
51: { "zombie", 0, ISMEAN, { _x, 7, 2, 8, ___, "1d8" } }
52: };
53: #undef ___
54:
55: /*
56: * init_player:
57: * roll up the rogue
58: */
59:
60: init_player()
61: {
62: pstats.s_lvl = 1;
63: pstats.s_exp = 0L;
64: max_hp = pstats.s_hpt = 12;
65: pstats.s_str.st_str = 17;
66: pstats.s_str.st_add = 0;
67: pstats.s_dmg = "1d4";
68: pstats.s_arm = 10;
69: max_stats = pstats;
70: pack = NULL;
71: }
72:
73: /*
74: * Contains defintions and functions for dealing with things like
75: * potions and scrolls
76: */
77:
78: static char *rainbow[] = {
79: "Red",
80: "Blue",
81: "Green",
82: "Yellow",
83: "Black",
84: "Brown",
85: "Orange",
86: "Pink",
87: "Purple",
88: "Grey",
89: "White",
90: "Silver",
91: "Gold",
92: "Violet",
93: "Clear",
94: "Vermilion",
95: "Ecru",
96: "Turquoise",
97: "Magenta",
98: "Amber",
99: "Topaz",
100: "Plaid",
101: "Tan",
102: "Tangerine"
103: };
104:
105: #define NCOLORS (sizeof rainbow / sizeof (char *))
106:
107: static char *sylls[] = {
108: "a", "ab", "ag", "aks", "ala", "an", "ankh", "app", "arg", "arze",
109: "ash", "ban", "bar", "bat", "bek", "bie", "bin", "bit", "bjor",
110: "blu", "bot", "bu", "byt", "comp", "con", "cos", "cre", "dalf",
111: "dan", "den", "do", "e", "eep", "el", "eng", "er", "ere", "erk",
112: "esh", "evs", "fa", "fid", "for", "fri", "fu", "gan", "gar",
113: "glen", "gop", "gre", "ha", "he", "hyd", "i", "ing", "ion", "ip",
114: "ish", "it", "ite", "iv", "jo", "kho", "kli", "klis", "la", "lech",
115: "man", "mar", "me", "mi", "mic", "mik", "mon", "mung", "mur",
116: "nej", "nelg", "nep", "ner", "nes", "nes", "nih", "nin", "o", "od",
117: "ood", "org", "orn", "ox", "oxy", "pay", "pet", "ple", "plu", "po",
118: "pot", "prok", "re", "rea", "rhov", "ri", "ro", "rog", "rok", "rol",
119: "sa", "san", "sat", "see", "sef", "seh", "shu", "ski", "sna",
120: "sne", "snik", "sno", "so", "sol", "sri", "sta", "sun", "ta",
121: "tab", "tem", "ther", "ti", "tox", "trol", "tue", "turs", "u",
122: "ulk", "um", "un", "uni", "ur", "val", "viv", "vly", "vom", "wah",
123: "wed", "werg", "wex", "whon", "wun", "xo", "y", "yot", "yu",
124: "zant", "zap", "zeb", "zim", "zok", "zon", "zum",
125: };
126:
127: static char *stones[] = {
128: "Agate",
129: "Alexandrite",
130: "Amethyst",
131: "Carnelian",
132: "Diamond",
133: "Emerald",
134: "Granite",
135: "Jade",
136: "Kryptonite",
137: "Lapus lazuli",
138: "Moonstone",
139: "Obsidian",
140: "Onyx",
141: "Opal",
142: "Pearl",
143: "Ruby",
144: "Saphire",
145: "Tiger eye",
146: "Topaz",
147: "Turquoise",
148: };
149:
150: #define NSTONES (sizeof stones / sizeof (char *))
151:
152: static char *wood[] = {
153: "Avocado wood",
154: "Balsa",
155: "Banyan",
156: "Birch",
157: "Cedar",
158: "Cherry",
159: "Cinnibar",
160: "Driftwood",
161: "Ebony",
162: "Eucalyptus",
163: "Hemlock",
164: "Ironwood",
165: "Mahogany",
166: "Manzanita",
167: "Maple",
168: "Oak",
169: "Persimmon wood",
170: "Redwood",
171: "Rosewood",
172: "Teak",
173: "Walnut",
174: "Zebra wood",
175: };
176:
177: #define NWOOD (sizeof wood / sizeof (char *))
178:
179: static char *metal[] = {
180: "Aluminium",
181: "Bone",
182: "Brass",
183: "Bronze",
184: "Copper",
185: "Iron",
186: "Lead",
187: "Pewter",
188: "Steel",
189: "Tin",
190: "Zinc",
191: };
192:
193: #define NMETAL (sizeof metal / sizeof (char *))
194:
195: struct magic_item things[NUMTHINGS] = {
196: { 0, 27 }, /* potion */
197: { 0, 27 }, /* scroll */
198: { 0, 18 }, /* food */
199: { 0, 9 }, /* weapon */
200: { 0, 9 }, /* armor */
201: { 0, 5 }, /* ring */
202: { 0, 5 }, /* stick */
203: };
204:
205: struct magic_item s_magic[MAXSCROLLS] = {
206: { "monster confusion", 8, 170 },
207: { "magic mapping", 5, 180 },
208: { "light", 10, 100 },
209: { "hold monster", 2, 200 },
210: { "sleep", 5, 50 },
211: { "enchant armor", 8, 130 },
212: { "identify", 21, 100 },
213: { "scare monster", 4, 180 },
214: { "gold detection", 4, 110 },
215: { "teleportation", 7, 175 },
216: { "enchant weapon", 10, 150 },
217: { "create monster", 5, 75 },
218: { "remove curse", 8, 105 },
219: { "aggravate monsters", 1, 60 },
220: { "blank paper", 1, 50 },
221: { "genocide", 1, 200 },
222: };
223:
224: struct magic_item p_magic[MAXPOTIONS] = {
225: { "confusion", 8, 50 },
226: { "paralysis", 10, 50 },
227: { "poison", 8, 50 },
228: { "gain strength", 15, 150 },
229: { "see invisible", 2, 170 },
230: { "healing", 15, 130 },
231: { "monster detection", 6, 120 },
232: { "magic detection", 6, 105 },
233: { "raise level", 2, 220 },
234: { "extra healing", 5, 180 },
235: { "haste self", 4, 200 },
236: { "restore strength", 14, 120 },
237: { "blindness", 4, 50 },
238: { "thirst quenching", 1, 50 },
239: };
240:
241: struct magic_item r_magic[MAXRINGS] = {
242: { "protection", 9, 200 },
243: { "add strength", 9, 200 },
244: { "sustain strength", 5, 180 },
245: { "searching", 10, 200 },
246: { "see invisible", 10, 175 },
247: { "adornment", 1, 100 },
248: { "aggravate monster", 11, 100 },
249: { "dexterity", 8, 220 },
250: { "increase damage", 8, 220 },
251: { "regeneration", 4, 260 },
252: { "slow digestion", 9, 240 },
253: { "telportation", 9, 100 },
254: { "stealth", 7, 100 },
255: };
256:
257: struct magic_item ws_magic[MAXSTICKS] = {
258: { "light", 12, 120 },
259: { "striking", 9, 115 },
260: { "lightning", 3, 200 },
261: { "fire", 3, 200 },
262: { "cold", 3, 200 },
263: { "polymorph", 15, 210 },
264: { "magic missile", 10, 170 },
265: { "haste monster", 9, 50 },
266: { "slow monster", 11, 220 },
267: { "drain life", 9, 210 },
268: { "nothing", 1, 70 },
269: { "teleport away", 5, 140 },
270: { "teleport to", 5, 60 },
271: { "cancellation", 5, 130 },
272: };
273:
274: int a_class[MAXARMORS] = {
275: 8,
276: 7,
277: 7,
278: 6,
279: 5,
280: 4,
281: 4,
282: 3,
283: };
284:
285: char *a_names[MAXARMORS] = {
286: "leather armor",
287: "ring mail",
288: "studded leather armor",
289: "scale mail",
290: "chain mail",
291: "splint mail",
292: "banded mail",
293: "plate mail",
294: };
295:
296: int a_chances[MAXARMORS] = {
297: 20,
298: 35,
299: 50,
300: 63,
301: 75,
302: 85,
303: 95,
304: 100
305: };
306:
307: /*
308: * init_things
309: * Initialize the probabilities for types of things
310: */
311: init_things()
312: {
313: register struct magic_item *mp;
314:
315: for (mp = &things[1]; mp < &things[NUMTHINGS]; mp++)
316: mp->mi_prob += (mp-1)->mi_prob;
317: badcheck("things", things, NUMTHINGS);
318: }
319:
320: /*
321: * init_colors:
322: * Initialize the potion color scheme for this time
323: */
324:
325: init_colors()
326: {
327: register int i;
328: register char *str;
329:
330: for (i = 0; i < MAXPOTIONS; i++)
331: {
332: do
333: str = rainbow[rnd(NCOLORS)];
334: until (isupper(*str));
335: *str = tolower(*str);
336: p_colors[i] = str;
337: p_know[i] = FALSE;
338: p_guess[i] = NULL;
339: if (i > 0)
340: p_magic[i].mi_prob += p_magic[i-1].mi_prob;
341: }
342: badcheck("potions", p_magic, MAXPOTIONS);
343: }
344:
345: /*
346: * init_names:
347: * Generate the names of the various scrolls
348: */
349:
350: init_names()
351: {
352: register int nsyl;
353: register char *cp, *sp;
354: register int i, nwords;
355:
356: for (i = 0; i < MAXSCROLLS; i++)
357: {
358: cp = prbuf;
359: nwords = rnd(4)+2;
360: while(nwords--)
361: {
362: nsyl = rnd(3)+1;
363: while(nsyl--)
364: {
365: sp = sylls[rnd((sizeof sylls) / (sizeof (char *)))];
366: while(*sp)
367: *cp++ = *sp++;
368: }
369: *cp++ = ' ';
370: }
371: *--cp = '\0';
372: s_names[i] = (char *) new(strlen(prbuf)+1);
373: s_know[i] = FALSE;
374: s_guess[i] = NULL;
375: strcpy(s_names[i], prbuf);
376: if (i > 0)
377: s_magic[i].mi_prob += s_magic[i-1].mi_prob;
378: }
379: badcheck("scrolls", s_magic, MAXSCROLLS);
380: }
381:
382: /*
383: * init_stones:
384: * Initialize the ring stone setting scheme for this time
385: */
386:
387: init_stones()
388: {
389: register int i;
390: register char *str;
391:
392: for (i = 0; i < MAXRINGS; i++)
393: {
394: do
395: str = stones[rnd(NSTONES)];
396: until (isupper(*str));
397: *str = tolower(*str);
398: r_stones[i] = str;
399: r_know[i] = FALSE;
400: r_guess[i] = NULL;
401: if (i > 0)
402: r_magic[i].mi_prob += r_magic[i-1].mi_prob;
403: }
404: badcheck("rings", r_magic, MAXRINGS);
405: }
406:
407: /*
408: * init_materials:
409: * Initialize the construction materials for wands and staffs
410: */
411:
412: init_materials()
413: {
414: register int i;
415: register char *str;
416:
417: for (i = 0; i < MAXSTICKS; i++)
418: {
419: do
420: if (rnd(100) > 50)
421: {
422: str = metal[rnd(NMETAL)];
423: if (isupper(*str))
424: ws_type[i] = "wand";
425: }
426: else
427: {
428: str = wood[rnd(NWOOD)];
429: if (isupper(*str))
430: ws_type[i] = "staff";
431: }
432: until (isupper(*str));
433: *str = tolower(*str);
434: ws_made[i] = str;
435: ws_know[i] = FALSE;
436: ws_guess[i] = NULL;
437: if (i > 0)
438: ws_magic[i].mi_prob += ws_magic[i-1].mi_prob;
439: }
440: badcheck("sticks", ws_magic, MAXSTICKS);
441: }
442:
443: badcheck(name, magic, bound)
444: char *name;
445: register struct magic_item *magic;
446: register int bound;
447: {
448: register struct magic_item *end;
449:
450: if (magic[bound - 1].mi_prob == 100)
451: return;
452: printf("\nBad percentages for %s:\n", name);
453: for (end = &magic[bound]; magic < end; magic++)
454: printf("%3d%% %s\n", magic->mi_prob, magic->mi_name);
455: printf("[hit RETURN to continue]");
456: fflush(stdout);
457: while (getchar() != '\n')
458: continue;
459: }
460:
461: struct h_list helpstr[] = {
462: '?', " prints help",
463: '/', " identify object",
464: 'h', " left",
465: 'j', " down",
466: 'k', " up",
467: 'l', " right",
468: 'y', " up & left",
469: 'u', " up & right",
470: 'b', " down & left",
471: 'n', " down & right",
472: 'H', " run left",
473: 'J', " run down",
474: 'K', " run up",
475: 'L', " run right",
476: 'Y', " run up & left",
477: 'U', " run up & right",
478: 'B', " run down & left",
479: 'N', " run down & right",
480: 't', "<dir> throw something",
481: 'f', "<dir> forward until find something",
482: 'p', "<dir> zap a wand in a direction",
483: 'z', " zap a wand or staff",
484: '>', " go down a staircase",
485: 's', " search for trap/secret door",
486: ' ', " (space) rest for a while",
487: 'i', " inventory",
488: 'I', " inventory single item",
489: 'q', " quaff potion",
490: 'r', " read paper",
491: 'e', " eat food",
492: 'w', " wield a weapon",
493: 'W', " wear armor",
494: 'T', " take armor off",
495: 'P', " put on ring",
496: 'R', " remove ring",
497: 'd', " drop object",
498: 'c', " call object",
499: 'o', " examine/set options",
500: CTRL(L), " redraw screen",
501: CTRL(R), " repeat last message",
502: ESCAPE, " cancel command",
503: 'v', " print program version number",
504: '!', " shell escape",
505: 'S', " save game",
506: 'Q', " quit",
507: 0, 0
508: };
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.