Files
CHOMPStation2/code/game/gamemodes/technomancer/spells/reflect.dm
Novacat fea37c84c3 Merge pull request #9930 from Novacat/nova-basicfixes
Slightly nerfs cold adaptation
2021-03-12 23:22:55 +00:00

94 lines
3.4 KiB
Plaintext

/datum/technomancer/spell/reflect
name = "Reflect"
desc = "Emits a protective shield fron your hand in front of you, which will reflect one attack back at the attacker."
cost = 100
obj_path = /obj/item/weapon/spell/reflect
ability_icon_state = "tech_reflect"
category = DEFENSIVE_SPELLS
/obj/item/weapon/spell/reflect
name = "\proper reflect shield"
icon_state = "reflect"
desc = "A very protective combat shield that'll reflect the next attack at the unfortunate person who tried to shoot you."
aspect = ASPECT_FORCE
toggled = 1
var/reflecting = 0
var/damage_to_energy_multiplier = 60.0 //Determines how much energy to charge for blocking, e.g. 20 damage attack = 1200 energy cost
var/datum/effect/effect/system/spark_spread/spark_system = null
/obj/item/weapon/spell/reflect/New()
..()
set_light(3, 2, l_color = "#006AFF")
spark_system = new /datum/effect/effect/system/spark_spread()
spark_system.set_up(5, 0, src)
to_chat(owner, "<span class='notice'>Your shield will expire in 5 seconds!</span>")
QDEL_IN(src, 5 SECONDS)
/obj/item/weapon/spell/reflect/Destroy()
if(owner)
to_chat(owner, "<span class='danger'>Your shield expires!</span>")
spark_system = null
return ..()
/obj/item/weapon/spell/reflect/handle_shield(mob/user, var/damage, atom/damage_source = null, mob/attacker = null, var/def_zone = null, var/attack_text = "the attack")
if(user.incapacitated())
return 0
var/damage_to_energy_cost = (damage_to_energy_multiplier * damage)
if(!pay_energy(damage_to_energy_cost))
to_chat(owner, "<span class='danger'>Your shield fades due to lack of energy!</span>")
qdel(src)
return 0
//block as long as they are not directly behind us
var/bad_arc = reverse_direction(user.dir) //arc of directions from which we cannot block
if(check_shield_arc(user, bad_arc, damage_source, attacker))
if(istype(damage_source, /obj/item/projectile))
var/obj/item/projectile/P = damage_source
if(P.starting && !P.reflected)
visible_message("<span class='danger'>\The [user]'s [src.name] reflects [attack_text]!</span>")
var/turf/curloc = get_turf(user)
// redirect the projectile
P.redirect(P.starting.x, P.starting.y, curloc, user)
P.reflected = 1
if(check_for_scepter())
P.damage = P.damage * 1.5
spark_system.start()
playsound(src, 'sound/weapons/blade1.ogg', 50, 1)
// now send a log so that admins don't think they're shooting themselves on purpose.
add_attack_logs(user,attacker,"Reflected [attacker]'s attack")
if(!reflecting)
reflecting = 1
spawn(2 SECONDS) //To ensure that most or all of a burst fire cycle is reflected.
to_chat(owner, "<span class='danger'>Your shield fades due being used up!</span>")
qdel(src)
return PROJECTILE_CONTINUE // complete projectile permutation
else if(istype(damage_source, /obj/item/weapon))
var/obj/item/weapon/W = damage_source
if(attacker)
W.attack(attacker)
to_chat(attacker, "<span class='danger'>Your [damage_source.name] goes through \the [src] in one location, comes out \
on the same side, and hits you!</span>")
spark_system.start()
playsound(src, 'sound/weapons/blade1.ogg', 50, 1)
add_attack_logs(user,attacker,"Reflected [attacker]'s attack")
if(!reflecting)
reflecting = 1
spawn(2 SECONDS) //To ensure that most or all of a burst fire cycle is reflected.
to_chat(owner, "<span class='danger'>Your shield fades due being used up!</span>")
qdel(src)
return 1
return 0