Mercurial > hg > early-roguelike
comparison srogue/init.c @ 36:2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
author | elwin |
---|---|
date | Thu, 25 Nov 2010 12:21:41 +0000 |
parents | |
children | 3aa87373c908 |
comparison
equal
deleted
inserted
replaced
35:05018c63a721 | 36:2128c7dc8a40 |
---|---|
1 /* | |
2 * initializate various things | |
3 * | |
4 * @(#)init.c 9.0 (rdk) 7/17/84 | |
5 * | |
6 * Super-Rogue | |
7 * Copyright (C) 1984 Robert D. Kindelberger | |
8 * All rights reserved. | |
9 * | |
10 * Based on "Rogue: Exploring the Dungeons of Doom" | |
11 * Copyright (C) 1980, 1981 Michael Toy, Ken Arnold and Glenn Wichman | |
12 * All rights reserved. | |
13 * | |
14 * See the file LICENSE.TXT for full copyright and licensing information. | |
15 */ | |
16 | |
17 #include <ctype.h> | |
18 #include "rogue.h" | |
19 #include "rogue.ext" | |
20 | |
21 char *rainbow[NCOLORS] = { | |
22 "Red", "Blue", "Green", "Yellow", | |
23 "Black", "Brown", "Orange", "Pink", | |
24 "Purple", "Grey", "White", "Silver", | |
25 "Gold", "Violet", "Clear", "Vermilion", | |
26 "Ecru", "Turquoise","Magenta", "Amber", | |
27 "Topaz", "Plaid", "Tan", "Tangerine", | |
28 "Aquamarine", "Scarlet","Khaki", "Crimson", | |
29 "Indigo", "Beige", "Lavender", "Saffron", | |
30 }; | |
31 | |
32 char *sylls[NSYLS] = { | |
33 "a", "ab", "ag", "aks", "ala", "an", "ankh", "app", "arg", "arze", | |
34 "ash", "ban", "bar", "bat", "bek", "bie", "bin", "bit", "bjor", | |
35 "blu", "bot", "bu", "byt", "comp", "con", "cos", "cre", "dalf", | |
36 "dan", "den", "do", "e", "eep", "el", "eng", "er", "ere", "erk", | |
37 "esh", "evs", "fa", "fid", "for", "fri", "fu", "gan", "gar", | |
38 "glen", "gop", "gre", "ha", "he", "hyd", "i", "ing", "ion", "ip", | |
39 "ish", "it", "ite", "iv", "jo", "kho", "kli", "klis", "la", "lech", | |
40 "man", "mar", "me", "mi", "mic", "mik", "mon", "mung", "mur", | |
41 "nej", "nelg", "nep", "ner", "nes", "nes", "nih", "nin", "o", "od", | |
42 "ood", "org", "orn", "ox", "oxy", "pay", "pet", "ple", "plu", "po", | |
43 "pot","prok","re", "rea", "rhov", "ri", "ro", "rog", "rok", "rol", | |
44 "sa", "san", "sat", "see", "sef", "seh", "shu", "ski", "sna", | |
45 "sne", "snik", "sno", "so", "sol", "sri", "sta", "sun", "ta", | |
46 "tab", "tem", "ther", "ti", "tox", "trol", "tue", "turs", "u", | |
47 "ulk", "um", "un", "uni", "ur", "val", "viv", "vly", "vom", "wah", | |
48 "wed", "werg", "wex", "whon", "wun", "xo", "y", "yot", "yu", | |
49 "zant", "zap", "zeb", "zim", "zok", "zon", "zum", | |
50 }; | |
51 | |
52 char *stones[] = { | |
53 "Agate", "Alexandrite", "Amethyst", | |
54 "Azurite", "Carnelian", "Chrysoberyl", | |
55 "Chrysoprase", "Citrine", "Diamond", | |
56 "Emerald", "Garnet", "Hematite", | |
57 "Jacinth", "Jade", "Kryptonite", | |
58 "Lapus lazuli", "Malachite", "Moonstone", | |
59 "Obsidian", "Olivine", "Onyx", | |
60 "Opal", "Pearl", "Peridot", | |
61 "Quartz", "Rhodochrosite","Ruby", | |
62 "Sapphire", "Sardonyx", "Serpintine", | |
63 "Spinel", "Tiger eye", "Topaz", | |
64 "Tourmaline", "Turquoise", | |
65 }; | |
66 | |
67 char *wood[NWOOD] = { | |
68 "Avocado wood", "Balsa", "Banyan", "Birch", | |
69 "Cedar", "Cherry", "Cinnibar", "Dogwood", | |
70 "Driftwood", "Ebony", "Eucalyptus", "Hemlock", | |
71 "Ironwood", "Mahogany", "Manzanita", "Maple", | |
72 "Oak", "Pine", "Redwood", "Rosewood", | |
73 "Teak", "Walnut", "Zebra wood", "Persimmon wood", | |
74 }; | |
75 | |
76 char *metal[NMETAL] = { | |
77 "Aluminium", "Bone", "Brass", "Bronze", | |
78 "Copper", "Chromium", "Iron", "Lead", | |
79 "Magnesium", "Pewter", "Platinum", "Steel", | |
80 "Tin", "Titanium", "Zinc", | |
81 }; | |
82 | |
83 /* | |
84 * init_everything: | |
85 * Set up all important stuff. | |
86 */ | |
87 init_everything() | |
88 { | |
89 init_player(); /* Roll up the rogue */ | |
90 init_things(); /* Set up probabilities */ | |
91 init_names(); /* Set up names of scrolls */ | |
92 init_colors(); /* Set up colors of potions */ | |
93 init_stones(); /* Set up stones in rings */ | |
94 init_materials(); /* Set up materials of wands */ | |
95 } | |
96 | |
97 /* | |
98 * init_things: | |
99 * Initialize the probabilities for types of things | |
100 */ | |
101 init_things() | |
102 { | |
103 struct magic_item *mi; | |
104 | |
105 /* | |
106 * init general things | |
107 */ | |
108 for (mi = &things[1]; mi < &things[NUMTHINGS]; mi++) | |
109 mi->mi_prob += (mi-1)->mi_prob; | |
110 badcheck("things", things); | |
111 /* | |
112 * init armor things | |
113 */ | |
114 for (mi = &a_magic[1]; mi < &a_magic[MAXARMORS]; mi++) | |
115 mi->mi_prob += (mi-1)->mi_prob; | |
116 badcheck("armor", a_magic); | |
117 /* | |
118 * init weapon stuff | |
119 */ | |
120 for (mi = &w_magic[1]; mi < &w_magic[MAXWEAPONS]; mi++) | |
121 mi->mi_prob += (mi-1)->mi_prob; | |
122 badcheck("weapon", w_magic); | |
123 } | |
124 | |
125 | |
126 /* | |
127 * init_colors: | |
128 * Initialize the potion color scheme for this time | |
129 */ | |
130 init_colors() | |
131 { | |
132 reg int i, j; | |
133 reg char *str; | |
134 bool used[NCOLORS]; | |
135 | |
136 for (i = 0; i < NCOLORS; i++) | |
137 used[i] = FALSE; | |
138 for (i = 0; i < MAXPOTIONS; i++) { | |
139 do { | |
140 j = rnd(NCOLORS); | |
141 } until (!used[j]); | |
142 used[j] = TRUE; | |
143 p_colors[i] = rainbow[j]; | |
144 p_know[i] = FALSE; | |
145 p_guess[i] = NULL; | |
146 if (i > 0) | |
147 p_magic[i].mi_prob += p_magic[i-1].mi_prob; | |
148 } | |
149 badcheck("potions", p_magic); | |
150 } | |
151 | |
152 | |
153 /* | |
154 * init_names: | |
155 * Generate the names of the various scrolls | |
156 */ | |
157 init_names() | |
158 { | |
159 reg int nsyl; | |
160 reg char *cp, *sp; | |
161 reg int i, nwords; | |
162 | |
163 for (i = 0; i < MAXSCROLLS; i++) { | |
164 cp = prbuf; | |
165 nwords = rnd(3)+1; | |
166 while(nwords--) { | |
167 nsyl = rnd(3)+2; | |
168 while(nsyl--) { | |
169 sp = sylls[rnd(NSYLS)]; | |
170 while(*sp) | |
171 *cp++ = *sp++; | |
172 } | |
173 *cp++ = ' '; | |
174 } | |
175 *--cp = '\0'; | |
176 s_names[i] = new(strlen(prbuf)+1); | |
177 s_know[i] = FALSE; | |
178 s_guess[i] = NULL; | |
179 strcpy(s_names[i], prbuf); | |
180 if (i > 0) | |
181 s_magic[i].mi_prob += s_magic[i-1].mi_prob; | |
182 } | |
183 badcheck("scrolls", s_magic); | |
184 } | |
185 | |
186 /* | |
187 * init_stones: | |
188 * Initialize the ring stone setting scheme for this time | |
189 */ | |
190 | |
191 init_stones() | |
192 { | |
193 reg int i, j; | |
194 reg char *str; | |
195 bool used[NSTONES]; | |
196 | |
197 for (i = 0; i < NSTONES; i++) | |
198 used[i] = FALSE; | |
199 | |
200 for (i = 0; i < MAXRINGS; i++) { | |
201 do { | |
202 j = rnd(NSTONES); | |
203 } until (!used[j]); | |
204 used[j] = TRUE; | |
205 r_stones[i] = stones[j]; | |
206 r_know[i] = FALSE; | |
207 r_guess[i] = NULL; | |
208 if (i > 0) | |
209 r_magic[i].mi_prob += r_magic[i-1].mi_prob; | |
210 } | |
211 badcheck("rings", r_magic); | |
212 } | |
213 | |
214 /* | |
215 * init_materials: | |
216 * Initialize the construction materials for wands and staffs | |
217 */ | |
218 | |
219 init_materials() | |
220 { | |
221 int i, j; | |
222 char *str; | |
223 struct rod *rd; | |
224 bool metused[NMETAL], woodused[NWOOD]; | |
225 | |
226 for (i = 0; i < NWOOD; i++) | |
227 woodused[i] = FALSE; | |
228 for (i = 0; i < NMETAL; i++) | |
229 metused[i] = FALSE; | |
230 | |
231 for (i = 0; i < MAXSTICKS; i++) { | |
232 rd = &ws_stuff[i]; | |
233 for (;;) { | |
234 if (rnd(100) > 50) { | |
235 j = rnd(NMETAL); | |
236 if (!metused[j]) { | |
237 str = metal[j]; | |
238 rd->ws_type = "wand"; | |
239 rd->ws_vol = V_WS_WAND; | |
240 rd->ws_wght = W_WS_WAND; | |
241 metused[j] = TRUE; | |
242 break; | |
243 } | |
244 } | |
245 else { | |
246 j = rnd(NWOOD); | |
247 if (!woodused[j]) { | |
248 str = wood[j]; | |
249 rd->ws_type = "staff"; | |
250 rd->ws_vol = V_WS_STAFF; | |
251 rd->ws_wght = W_WS_WAND; | |
252 woodused[j] = TRUE; | |
253 break; | |
254 } | |
255 } | |
256 } | |
257 ws_stuff[i].ws_made = str; | |
258 ws_know[i] = FALSE; | |
259 ws_guess[i] = NULL; | |
260 if (i > 0) | |
261 ws_magic[i].mi_prob += ws_magic[i-1].mi_prob; | |
262 } | |
263 badcheck("sticks", ws_magic); | |
264 } | |
265 | |
266 badcheck(name, magic) | |
267 char *name; | |
268 struct magic_item *magic; | |
269 { | |
270 struct magic_item *mg; | |
271 | |
272 for (mg = magic; mg->mi_name != NULL; mg++) | |
273 ; | |
274 if ((mg - 1)->mi_prob == 1000) | |
275 return; | |
276 printf("\nBad percentages for %s:\n", name); | |
277 for (mg = magic; mg->mi_name != NULL; mg++) | |
278 printf("%4d%% %s\n", mg->mi_prob, mg->mi_name); | |
279 printf("%s", retstr); | |
280 fflush(stdout); | |
281 while (getchar() != '\n') | |
282 continue; | |
283 } | |
284 | |
285 | |
286 /* | |
287 * init_player: | |
288 * roll up the rogue | |
289 */ | |
290 | |
291 init_player() | |
292 { | |
293 player.t_nomove = 0; | |
294 player.t_nocmd = 0; | |
295 him = &player.t_stats; | |
296 him->s_lvl = 1; | |
297 him->s_exp = 0L; | |
298 him->s_maxhp = him->s_hpt = pinit(); /* hit points */ | |
299 him->s_re.a_str = pinit(); /* strength */ | |
300 him->s_re.a_dex = pinit(); /* dexterity */ | |
301 him->s_re.a_wis = pinit(); /* wisdom */ | |
302 him->s_re.a_con = pinit(); /* constitution */ | |
303 him->s_ef = him->s_re; /* effective = real */ | |
304 strcpy(him->s_dmg, "1d4"); | |
305 him->s_arm = NORMAC; | |
306 him->s_carry = totalenc(); | |
307 him->s_pack = 0; | |
308 pack = NULL; /* empty pack so far */ | |
309 max_stats = *him; | |
310 } | |
311 | |
312 | |
313 /* | |
314 * pinit: | |
315 * Returns the best 3 of 4 on a 6-sided die | |
316 */ | |
317 pinit() | |
318 { | |
319 int best[4]; | |
320 reg int i, min, minind, dicetot; | |
321 | |
322 for (i = 0 ; i < 4 ; i++) | |
323 best[i] = roll(1,6); /* populate array */ | |
324 min = best[0]; /* assume that 1st entry */ | |
325 minind = 0; /* is the lowest */ | |
326 for (i = 1 ; i < 4 ; i++) { /* find the lowest */ | |
327 if (best[i] < min) { /* if < minimum then update */ | |
328 min = best[i]; | |
329 minind = i; /* point to lowest value */ | |
330 } | |
331 } | |
332 dicetot = 0; /* start with nothing */ | |
333 for (i = 0 ; i < 4 ; i++) { | |
334 if (i != minind) /* if not minimum, then add it */ | |
335 dicetot += best[i]; | |
336 } | |
337 return(dicetot); | |
338 } |