Files
Aurora.3/code/modules/psionics/faculties/psychokinesis.dm

92 lines
3.2 KiB
Plaintext

/datum/psionic_faculty/psychokinesis
id = PSI_PSYCHOKINESIS
name = "Psychokinesis"
associated_intent = I_GRAB
armor_types = list("melee", "bullet")
/datum/psionic_power/psychokinesis
faculty = PSI_PSYCHOKINESIS
use_manifest = TRUE
use_sound = null
/datum/psionic_power/psychokinesis/psiblade
name = "Psiblade"
cost = 10
cooldown = 30
min_rank = PSI_RANK_OPERANT
use_description = "Click on or otherwise activate an empty hand while on harm intent to manifest a psychokinetic cutting blade. The power the blade will vary based on your mastery of the faculty."
admin_log = FALSE
/datum/psionic_power/psychokinesis/psiblade/invoke(var/mob/living/user, var/mob/living/target)
if((target && user != target) || user.a_intent != I_HURT)
return FALSE
. = ..()
if(.)
switch(user.psi.get_rank(faculty))
if(PSI_RANK_PARAMOUNT)
return new /obj/item/psychic_power/psiblade/master/grand/paramount(user, user)
if(PSI_RANK_GRANDMASTER)
return new /obj/item/psychic_power/psiblade/master/grand(user, user)
if(PSI_RANK_MASTER)
return new /obj/item/psychic_power/psiblade/master(user, user)
else
return new /obj/item/psychic_power/psiblade(user, user)
/datum/psionic_power/psychokinesis/tinker
name = "Tinker"
cost = 5
cooldown = 10
min_rank = PSI_RANK_MASTER
use_description = "Click on or otherwise activate an empty hand while on grab intent to manifest a psychokinetic tool. Use it in-hand to switch between tool types."
admin_log = FALSE
/datum/psionic_power/psychokinesis/tinker/invoke(var/mob/living/user, var/mob/living/target)
if((target && user != target) || user.a_intent != I_GRAB)
return FALSE
. = ..()
if(.)
return new /obj/item/psychic_power/tinker(user)
/datum/psionic_power/psychokinesis/telekinesis
name = "Telekinesis"
cost = 5
cooldown = 10
use_ranged = TRUE
use_manifest = FALSE
min_rank = PSI_RANK_GRANDMASTER
use_description = "Click on a distant target while on grab intent to manifest a psychokinetic grip. Use it manipulate objects at a distance."
admin_log = FALSE
use_sound = 'sound/effects/psi/power_used.ogg'
var/global/list/valid_machine_types = list(
/obj/machinery/door
)
/datum/psionic_power/psychokinesis/telekinesis/invoke(var/mob/living/user, var/mob/living/target)
if(user.a_intent != I_GRAB)
return FALSE
. = ..()
if(.)
var/distance = get_dist(user, target)
if(distance > user.psi.get_rank(PSI_PSYCHOKINESIS))
to_chat(user, SPAN_WARNING("Your telekinetic power won't reach that far."))
return FALSE
if(istype(target, /mob) || istype(target, /obj))
var/obj/item/psychic_power/telekinesis/tk = new(user)
if(tk.set_focus(target))
tk.sparkle()
user.visible_message(SPAN_NOTICE("\The [user] reaches out."))
return tk
else if(istype(target, /obj/structure))
user.visible_message(SPAN_NOTICE("\The [user] makes a strange gesture."))
var/obj/O = target
O.attack_hand(user)
return TRUE
else if(istype(target, /obj/machinery))
for(var/mtype in valid_machine_types)
if(istype(target, mtype))
var/obj/machinery/machine = target
machine.attack_hand(user)
return TRUE
return FALSE