File information

Last updated

Original upload

Created by

EternalVexation

Uploaded by

chris19982000

Virus scan

Safe to use

Tags for this mod

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
Description:
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