Mercurial > hg > early-roguelike
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 } |