/* scrolls.c - Functions for dealing with scrolls XRogue: Expeditions into the Dungeons of Doom Copyright (C) 1991 Robert Pietkivitch All rights reserved. Based on "Advanced Rogue" Copyright (C) 1984, 1985 Michael Morgan, Ken Dalka and AT&T All rights reserved. Based on "Rogue: Exploring the Dungeons of Doom" Copyright (C) 1980, 1981 Michael Toy, Ken Arnold and Glenn Wichman All rights reserved. See the file LICENSE.TXT for full copyright and licensing information. */ #include #include #include #include #include "rogue.h" /* * let the hero get rid of some type of monster */ void genocide(void) { register struct linked_list *ip; register struct thing *mp; register struct linked_list *nip; /* cannot genocide any uniques */ register int num_monst = NUMMONST-NUMUNIQUE-NUMDINOS; register int which_monst; which_monst = makemonster(FALSE, "wipe out"); if (which_monst <= 0 || which_monst >= num_monst) { msg(""); return; } /* Remove this monster from the present level */ for (ip = mlist; ip; ip = nip) { mp = THINGPTR(ip); nip = next(ip); if (mp->t_index == which_monst) { killed(ip, FALSE, FALSE, TRUE); } } /* Remove from available monsters */ monsters[which_monst].m_normal = FALSE; monsters[which_monst].m_wander = FALSE; mpos = 0; msg("You have wiped out the %s.", monsters[which_monst].m_name); } void read_scroll(int which, int flag, bool is_scroll) { register struct object *obj = NULL, *nobj; register struct linked_list *item, *nitem; register int i,j; register unsigned char ch, nch; bool cursed, blessed; blessed = FALSE; cursed = FALSE; item = NULL; if (which < 0) { if (on(player, ISBLIND)) { msg("You can't see to read anything!"); return; } if (on(player, ISINWALL)) { msg("You can't see the scroll while inside rock!"); return; } /* This is a scroll or book. */ if (player.t_action != C_READ) { int units; item = get_item(pack, "read", READABLE, FALSE, FALSE); /* * Make certain that it is somethings that we want to read */ if (item == NULL) return; /* How long does it take to read? */ units = usage_time(item); if (units < 0) return; player.t_using = item; /* Remember what it is */ player.t_no_move = units * movement(&player); if ((OBJPTR(item))->o_type == SCROLL) player.t_action = C_READ; else player.t_action = C_USE; return; } /* We have waited our time, let's quaff the potion */ item = player.t_using; player.t_using = NULL; player.t_action = A_NIL; obj = OBJPTR(item); /* remove it from the pack */ inpack--; detach(pack, item); msg("As you read the scroll, it vanishes."); cursed = obj->o_flags & ISCURSED; blessed = obj->o_flags & ISBLESSED; which = obj->o_which; } else { cursed = flag & ISCURSED; blessed = flag & ISBLESSED; } switch (which) { case S_CONFUSE: /* Scroll of monster confusion. Give him that power. */ { register char *str; switch (rnd(5)) { case 0: str = "glow red"; when 1: str = "vibrate"; when 2: str = "glow blue"; when 3: str = "radiate green"; otherwise: str = "itch with a strange desire"; } msg("Your hands begin to %s. ", str); turn_on(player, CANHUH); } when S_CURING: /* * A cure disease spell */ if (on(player, HASINFEST) || on(player, HASDISEASE)|| on(player, DOROT)) { if (on(player, HASDISEASE)) { extinguish(cure_disease); cure_disease(); } if (on(player, HASINFEST)) { msg(terse ? "You feel yourself improving." : "You begin to feel yourself improving."); turn_off(player, HASINFEST); infest_dam = 0; } if (on(player, DOROT)) { msg("You feel your skin returning to normal."); turn_off(player, DOROT); } } else { /* msg(nothing); */ break; } if (is_scroll) s_know[S_CURING] = TRUE; when S_LIGHT: if (blue_light(blessed, cursed) && is_scroll) s_know[S_LIGHT] = TRUE; when S_HOLD: if (cursed) { /* * This scroll aggravates all the monsters on the current * level and sets them running towards the hero */ msg("You hear a high-pitched humming noise."); /* protect good charactors */ if (player.t_ctype == C_PALADIN || player.t_ctype == C_RANGER || player.t_ctype == C_MONK) { msg("A chill runs up your spine! "); aggravate(TRUE, FALSE); } else { aggravate(TRUE, TRUE); } } else if (blessed) { /* Hold all monsters on level */ if (mlist == NULL) msg(nothing); else { register struct linked_list *mon; register struct thing *th; for (mon = mlist; mon != NULL; mon = next(mon)) { th = THINGPTR(mon); turn_off(*th, ISRUN); turn_on(*th, ISHELD); turn_off(*th, ISCHARMED); } if (levtype == OUTSIDE) msg("A sudden peace comes over the land.. "); else msg("A sudden peace comes over the dungeon.. "); } } else { /* * Hold monster scroll. Stop all monsters within two spaces * from chasing after the hero. */ register int x,y; register struct linked_list *mon; bool gotone=FALSE; for (x = hero.x-2; x <= hero.x+2; x++) { for (y = hero.y-2; y <= hero.y+2; y++) { if (y < 1 || x < 0 || y > lines - 3 || x > cols - 1) continue; if (isalpha(mvwinch(mw, y, x))) { if ((mon = find_mons(y, x)) != NULL) { register struct thing *th; gotone = TRUE; th = THINGPTR(mon); turn_off(*th, ISRUN); turn_on(*th, ISHELD); turn_off(*th, ISCHARMED); } } } } if (gotone) msg("A sudden peace surrounds you."); else msg(nothing); } when S_SLEEP: /* * if cursed, you fall asleep */ if (is_scroll) s_know[S_SLEEP] = TRUE; if (cursed) { if (ISWEARING(R_ALERT)) msg("You feel drowsy for a moment."); else { msg("You fall asleep."); player.t_no_move += movement(&player)*(4 + rnd(SLEEPTIME)); player.t_action = A_FREEZE; } } else { /* * sleep monster scroll. * puts all monsters within 2 spaces asleep */ register int x,y; register struct linked_list *mon; bool gotone=FALSE; for (x = hero.x-2; x <= hero.x+2; x++) { for (y = hero.y-2; y <= hero.y+2; y++) { if (y < 1 || x < 0 || y > lines - 3 || x > cols - 1) continue; if (isalpha(mvwinch(mw, y, x))) { if ((mon = find_mons(y, x)) != NULL) { register struct thing *th; th = THINGPTR(mon); if (on(*th, ISUNDEAD)) continue; th->t_no_move += movement(th)*(SLEEPTIME+4); th->t_action = A_FREEZE; gotone = TRUE; } } } } if (gotone) msg("The monster(s) around you seem to have fallen asleep!"); else msg(nothing); } when S_CREATE: /* * Create a monster * First look in a circle around him, next try his room * otherwise give up */ creat_mons(&player, (short) 0, TRUE); light(&hero); when S_IDENT: /* * if its blessed then identify everything in the pack */ if (blessed) { msg("You feel more Knowledgeable!"); idenpack(); } else { /* * Identify, let the rogue figure something out */ if (is_scroll && s_know[S_IDENT] != TRUE) { msg("This scroll is an identify scroll"); } whatis((struct linked_list *)NULL); } if (is_scroll) s_know[S_IDENT] = TRUE; when S_MAP: /* * Scroll of magic mapping. */ if (blessed) { register int i; if (is_scroll && s_know[S_MAP] != TRUE) s_know[S_MAP] = TRUE; /* light rooms */ for (i=0; i