diff rogue3/wizard.c @ 0:527e2150eaf0

Import Rogue 3.6 from the Roguelike Restoration Project (r1490)
author edwarj4
date Tue, 13 Oct 2009 13:33:34 +0000
parents
children e7aab31362af
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/rogue3/wizard.c	Tue Oct 13 13:33:34 2009 +0000
@@ -0,0 +1,204 @@
+
+/*
+ * Special wizard commands (some of which are also non-wizard commands
+ * under strange circumstances)
+ *
+ * @(#)wizard.c	3.8 (Berkeley) 6/3/81
+ *
+ * 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 "curses.h"
+#include <ctype.h>
+#include <string.h>
+#include <stdlib.h>
+#include "machdep.h"
+#include "rogue.h"
+
+/*
+ * whatis:
+ *	What a certin object is
+ */
+
+void
+whatis()
+{
+    struct object *obj;
+    struct linked_list *item;
+
+    if ((item = get_item("identify", 0)) == NULL)
+	return;
+    obj = (struct object *) ldata(item);
+    switch (obj->o_type)
+    {
+        case SCROLL:
+	    s_know[obj->o_which] = TRUE;
+	    if (s_guess[obj->o_which])
+	    {
+		free(s_guess[obj->o_which]);
+		s_guess[obj->o_which] = NULL;
+	    }
+        when POTION:
+	    p_know[obj->o_which] = TRUE;
+	    if (p_guess[obj->o_which])
+	    {
+		free(p_guess[obj->o_which]);
+		p_guess[obj->o_which] = NULL;
+	    }
+	when STICK:
+	    ws_know[obj->o_which] = TRUE;
+	    obj->o_flags |= ISKNOW;
+	    if (ws_guess[obj->o_which])
+	    {
+		free(ws_guess[obj->o_which]);
+		ws_guess[obj->o_which] = NULL;
+	    }
+        when WEAPON:
+        case ARMOR:
+	    obj->o_flags |= ISKNOW;
+        when RING:
+	    r_know[obj->o_which] = TRUE;
+	    obj->o_flags |= ISKNOW;
+	    if (r_guess[obj->o_which])
+	    {
+		free(r_guess[obj->o_which]);
+		r_guess[obj->o_which] = NULL;
+	    }
+    }
+    msg(inv_name(obj, FALSE));
+}
+
+/*
+ * create_obj:
+ *	Wizard command for getting anything he wants
+ */
+
+void
+create_obj()
+{
+    struct linked_list *item;
+    struct object *obj;
+    int bless;
+    int ch;
+
+    item = new_item(sizeof *obj);
+    obj = (struct object *) ldata(item);
+    msg("Type of item: ");
+    obj->o_type = readchar(cw);
+    mpos = 0;
+    msg("Which %c do you want? (0-f)", obj->o_type);
+    obj->o_which = (isdigit((ch = readchar(cw))) ? ch - '0' : ch - 'a' + 10);
+    obj->o_group = 0;
+    obj->o_count = 1;
+    mpos = 0;
+    if (obj->o_type == WEAPON || obj->o_type == ARMOR)
+    {
+	msg("Blessing? (+,-,n)");
+	bless = readchar(cw);
+	mpos = 0;
+	if (obj->o_type == WEAPON)
+	{
+	    init_weapon(obj, obj->o_which);
+	    if (bless == '-') {
+		obj->o_hplus -= rnd(3)+1;
+		obj->o_flags |= ISCURSED;
+	    }
+	    if (bless == '+')
+		obj->o_hplus += rnd(3)+1;
+	}
+	else
+	{
+	    obj->o_ac = a_class[obj->o_which];
+	    if (bless == '-') {
+		obj->o_ac += rnd(3)+1;
+		obj->o_flags |= ISCURSED;
+	    }
+	    if (bless == '+')
+		obj->o_ac -= rnd(3)+1;
+	}
+    }
+    else if (obj->o_type == RING)
+	switch (obj->o_which)
+	{
+	    case R_PROTECT:
+	    case R_ADDSTR:
+	    case R_ADDHIT:
+	    case R_ADDDAM:
+		msg("Blessing? (+,-,n)");
+		bless = readchar(cw);
+		mpos = 0;
+		if (bless == '-')
+		    obj->o_flags |= ISCURSED;
+		obj->o_ac = (bless == '-' ? -1 : rnd(2) + 1);
+	}
+    else if (obj->o_type == STICK)
+	fix_stick(obj);
+    add_pack(item, FALSE);
+}
+
+/*
+ * telport:
+ *	Bamf the hero someplace else
+ */
+
+int
+teleport()
+{
+    int rm;
+    coord c;
+
+    c = hero;
+    mvwaddch(cw, hero.y, hero.x, mvwinch(stdscr, hero.y, hero.x));
+    do
+    {
+	rm = rnd_room();
+	rnd_pos(&rooms[rm], &hero);
+    } until(winat(hero.y, hero.x) == FLOOR);
+    light(&c);
+    light(&hero);
+    mvwaddch(cw, hero.y, hero.x, PLAYER);
+    /*
+     * turn off ISHELD in case teleportation was done while fighting
+     * a Fungi
+     */
+    if (on(player, ISHELD)) {
+	player.t_flags &= ~ISHELD;
+	fung_hit = 0;
+	strcpy(monsters['F'-'A'].m_stats.s_dmg, "000d0");
+    }
+    count = 0;
+    running = FALSE;
+    flush_type();		/* flush typeahead */
+    return rm;
+}
+
+/*
+ * passwd:
+ *	see if user knows password
+ */
+
+int
+passwd()
+{
+    char *sp, c;
+    char buf[80];
+
+    msg("Wizard's Password:");
+    mpos = 0;
+    sp = buf;
+    while ((c = readchar(cw)) != '\n' && c != '\r' && c != '\033')
+	if (c == md_killchar())
+	    sp = buf;
+	else if (c == md_erasechar() && sp > buf)
+	    sp--;
+	else
+	    *sp++ = c;
+    if (sp == buf)
+	return FALSE;
+    *sp = '\0';
+    return (strcmp(PASSWD, crypt(buf, "mT")) == 0);
+}