Mercurial > hg > early-roguelike
diff rogue4/wizard.c @ 12:9535a08ddc39
Import Rogue 5.2 from the Roguelike Restoration Project (r1490)
author | edwarj4 |
---|---|
date | Sat, 24 Oct 2009 16:52:52 +0000 |
parents | |
children | 00e90f1bffd6 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/rogue4/wizard.c Sat Oct 24 16:52:52 2009 +0000 @@ -0,0 +1,238 @@ + +/* + * Special wizard commands (some of which are also non-wizard commands + * under strange circumstances) + * + * @(#)wizard.c 4.14 (Berkeley) 1/26/82 + */ + +#include <curses.h> +#include <ctype.h> +#include <string.h> +#include "rogue.h" + +/* + * whatis: + * What a certin object is + */ +whatis(insist) +bool insist; +{ + register THING *obj; + + if (pack == NULL) + { + msg("You don't have anything in your pack to identify"); + return; + } + + for (;;) + if ((obj = get_item("identify", 0)) == NULL && insist) + msg("You must identify something"); + else + break; + + if (!insist && obj == NULL) + return; + + 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)); +} + +#ifdef WIZARD +/* + * create_obj: + * Wizard command for getting anything he wants + */ +create_obj() +{ + register THING *obj; + register char ch, bless; + + obj = new_item(); + msg("type of item: "); + obj->o_type = readchar(); + mpos = 0; + msg("which %c do you want? (0-f)", obj->o_type); + obj->o_which = (isdigit((ch = readchar())) ? 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(); + mpos = 0; + if (bless == '-') + obj->o_flags |= ISCURSED; + if (obj->o_type == WEAPON) + { + init_weapon(obj, obj->o_which); + if (bless == '-') + obj->o_hplus -= rnd(3)+1; + 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; + 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(); + mpos = 0; + if (bless == '-') + obj->o_flags |= ISCURSED; + obj->o_ac = (bless == '-' ? -1 : rnd(2) + 1); + when R_AGGR: + case R_TELEPORT: + obj->o_flags |= ISCURSED; + } + else if (obj->o_type == STICK) + fix_stick(obj); + else if (obj->o_type == GOLD) + { + msg("how much?"); + get_num(&obj->o_goldval, stdscr); + } + add_pack(obj, FALSE); +} +#endif + +/* + * telport: + * Bamf the hero someplace else + */ +teleport() +{ + register int rm; + coord c; + + mvaddch(hero.y, hero.x, chat(hero.y, hero.x)); + do + { + rm = rnd_room(); + rnd_pos(&rooms[rm], &c); + } until (step_ok(winat(c.y, c.x))); + if (&rooms[rm] != proom) + { + leave_room(&hero); + hero = c; + enter_room(&hero); + } + else + { + hero = c; + look(TRUE); + } + mvaddch(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"); + } + no_move = 0; + count = 0; + running = FALSE; + flush_type(); + return rm; +} + +#ifdef WIZARD +/* + * passwd: + * See if user knows password + */ +passwd() +{ + register char *sp, c; + char buf[MAXSTR], *xcrypt(); + + msg("wizard's Password:"); + mpos = 0; + sp = buf; + while ((c = readchar()) != '\n' && c != '\r' && c != ESCAPE) + 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, xcrypt(buf, "mT")) == 0); +} + +/* + * show_map: + * Print out the map for the wizard + */ +show_map() +{ + register int y, x, real; + + wclear(hw); + for (y = 1; y < LINES - 1; y++) + for (x = 0; x < COLS; x++) + { + if (!(real = flat(y, x) & F_REAL)) + wstandout(hw); + wmove(hw, y, x); + waddch(hw, chat(y, x)); + if (!real) + wstandend(hw); + } + show_win(hw, "---More (level map)---"); +} +#endif