Mercurial > hg > early-roguelike
comparison arogue5/daemons.c @ 63:0ed67132cf10
Import Advanced Rogue 5.8 from the Roguelike Restoration Project (r1490)
| author | elwin |
|---|---|
| date | Thu, 09 Aug 2012 22:58:48 +0000 |
| parents | |
| children | f2951c4e28d9 |
comparison
equal
deleted
inserted
replaced
| 62:0ef99244acb8 | 63:0ed67132cf10 |
|---|---|
| 1 /* | |
| 2 * All the daemon and fuse functions are in here | |
| 3 * | |
| 4 * Advanced Rogue | |
| 5 * Copyright (C) 1984, 1985 Michael Morgan, Ken Dalka and AT&T | |
| 6 * All rights reserved. | |
| 7 * | |
| 8 * Based on "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 "rogue.h" | |
| 17 | |
| 18 int between = 0; | |
| 19 | |
| 20 /* | |
| 21 * doctor: | |
| 22 * A healing daemon that restors hit points after rest | |
| 23 */ | |
| 24 | |
| 25 doctor(tp) | |
| 26 register struct thing *tp; | |
| 27 { | |
| 28 register int ohp; | |
| 29 register int limit, new_points; | |
| 30 register struct stats *curp; /* current stats pointer */ | |
| 31 register struct stats *maxp; /* max stats pointer */ | |
| 32 | |
| 33 curp = &(tp->t_stats); | |
| 34 maxp = &(tp->maxstats); | |
| 35 if (curp->s_hpt == maxp->s_hpt) { | |
| 36 tp->t_quiet = 0; | |
| 37 return; | |
| 38 } | |
| 39 tp->t_quiet++; | |
| 40 switch (tp->t_ctype) { | |
| 41 case C_MAGICIAN: | |
| 42 limit = 8 - curp->s_lvl; | |
| 43 new_points = curp->s_lvl - 3; | |
| 44 when C_THIEF: | |
| 45 limit = 8 - curp->s_lvl; | |
| 46 new_points = curp->s_lvl - 2; | |
| 47 when C_CLERIC: | |
| 48 limit = 8 - curp->s_lvl; | |
| 49 new_points = curp->s_lvl - 3; | |
| 50 when C_FIGHTER: | |
| 51 limit = 16 - curp->s_lvl*2; | |
| 52 new_points = curp->s_lvl - 5; | |
| 53 when C_MONSTER: | |
| 54 limit = 16 - curp->s_lvl; | |
| 55 new_points = curp->s_lvl - 6; | |
| 56 otherwise: | |
| 57 debug("what a strange character you are!"); | |
| 58 return; | |
| 59 } | |
| 60 ohp = curp->s_hpt; | |
| 61 if (off(*tp, HASDISEASE) && off(*tp, DOROT)) { | |
| 62 if (curp->s_lvl < 8) { | |
| 63 if (tp->t_quiet > limit) { | |
| 64 curp->s_hpt++; | |
| 65 tp->t_quiet = 0; | |
| 66 } | |
| 67 } | |
| 68 else { | |
| 69 if (tp->t_quiet >= 3) { | |
| 70 curp->s_hpt += rnd(new_points)+1; | |
| 71 tp->t_quiet = 0; | |
| 72 } | |
| 73 } | |
| 74 } | |
| 75 if (tp == &player) { | |
| 76 if (ISRING(LEFT_1, R_REGEN)) curp->s_hpt++; | |
| 77 if (ISRING(LEFT_2, R_REGEN)) curp->s_hpt++; | |
| 78 if (ISRING(LEFT_3, R_REGEN)) curp->s_hpt++; | |
| 79 if (ISRING(LEFT_4, R_REGEN)) curp->s_hpt++; | |
| 80 if (ISRING(RIGHT_1, R_REGEN)) curp->s_hpt++; | |
| 81 if (ISRING(RIGHT_2, R_REGEN)) curp->s_hpt++; | |
| 82 if (ISRING(RIGHT_3, R_REGEN)) curp->s_hpt++; | |
| 83 if (ISRING(RIGHT_4, R_REGEN)) curp->s_hpt++; | |
| 84 } | |
| 85 if (on(*tp, ISREGEN)) | |
| 86 curp->s_hpt += curp->s_lvl/10 + 1; | |
| 87 if (ohp != curp->s_hpt) { | |
| 88 if (curp->s_hpt >= maxp->s_hpt) { | |
| 89 curp->s_hpt = maxp->s_hpt; | |
| 90 if (off(*tp, WASTURNED) && on(*tp, ISFLEE) && tp != &player) { | |
| 91 turn_off(*tp, ISFLEE); | |
| 92 tp->t_oldpos = tp->t_pos; /* Start our trek over */ | |
| 93 } | |
| 94 } | |
| 95 } | |
| 96 } | |
| 97 | |
| 98 /* | |
| 99 * Swander: | |
| 100 * Called when it is time to start rolling for wandering monsters | |
| 101 */ | |
| 102 | |
| 103 swander() | |
| 104 { | |
| 105 daemon(rollwand, 0, BEFORE); | |
| 106 } | |
| 107 | |
| 108 /* | |
| 109 * rollwand: | |
| 110 * Called to roll to see if a wandering monster starts up | |
| 111 */ | |
| 112 | |
| 113 rollwand() | |
| 114 { | |
| 115 if (++between >= 4) | |
| 116 { | |
| 117 /* Theives may not awaken a monster */ | |
| 118 if ((roll(1, 6) == 4) && | |
| 119 ((player.t_ctype != C_THIEF) || (rnd(30) >= dex_compute()))) { | |
| 120 if (levtype != POSTLEV) | |
| 121 wanderer(); | |
| 122 kill_daemon(rollwand); | |
| 123 fuse(swander, 0, WANDERTIME, BEFORE); | |
| 124 } | |
| 125 between = 0; | |
| 126 } | |
| 127 } | |
| 128 /* | |
| 129 * this function is a daemon called each turn when the character is a thief | |
| 130 */ | |
| 131 trap_look() | |
| 132 { | |
| 133 if (rnd(100) < (2*dex_compute() + 5*pstats.s_lvl)) | |
| 134 search(TRUE, FALSE); | |
| 135 } | |
| 136 | |
| 137 /* | |
| 138 * unconfuse: | |
| 139 * Release the poor player from his confusion | |
| 140 */ | |
| 141 | |
| 142 unconfuse() | |
| 143 { | |
| 144 turn_off(player, ISHUH); | |
| 145 msg("You feel less confused now"); | |
| 146 } | |
| 147 | |
| 148 | |
| 149 /* | |
| 150 * unsee: | |
| 151 * He lost his see invisible power | |
| 152 */ | |
| 153 | |
| 154 unsee() | |
| 155 { | |
| 156 if (!ISWEARING(R_SEEINVIS)) { | |
| 157 turn_off(player, CANSEE); | |
| 158 msg("The tingling feeling leaves your eyes"); | |
| 159 } | |
| 160 } | |
| 161 | |
| 162 /* | |
| 163 * unstink: | |
| 164 * Remove to-hit handicap from player | |
| 165 */ | |
| 166 | |
| 167 unstink() | |
| 168 { | |
| 169 turn_off(player, HASSTINK); | |
| 170 } | |
| 171 | |
| 172 /* | |
| 173 * unclrhead: | |
| 174 * Player is no longer immune to confusion | |
| 175 */ | |
| 176 | |
| 177 unclrhead() | |
| 178 { | |
| 179 turn_off(player, ISCLEAR); | |
| 180 msg("The blue aura about your head fades away."); | |
| 181 } | |
| 182 | |
| 183 /* | |
| 184 * unphase: | |
| 185 * Player can no longer walk through walls | |
| 186 */ | |
| 187 | |
| 188 unphase() | |
| 189 { | |
| 190 turn_off(player, CANINWALL); | |
| 191 msg("Your dizzy feeling leaves you."); | |
| 192 if (!step_ok(hero.y, hero.x, NOMONST, &player)) death(D_PETRIFY); | |
| 193 } | |
| 194 | |
| 195 /* | |
| 196 * land: | |
| 197 * Player can no longer fly | |
| 198 */ | |
| 199 | |
| 200 land() | |
| 201 { | |
| 202 turn_off(player, ISFLY); | |
| 203 msg("You regain your normal weight"); | |
| 204 running = FALSE; | |
| 205 } | |
| 206 | |
| 207 /* | |
| 208 * sight: | |
| 209 * He gets his sight back | |
| 210 */ | |
| 211 | |
| 212 sight() | |
| 213 { | |
| 214 if (on(player, ISBLIND)) | |
| 215 { | |
| 216 extinguish(sight); | |
| 217 turn_off(player, ISBLIND); | |
| 218 light(&hero); | |
| 219 msg("The veil of darkness lifts"); | |
| 220 } | |
| 221 } | |
| 222 | |
| 223 /* | |
| 224 * res_strength: | |
| 225 * Restore player's strength | |
| 226 */ | |
| 227 | |
| 228 res_strength() | |
| 229 { | |
| 230 | |
| 231 /* If lost_str is non-zero, restore that amount of strength, | |
| 232 * else all of it | |
| 233 */ | |
| 234 if (lost_str) { | |
| 235 chg_str(lost_str); | |
| 236 lost_str = 0; | |
| 237 } | |
| 238 | |
| 239 /* Otherwise, put player at the maximum strength */ | |
| 240 else { | |
| 241 pstats.s_str = max_stats.s_str + ring_value(R_ADDSTR); | |
| 242 } | |
| 243 | |
| 244 updpack(TRUE); | |
| 245 } | |
| 246 | |
| 247 /* | |
| 248 * nohaste: | |
| 249 * End the hasting | |
| 250 */ | |
| 251 | |
| 252 nohaste() | |
| 253 { | |
| 254 turn_off(player, ISHASTE); | |
| 255 msg("You feel yourself slowing down."); | |
| 256 } | |
| 257 | |
| 258 /* | |
| 259 * noslow: | |
| 260 * End the slowing | |
| 261 */ | |
| 262 | |
| 263 noslow() | |
| 264 { | |
| 265 turn_off(player, ISSLOW); | |
| 266 msg("You feel yourself speeding up."); | |
| 267 } | |
| 268 | |
| 269 /* | |
| 270 * suffocate: | |
| 271 * If this gets called, the player has suffocated | |
| 272 */ | |
| 273 | |
| 274 suffocate() | |
| 275 { | |
| 276 death(D_SUFFOCATION); | |
| 277 } | |
| 278 | |
| 279 /* | |
| 280 * digest the hero's food | |
| 281 */ | |
| 282 stomach() | |
| 283 { | |
| 284 register int oldfood, old_hunger, food_use, i; | |
| 285 | |
| 286 old_hunger = hungry_state; | |
| 287 if (food_left <= 0) | |
| 288 { | |
| 289 /* | |
| 290 * the hero is fainting | |
| 291 */ | |
| 292 if (no_command || rnd(100) > 20) | |
| 293 return; | |
| 294 no_command = rnd(8)+4; | |
| 295 if (!terse) | |
| 296 addmsg("You feel too weak from lack of food. "); | |
| 297 msg("You faint"); | |
| 298 running = FALSE; | |
| 299 count = 0; | |
| 300 hungry_state = F_FAINT; | |
| 301 } | |
| 302 else | |
| 303 { | |
| 304 oldfood = food_left; | |
| 305 food_use = 0; | |
| 306 for (i=0; i<MAXRELIC; i++) { /* each relic eats an additional food */ | |
| 307 if (cur_relic[i]) | |
| 308 food_use++; | |
| 309 } | |
| 310 food_use += (ring_eat(LEFT_1) + ring_eat(LEFT_2) + | |
| 311 ring_eat(LEFT_3) + ring_eat(LEFT_4) + | |
| 312 ring_eat(RIGHT_1) + ring_eat(RIGHT_2) + | |
| 313 ring_eat(RIGHT_3) + ring_eat(RIGHT_4) + | |
| 314 foodlev); | |
| 315 if (food_use < 1) | |
| 316 food_use = 1; | |
| 317 food_left -= food_use; | |
| 318 if (food_left < MORETIME && oldfood >= MORETIME) { | |
| 319 msg("You are starting to feel weak"); | |
| 320 running = FALSE; | |
| 321 hungry_state = F_WEAK; | |
| 322 } | |
| 323 else if (food_left < 2 * MORETIME && oldfood >= 2 * MORETIME) | |
| 324 { | |
| 325 msg(terse ? "Getting hungry" : "You are starting to get hungry"); | |
| 326 running = FALSE; | |
| 327 hungry_state = F_HUNGRY; | |
| 328 } | |
| 329 | |
| 330 } | |
| 331 if (old_hunger != hungry_state) | |
| 332 updpack(TRUE); | |
| 333 wghtchk(); | |
| 334 } | |
| 335 /* | |
| 336 * daemon for curing the diseased | |
| 337 */ | |
| 338 cure_disease() | |
| 339 { | |
| 340 turn_off(player, HASDISEASE); | |
| 341 if (off (player, HASINFEST)) | |
| 342 msg(terse ? "You feel yourself improving" | |
| 343 : "You begin to feel yourself improving again"); | |
| 344 } | |
| 345 | |
| 346 /* | |
| 347 * daemon for adding back dexterity | |
| 348 */ | |
| 349 un_itch() | |
| 350 { | |
| 351 if (--lost_dext < 1) { | |
| 352 lost_dext = 0; | |
| 353 turn_off(player, HASITCH); | |
| 354 } | |
| 355 res_dexterity(1); | |
| 356 } | |
| 357 /* | |
| 358 * appear: | |
| 359 * Become visible again | |
| 360 */ | |
| 361 appear() | |
| 362 { | |
| 363 turn_off(player, ISINVIS); | |
| 364 PLAYER = VPLAYER; | |
| 365 msg("The tingling feeling leaves your body"); | |
| 366 light(&hero); | |
| 367 } | |
| 368 /* | |
| 369 * dust_appear: | |
| 370 * dust of disappearance wears off | |
| 371 */ | |
| 372 dust_appear() | |
| 373 { | |
| 374 turn_off(player, ISINVIS); | |
| 375 PLAYER = VPLAYER; | |
| 376 msg("You become visible again"); | |
| 377 light(&hero); | |
| 378 } | |
| 379 /* | |
| 380 * unchoke: | |
| 381 * the effects of "dust of choking and sneezing" wear off | |
| 382 */ | |
| 383 unchoke() | |
| 384 { | |
| 385 if (!find_slot(unconfuse)) | |
| 386 turn_off(player, ISHUH); | |
| 387 if (!find_slot(sight)) | |
| 388 turn_off(player, ISBLIND); | |
| 389 light(&hero); | |
| 390 msg("Your throat and eyes return to normal"); | |
