Mercurial > hg > early-roguelike
comparison xrogue/init.c @ 133:e6179860cb76
Import XRogue 8.0 from the Roguelike Restoration Project (r1490)
author | John "Elwin" Edwards |
---|---|
date | Tue, 21 Apr 2015 08:55:20 -0400 |
parents | |
children | ce0cf824c192 |
comparison
equal
deleted
inserted
replaced
124:d10fc4a065ac | 133:e6179860cb76 |
---|---|
1 /* | |
2 init.c - global variable initializaton | |
3 | |
4 XRogue: Expeditions into the Dungeons of Doom | |
5 Copyright (C) 1991 Robert Pietkivitch | |
6 All rights reserved. | |
7 | |
8 Based on "Advanced Rogue" | |
9 Copyright (C) 1984, 1985 Michael Morgan, Ken Dalka and AT&T | |
10 All rights reserved. | |
11 | |
12 Based on "Rogue: Exploring the Dungeons of Doom" | |
13 Copyright (C) 1980, 1981 Michael Toy, Ken Arnold and Glenn Wichman | |
14 All rights reserved. | |
15 | |
16 See the file LICENSE.TXT for full copyright and licensing information. | |
17 */ | |
18 | |
19 #include <curses.h> | |
20 #include <ctype.h> | |
21 #include "rogue.h" | |
22 #include "mach_dep.h" | |
23 | |
24 /* | |
25 * If there is any news, put it in a character string and assign it to | |
26 * rogue_news. Otherwise, assign NULL to rogue_news. | |
27 */ | |
28 | |
29 static char *rogue_news = "Enter a number within the minimum and maximum \ | |
30 range. When satisfied with your choices, enter a 'y'. For help at any \ | |
31 other time enter a '?' or a '='."; | |
32 | |
33 /* replace the above line with this when descriptions are done */ | |
34 /* other time enter a '?' or a '='. For character and item descriptions \ | |
35 enter a '\\' on any other screen."; | |
36 */ | |
37 | |
38 struct words rainbow[NCOLORS] = { | |
39 "Amber", "Aquamarine", "Beige", | |
40 "Black", "Blue", "Brown", | |
41 "Clear", "Crimson", "Ecru", | |
42 "Gold", "Green", "Grey", | |
43 "Indigo", "Khaki", "Lavender", | |
44 "Magenta", "Orange", "Pink", | |
45 "Plaid", "Purple", "Red", | |
46 "Silver", "Saffron", "Scarlet", | |
47 "Tan", "Tangerine", "Topaz", | |
48 "Turquoise", "Vermilion", "Violet", | |
49 "White", "Yellow", | |
50 }; | |
51 | |
52 struct words sylls[NSYLLS] = { | |
53 "a", "ae", "ak", "an", "ax", "ach", "ano", "ars", "bha", "bar", "bre", | |
54 "cha", "cre", "cum", "cow", "duh", "dha", "e", "ea", "em", "et", "ey", | |
55 "eck", "etk", "egg", "exl", "fu", "fen", "fid", "gan", "gle", "h", "ha", | |
56 "hr", "ht", "how", "hex", "hip", "hoc", "i", "ia", "ig", "it", "iz", | |
57 "ion", "ink", "ivi", "iss", "je", "jin", "jha", "jyr", "ka", "kho", "kal", | |
58 "kli", "lu", "lre", "lta", "lri", "m", "ma", "mh", "mi", "mr", "mar", | |
59 "myr", "moh", "mul", "nep", "nes", "o", "oc", "om", "oq", "ox", "orn", | |
60 "oxy", "olm", "ode", "po", "pie", "pod", "pot", "qar", "que", "ran", "rah", | |
61 "rok", "sa", "sat", "sha", "sol", "sri", "ti", "tem", "tar", "tki", "tch", | |
62 "tox", "u", "ub", "uh", "ur", "uv", "unk", "uwh", "ugh", "uyr", "va", | |
63 "vil", "vit", "vom", "vux", "wah", "wex", "xu", "xed", "xen", "ya", "yep", | |
64 "yih", "zef", "zen", "zil", "zym", "-" | |
65 }; | |
66 | |
67 struct words stones[NSTONES] = { | |
68 "Agate", "Alexandrite", "Amethyst", | |
69 "Azurite", "Bloodstone", "Cairngorm", | |
70 "Carnelian", "Chalcedony", "Chrysoberyl", | |
71 "Chrysolite", "Chrysoprase", "Citrine", | |
72 "Coral", "Diamond", "Emerald", | |
73 "Garnet", "Heliotrope", "Hematite", | |
74 "Hyacinth", "Jacinth", "Jade", | |
75 "Jargoon", "Jasper", "Kryptonite", | |
76 "Lapis lazuli", "Malachite", "Mocca stone", | |
77 "Moonstone", "Obsidian", "Olivine", | |
78 "Onyx", "Opal", "Pearl", | |
79 "Peridot", "Quartz", "Rhodochrosite", | |
80 "Rhodolite", "Ruby", "Sapphire", | |
81 "Sardonyx", "Serpentine", "Spinel", | |
82 "Tiger eye", "Topaz", "Tourmaline", | |
83 "Turquoise", "Zircon", | |
84 }; | |
85 | |
86 struct words wood[NWOOD] = { | |
87 "Avocado wood", "Balsa", "Banyan", "Birch", | |
88 "Cedar", "Cherry", "Cinnabar", "Dogwood", | |
89 "Driftwood", "Ebony", "Eucalyptus", "Hemlock", | |
90 "Ironwood", "Mahogany", "Manzanita", "Maple", | |
91 "Oak", "Pine", "Redwood", "Rosewood", | |
92 "Teak", "Walnut", "Aloe", "Sandalwood", | |
93 }; | |
94 | |
95 struct words metal[NMETAL] = { | |
96 "Aluminium", "Bone", "Brass", "Bronze", | |
97 "Copper", "Chromium", "Iron", "Lead", | |
98 "Magnesium", "Pewter", "Platinum", "Silver", | |
99 "Steel", "Tin", "Titanium", "Zinc", | |
100 }; | |
101 | |
102 /* | |
103 * make sure all the percentages specified in the tables add up to the | |
104 * right amounts | |
105 */ | |
106 | |
107 badcheck(name, magic, bound) | |
108 char *name; | |
109 register struct magic_item *magic; | |
110 register int bound; | |
111 { | |
112 register struct magic_item *end; | |
113 | |
114 if (magic[bound - 1].mi_prob == 1000) | |
115 return; | |
116 printf("\nBad percentages for %s:\n", name); | |
117 for (end = &magic[bound] ; magic < end ; magic++) | |
118 printf("%4d%% %s\n", magic->mi_prob, magic->mi_name); | |
119 printf(retstr); | |
120 fflush(stdout); | |
121 while (getchar() != '\n') | |
122 continue; | |
123 } | |
124 | |
125 /* | |
126 * init_colors: | |
127 * Initialize the potion color scheme for this time | |
128 */ | |
129 | |
130 init_colors() | |
131 { | |
132 register int i; | |
133 register char *str; | |
134 | |
135 for (i = 0 ; i < MAXPOTIONS ; i++) | |
136 { | |
137 do | |
138 str = rainbow[rnd(NCOLORS)].w_string; | |
139 until (isupper(*str)); | |
140 *str = tolower(*str); | |
141 p_colors[i] = str; | |
142 p_know[i] = FALSE; | |
143 p_guess[i] = NULL; | |
144 if (i > 0) | |
145 p_magic[i].mi_prob += p_magic[i-1].mi_prob; | |
146 } | |
147 badcheck("potions", p_magic, MAXPOTIONS); | |
148 } | |
149 | |
150 /* | |
151 * do any initialization for food | |
152 */ | |
153 | |
154 init_foods() | |
155 { | |
156 register int i; | |
157 | |
158 for (i=0; i < MAXFOODS; i++) { | |
159 if (i > 0) | |
160 foods[i].mi_prob += foods[i-1].mi_prob; | |
161 } | |
162 badcheck("foods", foods, MAXFOODS); | |
163 } | |
164 | |
165 /* | |
166 * init_materials: | |
167 * Initialize the construction materials for wands and staffs | |
168 */ | |
169 | |
170 init_materials() | |
171 { | |
172 register int i; | |
173 register char *str; | |
174 | |
175 for (i = 0 ; i < MAXSTICKS ; i++) | |
176 { | |
177 do | |
178 if (rnd(100) > 50) | |
179 { | |
180 str = metal[rnd(NMETAL)].w_string; | |
181 if (isupper(*str)) | |
182 ws_type[i] = "wand"; | |
183 } | |
184 else | |
185 { | |
186 str = wood[rnd(NWOOD)].w_string; | |
187 if (isupper(*str)) | |
188 ws_type[i] = "staff"; | |
189 } | |
190 until (isupper(*str)); | |
191 *str = tolower(*str); | |
192 ws_made[i] = str; | |
193 ws_know[i] = FALSE; | |
194 ws_guess[i] = NULL; | |
195 if (i > 0) | |
196 ws_magic[i].mi_prob += ws_magic[i-1].mi_prob; | |
197 } | |
198 badcheck("sticks", ws_magic, MAXSTICKS); | |
199 } | |
200 | |
201 /* | |
202 * do any initialization for miscellaneous magic | |
203 */ | |
204 | |
205 init_misc() | |
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 badcheck("miscellaneous magic", m_magic, MAXMM); | |
216 } | |
217 | |
218 /* | |
219 * init_names: | |
220 * Generate the names of the various scrolls | |
221 */ | |
222 | |
223 init_names() | |
224 { | |
225 register int nsyl; | |
226 register char *cp, *sp; | |
227 register int i, nwords; | |
228 | |
229 for (i = 0 ; i < MAXSCROLLS ; i++) | |
230 { | |
231 cp = prbuf; | |
232 nwords = rnd(cols/20) + 1 + (cols > 40 ? 1 : 0); | |
233 while(nwords--) | |
234 { | |
235 nsyl = rnd(5)+1; | |
236 while(nsyl--) | |
237 { | |
238 sp = sylls[rnd(NSYLLS)].w_string; | |
239 while(*sp) | |
240 *cp++ = *sp++; | |
241 } | |
242 *cp++ = ' '; | |
243 } | |
244 *--cp = '\0'; | |
245 s_names[i] = (char *) new(strlen(prbuf)+1); | |
246 s_know[i] = FALSE; | |
247 s_guess[i] = NULL; | |
248 strcpy(s_names[i], prbuf); | |
249 if (i > 0) | |
250 s_magic[i].mi_prob += s_magic[i-1].mi_prob; | |
251 } | |
252 badcheck("scrolls", s_magic, MAXSCROLLS); | |
253 } | |
254 | |
255 /* | |
256 * init_player: | |
257 * roll up the rogue | |
258 */ | |
259 | |
260 init_player() | |
261 { | |
262 int stat_total, round = 0, minimum, maximum, ch, i, j = 0; | |
263 short do_escape, *our_stats[NUMABILITIES-1]; | |
264 struct linked_list *weap_item, *armor_item, *food_item; | |
265 struct object *obj; | |
266 | |
267 weap_item = armor_item = food_item = NULL; | |
268 | |
269 if (char_type == -1) { /* not set via options */ | |
270 /* See what type character will be */ | |
271 wclear(hw); | |
272 touchwin(hw); | |
273 wmove(hw,2,0); | |
274 for(i=1; i<=NUM_CHARTYPES-1; i++) { | |
275 wprintw(hw,"[%d] %s\n",i,char_class[i-1].name); | |
276 } | |
277 mvwaddstr(hw, 0, 0, "What character class do you desire? "); | |
278 draw(hw); | |
279 char_type = (wgetch(hw) - '0'); | |
280 while (char_type < 1 || char_type > NUM_CHARTYPES-1) { | |
281 wmove(hw,0,0); | |
282 wprintw(hw,"Please enter a character type between 1 and %d: ", | |
283 NUM_CHARTYPES-1); | |
284 draw(hw); | |
285 char_type = (wgetch(hw) - '0'); | |
286 } | |
287 char_type--; | |
288 } | |
289 player.t_ctype = char_type; | |
290 player.t_quiet = 0; | |
291 pack = NULL; | |
292 | |
293 /* Select the gold */ | |
294 purse = 3000; | |
295 switch (player.t_ctype) { | |
296 case C_FIGHTER: | |
297 purse += 200; | |
298 when C_MAGICIAN: | |
299 case C_CLERIC: | |
300 case C_DRUID: | |
301 purse += 100; | |
302 when C_THIEF: | |
303 case C_ASSASSIN: | |
304 purse += 0; | |
305 when C_RANGER: | |
306 case C_PALADIN: | |
307 purse -= 100; | |
308 when C_MONK: | |
309 purse -= 200; | |
310 } | |
311 /* | |
312 * allow me to describe a super character | |
313 */ | |
314 /* let's lessen the restrictions on this okay? */ | |
315 if (wizard && strcmp(getenv("SUPER"),"YES") == 0) { | |
316 pstats.s_str = MAXATT; | |
317 pstats.s_intel = MAXATT; | |
318 pstats.s_wisdom = MAXATT; | |
319 pstats.s_dext = MAXATT; | |
320 pstats.s_const = MAXATT; | |
321 pstats.s_charisma = MAXATT; | |
322 pstats.s_exp = 10000000L; | |
323 pstats.s_lvl = 1; | |
324 pstats.s_lvladj = 0; | |
325 pstats.s_hpt = 500; | |
326 pstats.s_carry = totalenc(&player); | |
327 strcpy(pstats.s_dmg,"4d8"); | |
328 check_level(); | |
329 wmove(hw,0,0); | |
330 wclrtoeol(hw); | |
331 draw(hw); | |
332 mpos = 0; | |
333 | |
334 /* set quest item */ | |
335 if(player.t_ctype == C_FIGHTER) quest_item = AXE_AKLAD; | |
336 if(player.t_ctype == C_RANGER) quest_item = BRIAN_MANDOLIN; | |
337 if(player.t_ctype == C_PALADIN) quest_item = HEIL_ANKH; | |
338 if(player.t_ctype == C_MAGICIAN) quest_item = STONEBONES_AMULET; | |
339 if(player.t_ctype == C_CLERIC) quest_item = GERYON_HORN; | |
340 if(player.t_ctype == C_THIEF) quest_item = MUSTY_DAGGER; | |
341 if(player.t_ctype == C_ASSASSIN) quest_item = EYE_VECNA; | |
342 if(player.t_ctype == C_DRUID) quest_item = QUILL_NAGROM; | |
343 if(player.t_ctype == C_MONK) quest_item = EMORI_CLOAK; | |
344 | |
345 /* armor */ | |
346 if (player.t_ctype == C_THIEF || player.t_ctype == C_ASSASSIN) | |
347 j = STUDDED_LEATHER; | |
348 else if (player.t_ctype == C_MONK) { | |