diff --git a/html/changelogs/AutoChangeLog-pr-4365.yml b/html/changelogs/AutoChangeLog-pr-4365.yml
new file mode 100644
index 000000000000..9a3a560490e0
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-4365.yml
@@ -0,0 +1,4 @@
+author: "Siro"
+delete-after: True
+changes:
+ - rscadd: "Added an ability for dead oozelings, \"Membrane Murmur\", allowing them to vocalize a short-range cry for help from their core every so often."
\ No newline at end of file
diff --git a/monkestation/code/modules/blueshift/biogenerator/resources.dm b/monkestation/code/modules/blueshift/biogenerator/resources.dm
index 9d8f23c84620..9fb685140db7 100644
--- a/monkestation/code/modules/blueshift/biogenerator/resources.dm
+++ b/monkestation/code/modules/blueshift/biogenerator/resources.dm
@@ -19,4 +19,3 @@
RND_CATEGORY_INITIAL,
RND_CATEGORY_AKHTER_RESOURCES,
)
-a
diff --git a/monkestation/code/modules/events/brand_intelligence.dm b/monkestation/code/modules/events/brand_intelligence.dm
index 232f1e70c54d..087d2394675f 100644
--- a/monkestation/code/modules/events/brand_intelligence.dm
+++ b/monkestation/code/modules/events/brand_intelligence.dm
@@ -241,4 +241,3 @@
#undef MAX_INFECTION_DISTANCE
#undef MIN_INFECTION_DISTANCE
-z
diff --git a/monkestation/code/modules/smithing/oozelings/actions.dm b/monkestation/code/modules/smithing/oozelings/actions.dm
index f9442a366d20..4ed04d749891 100644
--- a/monkestation/code/modules/smithing/oozelings/actions.dm
+++ b/monkestation/code/modules/smithing/oozelings/actions.dm
@@ -171,3 +171,42 @@
else
to_chat(owner, span_notice("You fine-tune the electromagnetic signals from your core to be picked up by GPS receivers upon it's rejection."))
core.gps_active = TRUE
+///////
+/// MEMBRANE MURMUR SPELL
+/// Use your core to attempt to call out for help or attention.
+/datum/action/cooldown/membrane_murmur
+ name = "Membrane Murmur"
+ desc = "Force your core to pass gasses to make noticable sounds."
+ button_icon = 'icons/mob/actions/actions_slime.dmi'
+ button_icon_state = "gel_cocoon"
+ background_icon_state = "bg_alien"
+ overlay_icon_state = "bg_alien_border"
+
+ cooldown_time = 25 SECONDS
+ check_flags = NONE
+
+ var/static/list/possible_cries = list(
+ "Blorp... glub... help...",
+ "Glooop... save me...",
+ "Alone... burbble too quiet...",
+ "What’s left... of me...?",
+ "Can’t feel... can’t... think...",
+ "Plasma... need... plasma...",
+ "It’s so... quiet...",
+ )
+
+/datum/action/cooldown/membrane_murmur/IsAvailable(feedback = FALSE)
+ . = ..()
+ if(.)
+ var/mob/living/brain/brainmob = owner
+ if(!istype(brainmob) || !istype(brainmob.loc, /obj/item/organ/internal/brain/slime))
+ return FALSE
+
+/datum/action/cooldown/membrane_murmur/Activate()
+ . = ..()
+ var/mob/living/brain/brainmob = owner
+ if(!istype(brainmob))
+ CRASH("[src] cast by non-brainmob [owner?.type || "(null)"]")
+ var/obj/item/organ/internal/brain/slime/brainitem = brainmob.loc
+ var/final_cry = brainmob.Ellipsis(pick(possible_cries), chance = 30)
+ brainitem.say(final_cry, "slime", forced = "[src]", message_range = 2)
diff --git a/monkestation/code/modules/smithing/oozelings/body/organs.dm b/monkestation/code/modules/smithing/oozelings/body/organs.dm
index 6d91bd2b2c3c..6e33ac028af9 100644
--- a/monkestation/code/modules/smithing/oozelings/body/organs.dm
+++ b/monkestation/code/modules/smithing/oozelings/body/organs.dm
@@ -69,11 +69,18 @@
var/rebuilt = TRUE
var/coredeath = TRUE
+ var/datum/action/cooldown/membrane_murmur/membrane_mur
+
/obj/item/organ/internal/brain/slime/Initialize(mapload, mob/living/carbon/organ_owner, list/examine_list)
. = ..()
+ membrane_mur = new /datum/action/cooldown/membrane_murmur()
colorize()
transform.Scale(2, 2)
+/obj/item/organ/internal/brain/slime/Destroy(force)
+ QDEL_NULL(membrane_mur)
+ return ..()
+
/obj/item/organ/internal/brain/slime/examine()
. = ..()
if(gps_active)
@@ -165,6 +172,7 @@
AddComponent(/datum/component/gps, "[victim]'s Core")
if(brainmob)
+ membrane_mur.Grant(brainmob)
var/datum/antagonist/changeling/target_ling = brainmob.mind?.has_antag_datum(/datum/antagonist/changeling)
if(target_ling)
@@ -283,6 +291,7 @@
new_body.visible_message(span_warning("[new_body]'s body fully forms from [new_body.p_their()] core!"))
to_chat(owner, span_purple("Your body fully forms from your core!"))
+ membrane_mur.Remove(brainmob)
brainmob?.mind?.transfer_to(new_body)
new_body.grab_ghost()
transfer_observers_to(new_body)
diff --git a/monkestation/code/modules/virology/machines/incubator.dm b/monkestation/code/modules/virology/machines/incubator.dm
index b62e38106f2b..56521b843c8c 100644
--- a/monkestation/code/modules/virology/machines/incubator.dm
+++ b/monkestation/code/modules/virology/machines/incubator.dm
@@ -20,7 +20,7 @@
idle_power_usage = 100
active_power_usage = 200
- // Contains instances of /dish_incubator_dish.
+ // Contains instances of /datum/dish_incubator_dish.
var/list/dish_data = list(null, null, null)
var/on = FALSE
@@ -90,7 +90,7 @@
if (!user.transferItemToLoc(VD, src))
return
- var/dish_incubator_dish/dish_datum = new
+ var/datum/dish_incubator_dish/dish_datum = new
dish_datum.dish = VD
dish_data[slot] = dish_datum
@@ -108,7 +108,7 @@
if ("power")
on = !on
if (on)
- for (var/dish_incubator_dish/dish_datum in dish_data)
+ for (var/datum/dish_incubator_dish/dish_datum in dish_data)
if (dish_datum.dish.contained_virus)
dish_datum.dish.contained_virus.log += "
[ROUND_TIME()] Incubation started by [key_name(usr)]"
@@ -120,7 +120,7 @@
if (slot == null || slot < 1 || slot > dish_data.len)
return TRUE
- var/dish_incubator_dish/dish_datum = dish_data[slot]
+ var/datum/dish_incubator_dish/dish_datum = dish_data[slot]
if (dish_datum == null)
return TRUE
@@ -154,7 +154,7 @@
if (slot == null || slot < 1 || slot > dish_data.len)
return TRUE
- var/dish_incubator_dish/dish_datum = dish_data[slot]
+ var/datum/dish_incubator_dish/dish_datum = dish_data[slot]
if (dish_datum == null)
return TRUE
@@ -166,7 +166,7 @@
if (slot == null || slot < 1 || slot > dish_data.len)
return TRUE
- var/dish_incubator_dish/dish_datum = dish_data[slot]
+ var/datum/dish_incubator_dish/dish_datum = dish_data[slot]
if (dish_datum == null)
return TRUE
@@ -176,7 +176,7 @@
var/slot = text2num(params["slot"])
if(slot == null || slot < 1 || slot > dish_data.len)
return TRUE
- var/dish_incubator_dish/dish_datum = dish_data[slot]
+ var/datum/dish_incubator_dish/dish_datum = dish_data[slot]
if (dish_datum == null)
return TRUE
var/stage_to_focus = input(usr, "Choose a stage to focus on. This will block symptoms from other stages from being mutated. Input 0 to disable effect focusing.", "Choose a stage.") as num
@@ -195,7 +195,7 @@
if (machine_stat & (NOPOWER))
to_chat(user, span_notice("Deprived of power, \the [src] is unresponsive."))
for (var/i in 1 to dish_data.len)
- var/dish_incubator_dish/dish_datum = dish_data[i]
+ var/datum/dish_incubator_dish/dish_datum = dish_data[i]
if (dish_datum == null)
continue
@@ -231,7 +231,7 @@
data["dishes"] = dish_ui_data
for (var/i = 1 to dish_data.len)
- var/dish_incubator_dish/dish_datum = dish_data[i]
+ var/datum/dish_incubator_dish/dish_datum = dish_data[i]
var/list/dish_ui_datum = list()
// tfw no linq
dish_ui_data[++dish_ui_data.len] = dish_ui_datum
@@ -268,7 +268,7 @@
if (on)
use_power = ACTIVE_POWER_USE
- for (var/dish_incubator_dish/dish_datum in dish_data)
+ for (var/datum/dish_incubator_dish/dish_datum in dish_data)
dish_datum.dish.incubate(mutatechance, growthrate, effect_focus)
else
use_power = IDLE_POWER_USE
@@ -277,7 +277,7 @@
/obj/machinery/disease2/incubator/proc/find_dish_datum(obj/item/weapon/virusdish/dish)
- for (var/dish_incubator_dish/dish_datum in dish_data)
+ for (var/datum/dish_incubator_dish/dish_datum in dish_data)
if (dish_datum.dish == dish)
return dish_datum
@@ -285,7 +285,7 @@
/obj/machinery/disease2/incubator/proc/update_major(obj/item/weapon/virusdish/dish)
- var/dish_incubator_dish/dish_datum = find_dish_datum(dish)
+ var/datum/dish_incubator_dish/dish_datum = find_dish_datum(dish)
if (dish_datum == null)
return
@@ -295,7 +295,7 @@
/obj/machinery/disease2/incubator/proc/update_minor(obj/item/weapon/virusdish/dish, str=0, rob=0, eff=0)
- var/dish_incubator_dish/dish_datum = find_dish_datum(dish)
+ var/datum/dish_incubator_dish/dish_datum = find_dish_datum(dish)
if (dish_datum == null)
return
@@ -342,7 +342,7 @@
if (dish_data[i] != null)
. += add_dish_sprite(dish_data[i], i)
-/obj/machinery/disease2/incubator/proc/add_dish_sprite(dish_incubator_dish/dish_datum, slot)
+/obj/machinery/disease2/incubator/proc/add_dish_sprite(datum/dish_incubator_dish/dish_datum, slot)
var/obj/item/weapon/virusdish/dish = dish_datum.dish
var/list/overlays = list()
@@ -459,7 +459,7 @@
/obj/machinery/disease2/incubator/Destroy()
. = ..()
for (var/i in 1 to dish_data.len)
- var/dish_incubator_dish/dish_datum = dish_data[i]
+ var/datum/dish_incubator_dish/dish_datum = dish_data[i]
if (dish_datum == null)
continue
@@ -468,7 +468,7 @@
..()
-/dish_incubator_dish
+/datum/dish_incubator_dish
// The inserted virus dish.
var/obj/item/weapon/virusdish/dish