enderalse/source/scripts/_00e_theriantrophist_wolfattributes.psc

189 lines
5.7 KiB
Plaintext

Scriptname _00E_Theriantrophist_WolfAttributes extends Quest
; script that manages the werewolf attributes, shows the current stats
; in the active effect window and resets them to the human values when the
; transformation ends
Actor Property PlayerREF Auto
MiscObject Property _00E_UpdateInventoryItem Auto
Weapon Property _00E_Theriantrophist_Claws Auto
Spell Property _00E_Theriantrophist_DisplayDamageSpell Auto
Spell Property _00E_Theriantrophist_DisplayHealthSpell Auto
Spell Property _00E_Theriantrophist_DisplayStaminaSpell Auto
Spell Property _00E_Theriantrophist_DisplayArmorSpell Auto
{this spell is not a pure display spell anymore, since it contains the shield effect that makes the wolf armor}
Spell Property _00E_Theriantrophist_DisplaySpeedMultSpell Auto
Float Property WerewolfBaseCarryCapacity = 200 AutoReadOnly Hidden
Float carryCapacityMod
; the health/stamina bonus (or malus) the wolf has in comparison to human form
Float healthMod
Float staminaMod
Float temporarySpeedMultMod
Float speedMult
Float humanSpeedMult
; the absolute damage resist/unarmed damage values the player has while in wolf form
Float damageResist
Float unarmedDamage
Float temporaryUnarmedDamageMod
Function SetInWolfForm(bool wolfForm)
if wolfForm
gotoState("WolfForm")
else
gotoState("")
Endif
EndFunction
Function RemoveDisplaySpell(Spell displaySpell)
PlayerREF.removeSpell(displaySpell)
EndFunction
Function UpdateDisplaySpell(Spell displaySpell, Float value)
RemoveDisplaySpell(displaySpell)
Endfunction
Function ModWolfHealth(Float mod)
healthMod += mod
PlayerREF.modAV("health", mod)
UpdateDisplaySpell(_00E_Theriantrophist_DisplayHealthSpell, healthMod)
Endfunction
Function ModWolfStamina(Float mod)
staminaMod += mod
PlayerREF.modAV("stamina", mod)
UpdateDisplaySpell(_00E_Theriantrophist_DisplayStaminaSpell, staminaMod)
EndFunction
Float Function GetWolfUnarmedDamage()
return unarmedDamage
EndFunction
Function ForceWolfUnarmedDmg(Float value)
unarmedDamage = value
_00E_Theriantrophist_Claws.setBaseDamage((unarmedDamage + temporaryUnarmedDamageMod) as int)
UpdateDisplaySpell(_00E_Theriantrophist_DisplayDamageSpell, unarmedDamage)
Endfunction
Function SetWolfTempWolfUnarmedDamageMod(Float newTempMod)
temporaryUnarmedDamageMod = newTempMod
ForceWolfUnarmedDmg(unarmedDamage)
EndFunction
Function ModWolfUnarmedDmg(Float mod)
ForceWolfUnarmedDmg(unarmedDamage + mod)
Endfunction
Function ForceWolfDamageResist(Float value)
damageResist = value
; the display spell now contains a shield effect
UpdateDisplaySpell(_00E_Theriantrophist_DisplayArmorSpell, value)
Endfunction
Function ModWolfDamageResist(Float mod)
ForceWolfDamageResist(damageResist + mod)
EndFunction
Function ForceWolfSpeedMult(Float value)
speedMult = value
PlayerREF.setAV("speedMult", speedMult + temporarySpeedMultMod)
updateSpeedMult()
UpdateDisplaySpell(_00E_Theriantrophist_DisplaySpeedMultSpell, speedMult - 100)
EndFunction
Function SetTemporarilyWolfSpeedMultMod(Float value)
temporarySpeedMultMod = value
ForceWolfSpeedMult(speedMult)
EndFunction
Function ModWolfAV(String attribute, Float mod)
if (attribute == "health")
ModWolfHealth(mod)
elseif (attribute == "stamina")
ModWolfStamina(mod)
elseif (attribute == "unarmedDamage")
ModWolfUnarmedDmg(mod)
elseif (attribute == "damageResist")
ModWolfDamageResist(mod)
elseif (attribute == "speedMult")
ForceWolfSpeedMult(PlayerREF.getAV("speedMult") + mod)
EndIf
EndFunction
Function updateSpeedMult()
PlayerREF.additem(_00E_UpdateInventoryItem, 1, true)
PlayerREF.removeItem(_00E_UpdateInventoryItem, 1, true)
Endfunction
Function renewNotPersistentStats()
EndFunction
Function updateAfterRaceSwitch(bool toWolf)
ForceWolfSpeedMult(speedMult)
if (toWolf)
PlayerREF.modAV("CarryWeight", carryCapacityMod)
else
PlayerREF.modAV("CarryWeight", -carryCapacityMod)
Endif
EndFunction
State WolfForm
Event OnBeginState()
temporaryUnarmedDamageMod = 0
unarmedDamage = 0
damageResist = 0
healthMod = 0
staminaMod = 0
carryCapacityMod = PlayerREF.getAV("CarryWeight") - WerewolfBaseCarryCapacity
humanSpeedMult = PlayerREF.getAV("speedMult")
; If the player is under the influence of a slowdown magic effect, take the player's normal speedMult from Fame AV. See FrostSlowFix.psc
Float fFame = PlayerREF.GetBaseActorValue("Fame")
If fFame > humanSpeedMult
humanSpeedMult = fFame
EndIf
speedMult = humanSpeedMult
temporarySpeedMultMod = 0
renewNotPersistentStats()
Endevent
Event OnEndState()
if (healthMod > PlayerREF.getAV("health"))
PlayerREF.restoreAV("health", healthMod - PlayerREF.getAV("health") + 1)
Endif
PlayerREF.modAV("health", -healthMod)
PlayerREF.modAV("stamina", -staminaMod)
PlayerREF.setAV("speedMult", humanSpeedMult)
temporarySpeedMultMod = 0
updateSpeedMult()
RemoveDisplaySpell(_00E_Theriantrophist_DisplayDamageSpell)
RemoveDisplaySpell(_00E_Theriantrophist_DisplayHealthSpell)
RemoveDisplaySpell(_00E_Theriantrophist_DisplayStaminaSpell)
RemoveDisplaySpell(_00E_Theriantrophist_DisplayArmorSpell)
RemoveDisplaySpell(_00E_Theriantrophist_DisplaySpeedMultSpell)
Endevent
Function renewNotPersistentStats()
Utility.wait(0.5)
PlayerREF.setAV("speedMult", speedMult + temporarySpeedMultMod)
updateSpeedMult()
ForceWolfDamageResist(damageResist)
ForceWolfUnarmedDmg(unarmedDamage)
UpdateDisplaySpell(_00E_Theriantrophist_DisplaySpeedMultSpell, speedMult)
UpdateDisplaySpell(_00E_Theriantrophist_DisplayHealthSpell, healthMod)
UpdateDisplaySpell(_00E_Theriantrophist_DisplayStaminaSpell, staminaMod)
EndFunction
Function UpdateDisplaySpell(Spell displaySpell, Float value)
displaySpell.setNthEffectMagnitude(0, value)
PlayerREF.removeSpell(displaySpell)
PlayerREF.addSpell(displaySpell, false)
Endfunction
EndState