Mercurial > hg > early-roguelike
comparison rogue3/scrolls.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 |
comparison
equal
deleted
inserted
replaced
| -1:000000000000 | 0:527e2150eaf0 |
|---|---|
| 1 | |
| 2 /* | |
| 3 * Read a scroll and let it happen | |
| 4 * | |
| 5 * @(#)scrolls.c 3.5 (Berkeley) 6/15/81 | |
| 6 * | |
| 7 * Rogue: Exploring the Dungeons of Doom | |
| 8 * Copyright (C) 1980, 1981 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 "curses.h" | |
| 15 #include <stdlib.h> | |
| 16 #include <ctype.h> | |
| 17 #include <string.h> | |
| 18 #include "rogue.h" | |
| 19 | |
| 20 void | |
| 21 read_scroll() | |
| 22 { | |
| 23 struct object *obj; | |
| 24 struct linked_list *item; | |
| 25 struct room *rp; | |
| 26 int i,j; | |
| 27 int ch, nch; | |
| 28 struct linked_list *titem; | |
| 29 char buf[80]; | |
| 30 | |
| 31 item = get_item("read", SCROLL); | |
| 32 if (item == NULL) | |
| 33 return; | |
| 34 obj = (struct object *) ldata(item); | |
| 35 if (obj->o_type != SCROLL) | |
| 36 { | |
| 37 if (!terse) | |
| 38 msg("There is nothing on it to read"); | |
| 39 else | |
| 40 msg("Nothing to read"); | |
| 41 return; | |
| 42 } | |
| 43 msg("As you read the scroll, it vanishes."); | |
| 44 /* | |
| 45 * Calculate the effect it has on the poor guy. | |
| 46 */ | |
| 47 if (obj == cur_weapon) | |
| 48 cur_weapon = NULL; | |
| 49 switch(obj->o_which) | |
| 50 { | |
| 51 case S_CONFUSE: | |
| 52 /* | |
| 53 * Scroll of monster confusion. Give him that power. | |
| 54 */ | |
| 55 msg("Your hands begin to glow red"); | |
| 56 player.t_flags |= CANHUH; | |
| 57 when S_LIGHT: | |
| 58 s_know[S_LIGHT] = TRUE; | |
| 59 if ((rp = roomin(&hero)) == NULL) | |
| 60 msg("The corridor glows and then fades"); | |
| 61 else | |
| 62 { | |
| 63 addmsg("The room is lit"); | |
| 64 if (!terse) | |
| 65 addmsg(" by a shimmering blue light."); | |
| 66 endmsg(); | |
| 67 rp->r_flags &= ~ISDARK; | |
| 68 /* | |
| 69 * Light the room and put the player back up | |
| 70 */ | |
| 71 light(&hero); | |
| 72 mvwaddch(cw, hero.y, hero.x, PLAYER); | |
| 73 } | |
| 74 when S_ARMOR: | |
| 75 if (cur_armor != NULL) | |
| 76 { | |
| 77 msg("Your armor glows faintly for a moment"); | |
| 78 cur_armor->o_ac--; | |
| 79 cur_armor->o_flags &= ~ISCURSED; | |
| 80 } | |
| 81 when S_HOLD: | |
| 82 /* | |
| 83 * Hold monster scroll. Stop all monsters within two spaces | |
| 84 * from chasing after the hero. | |
| 85 */ | |
| 86 { | |
| 87 int x,y; | |
| 88 struct linked_list *mon; | |
| 89 | |
| 90 for (x = hero.x-2; x <= hero.x+2; x++) | |
| 91 for (y = hero.y-2; y <= hero.y+2; y++) | |
| 92 if (y > 0 && x > 0 && isupper(mvwinch(mw, y, x))) | |
| 93 if ((mon = find_mons(y, x)) != NULL) | |
| 94 { | |
| 95 struct thing *th; | |
| 96 | |
| 97 th = (struct thing *) ldata(mon); | |
| 98 th->t_flags &= ~ISRUN; | |
| 99 th->t_flags |= ISHELD; | |
| 100 } | |
| 101 } | |
| 102 when S_SLEEP: | |
| 103 /* | |
| 104 * Scroll which makes you fall asleep | |
| 105 */ | |
| 106 s_know[S_SLEEP] = TRUE; | |
| 107 msg("You fall asleep."); | |
| 108 no_command += 4 + rnd(SLEEPTIME); | |
| 109 when S_CREATE: | |
| 110 /* | |
| 111 * Create a monster | |
| 112 * First look in a circle around him, next try his room | |
| 113 * otherwise give up | |
| 114 */ | |
| 115 { | |
| 116 int x, y; | |
| 117 int appear = 0; | |
| 118 coord mp; | |
| 119 | |
| 120 /* | |
| 121 * Search for an open place | |
| 122 */ | |
| 123 for (y = hero.y-1; y <= hero.y+1; y++) | |
| 124 for (x = hero.x-1; x <= hero.x+1; x++) | |
| 125 { | |
| 126 /* | |
| 127 * Don't put a monster in top of the player. | |
| 128 */ | |
| 129 if (y == hero.y && x == hero.x) | |
| 130 continue; | |
| 131 /* | |
| 132 * Or anything else nasty | |
| 133 */ | |
| 134 if (step_ok(winat(y, x))) | |
| 135 { | |
| 136 if (rnd(++appear) == 0) | |
| 137 { | |
| 138 mp.y = y; | |
| 139 mp.x = x; | |
| 140 } | |
| 141 } | |
| 142 } | |
| 143 if (appear) | |
| 144 { | |
| 145 titem = new_item(sizeof (struct thing)); | |
| 146 new_monster(titem, randmonster(FALSE), &mp); | |
| 147 } | |
| 148 else | |
| 149 msg("You hear a faint cry of anguish in the distance."); | |
| 150 } | |
| 151 when S_IDENT: | |
| 152 /* | |
| 153 * Identify, let the rogue figure something out | |
| 154 */ | |
| 155 msg("This scroll is an identify scroll"); | |
| 156 s_know[S_IDENT] = TRUE; | |
| 157 whatis(); | |
| 158 when S_MAP: | |
| 159 /* | |
| 160 * Scroll of magic mapping. | |
| 161 */ | |
| 162 s_know[S_MAP] = TRUE; | |
| 163 msg("Oh, now this scroll has a map on it."); | |
| 164 overwrite(stdscr, hw); | |
| 165 /* | |
| 166 * Take all the things we want to keep hidden out of the window | |
| 167 */ | |
| 168 for (i = 0; i < LINES; i++) | |
| 169 for (j = 0; j < COLS; j++) | |
| 170 { | |
| 171 switch (nch = ch = mvwinch(hw, i, j)) | |
| 172 { | |
| 173 case SECRETDOOR: | |
| 174 nch = DOOR; | |
| 175 mvaddch(i, j, nch); | |
| 176 case '-': | |
| 177 case '|': | |
| 178 case DOOR: | |
| 179 case PASSAGE: | |
| 180 case ' ': | |
| 181 case STAIRS: | |
| 182 if (mvwinch(mw, i, j) != ' ') | |
| 183 { | |
| 184 struct thing *it; | |
| 185 | |
| 186 it = (struct thing *) ldata(find_mons(i, j)); | |
| 187 if ((it != NULL) && (it->t_oldch == ' ')) | |
| 188 it->t_oldch = nch; | |
| 189 } | |
| 190 break; | |
| 191 default: | |
| 192 nch = ' '; | |
| 193 } | |
| 194 if (nch != ch) | |
| 195 waddch(hw, nch); | |
| 196 } | |
| 197 /* | |
| 198 * Copy in what he has discovered | |
| 199 */ | |
| 200 overlay(cw, hw); | |
| 201 /* | |
| 202 * And set up for display | |
| 203 */ | |
| 204 overwrite(hw, cw); | |
| 205 when S_GFIND: | |
| 206 /* | |
| 207 * Potion of gold detection | |
| 208 */ | |
| 209 { | |
| 210 int gtotal = 0; | |
| 211 | |
| 212 wclear(hw); | |
| 213 for (i = 0; i < MAXROOMS; i++) | |
| 214 { | |
| 215 gtotal += rooms[i].r_goldval; | |
| 216 if (rooms[i].r_goldval != 0 && | |
| 217 mvwinch(stdscr, rooms[i].r_gold.y, rooms[i].r_gold.x) | |
| 218 == GOLD) | |
| 219 mvwaddch(hw,rooms[i].r_gold.y,rooms[i].r_gold.x,GOLD); | |
| 220 } | |
| 221 if (gtotal) | |
| 222 { | |
| 223 s_know[S_GFIND] = TRUE; | |
| 224 show_win(hw, | |
| 225 "You begin to feel greedy and you sense gold.--More--"); | |
| 226 } | |
| 227 else msg("You begin to feel a pull downward"); | |
| 228 } | |
| 229 when S_TELEP: | |
| 230 /* | |
| 231 * Scroll of teleportation: | |
| 232 * Make him dissapear and reappear | |
| 233 */ | |
| 234 { | |
| 235 int rm; | |
| 236 struct room *cur_room; | |
| 237 | |
| 238 cur_room = roomin(&hero); | |
| 239 rm = teleport(); | |
| 240 if (cur_room != &rooms[rm]) | |
| 241 s_know[S_TELEP] = TRUE; | |
| 242 } | |
| 243 when S_ENCH: | |
| 244 if (cur_weapon == NULL) | |
| 245 msg("You feel a strange sense of loss."); | |
| 246 else | |
| 247 { | |
| 248 cur_weapon->o_flags &= ~ISCURSED; | |
| 249 if (rnd(100) > 50) | |
| 250 cur_weapon->o_hplus++; | |
| 251 else | |
| 252 cur_weapon->o_dplus++; | |
| 253 msg("Your %s glows blue for a moment.", w_names[cur_weapon->o_which]); | |
| 254 } | |
| 255 when S_SCARE: | |
| 256 /* | |
| 257 * A monster will refuse to step on a scare monster scroll | |
| 258 * if it is dropped. Thus reading it is a mistake and produces | |
| 259 * laughter at the poor rogue's boo boo. | |
| 260 */ | |
| 261 msg("You hear maniacal laughter in the distance."); | |
| 262 when S_REMOVE: | |
| 263 if (cur_armor != NULL) | |
| 264 cur_armor->o_flags &= ~ISCURSED; | |
| 265 if (cur_weapon != NULL) | |
| 266 cur_weapon->o_flags &= ~ISCURSED; | |
| 267 if (cur_ring[LEFT] != NULL) | |
| 268 cur_ring[LEFT]->o_flags &= ~ISCURSED; | |
| 269 if (cur_ring[RIGHT] != NULL) | |
| 270 cur_ring[RIGHT]->o_flags &= ~ISCURSED; | |
| 271 msg("You feel as if somebody is watching over you."); | |
| 272 when S_AGGR: | |
| 273 /* | |
| 274 * This scroll aggravates all the monsters on the current | |
| 275 * level and sets them running towards the hero | |
| 276 */ | |
| 277 aggravate(); | |
| 278 msg("You hear a high pitched humming noise."); | |
| 279 when S_NOP: | |
| 280 msg("This scroll seems to be blank."); | |
| 281 when S_GENOCIDE: | |
| 282 msg("You have been granted the boon of genocide"); | |
| 283 genocide(); | |
| 284 s_know[S_GENOCIDE] = TRUE; | |
| 285 otherwise: | |
| 286 msg("What a puzzling scroll!"); | |
| 287 return; | |
| 288 } | |
| 289 look(TRUE); /* put the result of the scroll on the screen */ | |
| 290 status(); | |
| 291 if (s_know[obj->o_which] && s_guess[obj->o_which]) | |
| 292 { | |
| 293 free(s_guess[obj->o_which]); | |
| 294 s_guess[obj->o_which] = NULL; | |
| 295 } | |
| 296 else if (!s_know[obj->o_which] && askme && s_guess[obj->o_which] == NULL) | |
| 297 { | |
| 298 msg(terse ? "Call it: " : "What do you want to call it? "); | |
| 299 if (get_str(buf, cw) == NORM) | |
| 300 { | |
| 301 s_guess[obj->o_which] = malloc((unsigned int) strlen(buf) + 1); | |
| 302 if (s_guess[obj->o_which] != NULL) | |
| 303 strcpy(s_guess[obj->o_which], buf); | |
| 304 } | |
| 305 } | |
| 306 /* | |
| 307 * Get rid of the thing | |
| 308 */ | |
| 309 inpack--; | |
| 310 if (obj->o_count > 1) | |
| 311 obj->o_count--; | |
| 312 else | |
| 313 { | |
| 314 detach(pack, item); | |
| 315 discard(item); | |
| 316 } | |
| 317 } |
