Annotation of early-roguelike/srogue/scrolls.c, Revision 1.1.1.1
1.1 rubenllo 1: /*
2: * Read a scroll and let it happen
3: *
4: * @(#)scrolls.c 9.0 (rdk) 7/17/84
5: *
6: * Super-Rogue
7: * Copyright (C) 1984 Robert D. Kindelberger
8: * All rights reserved.
9: *
10: * Based on "Rogue: Exploring the Dungeons of Doom"
11: * Copyright (C) 1980, 1981 Michael Toy, Ken Arnold and Glenn Wichman
12: * All rights reserved.
13: *
14: * See the file LICENSE.TXT for full copyright and licensing information.
15: */
16:
17: #include <stdlib.h>
18: #include <string.h>
19: #include <ctype.h>
20: #include "rogue.h"
21: #include "rogue.ext"
22:
23: /*
24: * read_scroll:
25: * Let the hero read a scroll
26: */
27: void
28: read_scroll(void)
29: {
30: reg struct object *obj;
31: reg struct linked_list *item;
32: reg int i, j, wh;
33: reg char ch, nch;
34: struct room *rp;
35: struct linked_list *titem;
36: char buf[LINLEN];
37: bool bless, curse;
38:
39: if ((item = get_item("read", SCROLL)) == NULL)
40: return;
41: obj = OBJPTR(item);
42: if (obj->o_type != SCROLL) {
43: msg("Nothing to read.");
44: after = FALSE;
45: return;
46: }
47: msg("As you read the scroll, it vanishes.");
48: wh = obj->o_which;
49: bless = o_on(obj, ISBLESS);
50: curse = o_on(obj, ISCURSED);
51: del_pack(item); /* Get rid of the thing */
52:
53: /*
54: * Calculate the effect it has on the hero
55: */
56: switch(wh) {
57: case S_KNOWALL:
58: if (!curse) {
59: idenpack(); /* identify all the pack */
60: msg("You feel more knowledgable.");
61: chg_abil(WIS,1,TRUE);
62: s_know[S_KNOWALL] = TRUE;
63: }
64: when S_CONFUSE:
65: if (!curse) {
66: /*
67: * Scroll of monster confusion. Give him that power.
68: */
69: msg("Your hands begin to glow red.");
70: player.t_flags |= CANHUH;
71: s_know[S_CONFUSE] = TRUE;
72: }
73: when S_LIGHT:
74: rp = player.t_room;
75: if (!curse) {
76: if (rp == NULL) {
77: s_know[S_LIGHT] = TRUE;
78: msg("The corridor glows and then fades.");
79: }
80: else {
81: if (rf_on(rp,ISDARK)) {
82: s_know[S_LIGHT] = TRUE;
83: msg("The room is lit.");
84: rp->r_flags &= ~ISDARK;
85: }
86: light(&hero);
87: mvwaddch(cw, hero.y, hero.x, PLAYER);
88: }
89: }
90: when S_ARMOR:
91: if (!curse) {
92: if (cur_armor != NULL && o_off(cur_armor,ISPROT)) {
93: s_know[S_ARMOR] = TRUE;
94: msg("Your armor glows faintly for a moment.");
95: if (o_on(cur_armor,ISCURSED))
96: cur_armor->o_ac = armors[cur_armor->o_which].a_class;
97: else
98: cur_armor->o_ac--;
99: resoflg(cur_armor,ISCURSED);
100: }
101: }
102: when S_HOLD:
103: if (!curse) {
104: /*
105: * Hold monster scroll. Stop all monsters within 3 spaces
106: * from chasing after the hero.
107: */
108: reg int x,y;
109: reg struct linked_list *mon;
110:
111: for (x = hero.x - 3; x <= hero.x + 3; x++) {
112: for (y = hero.y - 3; y <= hero.y + 3; y++) {
113: if (y > 0 && x > 0 && isalpha(mvwinch(mw, y, x))) {
114: if ((mon = find_mons(y, x)) != NULL) {
115: reg struct thing *th;
116:
117: th = THINGPTR(mon);
118: th->t_flags &= ~ISRUN;
119: th->t_flags |= ISHELD;
120: th->t_flags |= ISSTUCK;
121: }
122: }
123: }
124: }
125: }
126: when S_SLEEP:
127: /*
128: * Scroll which makes you fall asleep
129: */
130: if (!bless) {
131: s_know[S_SLEEP] = TRUE;
132: msg("You fall asleep.");
133: player.t_nocmd += 4 + rnd(SLEEPTIME);
134: }
135: when S_CREATE:
136: if (!bless) {
137: if (makemons(mtlev[rnd(levcount)]->m_show))
138: s_know[S_CREATE] = TRUE;
139: else
140: msg("You hear a faint cry of anguish in the distance.");
141: }
142: when S_IDENT:
143: if (!curse) {
144: msg("This scroll is an identify scroll");
145: s_know[S_IDENT] = TRUE;
146: whatis(NULL);
147: }
148: when S_MAP:
149: if (curse)
150: break;
151: s_know[S_MAP] = TRUE;
152: addmsg("Oh, now this scroll has a ");
153: if (rnd(100) < 10 || bless) {
154: addmsg("very detailed map on it.");
155: endmsg();
156: displevl();
157: }
158: else {
159: addmsg("map on it.");
160: endmsg();
161: overwrite(stdscr, hw);
162: for (i = 1; i < LINES - 2; i++) {
163: for (j = 0; j < COLS; j++) {
164: switch (nch = ch = mvwinch(hw, i, j)) {
165: case SECRETDOOR:
166: nch = DOOR;
167: mvaddch(i, j, nch);
168: case '-':
169: case '|':
170: case DOOR:
171: case PASSAGE:
172: case ' ':
173: case STAIRS:
174: if (mvwinch(mw, i, j) != ' ') {
175: struct thing *it;
176: struct linked_list *blah;
177:
178: blah = find_mons(i, j);
179: if (blah != NULL) {
180: it = THINGPTR(blah);
181: if (it->t_oldch == ' ')
182: it->t_oldch = nch;
183: }
184: }
185: break;
186: default:
187: nch = ' ';
188: }
189: if (nch != ch)
190: waddch(hw, nch);
191: }
192: }
193: overlay(cw, hw);
194: overwrite(hw, cw);
195: }
196: when S_GFIND:
197: if (!curse) {
198: int gtotal = 0;
199: struct room *rp;
200:
201: wclear(hw);
202: for (rp = rooms; rp < &rooms[MAXROOMS]; rp++) {
203: gtotal += rp->r_goldval;
204: if (rp->r_goldval != 0 &&
205: mvinch(rp->r_gold.y,rp->r_gold.x) == GOLD)
206: mvwaddch(hw,rp->r_gold.y,rp->r_gold.x,GOLD);
207: }
208: if (gtotal) {
209: s_know[S_GFIND] = TRUE;
210: msg("You begin to feel greedy and sense gold.");
211: overlay(hw,cw);
212: }
213: else
214: msg("You begin to feel a pull downward.");
215: }
216: when S_TELEP:
217: if (!curse) {
218: int rm;
219: struct room *cur_room;
220:
221: cur_room = player.t_room;
222: rm = teleport(rndspot, &player);
223: if (cur_room != &rooms[rm])
224: s_know[S_TELEP] = TRUE;
225: }
226: when S_ENCH:
227: if (!curse) {
228: if (cur_weapon == NULL || (cur_weapon != NULL &&
229: (o_on(cur_weapon,ISPROT) || cur_weapon->o_type != WEAPON)))
230: msg("You feel a strange sense of loss.");
231: else {
232: s_know[S_ENCH] = TRUE;
233: if (o_on(cur_weapon,ISCURSED)) {
234: resoflg(cur_weapon,ISCURSED);
235: cur_weapon->o_hplus = rnd(2);
236: cur_weapon->o_dplus = rnd(2);
237: }
238: else { /* weapon was not cursed here */
239: if (rnd(100) < 50)
240: cur_weapon->o_hplus += 1;
241: else
242: cur_weapon->o_dplus += 1;
243: }
244: setoflg(cur_weapon, ISKNOW);
245: msg("Your %s glows blue for a moment.",
246: w_magic[cur_weapon->o_which].mi_name);
247: }
248: }
249: when S_SCARE:
250: /*
251: * A monster will refuse to step on a scare monster scroll
252: * if it is dropped. Thus reading it is a mistake and produces
253: * laughter at the poor rogue's boo boo.
254: */
255: msg("You hear maniacal laughter in the distance.");
256: when S_REMOVE:
257: if (!curse) {
258: if (cur_armor != NULL && o_off(cur_armor,ISPROT))
259: resoflg(cur_armor,ISCURSED);
260: if (cur_weapon != NULL && o_off(cur_weapon,ISPROT))
261: resoflg(cur_weapon,ISCURSED);
262: if (cur_ring[LEFT]!=NULL && o_off(cur_ring[LEFT],ISPROT))
263: resoflg(cur_ring[LEFT],ISCURSED);
264: if (cur_ring[RIGHT]!=NULL && o_off(cur_ring[RIGHT],ISPROT))
265: resoflg(cur_ring[RIGHT],ISCURSED);
266: msg("You feel as if somebody is watching over you.");
267: s_know[S_REMOVE] = TRUE;
268: }
269: when S_AGGR:
270: if (!bless) {
271: if (mlist != NULL) {
272: aggravate();
273: msg("You hear a high pitched humming noise.");
274: s_know[S_AGGR] = TRUE;
275: }
276: }
277: when S_NOP:
278: msg("This scroll seems to be blank.");
279: when S_GENOCIDE:
280: if (!curse) {
281: msg("You have been granted the boon of genocide.");
282: genocide();
283: s_know[S_GENOCIDE] = TRUE;
284: }
285: when S_DCURSE:
286: if (!bless) {
287: struct linked_list *ll;
288: struct object *lb;
289:
290: msg("Your pack shudders.");
291: for (ll = pack ; ll != NULL ; ll = next(ll)) {
292: lb = OBJPTR(ll);
293: if (o_off(lb,ISPROT)) {
294: resoflg(lb, ISBLESS);
295: setoflg(lb, ISCURSED);
296: }
297: }
298: }
299: when S_DLEVEL:
300: if (!bless) {
301: int much = rnd(9) - 4;
302:
303: if (much != 0) {
304: level += much;
305: if (level < 1)
306: level = 1;
307: mpos = 0;
308: new_level(NORMLEV); /* change levels */
309: msg("You are whisked away to another region.");
310: s_know[S_DLEVEL] = TRUE;
311: }
312: }
313: when S_PROTECT:
314: if (!curse) {
315: struct linked_list *ll;
316: struct object *lb;
317:
318: msg("You are granted the power of protection.");
319: if ((ll = get_item("protect",0)) != NULL) {
320: lb = OBJPTR(ll);
321: setoflg(lb,ISPROT);
322: mpos = 0;
323: msg("Protected %s.",inv_name(lb,TRUE));
324: }
325: s_know[S_PROTECT] = TRUE;
326: }
327: when S_ALLENCH:
328: if (!curse) {
329: struct linked_list *ll;
330: struct object *lb;
331: int howmuch, ac, good;
332:
333: msg("You are granted the power of enchantment.");
334: good = TRUE;
335: if ((ll = get_item("enchant",0)) != NULL) {
336: lb = OBJPTR(ll);
337: resoflg(lb,ISCURSED);
338: resoflg(lb,ISPROT);
339: howmuch = rnd(3) + 1;
340: switch(lb->o_type) {
341: case RING:
342: if (lb->o_ac < 0)
343: lb->o_ac = 0;
344: lb->o_ac += howmuch;
345: when ARMOR:
346: ac = armors[lb->o_which].a_class;
347: if (lb->o_ac > ac)
348: lb->o_ac = ac;
349: lb->o_ac -= howmuch;
350: when STICK:
351: lb->o_charges += howmuch + 10;
352: when WEAPON:
353: if (lb->o_dplus < 0)
354: lb->o_dplus = 0;
355: if (lb->o_hplus < 0)
356: lb->o_hplus = 0;
357: lb->o_hplus += howmuch;
358: lb->o_dplus += howmuch;
359: otherwise:
360: msg("You are injured as the scroll flashes & bursts into flames !!!");
361: chg_hpt(-roll(6,6),FALSE,K_SCROLL);
362: good = FALSE;
363: }
364: if (good) {
365: mpos = 0;
366: msg("Enchanted %s.",inv_name(lb,TRUE));
367: }
368: }
369: s_know[S_ALLENCH] = TRUE;
370: }
371: when S_BLESS:
372: if (!curse) {
373: struct linked_list *ll;
374: struct object *lb;
375:
376: msg("Your pack glistens brightly.");
377: for (ll = pack ; ll != NULL ; ll = next(ll)) {
378: whatis(ll);
379: lb = OBJPTR(ll);
380: resoflg(lb,ISCURSED);
381: setoflg(lb,ISBLESS);
382: }
383: }
384: when S_MAKEIT:
385: if (!curse) {
386: msg("You have been endowed with the power of creation.");
387: s_know[S_MAKEIT] = TRUE;
388: create_obj(TRUE);
389: }
390: when S_BAN: {
391: int howdeep;
392: char *ptr = "";
393:
394: if (bless) {
395: if (level > 6) {
396: howdeep = 1 + rnd(5);
397: ptr = "elevated to the upper";
398: }
399: else {
400: howdeep = -1;
401: bless = FALSE;
402: }
403: }
404: else {
405: howdeep = level + 10 + rnd(20) + (curse * 20);
406: ptr = "banished to the lower";
407: }
408: if ((!bless && level < howdeep) || bless) {
409: level = howdeep;
410: new_level(NORMLEV);
411: mpos = 0;
412: msg("You are %s regions.", ptr);
413: s_know[S_BAN] = TRUE;
414: }
415: }
416: when S_CWAND:
417: if (!curse) {
418: struct linked_list *ll;
419: struct object *lb;
420: bool wands = FALSE;
421:
422: for (ll = pack ; ll != NULL ; ll = next(ll)) {
423: lb = OBJPTR(ll);
424: if (lb->o_type == STICK) {
425: whatis(ll);
426: setoflg(lb, ISKNOW);
427: resoflg(lb, ISCURSED);
428: lb->o_charges += rnd(11) + 5;
429: wands = TRUE;
430: }
431: }
432: if (wands) {
433: msg("Your sticks gleam.");
434: s_know[wh] = TRUE;
435: }
436: }
437: when S_LOCTRAP: {
438: struct trap *trp;
439:
440: if (ntraps > 0) {
441: for (trp = &traps[0]; trp < &traps[ntraps]; trp++)
442: trp->tr_flags |= ISFOUND;
443: look(FALSE);
444: msg("You now recognize pitfalls.");
445: s_know[S_LOCTRAP] = TRUE;
446: }
447: }
448: otherwise:
449: msg("What a puzzling scroll!");
450: return;
451: }
452: look(TRUE);
453: nochange = FALSE;
454: if (s_know[wh] && s_guess[wh]) {
455: free(s_guess[wh]);
456: s_guess[wh] = NULL;
457: }
458: else if (!s_know[wh] && s_guess[wh] == NULL) {
459: strcpy(buf, s_names[wh]);
460: msg(callit);
461: if (get_str(buf, cw) == NORM) {
462: s_guess[wh] = new(strlen(buf) + 1);
463: strcpy(s_guess[wh], buf);
464: }
465: }
466: }
CVSweb