Annotation of early-roguelike/rogue3/scrolls.c, Revision 1.1.1.1
1.1 rubenllo 1:
2: /*
3: * Read a scroll and let it happen
4: *
5: * @(#)scrolls.c 3.5 (Berkeley) 6/15/81
6: *
7: * Rogue: Exploring the Dungeons of Doom
8: * Copyright (C) 1980, 1981 Michael Toy, Ken Arnold and Glenn Wichman
9: * All rights reserved.
10: *
11: * See the file LICENSE.TXT for full copyright and licensing information.
12: */
13:
14: #include "curses.h"
15: #include <stdlib.h>
16: #include <ctype.h>
17: #include <string.h>
18: #include "rogue.h"
19:
20: void
21: read_scroll()
22: {
23: struct object *obj;
24: struct linked_list *item;
25: struct room *rp;
26: int i,j;
27: int ch, nch;
28: struct linked_list *titem;
29: char buf[80];
30:
31: item = get_item("read", SCROLL);
32: if (item == NULL)
33: return;
34: obj = (struct object *) ldata(item);
35: if (obj->o_type != SCROLL)
36: {
37: if (!terse)
38: msg("There is nothing on it to read");
39: else
40: msg("Nothing to read");
41: return;
42: }
43: msg("As you read the scroll, it vanishes.");
44: /*
45: * Calculate the effect it has on the poor guy.
46: */
47: if (obj == cur_weapon)
48: cur_weapon = NULL;
49: switch(obj->o_which)
50: {
51: case S_CONFUSE:
52: /*
53: * Scroll of monster confusion. Give him that power.
54: */
55: msg("Your hands begin to glow red");
56: player.t_flags |= CANHUH;
57: when S_LIGHT:
58: s_know[S_LIGHT] = TRUE;
59: if ((rp = roomin(&hero)) == NULL)
60: msg("The corridor glows and then fades");
61: else
62: {
63: addmsg("The room is lit");
64: if (!terse)
65: addmsg(" by a shimmering blue light.");
66: endmsg();
67: rp->r_flags &= ~ISDARK;
68: /*
69: * Light the room and put the player back up
70: */
71: light(&hero);
72: mvwaddch(cw, hero.y, hero.x, PLAYER);
73: }
74: when S_ARMOR:
75: if (cur_armor != NULL)
76: {
77: msg("Your armor glows faintly for a moment");
78: cur_armor->o_ac--;
79: cur_armor->o_flags &= ~ISCURSED;
80: }
81: when S_HOLD:
82: /*
83: * Hold monster scroll. Stop all monsters within two spaces
84: * from chasing after the hero.
85: */
86: {
87: int x,y;
88: struct linked_list *mon;
89:
90: for (x = hero.x-2; x <= hero.x+2; x++)
91: for (y = hero.y-2; y <= hero.y+2; y++)
92: if (y > 0 && x > 0 && isupper(mvwinch(mw, y, x)))
93: if ((mon = find_mons(y, x)) != NULL)
94: {
95: struct thing *th;
96:
97: th = (struct thing *) ldata(mon);
98: th->t_flags &= ~ISRUN;
99: th->t_flags |= ISHELD;
100: }
101: }
102: when S_SLEEP:
103: /*
104: * Scroll which makes you fall asleep
105: */
106: s_know[S_SLEEP] = TRUE;
107: msg("You fall asleep.");
108: no_command += 4 + rnd(SLEEPTIME);
109: when S_CREATE:
110: /*
111: * Create a monster
112: * First look in a circle around him, next try his room
113: * otherwise give up
114: */
115: {
116: int x, y;
117: int appear = 0;
118: coord mp;
119:
120: /*
121: * Search for an open place
122: */
123: for (y = hero.y-1; y <= hero.y+1; y++)
124: for (x = hero.x-1; x <= hero.x+1; x++)
125: {
126: /*
127: * Don't put a monster in top of the player.
128: */
129: if (y == hero.y && x == hero.x)
130: continue;
131: /*
132: * Or anything else nasty
133: */
134: if (step_ok(winat(y, x)))
135: {
136: if (rnd(++appear) == 0)
137: {
138: mp.y = y;
139: mp.x = x;
140: }
141: }
142: }
143: if (appear)
144: {
145: titem = new_item(sizeof (struct thing));
146: new_monster(titem, randmonster(FALSE), &mp);
147: }
148: else
149: msg("You hear a faint cry of anguish in the distance.");
150: }
151: when S_IDENT:
152: /*
153: * Identify, let the rogue figure something out
154: */
155: msg("This scroll is an identify scroll");
156: s_know[S_IDENT] = TRUE;
157: whatis();
158: when S_MAP:
159: /*
160: * Scroll of magic mapping.
161: */
162: s_know[S_MAP] = TRUE;
163: msg("Oh, now this scroll has a map on it.");
164: overwrite(stdscr, hw);
165: /*
166: * Take all the things we want to keep hidden out of the window
167: */
168: for (i = 0; i < LINES; i++)
169: for (j = 0; j < COLS; j++)
170: {
171: switch (nch = ch = mvwinch(hw, i, j))
172: {
173: case SECRETDOOR:
174: nch = DOOR;
175: mvaddch(i, j, nch);
176: case '-':
177: case '|':
178: case DOOR:
179: case PASSAGE:
180: case ' ':
181: case STAIRS:
182: if (mvwinch(mw, i, j) != ' ')
183: {
184: struct thing *it;
185:
186: it = (struct thing *) ldata(find_mons(i, j));
187: if ((it != NULL) && (it->t_oldch == ' '))
188: it->t_oldch = nch;
189: }
190: break;
191: default:
192: nch = ' ';
193: }
194: if (nch != ch)
195: waddch(hw, nch);
196: }
197: /*
198: * Copy in what he has discovered
199: */
200: overlay(cw, hw);
201: /*
202: * And set up for display
203: */
204: overwrite(hw, cw);
205: when S_GFIND:
206: /*
207: * Potion of gold detection
208: */
209: {
210: int gtotal = 0;
211:
212: wclear(hw);
213: for (i = 0; i < MAXROOMS; i++)
214: {
215: gtotal += rooms[i].r_goldval;
216: if (rooms[i].r_goldval != 0 &&
217: mvwinch(stdscr, rooms[i].r_gold.y, rooms[i].r_gold.x)
218: == GOLD)
219: mvwaddch(hw,rooms[i].r_gold.y,rooms[i].r_gold.x,GOLD);
220: }
221: if (gtotal)
222: {
223: s_know[S_GFIND] = TRUE;
224: show_win(hw,
225: "You begin to feel greedy and you sense gold.--More--");
226: }
227: else msg("You begin to feel a pull downward");
228: }
229: when S_TELEP:
230: /*
231: * Scroll of teleportation:
232: * Make him dissapear and reappear
233: */
234: {
235: int rm;
236: struct room *cur_room;
237:
238: cur_room = roomin(&hero);
239: rm = teleport();
240: if (cur_room != &rooms[rm])
241: s_know[S_TELEP] = TRUE;
242: }
243: when S_ENCH:
244: if (cur_weapon == NULL)
245: msg("You feel a strange sense of loss.");
246: else
247: {
248: cur_weapon->o_flags &= ~ISCURSED;
249: if (rnd(100) > 50)
250: cur_weapon->o_hplus++;
251: else
252: cur_weapon->o_dplus++;
253: msg("Your %s glows blue for a moment.", w_names[cur_weapon->o_which]);
254: }
255: when S_SCARE:
256: /*
257: * A monster will refuse to step on a scare monster scroll
258: * if it is dropped. Thus reading it is a mistake and produces
259: * laughter at the poor rogue's boo boo.
260: */
261: msg("You hear maniacal laughter in the distance.");
262: when S_REMOVE:
263: if (cur_armor != NULL)
264: cur_armor->o_flags &= ~ISCURSED;
265: if (cur_weapon != NULL)
266: cur_weapon->o_flags &= ~ISCURSED;
267: if (cur_ring[LEFT] != NULL)
268: cur_ring[LEFT]->o_flags &= ~ISCURSED;
269: if (cur_ring[RIGHT] != NULL)
270: cur_ring[RIGHT]->o_flags &= ~ISCURSED;
271: msg("You feel as if somebody is watching over you.");
272: when S_AGGR:
273: /*
274: * This scroll aggravates all the monsters on the current
275: * level and sets them running towards the hero
276: */
277: aggravate();
278: msg("You hear a high pitched humming noise.");
279: when S_NOP:
280: msg("This scroll seems to be blank.");
281: when S_GENOCIDE:
282: msg("You have been granted the boon of genocide");
283: genocide();
284: s_know[S_GENOCIDE] = TRUE;
285: otherwise:
286: msg("What a puzzling scroll!");
287: return;
288: }
289: look(TRUE); /* put the result of the scroll on the screen */
290: status();
291: if (s_know[obj->o_which] && s_guess[obj->o_which])
292: {
293: free(s_guess[obj->o_which]);
294: s_guess[obj->o_which] = NULL;
295: }
296: else if (!s_know[obj->o_which] && askme && s_guess[obj->o_which] == NULL)
297: {
298: msg(terse ? "Call it: " : "What do you want to call it? ");
299: if (get_str(buf, cw) == NORM)
300: {
301: s_guess[obj->o_which] = malloc((unsigned int) strlen(buf) + 1);
302: if (s_guess[obj->o_which] != NULL)
303: strcpy(s_guess[obj->o_which], buf);
304: }
305: }
306: /*
307: * Get rid of the thing
308: */
309: inpack--;
310: if (obj->o_count > 1)
311: obj->o_count--;
312: else
313: {
314: detach(pack, item);
315: discard(item);
316: }
317: }
CVSweb