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