comparison rogue5/init.c @ 33:f502bf60e6e4

Import Rogue 5.4 from the Roguelike Restoration Project (r1490)
author elwin
date Mon, 24 May 2010 20:10:59 +0000
parents
children
comparison
equal deleted inserted replaced
32:2dcd75e6a736 33:f502bf60e6e4
1 /*
2 * global variable initializaton
3 *
4 * @(#)init.c 4.31 (Berkeley) 02/05/99
5 *
6 * Rogue: Exploring the Dungeons of Doom
7 * Copyright (C) 1980-1983, 1985, 1999 Michael Toy, Ken Arnold and Glenn Wichman
8 * All rights reserved.
9 *
10 * See the file LICENSE.TXT for full copyright and licensing information.
11 */
12
13 #include <stdlib.h>
14 #include <curses.h>
15 #include <ctype.h>
16 #include <string.h>
17 #include "rogue.h"
18
19 /*
20 * init_player:
21 * Roll her up
22 */
23 void
24 init_player(void)
25 {
26 THING *obj;
27
28 pstats = max_stats;
29 food_left = HUNGERTIME;
30 /*
31 * Give him some food
32 */
33 obj = new_item();
34 obj->o_type = FOOD;
35 obj->o_count = 1;
36 add_pack(obj, TRUE);
37 /*
38 * And his suit of armor
39 */
40 obj = new_item();
41 obj->o_type = ARMOR;
42 obj->o_which = RING_MAIL;
43 obj->o_arm = a_class[RING_MAIL] - 1;
44 obj->o_flags |= ISKNOW;
45 obj->o_count = 1;
46 cur_armor = obj;
47 add_pack(obj, TRUE);
48 /*
49 * Give him his weaponry. First a mace.
50 */
51 obj = new_item();
52 init_weapon(obj, MACE);
53 obj->o_hplus = 1;
54 obj->o_dplus = 1;
55 obj->o_flags |= ISKNOW;
56 add_pack(obj, TRUE);
57 cur_weapon = obj;
58 /*
59 * Now a +1 bow
60 */
61 obj = new_item();
62 init_weapon(obj, BOW);
63 obj->o_hplus = 1;
64 obj->o_flags |= ISKNOW;
65 add_pack(obj, TRUE);
66 /*
67 * Now some arrows
68 */
69 obj = new_item();
70 init_weapon(obj, ARROW);
71 obj->o_count = rnd(15) + 25;
72 obj->o_flags |= ISKNOW;
73 add_pack(obj, TRUE);
74 }
75
76 /*
77 * Contains defintions and functions for dealing with things like
78 * potions and scrolls
79 */
80
81 const char *rainbow[] = {
82 "amber",
83 "aquamarine",
84 "black",
85 "blue",
86 "brown",
87 "clear",
88 "crimson",
89 "cyan",
90 "ecru",
91 "gold",
92 "green",
93 "grey",
94 "magenta",
95 "orange",
96 "pink",
97 "plaid",
98 "purple",
99 "red",
100 "silver",
101 "tan",
102 "tangerine",
103 "topaz",
104 "turquoise",
105 "vermilion",
106 "violet",
107 "white",
108 "yellow",
109 };
110
111 #define NCOLORS (sizeof rainbow / sizeof (char *))
112
113 static const char *sylls[] = {
114 "a", "ab", "ag", "aks", "ala", "an", "app", "arg", "arze", "ash",
115 "bek", "bie", "bit", "bjor", "blu", "bot", "bu", "byt", "comp",
116 "con", "cos", "cre", "dalf", "dan", "den", "do", "e", "eep", "el",
117 "eng", "er", "ere", "erk", "esh", "evs", "fa", "fid", "fri", "fu",
118 "gan", "gar", "glen", "gop", "gre", "ha", "hyd", "i", "ing", "ip",
119 "ish", "it", "ite", "iv", "jo", "kho", "kli", "klis", "la", "lech",
120 "mar", "me", "mi", "mic", "mik", "mon", "mung", "mur", "nej",
121 "nelg", "nep", "ner", "nes", "nes", "nih", "nin", "o", "od", "ood",
122 "org", "orn", "ox", "oxy", "pay", "ple", "plu", "po", "pot",
123 "prok", "re", "rea", "rhov", "ri", "ro", "rog", "rok", "rol", "sa",
124 "san", "sat", "sef", "seh", "shu", "ski", "sna", "sne", "snik",
125 "sno", "so", "sol", "sri", "sta", "sun", "ta", "tab", "tem",
126 "ther", "ti", "tox", "trol", "tue", "turs", "u", "ulk", "um", "un",
127 "uni", "ur", "val", "viv", "vly", "vom", "wah", "wed", "werg",
128 "wex", "whon", "wun", "xo", "y", "yot", "yu", "zant", "zeb", "zim",
129 "zok", "zon", "zum",
130 };
131
132 const STONE stones[] = {
133 { "agate", 25},
134 { "alexandrite", 40},
135 { "amethyst", 50},
136 { "carnelian", 40},
137 { "diamond", 300},
138 { "emerald", 300},
139 { "germanium", 225},
140 { "granite", 5},
141 { "garnet", 50},
142 { "jade", 150},
143 { "kryptonite", 300},
144 { "lapis lazuli", 50},
145 { "moonstone", 50},
146 { "obsidian", 15},
147 { "onyx", 60},
148 { "opal", 200},
149 { "pearl", 220},
150 { "peridot", 63},
151 { "ruby", 350},
152 { "sapphire", 285},
153 { "stibotantalite", 200},
154 { "tiger eye", 50},
155 { "topaz", 60},
156 { "turquoise", 70},
157 { "taaffeite", 300},
158 { "zircon", 80},
159 };
160
161 #define NSTONES (sizeof stones / sizeof (STONE))
162
163 const char *wood[] = {
164 "avocado wood",
165 "balsa",
166 "bamboo",
167 "banyan",
168 "birch",
169 "cedar",
170 "cherry",
171 "cinnibar",
172 "cypress",
173 "dogwood",
174 "driftwood",
175 "ebony",
176 "elm",
177 "eucalyptus",
178 "fall",
179 "hemlock",
180 "holly",
181 "ironwood",
182 "kukui wood",
183 "mahogany",
184 "manzanita",
185 "maple",
186 "oaken",
187 "persimmon wood",
188 "pecan",
189 "pine",
190 "poplar",
191 "redwood",
192 "rosewood",
193 "spruce",
194 "teak",
195 "walnut",
196 "zebrawood",
197 };
198
199 #define NWOOD (sizeof wood / sizeof (char *))
200
201 const char *metal[] = {
202 "aluminum",
203 "beryllium",
204 "bone",
205 "brass",
206 "bronze",
207 "copper",
208 "electrum",
209 "gold",
210 "iron",
211 "lead",
212 "magnesium",
213 "mercury",
214 "nickel",
215 "pewter",
216 "platinum",
217 "steel",
218 "silver",
219 "silicon",
220 "tin",
221 "titanium",
222 "tungsten",
223 "zinc",
224 };
225
226 #define NMETAL (sizeof metal / sizeof (char *))
227
228 int cNWOOD = NWOOD;
229 int cNMETAL = NMETAL;
230 int cNSTONES = NSTONES;
231 int cNCOLORS = NCOLORS;
232
233 /*
234 * init_colors:
235 * Initialize the potion color scheme for this time
236 */
237 void
238 init_colors(void)
239 {
240 int i, j;
241 int used[NCOLORS];
242
243 for (i = 0; i < NCOLORS; i++)
244 used[i] = FALSE;
245 for (i = 0; i < MAXPOTIONS; i++)
246 {
247 do
248 j = rnd(NCOLORS);
249 until (!used[j]);
250 used[j] = TRUE;
251 p_colors[i] = rainbow[j];
252 }
253 }
254
255 /*
256 * init_names:
257 * Generate the names of the various scrolls
258 */
259 #define MAXNAME 40 /* Max number of characters in a name */
260
261 void
262 init_names(void)
263 {
264 int nsyl;
265 const char *sp;
266 char *cp;
267 int i, nwords;
268
269 for (i = 0; i < MAXSCROLLS; i++)
270 {
271 cp = prbuf;
272 nwords = rnd(3) + 2;
273 while (nwords--)
274 {
275 nsyl = rnd(3) + 1;
276 while (nsyl--)
277 {
278 sp = sylls[rnd((sizeof sylls) / (sizeof (char *)))];
279 if (&cp[strlen(sp)] > &prbuf[MAXNAME])
280 break;
281 while (*sp)
282 *cp++ = *sp++;
283 }
284 *cp++ = ' ';
285 }
286 *--cp = '\0';
287 s_names[i] = malloc(strlen(prbuf)+1);
288 if (s_names[i] != NULL)
289 strcpy(s_names[i], prbuf);
290 }
291 }
292
293 /*
294 * init_stones:
295 * Initialize the ring stone setting scheme for this time
296 */
297 void
298 init_stones(void)
299 {
300 int used[NSTONES];
301 int i, j;
302
303 for (i = 0; i < NSTONES; i++)
304 used[i] = FALSE;
305 for (i = 0; i < MAXRINGS; i++)
306 {
307 do
308 j = rnd(NSTONES);
309 until (!used[j]);
310 used[j] = TRUE;
311 r_stones[i] = stones[j].st_name;
312 ring_info[i].oi_worth += stones[j].st_value;
313 }
314 }
315
316 /*
317 * init_materials:
318 * Initialize the construction materials for wands and staffs
319 */
320 void
321 init_materials(void)
322 {
323 int i, j;
324 const char *str;
325 int metused[NMETAL];
326 int used[NWOOD];
327
328 for (i = 0; i < NWOOD; i++)
329 used[i] = FALSE;
330 for (i = 0; i < NMETAL; i++)
331 metused[i] = FALSE;
332 for (i = 0; i < MAXSTICKS; i++)
333 {
334 for (;;)
335 if (rnd(2) == 0)
336 {
337 j = rnd(NMETAL);
338 if (!metused[j])
339 {
340 ws_type[i] = "wand";
341 str = metal[j];
342 metused[j] = TRUE;
343 break;
344 }
345 }
346 else
347 {
348 j = rnd(NWOOD);
349 if (!used[j])
350 {
351 ws_type[i] = "staff";
352 str = wood[j];
353 used[j] = TRUE;
354 break;
355 }
356 }
357 ws_made[i] = str;
358 }
359 }
360
361 #ifdef MASTER
362 # define NT NUMTHINGS, "things"
363 # define MP MAXPOTIONS, "potions"
364 # define MS MAXSCROLLS, "scrolls"
365 # define MR MAXRINGS, "rings"
366 # define MWS MAXSTICKS, "sticks"
367 # define MW MAXWEAPONS, "weapons"
368 # define MA MAXARMORS, "armor"
369 #else
370 # define NT NUMTHINGS
371 # define MP MAXPOTIONS
372 # define MS MAXSCROLLS
373 # define MR MAXRINGS
374 # define MWS MAXSTICKS
375 # define MW MAXWEAPONS
376 # define MA MAXARMORS
377 #endif
378
379 /*
380 * sumprobs:
381 * Sum up the probabilities for items appearing
382 */
383 void
384 sumprobs(struct obj_info *info, int bound
385 #ifdef MASTER
386 , char *name
387 #endif
388 )
389 {
390 #ifdef MASTER
391 struct obj_info *start = info;
392 #endif
393 struct obj_info *endp;
394
395 endp = info + bound;
396 while (++info < endp)
397 info->oi_prob += (info - 1)->oi_prob;
398 #ifdef MASTER
399 badcheck(name, start, bound);
400 #endif
401 }
402
403 /*
404 * init_probs:
405 * Initialize the probabilities for the various items
406 */
407 void
408 init_probs(void)
409 {
410 sumprobs(things, NT);
411 sumprobs(pot_info, MP);
412 sumprobs(scr_info, MS);
413 sumprobs(ring_info, MR);
414 sumprobs(ws_info, MWS);
415 sumprobs(weap_info, MW);
416 sumprobs(arm_info, MA);
417 }
418
419 #ifdef MASTER
420 /*
421 * badcheck:
422 * Check to see if a series of probabilities sums to 100
423 */
424 void
425 badcheck(const char *name, const struct obj_info *info, int bound)
426 {
427 const struct obj_info *end;
428
429 if (info[bound - 1].oi_prob == 100)
430 return;
431 printf("\nBad percentages for %s (bound = %d):\n", name, bound);
432 for (end = &info[bound]; info < end; info++)
433 printf("%3d%% %s\n", info->oi_prob, info->oi_name);
434 printf("[hit RETURN to continue]");
435 fflush(stdout);
436 while (getchar() != '\n')
437 continue;
438 }
439 #endif
440
441 /*
442 * pick_color:
443 * If he is halucinating, pick a random color name and return it,
444 * otherwise return the given color.
445 */
446 const char *
447 pick_color(const char *col)
448 {
449 return (on(player, ISHALU) ? rainbow[rnd(NCOLORS)] : col);
450 }