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."