|
|
1.1 root 1: #include <curses.h>
2: #include "rogue.h"
3: #include <ctype.h>
4:
5: /*
6: * all sorts of miscellaneous routines
7: *
8: * @(#)misc.c 3.13 (Berkeley) 6/15/81
9: */
10:
11: /*
12: * tr_name:
13: * print the name of a trap
14: */
15:
16: char *
17: tr_name(ch)
18: char ch;
19: {
20: register char *s;
21:
22: switch (ch)
23: {
24: when TRAPDOOR:
25: s = terse ? "A trapdoor." : "You found a trapdoor.";
26: when BEARTRAP:
27: s = terse ? "A beartrap." : "You found a beartrap.";
28: when SLEEPTRAP:
29: s = terse ? "A sleeping gas trap.":"You found a sleeping gas trap.";
30: when ARROWTRAP:
31: s = terse ? "An arrow trap." : "You found an arrow trap.";
32: when TELTRAP:
33: s = terse ? "A teleport trap." : "You found a teleport trap.";
34: when DARTTRAP:
35: s = terse ? "A dart trap." : "You found a poison dart trap.";
36: }
37: return s;
38: }
39:
40: /*
41: * Look:
42: * A quick glance all around the player
43: */
44:
45: look(wakeup)
46: bool wakeup;
47: {
48: register int x, y;
49: register char ch;
50: register int oldx, oldy;
51: register bool inpass;
52: register int passcount = 0;
53: register struct room *rp;
54: register int ey, ex;
55:
56: getyx(cw, oldy, oldx);
57: if (oldrp != NULL && (oldrp->r_flags & ISDARK) && off(player, ISBLIND))
58: {
59: for (x = oldpos.x - 1; x <= oldpos.x + 1; x++)
60: for (y = oldpos.y - 1; y <= oldpos.y + 1; y++)
61: if ((y != hero.y || x != hero.x) && show(y, x) == FLOOR)
62: mvwaddch(cw, y, x, ' ');
63: }
64: inpass = ((rp = roomin(&hero)) == NULL);
65: ey = hero.y + 1;
66: ex = hero.x + 1;
67: for (x = hero.x - 1; x <= ex; x++)
68: if (x >= 0 && x < COLS) for (y = hero.y - 1; y <= ey; y++)
69: {
70: if (y <= 0 || y >= LINES - 1)
71: continue;
72: if (isupper(mvwinch(mw, y, x)))
73: {
74: register struct linked_list *it;
75: register struct thing *tp;
76:
77: if (wakeup)
78: it = wake_monster(y, x);
79: else
80: it = find_mons(y, x);
81: tp = (struct thing *) ldata(it);
82: if ((tp->t_oldch = mvinch(y, x)) == TRAP)
83: tp->t_oldch =
84: (trap_at(y,x)->tr_flags&ISFOUND) ? TRAP : FLOOR;
85: if (tp->t_oldch == FLOOR && (rp->r_flags & ISDARK)
86: && off(player, ISBLIND))
87: tp->t_oldch = ' ';
88: }
89: /*
90: * Secret doors show as walls
91: */
92: if ((ch = show(y, x)) == SECRETDOOR)
93: ch = secretdoor(y, x);
94: /*
95: * Don't show room walls if he is in a passage
96: */
97: if (off(player, ISBLIND))
98: {
99: if (y == hero.y && x == hero.x
100: || (inpass && (ch == '-' || ch == '|')))
101: continue;
102: }
103: else if (y != hero.y || x != hero.x)
104: continue;
105: wmove(cw, y, x);
106: waddch(cw, ch);
107: if (door_stop && !firstmove && running)
108: {
109: switch (runch)
110: {
111: when 'h':
112: if (x == ex)
113: continue;
114: when 'j':
115: if (y == hero.y - 1)
116: continue;
117: when 'k':
118: if (y == ey)
119: continue;
120: when 'l':
121: if (x == hero.x - 1)
122: continue;
123: when 'y':
124: if ((x + y) - (hero.x + hero.y) >= 1)
125: continue;
126: when 'u':
127: if ((y - x) - (hero.y - hero.x) >= 1)
128: continue;
129: when 'n':
130: if ((x + y) - (hero.x + hero.y) <= -1)
131: continue;
132: when 'b':
133: if ((y - x) - (hero.y - hero.x) <= -1)
134: continue;
135: }
136: switch (ch)
137: {
138: case DOOR:
139: if (x == hero.x || y == hero.y)
140: running = FALSE;
141: break;
142: case PASSAGE:
143: if (x == hero.x || y == hero.y)
144: passcount++;
145: break;
146: case FLOOR:
147: case '|':
148: case '-':
149: case ' ':
150: break;
151: default:
152: running = FALSE;
153: break;
154: }
155: }
156: }
157: if (door_stop && !firstmove && passcount > 1)
158: running = FALSE;
159: mvwaddch(cw, hero.y, hero.x, PLAYER);
160: wmove(cw, oldy, oldx);
161: oldpos = hero;
162: oldrp = rp;
163: }
164:
165: /*
166: * secret_door:
167: * Figure out what a secret door looks like.
168: */
169:
170: secretdoor(y, x)
171: register int y, x;
172: {
173: register int i;
174: register struct room *rp;
175: register coord *cpp;
176: static coord cp;
177:
178: cp.y = y;
179: cp.x = x;
180: cpp = &cp;
181: for (rp = rooms, i = 0; i < MAXROOMS; rp++, i++)
182: if (inroom(rp, cpp))
183: if (y == rp->r_pos.y || y == rp->r_pos.y + rp->r_max.y - 1)
184: return('-');
185: else
186: return('|');
187:
188: return('p');
189: }
190:
191: /*
192: * find_obj:
193: * find the unclaimed object at y, x
194: */
195:
196: struct linked_list *
197: find_obj(y, x)
198: register int y;
199: int x;
200: {
201: register struct linked_list *obj;
202: register struct object *op;
203:
204: for (obj = lvl_obj; obj != NULL; obj = next(obj))
205: {
206: op = (struct object *) ldata(obj);
207: if (op->o_pos.y == y && op->o_pos.x == x)
208: return obj;
209: }
210: debug(sprintf(prbuf, "Non-object %d,%d", y, x));
211: return NULL;
212: }
213:
214: /*
215: * eat:
216: * She wants to eat something, so let her try
217: */
218:
219: eat()
220: {
221: register struct linked_list *item;
222: register struct object *obj;
223:
224: if ((item = get_item("eat", FOOD)) == NULL)
225: return;
226: obj = (struct object *) ldata(item);
227: if (obj->o_type != FOOD)
228: {
229: if (!terse)
230: msg("Ugh, you would get ill if you ate that.");
231: else
232: msg("That's Inedible!");
233: return;
234: }
235: inpack--;
236: if (--obj->o_count < 1)
237: {
238: detach(pack, item);
239: discard(item);
240: }
241: if (obj->o_which == 1)
242: msg("My, that was a yummy %s", fruit);
243: else
244: if (rnd(100) > 70)
245: {
246: msg("Yuk, this food tastes awful");
247: pstats.s_exp++;
248: check_level();
249: }
250: else
251: msg("Yum, that tasted good");
252: if ((food_left += HUNGERTIME + rnd(400) - 200) > STOMACHSIZE)
253: food_left = STOMACHSIZE;
254: hungry_state = 0;
255: if (obj == cur_weapon)
256: cur_weapon = NULL;
257: }
258:
259: /*
260: * Used to modify the playes strength
261: * it keeps track of the highest it has been, just in case
262: */
263:
264: chg_str(amt)
265: register int amt;
266: {
267: if (amt == 0)
268: return;
269: if (amt > 0)
270: {
271: while (amt--)
272: {
273: if (pstats.s_str.st_str < 18)
274: pstats.s_str.st_str++;
275: else if (pstats.s_str.st_add == 0)
276: pstats.s_str.st_add = rnd(50) + 1;
277: else if (pstats.s_str.st_add <= 50)
278: pstats.s_str.st_add = 51 + rnd(24);
279: else if (pstats.s_str.st_add <= 75)
280: pstats.s_str.st_add = 76 + rnd(14);
281: else if (pstats.s_str.st_add <= 90)
282: pstats.s_str.st_add = 91;
283: else if (pstats.s_str.st_add < 100)
284: pstats.s_str.st_add++;
285: }
286: if (pstats.s_str.st_str > max_stats.s_str.st_str ||
287: (pstats.s_str.st_str == 18 &&
288: pstats.s_str.st_add > max_stats.s_str.st_add))
289: max_stats.s_str = pstats.s_str;
290: }
291: else
292: {
293: while (amt++)
294: {
295: if (pstats.s_str.st_str < 18 || pstats.s_str.st_add == 0)
296: pstats.s_str.st_str--;
297: else if (pstats.s_str.st_add < 51)
298: pstats.s_str.st_add = 0;
299: else if (pstats.s_str.st_add < 76)
300: pstats.s_str.st_add = 1 + rnd(50);
301: else if (pstats.s_str.st_add < 91)
302: pstats.s_str.st_add = 51 + rnd(25);
303: else if (pstats.s_str.st_add < 100)
304: pstats.s_str.st_add = 76 + rnd(14);
305: else
306: pstats.s_str.st_add = 91 + rnd(8);
307: }
308: if (pstats.s_str.st_str < 3)
309: pstats.s_str.st_str = 3;
310: }
311: }
312:
313: /*
314: * add_haste:
315: * add a haste to the player
316: */
317:
318: add_haste(potion)
319: bool potion;
320: {
321: if (on(player, ISHASTE))
322: {
323: msg("You faint from exhaustion.");
324: no_command += rnd(8);
325: extinguish(nohaste);
326: }
327: else
328: {
329: player.t_flags |= ISHASTE;
330: if (potion)
331: fuse(nohaste, 0, rnd(4)+4, AFTER);
332: }
333: }
334:
335: /*
336: * aggravate:
337: * aggravate all the monsters on this level
338: */
339:
340: aggravate()
341: {
342: register struct linked_list *mi;
343:
344: for (mi = mlist; mi != NULL; mi = next(mi))
345: runto(&((struct thing *) ldata(mi))->t_pos, &hero);
346: }
347:
348: /*
349: * for printfs: if string starts with a vowel, return "n" for an "an"
350: */
351: char *
352: vowelstr(str)
353: register char *str;
354: {
355: switch (*str)
356: {
357: case 'a':
358: case 'e':
359: case 'i':
360: case 'o':
361: case 'u':
362: return "n";
363: default:
364: return "";
365: }
366: }
367:
368: /*
369: * see if the object is one of the currently used items
370: */
371: is_current(obj)
372: register struct object *obj;
373: {
374: if (obj == NULL)
375: return FALSE;
376: if (obj == cur_armor || obj == cur_weapon || obj == cur_ring[LEFT]
377: || obj == cur_ring[RIGHT])
378: {
379: msg(terse ? "In use." : "That's already in use.");
380: return TRUE;
381: }
382: return FALSE;
383: }
384:
385: /*
386: * set up the direction co_ordinate for use in varios "prefix" commands
387: */
388: get_dir()
389: {
390: register char *prompt;
391: register bool gotit;
392:
393: if (!terse)
394: msg(prompt = "Which direction? ");
395: else
396: prompt = "Direction: ";
397: do
398: {
399: gotit = TRUE;
400: switch (readchar())
401: {
402: when 'h': case'H': delta.y = 0; delta.x = -1;
403: when 'j': case'J': delta.y = 1; delta.x = 0;
404: when 'k': case'K': delta.y = -1; delta.x = 0;
405: when 'l': case'L': delta.y = 0; delta.x = 1;
406: when 'y': case'Y': delta.y = -1; delta.x = -1;
407: when 'u': case'U': delta.y = -1; delta.x = 1;
408: when 'b': case'B': delta.y = 1; delta.x = -1;
409: when 'n': case'N': delta.y = 1; delta.x = 1;
410: when ESCAPE: return FALSE;
411: otherwise:
412: mpos = 0;
413: msg(prompt);
414: gotit = FALSE;
415: }
416: } until (gotit);
417: if (on(player, ISHUH) && rnd(100) > 80)
418: do
419: {
420: delta.y = rnd(3) - 1;
421: delta.x = rnd(3) - 1;
422: } while (delta.y == 0 && delta.x == 0);
423: mpos = 0;
424: return TRUE;
425: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.