comparison srogue/misc.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 94a0d9dd5ce1
comparison
equal deleted inserted replaced
35:05018c63a721 36:2128c7dc8a40
1 /*
2 * all sorts of miscellaneous routines
3 *
4 * @(#)misc.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 "rogue.h"
18 #include <ctype.h>
19 #include "rogue.ext"
20
21 /*
22 * waste_time:
23 * Do nothing but let other things happen
24 */
25 waste_time()
26 {
27 if (inwhgt) /* if from wghtchk, then done */
28 return;
29 do_daemons(BEFORE);
30 do_daemons(AFTER);
31 do_fuses();
32 }
33
34 /*
35 * getindex:
36 * Convert a type into an index for the things structures
37 */
38 getindex(what)
39 char what;
40 {
41 int index = -1;
42
43 switch (what) {
44 case POTION: index = TYP_POTION;
45 when SCROLL: index = TYP_SCROLL;
46 when FOOD: index = TYP_FOOD;
47 when RING: index = TYP_RING;
48 when AMULET: index = TYP_AMULET;
49 when ARMOR: index = TYP_ARMOR;
50 when WEAPON: index = TYP_WEAPON;
51 when STICK: index = TYP_STICK;
52 }
53 return index;
54 }
55
56 /*
57 * tr_name:
58 * print the name of a trap
59 */
60 char *
61 tr_name(ch)
62 char ch;
63 {
64 reg char *s;
65
66 switch (ch) {
67 case TRAPDOOR:
68 s = "A trapdoor.";
69 when BEARTRAP:
70 s = "A beartrap.";
71 when SLEEPTRAP:
72 s = "A sleeping gas trap.";
73 when ARROWTRAP:
74 s = "An arrow trap.";
75 when TELTRAP:
76 s = "A teleport trap.";
77 when DARTTRAP:
78 s = "A dart trap.";
79 when POOL:
80 s = "A magic pool.";
81 when POST:
82 s = "A trading post.";
83 when MAZETRAP:
84 s = "A maze trap.";
85 otherwise:
86 s = "A bottomless pit."; /* shouldn't get here */
87 }
88 return s;
89 }
90
91 /*
92 * Look:
93 * A quick glance all around the player
94 */
95 look(wakeup)
96 bool wakeup;
97 {
98 reg char ch;
99 reg int oldx, oldy, y, x;
100 reg struct room *rp;
101 int ey, ex, oex, oey;
102 int passcount = 0;
103 bool inpass, blind;
104
105 getyx(cw, oldy, oldx);
106 oex = player.t_oldpos.x;
107 oey = player.t_oldpos.y;
108 blind = pl_on(ISBLIND);
109 if ((oldrp != NULL && rf_on(oldrp,ISDARK)) || blind) {
110 for (x = oex - 1; x <= oex + 1; x += 1)
111 for (y = oey - 1; y <= oey + 1; y += 1)
112 if ((y != hero.y || x != hero.x) && show(y, x) == FLOOR)
113 mvwaddch(cw, y, x, ' ');
114 }
115 rp = player.t_room;
116 inpass = (rp == NULL); /* TRUE when not in a room */
117 ey = hero.y + 1;
118 ex = hero.x + 1;
119 for (x = hero.x - 1; x <= ex; x += 1) {
120 if (x >= 0 && x <= COLS - 1) {
121 for (y = hero.y - 1; y <= ey; y += 1) {
122 if (y <= 0 || y >= LINES - 2)
123 continue;
124 if (isalpha(mvwinch(mw, y, x))) {
125 reg struct linked_list *it;
126 reg struct thing *tp;
127
128 if (wakeup || (!inpass && rf_on(rp, ISTREAS)))
129 it = wake_monster(y, x);
130 else
131 it = find_mons(y, x);
132 if (it == NULL) /* lost monster */
133 mvaddch(y, x, FLOOR);
134 else {
135 tp = THINGPTR(it);
136 if (isatrap(tp->t_oldch = mvinch(y, x))) {
137 struct trap *trp;
138
139 if ((trp = trap_at(y,x)) == NULL)
140 break;
141 if (trp->tr_flags & ISFOUND)
142 tp->t_oldch = trp->tr_type;
143 else
144 tp->t_oldch = FLOOR;
145 }
146 if (tp->t_oldch == FLOOR && rf_on(rp,ISDARK))
147 if (!blind)
148 tp->t_oldch = ' ';
149 }
150 }
151 /*
152 * Secret doors show as walls
153 */
154 if ((ch = show(y, x)) == SECRETDOOR) {
155 if (inpass || y == rp->r_pos.y || y == rp->r_pos.y + rp->r_max.y - 1)
156 ch = '-';
157 else
158 ch = '|';
159 }
160 /*
161 * Don't show room walls if he is in a passage
162 */
163 if (!blind) {
164 if ((y == hero.y && x == hero.x) || (inpass && (ch == '-' || ch == '|')))
165 continue;
166 }
167 else
168 ch = ' ';
169 wmove(cw, y, x);
170 waddch(cw, ch);
171 if (door_stop && !firstmove && running) {
172 switch (runch) {
173 case 'h':
174 if (x == ex)
175 continue;
176 when 'j':
177 if (y == hero.y - 1)
178 continue;
179 when 'k':
180 if (y == ey)
181 continue;
182 when 'l':
183 if (x == hero.x - 1)
184 continue;
185 when 'y':
186 if ((x + y) - (hero.x + hero.y) >= 1)
187 continue;
188 when 'u':
189 if ((y - x) - (hero.y - hero.x) >= 1)
190 continue;
191 when 'n':
192 if ((x + y) - (hero.x + hero.y) <= -1)
193 continue;
194 when 'b':
195 if ((y - x) - (hero.y - hero.x) <= -1)
196 continue;
197 }
198 switch (ch) {
199 case DOOR:
200 if (x == hero.x || y == hero.y)
201 running = FALSE;
202 break;
203 case PASSAGE:
204 if (x == hero.x || y == hero.y)
205 passcount += 1;
206 break;
207 case FLOOR:
208 case '|':
209 case '-':
210 case ' ':
211 break;
212 default:
213 running = FALSE;
214 break;
215 }
216 }
217 }
218 }
219 }
220 if (door_stop && !firstmove && passcount > 1)
221 running = FALSE;
222 mvwaddch(cw, hero.y, hero.x, PLAYER);
223 wmove(cw, oldy, oldx);
224 player.t_oldpos = hero;
225 oldrp = rp;
226 }
227
228 /*
229 * find_obj:
230 * find the unclaimed object at y, x
231 */
232 struct linked_list *
233 find_obj(y, x)
234 int y, x;
235 {
236 reg struct linked_list *obj;
237 reg struct object *op;
238
239 for (obj = lvl_obj; obj != NULL; obj = next(obj)) {
240 op = OBJPTR(obj);
241 if (op->o_pos.y == y && op->o_pos.x == x)
242 return obj;
243 }
244 return NULL;
245 }
246
247 /*
248 * eat:
249 * Let the hero eat some food.
250 */
251 eat()
252 {
253 reg struct linked_list *item;
254 reg struct object *obj;
255 reg int goodfood, cursed;
256
257 if ((item = get_item("eat", FOOD)) == NULL)
258 return;
259 obj = OBJPTR(item);
260 if (obj->o_type != FOOD) {
261 msg("That's Inedible!");
262 after = FALSE;
263 return;
264 }
265 cursed = 1;
266 if (o_on(obj, ISCURSED))
267 cursed += 1;
268 else if (o_on(obj, ISBLESS))
269 cursed -= 1;
270 if (obj->o_which == FRUITFOOD) {
271 msg("My, that was a yummy %s.", fruit);
272 goodfood = 100;
273 }
274 else {
275 if (rnd(100) > 80 || o_on(obj, ISCURSED)) {
276 msg("Yuk, this food tastes like ARA.");
277 goodfood = 300;
278 him->s_exp += 1;
279 check_level();
280 }
281 else {
282 msg("Yum, that tasted good.");
283 goodfood = 200;
284 }
285 }
286 goodfood *= cursed;
287 if ((food_left += HUNGERTIME + rnd(400) - goodfood) > STOMACHSIZE)
288 food_left = STOMACHSIZE;
289 hungry_state = F_OKAY;
290 updpack(); /* update pack */
291 if (obj == cur_weapon)
292 cur_weapon = NULL;
293 del_pack(item); /* get rid of the food */
294 }
295
296 /*
297 * aggravate:
298 * aggravate all the monsters on this level
299 */
300 aggravate()
301 {
302 reg struct linked_list *mi;
303
304 for (mi = mlist; mi != NULL; mi = next(mi))
305 runto(&(THINGPTR(mi))->t_pos, &hero);
306 }
307
308 /*
309 * vowelstr:
310 * If string starts with a vowel, return "n" for an "an"
311 */
312 char *
313 vowelstr(str)
314 char *str;
315 {
316 switch (tolower(*str)) {
317 case 'a':
318 case 'e':
319 case 'i':
320 case 'o':
321 case 'u':
322 return "n";
323 default:
324 return "";
325 }
326 }
327
328 /*
329 * is_current:
330 * See if the object is one of the currently used items
331 */
332 is_current(obj)
333 struct object *obj;
334 {
335 if (obj == NULL)
336 return FALSE;
337 if (obj == cur_armor || obj == cur_weapon || obj == cur_ring[LEFT]
338 || obj == cur_ring[RIGHT]) {
339 msg("Already in use.");
340 return TRUE;
341 }
342 return FALSE;
343 }
344
345 /*
346 * get_dir:
347 * Set up the direction coordinates
348 */
349 get_dir()
350 {
351 reg char *prompt;
352 reg bool gotit;
353
354 prompt = "Direction: ";
355 do {
356 gotit = TRUE;
357 switch (readchar()) {
358 case 'h': case'H': delta.y = 0; delta.x = -1;
359 when 'j': case'J': delta.y = 1; delta.x = 0;
360 when 'k': case'K': delta.y = -1; delta.x = 0;
361 when 'l': case'L': delta.y = 0; delta.x = 1;
362 when 'y': case'Y': delta.y = -1; delta.x = -1;
363 when 'u': case'U': delta.y = -1; delta.x = 1;
364 when 'b': case'B': delta.y = 1; delta.x = -1;
365 when 'n': case'N': delta.y = 1; delta.x = 1;
366 when ESCAPE: return FALSE;
367 otherwise:
368 mpos = 0;
369 msg(prompt);
370 gotit = FALSE;
371 }
372 } until (gotit);
373 if (pl_on(ISHUH) && rnd(100) > 80) {
374 do {
375 delta.y = rnd(3) - 1;
376 delta.x = rnd(3) - 1;
377 } while (delta.y == 0 && delta.x == 0);
378 }
379 mpos = 0;
380 return TRUE;
381 }
382
383 /*
384 * initfood:
385 * Set up stuff for a food-type object
386 */
387 initfood(what)
388 struct object *what;
389 {
390 what->o_type = FOOD;
391 what->o_group = NORMFOOD;
392 if (rnd(100) < 15)
393 what->o_group = FRUITFOOD;
394 what->o_which = what->o_group;
395 what->o_count = 1 + extras();
396 what->o_flags = ISKNOW;
397 what->o_weight = things[TYP_FOOD].mi_wght;
398 what->o_typname = things[TYP_FOOD].mi_name;
399 what->o_hplus = what->o_dplus = 0;
400 what->o_vol = itemvol(what);
401 }