diff --git a/code/game/dna/dna2_helpers.dm b/code/game/dna/dna2_helpers.dm
index e1fda4965c..ce6320cd88 100644
--- a/code/game/dna/dna2_helpers.dm
+++ b/code/game/dna/dna2_helpers.dm
@@ -166,6 +166,7 @@
H.f_style = facial_hair_styles_list[beard]
H.force_update_limbs()
+ H.update_eyes()
H.update_hair()
return 1
diff --git a/code/game/dna/dna_misc.dm b/code/game/dna/dna_misc.dm
index 1362aa6888..b314852214 100644
--- a/code/game/dna/dna_misc.dm
+++ b/code/game/dna/dna_misc.dm
@@ -235,9 +235,9 @@
H.r_eyes = hex2num(getblock(structure,8,3))
H.g_eyes = hex2num(getblock(structure,9,3))
H.b_eyes = hex2num(getblock(structure,10,3))
+
if(H.internal_organs_by_name["eyes"])
- var/obj/item/organ/eyes/eyes = H.internal_organs_by_name["eyes"]
- eyes.eye_colour = list(H.r_eyes,H.g_eyes,H.b_eyes)
+ H.update_eyes()
if (isblockon(getblock(structure, 11,3),11 , 1))
H.gender = FEMALE
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index 6acbcb993e..d3a7f24b36 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -21,7 +21,10 @@
set_species()
if(species)
- name = species.get_random_name(gender)
+ real_name = species.get_random_name(gender)
+ name = real_name
+ if(mind)
+ mind.name = real_name
var/datum/reagents/R = new/datum/reagents(1000)
reagents = R
@@ -926,23 +929,12 @@
germ_level += n
/mob/living/carbon/human/revive()
- for (var/obj/item/organ/external/O in organs)
- O.status &= ~ORGAN_BROKEN
- O.status &= ~ORGAN_BLEEDING
- O.status &= ~ORGAN_SPLINTED
- O.status &= ~ORGAN_CUT_AWAY
- O.status &= ~ORGAN_ATTACHABLE
- O.wounds.Cut()
- O.heal_damage(1000,1000,1,1)
-
- var/obj/item/organ/external/head/h = organs_by_name["head"]
- h.disfigured = 0
if(species && !(species.flags & NO_BLOOD))
vessel.add_reagent("blood",560-vessel.total_volume)
fixblood()
- // Fix up any missing organs.
+ // Fix up all organs.
// This will ignore any prosthetics in the prefs currently.
species.create_organs(src)
@@ -954,11 +946,9 @@
H.brainmob.mind.transfer_to(src)
del(H)
- for(var/obj/item/organ/I in internal_organs)
- I.damage = 0
-
for (var/datum/disease/virus in viruses)
virus.cure()
+
for (var/ID in virus2)
var/datum/disease2/disease/V = virus2[ID]
V.cure(src)
diff --git a/code/modules/mob/living/carbon/human/human_attackhand.dm b/code/modules/mob/living/carbon/human/human_attackhand.dm
index ebdfbd8b5a..291ab0d38a 100644
--- a/code/modules/mob/living/carbon/human/human_attackhand.dm
+++ b/code/modules/mob/living/carbon/human/human_attackhand.dm
@@ -100,9 +100,9 @@
var/hit_zone = H.zone_sel.selecting
var/obj/item/organ/external/affecting = get_organ(hit_zone)
- if(!affecting || affecting.status & ORGAN_DESTROYED)
+ if(!affecting || affecting.is_stump() || (affecting.status & ORGAN_DESTROYED))
M << "They are missing that limb!"
- return
+ return 1
switch(src.a_intent)
if(I_HELP)
diff --git a/code/modules/mob/living/carbon/human/human_organs.dm b/code/modules/mob/living/carbon/human/human_organs.dm
index de7a982b1a..e40b915226 100644
--- a/code/modules/mob/living/carbon/human/human_organs.dm
+++ b/code/modules/mob/living/carbon/human/human_organs.dm
@@ -1,7 +1,7 @@
/mob/living/carbon/human/proc/update_eyes()
- if(internal_organs_by_name["eyes"])
- var/obj/item/organ/eyes/eyes = internal_organs_by_name["eyes"]
- eyes.eye_colour = list(r_eyes,g_eyes,b_eyes)
+ var/obj/item/organ/eyes/eyes = internal_organs_by_name["eyes"]
+ if(eyes)
+ eyes.update_colour()
regenerate_icons()
/mob/living/carbon/var/list/internal_organs = list()
@@ -104,8 +104,12 @@
if(E.is_broken())
if(E.body_part == HAND_LEFT)
+ if(!l_hand)
+ continue
drop_from_inventory(l_hand)
else
+ if(!r_hand)
+ continue
drop_from_inventory(r_hand)
var/emote_scream = pick("screams in pain and ", "lets out a sharp cry and ", "cries out and ")
diff --git a/code/modules/mob/living/carbon/human/species/species.dm b/code/modules/mob/living/carbon/human/species/species.dm
index b97e8ceed6..6fddbd92ec 100644
--- a/code/modules/mob/living/carbon/human/species/species.dm
+++ b/code/modules/mob/living/carbon/human/species/species.dm
@@ -168,6 +168,10 @@
/datum/species/proc/get_random_name(var/gender)
var/datum/language/species_language = all_languages[language]
+ if(!species_language)
+ species_language = all_languages[default_language]
+ if(!species_language)
+ return "unknown"
return species_language.get_random_name(gender)
/datum/species/proc/create_organs(var/mob/living/carbon/human/H) //Handles creation of mob organs.
diff --git a/code/modules/mob/living/carbon/human/species/station/monkey.dm b/code/modules/mob/living/carbon/human/species/station/monkey.dm
index 0166900a0f..64e12eadfa 100644
--- a/code/modules/mob/living/carbon/human/species/station/monkey.dm
+++ b/code/modules/mob/living/carbon/human/species/station/monkey.dm
@@ -45,11 +45,8 @@
if(prob(1))
H.emote(pick("scratch","jump","roll","tail"))
-/datum/species/monkey/handle_post_spawn(var/mob/living/carbon/human/H)
- H.real_name = "[lowertext(name)] ([rand(100,999)])"
- H.name = H.real_name
-
- ..()
+/datum/species/monkey/get_random_name()
+ return "[lowertext(name)] ([rand(100,999)])"
/datum/species/monkey/tajaran
name = "Farwa"
diff --git a/code/modules/mob/living/carbon/human/species/xenomorphs/alien_species.dm b/code/modules/mob/living/carbon/human/species/xenomorphs/alien_species.dm
index 913e3e71ad..e94db830d7 100644
--- a/code/modules/mob/living/carbon/human/species/xenomorphs/alien_species.dm
+++ b/code/modules/mob/living/carbon/human/species/xenomorphs/alien_species.dm
@@ -61,6 +61,9 @@
var/weeds_heal_rate = 1 // Health regen on weeds.
var/weeds_plasma_rate = 5 // Plasma regen on weeds.
+/datum/species/xenos/get_random_name()
+ return "alien [caste_name] ([alien_number])"
+
/datum/species/xenos/can_understand(var/mob/other)
if(istype(other,/mob/living/carbon/alien/larva))
diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm
index 0882c558c7..dbc78f513c 100644
--- a/code/modules/mob/living/carbon/human/update_icons.dm
+++ b/code/modules/mob/living/carbon/human/update_icons.dm
@@ -237,24 +237,30 @@ var/global/list/damage_icon_parts = list()
//CACHING: Generate an index key from visible bodyparts.
//0 = destroyed, 1 = normal, 2 = robotic, 3 = necrotic.
-
//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][r_skin][g_skin][b_skin]"
+ var/obj/item/organ/eyes/eyes = internal_organs_by_name["eyes"]
- var/icon_key = "[species.race_key][g][s_tone]"
- for(var/obj/item/organ/external/part in organs)
- if(part.is_stump() || (part.status & ORGAN_DESTROYED))
- icon_key = "[icon_key]0"
+ if(eyes)
+ icon_key += "[rgb(eyes.eye_colour[1], eyes.eye_colour[2], eyes.eye_colour[3])]"
+ else
+ icon_key += "#000000"
+
+ for(var/organ_tag in species.has_limbs)
+ var/obj/item/organ/external/part = organs_by_name[organ_tag]
+ if(isnull(part) || part.is_stump() || (part.status & ORGAN_DESTROYED))
+ icon_key += "0"
else if(part.status & ORGAN_ROBOT)
- icon_key = "[icon_key]2[part.model ? "-[part.model]": ""]"
+ icon_key += "2[part.model ? "-[part.model]": ""]"
else if(part.status & ORGAN_DEAD)
- icon_key = "[icon_key]3"
+ icon_key += "3"
else
- icon_key = "[icon_key]1"
+ icon_key += "1"
- icon_key = "[icon_key][husk ? 1 : 0][fat ? 1 : 0][hulk ? 1 : 0][skeleton ? 1 : 0][s_tone]"
+ icon_key = "[icon_key][husk ? 1 : 0][fat ? 1 : 0][hulk ? 1 : 0][skeleton ? 1 : 0]"
var/icon/base_icon
if(human_icon_cache[icon_key])
@@ -784,11 +790,11 @@ var/global/list/damage_icon_parts = list()
/mob/living/carbon/human/update_inv_r_hand(var/update_icons=1)
if(r_hand)
r_hand.screen_loc = ui_rhand //TODO
-
+
var/t_icon = INV_R_HAND_DEF_ICON
if(r_hand.item_icons && (icon_r_hand in r_hand.item_icons))
t_icon = r_hand.item_icons[icon_r_hand]
-
+
var/t_state = r_hand.item_state //useful for clothing that changes icon_state but retains the same sprite on the mob when held in hand
if(!t_state) t_state = r_hand.icon_state
if(r_hand.icon_override)
@@ -800,18 +806,18 @@ var/global/list/damage_icon_parts = list()
if (handcuffed) drop_r_hand()
else
overlays_standing[R_HAND_LAYER] = null
-
+
if(update_icons) update_icons()
/mob/living/carbon/human/update_inv_l_hand(var/update_icons=1)
if(l_hand)
l_hand.screen_loc = ui_lhand //TODO
-
+
var/t_icon = INV_L_HAND_DEF_ICON
if(l_hand.item_icons && (icon_l_hand in l_hand.item_icons))
t_icon = l_hand.item_icons[icon_l_hand]
-
+
var/t_state = l_hand.item_state //useful for clothing that changes icon_state but retains the same sprite on the mob when held in hand
if(!t_state) t_state = l_hand.icon_state
if(l_hand.icon_override)
@@ -823,7 +829,7 @@ var/global/list/damage_icon_parts = list()
if (handcuffed) drop_l_hand()
else
overlays_standing[L_HAND_LAYER] = null
-
+
if(update_icons) update_icons()
/mob/living/carbon/human/proc/update_tail_showing(var/update_icons=1)
diff --git a/code/modules/mob/living/carbon/monkey/update_icons.dm b/code/modules/mob/living/carbon/monkey/update_icons.dm
deleted file mode 100644
index 1b3da8f49a..0000000000
--- a/code/modules/mob/living/carbon/monkey/update_icons.dm
+++ /dev/null
@@ -1,141 +0,0 @@
-//Monkey Overlays Indexes////////
-#define M_MASK_LAYER 1
-#define M_BACK_LAYER 2
-#define M_HANDCUFF_LAYER 3
-#define M_L_HAND_LAYER 4
-#define M_R_HAND_LAYER 5
-#define TARGETED_LAYER 6
-#define M_FIRE_LAYER 6
-#define M_TOTAL_LAYERS 7
-/////////////////////////////////
-
-/mob/living/carbon/monkey
- var/list/overlays_lying[M_TOTAL_LAYERS]
- var/list/overlays_standing[M_TOTAL_LAYERS]
-
-/mob/living/carbon/monkey/regenerate_icons()
- ..()
- update_inv_wear_mask(0)
- update_inv_back(0)
- update_inv_r_hand(0)
- update_inv_l_hand(0)
- update_inv_handcuffed(0)
- update_fire(0)
- update_icons()
- //Hud Stuff
- update_hud()
- return
-
-/mob/living/carbon/monkey/update_icons()
- update_hud()
- lying_prev = lying //so we don't update overlays for lying/standing unless our stance changes again
- overlays.Cut()
- for(var/image/I in overlays_standing)
- overlays += I
-
- if(lying)
- var/matrix/M = matrix()
- M.Turn(90)
- M.Translate(1,-6)
- src.transform = M
- else
- var/matrix/M = matrix()
- src.transform = M
-
-
-////////
-/mob/living/carbon/monkey/update_inv_wear_mask(var/update_icons=1)
- if( wear_mask && istype(wear_mask, /obj/item/clothing/mask) )
- overlays_standing[M_MASK_LAYER] = image("icon" = 'icons/mob/monkey.dmi', "icon_state" = "[wear_mask.icon_state]")
- wear_mask.screen_loc = ui_monkey_mask
- else
- overlays_standing[M_MASK_LAYER] = null
- if(update_icons) update_icons()
-
-
-/mob/living/carbon/monkey/update_inv_r_hand(var/update_icons=1)
- if(r_hand)
- var/t_icon = INV_R_HAND_DEF_ICON
- if(r_hand.item_icons && (icon_r_hand in r_hand.item_icons))
- t_icon = r_hand.item_icons[icon_r_hand]
-
- var/t_state = r_hand.item_state
- if(!t_state) t_state = r_hand.icon_state
-
- overlays_standing[M_R_HAND_LAYER] = image("icon" = t_icon, "icon_state" = t_state)
- r_hand.screen_loc = ui_rhand
- if (handcuffed) drop_r_hand()
- else
- overlays_standing[M_R_HAND_LAYER] = null
-
- if(update_icons) update_icons()
-
-
-/mob/living/carbon/monkey/update_inv_l_hand(var/update_icons=1)
- if(l_hand)
- var/t_icon = INV_L_HAND_DEF_ICON
- if(l_hand.item_icons && (icon_l_hand in l_hand.item_icons))
- t_icon = l_hand.item_icons[icon_l_hand]
-
- var/t_state = l_hand.item_state
- if(!t_state) t_state = l_hand.icon_state
-
- overlays_standing[M_L_HAND_LAYER] = image("icon" = t_icon, "icon_state" = t_state)
- l_hand.screen_loc = ui_lhand
- if (handcuffed) drop_l_hand()
- else
- overlays_standing[M_L_HAND_LAYER] = null
-
- if(update_icons) update_icons()
-
-
-/mob/living/carbon/monkey/update_inv_back(var/update_icons=1)
- if(back)
- overlays_standing[M_BACK_LAYER] = image("icon" = 'icons/mob/back.dmi', "icon_state" = "[back.icon_state]")
- back.screen_loc = ui_monkey_back
- else
- overlays_standing[M_BACK_LAYER] = null
- if(update_icons) update_icons()
-
-
-/mob/living/carbon/monkey/update_inv_handcuffed(var/update_icons=1)
- if(handcuffed)
- drop_r_hand()
- drop_l_hand()
- stop_pulling()
- overlays_standing[M_HANDCUFF_LAYER] = image("icon" = 'icons/mob/monkey.dmi', "icon_state" = "handcuff1")
- else
- overlays_standing[M_HANDCUFF_LAYER] = null
- if(update_icons) update_icons()
-
-
-/mob/living/carbon/monkey/update_hud()
- if (client)
- client.screen |= contents
-
-//Call when target overlay should be added/removed
-/mob/living/carbon/monkey/update_targeted(var/update_icons=1)
- if (targeted_by && target_locked)
- overlays_standing[TARGETED_LAYER] = target_locked
- else if (!targeted_by && target_locked)
- del(target_locked)
- if (!targeted_by)
- overlays_standing[TARGETED_LAYER] = null
- if(update_icons) update_icons()
-
-/mob/living/carbon/monkey/update_fire(var/update_icons=1)
- if(on_fire)
- overlays_standing[M_FIRE_LAYER] = image("icon"='icons/mob/OnFire.dmi', "icon_state"="Standing", "layer"= -M_FIRE_LAYER)
- else
- overlays_standing[M_FIRE_LAYER] = null
- if(update_icons) update_icons()
-//Monkey Overlays Indexes////////
-#undef M_MASK_LAYER
-#undef M_BACK_LAYER
-#undef M_HANDCUFF_LAYER
-#undef M_L_HAND_LAYER
-#undef M_R_HAND_LAYER
-#undef TARGETED_LAYER
-#undef M_FIRE_LAYER
-#undef M_TOTAL_LAYERS
-
diff --git a/code/modules/mob/new_player/new_player.dm b/code/modules/mob/new_player/new_player.dm
index 1d67b712f5..299caf37c5 100644
--- a/code/modules/mob/new_player/new_player.dm
+++ b/code/modules/mob/new_player/new_player.dm
@@ -474,6 +474,7 @@
// Do the initial caching of the player's body icons.
new_character.force_update_limbs()
+ new_character.update_eyes()
new_character.regenerate_icons()
new_character.key = key //Manually transfer the key to log them in
diff --git a/code/modules/organs/organ.dm b/code/modules/organs/organ.dm
index f97df89080..5f676b2c20 100644
--- a/code/modules/organs/organ.dm
+++ b/code/modules/organs/organ.dm
@@ -3,7 +3,7 @@ var/list/organ_cache = list()
/obj/item/organ
name = "organ"
icon = 'icons/obj/surgery.dmi'
-
+ var/dead_icon
var/mob/living/carbon/human/owner = null
var/status = 0
var/vital //Lose a vital limb, die immediately.
@@ -50,11 +50,12 @@ var/list/organ_cache = list()
holder.internal_organs |= src
/obj/item/organ/proc/die()
- name = "dead [initial(name)]"
- health = 0
+ if(status & ORGAN_ROBOT)
+ return
+ damage = max_damage
processing_objects -= src
- //TODO: Grey out the icon state.
- //TODO: Inject an organ with peridaxon to make it alive again.
+ if(dead_icon)
+ icon_state = dead_icon
/obj/item/organ/process()
@@ -75,10 +76,10 @@ var/list/organ_cache = list()
if(B && prob(40))
reagents.remove_reagent("blood",0.1)
blood_splatter(src,B,1)
-
- health -= rand(1,3)
- if(health <= 0)
+ damage += rand(1,3)
+ if(damage >= max_damage)
die()
+
else if(owner.bodytemperature >= 170) //cryo stops germs from moving and doing their bad stuffs
//** Handle antibiotics and curing infections
handle_antibiotics()
@@ -179,9 +180,10 @@ var/list/organ_cache = list()
else
src.damage += amount
- var/obj/item/organ/external/parent = owner.get_organ(parent_organ)
- if (!silent)
- owner.custom_pain("Something inside your [parent.name] hurts a lot.", 1)
+ if(owner && parent_organ)
+ var/obj/item/organ/external/parent = owner.get_organ(parent_organ)
+ if(parent && !silent)
+ owner.custom_pain("Something inside your [parent.name] hurts a lot.", 1)
/obj/item/organ/proc/robotize() //Being used to make robutt hearts, etc
robotic = 2
@@ -241,7 +243,7 @@ var/list/organ_cache = list()
var/obj/item/organ/external/affected = owner.get_organ(parent_organ)
if(affected) affected.internal_organs -= src
- loc = owner.loc
+ loc = get_turf(owner)
processing_objects |= src
rejecting = null
var/datum/reagent/blood/organ_blood = locate(/datum/reagent/blood) in reagents.reagent_list
@@ -255,6 +257,8 @@ var/list/organ_cache = list()
msg_admin_attack("[user.name] ([user.ckey]) removed a vital organ ([src]) from [owner.name] ([owner.ckey]) (INTENT: [uppertext(user.a_intent)]) (JMP)")
owner.death()
+ owner = null
+
/obj/item/organ/proc/replaced(var/mob/living/carbon/human/target,var/obj/item/organ/external/affected)
if(!istype(target)) return
@@ -271,13 +275,13 @@ var/list/organ_cache = list()
transplant_data["blood_DNA"] = transplant_blood.data["blood_DNA"]
owner = target
+ loc = owner
processing_objects -= src
target.internal_organs |= src
affected.internal_organs |= src
target.internal_organs_by_name[organ_tag] = src
- status |= ORGAN_CUT_AWAY
-
- del(src)
+ if(robotic)
+ status |= ORGAN_ROBOT
/obj/item/organ/eyes/replaced(var/mob/living/carbon/human/target)
@@ -286,7 +290,7 @@ var/list/organ_cache = list()
target.r_eyes = eye_colour[1]
target.g_eyes = eye_colour[2]
target.b_eyes = eye_colour[3]
- target.update_body()
+ target.update_eyes()
..()
/obj/item/organ/proc/bitten(mob/user)
@@ -298,7 +302,6 @@ var/list/organ_cache = list()
var/datum/reagent/blood/B = locate(/datum/reagent/blood) in reagents.reagent_list
blood_splatter(src,B,1)
-
user.drop_from_inventory(src)
var/obj/item/weapon/reagent_containers/food/snacks/organ/O = new(get_turf(src))
O.name = name
diff --git a/code/modules/organs/organ_external.dm b/code/modules/organs/organ_external.dm
index d8ba25d750..09c1c539ae 100644
--- a/code/modules/organs/organ_external.dm
+++ b/code/modules/organs/organ_external.dm
@@ -110,6 +110,8 @@
if(owner)
replaced(owner)
sync_colour_to_human(owner)
+ spawn(1)
+ get_icon()
/obj/item/organ/external/replaced(var/mob/living/carbon/human/target)
owner = target
@@ -243,10 +245,10 @@
status &= ~ORGAN_BROKEN
perma_injury = 0
- if((brute || burn) && children && children.len && (owner.species.flags & REGENERATES_LIMBS))
+ /*if((brute || burn) && children && children.len && (owner.species.flags & REGENERATES_LIMBS))
var/obj/item/organ/external/stump/S = locate() in children
if(S)
- world << "Extra healing to go around ([brute+burn]) and [owner] needs a replacement limb."
+ world << "Extra healing to go around ([brute+burn]) and [owner] needs a replacement limb."*/
//Sync the organ's damage with its wounds
src.update_damages()
@@ -634,8 +636,9 @@ Note that amputating the affected organ does in fact remove the infection from t
"Your [src.name] explodes in a shower of gore!",\
"You hear the sickening splatter of gore.")
- src.removed(null, ignore_children)
- owner.traumatic_shock += 60
+ var/mob/living/carbon/human/victim = owner //Keep a reference for post-removed().
+ removed(null, ignore_children)
+ victim.traumatic_shock += 60
wounds.Cut()
if(parent)
@@ -649,22 +652,22 @@ Note that amputating the affected organ does in fact remove the infection from t
parent.wounds |= W
parent.update_damages()
else
- var/obj/item/organ/external/stump/stump = new (owner, 0, src)
+ var/obj/item/organ/external/stump/stump = new (victim, 0, src)
stump.wounds |= W
- owner.organs |= stump
+ victim.organs |= stump
stump.update_damages()
parent = null
spawn(1)
- owner.update_body()
- owner.updatehealth()
- owner.UpdateDamageIcon()
+ victim.updatehealth()
+ victim.UpdateDamageIcon()
+ victim.regenerate_icons()
dir = 2
switch(disintegrate)
if(DROPLIMB_EDGE)
compile_icon()
- add_blood(owner)
+ add_blood(victim)
var/matrix/M = matrix()
M.Turn(rand(180))
src.transform = M
@@ -675,13 +678,13 @@ Note that amputating the affected organ does in fact remove the infection from t
dir = 2
return
if(DROPLIMB_BURN)
- new /obj/effect/decal/cleanable/ash(get_turf(owner))
+ new /obj/effect/decal/cleanable/ash(get_turf(victim))
if(DROPLIMB_BLUNT)
- var/obj/effect/decal/cleanable/blood/gibs/gore = new owner.species.single_gib_type(get_turf(owner))
- if(owner.species.flesh_color)
- gore.fleshcolor = owner.species.flesh_color
- if(owner.species.blood_color)
- gore.basecolor = owner.species.blood_color
+ var/obj/effect/decal/cleanable/blood/gibs/gore = new owner.species.single_gib_type(get_turf(victim))
+ if(victim.species.flesh_color)
+ gore.fleshcolor = victim.species.flesh_color
+ if(victim.species.blood_color)
+ gore.basecolor = victim.species.blood_color
gore.update_icon()
gore.throw_at(get_edge_target_turf(src,pick(alldirs)),rand(1,3),30)
@@ -699,25 +702,21 @@ Note that amputating the affected organ does in fact remove the infection from t
/obj/item/organ/external/proc/is_stump()
return 0
-/obj/item/organ/external/replaced()
- get_icon()
- icon = mob_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(\
- "\The [owner.handcuffed.name] falls off of [owner.name].",\
- "\The [owner.handcuffed.name] falls off you.")
-
- owner.drop_from_inventory(owner.handcuffed)
-
- if (owner.legcuffed && body_part in list(FOOT_LEFT, FOOT_RIGHT, LEG_LEFT, LEG_RIGHT))
- owner.visible_message(\
- "\The [owner.legcuffed.name] falls off of [owner.name].",\
- "\The [owner.legcuffed.name] falls off you.")
-
- owner.drop_from_inventory(owner.legcuffed)
+/obj/item/organ/external/proc/release_restraints(var/mob/living/carbon/human/holder)
+ if(!holder)
+ holder = owner
+ if(!holder)
+ return
+ if (holder.handcuffed && body_part in list(ARM_LEFT, ARM_RIGHT, HAND_LEFT, HAND_RIGHT))
+ holder.visible_message(\
+ "\The [holder.handcuffed.name] falls off of [holder.name].",\
+ "\The [holder.handcuffed.name] falls off you.")
+ holder.drop_from_inventory(holder.handcuffed)
+ if (holder.legcuffed && body_part in list(FOOT_LEFT, FOOT_RIGHT, LEG_LEFT, LEG_RIGHT))
+ holder.visible_message(\
+ "\The [holder.legcuffed.name] falls off of [holder.name].",\
+ "\The [holder.legcuffed.name] falls off you.")
+ holder.drop_from_inventory(holder.legcuffed)
/obj/item/organ/external/proc/bandage()
var/rval = 0
@@ -859,11 +858,15 @@ Note that amputating the affected organ does in fact remove the infection from t
/obj/item/organ/external/removed(var/mob/living/user, var/ignore_children)
+ if(!owner)
+ return
var/is_robotic = status & ORGAN_ROBOT
+ var/mob/living/carbon/human/victim = owner
+
..()
status |= ORGAN_DESTROYED
- owner.bad_external_organs -= src
+ victim.bad_external_organs -= src
for(var/implant in implants) //todo: check if this can be left alone
del(implant)
@@ -880,19 +883,19 @@ Note that amputating the affected organ does in fact remove the infection from t
organ.removed()
organ.loc = src
- release_restraints()
- owner.organs -= src
- owner.organs_by_name[limb_name] = null // Remove from owner's vars.
+ release_restraints(victim)
+ victim.organs -= src
+ victim.organs_by_name[limb_name] = null // Remove from owner's vars.
//Robotic limbs explode if sabotaged.
if(is_robotic && sabotaged)
- owner.visible_message(
- "\The [owner]'s [src.name] explodes violently!",\
+ victim.visible_message(
+ "\The [victim]'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.set_up(5, 0, victim)
spark_system.attach(owner)
spark_system.start()
spawn(10)
diff --git a/code/modules/organs/organ_icon.dm b/code/modules/organs/organ_icon.dm
index b0e23df3d2..d05a269f28 100644
--- a/code/modules/organs/organ_icon.dm
+++ b/code/modules/organs/organ_icon.dm
@@ -5,13 +5,12 @@ var/global/list/limb_icon_cache = list()
/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()
+ overlays += child.mob_icon
+ overlays += organ.mob_icon
/obj/item/organ/external/proc/sync_colour_to_human(var/mob/living/carbon/human/human)
s_tone = null
@@ -23,6 +22,49 @@ var/global/list/limb_icon_cache = list()
if(human.species.flags & HAS_SKIN_COLOR)
s_col = list(human.r_skin, human.g_skin, human.b_skin)
+/obj/item/organ/external/head/sync_colour_to_human(var/mob/living/carbon/human/human)
+ ..()
+ var/obj/item/organ/eyes/eyes = owner.internal_organs_by_name["eyes"]
+ if(eyes) eyes.update_colour()
+
+/obj/item/organ/external/head/removed()
+ get_icon()
+ ..()
+
+/obj/item/organ/external/head/get_icon()
+
+ ..()
+ if(owner.species.has_organ["eyes"])
+ var/obj/item/organ/eyes/eyes = owner.internal_organs_by_name["eyes"]
+ if(owner.species.eyes)
+ var/icon/eyes_icon = new/icon('icons/mob/human_face.dmi', owner.species.eyes)
+ if(eyes)
+ eyes_icon.Blend(rgb(eyes.eye_colour[1], eyes.eye_colour[2], eyes.eye_colour[3]), ICON_ADD)
+ else
+ eyes_icon.Blend(rgb(128,0,0), 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 && facial_hair_style.species_allowed && (owner.species.name in facial_hair_style.species_allowed))
+ var/icon/facial_s = new/icon("icon" = facial_hair_style.icon, "icon_state" = "[facial_hair_style.icon_state]_s")
+ if(facial_hair_style.do_colouration)
+ facial_s.Blend(rgb(owner.r_facial, owner.g_facial, owner.b_facial), ICON_ADD)
+ overlays |= facial_s
+
+ 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 && (owner.species.name in hair_style.species_allowed))
+ var/icon/hair_s = new/icon("icon" = hair_style.icon, "icon_state" = "[hair_style.icon_state]_s")
+ if(hair_style.do_colouration)
+ hair_s.Blend(rgb(owner.r_hair, owner.g_hair, owner.b_hair), ICON_ADD)
+ overlays |= hair_s
+
+ return mob_icon
+
/obj/item/organ/external/proc/get_icon(var/skeletal)
var/gender
@@ -66,43 +108,6 @@ var/global/list/limb_icon_cache = list()
return mob_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 mob_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()
diff --git a/code/modules/organs/organ_internal.dm b/code/modules/organs/organ_internal.dm
index 46e22e1e5f..f7875a1e25 100644
--- a/code/modules/organs/organ_internal.dm
+++ b/code/modules/organs/organ_internal.dm
@@ -11,6 +11,7 @@
icon_state = "heart-on"
organ_tag = "heart"
parent_organ = "chest"
+ dead_icon = "heart-off"
/obj/item/organ/lungs
name = "lungs"
@@ -69,6 +70,15 @@
parent_organ = "head"
var/list/eye_colour = list(0,0,0)
+/obj/item/organ/eyes/proc/update_colour()
+ if(!owner)
+ return
+ eye_colour = list(
+ owner.r_eyes ? owner.r_eyes : 0,
+ owner.g_eyes ? owner.g_eyes : 0,
+ owner.b_eyes ? owner.b_eyes : 0
+ )
+
/obj/item/organ/eyes/process() //Eye damage replaces the old eye_stat var.
..()
if(!owner)
@@ -78,36 +88,6 @@
if(is_broken())
owner.eye_blind = 20
-/obj/item/organ/eyes/New()
- ..()
- if(owner)
- eye_colour = list(
- owner.r_eyes ? owner.r_eyes : 0,
- owner.g_eyes ? owner.g_eyes : 0,
- owner.b_eyes ? owner.b_eyes : 0
- )
-
-/obj/item/organ/eyes/removed(var/mob/living/target,var/mob/living/user)
-
- if(!eye_colour)
- eye_colour = list(0,0,0)
-
- ..() //Make sure target is set so we can steal their eye colour for later.
- var/mob/living/carbon/human/H = target
- if(istype(H))
- eye_colour = list(
- H.r_eyes ? H.r_eyes : 0,
- H.g_eyes ? H.g_eyes : 0,
- H.b_eyes ? H.b_eyes : 0
- )
-
- // Leave bloody red pits behind!
- H.r_eyes = 128
- H.g_eyes = 0
- H.b_eyes = 0
- H.update_body()
-
-
/obj/item/organ/liver
name = "liver"
icon_state = "liver"
@@ -178,14 +158,13 @@
/obj/item/organ/appendix/removed()
- ..()
-
- var/inflamed = 0
- for(var/datum/disease/appendicitis/appendicitis in owner.viruses)
- inflamed = 1
- appendicitis.cure()
- owner.resistances += appendicitis
-
- if(inflamed)
- icon_state = "appendixinflamed"
- name = "inflamed appendix"
\ No newline at end of file
+ if(owner)
+ var/inflamed = 0
+ for(var/datum/disease/appendicitis/appendicitis in owner.viruses)
+ inflamed = 1
+ appendicitis.cure()
+ owner.resistances += appendicitis
+ if(inflamed)
+ icon_state = "appendixinflamed"
+ name = "inflamed appendix"
+ ..()
\ No newline at end of file
diff --git a/code/modules/organs/wound.dm b/code/modules/organs/wound.dm
index 9d4a5364ae..1d34ed7284 100644
--- a/code/modules/organs/wound.dm
+++ b/code/modules/organs/wound.dm
@@ -209,9 +209,9 @@
/** WOUND DEFINITIONS **/
-//Note that the MINIMUM damage before a wound can be applied should correspond to
+//Note that the MINIMUM damage before a wound can be applied should correspond to
//the damage amount for the stage with the same name as the wound.
-//e.g. /datum/wound/cut/deep should only be applied for 15 damage and up,
+//e.g. /datum/wound/cut/deep should only be applied for 15 damage and up,
//because in it's stages list, "deep cut" = 15.
/proc/get_wound_type(var/type = CUT, var/damage)
switch(type)
@@ -323,4 +323,4 @@ datum/wound/cut/massive
return 0 //cannot be merged
/datum/wound/lost_limb/small
- stages = list("ripped stump" = 40, "bloody stump" = 30, "clotted stump" = 15, "scarred stump" = 0)
+ stages = list("ripped hole" = 40, "bloody hole" = 30, "clotted hole" = 15, "scarred hole" = 0)
diff --git a/code/modules/surgery/headreattach.dm b/code/modules/surgery/headreattach.dm
index 9957ee8b78..ad47b14429 100644
--- a/code/modules/surgery/headreattach.dm
+++ b/code/modules/surgery/headreattach.dm
@@ -1,5 +1,6 @@
//This is an uguu head restoration surgery TOTALLY not yoinked from chinsky's limb reattacher
/datum/surgery_step/attach_head/
+ priority = 3 // Must be higher than /datum/surgery_step/internal
allowed_tools = list(/obj/item/organ/external/head = 100)
can_infect = 0
@@ -7,20 +8,20 @@
max_duration = 100
can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- if(..())
- var/obj/item/organ/external/head = target.get_organ(target_zone)
- return !head && target_zone == "head"
+ var/obj/item/organ/external/head = target.get_organ(target_zone)
+ return isnull(head) && target_zone == "head" && !isnull(target.species.has_limbs["head"])
begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- user.visible_message("[user] starts attaching [tool] to [target]'s reshaped neck.", \
- "You start attaching [tool] to [target]'s reshaped neck.")
+ user.visible_message("[user] starts attaching [tool] to [target]'s neck.", \
+ "You start attaching [tool] to [target]'s neck.")
end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
user.visible_message("\blue [user] has attached [target]'s head to the body.", \
"\blue You have attached [target]'s head to the body.")
var/obj/item/organ/external/head = tool
- head.loc = target
+ user.drop_from_inventory(head)
head.replaced(target)
+ head.loc = target
head.status = 0
target.update_body()
target.updatehealth()
diff --git a/code/modules/surgery/organs_internal.dm b/code/modules/surgery/organs_internal.dm
index 8f5d7155dd..182c3eac2a 100644
--- a/code/modules/surgery/organs_internal.dm
+++ b/code/modules/surgery/organs_internal.dm
@@ -228,7 +228,7 @@
var/list/attached_organs = list()
for(var/organ in target.internal_organs_by_name)
var/obj/item/organ/I = target.internal_organs_by_name[organ]
- if(!I.status && I.parent_organ == target_zone)
+ if(I && !I.status && I.parent_organ == target_zone)
attached_organs |= organ
var/organ_to_remove = input(user, "Which organ do you want to prepare for removal?") as null|anything in attached_organs
@@ -347,7 +347,7 @@
return 0
else if(target.species.has_organ[O.organ_tag])
- if(O.is_damaged())
+ if(O.damage > (O.max_damage * 0.75))
user << "\red \The [O.organ_tag] [o_is] in no state to be transplanted."
return 2
@@ -410,7 +410,7 @@
var/list/removable_organs = list()
for(var/organ in target.internal_organs_by_name)
var/obj/item/organ/I = target.internal_organs_by_name[organ]
- if(I.status & ORGAN_CUT_AWAY && I.parent_organ == target_zone)
+ if(I && I.status & ORGAN_CUT_AWAY && I.parent_organ == target_zone)
removable_organs |= organ
var/organ_to_replace = input(user, "Which organ do you want to reattach?") as null|anything in removable_organs
diff --git a/code/modules/surgery/robolimbs.dm b/code/modules/surgery/robolimbs.dm
index e845d8bb7b..578833e418 100644
--- a/code/modules/surgery/robolimbs.dm
+++ b/code/modules/surgery/robolimbs.dm
@@ -41,7 +41,7 @@
for(var/part_name in L.part)
if(!isnull(target.get_organ(part_name)))
continue
- var/list/organ_data = target.species.has_limbs["[target_zone]"]
+ var/list/organ_data = target.species.has_limbs["[part_name]"]
if(!organ_data)
continue
var/new_limb_type = organ_data["path"]