Annotation of early-roguelike/urogue/wizard.c, Revision 1.1.1.1
1.1 rubenllo 1: /*
2: wizard.c - Special wizard commands
3:
4: UltraRogue: The Ultimate Adventure in the Dungeons of Doom
5: Copyright (C) 1985, 1986, 1992, 1993, 1995 Herb Chong
6: All rights reserved.
7:
8: Based on "Advanced Rogue"
9: Copyright (C) 1984, 1985 Michael Morgan, Ken Dalka
10: All rights reserved.
11:
12: Based on "Rogue: Exploring the Dungeons of Doom"
13: Copyright (C) 1980, 1981 Michael Toy, Ken Arnold and Glenn Wichman
14: All rights reserved.
15:
16: See the file LICENSE.TXT for full copyright and licensing information.
17: */
18:
19: #include <string.h>
20: #include <stdlib.h>
21: #include "rogue.h"
22:
23: /*
24: whatis()
25: What a certain object is
26: */
27:
28: void
29: whatis(struct linked_list *what)
30: {
31: struct object *obj;
32: int kludge;
33: int print_message = FALSE;
34:
35: if (what == NULL)
36: {
37: print_message = TRUE;
38:
39: while ((what = get_item("identify", 0)) == NULL)
40: ;
41: }
42:
43: obj = OBJPTR(what);
44: obj->o_flags |= ISKNOW;
45:
46: switch (obj->o_type)
47: {
48: case SCROLL: kludge = TYP_SCROLL; break;
49: case POTION: kludge = TYP_POTION; break;
50: case STICK: kludge = TYP_STICK; break;
51: case RING: kludge = TYP_RING; break;
52: case WEAPON:
53: case ARMOR:
54: default: kludge = -1; break;
55: }
56:
57: if (kludge != -1)
58: {
59: know_items[kludge][obj->o_which] = TRUE;
60:
61: if (guess_items[kludge][obj->o_which])
62: {
63: ur_free(guess_items[kludge][obj->o_which]);
64: guess_items[kludge][obj->o_which] = NULL;
65: }
66: }
67:
68: if (print_message)
69: msg(inv_name(obj, UPPERCASE));
70: }
71:
72: /*
73: teleport()
74: Bamf the hero someplace else
75: */
76:
77: void
78: teleport(void)
79: {
80: struct room *new_rp = NULL, *old_rp = roomin(hero);
81:
82: int rm, which;
83: coord c;
84: int is_lit = FALSE; /* For saving room light state */
85: int rand_position = TRUE;
86:
87: c = hero;
88:
89: mvwaddch(cw, hero.y, hero.x, mvwinch(stdscr, hero.y, hero.x));
90:
91: if (is_wearing(R_TELCONTROL))
92: {
93: msg("Where do you wish to teleport to? (* for help)");
94: wmove(cw, hero.y, hero.x);
95: wrefresh(cw);
96:
97: which = (short) (readchar() & 0177);
98:
99: while (which != (short) ESCAPE && which != (short) LINEFEED
100: && which != (short) CARRIAGE_RETURN)
101: {
102: switch(which)
103: {
104: case 'h': c.x--; break;
105: case 'j': c.y++; break;
106: case 'k': c.y--; break;
107: case 'l': c.x++; break;
108: case 'y': c.x--;
109: c.y--; break;
110: case 'u': c.x++;
111: c.y--; break;
112: case 'b': c.x--;
113: c.y++; break;
114: case 'n': c.x++;
115: c.y++; break;
116: case '*':
117: msg("Use h,j,k,l,y,u,b,n to position cursor, then hit"
118: "return.");
119: }
120:
121: c.y = max(c.y, 1);
122: c.y = min(c.y, LINES - 3);
123: c.x = max(c.x, 1);
124: c.x = min(c.x, COLS - 1);
125: wmove(cw, c.y, c.x);
126: wrefresh(cw);
127: which = (short) (readchar() & 0177);
128: }
129:
130: which = winat(c.y, c.x);
131:
132: if ((which == FLOOR || which == PASSAGE || which == DOOR) &&
133: ((ring_value(R_TELCONTROL) == 0 && rnd(10) < 6)
134: || (ring_value(R_TELCONTROL) > 0 && rnd(10) < 9)))
135: {
136: rand_position = FALSE;
137: msg("You attempt succeeds.");
138: hero = c;
139: new_rp = roomin(hero);
140: }
141: else
142: msg("Your attempt fails.");
143: }
144:
145: if (rand_position)
146: {
147: do
148: {
149: rm = rnd_room();
150: rnd_pos(&rooms[rm], &hero);
151: }
152: while (winat(hero.y, hero.x) != FLOOR);
153:
154: new_rp = &rooms[rm];
155: }
156:
157: /* If hero gets moved, darken old room */
158:
159: if (old_rp && old_rp != new_rp)
160: {
161: if (!(old_rp->r_flags & ISDARK))
162: is_lit = TRUE;
163:
164: old_rp->r_flags |= ISDARK; /* Fake darkness */
165: light(&c);
166:
167: if (is_lit)
168: old_rp->r_flags &= ~ISDARK; /* Restore light state */
169: }
170:
171: light(&hero);
172: mvwaddch(cw, hero.y, hero.x, PLAYER);
173:
174: /* turn off ISHELD in case teleportation was done while fighting */
175:
176: if (on(player, ISHELD))
177: {
178: struct linked_list *ip, *nip;
179: struct thing *mp;
180:
181: turn_off(player, ISHELD);
182: hold_count = 0;
183:
184: for (ip = mlist; ip; ip = nip)
185: {
186: mp = THINGPTR(ip);
187: nip = next(ip);
188:
189: if (on(*mp, DIDHOLD))
190: {
191: turn_off(*mp, DIDHOLD);
192: turn_on(*mp, CANHOLD);
193: }
194:
195: turn_off(*mp, DIDSUFFOCATE);
196: }
197: }
198:
199: extinguish_fuse(FUSE_SUFFOCATE);
200: player.t_no_move = 0; /* not trapped anymore */
201: count = 0;
202: running = FALSE;
203:
204: return;
205: }
206:
207: /*
208: passwd()
209: see if user knows password
210: */
211:
212: int
213: passwd(void)
214: {
215: char *sp, c;
216: char buf[2 * LINELEN];
217:
218: msg("Wizard's Password:");
219: mpos = 0;
220: sp = buf;
221:
222: while ((c = (readchar() & 0177)) != '\n' && c != '\r' && c != '\033')
223: {
224: if (c == '\0')
225: sp = buf;
226: else if (c == '\b' && sp > buf)
227: sp--;
228: else
229: *sp++ = c;
230: }
231:
232: if (sp == buf)
233: return(FALSE);
234:
235: *sp = '\0';
236:
237: return(TRUE);
238: }
CVSweb