Xetrill

Skyrim: Training Mannequin Script

Mar 5th, 2012
805
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. scriptname XsTrainingMannequin extends ObjectReference
  2. {Allows the player to train combat skills on an training mannequin or an archery target}
  3.  
  4. ;/////////////////////////////////////////////////////////////////////////////
  5.  [[[ History ]]]
  6.  
  7.  2012-03-05 15:15: ~Xetrill: Removed PowerAttack and SneakAttack handling
  8.     since it does not register - ever.
  9.  
  10.  2012-03-05 15:18: ~Xetrill: Add the states "Ready" and "Busy" as to avoid
  11.     the extreme script spawning that happens if magic (destruction) is used.
  12.  
  13.  2012-03-05 16:22: ~Xetrill: removed Ready state, instead use the default
  14.  'empty state' (BTW: why is it not called 'implicit default state').
  15.  
  16.  [[[ TODO ]]]
  17.  
  18.  2012-03-05 16:11: ~Xetrill: Test whether bash attacks are actually
  19.     detected -- coming through.
  20.  /////////////////////////////////////////////////////////////////////////////;
  21.  
  22.  
  23. ;/////////////////////////////////////////////////////////////////////////////
  24.  / Properties
  25.  /////////////////////////////////////////////////////////////////////////////;
  26.  
  27. int property SkillGainMethod = -1 auto
  28. {OPTIONAL; Determines the method used to advance skills.
  29.  - omitted or -1: random
  30.  - 0: stable - the value of a SkillGain_* property is simply added
  31.  - 1: random - the value of a SkillGain_* property is randomized, ranging from its value halved as minimum to its value doubled as its maximum}
  32.  
  33. FormList property MagicKeywordList auto
  34. {OPTIONAL; if specified allows this mannequin/script to advance the destruction skill too.
  35.  The list must only contain destruction magic specific keywords.}
  36.  
  37.  
  38. ;/////////////////////////////////////////////////////////////////////////////
  39.  / Constants
  40.  /////////////////////////////////////////////////////////////////////////////;
  41.  
  42. float property MasteryNoviceMult     = 2.0 autoreadonly hidden
  43. float property MasteryApprenticeMult = 1.8 autoreadonly hidden
  44. float property MasteryExpertMult     = 1.4 autoreadonly hidden
  45. float property MasteryMasterMult     = 1.0 autoreadonly hidden
  46.  
  47. int property CriticalBonusChance = 9 autoreadonly hidden
  48. float property CriticalBonusMult = 2.2 autoreadonly hidden
  49.  
  50. float property SkillGain_Magic  = 7.0 autoreadonly hidden
  51. float property SkillGain_Melee  = 9.0 autoreadonly hidden
  52. float property SkillGain_Ranged = 15.0 autoreadonly hidden
  53.  
  54. string property Skill_OneHanded   = "OneHanded" autoreadonly hidden
  55. string property Skill_TwoHanded   = "TwoHanded" autoreadonly hidden
  56. string property Skill_Marksman    = "Marksman" autoreadonly hidden
  57. string property Skill_Destruction = "Destruction" autoreadonly hidden
  58. string property Skill_Block       = "Block" autoreadonly hidden
  59.  
  60. int property GainType_Default = 1 autoreadonly hidden
  61. int property GainType_Stable  = 0 autoreadonly hidden
  62. int property GainType_Random  = 1 autoreadonly hidden
  63.  
  64. int property ItemType_Invalid  = -1 autoreadonly hidden
  65. int property ItemType_Nothing  =  0 autoreadonly hidden
  66. int property ItemType_1HSword  =  1 autoreadonly hidden
  67. ; int property ItemType_1HDagger =  2 autoreadonly hidden
  68. ; int property ItemType_1HAxe    =  3 autoreadonly hidden
  69. int property ItemType_1HMace   =  4 autoreadonly hidden
  70. int property ItemType_2HSword  =  5 autoreadonly hidden
  71. int property ItemType_2HAxe    =  6 autoreadonly hidden
  72. int property ItemType_Bow      =  7 autoreadonly hidden
  73. int property ItemType_Staff    =  8 autoreadonly hidden
  74. ; int property ItemType_Spell    =  9 autoreadonly hidden
  75.  
  76.  
  77. ;/////////////////////////////////////////////////////////////////////////////
  78.  / States
  79.  /////////////////////////////////////////////////////////////////////////////;
  80.  
  81. state Busy
  82.     ; intentionally left blank
  83. endstate
  84.  
  85.  
  86. ;/////////////////////////////////////////////////////////////////////////////
  87.  / Events
  88.  /////////////////////////////////////////////////////////////////////////////;
  89.  
  90. event OnHit(ObjectReference aggressor, Form source, Projectile unusedProjectile, \
  91.             bool unusedPowerAttack, bool unusedSneakAttack, bool bashAttack, bool unusedHitBlocked)
  92.     if (aggressor != Game.GetPlayer())
  93.         return
  94.     endif
  95.  
  96.     GotoState("Busy")
  97.  
  98.     if (bashAttack)
  99.         Debug.Notification("Bash Attack")
  100.         AdvanceSkill(Skill_Block, SkillGain_Melee)
  101.         GotoState("")
  102.         return
  103.     endif
  104.  
  105.     int itemType = Game.GetPlayer().GetEquippedItemType(1)
  106.     if (itemType == ItemType_Invalid || itemType == ItemType_Nothing)
  107.         itemType = (aggressor as Actor).GetEquippedItemType(0)
  108.     endif
  109.  
  110.     if (source as Spell && itemType != ItemType_Staff)
  111.         if (XsUtils.HasAnyKeyword(source, MagicKeywordList))
  112.             AdvanceSkill(Skill_Destruction, SkillGain_Magic)
  113.         endif
  114.     elseif (source as Weapon)
  115.         if (itemType >= ItemType_1HSword && itemType <= ItemType_1HMace)
  116.             AdvanceSkill(Skill_OneHanded, SkillGain_Melee)
  117.         elseif (itemType == ItemType_2HSword || itemType == ItemType_2HAxe)
  118.             AdvanceSkill(Skill_TwoHanded, SkillGain_Melee)
  119.         elseif (itemType == ItemType_Bow)
  120.             AdvanceSkill(Skill_Marksman, SkillGain_Ranged)
  121.         endif
  122.     endif
  123.  
  124.     GotoState("")
  125. endevent
  126.  
  127.  
  128. ;/////////////////////////////////////////////////////////////////////////////
  129.  / Functions
  130.  /////////////////////////////////////////////////////////////////////////////;
  131.  
  132. float function SkillGainFormular(string skill, float in)
  133.     float out = in
  134.  
  135.     if (MathEx.Chance(CriticalBonusChance) == 1)
  136.         out *= CriticalBonusMult
  137.         Debug.Notification("Critical Hit")
  138.     endif
  139.  
  140.     float mastery = Game.GetPlayer().GetActorValuePercentage(skill)
  141.     if (mastery > 0.75)
  142.         out += in * MasteryMasterMult
  143.     elseif (mastery > 0.5)
  144.         out += in * MasteryExpertMult
  145.     elseif (mastery > 0.25)
  146.         out += in * MasteryApprenticeMult
  147.     else
  148.         out += in * MasteryNoviceMult
  149.     endif
  150.  
  151.     return out
  152. endfunction
  153.  
  154. float function AdvanceSkill_Stable(string skill, float gain)
  155.     return SkillGainFormular(skill, MathEx.MaxF(1.0, gain))
  156. endfunction
  157.  
  158. float function AdvanceSkill_Random(string skill, float gain)
  159.     float min = MathEx.MaxF(1.0, gain / 2.0)
  160.     float max = MathEx.MaxF(1.0, gain * 2.0)
  161.     return SkillGainFormular(skill, Utility.RandomFloat(min, max))
  162. endfunction
  163.  
  164. function AdvanceSkill(string skill, float gain)
  165.     if (SkillGainMethod <= 0)
  166.         SkillGainMethod = GainType_Default
  167.     endif
  168.  
  169.     if (SkillGainMethod == GainType_Stable)
  170.         gain = AdvanceSkill_Stable(skill, gain)
  171.     elseif (SkillGainMethod == GainType_Random)
  172.         gain = AdvanceSkill_Random(skill, gain)
  173.     endif
  174.  
  175.     if (gain > 0.0)
  176.         Game.AdvanceSkill(skill, gain)
  177.     endif
  178. endfunction
  179.  
  180. ; Additional, from my XsUtils.psc
  181. bool function HasAnyKeyword(Form target, FormList keywordList) global
  182. {Checks whether a target has a keyword in a list of keywords.
  183. Note: The keywordList can contain other list of keywords.}
  184.     if (keywordList == none || keywordList.GetSize() == 0 || target == none)
  185.         return false
  186.     endif
  187.  
  188.     int i = 0
  189.     int l = keywordList.GetSize()
  190.     while (i < l)
  191.         Keyword current = keywordList.GetAt(i) as Keyword
  192.  
  193.         if (current)
  194.             if (target.HasKeyword(current))
  195.                 return true
  196.             endif
  197.         elseif (keywordList.GetAt(i) as FormList)
  198.             if (HasAnyKeyword(target, keywordList.GetAt(i) as FormList))
  199.                 return true
  200.             endif
  201.         endif
  202.  
  203.         i += 1
  204.     endwhile
  205.  
  206.     return false
  207. endfunction
  208.  
  209. ; and finally from MathEx.psc
  210. int function Min(int v1, int v2) global
  211.     if (v1 > v2)
  212.         return v2
  213.     else
  214.         return v1
  215.     endif
  216. endfunction
  217.  
  218. int function Max(int v1, int v2) global
  219.     if (v1 > v2)
  220.         return v1
  221.     else
  222.         return v2
  223.     endif
  224. endfunction
  225.  
  226. int function Chance(int limit) global
  227.     if (limit > 1)
  228.         return Utility.RandomInt(1, limit)
  229.     else
  230.         return 0
  231.     endif
  232. endfunction
Advertisement
Add Comment
Please, Sign In to add comment