Difference between revisions of "Category:Detection"

1,033 bytes added ,  13:12, 25 August 2010
Complete re-write (with apologies to former editors)
imported>D4v3
m (typos)
imported>JRoush
(Complete re-write (with apologies to former editors))
Line 1: Line 1:
Detection is a complicated process involving many variables, and always exactly two actors. It is important to note that the engine does not calculate successful "sneak rolls" for the actor who is sneaking: it is vice versa; the engine calculates successful "detection rolls" for the actor being stalked (''origin'') vs. the sneaking actor (''target''). Therefore, detection is always calculated between two actors: the ''origin'' and the ''target''.
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.


The variables involved break down into four categories: '''Base''', '''Skill''', '''Light''', '''Sound'''. These variables are simply combined together to calculate the end-result. If the end-result is higher than [[fSneakSeenMin]] (default: 0), the ''target'' is detected. When an actor is detected, it can be ''target''ed as well, therefore the hostile units will engage the ''target'' in combat, while non-hostile units will only "notice" the ''target'' - which usually results in looking directly at the ''target'' and making a comment/greeting towards him/her.
Quite a few factors go into calculating detection levels.  They fall into three basic categories: Sight, Sound, and Sneak Skill.  Sight factors basically describe how well the detector can see the target, and only matter if the detector actually has a direct line-of-sight. Sound factors measure how much noise the target is making, from movement and from being in combat.  Skill factors measure the ''relative'' sneak skill of the two actors. In all three cases, the distance from the detector to target plays a very important role.  Whether or not the target has attacked the detector can make an enormous difference as well.
The complete list of factors and their values is below.  Note that each factor is given a 'shorthand' name for reference other formulas.  Also note that many of the factors are conditional - they take a "default" value some times and a more complicated value at others.  Some formulas even have conditional parts - an extra multiplier or additive bonus that is used only under certain circumstances.  These conditions are given as clearly as possible in the formulas; just be sure to read them carefully.


Once detected, the ''target'' remains detected until he/she can get his/her detection end-result below a certain threshold vs. the ''origin''. This threshold varies based on the relation of the ''origin'' and the ''target'':
{|border="1" cellpadding="5" cellspacing="0"
*"Non-hostile" meaning that the origin does not care much about the fact that the target is trying to hide. It uses the [[fSneakUnseenMin]] value (default: 0.0) as threshold.
|-
*"Hostile" relation has two variants:
! style="background:#efefef;" | <center> Distance </center>
**"Cautious" meaning that the hostile unit is looking for the target - typically saying warning lines during the process. It uses the [[fSneakLostMin]] value (default: -20.0) as threshold.
! style="background:#efefef;" | <center> Shorthand </center>
**"Combat" meaning that the hostile unit is actually engaged in combat with the target. It uses the [[iAICombatMinDetection]] value (default: -50.0) as threshold.
! style="background:#efefef;" | <center> Value </center>
Again, this is quite logical because it is easy to hide from someone who does not care, while it is pretty hard to fade out of sight during combat.
|-
| <center> Max Detection Distance </center>
| <center> maxDist </center>
| [[fSneakMaxDistance]] * ([[fSneakExteriorDistanceMult]], for exterior cells)
|-
| <center> Distance Factor </center>
| <center> distMult </center>
| 1 - (distance between detector and target) / maxDist
|-
! style="background:#efefef;" | <center> Sound </center>
! style="background:#efefef;" | <center> Shorthand </center>
! style="background:#efefef;" | <center> Value </center>
|-
| <center> Line-of-Sight Sound Factor </center>
| <center> losSound </center>
| [[fSneakSoundLosMult]] if detector has line of sight to target
1.0 otherwise
|-
| <center> Swimming Sound Factor </center>
| <center> swimSound </center>
| 0.0 if target is under water
1.0 otherwise
|-
| <center> Running Factor </center>
| <center> running </center>
| [[fSneakRunningMult]] if target is running
1.0 otherwise
|-
| <center> Movement Bonus </center>
| <center> moving </center>
|
[[fSneakBootWeightBase]] + [[fSneakBootWeightMult]] * (target boot weight) if target is moving
0.0 if target is stationary
|-
| <center> In-Combat Bonus </center>
| <center> combat </center>
| [[fSneakTargetInCombatBonus]] if target is in combat
0.0 otherwise
|-
| <center> '''Overall Sound Bonus''' </center>
|
| [[fSneakSoundsMult]] * distMult * losSound * swimSound * (running * moving + combat)
|-
! style="background:#efefef;" | <center> Sight </center>
! style="background:#efefef;" | <center> Shorthand </center>
! style="background:#efefef;" | <center> Value </center>
|-
| <center> Line-of-Sight Factor </center>
| <center> losSight </center>
| 1.0 if detector has line of sight to target
0.0 otherwise
|-
| <center> Swimming Sight Factor </center>
| <center> swimSight </center>
| [[fSneakSwimmingLightMult]] if target is under water
1.0 otherwise
|-
| <center> Light Factor </center>
| <center> light </center>
| [[fDetectionSneakLightMod]] + (light level on target) * ([[fDetectionNightEyeBonus]], if detector has Night Eye)
Light Factor is capped at 100
|-
| <center> Invisiblity Factor </center>
| <center> invis </center>
| 0.0 if target has Invisibility
1.0 - (target's Chameleon level, max 100) / 100.0, otherwise
|-
| <center> Blindness Factor </center>
| <center> blind </center>
| 1.0 - (detector's Blindness level, from "Blindness" stat) / 100.0
|-
| <center> '''Overall Sight Bonus''' </center>
|
| [[fSneakSleepBonus]] if detector is sleeping
[[fSneakLightMult]] * distMult * losSight * swimSight * light * invis * blind, otherwise
|-
! style="background:#efefef;" | <center> Skill </center>
! style="background:#efefef;" | <center> Shorthand </center>
! style="background:#efefef;" | <center> Value </center>
|-
| <center> '''Overall Skill Bonus''' </center>
|
| [[fSneakSkillMult]] * [(detector's Sneak skill) * distMult - (target's Sneak skill, if target is sneaking)]
|-
! style="background:#efefef;" | <center> Detection Level </center>
! style="background:#efefef;" | <center> Shorthand </center>
! style="background:#efefef;" | <center> Value </center>
|-
| <center> '''Overall Detection Level''' </center>
|
|
-100.0 if invis >= 100.0 (i.e. target has Invisibility or 100% Chameleon)


<u>Description of the variables in the equation:</u>
0.0 if target didn't attack detector -AND- (distance between target and detector) > maxDist
*'''Base''' The basis for the calculation of the end-result, independent of any other value.
 
**Sneak penalty governed by [[fSneakBaseValue]] (default: -25). This value is an absolute base value that is always applied, in order to indicate the intent to sneak. Basically it means that if the ''target'' makes no noise at all AND hiding in a very dark place AND does not make a move, the detection will fail (e.g. the ''target'' can successfully hide) even with a very low [[Sneak]] skill.
[[fSneakBaseValue]] + ([[fSneakTargetAttackBonus]], if target attacked detector) + '''Overall Sound Bonus''' + '''Overall Sight Bonus''' + '''Overall Skill Bonus''', otherwise
**Combat bonus governed by [[fSneakTargetAttackBonus]] (default: 100). This values is added to the base only for a moment when the target initiates combat, making it a virtual certainty that for a moment the actor will detect his assailant. In that moment, the origin can decide to enter combat or not.
|-
*'''Skill''' The difference between the actors' sneak skills (''origin'' vs. ''target''); governed by [[fSneakSkillMult]] (default: 0.5)
|}
**The variable is modified by the distance between the actors.
 
*'''Light''' The amount of light shining on the sneaking actor; governed by [[fSneakLightMult]] (default: 1.4)
If the '''Overall Detection Level''' is greater than a certain threshold, the detector can becomes aware of the target. The thresholds are:
**[[Invisibility]] and [[Chameleon]] effects improve this variable.
{|border="1" cellpadding="5" cellspacing="0"
**The variable is modified by the distance between the actors.
|-
*'''Sound''' The level of noise that the ''target'' is making; governed by [[fSneakSoundsMult]] (default: 1.6), [[fSneakSoundLosMult]] (default: 1.0)
! style="background:#efefef;" | <center> Threshold </center>
**Moving makes more noise than standing still.
! style="background:#efefef;" | <center> Used By </center>
**Running makes more noise than walking; governed by [[fSneakRunningMult]] (default: 1.3)
|-
**Heavy boots make more noise than bare feet; governed by [[fSneakBootWeightBase]] (default: 14.0), [[fSneakBootWeightMult]] (default: 1.0)
| [[fSneakUnseenMin]]
**Fighting makes ultimately high noise; governed by [[fSneakTargetInCombatBonus]] (default: 25.0)
| all actors that are unaware of target
**The variable is modified by the distance between the actors
all non-hostile actors
|-
| [[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.


As You can see, all variables except '''Base''' are subject to distance attenuation. The distance is always measured between the ''target'' and the ''origin''. The distance attenuation is always applied to the '''Skill''', '''Light''', '''Sound''' variables before calculating the end-result. The further away the ''target'' is, the less significant the variable is. It is quite logical: while I am far away,
*I do not need good [[Sneak]] skill,
*it does not matter whether I am in the darkest corner, and
*it does not matter whether I make a little noise.
Obviously the minimum distance is always zero, however the maximum distance is limited. In [[interior cells]] the maximum distance where detection applies is [[fSneakMaxDistance]] (default: 1500). The maximum distance in [[exterior cells]] is calculated from [[fSneakMaxDistance]] and [[fSneakExteriorDistanceMult]] (default: 2) like this: '''OutDoorDistance = [[fSneakMaxDistance]] * [[fSneakExteriorDistanceMult]]'''; applying the default values this formula gives us 3000. Any actors outside this distance cannot take part in detection rolls - so if you start wondering why you can't hide in combat, this is one of the reasons: You are too far away to trigger detection calculations.




Anonymous user