Difference between revisions of "Category:Detection"

From the Oblivion ConstructionSet Wiki
Jump to navigation Jump to search
imported>Saebel
imported>Saebel
Line 178: Line 178:
==See Also==
==See Also==
[[Sneak]]
[[Sneak]]
[[GetDetectionLevel]]
[[GetDetectionLevel]]
[[GetDetected]]
[[GetDetected]]
[[IsActorDetected]]
[[IsActorDetected]]



Revision as of 13:07, 7 March 2013

Detection is Oblivion's stealth mechanic. The concept isn't complicated: every actor has a degree of awareness of every other nearby actor, called a detection level. If this detection level is above a certain threshold then the searching actor (the "detector") is fully aware of the hiding actor (the "target"). The detector can then attack, offer a greeting, report the target's crimes, etc. If the detection level falls below the threshold again, the detector "loses" the target and can no longer interact with it.

Quite a few variables go into calculating detection levels. They fall into three basic categories: Sight, Sound, and Sneak Skill. Sight describes how well the detector can see the target, and only matter if the detector actually has a direct line-of-sight. Sound measures how much noise the target is making from movement and from being in combat. Skill measures the sneak skills of the detector and the target. In all three categories the distance from the detector to target plays a very important role.

Some of the conditions in the formula are still under investigation. In particular, the detection does not always correctly recognize when the target is in combat. Whether this is specific to the player or due to some other bug is not yet known.

The complete formula for Detection Level is given below. Because the formula is so complicated, it is broken into smaller pieces and organized in a table. Conditional terms are enclosed in square brackets, e.g. "[ + 400, if target is yellow]" means "add 400 if the target is yellow, otherwise ignore this term".

Detection Level Formula

Factor Value
Detection Level

If target is farther from the detector than MaxDetectionRange, and has not attacked the detector:

0

If target is invisible or has 100% Chameleon:

-100

Otherwise:

fSneakBaseValue 
[ + fSneakTargetAttackBonus, for a single frame the first time the target attacks the detector]
[ + SoundBonus, if target is not swimming]
[ + fSneakSleepBonus, if detector is sleeping]
[ + SightBonus, if detector is awake and has line-of-sight to target]
+ SkillBonus
Sound Bonus
fSneakSoundsMult * DistanceFactor *
(
  [ MovementFactor, if target is moving and target Sneak mastery < Expert]
  [ + fSneakTargetInCombatBonus, if target is in combat]
)
[ * fSneakSoundLosMult, if detector has no line of sight to target]

The sound bonus cannot be negative. If it is less than zero, it is set to zero.

Movement Factor
(
  fSneakBootWeightBase
  [ + (fSneakBootWeightMult * (tgt boot weight)), if tgt Sneak mastery < Journeyman ]
)
[ * fSneakRunningMult, if target is running ]
Sight Bonus
fSneakLightMult * DistanceFactor * LightFactor * ChameleonFactor * BlindnessFactor
[ * fSneakSwimmingLightMult, if target is swimming]  

The sight bonus cannot be negative. If it is less than zero, it is set to zero.

Light Factor
fDetectionSneakLightMod + 
(
  (light level on target) 
  [ * fDetectionNightEyeBonus, if detector has Night Eye]
)

'light level on target' measures the ambient light, plus changes from the Darkness effect. Falls in range from 0 to 100.

Chameleon Factor
1 - (Chameleon level of target)/100

Chameleon Factor is forced into the range [0 - 1]

Blindness Factor
1 - (Blindness level of detector)/100

Blindness Factor is forced into the range [0 - 1]

Skill Bonus
fSneakSkillMult * 
(
  (detector Sneak skill * DistanceFactor)
  [ - target Sneak skill, if target is sneaking and not in combat]
)
Distance Factor
1 - (distance between detector and target) / MaxDetectionRange
Max Detection Range
fSneakMaxDistance 
[ * fSneakExteriorDistanceMult, if in exterior cell]

Detection Thresholds

If the Detection Level is greater than a certain threshold, the detector can becomes aware of the target. The thresholds are:

Threshold
Used By
0 Zero seems to be an upper limit for detection thresholds. If the detection level is greater than zero, the target is always(?) detected.
fSneakUnseenMin all actors that are unaware of target

all non-hostile actors

fSneakNoticedMin actors are aware that target is near and speak accordingly
fSneakLostMin hostile actors that are searching for target
iAICombatMinDetection hostile actors that are in combat with target

A final note: The target-is-in-combat bonus is fairly significant. Combined with the much lower combat threshold, this can make it very difficult for an actor to return to hiding once a hostile actor has seen them.

Performance

The detection formula runs on all active NPCs/Creatures all the time and is applied to all other NPCs/Creatures, not just the player. Therefore, as the number of active actors in an area increase, the number of detection calls made increases exponentially.

# of actors in the area
# of detection calls
1 actor 1 detection call towards the player
2 actors 4 detection calls. 2 towards the player, and 1 each as the 2 actors detect each other.
3 actors 9 detection calls. 3 towards the player, and 2 each as the 3 actors detect each other.
4 actors 16 detection calls.
10 actors 100 detection calls.
15 actors 225 detection calls.
20 actors 400 detection calls.
30 actors 900 detection calls.

With default Oblivion, you will rarely run into large numbers of NPCs/creatures, but in a heavily modded Oblivion, this can have a noticeable effect on performance when the player enters highly populated areas. Detection is probably not the only Oblivion feature that behaves like this, but it's the one that we for sure know behaves this way.

Any mod that alters the detection formula (such as SDR) in combination with mods that increase the population density will therefore potentially impact performance as well, depending on how the mod is designed and implemented.

Detection Functions

IsActorDetected does not appear to call the detection formula, since it does not require both the target and detector to function. It is the simplest method of determining whether an actor is being detected at any given time.

GetDetectionLevel does not appear to call the detection formula either, and may be the most efficient method of determining the detection result of a detector/target pair, especially when a mod that alters detection (like SDR) is in the load order. Although it is unknown whether or not the result is based on Oblivion's native detection results or the detection altering mod's results. The theory is that each detection result of target to detector is tracked internally, and is merely looked up by the GetDetectionLevel function.

GetDetected, on the other hand, forces Oblivion to run the entire detection formula, and therefore any mod that alters or hooks that formula will have its sub-scripts called. Depending on how often it is used, this could potentially cause performance issues.

Notes

  • Dead actors seem to have their detection status "locked in" at whatever value it was when they died. This means an actor aware of the player when the player kills him, will always be considered aware of the player (though this does not matter since the actor is dead). It is therefore important in scripts which check detection levels to also make sure that the "detector" is, in fact, alive, in addition to checking other detection settings.
  • The bug above also applies when SetUnconscious is used on an actor, until the effects of that command are reverted.

See Also

Sneak

GetDetectionLevel

GetDetected

IsActorDetected


Articles in category "Detection"

There are 20 articles in this category.

D F cont. F cont.
  • Detection
  • FSneakLostMin
  • FSneakSoundsMult
  • F
  • FSneakMaxDistance
  • FSneakSwimmingLightMult
  • FSneakNoticedMin
  • FSneakTargetAttackBonus
  • FSneakBaseValue
  • FSneakRunningMult
  • FSneakTargetInCombatBonus
  • FSneakBootWeightBase
  • FSneakSeenMin
  • FSneakUnseenMin
  • FSneakBootWeightMult
  • FSneakSkillMult
  • I
  • FSneakExteriorDistanceMult
  • FSneakSleepBonus
  • FSneakLightMult
  • FSneakSoundLosMult
  • IAICombatMinDetection
  • This category currently contains no pages or media.