Files
Bubberstation/code/game/objects/items/devices/swapper.dm
T
ArcaneMusicandGitHub 5c7c2a6ed4 Adds a sound to the quantum spin inverter when swapping. (#95181)
## About The Pull Request

This PR does 2 things, first it cleans up some of the documentation in
and around this PR since it came up in discussion related to the new
anomaly core PR. Autodocs the swap PR, and replaces some var names with
slightly more descriptive ones.

Second, this PR adds a small sound effect to the swappers when they're
activated, one making a air rushing-in sound, and the other making an
air-rushing out sound.

## Why It's Good For The Game

There was a todo sitting next to the updated code from the
aforementioned PR that had been sitting asking for either a visual
effect when swapping, or a sound effect. A sound effect is fairly easy
to pull off, and there's already a visual effect of rainbow-sparks
that's generated when activated nowadays.

Also code-cleanup is always fine.

## Changelog

🆑
sound: The quantum spin inverter now makes a sound effect on either side
of the inverters when activated.
/🆑
2026-02-18 13:46:00 +01:00

101 lines
4.0 KiB
Plaintext

/obj/item/swapper
name = "quantum spin inverter"
desc = "An experimental device that is able to swap the locations of two entities by switching their particles' spin values. Must be linked to another device to function."
icon = 'icons/obj/mining_zones/artefacts.dmi'
icon_state = "swapper"
inhand_icon_state = "electronic"
w_class = WEIGHT_CLASS_SMALL
item_flags = NOBLUDGEON
lefthand_file = 'icons/mob/inhands/items/devices_lefthand.dmi'
righthand_file = 'icons/mob/inhands/items/devices_righthand.dmi'
interaction_flags_click = NEED_DEXTERITY|ALLOW_RESTING
/// Cooldown for usage
var/cooldown = 30 SECONDS
/// Next available time
var/next_use = 0
/// Swapper linked to this obj
var/obj/item/swapper/linked_swapper
/obj/item/swapper/Destroy()
if(linked_swapper)
linked_swapper.linked_swapper = null //*inception music*
linked_swapper.update_appearance()
linked_swapper = null
return ..()
/obj/item/swapper/update_icon_state()
icon_state = "swapper[linked_swapper ? "-linked" : null]"
return ..()
/obj/item/swapper/attackby(obj/item/I, mob/user, list/modifiers, list/attack_modifiers)
if(istype(I, /obj/item/swapper))
var/obj/item/swapper/other_swapper = I
if(other_swapper.linked_swapper)
to_chat(user, span_warning("[other_swapper] is already linked. Break the current link to establish a new one."))
return
if(linked_swapper)
to_chat(user, span_warning("[src] is already linked. Break the current link to establish a new one."))
return
to_chat(user, span_notice("You establish a quantum link between the two devices."))
linked_swapper = other_swapper
other_swapper.linked_swapper = src
update_appearance()
linked_swapper.update_appearance()
else
return ..()
/obj/item/swapper/attack_self(mob/living/user)
if(world.time < next_use)
to_chat(user, span_warning("[src] is still recharging."))
return
if(QDELETED(linked_swapper))
to_chat(user, span_warning("[src] is not linked with another swapper."))
return
playsound(src, 'sound/items/weapons/flash.ogg', 25, TRUE)
to_chat(user, span_notice("You activate [src]."))
playsound(linked_swapper, 'sound/items/weapons/flash.ogg', 25, TRUE)
if(ismob(linked_swapper.loc))
var/mob/holder = linked_swapper.loc
to_chat(holder, span_notice("[linked_swapper] starts buzzing."))
next_use = world.time + cooldown //only the one used goes on cooldown
addtimer(CALLBACK(src, PROC_REF(swap), user), 2.5 SECONDS)
/obj/item/swapper/examine(mob/user)
. = ..()
if(world.time < next_use)
. += span_warning("Time left to recharge: [DisplayTimeText(next_use - world.time)].")
if(linked_swapper)
. += span_notice("<b>Linked.</b> Alt-Click to break the quantum link.")
else
. += span_notice("<b>Not Linked.</b> Use on another quantum spin inverter to establish a quantum link.")
/obj/item/swapper/click_alt(mob/living/user)
to_chat(user, span_notice("You break the current quantum link."))
if(!QDELETED(linked_swapper))
linked_swapper.linked_swapper = null
linked_swapper.update_appearance()
linked_swapper = null
update_appearance()
return CLICK_ACTION_SUCCESS
/**
* Swaps two atoms following the activation of a swapper item.
* If a mob is holding a swapper, it will carry the mob as-per the rules of do_teleport().
*/
/obj/item/swapper/proc/swap(mob/user)
if(QDELETED(linked_swapper) || isnull(linked_swapper.loc) || world.time < linked_swapper.cooldown)
return
var/atom/movable/container_A = get_teleportable_container(src)
var/atom/movable/container_B = get_teleportable_container(linked_swapper)
var/target_A = container_A.drop_location()
var/target_B = container_B.drop_location()
playsound(target_A, 'sound/effects/swapper/swap_a.ogg', 30, TRUE)
playsound(target_B, 'sound/effects/swapper/swap_b.ogg', 30, TRUE)
if(do_teleport(container_A, target_B, channel = TELEPORT_CHANNEL_QUANTUM))
do_teleport(container_B, target_A, channel = TELEPORT_CHANNEL_QUANTUM)
if(ismob(container_B))
var/mob/swapped_mob = container_B
to_chat(swapped_mob, span_warning("[linked_swapper] activates, and you find yourself somewhere else."))