diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 6b9cbf02589..294b9c8669b 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -194,7 +194,7 @@ status += "hurts when touched" if(org.status & ORGAN_DEAD) status += "is bruised and necrotic" - if(!org.is_usable()) + if(!org.is_usable() || org.is_dislocated()) status += "dangling uselessly" if(status.len) src.show_message("My [org.name] is [english_list(status)].",1) diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index d6a88f35ffd..01614964e39 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -1324,7 +1324,7 @@ var/list/limbs = list() for(var/limb in organs_by_name) var/obj/item/organ/external/current_limb = organs_by_name[limb] - if(current_limb && current_limb.dislocated == 2) + if(current_limb && current_limb.dislocated > 0 && !current_limb.is_parent_dislocated()) //if the parent is also dislocated you will have to relocate that first limbs |= limb var/choice = input(usr,"Which joint do you wish to relocate?") as null|anything in limbs diff --git a/code/modules/mob/living/carbon/human/human_attackhand.dm b/code/modules/mob/living/carbon/human/human_attackhand.dm index 7cc3156f189..d8d40ab660a 100644 --- a/code/modules/mob/living/carbon/human/human_attackhand.dm +++ b/code/modules/mob/living/carbon/human/human_attackhand.dm @@ -326,7 +326,7 @@ if(!target_zone) return 0 var/obj/item/organ/external/organ = get_organ(check_zone(target_zone)) - if(!organ || organ.is_dislocated() || organ.dislocated == -1) + if(!organ || organ.dislocated > 0 || organ.dislocated == -1) //don't use is_dislocated() here, that checks parent return 0 user.visible_message("[user] begins to dislocate [src]'s [organ.joint]!") diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index 80798fa57bb..8e892436e0e 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -847,7 +847,10 @@ if(!isSynthetic() && (species.flags & IS_PLANT) && (!light_organ || light_organ.is_broken())) if(nutrition < 200) take_overall_damage(2,0) - traumatic_shock++ + + //traumatic_shock is updated every tick, incrementing that is pointless - shock_stage is the counter. + //Not that it matters much for diona, who have NO_PAIN. + shock_stage++ // TODO: stomach and bloodstream organ. if(!isSynthetic()) diff --git a/code/modules/mob/living/carbon/shock.dm b/code/modules/mob/living/carbon/shock.dm index 92eccc66df8..370d3f89d24 100644 --- a/code/modules/mob/living/carbon/shock.dm +++ b/code/modules/mob/living/carbon/shock.dm @@ -23,8 +23,10 @@ if(istype(src,/mob/living/carbon/human)) var/mob/living/carbon/human/M = src for(var/obj/item/organ/external/organ in M.organs) - if(organ && (organ.is_broken() || organ.open)) + if(organ.is_broken() || organ.open) src.traumatic_shock += 30 + else if(organ.is_dislocated()) + src.traumatic_shock += 15 if(src.traumatic_shock < 0) src.traumatic_shock = 0 diff --git a/code/modules/organs/organ_external.dm b/code/modules/organs/organ_external.dm index a1a31fad7c6..d3b309fd846 100644 --- a/code/modules/organs/organ_external.dm +++ b/code/modules/organs/organ_external.dm @@ -60,7 +60,7 @@ var/cannot_gib // Impossible to gib, distinct from amputation. var/joint = "joint" // Descriptive string used in dislocation. var/amputation_point // Descriptive string used in amputation. - var/dislocated = 0 // If you target a joint, you can dislocate the limb, causing temporary damage to the organ. + var/dislocated = 0 // If you target a joint, you can dislocate the limb, impairing it's usefulness and causing pain var/encased // Needs to be opened with a saw to access the organs. // Surgery vars. @@ -156,32 +156,38 @@ /obj/item/organ/external/proc/is_dislocated() if(dislocated > 0) return 1 - if(parent) - return parent.is_dislocated() + if(is_parent_dislocated()) + return 1//if any parent is dislocated, we are considered dislocated as well return 0 -/obj/item/organ/external/proc/dislocate(var/primary) - if(dislocated != -1) - if(primary) - dislocated = 2 - else - dislocated = 1 - owner.verbs |= /mob/living/carbon/human/proc/undislocate - if(children && children.len) - for(var/obj/item/organ/external/child in children) - child.dislocate() +/obj/item/organ/external/proc/is_parent_dislocated() + var/obj/item/organ/external/O = parent + while(O && O.dislocated != -1) + if(O.dislocated == 1) + return 1 + O = O.parent + return 0 + + +/obj/item/organ/external/proc/dislocate() + if(dislocated == -1) + return + + dislocated = 1 + if(owner) + owner.verbs |= /mob/living/carbon/human/proc/undislocate /obj/item/organ/external/proc/undislocate() - if(dislocated != -1) - dislocated = 0 - if(children && children.len) - for(var/obj/item/organ/external/child in children) - if(child.dislocated == 1) - child.undislocate() + if(dislocated == -1) + return + + dislocated = 0 if(owner) owner.shock_stage += 20 + + //check to see if we still need the verb for(var/obj/item/organ/external/limb in owner.organs) - if(limb.dislocated == 2) + if(limb.dislocated == 1) return owner.verbs -= /mob/living/carbon/human/proc/undislocate @@ -1085,7 +1091,7 @@ Note that amputating the affected organ does in fact remove the infection from t return 0 /obj/item/organ/external/proc/is_usable() - return !is_dislocated() && !(status & (ORGAN_MUTATED|ORGAN_DEAD)) + return !(status & (ORGAN_MUTATED|ORGAN_DEAD)) /obj/item/organ/external/proc/is_malfunctioning() return ((robotic >= ORGAN_ROBOT) && (brute_dam + burn_dam) >= 10 && prob(brute_dam + burn_dam))