mirror of
https://github.com/PolarisSS13/Polaris.git
synced 2025-12-20 23:21:20 +00:00
Adds ability to sort the spells section of the catalog into categories. The categories available are 'All', 'Offensive', 'Defensive', 'Utility', and 'Support'. Removes preset section on catalog as it was unused. Projectile spells now have a sound when fired. Haste lasts five seconds instead of three. Repel Missiles lasts for five minutes instead of two. All healing spells work five times as fast, healing in five seconds instead of twenty five seconds. The amount of instability and healing done has been multiplied to remain consistent. Passwall can now be used on more than just walls, if there's something dense on the same tile. Force Missile is now 25% cheaper to cast, and has a cooldown of .5 seconds instead of one second, and does 5 more damage. Beam's damage is increased by 10, and energy cost decreased by 25%. Lightning's warm-up time is now one second instead of two. Overload now costs 10% of total energy instead of 15%, and damage scaled with 4% of their current energy reserves, and 5% with the Scepter, instead of 3%/4%. Additionally, instability per shot is lowered to 12 from 15. Track now costs 25 points instead of 30 in the catalog, because roundness. Fire Aura should look more impressive without a Scepter. Fixes bug where shooting Lightning made you motionless for twenty seconds.
95 lines
3.4 KiB
Plaintext
95 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 = 120
|
|
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 = PoolOrNew(/datum/effect/effect/system/spark_spread)
|
|
spark_system.set_up(5, 0, src)
|
|
owner << "<span class='notice'>Your shield will expire in 3 seconds!</span>"
|
|
spawn(3 SECONDS)
|
|
if(src)
|
|
owner << "<span class='danger'>Your shield expires!</span>"
|
|
qdel(src)
|
|
|
|
/obj/item/weapon/spell/reflect/Destroy()
|
|
spark_system = null
|
|
..()
|
|
|
|
/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))
|
|
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(user.loc, 'sound/weapons/blade1.ogg', 50, 1)
|
|
// now send a log so that admins don't think they're shooting themselves on purpose.
|
|
log_and_message_admins("[user] reflected [attacker]'s attack back at them.")
|
|
|
|
if(!reflecting)
|
|
reflecting = 1
|
|
spawn(1 SECOND) //To ensure that most or all of a burst fire cycle is reflected.
|
|
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)
|
|
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(user.loc, 'sound/weapons/blade1.ogg', 50, 1)
|
|
|
|
log_and_message_admins("[user] reflected [attacker]'s attack back at them.")
|
|
|
|
if(!reflecting)
|
|
reflecting = 1
|
|
spawn(1 SECOND) //To ensure that most or all of a burst fire cycle is reflected.
|
|
owner << "<span class='danger'>Your shield fades due being used up!</span>"
|
|
qdel(src)
|
|
return 1
|
|
return 0
|