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