Files
Bubberstation/code/modules/assembly/mousetrap.dm
grungussuss 58501dce77 Reorganizes the sound folder (#86726)
## About The Pull Request

<details>

- renamed ai folder to announcer

-- announcer --
- moved vox_fem to announcer
- moved approachingTG to announcer

- separated the ambience folder into ambience and instrumental
-- ambience --

- created holy folder moved all related sounds there
- created engineering folder and moved all related sounds there
- created security folder and moved ambidet there
- created general folder and moved ambigen there
- created icemoon folder and moved all icebox-related ambience there
- created medical folder and moved all medbay-related ambi there
- created ruin folder and moves all ruins ambi there
- created beach folder and moved seag and shore there
- created lavaland folder and moved related ambi there
- created aurora_caelus folder and placed its ambi there
- created misc folder and moved the rest of the files that don't have a
specific category into it

-- instrumental --

- moved traitor folder here
- created lobby_music folder and placed our songs there (title0 not used
anywhere? - server-side modification?)

-- items --

- moved secdeath to hailer
- moved surgery to handling

-- effects --

- moved chemistry into effects
- moved hallucinations into effects
- moved health into effects
- moved magic into effects

-- vehicles --

- moved mecha into vehicles


created mobs folder

-- mobs --

- moved creatures folder into mobs
- moved voice into mobs

renamed creatures to non-humanoids
renamed voice to humanoids

-- non-humanoids--

created cyborg folder
created hiss folder
moved harmalarm.ogg to cyborg

-- humanoids --




-- misc --

moved ghostwhisper to misc
moved insane_low_laugh to misc

I give up trying to document this.

</details>

- [X] ambience
- [x] announcer
- [x] effects
- [X] instrumental
- [x] items
- [x] machines
- [x] misc 
- [X] mobs
- [X] runtime
- [X] vehicles

- [ ] attributions

## Why It's Good For The Game

This folder is so disorganized that it's vomit inducing, will make it
easier to find and add new sounds, providng a minor structure to the
sound folder.

## Changelog
🆑 grungussuss
refactor: the sound folder in the source code has been reorganized,
please report any oddities with sounds playing or not playing
server: lobby music has been repathed to sound/music/lobby_music
/🆑
2024-09-23 22:24:50 -07:00

237 lines
7.7 KiB
Plaintext

/obj/item/assembly/mousetrap
name = "mousetrap"
desc = "A handy little spring-loaded trap for catching pesty rodents."
icon_state = "mousetrap"
inhand_icon_state = "mousetrap"
custom_materials = list(/datum/material/iron=SMALL_MATERIAL_AMOUNT)
attachable = TRUE
var/armed = FALSE
drop_sound = 'sound/items/handling/component_drop.ogg'
pickup_sound = 'sound/items/handling/component_pickup.ogg'
var/obj/item/host = null
var/turf/host_turf = null
/**
* update_host: automatically setup host and host_turf
*
* Arguments:
* * force: Re-register signals even if the host or loc is unchanged
*/
/obj/item/assembly/mousetrap/proc/update_host(force = FALSE)
var/obj/item/newhost
// Pick the first valid object in this list:
// Wiring datum's owner
// assembly holder's attached object
// assembly holder itself
// us
newhost = connected?.holder || holder?.master || holder || src
// ok look
// previously this wasn't working and thus no concern, but I made mousetraps work with wires
// specifically in step-on-the-mousetrap mode, ie, when you enter its turf
// and as a consequence, you can put a mousetrap in door wires and it will be set off
// the first time someone walks through a door (enters the door's loc)
// that's an interesting mechanic (bolt open a door for example) but it's not appropriate for a mousetrap
// similarly if used on say an apc's wires it would go into effect when someone walked by it. Not appropriate.
// other assemblies could be made to do something similar instead.
// mousetrap assemblies will still receive on-found notifications when you open a wiring panel
// and (whether reasonable or not) mousetraps that do this do still trigger wires
// the point is for now step-on-mousetrap mode should only work on items
// maybe it should never have been an assembly in the first place.
// tl;dr only trigger step-on mode if the host is an item
if(!istype(newhost,/obj/item))
if(host)
UnregisterSignal(host,COMSIG_MOVABLE_MOVED)
host = src
if(isturf(host_turf))
UnregisterSignal(host_turf,COMSIG_ATOM_ENTERED)
host_turf = null
return
// If host changed
if((newhost != host) || force)
if(host)
UnregisterSignal(host,COMSIG_MOVABLE_MOVED)
host = newhost
RegisterSignal(host,COMSIG_MOVABLE_MOVED, PROC_REF(holder_movement))
// If host moved
if((host_turf != host.loc) || force)
if(isturf(host_turf))
UnregisterSignal(host_turf,COMSIG_ATOM_ENTERED)
host_turf = null
if(isturf(host.loc))
host_turf = host.loc
RegisterSignal(host_turf,COMSIG_ATOM_ENTERED, PROC_REF(on_entered))
else
host_turf = null
/obj/item/assembly/mousetrap/holder_movement()
. = ..()
update_host()
/obj/item/assembly/mousetrap/Initialize(mapload)
. = ..()
update_host(force = TRUE)
/obj/item/assembly/mousetrap/examine(mob/user)
. = ..()
. += span_notice("The pressure plate is [armed?"primed":"safe"].")
/obj/item/assembly/mousetrap/activate()
if(..())
armed = !armed
if(!armed)
if(ishuman(usr))
var/mob/living/carbon/human/user = usr
if((HAS_TRAIT(user, TRAIT_DUMB) || HAS_TRAIT(user, TRAIT_CLUMSY)) && prob(50))
to_chat(user, span_warning("Your hand slips, setting off the trigger!"))
pulse()
update_appearance()
playsound(loc, 'sound/items/weapons/handcuffs.ogg', 30, TRUE, -3)
/obj/item/assembly/mousetrap/update_icon_state()
icon_state = "mousetrap[armed ? "armed" : ""]"
return ..()
/obj/item/assembly/mousetrap/update_icon(updates=ALL)
. = ..()
holder?.update_icon(updates)
/obj/item/assembly/mousetrap/on_attach()
. = ..()
update_host()
/obj/item/assembly/mousetrap/on_detach()
. = ..()
update_host()
/obj/item/assembly/mousetrap/proc/triggered(mob/target, type = "feet")
if(!armed)
return
armed = FALSE // moved to the top because you could trigger it more than once under some circumstances
update_appearance()
var/obj/item/bodypart/affecting = null
if(ishuman(target))
var/mob/living/carbon/human/victim = target
if(HAS_TRAIT(victim, TRAIT_PIERCEIMMUNE))
playsound(src, 'sound/effects/snap.ogg', 50, TRUE)
pulse()
return FALSE
switch(type)
if("feet")
if(!victim.shoes)
affecting = victim.get_bodypart(pick(BODY_ZONE_L_LEG, BODY_ZONE_R_LEG))
victim.Paralyze(60)
else
to_chat(victim, span_notice("Your [victim.shoes] protects you from [src]."))
if(BODY_ZONE_PRECISE_L_HAND, BODY_ZONE_PRECISE_R_HAND)
if(!victim.gloves)
affecting = victim.get_bodypart(type)
victim.Stun(60)
else
to_chat(victim, span_notice("Your [victim.gloves] protects you from [src]."))
if(affecting)
if(affecting.receive_damage(1, 0))
victim.update_damage_overlays()
else if(ismouse(target))
var/mob/living/basic/mouse/splatted = target
visible_message(span_boldannounce("SPLAT!"))
splatted.splat() // mousetraps are instadeath for mice
else if(isregalrat(target))
visible_message(span_boldannounce("Skreeeee!")) //He's simply too large to be affected by a tiny mouse trap.
playsound(src, 'sound/effects/snap.ogg', 50, TRUE)
pulse()
/**
* clumsy_check: Sets off the mousetrap if handled by a clown (with some probability)
*
* Arguments:
* * user: The mob handling the trap
*/
/obj/item/assembly/mousetrap/proc/clumsy_check(mob/living/carbon/human/user)
if(!armed || !user)
return FALSE
if((HAS_TRAIT(user, TRAIT_DUMB) || HAS_TRAIT(user, TRAIT_CLUMSY)) && prob(50))
var/which_hand = BODY_ZONE_PRECISE_L_HAND
if(!(user.active_hand_index % 2))
which_hand = BODY_ZONE_PRECISE_R_HAND
triggered(user, which_hand)
user.visible_message(span_warning("[user] accidentally sets off [src], breaking their fingers."), \
span_warning("You accidentally trigger [src]!"))
return TRUE
return FALSE
/obj/item/assembly/mousetrap/attack_self(mob/living/carbon/human/user)
if(!armed)
to_chat(user, span_notice("You arm [src]."))
else
if(clumsy_check(user))
return
to_chat(user, span_notice("You disarm [src]."))
armed = !armed
update_appearance()
playsound(src, 'sound/items/weapons/handcuffs.ogg', 30, TRUE, -3)
// Clumsy check only
/obj/item/assembly/mousetrap/attack_hand(mob/living/carbon/human/user, list/modifiers)
if(clumsy_check(user))
return
return ..()
/obj/item/assembly/mousetrap/proc/on_entered(datum/source, atom/movable/AM as mob|obj)
SIGNAL_HANDLER
if(armed)
if(ismob(AM))
var/mob/MM = AM
if(!(MM.movement_type & MOVETYPES_NOT_TOUCHING_GROUND))
if(ishuman(AM))
var/mob/living/carbon/H = AM
if(H.move_intent == MOVE_INTENT_RUN)
INVOKE_ASYNC(src, PROC_REF(triggered), H)
H.visible_message(span_warning("[H] accidentally steps on [src]."), \
span_warning("You accidentally step on [src]"))
else if(ismouse(MM) || isregalrat(MM))
INVOKE_ASYNC(src, PROC_REF(triggered), MM)
else if(AM.density) // For mousetrap grenades, set off by anything heavy
INVOKE_ASYNC(src, PROC_REF(triggered), AM)
/obj/item/assembly/mousetrap/on_found(mob/finder)
if(armed)
if(finder)
finder.visible_message(span_warning("[finder] accidentally sets off [src], breaking their fingers."), \
span_warning("You accidentally trigger [src]!"))
triggered(finder, (finder.active_hand_index % 2 == 0) ? BODY_ZONE_PRECISE_R_HAND : BODY_ZONE_PRECISE_L_HAND)
return TRUE //end the search!
else
visible_message(span_warning("[src] snaps shut!"))
triggered(loc)
return FALSE
return FALSE
/obj/item/assembly/mousetrap/hitby(atom/movable/AM, skipcatch, hitpush, blocked, datum/thrownthing/throwingdatum)
if(!armed)
return ..()
visible_message(span_warning("[src] is triggered by [AM]."))
triggered(null)
/obj/item/assembly/mousetrap/Destroy()
if(host)
UnregisterSignal(host,COMSIG_MOVABLE_MOVED)
host = null
if(isturf(host_turf))
UnregisterSignal(host_turf,COMSIG_ATOM_ENTERED)
host_turf = null
return ..()
/obj/item/assembly/mousetrap/armed
icon_state = "mousetraparmed"
armed = TRUE