From a63b9b4e73834935a3c8fc5bb038bc475cac8f13 Mon Sep 17 00:00:00 2001 From: Zuhayr Date: Tue, 24 Mar 2015 15:01:20 +1030 Subject: [PATCH] Beginning to port over new icon update from limbs branch. WIP --- baystation12.dme | 1 + code/game/machinery/bioprinter.dm | 2 +- code/game/objects/items.dm | 11 +- code/game/objects/structures/extinguisher.dm | 7 +- code/game/objects/structures/watercloset.dm | 5 +- code/modules/client/preferences.dm | 1 - code/modules/mob/living/carbon/carbon.dm | 11 +- code/modules/mob/living/carbon/human/human.dm | 1 - .../living/carbon/human/species/species.dm | 24 +- .../mob/living/carbon/human/update_icons.dm | 58 +- code/modules/mob/mob_helpers.dm | 2 +- code/modules/organs/organ.dm | 35 +- code/modules/organs/organ_external.dm | 644 ++++++++---------- code/modules/organs/organ_icon.dm | 106 +++ code/modules/organs/organ_internal.dm | 2 +- code/modules/paperwork/paperbin.dm | 9 +- code/modules/surgery/headreattach.dm | 3 +- 17 files changed, 466 insertions(+), 456 deletions(-) create mode 100644 code/modules/organs/organ_icon.dm diff --git a/baystation12.dme b/baystation12.dme index a19ffbe162..5955d6a228 100644 --- a/baystation12.dme +++ b/baystation12.dme @@ -1275,6 +1275,7 @@ #include "code\modules\organs\organ.dm" #include "code\modules\organs\organ_alien.dm" #include "code\modules\organs\organ_external.dm" +#include "code\modules\organs\organ_icon.dm" #include "code\modules\organs\organ_internal.dm" #include "code\modules\organs\pain.dm" #include "code\modules\organs\wound.dm" diff --git a/code/game/machinery/bioprinter.dm b/code/game/machinery/bioprinter.dm index f590e7fd26..48c0edb984 100644 --- a/code/game/machinery/bioprinter.dm +++ b/code/game/machinery/bioprinter.dm @@ -50,7 +50,7 @@ O.transplant_data["blood_type"] = loaded_dna["blood_type"] O.transplant_data["blood_DNA"] = loaded_dna["blood_DNA"] - visible_message("The bioprinter spits out a new organ.") + visible_message("The bioprinter spits out a new organ.") else user << "There is not enough matter in the printer." diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 66d39e0868..e8b2773c7e 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -119,9 +119,10 @@ /obj/item/attack_hand(mob/user as mob) if (!user) return if (hasorgans(user)) - var/obj/item/organ/external/temp = user:organs_by_name["r_hand"] + var/mob/living/carbon/human/H = user + var/obj/item/organ/external/temp = H.organs_by_name["r_hand"] if (user.hand) - temp = user:organs_by_name["l_hand"] + temp = H.organs_by_name["l_hand"] if(temp && !temp.is_usable()) user << "You try to move your [temp.display_name], but cannot!" return @@ -533,11 +534,11 @@ M.adjustBruteLoss(10) */ - if(istype(M, /mob/living/carbon/human)) + if(istype(H)) var/obj/item/organ/eyes/eyes = H.internal_organs_by_name["eyes"] - if(M != user) + if(H != user) for(var/mob/O in (viewers(M) - user - M)) O.show_message("\red [M] has been stabbed in the eye with [src] by [user].", 1) M << "\red [user] stabs you in the eye with [src]!" @@ -563,7 +564,7 @@ if (eyes.damage >= eyes.min_broken_damage) if(M.stat != 2) M << "\red You go blind!" - var/obj/item/organ/external/affecting = M:get_organ("head") + var/obj/item/organ/external/affecting = H.get_organ("head") if(affecting.take_damage(7)) M:UpdateDamageIcon() else diff --git a/code/game/objects/structures/extinguisher.dm b/code/game/objects/structures/extinguisher.dm index 6e049c8fdd..b9135176f8 100644 --- a/code/game/objects/structures/extinguisher.dm +++ b/code/game/objects/structures/extinguisher.dm @@ -31,10 +31,11 @@ /obj/structure/extinguisher_cabinet/attack_hand(mob/user) if(isrobot(user)) return - if (hasorgans(user)) - var/obj/item/organ/external/temp = user:organs_by_name["r_hand"] + if (ishuman(user)) + var/mob/living/carbon/human/H = user + var/obj/item/organ/external/temp = H.organs_by_name["r_hand"] if (user.hand) - temp = user:organs_by_name["l_hand"] + temp = H.organs_by_name["l_hand"] if(temp && !temp.is_usable()) user << "You try to move your [temp.display_name], but cannot!" return diff --git a/code/game/objects/structures/watercloset.dm b/code/game/objects/structures/watercloset.dm index 9d802a6454..778f5bc65b 100644 --- a/code/game/objects/structures/watercloset.dm +++ b/code/game/objects/structures/watercloset.dm @@ -346,8 +346,9 @@ var/busy = 0 //Something's being washed at the moment /obj/structure/sink/attack_hand(mob/user as mob) - if (hasorgans(user)) - var/obj/item/organ/external/temp = user:organs_by_name["r_hand"] + if (ishuman(user)) + var/mob/living/carbon/human/H = user + var/obj/item/organ/external/temp = H.organs_by_name["r_hand"] if (user.hand) temp = user:organs_by_name["l_hand"] if(temp && !temp.is_usable()) diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index 4e23b64570..d0d2ee9065 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -1695,7 +1695,6 @@ datum/preferences if(status == "amputated") O.amputated = 1 O.status |= ORGAN_DESTROYED - O.destspawn = 1 else if(status == "cyborg") O.status |= ORGAN_ROBOT else diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 95e8828a3d..3f08ce3bc1 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -60,12 +60,13 @@ /mob/living/carbon/attack_hand(mob/M as mob) if(!istype(M, /mob/living/carbon)) return - if (hasorgans(M)) - var/obj/item/organ/external/temp = M:organs_by_name["r_hand"] - if (M.hand) - temp = M:organs_by_name["l_hand"] + if (ishuman(M)) + var/mob/living/carbon/human/H = M + var/obj/item/organ/external/temp = H.organs_by_name["r_hand"] + if (H.hand) + temp = H.organs_by_name["l_hand"] if(temp && !temp.is_usable()) - M << "\red You can't use your [temp.display_name]" + H << "\red You can't use your [temp.display_name]" return for(var/datum/disease/D in viruses) diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 4d45ff93db..731548d6f4 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -936,7 +936,6 @@ O.status &= ~ORGAN_ATTACHABLE if (!O.amputated) O.status &= ~ORGAN_DESTROYED - O.destspawn = 0 O.wounds.Cut() O.heal_damage(1000,1000,1,1) diff --git a/code/modules/mob/living/carbon/human/species/species.dm b/code/modules/mob/living/carbon/human/species/species.dm index aa68f3470f..45a3f258f8 100644 --- a/code/modules/mob/living/carbon/human/species/species.dm +++ b/code/modules/mob/living/carbon/human/species/species.dm @@ -154,21 +154,21 @@ H.internal_organs_by_name = list() //This is a basic humanoid limb setup. - H.organs_by_name["chest"] = new/obj/item/organ/external/chest() - H.organs_by_name["groin"] = new/obj/item/organ/external/groin(H.organs_by_name["chest"]) - H.organs_by_name["head"] = new/obj/item/organ/external/head(H.organs_by_name["chest"]) - H.organs_by_name["l_arm"] = new/obj/item/organ/external/l_arm(H.organs_by_name["chest"]) - H.organs_by_name["r_arm"] = new/obj/item/organ/external/r_arm(H.organs_by_name["chest"]) - H.organs_by_name["r_leg"] = new/obj/item/organ/external/r_leg(H.organs_by_name["groin"]) - H.organs_by_name["l_leg"] = new/obj/item/organ/external/l_leg(H.organs_by_name["groin"]) - H.organs_by_name["l_hand"] = new/obj/item/organ/external/l_hand(H.organs_by_name["l_arm"]) - H.organs_by_name["r_hand"] = new/obj/item/organ/external/r_hand(H.organs_by_name["r_arm"]) - H.organs_by_name["l_foot"] = new/obj/item/organ/external/l_foot(H.organs_by_name["l_leg"]) - H.organs_by_name["r_foot"] = new/obj/item/organ/external/r_foot(H.organs_by_name["r_leg"]) + H.organs_by_name["chest"] = new/obj/item/organ/external/chest(null,H) + H.organs_by_name["groin"] = new/obj/item/organ/external/groin(H.organs_by_name["chest"],H) + H.organs_by_name["head"] = new/obj/item/organ/external/head(H.organs_by_name["chest"],H) + H.organs_by_name["l_arm"] = new/obj/item/organ/external/arm(H.organs_by_name["chest"],H) + H.organs_by_name["r_arm"] = new/obj/item/organ/external/arm/right(H.organs_by_name["chest"],H) + H.organs_by_name["r_leg"] = new/obj/item/organ/external/leg(H.organs_by_name["groin"],H) + H.organs_by_name["l_leg"] = new/obj/item/organ/external/leg/right(H.organs_by_name["groin"],H) + H.organs_by_name["l_hand"] = new/obj/item/organ/external/hand(H.organs_by_name["l_arm"],H) + H.organs_by_name["r_hand"] = new/obj/item/organ/external/hand/right(H.organs_by_name["r_arm"],H) + H.organs_by_name["l_foot"] = new/obj/item/organ/external/foot(H.organs_by_name["l_leg"],H) + H.organs_by_name["r_foot"] = new/obj/item/organ/external/foot/right(H.organs_by_name["r_leg"],H) for(var/organ in has_organ) var/organ_type = has_organ[organ] - H.internal_organs_by_name[organ] = new organ_type(H) + H.internal_organs_by_name[organ] = new organ_type(H,H,1) for(var/name in H.organs_by_name) H.organs += H.organs_by_name[name] diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index d59dba9559..16a1210b75 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -225,7 +225,6 @@ proc/get_damage_icon_part(damage_state, body_part) var/husk_color_mod = rgb(96,88,80) var/hulk_color_mod = rgb(48,224,40) - var/necrosis_color_mod = rgb(10,50,0) var/husk = (HUSK in src.mutations) var/fat = (FAT in src.mutations) @@ -233,7 +232,6 @@ proc/get_damage_icon_part(damage_state, body_part) var/skeleton = (SKELETON in src.mutations) var/g = (gender == FEMALE ? "f" : "m") - var/has_head = 0 //CACHING: Generate an index key from visible bodyparts. //0 = destroyed, 1 = normal, 2 = robotic, 3 = necrotic. @@ -241,7 +239,6 @@ proc/get_damage_icon_part(damage_state, body_part) //Create a new, blank icon for our mob to use. if(stand_icon) del(stand_icon) - stand_icon = new(species.icon_template ? species.icon_template : 'icons/mob/human.dmi',"blank") var/icon_key = "[species.race_key][g][s_tone]" @@ -270,34 +267,15 @@ proc/get_damage_icon_part(damage_state, body_part) else - //BEGIN CACHED ICON GENERATION. - var/race_icon = (skeleton ? 'icons/mob/human_races/r_skeleton.dmi' : species.icobase) - var/deform_icon = (skeleton ? 'icons/mob/human_races/r_skeleton.dmi' : species.icobase) - + //BEGIN CACHED ICON GENERATION. //Robotic limbs are handled in get_icon() so all we worry about are missing or dead limbs. //No icon stored, so we need to start with a basic one. var/obj/item/organ/external/chest = get_organ("chest") - base_icon = chest.get_icon(race_icon,deform_icon,g) - - if(chest.status & ORGAN_DEAD) - base_icon.ColorTone(necrosis_color_mod) - base_icon.SetIntensity(0.7) + base_icon = chest.get_icon() for(var/obj/item/organ/external/part in organs) - var/icon/temp //Hold the bodypart icon for processing. - - if(part.status & ORGAN_DESTROYED) - continue - - if (istype(part, /obj/item/organ/external/groin) || istype(part, /obj/item/organ/external/head)) - temp = part.get_icon(race_icon,deform_icon,g) - else - temp = part.get_icon(race_icon,deform_icon) - - if(part.status & ORGAN_DEAD) - temp.ColorTone(necrosis_color_mod) - temp.SetIntensity(0.7) + var/icon/temp = part.get_icon(skeleton) //That part makes left and right legs drawn topmost and lowermost when human looks WEST or EAST //And no change in rendering for other parts (they icon_position is 0, so goes to 'else' part) @@ -338,44 +316,16 @@ proc/get_damage_icon_part(damage_state, body_part) //Handle husk overlay. if(husk) var/icon/mask = new(base_icon) - var/icon/husk_over = new(race_icon,"overlay_husk") + var/icon/husk_over = new(species.icobase,"overlay_husk") mask.MapColors(0,0,0,1, 0,0,0,1, 0,0,0,1, 0,0,0,1, 0,0,0,0) husk_over.Blend(mask, ICON_ADD) base_icon.Blend(husk_over, ICON_OVERLAY) - - //Skin tone. - if(!husk && !hulk) - if(species.flags & HAS_SKIN_TONE) - if(s_tone >= 0) - base_icon.Blend(rgb(s_tone, s_tone, s_tone), ICON_ADD) - else - base_icon.Blend(rgb(-s_tone, -s_tone, -s_tone), ICON_SUBTRACT) - human_icon_cache[icon_key] = base_icon - //log_debug("Generated new cached mob icon ([icon_key] \icon[human_icon_cache[icon_key]]) for [src]. [human_icon_cache.len] cached mob icons.") - //END CACHED ICON GENERATION. - stand_icon.Blend(base_icon,ICON_OVERLAY) - //Skin colour. Not in cache because highly variable (and relatively benign). - if (species.flags & HAS_SKIN_COLOR) - stand_icon.Blend(rgb(r_skin, g_skin, b_skin), ICON_ADD) - - if(has_head) - //Eyes - if(!skeleton) - var/icon/eyes = new/icon('icons/mob/human_face.dmi', species.eyes) - if (species.flags & HAS_EYE_COLOR) - eyes.Blend(rgb(r_eyes, g_eyes, b_eyes), ICON_ADD) - stand_icon.Blend(eyes, ICON_OVERLAY) - - //Mouth (lipstick!) - if(lip_style && (species && species.flags & HAS_LIPS)) //skeletons are allowed to wear lipstick no matter what you think, agouri. - stand_icon.Blend(new/icon('icons/mob/human_face.dmi', "lips_[lip_style]_s"), ICON_OVERLAY) - //Underwear if(underwear && species.flags & HAS_UNDERWEAR) stand_icon.Blend(new /icon('icons/mob/human.dmi', underwear), ICON_OVERLAY) diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm index ab3b2c009f..f88c8072be 100644 --- a/code/modules/mob/mob_helpers.dm +++ b/code/modules/mob/mob_helpers.dm @@ -138,7 +138,7 @@ proc/isnewplayer(A) return 1 return 0 -proc/hasorgans(A) +proc/hasorgans(A) // Fucking really?? return ishuman(A) proc/iscuffed(A) diff --git a/code/modules/organs/organ.dm b/code/modules/organs/organ.dm index f807ee0d1d..1ba5ed1558 100644 --- a/code/modules/organs/organ.dm +++ b/code/modules/organs/organ.dm @@ -22,7 +22,10 @@ var/list/organ_cache = list() // links chemical IDs to number of ticks for which they'll stay in the blood germ_level = 0 -/obj/item/organ/New(var/newloc, var/mob/living/carbon/holder) +/obj/item/organ/proc/update_health() + return + +/obj/item/organ/New(var/newloc, var/mob/living/carbon/holder, var/internal) ..(newloc) create_reagents(5) @@ -31,15 +34,23 @@ var/list/organ_cache = list() if(istype(holder)) - holder.internal_organs |= src + if(internal) + holder.internal_organs |= src src.owner = holder var/mob/living/carbon/human/H = holder if(istype(H)) + + if(H.dna) + if(!blood_DNA) + blood_DNA = list() + blood_DNA[H.dna.unique_enzymes] = H.dna.b_type + var/obj/item/organ/external/E = H.organs_by_name[src.parent_organ] - if(E.internal_organs == null) - E.internal_organs = list() - E.internal_organs |= src + if(E) + if(E.internal_organs == null) + E.internal_organs = list() + E.internal_organs |= src /obj/item/organ/proc/die() name = "dead [initial(name)]" @@ -55,10 +66,13 @@ var/list/organ_cache = list() return //Process infections - if (robotic >= 2 || (owner.species && owner.species.flags & IS_PLANT)) + if (robotic >= 2 || (owner && owner.species && (owner.species.flags & IS_PLANT))) germ_level = 0 return + if(loc != owner) + owner = null + if(!owner) var/datum/reagent/blood/B = locate(/datum/reagent/blood) in reagents.reagent_list if(B && prob(40)) @@ -124,15 +138,6 @@ var/list/organ_cache = list() /obj/item/organ/proc/receive_chem(chemical as obj) return 0 -/obj/item/organ/proc/get_icon(var/image/supplied) - var/key = "internal-[icon_state]" - var/image/I - if(organ_cache[key]) - I = organ_cache[key] - else - I = image(icon, "[icon_state]") - return I - /obj/item/organ/proc/rejuvenate() damage = 0 diff --git a/code/modules/organs/organ_external.dm b/code/modules/organs/organ_external.dm index f5a81f5531..90c71e3522 100644 --- a/code/modules/organs/organ_external.dm +++ b/code/modules/organs/organ_external.dm @@ -12,13 +12,16 @@ var/burn_dam = 0 var/max_size = 0 var/last_dam = -1 + var/icon/mob_icon + var/gendered_icon = 0 + var/limb_name + var/disfigured = 1 var/display_name var/list/wounds = list() var/number_wounds = 0 // cache the number of wounds, which is NOT wounds.len! var/tmp/perma_injury = 0 - var/tmp/destspawn = 0 //Has it spawned the broken limb? var/tmp/amputated = 0 //Whether this has been cleanly amputated, thus causing no pain var/obj/item/organ/external/parent @@ -49,6 +52,62 @@ min_broken_damage = 30 max_damage = 0 +/obj/item/organ/external/attackby(obj/item/weapon/W as obj, mob/user as mob) + switch(stage) + if(0) + if(istype(W,/obj/item/weapon/scalpel)) + user.visible_message("[user] cuts [src] open with [W]!") + stage++ + return + if(1) + if(istype(W,/obj/item/weapon/retractor)) + user.visible_message("[user] cracks [src] open like an egg with [W]!") + stage++ + return + if(2) + if(istype(W,/obj/item/weapon/hemostat)) + if(contents.len) + var/obj/item/removing = pick(contents) + removing.loc = get_turf(user.loc) + if(!(user.l_hand && user.r_hand)) + user.put_in_hands(removing) + user.visible_message("[user] extracts [removing] from [src] with [W]!") + else + user.visible_message("[user] fishes around fruitlessly in [src] with [W].") + return + ..() + +/obj/item/organ/external/proc/is_dislocated() + if(dislocated) + return 1 + if(parent) + return parent.is_dislocated() + return 0 + +/obj/item/organ/external/proc/dislocate(var/primary) + if(dislocated != -1) + if(primary) + dislocated = 2 + else + dislocated = 1 + if(children && children.len) + for(var/obj/item/organ/external/child in children) + child.dislocate() + +/obj/item/organ/external/proc/undislocate() + if(dislocated != -1) + dislocated = 0 + if(children && children.len) + for(var/obj/item/organ/external/child in children) + child.undislocate() + if(owner) + owner.shock_stage += 20 + +/obj/item/organ/external/update_health() + damage = min(max_damage, (brute_dam + burn_dam)) + return + + /obj/item/organ/external/New(var/newloc, var/mob/living/carbon/holder, var/obj/item/organ/external/P) if(P) parent = P @@ -266,8 +325,6 @@ This function completely restores a damaged organ to perfect condition. //Determines if we even need to process this organ. /obj/item/organ/external/proc/need_process() - if(destspawn) //Missing limb is missing - return 0 if(status && status != ORGAN_ROBOT) // If it's robotic, that's fine it will have a status. return 1 if(brute_dam || burn_dam) @@ -282,36 +339,40 @@ This function completely restores a damaged organ to perfect condition. return 0 /obj/item/organ/external/process() - //Dismemberment - if(status & ORGAN_DESTROYED) - if(!destspawn && config.limbs_can_break) - droplimb() - return - if(parent) - if(parent.status & ORGAN_DESTROYED) - status |= ORGAN_DESTROYED - owner.update_body(1) + if(owner) + //Dismemberment + if(status & ORGAN_DESTROYED) + if(config.limbs_can_break) + droplimb() return + if(parent) + if(parent.status & ORGAN_DESTROYED) + status |= ORGAN_DESTROYED + owner.update_body(1) + return - // Process wounds, doing healing etc. Only do this every few ticks to save processing power - if(owner.life_tick % wound_update_accuracy == 0) - update_wounds() + // Process wounds, doing healing etc. Only do this every few ticks to save processing power + if(owner.life_tick % wound_update_accuracy == 0) + update_wounds() - //Chem traces slowly vanish - if(owner.life_tick % 10 == 0) - for(var/chemID in trace_chemicals) - trace_chemicals[chemID] = trace_chemicals[chemID] - 1 - if(trace_chemicals[chemID] <= 0) - trace_chemicals.Remove(chemID) + //Chem traces slowly vanish + if(owner.life_tick % 10 == 0) + for(var/chemID in trace_chemicals) + trace_chemicals[chemID] = trace_chemicals[chemID] - 1 + if(trace_chemicals[chemID] <= 0) + trace_chemicals.Remove(chemID) - //Bone fracurtes - if(config.bones_can_break && brute_dam > min_broken_damage * config.organ_health_multiplier && !(status & ORGAN_ROBOT)) - src.fracture() - if(!(status & ORGAN_BROKEN)) - perma_injury = 0 + //Bone fractures + if(config.bones_can_break && brute_dam > min_broken_damage * config.organ_health_multiplier && !(status & ORGAN_ROBOT)) + src.fracture() - //Infections - update_germs() + if(!(status & ORGAN_BROKEN)) + perma_injury = 0 + + //Infections + update_germs() + else + ..() //Updating germ levels. Handles organ germ levels and necrosis. /* @@ -543,88 +604,50 @@ Note that amputating the affected organ does in fact remove the infection from t //Handles dismemberment /obj/item/organ/external/proc/droplimb(var/override = 0,var/no_explode = 0,var/amputation=0) - if(destspawn) return - if(override) - status |= ORGAN_DESTROYED + if(status & ORGAN_DESTROYED) if(body_part == UPPER_TORSO) return - src.status &= ~ORGAN_BROKEN - src.status &= ~ORGAN_BLEEDING - src.status &= ~ORGAN_SPLINTED - src.status &= ~ORGAN_DEAD - for(var/implant in implants) - del(implant) + //if(clean) //todo - germ_level = 0 + owner.visible_message( + "\The [owner]'s [src.name] flies off in an arc!",\ + "Your [src.name] goes flying off!",\ + "You hear a terrible sound of ripping tendons and flesh.") - // If any organs are attached to this, destroy them - for(var/obj/item/organ/external/O in children) - O.droplimb(1, no_explode, amputation) + if(parent) + parent.children -= src + src.removed(owner) - //Replace all wounds on that arm with one wound on parent organ. - wounds.Cut() - if (parent && !amputation) - var/datum/wound/W - if(max_damage < 50) - W = new/datum/wound/lost_limb/small(max_damage) - else - W = new/datum/wound/lost_limb(max_damage) - parent.wounds += W - parent.update_damages() - update_damages() + if(parent) + spawn(1) + parent.take_damage(20,0,50,0) // Leave a bloody stump to remember us by. + parent.update_health() + parent = null - var/list/dropped_items - switch(body_part) - if(HEAD) - dropped_items = list(owner.glasses, owner.head, owner.l_ear, owner.r_ear, owner.wear_mask) - if(HAND_RIGHT) - dropped_items = list(owner.gloves) //should probably make it so that you can still wear gloves if you have one hand - if(HAND_LEFT) - dropped_items = list(owner.gloves) - if(FOOT_RIGHT) - dropped_items = list(owner.shoes) - if(FOOT_LEFT) - dropped_items = list(owner.shoes) + update_health() + owner.update_body() + compile_icon() - if(dropped_items) - for(var/obj/O in dropped_items) - owner.remove_from_mob(O) + add_blood(owner) - removed(owner) - destspawn = 1 - owner.visible_message("\red [owner.name]'s [display_name] flies off in an arc.",\ - "Your [display_name] goes flying off!",\ - "You hear a terrible sound of ripping tendons and flesh.") - //Throw organs around - if(istype(owner.loc,/turf)) - step(src,pick(cardinal)) - owner.update_body(1) - // OK so maybe your limb just flew off, but if it was attached to a pair of cuffs then hooray! Freedom! - release_restraints() - if(vital) - owner.death() - - //Robotic limbs explode if sabotaged. - if(status & ORGAN_ROBOT && !no_explode && sabotaged) - owner.visible_message("\red \The [owner]'s [display_name] explodes violently!",\ - "\red Your [display_name] explodes!",\ - "You hear an explosion!") - explosion(get_turf(owner),-1,-1,2,3) - var/datum/effect/effect/system/spark_spread/spark_system = new /datum/effect/effect/system/spark_spread() - spark_system.set_up(5, 0, owner) - spark_system.attach(owner) - spark_system.start() - spawn(10) - del(spark_system) - del(src) + var/matrix/M = matrix() + M.Turn(rand(180)) + src.transform = M + // Throw limb around. + if(src && istype(loc,/turf)) + throw_at(get_edge_target_turf(src,pick(alldirs)),rand(1,3),30) /**************************************************** HELPERS ****************************************************/ +/obj/item/organ/replaced() + get_icon() + return ..() + /obj/item/organ/external/proc/release_restraints() if (owner.handcuffed && body_part in list(ARM_LEFT, ARM_RIGHT, HAND_LEFT, HAND_RIGHT)) owner.visible_message(\ @@ -725,7 +748,6 @@ Note that amputating the affected organ does in fact remove the infection from t /obj/item/organ/external/robotize() ..() - src.destspawn = 0 for (var/obj/item/organ/external/T in children) if(T) T.robotize() @@ -747,16 +769,6 @@ Note that amputating the affected organ does in fact remove the infection from t return 1 return 0 -/obj/item/organ/external/get_icon(var/icon/race_icon, var/icon/deform_icon,gender="") - if (status & ORGAN_ROBOT && !(owner.species && owner.species.flags & IS_SYNTHETIC)) - return new /icon('icons/mob/human_races/robotic.dmi', "[icon_name][gender ? "_[gender]" : ""]") - - if (status & ORGAN_MUTATED) - return new /icon(deform_icon, "[icon_name][gender ? "_[gender]" : ""]") - - return new /icon(race_icon, "[icon_name][gender ? "_[gender]" : ""]") - - /obj/item/organ/external/proc/is_usable() return !(status & (ORGAN_DESTROYED|ORGAN_MUTATED|ORGAN_DEAD)) @@ -794,153 +806,211 @@ Note that amputating the affected organ does in fact remove the infection from t H.drop_item() W.loc = owner +/obj/item/organ/external/removed(var/mob/living/user) + + var/is_robotic = status & ORGAN_ROBOT + ..() + + status |= ORGAN_DESTROYED + owner.bad_external_organs -= src + + for(var/implant in implants) //todo: check if this can be left alone + del(implant) + + wounds.Cut() //todo: wound on the parent organ + + // Attached organs also fly off. + for(var/obj/item/organ/external/O in children) + O.removed(owner) + O.loc = src //TODO: generate entire limb icons from contents. + + // Grab all the internal giblets too. + for(var/obj/item/organ/organ in internal_organs) + organ.removed(user) + organ.loc = src + + release_restraints() + owner.organs -= src + owner.organs_by_name[limb_name] = null // Remove from owner's vars. + + //Robotic limbs explode if sabotaged. + if(is_robotic) + owner.visible_message( + "\The [owner]'s [src.name] explodes violently!",\ + "Your [src.name] explodes!",\ + "You hear an explosion!") + explosion(get_turf(owner),-1,-1,2,3) + var/datum/effect/effect/system/spark_spread/spark_system = new /datum/effect/effect/system/spark_spread() + spark_system.set_up(5, 0, owner) + spark_system.attach(owner) + spark_system.start() + spawn(10) + del(spark_system) + del(src) + + /**************************************************** ORGAN DEFINES ****************************************************/ /obj/item/organ/external/chest - name = "chest" + name = "upper body" + limb_name = "chest" icon_name = "torso" - display_name = "chest" - max_damage = 75 - min_broken_damage = 40 + health = 75 + min_broken_damage = 35 body_part = UPPER_TORSO vital = 1 - encased = "ribcage" - amputation_point = "spines" + amputation_point = "spine" joint = "neck" dislocated = -1 + gendered_icon = 1 /obj/item/organ/external/groin - name = "groin" + name = "lower body" + limb_name = "groin" icon_name = "groin" - display_name = "groin" - max_damage = 50 - min_broken_damage = 30 + health = 50 + min_broken_damage = 20 body_part = LOWER_TORSO vital = 1 + parent_organ = "chest" amputation_point = "lumbar" joint = "hip" dislocated = -1 + gendered_icon = 1 -/obj/item/organ/external/l_arm - name = "l_arm" - display_name = "left arm" +/obj/item/organ/external/arm + limb_name = "l_arm" + name = "left arm" icon_name = "l_arm" - max_damage = 50 - min_broken_damage = 20 + health = 50 + min_broken_damage = 30 body_part = ARM_LEFT + parent_organ = "chest" joint = "left elbow" amputation_point = "left shoulder" -/obj/item/organ/external/l_arm/process() +/obj/item/organ/external/arm/process() ..() - process_grasp(owner.l_hand, "left hand") + if(owner) process_grasp(owner.l_hand, "left hand") -/obj/item/organ/external/l_leg - name = "l_leg" - display_name = "left leg" - icon_name = "l_leg" - max_damage = 50 - min_broken_damage = 20 - body_part = LEG_LEFT - icon_position = LEFT - joint = "left knee" - amputation_point = "left hip" - -/obj/item/organ/external/r_arm - name = "r_arm" - display_name = "right arm" +/obj/item/organ/external/arm/right + limb_name = "r_arm" + name = "right arm" icon_name = "r_arm" - max_damage = 50 - min_broken_damage = 20 + health = 50 + min_broken_damage = 30 body_part = ARM_RIGHT + parent_organ = "chest" joint = "right elbow" amputation_point = "right shoulder" -/obj/item/organ/external/r_arm/process() - ..() - process_grasp(owner.r_hand, "right hand") +/obj/item/organ/external/arm/right/process() + ..() + if(owner) process_grasp(owner.r_hand, "right hand") -/obj/item/organ/external/r_leg - name = "r_leg" - display_name = "right leg" +/obj/item/organ/external/leg + limb_name = "l_leg" + name = "left leg" + icon_name = "l_leg" + health = 50 + min_broken_damage = 30 + body_part = LEG_LEFT + icon_position = LEFT + parent_organ = "groin" + joint = "left knee" + amputation_point = "left hip" + +/obj/item/organ/external/leg/right + limb_name = "r_leg" + name = "right leg" icon_name = "r_leg" - max_damage = 50 - min_broken_damage = 20 body_part = LEG_RIGHT icon_position = RIGHT + parent_organ = "groin" joint = "right knee" amputation_point = "right hip" -/obj/item/organ/external/l_foot - name = "l_foot" - display_name = "left foot" +/obj/item/organ/external/foot + limb_name = "l_foot" + name = "left foot" icon_name = "l_foot" - max_damage = 30 + health = 30 min_broken_damage = 15 body_part = FOOT_LEFT icon_position = LEFT + parent_organ = "l_leg" + joint = "left ankle" amputation_point = "left ankle" -/obj/item/organ/external/r_foot - name = "r_foot" - display_name = "right foot" +/obj/item/organ/external/foot/removed() + if(owner) owner.u_equip(owner.shoes) + ..() + +/obj/item/organ/external/foot/right + limb_name = "r_foot" + name = "right foot" icon_name = "r_foot" - max_damage = 30 - min_broken_damage = 15 body_part = FOOT_RIGHT icon_position = RIGHT + parent_organ = "r_leg" + joint = "right ankle" amputation_point = "right ankle" -/obj/item/organ/external/r_hand - name = "r_hand" - display_name = "right hand" - icon_name = "r_hand" - max_damage = 30 - min_broken_damage = 15 - body_part = HAND_RIGHT - amputation_point = "right wrist" - -/obj/item/organ/external/r_hand/process() - ..() - process_grasp(owner.r_hand, "right hand") - -/obj/item/organ/external/l_hand - name = "l_hand" - display_name = "left hand" +/obj/item/organ/external/hand + limb_name = "l_hand" + name = "left hand" icon_name = "l_hand" - max_damage = 30 + health = 30 min_broken_damage = 15 body_part = HAND_LEFT + parent_organ = "l_arm" + joint = "left wrist" amputation_point = "left wrist" -/obj/item/organ/external/l_hand/process() +/obj/item/organ/external/hand/process() ..() - process_grasp(owner.l_hand, "left hand") + if(owner) process_grasp(owner.l_hand, "left hand") + +/obj/item/organ/external/hand/removed() + owner.u_equip(owner.gloves) + ..() + +/obj/item/organ/external/hand/right + limb_name = "r_hand" + name = "right hand" + icon_name = "r_hand" + body_part = HAND_RIGHT + parent_organ = "r_arm" + joint = "right wrist" + amputation_point = "right wrist" + +/obj/item/organ/external/hand/right/process() + ..() + if(owner) process_grasp(owner.r_hand, "right hand") /obj/item/organ/external/head - name = "head" + limb_name = "head" icon_name = "head" - display_name = "head" - max_damage = 75 - min_broken_damage = 40 + name = "head" + health = 75 + min_broken_damage = 35 body_part = HEAD - var/disfigured = 0 vital = 1 - encased = "skull" + parent_organ = "chest" joint = "jaw" amputation_point = "neck" + gendered_icon = 1 -/obj/item/organ/external/head/get_icon(var/icon/race_icon, var/icon/deform_icon) - if (!owner) - return ..() - var/g = "m" - if(owner.gender == FEMALE) g = "f" - if (status & ORGAN_MUTATED) - . = new /icon(deform_icon, "[icon_name]_[g]") - else - . = new /icon(race_icon, "[icon_name]_[g]") +/obj/item/organ/external/head/removed() + if(owner) + owner.u_equip(owner.glasses) + owner.u_equip(owner.head) + owner.u_equip(owner.l_ear) + owner.u_equip(owner.r_ear) + owner.u_equip(owner.wear_mask) + ..() /obj/item/organ/external/head/take_damage(brute, burn, sharp, edge, used_weapon = null, list/forbidden_limbs = list()) ..(brute, burn, sharp, edge, used_weapon, forbidden_limbs) @@ -951,180 +1021,56 @@ Note that amputating the affected organ does in fact remove the infection from t if (burn_dam > 40) disfigure("burn") -/obj/item/organ/external/head/proc/disfigure(var/type = "brute") +/obj/item/organ/external/proc/disfigure(var/type = "brute") if (disfigured) return if(type == "brute") - owner.visible_message("\red You hear a sickening cracking sound coming from \the [owner]'s face.", \ - "\red Your face becomes unrecognizible mangled mess!", \ + owner.visible_message("\red You hear a sickening cracking sound coming from \the [owner]'s [name].", \ + "\red Your [name] becomes a mangled mess!", \ "\red You hear a sickening crack.") else - owner.visible_message("\red [owner]'s face melts away, turning into mangled mess!", \ - "\red Your face melts off!", \ + owner.visible_message("\red \The [owner]'s [name] melts away, turning into mangled mess!", \ + "\red Your [name] melts away!", \ "\red You hear a sickening sizzle.") disfigured = 1 -/**************************************************** - EXTERNAL ORGAN ITEMS -****************************************************/ +// Prosthetics. +/obj/item/organ/external/leg/robot + status = ORGAN_ROBOT + dislocated = -1 -/obj/item/organ - icon = 'icons/mob/human_races/r_human.dmi' - var/op_stage = 0 - var/list/organs_internal = list() +/obj/item/organ/external/leg/right/robot + status = ORGAN_ROBOT + dislocated = -1 -/obj/item/organ/New(loc, mob/living/carbon/human/H) - ..(loc) - if(!istype(H)) - return - if(H.dna) - if(!blood_DNA) - blood_DNA = list() - blood_DNA[H.dna.unique_enzymes] = H.dna.b_type +/obj/item/organ/external/foot/robot + status = ORGAN_ROBOT + dislocated = -1 - // Transferring over organs from the host. - for(var/obj/item/organ/I in H.internal_organs) - if(I.parent_organ != name) - continue - var/obj/item/organ/current_organ = I.remove() - current_organ.removed(H) - current_organ.loc = src - organs_internal |= current_organ +/obj/item/organ/external/foot/right/robot + status = ORGAN_ROBOT + dislocated = -1 - // Forming icon for the limb - // Setting base icon for this mob's race - var/icon/base - if(H.species && H.species.icobase) - base = icon(H.species.icobase) - else - base = icon('icons/mob/human_races/r_human.dmi') +/obj/item/organ/external/arm/robot + status = ORGAN_ROBOT + dislocated = -1 - if(base) - //Changing limb's skin tone to match owner - if(!H.species || H.species.flags & HAS_SKIN_TONE) - if (H.s_tone >= 0) - base.Blend(rgb(H.s_tone, H.s_tone, H.s_tone), ICON_ADD) - else - base.Blend(rgb(-H.s_tone, -H.s_tone, -H.s_tone), ICON_SUBTRACT) +/obj/item/organ/external/arm/right/robot + status = ORGAN_ROBOT + dislocated = -1 - if(base) - //Changing limb's skin color to match owner - if(!H.species || H.species.flags & HAS_SKIN_COLOR) - base.Blend(rgb(H.r_skin, H.g_skin, H.b_skin), ICON_ADD) +/obj/item/organ/external/hand/robot + status = ORGAN_ROBOT + dislocated = -1 - icon = base - set_dir(SOUTH) - src.transform = turn(src.transform, rand(70,130)) +/obj/item/organ/external/hand/right/robot + status = ORGAN_ROBOT + dislocated = -1 +/obj/item/organ/external/head/robot + status = ORGAN_ROBOT + dislocated = -1 -/**************************************************** - EXTERNAL ORGAN ITEMS DEFINES -****************************************************/ - -/obj/item/organ/l_arm - name = "left arm" - icon_state = "l_arm" -/obj/item/organ/l_foot - name = "left foot" - icon_state = "l_foot" -/obj/item/organ/l_hand - name = "left hand" - icon_state = "l_hand" -/obj/item/organ/l_leg - name = "left leg" - icon_state = "l_leg" -/obj/item/organ/r_arm - name = "right arm" - icon_state = "r_arm" -/obj/item/organ/r_foot - name = "right foot" - icon_state = "r_foot" -/obj/item/organ/r_hand - name = "right hand" - icon_state = "r_hand" -/obj/item/organ/r_leg - name = "right leg" - icon_state = "r_leg" -/obj/item/organ/head - name = "head" - icon_state = "head_m" - -/obj/item/organ/head/New(loc, mob/living/carbon/human/H) - if(istype(H)) - src.icon_state = H.gender == MALE? "head_m" : "head_f" - ..() - //Add (facial) hair. - if(H.f_style) - var/datum/sprite_accessory/facial_hair_style = facial_hair_styles_list[H.f_style] - if(facial_hair_style) - var/icon/facial = new/icon("icon" = facial_hair_style.icon, "icon_state" = "[facial_hair_style.icon_state]_s") - if(facial_hair_style.do_colouration) - facial.Blend(rgb(H.r_facial, H.g_facial, H.b_facial), ICON_ADD) - - overlays.Add(facial) // icon.Blend(facial, ICON_OVERLAY) - - if(H.h_style && !(H.head && (H.head.flags & BLOCKHEADHAIR))) - var/datum/sprite_accessory/hair_style = hair_styles_list[H.h_style] - if(hair_style) - var/icon/hair = new/icon("icon" = hair_style.icon, "icon_state" = "[hair_style.icon_state]_s") - if(hair_style.do_colouration) - hair.Blend(rgb(H.r_hair, H.g_hair, H.b_hair), ICON_ADD) - - overlays.Add(hair) //icon.Blend(hair, ICON_OVERLAY) - - name = "[H.real_name]'s head" - H.regenerate_icons() - -/obj/item/organ/attackby(obj/item/weapon/W as obj, mob/user as mob) - switch(op_stage) - if(0) - if(istype(W,/obj/item/weapon/scalpel)) - user.visible_message("[user] cuts [src] open with [W]!") - op_stage++ - return - if(1) - if(istype(W,/obj/item/weapon/retractor)) - user.visible_message("[user] cracks [src] open like an egg with [W]!") - op_stage++ - return - if(2) - if(istype(W,/obj/item/weapon/hemostat)) - if(contents.len) - var/obj/item/removing = pick(contents) - removing.loc = get_turf(user.loc) - if(!(user.l_hand && user.r_hand)) - user.put_in_hands(removing) - if(istype(removing,/obj/item/organ)) - var/obj/item/organ/removed_organ = removing - organs_internal -= removed_organ - user.visible_message("[user] extracts [removing] from [src] with [W]!") - else - user.visible_message("[user] fishes around fruitlessly in [src] with [W].") - return - ..() - -/obj/item/organ/external/proc/is_dislocated() - if(dislocated) - return 1 - if(parent) - return parent.is_dislocated() - return 0 - -/obj/item/organ/external/proc/dislocate(var/primary) - if(dislocated != -1) - if(primary) - dislocated = 2 - else - dislocated = 1 - if(children && children.len) - for(var/obj/item/organ/external/child in children) - child.dislocate() - -/obj/item/organ/external/proc/undislocate() - if(dislocated != -1) - dislocated = 0 - if(children && children.len) - for(var/obj/item/organ/external/child in children) - child.undislocate() - if(owner) - owner.shock_stage += 20 +/obj/item/organ/external/chest/robot + status = ORGAN_ROBOT + dislocated = -1 diff --git a/code/modules/organs/organ_icon.dm b/code/modules/organs/organ_icon.dm new file mode 100644 index 0000000000..3970eaf1bc --- /dev/null +++ b/code/modules/organs/organ_icon.dm @@ -0,0 +1,106 @@ +var/global/list/limb_icon_cache = list() + +/obj/item/organ/proc/get_icon(var/image/supplied) + var/key = "internal-[icon_state]" + var/image/I + if(organ_cache[key]) + I = organ_cache[key] + else + I = image(icon, "[icon_state]") + return I + +/obj/item/organ/external/proc/compile_icon() + overlays.Cut() + get_icon() + // This is a kludge, only one icon has more than one generation of children though. + for(var/obj/item/organ/external/organ in contents) + if(organ.children && organ.children.len) + for(var/obj/item/organ/external/child in organ.children) + overlays += child.get_icon() + overlays += organ.get_icon() + +/obj/item/organ/external/get_icon(var/skeletal) + + if(!owner) + mob_icon = new /icon('icons/mob/human_races/r_human.dmi', "[icon_name][gendered_icon ? "_f" : ""]") + else + + var/gender + if(gendered_icon) + if(owner.gender == FEMALE) + gender = "f" + else + gender = "m" + + //TODO: cache these icons + if(skeletal) + mob_icon = new /icon('icons/mob/human_races/r_skeleton.dmi', "[icon_name][gender ? "_[gender]" : ""]") + else if (status & ORGAN_ROBOT && !(owner.species && owner.species.flags & IS_SYNTHETIC)) + mob_icon = new /icon('icons/mob/human_races/robotic.dmi', "[icon_name][gender ? "_[gender]" : ""]") + else + if (status & ORGAN_MUTATED) + mob_icon = new /icon(owner.species.deform, "[icon_name][gender ? "_[gender]" : ""]") + else + mob_icon = new /icon(owner.species.icobase, "[icon_name][gender ? "_[gender]" : ""]") + + if(status & ORGAN_DEAD) + mob_icon.ColorTone(rgb(10,50,0)) + mob_icon.SetIntensity(0.7) + + if(owner.species.flags & HAS_SKIN_TONE) + if(owner.s_tone >= 0) + mob_icon.Blend(rgb(owner.s_tone, owner.s_tone, owner.s_tone), ICON_ADD) + else + mob_icon.Blend(rgb(-owner.s_tone, -owner.s_tone, -owner.s_tone), ICON_SUBTRACT) + else if(owner.species.flags & HAS_SKIN_COLOR) + mob_icon.Blend(rgb(owner.r_skin, owner.g_skin, owner.b_skin), ICON_ADD) + + icon = mob_icon + dir = EAST + return icon + +/obj/item/organ/external/head/get_icon(var/skeletal) + + if(skeletal || !owner) + return + + ..() + + if(owner.species.has_organ["eyes"]) + var/obj/item/organ/eyes/eyes = owner.internal_organs_by_name["eyes"] + if(eyes && owner.species.eyes) + var/icon/eyes_icon = new/icon('icons/mob/human_face.dmi', owner.species.eyes) + eyes_icon.Blend(rgb(eyes.eye_colour[1], eyes.eye_colour[2], eyes.eye_colour[3]), ICON_ADD) + mob_icon.Blend(eyes_icon, ICON_OVERLAY) + + if(owner.lip_style && (owner.species && owner.species.flags & HAS_LIPS)) + mob_icon.Blend(new/icon('icons/mob/human_face.dmi', "lips_[owner.lip_style]_s"), ICON_OVERLAY) + + if(owner.f_style) + var/datum/sprite_accessory/facial_hair_style = facial_hair_styles_list[owner.f_style] + if(facial_hair_style) + var/icon/facial = new/icon("icon" = facial_hair_style.icon, "icon_state" = "[facial_hair_style.icon_state]_s") + if(facial_hair_style.do_colouration) + facial.Blend(rgb(owner.r_facial, owner.g_facial, owner.b_facial), ICON_ADD) + mob_icon.Blend(facial, ICON_OVERLAY) + + if(owner.h_style && !(owner.head && (owner.head.flags & BLOCKHEADHAIR))) + var/datum/sprite_accessory/hair_style = hair_styles_list[owner.h_style] + if(hair_style) + var/icon/hair = new/icon("icon" = hair_style.icon, "icon_state" = "[hair_style.icon_state]_s") + if(hair_style.do_colouration) + hair.Blend(rgb(owner.r_hair, owner.g_hair, owner.b_hair), ICON_ADD) + + mob_icon.Blend(hair, ICON_OVERLAY) + + icon = mob_icon + return icon + +// new damage icon system +// adjusted to set damage_state to brute/burn code only (without r_name0 as before) +/obj/item/organ/external/update_icon() + var/n_is = damage_state_text() + if (n_is != damage_state) + damage_state = n_is + return 1 + return 0 diff --git a/code/modules/organs/organ_internal.dm b/code/modules/organs/organ_internal.dm index 8f32f51bc4..f39485200f 100644 --- a/code/modules/organs/organ_internal.dm +++ b/code/modules/organs/organ_internal.dm @@ -68,7 +68,7 @@ gender = PLURAL organ_tag = "eyes" parent_organ = "head" - var/eye_colour + var/list/eye_colour /obj/item/organ/eyes/process() //Eye damage replaces the old eye_stat var. ..() diff --git a/code/modules/paperwork/paperbin.dm b/code/modules/paperwork/paperbin.dm index c52dc3080f..7a89f12508 100644 --- a/code/modules/paperwork/paperbin.dm +++ b/code/modules/paperwork/paperbin.dm @@ -22,10 +22,11 @@ return /obj/item/weapon/paper_bin/attack_hand(mob/user as mob) - if (hasorgans(user)) - var/obj/item/organ/external/temp = user:organs_by_name["r_hand"] - if (user.hand) - temp = user:organs_by_name["l_hand"] + if(ishuman(user)) + var/mob/living/carbon/human/H = user + var/obj/item/organ/external/temp = H.organs_by_name["r_hand"] + if (H.hand) + temp = H.organs_by_name["l_hand"] if(temp && !temp.is_usable()) user << "You try to move your [temp.display_name], but cannot!" return diff --git a/code/modules/surgery/headreattach.dm b/code/modules/surgery/headreattach.dm index 5d3a83ada9..28759cbc73 100644 --- a/code/modules/surgery/headreattach.dm +++ b/code/modules/surgery/headreattach.dm @@ -156,7 +156,7 @@ /datum/surgery_step/head/attach - allowed_tools = list(/obj/item/organ/head = 100) + allowed_tools = list(/obj/item/organ/external/head = 100) can_infect = 0 min_duration = 80 @@ -177,7 +177,6 @@ "\blue You have attached [target]'s head to the body.") affected.status = 0 affected.amputated = 0 - affected.destspawn = 0 target.update_body() target.updatehealth() target.UpdateDamageIcon()