View Single Post
Old January 24, 2020, 05:53   #12
Join Date: Oct 2019
Posts: 398
DavidMedley is on a distinguished road
How does distance affect stealth?

Question: How does distance affect stealth?

Quick Answer: The expected number of turns until a monster wakes is proportional to your distance from it. If you are twice as far, it takes twice as many turns to wake up.

Long Answer:
We know from the monster recall that there's a max distance at which a creature can hear you. This is calculated essentially the same as walking distance i.e., down hallways, around corners, through open/closed/broken doors, over passable rubble, but not through walls or impassable rubble. Additionally, a monster can see you, which ignores all light levels but otherwise works as you would expect (20 squares max, no visual obstructions).

If a monster can "notice [hear] you from 60 feet" you are safe from being heard at 6 squares away or more. In addition, every 3 full points of stealth you have reduces this by 1 square. All monsters can also notice [see] you from 210 feet, so you are safe from being seen at 21 squares away or if LOS is blocked.

If you are within this detection range, distance does not affect your chance to disturb the monster (stealth does). But distance can greatly affect how much you wake the monster per turn. The amount a monster wakes (loses sleepiness) is inversely proportional to the distance: 100/distance (round down). If a monster reaches 0 sleepiness, it wakes.

I'll address just how many sleepiness points a monster has and what your chance to disturb a monster is elsewhere.

Quick word on smell: If you look up a monster's stats (in monster.txt or elsewhere), smell is listed near hearing for most non-humans. This is not used for waking a monster at all. It is used to help an awake monster decide where to go to find you. Stealth has no effect.


Some relevant code snippets

In the code below, local_noise is the distance noise has to travel from the player to the monster in game squares. Shows distance is inversely proportional to sleep reduction (closer wakes more).
int sleep_reduction = 1;
int local_noise = c->noise.grids[mon->grid.y][mon->grid.x];
/* Test - wake up faster in hearing distance of the player 
 * Note no dependence on stealth for now */
if ((local_noise > 0) && (local_noise < 50)) {
	sleep_reduction = (100 / local_noise);
The code below shows that monsters cannot hear you at exactly their "notice from" distance, and that stealth can reduce that distance.
static bool monster_can_hear(struct chunk *c, struct monster *mon)
	int base_hearing = mon->race->hearing
		- player->state.skills[SKILL_STEALTH] / 3;
	if (c->noise.grids[mon->grid.y][mon->grid.x] == 0) {
		return false;
	return base_hearing > c->noise.grids[mon->grid.y][mon->grid.x];
Monsters also cannot smell you at their max smell distance
static bool monster_can_smell(struct chunk *c, struct monster *mon)
	if (c->scent.grids[mon->grid.y][mon->grid.x] == 0) {
		return false;
	return mon->race->smell > c->scent.grids[mon->grid.y][mon->grid.x];
DavidMedley is offline   Reply With Quote