Annotation of early-roguelike/rogue5/scrolls.c, Revision 1.1.1.1
1.1 rubenllo 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: }
CVSweb