comparison rogue5/scrolls.c @ 33:f502bf60e6e4

Import Rogue 5.4 from the Roguelike Restoration Project (r1490)
author elwin
date Mon, 24 May 2010 20:10:59 +0000
parents
children
comparison
equal deleted inserted replaced
32:2dcd75e6a736 33:f502bf60e6e4
1 /*
2 * Read a scroll and let it happen
3 *
4 * @(#)scrolls.c 4.44 (Berkeley) 02/05/99
5 *
6 * Rogue: Exploring the Dungeons of Doom
7 * Copyright (C) 1980-1983, 1985, 1999 Michael Toy, Ken Arnold and Glenn Wichman
8 * All rights reserved.
9 *
10 * See the file LICENSE.TXT for full copyright and licensing information.
11 */
12
13 #include <curses.h>
14 #include <ctype.h>
15 #include "rogue.h"
16
17 /*
18 * read_scroll:
19 * Read a scroll from the pack and do the appropriate thing
20 */
21
22 void
23 read_scroll(void)
24 {
25 THING *obj;
26 PLACE *pp;
27 int y, x;
28 int ch;
29 int i;
30 int discardit = FALSE;
31 struct room *cur_room;
32 THING *orig_obj;
33 coord mp;
34
35 obj = get_item("read", SCROLL);
36 if (obj == NULL)
37 return;
38 if (obj->o_type != SCROLL)
39 {
40 if (!terse)
41 msg("there is nothing on it to read");
42 else
43 msg("nothing to read");
44 return;
45 }
46 /*
47 * Calculate the effect it has on the poor guy.
48 */
49 if (obj == cur_weapon)
50 cur_weapon = NULL;
51 /*
52 * Get rid of the thing
53 */
54 discardit = (obj->o_count == 1);
55 leave_pack(obj, FALSE, FALSE);
56 orig_obj = obj;
57
58 switch (obj->o_which)
59 {
60 case S_CONFUSE:
61 /*
62 * Scroll of monster confusion. Give him that power.
63 */
64 player.t_flags |= CANHUH;
65 msg("your hands begin to glow %s", pick_color("red"));
66 when S_ARMOR:
67 if (cur_armor != NULL)
68 {
69 cur_armor->o_arm--;
70 cur_armor->o_flags &= ~ISCURSED;
71 msg("your armor glows %s for a moment", pick_color("silver"));
72 }
73 when S_HOLD:
74 /*
75 * Hold monster scroll. Stop all monsters within two spaces
76 * from chasing after the hero.
77 */
78
79 ch = 0;
80 for (x = hero.x - 2; x <= hero.x + 2; x++)
81 if (x >= 0 && x < NUMCOLS)
82 for (y = hero.y - 2; y <= hero.y + 2; y++)
83 if (y >= 0 && y <= NUMLINES - 1)
84 if ((obj = moat(y, x)) != NULL && on(*obj, ISRUN))
85 {
86 obj->t_flags &= ~ISRUN;
87 obj->t_flags |= ISHELD;
88 ch++;
89 }
90 if (ch)
91 {
92 addmsg("the monster");
93 if (ch > 1)
94 addmsg("s around you");
95 addmsg(" freeze");
96 if (ch == 1)
97 addmsg("s");
98 endmsg();
99 scr_info[S_HOLD].oi_know = TRUE;
100 }
101 else
102 msg("you feel a strange sense of loss");
103 when S_SLEEP:
104 /*
105 * Scroll which makes you fall asleep
106 */
107 scr_info[S_SLEEP].oi_know = TRUE;
108 no_command += rnd(SLEEPTIME) + 4;
109 player.t_flags &= ~ISRUN;
110 msg("you fall asleep");
111 when S_CREATE:
112 /*
113 * Create a monster:
114 * First look in a circle around him, next try his room
115 * otherwise give up
116 */
117 i = 0;
118 for (y = hero.y - 1; y <= hero.y + 1; y++)
119 for (x = hero.x - 1; x <= hero.x + 1; x++)
120 /*
121 * Don't put a monster in top of the player.
122 */
123 if (y == hero.y && x == hero.x)
124 continue;
125 /*
126 * Or anything else nasty
127 * Also avoid a xeroc which is disguised as scroll
128 */
129 else if (moat(y, x) == NULL && step_ok(ch = winat(y, x)))
130 {
131 if (ch == SCROLL
132 && find_obj(y, x)->o_which == S_SCARE)
133 continue;
134 else if (rnd(++i) == 0)
135 {
136 mp.y = y;
137 mp.x = x;
138 }
139 }
140 if (i == 0)
141 msg("you hear a faint cry of anguish in the distance");
142 else
143 {
144 obj = new_item();
145 new_monster(obj, randmonster(FALSE), &mp);
146 }
147 when S_ID_POTION:
148 case S_ID_SCROLL:
149 case S_ID_WEAPON:
150 case S_ID_ARMOR:
151 case S_ID_R_OR_S:
152 {
153 int id_type[S_ID_R_OR_S + 1] =
154 { 0, 0, 0, 0, 0, POTION, SCROLL, WEAPON, ARMOR, R_OR_S };
155 /*
156 * Identify, let him figure something out
157 */
158 scr_info[obj->o_which].oi_know = TRUE;
159 msg("this scroll is an %s scroll", scr_info[obj->o_which].oi_name);
160 whatis(TRUE, id_type[obj->o_which]);
161 }
162 when S_MAP:
163 /*
164 * Scroll of magic mapping.
165 */
166 scr_info[S_MAP].oi_know = TRUE;
167 msg("oh, now this scroll has a map on it");
168 /*
169 * take all the things we want to keep hidden out of the window
170 */
171 for (y = 1; y < NUMLINES - 1; y++)
172 for (x = 0; x < NUMCOLS; x++)
173 {
174 pp = INDEX(y, x);
175 switch (ch = pp->p_ch)
176 {
177 case DOOR:
178 case STAIRS:
179 break;
180
181 case '-':
182 case '|':
183 if (!(pp->p_flags & F_REAL))
184 {
185 ch = pp->p_ch = DOOR;
186 pp->p_flags |= F_REAL;
187 }
188 break;
189
190 case ' ':
191 if (pp->p_flags & F_REAL)
192 goto def;
193 pp->p_flags |= F_REAL;
194 ch = pp->p_ch = PASSAGE;
195 /* FALLTHROUGH */
196
197 case PASSAGE:
198 pass:
199 if (!(pp->p_flags & F_REAL))
200 pp->p_ch = PASSAGE;
201 pp->p_flags |= (F_SEEN|F_REAL);
202 ch = PASSAGE;
203 break;
204
205 case FLOOR:
206 if (pp->p_flags & F_REAL)
207 ch = ' ';
208 else
209 {
210 ch = TRAP;
211 pp->p_ch = TRAP;
212 pp->p_flags |= (F_SEEN|F_REAL);
213 }
214 break;
215
216 default:
217 def:
218 if (pp->p_flags & F_PASS)
219 goto pass;
220 ch = ' ';
221 break;
222 }
223 if (ch != ' ')
224 {
225 if ((obj = pp->p_monst) != NULL)
226 obj->t_oldch = ch;
227 if (obj == NULL || !on(player, SEEMONST))
228 mvaddch(y, x, ch);
229 }
230 }
231 when S_FDET:
232 /*
233 * Potion of gold detection
234 */
235 ch = FALSE;
236 wclear(hw);
237 for (obj = lvl_obj; obj != NULL; obj = next(obj))
238 if (obj->o_type == FOOD)
239 {
240 ch = TRUE;
241 wmove(hw, obj->o_pos.y, obj->o_pos.x);
242 waddch(hw, FOOD);
243 }
244 if (ch)
245 {
246 scr_info[S_FDET].oi_know = TRUE;
247 show_win("Your nose tingles and you smell food.--More--");
248 }
249 else
250 msg("your nose tingles");
251 when S_TELEP:
252 /*
253 * Scroll of teleportation:
254 * Make him dissapear and reappear
255 */
256 {
257 cur_room = proom;
258 teleport();
259 if (cur_room != proom)
260 scr_info[S_TELEP].oi_know = TRUE;
261 }
262 when S_ENCH:
263 if (cur_weapon == NULL || cur_weapon->o_type != WEAPON)
264 msg("you feel a strange sense of loss");
265 else
266 {
267 cur_weapon->o_flags &= ~ISCURSED;
268 if (rnd(2) == 0)
269 cur_weapon->o_hplus++;
270 else
271 cur_weapon->o_dplus++;
272 msg("your %s glows %s for a moment",
273 weap_info[cur_weapon->o_which].oi_name, pick_color("blue"));
274 }
275 when S_SCARE:
276 /*
277 * Reading it is a mistake and produces laughter at her
278 * poor boo boo.
279 */
280 msg("you hear maniacal laughter in the distance");
281 when S_REMOVE:
282 uncurse(cur_armor);
283 uncurse(cur_weapon);
284 uncurse(cur_ring[LEFT]);
285 uncurse(cur_ring[RIGHT]);
286 msg(choose_str("you feel in touch with the Universal Onenes",
287 "you feel as if somebody is watching over you"));
288 when S_AGGR:
289 /*
290 * This scroll aggravates all the monsters on the current
291 * level and sets them running towards the hero
292 */
293 aggravate();
294 msg("you hear a high pitched humming noise");
295 when S_PROTECT:
296 if (cur_armor != NULL)
297 {
298 cur_armor->o_flags |= ISPROT;
299 msg("your armor is covered by a shimmering %s shield",
300 pick_color("gold"));
301 }
302 else
303 msg("you feel a strange sense of loss");
304 #ifdef MASTER
305 otherwise:
306 msg("what a puzzling scroll!");
307 return;
308 #endif
309 }
310 obj = orig_obj;
311 look(TRUE); /* put the result of the scroll on the screen */
312 status();
313
314 call_it(&scr_info[obj->o_which]);
315
316 if (discardit)
317 discard(obj);
318 }
319
320 /*
321 * uncurse:
322 * Uncurse an item
323 */
324
325 void
326 uncurse(THING *obj)
327 {
328 if (obj != NULL)
329 obj->o_flags &= ~ISCURSED;
330 }