mirror of
https://github.com/CHOMPStation2/CHOMPStation2.git
synced 2025-12-12 11:13:16 +00:00
Beginning to port over new icon update from limbs branch. WIP
This commit is contained in:
@@ -1275,6 +1275,7 @@
|
|||||||
#include "code\modules\organs\organ.dm"
|
#include "code\modules\organs\organ.dm"
|
||||||
#include "code\modules\organs\organ_alien.dm"
|
#include "code\modules\organs\organ_alien.dm"
|
||||||
#include "code\modules\organs\organ_external.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\organ_internal.dm"
|
||||||
#include "code\modules\organs\pain.dm"
|
#include "code\modules\organs\pain.dm"
|
||||||
#include "code\modules\organs\wound.dm"
|
#include "code\modules\organs\wound.dm"
|
||||||
|
|||||||
@@ -50,7 +50,7 @@
|
|||||||
O.transplant_data["blood_type"] = loaded_dna["blood_type"]
|
O.transplant_data["blood_type"] = loaded_dna["blood_type"]
|
||||||
O.transplant_data["blood_DNA"] = loaded_dna["blood_DNA"]
|
O.transplant_data["blood_DNA"] = loaded_dna["blood_DNA"]
|
||||||
|
|
||||||
visible_message("<span class='info'>The bioprinter spits out a new organ.")
|
visible_message("<span class='info'>The bioprinter spits out a new organ.</span>")
|
||||||
|
|
||||||
else
|
else
|
||||||
user << "<span class='warning'>There is not enough matter in the printer.</span>"
|
user << "<span class='warning'>There is not enough matter in the printer.</span>"
|
||||||
|
|||||||
@@ -119,9 +119,10 @@
|
|||||||
/obj/item/attack_hand(mob/user as mob)
|
/obj/item/attack_hand(mob/user as mob)
|
||||||
if (!user) return
|
if (!user) return
|
||||||
if (hasorgans(user))
|
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)
|
if (user.hand)
|
||||||
temp = user:organs_by_name["l_hand"]
|
temp = H.organs_by_name["l_hand"]
|
||||||
if(temp && !temp.is_usable())
|
if(temp && !temp.is_usable())
|
||||||
user << "<span class='notice'>You try to move your [temp.display_name], but cannot!"
|
user << "<span class='notice'>You try to move your [temp.display_name], but cannot!"
|
||||||
return
|
return
|
||||||
@@ -533,11 +534,11 @@
|
|||||||
M.adjustBruteLoss(10)
|
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"]
|
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))
|
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)
|
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]!"
|
M << "\red [user] stabs you in the eye with [src]!"
|
||||||
@@ -563,7 +564,7 @@
|
|||||||
if (eyes.damage >= eyes.min_broken_damage)
|
if (eyes.damage >= eyes.min_broken_damage)
|
||||||
if(M.stat != 2)
|
if(M.stat != 2)
|
||||||
M << "\red You go blind!"
|
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))
|
if(affecting.take_damage(7))
|
||||||
M:UpdateDamageIcon()
|
M:UpdateDamageIcon()
|
||||||
else
|
else
|
||||||
|
|||||||
@@ -31,10 +31,11 @@
|
|||||||
/obj/structure/extinguisher_cabinet/attack_hand(mob/user)
|
/obj/structure/extinguisher_cabinet/attack_hand(mob/user)
|
||||||
if(isrobot(user))
|
if(isrobot(user))
|
||||||
return
|
return
|
||||||
if (hasorgans(user))
|
if (ishuman(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)
|
if (user.hand)
|
||||||
temp = user:organs_by_name["l_hand"]
|
temp = H.organs_by_name["l_hand"]
|
||||||
if(temp && !temp.is_usable())
|
if(temp && !temp.is_usable())
|
||||||
user << "<span class='notice'>You try to move your [temp.display_name], but cannot!"
|
user << "<span class='notice'>You try to move your [temp.display_name], but cannot!"
|
||||||
return
|
return
|
||||||
|
|||||||
@@ -346,8 +346,9 @@
|
|||||||
var/busy = 0 //Something's being washed at the moment
|
var/busy = 0 //Something's being washed at the moment
|
||||||
|
|
||||||
/obj/structure/sink/attack_hand(mob/user as mob)
|
/obj/structure/sink/attack_hand(mob/user as mob)
|
||||||
if (hasorgans(user))
|
if (ishuman(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)
|
if (user.hand)
|
||||||
temp = user:organs_by_name["l_hand"]
|
temp = user:organs_by_name["l_hand"]
|
||||||
if(temp && !temp.is_usable())
|
if(temp && !temp.is_usable())
|
||||||
|
|||||||
@@ -1695,7 +1695,6 @@ datum/preferences
|
|||||||
if(status == "amputated")
|
if(status == "amputated")
|
||||||
O.amputated = 1
|
O.amputated = 1
|
||||||
O.status |= ORGAN_DESTROYED
|
O.status |= ORGAN_DESTROYED
|
||||||
O.destspawn = 1
|
|
||||||
else if(status == "cyborg")
|
else if(status == "cyborg")
|
||||||
O.status |= ORGAN_ROBOT
|
O.status |= ORGAN_ROBOT
|
||||||
else
|
else
|
||||||
|
|||||||
@@ -60,12 +60,13 @@
|
|||||||
|
|
||||||
/mob/living/carbon/attack_hand(mob/M as mob)
|
/mob/living/carbon/attack_hand(mob/M as mob)
|
||||||
if(!istype(M, /mob/living/carbon)) return
|
if(!istype(M, /mob/living/carbon)) return
|
||||||
if (hasorgans(M))
|
if (ishuman(M))
|
||||||
var/obj/item/organ/external/temp = M:organs_by_name["r_hand"]
|
var/mob/living/carbon/human/H = M
|
||||||
if (M.hand)
|
var/obj/item/organ/external/temp = H.organs_by_name["r_hand"]
|
||||||
temp = M:organs_by_name["l_hand"]
|
if (H.hand)
|
||||||
|
temp = H.organs_by_name["l_hand"]
|
||||||
if(temp && !temp.is_usable())
|
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
|
return
|
||||||
|
|
||||||
for(var/datum/disease/D in viruses)
|
for(var/datum/disease/D in viruses)
|
||||||
|
|||||||
@@ -936,7 +936,6 @@
|
|||||||
O.status &= ~ORGAN_ATTACHABLE
|
O.status &= ~ORGAN_ATTACHABLE
|
||||||
if (!O.amputated)
|
if (!O.amputated)
|
||||||
O.status &= ~ORGAN_DESTROYED
|
O.status &= ~ORGAN_DESTROYED
|
||||||
O.destspawn = 0
|
|
||||||
O.wounds.Cut()
|
O.wounds.Cut()
|
||||||
O.heal_damage(1000,1000,1,1)
|
O.heal_damage(1000,1000,1,1)
|
||||||
|
|
||||||
|
|||||||
@@ -154,21 +154,21 @@
|
|||||||
H.internal_organs_by_name = list()
|
H.internal_organs_by_name = list()
|
||||||
|
|
||||||
//This is a basic humanoid limb setup.
|
//This is a basic humanoid limb setup.
|
||||||
H.organs_by_name["chest"] = new/obj/item/organ/external/chest()
|
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.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.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/l_arm(H.organs_by_name["chest"])
|
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/r_arm(H.organs_by_name["chest"])
|
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/r_leg(H.organs_by_name["groin"])
|
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/l_leg(H.organs_by_name["groin"])
|
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/l_hand(H.organs_by_name["l_arm"])
|
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/r_hand(H.organs_by_name["r_arm"])
|
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/l_foot(H.organs_by_name["l_leg"])
|
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/r_foot(H.organs_by_name["r_leg"])
|
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)
|
for(var/organ in has_organ)
|
||||||
var/organ_type = has_organ[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)
|
for(var/name in H.organs_by_name)
|
||||||
H.organs += H.organs_by_name[name]
|
H.organs += H.organs_by_name[name]
|
||||||
|
|||||||
@@ -225,7 +225,6 @@ proc/get_damage_icon_part(damage_state, body_part)
|
|||||||
|
|
||||||
var/husk_color_mod = rgb(96,88,80)
|
var/husk_color_mod = rgb(96,88,80)
|
||||||
var/hulk_color_mod = rgb(48,224,40)
|
var/hulk_color_mod = rgb(48,224,40)
|
||||||
var/necrosis_color_mod = rgb(10,50,0)
|
|
||||||
|
|
||||||
var/husk = (HUSK in src.mutations)
|
var/husk = (HUSK in src.mutations)
|
||||||
var/fat = (FAT 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/skeleton = (SKELETON in src.mutations)
|
||||||
|
|
||||||
var/g = (gender == FEMALE ? "f" : "m")
|
var/g = (gender == FEMALE ? "f" : "m")
|
||||||
var/has_head = 0
|
|
||||||
|
|
||||||
//CACHING: Generate an index key from visible bodyparts.
|
//CACHING: Generate an index key from visible bodyparts.
|
||||||
//0 = destroyed, 1 = normal, 2 = robotic, 3 = necrotic.
|
//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.
|
//Create a new, blank icon for our mob to use.
|
||||||
if(stand_icon)
|
if(stand_icon)
|
||||||
del(stand_icon)
|
del(stand_icon)
|
||||||
|
|
||||||
stand_icon = new(species.icon_template ? species.icon_template : 'icons/mob/human.dmi',"blank")
|
stand_icon = new(species.icon_template ? species.icon_template : 'icons/mob/human.dmi',"blank")
|
||||||
|
|
||||||
var/icon_key = "[species.race_key][g][s_tone]"
|
var/icon_key = "[species.race_key][g][s_tone]"
|
||||||
@@ -271,33 +268,14 @@ proc/get_damage_icon_part(damage_state, body_part)
|
|||||||
else
|
else
|
||||||
|
|
||||||
//BEGIN CACHED ICON GENERATION.
|
//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)
|
|
||||||
|
|
||||||
//Robotic limbs are handled in get_icon() so all we worry about are missing or dead limbs.
|
//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.
|
//No icon stored, so we need to start with a basic one.
|
||||||
var/obj/item/organ/external/chest = get_organ("chest")
|
var/obj/item/organ/external/chest = get_organ("chest")
|
||||||
base_icon = chest.get_icon(race_icon,deform_icon,g)
|
base_icon = chest.get_icon()
|
||||||
|
|
||||||
if(chest.status & ORGAN_DEAD)
|
|
||||||
base_icon.ColorTone(necrosis_color_mod)
|
|
||||||
base_icon.SetIntensity(0.7)
|
|
||||||
|
|
||||||
for(var/obj/item/organ/external/part in organs)
|
for(var/obj/item/organ/external/part in organs)
|
||||||
|
|
||||||
var/icon/temp //Hold the bodypart icon for processing.
|
var/icon/temp = part.get_icon(skeleton)
|
||||||
|
|
||||||
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)
|
|
||||||
|
|
||||||
//That part makes left and right legs drawn topmost and lowermost when human looks WEST or EAST
|
//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)
|
//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.
|
//Handle husk overlay.
|
||||||
if(husk)
|
if(husk)
|
||||||
var/icon/mask = new(base_icon)
|
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)
|
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)
|
husk_over.Blend(mask, ICON_ADD)
|
||||||
base_icon.Blend(husk_over, ICON_OVERLAY)
|
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
|
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.
|
//END CACHED ICON GENERATION.
|
||||||
|
|
||||||
stand_icon.Blend(base_icon,ICON_OVERLAY)
|
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
|
//Underwear
|
||||||
if(underwear && species.flags & HAS_UNDERWEAR)
|
if(underwear && species.flags & HAS_UNDERWEAR)
|
||||||
stand_icon.Blend(new /icon('icons/mob/human.dmi', underwear), ICON_OVERLAY)
|
stand_icon.Blend(new /icon('icons/mob/human.dmi', underwear), ICON_OVERLAY)
|
||||||
|
|||||||
@@ -138,7 +138,7 @@ proc/isnewplayer(A)
|
|||||||
return 1
|
return 1
|
||||||
return 0
|
return 0
|
||||||
|
|
||||||
proc/hasorgans(A)
|
proc/hasorgans(A) // Fucking really??
|
||||||
return ishuman(A)
|
return ishuman(A)
|
||||||
|
|
||||||
proc/iscuffed(A)
|
proc/iscuffed(A)
|
||||||
|
|||||||
@@ -22,7 +22,10 @@ var/list/organ_cache = list()
|
|||||||
// links chemical IDs to number of ticks for which they'll stay in the blood
|
// links chemical IDs to number of ticks for which they'll stay in the blood
|
||||||
germ_level = 0
|
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)
|
..(newloc)
|
||||||
|
|
||||||
create_reagents(5)
|
create_reagents(5)
|
||||||
@@ -31,12 +34,20 @@ var/list/organ_cache = list()
|
|||||||
|
|
||||||
if(istype(holder))
|
if(istype(holder))
|
||||||
|
|
||||||
|
if(internal)
|
||||||
holder.internal_organs |= src
|
holder.internal_organs |= src
|
||||||
src.owner = holder
|
src.owner = holder
|
||||||
|
|
||||||
var/mob/living/carbon/human/H = holder
|
var/mob/living/carbon/human/H = holder
|
||||||
if(istype(H))
|
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]
|
var/obj/item/organ/external/E = H.organs_by_name[src.parent_organ]
|
||||||
|
if(E)
|
||||||
if(E.internal_organs == null)
|
if(E.internal_organs == null)
|
||||||
E.internal_organs = list()
|
E.internal_organs = list()
|
||||||
E.internal_organs |= src
|
E.internal_organs |= src
|
||||||
@@ -55,10 +66,13 @@ var/list/organ_cache = list()
|
|||||||
return
|
return
|
||||||
|
|
||||||
//Process infections
|
//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
|
germ_level = 0
|
||||||
return
|
return
|
||||||
|
|
||||||
|
if(loc != owner)
|
||||||
|
owner = null
|
||||||
|
|
||||||
if(!owner)
|
if(!owner)
|
||||||
var/datum/reagent/blood/B = locate(/datum/reagent/blood) in reagents.reagent_list
|
var/datum/reagent/blood/B = locate(/datum/reagent/blood) in reagents.reagent_list
|
||||||
if(B && prob(40))
|
if(B && prob(40))
|
||||||
@@ -124,15 +138,6 @@ var/list/organ_cache = list()
|
|||||||
/obj/item/organ/proc/receive_chem(chemical as obj)
|
/obj/item/organ/proc/receive_chem(chemical as obj)
|
||||||
return 0
|
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()
|
/obj/item/organ/proc/rejuvenate()
|
||||||
damage = 0
|
damage = 0
|
||||||
|
|
||||||
|
|||||||
@@ -12,13 +12,16 @@
|
|||||||
var/burn_dam = 0
|
var/burn_dam = 0
|
||||||
var/max_size = 0
|
var/max_size = 0
|
||||||
var/last_dam = -1
|
var/last_dam = -1
|
||||||
|
var/icon/mob_icon
|
||||||
|
var/gendered_icon = 0
|
||||||
|
var/limb_name
|
||||||
|
var/disfigured = 1
|
||||||
|
|
||||||
var/display_name
|
var/display_name
|
||||||
var/list/wounds = list()
|
var/list/wounds = list()
|
||||||
var/number_wounds = 0 // cache the number of wounds, which is NOT wounds.len!
|
var/number_wounds = 0 // cache the number of wounds, which is NOT wounds.len!
|
||||||
|
|
||||||
var/tmp/perma_injury = 0
|
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/tmp/amputated = 0 //Whether this has been cleanly amputated, thus causing no pain
|
||||||
|
|
||||||
var/obj/item/organ/external/parent
|
var/obj/item/organ/external/parent
|
||||||
@@ -49,6 +52,62 @@
|
|||||||
min_broken_damage = 30
|
min_broken_damage = 30
|
||||||
max_damage = 0
|
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("<span class='danger'><b>[user]</b> cuts [src] open with [W]!")
|
||||||
|
stage++
|
||||||
|
return
|
||||||
|
if(1)
|
||||||
|
if(istype(W,/obj/item/weapon/retractor))
|
||||||
|
user.visible_message("<span class='danger'><b>[user]</b> 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("<span class='danger'><b>[user]</b> extracts [removing] from [src] with [W]!")
|
||||||
|
else
|
||||||
|
user.visible_message("<span class='danger'><b>[user]</b> 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)
|
/obj/item/organ/external/New(var/newloc, var/mob/living/carbon/holder, var/obj/item/organ/external/P)
|
||||||
if(P)
|
if(P)
|
||||||
parent = 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.
|
//Determines if we even need to process this organ.
|
||||||
|
|
||||||
/obj/item/organ/external/proc/need_process()
|
/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.
|
if(status && status != ORGAN_ROBOT) // If it's robotic, that's fine it will have a status.
|
||||||
return 1
|
return 1
|
||||||
if(brute_dam || burn_dam)
|
if(brute_dam || burn_dam)
|
||||||
@@ -282,9 +339,10 @@ This function completely restores a damaged organ to perfect condition.
|
|||||||
return 0
|
return 0
|
||||||
|
|
||||||
/obj/item/organ/external/process()
|
/obj/item/organ/external/process()
|
||||||
|
if(owner)
|
||||||
//Dismemberment
|
//Dismemberment
|
||||||
if(status & ORGAN_DESTROYED)
|
if(status & ORGAN_DESTROYED)
|
||||||
if(!destspawn && config.limbs_can_break)
|
if(config.limbs_can_break)
|
||||||
droplimb()
|
droplimb()
|
||||||
return
|
return
|
||||||
if(parent)
|
if(parent)
|
||||||
@@ -304,14 +362,17 @@ This function completely restores a damaged organ to perfect condition.
|
|||||||
if(trace_chemicals[chemID] <= 0)
|
if(trace_chemicals[chemID] <= 0)
|
||||||
trace_chemicals.Remove(chemID)
|
trace_chemicals.Remove(chemID)
|
||||||
|
|
||||||
//Bone fracurtes
|
//Bone fractures
|
||||||
if(config.bones_can_break && brute_dam > min_broken_damage * config.organ_health_multiplier && !(status & ORGAN_ROBOT))
|
if(config.bones_can_break && brute_dam > min_broken_damage * config.organ_health_multiplier && !(status & ORGAN_ROBOT))
|
||||||
src.fracture()
|
src.fracture()
|
||||||
|
|
||||||
if(!(status & ORGAN_BROKEN))
|
if(!(status & ORGAN_BROKEN))
|
||||||
perma_injury = 0
|
perma_injury = 0
|
||||||
|
|
||||||
//Infections
|
//Infections
|
||||||
update_germs()
|
update_germs()
|
||||||
|
else
|
||||||
|
..()
|
||||||
|
|
||||||
//Updating germ levels. Handles organ germ levels and necrosis.
|
//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
|
//Handles dismemberment
|
||||||
/obj/item/organ/external/proc/droplimb(var/override = 0,var/no_explode = 0,var/amputation=0)
|
/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(status & ORGAN_DESTROYED)
|
||||||
if(body_part == UPPER_TORSO)
|
if(body_part == UPPER_TORSO)
|
||||||
return
|
return
|
||||||
|
|
||||||
src.status &= ~ORGAN_BROKEN
|
//if(clean) //todo
|
||||||
src.status &= ~ORGAN_BLEEDING
|
|
||||||
src.status &= ~ORGAN_SPLINTED
|
|
||||||
src.status &= ~ORGAN_DEAD
|
|
||||||
for(var/implant in implants)
|
|
||||||
del(implant)
|
|
||||||
|
|
||||||
germ_level = 0
|
owner.visible_message(
|
||||||
|
"<span class='danger'>\The [owner]'s [src.name] flies off in an arc!</span>",\
|
||||||
|
"<span class='moderate'><b>Your [src.name] goes flying off!</b></span>",\
|
||||||
|
"<span class='danger'>You hear a terrible sound of ripping tendons and flesh.</span>")
|
||||||
|
|
||||||
// If any organs are attached to this, destroy them
|
if(parent)
|
||||||
for(var/obj/item/organ/external/O in children)
|
parent.children -= src
|
||||||
O.droplimb(1, no_explode, amputation)
|
src.removed(owner)
|
||||||
|
|
||||||
//Replace all wounds on that arm with one wound on parent organ.
|
if(parent)
|
||||||
wounds.Cut()
|
spawn(1)
|
||||||
if (parent && !amputation)
|
parent.take_damage(20,0,50,0) // Leave a bloody stump to remember us by.
|
||||||
var/datum/wound/W
|
parent.update_health()
|
||||||
if(max_damage < 50)
|
parent = null
|
||||||
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()
|
|
||||||
|
|
||||||
var/list/dropped_items
|
update_health()
|
||||||
switch(body_part)
|
owner.update_body()
|
||||||
if(HEAD)
|
compile_icon()
|
||||||
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)
|
|
||||||
|
|
||||||
if(dropped_items)
|
add_blood(owner)
|
||||||
for(var/obj/O in dropped_items)
|
|
||||||
owner.remove_from_mob(O)
|
|
||||||
|
|
||||||
removed(owner)
|
var/matrix/M = matrix()
|
||||||
destspawn = 1
|
M.Turn(rand(180))
|
||||||
owner.visible_message("\red [owner.name]'s [display_name] flies off in an arc.",\
|
src.transform = M
|
||||||
"<span class='moderate'><b>Your [display_name] goes flying off!</b></span>",\
|
|
||||||
"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 <b>Your [display_name] explodes!</b>",\
|
|
||||||
"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)
|
|
||||||
|
|
||||||
|
// Throw limb around.
|
||||||
|
if(src && istype(loc,/turf))
|
||||||
|
throw_at(get_edge_target_turf(src,pick(alldirs)),rand(1,3),30)
|
||||||
|
|
||||||
/****************************************************
|
/****************************************************
|
||||||
HELPERS
|
HELPERS
|
||||||
****************************************************/
|
****************************************************/
|
||||||
|
|
||||||
|
/obj/item/organ/replaced()
|
||||||
|
get_icon()
|
||||||
|
return ..()
|
||||||
|
|
||||||
/obj/item/organ/external/proc/release_restraints()
|
/obj/item/organ/external/proc/release_restraints()
|
||||||
if (owner.handcuffed && body_part in list(ARM_LEFT, ARM_RIGHT, HAND_LEFT, HAND_RIGHT))
|
if (owner.handcuffed && body_part in list(ARM_LEFT, ARM_RIGHT, HAND_LEFT, HAND_RIGHT))
|
||||||
owner.visible_message(\
|
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()
|
/obj/item/organ/external/robotize()
|
||||||
..()
|
..()
|
||||||
src.destspawn = 0
|
|
||||||
for (var/obj/item/organ/external/T in children)
|
for (var/obj/item/organ/external/T in children)
|
||||||
if(T)
|
if(T)
|
||||||
T.robotize()
|
T.robotize()
|
||||||
@@ -747,16 +769,6 @@ Note that amputating the affected organ does in fact remove the infection from t
|
|||||||
return 1
|
return 1
|
||||||
return 0
|
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()
|
/obj/item/organ/external/proc/is_usable()
|
||||||
return !(status & (ORGAN_DESTROYED|ORGAN_MUTATED|ORGAN_DEAD))
|
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()
|
H.drop_item()
|
||||||
W.loc = owner
|
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(
|
||||||
|
"<span class='danger'>\The [owner]'s [src.name] explodes violently!</span>",\
|
||||||
|
"<span class='danger'>Your [src.name] explodes!</span>",\
|
||||||
|
"<span class='danger'>You hear an explosion!</span>")
|
||||||
|
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
|
ORGAN DEFINES
|
||||||
****************************************************/
|
****************************************************/
|
||||||
|
|
||||||
/obj/item/organ/external/chest
|
/obj/item/organ/external/chest
|
||||||
name = "chest"
|
name = "upper body"
|
||||||
|
limb_name = "chest"
|
||||||
icon_name = "torso"
|
icon_name = "torso"
|
||||||
display_name = "chest"
|
health = 75
|
||||||
max_damage = 75
|
min_broken_damage = 35
|
||||||
min_broken_damage = 40
|
|
||||||
body_part = UPPER_TORSO
|
body_part = UPPER_TORSO
|
||||||
vital = 1
|
vital = 1
|
||||||
encased = "ribcage"
|
amputation_point = "spine"
|
||||||
amputation_point = "spines"
|
|
||||||
joint = "neck"
|
joint = "neck"
|
||||||
dislocated = -1
|
dislocated = -1
|
||||||
|
gendered_icon = 1
|
||||||
|
|
||||||
/obj/item/organ/external/groin
|
/obj/item/organ/external/groin
|
||||||
name = "groin"
|
name = "lower body"
|
||||||
|
limb_name = "groin"
|
||||||
icon_name = "groin"
|
icon_name = "groin"
|
||||||
display_name = "groin"
|
health = 50
|
||||||
max_damage = 50
|
min_broken_damage = 20
|
||||||
min_broken_damage = 30
|
|
||||||
body_part = LOWER_TORSO
|
body_part = LOWER_TORSO
|
||||||
vital = 1
|
vital = 1
|
||||||
|
parent_organ = "chest"
|
||||||
amputation_point = "lumbar"
|
amputation_point = "lumbar"
|
||||||
joint = "hip"
|
joint = "hip"
|
||||||
dislocated = -1
|
dislocated = -1
|
||||||
|
gendered_icon = 1
|
||||||
|
|
||||||
/obj/item/organ/external/l_arm
|
/obj/item/organ/external/arm
|
||||||
name = "l_arm"
|
limb_name = "l_arm"
|
||||||
display_name = "left arm"
|
name = "left arm"
|
||||||
icon_name = "l_arm"
|
icon_name = "l_arm"
|
||||||
max_damage = 50
|
health = 50
|
||||||
min_broken_damage = 20
|
min_broken_damage = 30
|
||||||
body_part = ARM_LEFT
|
body_part = ARM_LEFT
|
||||||
|
parent_organ = "chest"
|
||||||
joint = "left elbow"
|
joint = "left elbow"
|
||||||
amputation_point = "left shoulder"
|
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
|
/obj/item/organ/external/arm/right
|
||||||
name = "l_leg"
|
limb_name = "r_arm"
|
||||||
display_name = "left leg"
|
name = "right arm"
|
||||||
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"
|
|
||||||
icon_name = "r_arm"
|
icon_name = "r_arm"
|
||||||
max_damage = 50
|
health = 50
|
||||||
min_broken_damage = 20
|
min_broken_damage = 30
|
||||||
body_part = ARM_RIGHT
|
body_part = ARM_RIGHT
|
||||||
|
parent_organ = "chest"
|
||||||
joint = "right elbow"
|
joint = "right elbow"
|
||||||
amputation_point = "right shoulder"
|
amputation_point = "right shoulder"
|
||||||
|
|
||||||
/obj/item/organ/external/r_arm/process()
|
/obj/item/organ/external/arm/right/process()
|
||||||
..()
|
..()
|
||||||
process_grasp(owner.r_hand, "right hand")
|
if(owner) process_grasp(owner.r_hand, "right hand")
|
||||||
|
|
||||||
/obj/item/organ/external/r_leg
|
/obj/item/organ/external/leg
|
||||||
name = "r_leg"
|
limb_name = "l_leg"
|
||||||
display_name = "right 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"
|
icon_name = "r_leg"
|
||||||
max_damage = 50
|
|
||||||
min_broken_damage = 20
|
|
||||||
body_part = LEG_RIGHT
|
body_part = LEG_RIGHT
|
||||||
icon_position = RIGHT
|
icon_position = RIGHT
|
||||||
|
parent_organ = "groin"
|
||||||
joint = "right knee"
|
joint = "right knee"
|
||||||
amputation_point = "right hip"
|
amputation_point = "right hip"
|
||||||
|
|
||||||
/obj/item/organ/external/l_foot
|
/obj/item/organ/external/foot
|
||||||
name = "l_foot"
|
limb_name = "l_foot"
|
||||||
display_name = "left foot"
|
name = "left foot"
|
||||||
icon_name = "l_foot"
|
icon_name = "l_foot"
|
||||||
max_damage = 30
|
health = 30
|
||||||
min_broken_damage = 15
|
min_broken_damage = 15
|
||||||
body_part = FOOT_LEFT
|
body_part = FOOT_LEFT
|
||||||
icon_position = LEFT
|
icon_position = LEFT
|
||||||
|
parent_organ = "l_leg"
|
||||||
|
joint = "left ankle"
|
||||||
amputation_point = "left ankle"
|
amputation_point = "left ankle"
|
||||||
|
|
||||||
/obj/item/organ/external/r_foot
|
/obj/item/organ/external/foot/removed()
|
||||||
name = "r_foot"
|
if(owner) owner.u_equip(owner.shoes)
|
||||||
display_name = "right foot"
|
..()
|
||||||
|
|
||||||
|
/obj/item/organ/external/foot/right
|
||||||
|
limb_name = "r_foot"
|
||||||
|
name = "right foot"
|
||||||
icon_name = "r_foot"
|
icon_name = "r_foot"
|
||||||
max_damage = 30
|
|
||||||
min_broken_damage = 15
|
|
||||||
body_part = FOOT_RIGHT
|
body_part = FOOT_RIGHT
|
||||||
icon_position = RIGHT
|
icon_position = RIGHT
|
||||||
|
parent_organ = "r_leg"
|
||||||
|
joint = "right ankle"
|
||||||
amputation_point = "right ankle"
|
amputation_point = "right ankle"
|
||||||
|
|
||||||
/obj/item/organ/external/r_hand
|
/obj/item/organ/external/hand
|
||||||
name = "r_hand"
|
limb_name = "l_hand"
|
||||||
display_name = "right hand"
|
name = "left 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"
|
|
||||||
icon_name = "l_hand"
|
icon_name = "l_hand"
|
||||||
max_damage = 30
|
health = 30
|
||||||
min_broken_damage = 15
|
min_broken_damage = 15
|
||||||
body_part = HAND_LEFT
|
body_part = HAND_LEFT
|
||||||
|
parent_organ = "l_arm"
|
||||||
|
joint = "left wrist"
|
||||||
amputation_point = "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
|
/obj/item/organ/external/head
|
||||||
name = "head"
|
limb_name = "head"
|
||||||
icon_name = "head"
|
icon_name = "head"
|
||||||
display_name = "head"
|
name = "head"
|
||||||
max_damage = 75
|
health = 75
|
||||||
min_broken_damage = 40
|
min_broken_damage = 35
|
||||||
body_part = HEAD
|
body_part = HEAD
|
||||||
var/disfigured = 0
|
|
||||||
vital = 1
|
vital = 1
|
||||||
encased = "skull"
|
parent_organ = "chest"
|
||||||
joint = "jaw"
|
joint = "jaw"
|
||||||
amputation_point = "neck"
|
amputation_point = "neck"
|
||||||
|
gendered_icon = 1
|
||||||
|
|
||||||
/obj/item/organ/external/head/get_icon(var/icon/race_icon, var/icon/deform_icon)
|
/obj/item/organ/external/head/removed()
|
||||||
if (!owner)
|
if(owner)
|
||||||
return ..()
|
owner.u_equip(owner.glasses)
|
||||||
var/g = "m"
|
owner.u_equip(owner.head)
|
||||||
if(owner.gender == FEMALE) g = "f"
|
owner.u_equip(owner.l_ear)
|
||||||
if (status & ORGAN_MUTATED)
|
owner.u_equip(owner.r_ear)
|
||||||
. = new /icon(deform_icon, "[icon_name]_[g]")
|
owner.u_equip(owner.wear_mask)
|
||||||
else
|
..()
|
||||||
. = new /icon(race_icon, "[icon_name]_[g]")
|
|
||||||
|
|
||||||
/obj/item/organ/external/head/take_damage(brute, burn, sharp, edge, used_weapon = null, list/forbidden_limbs = list())
|
/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)
|
..(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)
|
if (burn_dam > 40)
|
||||||
disfigure("burn")
|
disfigure("burn")
|
||||||
|
|
||||||
/obj/item/organ/external/head/proc/disfigure(var/type = "brute")
|
/obj/item/organ/external/proc/disfigure(var/type = "brute")
|
||||||
if (disfigured)
|
if (disfigured)
|
||||||
return
|
return
|
||||||
if(type == "brute")
|
if(type == "brute")
|
||||||
owner.visible_message("\red You hear a sickening cracking sound coming from \the [owner]'s face.", \
|
owner.visible_message("\red You hear a sickening cracking sound coming from \the [owner]'s [name].", \
|
||||||
"\red <b>Your face becomes unrecognizible mangled mess!</b>", \
|
"\red <b>Your [name] becomes a mangled mess!</b>", \
|
||||||
"\red You hear a sickening crack.")
|
"\red You hear a sickening crack.")
|
||||||
else
|
else
|
||||||
owner.visible_message("\red [owner]'s face melts away, turning into mangled mess!", \
|
owner.visible_message("\red \The [owner]'s [name] melts away, turning into mangled mess!", \
|
||||||
"\red <b>Your face melts off!</b>", \
|
"\red <b>Your [name] melts away!</b>", \
|
||||||
"\red You hear a sickening sizzle.")
|
"\red You hear a sickening sizzle.")
|
||||||
disfigured = 1
|
disfigured = 1
|
||||||
|
|
||||||
/****************************************************
|
// Prosthetics.
|
||||||
EXTERNAL ORGAN ITEMS
|
/obj/item/organ/external/leg/robot
|
||||||
****************************************************/
|
status = ORGAN_ROBOT
|
||||||
|
dislocated = -1
|
||||||
|
|
||||||
/obj/item/organ
|
/obj/item/organ/external/leg/right/robot
|
||||||
icon = 'icons/mob/human_races/r_human.dmi'
|
status = ORGAN_ROBOT
|
||||||
var/op_stage = 0
|
dislocated = -1
|
||||||
var/list/organs_internal = list()
|
|
||||||
|
|
||||||
/obj/item/organ/New(loc, mob/living/carbon/human/H)
|
/obj/item/organ/external/foot/robot
|
||||||
..(loc)
|
status = ORGAN_ROBOT
|
||||||
if(!istype(H))
|
dislocated = -1
|
||||||
return
|
|
||||||
if(H.dna)
|
|
||||||
if(!blood_DNA)
|
|
||||||
blood_DNA = list()
|
|
||||||
blood_DNA[H.dna.unique_enzymes] = H.dna.b_type
|
|
||||||
|
|
||||||
// Transferring over organs from the host.
|
/obj/item/organ/external/foot/right/robot
|
||||||
for(var/obj/item/organ/I in H.internal_organs)
|
status = ORGAN_ROBOT
|
||||||
if(I.parent_organ != name)
|
dislocated = -1
|
||||||
continue
|
|
||||||
var/obj/item/organ/current_organ = I.remove()
|
|
||||||
current_organ.removed(H)
|
|
||||||
current_organ.loc = src
|
|
||||||
organs_internal |= current_organ
|
|
||||||
|
|
||||||
// Forming icon for the limb
|
/obj/item/organ/external/arm/robot
|
||||||
// Setting base icon for this mob's race
|
status = ORGAN_ROBOT
|
||||||
var/icon/base
|
dislocated = -1
|
||||||
if(H.species && H.species.icobase)
|
|
||||||
base = icon(H.species.icobase)
|
|
||||||
else
|
|
||||||
base = icon('icons/mob/human_races/r_human.dmi')
|
|
||||||
|
|
||||||
if(base)
|
/obj/item/organ/external/arm/right/robot
|
||||||
//Changing limb's skin tone to match owner
|
status = ORGAN_ROBOT
|
||||||
if(!H.species || H.species.flags & HAS_SKIN_TONE)
|
dislocated = -1
|
||||||
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)
|
|
||||||
|
|
||||||
if(base)
|
/obj/item/organ/external/hand/robot
|
||||||
//Changing limb's skin color to match owner
|
status = ORGAN_ROBOT
|
||||||
if(!H.species || H.species.flags & HAS_SKIN_COLOR)
|
dislocated = -1
|
||||||
base.Blend(rgb(H.r_skin, H.g_skin, H.b_skin), ICON_ADD)
|
|
||||||
|
|
||||||
icon = base
|
/obj/item/organ/external/hand/right/robot
|
||||||
set_dir(SOUTH)
|
status = ORGAN_ROBOT
|
||||||
src.transform = turn(src.transform, rand(70,130))
|
dislocated = -1
|
||||||
|
|
||||||
|
/obj/item/organ/external/head/robot
|
||||||
|
status = ORGAN_ROBOT
|
||||||
|
dislocated = -1
|
||||||
|
|
||||||
/****************************************************
|
/obj/item/organ/external/chest/robot
|
||||||
EXTERNAL ORGAN ITEMS DEFINES
|
status = ORGAN_ROBOT
|
||||||
****************************************************/
|
dislocated = -1
|
||||||
|
|
||||||
/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("<span class='danger'><b>[user]</b> cuts [src] open with [W]!")
|
|
||||||
op_stage++
|
|
||||||
return
|
|
||||||
if(1)
|
|
||||||
if(istype(W,/obj/item/weapon/retractor))
|
|
||||||
user.visible_message("<span class='danger'><b>[user]</b> 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("<span class='danger'><b>[user]</b> extracts [removing] from [src] with [W]!")
|
|
||||||
else
|
|
||||||
user.visible_message("<span class='danger'><b>[user]</b> 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
|
|
||||||
|
|||||||
106
code/modules/organs/organ_icon.dm
Normal file
106
code/modules/organs/organ_icon.dm
Normal file
@@ -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
|
||||||
@@ -68,7 +68,7 @@
|
|||||||
gender = PLURAL
|
gender = PLURAL
|
||||||
organ_tag = "eyes"
|
organ_tag = "eyes"
|
||||||
parent_organ = "head"
|
parent_organ = "head"
|
||||||
var/eye_colour
|
var/list/eye_colour
|
||||||
|
|
||||||
/obj/item/organ/eyes/process() //Eye damage replaces the old eye_stat var.
|
/obj/item/organ/eyes/process() //Eye damage replaces the old eye_stat var.
|
||||||
..()
|
..()
|
||||||
|
|||||||
@@ -22,10 +22,11 @@
|
|||||||
return
|
return
|
||||||
|
|
||||||
/obj/item/weapon/paper_bin/attack_hand(mob/user as mob)
|
/obj/item/weapon/paper_bin/attack_hand(mob/user as mob)
|
||||||
if (hasorgans(user))
|
if(ishuman(user))
|
||||||
var/obj/item/organ/external/temp = user:organs_by_name["r_hand"]
|
var/mob/living/carbon/human/H = user
|
||||||
if (user.hand)
|
var/obj/item/organ/external/temp = H.organs_by_name["r_hand"]
|
||||||
temp = user:organs_by_name["l_hand"]
|
if (H.hand)
|
||||||
|
temp = H.organs_by_name["l_hand"]
|
||||||
if(temp && !temp.is_usable())
|
if(temp && !temp.is_usable())
|
||||||
user << "<span class='notice'>You try to move your [temp.display_name], but cannot!"
|
user << "<span class='notice'>You try to move your [temp.display_name], but cannot!"
|
||||||
return
|
return
|
||||||
|
|||||||
@@ -156,7 +156,7 @@
|
|||||||
|
|
||||||
|
|
||||||
/datum/surgery_step/head/attach
|
/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
|
can_infect = 0
|
||||||
|
|
||||||
min_duration = 80
|
min_duration = 80
|
||||||
@@ -177,7 +177,6 @@
|
|||||||
"\blue You have attached [target]'s head to the body.")
|
"\blue You have attached [target]'s head to the body.")
|
||||||
affected.status = 0
|
affected.status = 0
|
||||||
affected.amputated = 0
|
affected.amputated = 0
|
||||||
affected.destspawn = 0
|
|
||||||
target.update_body()
|
target.update_body()
|
||||||
target.updatehealth()
|
target.updatehealth()
|
||||||
target.UpdateDamageIcon()
|
target.UpdateDamageIcon()
|
||||||
|
|||||||
Reference in New Issue
Block a user