From 09c125ff4dc693e8c8fb852c349406ea0fc3c564 Mon Sep 17 00:00:00 2001
From: Qwertytoforty <52090703+Qwertytoforty@users.noreply.github.com>
Date: Wed, 16 Dec 2020 15:03:23 -0500
Subject: [PATCH] Adds the handheld syndicate teleporter (#14934)
* Start of this coding adventure
* Makes it work BETTER
* MORE BETTER. LESS GIBBING IN SPACE
* BOH interactions
* PR ready-ish
* Better checks, doesnt work in mechs
* Re-adds the windowpainter
* Boxes it, mashes it, sticks it in a microwave
* Revert "fixes merge conflicts pls?"
This reverts commit 1dc5e390be84ef8dbc385d0dc1d7711723818e68, reversing
changes made to 3ec24935bd0132a75825b08b8b61ba12972ae1d2.
* Revert "Revert "fixes merge conflicts pls?""
This reverts commit 53106e10f5d44b3cde3b216708e791558bfcc095.
* RE ADDS EVERYTHING
* Thanks henk for helping
* Affecteds code review suggestions
Co-authored-by: AffectedArc07 <25063394+AffectedArc07@users.noreply.github.com>
* Deletes it before re-adding it
* Now adds it in
* Affecteds other request
* Update code/game/objects/items/devices/traitordevices.dm
Co-authored-by: AffectedArc07 <25063394+AffectedArc07@users.noreply.github.com>
* Changes size, type casting, class, \n
Co-authored-by: AffectedArc07 <25063394+AffectedArc07@users.noreply.github.com>
---
code/datums/uplink_item.dm | 10 +
.../objects/items/devices/traitordevices.dm | 200 ++++++++++++++++++
icons/obj/device.dmi | Bin 49113 -> 49694 bytes
3 files changed, 210 insertions(+)
diff --git a/code/datums/uplink_item.dm b/code/datums/uplink_item.dm
index 24c3a2a2903..be81a2e3bb8 100644
--- a/code/datums/uplink_item.dm
+++ b/code/datums/uplink_item.dm
@@ -1294,6 +1294,16 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
item = /obj/item/storage/box/syndie_kit/bonerepair
cost = 4
+/datum/uplink_item/device_tools/syndicate_teleporter
+ name = "Experimental Syndicate Teleporter"
+ desc = "The Syndicate teleporter is a handheld device that teleports the user 4-8 meters forward. \
+ Beware, teleporting into a wall will make the teleporter do a parallel emergency teleport, \
+ but if that emergency teleport fails, it will kill you. \
+ Has 4 charges, recharges, warrenty voided if exposed to EMP."
+ reference = "TELE"
+ item = /obj/item/storage/box/syndie_kit/teleporter
+ cost = 8
+
/datum/uplink_item/device_tools/thermal_drill
name = "Thermal Safe Drill"
desc = "A tungsten carbide thermal drill with magnetic clamps for the purpose of drilling hardened objects. Guaranteed 100% jam proof."
diff --git a/code/game/objects/items/devices/traitordevices.dm b/code/game/objects/items/devices/traitordevices.dm
index 1ffa9cceb88..2336be40cfb 100644
--- a/code/game/objects/items/devices/traitordevices.dm
+++ b/code/game/objects/items/devices/traitordevices.dm
@@ -168,3 +168,203 @@ effective or pretty fucking useless.
GLOB.active_jammers |= src
else
GLOB.active_jammers -= src
+
+/obj/item/teleporter
+ name = "Syndicate teleporter"
+ desc = "A strange syndicate version of a cult veil shifter. Warrenty voided if exposed to EMP."
+ icon = 'icons/obj/device.dmi'
+ icon_state = "syndi-tele"
+ throwforce = 5
+ w_class = WEIGHT_CLASS_SMALL
+ throw_speed = 4
+ throw_range = 10
+ flags = CONDUCT
+ item_state = "electronic"
+ origin_tech = "magnets=3;combat=3;syndicate=3"
+ var/tp_range = 8
+ var/inner_tp_range = 3
+ var/charges = 4
+ var/max_charges = 4
+ var/saving_throw_distance = 3
+ var/flawless = FALSE
+
+/obj/item/teleporter/Initialize(mapload, ...)
+ . = ..()
+ START_PROCESSING(SSobj, src)
+
+/obj/item/teleporter/Destroy()
+ STOP_PROCESSING(SSobj, src)
+ return ..()
+
+/obj/item/teleporter/examine(mob/user)
+ . = ..()
+ . += "[src] has [charges] out of [max_charges] charges left."
+
+/obj/item/teleporter/attack_self(mob/user)
+ attempt_teleport(user, FALSE)
+
+/obj/item/teleporter/process()
+ if(prob(10) && charges < max_charges)
+ charges++
+
+/obj/item/teleporter/emp_act(severity)
+ if(prob(50 / severity))
+ if(istype(loc, /mob/living/carbon/human))
+ var/mob/living/carbon/human/user = loc
+ to_chat(user, "The [src] buzzes and activates!")
+ attempt_teleport(user, TRUE)
+ else
+ visible_message(" The [src] activates and blinks out of existence!")
+ do_sparks(2, 1, src)
+ qdel(src)
+
+/obj/item/teleporter/proc/attempt_teleport(mob/user, EMP_D = FALSE)
+ if(!charges)
+ to_chat(user, "The [src] is recharging still.")
+ return
+
+ var/mob/living/carbon/C = user
+ var/turf/mobloc = get_turf(C)
+ var/list/turfs = new/list()
+ var/found_turf = FALSE
+ var/list/bagholding = user.search_contents_for(/obj/item/storage/backpack/holding)
+ for(var/turf/T in range(user, tp_range))
+ if(!is_teleport_allowed(T.z))
+ break
+ if(!(length(bagholding) && !flawless)) //Chaos if you have a bag of holding
+ if(get_dir(C, T) != C.dir)
+ continue
+ if(T in range(user, inner_tp_range))
+ continue
+ if(T.x > world.maxx-tp_range || T.x < tp_range)
+ continue //putting them at the edge is dumb
+ if(T.y > world.maxy-tp_range || T.y < tp_range)
+ continue
+
+ turfs += T
+ found_turf = TRUE
+
+ if(found_turf)
+ if(user.loc != mobloc) // No locker / mech / sleeper teleporting, that breaks stuff
+ to_chat(C, "The [src] will not work here!")
+ charges--
+ var/turf/destination = pick(turfs)
+ if(tile_check(destination) || flawless) // Why is there so many bloody floor types
+ var/turf/fragging_location = destination
+ telefrag(fragging_location, user)
+ C.forceMove(destination)
+ playsound(mobloc, "sparks", 50, TRUE)
+ new/obj/effect/temp_visual/teleport_abductor/syndi_teleporter(mobloc)
+ playsound(destination, "sparks", 50, TRUE)
+ new/obj/effect/temp_visual/teleport_abductor/syndi_teleporter(destination)
+ else if (EMP_D == FALSE && !(bagholding.len && !flawless)) // This is where the fun begins
+ var/direction = get_dir(user, destination)
+ panic_teleport(user, destination, direction)
+ else // Emp activated? Bag of holding? No saving throw for you
+ get_fragged(user, destination)
+ else
+ to_chat(C, "The [src] will not work here!")
+
+/obj/item/teleporter/proc/tile_check(turf/T)
+ if(istype(T, /turf/simulated/floor) || istype(T, /turf/space) || istype(T, /turf/simulated/shuttle/floor) || istype(T, /turf/simulated/shuttle/floor4) || istype(T, /turf/simulated/shuttle/plating))
+ return TRUE
+
+/obj/item/teleporter/proc/panic_teleport(mob/user, turf/destination, direction = NORTH)
+ var/saving_throw
+ switch(direction)
+ if(NORTH || SOUTH)
+ if(prob(50))
+ saving_throw = EAST
+ else
+ saving_throw = WEST
+ if(EAST || WEST)
+ if(prob(50))
+ saving_throw = NORTH
+ else
+ saving_throw = SOUTH
+ else
+ saving_throw = NORTH // just in case
+
+ var/mob/living/carbon/C = user
+ var/turf/mobloc = get_turf(C)
+ var/list/turfs = list()
+ var/found_turf = FALSE
+ for(var/turf/T in range(destination, saving_throw_distance))
+ if(get_dir(destination, T) != saving_throw)
+ continue
+ if(T.x > world.maxx-saving_throw_distance || T.x < saving_throw_distance)
+ continue //putting them at the edge is dumb
+ if(T.y > world.maxy-saving_throw_distance || T.y < saving_throw_distance)
+ continue
+ if(!tile_check(T))
+ continue // We are only looking for safe tiles on the saving throw, since we are nice
+ turfs += T
+ found_turf = TRUE
+
+ if(found_turf)
+ var/turf/new_destination = pick(turfs)
+ var/turf/fragging_location = new_destination
+ telefrag(fragging_location, user)
+ C.forceMove(new_destination)
+ playsound(mobloc, "sparks", 50, TRUE)
+ new /obj/effect/temp_visual/teleport_abductor/syndi_teleporter(mobloc)
+ new /obj/effect/temp_visual/teleport_abductor/syndi_teleporter(new_destination)
+ playsound(new_destination, "sparks", 50, TRUE)
+ else //We tried to save. We failed. Death time.
+ get_fragged(user, destination)
+
+
+/obj/item/teleporter/proc/get_fragged(mob/user, turf/destination)
+ var/turf/mobloc = get_turf(user)
+ user.forceMove(destination)
+ playsound(mobloc, "sparks", 50, TRUE)
+ new /obj/effect/temp_visual/teleport_abductor/syndi_teleporter(mobloc)
+ new /obj/effect/temp_visual/teleport_abductor/syndi_teleporter(destination)
+ playsound(destination, "sparks", 50, TRUE)
+ playsound(destination, "sound/magic/disintegrate.ogg", 50, TRUE)
+ destination.ex_act(rand(1,2))
+ for(var/obj/item/W in user)
+ if(istype(W, /obj/item/organ)|| istype(W, /obj/item/implant))
+ continue
+ if(!user.unEquip(W))
+ qdel(W)
+ to_chat(user, "You teleport into the wall, the teleporter tries to save you, but--")
+ user.gib()
+
+/obj/item/teleporter/proc/telefrag(turf/fragging_location, mob/user)
+ for(var/mob/living/M in fragging_location)//Hit everything in the turf
+ M.apply_damage(20, BRUTE)
+ M.Stun(3)
+ M.Weaken(3)
+ to_chat(M, " [user] teleports into you, knocking you to the floor with the bluespace wave!")
+
+/obj/item/paper/teleporter
+ name = "Teleporter Guide"
+ icon_state = "paper"
+ info = {"Instructions on your new prototype syndicate teleporter
+
+ This teleporter will teleport the user 4-8 meters in the direction they are facing. Unlike the cult veil shifter, you can not drag people with you.
+
+ It has 4 charges, and will recharge uses over time. No, sticking the teleporter into the tesla, an APC, a microwave, or an electrified door, will not make it charge faster.
+
+ Warning: Teleporting into walls will activate a failsafe teleport parallel up to 3 meters, but the user will be ripped apart and gibbed in a wall if it fails.
+
+ Do not expose the teleporter to electromagnetic pulses or attempt to use with a bag of holding, unwanted malfunctions may occur.
+"}
+/obj/item/storage/box/syndie_kit/teleporter
+ name = "syndicate teleporter kit"
+
+/obj/item/storage/box/syndie_kit/teleporter/New()
+ ..()
+ new /obj/item/teleporter(src)
+ new /obj/item/paper/teleporter(src)
+ return
+
+/obj/effect/temp_visual/teleport_abductor/syndi_teleporter
+ duration = 5
+
+/obj/item/teleporter/admin
+ desc = "A strange syndicate version of a cult veil shifter. \n This one seems EMP proof, and with much better saftey protocols."
+ charges = 8
+ max_charges = 8
+ flawless = TRUE
diff --git a/icons/obj/device.dmi b/icons/obj/device.dmi
index 6cf80471a0b1e2d36613d375aaafbd0fdbf02ca5..912f1d12a84f76b4931bb6002841f3b70eeda440 100644
GIT binary patch
delta 7491
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