Mercurial > hg > early-roguelike
comparison rogue3/scrolls.c @ 0:527e2150eaf0
Import Rogue 3.6 from the Roguelike Restoration Project (r1490)
author | edwarj4 |
---|---|
date | Tue, 13 Oct 2009 13:33:34 +0000 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:527e2150eaf0 |
---|---|
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 } |