diff --git a/code/game/machinery/quantum_pad.dm b/code/game/machinery/quantum_pad.dm
index a57de59b9f1..f5f31efc6fb 100644
--- a/code/game/machinery/quantum_pad.dm
+++ b/code/game/machinery/quantum_pad.dm
@@ -1,3 +1,6 @@
+#define QPAD_ANIM_WINDUP 0.8 SECONDS
+#define QPAD_ANIM_COOLDOWN 0.7 SECONDS
+
/obj/machinery/quantumpad
name = "quantum pad"
desc = "A bluespace quantum-linked telepad used for teleporting objects to other quantum pads."
@@ -168,57 +171,70 @@
else
to_chat(user, "Linked pad is not on or near any active cameras on the station.")
-/obj/machinery/quantumpad/proc/sparks()
- do_sparks(5, 1, get_turf(src))
-
/obj/machinery/quantumpad/attack_ghost(mob/dead/observer/ghost)
if(!QDELETED(linked_pad))
ghost.forceMove(get_turf(linked_pad))
+/obj/machinery/quantumpad/proc/precharge()
+ layer = HIGH_OBJ_LAYER
+ linked_pad.layer = HIGH_OBJ_LAYER
+ flick("qpad-beam", src)
+ flick("qpad-beam", linked_pad)
+ addtimer(CALLBACK(src, PROC_REF(finish_teleport)), max((teleport_speed + QPAD_ANIM_COOLDOWN), 1))
+
+/obj/machinery/quantumpad/proc/finish_teleport()
+ if(!teleporting)
+ layer = BELOW_OBJ_LAYER
+ linked_pad.layer = BELOW_OBJ_LAYER
+
/obj/machinery/quantumpad/proc/doteleport(mob/user)
if(linked_pad)
playsound(get_turf(src), 'sound/weapons/flash.ogg', 25, 1)
teleporting = TRUE
+ src.icon_state = "qpad-charge"
+ linked_pad.icon_state = "qpad-charge"
+ addtimer(CALLBACK(src, PROC_REF(precharge)), max((teleport_speed - QPAD_ANIM_WINDUP), 1))
+ addtimer(CALLBACK(src, PROC_REF(process_teleport)), teleport_speed)
- spawn(teleport_speed)
- if(!src || QDELETED(src))
- teleporting = FALSE
- return
- if(stat & NOPOWER)
- to_chat(user, "[src] is unpowered!")
- teleporting = FALSE
- return
- if(!linked_pad || QDELETED(linked_pad) || linked_pad.stat & NOPOWER)
- to_chat(user, "Linked pad is not responding to ping. Teleport aborted.")
- teleporting = FALSE
- return
+/obj/machinery/quantumpad/proc/process_teleport(mob/user)
+ if(!src || QDELETED(src))
+ teleporting = FALSE
+ return
+ if(stat & NOPOWER)
+ to_chat(user, "[src] is unpowered!")
+ teleporting = FALSE
+ return
+ if(!linked_pad || QDELETED(linked_pad) || linked_pad.stat & NOPOWER)
+ to_chat(user, "Linked pad is not responding to ping. Teleport aborted.")
+ teleporting = FALSE
+ return
- teleporting = FALSE
- last_teleport = world.time
+ teleporting = FALSE
+ last_teleport = world.time
- // use a lot of power
- use_power(10000 / power_efficiency)
- sparks()
- linked_pad.sparks()
-
- flick("qpad-beam", src)
- playsound(get_turf(src), 'sound/weapons/emitter2.ogg', 25, TRUE)
- flick("qpad-beam", linked_pad)
- playsound(get_turf(linked_pad), 'sound/weapons/emitter2.ogg', 25, TRUE)
- var/tele_success = TRUE
- for(var/atom/movable/ROI in get_turf(src))
- // if is anchored, don't let through
- if(ROI.anchored)
- if(isliving(ROI))
- var/mob/living/L = ROI
- if(L.buckled)
- // TP people on office chairs
- if(L.buckled.anchored)
- continue
- else
- continue
- else if(!isobserver(ROI))
+ // use a lot of power
+ use_power(10000 / power_efficiency)
+ playsound(get_turf(src), 'sound/weapons/emitter2.ogg', 25, TRUE)
+ playsound(get_turf(linked_pad), 'sound/weapons/emitter2.ogg', 25, TRUE)
+ var/tele_success = TRUE
+ for(var/atom/movable/ROI in get_turf(src))
+ // if is anchored, don't let through
+ if(ROI.anchored)
+ if(isliving(ROI))
+ var/mob/living/L = ROI
+ if(L.buckled)
+ // TP people on office chairs
+ if(L.buckled.anchored)
continue
- tele_success = do_teleport(ROI, get_turf(linked_pad))
- if(!tele_success)
- to_chat(user, "Teleport failed due to bluespace interference.")
+ else
+ continue
+ else if(!isobserver(ROI))
+ continue
+ tele_success = do_teleport(ROI, get_turf(linked_pad), do_effect = FALSE)
+ if(!tele_success)
+ to_chat(user, "Teleport failed due to bluespace interference.")
+ src.icon_state = "qpad-idle"
+ linked_pad.icon_state = "qpad-idle"
+
+#undef QPAD_ANIM_WINDUP
+#undef QPAD_ANIM_COOLDOWN
diff --git a/icons/obj/telescience.dmi b/icons/obj/telescience.dmi
index 36daadc9f18..290be6c34e8 100644
Binary files a/icons/obj/telescience.dmi and b/icons/obj/telescience.dmi differ