From c7a93d2e6eba8f8d886bb1b8c9d5e70d45570525 Mon Sep 17 00:00:00 2001 From: AnturK Date: Tue, 24 Mar 2015 22:03:25 +0100 Subject: [PATCH 1/3] Adds Lightning Bolt spell --- code/datums/spell.dm | 7 +- code/datums/spells/lightning.dm | 89 ++++++++++++++++++++++++ code/game/gamemodes/wizard/spellbook.dm | 9 ++- icons/effects/effects.dmi | Bin 285953 -> 286530 bytes tgstation.dme | 1 + 5 files changed, 104 insertions(+), 2 deletions(-) create mode 100644 code/datums/spells/lightning.dm diff --git a/code/datums/spell.dm b/code/datums/spell.dm index 7137bbf9ad1..71a8b0db2df 100644 --- a/code/datums/spell.dm +++ b/code/datums/spell.dm @@ -245,6 +245,7 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin var/max_targets = 1 //leave 0 for unlimited targets in range, 1 for one selectable target in range, more for limited number of casts (can all target one guy, depends on target_ignore_prev) in range var/target_ignore_prev = 1 //only important if max_targets > 1, affects if the spell can be cast multiple times at one person from one cast var/include_user = 0 //if it includes usr in the target list + var/random_target = 0 // chooses random viable target instead of asking the caster /obj/effect/proc_holder/spell/aoe_turf //affects all turfs in view or range (depends) var/inner_radius = -1 //for all your ring spell needs @@ -269,7 +270,11 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin //targets += input("Choose the target for the spell.", "Targeting") as mob in possible_targets //Adds a safety check post-input to make sure those targets are actually in range. - var/mob/M = input("Choose the target for the spell.", "Targeting") as mob in possible_targets + var/mob/M + if(!random_target) + M = input("Choose the target for the spell.", "Targeting") as mob in possible_targets + else + M = pick(possible_targets) if(M in view_or_range(range, user, selection_type)) targets += M else diff --git a/code/datums/spells/lightning.dm b/code/datums/spells/lightning.dm new file mode 100644 index 00000000000..bda59d916b5 --- /dev/null +++ b/code/datums/spells/lightning.dm @@ -0,0 +1,89 @@ +/obj/effect/proc_holder/spell/targeted/lightning + name = "Lightning Bolt" + desc = "Throws a lightning bolt at the nearby enemy. Classic." + charge_type = "recharge" + charge_max = 300 + clothes_req = 1 + invocation = "UN'LTD P'WAH!" + invocation_type = "shout" + range = 7 + cooldown_min = 30 + selection_type = "view" + random_target = 1 + var/energy = 0 + var/ready = 0 + +/obj/effect/bolt + name = "Lightning bolt" + icon = 'icons/effects/effects.dmi' + icon_state = "lightning" + luminosity = 3 + +/obj/effect/proc_holder/spell/targeted/lightning/Click() + if(!ready) + if(cast_check()) + StartChargeup() + else + if(cast_check(skipcharge=1)) + choose_targets() + return 1 + +/obj/effect/proc_holder/spell/targeted/lightning/proc/StartChargeup(mob/user = usr) + ready = 1 + user << "You start gathering the power." + //TODO: Add visual indictaor of charging + spawn(0) + while(ready) + sleep(1) + energy++ + if(energy >= 100 && ready) + Discharge() + +/obj/effect/proc_holder/spell/targeted/lightning/proc/Discharge(mob/user = usr) + var/mob/living/M = user + M.electrocute_act(25,"Lightning Bolt") + M << "You lose control over the spell." + energy = 0 + ready = 0 + start_recharge() + + +/obj/effect/proc_holder/spell/targeted/lightning/cast(list/targets, mob/user = usr) + if(!targets.len) + user << "No target found in range." + return + + var/mob/living/carbon/target = targets[1] + + if(!(target in oview(range))) + user << "They are too far away!" + return + + user.Beam(target,icon_state="lightning",icon='icons/effects/effects.dmi',time=5) + + switch(energy) + if(0 to 25) + target.electrocute_act(10,"Lightning Bolt") + if(25 to 75) + target.electrocute_act(25,"Lightning Bolt") + if(75 to 100) + //CHAIN LIGHTNING + Bolt(user,target,energy,user) + ready = 0 + energy = 0 + +/obj/effect/proc_holder/spell/targeted/lightning/proc/Bolt(mob/origin,mob/target,bolt_energy,mob/user = usr) + origin.Beam(target,icon_state="lightning",icon='icons/effects/effects.dmi',time=5) + var/mob/living/carbon/current = target + if(bolt_energy < 75) + current.electrocute_act(25,"Lightning Bolt") + else + current.electrocute_act(25,"Lightning Bolt") + var/list/possible_targets = new + for(var/mob/living/M in view_or_range(range,target,"view")) + if(user == M || target == M) // || origin == M ? Not sure double shockings is good or not + continue + possible_targets += M + var/mob/living/next = pick(possible_targets) + if(next) + Bolt(current,next,bolt_energy-6,user) // 5 max bounces \ No newline at end of file diff --git a/code/game/gamemodes/wizard/spellbook.dm b/code/game/gamemodes/wizard/spellbook.dm index b7ff72de867..1becc5aa3d9 100644 --- a/code/game/gamemodes/wizard/spellbook.dm +++ b/code/game/gamemodes/wizard/spellbook.dm @@ -106,6 +106,9 @@ dat += "Flesh to Stone (60)
" dat += "This spell will curse a person to immediately turn into an unmoving statue. The effect will eventually wear off if the statue is not destroyed.
" + dat += "Lightning Bolt (30)
" + dat += "Charge up and throw lightning bolt at the nearby enemy. Classic. The longer you charge the more powerful the spell, beware of overcharge however!
" + dat += "Instant Summons (10)
" dat += "This spell can be used to bind a valuable item to you, bringing it to your hand at will. Using this spell while holding the bound item will allow you to unbind it. It does not require wizard garb.
" if(ticker.mode.name != "ragin' mages") // we totally need summon greentext x100 @@ -220,7 +223,7 @@ uses-- /* */ - var/list/available_spells = list(magicmissile = "Magic Missile", fireball = "Fireball", disintegrate = "Disintegrate", disabletech = "Disable Tech", repulse = "Repulse", smoke = "Smoke", blind = "Blind", mindswap = "Mind Transfer", forcewall = "Forcewall", blink = "Blink", teleport = "Teleport", mutate = "Mutate", etherealjaunt = "Ethereal Jaunt", knock = "Knock", barnyardcurse = "The Curse of the Barnyard", fleshtostone = "Flesh to Stone", summonitem = "Instant Summons", summonguns = "Summon Guns", summonmagic = "Summon Magic", summonevents = "Summon Events", staffchange = "Staff of Change", soulstone = "Six Soul Stone Shards and the spell Artificer", necrostone = "A Necromantic Stone", armor = "Mastercrafted Armor Set", staffanimate = "Staff of Animation", staffchaos = "Staff of Chaos", staffdoor = "Staff of Door Creation", wands = "Wand Assortment") + var/list/available_spells = list(magicmissile = "Magic Missile", fireball = "Fireball", disintegrate = "Disintegrate", disabletech = "Disable Tech", repulse = "Repulse", smoke = "Smoke", blind = "Blind", mindswap = "Mind Transfer", forcewall = "Forcewall", blink = "Blink", teleport = "Teleport", mutate = "Mutate", etherealjaunt = "Ethereal Jaunt", knock = "Knock", barnyardcurse = "The Curse of the Barnyard", fleshtostone = "Flesh to Stone", summonitem = "Instant Summons", summonguns = "Summon Guns", summonmagic = "Summon Magic", summonevents = "Summon Events", staffchange = "Staff of Change", soulstone = "Six Soul Stone Shards and the spell Artificer", necrostone = "A Necromantic Stone", armor = "Mastercrafted Armor Set", staffanimate = "Staff of Animation", staffchaos = "Staff of Chaos", staffdoor = "Staff of Door Creation", wands = "Wand Assortment", lightningbolt = "Lightning Bolt") var/already_knows = 0 for(var/obj/effect/proc_holder/spell/aspell in H.mind.spell_list) if(available_spells[href_list["spell_choice"]] == initial(aspell.name)) @@ -318,6 +321,10 @@ feedback_add_details("wizard_spell_learned","IS") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells H.mind.spell_list += new /obj/effect/proc_holder/spell/targeted/summonitem(null) temp = "You have learned instant summons." + if("lightningbolt") + feedback_add_details("wizard_spell_learned","LB") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells + H.mind.spell_list += new /obj/effect/proc_holder/spell/targeted/lightning(null) + temp = "You have learned lightning bolt." if("summonguns") feedback_add_details("wizard_spell_learned","SG") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells rightandwrong(0, H, 0) diff --git a/icons/effects/effects.dmi b/icons/effects/effects.dmi index d2bad4aa9dce457c0001b2c5e41f5a8e135c925c..0b9074d181bad13f21940ad94beaa997b472b724 100644 GIT binary patch delta 6851 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 delta 6275 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 Date: Wed, 25 Mar 2015 21:44:19 +0100 Subject: [PATCH 2/3] - adds LoS obstacle check - some sanity checks - Removes the blowback, now the spell just fizzles harmlessly --- code/datums/spell.dm | 29 ++++++++++++++++++++++++++++- code/datums/spells/lightning.dm | 25 +++++++++++++------------ 2 files changed, 41 insertions(+), 13 deletions(-) diff --git a/code/datums/spell.dm b/code/datums/spell.dm index 71a8b0db2df..587d5f1c646 100644 --- a/code/datums/spell.dm +++ b/code/datums/spell.dm @@ -1,3 +1,6 @@ +#define TARGET_CLOSEST 1 +#define TARGET_RANDOM 2 + /obj/effect/proc_holder var/panel = "Debug"//What panel the proc holder needs to go on. @@ -246,6 +249,7 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin var/target_ignore_prev = 1 //only important if max_targets > 1, affects if the spell can be cast multiple times at one person from one cast var/include_user = 0 //if it includes usr in the target list var/random_target = 0 // chooses random viable target instead of asking the caster + var/random_target_priority = TARGET_CLOSEST // if random_target is enabled how it will pick the target /obj/effect/proc_holder/spell/aoe_turf //affects all turfs in view or range (depends) var/inner_radius = -1 //for all your ring spell needs @@ -274,7 +278,18 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin if(!random_target) M = input("Choose the target for the spell.", "Targeting") as mob in possible_targets else - M = pick(possible_targets) + switch(random_target_priority) + if(TARGET_RANDOM) + M = pick(possible_targets) + if(TARGET_CLOSEST) + for(var/mob/living/L in possible_targets) + if(M) + if(get_dist(user,L) < get_dist(user,M)) + if(los_check(user,L)) + M = L + else + if(los_check(user,L)) + M = L if(M in view_or_range(range, user, selection_type)) targets += M else @@ -320,4 +335,16 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin /obj/effect/proc_holder/spell/proc/can_be_cast_by(mob/caster) if((human_req || clothes_req) && !ishuman(caster)) return 0 + return 1 + +/obj/effect/proc_holder/spell/targeted/proc/los_check(mob/A,mob/B) + //Checks for obstacles from A to B + var/obj/dummy = new(A.loc) + dummy.pass_flags |= PASSTABLE + for(var/turf/turf in getline(A,B)) + for(var/atom/movable/AM in turf) + if(!AM.CanPass(dummy,turf,1)) + qdel(dummy) + return 0 + qdel(dummy) return 1 \ No newline at end of file diff --git a/code/datums/spells/lightning.dm b/code/datums/spells/lightning.dm index bda59d916b5..197e72fcda4 100644 --- a/code/datums/spells/lightning.dm +++ b/code/datums/spells/lightning.dm @@ -13,12 +13,6 @@ var/energy = 0 var/ready = 0 -/obj/effect/bolt - name = "Lightning bolt" - icon = 'icons/effects/effects.dmi' - icon_state = "lightning" - luminosity = 3 - /obj/effect/proc_holder/spell/targeted/lightning/Click() if(!ready) if(cast_check()) @@ -39,9 +33,15 @@ if(energy >= 100 && ready) Discharge() +/obj/effect/proc_holder/spell/targeted/lightning/revert_cast(mob/user = usr) + user << "No target found in range." + ready = 0 + energy = 0 + ..() + /obj/effect/proc_holder/spell/targeted/lightning/proc/Discharge(mob/user = usr) var/mob/living/M = user - M.electrocute_act(25,"Lightning Bolt") + //M.electrocute_act(25,"Lightning Bolt") M << "You lose control over the spell." energy = 0 ready = 0 @@ -49,14 +49,13 @@ /obj/effect/proc_holder/spell/targeted/lightning/cast(list/targets, mob/user = usr) - if(!targets.len) - user << "No target found in range." - return var/mob/living/carbon/target = targets[1] - if(!(target in oview(range))) + if(get_dist(user,target)>range) user << "They are too far away!" + ready = 0 + energy = 0 return user.Beam(target,icon_state="lightning",icon='icons/effects/effects.dmi',time=5) @@ -81,9 +80,11 @@ current.electrocute_act(25,"Lightning Bolt") var/list/possible_targets = new for(var/mob/living/M in view_or_range(range,target,"view")) - if(user == M || target == M) // || origin == M ? Not sure double shockings is good or not + if(user == M || target == M && los_check(current,M)) // || origin == M ? Not sure double shockings is good or not continue possible_targets += M + if(!possible_targets.len) + return var/mob/living/next = pick(possible_targets) if(next) Bolt(current,next,bolt_energy-6,user) // 5 max bounces \ No newline at end of file From d37645640233fd5c1be766cf82c5b05835ca899b Mon Sep 17 00:00:00 2001 From: AnturK Date: Thu, 26 Mar 2015 22:49:42 +0100 Subject: [PATCH 3/3] - Adds simple charging visual - Adds sound effect - Changelog --- code/datums/spells/lightning.dm | 26 ++++++++++++++++-------- html/changelogs/AnturK-LightningBolt.yml | 6 ++++++ 2 files changed, 23 insertions(+), 9 deletions(-) create mode 100644 html/changelogs/AnturK-LightningBolt.yml diff --git a/code/datums/spells/lightning.dm b/code/datums/spells/lightning.dm index 197e72fcda4..b3e813c7e0e 100644 --- a/code/datums/spells/lightning.dm +++ b/code/datums/spells/lightning.dm @@ -12,6 +12,7 @@ random_target = 1 var/energy = 0 var/ready = 0 + var/image/halo = null /obj/effect/proc_holder/spell/targeted/lightning/Click() if(!ready) @@ -25,7 +26,8 @@ /obj/effect/proc_holder/spell/targeted/lightning/proc/StartChargeup(mob/user = usr) ready = 1 user << "You start gathering the power." - //TODO: Add visual indictaor of charging + halo = image("icon"='icons/effects/effects.dmi',"icon_state" ="electricity","layer" = EFFECTS_LAYER) + user.overlays.Add(halo) spawn(0) while(ready) sleep(1) @@ -33,18 +35,22 @@ if(energy >= 100 && ready) Discharge() -/obj/effect/proc_holder/spell/targeted/lightning/revert_cast(mob/user = usr) - user << "No target found in range." +obj/effect/proc_holder/spell/targeted/lightning/proc/Reset(mob/user = usr) ready = 0 energy = 0 + if(halo) + user.overlays.Remove(halo) + +/obj/effect/proc_holder/spell/targeted/lightning/revert_cast(mob/user = usr) + user << "No target found in range." + Reset(user) ..() /obj/effect/proc_holder/spell/targeted/lightning/proc/Discharge(mob/user = usr) var/mob/living/M = user //M.electrocute_act(25,"Lightning Bolt") M << "You lose control over the spell." - energy = 0 - ready = 0 + Reset(user) start_recharge() @@ -54,8 +60,7 @@ if(get_dist(user,target)>range) user << "They are too far away!" - ready = 0 - energy = 0 + Reset(user) return user.Beam(target,icon_state="lightning",icon='icons/effects/effects.dmi',time=5) @@ -63,21 +68,24 @@ switch(energy) if(0 to 25) target.electrocute_act(10,"Lightning Bolt") + playsound(get_turf(target), 'sound/machines/defib_zap.ogg', 50, 1, -1) if(25 to 75) target.electrocute_act(25,"Lightning Bolt") + playsound(get_turf(target), 'sound/machines/defib_zap.ogg', 50, 1, -1) if(75 to 100) //CHAIN LIGHTNING Bolt(user,target,energy,user) - ready = 0 - energy = 0 + Reset(user) /obj/effect/proc_holder/spell/targeted/lightning/proc/Bolt(mob/origin,mob/target,bolt_energy,mob/user = usr) origin.Beam(target,icon_state="lightning",icon='icons/effects/effects.dmi',time=5) var/mob/living/carbon/current = target if(bolt_energy < 75) current.electrocute_act(25,"Lightning Bolt") + playsound(get_turf(current), 'sound/machines/defib_zap.ogg', 50, 1, -1) else current.electrocute_act(25,"Lightning Bolt") + playsound(get_turf(current), 'sound/machines/defib_zap.ogg', 50, 1, -1) var/list/possible_targets = new for(var/mob/living/M in view_or_range(range,target,"view")) if(user == M || target == M && los_check(current,M)) // || origin == M ? Not sure double shockings is good or not diff --git a/html/changelogs/AnturK-LightningBolt.yml b/html/changelogs/AnturK-LightningBolt.yml new file mode 100644 index 00000000000..c5d672d4ab7 --- /dev/null +++ b/html/changelogs/AnturK-LightningBolt.yml @@ -0,0 +1,6 @@ +author: AnturK + +delete-after: True + +changes: + - rscadd: "Added new wizard spell : Lightning Bolt"