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)"