From 2c66db96704dc73b235ff059704a2428ac6a652d Mon Sep 17 00:00:00 2001
From: ExusA <67055922+ExusA@users.noreply.github.com>
Date: Wed, 25 Dec 2024 11:15:55 +0800
Subject: [PATCH] Resprites Quantum Pads and Cargo Pads (#27595)
* Resprites Quantum Pads and Cargo Pads
Adds a new sprite and animation for teleporter pads
* Fix rendering layers
Makes quantum pads move to a higher layer while active
---
code/game/machinery/quantum_pad.dm | 100 +++++++++++++++++------------
icons/obj/telescience.dmi | Bin 3049 -> 3681 bytes
2 files changed, 58 insertions(+), 42 deletions(-)
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 36daadc9f18c7b4259e89bc9bb0b7fcadc7326ec..290be6c34e8525f33c180add4bffe61f44393645 100644
GIT binary patch
literal 3681
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
literal 3049
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
aGa4pK+%(Id83lj+@7$c-o$4He@&5%fnbv&(