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