From 692c0292d1d15ba16f2a007b98c03e07853ac252 Mon Sep 17 00:00:00 2001 From: Birdtalon Date: Tue, 21 Aug 2018 22:40:33 +0100 Subject: [PATCH 1/5] adds checks within set_species() for retaining damage, applies those checks to changeling transform --- .../gamemodes/changeling/powers/transform.dm | 2 +- code/modules/mob/living/carbon/human/human.dm | 60 ++++++++++++++++++- 2 files changed, 59 insertions(+), 3 deletions(-) diff --git a/code/game/gamemodes/changeling/powers/transform.dm b/code/game/gamemodes/changeling/powers/transform.dm index bacdc8b0d8b..15cf1022d9f 100644 --- a/code/game/gamemodes/changeling/powers/transform.dm +++ b/code/game/gamemodes/changeling/powers/transform.dm @@ -15,7 +15,7 @@ if(!chosen_dna) return if(ishuman(user)) - user.set_species(chosen_dna.species.type) + user.set_species(chosen_dna.species.type, retain_damage = TRUE) user.dna = chosen_dna.Clone() user.real_name = chosen_dna.real_name domutcheck(user, null, MUTCHK_FORCED) //Ensures species that get powers by the species proc handle_dna keep them diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 3f36b8b6d55..f187283a143 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -1272,7 +1272,7 @@ else to_chat(usr, "[self ? "Your" : "[src]'s"] pulse is [src.get_pulse(GETPULSE_HAND)].") -/mob/living/carbon/human/proc/set_species(datum/species/new_species, default_colour, delay_icon_update = FALSE, skip_same_check = FALSE) +/mob/living/carbon/human/proc/set_species(datum/species/new_species, default_colour, delay_icon_update = FALSE, skip_same_check = FALSE, retain_damage = FALSE) if(!skip_same_check) if(dna.species.name == initial(new_species.name)) return @@ -1325,7 +1325,63 @@ if(I) kept_items[I] = thing - dna.species.create_organs(src) + if(retain_damage) + //Create a list of body parts which are damaged by burn or brute and save them to apply after new organs are generated. First we just handle external organs. + var/bodypart_damages = list() + //Loop through all external organs and save the damage states for brute and burn + for(var/obj/item/organ/external/E in bodyparts) + if(E.brute_dam == 0 && E.burn_dam == 0) //If there's no damage we don't bother remembering it. + continue + var/brute = E.brute_dam + var/burn = E.burn_dam + var/IB = E.internal_bleeding + var/obj/item/organ/external/OE = new E.type() + var/stats = list(OE, brute, burn, IB) + bodypart_damages += list(stats) + + //Now we do the same for internal organs via the same proceedure. + var/internal_damages = list() + for(var/obj/item/organ/internal/I in internal_organs) + if(I.damage == 0) + continue + var/obj/item/organ/internal/OI = new I.type() + var/damage = I.damage + var/stats = list(OI, damage) + internal_damages += list(stats) + + //Create the new organs for the species change + dna.species.create_organs(src) + + //Apply relevant damages and variables to the new organs. + for(var/obj/item/organ/external/E in bodyparts) + for(var/list/part in bodypart_damages) + var/obj/item/organ/external/OE = part[1] + if((E.type == OE.type)) // Type has to be explicit, as right limbs are a child of left ones etc. + var/brute = part[2] + var/burn = part[3] + var/IB = part[4] + //Deal the damage to the new organ and then delete the entry to prevent duplicate checks + E.receive_damage(brute, burn, ignore_resists = TRUE) + E.internal_bleeding = IB + qdel(part) + + for(var/obj/item/organ/internal/I in internal_organs) + for(var/list/part in internal_damages) + var/obj/item/organ/internal/OI = part[1] + var/organ_type + + if(OI.parent_type == /obj/item/organ/internal) //Dealing with species organs + organ_type = OI.type + else + organ_type = OI.parent_type + + if(istype(I, organ_type)) + var/damage = part[2] + I.receive_damage(damage, 1) + qdel(part) + + else + dna.species.create_organs(src) for(var/thing in kept_items) equip_to_slot_or_del(thing, kept_items[thing]) From 9acad50dfc389afa977fa54e112ed4eb49de2e0c Mon Sep 17 00:00:00 2001 From: Birdtalon Date: Wed, 22 Aug 2018 22:18:00 +0100 Subject: [PATCH 2/5] internal bleeding check --- code/modules/mob/living/carbon/human/human.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index f187283a143..c21c6a8c373 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -1330,7 +1330,7 @@ var/bodypart_damages = list() //Loop through all external organs and save the damage states for brute and burn for(var/obj/item/organ/external/E in bodyparts) - if(E.brute_dam == 0 && E.burn_dam == 0) //If there's no damage we don't bother remembering it. + if(E.brute_dam == 0 && E.burn_dam == 0 && E.internal_bleeding == FALSE) //If there's no damage we don't bother remembering it. continue var/brute = E.brute_dam var/burn = E.burn_dam From fc04765f4ed60388c44504038d81a92b6d192520 Mon Sep 17 00:00:00 2001 From: Birdtalon Date: Sun, 26 Aug 2018 12:51:20 +0100 Subject: [PATCH 3/5] handles broken internal organs --- code/modules/mob/living/carbon/human/human.dm | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index c21c6a8c373..bcc699fae9b 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -1346,7 +1346,8 @@ continue var/obj/item/organ/internal/OI = new I.type() var/damage = I.damage - var/stats = list(OI, damage) + var/broken = I.is_broken() + var/stats = list(OI, damage, broken) internal_damages += list(stats) //Create the new organs for the species change @@ -1377,7 +1378,10 @@ if(istype(I, organ_type)) var/damage = part[2] + var/broken = part[3] I.receive_damage(damage, 1) + if(broken && !(I.status & ORGAN_BROKEN)) + I.status |= ORGAN_BROKEN qdel(part) else From 72797ff03ae51fb80e4a345f6587760f9fe990a6 Mon Sep 17 00:00:00 2001 From: Birdtalon Date: Tue, 28 Aug 2018 18:13:23 +0100 Subject: [PATCH 4/5] changes for loops to typeless --- code/modules/mob/living/carbon/human/human.dm | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index bcc699fae9b..82b99059608 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -1354,7 +1354,8 @@ dna.species.create_organs(src) //Apply relevant damages and variables to the new organs. - for(var/obj/item/organ/external/E in bodyparts) + for(var/B in bodyparts) + var/obj/item/organ/external/E = B for(var/list/part in bodypart_damages) var/obj/item/organ/external/OE = part[1] if((E.type == OE.type)) // Type has to be explicit, as right limbs are a child of left ones etc. @@ -1366,7 +1367,8 @@ E.internal_bleeding = IB qdel(part) - for(var/obj/item/organ/internal/I in internal_organs) + for(var/O in internal_organs) + var/obj/item/organ/internal/I = O for(var/list/part in internal_damages) var/obj/item/organ/internal/OI = part[1] var/organ_type From ecc7ce1e49a5b0b0bc118a269cde65dfd04aeacf Mon Sep 17 00:00:00 2001 From: Birdtalon Date: Fri, 5 Oct 2018 23:43:11 +0100 Subject: [PATCH 5/5] update to support merged changes --- code/game/gamemodes/changeling/changeling_power.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/gamemodes/changeling/changeling_power.dm b/code/game/gamemodes/changeling/changeling_power.dm index da5c31fc092..387e7ce9d61 100644 --- a/code/game/gamemodes/changeling/changeling_power.dm +++ b/code/game/gamemodes/changeling/changeling_power.dm @@ -87,7 +87,7 @@ if(!D) return - H.set_species(D.species.type) + H.set_species(D.species.type, retain_damage = TRUE) H.dna = D.Clone() H.real_name = D.real_name domutcheck(H, null, MUTCHK_FORCED) //Ensures species that get powers by the species proc handle_dna keep them