mirror of
https://github.com/yogstation13/Yogstation.git
synced 2025-02-26 09:04:50 +00:00
120 lines
4.1 KiB
Plaintext
120 lines
4.1 KiB
Plaintext
/datum/component/squeak
|
|
var/squeak_chance = 100
|
|
var/volume = 30
|
|
|
|
// This is so shoes don't squeak every step
|
|
var/steps = 0
|
|
var/step_delay = 1
|
|
|
|
// This is to stop squeak spam from inhand usage
|
|
var/last_use = 0
|
|
var/use_delay = 20
|
|
|
|
/datum/component/squeak/Initialize(volume_override, chance_override, step_delay_override, use_delay_override)
|
|
if(datum_outputs)
|
|
for(var/i in 1 to length(datum_outputs))
|
|
datum_outputs[i] = SSoutputs.outputs[datum_outputs[i]]
|
|
if(!isatom(parent))
|
|
return COMPONENT_INCOMPATIBLE
|
|
RegisterSignal(parent, list(COMSIG_ATOM_ENTERED, COMSIG_ATOM_BLOB_ACT, COMSIG_ATOM_HULK_ATTACK, COMSIG_PARENT_ATTACKBY), .proc/play_squeak)
|
|
if(ismovableatom(parent))
|
|
RegisterSignal(parent, list(COMSIG_MOVABLE_BUMP, COMSIG_MOVABLE_IMPACT), .proc/play_squeak)
|
|
RegisterSignal(parent, COMSIG_MOVABLE_CROSSED, .proc/play_squeak_crossed)
|
|
RegisterSignal(parent, COMSIG_MOVABLE_DISPOSING, .proc/disposing_react)
|
|
if(isitem(parent))
|
|
RegisterSignal(parent, list(COMSIG_ITEM_ATTACK, COMSIG_ITEM_ATTACK_OBJ, COMSIG_ITEM_HIT_REACT), .proc/play_squeak)
|
|
RegisterSignal(parent, COMSIG_ITEM_ATTACK_SELF, .proc/use_squeak)
|
|
RegisterSignal(parent, COMSIG_ITEM_EQUIPPED, .proc/on_equip)
|
|
RegisterSignal(parent, COMSIG_ITEM_DROPPED, .proc/on_drop)
|
|
if(istype(parent, /obj/item/clothing/shoes))
|
|
RegisterSignal(parent, COMSIG_SHOES_STEP_ACTION, .proc/step_squeak)
|
|
|
|
if(chance_override)
|
|
squeak_chance = chance_override
|
|
if(volume_override)
|
|
volume = volume_override
|
|
if(isnum(step_delay_override))
|
|
step_delay = step_delay_override
|
|
if(isnum(use_delay_override))
|
|
use_delay = use_delay_override
|
|
|
|
/datum/component/squeak/proc/play_squeak()
|
|
if(prob(squeak_chance))
|
|
if(!datum_outputs)
|
|
CRASH("Squeak datum attempted to play missing datum")
|
|
else
|
|
playsound(parent, datum_outputs[1], volume, 1, -1, , , , , , src)
|
|
|
|
/datum/component/squeak/proc/step_squeak()
|
|
if(steps > step_delay)
|
|
play_squeak()
|
|
steps = 0
|
|
else
|
|
steps++
|
|
|
|
/datum/component/squeak/proc/play_squeak_crossed(datum/source, atom/movable/AM)
|
|
if(isitem(AM))
|
|
var/obj/item/I = AM
|
|
if(I.item_flags & ABSTRACT)
|
|
return
|
|
else if(istype(AM, /obj/item/projectile))
|
|
var/obj/item/projectile/P = AM
|
|
if(P.original != parent)
|
|
return
|
|
if(istype(AM, /obj/effect/dummy/phased_mob)) //don't squeek if they're in a phased/jaunting container.
|
|
return
|
|
var/atom/current_parent = parent
|
|
if(isturf(current_parent.loc))
|
|
play_squeak()
|
|
|
|
/datum/component/squeak/proc/use_squeak()
|
|
if(last_use + use_delay < world.time)
|
|
last_use = world.time
|
|
play_squeak()
|
|
|
|
/datum/component/squeak/proc/on_equip(datum/source, mob/equipper, slot)
|
|
RegisterSignal(equipper, COMSIG_MOVABLE_DISPOSING, .proc/disposing_react, TRUE)
|
|
|
|
/datum/component/squeak/proc/on_drop(datum/source, mob/user)
|
|
UnregisterSignal(user, COMSIG_MOVABLE_DISPOSING)
|
|
|
|
// Disposal pipes related shit
|
|
/datum/component/squeak/proc/disposing_react(datum/source, obj/structure/disposalholder/holder, obj/machinery/disposal/source)
|
|
//We don't need to worry about unregistering this signal as it will happen for us automaticaly when the holder is qdeleted
|
|
RegisterSignal(holder, COMSIG_ATOM_DIR_CHANGE, .proc/holder_dir_change)
|
|
|
|
/datum/component/squeak/proc/holder_dir_change(datum/source, old_dir, new_dir)
|
|
//If the dir changes it means we're going through a bend in the pipes, let's pretend we bumped the wall
|
|
if(old_dir != new_dir)
|
|
play_squeak()
|
|
|
|
/datum/component/squeak/carp
|
|
datum_outputs = list(/datum/outputs/bite)
|
|
|
|
/datum/component/squeak/bubbleplush
|
|
datum_outputs = list(/datum/outputs/demonattack)
|
|
|
|
/datum/component/squeak/lizardplushie
|
|
datum_outputs = list(/datum/outputs/slash)
|
|
|
|
/datum/component/squeak/snakeplushie
|
|
datum_outputs = list(/datum/outputs/bite)
|
|
|
|
/datum/component/squeak/nukeplushie
|
|
datum_outputs = list(/datum/outputs/punch)
|
|
|
|
/datum/component/squeak/slimeplushie
|
|
datum_outputs = list(/datum/outputs/squelch)
|
|
|
|
/datum/component/squeak/mouse
|
|
datum_outputs = list(/datum/outputs/squeak)
|
|
|
|
/datum/component/squeak/clownstep
|
|
datum_outputs = list(/datum/outputs/clownstep)
|
|
|
|
/datum/component/squeak/bikehorn
|
|
datum_outputs = list(/datum/outputs/bikehorn)
|
|
|
|
/datum/component/squeak/airhorn
|
|
datum_outputs = list(/datum/outputs/airhorn)
|