Mercurial > hg > early-roguelike
view srogue/daemons.c @ 75:19903deed392
arogue5: fix the crash when checking prices in shops.
A buffer called curpurch, which stores a description of an item in a
trading post which the player might be interested in, was only 15
bytes. It was overflowing into oldrp, a room pointer, leading to
segfaults. The size of curpurch has been increased to LINELEN*2,
which matches the size of prbuf, which is returned by inv_name and
then strcpy()'d to curpurch. As long as nothing overflows prbuf it
should be safe now.
NOTE that this breaks savefile compatibility.
author | John "Elwin" Edwards <elwin@sdf.org> |
---|---|
date | Wed, 05 Sep 2012 10:14:34 -0700 |
parents | d7d45e980791 |
children | f2951c4e28d9 |
line wrap: on
line source
/* * 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, AFTER); } /* * 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; }