Mercurial > hg > early-roguelike
comparison 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 |
comparison
equal
deleted
inserted
replaced
| -1:000000000000 | 0:527e2150eaf0 |
|---|---|
| 1 | |
| 2 /* | |
| 3 * Special wizard commands (some of which are also non-wizard commands | |
| 4 * under strange circumstances) | |
| 5 * | |
| 6 * @(#)wizard.c 3.8 (Berkeley) 6/3/81 | |
| 7 * | |
| 8 * Rogue: Exploring the Dungeons of Doom | |
| 9 * Copyright (C) 1980, 1981 Michael Toy, Ken Arnold and Glenn Wichman | |
| 10 * All rights reserved. | |
| 11 * | |
| 12 * See the file LICENSE.TXT for full copyright and licensing information. | |
| 13 */ | |
| 14 | |
| 15 #include "curses.h" | |
| 16 #include <ctype.h> | |
| 17 #include <string.h> | |
| 18 #include <stdlib.h> | |
| 19 #include "machdep.h" | |
| 20 #include "rogue.h" | |
| 21 | |
| 22 /* | |
| 23 * whatis: | |
| 24 * What a certin object is | |
| 25 */ | |
| 26 | |
| 27 void | |
| 28 whatis() | |
| 29 { | |
| 30 struct object *obj; | |
| 31 struct linked_list *item; | |
| 32 | |
| 33 if ((item = get_item("identify", 0)) == NULL) | |
| 34 return; | |
| 35 obj = (struct object *) ldata(item); | |
| 36 switch (obj->o_type) | |
| 37 { | |
| 38 case SCROLL: | |
| 39 s_know[obj->o_which] = TRUE; | |
| 40 if (s_guess[obj->o_which]) | |
| 41 { | |
| 42 free(s_guess[obj->o_which]); | |
| 43 s_guess[obj->o_which] = NULL; | |
| 44 } | |
| 45 when POTION: | |
| 46 p_know[obj->o_which] = TRUE; | |
| 47 if (p_guess[obj->o_which]) | |
| 48 { | |
| 49 free(p_guess[obj->o_which]); | |
| 50 p_guess[obj->o_which] = NULL; | |
| 51 } | |
| 52 when STICK: | |
| 53 ws_know[obj->o_which] = TRUE; | |
| 54 obj->o_flags |= ISKNOW; | |
| 55 if (ws_guess[obj->o_which]) | |
| 56 { | |
| 57 free(ws_guess[obj->o_which]); | |
| 58 ws_guess[obj->o_which] = NULL; | |
| 59 } | |
| 60 when WEAPON: | |
| 61 case ARMOR: | |
| 62 obj->o_flags |= ISKNOW; | |
| 63 when RING: | |
| 64 r_know[obj->o_which] = TRUE; | |
| 65 obj->o_flags |= ISKNOW; | |
| 66 if (r_guess[obj->o_which]) | |
| 67 { | |
| 68 free(r_guess[obj->o_which]); | |
| 69 r_guess[obj->o_which] = NULL; | |
| 70 } | |
| 71 } | |
| 72 msg(inv_name(obj, FALSE)); | |
| 73 } | |
| 74 | |
| 75 /* | |
| 76 * create_obj: | |
| 77 * Wizard command for getting anything he wants | |
| 78 */ | |
| 79 | |
| 80 void | |
| 81 create_obj() | |
| 82 { | |
| 83 struct linked_list *item; | |
| 84 struct object *obj; | |
| 85 int bless; | |
| 86 int ch; | |
| 87 | |
| 88 item = new_item(sizeof *obj); | |
| 89 obj = (struct object *) ldata(item); | |
| 90 msg("Type of item: "); | |
| 91 obj->o_type = readchar(cw); | |
| 92 mpos = 0; | |
| 93 msg("Which %c do you want? (0-f)", obj->o_type); | |
| 94 obj->o_which = (isdigit((ch = readchar(cw))) ? ch - '0' : ch - 'a' + 10); | |
| 95 obj->o_group = 0; | |
| 96 obj->o_count = 1; | |
| 97 mpos = 0; | |
| 98 if (obj->o_type == WEAPON || obj->o_type == ARMOR) | |
| 99 { | |
| 100 msg("Blessing? (+,-,n)"); | |
| 101 bless = readchar(cw); | |
| 102 mpos = 0; | |
| 103 if (obj->o_type == WEAPON) | |
| 104 { | |
| 105 init_weapon(obj, obj->o_which); | |
| 106 if (bless == '-') { | |
| 107 obj->o_hplus -= rnd(3)+1; | |
| 108 obj->o_flags |= ISCURSED; | |
| 109 } | |
| 110 if (bless == '+') | |
| 111 obj->o_hplus += rnd(3)+1; | |
| 112 } | |
| 113 else | |
| 114 { | |
| 115 obj->o_ac = a_class[obj->o_which]; | |
| 116 if (bless == '-') { | |
| 117 obj->o_ac += rnd(3)+1; | |
| 118 obj->o_flags |= ISCURSED; | |
| 119 } | |
| 120 if (bless == '+') | |
| 121 obj->o_ac -= rnd(3)+1; | |
| 122 } | |
| 123 } | |
| 124 else if (obj->o_type == RING) | |
| 125 switch (obj->o_which) | |
| 126 { | |
| 127 case R_PROTECT: | |
| 128 case R_ADDSTR: | |
| 129 case R_ADDHIT: | |
| 130 case R_ADDDAM: | |
| 131 msg("Blessing? (+,-,n)"); | |
| 132 bless = readchar(cw); | |
| 133 mpos = 0; | |
| 134 if (bless == '-') | |
| 135 obj->o_flags |= ISCURSED; | |
| 136 obj->o_ac = (bless == '-' ? -1 : rnd(2) + 1); | |
| 137 } | |
| 138 else if (obj->o_type == STICK) | |
| 139 fix_stick(obj); | |
| 140 add_pack(item, FALSE); | |
| 141 } | |
| 142 | |
| 143 /* | |
| 144 * telport: | |
| 145 * Bamf the hero someplace else | |
| 146 */ | |
| 147 | |
| 148 int | |
| 149 teleport() | |
| 150 { | |
| 151 int rm; | |
| 152 coord c; | |
| 153 | |
| 154 c = hero; | |
| 155 mvwaddch(cw, hero.y, hero.x, mvwinch(stdscr, hero.y, hero.x)); | |
| 156 do | |
| 157 { | |
| 158 rm = rnd_room(); | |
| 159 rnd_pos(&rooms[rm], &hero); | |
| 160 } until(winat(hero.y, hero.x) == FLOOR); | |
| 161 light(&c); | |
| 162 light(&hero); | |
| 163 mvwaddch(cw, hero.y, hero.x, PLAYER); | |
| 164 /* | |
| 165 * turn off ISHELD in case teleportation was done while fighting | |
| 166 * a Fungi | |
| 167 */ | |
| 168 if (on(player, ISHELD)) { | |
| 169 player.t_flags &= ~ISHELD; | |
| 170 fung_hit = 0; | |
| 171 strcpy(monsters['F'-'A'].m_stats.s_dmg, "000d0"); | |
| 172 } | |
| 173 count = 0; | |
| 174 running = FALSE; | |
| 175 flush_type(); /* flush typeahead */ | |
| 176 return rm; | |
| 177 } | |
| 178 | |
| 179 /* | |
| 180 * passwd: | |
| 181 * see if user knows password | |
| 182 */ | |
| 183 | |
| 184 int | |
| 185 passwd() | |
| 186 { | |
| 187 char *sp, c; | |
| 188 char buf[80]; | |
| 189 | |
| 190 msg("Wizard's Password:"); | |
| 191 mpos = 0; | |
| 192 sp = buf; | |
| 193 while ((c = readchar(cw)) != '\n' && c != '\r' && c != '\033') | |
| 194 if (c == md_killchar()) | |
| 195 sp = buf; | |
| 196 else if (c == md_erasechar() && sp > buf) | |
| 197 sp--; | |
| 198 else | |
| 199 *sp++ = c; | |
| 200 if (sp == buf) | |
| 201 return FALSE; | |
| 202 *sp = '\0'; | |
| 203 return (strcmp(PASSWD, crypt(buf, "mT")) == 0); | |
| 204 } |
