diff arogue7/scrolls.c @ 125:adfa37e67084

Import Advanced Rogue 7.7 from the Roguelike Restoration Project (r1490)
author John "Elwin" Edwards
date Fri, 08 May 2015 15:24:40 -0400
parents
children b786053d2f37
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/arogue7/scrolls.c	Fri May 08 15:24:40 2015 -0400
@@ -0,0 +1,841 @@
+/*
+ * scrolls.c - Functions for dealing with scrolls
+ *
+ * Advanced Rogue
+ * Copyright (C) 1984, 1985, 1986 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.
+ */
+
+/*
+ * Read a scroll and let it happen
+ *
+ */
+
+#include "curses.h"
+#include <ctype.h>
+#include "rogue.h"
+
+/*
+ * let the hero get rid of some type of monster (but not a UNIQUE!)
+ */
+genocide()
+{
+    register struct linked_list *ip;
+    register struct thing *mp;
+    register struct linked_list *nip;
+    register int num_monst = NUMMONST-NUMUNIQUE-1, /* cannot genocide uniques */
+		 pres_monst=1, 
+		 num_lines=2*(lines-3);
+    register int which_monst;
+
+    which_monst = makemonster(FALSE, "Genocide", "wipe out");
+    if (which_monst <= 0) {
+	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);
+}
+
+read_scroll(which, flag, is_scroll)
+register int which;
+int flag;
+bool is_scroll;
+{
+    register struct object *obj, *nobj;
+    register struct linked_list *item, *nitem;
+    register int i,j;
+    register 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) != 0;
+	blessed = (obj->o_flags & ISBLESSED) != 0;
+
+	which = obj->o_which;
+    }
+    else {
+	cursed = flag & ISCURSED;
+	blessed = flag & ISBLESSED;
+    }
+
+
+    switch (which) {
+	case S_CONFUSE:
+	    /*
+	     * Scroll of monster confusion.  Give him that power.
+	     */
+	    msg("Your hands begin to glow red");
+	    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 again.");
+		    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
+		 */
+		aggravate(TRUE, TRUE);
+		msg("You hear a high pitched humming noise.");
+	    }
+	    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);
+		    }
+		    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);
+				}
+			    }
+			}
+		    }
+		    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(NULL);
+	    }
+	    if (is_scroll) s_know[S_IDENT] = TRUE;
+	when S_MAP:
+	    /*
+	     * Scroll of magic mapping.
+	     */
+	    if (is_scroll && s_know[S_MAP] != TRUE) {
+		msg("Oh, now this scroll has a map on it.");
+		s_know[S_MAP] = TRUE;
+	    }
+	    overwrite(stdscr, hw);
+	    /*
+	     * Take all the things we want to keep hidden out of the window
+	     */
+	    for (i = 1; i < lines-2; i++)
+		for (j = 0; j < cols; j++)
+		{
+		    switch (nch = ch = CCHAR( mvwinch(hw, i, j) ))
+		    {
+			case SECRETDOOR:
+			    nch = secretdoor (i, j);
+			    break;
+			case '-':
+			case '|':
+			case DOOR:
+			case PASSAGE:
+			case ' ':
+			case STAIRS:
+			    if (mvwinch(mw, i, j) != ' ')
+			    {