diff --git a/code/modules/organs/internal/_internal.dm b/code/modules/organs/internal/_internal.dm
index 84215072e53..39398a74acb 100644
--- a/code/modules/organs/internal/_internal.dm
+++ b/code/modules/organs/internal/_internal.dm
@@ -45,7 +45,7 @@
icon_state = dead_icon
/obj/item/organ/internal/proc/surgical_fix(mob/user)
- if(damage > min_broken_damage)
+ if(damage > min_broken_damage && !(status & ORGAN_ROBOT))
var/scarring = damage / max_damage
scarring = 1 - 0.5 * scarring ** 2 // Between ~15 and 50 percent loss.
var/new_max_dam = Floor(scarring * max_damage)
@@ -71,7 +71,10 @@
return ..() && !is_broken()
/obj/item/organ/internal/proc/is_damaged()
- return damage > 0
+ return damage > 0 || special_condition()
+
+/obj/item/organ/internal/proc/special_condition() // For unique conditions
+ return
/obj/item/organ/internal/robotize(var/company = "Unbranded")
..()
diff --git a/code/modules/organs/internal/lungs.dm b/code/modules/organs/internal/lungs.dm
index b69a7cbdbd6..2a3444e6dc3 100644
--- a/code/modules/organs/internal/lungs.dm
+++ b/code/modules/organs/internal/lungs.dm
@@ -370,6 +370,9 @@
return english_list(.)
+/obj/item/organ/internal/lungs/special_condition()
+ return rescued
+
/obj/item/organ/internal/lungs/surgical_fix(mob/user)
..()
rescued = FALSE
diff --git a/code/modules/surgery/organs_internal.dm b/code/modules/surgery/organs_internal.dm
index 584006a6027..8e9732f9b63 100644
--- a/code/modules/surgery/organs_internal.dm
+++ b/code/modules/surgery/organs_internal.dm
@@ -34,8 +34,8 @@
return FALSE
var/obj/item/organ/external/affected = target.get_organ(target_zone)
var/is_organ_damaged = FALSE
- for(var/obj/item/organ/I in affected.internal_organs)
- if(I.damage > 0)
+ for(var/obj/item/organ/internal/I in affected.internal_organs)
+ if(I.is_damaged())
is_organ_damaged = TRUE
break
return is_organ_damaged
@@ -52,7 +52,7 @@
var/obj/item/organ/external/affected = target.get_organ(target_zone)
for(var/obj/item/organ/internal/I in affected.internal_organs)
- if(I && I.damage > 0 && !BP_IS_ROBOTIC(I) && (~I.status & ORGAN_DEAD || I.can_recover()))
+ if(I && I.is_damaged() && !BP_IS_ROBOTIC(I) && (~I.status & ORGAN_DEAD || I.can_recover()))
user.visible_message("[user] starts treating damage to [target]'s [I.name] with [tool_name].", \
"You start treating damage to [target]'s [I.name] with [tool_name]." )
target.custom_pain("The pain in your [affected.name] is living hell!",100, affecting = affected)
@@ -71,7 +71,7 @@
var/obj/item/organ/external/affected = target.get_organ(target_zone)
for(var/obj/item/organ/internal/I in affected.internal_organs)
- if(I && I.damage > 0 && !BP_IS_ROBOTIC(I))
+ if(I && I.is_damaged() && !BP_IS_ROBOTIC(I))
if(I.status & ORGAN_DEAD && I.can_recover())
user.visible_message("\The [user] treats damage to [target]'s [I.name] with [tool_name], though it needs to be recovered further.", \
"You treat damage to [target]'s [I.name] with [tool_name], though it needs to be recovered further." )
@@ -101,8 +101,8 @@
target.adjustToxLoss(10)
target.apply_damage(5, BRUTE, target_zone, 0, tool)
- for(var/obj/item/organ/I in affected.internal_organs)
- if(I && I.damage > 0)
+ for(var/obj/item/organ/internal/I in affected.internal_organs)
+ if(I && I.is_damaged())
I.take_damage(dam_amt,0)
/decl/surgery_step/internal/fix_organ_robotic //For artificial organs
@@ -122,8 +122,8 @@
var/obj/item/organ/external/affected = target.get_organ(target_zone)
var/is_organ_damaged = 0
- for(var/obj/item/organ/I in affected.internal_organs)
- if(I.damage > 0 && I.robotic >= 2)
+ for(var/obj/item/organ/internal/I in affected.internal_organs)
+ if(I.is_damaged() && I.robotic >= 2)
is_organ_damaged = TRUE
break
return is_organ_damaged && IS_ORGAN_FULLY_OPEN
@@ -133,8 +133,8 @@
return
var/obj/item/organ/external/affected = target.get_organ(target_zone)
- for(var/obj/item/organ/I in affected.internal_organs)
- if(I && I.damage > 0)
+ for(var/obj/item/organ/internal/I in affected.internal_organs)
+ if(I && I.is_damaged())
if(I.robotic >= 2)
user.visible_message("[user] starts mending the damage to [target]'s [I.name]'s mechanisms.", \
SPAN_NOTICE("You start mending the damage to [target]'s [I.name]'s mechanisms." ))
@@ -147,12 +147,12 @@
return
var/obj/item/organ/external/affected = target.get_organ(target_zone)
- for(var/obj/item/organ/I in affected.internal_organs)
- if(I && I.damage > 0)
+ for(var/obj/item/organ/internal/I in affected.internal_organs)
+ if(I && I.is_damaged())
if(I.robotic >= 2)
user.visible_message("[user] repairs [target]'s [I.name] with [tool].", \
SPAN_NOTICE("You repair [target]'s [I.name] with [tool].") )
- I.damage = 0
+ I.surgical_fix(user)
if(istype(tool, /obj/item/stack/nanopaste))
var/obj/item/stack/nanopaste/nanopaste = tool
nanopaste.use(1)
@@ -169,7 +169,7 @@
target.adjustToxLoss(5)
target.apply_damage(5, BRUTE, target_zone, 0, tool, damage_flags = tool.damage_flags())
- for(var/obj/item/organ/I in affected.internal_organs)
+ for(var/obj/item/organ/internal/I in affected.internal_organs)
if(I)
I.take_damage(rand(3,5),0)
diff --git a/html/changelogs/lung_rescue_surgery.yml b/html/changelogs/lung_rescue_surgery.yml
new file mode 100644
index 00000000000..f7b66a95302
--- /dev/null
+++ b/html/changelogs/lung_rescue_surgery.yml
@@ -0,0 +1,7 @@
+author: Vrow
+
+delete-after: True
+
+changes:
+ - bugfix: "Fixed being unable to fix rescued lungs surgically if they don't have any damage."
+ - bugfix: "Fixed being unable to fix rescued mechanical lungs at all."