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 1/5] 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)" From d619823b9b2eea602ea653cce220b9fcdeace779 Mon Sep 17 00:00:00 2001 From: silicons <2003111+silicons@users.noreply.github.com> Date: Fri, 18 Sep 2020 00:27:04 -0700 Subject: [PATCH 2/5] ok --- code/game/objects/items/implants/implant_misc.dm | 6 +++++- code/modules/uplink/uplink_items/uplink_implants.dm | 2 +- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/code/game/objects/items/implants/implant_misc.dm b/code/game/objects/items/implants/implant_misc.dm index c607fa80d0..33a24275ee 100644 --- a/code/game/objects/items/implants/implant_misc.dm +++ b/code/game/objects/items/implants/implant_misc.dm @@ -40,7 +40,7 @@ /obj/item/implant/warp name = "warp implant" - desc = "Saves your position somewhere, and then warps you back to it after five seconds." + desc = "Warps you to where you were 10 seconds before when activated." icon_state = "warp" uses = -1 var/total_delay = 10 SECONDS @@ -48,6 +48,10 @@ var/last_use = 0 var/list/positions = list() +/obj/item/implant/warp/Destroy() + positions = null + return ..() + /obj/item/implant/warp/implant(mob/living/target, mob/user, silent, force) . = ..() if(.) diff --git a/code/modules/uplink/uplink_items/uplink_implants.dm b/code/modules/uplink/uplink_items/uplink_implants.dm index bb4e0c7960..4839c96a2d 100644 --- a/code/modules/uplink/uplink_items/uplink_implants.dm +++ b/code/modules/uplink/uplink_items/uplink_implants.dm @@ -31,7 +31,7 @@ /datum/uplink_item/implants/warp name = "Warp Implant" - desc = "An implant injected into the body and later activated at the user's will. It will inject eigenstasium which saves the user's location and teleports them there after five seconds. Lasts only fifteen times." + desc = "An implant injected into the body and later activated at the user's will. Allows the user to teleport to where they were 10 seconds ago. Has a 10 second cooldown." item = /obj/item/storage/box/syndie_kit/imp_warp cost = 6 exclude_modes = list(/datum/game_mode/nuclear, /datum/game_mode/nuclear/clown_ops) From b1738c7230a3362a273bbfb527244d25d0ea01dc Mon Sep 17 00:00:00 2001 From: silicons <2003111+silicons@users.noreply.github.com> Date: Fri, 18 Sep 2020 00:30:02 -0700 Subject: [PATCH 3/5] fix --- code/game/objects/items/implants/implant_misc.dm | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/code/game/objects/items/implants/implant_misc.dm b/code/game/objects/items/implants/implant_misc.dm index 33a24275ee..6e88d8e4c6 100644 --- a/code/game/objects/items/implants/implant_misc.dm +++ b/code/game/objects/items/implants/implant_misc.dm @@ -47,6 +47,7 @@ var/cooldown = 10 SECONDS var/last_use = 0 var/list/positions = list() + var/next_prune = 0 /obj/item/implant/warp/Destroy() positions = null @@ -65,9 +66,11 @@ /obj/item/implant/warp/proc/update_position(datum/source) if(!isatom(imp_in.loc)) return - var/time = text2num(world.time) + var/time = num2text(world.time) positions.Insert(time, 1) positions[time] = imp_in.loc + if(!((++next_prune) % 10)) + prune() /obj/item/implant/warp/proc/clear_positions() positions = list() From 4338c0207e942b5222067ad93a99aece0bb48da4 Mon Sep 17 00:00:00 2001 From: silicons <2003111+silicons@users.noreply.github.com> Date: Fri, 18 Sep 2020 00:37:36 -0700 Subject: [PATCH 4/5] fix --- .../game/objects/items/implants/implant_misc.dm | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/code/game/objects/items/implants/implant_misc.dm b/code/game/objects/items/implants/implant_misc.dm index 6e88d8e4c6..ab26913e06 100644 --- a/code/game/objects/items/implants/implant_misc.dm +++ b/code/game/objects/items/implants/implant_misc.dm @@ -66,9 +66,7 @@ /obj/item/implant/warp/proc/update_position(datum/source) if(!isatom(imp_in.loc)) return - var/time = num2text(world.time) - positions.Insert(time, 1) - positions[time] = imp_in.loc + positions[num2text(world.time)] = imp_in.loc if(!((++next_prune) % 10)) prune() @@ -82,10 +80,13 @@ /obj/item/implant/warp/proc/do_teleport_effects() var/safety = 100 var/list/done = list() + var/time + var/turf/target for(var/i in 1 to positions.len) if(!--safety) break - var/turf/target = positions[positions[i]] + time = positions[i] + target = positions[time] if(done[target]) continue done[target] = TRUE @@ -98,16 +99,20 @@ if(last_use + cooldown > world.time) to_chat(imp_in, "[src] is still recharging!") return + prune() 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) + var/remove = 0 + for(var/i in 1 to length(positions)) if(text2num(positions[i]) < minimum_time) - positions.len-- + remove++ else break + if(remove) + positions.Cut(1, remove + 1) /obj/item/implanter/warp name = "implanter (warp)" From 139c99d82a78618f1b41f83ac6fd79ccd2410fac Mon Sep 17 00:00:00 2001 From: silicons <2003111+silicons@users.noreply.github.com> Date: Fri, 18 Sep 2020 00:49:17 -0700 Subject: [PATCH 5/5] fix --- code/game/objects/items/implants/implant_misc.dm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/code/game/objects/items/implants/implant_misc.dm b/code/game/objects/items/implants/implant_misc.dm index ab26913e06..76a4ec7dfb 100644 --- a/code/game/objects/items/implants/implant_misc.dm +++ b/code/game/objects/items/implants/implant_misc.dm @@ -75,7 +75,7 @@ /obj/item/implant/warp/proc/get_tele_position() prune() - return positions[positions[positions.len]] + return positions[positions[1]] /obj/item/implant/warp/proc/do_teleport_effects() var/safety = 100 @@ -99,6 +99,7 @@ if(last_use + cooldown > world.time) to_chat(imp_in, "[src] is still recharging!") return + last_use = world.time prune() do_teleport_effects() //first. do_teleport(imp_in, get_tele_position(), 0, TRUE, null, null, null, null, null, TELEPORT_CHANNEL_QUANTUM, TRUE)