diff --git a/code/ZAS - oldbs12/Plasma.dm b/code/ZAS - oldbs12/Plasma.dm
index 716ea216403..5be45be3c07 100644
--- a/code/ZAS - oldbs12/Plasma.dm
+++ b/code/ZAS - oldbs12/Plasma.dm
@@ -118,7 +118,7 @@ obj/var/contaminated = 0
/mob/living/carbon/human/proc/burn_eyes()
//The proc that handles eye burning.
if(prob(20)) src << "\red Your eyes burn!"
- var/datum/organ/internal/eyes/E = internal_organs["eyes"]
+ var/datum/organ/internal/eyes/E = internal_organs_by_name["eyes"]
E.damage += 2.5
eye_blurry = min(eye_blurry+1.5,50)
if (prob(max(0,E.damage - 15) + 1) &&!eye_blind)
diff --git a/code/game/machinery/adv_med.dm b/code/game/machinery/adv_med.dm
index af127fe4930..bf63e1f644f 100644
--- a/code/game/machinery/adv_med.dm
+++ b/code/game/machinery/adv_med.dm
@@ -332,8 +332,7 @@
else
dat += "
[e.display_name] | - | - | Not Found | "
dat += ""
- for(var/organ_name in occupant.internal_organs)
- var/datum/organ/internal/i = occupant.internal_organs[organ_name]
+ for(var/datum/organ/internal/i in occupant.internal_organs)
var/mech = ""
if(i.robotic == 1)
mech = "Assisted:"
diff --git a/code/game/machinery/flasher.dm b/code/game/machinery/flasher.dm
index 303e814ef11..eff51fc6976 100644
--- a/code/game/machinery/flasher.dm
+++ b/code/game/machinery/flasher.dm
@@ -81,7 +81,7 @@
O.Weaken(strength)
if (istype(O, /mob/living/carbon/human))
var/mob/living/carbon/human/H = O
- var/datum/organ/internal/eyes/E = H.internal_organs["eyes"]
+ var/datum/organ/internal/eyes/E = H.internal_organs_by_name["eyes"]
if ((E.damage > E.min_bruised_damage && prob(E.damage + 50)))
flick("e_flash", O:flash)
E.damage += rand(1, 5)
diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm
index 927cc0b11a2..8b508553f43 100644
--- a/code/game/objects/items.dm
+++ b/code/game/objects/items.dm
@@ -611,7 +611,7 @@
"\red You stab yourself in the eyes with [src]!" \
)
if(istype(M, /mob/living/carbon/human))
- var/datum/organ/internal/eyes/eyes = H.internal_organs["eyes"]
+ var/datum/organ/internal/eyes/eyes = H.internal_organs_by_name["eyes"]
eyes.damage += rand(3,4)
if(eyes.damage >= eyes.min_bruised_damage)
if(M.stat != 2)
diff --git a/code/game/objects/items/weapons/grenades/flashbang.dm b/code/game/objects/items/weapons/grenades/flashbang.dm
index 61a17650904..26372ce5700 100644
--- a/code/game/objects/items/weapons/grenades/flashbang.dm
+++ b/code/game/objects/items/weapons/grenades/flashbang.dm
@@ -83,7 +83,7 @@
//This really should be in mob not every check
if(ishuman(M))
var/mob/living/carbon/human/H = M
- var/datum/organ/internal/eyes/E = H.internal_organs["eyes"]
+ var/datum/organ/internal/eyes/E = H.internal_organs_by_name["eyes"]
if (E.damage >= E.min_bruised_damage)
M << "\red Your eyes start to burn badly!"
if(!banglet && !(istype(src , /obj/item/weapon/grenade/flashbang/clusterbang)))
diff --git a/code/game/objects/items/weapons/tools.dm b/code/game/objects/items/weapons/tools.dm
index 7e863792a0c..b38ed25be23 100644
--- a/code/game/objects/items/weapons/tools.dm
+++ b/code/game/objects/items/weapons/tools.dm
@@ -364,7 +364,7 @@
var/safety = user:eyecheck()
if(istype(user, /mob/living/carbon/human))
var/mob/living/carbon/human/H = user
- var/datum/organ/internal/eyes/E = H.internal_organs["eyes"]
+ var/datum/organ/internal/eyes/E = H.internal_organs_by_name["eyes"]
if(H.species.flags & IS_SYNTHETIC)
return
switch(safety)
diff --git a/code/modules/events/organ_failure.dm b/code/modules/events/organ_failure.dm
index 3639895cec6..329044ef735 100644
--- a/code/modules/events/organ_failure.dm
+++ b/code/modules/events/organ_failure.dm
@@ -13,7 +13,7 @@ datum/event/organ_failure/announce()
datum/event/organ_failure/start()
var/list/candidates = list() //list of candidate keys
for(var/mob/living/carbon/human/G in player_list)
- if(G.mind && G.mind.current && G.mind.current.stat != DEAD && G.health > 70)
+ if(G.mind && G.mind.current && G.mind.current.stat != DEAD && G.health > 70 && G.internal_organs)
candidates += G
if(!candidates.len) return
candidates = shuffle(candidates)//Incorporating Donkie's list shuffle
@@ -24,8 +24,7 @@ datum/event/organ_failure/start()
var/acute = prob(15)
if (prob(75))
//internal organ infection
- var/O = pick(C.internal_organs)
- var/datum/organ/internal/I = C.internal_organs[O]
+ var/datum/organ/internal/I = pick(C.internal_organs)
if (acute)
I.germ_level = max(INFECTION_LEVEL_TWO, I.germ_level)
@@ -39,7 +38,7 @@ datum/event/organ_failure/start()
O.germ_level = max(INFECTION_LEVEL_TWO, O.germ_level)
else
O.germ_level = max(rand(INFECTION_LEVEL_ONE,INFECTION_LEVEL_ONE*2), O.germ_level)
-
+
C.bad_external_organs |= O
severity--
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index 6ceac0ba1ac..7bc896c9cd6 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -1231,8 +1231,7 @@
H.brainmob.mind.transfer_to(src)
del(H)
- for(var/E in internal_organs)
- var/datum/organ/internal/I = internal_organs[E]
+ for(var/datum/organ/internal/I in internal_organs)
I.damage = 0
for (var/datum/disease/virus in viruses)
@@ -1244,11 +1243,11 @@
..()
/mob/living/carbon/human/proc/is_lung_ruptured()
- var/datum/organ/internal/lungs/L = internal_organs["lungs"]
+ var/datum/organ/internal/lungs/L = internal_organs_by_name["lungs"]
return L.is_bruised()
/mob/living/carbon/human/proc/rupture_lung()
- var/datum/organ/internal/lungs/L = internal_organs["lungs"]
+ var/datum/organ/internal/lungs/L = internal_organs_by_name["lungs"]
if(!L.is_bruised())
src.custom_pain("You feel a stabbing pain in your chest!", 1)
diff --git a/code/modules/mob/living/carbon/human/human_damage.dm b/code/modules/mob/living/carbon/human/human_damage.dm
index 32be6ddfc98..afb37b21e6f 100644
--- a/code/modules/mob/living/carbon/human/human_damage.dm
+++ b/code/modules/mob/living/carbon/human/human_damage.dm
@@ -18,7 +18,7 @@
/mob/living/carbon/human/getBrainLoss()
if(species && species.flags & NO_INTORGANS) return
var/res = brainloss
- var/datum/organ/internal/brain/sponge = internal_organs["brain"]
+ var/datum/organ/internal/brain/sponge = internal_organs_by_name["brain"]
if (sponge.is_bruised())
res += 20
if (sponge.is_broken())
diff --git a/code/modules/organs/blood.dm b/code/modules/organs/blood.dm
index d6939596d40..5870500ab14 100644
--- a/code/modules/organs/blood.dm
+++ b/code/modules/organs/blood.dm
@@ -72,14 +72,14 @@ var/const/BLOOD_VOLUME_SURVIVE = 122
// Damaged heart virtually reduces the blood volume, as the blood isn't
// being pumped properly anymore.
- var/datum/organ/internal/heart/heart = internal_organs["heart"]
- if(heart)
- if(heart.damage > 1 && heart.damage < heart.min_bruised_damage)
- blood_volume *= 0.8
- else if(heart.damage >= heart.min_bruised_damage && heart.damage < heart.min_broken_damage)
- blood_volume *= 0.6
- else if(heart.damage >= heart.min_broken_damage && heart.damage < INFINITY)
- blood_volume *= 0.3
+ var/datum/organ/internal/heart/heart = internal_organs_by_name["heart"]
+
+ if(heart.damage > 1 && heart.damage < heart.min_bruised_damage)
+ blood_volume *= 0.8
+ else if(heart.damage >= heart.min_bruised_damage && heart.damage < heart.min_broken_damage)
+ blood_volume *= 0.6
+ else if(heart.damage >= heart.min_broken_damage && heart.damage < INFINITY)
+ blood_volume *= 0.3
//Effects of bloodloss
switch(blood_volume)
diff --git a/code/modules/organs/organ_external.dm b/code/modules/organs/organ_external.dm
index d9d8577753b..7321a763e3a 100644
--- a/code/modules/organs/organ_external.dm
+++ b/code/modules/organs/organ_external.dm
@@ -98,7 +98,7 @@
return
// High brute damage or sharp objects may damage internal organs
- if(internal_organs != null) if( (sharp && brute >= 5) || brute >= 10) if(prob(5))
+ if(internal_organs && ( (sharp && brute >= 5) || brute >= 10) && prob(5))
// Damage an internal organ
var/datum/organ/internal/I = pick(internal_organs)
I.take_damage(brute / 2)
diff --git a/code/modules/organs/organ_internal.dm b/code/modules/organs/organ_internal.dm
index e9b871c445d..dc9f1a76e53 100644
--- a/code/modules/organs/organ_internal.dm
+++ b/code/modules/organs/organ_internal.dm
@@ -28,8 +28,8 @@
var/datum/organ/external/E = H.organs_by_name[src.parent_organ]
if(E.internal_organs == null)
E.internal_organs = list()
- E.internal_organs += src
- H.internal_organs[src.name] = src
+ E.internal_organs |= src
+ H.internal_organs |= src
src.owner = H
/datum/organ/internal/process()
diff --git a/code/modules/organs/pain.dm b/code/modules/organs/pain.dm
index cbb0a121d06..192947b513c 100644
--- a/code/modules/organs/pain.dm
+++ b/code/modules/organs/pain.dm
@@ -102,8 +102,7 @@ mob/living/carbon/human/proc/handle_pain()
pain(damaged_organ.display_name, maxdam, 0)
// Damage to internal organs hurts a lot.
- for(var/organ_name in internal_organs)
- var/datum/organ/internal/I = internal_organs[organ_name]
+ for(var/datum/organ/internal/I in internal_organs)
if(I.damage > 2) if(prob(2))
var/datum/organ/external/parent = get_organ(I.parent_organ)
src.custom_pain("You feel a sharp pain in your [parent.display_name]", 1)
diff --git a/code/modules/reagents/Chemistry-Reagents.dm b/code/modules/reagents/Chemistry-Reagents.dm
index 464baac5a78..29975c82964 100644
--- a/code/modules/reagents/Chemistry-Reagents.dm
+++ b/code/modules/reagents/Chemistry-Reagents.dm
@@ -1893,7 +1893,7 @@ datum
M.eye_blind = max(M.eye_blind-5 , 0)
if(ishuman(M))
var/mob/living/carbon/human/H = M
- var/datum/organ/internal/eyes/E = H.internal_organs["eyes"]
+ var/datum/organ/internal/eyes/E = H.internal_organs_by_name["eyes"]
if(istype(E))
if(E.damage > 0)
E.damage -= 1
@@ -1914,8 +1914,9 @@ datum
if(!M) M = holder.my_atom
if(ishuman(M))
var/mob/living/carbon/human/H = M
- var/datum/organ/external/chest/C = H.get_organ("chest")
- for(var/datum/organ/internal/I in C.internal_organs)
+
+ //Peridaxon is hard enough to get, it's probably fair to make this all internal organs
+ for(var/datum/organ/internal/I in H.internal_organs)
if(I.damage > 0)
I.damage -= 0.20
..()
@@ -3329,7 +3330,7 @@ datum
M:drowsyness = max(M:drowsyness, 30/sober_str)
if(ishuman(M))
var/mob/living/carbon/human/H = M
- var/datum/organ/internal/liver/L = H.internal_organs["liver"]
+ var/datum/organ/internal/liver/L = H.internal_organs_by_name["liver"]
if (istype(L))
L.take_damage(0.1, 1)
H.adjustToxLoss(0.1)
diff --git a/code/modules/surgery/braincore.dm b/code/modules/surgery/braincore.dm
index b39583ebf03..03aad05e11d 100644
--- a/code/modules/surgery/braincore.dm
+++ b/code/modules/surgery/braincore.dm
@@ -112,6 +112,7 @@
B.transfer_identity(target)
target.internal_organs -= B
+ target.internal_organs_by_name -= "brain"
target:brain_op_stage = 4.0
target.death()//You want them to die after the brain was transferred, so not to trigger client death() twice.
@@ -178,7 +179,7 @@
end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
user.visible_message("\blue [user] mends hematoma in [target]'s brain with \the [tool].", \
"\blue You mend hematoma in [target]'s brain with \the [tool].")
- var/datum/organ/internal/brain/sponge = target.internal_organs["brain"]
+ var/datum/organ/internal/brain/sponge = target.internal_organs_by_name["brain"]
if (sponge)
sponge.damage = 0
diff --git a/code/modules/surgery/eye.dm b/code/modules/surgery/eye.dm
index 4fd31b20760..db1c8d23da9 100644
--- a/code/modules/surgery/eye.dm
+++ b/code/modules/surgery/eye.dm
@@ -39,7 +39,7 @@
target.blinded += 1.5
fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- var/datum/organ/internal/eyes/eyes = target.internal_organs["eyes"]
+ var/datum/organ/internal/eyes/eyes = target.internal_organs_by_name["eyes"]
var/datum/organ/external/affected = target.get_organ(target_zone)
user.visible_message("\red [user]'s hand slips, slicing [target]'s eyes wth \the [tool]!" , \
"\red Your hand slips, slicing [target]'s eyes wth \the [tool]!" )
@@ -69,7 +69,7 @@
target.op_stage.eyes = 2
fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- var/datum/organ/internal/eyes/eyes = target.internal_organs["eyes"]
+ var/datum/organ/internal/eyes/eyes = target.internal_organs_by_name["eyes"]
var/datum/organ/external/affected = target.get_organ(target_zone)
user.visible_message("\red [user]'s hand slips, damaging [target]'s eyes with \the [tool]!", \
"\red Your hand slips, damaging [target]'s eyes with \the [tool]!")
@@ -100,7 +100,7 @@
target.op_stage.eyes = 3
fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- var/datum/organ/internal/eyes/eyes = target.internal_organs["eyes"]
+ var/datum/organ/internal/eyes/eyes = target.internal_organs_by_name["eyes"]
var/datum/organ/external/affected = target.get_organ(target_zone)
user.visible_message("\red [user]'s hand slips, stabbing \the [tool] into [target]'s eye!", \
"\red Your hand slips, stabbing \the [tool] into [target]'s eye!")
@@ -126,7 +126,7 @@
"You are beginning to cauterize the incision around [target]'s eyes with \the [tool].")
end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- var/datum/organ/internal/eyes/eyes = target.internal_organs["eyes"]
+ var/datum/organ/internal/eyes/eyes = target.internal_organs_by_name["eyes"]
user.visible_message("\blue [user] cauterizes the incision around [target]'s eyes with \the [tool].", \
"\blue You cauterize the incision around [target]'s eyes with \the [tool].")
if (target.op_stage.eyes == 3)
@@ -136,7 +136,7 @@
target.op_stage.eyes = 0
fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- var/datum/organ/internal/eyes/eyes = target.internal_organs["eyes"]
+ var/datum/organ/internal/eyes/eyes = target.internal_organs_by_name["eyes"]
var/datum/organ/external/affected = target.get_organ(target_zone)
user.visible_message("\red [user]'s hand slips, searing [target]'s eyes with \the [tool]!", \
"\red Your hand slips, searing [target]'s eyes with \the [tool]!")
diff --git a/code/modules/surgery/ribcage.dm b/code/modules/surgery/ribcage.dm
index 44eddb312ef..be7734b4a68 100644
--- a/code/modules/surgery/ribcage.dm
+++ b/code/modules/surgery/ribcage.dm
@@ -202,9 +202,10 @@
return 0
var/is_chest_organ_damaged = 0
var/datum/organ/external/chest/chest = target.get_organ("chest")
- for(var/datum/organ/internal/I in chest.internal_organs) if(I.damage > 0)
- is_chest_organ_damaged = 1
- break
+ for(var/datum/organ/internal/I in chest.internal_organs)
+ if(I.damage > 0)
+ is_chest_organ_damaged = 1
+ break
return ..() && is_chest_organ_damaged && target.op_stage.ribcage == 2
begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
@@ -359,7 +360,7 @@
return ..() && is_chest_organ_damaged && target.op_stage.ribcage == 2
begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- var/datum/organ/internal/heart/heart = target.internal_organs["heart"]
+ var/datum/organ/internal/heart/heart = target.internal_organs_by_name["heart"]
if(heart.damage > 0)
if(heart.robotic == 2)
@@ -372,7 +373,7 @@
..()
end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- var/datum/organ/internal/heart/heart = target.internal_organs["heart"]
+ var/datum/organ/internal/heart/heart = target.internal_organs_by_name["heart"]
if(heart.damage > 0)
if(heart.robotic == 2)
user.visible_message("\blue [user] repairs [target]'s heart with \the [tool].", \
@@ -380,7 +381,7 @@
heart.damage = 0
fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- var/datum/organ/internal/heart/heart = target.internal_organs["heart"]
+ var/datum/organ/internal/heart/heart = target.internal_organs_by_name["heart"]
user.visible_message("\red [user]'s hand slips, smearing [tool] in the incision in [target]'s heart, gumming it up!!" , \
"\red Your hand slips, smearing [tool] in the incision in [target]'s heart, gumming it up!")
heart.take_damage(5, 0)
diff --git a/code/modules/virus2/effect.dm b/code/modules/virus2/effect.dm
index 276bf585ec4..fca733e95c6 100644
--- a/code/modules/virus2/effect.dm
+++ b/code/modules/virus2/effect.dm
@@ -381,7 +381,7 @@
activate(var/mob/living/carbon/mob,var/multiplier)
if(istype(mob, /mob/living/carbon/human))
var/mob/living/carbon/human/H = mob
- var/datum/organ/internal/brain/B = H.internal_organs["brain"]
+ var/datum/organ/internal/brain/B = H.internal_organs_by_name["brain"]
if (B.damage < B.min_broken_damage)
B.take_damage(5)
else