From a081d4859065b62ecef45b7469f3be3dd6ee2adc Mon Sep 17 00:00:00 2001 From: Guti <32563288+TheCaramelion@users.noreply.github.com> Date: Sun, 9 Feb 2025 00:19:59 +0100 Subject: [PATCH] DCS Update + Footstep element (#17076) * DCS Update + Footstep element * Steppy * Revert "Steppy" This reverts commit fab0590fb74e9b233660fd61eadc8e62525db32b. * Reapply "Steppy" This reverts commit 1f7ad8f8f7b823024ef1996cbb1a2a43f7e00866. * Ough * Oops! Wrong map. * lil stuff * Update * Only loud * Missed one * NO MORE SILENT * ...parenthesis. --- code/__defines/dcs/flags.dm | 51 +- code/__defines/dcs/helpers.dm | 13 +- code/__defines/dcs/signals/signals_turf.dm | 2 + code/__defines/footsteps.dm | 252 ++++++++ code/__defines/slosh.dm | 11 + code/__defines/traits.dm | 211 ++++++ code/__defines/traits/_traits.dm | 93 +-- code/__defines/traits/sources.dm | 2 +- code/_helpers/global_lists.dm | 7 + code/_helpers/sorts/comparators.dm | 22 +- .../hud/action/action_item_overlay.dm | 2 +- code/controllers/subsystems/dcs.dm | 99 ++- code/controllers/subsystems/tgui.dm | 16 +- code/datums/components/COMPONENT_TEMPLATE.md | 55 ++ code/datums/components/README.md | 4 +- code/datums/components/_component.dm | 610 ++++++++---------- code/datums/components/material_container.dm | 2 +- code/datums/datum.dm | 75 ++- code/datums/elements/ELEMENT_TEMPLATE.md | 25 + code/datums/elements/_element.dm | 50 +- code/datums/elements/conflict_checking.dm | 4 +- code/datums/elements/footstep.dm | 187 ++++++ code/datums/elements/footstep_override.dm | 81 +++ code/datums/elements/light_blocking.dm | 2 +- code/datums/elements/slosh.dm | 94 +++ code/datums/signals.dm | 127 ++++ code/game/turfs/flooring/flooring_premade.dm | 3 + code/game/turfs/simulated/floor.dm | 10 - .../game/turfs/simulated/outdoors/outdoors.dm | 16 - code/game/turfs/simulated/water.dm | 2 - code/game/turfs/turf.dm | 53 +- .../client/preference_setup/vore/02_size.dm | 14 + code/modules/mining/mine_turfs.dm | 2 - code/modules/mob/living/bot/secbot.dm | 3 +- code/modules/mob/living/carbon/carbon.dm | 2 + .../mob/living/carbon/human/human_movement.dm | 46 +- .../living/carbon/human/species/species.dm | 6 + .../human/species/station/prometheans.dm | 2 + .../carbon/human/species/station/station.dm | 2 + .../carbon/human/species/station/teshari.dm | 2 + code/modules/mob/living/silicon/silicon.dm | 2 + .../mob/living/simple_mob/simple_mob.dm | 1 + code/modules/mob/mob_defines.dm | 2 + code/modules/tgui/external.dm | 2 +- code/modules/xenoarcheaology/effect_master.dm | 2 +- sound/effects/footstep/BudgieStep1.ogg | Bin 0 -> 6059 bytes sound/effects/footstep/BudgieStep2.ogg | Bin 0 -> 9196 bytes sound/effects/footstep/BudgieStep3.ogg | Bin 0 -> 8279 bytes sound/effects/footstep/BudgieStep4.ogg | Bin 0 -> 6368 bytes sound/effects/footstep/BudgieStep5.ogg | Bin 0 -> 7118 bytes sound/effects/footstep/BudgieStep6.ogg | Bin 0 -> 6322 bytes sound/effects/footstep/carpetbarefoot1.ogg | Bin 0 -> 6452 bytes sound/effects/footstep/carpetbarefoot2.ogg | Bin 0 -> 5925 bytes sound/effects/footstep/carpetbarefoot3.ogg | Bin 0 -> 6118 bytes sound/effects/footstep/carpetbarefoot4.ogg | Bin 0 -> 6273 bytes sound/effects/footstep/carpetbarefoot5.ogg | Bin 0 -> 6716 bytes sound/effects/footstep/crawl1.ogg | Bin 0 -> 7760 bytes sound/effects/footstep/hardbarefoot1.ogg | Bin 0 -> 6315 bytes sound/effects/footstep/hardbarefoot2.ogg | Bin 0 -> 6330 bytes sound/effects/footstep/hardbarefoot3.ogg | Bin 0 -> 6088 bytes sound/effects/footstep/hardbarefoot4.ogg | Bin 0 -> 6025 bytes sound/effects/footstep/hardbarefoot5.ogg | Bin 0 -> 6072 bytes sound/effects/footstep/hardclaw1.ogg | Bin 0 -> 4694 bytes sound/effects/footstep/hardclaw2.ogg | Bin 0 -> 5174 bytes sound/effects/footstep/hardclaw3.ogg | Bin 0 -> 4509 bytes sound/effects/footstep/hardclaw4.ogg | Bin 0 -> 4676 bytes sound/effects/footstep/heavy1.ogg | Bin 0 -> 7051 bytes sound/effects/footstep/heavy2.ogg | Bin 0 -> 6381 bytes sound/effects/footstep/slime1.ogg | Bin 0 -> 5471 bytes sound/effects/footstep/woodbarefoot1.ogg | Bin 0 -> 6371 bytes sound/effects/footstep/woodbarefoot2.ogg | Bin 0 -> 6249 bytes sound/effects/footstep/woodbarefoot3.ogg | Bin 0 -> 6554 bytes sound/effects/footstep/woodbarefoot4.ogg | Bin 0 -> 6653 bytes sound/effects/footstep/woodbarefoot5.ogg | Bin 0 -> 6708 bytes sound/effects/footstep/woodclaw1.ogg | Bin 0 -> 5573 bytes sound/effects/footstep/woodclaw2.ogg | Bin 0 -> 5430 bytes sound/effects/footstep/woodclaw3.ogg | Bin 0 -> 5492 bytes sound/effects/meatslap.ogg | Bin 0 -> 12414 bytes vorestation.dme | 5 + 79 files changed, 1695 insertions(+), 579 deletions(-) create mode 100644 code/__defines/dcs/signals/signals_turf.dm create mode 100644 code/__defines/footsteps.dm create mode 100644 code/__defines/slosh.dm create mode 100644 code/datums/components/COMPONENT_TEMPLATE.md create mode 100644 code/datums/elements/ELEMENT_TEMPLATE.md create mode 100644 code/datums/elements/footstep.dm create mode 100644 code/datums/elements/footstep_override.dm create mode 100644 code/datums/elements/slosh.dm create mode 100644 code/datums/signals.dm create mode 100644 sound/effects/footstep/BudgieStep1.ogg create mode 100644 sound/effects/footstep/BudgieStep2.ogg create mode 100644 sound/effects/footstep/BudgieStep3.ogg create mode 100644 sound/effects/footstep/BudgieStep4.ogg create mode 100644 sound/effects/footstep/BudgieStep5.ogg create mode 100644 sound/effects/footstep/BudgieStep6.ogg create mode 100644 sound/effects/footstep/carpetbarefoot1.ogg create mode 100644 sound/effects/footstep/carpetbarefoot2.ogg create mode 100644 sound/effects/footstep/carpetbarefoot3.ogg create mode 100644 sound/effects/footstep/carpetbarefoot4.ogg create mode 100644 sound/effects/footstep/carpetbarefoot5.ogg create mode 100644 sound/effects/footstep/crawl1.ogg create mode 100644 sound/effects/footstep/hardbarefoot1.ogg create mode 100644 sound/effects/footstep/hardbarefoot2.ogg create mode 100644 sound/effects/footstep/hardbarefoot3.ogg create mode 100644 sound/effects/footstep/hardbarefoot4.ogg create mode 100644 sound/effects/footstep/hardbarefoot5.ogg create mode 100644 sound/effects/footstep/hardclaw1.ogg create mode 100644 sound/effects/footstep/hardclaw2.ogg create mode 100644 sound/effects/footstep/hardclaw3.ogg create mode 100644 sound/effects/footstep/hardclaw4.ogg create mode 100644 sound/effects/footstep/heavy1.ogg create mode 100644 sound/effects/footstep/heavy2.ogg create mode 100644 sound/effects/footstep/slime1.ogg create mode 100644 sound/effects/footstep/woodbarefoot1.ogg create mode 100644 sound/effects/footstep/woodbarefoot2.ogg create mode 100644 sound/effects/footstep/woodbarefoot3.ogg create mode 100644 sound/effects/footstep/woodbarefoot4.ogg create mode 100644 sound/effects/footstep/woodbarefoot5.ogg create mode 100644 sound/effects/footstep/woodclaw1.ogg create mode 100644 sound/effects/footstep/woodclaw2.ogg create mode 100644 sound/effects/footstep/woodclaw3.ogg create mode 100644 sound/effects/meatslap.ogg diff --git a/code/__defines/dcs/flags.dm b/code/__defines/dcs/flags.dm index 8d3aab2aa7..b69d74571c 100644 --- a/code/__defines/dcs/flags.dm +++ b/code/__defines/dcs/flags.dm @@ -1,4 +1,4 @@ -/// Return this from `/datum/component/Initialize` or `datum/component/OnTransfer` to have the component be deleted if it's applied to an incorrect type. +/// Return this from `/datum/component/Initialize` or `/datum/component/OnTransfer` or `/datum/component/on_source_add` to have the component be deleted if it's applied to an incorrect type. /// `parent` must not be modified if this is to be returned. /// This will be noted in the runtime logs #define COMPONENT_INCOMPATIBLE 1 @@ -9,35 +9,56 @@ #define ELEMENT_INCOMPATIBLE 1 // /datum/element flags -/// Causes the detach proc to be called when the host object is being deleted -#define ELEMENT_DETACH (1 << 0) +/// Causes the detach proc to be called when the host object is being deleted. +/// Should only be used if you need to perform cleanup not related to the host object. +/// You do not need this if you are only unregistering signals, for instance. +/// You would need it if you are doing something like removing the target from a processing list. +#define ELEMENT_DETACH_ON_HOST_DESTROY (1 << 0) /** - * Only elements created with the same arguments given after `id_arg_index` share an element instance - * The arguments are the same when the text and number values are the same and all other values have the same ref - */ -#define ELEMENT_BESPOKE (1 << 1) + * Only elements created with the same arguments given after `argument_hash_start_idx` share an element instance + * The arguments are the same when the text and number values are the same and all other values have the same ref + */ +#define ELEMENT_BESPOKE (1 << 1) /// Causes all detach arguments to be passed to detach instead of only being used to identify the element /// When this is used your Detach proc should have the same signature as your Attach proc #define ELEMENT_COMPLEX_DETACH (1 << 2) +/** + * Elements with this flag will have their datum lists arguments compared as is, + * without the contents being sorted alpha-numerically first. + * This is good for those elements where the position of the keys matter, like in the case of color matrices. + */ +#define ELEMENT_DONT_SORT_LIST_ARGS (1<<3) +/** + * Elements with this flag will be ignored by the dcs_check_list_arguments test. + * A good example is connect_loc, for which it's pratically undoable unless we force every signal proc to have a different name. + */ +#define ELEMENT_NO_LIST_UNIT_TEST (1<<4) // How multiple components of the exact same type are handled in the same datum /// old component is deleted (default) -#define COMPONENT_DUPE_HIGHLANDER 0 +#define COMPONENT_DUPE_HIGHLANDER 0 /// duplicates allowed -#define COMPONENT_DUPE_ALLOWED 1 +#define COMPONENT_DUPE_ALLOWED 1 /// new component is deleted -#define COMPONENT_DUPE_UNIQUE 2 +#define COMPONENT_DUPE_UNIQUE 2 +/** + * Component uses source tracking to manage adding and removal logic. + * Add a source/spawn to/the component by using AddComponentFrom(source, component_type, args...) + * Removing the last source will automatically remove the component from the parent. + * Arguments will be passed to on_source_add(source, args...); ensure that Initialize and on_source_add have the same signature. + */ +#define COMPONENT_DUPE_SOURCES 3 /// old component is given the initialization args of the new -#define COMPONENT_DUPE_UNIQUE_PASSARGS 4 +#define COMPONENT_DUPE_UNIQUE_PASSARGS 4 /// each component of the same type is consulted as to whether the duplicate should be allowed -#define COMPONENT_DUPE_SELECTIVE 5 +#define COMPONENT_DUPE_SELECTIVE 5 //Redirection component init flags #define REDIRECT_TRANSFER_WITH_TURF 1 //Arch -#define ARCH_PROB "probability" //Probability for each item -#define ARCH_MAXDROP "max_drop_amount" //each item's max drop amount +#define ARCH_PROB "probability" //Probability for each item +#define ARCH_MAXDROP "max_drop_amount" //each item's max drop amount //Ouch my toes! #define CALTROP_BYPASS_SHOES 1 @@ -45,4 +66,4 @@ // Conflict element IDs #define CONFLICT_ELEMENT_CRUSHER "crusher" -#define CONFLICT_ELEMENT_KA "kinetic_accelerator" \ No newline at end of file +#define CONFLICT_ELEMENT_KA "kinetic_accelerator" diff --git a/code/__defines/dcs/helpers.dm b/code/__defines/dcs/helpers.dm index a7925329fd..c3f73cec12 100644 --- a/code/__defines/dcs/helpers.dm +++ b/code/__defines/dcs/helpers.dm @@ -2,14 +2,14 @@ /// The datum hosting the signal is automaticaly added as the first argument /// Returns a bitfield gathered from all registered procs /// Arguments given here are packaged in a list and given to _SendSignal -#define SEND_SIGNAL(target, sigtype, arguments...) ( !target.comp_lookup || !target.comp_lookup[sigtype] ? NONE : target._SendSignal(sigtype, list(target, ##arguments)) ) +#define SEND_SIGNAL(target, sigtype, arguments...) ( !target._listen_lookup?[sigtype] ? NONE : target._SendSignal(sigtype, list(target, ##arguments)) ) #define SEND_GLOBAL_SIGNAL(sigtype, arguments...) ( SEND_SIGNAL(SSdcs, sigtype, ##arguments) ) /// Signifies that this proc is used to handle signals. /// Every proc you pass to RegisterSignal must have this. -//#define SIGNAL_HANDLER SHOULD_NOT_SLEEP(TRUE) -#define SIGNAL_HANDLER // Sigh +// #define SIGNAL_HANDLER SHOULD_NOT_SLEEP(TRUE) FIXME: FIXME: Causing some big issues still +#define SIGNAL_HANDLER /// A wrapper for _AddElement that allows us to pretend we're using normal named arguments #define AddElement(arguments...) _AddElement(list(##arguments)) @@ -18,3 +18,10 @@ /// A wrapper for _AddComponent that allows us to pretend we're using normal named arguments #define AddComponent(arguments...) _AddComponent(list(##arguments)) + +/// A wrapper for _AddComonent that passes in a source. +/// Necessary if dupe_mode is set to COMPONENT_DUPE_SOURCES. +#define AddComponentFrom(source, arguments...) _AddComponent(list(##arguments), source) + +/// A wrapper for _LoadComponent that allows us to pretend we're using normal named arguments +#define LoadComponent(arguments...) _LoadComponent(list(##arguments)) diff --git a/code/__defines/dcs/signals/signals_turf.dm b/code/__defines/dcs/signals/signals_turf.dm new file mode 100644 index 0000000000..fae8092b22 --- /dev/null +++ b/code/__defines/dcs/signals/signals_turf.dm @@ -0,0 +1,2 @@ +#define COMSIG_TURF_PREPARE_STEP_SOUND "turf_prepare_step_sound" + #define FOOTSTEP_OVERRIDEN (1<<0) diff --git a/code/__defines/footsteps.dm b/code/__defines/footsteps.dm new file mode 100644 index 0000000000..d467d8f99e --- /dev/null +++ b/code/__defines/footsteps.dm @@ -0,0 +1,252 @@ +#define FOOTSTEP_WOOD "wood" +#define FOOTSTEP_FLOOR "floor" +#define FOOTSTEP_PLATING "plating" +#define FOOTSTEP_CARPET "carpet" +#define FOOTSTEP_SAND "sand" +#define FOOTSTEP_GRASS "grass" +#define FOOTSTEP_WATER "water" +#define FOOTSTEP_LAVA "lava" +#define FOOTSTEP_MEAT "meat" +#define FOOTSTEP_CATWALK "catwalk" +//barefoot sounds +#define FOOTSTEP_WOOD_BAREFOOT "woodbarefoot" +#define FOOTSTEP_WOOD_CLAW "woodclaw" +#define FOOTSTEP_WOOD_LIGHTCLAW "woodlightclaw" +#define FOOTSTEP_HARD_BAREFOOT "hardbarefoot" +#define FOOTSTEP_HARD_CLAW "hardclaw" +#define FOOTSTEP_HARD_LIGHTCLAW "hardlightclaw" +#define FOOTSTEP_CARPET_BAREFOOT "carpetbarefoot" +//misc footstep sounds +#define FOOTSTEP_GENERIC_HEAVY "heavy" + + +//footstep mob defines +#define FOOTSTEP_MOB_CLAW "footstep_claw" +#define FOOTSTEP_MOB_TESHARI "footstep_lightclaw" +#define FOOTSTEP_MOB_BAREFOOT "footstep_barefoot" +#define FOOTSTEP_MOB_HEAVY "footstep_heavy" +#define FOOTSTEP_MOB_SHOE "footstep_shoe" +#define FOOTSTEP_MOB_HUMAN "footstep_human" +#define FOOTSTEP_MOB_SLIME "footstep_slime" +#define FOOTSTEP_MOB_SLITHER "foostep_slither" +#define FOOTSTEP_OBJ_MACHINE "footstep_machine" +#define FOOTSTEP_OBJ_ROBOT "footstep_robot" + +//priority defines for the footstep_override element +#define STEP_SOUND_NO_PRIORITY 0 +#define STEP_SOUND_CONVEYOR_PRIORITY 1 +#define STEP_SOUND_TABLE_PRIORITY 2 + +///the name of the index key for priority +#define STEP_SOUND_PRIORITY "step_sound_priority" + +/* +Below is how the following lists are defined + +id = list( +list(sounds), +base volume, +extra range addition +) +*/ + +GLOBAL_LIST_INIT(footstep, list( + FOOTSTEP_WOOD = list(list( + 'sound/effects/footstep/wood1.ogg', + 'sound/effects/footstep/wood2.ogg', + 'sound/effects/footstep/wood3.ogg', + 'sound/effects/footstep/wood4.ogg', + 'sound/effects/footstep/wood5.ogg'), 100, 0), + FOOTSTEP_FLOOR = list(list( + 'sound/effects/footstep/floor1.ogg', + 'sound/effects/footstep/floor2.ogg', + 'sound/effects/footstep/floor3.ogg', + 'sound/effects/footstep/floor4.ogg', + 'sound/effects/footstep/floor5.ogg'), 75, -1), + FOOTSTEP_PLATING = list(list( + 'sound/effects/footstep/plating1.ogg', + 'sound/effects/footstep/plating2.ogg', + 'sound/effects/footstep/plating3.ogg', + 'sound/effects/footstep/plating4.ogg', + 'sound/effects/footstep/plating5.ogg'), 100, 1), + FOOTSTEP_CARPET = list(list( + 'sound/effects/footstep/carpet1.ogg', + 'sound/effects/footstep/carpet2.ogg', + 'sound/effects/footstep/carpet3.ogg', + 'sound/effects/footstep/carpet4.ogg', + 'sound/effects/footstep/carpet5.ogg'), 75, -1), + FOOTSTEP_SAND = list(list( + 'sound/effects/footstep/asteroid1.ogg', + 'sound/effects/footstep/asteroid2.ogg', + 'sound/effects/footstep/asteroid3.ogg', + 'sound/effects/footstep/asteroid4.ogg', + 'sound/effects/footstep/asteroid5.ogg'), 75, 0), + FOOTSTEP_GRASS = list(list( + 'sound/effects/footstep/grass1.ogg', + 'sound/effects/footstep/grass2.ogg', + 'sound/effects/footstep/grass3.ogg', + 'sound/effects/footstep/grass4.ogg'), 75, 0), + FOOTSTEP_WATER = list(list( + 'sound/effects/footstep/water1.ogg', + 'sound/effects/footstep/water2.ogg', + 'sound/effects/footstep/water3.ogg', + 'sound/effects/footstep/water4.ogg'), 100, 1), + FOOTSTEP_LAVA = list(list( + 'sound/effects/footstep/lava1.ogg', + 'sound/effects/footstep/lava2.ogg', + 'sound/effects/footstep/lava3.ogg'), 100, 0), + FOOTSTEP_MEAT = list(list( + 'sound/effects/meatslap.ogg'), 100, 0), + FOOTSTEP_CATWALK = list(list( + 'sound/effects/footstep/catwalk1.ogg', + 'sound/effects/footstep/catwalk2.ogg', + 'sound/effects/footstep/catwalk3.ogg', + 'sound/effects/footstep/catwalk4.ogg', + 'sound/effects/footstep/catwalk5.ogg'), 100, 1), +)) + +//bare footsteps lists +GLOBAL_LIST_INIT(barefootstep, list( + FOOTSTEP_WOOD_BAREFOOT = list(list( + 'sound/effects/footstep/woodbarefoot1.ogg', + 'sound/effects/footstep/woodbarefoot2.ogg', + 'sound/effects/footstep/woodbarefoot3.ogg', + 'sound/effects/footstep/woodbarefoot4.ogg', + 'sound/effects/footstep/woodbarefoot5.ogg'), 80, -1), + FOOTSTEP_HARD_BAREFOOT = list(list( + 'sound/effects/footstep/hardbarefoot1.ogg', + 'sound/effects/footstep/hardbarefoot2.ogg', + 'sound/effects/footstep/hardbarefoot3.ogg', + 'sound/effects/footstep/hardbarefoot4.ogg', + 'sound/effects/footstep/hardbarefoot5.ogg'), 80, -1), + FOOTSTEP_CARPET_BAREFOOT = list(list( + 'sound/effects/footstep/carpetbarefoot1.ogg', + 'sound/effects/footstep/carpetbarefoot2.ogg', + 'sound/effects/footstep/carpetbarefoot3.ogg', + 'sound/effects/footstep/carpetbarefoot4.ogg', + 'sound/effects/footstep/carpetbarefoot5.ogg'), 75, -1), + FOOTSTEP_SAND = list(list( + 'sound/effects/footstep/asteroid1.ogg', + 'sound/effects/footstep/asteroid2.ogg', + 'sound/effects/footstep/asteroid3.ogg', + 'sound/effects/footstep/asteroid4.ogg', + 'sound/effects/footstep/asteroid5.ogg'), 75, 0), + FOOTSTEP_GRASS = list(list( + 'sound/effects/footstep/grass1.ogg', + 'sound/effects/footstep/grass2.ogg', + 'sound/effects/footstep/grass3.ogg', + 'sound/effects/footstep/grass4.ogg'), 75, 0), + FOOTSTEP_WATER = list(list( + 'sound/effects/footstep/water1.ogg', + 'sound/effects/footstep/water2.ogg', + 'sound/effects/footstep/water3.ogg', + 'sound/effects/footstep/water4.ogg'), 100, 1), + FOOTSTEP_LAVA = list(list( + 'sound/effects/footstep/lava1.ogg', + 'sound/effects/footstep/lava2.ogg', + 'sound/effects/footstep/lava3.ogg'), 100, 0), + FOOTSTEP_MEAT = list(list( + 'sound/effects/meatslap.ogg'), 100, 0), +)) + +//claw footsteps lists +GLOBAL_LIST_INIT(clawfootstep, list( + FOOTSTEP_WOOD_BAREFOOT = list(list( + 'sound/effects/footstep/woodclaw1.ogg', + 'sound/effects/footstep/woodclaw2.ogg', + 'sound/effects/footstep/woodclaw3.ogg', + 'sound/effects/footstep/woodclaw2.ogg', + 'sound/effects/footstep/woodclaw1.ogg'), 90, 1), + FOOTSTEP_HARD_BAREFOOT = list(list( + 'sound/effects/footstep/hardclaw1.ogg', + 'sound/effects/footstep/hardclaw2.ogg', + 'sound/effects/footstep/hardclaw3.ogg', + 'sound/effects/footstep/hardclaw4.ogg', + 'sound/effects/footstep/hardclaw1.ogg'), 90, 1), + FOOTSTEP_CARPET_BAREFOOT = list(list( + 'sound/effects/footstep/carpetbarefoot1.ogg', + 'sound/effects/footstep/carpetbarefoot2.ogg', + 'sound/effects/footstep/carpetbarefoot3.ogg', + 'sound/effects/footstep/carpetbarefoot4.ogg', + 'sound/effects/footstep/carpetbarefoot5.ogg'), 75, -2), + FOOTSTEP_SAND = list(list( + 'sound/effects/footstep/asteroid1.ogg', + 'sound/effects/footstep/asteroid2.ogg', + 'sound/effects/footstep/asteroid3.ogg', + 'sound/effects/footstep/asteroid4.ogg', + 'sound/effects/footstep/asteroid5.ogg'), 75, 0), + FOOTSTEP_GRASS = list(list( + 'sound/effects/footstep/grass1.ogg', + 'sound/effects/footstep/grass2.ogg', + 'sound/effects/footstep/grass3.ogg', + 'sound/effects/footstep/grass4.ogg'), 75, 0), + FOOTSTEP_WATER = list(list( + 'sound/effects/footstep/water1.ogg', + 'sound/effects/footstep/water2.ogg', + 'sound/effects/footstep/water3.ogg', + 'sound/effects/footstep/water4.ogg'), 100, 1), + FOOTSTEP_LAVA = list(list( + 'sound/effects/footstep/lava1.ogg', + 'sound/effects/footstep/lava2.ogg', + 'sound/effects/footstep/lava3.ogg'), 100, 0), + FOOTSTEP_MEAT = list(list( + 'sound/effects/meatslap.ogg'), 100, 0), +)) + +//light claw footsteps list +GLOBAL_LIST_INIT(lightclawfootstep, list( + FOOTSTEP_WOOD_BAREFOOT = list(list( + 'sound/effects/footstep/BudgieStep1.ogg', + 'sound/effects/footstep/BudgieStep2.ogg', + 'sound/effects/footstep/BudgieStep3.ogg', + 'sound/effects/footstep/BudgieStep4.ogg', + 'sound/effects/footstep/BudgieStep5.ogg', + 'sound/effects/footstep/BudgieStep6.ogg'), 90, 1), + FOOTSTEP_HARD_BAREFOOT = list(list( + 'sound/effects/footstep/BudgieStep1.ogg', + 'sound/effects/footstep/BudgieStep2.ogg', + 'sound/effects/footstep/BudgieStep3.ogg', + 'sound/effects/footstep/BudgieStep4.ogg', + 'sound/effects/footstep/BudgieStep5.ogg', + 'sound/effects/footstep/BudgieStep6.ogg'), 90, 1), + FOOTSTEP_CARPET_BAREFOOT = list(list( + 'sound/effects/footstep/asteroid1.ogg', + 'sound/effects/footstep/asteroid2.ogg', + 'sound/effects/footstep/asteroid3.ogg', + 'sound/effects/footstep/asteroid4.ogg', + 'sound/effects/footstep/asteroid5.ogg'), 75, -2), + FOOTSTEP_GRASS = list(list( + 'sound/effects/footstep/grass1.ogg', + 'sound/effects/footstep/grass2.ogg', + 'sound/effects/footstep/grass3.ogg', + 'sound/effects/footstep/grass4.ogg'), 75, 0), + FOOTSTEP_WATER = list(list( + 'sound/effects/footstep/water1.ogg', + 'sound/effects/footstep/water2.ogg', + 'sound/effects/footstep/water3.ogg', + 'sound/effects/footstep/water4.ogg'), 100, 1), + FOOTSTEP_LAVA = list(list( + 'sound/effects/footstep/lava1.ogg', + 'sound/effects/footstep/lava2.ogg', + 'sound/effects/footstep/lava3.ogg'), 100, 0), + FOOTSTEP_MEAT = list(list( + 'sound/effects/meatslap.ogg'), 100, 0), +)) + +//heavy footsteps list +GLOBAL_LIST_INIT(heavyfootstep, list( + FOOTSTEP_GENERIC_HEAVY = list(list( + 'sound/effects/footstep/heavy1.ogg', + 'sound/effects/footstep/heavy2.ogg'), 100, 2), + FOOTSTEP_WATER = list(list( + 'sound/effects/footstep/water1.ogg', + 'sound/effects/footstep/water2.ogg', + 'sound/effects/footstep/water3.ogg', + 'sound/effects/footstep/water4.ogg'), 100, 2), + FOOTSTEP_LAVA = list(list( + 'sound/effects/footstep/lava1.ogg', + 'sound/effects/footstep/lava2.ogg', + 'sound/effects/footstep/lava3.ogg'), 100, 0), + FOOTSTEP_MEAT = list(list( + 'sound/effects/meatslap.ogg'), 100, 0), +)) diff --git a/code/__defines/slosh.dm b/code/__defines/slosh.dm new file mode 100644 index 0000000000..b501f8ffe2 --- /dev/null +++ b/code/__defines/slosh.dm @@ -0,0 +1,11 @@ +GLOBAL_LIST_INIT(slosh, list( + 'sound/vore/walkslosh2.ogg', + 'sound/vore/walkslosh3.ogg', + 'sound/vore/walkslosh4.ogg', + 'sound/vore/walkslosh5.ogg', + 'sound/vore/walkslosh6.ogg', + 'sound/vore/walkslosh7.ogg', + 'sound/vore/walkslosh8.ogg', + 'sound/vore/walkslosh9.ogg', + 'sound/vore/walkslosh10.ogg' +)) diff --git a/code/__defines/traits.dm b/code/__defines/traits.dm index 994f1a3247..4a3fa947c7 100644 --- a/code/__defines/traits.dm +++ b/code/__defines/traits.dm @@ -1,2 +1,213 @@ +/* +Remember to update _globalvars/traits.dm if you're adding/removing/renaming traits. +*/ + +/* +//mob traits +#define TRAIT_BLIND "blind" +*/ +#define TRAIT_MUTE "mute" +/* +#define TRAIT_EMOTEMUTE "emotemute" +#define TRAIT_DEAF "deaf" +#define TRAIT_NEARSIGHT "nearsighted" +#define TRAIT_FAT "fat" +#define TRAIT_HUSK "husk" +#define TRAIT_BADDNA "baddna" +#define TRAIT_CLUMSY "clumsy" +#define TRAIT_CHUNKYFINGERS "chunkyfingers" //means that you can't use weapons with normal trigger guards. +#define TRAIT_DUMB "dumb" +#define TRAIT_MONKEYLIKE "monkeylike" //sets IsAdvancedToolUser to FALSE +#define TRAIT_PACIFISM "pacifism" +#define TRAIT_IGNORESLOWDOWN "ignoreslow" +#define TRAIT_IGNOREDAMAGESLOWDOWN "ignoredamageslowdown" +#define TRAIT_DEATHCOMA "deathcoma" //Causes death-like unconsciousness +#define TRAIT_FAKEDEATH "fakedeath" //Makes the owner appear as dead to most forms of medical examination +#define TRAIT_DISFIGURED "disfigured" +*/ +#define TRAIT_XENO_HOST "xeno_host" //Tracks whether we're gonna be a baby alien's mummy. +#define TRAIT_MIMING "miming" //Tracks whether you're a mime or not. +/* +#define TRAIT_STUNIMMUNE "stun_immunity" +#define TRAIT_STUNRESISTANCE "stun_resistance" +#define TRAIT_SLEEPIMMUNE "sleep_immunity" +#define TRAIT_PUSHIMMUNE "push_immunity" +#define TRAIT_SHOCKIMMUNE "shock_immunity" +#define TRAIT_STABLEHEART "stable_heart" +#define TRAIT_STABLELIVER "stable_liver" +#define TRAIT_RESISTHEAT "resist_heat" +#define TRAIT_RESISTHEATHANDS "resist_heat_handsonly" //For when you want to be able to touch hot things, but still want fire to be an issue. +#define TRAIT_RESISTCOLD "resist_cold" +#define TRAIT_RESISTHIGHPRESSURE "resist_high_pressure" +#define TRAIT_RESISTLOWPRESSURE "resist_low_pressure" +#define TRAIT_RADIMMUNE "rad_immunity" +#define TRAIT_VIRUSIMMUNE "virus_immunity" +#define TRAIT_PIERCEIMMUNE "pierce_immunity" +#define TRAIT_NODISMEMBER "dismember_immunity" +#define TRAIT_NOFIRE "nonflammable" +#define TRAIT_NOGUNS "no_guns" +#define TRAIT_NOHUNGER "no_hunger" +#define TRAIT_NOMETABOLISM "no_metabolism" +#define TRAIT_TOXIMMUNE "toxin_immune" +#define TRAIT_EASYDISMEMBER "easy_dismember" +#define TRAIT_LIMBATTACHMENT "limb_attach" +#define TRAIT_NOLIMBDISABLE "no_limb_disable" +#define TRAIT_EASYLIMBDISABLE "easy_limb_disable" +#define TRAIT_TOXINLOVER "toxinlover" +#define TRAIT_NOBREATH "no_breath" +*/ +#define TRAIT_ANTIMAGIC "anti_magic" +#define TRAIT_HOLY "holy" +/* +#define TRAIT_DEPRESSION "depression" +#define TRAIT_JOLLY "jolly" +#define TRAIT_NOCRITDAMAGE "no_crit" +#define TRAIT_NOSLIPWATER "noslip_water" +#define TRAIT_NOSLIPALL "noslip_all" +#define TRAIT_NODEATH "nodeath" +#define TRAIT_NOHARDCRIT "nohardcrit" +#define TRAIT_NOSOFTCRIT "nosoftcrit" +#define TRAIT_MINDSHIELD "mindshield" +#define TRAIT_DISSECTED "dissected" +#define TRAIT_SIXTHSENSE "sixth_sense" //I can hear dead people +#define TRAIT_FEARLESS "fearless" +#define TRAIT_PARALYSIS_L_ARM "para-l-arm" //These are used for brain-based paralysis, where replacing the limb won't fix it +#define TRAIT_PARALYSIS_R_ARM "para-r-arm" +#define TRAIT_PARALYSIS_L_LEG "para-l-leg" +#define TRAIT_PARALYSIS_R_LEG "para-r-leg" +#define TRAIT_CANNOT_OPEN_PRESENTS "cannot-open-presents" +#define TRAIT_PRESENT_VISION "present-vision" +#define TRAIT_DISK_VERIFIER "disk-verifier" +#define TRAIT_NOMOBSWAP "no-mob-swap" +#define TRAIT_XRAY_VISION "xray_vision" +#define TRAIT_THERMAL_VISION "thermal_vision" +#define TRAIT_ABDUCTOR_TRAINING "abductor-training" +#define TRAIT_ABDUCTOR_SCIENTIST_TRAINING "abductor-scientist-training" +#define TRAIT_SURGEON "surgeon" +#define TRAIT_STRONG_GRABBER "strong_grabber" +#define TRAIT_MAGIC_CHOKE "magic_choke" +#define TRAIT_SOOTHED_THROAT "soothed-throat" +#define TRAIT_LAW_ENFORCEMENT_METABOLISM "law-enforcement-metabolism" +#define TRAIT_ALWAYS_CLEAN "always-clean" +#define TRAIT_BOOZE_SLIDER "booze-slider" +#define TRAIT_UNINTELLIGIBLE_SPEECH "unintelligible-speech" +#define TRAIT_UNSTABLE "unstable" +#define TRAIT_OIL_FRIED "oil_fried" +#define TRAIT_MEDICAL_HUD "med_hud" +#define TRAIT_SECURITY_HUD "sec_hud" +#define TRAIT_MEDIBOTCOMINGTHROUGH "medibot" //Is a medibot healing you +#define TRAIT_PASSTABLE "passtable" + +//non-mob traits +#define TRAIT_PARALYSIS "paralysis" //Used for limb-based paralysis, where replacing the limb will fix it + +// item traits +*/ +#define TRAIT_NODROP "nodrop" +#define TRAIT_DISRUPTED "disrupted" +/* +#define TRAIT_T_RAY_VISIBLE "t-ray-visible" // Visible on t-ray scanners if the atom/var/level == 1 +#define TRAIT_NO_TELEPORT "no-teleport" //you just can't + +//quirk traits +#define TRAIT_ALCOHOL_TOLERANCE "alcohol_tolerance" +#define TRAIT_AGEUSIA "ageusia" +#define TRAIT_HEAVY_SLEEPER "heavy_sleeper" +#define TRAIT_NIGHT_VISION "night_vision" +#define TRAIT_LIGHT_STEP "light_step" +#define TRAIT_SPIRITUAL "spiritual" +#define TRAIT_VORACIOUS "voracious" +#define TRAIT_SELF_AWARE "self_aware" +#define TRAIT_FREERUNNING "freerunning" +#define TRAIT_SKITTISH "skittish" +#define TRAIT_POOR_AIM "poor_aim" +#define TRAIT_PROSOPAGNOSIA "prosopagnosia" +#define TRAIT_DRUNK_HEALING "drunk_healing" +#define TRAIT_TAGGER "tagger" +#define TRAIT_PHOTOGRAPHER "photographer" +#define TRAIT_MUSICIAN "musician" +#define TRAIT_LIGHT_DRINKER "light_drinker" +#define TRAIT_EMPATH "empath" +#define TRAIT_FRIENDLY "friendly" +#define TRAIT_GRABWEAKNESS "grab_weakness" + +// common trait sources +#define TRAIT_GENERIC "generic" +#define EYE_DAMAGE "eye_damage" +#define GENETIC_MUTATION "genetic" +#define OBESITY "obesity" +*/ +#define MAGIC_TRAIT "magic" +/* +#define TRAUMA_TRAIT "trauma" +#define DISEASE_TRAIT "disease" +#define SPECIES_TRAIT "species" +#define ORGAN_TRAIT "organ" +*/ +#define ROUNDSTART_TRAIT "roundstart" //cannot be removed without admin intervention +#define JOB_TRAIT "job" +#define TRAIT_MIME "mime" //Mime trait. +/* +#define CYBORG_ITEM_TRAIT "cyborg-item" +*/ +#define ADMIN_TRAIT "admin" // (B)admins only. +/* +#define CHANGELING_TRAIT "changeling" +#define CULT_TRAIT "cult" +#define CURSED_ITEM_TRAIT "cursed-item" // The item is magically cursed +#define ABSTRACT_ITEM_TRAIT "abstract-item" +#define STATUS_EFFECT_TRAIT "status-effect" +*/ +#define CLOTHING_TRAIT "clothing" +/* +#define GLASSES_TRAIT "glasses" +#define VEHICLE_TRAIT "vehicle" // inherited from riding vehicles +#define INNATE_TRAIT "innate" + +// unique trait sources, still defines +#define CLONING_POD_TRAIT "cloning-pod" +#define STATUE_MUTE "statue" +#define CHANGELING_DRAIN "drain" +#define CHANGELING_HIVEMIND_MUTE "ling_mute" +#define ABYSSAL_GAZE_BLIND "abyssal_gaze" +#define HIGHLANDER "highlander" +#define TRAIT_HULK "hulk" +#define STASIS_MUTE "stasis" +#define GENETICS_SPELL "genetics_spell" +#define EYES_COVERED "eyes_covered" +#define CULT_EYES "cult_eyes" +#define TRAIT_SANTA "santa" +#define SCRYING_ORB "scrying-orb" +#define ABDUCTOR_ANTAGONIST "abductor-antagonist" +#define NUKEOP_TRAIT "nuke-op" +#define DEATHSQUAD_TRAIT "deathsquad" +#define MEGAFAUNA_TRAIT "megafauna" +#define CLOWN_NUKE_TRAIT "clown-nuke" +#define STICKY_MOUSTACHE_TRAIT "sticky-moustache" +#define CHAINSAW_FRENZY_TRAIT "chainsaw-frenzy" +#define CHRONO_GUN_TRAIT "chrono-gun" +#define REVERSE_BEAR_TRAP_TRAIT "reverse-bear-trap" +#define CURSED_MASK_TRAIT "cursed-mask" +#define HIS_GRACE_TRAIT "his-grace" +*/ +#define HAND_REPLACEMENT_TRAIT "magic-hand" +/* +#define HOT_POTATO_TRAIT "hot-potato" +#define SABRE_SUICIDE_TRAIT "sabre-suicide" +#define ABDUCTOR_VEST_TRAIT "abductor-vest" +#define CAPTURE_THE_FLAG_TRAIT "capture-the-flag" +#define EYE_OF_GOD_TRAIT "eye-of-god" +#define SHAMEBRERO_TRAIT "shamebrero" +#define CHRONOSUIT_TRAIT "chronosuit" +#define LOCKED_HELMET_TRAIT "locked-helmet" +#define NINJA_SUIT_TRAIT "ninja-suit" +#define ANTI_DROP_IMPLANT_TRAIT "anti-drop-implant" +#define VR_ZONE_TRAIT "vr_zone_trait" +#define SLEEPING_CARP_TRAIT "sleeping_carp" +#define SANGUIOSE_TRAIT "sanguiose" +#define FROGENITE_TRAIT "frogenite" +#define FERVEATIUM_TRAIT "ferveatium" +*/ + #define ORGANICS 1 #define SYNTHETICS 2 diff --git a/code/__defines/traits/_traits.dm b/code/__defines/traits/_traits.dm index 46fef90160..3258db96f2 100644 --- a/code/__defines/traits/_traits.dm +++ b/code/__defines/traits/_traits.dm @@ -5,118 +5,59 @@ #define ADD_TRAIT(target, trait, source) \ do { \ var/list/_L; \ - if (!target._status_traits) { \ - target._status_traits = list(); \ - _L = target._status_traits; \ + if (!target.status_traits) { \ + target.status_traits = list(); \ + _L = target.status_traits; \ _L[trait] = list(source); \ - SEND_SIGNAL(target, SIGNAL_ADDTRAIT(trait), trait); \ } else { \ - _L = target._status_traits; \ + _L = target.status_traits; \ if (_L[trait]) { \ _L[trait] |= list(source); \ } else { \ _L[trait] = list(source); \ - SEND_SIGNAL(target, SIGNAL_ADDTRAIT(trait), trait); \ } \ } \ } while (0) #define REMOVE_TRAIT(target, trait, sources) \ do { \ - var/list/_L = target._status_traits; \ + var/list/_L = target.status_traits; \ var/list/_S; \ if (sources && !islist(sources)) { \ _S = list(sources); \ } else { \ _S = sources\ }; \ - if (_L?[trait]) { \ + if (_L && _L[trait]) { \ for (var/_T in _L[trait]) { \ if ((!_S && (_T != ROUNDSTART_TRAIT)) || (_T in _S)) { \ _L[trait] -= _T \ } \ };\ if (!length(_L[trait])) { \ - _L -= trait; \ - SEND_SIGNAL(target, SIGNAL_REMOVETRAIT(trait), trait); \ + _L -= trait \ }; \ if (!length(_L)) { \ - target._status_traits = null \ - }; \ - } \ - } while (0) -#define REMOVE_TRAIT_NOT_FROM(target, trait, sources) \ - do { \ - var/list/_traits_list = target._status_traits; \ - var/list/_sources_list; \ - if (sources && !islist(sources)) { \ - _sources_list = list(sources); \ - } else { \ - _sources_list = sources\ - }; \ - if (_traits_list?[trait]) { \ - for (var/_trait_source in _traits_list[trait]) { \ - if (!(_trait_source in _sources_list)) { \ - _traits_list[trait] -= _trait_source \ - } \ - };\ - if (!length(_traits_list[trait])) { \ - _traits_list -= trait; \ - SEND_SIGNAL(target, SIGNAL_REMOVETRAIT(trait), trait); \ - }; \ - if (!length(_traits_list)) { \ - target._status_traits = null \ + target.status_traits = null \ }; \ } \ } while (0) #define REMOVE_TRAITS_NOT_IN(target, sources) \ do { \ - var/list/_L = target._status_traits; \ + var/list/_L = target.status_traits; \ var/list/_S = sources; \ if (_L) { \ for (var/_T in _L) { \ _L[_T] &= _S;\ if (!length(_L[_T])) { \ - _L -= _T; \ - SEND_SIGNAL(target, SIGNAL_REMOVETRAIT(_T), _T); \ - }; \ + _L -= _T } \ + };\ + if (!length(_L)) { \ + target.status_traits = null\ };\ - if (!length(_L)) { \ - target._status_traits = null\ - };\ }\ } while (0) -#define REMOVE_TRAITS_IN(target, sources) \ - do { \ - var/list/_L = target._status_traits; \ - var/list/_S = sources; \ - if (sources && !islist(sources)) { \ - _S = list(sources); \ - } else { \ - _S = sources\ - }; \ - if (_L) { \ - for (var/_T in _L) { \ - _L[_T] -= _S;\ - if (!length(_L[_T])) { \ - _L -= _T; \ - SEND_SIGNAL(target, SIGNAL_REMOVETRAIT(_T)); \ - }; \ - };\ - if (!length(_L)) { \ - target._status_traits = null\ - };\ - }\ - } while (0) - -#define HAS_TRAIT(target, trait) (target._status_traits?[trait] ? TRUE : FALSE) -#define HAS_TRAIT_FROM(target, trait, source) (HAS_TRAIT(target, trait) && (source in target._status_traits[trait])) -#define HAS_TRAIT_FROM_ONLY(target, trait, source) (HAS_TRAIT(target, trait) && (source in target._status_traits[trait]) && (length(target._status_traits[trait]) == 1)) -#define HAS_TRAIT_NOT_FROM(target, trait, source) (HAS_TRAIT(target, trait) && (length(target._status_traits[trait] - source) > 0)) -/// Returns a list of trait sources for this trait. Only useful for wacko cases and internal futzing -/// You should not be using this -#define GET_TRAIT_SOURCES(target, trait) (target._status_traits?[trait] || list()) -/// Returns the amount of sources for a trait. useful if you don't want to have a "thing counter" stuck around all the time -#define COUNT_TRAIT_SOURCES(target, trait) length(GET_TRAIT_SOURCES(target, trait)) -/// A simple helper for checking traits in a mob's mind -#define HAS_MIND_TRAIT(target, trait) (HAS_TRAIT(target, trait) || (target.mind ? HAS_TRAIT(target.mind, trait) : FALSE)) +#define HAS_TRAIT(target, trait) (target.status_traits ? (target.status_traits[trait] ? TRUE : FALSE) : FALSE) +#define HAS_TRAIT_FROM(target, trait, source) (target.status_traits ? (target.status_traits[trait] ? (source in target.status_traits[trait]) : FALSE) : FALSE) +#define HAS_TRAIT_FROM_ONLY(target, trait, source) (HAS_TRAIT(target, trait) && (source in target.status_traits[trait]) && (length(target.status_traits[trait]) == 1)) +#define HAS_TRAIT_NOT_FROM(target, trait, source) (HAS_TRAIT(target, trait) && (length(target.status_traits[trait] - source) > 0)) diff --git a/code/__defines/traits/sources.dm b/code/__defines/traits/sources.dm index 9e282a693d..ff5bb187cc 100644 --- a/code/__defines/traits/sources.dm +++ b/code/__defines/traits/sources.dm @@ -2,6 +2,6 @@ // Several things such as `type` or `REF(src)` may be used in the ADD_TRAIT() macro as the "source", but this file contains all of the defines for immutable static strings. /// cannot be removed without admin intervention -#define ROUNDSTART_TRAIT "roundstart" +// #define ROUNDSTART_TRAIT "roundstart" /// This trait comes from when a mob is currently typing. #define CURRENTLY_TYPING_TRAIT "currently_typing" diff --git a/code/_helpers/global_lists.dm b/code/_helpers/global_lists.dm index a687776f88..a0c910a089 100644 --- a/code/_helpers/global_lists.dm +++ b/code/_helpers/global_lists.dm @@ -358,3 +358,10 @@ GLOBAL_LIST_EMPTY(legacy_globals) GLOB.legacy_globals["cameranet"] = cameranet GLOB.legacy_globals["cultnet"] = cultnet GLOB.legacy_globals["existing_solargrubs"] = existing_solargrubs + +var/global/list/selectable_footstep = list( + "Default" = FOOTSTEP_MOB_HUMAN, + "Claw" = FOOTSTEP_MOB_CLAW, + "Light Claw" = FOOTSTEP_MOB_TESHARI, + "Slither" = FOOTSTEP_MOB_SLITHER, +) diff --git a/code/_helpers/sorts/comparators.dm b/code/_helpers/sorts/comparators.dm index 2f1b69191c..01127df1d4 100644 --- a/code/_helpers/sorts/comparators.dm +++ b/code/_helpers/sorts/comparators.dm @@ -58,8 +58,8 @@ . = B[STAT_ENTRY_COUNT] - A[STAT_ENTRY_COUNT] /proc/cmp_typepaths_asc(A, B) - return sorttext("[B]","[A]") - + return sorttext("[B]","[A]") + /** * Sorts crafting recipe requirements before the crafting recipe is inserted into GLOB.crafting_recipes * @@ -83,7 +83,7 @@ /proc/cmp_media_track_asc(datum/track/A, datum/track/B) var/genre_sort = sorttext(B.genre || "Uncategorized", A.genre || "Uncategorized") return genre_sort || sorttext(B.title, A.title) - + ///Filters have a numerical priority. /proc/cmp_filter_data_priority(list/A, list/B) return A["priority"] - B["priority"] @@ -97,4 +97,18 @@ return A.sort_hint == B.sort_hint ? sorttext("[B.name]","[A.name]") : A.sort_hint - B.sort_hint /proc/cmp_stored_item_name(datum/stored_item/A, datum/stored_item/B) - return sorttext(B.item_name, A.item_name) \ No newline at end of file + return sorttext(B.item_name, A.item_name) + +/proc/cmp_embed_text_asc(a,b) + if(isdatum(a)) + a = REF(a) + if(isdatum(b)) + b = REF(b) + return sorttext("[b]", "[a]") + +/proc/cmp_embed_text_dsc(a,b) + if(isdatum(a)) + a = REF(a) + if(isdatum(b)) + b = REF(b) + return sorttext("[a]", "[b]") diff --git a/code/_onclick/hud/action/action_item_overlay.dm b/code/_onclick/hud/action/action_item_overlay.dm index 7d1af7309e..99931ff3e7 100644 --- a/code/_onclick/hud/action/action_item_overlay.dm +++ b/code/_onclick/hud/action/action_item_overlay.dm @@ -22,7 +22,7 @@ src.item_ref = WEAKREF(item) src.item_callback = item_callback -/datum/component/action_item_overlay/Destroy(force, silent) +/datum/component/action_item_overlay/Destroy(force) item_ref = null QDEL_NULL(item_callback) item_appearance = null diff --git a/code/controllers/subsystems/dcs.dm b/code/controllers/subsystems/dcs.dm index 104c3eef31..6cd377329c 100644 --- a/code/controllers/subsystems/dcs.dm +++ b/code/controllers/subsystems/dcs.dm @@ -5,10 +5,34 @@ PROCESSING_SUBSYSTEM_DEF(dcs) var/list/elements_by_type = list() -/datum/controller/subsystem/processing/dcs/Recover() - comp_lookup = SSdcs.comp_lookup + /** + * A nested assoc list of bespoke element types (keys) and superlists containing all lists used as arguments (values). + * Inside the superlists, lists that've been sorted alphabetically are keys, while the original unsorted lists are values. + * + * e.g. list( + * /datum/element/first = list(list(A, B, C) = list(B, A, C), list(A, B) = list(A, B)), + * /datum/element/second = list(list(B, C) = list(C, B), list(D) = list(D)), + * ) + * + * Used by the dcs_check_list_arguments unit test. + */ + var/list/arguments_that_are_lists_by_element = list() + /** + * An assoc list of list instances and their sorted counterparts. + * + * e.g. list( + * list(B, A, C) = list(A, B, C), + * list(C, B) = list(B, C), + * ) + * + * Used to make sure each list instance is sorted no more than once, or the unit test won't work. + */ + var/list/sorted_arguments_that_are_lists = list() -/datum/controller/subsystem/processing/dcs/proc/GetElement(list/arguments) +/datum/controller/subsystem/processing/dcs/Recover() + _listen_lookup = SSdcs._listen_lookup + +/datum/controller/subsystem/processing/dcs/proc/GetElement(list/arguments, init_element = TRUE) var/datum/element/eletype = arguments[1] var/element_id = eletype @@ -16,10 +40,10 @@ PROCESSING_SUBSYSTEM_DEF(dcs) CRASH("Attempted to instantiate [eletype] as a /datum/element") if(initial(eletype.element_flags) & ELEMENT_BESPOKE) - element_id = GetIdFromArguments(arguments) + element_id = length(arguments) == 1 ? "[arguments[1]]" : GetIdFromArguments(arguments) . = elements_by_type[element_id] - if(.) + if(. || !init_element) return . = elements_by_type[element_id] = new eletype @@ -31,24 +55,55 @@ PROCESSING_SUBSYSTEM_DEF(dcs) **/ /datum/controller/subsystem/processing/dcs/proc/GetIdFromArguments(list/arguments) var/datum/element/eletype = arguments[1] - var/list/fullid = list("[eletype]") - var/list/named_arguments = list() - for(var/i in initial(eletype.id_arg_index) to length(arguments)) + var/list/fullid = list(eletype) + var/list/named_arguments + for(var/i in initial(eletype.argument_hash_start_idx) to length(arguments)) var/key = arguments[i] - var/value - if(istext(key)) - value = arguments[key] - if(!(istext(key) || isnum(key))) - key = REF(key) - key = "[key]" // Key is stringified so numbers dont break things - if(!isnull(value)) - if(!(istext(value) || isnum(value))) - value = REF(value) - named_arguments["[key]"] = value - else - fullid += "[key]" - if(length(named_arguments)) - named_arguments = sortList(named_arguments) + if(istext(key)) + var/value = arguments[key] + if (isnull(value)) + fullid += key + else + if (!istext(value) && !isnum(value)) + //if(PERFORM_ALL_TESTS(dcs_check_list_arguments) && islist(value)) // Unit test stuff we dont have + //add_to_arguments_that_are_lists(value, eletype) // Unit test stuff we dont have + value = REF(value) + + if (!named_arguments) + named_arguments = list() + + named_arguments[key] = value + continue + + if (isnum(key)) + fullid += key + else + //if(PERFORM_ALL_TESTS(dcs_check_list_arguments) && islist(key)) // Unit test stuff we dont have + //add_to_arguments_that_are_lists(key, eletype) // Unit test stuff we dont have + fullid += REF(key) + + if(named_arguments) + named_arguments = sortTim(named_arguments, GLOBAL_PROC_REF(cmp_text_asc)) fullid += named_arguments + return list2params(fullid) + +/** + * Offloading the first half of the dcs_check_list_arguments here, which is populating the superlist + * with sublists that will be later compared with each other by the dcs_check_list_arguments unit test. + */ +/datum/controller/subsystem/processing/dcs/proc/add_to_arguments_that_are_lists(list/argument, datum/element/element_type) + if(initial(element_type.element_flags) & ELEMENT_NO_LIST_UNIT_TEST) + return + var/list/element_type_superlist = arguments_that_are_lists_by_element[element_type] + if(!element_type_superlist) + arguments_that_are_lists_by_element[element_type] = element_type_superlist = list() + + var/list/sorted_argument = argument + if(!(initial(element_type.element_flags) & ELEMENT_DONT_SORT_LIST_ARGS)) + sorted_argument = sorted_arguments_that_are_lists[argument] + if(!sorted_argument) + sorted_arguments_that_are_lists[argument] = sorted_argument = sortTim(argument.Copy(), GLOBAL_PROC_REF(cmp_embed_text_asc)) + + element_type_superlist[sorted_argument] = argument diff --git a/code/controllers/subsystems/tgui.dm b/code/controllers/subsystems/tgui.dm index 9f0baf12e6..65cdd51407 100644 --- a/code/controllers/subsystems/tgui.dm +++ b/code/controllers/subsystems/tgui.dm @@ -171,9 +171,9 @@ SUBSYSTEM_DEF(tgui) */ /datum/controller/subsystem/tgui/proc/get_open_ui(mob/user, datum/src_object) // No UIs opened for this src_object - if(!LAZYLEN(src_object?.open_uis)) + if(!LAZYLEN(src_object?.open_tguis)) return null - for(var/datum/tgui/ui in src_object.open_uis) + for(var/datum/tgui/ui in src_object.open_tguis) // Make sure we have the right user if(ui.user == user) return ui @@ -190,10 +190,10 @@ SUBSYSTEM_DEF(tgui) */ /datum/controller/subsystem/tgui/proc/update_uis(datum/src_object) // No UIs opened for this src_object - if(!LAZYLEN(src_object?.open_uis)) + if(!LAZYLEN(src_object?.open_tguis)) return 0 var/count = 0 - for(var/datum/tgui/ui in src_object.open_uis) + for(var/datum/tgui/ui in src_object.open_tguis) // Check if UI is valid. if(ui?.src_object && ui.user && ui.src_object.tgui_host(ui.user)) INVOKE_ASYNC(ui, TYPE_PROC_REF(/datum/tgui, process), wait * 0.1, TRUE) @@ -211,10 +211,10 @@ SUBSYSTEM_DEF(tgui) */ /datum/controller/subsystem/tgui/proc/close_uis(datum/src_object) // No UIs opened for this src_object - if(!LAZYLEN(src_object?.open_uis)) + if(!LAZYLEN(src_object?.open_tguis)) return 0 var/count = 0 - for(var/datum/tgui/ui in src_object.open_uis) + for(var/datum/tgui/ui in src_object.open_tguis) // Check if UI is valid. if(ui?.src_object && ui.user && ui.src_object.tgui_host(ui.user)) ui.close() @@ -286,7 +286,7 @@ SUBSYSTEM_DEF(tgui) */ /datum/controller/subsystem/tgui/proc/on_open(datum/tgui/ui) ui.user?.tgui_open_uis |= ui - LAZYOR(ui.src_object.open_uis, ui) + LAZYOR(ui.src_object.open_tguis, ui) all_uis |= ui /** @@ -306,7 +306,7 @@ SUBSYSTEM_DEF(tgui) if(ui.user) ui.user.tgui_open_uis -= ui if(ui.src_object) - LAZYREMOVE(ui.src_object.open_uis, ui) + LAZYREMOVE(ui.src_object.open_tguis, ui) return TRUE /** diff --git a/code/datums/components/COMPONENT_TEMPLATE.md b/code/datums/components/COMPONENT_TEMPLATE.md new file mode 100644 index 0000000000..7b08205888 --- /dev/null +++ b/code/datums/components/COMPONENT_TEMPLATE.md @@ -0,0 +1,55 @@ + +# Template file for your new component + +See _component.dm for detailed explanations + +```dm +/datum/component/mycomponent + //can_transfer = TRUE // Must have PostTransfer + //dupe_mode = COMPONENT_DUPE_ALLOWED // code/__DEFINES/dcs/flags.dm + var/myvar + +/datum/component/mycomponent/Initialize(myargone, myargtwo) + if(myargone) + myvar = myargone + if(myargtwo) + send_to_playing_players(myargtwo) + +/datum/component/mycomponent/RegisterWithParent() + RegisterSignal(parent, COMSIG_NOT_REAL, PROC_REF(signalproc)) // RegisterSignal can take a signal name by itself, + RegisterSignal(parent, list(COMSIG_NOT_REAL_EITHER, COMSIG_ALMOST_REAL), PROC_REF(otherproc)) // or a list of them to assign to the same proc + +/datum/component/mycomponent/UnregisterFromParent() + UnregisterSignal(parent, COMSIG_NOT_REAL) // UnregisterSignal has similar behavior + UnregisterSignal(parent, list( // But you can just include all registered signals in one call + COMSIG_NOT_REAL, + COMSIG_NOT_REAL_EITHER, + COMSIG_ALMOST_REAL, + )) + +/datum/component/mycomponent/proc/signalproc(datum/source) + SIGNAL_HANDLER + send_to_playing_players("[source] signaled [src]!") + +/* +/datum/component/mycomponent/InheritComponent(datum/component/mycomponent/old, i_am_original, list/arguments) + myvar = old.myvar + + if(i_am_original) + send_to_playing_players("No parent should have to bury their child") +*/ + +/* +/datum/component/mycomponent/PreTransfer() + send_to_playing_players("Goodbye [parent], I'm getting adopted") + +/datum/component/mycomponent/PostTransfer() + send_to_playing_players("Hello my new parent, [parent]! It's nice to meet you!") +*/ + +/* +/datum/component/mycomponent/CheckDupeComponent(datum/mycomponent/new, myargone, myargtwo) + if(myargone == myvar) + return TRUE +*/ +``` diff --git a/code/datums/components/README.md b/code/datums/components/README.md index 03f7d3a587..db8bf10a32 100644 --- a/code/datums/components/README.md +++ b/code/datums/components/README.md @@ -4,6 +4,6 @@ Loosely adapted from /vg/. This is an entity component system for adding behaviours to datums when inheritance doesn't quite cut it. By using signals and events instead of direct inheritance, you can inject behaviours without hacky overloads. It requires a different method of thinking, but is not hard to use correctly. If a behaviour can have application across more than one thing. Make it generic, make it a component. Atom/mob/obj event? Give it a signal, and forward it's arguments with a `SendSignal()` call. Now every component that want's to can also know about this happening. -See [this thread](https://tgstation13.org/phpBB/viewtopic.php?f=5&t=22674) for an introduction to the system as a whole. +### [HackMD page for an introduction to the system as a whole.](https://hackmd.io/@tgstation/SignalsComponentsElements) -### See/Define signals and their arguments in [__DEFINES\dcs\signals.dm](../../__DEFINES/dcs/signals.dm) +### See/Define signals and their arguments in [__DEFINES\components.dm](../../__DEFINES/components.dm) diff --git a/code/datums/components/_component.dm b/code/datums/components/_component.dm index 08fb75ead2..e52d917b48 100644 --- a/code/datums/components/_component.dm +++ b/code/datums/components/_component.dm @@ -1,14 +1,14 @@ /** - * # Component - * - * The component datum - * - * A component should be a single standalone unit - * of functionality, that works by receiving signals from it's parent - * object to provide some single functionality (i.e a slippery component) - * that makes the object it's attached to cause people to slip over. - * Useful when you want shared behaviour independent of type inheritance - */ + * # Component + * + * The component datum + * + * A component should be a single standalone unit + * of functionality, that works by receiving signals from it's parent + * object to provide some single functionality (i.e a slippery component) + * that makes the object it's attached to cause people to slip over. + * Useful when you want shared behaviour independent of type inheritance + */ /datum/component /** * Defines how duplicate existing components are handled when added to a datum @@ -38,14 +38,17 @@ */ var/can_transfer = FALSE + /// A lazy list of the sources for this component + var/list/sources + /** - * Create a new component. - * - * Additional arguments are passed to [Initialize()][/datum/component/proc/Initialize] - * - * Arguments: - * * datum/P the parent datum this component reacts to signals from - */ + * Create a new component. + * + * Additional arguments are passed to [Initialize()][/datum/component/proc/Initialize] + * + * Arguments: + * * datum/P the parent datum this component reacts to signals from + */ /datum/component/New(list/raw_args) parent = raw_args[1] var/list/arguments = raw_args.Copy(2) @@ -57,50 +60,50 @@ _JoinParent(parent) /** - * Called during component creation with the same arguments as in new excluding parent. - * - * Do not call `qdel(src)` from this function, `return COMPONENT_INCOMPATIBLE` instead - */ + * Called during component creation with the same arguments as in new excluding parent. + * + * Do not call `qdel(src)` from this function, `return COMPONENT_INCOMPATIBLE` instead + */ /datum/component/proc/Initialize(...) return /** - * Properly removes the component from `parent` and cleans up references - * - * Arguments: - * * force - makes it not check for and remove the component from the parent - * * silent - deletes the component without sending a [COMSIG_COMPONENT_REMOVING] signal - */ -/datum/component/Destroy(force=FALSE, silent=FALSE) - if(!force && parent) + * Properly removes the component from `parent` and cleans up references + * + * Arguments: + * * force - makes it not check for and remove the component from the parent + */ +/datum/component/Destroy(force = FALSE) + if(!parent) + return ..() + if(!force) _RemoveFromParent() - if(!silent) - SEND_SIGNAL(parent, COMSIG_COMPONENT_REMOVING, src) + SEND_SIGNAL(parent, COMSIG_COMPONENT_REMOVING, src) parent = null return ..() /** - * Internal proc to handle behaviour of components when joining a parent - */ + * Internal proc to handle behaviour of components when joining a parent + */ /datum/component/proc/_JoinParent() var/datum/P = parent //lazy init the parent's dc list - var/list/dc = P.datum_components + var/list/dc = P._datum_components if(!dc) - P.datum_components = dc = list() + P._datum_components = dc = list() //set up the typecache var/our_type = type for(var/I in _GetInverseTypeList(our_type)) var/test = dc[I] - if(test) //already another component of this type here + if(test) //already another component of this type here var/list/components_of_type if(!length(test)) components_of_type = list(test) dc[I] = components_of_type else components_of_type = test - if(I == our_type) //exact match, take priority + if(I == our_type) //exact match, take priority var/inserted = FALSE for(var/J in 1 to components_of_type.len) var/datum/component/C = components_of_type[J] @@ -110,191 +113,126 @@ break if(!inserted) components_of_type += src - else //indirect match, back of the line with ya + else //indirect match, back of the line with ya components_of_type += src - else //only component of this type, no list + else //only component of this type, no list dc[I] = src RegisterWithParent() /** - * Internal proc to handle behaviour when being removed from a parent - */ + * Internal proc to handle behaviour when being removed from a parent + */ /datum/component/proc/_RemoveFromParent() - var/datum/P = parent - var/list/dc = P.datum_components + var/datum/parent = src.parent + var/list/parents_components = parent._datum_components for(var/I in _GetInverseTypeList()) - var/list/components_of_type = dc[I] - if(length(components_of_type)) // + var/list/components_of_type = parents_components[I] + + if(length(components_of_type)) // var/list/subtracted = components_of_type - src - if(subtracted.len == 1) //only 1 guy left - dc[I] = subtracted[1] //make him special + + if(subtracted.len == 1) //only 1 guy left + parents_components[I] = subtracted[1] //make him special else - dc[I] = subtracted - else //just us - dc -= I - if(!dc.len) - P.datum_components = null + parents_components[I] = subtracted + + else //just us + parents_components -= I + + if(!parents_components.len) + parent._datum_components = null UnregisterFromParent() /** - * Register the component with the parent object - * - * Use this proc to register with your parent object - * - * Overridable proc that's called when added to a new parent - */ + * Register the component with the parent object + * + * Use this proc to register with your parent object + * + * Overridable proc that's called when added to a new parent + */ /datum/component/proc/RegisterWithParent() return /** - * Unregister from our parent object - * - * Use this proc to unregister from your parent object - * - * Overridable proc that's called when removed from a parent - * * - */ + * Unregister from our parent object + * + * Use this proc to unregister from your parent object + * + * Overridable proc that's called when removed from a parent + * * + */ /datum/component/proc/UnregisterFromParent() return /** - * Register to listen for a signal from the passed in target - * - * This sets up a listening relationship such that when the target object emits a signal - * the source datum this proc is called upon, will recieve a callback to the given proctype - * Return values from procs registered must be a bitfield - * - * Arguments: - * * datum/target The target to listen for signals from - * * sig_type_or_types Either a string signal name, or a list of signal names (strings) - * * proctype The proc to call back when the signal is emitted - * * override If a previous registration exists you must explicitly set this - */ -/datum/proc/RegisterSignal(datum/target, sig_type_or_types, proctype, override = FALSE) - if(QDELETED(src) || QDELETED(target)) - return - - var/list/procs = signal_procs - if(!procs) - signal_procs = procs = list() - if(!procs[target]) - procs[target] = list() - var/list/lookup = target.comp_lookup - if(!lookup) - target.comp_lookup = lookup = list() - - var/list/sig_types = islist(sig_type_or_types) ? sig_type_or_types : list(sig_type_or_types) - for(var/sig_type in sig_types) - if(!override && procs[target][sig_type]) - var/trace_msg = "[sig_type] overridden. Use override = TRUE to suppress this warning." - if(isatom(target)) - var/atom/A = target - trace_msg += " [A.x],[A.y],[A.z]" - stack_trace(trace_msg) - - procs[target][sig_type] = proctype - - if(!lookup[sig_type]) // Nothing has registered here yet - lookup[sig_type] = src - else if(lookup[sig_type] == src) // We already registered here - continue - else if(!length(lookup[sig_type])) // One other thing registered here - lookup[sig_type] = list(lookup[sig_type]=TRUE) - lookup[sig_type][src] = TRUE - else // Many other things have registered here - lookup[sig_type][src] = TRUE - - signal_enabled = TRUE + * Called when the component has a new source registered. + * Return COMPONENT_INCOMPATIBLE to signal that the source is incompatible and should not be added + */ +/datum/component/proc/on_source_add(source, ...) + SHOULD_CALL_PARENT(TRUE) + if(dupe_mode != COMPONENT_DUPE_SOURCES) + return COMPONENT_INCOMPATIBLE + LAZYOR(sources, source) /** - * Stop listening to a given signal from target - * - * Breaks the relationship between target and source datum, removing the callback when the signal fires - * - * Doesn't care if a registration exists or not - * - * Arguments: - * * datum/target Datum to stop listening to signals from - * * sig_type_or_types Signal string key or list of signal keys to stop listening to specifically - */ -/datum/proc/UnregisterSignal(datum/target, sig_type_or_types) - var/list/lookup = target?.comp_lookup - if(!signal_procs || !signal_procs[target] || !lookup) - return - if(!islist(sig_type_or_types)) - sig_type_or_types = list(sig_type_or_types) - for(var/sig in sig_type_or_types) - if(!signal_procs[target][sig]) - continue - switch(length(lookup[sig])) - if(2) - lookup[sig] = (lookup[sig]-src)[1] - if(1) - stack_trace("[target] ([target.type]) somehow has single length list inside comp_lookup") - if(src in lookup[sig]) - lookup -= sig - if(!length(lookup)) - target.comp_lookup = null - break - if(0) - lookup -= sig - if(!length(lookup)) - target.comp_lookup = null - break - else - lookup[sig] -= src - - signal_procs[target] -= sig_type_or_types - if(!signal_procs[target].len) - signal_procs -= target + * Called when the component has a source removed. + * You probably want to call parent after you do your logic because at the end of this we qdel if we have no sources remaining! + */ +/datum/component/proc/on_source_remove(source) + SHOULD_CALL_PARENT(TRUE) + if(dupe_mode != COMPONENT_DUPE_SOURCES) + CRASH("Component '[type]' does not use sources but is trying to remove a source") + LAZYREMOVE(sources, source) + if(!LAZYLEN(sources)) + qdel(src) /** - * Called on a component when a component of the same type was added to the same parent - * - * See [/datum/component/var/dupe_mode] - * - * `C`'s type will always be the same of the called component - */ + * Called on a component when a component of the same type was added to the same parent + * + * See [/datum/component/var/dupe_mode] + * + * `C`'s type will always be the same of the called component + */ /datum/component/proc/InheritComponent(datum/component/C, i_am_original) return /** - * Called on a component when a component of the same type was added to the same parent with [COMPONENT_DUPE_SELECTIVE] - * - * See [/datum/component/var/dupe_mode] - * - * `C`'s type will always be the same of the called component - * - * return TRUE if you are absorbing the component, otherwise FALSE if you are fine having it exist as a duplicate component - */ + * Called on a component when a component of the same type was added to the same parent with [COMPONENT_DUPE_SELECTIVE] + * + * See [/datum/component/var/dupe_mode] + * + * `C`'s type will always be the same of the called component + * + * return TRUE if you are absorbing the component, otherwise FALSE if you are fine having it exist as a duplicate component + */ /datum/component/proc/CheckDupeComponent(datum/component/C, ...) return /** - * Callback Just before this component is transferred - * - * Use this to do any special cleanup you might need to do before being deregged from an object - */ + * Callback Just before this component is transferred + * + * Use this to do any special cleanup you might need to do before being deregged from an object + */ /datum/component/proc/PreTransfer() return /** - * Callback Just after a component is transferred - * - * Use this to do any special setup you need to do after being moved to a new object - * - * Do not call `qdel(src)` from this function, `return COMPONENT_INCOMPATIBLE` instead - */ + * Callback Just after a component is transferred + * + * Use this to do any special setup you need to do after being moved to a new object + * + * Do not call `qdel(src)` from this function, `return COMPONENT_INCOMPATIBLE` instead + */ /datum/component/proc/PostTransfer() return COMPONENT_INCOMPATIBLE //Do not support transfer by default as you must properly support it /** - * Internal proc to create a list of our type and all parent types - */ + * Internal proc to create a list of our type and all parent types + */ /datum/component/proc/_GetInverseTypeList(our_type = type) //we can do this one simple trick . = list(our_type) @@ -304,42 +242,20 @@ . += current_type current_type = type2parent(current_type) -/** - * Internal proc to handle most all of the signaling procedure - * - * Will runtime if used on datums with an empty component list - * - * Use the [SEND_SIGNAL] define instead - */ -/datum/proc/_SendSignal(sigtype, list/arguments) - var/target = comp_lookup[sigtype] - if(!length(target)) - var/datum/C = target - if(!C.signal_enabled) - return NONE - var/proctype = C.signal_procs[src][sigtype] - return NONE | CallAsync(C, proctype, arguments) - . = NONE - for(var/datum/C as anything in target) - if(!C.signal_enabled) - continue - var/proctype = C.signal_procs[src][sigtype] - . |= CallAsync(C, proctype, arguments) - // The type arg is casted so initial works, you shouldn't be passing a real instance into this /** - * Return any component assigned to this datum of the given type - * - * This will throw an error if it's possible to have more than one component of that type on the parent - * - * Arguments: - * * datum/component/c_type The typepath of the component you want to get a reference to - */ + * Return any component assigned to this datum of the given type + * + * This will throw an error if it's possible to have more than one component of that type on the parent + * + * Arguments: + * * datum/component/c_type The typepath of the component you want to get a reference to + */ /datum/proc/GetComponent(datum/component/c_type) RETURN_TYPE(c_type) if(initial(c_type.dupe_mode) == COMPONENT_DUPE_ALLOWED || initial(c_type.dupe_mode) == COMPONENT_DUPE_SELECTIVE) stack_trace("GetComponent was called to get a component of which multiple copies could be on an object. This can easily break and should be changed. Type: \[[c_type]\]") - var/list/dc = datum_components + var/list/dc = _datum_components if(!dc) return null . = dc[c_type] @@ -348,18 +264,18 @@ // The type arg is casted so initial works, you shouldn't be passing a real instance into this /** - * Return any component assigned to this datum of the exact given type - * - * This will throw an error if it's possible to have more than one component of that type on the parent - * - * Arguments: - * * datum/component/c_type The typepath of the component you want to get a reference to - */ + * Return any component assigned to this datum of the exact given type + * + * This will throw an error if it's possible to have more than one component of that type on the parent + * + * Arguments: + * * datum/component/c_type The typepath of the component you want to get a reference to + */ /datum/proc/GetExactComponent(datum/component/c_type) RETURN_TYPE(c_type) if(initial(c_type.dupe_mode) == COMPONENT_DUPE_ALLOWED || initial(c_type.dupe_mode) == COMPONENT_DUPE_SELECTIVE) stack_trace("GetComponent was called to get a component of which multiple copies could be on an object. This can easily break and should be changed. Type: \[[c_type]\]") - var/list/dc = datum_components + var/list/dc = _datum_components if(!dc) return null var/datum/component/C = dc[c_type] @@ -371,109 +287,148 @@ return null /** - * Get all components of a given type that are attached to this datum - * - * Arguments: - * * c_type The component type path - */ + * Get all components of a given type that are attached to this datum + * + * Arguments: + * * c_type The component type path + */ /datum/proc/GetComponents(c_type) - var/list/dc = datum_components - if(!dc) - return null - . = dc[c_type] - if(!length(.)) - return list(.) + var/list/components = _datum_components?[c_type] + if(!components) + return list() + return islist(components) ? components : list(components) /** - * Creates an instance of `new_type` in the datum and attaches to it as parent - * - * Sends the [COMSIG_COMPONENT_ADDED] signal to the datum - * - * Returns the component that was created. Or the old component in a dupe situation where [COMPONENT_DUPE_UNIQUE] was set - * - * If this tries to add a component to an incompatible type, the component will be deleted and the result will be `null`. This is very unperformant, try not to do it - * - * Properly handles duplicate situations based on the `dupe_mode` var - */ -/datum/proc/_AddComponent(list/raw_args) - var/new_type = raw_args[1] - var/datum/component/nt = new_type - var/dm = initial(nt.dupe_mode) - var/dt = initial(nt.dupe_type) + * Creates an instance of `new_type` in the datum and attaches to it as parent + * + * Sends the [COMSIG_COMPONENT_ADDED] signal to the datum + * + * Returns the component that was created. Or the old component in a dupe situation where [COMPONENT_DUPE_UNIQUE] was set + * + * If this tries to add a component to an incompatible type, the component will be deleted and the result will be `null`. This is very unperformant, try not to do it + * + * Properly handles duplicate situations based on the `dupe_mode` var + */ +/datum/proc/_AddComponent(list/raw_args, source) + var/original_type = raw_args[1] + var/datum/component/component_type = original_type - var/datum/component/old_comp - var/datum/component/new_comp + if(QDELING(src)) + CRASH("Attempted to add a new component of type \[[component_type]\] to a qdeleting parent of type \[[type]\]!") - if(ispath(nt)) - if(nt == /datum/component) - CRASH("[nt] attempted instantiation!") - else - new_comp = nt - nt = new_comp.type + var/datum/component/new_component + + if(!ispath(component_type, /datum/component)) + if(!istype(component_type, /datum/component)) + CRASH("Attempted to instantiate \[[component_type]\] as a component added to parent of type \[[type]\]!") + else + new_component = component_type + component_type = new_component.type + else if(component_type == /datum/component) + CRASH("[component_type] attempted instantiation!") + + var/dupe_mode = initial(component_type.dupe_mode) + var/dupe_type = initial(component_type.dupe_type) + var/uses_sources = (dupe_mode == COMPONENT_DUPE_SOURCES) + if(uses_sources && !source) + CRASH("Attempted to add a sourced component of type '[component_type]' to '[type]' without a source!") + else if(!uses_sources && source) + CRASH("Attempted to add a normal component of type '[component_type]' to '[type]' with a source!") + + var/datum/component/old_component raw_args[1] = src - - if(dm != COMPONENT_DUPE_ALLOWED) - if(!dt) - old_comp = GetExactComponent(nt) + if(dupe_mode != COMPONENT_DUPE_ALLOWED && dupe_mode != COMPONENT_DUPE_SELECTIVE && dupe_mode != COMPONENT_DUPE_SOURCES) + if(!dupe_type) + old_component = GetExactComponent(component_type) else - old_comp = GetComponent(dt) - if(old_comp) - switch(dm) + old_component = GetComponent(dupe_type) + + if(old_component) + switch(dupe_mode) if(COMPONENT_DUPE_UNIQUE) - if(!new_comp) - new_comp = new nt(raw_args) - if(!QDELETED(new_comp)) - old_comp.InheritComponent(new_comp, TRUE) - QDEL_NULL(new_comp) + if(!new_component) + new_component = new component_type(raw_args) + if(!QDELETED(new_component)) + old_component.InheritComponent(new_component, TRUE) + QDEL_NULL(new_component) + if(COMPONENT_DUPE_HIGHLANDER) - if(!new_comp) - new_comp = new nt(raw_args) - if(!QDELETED(new_comp)) - new_comp.InheritComponent(old_comp, FALSE) - QDEL_NULL(old_comp) + if(!new_component) + new_component = new component_type(raw_args) + if(!QDELETED(new_component)) + new_component.InheritComponent(old_component, FALSE) + QDEL_NULL(old_component) + if(COMPONENT_DUPE_UNIQUE_PASSARGS) - if(!new_comp) + if(!new_component) var/list/arguments = raw_args.Copy(2) arguments.Insert(1, null, TRUE) - old_comp.InheritComponent(arglist(arguments)) + old_component.InheritComponent(arglist(arguments)) else - old_comp.InheritComponent(new_comp, TRUE) - if(COMPONENT_DUPE_SELECTIVE) - var/list/arguments = raw_args.Copy() - arguments[1] = new_comp - var/make_new_component = TRUE - for(var/datum/component/C as anything in GetComponents(new_type)) - if(C.CheckDupeComponent(arglist(arguments))) - make_new_component = FALSE - QDEL_NULL(new_comp) - break - if(!new_comp && make_new_component) - new_comp = new nt(raw_args) - else if(!new_comp) - new_comp = new nt(raw_args) // There's a valid dupe mode but there's no old component, act like normal - else if(!new_comp) - new_comp = new nt(raw_args) // Dupes are allowed, act like normal + old_component.InheritComponent(new_component, TRUE) - if(!old_comp && !QDELETED(new_comp)) // Nothing related to duplicate components happened and the new component is healthy - SEND_SIGNAL(src, COMSIG_COMPONENT_ADDED, new_comp) - return new_comp - return old_comp + if(COMPONENT_DUPE_SOURCES) + if(source in old_component.sources) + return old_component // source already registered, no work to do + + if(old_component.on_source_add(arglist(list(source) + raw_args.Copy(2))) == COMPONENT_INCOMPATIBLE) + stack_trace("incompatible source added to a [old_component.type]. Args: [json_encode(raw_args)]") + return null + + else if(!new_component) + new_component = new component_type(raw_args) // There's a valid dupe mode but there's no old component, act like normal + + else if(dupe_mode == COMPONENT_DUPE_SELECTIVE) + var/list/arguments = raw_args.Copy() + arguments[1] = new_component + var/make_new_component = TRUE + for(var/datum/component/existing_component as anything in GetComponents(original_type)) + if(existing_component.CheckDupeComponent(arglist(arguments))) + make_new_component = FALSE + QDEL_NULL(new_component) + break + if(!new_component && make_new_component) + new_component = new component_type(raw_args) + + else if(dupe_mode == COMPONENT_DUPE_SOURCES) + new_component = new component_type(raw_args) + if(new_component.on_source_add(arglist(list(source) + raw_args.Copy(2))) == COMPONENT_INCOMPATIBLE) + stack_trace("incompatible source added to a [new_component.type]. Args: [json_encode(raw_args)]") + return null + + else if(!new_component) + new_component = new component_type(raw_args) // Dupes are allowed, act like normal + + if(!old_component && !QDELETED(new_component)) // Nothing related to duplicate components happened and the new component is healthy + SEND_SIGNAL(src, COMSIG_COMPONENT_ADDED, new_component) + return new_component + + return old_component /** - * Get existing component of type, or create it and return a reference to it - * - * Use this if the item needs to exist at the time of this call, but may not have been created before now - * - * Arguments: - * * component_type The typepath of the component to create or return - * * ... additional arguments to be passed when creating the component if it does not exist - */ -/datum/proc/LoadComponent(component_type, ...) - . = GetComponent(component_type) - if(!.) - return _AddComponent(args) + * Removes a component source from this datum + */ +/datum/proc/RemoveComponentSource(source, datum/component/component_type) + if(ispath(component_type)) + component_type = GetExactComponent(component_type) + if(!component_type) + return + component_type.on_source_remove(source) +/** + * Get existing component of type, or create it and return a reference to it + * + * Use this if the item needs to exist at the time of this call, but may not have been created before now + * + * Arguments: + * * component_type The typepath of the component to create or return + * * ... additional arguments to be passed when creating the component if it does not exist + */ +/datum/proc/_LoadComponent(list/arguments) + . = GetComponent(arguments[1]) + if(!.) + return _AddComponent(arguments) /** * Removes the component from parent, ends up with a null parent * Used as a helper proc by the component transfer proc, does not clean up the component like Destroy does @@ -488,13 +443,13 @@ SEND_SIGNAL(old_parent, COMSIG_COMPONENT_REMOVING, src) /** - * Transfer this component to another parent - * - * Component is taken from source datum - * - * Arguments: - * * datum/component/target Target datum to transfer to - */ + * Transfer this component to another parent + * + * Component is taken from source datum + * + * Arguments: + * * datum/component/target Target datum to transfer to + */ /datum/proc/TakeComponent(datum/component/target) if(!target || target.parent == src) return @@ -512,29 +467,30 @@ target._JoinParent() /** - * Transfer all components to target - * - * All components from source datum are taken - * - * Arguments: - * * /datum/target the target to move the components to - */ + * Transfer all components to target + * + * All components from source datum are taken + * + * Arguments: + * * /datum/target the target to move the components to + */ /datum/proc/TransferComponents(datum/target) - var/list/dc = datum_components + var/list/dc = _datum_components if(!dc) return - var/comps = dc[/datum/component] - if(islist(comps)) - for(var/datum/component/I in comps) - if(I.can_transfer) - target.TakeComponent(I) - else - var/datum/component/C = comps - if(C.can_transfer) - target.TakeComponent(comps) + for(var/component_key in dc) + var/component_or_list = dc[component_key] + if(islist(component_or_list)) + for(var/datum/component/I in component_or_list) + if(I.can_transfer) + target.TakeComponent(I) + else + var/datum/component/C = component_or_list + if(C.can_transfer) + target.TakeComponent(C) /** - * Return the object that is the host of any UI's that this component has - */ + * Return the object that is the host of any UI's that this component has + */ /datum/component/tgui_host() return parent diff --git a/code/datums/components/material_container.dm b/code/datums/components/material_container.dm index bbd2b7fd12..43f8f7b711 100644 --- a/code/datums/components/material_container.dm +++ b/code/datums/components/material_container.dm @@ -60,7 +60,7 @@ mat_amt = 0 materials[mat_ref] += mat_amt -/datum/component/material_container/Destroy(force, silent) +/datum/component/material_container/Destroy(force) materials = null allowed_materials = null if(insertion_check) diff --git a/code/datums/datum.dm b/code/datums/datum.dm index 95e77fa9a3..8813e074f9 100644 --- a/code/datums/datum.dm +++ b/code/datums/datum.dm @@ -19,7 +19,7 @@ /// Open uis owned by this datum /// Lazy, since this case is semi rare - var/list/open_uis + var/list/open_tguis // FIXME: open_uis /// Active timers with this datum as the target var/list/_active_timers @@ -29,20 +29,22 @@ /** * Components attached to this datum * - * Lazy associated list in the structure of `type:component/list of components` + * Lazy associated list in the structure of `type -> component/list of components` */ - var/list/datum_components + var/list/_datum_components /** * Any datum registered to receive signals from this datum is in this list * - * Lazy associated list in the structure of `signal:registree/list of registrees` + * Lazy associated list in the structure of `signal -> registree/list of registrees` */ - var/list/comp_lookup - var/list/list/signal_procs // List of lists - var/signal_enabled = FALSE + var/list/_listen_lookup + /// Lazy associated list in the structure of `target -> list(signal -> proctype)` that are run when the datum receives that signal + var/list/list/_signal_procs /// Datum level flags var/datum_flags = NONE + var/trigger_uid + var/status_traits /// A weak reference to another datum var/datum/weakref/weak_reference @@ -91,6 +93,7 @@ tag = null weak_reference = null //ensure prompt GCing of weakref. + //clear timers if(_active_timers) var/list/timers = _active_timers _active_timers = null @@ -99,34 +102,26 @@ continue qdel(timer) - //BEGIN: ECS SHIT - signal_enabled = FALSE + #ifdef REFERENCE_TRACKING + #ifdef REFERENCE_TRACKING_DEBUG + found_refs = null + #endif + #endif - var/list/dc = datum_components + //BEGIN: ECS SHIT + var/list/dc = _datum_components if(dc) - var/all_components = dc[/datum/component] - if(length(all_components)) - for(var/datum/component/C as anything in all_components) - qdel(C, FALSE, TRUE) - else - var/datum/component/C = all_components - qdel(C, FALSE, TRUE) + for(var/component_key in dc) + var/component_or_list = dc[component_key] + if(islist(component_or_list)) + for(var/datum/component/component as anything in component_or_list) + qdel(component, FALSE) + else + var/datum/component/C = component_or_list + qdel(C, FALSE) dc.Cut() - var/list/lookup = comp_lookup - if(lookup) - for(var/sig in lookup) - var/list/comps = lookup[sig] - if(length(comps)) - for(var/datum/component/comp as anything in comps) - comp.UnregisterSignal(src, sig) - else - var/datum/component/comp = comps - comp.UnregisterSignal(src, sig) - comp_lookup = lookup = null - - for(var/target in signal_procs) - UnregisterSignal(target, signal_procs[target]) + _clear_signal_refs() //END: ECS SHIT SStgui.close_uis(src) @@ -140,6 +135,24 @@ return QDEL_HINT_QUEUE +///Only override this if you know what you're doing. You do not know what you're doing +///This is a threat +/datum/proc/_clear_signal_refs() + var/list/lookup = _listen_lookup + if(lookup) + for(var/sig in lookup) + var/list/comps = lookup[sig] + if(length(comps)) + for(var/datum/component/comp as anything in comps) + comp.UnregisterSignal(src, sig) + else + var/datum/component/comp = comps + comp.UnregisterSignal(src, sig) + _listen_lookup = lookup = null + + for(var/target in _signal_procs) + UnregisterSignal(target, _signal_procs[target]) + /** * Callback called by a timer to end an associative-list-indexed cooldown. * diff --git a/code/datums/elements/ELEMENT_TEMPLATE.md b/code/datums/elements/ELEMENT_TEMPLATE.md new file mode 100644 index 0000000000..4bc1f72f2d --- /dev/null +++ b/code/datums/elements/ELEMENT_TEMPLATE.md @@ -0,0 +1,25 @@ + +# Template file for your new element + +See _element.dm for detailed explanations + +```dm +/datum/element/myelement + element_flags = ELEMENT_BESPOKE | ELEMENT_COMPLEX_DETACH | ELEMENT_DETACH_ON_HOST_DESTROY | ELEMENT_NOTAREALFLAG // code/__DEFINES/dcs/flags.dm + //argument_hash_start_idx = 2 // Use with ELEMENT_BESPOKE + var/list/myvar = list() + +/datum/element/myelement/Attach(datum/target) + if(!ismovable(target)) + return COMPONENT_INCOMPATIBLE + RegisterSignal(target, COMSIG_MOVABLE_MOVED, myproc) + to_chat(target, "Hey, you're in your element.") + +/datum/element/myelement/Detach(datum/source) + UnregisterSignal(source, COMSIG_MOVABLE_MOVED) + to_chat(source, "You feel way out of your element.") + +/datum/element/myelement/proc/myproc(datum/source) + SIGNAL_HANDLER + playsound(source, 'sound/effects/gong.ogg', 50, TRUE) +``` diff --git a/code/datums/elements/_element.dm b/code/datums/elements/_element.dm index 82b5139522..7f019508a3 100644 --- a/code/datums/elements/_element.dm +++ b/code/datums/elements/_element.dm @@ -10,11 +10,14 @@ /** * The index of the first attach argument to consider for duplicate elements * + * All arguments from this index onwards (1 based) are hashed into the key to determine + * if this is a new unique element or one already exists + * * Is only used when flags contains [ELEMENT_BESPOKE] * * This is infinity so you must explicitly set this */ - var/id_arg_index = INFINITY + var/argument_hash_start_idx = INFINITY /// Activates the functionality defined by the element on the given target datum /datum/element/proc/Attach(datum/target) @@ -22,19 +25,19 @@ if(type == /datum/element) return ELEMENT_INCOMPATIBLE SEND_SIGNAL(target, COMSIG_ELEMENT_ATTACH, src) - if(element_flags & ELEMENT_DETACH) + if(element_flags & ELEMENT_DETACH_ON_HOST_DESTROY) RegisterSignal(target, COMSIG_PARENT_QDELETING, PROC_REF(OnTargetDelete), override = TRUE) -/datum/element/proc/OnTargetDelete(datum/source, force) +/datum/element/proc/OnTargetDelete(datum/source) SIGNAL_HANDLER Detach(source) /// Deactivates the functionality defines by the element on the given datum /datum/element/proc/Detach(datum/source, ...) SIGNAL_HANDLER + SHOULD_CALL_PARENT(TRUE) SEND_SIGNAL(source, COMSIG_ELEMENT_DETACH, src) - SHOULD_CALL_PARENT(TRUE) UnregisterSignal(source, COMSIG_PARENT_QDELETING) /datum/element/Destroy(force) @@ -48,20 +51,53 @@ /// Finds the singleton for the element type given and attaches it to src /datum/proc/_AddElement(list/arguments) if(QDELING(src)) - CRASH("We just tried to add an element to a qdeleted datum, something is fucked") + var/datum/element/element_type = arguments[1] + stack_trace("We just tried to add the element [element_type] to a qdeleted datum, something is fucked") + return + var/datum/element/ele = SSdcs.GetElement(arguments) + if(!ele) // We couldn't fetch the element, likely because it was not an element. + return // the crash message has already been sent arguments[1] = src if(ele.Attach(arglist(arguments)) == ELEMENT_INCOMPATIBLE) - CRASH("Incompatible [arguments[1]] assigned to a [type]! args: [json_encode(args)]") + CRASH("Incompatible element [ele.type] was assigned to a [type]! args: [json_encode(args)]") /** * Finds the singleton for the element type given and detaches it from src * You only need additional arguments beyond the type if you're using [ELEMENT_BESPOKE] */ /datum/proc/_RemoveElement(list/arguments) - var/datum/element/ele = SSdcs.GetElement(arguments) + var/datum/element/ele = SSdcs.GetElement(arguments, FALSE) + if(!ele) // We couldn't fetch the element, likely because it didn't exist. + return if(ele.element_flags & ELEMENT_COMPLEX_DETACH) arguments[1] = src ele.Detach(arglist(arguments)) else ele.Detach(src) + +/** + * Used to manage (typically non_bespoke) elements with multiple sources through traits + * so we don't have to make them a components again. + * The element will be later removed once all trait sources are gone, there's no need of a + * "RemoveElementTrait" counterpart. + */ +/datum/proc/AddElementTrait(trait, source, datum/element/eletype, ...) + if(!ispath(eletype, /datum/element)) + CRASH("AddElementTrait called, but [eletype] is not of a /datum/element path") + ADD_TRAIT(src, trait, source) + if(HAS_TRAIT_NOT_FROM(src, trait, source)) + return + var/list/arguments = list(eletype) + /// 3 is the length of fixed args of this proc, any further one is passed down to AddElement. + if(length(args) > 3) + arguments += args.Copy(4) + /// We actually pass down a copy of the arguments since it's manipulated by the end of the proc. + _AddElement(arguments.Copy()) + var/datum/ele = SSdcs.GetElement(arguments) + ele.RegisterSignal(src, SIGNAL_REMOVETRAIT(trait), TYPE_PROC_REF(/datum/element, _detach_on_trait_removed)) + +/datum/element/proc/_detach_on_trait_removed(datum/source, trait) + SIGNAL_HANDLER + Detach(source) + UnregisterSignal(source, SIGNAL_REMOVETRAIT(trait)) diff --git a/code/datums/elements/conflict_checking.dm b/code/datums/elements/conflict_checking.dm index eea61f8f89..f05a0b1706 100644 --- a/code/datums/elements/conflict_checking.dm +++ b/code/datums/elements/conflict_checking.dm @@ -2,8 +2,8 @@ * Simple conflict checking for getting number of conflicting things on someone with the same ID. */ /datum/element/conflict_checking - element_flags = ELEMENT_BESPOKE | ELEMENT_DETACH - id_arg_index = 1 + element_flags = ELEMENT_BESPOKE | ELEMENT_DETACH_ON_HOST_DESTROY + argument_hash_start_idx = 1 /// we don't need to KNOW who has us, only our ID. var/id diff --git a/code/datums/elements/footstep.dm b/code/datums/elements/footstep.dm new file mode 100644 index 0000000000..eab5965d2d --- /dev/null +++ b/code/datums/elements/footstep.dm @@ -0,0 +1,187 @@ +#define SHOULD_DISABLE_FOOTSTEPS(source) + +///Footstep element. Plays footsteps at parents location when it is appropriate. +/datum/element/footstep + element_flags = ELEMENT_DETACH_ON_HOST_DESTROY|ELEMENT_BESPOKE + argument_hash_start_idx = 2 + ///A list containing living mobs and the number of steps they have taken since the last time their footsteps were played. + var/list/steps_for_living = list() + ///volume determines the extra volume of the footstep. This is multiplied by the base volume, should there be one. + var/volume + ///e_range stands for extra range - aka how far the sound can be heard. This is added to the base value and ignored if there isn't a base value. + var/e_range + ///footstep_type is a define which determines what kind of sounds should get chosen. + var/footstep_type + ///This can be a list OR a soundfile OR null. Determines whatever sound gets played. + var/footstep_sounds + ///Whether or not to add variation to the sounds played + var/sound_vary = FALSE + +/datum/element/footstep/Attach(datum/target, footstep_type = FOOTSTEP_MOB_BAREFOOT, volume = 0.1, e_range = -8, sound_vary = FALSE) + . = ..() + if(!ismovable(target)) + return ELEMENT_INCOMPATIBLE + src.volume = volume + src.e_range = e_range + src.footstep_type = footstep_type + src.sound_vary = sound_vary + + if(ishuman(target)) + RegisterSignal(target, COMSIG_MOVABLE_MOVED, PROC_REF(play_humanstep)) + steps_for_living[target] = 0 + return + + footstep_sounds = check_footstep_type(footstep_type) + + RegisterSignal(target, COMSIG_MOVABLE_MOVED, PROC_REF(play_simplestep)) + steps_for_living[target] = 0 + +/datum/element/footstep/proc/check_footstep_type(footstep_type) + var/footstep_ret + switch(footstep_type) + if(FOOTSTEP_MOB_TESHARI) + footstep_ret = GLOB.lightclawfootstep + if(FOOTSTEP_MOB_CLAW) + footstep_ret = GLOB.clawfootstep + if(FOOTSTEP_MOB_HEAVY) + footstep_ret = GLOB.heavyfootstep + if(FOOTSTEP_MOB_SHOE) + footstep_ret = GLOB.footstep + if(FOOTSTEP_MOB_SLIME) + footstep_ret = 'sound/effects/footstep/slime1.ogg' + if(FOOTSTEP_MOB_SLITHER) + footstep_ret = 'sound/effects/footstep/crawl1.ogg' + else + footstep_ret = GLOB.barefootstep + return footstep_ret + +/datum/element/footstep/Detach(atom/movable/source) + UnregisterSignal(source, COMSIG_MOVABLE_MOVED) + steps_for_living -= source + return ..() + +///Prepares a footstep for living mobs. Determines if it should get played. Returns the turf it should get played on. Note that it is always a /turf/simulated +/datum/element/footstep/proc/prepare_step(mob/living/source) + var/turf/simulated/turf = get_turf(source) + if(!istype(turf)) + return + + if(source.is_incorporeal()) + return + + if(source.buckled || source.throwing || source.movement_type & (source.is_ventcrawling | source.flying)) + return + + if(source.lying) //play crawling sound if we're lying + if(turf.footstep) + playsound(turf, 'sound/effects/footstep/crawl1.ogg', 15 * volume, falloff = 1, vary = sound_vary) + return + + if(iscarbon(source)) + var/mob/living/carbon/carbon_source = source + if(!carbon_source.get_organ(BP_L_LEG) && !carbon_source.get_organ(BP_R_LEG)) + return + if(carbon_source.m_intent == I_WALK) + return// stealth + steps_for_living[source] += 1 + var/steps = steps_for_living[source] + + if(steps >= 6) + steps_for_living[source] = 0 + steps = 0 + + if(steps % 2) + return + + if(steps != 0 && !get_gravity(source)) // don't need to step as often when you hop around + return + + . = list( + FOOTSTEP_MOB_SHOE = turf.footstep, + FOOTSTEP_MOB_BAREFOOT = turf.barefootstep, + FOOTSTEP_MOB_HEAVY = turf.heavyfootstep, + FOOTSTEP_MOB_CLAW = turf.clawfootstep, + STEP_SOUND_PRIORITY = STEP_SOUND_NO_PRIORITY + ) + + var/overriden = SEND_SIGNAL(turf, COMSIG_TURF_PREPARE_STEP_SOUND, .) & FOOTSTEP_OVERRIDEN + //The turf has no footstep sound (e.g. open space) and none of the objects on that turf (e.g. catwalks) overrides it + if(!overriden && isnull(turf.footstep)) + return null + return . + +/datum/element/footstep/proc/play_simplestep(mob/living/source, atom/oldloc, direction, forced, list/old_locs, momentum_change) + SIGNAL_HANDLER + + var/volume_multiplier = 0.3 + + if(!isturf(source.loc)) + return + + var/list/prepared_steps = prepare_step(source) + if(isnull(prepared_steps)) + return + + if(isfile(footstep_sounds) || istext(footstep_sounds)) + playsound(source.loc, footstep_sounds, volume * volume_multiplier, falloff = 1, vary = sound_vary) + return + + var/turf_footstep = prepared_steps[footstep_type] + if(isnull(turf_footstep) || !footstep_sounds[turf_footstep]) + return + playsound(source.loc, pick(footstep_sounds[turf_footstep][1]), footstep_sounds[turf_footstep][2] * volume, TRUE, footstep_sounds[turf_footstep][3] + e_range, falloff = 1, vary = sound_vary) + +/datum/element/footstep/proc/play_humanstep(mob/living/carbon/human/source, atom/oldloc, direction, forced, list/old_locs, momentum_change) + SIGNAL_HANDLER + + var/volume_multiplier = 0.3 + var/range_adjustment = 0 + + var/list/prepared_steps = prepare_step(source) + if(isnull(prepared_steps)) + return + + //cache for sanic speed (lists are references anyways) + var/footstep_sounds = GLOB.footstep + + if( source.shoes || ( source.wear_suit && (source.wear_suit.body_parts_covered & FEET) ) ) + // we are wearing shoes + + var/shoestep_type = prepared_steps[FOOTSTEP_MOB_SHOE] + if(!isnull(shoestep_type) && footstep_sounds[shoestep_type]) // shoestep type can be null + playsound(source.loc, pick(footstep_sounds[shoestep_type][1]), + footstep_sounds[shoestep_type][2] * volume * volume_multiplier, + TRUE, + footstep_sounds[shoestep_type][3] + e_range + range_adjustment, falloff = 1, vary = sound_vary) + else + // we are barefoot + + if(source.species.special_step_sounds) + playsound(source.loc, pick(source.species.special_step_sounds), volume, TRUE, falloff = 1, vary = sound_vary) + else if (istype(source.species, /datum/species/shapeshifter/promethean)) + playsound(source.loc, 'sound/effects/footstep/slime1.ogg', volume, TRUE, falloff = 1) + else if (source.custom_footstep == FOOTSTEP_MOB_SLITHER) + playsound(source.loc, 'sound/effects/footstep/crawl1.ogg', 15 * volume, falloff = 1, vary = sound_vary) + else + var/barefoot_type = prepared_steps[FOOTSTEP_MOB_BAREFOOT] + var/bare_footstep_sounds + if(source.custom_footstep != FOOTSTEP_MOB_HUMAN) + bare_footstep_sounds = check_footstep_type(source.custom_footstep) + else + bare_footstep_sounds = GLOB.barefootstep + if(!isnull(barefoot_type) && bare_footstep_sounds[barefoot_type]) // barefoot_type can be null + playsound(source.loc, pick(bare_footstep_sounds[barefoot_type][1]), + bare_footstep_sounds[barefoot_type][2] * volume * volume_multiplier, + TRUE, + bare_footstep_sounds[barefoot_type][3] + e_range + range_adjustment, falloff = 1, vary = sound_vary) + +///Prepares a footstep for machine walking +/datum/element/footstep/proc/play_simplestep_machine(atom/movable/source, atom/oldloc, direction, forced, list/old_locs, momentum_change) + SIGNAL_HANDLER + + var/turf/simulated/source_loc = get_turf(source) + if(!istype(source_loc)) + return + + playsound(source_loc, footstep_sounds, 50, falloff = 1, vary = sound_vary) +#undef SHOULD_DISABLE_FOOTSTEPS diff --git a/code/datums/elements/footstep_override.dm b/code/datums/elements/footstep_override.dm new file mode 100644 index 0000000000..43d7311328 --- /dev/null +++ b/code/datums/elements/footstep_override.dm @@ -0,0 +1,81 @@ +///When attached, the footstep sound played by the footstep element will be replaced by this one's +/datum/element/footstep_override + element_flags = ELEMENT_BESPOKE|ELEMENT_DETACH_ON_HOST_DESTROY + argument_hash_start_idx = 2 + ///The sound played for movables with claw step sound type. + var/clawfootstep + ///The sound played for movables with barefoot step sound type. + var/barefootstep + ///The sound played for movables with heavy step sound type. + var/heavyfootstep + ///The sound played for movables with shoed step sound type. + var/footstep + ///The priority this element has in relation to other elements of the same type attached to other movables on the same turf. + var/priority + /** + * A list of turfs occupied by the movables this element is attached to. + * Needed so it stops listening the turf's signals ONLY when it has no movable with the element. + */ + var/list/occupied_turfs = list() + +/datum/element/footstep_override/Attach(atom/movable/target, clawfootstep = FOOTSTEP_HARD_CLAW, barefootstep = FOOTSTEP_HARD_BAREFOOT, heavyfootstep = FOOTSTEP_GENERIC_HEAVY, footstep = FOOTSTEP_FLOOR, priority = STEP_SOUND_NO_PRIORITY) + . = ..() + if(!ismovable(target)) + return ELEMENT_INCOMPATIBLE + + src.clawfootstep = clawfootstep + src.barefootstep = barefootstep + src.heavyfootstep = heavyfootstep + src.footstep = footstep + src.priority = priority + + RegisterSignal(target, COMSIG_MOVABLE_MOVED, PROC_REF(on_moved)) + if(isturf(target.loc)) + occupy_turf(target, target.loc) + +/datum/element/footstep_override/Detach(atom/movable/source) + if(isturf(source.loc)) + vacate_turf(source, source.loc) + return ..() + +/datum/element/footstep_override/proc/on_moved(atom/movable/source, atom/oldloc) + SIGNAL_HANDLER + if(isturf(oldloc)) + vacate_turf(source, oldloc) + if(isturf(source.loc)) + occupy_turf(source, source.loc) + +/** + * Adds the movable to the list of movables with the element occupying the turf. + * If the turf was not on the list of occupied turfs before, a signal will be registered + * to it. + */ +/datum/element/footstep_override/proc/occupy_turf(atom/movable/movable, turf/location) + if(occupied_turfs[location]) + occupied_turfs[location] |= movable + return + occupied_turfs[location] = list(movable) + RegisterSignal(location, COMSIG_TURF_PREPARE_STEP_SOUND, PROC_REF(prepare_steps)) + +/** + * Removes the movable from the list of movables with the element occupying the turf. + * If the turf is no longer occupied, it'll be removed from the list, and the signal + * unregistered from it + */ +/datum/element/footstep_override/proc/vacate_turf(atom/movable/movable, turf/location) + LAZYREMOVE(occupied_turfs[location], movable) + if(!occupied_turfs[location]) + occupied_turfs -= location + UnregisterSignal(location, COMSIG_TURF_PREPARE_STEP_SOUND) + +///Changes the sound types to be played if the element priority is higher than the one in the steps list. +/datum/element/footstep_override/proc/prepare_steps(turf/source, list/steps) + SIGNAL_HANDLER + if(steps[STEP_SOUND_PRIORITY] > priority) + return + steps[FOOTSTEP_MOB_SHOE] = footstep + steps[FOOTSTEP_MOB_BAREFOOT] = barefootstep + steps[FOOTSTEP_MOB_HEAVY] = heavyfootstep + steps[FOOTSTEP_MOB_CLAW] = clawfootstep + steps[STEP_SOUND_PRIORITY] = priority + return FOOTSTEP_OVERRIDEN diff --git a/code/datums/elements/light_blocking.dm b/code/datums/elements/light_blocking.dm index f8e5cd82df..4d1d9e1ddc 100644 --- a/code/datums/elements/light_blocking.dm +++ b/code/datums/elements/light_blocking.dm @@ -2,7 +2,7 @@ * Attached to movable atoms with opacity. Listens to them move and updates their old and new turf loc's opacity accordingly. */ /datum/element/light_blocking - element_flags = ELEMENT_DETACH + element_flags = ELEMENT_DETACH_ON_HOST_DESTROY /datum/element/light_blocking/Attach(datum/target) diff --git a/code/datums/elements/slosh.dm b/code/datums/elements/slosh.dm new file mode 100644 index 0000000000..8e58536f02 --- /dev/null +++ b/code/datums/elements/slosh.dm @@ -0,0 +1,94 @@ +/datum/element/slosh + element_flags = ELEMENT_DETACH_ON_HOST_DESTROY|ELEMENT_BESPOKE + var/step_count + var/vore_organs_reagents + var/vore_footstep_volume + var/vore_footstep_chance + +/datum/element/slosh/Attach(datum/target) + . = ..() + if(!isliving(target)) + return ELEMENT_INCOMPATIBLE + + RegisterSignal(target, COMSIG_MOVABLE_MOVED, PROC_REF(handle_sloshstep), override = TRUE) + step_count = 0 + vore_organs_reagents = list() + vore_footstep_volume = 0 + vore_footstep_chance = 0 + return + +/datum/element/slosh/Detach(datum/source) + UnregisterSignal(source, COMSIG_MOVABLE_MOVED) + step_count -= source + return ..() + +/datum/element/slosh/proc/handle_sloshstep(mob/living/source) + SIGNAL_HANDLER + + if(ishuman(source)) + var/mob/living/carbon/human/source_human = source + if(source_human.m_intent == "walk" && step_count++ % 20 == 0) + return + if(source_human.m_intent == "run" && step_count++ % 2 != 0) + return + choose_vorefootstep(source) + if(issilicon(source)) + if(step_count++ % 2) + choose_vorefootstep(source) + + +/datum/element/slosh/proc/choose_vorefootstep(mob/living/source) + if(step_count++ >= 5) + + vore_organs_reagents = list() + var/highest_vol = 0 + + for(var/obj/belly/B in source.vore_organs) + var/total_volume = B.reagents.total_volume + vore_organs_reagents += total_volume + + if(B.show_liquids && B.vorefootsteps_sounds && highest_vol < total_volume) + highest_vol = total_volume + + if(highest_vol < 20) + vore_footstep_volume = 0 + vore_footstep_chance = 0 + else + vore_footstep_volume = 20 + highest_vol * 4/5 + vore_footstep_chance = highest_vol/4 + + step_count = 0 + + if(!vore_footstep_volume || !vore_footstep_chance) + return + + if(prob(vore_footstep_chance)) + handle_vorefootstep(source) + +/datum/element/slosh/proc/handle_vorefootstep(mob/living/source) + if(!CONFIG_GET(number/vorefootstep_volume) || !vore_footstep_volume) + return + + var/S = pick(GLOB.slosh) + if(!S) return + var/volume = CONFIG_GET(number/vorefootstep_volume) * (vore_footstep_volume/100) + + if(ishuman(source)) + var/mob/living/carbon/human/human_source = source + + if(!human_source.shoes || human_source.m_intent == "walk") + volume = CONFIG_GET(number/vorefootstep_volume) * (vore_footstep_volume/100) * 0.75 + else if(human_source.shoes) + var/obj/item/clothing/shoes/feet = human_source.shoes + if(istype(feet)) + volume = feet.step_volume_mod * CONFIG_GET(number/vorefootstep_volume) * (vore_footstep_volume/100) * 0.75 + if(!human_source.has_organ(BP_L_FOOT) && !human_source.has_organ(BP_R_FOOT)) + return + + if(source.buckled || source.lying || source.throwing) + return + if(!has_gravity(source) && prob(75)) + return + + playsound(source.loc, S, volume, FALSE, preference = /datum/client_preference/digestion_noises) + return diff --git a/code/datums/signals.dm b/code/datums/signals.dm new file mode 100644 index 0000000000..47815339d4 --- /dev/null +++ b/code/datums/signals.dm @@ -0,0 +1,127 @@ +/** + * Register to listen for a signal from the passed in target + * + * This sets up a listening relationship such that when the target object emits a signal + * the source datum this proc is called upon, will receive a callback to the given proctype + * Use PROC_REF(procname), TYPE_PROC_REF(type,procname) or GLOBAL_PROC_REF(procname) macros to validate the passed in proc at compile time. + * PROC_REF for procs defined on current type or it's ancestors, TYPE_PROC_REF for procs defined on unrelated type and GLOBAL_PROC_REF for global procs. + * Return values from procs registered must be a bitfield + * + * Arguments: + * * datum/target The target to listen for signals from + * * signal_type A signal name + * * proctype The proc to call back when the signal is emitted + * * override If a previous registration exists you must explicitly set this + */ +/datum/proc/RegisterSignal(datum/target, signal_type, proctype, override = FALSE) + if(QDELETED(src) || QDELETED(target)) + return + + if (islist(signal_type)) + var/static/list/known_failures = list() + var/list/signal_type_list = signal_type + var/message = "([target.type]) is registering [signal_type_list.Join(", ")] as a list, the older method. Change it to RegisterSignals." + + if (!(message in known_failures)) + known_failures[message] = TRUE + stack_trace("[target] [message]") + + RegisterSignals(target, signal_type, proctype, override) + return + + var/list/procs = (_signal_procs ||= list()) + var/list/target_procs = (procs[target] ||= list()) + var/list/lookup = (target._listen_lookup ||= list()) + + var/exists = target_procs[signal_type] + target_procs[signal_type] = proctype + + if(exists) + if(!override) + var/override_message = "[signal_type] overridden. Use override = TRUE to suppress this warning.\nTarget: [target] ([target.type]) Proc: [proctype]" + //log_signal(override_message) // We don't have log_signal + log_world(override_message) + stack_trace(override_message) + return + + var/list/looked_up = lookup[signal_type] + + if(isnull(looked_up)) // Nothing has registered here yet + lookup[signal_type] = src + else if(!islist(looked_up)) // One other thing registered here + lookup[signal_type] = list(looked_up, src) + else // Many other things have registered here + looked_up += src + +/// Registers multiple signals to the same proc. +/datum/proc/RegisterSignals(datum/target, list/signal_types, proctype, override = FALSE) + for (var/signal_type in signal_types) + RegisterSignal(target, signal_type, proctype, override) + +/** + * Stop listening to a given signal from target + * + * Breaks the relationship between target and source datum, removing the callback when the signal fires + * + * Doesn't care if a registration exists or not + * + * Arguments: + * * datum/target Datum to stop listening to signals from + * * sig_typeor_types Signal string key or list of signal keys to stop listening to specifically + */ +/datum/proc/UnregisterSignal(datum/target, sig_type_or_types) + var/list/lookup = target._listen_lookup + if(!_signal_procs || !_signal_procs[target] || !lookup) + return + if(!islist(sig_type_or_types)) + sig_type_or_types = list(sig_type_or_types) + for(var/sig in sig_type_or_types) + if(!_signal_procs[target][sig]) + if(!istext(sig)) + stack_trace("We're unregistering with something that isn't a valid signal \[[sig]\], you fucked up") + continue + switch(length(lookup[sig])) + if(2) + lookup[sig] = (lookup[sig]-src)[1] + if(1) + stack_trace("[target] ([target.type]) somehow has single length list inside _listen_lookup") + if(src in lookup[sig]) + lookup -= sig + if(!length(lookup)) + target._listen_lookup = null + break + if(0) + if(lookup[sig] != src) + continue + lookup -= sig + if(!length(lookup)) + target._listen_lookup = null + break + else + lookup[sig] -= src + + _signal_procs[target] -= sig_type_or_types + if(!_signal_procs[target].len) + _signal_procs -= target + +/** + * Internal proc to handle most all of the signaling procedure + * + * Will runtime if used on datums with an empty lookup list + * + * Use the [SEND_SIGNAL] define instead + */ +/datum/proc/_SendSignal(sigtype, list/arguments) + var/target = _listen_lookup[sigtype] + if(!length(target)) + var/datum/listening_datum = target + return NONE | call(listening_datum, listening_datum._signal_procs[src][sigtype])(arglist(arguments)) + . = NONE + // This exists so that even if one of the signal receivers unregisters the signal, + // all the objects that are receiving the signal get the signal this final time. + // AKA: No you can't cancel the signal reception of another object by doing an unregister in the same signal. + var/list/queued_calls = list() + for(var/datum/listening_datum as anything in target) + queued_calls[listening_datum] = listening_datum._signal_procs[src][sigtype] + for(var/datum/listening_datum as anything in queued_calls) + . |= call(listening_datum, queued_calls[listening_datum])(arglist(arguments)) diff --git a/code/game/turfs/flooring/flooring_premade.dm b/code/game/turfs/flooring/flooring_premade.dm index 927b382b10..d521302302 100644 --- a/code/game/turfs/flooring/flooring_premade.dm +++ b/code/game/turfs/flooring/flooring_premade.dm @@ -192,6 +192,9 @@ icon_state = "grass0" can_dirty = FALSE //VOREStation Edit initial_flooring = /decl/flooring/grass + footstep = FOOTSTEP_GRASS + barefootstep = FOOTSTEP_GRASS + clawfootstep = FOOTSTEP_GRASS /turf/simulated/floor/tiled name = "floor" diff --git a/code/game/turfs/simulated/floor.dm b/code/game/turfs/simulated/floor.dm index a13648fd9f..f0150ed393 100644 --- a/code/game/turfs/simulated/floor.dm +++ b/code/game/turfs/simulated/floor.dm @@ -13,12 +13,6 @@ var/base_desc = "The naked hull." var/base_icon = 'icons/turf/flooring/plating_vr.dmi' var/base_icon_state = "plating" - var/static/list/base_footstep_sounds = list("human" = list( - 'sound/effects/footstep/plating1.ogg', - 'sound/effects/footstep/plating2.ogg', - 'sound/effects/footstep/plating3.ogg', - 'sound/effects/footstep/plating4.ogg', - 'sound/effects/footstep/plating5.ogg')) var/list/old_decals = null @@ -42,8 +36,6 @@ if(floortype) set_flooring(get_flooring_data(floortype), TRUE) . = INITIALIZE_HINT_LATELOAD // We'll update our icons after everyone is ready - else - footstep_sounds = base_footstep_sounds if(can_dirty && can_start_dirty) if(prob(dirty_prob)) dirt += rand(50,100) @@ -63,7 +55,6 @@ if(is_plating() && !initializing) // Plating -> Flooring swap_decals() flooring = newflooring - footstep_sounds = newflooring.footstep_sounds if(!initializing) update_icon(1) levelupdate() @@ -80,7 +71,6 @@ desc = base_desc icon = base_icon icon_state = base_icon_state - footstep_sounds = base_footstep_sounds if(!is_plating()) // Flooring -> Plating swap_decals() diff --git a/code/game/turfs/simulated/outdoors/outdoors.dm b/code/game/turfs/simulated/outdoors/outdoors.dm index 74a08a7c46..3503f8c783 100644 --- a/code/game/turfs/simulated/outdoors/outdoors.dm +++ b/code/game/turfs/simulated/outdoors/outdoors.dm @@ -221,16 +221,6 @@ var/list/turf_edge_cache = list() desc = "Looks dirty." icon = 'icons/turf/outdoors_vr.dmi' icon_base = "dirt0" - footstep_sounds = list("human" = list( - 'sound/effects/footstep/asteroid1.ogg', - 'sound/effects/footstep/asteroid2.ogg', - 'sound/effects/footstep/asteroid3.ogg', - 'sound/effects/footstep/asteroid4.ogg', - 'sound/effects/footstep/asteroid5.ogg', - 'sound/effects/footstep/MedDirt1.ogg', - 'sound/effects/footstep/MedDirt2.ogg', - 'sound/effects/footstep/MedDirt3.ogg', - 'sound/effects/footstep/MedDirt4.ogg')) /turf/simulated/floor/outdoors/newdirt/Initialize(mapload) var/possibledirts = list( @@ -290,12 +280,6 @@ var/list/turf_edge_cache = list() can_paint = 1 can_engrave = FALSE - footstep_sounds = list("human" = list( - 'sound/effects/footstep/LightStone1.ogg', - 'sound/effects/footstep/LightStone2.ogg', - 'sound/effects/footstep/LightStone3.ogg', - 'sound/effects/footstep/LightStone4.ogg',)) - /obj/item/stack/tile/floor/sidewalk name = "sidewalk tile" singular_name = "floor tile" diff --git a/code/game/turfs/simulated/water.dm b/code/game/turfs/simulated/water.dm index 3f004451d1..655e8f02dd 100644 --- a/code/game/turfs/simulated/water.dm +++ b/code/game/turfs/simulated/water.dm @@ -23,8 +23,6 @@ /turf/simulated/floor/water/Initialize() . = ..() - var/decl/flooring/F = get_flooring_data(/decl/flooring/water) - footstep_sounds = F?.footstep_sounds update_icon() handle_fish() diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index 4f0d6be739..ebf0c54b15 100644 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -29,13 +29,62 @@ var/movement_cost = 0 // How much the turf slows down movement, if any. - var/list/footstep_sounds = null - var/block_tele = FALSE // If true, most forms of teleporting to or from this turf tile will fail. var/can_build_into_floor = FALSE // Used for things like RCDs (and maybe lattices/floor tiles in the future), to see if a floor should replace it. var/list/dangerous_objects // List of 'dangerous' objs that the turf holds that can cause something bad to happen when stepped on, used for AI mobs. var/tmp/changing_turf + var/footstep + var/barefootstep + var/heavyfootstep + var/clawfootstep + +/turf/simulated/floor + footstep = FOOTSTEP_FLOOR + barefootstep = FOOTSTEP_HARD_BAREFOOT + heavyfootstep = FOOTSTEP_GENERIC_HEAVY + clawfootstep = FOOTSTEP_HARD_CLAW + +/turf/simulated/floor/wood + footstep = FOOTSTEP_WOOD + barefootstep = FOOTSTEP_WOOD_BAREFOOT + clawfootstep = FOOTSTEP_WOOD_CLAW + +/turf/simulated/floor/carpet + footstep = FOOTSTEP_CARPET + barefootstep = FOOTSTEP_CARPET_BAREFOOT + clawfootstep = FOOTSTEP_CARPET_BAREFOOT + +/turf/simulated/floor/plating + footstep = FOOTSTEP_PLATING + barefootstep = FOOTSTEP_HARD_BAREFOOT + clawfootstep = FOOTSTEP_HARD_CLAW + +/turf/simulated/mineral + footstep = FOOTSTEP_SAND + barefootstep = FOOTSTEP_SAND + clawfootstep = FOOTSTEP_SAND + +/turf/simulated/floor/outdoors + footstep = FOOTSTEP_SAND + barefootstep = FOOTSTEP_SAND + clawfootstep = FOOTSTEP_SAND + +/turf/simulated/floor/outdoors/grass + footstep = FOOTSTEP_GRASS + barefootstep = FOOTSTEP_GRASS + clawfootstep = FOOTSTEP_GRASS + +/turf/simulated/floor/water + footstep = FOOTSTEP_WATER + barefootstep = FOOTSTEP_WATER + clawfootstep = FOOTSTEP_WATER + +/turf/simulated/floor/lava + footstep = FOOTSTEP_LAVA + barefootstep = FOOTSTEP_LAVA + clawfootstep = FOOTSTEP_LAVA + /turf/Initialize(mapload) . = ..() for(var/atom/movable/AM in src) diff --git a/code/modules/client/preference_setup/vore/02_size.dm b/code/modules/client/preference_setup/vore/02_size.dm index 843819e16d..cbe0c9ded0 100644 --- a/code/modules/client/preference_setup/vore/02_size.dm +++ b/code/modules/client/preference_setup/vore/02_size.dm @@ -14,6 +14,7 @@ var/voice_freq = 0 var/voice_sound = "beep-boop" var/custom_speech_bubble = "default" + var/custom_footstep = "Default" // Definition of the stuff for Sizing /datum/category_item/player_setup_item/vore/size @@ -30,6 +31,7 @@ pref.voice_freq = save_data["voice_freq"] pref.voice_sound = save_data["voice_sound"] pref.custom_speech_bubble = save_data["custom_speech_bubble"] + pref.custom_footstep = save_data["custom_footstep"] /datum/category_item/player_setup_item/vore/size/save_character(list/save_data) save_data["size_multiplier"] = pref.size_multiplier @@ -41,6 +43,7 @@ save_data["voice_freq"] = pref.voice_freq save_data["voice_sound"] = pref.voice_sound save_data["custom_speech_bubble"] = pref.custom_speech_bubble + save_data["custom_footstep"] = pref.custom_footstep /datum/category_item/player_setup_item/vore/size/sanitize_character() pref.weight_vr = sanitize_integer(pref.weight_vr, WEIGHT_MIN, WEIGHT_MAX, initial(pref.weight_vr)) @@ -54,6 +57,8 @@ pref.size_multiplier = initial(pref.size_multiplier) if(!(pref.custom_speech_bubble in selectable_speech_bubbles)) pref.custom_speech_bubble = "default" + if(!(pref.custom_footstep)) + pref.custom_footstep = "Default" /datum/category_item/player_setup_item/vore/size/copy_to_mob(var/mob/living/carbon/human/character) character.weight = pref.weight_vr @@ -68,6 +73,7 @@ else character.voice_sounds_list = get_talk_sound(pref.voice_sound) character.custom_speech_bubble = pref.custom_speech_bubble + character.custom_footstep = pref.custom_footstep /datum/category_item/player_setup_item/vore/size/content(var/mob/user) . += "
" @@ -78,6 +84,7 @@ . += span_bold("Voice Sounds:") + " [pref.voice_sound]
" . += "Test Selected Voice
" . += span_bold("Custom Speech Bubble:") + " [pref.custom_speech_bubble]
" + . += span_bold("Custom Footstep Sounds:") + "[pref.custom_footstep]
" . += "
" . += span_bold("Relative Weight:") + " [pref.weight_vr]
" . += span_bold("Weight Gain Rate:") + " [pref.weight_gain]
" @@ -185,6 +192,13 @@ pref.custom_speech_bubble = choice return TOPIC_REFRESH + else if(href_list["customize_footsteps"]) + var/list/footstep_choice = selectable_footstep + var/choice = tgui_input_list(user, "What footstep sounds would your character make?", "Custom Foostep Sounds", footstep_choice) + if(choice) + pref.custom_footstep = footstep_choice[choice] + return TOPIC_REFRESH + else if(href_list["voice_test"]) var/sound/S switch(pref.voice_sound) diff --git a/code/modules/mining/mine_turfs.dm b/code/modules/mining/mine_turfs.dm index 165974bb3c..a4243aecdd 100644 --- a/code/modules/mining/mine_turfs.dm +++ b/code/modules/mining/mine_turfs.dm @@ -205,8 +205,6 @@ var/list/mining_overlay_cache = list() if(random_icon) dir = pick(alldirs) . = INITIALIZE_HINT_LATELOAD - var/decl/flooring/F = get_flooring_data(/decl/flooring/sand) - footstep_sounds = F?.footstep_sounds /turf/simulated/mineral/LateInitialize() if(density && mineral) diff --git a/code/modules/mob/living/bot/secbot.dm b/code/modules/mob/living/bot/secbot.dm index c440ad9c1a..3fa50ac351 100644 --- a/code/modules/mob/living/bot/secbot.dm +++ b/code/modules/mob/living/bot/secbot.dm @@ -224,7 +224,8 @@ /mob/living/bot/secbot/resetTarget() ..() - UnregisterSignal(target, COMSIG_OBSERVER_MOVED) + if(target) + UnregisterSignal(target, COMSIG_OBSERVER_MOVED) awaiting_surrender = 0 attacked = FALSE walk_to(src, 0) diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 9f900ccb9f..a89956eeea 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -8,6 +8,8 @@ if (!default_language && species_language) default_language = GLOB.all_languages[species_language] + AddElement(/datum/element/footstep, custom_footstep, 1, -6) + /mob/living/carbon/Life() ..() diff --git a/code/modules/mob/living/carbon/human/human_movement.dm b/code/modules/mob/living/carbon/human/human_movement.dm index 83a942425a..af9036e108 100644 --- a/code/modules/mob/living/carbon/human/human_movement.dm +++ b/code/modules/mob/living/carbon/human/human_movement.dm @@ -294,49 +294,9 @@ // Handle footstep sounds /mob/living/carbon/human/handle_footstep(var/turf/T) - if(!istype(T)) - return - if(is_incorporeal()) - return - if(!CONFIG_GET(number/footstep_volume) || !T.footstep_sounds || !T.footstep_sounds.len) - return - // Future Upgrades - Multi species support - var/list/footstep_sounds = T.footstep_sounds["human"] - if(!footstep_sounds) - return - - var/S = pick(footstep_sounds) - GLOB.step_taken_shift_roundstat++ - if(!S) return - - // Play every 20 steps while walking, for the sneak - if(m_intent == I_WALK && step_count++ % 20 != 0) - return - - // Play every other step while running - if(m_intent == I_RUN && step_count++ % 2 != 0) - return - - var/volume = CONFIG_GET(number/footstep_volume) - - // Reduce volume while walking or barefoot - if(!shoes || m_intent == I_WALK) - volume *= 0.5 - else if(shoes) - var/obj/item/clothing/shoes/feet = shoes - if(istype(feet)) - volume *= feet.step_volume_mod - - if(!has_organ(BP_L_FOOT) && !has_organ(BP_R_FOOT)) - return // no feet = no footsteps - - if(buckled || lying || throwing) - return // people flying, lying down or sitting do not step - - if(!get_gravity(src) && prob(75)) - return // Far less likely to make noise in no gravity - - playsound(T, S, volume, FALSE) + if(shoes && loc == T && get_gravity(loc) && !flying) + if(SEND_SIGNAL(shoes, COMSIG_SHOES_STEP_ACTION, m_intent)) + return return /mob/living/carbon/human/set_dir(var/new_dir) diff --git a/code/modules/mob/living/carbon/human/species/species.dm b/code/modules/mob/living/carbon/human/species/species.dm index 61102a0dd9..2f75a753d8 100644 --- a/code/modules/mob/living/carbon/human/species/species.dm +++ b/code/modules/mob/living/carbon/human/species/species.dm @@ -88,6 +88,9 @@ var/male_sneeze_sound = 'sound/effects/mob_effects/sneeze.ogg' var/female_sneeze_sound = 'sound/effects/mob_effects/f_sneeze.ogg' + var/footstep = FOOTSTEP_MOB_HUMAN + var/list/special_step_sounds = null + // Combat/health/chem/etc. vars. var/total_health = 100 // How much damage the mob can take before entering crit. var/list/unarmed_types = list( // Possible unarmed attacks that the mob will use in combat, @@ -332,6 +335,9 @@ update_sort_hint() +/datum/species/proc/get_footsep_sounds() + return footstep + /datum/species/proc/update_sort_hint() if(spawn_flags & SPECIES_IS_RESTRICTED) sort_hint = SPECIES_SORT_RESTRICTED diff --git a/code/modules/mob/living/carbon/human/species/station/prometheans.dm b/code/modules/mob/living/carbon/human/species/station/prometheans.dm index 4334d89fab..84b792a941 100644 --- a/code/modules/mob/living/carbon/human/species/station/prometheans.dm +++ b/code/modules/mob/living/carbon/human/species/station/prometheans.dm @@ -133,6 +133,8 @@ var/datum/species/shapeshifter/promethean/prometheans /decl/emote/visible/vibrate ) + footstep = FOOTSTEP_MOB_SLIME + /datum/species/shapeshifter/promethean/New() ..() prometheans = src diff --git a/code/modules/mob/living/carbon/human/species/station/station.dm b/code/modules/mob/living/carbon/human/species/station/station.dm index 4b00ed832b..34c5e03298 100644 --- a/code/modules/mob/living/carbon/human/species/station/station.dm +++ b/code/modules/mob/living/carbon/human/species/station/station.dm @@ -173,6 +173,8 @@ /decl/emote/human/stopsway ) + footstep = FOOTSTEP_MOB_CLAW + /datum/species/unathi/equip_survival_gear(var/mob/living/carbon/human/H) ..() H.equip_to_slot_or_del(new /obj/item/clothing/shoes/sandal(H),slot_shoes) diff --git a/code/modules/mob/living/carbon/human/species/station/teshari.dm b/code/modules/mob/living/carbon/human/species/station/teshari.dm index 9a7f71c86e..ad163ab68d 100644 --- a/code/modules/mob/living/carbon/human/species/station/teshari.dm +++ b/code/modules/mob/living/carbon/human/species/station/teshari.dm @@ -160,6 +160,8 @@ /decl/emote/audible/teshtrill ) + footstep = FOOTSTEP_MOB_TESHARI + /datum/species/teshari/equip_survival_gear(var/mob/living/carbon/human/H) ..() if(!(H.client?.prefs?.shoe_hater)) diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm index 011b3ba217..cb80e2af88 100644 --- a/code/modules/mob/living/silicon/silicon.dm +++ b/code/modules/mob/living/silicon/silicon.dm @@ -37,6 +37,8 @@ init_id() init_subsystems() + AddElement(/datum/element/footstep, FOOTSTEP_MOB_SHOE, 0.75, -6) + /mob/living/silicon/Destroy() silicon_mob_list -= src for(var/datum/alarm_handler/AH in SSalarm.all_handlers) diff --git a/code/modules/mob/living/simple_mob/simple_mob.dm b/code/modules/mob/living/simple_mob/simple_mob.dm index 55923db0b5..b096d1b062 100644 --- a/code/modules/mob/living/simple_mob/simple_mob.dm +++ b/code/modules/mob/living/simple_mob/simple_mob.dm @@ -205,6 +205,7 @@ if(CONFIG_GET(flag/allow_simple_mob_recolor)) add_verb(src, /mob/living/simple_mob/proc/ColorMate) + AddElement(/datum/element/footstep, FOOTSTEP_MOB_SHOE, 0.5, -6) // Need to go through all of the mobs to give them proper footsteps... return ..() diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm index 8bd7700d14..6d47f60731 100644 --- a/code/modules/mob/mob_defines.dm +++ b/code/modules/mob/mob_defines.dm @@ -241,3 +241,5 @@ var/list/viruses var/list/resistances + + var/custom_footstep = FOOTSTEP_MOB_SHOE diff --git a/code/modules/tgui/external.dm b/code/modules/tgui/external.dm index 42c8241292..64c5b5c051 100644 --- a/code/modules/tgui/external.dm +++ b/code/modules/tgui/external.dm @@ -74,7 +74,7 @@ * change static data. */ /datum/proc/update_static_data_for_all_viewers() - for (var/datum/tgui/window as anything in open_uis) + for (var/datum/tgui/window as anything in open_tguis) window.send_full_update() /** diff --git a/code/modules/xenoarcheaology/effect_master.dm b/code/modules/xenoarcheaology/effect_master.dm index 1b00bc53c9..b3f185fd98 100644 --- a/code/modules/xenoarcheaology/effect_master.dm +++ b/code/modules/xenoarcheaology/effect_master.dm @@ -167,7 +167,7 @@ var/list/toxic_reagents = list(TOXIN_PATH) STOP_PROCESSING(SSobj,src) - . = ..(silent=TRUE) + . = ..() /datum/component/artifact_master/proc/do_setup() if(LAZYLEN(make_effects)) diff --git a/sound/effects/footstep/BudgieStep1.ogg b/sound/effects/footstep/BudgieStep1.ogg new file mode 100644 index 0000000000000000000000000000000000000000..fb8f01367bda5c4449df2e5356fb913e26828586 GIT binary patch literal 6059 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 KHuYcD2mcSN3Ues{ literal 0 HcmV?d00001 diff --git a/sound/effects/footstep/BudgieStep3.ogg b/sound/effects/footstep/BudgieStep3.ogg new file mode 100644 index 0000000000000000000000000000000000000000..d8199cae7824f9edd4fd177460c8691db1c05fbe GIT binary patch literal 8279 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 literal 0 HcmV?d00001 diff --git a/sound/effects/footstep/BudgieStep5.ogg b/sound/effects/footstep/BudgieStep5.ogg new file mode 100644 index 0000000000000000000000000000000000000000..8d79d45fe6ef31812bd9cf64f5900f19143959e9 GIT binary patch literal 7118 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 RgOF=HN|Xp2NCUqv`5)A7f(`%x literal 0 HcmV?d00001 diff --git a/sound/effects/footstep/carpetbarefoot1.ogg b/sound/effects/footstep/carpetbarefoot1.ogg new file mode 100644 index 0000000000000000000000000000000000000000..81615d297053411a1540f6ec52cf2006613715a7 GIT binary patch literal 6452 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 literal 0 HcmV?d00001 diff --git a/sound/effects/footstep/carpetbarefoot2.ogg b/sound/effects/footstep/carpetbarefoot2.ogg new file mode 100644 index 0000000000000000000000000000000000000000..d1c7e1627ec2bcfe59b99949e88990ef552ac7ec GIT binary patch literal 5925 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 UDS9*^Te=O=7-IG=Ab0iu00&+FNB{r; literal 0 HcmV?d00001 diff --git a/sound/effects/footstep/carpetbarefoot3.ogg b/sound/effects/footstep/carpetbarefoot3.ogg new file mode 100644 index 0000000000000000000000000000000000000000..13ecb3398b1daa6b48d52e1d81dc3c5a5dc45e82 GIT binary patch literal 6118 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 K5>{8~E&UJvqGl%m literal 0 HcmV?d00001 diff --git a/sound/effects/footstep/carpetbarefoot4.ogg b/sound/effects/footstep/carpetbarefoot4.ogg new file mode 100644 index 0000000000000000000000000000000000000000..31850250becbf12d77f1aa42453213afc486e39f GIT binary patch literal 6273 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 Jx?XO<@;|xtx1|68 literal 0 HcmV?d00001 diff --git a/sound/effects/footstep/carpetbarefoot5.ogg b/sound/effects/footstep/carpetbarefoot5.ogg new file mode 100644 index 0000000000000000000000000000000000000000..e9a44765b18ff380666af8579d1df60a5602a4d3 GIT binary patch literal 6716 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 literal 0 HcmV?d00001 diff --git a/sound/effects/footstep/hardbarefoot1.ogg b/sound/effects/footstep/hardbarefoot1.ogg new file mode 100644 index 0000000000000000000000000000000000000000..2614872191782e136f2710298ab4833a1b2834c8 GIT binary patch literal 6315 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 z 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 XKc_+-`vnio@0tJgO(CSxsy5+2=rreL literal 0 HcmV?d00001 diff --git a/sound/effects/footstep/hardbarefoot3.ogg b/sound/effects/footstep/hardbarefoot3.ogg new file mode 100644 index 0000000000000000000000000000000000000000..639751fab0f0a5ff3b6bd196680b043239203ad1 GIT binary patch literal 6088 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 U?l|1FK2qT$E~POC;i~QaAHZiv4*&oF literal 0 HcmV?d00001 diff --git a/sound/effects/footstep/hardbarefoot5.ogg b/sound/effects/footstep/hardbarefoot5.ogg new file mode 100644 index 0000000000000000000000000000000000000000..72ebeca84d3db3ba607e672e2f960940988e653a GIT binary patch literal 6072 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 XXFg=l@x6|)UTpsnnU!(N#S;1tt>0f$ literal 0 HcmV?d00001 diff --git a/sound/effects/footstep/hardclaw1.ogg b/sound/effects/footstep/hardclaw1.ogg new file mode 100644 index 0000000000000000000000000000000000000000..1d66eb4d499192ba3bf09d786743b5fed54a0f83 GIT binary patch literal 4694 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 CDTa*z literal 0 HcmV?d00001 diff --git a/sound/effects/footstep/hardclaw2.ogg b/sound/effects/footstep/hardclaw2.ogg new file mode 100644 index 0000000000000000000000000000000000000000..a6a7951d7782d1a9633ad9453dd7402c2c3ada17 GIT binary patch literal 5174 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 literal 0 HcmV?d00001 diff --git a/sound/effects/footstep/hardclaw3.ogg b/sound/effects/footstep/hardclaw3.ogg new file mode 100644 index 0000000000000000000000000000000000000000..a2e5462199d174219d5332c224d8a1e5e5b0a5d5 GIT binary patch literal 4509 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 Yuy^G<-J*xl<>J86F>fBvxDET{KjjHJC;$Ke literal 0 HcmV?d00001 diff --git a/sound/effects/footstep/hardclaw4.ogg b/sound/effects/footstep/hardclaw4.ogg new file mode 100644 index 0000000000000000000000000000000000000000..bd845a8782a113bf47312c651b07f98871e2fb42 GIT binary patch literal 4676 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 H8-@M@`NEe3 literal 0 HcmV?d00001 diff --git a/sound/effects/footstep/heavy2.ogg b/sound/effects/footstep/heavy2.ogg new file mode 100644 index 0000000000000000000000000000000000000000..514e3ac3e24612f2aa79082e52c99f369d57a8df GIT binary patch literal 6381 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 Ai2wiq literal 0 HcmV?d00001 diff --git a/sound/effects/footstep/slime1.ogg b/sound/effects/footstep/slime1.ogg new file mode 100644 index 0000000000000000000000000000000000000000..a83b7646f1f133c0b62d70816c1110231bf674c1 GIT binary patch literal 5471 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 literal 0 HcmV?d00001 diff --git a/sound/effects/footstep/woodbarefoot3.ogg b/sound/effects/footstep/woodbarefoot3.ogg new file mode 100644 index 0000000000000000000000000000000000000000..113a89003a65bd45ad88691955ec2812c3693894 GIT binary patch literal 6554 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 kiXR1~_S=l@`FvmtpPU8w562s5dH?_b literal 0 HcmV?d00001 diff --git a/sound/effects/footstep/woodbarefoot5.ogg b/sound/effects/footstep/woodbarefoot5.ogg new file mode 100644 index 0000000000000000000000000000000000000000..6fbce27109eef8e378e64f372eb22ef95a4db6ed GIT binary patch literal 6708 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 Z%Q$@Sa_|VoMe<7JhXQ3_gC2$8zX1@ULNEXT literal 0 HcmV?d00001 diff --git a/sound/effects/footstep/woodclaw2.ogg b/sound/effects/footstep/woodclaw2.ogg new file mode 100644 index 0000000000000000000000000000000000000000..29b04a95541aa956e9e1afa5cd63aeb77e61ff04 GIT binary patch literal 5430 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 literal 0 HcmV?d00001 diff --git a/sound/effects/footstep/woodclaw3.ogg b/sound/effects/footstep/woodclaw3.ogg new file mode 100644 index 0000000000000000000000000000000000000000..9f4ac6d3340c107441a954fa7c522de6bd23631a GIT binary patch literal 5492 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 literal 0 HcmV?d00001 diff --git a/sound/effects/meatslap.ogg b/sound/effects/meatslap.ogg new file mode 100644 index 0000000000000000000000000000000000000000..3d8ea7df1ac45551b57b584903cdc324f3126dc8 GIT binary patch literal 12414 zcmaia2|SeF_y04-zBQP!4rVMdgR(QIkafn+ShMeIc4es%$)1=bB)jZO2&I(l`z|8N z7SbYATK*4xzRT1PFs1lm39uQKJQ7cr^3h&(X}I5j#t_p23ulM*ZjMgZ^bC2GT7({XI?@ z2D+nsJe|ys*`st((vnirlG2hgC{aUSKTrQa*C1EFV9XJ32-V-I81?h!5P%l!k3R+0+&M*31M_j728v}UnndFz9Nmk(lg@snjiugx!x&*&CMzlc)QhSP`a0a?sB(%& z$8mzy4P;<1x-2)49{V8w8ohKcDn?KGeQ}0?()$NRsY;uojic%e5{=_{J*g>k=bCnE z+sL3{+a<7f<1wXKfgr2D+d=^(aGQYkEx2wye4rjVG$v&D zMckN8ZcIkg)J&fUJ|VUip{_HbAv2*-R$13=TB594uG`FBw>`M-$Qk!f`4;u&;HVsL z9R&gM1#y}0Fogo#g>P|%(Ac;t3c%$^B`CUd0Ze+4ZmFABjb~1?M`g3`K!f-|1LN@! z(593}s{!&ovrGT4;%1fU`u{Jg9=%vV71U)<0J0}QNYg~9Cs3T`Si`*lXj4@a@vcBw z?I78nAQiA^2W#|^^@hIco%oj#j?4}Ks#3_V0AwGi4HJopKsk$`Gc!T@GoUJtH1fYc z(Z_fJH-f(Bmgz;Jl}U3vRtpJa%UM8sp7F0Fa6o*)3MzXvdv^%OoV}V~4$ql*o?w?jZCz%~p{Xt(2m83zbD6uj9Kms(Bog01f^xjRF2M}7Yj zKB}PI9A`PZ?_EPhrBXY=(WU4NzTlh88TnGZm}0(^R4sgYjFAbKNJ;RuhShs;YBXX{)XicAilRM6tLWh~ku{wY;DjoQ`)%)3mi% z3E2dXDf#PBpixmSX=>D5$4(NL71)m{1HIzE4fjcCgoStPzsksGq%o^7SjMC!Ol8gx z&4?DEzE*ca<{w?Roeg<26ZK{$#hxSXe*){@o&$hR6MO8FWT#}Qp4=D%b-KR>{+H(j zzYE~L#}FYC?5?Krwi9x$6GYdkP}f(@t~QUN zteXFEn7?lGW+vpnJm<(o1aPVEbkZsR<2m`Fsc#ii1$EPftkO?j&U8=6F29@izPynB ze|U~ZVp&#VS$yJpe5z46zyf-XW}wi2c}|BE@;vBG z4dVK{fA@H13{+^aCdYpp0027D7zxMch_Q*pl!@Gwi3HK?%>V8&AazPse?k^i>}>$x z0sukK$g!}*z%+HgGnTYcYeG~7IO>9zoUvsv8AcqFKyaFx$eEUOTqoo1l8GonLoX&p zSRoa~^rG~F?y4d!cXmxQ891!lm#;A_MR$+fixVly7}v!}WOB-2giBeS z-{lsK>-H6sISGmPidmf#s=-MB4fw}UFq(#dsKNojiP3}}bDeB5j9E)F>6cnXn&5F| zxu(N7THe@xDe8MMFiZ*3bQsfvj2%>4&5apV69oWN2L$|67nOC<1Yjb-lE2VMhAaUt zOkmR-fxFJI>CfDj9g>wZHX{zO5vRW?_9cef_UyL^e$#f;f?>Pi*oXk#&7# zMqFSgPBpvEvtO~u40$7?Zv}pw2B{%4nNjxBzP4Hau+oPgvyvyyG|L$W6ODGhzd{g+&BRxGzQoL^ntdy3s%;84Dhez58{8{us`?vhD{FkVKx)l{iU#qD z3h~N@s>2HLt>y<6ZPon^bvZSaTg@LCI>ooz{3~i|DjT+ssBP6--2q!|l98pDfzry& zw(_<%zpb`_!De4%QN`v{?7)k<{)UfRZKoSU(8k1&1+wis3veI4_F;K82iF^Xm7i4~ z_Ja(@zu`tMB3r>}5B+$+zV2PIbB>CsCGOeaN-L^!Dk`@c{KPt|w$zP@QMR{T-zeBx zarnJaNVSm>423x;s0a}cLqzD11(d%$i7`6))3^Un86`M&>qk|0aT}ZMK-V05h#CD_1 zQgwTCGg$E+81lFYO+kqf-n)Q2ZQ@;DI_dNQRm_g}lpv2=dzE)jS|_tO!=%@XU50h( zN*a#{AglHKVrF%GNim#&moOg$fm}4Mrc++bYN}h_1hOhAW+&jKn&CEnQqxFqMlq|6 zE~Xo9>MPNmE!d3$S@j(WKbEnYMFv^jjY-Gjt8b^94CZDWv5HB>>tdSI@p|B@@c8=c zCe}Vu)43)-a^R{!R_S;jiEe8fy`~VDHN)|$s+-Kcy{fxG;ld@H1blrHySJaz8aLjv z`bc9X=T2S{-P2ChN5Zl7 zx6?u4Yjf7gIP$m?$SU0=8JuC`(^{J81roANlA6}$f_&umC#|cFWDvj`BIsu8o;i5x zkf4AniOx0u=mvH;2;i5r#^@iDG$_B$6$zqYP7;l!#E74YZ^x@T*6Mk zN_3ffV=&+@B*3`i*lnrx6S^SuOjdM&2I$4zDDd2&<|^Tg8Raa7JHrG@I6=FVz@0(e zat1N0W4WA%)kHC|MtCgdIt;HXTmlBT^hhwC^BE;uBEbdyJx3fEofxI!P{C%>Se95l zyhwR8sL|>W5DFz-gVtWvjkBt>)z_z`3Bn*0+^Sz@S%VSmHn^be<8wq9NTUH%Ig3EK zICq%SAZ`OG3!aR~SY~W@ZVa#7V4THb4&K(?oIJFDqjD|QJL~{eNrOcvpjv`|k=+ zeMV0M{Gs77*H*-EGl(DU5ylJ#dYxI|im7>H<1ib=v7mVh&f{^S!XQd87!W?7N0Y7b zcY{n!u)-yoM@Pq`HC_VbO(R?~ZQ=z=QKBtroIDaWtEPh~nYK=n09_6besoHfi!%X- zbj>^Emi+tyl1^Pf-0k9r zFUFRRZH)$lZS`YqAH5iufVRj#LJL|052ES_Bj{Mr41fD#)BfEDQ(FHEEf7%af5(xH z)Q_P>TLAW9ctMbf9=C+S7Tw9{$$q^z!)f^Fyp?ch+ zLm#Q@crg0!+@n|!gedgr6c*eND(V;TkzIZPHS*}i10+TO2$=QS!c6y~x^iPP39)H` zFsD;2CW$!hdRHB;F3u^kR0-VF#Cs#xDcRWYo-zdt!seJ)rZISkhTD*vKG!0bmIrod8HeRPpigZmC6`@1Q~&F0sWgS15&#$ww6} z?cY}w%H#Im7i3kPzvQDAM&KOd5hhnolN=H){p zQ7ArMG%p&3Lh)Y;<>BT-^P>0#1X28g0{r}FG#{TJnuk|_FB~l>h~h@`3!_kiXf!{X zUyxgnADn{*hw!5Wh0p?gU<>5M&&A1y<_8}^RHOz1UDDNwF@%pVmjeFrhL(jFBHOK> zo_@xxf{?2sZeOCRFs0j(k(ej@60Kj(V%_W%x;G zPOFm{BoVUKEuQauZ|NxVgmIPW(oHXUWp+f|sDm&f28=%VPG8}S4(>1mUY@r~6yOZG zb1Tl>nGUiIC&-zX6jNoDT9aBH;fqJh1F&yzMQ>yRW{8kgPwm7-==()6$hVZ)WP%*` z+AHfYuQF4&nM#W$ArpuhqARd>`a!Eps|@wV)>BdLbhBCl272M$Syy=V;h`(Q$opRX z@ef8|Bcx@0kIS6!;q%W=(;w>b7^{vy#ZXy9i00g_P*I0rihKpx+ji+FCjn7wkM$ES zhwna{>{5TtFpT!CYp^cxd)g?lzFiZIh zo)hW%>SgC>XsUQVF`x+;NEIsSXXy3{1x>g*4^8cfJt>yb`=_&>34NSikBX>*uD}Oq zY!-YO)XD34qi)Q7Y3~zKd+l_0u1djsali`l*V!Q&Ab%!*K{=B*Tz+GZ_`D0C`B zp{-8iegce$D82}QF3XM4==4ML#B`#ka|YI5_7N=rM}%A}b7J)AP!uFd+OR-Ebk2@g z_Hl~6hUg(M_t!g_g&giupk%ctH^=+z4VzwbOI@P}auEb4nEJv+#&FevC$DeNu$C|= z?WL)QU0`d85RT*}=oFe*CFp$G1U`Fv=Q^R}?p(ACcX!@A&=93V@(!RA6a=YBz1)!C zK|0$KrYe`0PK<@MK@olB<>t456}ehD2qiEIiP+Fl^w$YbExUiF@P4Xk<-ngmD^>%S z-j2w>_06?ZrhKNr_C~~_I;zS!d!ZB8r+)4sr4M>wUJJ(P;-ku4wRBjOxon8N74k&#;Kg&>kVZt9oFSDYyu++*=FiOw;@4D^N*XoK-P_H4@fHP4qHC3}^^HsN-Kd|O zul2p0KH_1_8JBzdOmxr?pog#@dj7a;oK!Hw@-w=8%KzNS+vl?21BU|~ObmN-+<*$# zRT%XAUWz|Vd5S`VtV6LCuVf*`H|uIcGz44_Vbq72s{xebUFDP;ZVkHD93lJX_UC@J zjKBQx`c4VN2N8xB?0M)F{azU5bShu_15zX}F!uC^{cF6}GG1Q+9d>}HOKhT>yO{5s zlxhT9h(X|N_Ym1R1A^smA2y~jvknWXHVd>69gKoKzu2H)vv_MaK(uXI!sw^`P4_~| z*VgYnfHYEpA!XRx3Gs!SN_}14*;^@+UzDbE%!GjKve(~I%pW`llwcn(??G|0qm|g3 zi$B+|-2bk>_CfhhlQVNkvxaWbuI=?e`!(GBm=LonrJERG-ju19VyX1%mkElV!7pb6 zD_ACbZHZj;s*r3iY!UtIe|kJqlpFWJA2J`f{)Iu6^HB? z@N;Qi2r$Yqu`Py1N}sV6jHcEz1tuTesM=^3n5w+uq{1tQ%chDnKXZencp3KzZchcw z^9UDe(telbZYP&ReC+l*H&{Dm;(C}-{Q%v(){BGeM4STEHKQFXED-4x6|)$ZOj9=x zX_W3r-ojhiS0v7PRw}kRR)vkR5`bc_kntL29VSZzF#0l6@y;alQD*+#4^j7vOHT`t z-P#|bDIM=q-~1&8%vCl&$kBy)J*(ICinuCRl8gmhwA!a14#WeaJU=Z39^+rxZri>#)mth zCuq{1^Qe9b0dBYG84LSvHzC`(pJ9UK@ir%b$WTqc873AU2dHEdiM@=k{6X>$=KkE> zj2{#==exzR$>F$ZkKPD}M^F!92eulc{qWWgVF8uAi274!jIPimhYM$vtgc#70NbHJ zHGPY<46#Cy{QI^a#TMJ*+8%{+2{ba?*u&zskF&0W9}TeANBZ=;ImOHGQ<$rvJac>P z%$;b3+(68nDW}^?l*jJgrkS4x!SIf|?a#b<)H?VYu50`WfAdF9u~YEA;;S_4Kl zzKx2^p@1p0&U(`vxfm>NR}h61c%t-<=05V*n~NXr71`+rIkTOh zi1pK~Aqnz`#C?O*Np}ci*>5#INg4RLWo_Q+28QOf=Rnsc{{X*S= z;GT3e;Nw;9)#(Rk1(125@)_%ltj4ek%IpF|0y((P&0QMR6i@7=7#wsaIOF(6n{9b% z?5nCWHd*h*t$Yye1MieCvnys4Bif9Vs%;~u4HVoc^D7z~-u`-B0yBQL4jGgQa1FI( zW20W$4ZQs9%LDw2hYZ66cI%5#r`~xF1fCLpPprF`)xkI(-3Z&g^gUZ33a4idwvcvdfsyiNR_RHW_}S#hT%HLU2PuS~9cTPbxgKIA#H?^_4!J7*GZUyWF0 z8c<*-)~l2epR%`qKVpyKf)+#88O=k$(Q%o`WQ- zvy7Q;PnzvRzO^&|3YZ_9E0k*0W;m#vt2B*-&3?@127Ci&G0rmI}$fL1Q7ESZq zNg0(0zKph=eZE3XKm#im`@s?D;D)LuyYaHL3xsM!vJQx4ZUEwZa_!_KG2Zux(`@l8 zy60}`#Ua<3MhvH4g;zlv_fwQ(N)nthZ4E9c{l9d$4 zwkyrY_TtniQvFk(Qo!zR21ZC}LfgF<#1W-E?KaKZhH8KrHsNg6y$MCC)4<7ewouwy z@q=%?l8qQ_87WCdQN|%sTD zn};7ywfCBAG(jRyq21Rv9Ju)jGQh3ci#L7k?tK4q*0&cIUPc|ZD_#Hy$%mXxD80$X z@5T!34oTW_&)%)=LDqd7y4G*|=sa3Oy`W=7!^z+3EKA2vIk-%dz>ps=L&!aAEqD8r ztj%U1_bkLKOP`NIF^YDyW?jKT>n;r(7m+mGaDP=GEC(=C+B0aKsuxy!(cAllB7dP; zx_~cJ->~LgPMyl^0@KMB3+M%Dsq8Eyi88a9f>h02mUx?-uu|`x84?bGtA}*kVLcxO zraRJ%-iEdr>59!2$DSSO%_J0dNlvgVx&uOIjmJ!%L+NsHJgSdRy>m4pOxgx@E8Of{ zJ*#}(8_3nv}7 zTFuEx68Wpr4JmJ@-B;hR0vcL!vK)%s-*9L0BlLD78)6mDDVCiKhugXnY+f5m11e`R z2y*F5Q5jBq;OjiET{_FW*?q-a{=mwW7cSQiVBr1>^pU2g7nM6a;-0T0kA<3AuKnpg ze?^#A)hqnZs~40)>gc{Ed8{YLCDI*I2UD(=zCzvSkL~@0A#ULX{hoW6)4SlOb*7OkmV}6EBcppVL>;M8beq+tcN5qsI|mr;+nFImmnQG9J5xMYLX|J+(9@*=7#U;J#~q49G7 zjwLvzF%PqM%v65*z>$&DZKq{}6J#L98q0i%hq#zP;p_|Z5a2WAm{N zyDgS|3MU%x>KkjL`7SC6VcQ?Lk7dC-4)MSh{Xw@^i5pve&R+vtTta)I-!cO#SkL=r z^p770%wA<2%~A-)C2lATD>maUgl9Aqv8nJSEbgXJOMlvr_1lRV%M!|96aJu>}Mubi0bBg3Y_= zSqw1eRqZo+$@5a(8a}Umr6~0B4zUrzkagpui>E@C9iVrcC{k6WWBE3-acgLEUpw25 zvI?+VMItdzLX?L;XGs@_|UiFP*!-V)~e8kcAM;HzEBvHNmXZ0@6}iFd5_I zP^2{cBN;|n#M#joD&~mr@N!@?rWI# zxz(mXT;2E2=O6m@iaB2p&-&Ko=jgMihRuzC{P|8!{TxYpxog#g#dDl8@L)7v@(m#? zM$O8jpMyi}qTDu{xS|09IL=B?)))LID*;BgfHU=TaerEtjQYK(fZPCfj^TI8Fk=sb7)$fkQ|2gyW-UpWq>4FbgfGqp_4LVE$ge!e`G&t+PB1(F}V)yDF%*Dz= zp-MugJvZ;ts|toJOz0xVVoi>?pe1xDdC^s)!$+R9b}<;o=LnjDQ!nZn#nGH zbt@!S2_~nMqI5g$%Y7RynnASOGl8&vQ!0~Zruu+ZFT3`cVECij)34^o?s8a5Y@g!> z8W9Pljop4Fl%-4^WN2=%bK;duAM?OZ53T#uXoM*4G(w9J#%6-LhjFUobn-wIb;mN& z*i00!CFB=CTmaWc)feE&shjNU4s{Sy!E(8JH{OpU&N$NM@+Jw(*pKADWL8!+!a3A8 z@UQD1aP6OU^tzoWx;lk93}peT5Fyi&)t8=jzWjj&s-+X>#RGo{)nuhU;=AfI6W>Es z#cSMOS9PyAx{d<~D#awqi?i>BhMc+G&cSGi_!9yIBhD0lNY{%YSwOPd@jM$I>LCXb z*ZRMyAQq!e>H$i`#;RVueTtMF4$+U7k%w-ny&fI>=M6@g9tyl5yhAQ;he;>ec;@~P zXpZE~sB|ij_WeELF>~q373`Sf*7wM}>Tkow!@Y`J-@g&bckm;VZ&4Urd+>(+5g|-A zF__T8$o(df-M|9d(AxHqmHy?xBqWpAczI-Sm70bhFRJqg3Sj4FVbA?+1RzQW_rvYd z+my>}Uj;~0Za?(NPg+Q#cV#>q{3kVi)#zEi2EzZTlSx3?;kv_f4OP~Jyc1Ve^KHW& z5lhxloCu%sOICl@o}PU5`dkN^WcABCxT4v|;3g%Qw+LgjLF_E}p#*oS!8fH0-W0@n zoaz1xxMl{Bj2OrkksQkF@Pn#Wl3WYLV@n#71dDgYOrWudfz$F0xp|Poa&}Tppf6J( z{3|U3Lr@ADAS3q72U7PZrC7ev0e={}8;TLc!iOw+Un{TBtu-e?0UtD>Rf2{e1Jxf5 zh=>{PJ^8x1)ZOUn<-9>cE3FTreXOXvRF!JKmRfcpre%{hf)<@u%F%PulRoec4d8<~ z!z${2bHESU(GO|EU0Y4kVL5a0^Yw!UAQG`RTvt4oM_QmJWkMT*C@~*&n2q8Ur5`?q zBqR28vmbN@EqOv=t|ZDDSH=RvXY4;>1RF&`6tvsEsAY$8H9{y)(QJgzRr?IoOEu1@ znGgT6y!I00+vIh>N0+lVpGj4WX42HthwW$Z>K;QWfSedW4+?a~UD}S~ny=^}BrH zBbn2na-}vUzNeNCU8vGo7yK>_Q8G6hjJ>#B;+b~UA~t&GJHzgihqR=c*xFHFOR3gF zuU~TBC#uMNu`xC@@78LtvX&Cx!j-cPSTH`HLlm;FHb&Q1Wx3=SFl>F}v<_|D<~txs z)3DBZDZn2#9h54l$1Yx9>Q~tGFJvMB`$WdQVdY}6?L?RtRcHOdpc0=>zScYV!fQLd zJdv>{{L$rVY-!_fK8#MC#(Hb*>uQTRZWhlR1a^KN_81N*y$W;bNw#zsV@p_|yxf^? z8*V};8}TZ<+B%l8xEGlFTFuHrmtsW`QJGaDZybjlt!D-kF-eadU!4(L!tDTs^hRE8 zw8p(pwtm?*(RnZ>BSNgk9i^AP$Pyvo&k!<(St{Rr3tfwR0bD>t=_2f#lx)op2zd3&PoP=_j=>8`H z@Dm=k0<7xL@{E`wNNz7piVMeGE(z!TsU-uH2!eC|P976Wuc~QB&_>tOThJ6y1Dfbglxz{D#}|$p9;7~ucL$5OScfP;8>*A zLnKx5&KUp#hQ36A5eK>5?6PYwQ9fgL4+LD2fPc4&ORTMFO!Knq(3ECWp?wfezUC=Y z*t|1HCS=$?3jPDE8A6^bh*UOYCC^_mV~{)O%JMPEzY7Esk&+2=@htYM;nz>}h0vZC z=YKG6Jvy{Ph{$dp3=grJMwfftui=1GC$Cq%8MF4^my4d-@&B-@b2)NDhe9l9<@=$e zy-kaMp-VMOEt%h9h}=T+3?o{bxndP`+g?*;;$hCkgZinIE&ZPZygyHGZ_+?6AO=EE z8=rEQrNDb+h!YWs$`heWN-Z6QxPXTQjlrC|%DyS!5k8>v@xid|_-gGog&Bg-Ce;*i zjaxf0a!J(P$(_w!CR&EXWoddJb1L^mIUI{L>S`;u1{gPTd31041nbA#d2|7YT z2m(0{eS@a%HzkZfpsin$z2a@A_O#XrKq3aP1@E__mC~YbLPviWimfx&B(Ll!!8TK! zyna|w2q9{5Dz1;|8HMO3g&JdeGBGj{{@=S!V2CD%ogK;7`3$SzbY6ar5ykplCw2_Tn@vXS$j` zRNjGZQ(q*8OOxv`!IKgZHmDYIV0a$t^2rb=Nu6E3EahZq|BZZSt+lY0`zYg!BvlGn zp`rRzbLW~fr{{kD{AgGI>tb%II6N2-M=(6*-M3Rm#T>@&Zz83m1Yb?ZaJ;Zzdo9wH zNdX4bOTyW2wSSM{A|nV>{_V9o9C< zPtM8vY!GAZ6&tc^mcQ3MRon2Fx%;gkc2{`>JRIAJHgBCIPfCv_!#2cytxV^FBMLu? zWU%CZx;6=cBcf){Z~LgMK0j-Ku=KN@_G)RXDDMfn3obdS5YkNFVLFjt_X?T$#Zqli zswg^O5?*T%eQE|y!KFfk%n4fsN_ROqm!~GZ>z|r$HfB;m4EVatJY-_~Y=DZ%A^Cmk zOzOG&K1TTNugJEPu*60@1azLEP<4fq)2%Mu%yacc&hjgjK6P&f<(h}B`?B~3;kAvF zlco$X9qO)1k_CU+leevJ6|pH%RE=5Lgd2v7k zF(BXB@CNfzkNSY(!`sll?z87kZ=8x_5RQI%+m|ApxUwM*xW4D!Y39%x^u1Km{FQ>( z;JVGzP@ zAFI*ptGK^Bkt+gp8>eQzc&hLz?>zL};EbnS`m*$3r0?S!OU=TT&9N8PMLw0ctpp>3 z+fy#E=+qV=so!ZeYQJ*){ppvWIrR-nsXn(;!sb+gPIA87+S(jBFi4=>-Ah{Ltv@y_ zt>H0MZZzPfS^GZE;+G3BE;YnSnhJb}NEJ)X&dv=N(vG`T>Q_=t~Nn$&cdTblwRU@K&-uavDO(!qkJ;JPscqAMX7M7M@<~ zZ)5$<7dg~>{e>_@95E1f)AJ5?s-;Wh*4xT$jYFfamvsYmCUwh+_T4lb0_0Pf3U0k9npO=>>wq%Fq#=ceA4i z)8R8+&7;RgkhkNNaX})&ghnz=538cJDd&IlbU4ZdSv%b^a2E#+UvMxF19T~(=xJpY zZ4IwAGnD*(9KgpCuM^z-j)D^LOT|*9_g9dfN;vP_(%mWl!s*Y8122-bYC?@?SE;}Q zB_t;;hsKL<1iYeJKA-XyZ0=F8qZ<6Id)uag704!G&%BU`b2eOW-DLr= za)BDHmj05ww0@;U!6FgyaK50=5Y_SZP}q-*p_Drt2Yw$YxRlNZXg7)sr7*B!f_?T)IFWx46mT6Kn&C)jr~H*2jafIKtgwUqRIij2<; zj4ioCG~MY5nWwleUfmw)R`6a#y!wdgyVrY;GS=Nnsxi4;>x0_2@qy%&WlP_|vR53s z8T5qILHv)Uuj6`GYk$zzUXNqHc%tPF3vP!*>tMC?p8eOS@W(&5(T2#E>mq}*D$k=?=%alLeb&eG zE59%4``>sQ7$9eVWhb|(_8rC2f!GBe#|Ab$l|yR_E#OM8;`pS7A&%nHPrVFGM_RO1?1T1m literal 0 HcmV?d00001 diff --git a/vorestation.dme b/vorestation.dme index c41047b091..9c508495e7 100644 --- a/vorestation.dme +++ b/vorestation.dme @@ -67,6 +67,7 @@ #include "code\__defines\exosuit_fab.dm" #include "code\__defines\faction.dm" #include "code\__defines\flags.dm" +#include "code\__defines\footsteps.dm" #include "code\__defines\gamemode.dm" #include "code\__defines\holder.dm" #include "code\__defines\holomap.dm" @@ -167,6 +168,7 @@ #include "code\__defines\dcs\helpers.dm" #include "code\__defines\dcs\signals.dm" #include "code\__defines\dcs\signals\signals_subsystem.dm" +#include "code\__defines\dcs\signals\signals_turf.dm" #include "code\__defines\traits\_traits.dm" #include "code\__defines\traits\declarations.dm" #include "code\__defines\traits\sources.dm" @@ -439,6 +441,7 @@ #include "code\datums\progressbar.dm" #include "code\datums\reference_tracking.dm" #include "code\datums\riding.dm" +#include "code\datums\signals.dm" #include "code\datums\soul_link.dm" #include "code\datums\sun.dm" #include "code\datums\verb_callbacks.dm" @@ -527,6 +530,8 @@ #include "code\datums\diseases\advance\symptoms\weigh.dm" #include "code\datums\elements\_element.dm" #include "code\datums\elements\conflict_checking.dm" +#include "code\datums\elements\footstep.dm" +#include "code\datums\elements\footstep_override.dm" #include "code\datums\elements\light_blocking.dm" #include "code\datums\elements\turf_transparency.dm" #include "code\datums\game_masters\_common.dm"