diff urogue/wizard.c @ 256:c495a4f288c6

Import UltraRogue from the Roguelike Restoration Project (r1490)
author John "Elwin" Edwards
date Tue, 31 Jan 2017 19:56:04 -0500
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/urogue/wizard.c	Tue Jan 31 19:56:04 2017 -0500
@@ -0,0 +1,238 @@
+/*
+    wizard.c - Special wizard commands
+    
+    UltraRogue: The Ultimate Adventure in the Dungeons of Doom
+    Copyright (C) 1985, 1986, 1992, 1993, 1995 Herb Chong
+    All rights reserved.
+
+    Based on "Advanced Rogue"
+    Copyright (C) 1984, 1985 Michael Morgan, Ken Dalka
+    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 <string.h>
+#include <stdlib.h>
+#include "rogue.h"
+
+/*
+    whatis()
+        What a certain object is
+*/
+
+void
+whatis(struct linked_list *what)
+{
+    struct object *obj;
+    int kludge;
+    int print_message = FALSE;
+
+    if (what == NULL)
+    {
+        print_message = TRUE;
+
+        while ((what = get_item("identify", 0)) == NULL)
+            ;
+    }
+
+    obj = OBJPTR(what);
+    obj->o_flags |= ISKNOW;
+
+    switch (obj->o_type)
+    {
+        case SCROLL: kludge = TYP_SCROLL; break;
+        case POTION: kludge = TYP_POTION; break;
+        case STICK:  kludge = TYP_STICK;  break;
+        case RING:   kludge = TYP_RING;   break;
+        case WEAPON:
+        case ARMOR:
+        default:     kludge = -1;         break;
+    }
+
+    if (kludge != -1)
+    {
+        know_items[kludge][obj->o_which] = TRUE;
+
+        if (guess_items[kludge][obj->o_which])
+        {
+            ur_free(guess_items[kludge][obj->o_which]);
+            guess_items[kludge][obj->o_which] = NULL;
+        }
+    }
+
+    if (print_message)
+        msg(inv_name(obj, UPPERCASE));
+}
+
+/*
+    teleport()
+        Bamf the hero someplace else
+*/
+
+void
+teleport(void)
+{
+    struct room *new_rp = NULL, *old_rp = roomin(hero);
+
+    int rm, which;
+    coord c;
+    int is_lit = FALSE; /* For saving room light state */
+    int rand_position = TRUE;
+
+    c = hero;
+
+    mvwaddch(cw, hero.y, hero.x, mvwinch(stdscr, hero.y, hero.x));
+
+    if (is_wearing(R_TELCONTROL))
+    {
+        msg("Where do you wish to teleport to? (* for help)");
+        wmove(cw, hero.y, hero.x);
+        wrefresh(cw);
+
+        which = (short) (readchar() & 0177);
+
+        while (which != (short) ESCAPE && which != (short) LINEFEED
+            && which != (short) CARRIAGE_RETURN)
+        {
+            switch(which)
+            {
+                case 'h':   c.x--; break;
+                case 'j':   c.y++; break;
+                case 'k':   c.y--; break;
+                case 'l':   c.x++; break;
+                case 'y':   c.x--;
+                            c.y--; break;
+                case 'u':   c.x++;
+                            c.y--; break;
+                case 'b':   c.x--;
+                            c.y++; break;
+                case 'n':   c.x++;
+                            c.y++; break;
+                case '*':
+                    msg("Use h,j,k,l,y,u,b,n to position cursor, then hit"
+                        "return.");
+            }
+
+            c.y = max(c.y, 1);
+            c.y = min(c.y, LINES - 3);
+            c.x = max(c.x, 1);
+            c.x = min(c.x, COLS - 1);
+            wmove(cw, c.y, c.x);
+            wrefresh(cw);
+            which = (short) (readchar() & 0177);
+        }
+
+        which = winat(c.y, c.x);
+
+        if ((which == FLOOR || which == PASSAGE || which == DOOR) &&
+            ((ring_value(R_TELCONTROL) == 0 && rnd(10) < 6)
+             || (ring_value(R_TELCONTROL) > 0 && rnd(10) < 9)))
+        {
+            rand_position = FALSE;
+            msg("You attempt succeeds.");
+            hero = c;
+            new_rp = roomin(hero);
+        }
+        else
+            msg("Your attempt fails.");
+    }
+
+    if (rand_position)
+    {
+        do
+        {
+            rm = rnd_room();
+            rnd_pos(&rooms[rm], &hero);
+        }
+        while (winat(hero.y, hero.x) != FLOOR);
+
+        new_rp = &rooms[rm];
+    }
+
+    /* If hero gets moved, darken old room */
+
+    if (old_rp && old_rp != new_rp)
+    {
+        if (!(old_rp->r_flags & ISDARK))
+            is_lit = TRUE;
+
+        old_rp->r_flags |= ISDARK;  /* Fake darkness */
+        light(&c);
+
+        if (is_lit)
+            old_rp->r_flags &= ~ISDARK; /* Restore light state */
+    }
+
+    light(&hero);
+    mvwaddch(cw, hero.y, hero.x, PLAYER);
+
+    /* turn off ISHELD in case teleportation was done while fighting */
+
+    if (on(player, ISHELD))
+    {
+        struct linked_list  *ip, *nip;
+        struct thing    *mp;
+
+        turn_off(player, ISHELD);
+        hold_count = 0;
+
+        for (ip = mlist; ip; ip = nip)
+        {
+            mp = THINGPTR(ip);
+            nip = next(ip);
+
+            if (on(*mp, DIDHOLD))
+            {
+                turn_off(*mp, DIDHOLD);
+                turn_on(*mp, CANHOLD);
+            }
+
+            turn_off(*mp, DIDSUFFOCATE);
+        }
+    }
+
+    extinguish_fuse(FUSE_SUFFOCATE);
+    player.t_no_move = 0;   /* not trapped anymore */
+    count = 0;
+    running = FALSE;
+
+    return;
+}
+
+/*
+    passwd()
+        see if user knows password
+*/
+
+int
+passwd(void)
+{
+    char *sp, c;
+    char buf[2 * LINELEN];
+
+    msg("Wizard's Password:");
+    mpos = 0;
+    sp = buf;
+
+    while ((c = (readchar() & 0177)) != '\n' && c != '\r' && c != '\033')
+    {
+        if (c == '\0')
+            sp = buf;
+        else if (c == '\b' && sp > buf)
+            sp--;
+        else
+            *sp++ = c;
+    }
+
+    if (sp == buf)
+        return(FALSE);
+
+    *sp = '\0';
+
+    return(TRUE);
+}