From 5604be352dfd8018b1c382217266cc04196f0930 Mon Sep 17 00:00:00 2001
From: SkyratBot <59378654+SkyratBot@users.noreply.github.com>
Date: Sun, 17 Jul 2022 22:15:18 +0200
Subject: [PATCH] [MIRROR] Fixes internal/external organ for checks [MDB
IGNORE] (#14945)
* Fixes internal/external organ for checks
* Update dna.dm
fix a code conflict
* Update supplypod.dm
fix a code conflict
* Update death.dm
fix a code conflict
* Update supplypod.dm
Co-authored-by: John Willard <53777086+JohnFulpWillard@users.noreply.github.com>
Co-authored-by: jjpark-kb <55967837+jjpark-kb@users.noreply.github.com>
---
code/datums/dna.dm | 7 +++-
code/game/objects/items/devices/flashlight.dm | 6 +--
.../items/devices/scanners/health_analyzer.dm | 2 +-
code/modules/admin/verbs/manipulate_organs.dm | 10 ++---
code/modules/cargo/supplypod.dm | 3 +-
code/modules/mob/living/carbon/carbon.dm | 15 +++----
.../mob/living/carbon/carbon_defense.dm | 5 +--
.../mob/living/carbon/carbon_defines.dm | 8 ++--
code/modules/mob/living/carbon/death.dm | 41 +++++++++----------
code/modules/mob/living/carbon/human/dummy.dm | 5 ---
.../mob/living/carbon/human/human_defense.dm | 3 +-
.../mob/living/carbon/human/species.dm | 7 ++--
.../carbon/human/species_types/felinid.dm | 3 +-
code/modules/mob/living/living.dm | 7 ++--
.../chemistry/reagents/medicine_reagents.dm | 5 +--
code/modules/surgery/bodyparts/_bodyparts.dm | 2 +-
16 files changed, 56 insertions(+), 73 deletions(-)
diff --git a/code/datums/dna.dm b/code/datums/dna.dm
index 158429585f0..78678b365e3 100644
--- a/code/datums/dna.dm
+++ b/code/datums/dna.dm
@@ -655,6 +655,9 @@ GLOBAL_LIST_INIT(total_uf_len_by_block, populate_total_uf_len_by_block())
if(dna.features["pod_hair"])
dna.features["pod_hair"] = GLOB.pod_hair_list[deconstruct_block(get_uni_feature_block(features, DNA_POD_HAIR_BLOCK), GLOB.pod_hair_list.len)]
+ for(var/obj/item/organ/external/external_organ as anything in external_organs)
+ external_organ.mutate_feature(features, src)
+
if(icon_update)
dna.species.handle_body(src) // We want 'update_body_parts()' to be called only if mutcolor_update is TRUE, so no 'update_body()' here.
update_hair(is_creating = TRUE)
@@ -869,8 +872,8 @@ GLOBAL_LIST_INIT(total_uf_len_by_block, populate_total_uf_len_by_block())
ForceContractDisease(new/datum/disease/decloning()) //slow acting, non-viral clone damage based GBS
if(8)
var/list/elligible_organs = list()
- for(var/obj/item/organ/O in internal_organs) //make sure we dont get an implant or cavity item
- elligible_organs += O
+ for(var/obj/item/organ/internal/internal_organ as anything in internal_organs) //make sure we dont get an implant or cavity item
+ elligible_organs += internal_organ
vomit(20, TRUE)
if(elligible_organs.len)
var/obj/item/organ/O = pick(elligible_organs)
diff --git a/code/game/objects/items/devices/flashlight.dm b/code/game/objects/items/devices/flashlight.dm
index ef43fdcc097..2e9d5a78d93 100644
--- a/code/game/objects/items/devices/flashlight.dm
+++ b/code/game/objects/items/devices/flashlight.dm
@@ -105,9 +105,9 @@
var/their = M.p_their()
var/list/mouth_organs = new
- for(var/obj/item/organ/O in M.internal_organs)
- if(O.zone == BODY_ZONE_PRECISE_MOUTH)
- mouth_organs.Add(O)
+ for(var/obj/item/organ/organ as anything in M.internal_organs)
+ if(organ.zone == BODY_ZONE_PRECISE_MOUTH)
+ mouth_organs.Add(organ)
var/organ_list = ""
var/organ_count = LAZYLEN(mouth_organs)
if(organ_count)
diff --git a/code/game/objects/items/devices/scanners/health_analyzer.dm b/code/game/objects/items/devices/scanners/health_analyzer.dm
index 21901b61c19..c8b4af0ca8c 100644
--- a/code/game/objects/items/devices/scanners/health_analyzer.dm
+++ b/code/game/objects/items/devices/scanners/health_analyzer.dm
@@ -273,7 +273,7 @@
[advanced ? "
Dmg | " : ""]\
Status | "
- for(var/obj/item/organ/organ in humantarget.internal_organs)
+ for(var/obj/item/organ/organ as anything in humantarget.internal_organs)
var/status = organ.get_status_text()
if (status != "")
render = TRUE
diff --git a/code/modules/admin/verbs/manipulate_organs.dm b/code/modules/admin/verbs/manipulate_organs.dm
index f126c03f839..d3d1ddfc67b 100644
--- a/code/modules/admin/verbs/manipulate_organs.dm
+++ b/code/modules/admin/verbs/manipulate_organs.dm
@@ -40,13 +40,11 @@
message_admins("[key_name_admin(usr)] has added implant [organ.type] to [ADMIN_LOOKUPFLW(C)]")
if("drop organ/implant", "remove organ/implant")
- for(var/X in C.internal_organs)
- var/obj/item/organ/I = X
- organs["[I.name] ([I.type])"] = I
+ for(var/obj/item/organ/user_organs as anything in C.internal_organs)
+ organs["[user_organs.name] ([user_organs.type])"] = user_organs
- for(var/X in C.implants)
- var/obj/item/implant/I = X
- organs["[I.name] ([I.type])"] = I
+ for(var/obj/item/implant/user_implants as anything in C.implants)
+ organs["[user_implants.name] ([user_implants.type])"] = user_implants
var/obj/item/organ = tgui_input_list(usr, "Select organ/implant", "Organ Manipulation", organs)
if(isnull(organ))
diff --git a/code/modules/cargo/supplypod.dm b/code/modules/cargo/supplypod.dm
index 97c1631c9e1..b1fa56b4e69 100644
--- a/code/modules/cargo/supplypod.dm
+++ b/code/modules/cargo/supplypod.dm
@@ -249,9 +249,8 @@
break
if (effectOrgans) //effectOrgans means remove every organ in our mob
var/mob/living/carbon/carbon_target_mob = target_living
- for(var/organ in carbon_target_mob.internal_organs)
+ for(var/obj/item/organ/organ_to_yeet as anything in carbon_target_mob.internal_organs)
var/destination = get_edge_target_turf(turf_underneath, pick(GLOB.alldirs)) //Pick a random direction to toss them in
- var/obj/item/organ/organ_to_yeet = organ
// SKYRAT EDIT START - Non-spillable organs
if(!organ_to_yeet.drop_when_organ_spilling)
qdel(organ_to_yeet)
diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm
index 3b6afa28d68..f9afb078ee5 100644
--- a/code/modules/mob/living/carbon/carbon.dm
+++ b/code/modules/mob/living/carbon/carbon.dm
@@ -869,8 +869,7 @@
if(mind)
for(var/addiction_type in subtypesof(/datum/addiction))
mind.remove_addiction_points(addiction_type, MAX_ADDICTION_POINTS) //Remove the addiction!
- for(var/O in internal_organs)
- var/obj/item/organ/organ = O
+ for(var/obj/item/organ/organ as anything in internal_organs)
organ.setOrganDamage(0)
for(var/thing in diseases)
var/datum/disease/D = thing
@@ -944,12 +943,11 @@
if(QDELETED(src))
return
var/organs_amt = 0
- for(var/X in internal_organs)
- var/obj/item/organ/O = X
+ for(var/obj/item/organ/internal_organ as anything in internal_organs)
if(prob(50))
organs_amt++
- O.Remove(src)
- O.forceMove(drop_location())
+ internal_organ.Remove(src)
+ internal_organ.forceMove(drop_location())
if(organs_amt)
to_chat(user, span_notice("You retrieve some of [src]\'s internal organs!"))
remove_all_embedded_objects()
@@ -1004,9 +1002,8 @@
/mob/living/carbon/proc/create_internal_organs()
- for(var/X in internal_organs)
- var/obj/item/organ/I = X
- I.Insert(src)
+ for(var/obj/item/organ/internal/internal_organ in internal_organs)
+ internal_organ.Insert(src)
/proc/cmp_organ_slot_asc(slot_a, slot_b)
return GLOB.organ_process_order.Find(slot_a) - GLOB.organ_process_order.Find(slot_b)
diff --git a/code/modules/mob/living/carbon/carbon_defense.dm b/code/modules/mob/living/carbon/carbon_defense.dm
index 3e941b0bd1f..6778051df10 100644
--- a/code/modules/mob/living/carbon/carbon_defense.dm
+++ b/code/modules/mob/living/carbon/carbon_defense.dm
@@ -405,9 +405,8 @@
. = ..()
if(. & EMP_PROTECT_CONTENTS)
return
- for(var/X in internal_organs)
- var/obj/item/organ/O = X
- O.emp_act(severity)
+ for(var/obj/item/organ/internal_organ as anything in internal_organs)
+ internal_organ.emp_act(severity)
///Adds to the parent by also adding functionality to propagate shocks through pulling and doing some fluff effects.
/mob/living/carbon/electrocute_act(shock_damage, source, siemens_coeff = 1, flags = NONE)
diff --git a/code/modules/mob/living/carbon/carbon_defines.dm b/code/modules/mob/living/carbon/carbon_defines.dm
index c1eb92c960d..fc55e3df6bd 100644
--- a/code/modules/mob/living/carbon/carbon_defines.dm
+++ b/code/modules/mob/living/carbon/carbon_defines.dm
@@ -11,12 +11,12 @@
usable_hands = 0 //Populated on init through list/bodyparts
mobility_flags = MOBILITY_FLAGS_CARBON_DEFAULT
blocks_emissive = NONE
- ///List of [/obj/item/organ] in the mob. They don't go in the contents for some reason I don't want to know.
- var/list/internal_organs = list()
+ ///List of [/obj/item/organ/internal] in the mob. They don't go in the contents for some reason I don't want to know.
+ var/list/obj/item/organ/internal/internal_organs = list()
///Same as [above][/mob/living/carbon/var/internal_organs], but stores "slot ID" - "organ" pairs for easy access.
var/list/internal_organs_slot = list()
- ///External organs. This is mostly here for the purposes of mass-updating organ colors.
- var/list/external_organs = list()
+ ///List of [/obj/item/organ/external] in the mob, similarly used as internal_organs.
+ var/list/obj/item/organ/external/external_organs = list()
///Same as [above][/mob/living/carbon/var/external_organs], but stores "ID" = "organ" pairs.
var/list/external_organs_slot = list()
///Can't talk. Value goes down every life proc. NOTE TO FUTURE CODERS: DO NOT INITIALIZE NUMERICAL VARS AS NULL OR I WILL MURDER YOU.
diff --git a/code/modules/mob/living/carbon/death.dm b/code/modules/mob/living/carbon/death.dm
index 35f5f17ebec..93bf3aa3195 100644
--- a/code/modules/mob/living/carbon/death.dm
+++ b/code/modules/mob/living/carbon/death.dm
@@ -47,39 +47,36 @@
if(no_brain || !istype(X, /obj/item/organ/internal/brain))
qdel(X)
else //we're going to drop all bodyparts except chest, so the only organs that needs spilling are those inside it.
- for(var/X in internal_organs)
- var/obj/item/organ/O = X
- if(no_brain && istype(O, /obj/item/organ/internal/brain))
- qdel(O) //so the brain isn't transfered to the head when the head drops.
+ for(var/obj/item/organ/organs as anything in internal_organs)
+ if(no_brain && istype(organs, /obj/item/organ/internal/brain))
+ qdel(organs) //so the brain isn't transfered to the head when the head drops.
continue
// SKYRAT EDIT START - Non-spillable organs
- if(!O.drop_when_organ_spilling)
- qdel(O)
+ if(!organs.drop_when_organ_spilling)
+ qdel(organs)
continue
// SKYRAT EDIT END
- var/org_zone = check_zone(O.zone) //both groin and chest organs.
+ var/org_zone = check_zone(organs.zone) //both groin and chest organs.
if(org_zone == BODY_ZONE_CHEST)
- O.Remove(src)
- O.forceMove(Tsec)
- O.throw_at(get_edge_target_turf(src,pick(GLOB.alldirs)),rand(1,3),5)
+ organs.Remove(src)
+ organs.forceMove(Tsec)
+ organs.throw_at(get_edge_target_turf(src,pick(GLOB.alldirs)),rand(1,3),5)
else
- for(var/X in internal_organs)
- var/obj/item/organ/I = X
- if(no_brain && istype(I, /obj/item/organ/internal/brain))
- qdel(I)
+ for(var/obj/item/organ/organs as anything in internal_organs)
+ if(no_brain && istype(organs, /obj/item/organ/internal/brain))
+ qdel(organs)
continue
- if(no_organs && !istype(I, /obj/item/organ/internal/brain))
- qdel(I)
+ if(no_organs && !istype(organs, /obj/item/organ/internal/brain))
+ qdel(organs)
continue
// SKYRAT EDIT START - Non-spillable organs
- if(!I.drop_when_organ_spilling)
- qdel(I)
+ if(!organs.drop_when_organ_spilling)
+ qdel(organs)
continue
// SKYRAT EDIT END
- I.Remove(src)
- I.forceMove(Tsec)
- I.throw_at(get_edge_target_turf(src,pick(GLOB.alldirs)),rand(1,3),5)
-
+ organs.Remove(src)
+ organs.forceMove(Tsec)
+ organs.throw_at(get_edge_target_turf(src,pick(GLOB.alldirs)),rand(1,3),5)
/mob/living/carbon/spread_bodyparts()
for(var/X in bodyparts)
diff --git a/code/modules/mob/living/carbon/human/dummy.dm b/code/modules/mob/living/carbon/human/dummy.dm
index e11843f8526..89694a63d35 100644
--- a/code/modules/mob/living/carbon/human/dummy.dm
+++ b/code/modules/mob/living/carbon/human/dummy.dm
@@ -38,11 +38,6 @@ INITIALIZE_IMMEDIATE(/mob/living/carbon/human/dummy)
current_organ.Remove(src, special = TRUE) //Please don't somehow kill our dummy
SSwardrobe.stash_object(current_organ)
- for(var/obj/item/organ/external/organ in internal_organs)
- if(organ.type in current_species.external_organs)
- organ.Remove(src)
- SSwardrobe.stash_object(organ)
-
//Instead of just deleting our equipment, we save what we can and reinsert it into SSwardrobe's store
//Hopefully this makes preference reloading not the worst thing ever
/mob/living/carbon/human/dummy/delete_equipment()
diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm
index 577c5622a29..003145d3acf 100644
--- a/code/modules/mob/living/carbon/human/human_defense.dm
+++ b/code/modules/mob/living/carbon/human/human_defense.dm
@@ -882,8 +882,7 @@
var/broken_plural
var/damaged_plural
//Sets organs into their proper list
- for(var/O in internal_organs)
- var/obj/item/organ/organ = O
+ for(var/obj/item/organ/organ as anything in internal_organs)
if(organ.organ_flags & ORGAN_FAILING)
if(broken.len)
broken += ", "
diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm
index 3abe8222a5a..45121c34f86 100644
--- a/code/modules/mob/living/carbon/human/species.dm
+++ b/code/modules/mob/living/carbon/human/species.dm
@@ -517,10 +517,9 @@ GLOBAL_LIST_EMPTY(features_by_species)
C.dna.blood_type = random_blood_type()
for(var/X in inherent_traits)
REMOVE_TRAIT(C, X, SPECIES_TRAIT)
- for(var/obj/item/organ/external/organ in C.internal_organs)
- if(organ.type in external_organs)
- organ.Remove(C)
- qdel(organ)
+ for(var/obj/item/organ/external/organ as anything in C.external_organs)
+ organ.Remove(C)
+ qdel(organ)
//If their inert mutation is not the same, swap it out
if((inert_mutation != new_species.inert_mutation) && LAZYLEN(C.dna.mutation_index) && (inert_mutation in C.dna.mutation_index))
diff --git a/code/modules/mob/living/carbon/human/species_types/felinid.dm b/code/modules/mob/living/carbon/human/species_types/felinid.dm
index d247ab0258a..543115fa88f 100644
--- a/code/modules/mob/living/carbon/human/species_types/felinid.dm
+++ b/code/modules/mob/living/carbon/human/species_types/felinid.dm
@@ -90,8 +90,7 @@
H.set_species(/datum/species/human)
else if(ishuman(H) && !ishumanbasic(H))
var/datum/species/target_species = H.dna.species
- var/organs = H.internal_organs
- for(var/obj/item/organ/current_organ in organs)
+ for(var/obj/item/organ/current_organ as anything in H.external_organs)
if(istype(current_organ, /obj/item/organ/external/tail/cat))
current_organ.Remove(H, TRUE)
var/obj/item/organ/external/tail/new_tail = locate(/obj/item/organ/external/tail) in target_species.external_organs
diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm
index a61c30ec354..bba834997d8 100644
--- a/code/modules/mob/living/living.dm
+++ b/code/modules/mob/living/living.dm
@@ -771,11 +771,10 @@
if(!(C.dna?.species && (NOBLOOD in C.dna.species.species_traits)))
C.blood_volume += (excess_healing*2)//1 excess = 10 blood
- for(var/i in C.internal_organs)
- var/obj/item/organ/O = i
- if(O.organ_flags & ORGAN_SYNTHETIC)
+ for(var/obj/item/organ/organ as anything in C.internal_organs)
+ if(organ.organ_flags & ORGAN_SYNTHETIC)
continue
- O.applyOrganDamage(excess_healing*-1)//1 excess = 5 organ damage healed
+ organ.applyOrganDamage(excess_healing * -1)//1 excess = 5 organ damage healed
adjustOxyLoss(-20, TRUE)
adjustToxLoss(-20, TRUE, TRUE) //slime friendly
diff --git a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm
index a4d429061d4..74654943443 100644
--- a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm
@@ -94,9 +94,8 @@
M.blood_volume = BLOOD_VOLUME_NORMAL
M.cure_all_traumas(TRAUMA_RESILIENCE_MAGIC)
- for(var/organ in M.internal_organs)
- var/obj/item/organ/O = organ
- O.setOrganDamage(0)
+ for(var/obj/item/organ/organ as anything in M.internal_organs)
+ organ.setOrganDamage(0)
for(var/thing in M.diseases)
var/datum/disease/D = thing
if(D.severity == DISEASE_SEVERITY_POSITIVE)
diff --git a/code/modules/surgery/bodyparts/_bodyparts.dm b/code/modules/surgery/bodyparts/_bodyparts.dm
index 58bc358c581..bf0cd360e39 100644
--- a/code/modules/surgery/bodyparts/_bodyparts.dm
+++ b/code/modules/surgery/bodyparts/_bodyparts.dm
@@ -853,7 +853,7 @@
//EMISSIVE CODE END
//Draw external organs like horns and frills
- for(var/obj/item/organ/external/external_organ in external_organs)
+ for(var/obj/item/organ/external/external_organ as anything in external_organs)
if(!dropped && !external_organ.can_draw_on_bodypart(owner))
continue
//Some externals have multiple layers for background, foreground and between