diff --git a/code/game/machinery/cryopod.dm b/code/game/machinery/cryopod.dm
index a2a395c51c..5bc0ed20b0 100644
--- a/code/game/machinery/cryopod.dm
+++ b/code/game/machinery/cryopod.dm
@@ -361,8 +361,12 @@
// them win or lose based on cryo is silly so we remove the objective.
if(istype(O,/datum/objective/mutiny) && O.target == mob_occupant.mind)
qdel(O)
- else if(O.target && istype(O.target, /datum/mind) && !O.check_midround_completion())
- if(O.target == mob_occupant.mind && O.owner?.current)
+ else if(O.target && istype(O.target, /datum/mind))
+ if(O.target != mob_occupant.mind)
+ continue
+ if(O.check_midround_completion())
+ continue
+ if(O.owner && O.owner.current)
to_chat(O.owner.current, "
You get the feeling your target is no longer within reach. Time for Plan [pick("A","B","C","D","X","Y","Z")]. Objectives updated!")
O.target = null
spawn(10) //This should ideally fire after the occupant is deleted.
diff --git a/code/modules/antagonists/abductor/equipment/abduction_surgery.dm b/code/modules/antagonists/abductor/equipment/abduction_surgery.dm
index a99e9eee67..9205198c4f 100644
--- a/code/modules/antagonists/abductor/equipment/abduction_surgery.dm
+++ b/code/modules/antagonists/abductor/equipment/abduction_surgery.dm
@@ -2,22 +2,27 @@
name = "experimental organ replacement"
steps = list(/datum/surgery_step/incise, /datum/surgery_step/clamp_bleeders, /datum/surgery_step/retract_skin, /datum/surgery_step/incise, /datum/surgery_step/extract_organ, /datum/surgery_step/gland_insert)
possible_locs = list(BODY_ZONE_CHEST)
- ignore_clothes = 1
+ ignore_clothes = TRUE
/datum/surgery/organ_extraction/can_start(mob/user, mob/living/carbon/target)
if(!ishuman(user))
- return 0
+ return FALSE
var/mob/living/carbon/human/H = user
if(H.dna.species.id == "abductor")
- return 1
+ return TRUE
for(var/obj/item/implant/abductor/A in H.implants)
- return 1
- return 0
+ return TRUE
+ return FALSE
+
+/datum/surgery/organ_extraction/mechanic
+ name = "Prosthesis experimental organ replacement"
+ requires_bodypart_type = BODYPART_ROBOTIC
+ steps = list(/datum/surgery_step/mechanic_open, /datum/surgery_step/open_hatch, /datum/surgery_step/mechanic_unwrench, /datum/surgery_step/prepare_electronics, /datum/surgery_step/extract_organ, /datum/surgery_step/gland_insert)
/datum/surgery_step/extract_organ
name = "remove heart"
- accept_hand = 1
+ accept_hand = TRUE
time = 32
var/obj/item/organ/IC = null
var/list/organ_types = list(/obj/item/organ/heart)
@@ -34,10 +39,10 @@
user.visible_message("[user] pulls [IC] out of [target]'s [target_zone]!", "You pull [IC] out of [target]'s [target_zone].")
user.put_in_hands(IC)
IC.Remove()
- return 1
+ return TRUE
else
to_chat(user, "You don't find anything in [target]'s [target_zone]!")
- return 1
+ return TRUE
/datum/surgery_step/gland_insert
name = "insert gland"
@@ -52,4 +57,4 @@
user.temporarilyRemoveItemFromInventory(tool, TRUE)
var/obj/item/organ/heart/gland/gland = tool
gland.Insert(target, 2)
- return 1
+ return TRUE
diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm
index 80f3a8365c..16d6ca351d 100644
--- a/code/modules/client/preferences.dm
+++ b/code/modules/client/preferences.dm
@@ -10,7 +10,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
var/path
var/vr_path
var/default_slot = 1 //Holder so it doesn't default to slot 1, rather the last one used
- var/max_save_slots = 16
+ var/max_save_slots = 24
//non-preference stuff
var/muted = 0
@@ -210,7 +210,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
load_path(C.ckey)
unlock_content = C.IsByondMember()
if(unlock_content)
- max_save_slots = 24
+ max_save_slots = 32
var/loaded_preferences_successfully = load_preferences()
if(loaded_preferences_successfully)
if(load_character())
diff --git a/code/modules/mob/living/carbon/damage_procs.dm b/code/modules/mob/living/carbon/damage_procs.dm
index c0d7f89f59..a866049d65 100644
--- a/code/modules/mob/living/carbon/damage_procs.dm
+++ b/code/modules/mob/living/carbon/damage_procs.dm
@@ -175,7 +175,7 @@
var/list/obj/item/bodypart/parts = list()
for(var/X in bodyparts)
var/obj/item/bodypart/BP = X
- if(status && !status[BP.status])
+ if(status && !status.Find(BP.status))
continue
if((brute && BP.brute_dam) || (burn && BP.burn_dam) || (stamina && BP.stamina_dam))
parts += BP
diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm
index 2accfe7d0d..78de091923 100644
--- a/code/modules/mob/living/living.dm
+++ b/code/modules/mob/living/living.dm
@@ -307,7 +307,9 @@
log_combat(src, M, "grabbed", addition="passive grab")
if(!supress_message && !(iscarbon(AM) && HAS_TRAIT(src, TRAIT_STRONG_GRABBER)))
if((zone_selected == BODY_ZONE_PRECISE_GROIN) && has_tail() && M.has_tail())
- visible_message("[src] coils [p_their()] tail with [AM], pulling [M.p_them()] along!", "[src] has entwined [p_their()] tail with yours, pulling you along!")
+ visible_message("[src] coils [p_their()] tail with [M]'s, pulling [M.p_them()] along!", "You entwine tails with [M], pulling [M.p_them()] along!", ignored_mobs = M)
+ M.show_message("[src] has entwined [p_their()] tail with yours, pulling you along!", MSG_VISUAL, "You feel something coiling around your tail, pulling you along!")
+
else
visible_message("[src] has grabbed [M][(zone_selected == "l_arm" || zone_selected == "r_arm")? " by [M.p_their()] hands":" passively"]!",
"You have grabbed [M][(zone_selected == "l_arm" || zone_selected == "r_arm")? " by [M.p_their()] hands":" passively"]!", target = M,
diff --git a/code/modules/mob/living/simple_animal/bot/medbot.dm b/code/modules/mob/living/simple_animal/bot/medbot.dm
index fb5a889d89..25f6509ad0 100644
--- a/code/modules/mob/living/simple_animal/bot/medbot.dm
+++ b/code/modules/mob/living/simple_animal/bot/medbot.dm
@@ -574,17 +574,20 @@
if(!C.reagents.has_reagent(R.type))
return TRUE
+ var/list/brute_damaged_bodyparts = C.get_damaged_bodyparts(TRUE, FALSE, status = list(BODYPART_ORGANIC))
+ var/list/burn_damaged_bodyparts = C.get_damaged_bodyparts(FALSE, TRUE, status = list(BODYPART_ORGANIC))
+
//They're injured enough for it!
- if((!C.reagents.has_reagent(treatment_brute_avoid)) && (C.getBruteLoss() >= heal_threshold) && (!C.reagents.has_reagent(treatment_brute)))
+ if(brute_damaged_bodyparts.len && (!C.reagents.has_reagent(treatment_brute_avoid)) && (C.getBruteLoss() >= heal_threshold) && (!C.reagents.has_reagent(treatment_brute)))
return TRUE //If they're already medicated don't bother!
if((!C.reagents.has_reagent(treatment_oxy_avoid)) && (C.getOxyLoss() >= (15 + heal_threshold)) && (!C.reagents.has_reagent(treatment_oxy)))
return TRUE
- if((!C.reagents.has_reagent(treatment_fire_avoid)) && (C.getFireLoss() >= heal_threshold) && (!C.reagents.has_reagent(treatment_fire)))
+ if(burn_damaged_bodyparts.len && (!C.reagents.has_reagent(treatment_fire_avoid)) && (C.getFireLoss() >= heal_threshold) && (!C.reagents.has_reagent(treatment_fire)))
return TRUE
var/treatment_toxavoid = get_avoidchem_toxin(C)
- if(((isnull(treatment_toxavoid) || !C.reagents.has_reagent(treatment_toxavoid))) && (C.getToxLoss() >= heal_threshold) && (!C.reagents.has_reagent(get_healchem_toxin(C))))
+ if(!HAS_TRAIT(C, TRAIT_ROBOTIC_ORGANISM) && ((isnull(treatment_toxavoid) || !C.reagents.has_reagent(treatment_toxavoid))) && (C.getToxLoss() >= heal_threshold) && (!C.reagents.has_reagent(get_healchem_toxin(C))))
return TRUE
if(treat_virus && !C.reagents.has_reagent(treatment_virus_avoid) && !C.reagents.has_reagent(treatment_virus))
diff --git a/html/changelogs/AutoChangeLog-pr-13711.yml b/html/changelogs/AutoChangeLog-pr-13711.yml
new file mode 100644
index 0000000000..e6fde23e8c
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-13711.yml
@@ -0,0 +1,5 @@
+author: "DeltaFire15"
+delete-after: True
+changes:
+ - tweak: "Medibots now ignore people they cannot help due to their biology."
+ - bugfix: "get_damaged_bodyparts() is no longer broken."
diff --git a/html/changelogs/AutoChangeLog-pr-13733.yml b/html/changelogs/AutoChangeLog-pr-13733.yml
new file mode 100644
index 0000000000..a10719fdc6
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-13733.yml
@@ -0,0 +1,4 @@
+author: "DeltaFire15"
+delete-after: True
+changes:
+ - bugfix: "Fixes the tail entwine messages displaying incorrectly."
diff --git a/html/changelogs/AutoChangeLog-pr-13736.yml b/html/changelogs/AutoChangeLog-pr-13736.yml
new file mode 100644
index 0000000000..dfa5e7cb66
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-13736.yml
@@ -0,0 +1,4 @@
+author: "DeltaFire15"
+delete-after: True
+changes:
+ - tweak: "Abductors now can use experimental organ replacement surgery on robots / synthetics."
diff --git a/html/changelogs/AutoChangeLog-pr-13741.yml b/html/changelogs/AutoChangeLog-pr-13741.yml
new file mode 100644
index 0000000000..c49015ab28
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-13741.yml
@@ -0,0 +1,4 @@
+author: "DeltaFire15"
+delete-after: True
+changes:
+ - bugfix: "Objectives are no longer very broken."