From 1d2fb06b66f49169fb5f5d171705df6991c9d01d Mon Sep 17 00:00:00 2001
From: Enric Gabriel <43283559+SandPoot@users.noreply.github.com>
Date: Sat, 18 Jul 2020 22:39:11 -0300
Subject: [PATCH] Skyrat13#2897
---
code/modules/clothing/outfits/standard.dm | 4 +-
.../code/game/objects/items/chrono_eraser.dm | 284 +++++++++++++++
.../code/modules/clothing/outfits/standard.dm | 24 ++
.../modules/clothing/spacesuits/chronosuit.dm | 324 ++++++++++++++++++
sandcode/icons/mob/clothing/head.dmi | Bin 3080 -> 4004 bytes
sandcode/icons/mob/clothing/head_muzzled.dmi | Bin 2933 -> 3830 bytes
sandcode/icons/mob/clothing/suit.dmi | Bin 1621 -> 3155 bytes
sandcode/icons/mob/clothing/suit_digi.dmi | Bin 1771 -> 3354 bytes
tgstation.dme | 4 +-
9 files changed, 636 insertions(+), 4 deletions(-)
create mode 100644 sandcode/code/game/objects/items/chrono_eraser.dm
create mode 100644 sandcode/code/modules/clothing/spacesuits/chronosuit.dm
diff --git a/code/modules/clothing/outfits/standard.dm b/code/modules/clothing/outfits/standard.dm
index afe74de6a0..6f9010eb95 100644
--- a/code/modules/clothing/outfits/standard.dm
+++ b/code/modules/clothing/outfits/standard.dm
@@ -415,7 +415,7 @@
name = "Death Commando Officer"
head = /obj/item/clothing/head/helmet/space/beret
-/datum/outfit/chrono_agent
+/* /datum/outfit/chrono_agent //Begone skyrat change on sandstorm
name = "Timeline Eradication Agent"
uniform = /obj/item/clothing/under/color/white
suit = /obj/item/clothing/suit/space/chronos
@@ -423,7 +423,7 @@
head = /obj/item/clothing/head/helmet/space/chronos
mask = /obj/item/clothing/mask/breath
suit_store = /obj/item/tank/internals/oxygen
-
+*/
/datum/outfit/debug //Debug objs plus hardsuit
name = "Debug outfit"
uniform = /obj/item/clothing/under/misc/patriotsuit
diff --git a/sandcode/code/game/objects/items/chrono_eraser.dm b/sandcode/code/game/objects/items/chrono_eraser.dm
new file mode 100644
index 0000000000..198db22d78
--- /dev/null
+++ b/sandcode/code/game/objects/items/chrono_eraser.dm
@@ -0,0 +1,284 @@
+#define CHRONO_BEAM_RANGE 5
+#define CHRONO_FRAME_COUNT 22
+/obj/item/chrono_eraser //Gandalf was here!
+ name = "Timestream Eradication Device"
+ desc = "The result of outlawed time-bluespace research, this device is capable of wiping a being from the timestream. They never are, they never were, they never will be."
+ icon = 'icons/obj/chronos.dmi'
+ icon_state = "chronobackpack"
+ item_state = "backpack"
+ lefthand_file = 'icons/mob/inhands/equipment/backpack_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/equipment/backpack_righthand.dmi'
+ w_class = WEIGHT_CLASS_BULKY
+ slot_flags = ITEM_SLOT_BACK
+ slowdown = 0
+ actions_types = list(/datum/action/item_action/equip_unequip_TED_Gun)
+ var/obj/item/gun/energy/chrono_gun/PA = null
+ var/list/erased_minds = list() //a collection of minds from the dead
+
+/obj/item/chrono_eraser/proc/pass_mind(datum/mind/M)
+ erased_minds += M
+
+/obj/item/chrono_eraser/dropped()
+ ..()
+ if(PA)
+ qdel(PA)
+
+/obj/item/chrono_eraser/Destroy()
+ dropped()
+ return ..()
+
+/obj/item/chrono_eraser/ui_action_click(mob/user)
+ if(iscarbon(user))
+ var/mob/living/carbon/C = user
+ if(C.back == src)
+ if(PA)
+ qdel(PA)
+ else
+ PA = new(src)
+ user.put_in_hands(PA)
+
+/obj/item/chrono_eraser/item_action_slot_check(slot, mob/user, datum/action/A)
+ if(slot == SLOT_BACK)
+ return 1
+
+/obj/item/gun/energy/chrono_gun
+ name = "T.E.D. Projection Apparatus"
+ desc = "It's as if they never existed in the first place."
+ icon = 'icons/obj/chronos.dmi'
+ icon_state = "chronogun"
+ item_state = "chronogun"
+ w_class = WEIGHT_CLASS_NORMAL
+ item_flags = DROPDEL
+ ammo_type = list(/obj/item/ammo_casing/energy/chrono_beam)
+ can_charge = FALSE
+ fire_delay = 50
+ var/obj/item/chrono_eraser/TED = null
+ var/obj/structure/chrono_field/field = null
+ var/turf/startpos = null
+
+/obj/item/gun/energy/chrono_gun/Initialize()
+ . = ..()
+ ADD_TRAIT(src, TRAIT_NODROP, CHRONO_GUN_TRAIT)
+ if(istype(loc, /obj/item/chrono_eraser))
+ TED = loc
+ else //admin must have spawned it
+ TED = new(src.loc)
+ return INITIALIZE_HINT_QDEL
+
+/obj/item/gun/energy/chrono_gun/ComponentInitialize()
+ . = ..()
+ AddElement(/datum/element/update_icon_blocker)
+
+/obj/item/gun/energy/chrono_gun/process_fire(atom/target, mob/living/user, message = TRUE, params = null, zone_override = "", bonus_spread = 0, stam_cost = 0)
+ if(field)
+ field_disconnect(field)
+ ..()
+
+/obj/item/gun/energy/chrono_gun/Destroy()
+ if(TED)
+ TED.PA = null
+ TED = null
+ if(field)
+ field_disconnect(field)
+ return ..()
+
+/obj/item/gun/energy/chrono_gun/proc/field_connect(obj/structure/chrono_field/F)
+ var/mob/living/user = loc
+ if(F.gun)
+ if(isliving(user) && F.captured)
+ to_chat(user, "FAIL: [F.captured] already has an existing connection.")
+ field_disconnect(F)
+ else
+ startpos = get_turf(src)
+ field = F
+ F.gun = src
+ if(isliving(user) && F.captured)
+ playsound(user,'sound/effects/clock_tick.ogg' , 50, 1)
+ to_chat(user, "Connection established with target: [F.captured]")
+
+
+/obj/item/gun/energy/chrono_gun/proc/field_disconnect(obj/structure/chrono_field/F)
+ if(F && field == F)
+ var/mob/living/user = loc
+ if(F.gun == src)
+ F.gun = null
+ if(isliving(user) && F.captured)
+ F.captured.adjustOrganLoss(ORGAN_SLOT_BRAIN, 199, 199) //not so fast!
+ to_chat(user, "Disconnected from target: [F.captured]")
+ field = null
+ startpos = null
+
+/obj/item/gun/energy/chrono_gun/proc/field_check(obj/structure/chrono_field/F)
+ if(F)
+ if(field == F)
+ var/turf/currentpos = get_turf(src)
+ var/mob/living/user = loc
+ if((currentpos == startpos) && (field in view(CHRONO_BEAM_RANGE, currentpos)) && (user.mobility_flags & MOBILITY_STAND) && (user.stat == CONSCIOUS))
+ return 1
+ field_disconnect(F)
+ return 0
+
+/obj/item/gun/energy/chrono_gun/proc/pass_mind(datum/mind/M)
+ if(TED)
+ TED.pass_mind(M)
+
+
+/obj/item/projectile/energy/chrono_beam
+ name = "eradication beam"
+ icon_state = "chronobolt"
+ range = CHRONO_BEAM_RANGE
+ nodamage = TRUE
+ var/obj/item/gun/energy/chrono_gun/gun = null
+
+/obj/item/projectile/energy/chrono_beam/Initialize()
+ . = ..()
+ var/obj/item/ammo_casing/energy/chrono_beam/C = loc
+ if(istype(C))
+ gun = C.gun
+
+/obj/item/projectile/energy/chrono_beam/on_hit(atom/target)
+ if(target && gun && isliving(target))
+ var/obj/structure/chrono_field/F = new(target.loc, target, gun)
+ gun.field_connect(F)
+
+
+/obj/item/ammo_casing/energy/chrono_beam
+ name = "eradication beam"
+ projectile_type = /obj/item/projectile/energy/chrono_beam
+ icon_state = "chronobolt"
+ e_cost = 0
+ var/obj/item/gun/energy/chrono_gun/gun
+
+/obj/item/ammo_casing/energy/chrono_beam/Initialize()
+ if(istype(loc))
+ gun = loc
+ . = ..()
+
+
+
+
+
+/obj/structure/chrono_field
+ name = "eradication field"
+ desc = "An aura of time-bluespace energy."
+ icon = 'icons/effects/effects.dmi'
+ icon_state = "chronofield"
+ density = FALSE
+ anchored = TRUE
+ resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF | FREEZE_PROOF
+ move_resist = INFINITY
+ interaction_flags_atom = NONE
+ var/mob/living/captured = null
+ var/obj/item/gun/energy/chrono_gun/gun = null
+ var/tickstokill = 4 //Just enough time for people to witness the monstrosity
+ var/mutable_appearance/mob_underlay
+ var/preloaded = 0
+ var/RPpos = null
+ var/attached = TRUE //if the gun arg isn't included initially, then the chronofield will work without one
+
+/obj/structure/chrono_field/Initialize(mapload, mob/living/target, obj/item/gun/energy/chrono_gun/G)
+ if(target && isliving(target))
+ if(!G)
+ attached = FALSE
+ target.forceMove(src)
+ captured = target
+ var/icon/mob_snapshot = getFlatIcon(target)
+ var/icon/cached_icon = new()
+
+ for(var/i=1, i<=CHRONO_FRAME_COUNT, i++)
+ var/icon/removing_frame = icon('icons/obj/chronos.dmi', "erasing", SOUTH, i)
+ var/icon/mob_icon = icon(mob_snapshot)
+ mob_icon.Blend(removing_frame, ICON_MULTIPLY)
+ cached_icon.Insert(mob_icon, "frame[i]")
+
+ mob_underlay = mutable_appearance(cached_icon, "frame1")
+ update_icon()
+
+ desc = initial(desc) + "
It appears to contain [target.name]."
+ START_PROCESSING(SSobj, src)
+ return ..()
+
+/obj/structure/chrono_field/Destroy()
+ if(gun && gun.field_check(src))
+ gun.field_disconnect(src)
+ return ..()
+
+/obj/structure/chrono_field/update_icon()
+ var/ttk_frame = 1 - (tickstokill / initial(tickstokill))
+ ttk_frame = clamp(CEILING(ttk_frame * CHRONO_FRAME_COUNT, 1), 1, CHRONO_FRAME_COUNT)
+ if(ttk_frame != RPpos)
+ RPpos = ttk_frame
+ mob_underlay.icon_state = "frame[RPpos]"
+ underlays = list() //hack: BYOND refuses to update the underlay to match the icon_state otherwise
+ underlays += mob_underlay
+
+/obj/structure/chrono_field/process()
+ if(captured)
+ if(tickstokill > initial(tickstokill))
+ for(var/atom/movable/AM in contents)
+ AM.forceMove(drop_location())
+ qdel(src)
+ else if(tickstokill <= 0)
+ to_chat(captured, "As the last essence of your being is erased from time, you are taken back to your most enjoyable memory. You feel happy...")
+ playsound(captured,'sound/effects/lingreadapt.ogg' , 50, 1)
+ captured.visible_message("[captured] dematerialises out of the timestream!")
+ var/mob/dead/observer/ghost = captured.ghostize(1)
+ if(captured.mind)
+ if(ghost)
+ ghost.mind = null
+ if(gun)
+ gun.pass_mind(captured.mind)
+ qdel(captured)
+ qdel(src)
+ else
+ captured.Unconscious(80)
+ if(captured.loc != src)
+ captured.forceMove(src)
+ update_icon()
+ if(gun)
+ if(gun.field_check(src))
+ tickstokill--
+ else
+ gun = null
+ return .()
+ else if(!attached)
+ tickstokill--
+ else
+ tickstokill++
+ else
+ qdel(src)
+
+/obj/structure/chrono_field/bullet_act(obj/item/projectile/P)
+ if(istype(P, /obj/item/projectile/energy/chrono_beam))
+ var/obj/item/projectile/energy/chrono_beam/beam = P
+ var/obj/item/gun/energy/chrono_gun/Pgun = beam.gun
+ if(Pgun && istype(Pgun))
+ Pgun.field_connect(src)
+ else
+ return BULLET_ACT_HIT
+
+/obj/structure/chrono_field/assume_air()
+ return 0
+
+/obj/structure/chrono_field/return_air() //we always have nominal air and temperature
+ var/datum/gas_mixture/GM = new
+ GM.set_moles(/datum/gas/oxygen, MOLES_O2STANDARD)
+ GM.set_moles(/datum/gas/nitrogen, MOLES_N2STANDARD)
+ GM.set_temperature(T20C)
+ return GM
+
+/obj/structure/chrono_field/singularity_act()
+ return
+
+/obj/structure/chrono_field/singularity_pull()
+ return
+
+/obj/structure/chrono_field/ex_act()
+ return
+
+/obj/structure/chrono_field/blob_act(obj/structure/blob/B)
+ return
+
+
+#undef CHRONO_BEAM_RANGE
+#undef CHRONO_FRAME_COUNT
diff --git a/sandcode/code/modules/clothing/outfits/standard.dm b/sandcode/code/modules/clothing/outfits/standard.dm
index 4a01943f87..9e7b25fb7f 100644
--- a/sandcode/code/modules/clothing/outfits/standard.dm
+++ b/sandcode/code/modules/clothing/outfits/standard.dm
@@ -78,3 +78,27 @@
/obj/item/gun/energy/pulse=1,\
/obj/item/gun/energy/taser/debug,\
)
+
+/datum/outfit/chrono_agent
+ name = "Timeline Eradication Agent"
+ uniform = /obj/item/clothing/under/rank/rnd/scientist
+ suit = /obj/item/clothing/suit/space/chronos
+ back = /obj/item/chrono_eraser
+ head = /obj/item/clothing/head/helmet/space/chronos
+ mask = /obj/item/clothing/mask/breath
+ belt = /obj/item/storage/belt/military/abductor/full
+ gloves = /obj/item/clothing/gloves/tackler/combat/insulated
+ glasses = /obj/item/clothing/glasses/night
+ shoes = /obj/item/clothing/shoes/combat
+ id = /obj/item/card/id
+ suit_store = /obj/item/tank/internals/oxygen
+ ears = /obj/item/radio/headset/headset_cent/alt
+
+/datum/outfit/chrono_agent/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source)
+ var/obj/item/card/id/W = H.wear_id
+ W.icon_state = "centcom"
+ W.access = get_all_accesses()//They get full station access.
+ W.access += get_centcom_access("TED Agent")//Let's add their alloted CentCom access.
+ W.assignment = "Timeline Eradication Agent"
+ W.registered_name = H.real_name
+ W.update_label(W.registered_name, W.assignment)
diff --git a/sandcode/code/modules/clothing/spacesuits/chronosuit.dm b/sandcode/code/modules/clothing/spacesuits/chronosuit.dm
new file mode 100644
index 0000000000..81aa30554f
--- /dev/null
+++ b/sandcode/code/modules/clothing/spacesuits/chronosuit.dm
@@ -0,0 +1,324 @@
+/obj/item/clothing/head/helmet/space/chronos //Gandalf was here!
+ name = "Chronosuit Helmet"
+ desc = "A white helmet with an opaque blue visor."
+ mob_overlay_icon = 'sandcode/icons/mob/clothing/head.dmi'
+ anthro_mob_worn_overlay = 'sandcode/icons/mob/clothing/head_muzzled.dmi'
+ icon_state = "chronohelmet"
+ item_state = "chronohelmet"
+ slowdown = 0
+ armor = list("melee" = 60, "bullet" = 60, "laser" = 60, "energy" = 60, "bomb" = 30, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 100)
+ resistance_flags = FIRE_PROOF | ACID_PROOF
+ var/obj/item/clothing/suit/space/chronos/suit = null
+
+/obj/item/clothing/head/helmet/space/chronos/dropped(mob/user)
+ if(suit)
+ suit.deactivate(1, 1)
+ ..()
+
+/obj/item/clothing/suit/space/chronos
+ name = "Chronosuit"
+ desc = "An advanced spacesuit equipped with time-bluespace teleportation and anti-compression technology."
+ mob_overlay_icon = 'sandcode/icons/mob/clothing/suit.dmi'
+ anthro_mob_worn_overlay = 'sandcode/icons/mob/clothing/suit_digi.dmi'
+ icon_state = "chronosuit"
+ item_state = "chronosuit"
+ actions_types = list(/datum/action/item_action/toggle)
+ armor = list("melee" = 60, "bullet" = 60, "laser" = 60, "energy" = 60, "bomb" = 30, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 1000)
+ resistance_flags = FIRE_PROOF | ACID_PROOF
+ mutantrace_variation = STYLE_DIGITIGRADE
+ slowdown = 0
+ var/list/chronosafe_items = list(/obj/item/chrono_eraser, /obj/item/gun/energy/chrono_gun)
+ var/obj/item/clothing/head/helmet/space/chronos/helmet = null
+ var/obj/effect/chronos_cam/camera = null
+ var/datum/action/innate/chrono_teleport/teleport_now = new
+ var/activating = 0
+ var/activated = 0
+ var/cooldowntime = 50 //deciseconds
+ var/teleporting = 0
+ var/phase_timer_id
+
+/obj/item/clothing/suit/space/chronos/New()
+ ..()
+ teleport_now.chronosuit = src
+ teleport_now.target = src
+
+/obj/item/clothing/suit/space/chronos/proc/new_camera(mob/user)
+ if(camera)
+ qdel(camera)
+ camera = new /obj/effect/chronos_cam(user)
+ camera.holder = user
+ camera.chronosuit = src
+ user.remote_control = camera
+
+/obj/item/clothing/suit/space/chronos/ui_action_click()
+ if((cooldown <= world.time) && !teleporting && !activating)
+ if(!activated)
+ activate()
+ else
+ deactivate()
+
+/obj/item/clothing/suit/space/chronos/dropped(mob/user)
+ if(activated)
+ deactivate()
+ ..()
+
+/obj/item/clothing/suit/space/chronos/emp_act(severity)
+ . = ..()
+ if(. & EMP_PROTECT_SELF)
+ return
+ var/mob/living/carbon/human/user = src.loc
+ switch(severity)
+ if(1)
+ if(activated && user && ishuman(user) && (user.wear_suit == src))
+ to_chat(user, "E:FATAL:RAM_READ_FAIL\nE:FATAL:STACK_EMPTY\nE:FATAL:READ_NULL_POINT\nE:FATAL:PWR_BUS_OVERLOAD")
+ to_chat(user, "An electromagnetic pulse disrupts your [name] and violently tears you out of time-bluespace!")
+ user.emote("scream")
+ deactivate(1, 1)
+
+/obj/item/clothing/suit/space/chronos/proc/finish_chronowalk(mob/living/carbon/human/user, turf/to_turf)
+ if(!user)
+ user = src.loc
+ if(phase_timer_id)
+ deltimer(phase_timer_id)
+ phase_timer_id = 0
+ if(istype(user))
+ if(to_turf)
+ user.forceMove(to_turf)
+ user.SetStun(0)
+ user.next_move = 1
+ user.alpha = 255
+ user.update_atom_colour()
+ user.animate_movement = FORWARD_STEPS
+ user.mob_transforming = 0
+ user.anchored = FALSE
+ teleporting = 0
+ for(var/obj/item/I in user.held_items)
+ REMOVE_TRAIT(I, TRAIT_NODROP, CHRONOSUIT_TRAIT)
+ if(camera)
+ camera.remove_target_ui()
+ camera.forceMove(user)
+ teleport_now.UpdateButtonIcon()
+
+/obj/item/clothing/suit/space/chronos/proc/chronowalk(atom/location)
+ var/mob/living/carbon/human/user = src.loc
+ if(activated && !teleporting && user && istype(user) && location && user.loc && location.loc && user.wear_suit == src && user.stat == CONSCIOUS)
+ teleporting = 1
+ var/turf/from_turf = get_turf(user)
+ var/turf/to_turf = get_turf(location)
+ var/distance = cheap_hypotenuse(from_turf.x, from_turf.y, to_turf.x, to_turf.y)
+ var/phase_in_ds = distance*2
+
+ if(camera)
+ camera.remove_target_ui()
+
+ teleport_now.UpdateButtonIcon()
+
+ user.ExtinguishMob()
+
+ for(var/obj/item/I in user.held_items)
+ ADD_TRAIT(I, TRAIT_NODROP, CHRONOSUIT_TRAIT)
+ user.animate_movement = NO_STEPS
+ user.changeNext_move(8 + phase_in_ds)
+ user.mob_transforming = 1
+ user.anchored = TRUE
+ user.Stun(INFINITY)
+
+ animate(user, color = "#00ccee", time = 3)
+ phase_timer_id = addtimer(CALLBACK(src, .proc/phase_2, user, to_turf, phase_in_ds), 3, TIMER_STOPPABLE)
+
+/obj/item/clothing/suit/space/chronos/proc/phase_2(mob/living/carbon/human/user, turf/to_turf, phase_in_ds)
+ if(teleporting && activated && user)
+ animate(user, alpha = 0, time = 2)
+ phase_timer_id = addtimer(CALLBACK(src, .proc/phase_3, user, to_turf, phase_in_ds), 2, TIMER_STOPPABLE)
+ else
+ finish_chronowalk(user, to_turf)
+
+/obj/item/clothing/suit/space/chronos/proc/phase_3(mob/living/carbon/human/user, turf/to_turf, phase_in_ds)
+ if(teleporting && activated && user)
+ user.forceMove(to_turf)
+ animate(user, alpha = 255, time = phase_in_ds)
+ phase_timer_id = addtimer(CALLBACK(src, .proc/phase_4, user, to_turf), phase_in_ds, TIMER_STOPPABLE)
+ else
+ finish_chronowalk(user, to_turf)
+
+/obj/item/clothing/suit/space/chronos/proc/phase_4(mob/living/carbon/human/user, turf/to_turf)
+ if(teleporting && activated && user)
+ animate(user, color = "#ffffff", time = 3)
+ phase_timer_id = addtimer(CALLBACK(src, .proc/finish_chronowalk, user, to_turf), 3, TIMER_STOPPABLE)
+ else
+ finish_chronowalk(user, to_turf)
+
+/obj/item/clothing/suit/space/chronos/process()
+ if(activated)
+ var/mob/living/carbon/human/user = src.loc
+ if(user && ishuman(user) && (user.wear_suit == src))
+ if(camera && (user.remote_control == camera))
+ if(!teleporting)
+ if(camera.loc != user && ((camera.x != user.x) || (camera.y != user.y) || (camera.z != user.z)))
+ if(camera.phase_time <= world.time)
+ chronowalk(camera)
+ else
+ camera.remove_target_ui()
+ else
+ new_camera(user)
+ else
+ STOP_PROCESSING(SSobj, src)
+
+/obj/item/clothing/suit/space/chronos/proc/activate()
+ if(!activating && !activated && !teleporting)
+ activating = 1
+ var/mob/living/carbon/human/user = src.loc
+ if(user && ishuman(user) && user.wear_suit == src)
+ to_chat(user, "\nChronosuitMK4 login: root")
+ to_chat(user, "Password:\n")
+ to_chat(user, "root@ChronosuitMK4# chronowalk4 --start\n")
+ if(user.head && istype(user.head, /obj/item/clothing/head/helmet/space/chronos))
+ to_chat(user, "\[ ok \] Mounting /dev/helm")
+ helmet = user.head
+ ADD_TRAIT(helmet, TRAIT_NODROP, CHRONOSUIT_TRAIT)
+ helmet.suit = src
+ ADD_TRAIT(src, TRAIT_NODROP, CHRONOSUIT_TRAIT)
+ to_chat(user, "\[ ok \] Starting brainwave scanner")
+ to_chat(user, "\[ ok \] Starting ui display driver")
+ to_chat(user, "\[ ok \] Initializing chronowalk4-view")
+ new_camera(user)
+ START_PROCESSING(SSobj, src)
+ activated = 1
+ else
+ to_chat(user, "\[ fail \] Mounting /dev/helm")
+ to_chat(user, "FATAL: Unable to locate /dev/helm. Aborting...")
+ teleport_now.Grant(user)
+ cooldown = world.time + cooldowntime
+ activating = 0
+
+/obj/item/clothing/suit/space/chronos/proc/deactivate(force = 0, silent = FALSE)
+ if(activated && (!teleporting || force))
+ activating = 1
+ var/mob/living/carbon/human/user = src.loc
+ var/hard_landing = teleporting && force
+ REMOVE_TRAIT(src, TRAIT_NODROP, CHRONOSUIT_TRAIT)
+ cooldown = world.time + cooldowntime * 1.5
+ activated = 0
+ activating = 0
+ finish_chronowalk()
+ if(user && ishuman(user))
+ teleport_now.Remove(user)
+ if(user.wear_suit == src)
+ if(hard_landing)
+ user.electrocute_act(35, src, flags = SHOCK_NOGLOVES)
+ user.DefaultCombatKnockdown(200)
+ if(!silent)
+ to_chat(user, "\nroot@ChronosuitMK4# chronowalk4 --stop\n")
+ if(camera)
+ to_chat(user, "\[ ok \] Sending TERM signal to chronowalk4-view")
+ if(helmet)
+ to_chat(user, "\[ ok \] Stopping ui display driver")
+ to_chat(user, "\[ ok \] Stopping brainwave scanner")
+ to_chat(user, "\[ ok \] Unmounting /dev/helmet")
+ to_chat(user, "logout")
+ if(helmet)
+ REMOVE_TRAIT(helmet, TRAIT_NODROP, CHRONOSUIT_TRAIT)
+ helmet.suit = null
+ helmet = null
+ if(camera)
+ qdel(camera)
+
+/obj/effect/chronos_cam
+ name = "Chronosuit View"
+ density = FALSE
+ anchored = TRUE
+ invisibility = INVISIBILITY_ABSTRACT
+ opacity = 0
+ mouse_opacity = MOUSE_OPACITY_TRANSPARENT
+ var/mob/holder = null
+ var/phase_time = 0
+ var/phase_time_length = 3
+ var/obj/screen/chronos_target/target_ui = null
+ var/obj/item/clothing/suit/space/chronos/chronosuit
+
+/obj/effect/chronos_cam/singularity_act()
+ return
+
+/obj/effect/chronos_cam/singularity_pull()
+ return
+
+/obj/effect/chronos_cam/proc/create_target_ui()
+ if(holder && holder.client && chronosuit)
+ if(target_ui)
+ remove_target_ui()
+ target_ui = new(null, holder)
+ holder.client.screen += target_ui
+
+/obj/effect/chronos_cam/proc/remove_target_ui()
+ if(target_ui)
+ qdel(target_ui)
+ target_ui = null
+
+/obj/effect/chronos_cam/relaymove(var/mob/user, direction)
+ if(!holder)
+ qdel(src)
+ return
+ if(user == holder)
+ if(loc == user)
+ forceMove(get_turf(user))
+ if(user.client && user.client.eye != src)
+ src.forceMove(user.drop_location())
+ user.reset_perspective(src)
+ user.set_machine(src)
+ var/atom/step = get_step(src, direction)
+ if(step)
+ if((step.x <= TRANSITIONEDGE) || (step.x >= (world.maxx - TRANSITIONEDGE - 1)) || (step.y <= TRANSITIONEDGE) || (step.y >= (world.maxy - TRANSITIONEDGE - 1)))
+ if(!src.Move(step))
+ src.forceMove(step)
+ else
+ src.forceMove(step)
+ if((x == holder.x) && (y == holder.y) && (z == holder.z))
+ remove_target_ui()
+ forceMove(user)
+ else if(!target_ui)
+ create_target_ui()
+ phase_time = world.time + phase_time_length
+
+/obj/effect/chronos_cam/check_eye(mob/user)
+ if(user != holder)
+ user.unset_machine()
+
+/obj/effect/chronos_cam/on_unset_machine(mob/user)
+ user.reset_perspective(null)
+
+/obj/effect/chronos_cam/Destroy()
+ if(holder)
+ if(holder.remote_control == src)
+ holder.remote_control = null
+ if(holder.client && (holder.client.eye == src))
+ holder.unset_machine()
+ return ..()
+
+/obj/screen/chronos_target
+ name = "target display"
+ screen_loc = "CENTER,CENTER"
+ color = "#ff3311"
+ blend_mode = BLEND_SUBTRACT
+
+/obj/screen/chronos_target/New(loc, var/mob/living/carbon/human/user)
+ if(user)
+ var/icon/user_icon = getFlatIcon(user)
+ icon = user_icon
+ transform = user.transform
+ else
+ qdel(src)
+
+/datum/action/innate/chrono_teleport
+ name = "Teleport Now"
+ icon_icon = 'icons/mob/actions/actions_minor_antag.dmi'
+ button_icon_state = "chrono_phase"
+ check_flags = AB_CHECK_CONSCIOUS //|AB_CHECK_INSIDE
+ var/obj/item/clothing/suit/space/chronos/chronosuit = null
+
+/datum/action/innate/chrono_teleport/IsAvailable(silent = FALSE)
+ return (chronosuit && chronosuit.activated && chronosuit.camera && !chronosuit.teleporting)
+
+/datum/action/innate/chrono_teleport/Activate()
+ if(IsAvailable())
+ if(chronosuit.camera)
+ chronosuit.chronowalk(chronosuit.camera)
diff --git a/sandcode/icons/mob/clothing/head.dmi b/sandcode/icons/mob/clothing/head.dmi
index 9620b406bf83c1a7919b9a471056dab8d3aefd3f..75e48a94075f29a525c8657f9fe477040dec64ae 100644
GIT binary patch
literal 4004
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
Khu8h+nfz~
diff --git a/sandcode/icons/mob/clothing/suit.dmi b/sandcode/icons/mob/clothing/suit.dmi
index ef8c670a5916ec2b7598bb9484f9ef7b2ee26c4d..0dd5e31ef182fb2ea49eeae9441e83b74f072dc7 100644
GIT binary patch
delta 2993
zcmV;i3r_Ua4AU4TiBL{Q4GJ0x0000DNk~Le0002M0001>2m=5B0B!b@ZvX%Qz>y_P
zev5fLOLBsMlSOiWA-4GknCBT`aQeSLiz
z#^^==-GhOFaBXc|TwFWZyqS-$=>Px#4gqvhPE!Ct=GbNc005hjhIxNXP*-wBQGQ-N
zNFR2k#z4{3oWx3yE*&7`QdV&Fa{&h+0FHEH1;F%$>i_@>nn^@KRCt{2Ta91hI1|oU
z0sDdAif%(`OD!w1xYpB^-E;5b|NpPvNz!r(Gt(ZCm3yy`KT6@5%w&=@O`o6;En2i_
z(W1rw1%5elj`hj0bM$}94*W|CJOW?bHooI@I@;n`oj3&F?RE+Ng@=xVW&j0g_YLE7
z4tggY*K-`lb2}$J#DV60-zWGN9^i;200n9H0=`5asski&N)~qn)DPlA4YB%ZzKoCY&R`e>uIqm~@Ct(AVADkL#}NAj
zDtV0X0ArzCPzh-7x;RojKpB7id4mV<%E&uLcxau04{hH$gMK>o2V0G(c*ld@Kk0Z5
z!dEunA|UDy27wxdXkmSQsL^4@2@)S(o-%^?81J}47~Y=u0bag8bT=*&&7XT7^nmA`
zZ}V##D2`qr#-e|xykmu-tV+Q1^b4AKJHF;TXAVKJXZN9Sc
zsX5kIDAvacH;NC94+*Ls*mmKl%YOtN(}T_$nU7m7aPEI~&OV%VAc5@`sC)?Jf=r-i
zEU+P@zEcB34;DPWD6fGR-@HuG6(f~B3u}X|Q$31f$Z$#A3RZcqOEUM?xj`Hnd
z6nt667essk@gWF$lMyQ85wsqRPiJI4ZYMAp!b~_EPzjhG=$-Vb1p0dPBOOo%+&Ew%
zs3}^Loxy*w+wTtXIZ}^9X9$1T_}3VA;nnH(=>+=S&QOT%knmrgF!5pJ(D8v8z*=WO
z89?^k?y%dXTfvmxzDun!Fd@kJrv7yNSMP{{>wPcz*Ms_@@2E{OVz
z@+Qp0-#ppCW$*IxLR?(JJI=el54`WYI1lhIT&I6WkqSM>z3>U{Qd}y>aG>IsCsh2)
z-pR+0;^W5?Dgl`0VHSXSoKC=TPWS{)9EVO|`)nh=(0^2XcLWgXfJ}3M&YJI_JYb|v
z7;pwIa`q}da`xH*+^4&utM1mg1Gq#Wf4E4<1QdrCu3{)B6lcnE@l6kq@%tw*h3ms^
zys>|vS!KW$w?x11I8Z@2;34XGWui!?f_>wI0(%du<>6+2q}L)x_>J6gk4pZCoGMLW
zZZW50>?gijK*35FUg*8Pme)3#WD+nwNK)uOIzGp@XwjlYix&TO*y;Q44?BIo8OR6X
zx4>GVuhaKYc^)3N)~D!GndW`pr}$SMSdf1YeOiGRyuL38d0qqpmdU3=zxo2%Ul4yU
zqcOg+IOQvUN*32>rthPq+Fz(@f^7f*uVU-R8H}$i8UQaYjIyLg2)!IO>OI~=1HWp#
zQy;CL89aI*QPPpNVbTb=!bVnA@;sA(R`0RR0U?HdB{%p!CcO>)^RfrdQQp|VfsubT
z6h#)Uc6l5w0SDgzQWsz#)(NQn1B5>>&(9IQv{5d&M^fb-FDxpJzEGQRksFoxxc_z32`Rg5O^d^!`FsL$-=MEA;*X!)tk-qg82cf5C*{
zs!*@*b9BvOt=wN=3@%vj8sz?h0bhTW0nNbxy?{UZPE_tM&>noQbQOY~YU>xujKz9?
zfv%w7r+S}RYL+1y-79v)djDWY-g19Iqlv!H@m;}=&~EwS_*(4mk?0Wi7i@p70TsHh
z))M6Y0?!L!NPd5TUF=!u`v(CdzVrG%x7g?lzJcm^o@{K=qD6}qEn2krFCvs*Q^<$G)vZ4bT|arVSbV;bSPjE8i=%7;*T^J`;*1_d@6`igI)_nm^ZEMv
z2FAyHtAdeCL|7&eie&ehXkQ7=;~XZ?`0DB^hRHOK=O~|NGRslEDb9aB>?wm~aJz(g
zW-jM2$1HDyG4|C1%Ul0TDDPm3yp!P<{}xH$Hk|5dbQ<1TB(N_m
zZ*P}T5>DkbOd|CG<5PVNq!|DHST5lrF7Bec0xsg^cKsBe=pmG#{2>7DW%uDdb{8`U
zv*~0qnP!K0AJzzqbb5a`O$&N4SKR-4UmWaWPDEKc71K1MDhR73;PI8xK_L1h@5R0R
zL?!?|AP%_)!bB&KP(uioOTc3br31mk!^5L^gyW9v353nS8pv^v}n_WU__Lbnb!B8ch>jq
z;v0cjY4BspV64P>R67>xiS@aGzW>bV`(au%iC>V9WYJ8{q@2v-1yPR^PXYZ-Pi@fpI>MZ*cx5p66p|0c@Hn
z_5B~TzMs9&_i^>jCcZ`-PP
zYkfc4Ro~a&XMFsOh_4aK<+4ZsuBrTRp^di#w{^BmWTkNdwoA?D6zaZmlM0&H9
zyOl@kK1_d4!`GPwoyFgMx{#LQG{rE|nDG
zLQcu}rM~}6-|3&H;+fO;A%4ck&zShyL46M}2|R0goZg^-9^mzTh);^^CVs-i7y4cp
z^A2MAJ_y;F1ZaIqCZECOY
z+r`%oR;!2KY5wic$xvO0Z#wr_pk4&h8EFyr-oY@xKau+{hNZ~*$g9S%U>
nx56Rl`!+ZTecuNEQhon_?bL{h{N&);00000NkvXXu0mjf4|ddF
delta 1447
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
Ttc~B400000NkvXXu0mjfQ2P9%
diff --git a/tgstation.dme b/tgstation.dme
index d3079a2f39..93b2ce0611 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -966,7 +966,6 @@
#include "code\game\objects\items\chainsaw.dm"
#include "code\game\objects\items\charter.dm"
#include "code\game\objects\items\chromosome.dm"
-#include "code\game\objects\items\chrono_eraser.dm"
#include "code\game\objects\items\cigs_lighters.dm"
#include "code\game\objects\items\clown_items.dm"
#include "code\game\objects\items\control_wand.dm"
@@ -1860,7 +1859,6 @@
#include "code\modules\clothing\shoes\miscellaneous.dm"
#include "code\modules\clothing\shoes\taeclowndo.dm"
#include "code\modules\clothing\spacesuits\_spacesuits.dm"
-#include "code\modules\clothing\spacesuits\chronosuit.dm"
#include "code\modules\clothing\spacesuits\hardsuit.dm"
#include "code\modules\clothing\spacesuits\miscellaneous.dm"
#include "code\modules\clothing\spacesuits\plasmamen.dm"
@@ -3518,6 +3516,7 @@
#include "sandcode\code\game\objects\items\airlock_painter.dm"
#include "sandcode\code\game\objects\items\BSRPD.dm"
#include "sandcode\code\game\objects\items\cards_ids.dm"
+#include "sandcode\code\game\objects\items\chrono_eraser.dm"
#include "sandcode\code\game\objects\items\computermath.dm"
#include "sandcode\code\game\objects\items\circuitboards\computer_circuitboards.dm"
#include "sandcode\code\game\objects\items\circuitboards\machine_circuitboards.dm"
@@ -3541,6 +3540,7 @@
#include "sandcode\code\modules\clothing\refactor.dm"
#include "sandcode\code\modules\clothing\masks\miscellaneous.dm"
#include "sandcode\code\modules\clothing\outfits\standard.dm"
+#include "sandcode\code\modules\clothing\spacesuits\chronosuit.dm"
#include "sandcode\code\modules\clothing\spacesuits\hardsuit.dm"
#include "sandcode\code\modules\crafting\recipes\recipes_misc.dm"
#include "sandcode\code\modules\hydroponics\grown\misc.dm"