Difference between revisions of "User:JRoush"

From the Oblivion ConstructionSet Wiki
Jump to navigation Jump to search
imported>JRoush
imported>JRoush
m
 
(3 intermediate revisions by the same user not shown)
Line 21: Line 21:
The GetCursorPos function is a bit dodgy.  Returned positions are not consistent, and seem to depend on integrated movement history.  This, combined with the lack of a function to get screen resolution, makes it impractical for use in menus (specifically, I couldn't use it to script in a custom slider bar).
The GetCursorPos function is a bit dodgy.  Returned positions are not consistent, and seem to depend on integrated movement history.  This, combined with the lack of a function to get screen resolution, makes it impractical for use in menus (specifically, I couldn't use it to script in a custom slider bar).


== Detection ==
=== Table Test ===
The following factors contribute to one actor's '''Detection Level''' towards another actor.  For simplicity, the former is called the 'Detector' and the latter is called the 'Target'.
{|
 
|-  
These formulas aren't actually that complicated, but they involve a ''lot'' of conditional branches.  Many of the factors below only contribute under a specific condition, e.g. the target is swimming or the detector is asleep, etc.
| UL || UR
 
|-  
{|border="1" cellpadding="5" cellspacing="0"
| LL || LR
|-
! style="background:#efefef;" | <center> Distance </center>
! style="background:#efefef;" | <center> Shorthand </center>
! style="background:#efefef;" | <center> Value </center>
|-
| <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> Light </center>
! style="background:#efefef;" | <center> Shorthand </center>
! style="background:#efefef;" | <center> Value </center>
|-
| <center> Line-of-Sight Light Factor </center>
| <center> losLight </center>
| 1.0 if detector has line of sight to target
0.0 otherwise
|-
| <center> Swimming Light Factor </center>
| <center> swimLight </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's NightEye AV > 0)
Light Factor is capped at 100
|-
| <center> Invisiblity Factor </center>
| <center> invis </center>
| 0.0 if target's "Invisibility" AV > 0
1.0 - (target's "Chameleon" AV, max 100) / 100.0, otherwise
|-
| <center> Blindness Factor </center>
| <center> blind </center>
| 1.0 - (detector's "Blindness" AV) / 100.0
|-
| <center> '''Overall Light Bonus''' </center>
|
| [[fSneakSleepBonus]] if detector is sleeping
[[fSneakLightMult]] * distMult * losLight * swimLight * 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>
|
| [[fSneakBaseValue]] + ([[fSneakTargetAttackBonus]], if target attacked detector) + '''Overall Sound Bonus''' + '''Overall Light Bonus''' + '''Overall Skill Bonus'''
|-
|}
 
If the '''Overall Detection Level''' is greater than a certain threshold, the detector can see the target, and engage it in combat if it's hostile.
 
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.
 
{|border="1" cellpadding="5" cellspacing="0"
|-
! style="background:#efefef;" | <center> Threshold </center>
! style="background:#efefef;" | <center> Used By </center>
|-
| [[fSneakUnseenMin]]
| all actors that are unaware of target
all non-hostile actors
|-
| [[fSneakLostMin]]
| hostile actors that are searching for target
|-
| [[iAICombatMinDetection]]
| hostile actors that are in combat with target
|-
|}
|}

Latest revision as of 02:51, 9 November 2010

Notes on Scripting[edit | edit source]

General Scripting[edit | edit source]

Adding or removing (possibly any modifying of) effects in an enchantment (or, presumably, a spell) that is currently affecting an actor results in CTD. Instead, we must cloneform the enchantment and use that instead. Previous testing gives me hope that the game might garbage collect unused formids.

Modifications to non-cloned forms (e.g. changes to name, etc) do not appear to stick upon reloading the game. Dynamically generated spells must be cloned, or else the base forms modified in script every time the game is reloaded.

Cloned forms are not removed when the mod is deactivated. Since there is no way for the average player to remove cloned spells from spell merchants, a "cleanup" script must be provided to do so. - makes the whole use of cloned spells unattractive -

GetOwner appears to work only on references (not items in a container). There is a stolen flag, I believe, but not sure how to set it.

Moveto and PositionCell don't transfer meshes. the 'usual' workarounds assume transfer to the current cell, and don't work for destination cells that aren't loaded.

Using GetIconPath on an object with no icon causes a CTD.

Menu Scripting[edit | edit source]

Traits of the form <user#> are parameters set by the game enigne. The visible manifestations (text, slider position, etc.) are usually set to derive from these inputs. As of OBSE v0017 modifying most traits from scripts will destroy derivative relationships; it appears that some values (e.g. quantity slider traits) are safe to modify. Modifying the <user#> traits directly one can "fake" user input; in particular spell/potion names and slider bar positions. Derivative relationships are reloaded when the menu is. Note that the HUD (and possibly the inventory) reloads only after exiting to the main menu; changes to the HUD will persist until then.

The Arrow + Enter keys can normally be used to navigate menus. I haven't found (or seriously looked for) a way to determine which tile is the focus of a keyboard event. It looks like the focus is *either* keyboard or mouse based, and transitions from one to the other are inconsistent or bugged. At any rate, OBSE v0017 GetActiveUIComponent* functions work only for tiles focused on by the mouse. Also, arrow+enter menu navigation is NOT based on mapped controls and cannot be disabled using Disablekey. It CAN be disabled by removing all traits of the form <xbutton>, <xleft>, <xright>, etc. from the menu in question, but not by simply setting them to zero in scripts. This is a problem because an errant keystrokes can apparently derail a ClickMenuButton call, which makes setting up long chains of automated click events unfeasible.

The GetCursorPos function is a bit dodgy. Returned positions are not consistent, and seem to depend on integrated movement history. This, combined with the lack of a function to get screen resolution, makes it impractical for use in menus (specifically, I couldn't use it to script in a custom slider bar).

Table Test[edit | edit source]

UL UR
LL LR