From bca65962e5c0e9dd93b37a988ed1b97d6f807c28 Mon Sep 17 00:00:00 2001 From: SkyratBot <59378654+SkyratBot@users.noreply.github.com> Date: Fri, 9 Feb 2024 00:53:36 +0100 Subject: [PATCH] [MIRROR] You can now move and talk through statues and mannequins (#26414) You can now move and talk through statues and mannequins (#81188) ## About The Pull Request I recently played a game where I rotated my skeleton model while rotating my own character at the same time and it being in sync gave me the realization on how cool it would be if the Coroner was able to simply control the skeleton body. I find skeleton displays very funny and I want to see more funny things happen with them, so I thought this would be a good place to start, with the benefits that it also works on mannequins and statues too so they aren't left out. Basically, while it is unanchored, if you have a statue/mannequin grabbed, it will change its direction as you do, and speak the same words you do. Your own messages can only be heard if the person is directly next to you, revealing that it was you talking through it all along. I was originally gonna add this to the simple rotation component but moved off when I decided to add talking through it, I left in the code improvements I made to the component though since it is one of the oldest components and hasn't been touched in a while. Video demonstration (before I added the person also talking, just ignore that missing) https://github.com/tgstation/tgstation/assets/53777086/27242fc3-9649-418d-95cb-b31619319e97 While fixing the Toilet bong's rotation stuff I noticed a lot of it wasn't up to proper code standards so I went over it and fixed issues I had with it. It now doesn't give text saying you found something nasty to species that still likes mice (like flypeople), and fixed its update appearance to match the codebase standard set by the introduction of ``update_appearance`` many years ago. ## Why It's Good For The Game It's a funny small idea I had and got inspired to add, it's a niche mechanic that I think fits the aesthetic I am going for with Coroner and also give a funny interaction with the human-like inanimate objects. ## Changelog :cl: fix: Species that can eat mice don't get disgusted from seeing one in the toilet bong. add: Grabbing an unwrenched statue/mannequin/skeleton model will now move its direction as you move yours, and you can talk through it. /:cl: Co-authored-by: John Willard <53777086+JohnFulpWillard@users.noreply.github.com> --- code/datums/components/marionette.dm | 77 +++++++++++++ code/datums/components/rotation.dm | 61 +++++----- code/game/objects/items/rcd/RPD.dm | 2 +- code/game/objects/structures/mannequin.dm | 2 +- code/game/objects/structures/toiletbong.dm | 107 +++++++++--------- .../transit_tube_construction.dm | 4 +- code/game/objects/structures/window.dm | 4 +- code/modules/art/statues.dm | 1 + code/modules/assembly/infrared.dm | 4 +- code/modules/basketball/hoop.dm | 2 +- .../recycling/disposal/construction.dm | 6 +- .../surgery/organs/internal/tongue/_tongue.dm | 1 + tgstation.dme | 1 + 13 files changed, 171 insertions(+), 101 deletions(-) create mode 100644 code/datums/components/marionette.dm diff --git a/code/datums/components/marionette.dm b/code/datums/components/marionette.dm new file mode 100644 index 00000000000..a2f58031768 --- /dev/null +++ b/code/datums/components/marionette.dm @@ -0,0 +1,77 @@ +/** + * Marionette component + * + * Upon being grabbed, we will align the direction of the parent with the direction of the grabber when they rotate. + * While grabbed, will also speak out whatever the original person says + */ +/datum/component/marionette + ///Reference to the mob that is grabbing us, which we hook signals to for marionette stuff. + var/mob/grabber + +/datum/component/marionette/Destroy() + if(grabber) + UnregisterSignal(grabber, list(COMSIG_MOVABLE_KEYBIND_FACE_DIR, COMSIG_MOB_SAY, COMSIG_QDELETING)) + grabber = null + return ..() + +/datum/component/marionette/RegisterWithParent() + RegisterSignal(parent, COMSIG_LIVING_TRYING_TO_PULL, PROC_REF(on_pull)) + RegisterSignal(parent, COMSIG_ATOM_NO_LONGER_PULLED, PROC_REF(on_stop_pull)) + +/datum/component/marionette/UnregisterFromParent() + UnregisterSignal(parent, list( + COMSIG_LIVING_TRYING_TO_PULL, + COMSIG_ATOM_NO_LONGER_PULLED, + )) + return ..() + +///Called when something starts pulling us, we now listen in to that thing for rotation. +/datum/component/marionette/proc/on_pull(atom/movable/source, atom/movable/puller, force) + SIGNAL_HANDLER + + if(!puller) + return + grabber = puller + RegisterSignal(grabber, COMSIG_MOVABLE_KEYBIND_FACE_DIR, PROC_REF(on_puller_turn)) + RegisterSignal(grabber, COMSIG_MOB_SAY, PROC_REF(on_puller_speech)) + RegisterSignal(grabber, COMSIG_QDELETING, PROC_REF(on_puller_qdel)) + +///Stopped pulling, we clear out signals and references. +/datum/component/marionette/proc/on_stop_pull(datum/source, atom/movable/was_pulling) + SIGNAL_HANDLER + if(grabber) + UnregisterSignal(grabber, list(COMSIG_MOVABLE_KEYBIND_FACE_DIR, COMSIG_MOB_SAY, COMSIG_QDELETING)) + grabber = null + +///Callled when the person grabbin us turns, we rotate to match their direction. +/datum/component/marionette/proc/on_puller_turn(mob/living/source, direction) + SIGNAL_HANDLER + var/atom/movable/parent_movable = parent + parent_movable.setDir(direction) + +///Called when the person grabbing us speaks, we lower their volume to 1 tile and speak what they said through us. +/datum/component/marionette/proc/on_puller_speech(datum/source, list/speech_args) + SIGNAL_HANDLER + + if(HAS_TRAIT(grabber, TRAIT_SIGN_LANG)) + return + + var/message = speech_args[SPEECH_MESSAGE] + var/list/spans = speech_args[SPEECH_SPANS] + var/language = speech_args[SPEECH_LANGUAGE] + var/saymode = speech_args[SPEECH_SAYMODE] + var/atom/movable/movable_parent = parent + movable_parent.say( + message = message, + spans = spans.Copy(), + language = language, + forced = "[source]'s marionette", + saymode = saymode, + ) + speech_args[SPEECH_RANGE] = WHISPER_RANGE + +///Called when our puller is somehow deleted, we simply clear the reference to them. +/datum/component/marionette/proc/on_puller_qdel() + SIGNAL_HANDLER + + grabber = null diff --git a/code/datums/components/rotation.dm b/code/datums/components/rotation.dm index 4bcfa8b01c9..7c55579c999 100644 --- a/code/datums/components/rotation.dm +++ b/code/datums/components/rotation.dm @@ -1,6 +1,6 @@ /datum/component/simple_rotation /// Additional stuff to do after rotation - var/datum/callback/AfterRotation + var/datum/callback/post_rotation /// Rotation flags for special behavior var/rotation_flags = NONE @@ -9,9 +9,9 @@ * * args: * * rotation_flags (optional) Bitflags that determine behavior for rotation (defined at the top of this file) - * * AfterRotation (optional) Callback proc that is used after the object is rotated (sound effects, balloon alerts, etc.) -**/ -/datum/component/simple_rotation/Initialize(rotation_flags = NONE, AfterRotation) + * * post_rotation (optional) Callback proc that is used after the object is rotated (sound effects, balloon alerts, etc.) + **/ +/datum/component/simple_rotation/Initialize(rotation_flags = NONE, post_rotation) if(!ismovable(parent)) return COMPONENT_INCOMPATIBLE @@ -19,19 +19,13 @@ source.flags_1 |= HAS_CONTEXTUAL_SCREENTIPS_1 src.rotation_flags = rotation_flags - src.AfterRotation = AfterRotation || CALLBACK(src, PROC_REF(DefaultAfterRotation)) - -/datum/component/simple_rotation/proc/AddSignals() - RegisterSignal(parent, COMSIG_CLICK_ALT, PROC_REF(RotateLeft)) - RegisterSignal(parent, COMSIG_CLICK_ALT_SECONDARY, PROC_REF(RotateRight)) - RegisterSignal(parent, COMSIG_ATOM_EXAMINE, PROC_REF(ExamineMessage)) - RegisterSignal(parent, COMSIG_ATOM_REQUESTING_CONTEXT_FROM_ITEM, PROC_REF(on_requesting_context_from_item)) - -/datum/component/simple_rotation/proc/RemoveSignals() - UnregisterSignal(parent, list(COMSIG_CLICK_ALT, COMSIG_CLICK_ALT_SECONDARY, COMSIG_ATOM_EXAMINE, COMSIG_ATOM_REQUESTING_CONTEXT_FROM_ITEM)) + src.post_rotation = post_rotation || CALLBACK(src, PROC_REF(default_post_rotation)) /datum/component/simple_rotation/RegisterWithParent() - AddSignals() + RegisterSignal(parent, COMSIG_CLICK_ALT, PROC_REF(rotate_left)) + RegisterSignal(parent, COMSIG_CLICK_ALT_SECONDARY, PROC_REF(rotate_right)) + RegisterSignal(parent, COMSIG_ATOM_EXAMINE, PROC_REF(ExamineMessage)) + RegisterSignal(parent, COMSIG_ATOM_REQUESTING_CONTEXT_FROM_ITEM, PROC_REF(on_requesting_context_from_item)) return ..() /datum/component/simple_rotation/PostTransfer() @@ -41,15 +35,16 @@ return COMPONENT_NOTRANSFER /datum/component/simple_rotation/UnregisterFromParent() - RemoveSignals() + UnregisterSignal(parent, list( + COMSIG_CLICK_ALT, + COMSIG_CLICK_ALT_SECONDARY, + COMSIG_ATOM_EXAMINE, + COMSIG_ATOM_REQUESTING_CONTEXT_FROM_ITEM, + )) return ..() /datum/component/simple_rotation/Destroy() - AfterRotation = null - //Signals + verbs removed via UnRegister - return ..() - -/datum/component/simple_rotation/ClearFromParent() + post_rotation = null return ..() /datum/component/simple_rotation/proc/ExamineMessage(datum/source, mob/user, list/examine_list) @@ -57,15 +52,15 @@ if(rotation_flags & ROTATION_REQUIRE_WRENCH) examine_list += span_notice("This requires a wrench to be rotated.") -/datum/component/simple_rotation/proc/RotateRight(datum/source, mob/user) +/datum/component/simple_rotation/proc/rotate_right(datum/source, mob/user) SIGNAL_HANDLER - Rotate(user, ROTATION_CLOCKWISE) + rotate(user, ROTATION_CLOCKWISE) -/datum/component/simple_rotation/proc/RotateLeft(datum/source, mob/user) +/datum/component/simple_rotation/proc/rotate_left(datum/source, mob/user) SIGNAL_HANDLER - Rotate(user, ROTATION_COUNTERCLOCKWISE) + rotate(user, ROTATION_COUNTERCLOCKWISE) -/datum/component/simple_rotation/proc/Rotate(mob/user, degrees) +/datum/component/simple_rotation/proc/rotate(mob/user, degrees) if(QDELETED(user)) CRASH("[src] is being rotated [user ? "with a qdeleting" : "without a"] user") if(!istype(user)) @@ -73,7 +68,7 @@ if(!isnum(degrees)) CRASH("[src] is being rotated without providing the amount of degrees needed") - if(!CanBeRotated(user, degrees) || !CanUserRotate(user, degrees)) + if(!can_be_rotated(user, degrees) || !can_user_rotate(user, degrees)) return var/obj/rotated_obj = parent @@ -81,16 +76,16 @@ if(rotation_flags & ROTATION_REQUIRE_WRENCH) playsound(rotated_obj, 'sound/items/ratchet.ogg', 50, TRUE) - AfterRotation.Invoke(user, degrees) + post_rotation.Invoke(user, degrees) -/datum/component/simple_rotation/proc/CanUserRotate(mob/user, degrees) +/datum/component/simple_rotation/proc/can_user_rotate(mob/user, degrees) if(isliving(user) && user.can_perform_action(parent, NEED_DEXTERITY)) return TRUE if((rotation_flags & ROTATION_GHOSTS_ALLOWED) && isobserver(user) && CONFIG_GET(flag/ghost_interaction)) return TRUE return FALSE -/datum/component/simple_rotation/proc/CanBeRotated(mob/user, degrees, silent=FALSE) +/datum/component/simple_rotation/proc/can_be_rotated(mob/user, degrees, silent=FALSE) var/obj/rotated_obj = parent if(!rotated_obj.Adjacent(user)) silent = TRUE @@ -120,7 +115,7 @@ return FALSE return TRUE -/datum/component/simple_rotation/proc/DefaultAfterRotation(mob/user, degrees) +/datum/component/simple_rotation/proc/default_post_rotation(mob/user, degrees) return // maybe we don't need the item context proc but instead the hand one? since we don't need to check held_item @@ -129,10 +124,10 @@ var/rotation_screentip = FALSE - if(CanBeRotated(user, ROTATION_CLOCKWISE, silent=TRUE)) + if(can_be_rotated(user, ROTATION_CLOCKWISE, silent=TRUE)) context[SCREENTIP_CONTEXT_ALT_LMB] = "Rotate left" rotation_screentip = TRUE - if(CanBeRotated(user, ROTATION_COUNTERCLOCKWISE, silent=TRUE)) + if(can_be_rotated(user, ROTATION_COUNTERCLOCKWISE, silent=TRUE)) context[SCREENTIP_CONTEXT_ALT_RMB] = "Rotate right" rotation_screentip = TRUE diff --git a/code/game/objects/items/rcd/RPD.dm b/code/game/objects/items/rcd/RPD.dm index 9af1041779e..e4777977605 100644 --- a/code/game/objects/items/rcd/RPD.dm +++ b/code/game/objects/items/rcd/RPD.dm @@ -587,7 +587,7 @@ GLOBAL_LIST_INIT(transit_tube_recipes, list( if(queued_pipe_flipped) tube.setDir(turn(queued_pipe_dir, 45 + ROTATION_FLIP)) - tube.AfterRotation(user, ROTATION_FLIP) + tube.post_rotation(user, ROTATION_FLIP) tube.add_fingerprint(usr) if(mode & WRENCH_MODE) diff --git a/code/game/objects/structures/mannequin.dm b/code/game/objects/structures/mannequin.dm index 4fc14ada0b2..6ee4d79f522 100644 --- a/code/game/objects/structures/mannequin.dm +++ b/code/game/objects/structures/mannequin.dm @@ -64,6 +64,7 @@ icon_state = "mannequin_[material]_[body_type == FEMALE ? "female" : "male"]" AddElement(/datum/element/strippable, GLOB.strippable_mannequin_items) AddComponent(/datum/component/simple_rotation, ROTATION_IGNORE_ANCHORED) + AddComponent(/datum/component/marionette) update_appearance() /obj/structure/mannequin/Destroy() @@ -202,7 +203,6 @@ name = "skeleton model" desc = "Not to knock over." material = MANNEQUIN_SKELETON - anchored = TRUE obj_flags = UNIQUE_RENAME starting_items = list( /obj/item/clothing/glasses/eyepatch, diff --git a/code/game/objects/structures/toiletbong.dm b/code/game/objects/structures/toiletbong.dm index e5c5193e46f..0ea21e9ff84 100644 --- a/code/game/objects/structures/toiletbong.dm +++ b/code/game/objects/structures/toiletbong.dm @@ -3,29 +3,28 @@ desc = "A repurposed toilet with re-arranged piping and an attached flamethrower. Why would anyone build this?" icon = 'icons/obj/watercloset.dmi' icon_state = "toiletbong" + base_icon_state = "toiletbong" density = FALSE anchored = TRUE - var/emagged = FALSE var/smokeradius = 1 var/mutable_appearance/weed_overlay /obj/structure/toiletbong/Initialize(mapload) . = ..() create_storage() - AddComponent(/datum/component/simple_rotation, AfterRotation = CALLBACK(src, PROC_REF(AfterRotation))) + AddComponent(/datum/component/simple_rotation, post_rotation = CALLBACK(src, PROC_REF(post_rotation))) create_storage(max_total_storage = 100, max_slots = 12, canhold = /obj/item/food) atom_storage.attack_hand_interact = FALSE atom_storage.rustle_sound = FALSE atom_storage.animated = FALSE - weed_overlay = mutable_appearance('icons/obj/watercloset.dmi', "toiletbong_overlay") + weed_overlay = mutable_appearance('icons/obj/watercloset.dmi', "[base_icon_state]_overlay") START_PROCESSING(SSobj, src) -/obj/structure/toiletbong/update_icon() +/obj/structure/toiletbong/update_overlays() . = ..() - cut_overlays() if (LAZYLEN(contents)) - add_overlay(weed_overlay) + . += weed_overlay /obj/structure/toiletbong/attack_hand(mob/living/carbon/user) . = ..() @@ -36,47 +35,44 @@ user.balloon_alert(user, "it's empty!") return user.visible_message(span_boldnotice("[user] takes a huge drag on the [src].")) - if (do_after(user, 2 SECONDS, target = src)) - var/turf/toiletbong_location = loc - toiletbong_location.hotspot_expose(1000, 5) - for (var/obj/item/item in contents) - if (item.resistance_flags & INDESTRUCTIBLE) - user.balloon_alert(user, "[item.name] is blocking the pipes!") - continue - playsound(src, 'sound/items/modsuit/flamethrower.ogg', 50) - var/datum/effect_system/fluid_spread/smoke/chem/smoke_machine/puff = new - puff.set_up(smokeradius, holder = src, location = user, carry = item.reagents, efficiency = 20) - puff.start() - if (prob(5) && !emagged) - if(islizard(user)) - user.balloon_alert(user, "a hidden treat!") - user.visible_message(span_danger("[user] fishes a mouse out of the pipes.")) - else - to_chat(user, span_userdanger("There was something disgusting in the pipes!")) - user.visible_message(span_danger("[user] spits out a mouse.")) - user.adjust_disgust(50) - user.vomit(VOMIT_CATEGORY_DEFAULT) - var/mob/living/spawned_mob = new /mob/living/basic/mouse(get_turf(user)) - spawned_mob.faction |= "[REF(user)]" - if(prob(50)) - for(var/j in 1 to rand(1, 3)) - step(spawned_mob, pick(NORTH,SOUTH,EAST,WEST)) - qdel(item) - if(!emagged) - break - update_icon() + if (!do_after(user, 2 SECONDS, target = src)) + return + var/turf/toiletbong_location = loc + toiletbong_location.hotspot_expose(1000, 5) + for (var/obj/item/item in contents) + if (item.resistance_flags & INDESTRUCTIBLE) + user.balloon_alert(user, "[item.name] is blocking the pipes!") + continue + playsound(src, 'sound/items/modsuit/flamethrower.ogg', 50) + var/datum/effect_system/fluid_spread/smoke/chem/smoke_machine/puff = new + puff.set_up(smokeradius, holder = src, location = user, carry = item.reagents, efficiency = 20) + puff.start() + if (prob(5) && !(obj_flags & EMAGGED)) + if(user.get_liked_foodtypes() & GORE) + user.balloon_alert(user, "a hidden treat!") + user.visible_message(span_danger("[user] fishes a mouse out of the pipes.")) + else + to_chat(user, span_userdanger("There was something disgusting in the pipes!")) + user.visible_message(span_danger("[user] spits out a mouse.")) + user.adjust_disgust(50) + user.vomit(VOMIT_CATEGORY_DEFAULT) + var/mob/living/spawned_mob = new /mob/living/basic/mouse(get_turf(user)) + spawned_mob.faction |= "[REF(user)]" + if(prob(50)) + for(var/j in 1 to rand(1, 3)) + step(spawned_mob, pick(NORTH,SOUTH,EAST,WEST)) + qdel(item) + if(!(obj_flags & EMAGGED)) + break + update_appearance(UPDATE_ICON) /obj/structure/toiletbong/wrench_act(mob/living/user, obj/item/tool) - tool.play_tool_sound(src) - if(anchored) - to_chat(user, span_notice("You begin unsecuring the [src].")) - anchored = FALSE - else - to_chat(user, span_notice("You secure the [src] to the floor.")) - anchored = TRUE - return TRUE + ..() + default_unfasten_wrench(user, tool) + return ITEM_INTERACT_SUCCESS -/obj/structure/toiletbong/proc/AfterRotation(mob/user, degrees) +///Called in the simple rotation's post_rotation callback, playing a sound cue to players. +/obj/structure/toiletbong/proc/post_rotation(mob/user, degrees) playsound(src, 'sound/items/deconstruct.ogg', 50) /obj/structure/toiletbong/crowbar_act(mob/living/user, obj/item/tool) @@ -94,18 +90,17 @@ return TRUE /obj/structure/toiletbong/emag_act(mob/user, obj/item/card/emag/emag_card) + if(obj_flags & EMAGGED) + return FALSE + obj_flags |= EMAGGED + smokeradius = 2 playsound(src, 'sound/effects/fish_splash.ogg', 50) - user.balloon_alert(user, "whoops!") - if(!emagged) - emagged = TRUE - smokeradius = 2 - balloon_alert(user, "toilet broke") - if (emag_card) - to_chat(user, span_boldwarning("The [emag_card] falls into the toilet. You fish it back out. Looks like you broke the toilet.")) - return TRUE - return FALSE + balloon_alert(user, "toilet broke") + if (emag_card) + to_chat(user, span_boldwarning("The [emag_card] falls into the toilet. You fish it back out. Looks like you broke the toilet.")) + return TRUE -/obj/structure/toiletbong/attackby(obj/item/I, mob/user, params) - if(istype(I, /obj/item/card/emag)) +/obj/structure/toiletbong/attackby(obj/item/attacking_item, mob/user, params) + if(istype(attacking_item, /obj/item/card/emag)) return - . = ..() + return ..() diff --git a/code/game/objects/structures/transit_tubes/transit_tube_construction.dm b/code/game/objects/structures/transit_tubes/transit_tube_construction.dm index cc9de4cdb95..44952801ec7 100644 --- a/code/game/objects/structures/transit_tubes/transit_tube_construction.dm +++ b/code/game/objects/structures/transit_tubes/transit_tube_construction.dm @@ -15,7 +15,7 @@ /obj/structure/c_transit_tube/Initialize(mapload) . = ..() - AddComponent(/datum/component/simple_rotation, AfterRotation = CALLBACK(src, PROC_REF(AfterRotation))) + AddComponent(/datum/component/simple_rotation, post_rotation = CALLBACK(src, PROC_REF(post_rotation))) /obj/structure/c_transit_tube/proc/can_wrench_in_loc(mob/user) var/turf/source_turf = get_turf(loc) @@ -27,7 +27,7 @@ return FALSE return TRUE -/obj/structure/c_transit_tube/proc/AfterRotation(mob/user, degrees) +/obj/structure/c_transit_tube/proc/post_rotation(mob/user, degrees) if(flipped_build_type && degrees == ROTATION_FLIP) setDir(turn(dir, degrees)) //Turn back we don't actually flip flipped = !flipped diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index c86a093340c..dc1c7548d49 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -67,7 +67,7 @@ flags_1 |= ALLOW_DARK_PAINTS_1 RegisterSignal(src, COMSIG_OBJ_PAINTED, PROC_REF(on_painted)) AddElement(/datum/element/atmos_sensitive, mapload) - AddComponent(/datum/component/simple_rotation, ROTATION_NEEDS_ROOM, AfterRotation = CALLBACK(src, PROC_REF(AfterRotation))) + AddComponent(/datum/component/simple_rotation, ROTATION_NEEDS_ROOM, post_rotation = CALLBACK(src, PROC_REF(post_rotation))) var/static/list/loc_connections = list( COMSIG_ATOM_EXIT = PROC_REF(on_exit), @@ -358,7 +358,7 @@ dropped_debris += new /obj/item/stack/rods(location, (fulltile ? 2 : 1)) return dropped_debris -/obj/structure/window/proc/AfterRotation(mob/user, degrees) +/obj/structure/window/proc/post_rotation(mob/user, degrees) air_update_turf(TRUE, FALSE) /obj/structure/window/proc/on_painted(obj/structure/window/source, mob/user, obj/item/toy/crayon/spraycan/spraycan, is_dark_color) diff --git a/code/modules/art/statues.dm b/code/modules/art/statues.dm index 2158104b6ee..a3c43a13b7e 100644 --- a/code/modules/art/statues.dm +++ b/code/modules/art/statues.dm @@ -26,6 +26,7 @@ AddElement(art_type, impressiveness) AddElement(/datum/element/beauty, impressiveness * 75) AddComponent(/datum/component/simple_rotation) + AddComponent(/datum/component/marionette) /obj/structure/statue/wrench_act(mob/living/user, obj/item/tool) . = ..() diff --git a/code/modules/assembly/infrared.dm b/code/modules/assembly/infrared.dm index a7a641bb884..0353744b298 100644 --- a/code/modules/assembly/infrared.dm +++ b/code/modules/assembly/infrared.dm @@ -18,9 +18,9 @@ . = ..() beams = list() START_PROCESSING(SSobj, src) - AddComponent(/datum/component/simple_rotation, AfterRotation = CALLBACK(src, PROC_REF(AfterRotation))) + AddComponent(/datum/component/simple_rotation, post_rotation = CALLBACK(src, PROC_REF(post_rotation))) -/obj/item/assembly/infra/proc/AfterRotation(mob/user, degrees) +/obj/item/assembly/infra/proc/post_rotation(mob/user, degrees) refreshBeam() /obj/item/assembly/infra/AltClick(mob/user) diff --git a/code/modules/basketball/hoop.dm b/code/modules/basketball/hoop.dm index f356fc52315..b26fa462b09 100644 --- a/code/modules/basketball/hoop.dm +++ b/code/modules/basketball/hoop.dm @@ -24,7 +24,7 @@ /obj/structure/hoop/Initialize(mapload) . = ..() - AddComponent(/datum/component/simple_rotation, ROTATION_REQUIRE_WRENCH|ROTATION_IGNORE_ANCHORED, AfterRotation = CALLBACK(src, PROC_REF(reset_appearance))) + AddComponent(/datum/component/simple_rotation, ROTATION_REQUIRE_WRENCH|ROTATION_IGNORE_ANCHORED, post_rotation = CALLBACK(src, PROC_REF(reset_appearance))) update_appearance() register_context() diff --git a/code/modules/recycling/disposal/construction.dm b/code/modules/recycling/disposal/construction.dm index b1556ca679f..4b8fef12924 100644 --- a/code/modules/recycling/disposal/construction.dm +++ b/code/modules/recycling/disposal/construction.dm @@ -33,12 +33,12 @@ pipename = initial(pipe_type.name) - AddComponent(/datum/component/simple_rotation, AfterRotation = CALLBACK(src, PROC_REF(AfterRotation))) + AddComponent(/datum/component/simple_rotation, post_rotation = CALLBACK(src, PROC_REF(post_rotation))) AddElement(/datum/element/undertile, TRAIT_T_RAY_VISIBLE) if(flip) var/datum/component/simple_rotation/rotcomp = GetComponent(/datum/component/simple_rotation) - rotcomp.Rotate(usr, ROTATION_FLIP) // this only gets used by pipes created by RPDs or pipe dispensers + rotcomp.rotate(usr, ROTATION_FLIP) // this only gets used by pipes created by RPDs or pipe dispensers update_appearance(UPDATE_ICON) @@ -86,7 +86,7 @@ dpdir |= REVERSE_DIR(dir) return dpdir -/obj/structure/disposalconstruct/proc/AfterRotation(mob/user, degrees) +/obj/structure/disposalconstruct/proc/post_rotation(mob/user, degrees) if(degrees == ROTATION_FLIP) var/obj/structure/disposalpipe/temp = pipe_type if(initial(temp.flip_type)) diff --git a/code/modules/surgery/organs/internal/tongue/_tongue.dm b/code/modules/surgery/organs/internal/tongue/_tongue.dm index b7dc8353920..5807e1d5c2d 100644 --- a/code/modules/surgery/organs/internal/tongue/_tongue.dm +++ b/code/modules/surgery/organs/internal/tongue/_tongue.dm @@ -187,6 +187,7 @@ liked_foodtypes = GORE | MEAT | SEAFOOD | NUTS | BUGS disliked_foodtypes = GRAIN | DAIRY | CLOTH | GROSS voice_filter = @{"[0:a] asplit [out0][out2]; [out0] asetrate=%SAMPLE_RATE%*0.9,aresample=%SAMPLE_RATE%,atempo=1/0.9,aformat=channel_layouts=mono,volume=0.2 [p0]; [out2] asetrate=%SAMPLE_RATE%*1.1,aresample=%SAMPLE_RATE%,atempo=1/1.1,aformat=channel_layouts=mono,volume=0.2[p2]; [p0][0][p2] amix=inputs=3"} + /obj/item/organ/internal/tongue/lizard/modify_speech(datum/source, list/speech_args) var/static/regex/lizard_hiss = new("s+", "g") var/static/regex/lizard_hiSS = new("S+", "g") diff --git a/tgstation.dme b/tgstation.dme index 192a0b1adec..8b310492cf8 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -1206,6 +1206,7 @@ #include "code\datums\components\manual_blinking.dm" #include "code\datums\components\manual_breathing.dm" #include "code\datums\components\manual_heart.dm" +#include "code\datums\components\marionette.dm" #include "code\datums\components\mind_linker.dm" #include "code\datums\components\mirv.dm" #include "code\datums\components\mob_chain.dm"