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 9620b406bf..75e48a9407 100644 Binary files a/sandcode/icons/mob/clothing/head.dmi and b/sandcode/icons/mob/clothing/head.dmi differ diff --git a/sandcode/icons/mob/clothing/head_muzzled.dmi b/sandcode/icons/mob/clothing/head_muzzled.dmi index b80a598977..7052a8c342 100644 Binary files a/sandcode/icons/mob/clothing/head_muzzled.dmi and b/sandcode/icons/mob/clothing/head_muzzled.dmi differ diff --git a/sandcode/icons/mob/clothing/suit.dmi b/sandcode/icons/mob/clothing/suit.dmi index ef8c670a59..0dd5e31ef1 100644 Binary files a/sandcode/icons/mob/clothing/suit.dmi and b/sandcode/icons/mob/clothing/suit.dmi differ diff --git a/sandcode/icons/mob/clothing/suit_digi.dmi b/sandcode/icons/mob/clothing/suit_digi.dmi index ae6ed70f7e..8e9f2fb065 100644 Binary files a/sandcode/icons/mob/clothing/suit_digi.dmi and b/sandcode/icons/mob/clothing/suit_digi.dmi differ 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"