About this mod
Provides a simple papyrus script for 'Skyrim Special Edition' attached to a lesser power / spell that removes or reduces shout cooldown, and instead modifying magicka and/or stamina (health aswell in 1 instance). Will work with modded shouts so long as they operate on a cooldown like vanilla. Tomes for progression added aswell.
- Permissions and credits
This mod is best used for mages or generally magicka intensive character builds.
This mod adds a Lesser power which can be equipped in either hand, the spell will remove (almost, sets cooldown to 5 seconds, prevents spamming ;) ) the shout cooldown and reduce magicka instead.
The amount of magicka and/or stamina drained are displayed as notifications in the top left.
If you don't have enough magicka, less magicka is used but stamina will be drained by the full cost.
Should you lack the magicka and stamina, they are both drained by the full cost, along with half of your current health (cannot kill).
Should you wish to reduce the cost, you can wait for the timer to decrease naturally then cast the lesser power OR use enchantments/items to reduce shout cooldown time (e.g. Amulet of Talos)
Add the spell with console command > player.addspell 7e002849 | or to get BaseID > help "channel magicka shout"
There is a ring, when it is equipped it will give you the lesser power, when unequipped it will remove it.
Ring is located in a chest in High Hrothgar centre room.
> player.additem 7e0012c3 1 | or to get BaseID > help "channel magicka shout ring"
I also added a tome (the 2 variations are purely aesthetic) "Secrets of Shout Incantation" to the world which appear (level 10+) as random loot on necromancers in place of a spell tome (rarely) and in the necromancers boss loot chest at the end (common).
When you first read the tome it will give you the lesser power and 1 dragonsoul. Reading after first will just give a dragonsoul.
Yes it doesn't make sense, but this mod makes shouts useable like spells, you need some way to gain spells other than killing dragons.
Reading the tome outside of your inventory will give a special message (4th wall break kind).
To obtain the tomes without random loot drops use console for BaseIDs:
> help "Secrets of Shout Incantation"
If you find an exploit for unlimited tome uses to get dragonsouls, save time and use the console ;)
Yes this has been done before, but the ones I've seen just straight use the cooldown as the cost (i.e. 45 seconds = 45 magicka)
I did however find HMS shouts helpful as this is my first script. HMS shouts employs a good system for shout cost.
Specifics:
The magicka cost of the shout uses the (at time of spell cast) shout cooldown with a multiplier
If the magicka cost was just the cooldown that would make some shouts very over-powered (e.g. unrelenting force with 3 words used would only cost 45 magicka)
If cooldown is between 1-50 | cost = 250% cooldown
If cooldown is between 51-100 | cost = 150% cooldown
If cooldown is between 101-150 | cost = 125% cooldown
If cooldown is between 151-250 | cost = 100% cooldown
If cooldown is greater than 250 | for each 50 seconds in the cooldown -0.04 from 1 to get multiplier
e.g. Storm call with 3 words is 600 seconds | ((600 / 50 = 12) / 25 = 0.48) | 1 - 0.48 = 0.52 * 600 | cost = 312 magicka
formula:
cooldown= c | cost = x
(1 - ((c / 50) / 25)) * c = x
If you HAVE enough magicka Magicka - cost(100%)
If you DO NOT have enough magicka but HAVE enough stamina Magicka - cost(50%) && Stamina - cost(100%)
If you DO NOT have enough magicka and DO NOT have enough staminaMagicka - cost(100%) && stamina - cost(100%) && half of your current health
Installation:
Nothing special, install with preferred mod manager
Manual Installation:
1. Extract 'Data' folder to Skyrim SE directory. Default Steam location C:\Program Files (x86)\Steam\steamapps\common\Skyrim Special Edition
2. Ensure ShoutCooldownMagicka.esp is activated in launcher
Compatibility:
Will work with vanilla/DLC and modded shouts that use timed cooldown like vanilla shouts
Should ideally be no problems
It does not edit any vanilla assets just uses them for new objects (Namira's Ring is the rings model for example)
Bugs:
Please report any you find
The scripts for reference (psc's included in download):
Scriptname aaaaShoutCooldownMagicka extends ActiveMagicEffect
float Property mult Auto
float Property magcost Auto
float Property cooldown Auto
float Property health Auto
Event Oneffectstart(actor aktarget, actor akcaster)
cooldown = akcaster.GetVoiceRecoveryTime()
;run function to calculate mult
CalcMult()
magcost = cooldown * mult
;damage magicka if have enough
if (akcaster.GetActorValue("magicka") >= magcost)
akcaster.DamageActorValue("magicka", magcost)
debug.Notification("Magicka Cost " + magcost as int)
if (akcaster.GetVoiceRecoveryTime() > 5)
akcaster.SetVoiceRecoveryTime(5)
Else
;do nothing
endif
;dont have magicka but have stamina, cost= 50%(magcost) magicka, 100%(magcost) stamina
Elseif (akcaster.GetActorValue("stamina") >= magcost)
debug.Notification("Stamina Cost " + magcost as int)
debug.Notification("Magicka Cost " + magcost as int / 2)
akcaster.DamageActorValue("stamina", magcost)
akcaster.DamageActorValue("magicka", magcost / 2)
;set cooldown time to 25% of magcost
akcaster.SetVoiceRecoveryTime(magcost as int / 4)
;dont have magicka or stamina, cost= 100%(magcost) magicka, 100%(magcost) stamina
elseif (akcaster.GetActorValue("stamina") < magcost) && (akcaster.GetActorValue("magicka") < magcost)
debug.Notification("Stamina Cost " + magcost as int)
debug.Notification("Magicka Cost " + magcost as int)
akcaster.DamageActorValue("stamina", magcost)
akcaster.DamageActorValue("magicka", magcost)
;damage health, CANNOT KILL
health = akcaster.GetActorValue("health")
akcaster.damageactorvalue("health", health / 2)
;set cooldown time to 50% of magcost
akcaster.SetVoiceRecoveryTime(magcost as int / 2)
endif
EndEvent
Function CalcMult()
;cooldown 1 to 50
if (cooldown <= 50)
mult = 2.5
return
endif
;cooldown = 51 to 100
if (cooldown <= 100)
mult = 1.5
return
endif
;cooldown = 101 to 150
If (cooldown <= 150)
mult = 1.25
return
EndIf
;cooldown = 151 to 250
If (cooldown <= 250)
mult = 1
return
EndIf
;cooldown = 251 or more
;for each 50 in cooldown, -0.04 from 1 to get mult
if (cooldown > 250)
mult = 1
float fmult = cooldown / 50
float divfmult = fmult / 25
mult = mult - divfmult
return
endif
Endfunction
Scriptname aaaaShoutMagickaCooldownRing extends ObjectReference
SPELL Property ThePower Auto
; ThePower = lesser power , aaaaShoutMagickaCooldownPower
Event OnEquipped(Actor akactor)
if akactor == game.GetPlayer()
game.GetPlayer().addspell(ThePower)
endif
EndEvent
Event OnUnEquipped(Actor akactor)
if akactor == game.GetPlayer()
game.GetPlayer().removespell(ThePower)
endif
Endevent
Scriptname aaaaShoutMagickaCooldownTome extends ObjectReference
SPELL Property MagickaShoutPower auto
;aaaaShoutMagickaCooldownPower
Book Property Tome auto
;aaaaShoutMagickaLesserPowerTome(01,02)
Event OnEquipped(Actor reader)
;incase book is read from inventory
actor player = game.getplayer()
if (reader != player)
return
endif
TomeEffect()
player.removeitem(Tome, 1, true)
EndEvent
Event OnActivate(ObjectReference reader)
;incase book is read from world
actor player = game.getplayer()
if (reader != player || IsActivationBlocked())
return
endif
debug.MessageBox("Tell me, Mr. Anderson...what good is a shout...if you're unable to speak? Read me from Inventory")
player.SetVoiceRecoveryTime(10)
;delete()
;deletebook()
EndEvent
;not used
Function deletebook()
Utility.WaitMenuMode(3.0)
game.getplayer().removeitem(Tome, 1, true)
delete()
EndFunction
Function TomeEffect()
actor player = game.getplayer()
if (player.hasspell(MagickaShoutPower))
player.modav("dragonsouls", 1)
debug.MessageBox("New knowledge is revealed and the tome crumbles to ashes")
Else
debug.MessageBox("Upon my first reading, knowledge of a new power is revealed. The tome crumbles to ashes")
player.addspell(MagickaShoutPower)
player.modav("dragonsouls", 1)
endif
return
EndFunction