This commit is contained in:
silicons
2020-09-18 00:24:31 -07:00
parent 15b705dd37
commit a477b1d5a9
2 changed files with 58 additions and 8 deletions
+2 -2
View File
@@ -40,11 +40,11 @@
//What does the implant do upon injection?
//return 1 if the implant injects
//return 0 if there is no room for implant / it fails
/obj/item/implant/proc/implant(mob/living/target, mob/user, silent = FALSE)
/obj/item/implant/proc/implant(mob/living/target, mob/user, silent = FALSE, force = FALSE)
if(SEND_SIGNAL(src, COMSIG_IMPLANT_IMPLANTING, args) & COMPONENT_STOP_IMPLANTING)
return
LAZYINITLIST(target.implants)
if(!target.can_be_implanted() || !can_be_implanted_in(target))
if(!force && (!target.can_be_implanted() || !can_be_implanted_in(target)))
return FALSE
for(var/X in target.implants)
var/obj/item/implant/imp_e = X
@@ -42,15 +42,65 @@
name = "warp implant"
desc = "Saves your position somewhere, and then warps you back to it after five seconds."
icon_state = "warp"
uses = 15
uses = -1
var/total_delay = 10 SECONDS
var/cooldown = 10 SECONDS
var/last_use = 0
var/list/positions = list()
/obj/item/implant/warp/implant(mob/living/target, mob/user, silent, force)
. = ..()
if(.)
update_position()
RegisterSignal(imp_in, COMSIG_MOVABLE_MOVED, .proc/update_position)
/obj/item/implant/warp/removed(mob/living/source, silent, special)
. = ..()
clear_positions()
/obj/item/implant/warp/proc/update_position(datum/source)
if(!isatom(imp_in.loc))
return
var/time = text2num(world.time)
positions.Insert(time, 1)
positions[time] = imp_in.loc
/obj/item/implant/warp/proc/clear_positions()
positions = list()
/obj/item/implant/warp/proc/get_tele_position()
prune()
return positions[positions[positions.len]]
/obj/item/implant/warp/proc/do_teleport_effects()
var/safety = 100
var/list/done = list()
for(var/i in 1 to positions.len)
if(!--safety)
break
var/turf/target = positions[positions[i]]
if(done[target])
continue
done[target] = TRUE
if(!istype(target))
continue
new /obj/effect/temp_visual/dir_setting/ninja(target)
/obj/item/implant/warp/activate()
. = ..()
uses--
imp_in.do_adrenaline(20, TRUE, 0, 0, TRUE, list(/datum/reagent/fermi/eigenstate = 1.2), "<span class='boldnotice'>You feel an internal prick as as the bluespace starts ramping up!</span>")
to_chat(imp_in, "<span class='notice'>You feel an internal prick as as the bluespace starts ramping up!</span>")
if(!uses)
qdel(src)
if(last_use + cooldown > world.time)
to_chat(imp_in, "<span class=warning'>[src] is still recharging!</span>")
return
do_teleport_effects() //first.
do_teleport(imp_in, get_tele_position(), 0, TRUE, null, null, null, null, null, TELEPORT_CHANNEL_QUANTUM, TRUE)
/obj/item/implant/warp/proc/prune()
var/minimum_time = world.time - total_delay
for(var/i in positions.len to 1 step -1)
if(text2num(positions[i]) < minimum_time)
positions.len--
else
break
/obj/item/implanter/warp
name = "implanter (warp)"