mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-07-14 00:23:29 +01:00
Merge pull request #9398 from Birdtalon/set_species
Damage conservation on set_species, i.e. changeling transform no longer heals everything.
This commit is contained in:
@@ -1272,7 +1272,7 @@
|
||||
else
|
||||
to_chat(usr, "<span class='notice'>[self ? "Your" : "[src]'s"] pulse is [src.get_pulse(GETPULSE_HAND)].</span>")
|
||||
|
||||
/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,69 @@
|
||||
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 && 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
|
||||
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/broken = I.is_broken()
|
||||
var/stats = list(OI, damage, broken)
|
||||
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/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.
|
||||
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/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
|
||||
|
||||
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]
|
||||
var/broken = part[3]
|
||||
I.receive_damage(damage, 1)
|
||||
if(broken && !(I.status & ORGAN_BROKEN))
|
||||
I.status |= ORGAN_BROKEN
|
||||
qdel(part)
|
||||
|
||||
else
|
||||
dna.species.create_organs(src)
|
||||
|
||||
for(var/thing in kept_items)
|
||||
equip_to_slot_if_possible(thing, kept_items[thing], redraw_mob = 0)
|
||||
|
||||
Reference in New Issue
Block a user