Mercurial > hg > early-roguelike
comparison 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 |
comparison
equal
deleted
inserted
replaced
| 11:949d558c2162 | 12:9535a08ddc39 |
|---|---|
| 1 | |
| 2 /* | |
| 3 * Special wizard commands (some of which are also non-wizard commands | |
| 4 * under strange circumstances) | |
| 5 * | |
| 6 * @(#)wizard.c 4.14 (Berkeley) 1/26/82 | |
| 7 */ | |
| 8 | |
| 9 #include <curses.h> | |
| 10 #include <ctype.h> | |
| 11 #include <string.h> | |
| 12 #include "rogue.h" | |
| 13 | |
| 14 /* | |
| 15 * whatis: | |
| 16 * What a certin object is | |
| 17 */ | |
| 18 whatis(insist) | |
| 19 bool insist; | |
| 20 { | |
| 21 register THING *obj; | |
| 22 | |
| 23 if (pack == NULL) | |
| 24 { | |
| 25 msg("You don't have anything in your pack to identify"); | |
| 26 return; | |
| 27 } | |
| 28 | |
| 29 for (;;) | |
| 30 if ((obj = get_item("identify", 0)) == NULL && insist) | |
| 31 msg("You must identify something"); | |
| 32 else | |
| 33 break; | |
| 34 | |
| 35 if (!insist && obj == NULL) | |
| 36 return; | |
| 37 | |
| 38 switch (obj->o_type) | |
| 39 { | |
| 40 case SCROLL: | |
| 41 s_know[obj->o_which] = TRUE; | |
| 42 if (s_guess[obj->o_which]) | |
| 43 { | |
| 44 free(s_guess[obj->o_which]); | |
| 45 s_guess[obj->o_which] = NULL; | |
| 46 } | |
| 47 when POTION: | |
| 48 p_know[obj->o_which] = TRUE; | |
| 49 if (p_guess[obj->o_which]) | |
| 50 { | |
| 51 free(p_guess[obj->o_which]); | |
| 52 p_guess[obj->o_which] = NULL; | |
| 53 } | |
| 54 when STICK: | |
| 55 ws_know[obj->o_which] = TRUE; | |
| 56 obj->o_flags |= ISKNOW; | |
| 57 if (ws_guess[obj->o_which]) | |
| 58 { | |
| 59 free(ws_guess[obj->o_which]); | |
| 60 ws_guess[obj->o_which] = NULL; | |
| 61 } | |
| 62 when WEAPON: | |
| 63 case ARMOR: | |
| 64 obj->o_flags |= ISKNOW; | |
| 65 when RING: | |
| 66 r_know[obj->o_which] = TRUE; | |
| 67 obj->o_flags |= ISKNOW; | |
| 68 if (r_guess[obj->o_which]) | |
| 69 { | |
| 70 free(r_guess[obj->o_which]); | |
| 71 r_guess[obj->o_which] = NULL; | |
| 72 } | |
| 73 } | |
| 74 msg(inv_name(obj, FALSE)); | |
| 75 } | |
| 76 | |
| 77 #ifdef WIZARD | |
| 78 /* | |
| 79 * create_obj: | |
| 80 * Wizard command for getting anything he wants | |
| 81 */ | |
| 82 create_obj() | |
| 83 { | |
| 84 register THING *obj; | |
| 85 register char ch, bless; | |
| 86 | |
| 87 obj = new_item(); | |
| 88 msg("type of item: "); | |
| 89 obj->o_type = readchar(); | |
| 90 mpos = 0; | |
| 91 msg("which %c do you want? (0-f)", obj->o_type); | |
| 92 obj->o_which = (isdigit((ch = readchar())) ? ch - '0' : ch - 'a' + 10); | |
| 93 obj->o_group = 0; | |
| 94 obj->o_count = 1; | |
| 95 mpos = 0; | |
| 96 if (obj->o_type == WEAPON || obj->o_type == ARMOR) | |
| 97 { | |
| 98 msg("blessing? (+,-,n)"); | |
| 99 bless = readchar(); | |
| 100 mpos = 0; | |
| 101 if (bless == '-') | |
| 102 obj->o_flags |= ISCURSED; | |
| 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 if (bless == '+') | |
| 109 obj->o_hplus += rnd(3)+1; | |
| 110 } | |
| 111 else | |
| 112 { | |
| 113 obj->o_ac = a_class[obj->o_which]; | |
| 114 if (bless == '-') | |
| 115 obj->o_ac += rnd(3)+1; | |
| 116 if (bless == '+') | |
| 117 obj->o_ac -= rnd(3)+1; | |
| 118 } | |
| 119 } | |
| 120 else if (obj->o_type == RING) | |
| 121 switch (obj->o_which) | |
| 122 { | |
| 123 case R_PROTECT: | |
| 124 case R_ADDSTR: | |
| 125 case R_ADDHIT: | |
| 126 case R_ADDDAM: | |
| 127 msg("blessing? (+,-,n)"); | |
| 128 bless = readchar(); | |
| 129 mpos = 0; | |
| 130 if (bless == '-') | |
| 131 obj->o_flags |= ISCURSED; | |
| 132 obj->o_ac = (bless == '-' ? -1 : rnd(2) + 1); | |
| 133 when R_AGGR: | |
| 134 case R_TELEPORT: | |
| 135 obj->o_flags |= ISCURSED; | |
| 136 } | |
| 137 else if (obj->o_type == STICK) | |
| 138 fix_stick(obj); | |
| 139 else if (obj->o_type == GOLD) | |
| 140 { | |
| 141 msg("how much?"); | |
| 142 get_num(&obj->o_goldval, stdscr); | |
| 143 } | |
| 144 add_pack(obj, FALSE); | |
| 145 } | |
| 146 #endif | |
| 147 | |
| 148 /* | |
| 149 * telport: | |
| 150 * Bamf the hero someplace else | |
| 151 */ | |
| 152 teleport() | |
| 153 { | |
| 154 register int rm; | |
| 155 coord c; | |
| 156 | |
| 157 mvaddch(hero.y, hero.x, chat(hero.y, hero.x)); | |
| 158 do | |
| 159 { | |
| 160 rm = rnd_room(); | |
| 161 rnd_pos(&rooms[rm], &c); | |
| 162 } until (step_ok(winat(c.y, c.x))); | |
| 163 if (&rooms[rm] != proom) | |
| 164 { | |
| 165 leave_room(&hero); | |
| 166 hero = c; | |
| 167 enter_room(&hero); | |
| 168 } | |
| 169 else | |
| 170 { | |
| 171 hero = c; | |
| 172 look(TRUE); | |
| 173 } | |
| 174 mvaddch(hero.y, hero.x, PLAYER); | |
| 175 /* | |
| 176 * turn off ISHELD in case teleportation was done while fighting | |
| 177 * a Fungi | |
| 178 */ | |
| 179 if (on(player, ISHELD)) { | |
| 180 player.t_flags &= ~ISHELD; | |
| 181 fung_hit = 0; | |
| 182 strcpy(monsters['F'-'A'].m_stats.s_dmg, "000d0"); | |
| 183 } | |
| 184 no_move = 0; | |
| 185 count = 0; | |
| 186 running = FALSE; | |
| 187 flush_type(); | |
| 188 return rm; | |
| 189 } | |
| 190 | |
| 191 #ifdef WIZARD | |
| 192 /* | |
| 193 * passwd: | |
| 194 * See if user knows password | |
| 195 */ | |
| 196 passwd() | |
| 197 { | |
| 198 register char *sp, c; | |
| 199 char buf[MAXSTR], *xcrypt(); | |
| 200 | |
| 201 msg("wizard's Password:"); | |
| 202 mpos = 0; | |
| 203 sp = buf; | |
| 204 while ((c = readchar()) != '\n' && c != '\r' && c != ESCAPE) | |
| 205 if (c == md_killchar()) | |
| 206 sp = buf; | |
| 207 else if (c == md_erasechar() && sp > buf) | |
| 208 sp--; | |
| 209 else | |
| 210 *sp++ = c; | |
| 211 if (sp == buf) | |
| 212 return FALSE; | |
| 213 *sp = '\0'; | |
| 214 return (strcmp(PASSWD, xcrypt(buf, "mT")) == 0); | |
| 215 } | |
| 216 | |
| 217 /* | |
| 218 * show_map: | |
| 219 * Print out the map for the wizard | |
| 220 */ | |
| 221 show_map() | |
| 222 { | |
| 223 register int y, x, real; | |
| 224 | |
| 225 wclear(hw); | |
| 226 for (y = 1; y < LINES - 1; y++) | |
| 227 for (x = 0; x < COLS; x++) | |
| 228 { | |
| 229 if (!(real = flat(y, x) & F_REAL)) | |
| 230 wstandout(hw); | |
| 231 wmove(hw, y, x); | |
| 232 waddch(hw, chat(y, x)); | |
| 233 if (!real) | |
| 234 wstandend(hw); | |
| 235 } | |
| 236 show_win(hw, "---More (level map)---"); | |
| 237 } | |
| 238 #endif |
