Mercurial > hg > early-roguelike
diff srogue/daemons.c @ 36:2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
author | elwin |
---|---|
date | Thu, 25 Nov 2010 12:21:41 +0000 |
parents | |
children | d7d45e980791 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/srogue/daemons.c Thu Nov 25 12:21:41 2010 +0000 @@ -0,0 +1,254 @@ +/* + * All the daemon and fuse functions are in here + * + * @(#)daemons.c 9.0 (rdk) 7/17/84 + * + * Super-Rogue + * Copyright (C) 1984 Robert D. Kindelberger + * All rights reserved. + * + * Based on "Rogue: Exploring the Dungeons of Doom" + * Copyright (C) 1980, 1981 Michael Toy, Ken Arnold and Glenn Wichman + * All rights reserved. + * + * See the file LICENSE.TXT for full copyright and licensing information. + */ + +#include "rogue.h" +#include "rogue.ext" + +int between = 0; + +/* + * doctor: + * A healing daemon that restores hit points after rest + */ +doctor(fromfuse) +int fromfuse; +{ + reg int *thp, lv, ohp, ccon; + + lv = him->s_lvl; + thp = &him->s_hpt; + ohp = *thp; + quiet += 1; + + ccon = him->s_ef.a_con; + if (ccon > 16 && !isfight) + *thp += rnd(ccon - 15); + if (lv < 8) { + if (quiet > 20 - lv * 2) + *thp += 1; + } + else { + if (quiet >= 3) + *thp += rnd(lv - 7) + 1; + } + if (isring(LEFT, R_REGEN)) + *thp += 1; + if (isring(RIGHT, R_REGEN)) + *thp += 1; + if (pl_on(ISREGEN)) + *thp += 1; + if (ohp != *thp) { + nochange = FALSE; + if (*thp > him->s_maxhp) + *thp = him->s_maxhp; + quiet = 0; + } +} + + +/* + * Swander: + * Called when it is time to start rolling for wandering monsters + */ +swander(fromfuse) +int fromfuse; +{ + daemon(rollwand, TRUE, BEFORE); +} + + +/* + * rollwand: + * Called to roll to see if a wandering monster starts up + */ +rollwand(fromfuse) +int fromfuse; +{ + + if (++between >= 4) { + if (roll(1, 6) == 4) { + if (levtype != POSTLEV) /* no monsters for posts */ + wanderer(); + extinguish(rollwand); + fuse(swander, TRUE, WANDERTIME); + } + between = 0; + } +} + + +/* + * unconfuse: + * Release the poor player from his confusion + */ +unconfuse(fromfuse) +int fromfuse; +{ + if (pl_on(ISHUH)) + msg("You feel less confused now."); + player.t_flags &= ~ISHUH; +} + +/* + * unsee: + * He lost his see invisible power + */ +unsee(fromfuse) +int fromfuse; +{ + player.t_flags &= ~CANSEE; +} + +/* + * sight: + * He gets his sight back + */ +sight(fromfuse) +int fromfuse; +{ + if (pl_on(ISBLIND)) + msg("The veil of darkness lifts."); + player.t_flags &= ~ISBLIND; + light(&hero); +} + +/* + * nohaste: + * End the hasting + */ +nohaste(fromfuse) +int fromfuse; +{ + if (pl_on(ISHASTE)) + msg("You feel yourself slowing down."); + player.t_flags &= ~ISHASTE; +} + + +/* + * stomach: + * Digest the hero's food + */ +stomach(fromfuse) +int fromfuse; +{ + reg int oldfood, old_hunger; + + old_hunger = hungry_state; + if (food_left <= 0) { /* the hero is fainting */ + if (--food_left == -150) { + msg("Your stomach writhes with hunger pains."); + } + else if (food_left < -350) { + msg("You starve to death !!"); + msg(" "); + death(K_STARVE); + } + if (player.t_nocmd > 0 || rnd(100) > 20) + return; + player.t_nocmd = rnd(8)+4; + msg("You faint."); + running = FALSE; + count = 0; + hungry_state = F_FAINT; + } + else { + oldfood = food_left; + food_left -= ringfood + foodlev - amulet; + if (player.t_nocmd > 0) /* wait till he can move */ + return; + if (food_left < WEAKTIME && oldfood >= WEAKTIME) { + msg("You are starting to feel weak."); + hungry_state = F_WEAK; + } + else if(food_left < HUNGTIME && oldfood >= HUNGTIME) { + msg("Getting hungry."); + hungry_state = F_HUNGRY; + } + } + if (old_hunger != hungry_state) + updpack(); /* new pack weight */ + wghtchk(FALSE); +} + +/* + * noteth: + * Hero is no longer etherereal + */ +noteth(fromfuse) +int fromfuse; +{ + int ch; + + if (pl_on(ISETHER)) { + msg("You begin to feel more corporeal."); + ch = player.t_oldch; + if (dead_end(ch)) { + msg("You materialize in %s.",identify(ch)); + msg(" "); + death(K_STONE); /* can't materialize in walls */ + } + } + player.t_flags &= ~ISETHER; +} + +/* + * sapem: + * Sap the hero's life away + */ +sapem(fromfuse) +int fromfuse; +{ + chg_abil(rnd(4) + 1, -1, TRUE); + fuse(sapem, TRUE, 150); + nochange = FALSE; +} + +/* + * notslow: + * Restore the hero's normal speed + */ +notslow(fromfuse) +int fromfuse; +{ + if (pl_on(ISSLOW)) + msg("You no longer feel hindered."); + player.t_flags &= ~ISSLOW; +} + +/* + * notregen: + * Hero is no longer regenerative + */ +notregen(fromfuse) +int fromfuse; +{ + if (pl_on(ISREGEN)) + msg("You no longer feel bolstered."); + player.t_flags &= ~ISREGEN; +} + +/* + * notinvinc: + * Hero not invincible any more + */ +notinvinc(fromfuse) +int fromfuse; +{ + if (pl_on(ISINVINC)) + msg("You no longer feel invincible."); + player.t_flags &= ~ISINVINC; +}