diff --git a/code/datums/spell.dm b/code/datums/spell.dm index 7a5607b2efd..8e733d4df39 100644 --- a/code/datums/spell.dm +++ b/code/datums/spell.dm @@ -26,6 +26,9 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin var/range = 7 //the range of the spell; outer radius for aoe spells var/message = "" //whatever it says to the guy affected by it var/selection_type = "view" //can be "range" or "view" + var/spell_level = 0 //if a spell can be taken multiple times, this raises + var/level_max = 4 //The max possible level_max is 4 + var/cooldown_min = 0 //This defines what spell quickened four timeshas as a cooldown. Make sure to set this for every spell var/overlay = 0 var/overlay_icon = 'icons/obj/wizard.dmi' diff --git a/code/datums/spells/ethereal_jaunt.dm b/code/datums/spells/ethereal_jaunt.dm index 1533234a2e6..b43cb6309f5 100644 --- a/code/datums/spells/ethereal_jaunt.dm +++ b/code/datums/spells/ethereal_jaunt.dm @@ -8,6 +8,7 @@ invocation = "none" invocation_type = "none" range = -1 + cooldown_min = 100 //50 deciseconds reduction per rank include_user = 1 centcom_cancast = 0 //Prevent people from getting to centcom diff --git a/code/datums/spells/horsemask.dm b/code/datums/spells/horsemask.dm index 106706d64c6..30ddb9b1577 100644 --- a/code/datums/spells/horsemask.dm +++ b/code/datums/spells/horsemask.dm @@ -10,6 +10,7 @@ invocation = "KN'A FTAGHU, PUCK 'BTHNK!" invocation_type = "shout" range = 7 + cooldown_min = 30 //30 deciseconds reduction per rank selection_type = "range" var/list/compatible_mobs = list(/mob/living/carbon/human, /mob/living/carbon/monkey) diff --git a/code/datums/spells/knock.dm b/code/datums/spells/knock.dm index a67eefe65f4..b96c96455a8 100644 --- a/code/datums/spells/knock.dm +++ b/code/datums/spells/knock.dm @@ -8,6 +8,7 @@ invocation = "AULIE OXIN FIERA" invocation_type = "whisper" range = 3 + cooldown_min = 20 //20 deciseconds reduction per rank /obj/effect/proc_holder/spell/aoe_turf/knock/cast(list/targets) for(var/turf/T in targets) diff --git a/code/datums/spells/mind_transfer.dm b/code/datums/spells/mind_transfer.dm index c8952cc8a91..7284ec29e09 100644 --- a/code/datums/spells/mind_transfer.dm +++ b/code/datums/spells/mind_transfer.dm @@ -8,6 +8,7 @@ invocation = "GIN'YU CAPAN" invocation_type = "whisper" range = 1 + cooldown_min = 200 //100 deciseconds reduction per rank var/list/protected_roles = list("Wizard","Changeling","Cultist") //which roles are immune to the spell var/list/compatible_mobs = list(/mob/living/carbon/human,/mob/living/carbon/monkey) //which types of mobs are affected by the spell. NOTE: change at your own risk var/base_spell_loss_chance = 20 //base probability of the wizard losing a spell in the process diff --git a/code/datums/spells/wizard.dm b/code/datums/spells/wizard.dm index 127dca7d38d..8ee60b918b9 100644 --- a/code/datums/spells/wizard.dm +++ b/code/datums/spells/wizard.dm @@ -8,6 +8,7 @@ invocation = "FORTI GY AMA" invocation_type = "shout" range = 7 + cooldown_min = 90 //15 deciseconds reduction per rank max_targets = 0 @@ -42,6 +43,7 @@ mutations = list(LASER, HULK) duration = 300 + cooldown_min = 300 //25 deciseconds reduction per rank /obj/effect/proc_holder/spell/targeted/inflict_handler/disintegrate name = "Disintegrate" @@ -53,6 +55,7 @@ invocation = "EI NATH" invocation_type = "shout" range = 1 + cooldown_min = 200 //100 deciseconds reduction per rank destroys = "gib_brain" @@ -70,6 +73,7 @@ invocation_type = "none" range = -1 include_user = 1 + cooldown_min = 20 //25 deciseconds reduction per rank smoke_spread = 2 smoke_amt = 10 @@ -83,6 +87,7 @@ invocation_type = "shout" range = -1 include_user = 1 + cooldown_min = 200 //50 deciseconds reduction per rank emp_heavy = 6 emp_light = 10 @@ -98,6 +103,8 @@ invocation_type = "none" range = -1 include_user = 1 + cooldown_min = 5 //4 deciseconds reduction per rank + smoke_spread = 1 smoke_amt = 10 @@ -118,6 +125,7 @@ invocation_type = "shout" range = -1 include_user = 1 + cooldown_min = 200 //100 deciseconds reduction per rank smoke_spread = 1 smoke_amt = 5 @@ -132,6 +140,7 @@ invocation = "TARCOL MINTI ZHERI" invocation_type = "whisper" range = 0 + cooldown_min = 50 //12 deciseconds reduction per rank summon_type = list("/obj/effect/forcefield") summon_lifespan = 300 @@ -189,6 +198,7 @@ invocation = "STI KALY" invocation_type = "whisper" message = "\blue Your eyes cry out in pain!" + cooldown_min = 50 //12 deciseconds reduction per rank starting_spells = list("/obj/effect/proc_holder/spell/targeted/inflict_handler/blind","/obj/effect/proc_holder/spell/targeted/genetic/blind") @@ -211,6 +221,7 @@ invocation = "STAUN EI" invocation_type = "shout" amt_stunned = 2//just exists to make sure the statue "catches" them + cooldown_min = 200 //100 deciseconds reduction per rank summon_type = "/obj/structure/closet/statue" @@ -224,6 +235,7 @@ invocation = "ONI SOMA" invocation_type = "shout" range = 20 + cooldown_min = 20 //10 deciseconds reduction per rank proj_icon_state = "fireball" proj_name = "a fireball" diff --git a/code/game/gamemodes/wizard/spellbook.dm b/code/game/gamemodes/wizard/spellbook.dm index f82afab3fc5..156554d486d 100644 --- a/code/game/gamemodes/wizard/spellbook.dm +++ b/code/game/gamemodes/wizard/spellbook.dm @@ -153,11 +153,33 @@ var/list/available_spells = list(magicmissile = "Magic Missile", fireball = "Fireball", disintegrate = "Disintegrate", disabletech = "Disable Tech", smoke = "Smoke", blind = "Blind", mindswap = "Mind Transfer", forcewall = "Forcewall", blink = "Blink", teleport = "Teleport", mutate = "Mutate", etherealjaunt = "Ethereal Jaunt", knock = "Knock", horseman = "Curse of the Horseman", fleshtostone = "Flesh to Stone", summonguns = "Summon Guns", staffchange = "Staff of Change", soulstone = "Six Soul Stone Shards and the spell Artificer", armor = "Mastercrafted Armor Set", staffanimate = "Staff of Animation") var/already_knows = 0 for(var/obj/effect/proc_holder/spell/aspell in H.spell_list) - if(available_spells[href_list["spell_choice"]] == aspell.name) + if(available_spells[href_list["spell_choice"]] == initial(aspell.name)) already_knows = 1 - temp = "You already know that spell." - uses++ - break + if(aspell.spell_level >= aspell.level_max) + temp = "This spell cannot be improved further." + uses++ + break + else + aspell.name = initial(aspell.name) + aspell.spell_level++ + aspell.charge_max = round(initial(aspell.charge_max) - aspell.spell_level * (initial(aspell.charge_max) - aspell.cooldown_min)/ aspell.level_max) + if(aspell.charge_max < aspell.charge_counter) + aspell.charge_counter = aspell.charge_max + switch(aspell.spell_level) + if(1) + temp = "You have improved [aspell.name] into Efficient [aspell.name]." + aspell.name = "Efficient [aspell.name]" + if(2) + temp = "You have further improved [aspell.name] into Quickened [aspell.name]." + aspell.name = "Quickened [aspell.name]" + if(3) + temp = "You have further improved [aspell.name] into Free [aspell.name]." + aspell.name = "Free [aspell.name]" + if(4) + temp = "You have further improved [aspell.name] into Instant [aspell.name]." + aspell.name = "Instant [aspell.name]" + if(aspell.spell_level >= aspell.level_max) + temp += " This spell cannot be strengthened any further." /* */ if(!already_knows)