/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
special_availability_check = 1
var/start_time = 0
var/ready = 0
var/image/halo = null
action_icon_state = "lightning"
var/sound/Snd // so far only way i can think of to stop a sound, thank MSO for the idea.
var/damaging = TRUE
/obj/effect/proc_holder/spell/targeted/lightning/lightnian
clothes_req = 0
invocation_type = "none"
damaging = 0
/obj/effect/proc_holder/spell/targeted/lightning/Click()
if(!ready && start_time == 0)
if(cast_check())
StartChargeup()
else
if(ready && cast_check(skipcharge=1))
choose_targets()
return 1
/obj/effect/proc_holder/spell/targeted/lightning/proc/StartChargeup(mob/user = usr)
ready = 1
to_chat(user, "You start gathering the power.")
Snd = new/sound('sound/magic/lightning_chargeup.ogg', channel = 7)
halo = image("icon"='icons/effects/effects.dmi',"icon_state" ="electricity","layer" = EFFECTS_LAYER)
user.overlays.Add(halo)
playsound(get_turf(user), Snd, 50, 0)
start_time = world.time
if(do_mob(user, user, 100, uninterruptible=1))
if(ready)
Discharge()
obj/effect/proc_holder/spell/targeted/lightning/proc/Reset(mob/user = usr)
ready = 0
start_time = 0
if(halo)
user.overlays.Remove(halo)
/obj/effect/proc_holder/spell/targeted/lightning/revert_cast(mob/user = usr)
to_chat(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
to_chat(M, "You lose control over the spell.")
Reset(user)
start_recharge()
/obj/effect/proc_holder/spell/targeted/lightning/cast(list/targets, mob/user = usr)
ready = 0
var/mob/living/target = targets[1]
Snd = sound(null, repeat = 0, wait = 1, channel = Snd.channel) //byond, why you suck?
playsound(get_turf(user), Snd, 50, 0)// Sorry MrPerson, but the other ways just didn't do it the way i needed to work, this is the only way.
if(get_dist(user,target)>range)
to_chat(user, "They are too far away!")
Reset(user)
return
playsound(get_turf(user), 'sound/magic/lightningbolt.ogg', 50, 1)
user.Beam(target,icon_state="lightning[rand(1,12)]",icon='icons/effects/effects.dmi',time=5)
var/energy = min(world.time - start_time,100)
if(damaging)
Bolt(user,target,max(15,energy/2),5,user) //5 bounces for energy/2 burn
else
var/bounces = round(energy/20)
Bolt(user,target,0,bounces,user)
Reset(user)
/obj/effect/proc_holder/spell/targeted/lightning/proc/Bolt(mob/origin, mob/living/target, bolt_energy, bounces, mob/user = usr)
origin.Beam(target,icon_state="lightning[rand(1,12)]", icon='icons/effects/effects.dmi', time=5)
var/mob/living/current = target
if(bounces < 1)
if(damaging)
current.electrocute_act(bolt_energy, "Lightning Bolt", safety = TRUE)
else
current.AdjustJitter(1000) //High numbers for violent convulsions
current.do_jitter_animation(current.jitteriness)
current.AdjustStuttering(2)
current.Slowed(3)
spawn(20)
current.AdjustJitter(-1000, bound_lower = 10) //Still jittery, but vastly less
playsound(get_turf(current), 'sound/magic/lightningshock.ogg', 50, 1, -1)
else
if(damaging)
current.electrocute_act(bolt_energy, "Lightning Bolt", safety = TRUE)
else
current.AdjustJitter(1000) //High numbers for violent convulsions
current.do_jitter_animation(current.jitteriness)
current.AdjustStuttering(2)
current.Slowed(3)
spawn(20)
current.AdjustJitter(-1000, bound_lower = 10) //Still jittery, but vastly less
playsound(get_turf(current), 'sound/magic/lightningshock.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
continue
possible_targets += M
if(!possible_targets.len)
return
var/mob/living/next = pick(possible_targets)
if(next)
Bolt(current,next,bolt_energy,bounces-1,user) // 5 max bounces