Mercurial > hg > early-roguelike
comparison rogue4/scrolls.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 | 1b73a8641b37 |
comparison
equal
deleted
inserted
replaced
| 11:949d558c2162 | 12:9535a08ddc39 |
|---|---|
| 1 /* | |
| 2 * Read a scroll and let it happen | |
| 3 * | |
| 4 * @(#)scrolls.c 4.21 (Berkeley) 4/6/82 | |
| 5 * | |
| 6 * Rogue: Exploring the Dungeons of Doom | |
| 7 * Copyright (C) 1980, 1981, 1982 Michael Toy, Ken Arnold and Glenn Wichman | |
| 8 * All rights reserved. | |
| 9 * | |
| 10 * See the file LICENSE.TXT for full copyright and licensing information. | |
| 11 */ | |
| 12 | |
| 13 #include <curses.h> | |
| 14 #include <ctype.h> | |
| 15 #include "rogue.h" | |
| 16 | |
| 17 /* | |
| 18 * read_scroll: | |
| 19 * Read a scroll from the pack and do the appropriate thing | |
| 20 */ | |
| 21 read_scroll() | |
| 22 { | |
| 23 register THING *obj; | |
| 24 register int y, x; | |
| 25 register char ch; | |
| 26 register THING *op; | |
| 27 register int index; | |
| 28 register bool discardit = FALSE; | |
| 29 | |
| 30 obj = get_item("read", SCROLL); | |
| 31 if (obj == NULL) | |
| 32 return; | |
| 33 if (obj->o_type != SCROLL) | |
| 34 { | |
| 35 if (!terse) | |
| 36 msg("there is nothing on it to read"); | |
| 37 else | |
| 38 msg("nothing to read"); | |
| 39 return; | |
| 40 } | |
| 41 msg("as you read the scroll, it vanishes"); | |
| 42 /* | |
| 43 * Calculate the effect it has on the poor guy. | |
| 44 */ | |
| 45 if (obj == cur_weapon) | |
| 46 cur_weapon = NULL; | |
| 47 switch (obj->o_which) | |
| 48 { | |
| 49 case S_CONFUSE: | |
| 50 /* | |
| 51 * Scroll of monster confusion. Give him that power. | |
| 52 */ | |
| 53 player.t_flags |= CANHUH; | |
| 54 msg("your hands begin to glow red"); | |
| 55 when S_ARMOR: | |
| 56 if (cur_armor != NULL) | |
| 57 { | |
| 58 cur_armor->o_ac--; | |
| 59 cur_armor->o_flags &= ~ISCURSED; | |
| 60 msg("your armor glows faintly for a moment"); | |
| 61 } | |
| 62 when S_HOLD: | |
| 63 /* | |
| 64 * Hold monster scroll. Stop all monsters within two spaces | |
| 65 * from chasing after the hero. | |
| 66 */ | |
| 67 | |
| 68 for (x = hero.x - 2; x <= hero.x + 2; x++) | |
| 69 if (x >= 0 && x < COLS) | |
| 70 for (y = hero.y - 2; y <= hero.y + 2; y++) | |
| 71 if (y >= 0 && y <= LINES - 1) | |
| 72 if ((op = moat(y, x)) != NULL) | |
| 73 { | |
| 74 op->t_flags &= ~ISRUN; | |
| 75 op->t_flags |= ISHELD; | |
| 76 } | |
| 77 when S_SLEEP: | |
| 78 /* | |
| 79 * Scroll which makes you fall asleep | |
| 80 */ | |
| 81 s_know[S_SLEEP] = TRUE; | |
| 82 no_command += rnd(SLEEPTIME) + 4; | |
| 83 player.t_flags &= ~ISRUN; | |
| 84 msg("you fall asleep"); | |
| 85 when S_CREATE: | |
| 86 /* | |
| 87 * Create a monster | |
| 88 * First look in a circle around him, next try his room | |
| 89 * otherwise give up | |
| 90 */ | |
| 91 { | |
| 92 register bool appear = 0; | |
| 93 coord mp; | |
| 94 | |
| 95 /* | |
| 96 * Search for an open place | |
| 97 */ | |
| 98 for (y = hero.y - 1; y <= hero.y + 1; y++) | |
| 99 for (x = hero.x - 1; x <= hero.x + 1; x++) | |
| 100 { | |
| 101 /* | |
| 102 * Don't put a monster in top of the player. | |
| 103 */ | |
| 104 if (y == hero.y && x == hero.x) | |
| 105 continue; | |
| 106 /* | |
| 107 * Or anything else nasty | |
| 108 * Also avoid a mimic which is disguised as scroll | |
| 109 */ | |
| 110 if (moat(y, x) == NULL && step_ok(ch = winat(y, x))) | |
| 111 { | |
| 112 if (ch == SCROLL | |
| 113 && find_obj(y, x)->o_which == S_SCARE) | |
| 114 continue; | |
| 115 if (rnd(++appear) == 0) | |
| 116 { | |
| 117 mp.y = y; | |
| 118 mp.x = x; | |
| 119 } | |
| 120 } | |
| 121 } | |
| 122 if (appear) | |
| 123 { | |
| 124 op = new_item(); | |
| 125 new_monster(op, randmonster(FALSE), &mp); | |
| 126 } | |
| 127 else | |
| 128 msg("you hear a faint cry of anguish in the distance"); | |
| 129 } | |
| 130 when S_IDENT: | |
| 131 /* | |
| 132 * Identify, let the rogue figure something out | |
| 133 */ | |
| 134 s_know[S_IDENT] = TRUE; | |
| 135 msg("this scroll is an identify scroll"); | |
| 136 whatis(TRUE); | |
| 137 when S_MAP: | |
| 138 /* | |
| 139 * Scroll of magic mapping. | |
| 140 */ | |
| 141 s_know[S_MAP] = TRUE; | |
| 142 msg("oh, now this scroll has a map on it"); | |
| 143 /* | |
| 144 * Take all the things we want to keep hidden out of the window | |
| 145 */ | |
| 146 for (y = 1; y < LINES - 1; y++) | |
| 147 for (x = 0; x < COLS; x++) | |
| 148 { | |
| 149 index = INDEX(y, x); | |
| 150 switch (ch = _level[index]) | |
| 151 { | |
| 152 case '-': | |
| 153 case '|': | |
| 154 if (!(_flags[index] & F_REAL)) | |
| 155 { | |
| 156 ch = _level[index] = DOOR; | |
| 157 _flags[index] &= ~F_REAL; | |
| 158 } | |
| 159 case PASSAGE: | |
| 160 _flags[index] |= F_SEEN; | |
| 161 case DOOR: | |
| 162 case STAIRS: | |
| 163 if ((op = moat(y, x)) != NULL) | |
| 164 if (op->t_oldch == ' ') | |
| 165 op->t_oldch = ch; | |
| 166 break; | |
| 167 default: | |
| 168 ch = ' '; | |
| 169 } | |
| 170 if (ch != ' ') | |
| 171 mvaddch(y, x, ch); | |
| 172 } | |
| 173 when S_GFIND: | |
| 174 /* | |
| 175 * Potion of gold detection | |
| 176 */ | |
| 177 ch = FALSE; | |
| 178 wclear(hw); | |
| 179 for (op = lvl_obj; op != NULL; op = next(op)) | |
| 180 if (op->o_type == GOLD) | |
| 181 { | |
| 182 ch = TRUE; | |
| 183 mvwaddch(hw, op->o_pos.y, op->o_pos.x, GOLD); | |
| 184 } | |
| 185 if (ch) | |
| 186 { | |
| 187 s_know[S_GFIND] = TRUE; | |
| 188 show_win(hw, | |
| 189 "You begin to feel greedy and you sense gold.--More--"); | |
| 190 } | |
| 191 else | |
| 192 msg("you feel a pull downward"); | |
| 193 when S_TELEP: | |
| 194 /* | |
| 195 * Scroll of teleportation: | |
| 196 * Make him dissapear and reappear | |
| 197 */ | |
| 198 { | |
| 199 register struct room *cur_room; | |
| 200 | |
| 201 cur_room = proom; | |
| 202 teleport(); | |
| 203 if (cur_room != proom) | |
| 204 s_know[S_TELEP] = TRUE; | |
| 205 } | |
| 206 when S_ENCH: | |
| 207 if (cur_weapon == NULL || cur_weapon->o_type != WEAPON) | |
| 208 msg("you feel a strange sense of loss"); | |
| 209 else | |
| 210 { | |
| 211 cur_weapon->o_flags &= ~ISCURSED; | |
| 212 if (rnd(2) == 0) | |
| 213 cur_weapon->o_hplus++; | |
| 214 else | |
| 215 cur_weapon->o_dplus++; | |
| 216 msg("your %s glows blue for a moment", w_names[cur_weapon->o_which]); | |
| 217 } | |
| 218 when S_SCARE: | |
| 219 /* | |
| 220 * Reading it is a mistake and produces laughter at the | |
| 221 * poor rogue's boo boo. | |
| 222 */ | |
| 223 msg("you hear maniacal laughter in the distance"); | |
| 224 when S_REMOVE: | |
| 225 if (cur_armor != NULL) | |
| 226 cur_armor->o_flags &= ~ISCURSED; | |
| 227 if (cur_weapon != NULL) | |
| 228 cur_weapon->o_flags &= ~ISCURSED; | |
| 229 if (cur_ring[LEFT] != NULL) | |
| 230 cur_ring[LEFT]->o_flags &= ~ISCURSED; | |
| 231 if (cur_ring[RIGHT] != NULL) | |
| 232 cur_ring[RIGHT]->o_flags &= ~ISCURSED; | |
| 233 msg("you feel as if somebody is watching over you"); | |
| 234 when S_AGGR: | |
| 235 /* | |
| 236 * This scroll aggravates all the monsters on the current | |
| 237 * level and sets them running towards the hero | |
| 238 */ | |
| 239 aggravate(); | |
| 240 msg("you hear a high pitched humming noise"); | |
| 241 when S_NOP: | |
| 242 msg("this scroll seems to be blank"); | |
| 243 when S_GENOCIDE: | |
| 244 s_know[S_GENOCIDE] = TRUE; | |
| 245 msg("you have been granted the boon of genocide"); | |
| 246 genocide(); | |
| 247 otherwise: | |
| 248 msg("what a puzzling scroll!"); | |
| 249 return; | |
| 250 } | |
| 251 look(TRUE); /* put the result of the scroll on the screen */ | |
| 252 status(); | |
| 253 /* | |
| 254 * Get rid of the thing | |
| 255 */ | |
| 256 inpack--; | |
| 257 if (obj->o_count > 1) | |
| 258 obj->o_count--; | |
| 259 else | |
| 260 { | |
| 261 detach(pack, obj); | |
| 262 discardit = TRUE; | |
| 263 } | |
| 264 | |
| 265 call_it(s_know[obj->o_which], &s_guess[obj->o_which]); | |
| 266 | |
| 267 if (discardit) | |
| 268 discard(obj); | |
| 269 } |
