Annotation of early-roguelike/rogue5/wizard.c, Revision 1.1
1.1 ! rubenllo 1: /*
! 2: * Special wizard commands (some of which are also non-wizard commands
! 3: * under strange circumstances)
! 4: *
! 5: * @(#)wizard.c 4.30 (Berkeley) 02/05/99
! 6: *
! 7: * Rogue: Exploring the Dungeons of Doom
! 8: * Copyright (C) 1980-1983, 1985, 1999 Michael Toy, Ken Arnold and Glenn Wichman
! 9: * All rights reserved.
! 10: *
! 11: * See the file LICENSE.TXT for full copyright and licensing information.
! 12: */
! 13:
! 14: #include <stdlib.h>
! 15: #include <curses.h>
! 16: #include <string.h>
! 17: #include <ctype.h>
! 18: #include "rogue.h"
! 19:
! 20: /*
! 21: * whatis:
! 22: * What a certin object is
! 23: */
! 24:
! 25: void
! 26: whatis(int insist, int type)
! 27: {
! 28: THING *obj;
! 29:
! 30: if (pack == NULL)
! 31: {
! 32: msg("you don't have anything in your pack to identify");
! 33: return;
! 34: }
! 35:
! 36: for (;;)
! 37: {
! 38: obj = get_item("identify", type);
! 39: if (insist)
! 40: {
! 41: if (n_objs == 0)
! 42: return;
! 43: else if (obj == NULL)
! 44: msg("you must identify something");
! 45: else if (type && obj->o_type != type &&
! 46: !(type == R_OR_S && (obj->o_type == RING || obj->o_type == STICK)) )
! 47: msg("you must identify a %s", type_name(type));
! 48: else
! 49: break;
! 50: }
! 51: else
! 52: break;
! 53: }
! 54:
! 55: if (obj == NULL)
! 56: return;
! 57:
! 58: switch (obj->o_type)
! 59: {
! 60: case SCROLL:
! 61: set_know(obj, scr_info);
! 62: when POTION:
! 63: set_know(obj, pot_info);
! 64: when STICK:
! 65: set_know(obj, ws_info);
! 66: when WEAPON:
! 67: case ARMOR:
! 68: obj->o_flags |= ISKNOW;
! 69: when RING:
! 70: set_know(obj, ring_info);
! 71: }
! 72: msg(inv_name(obj, FALSE));
! 73: }
! 74:
! 75: /*
! 76: * set_know:
! 77: * Set things up when we really know what a thing is
! 78: */
! 79:
! 80: void
! 81: set_know(THING *obj, struct obj_info *info)
! 82: {
! 83: char **guess;
! 84:
! 85: info[obj->o_which].oi_know = TRUE;
! 86: obj->o_flags |= ISKNOW;
! 87: guess = &info[obj->o_which].oi_guess;
! 88: if (*guess)
! 89: {
! 90: free(*guess);
! 91: *guess = NULL;
! 92: }
! 93: }
! 94:
! 95: /*
! 96: * type_name:
! 97: * Return a pointer to the name of the type
! 98: */
! 99: const char *
! 100: type_name(int type)
! 101: {
! 102: struct h_list *hp;
! 103: struct h_list tlist[] = {
! 104: {POTION, "potion", FALSE},
! 105: {SCROLL, "scroll", FALSE},
! 106: {FOOD, "food", FALSE},
! 107: {R_OR_S, "ring, wand or staff", FALSE},
! 108: {RING, "ring", FALSE},
! 109: {STICK, "wand or staff", FALSE},
! 110: {WEAPON, "weapon", FALSE},
! 111: {ARMOR, "suit of armor", FALSE},
! 112: };
! 113:
! 114: for (hp = tlist; hp->h_ch; hp++)
! 115: if (type == hp->h_ch)
! 116: return hp->h_desc;
! 117: /* NOTREACHED */
! 118: return(0);
! 119: }
! 120:
! 121: #ifdef MASTER
! 122: /*
! 123: * create_obj:
! 124: * wizard command for getting anything he wants
! 125: */
! 126:
! 127: void
! 128: create_obj(void)
! 129: {
! 130: THING *obj;
! 131: int ch, bless;
! 132:
! 133: obj = new_item();
! 134: msg("type of item: ");
! 135: obj->o_type = readchar();
! 136: mpos = 0;
! 137: msg("which %c do you want? (0-f)", obj->o_type);
! 138: obj->o_which = (isdigit((ch = readchar())) ? ch - '0' : ch - 'a' + 10);
! 139: obj->o_group = 0;
! 140: obj->o_count = 1;
! 141: mpos = 0;
! 142: if (obj->o_type == WEAPON || obj->o_type == ARMOR)
! 143: {
! 144: msg("blessing? (+,-,n)");
! 145: bless = readchar();
! 146: mpos = 0;
! 147: if (bless == '-')
! 148: obj->o_flags |= ISCURSED;
! 149: if (obj->o_type == WEAPON)
! 150: {
! 151: init_weapon(obj, obj->o_which);
! 152: if (bless == '-')
! 153: obj->o_hplus -= rnd(3)+1;
! 154: if (bless == '+')
! 155: obj->o_hplus += rnd(3)+1;
! 156: }
! 157: else
! 158: {
! 159: obj->o_arm = a_class[obj->o_which];
! 160: if (bless == '-')
! 161: obj->o_arm += rnd(3)+1;
! 162: if (bless == '+')
! 163: obj->o_arm -= rnd(3)+1;
! 164: }
! 165: }
! 166: else if (obj->o_type == RING)
! 167: switch (obj->o_which)
! 168: {
! 169: case R_PROTECT:
! 170: case R_ADDSTR:
! 171: case R_ADDHIT:
! 172: case R_ADDDAM:
! 173: msg("blessing? (+,-,n)");
! 174: bless = readchar();
! 175: mpos = 0;
! 176: if (bless == '-')
! 177: obj->o_flags |= ISCURSED;
! 178: obj->o_arm = (bless == '-' ? -1 : rnd(2) + 1);
! 179: when R_AGGR:
! 180: case R_TELEPORT:
! 181: obj->o_flags |= ISCURSED;
! 182: }
! 183: else if (obj->o_type == STICK)
! 184: fix_stick(obj);
! 185: else if (obj->o_type == GOLD)
! 186: {
! 187: msg("how much?");
! 188: get_num(&obj->o_goldval, stdscr);
! 189: }
! 190: add_pack(obj, FALSE);
! 191: }
! 192: #endif
! 193:
! 194: /*
! 195: * telport:
! 196: * Bamf the hero someplace else
! 197: */
! 198:
! 199: void
! 200: teleport(void)
! 201: {
! 202: coord c;
! 203:
! 204: mvaddch(hero.y, hero.x, floor_at());
! 205: find_floor(NULL, &c, FALSE, TRUE);
! 206: if (roomin(&c) != proom)
! 207: {
! 208: leave_room(&hero);
! 209: hero = c;
! 210: enter_room(&hero);
! 211: }
! 212: else
! 213: {
! 214: hero = c;
! 215: look(TRUE);
! 216: }
! 217: mvaddch(hero.y, hero.x, PLAYER);
! 218: /*
! 219: * turn off ISHELD in case teleportation was done while fighting
! 220: * a Flytrap
! 221: */
! 222: if (on(player, ISHELD)) {
! 223: THING *mp;
! 224:
! 225: player.t_flags &= ~ISHELD;
! 226: vf_hit = 0;
! 227: for (mp = mlist; mp != NULL; mp = next(mp)) {
! 228: if (mp->t_type == 'F')
! 229: strcpy(mp->t_stats.s_dmg, "0x0");
! 230: }
! 231: }
! 232: no_move = 0;
! 233: count = 0;
! 234: running = FALSE;
! 235: flush_type();
! 236: }
! 237:
! 238: #ifdef MASTER
! 239: /*
! 240: * passwd:
! 241: * See if user knows password
! 242: */
! 243: int
! 244: passwd(void)
! 245: {
! 246: char *sp;
! 247: int c;
! 248: static char buf[MAXSTR];
! 249:
! 250: msg("wizard's Password:");
! 251: mpos = 0;
! 252: sp = buf;
! 253: while ((c = readchar()) != '\n' && c != '\r' && c != ESCAPE)
! 254: if (c == md_killchar())
! 255: sp = buf;
! 256: else if (c == md_erasechar() && sp > buf)
! 257: sp--;
! 258: else
! 259: *sp++ = (char) c;
! 260: if (sp == buf)
! 261: return FALSE;
! 262: *sp = '\0';
! 263: return (strcmp(PASSWD, md_crypt(buf, "mT")) == 0);
! 264: }
! 265:
! 266: /*
! 267: * show_map:
! 268: * Print out the map for the wizard
! 269: */
! 270:
! 271: void
! 272: show_map(void)
! 273: {
! 274: int y, x, real;
! 275:
! 276: wclear(hw);
! 277: for (y = 1; y < NUMLINES - 1; y++)
! 278: for (x = 0; x < NUMCOLS; x++)
! 279: {
! 280: real = flat(y, x) & F_REAL;
! 281: if (!real)
! 282: wstandout(hw);
! 283: wmove(hw, y, x);
! 284: waddch(hw, chat(y, x));
! 285: if (!(real & F_REAL))
! 286: wstandend(hw);
! 287: }
! 288: show_win("---More (level map)---");
! 289: }
! 290: #endif
CVSweb