From a477b1d5a9ec54f887c684bbcbed596775bc5bb6 Mon Sep 17 00:00:00 2001
From: silicons <2003111+silicons@users.noreply.github.com>
Date: Fri, 18 Sep 2020 00:24:31 -0700
Subject: [PATCH] easy??
---
code/game/objects/items/implants/implant.dm | 4 +-
.../objects/items/implants/implant_misc.dm | 62 +++++++++++++++++--
2 files changed, 58 insertions(+), 8 deletions(-)
diff --git a/code/game/objects/items/implants/implant.dm b/code/game/objects/items/implants/implant.dm
index cc2ae3631e..f8e02eaf03 100644
--- a/code/game/objects/items/implants/implant.dm
+++ b/code/game/objects/items/implants/implant.dm
@@ -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
diff --git a/code/game/objects/items/implants/implant_misc.dm b/code/game/objects/items/implants/implant_misc.dm
index 08d6a586c8..c607fa80d0 100644
--- a/code/game/objects/items/implants/implant_misc.dm
+++ b/code/game/objects/items/implants/implant_misc.dm
@@ -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), "You feel an internal prick as as the bluespace starts ramping up!")
- to_chat(imp_in, "You feel an internal prick as as the bluespace starts ramping up!")
- if(!uses)
- qdel(src)
+ if(last_use + cooldown > world.time)
+ to_chat(imp_in, "[src] is still recharging!")
+ 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)"