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"