Tweaks to previous commits.

More tweaks to IPC fixes.
Merge resolution/compile fixes.

Further work on properly integrating, updating and fixing prosthetic options.

Repathed internal organs to organ/internal.

More work on full synthetics, changelings, overheating.

Working on getting organs to qdel properly and spawn properly when robotized.

Finalized some overheating values, added remaining prosthetic icons.

Finalizing the testing version of the full prosthetic bodies branch.

Added suit cyclers to the autolathe and map.

Fixing runtime errors.

Fixing errors.

Changelog.

Replacing limb and organ strings with constants.

Prevented brainless species from becoming full cyborgs.

Fixed issues with brain/MMIs renaming themselves inappropriately.

Various fixes and oversights.
This commit is contained in:
Zuhayr
2015-12-04 16:49:21 +10:30
parent 87afd2feb2
commit f93ea6a78f
161 changed files with 1384 additions and 1352 deletions

View File

@@ -19,7 +19,7 @@ var/const/BLOOD_VOLUME_SURVIVE = 122
vessel = new/datum/reagents(600)
vessel.my_atom = src
if(!should_have_organ("heart")) //We want the var for safety but we can do without the actual blood.
if(!should_have_organ(O_HEART)) //We want the var for safety but we can do without the actual blood.
return
vessel.add_reagent("blood",560)
@@ -39,7 +39,7 @@ var/const/BLOOD_VOLUME_SURVIVE = 122
if(in_stasis)
return
if(!should_have_organ("heart"))
if(!should_have_organ(O_HEART))
return
if(stat != DEAD && bodytemperature >= 170) //Dead or cryosleep people do not pump the blood.
@@ -62,8 +62,8 @@ var/const/BLOOD_VOLUME_SURVIVE = 122
// Damaged heart virtually reduces the blood volume, as the blood isn't
// being pumped properly anymore.
if(species && should_have_organ("heart"))
var/obj/item/organ/heart/heart = internal_organs_by_name["heart"]
if(species && should_have_organ(O_HEART))
var/obj/item/organ/internal/heart/heart = internal_organs_by_name[O_HEART]
if(!heart)
blood_volume = 0
@@ -137,7 +137,7 @@ var/const/BLOOD_VOLUME_SURVIVE = 122
//Makes a blood drop, leaking amt units of blood from the mob
/mob/living/carbon/human/proc/drip(var/amt as num)
if(!should_have_organ("heart")) //TODO: Make drips come from the reagents instead.
if(!should_have_organ(O_HEART)) //TODO: Make drips come from the reagents instead.
return
if(!amt)
@@ -188,7 +188,7 @@ var/const/BLOOD_VOLUME_SURVIVE = 122
//For humans, blood does not appear from blue, it comes from vessels.
/mob/living/carbon/human/take_blood(obj/item/weapon/reagent_containers/container, var/amount)
if(!should_have_organ("heart"))
if(!should_have_organ(O_HEART))
return null
if(vessel.get_reagent_amount("blood") < amount)
@@ -216,7 +216,7 @@ var/const/BLOOD_VOLUME_SURVIVE = 122
//Transfers blood from reagents to vessel, respecting blood types compatability.
/mob/living/carbon/human/inject_blood(var/datum/reagent/blood/injected, var/amount)
if(should_have_organ("heart"))
if(should_have_organ(O_HEART))
reagents.add_reagent("blood", amount, injected.data)
reagents.update_total()
return

View File

@@ -1,5 +1,14 @@
//CORTICAL BORER ORGANS.
/obj/item/organ/borer/process()
/obj/item/organ/internal/borer
name = "cortical borer"
icon = 'icons/obj/objects.dmi'
icon_state = "borer"
organ_tag = "brain"
desc = "A disgusting space slug."
parent_organ = BP_HEAD
vital = 1
/obj/item/organ/internal/borer/process()
// Borer husks regenerate health, feel no pain, and are resistant to stuns and brainloss.
for(var/chem in list("tricordrazine","tramadol","hyperzine","alkysine"))
@@ -21,16 +30,7 @@
goo.basecolor = "#412464"
goo.update_icon()
/obj/item/organ/borer
name = "cortical borer"
icon = 'icons/obj/objects.dmi'
icon_state = "borer"
organ_tag = "brain"
desc = "A disgusting space slug."
parent_organ = "head"
vital = 1
/obj/item/organ/borer/removed(var/mob/living/user)
/obj/item/organ/internal/borer/removed(var/mob/living/user)
..()
@@ -43,19 +43,19 @@
qdel(src)
//VOX ORGANS.
/obj/item/organ/stack
/obj/item/organ/internal/stack
name = "cortical stack"
parent_organ = "head"
parent_organ = BP_HEAD
icon_state = "brain-prosthetic"
organ_tag = "stack"
vital = 1
var/backup_time = 0
var/datum/mind/backup
/obj/item/organ/stack/process()
/obj/item/organ/internal/stack/process()
if(owner && owner.stat != DEAD && !is_broken())
backup_time = world.time
if(owner.mind) backup = owner.mind
/obj/item/organ/stack/vox/stack
/obj/item/organ/internal/stack/vox/stack
name = "vox cortical stack"

View File

@@ -6,47 +6,37 @@ var/list/organ_cache = list()
germ_level = 0
// Strings.
var/organ_tag = "organ"
var/parent_organ = "chest"
// Appearance.
var/dead_icon
var/organ_tag = "organ" // Unique identifier.
var/parent_organ = BP_TORSO // Organ holding this object.
// Status tracking.
var/status = 0
var/vital //Lose a vital limb, die immediately.
var/damage = 0 // amount of damage to the organ
var/status = 0 // Various status flags (such as robotic)
var/vital // Lose a vital limb, die immediately.
var/damage = 0 // Current damage to the organ
// Reference data.
var/mob/living/carbon/human/owner = null
var/list/transplant_data
var/list/datum/autopsy_data/autopsy_data = list()
var/list/trace_chemicals = list() // traces of chemicals in the organ,
var/datum/dna/dna
var/datum/species/species
var/mob/living/carbon/human/owner // Current mob owning the organ.
var/list/transplant_data // Transplant match data.
var/list/autopsy_data = list() // Trauma data for forensics.
var/list/trace_chemicals = list() // Traces of chemicals in the organ.
var/datum/dna/dna // Original DNA.
var/datum/species/species // Original species.
// Damage vars.
var/min_bruised_damage = 10
var/min_broken_damage = 30
var/max_damage
var/rejecting // Is this organ already being rejected?
var/min_bruised_damage = 10 // Damage before considered bruised
var/min_broken_damage = 30 // Damage before becoming broken
var/max_damage // Damage cap
var/rejecting // Is this organ already being rejected?
/obj/item/organ/Destroy()
if(!owner)
return ..()
if(istype(owner, /mob/living/carbon))
if((owner.internal_organs) && (src in owner.internal_organs))
owner.internal_organs -= src
if(istype(owner, /mob/living/carbon/human))
if((owner.internal_organs_by_name) && (src in owner.internal_organs_by_name))
owner.internal_organs_by_name -= src
if((owner.organs) && (src in owner.organs))
owner.organs -= src
if((owner.organs_by_name) && (src in owner.organs_by_name))
owner.organs_by_name -= src
if(src in owner.contents)
owner.contents -= src
owner = null
if(owner) owner = null
if(transplant_data) transplant_data.Cut()
if(autopsy_data) autopsy_data.Cut()
if(trace_chemicals) trace_chemicals.Cut()
dna = null
species = null
return ..()
/obj/item/organ/proc/update_health()
@@ -92,8 +82,6 @@ var/list/organ_cache = list()
damage = max_damage
status |= ORGAN_DEAD
processing_objects -= src
if(dead_icon)
icon_state = dead_icon
if(owner && vital)
owner.death()
@@ -115,7 +103,7 @@ var/list/organ_cache = list()
germ_level = 0
return
if(!owner)
if(!owner && reagents)
var/datum/reagent/blood/B = locate(/datum/reagent/blood) in reagents.reagent_list
if(B && prob(40))
reagents.remove_reagent("blood",0.1)
@@ -193,6 +181,9 @@ var/list/organ_cache = list()
/obj/item/organ/proc/receive_chem(chemical as obj)
return 0
/obj/item/organ/proc/remove_rejuv()
qdel(src)
/obj/item/organ/proc/rejuvenate(var/ignore_prosthetic_prefs)
damage = 0
status = 0
@@ -203,16 +194,6 @@ var/list/organ_cache = list()
else if(status == "mechanical")
robotize()
/obj/item/organ/proc/remove_rejuv()
if(owner)
owner.internal_organs -= src
owner.internal_organs_by_name[organ_tag] = null
while(null in owner.internal_organs)
owner.internal_organs -= null
while(null in owner.internal_organs_by_name)
owner.internal_organs_by_name -= null
qdel(src)
/obj/item/organ/proc/is_damaged()
return damage > 0
@@ -336,16 +317,6 @@ var/list/organ_cache = list()
affected.internal_organs |= src
target.internal_organs_by_name[organ_tag] = src
/obj/item/organ/eyes/replaced(var/mob/living/carbon/human/target)
// Apply our eye colour to the target.
if(istype(target) && eye_colour)
target.r_eyes = eye_colour[1]
target.g_eyes = eye_colour[2]
target.b_eyes = eye_colour[3]
target.update_eyes()
..()
/obj/item/organ/proc/bitten(mob/user)
if(status & ORGAN_ROBOT)
@@ -374,7 +345,7 @@ var/list/organ_cache = list()
/obj/item/organ/attack_self(mob/user as mob)
// Convert it to an edible form, yum yum.
if((status & ORGAN_ROBOT) && user.a_intent == "help" && user.zone_sel.selecting == "mouth")
if((status & ORGAN_ROBOT) && user.a_intent == I_HELP && user.zone_sel.selecting == O_MOUTH)
bitten(user)
return

View File

@@ -15,50 +15,51 @@
organ_tag = "limb"
// Strings
var/limb_name
var/broken_description // fracture string if any.
var/damage_state = "00" // Modifier used for generating the on-mob damage overlay for this limb.
// Damage vars.
var/brute_mod = 1 // Multiplier for incoming brute damage.
var/burn_mod = 1 // As above for burn.
var/damage_state = "00" // Modifier used for generating the on-mob damage overlay for this limb.
var/brute_dam = 0 // Actual current brute damage.
var/burn_dam = 0 // Actual current burn damage.
var/last_dam = -1
var/brute_mod = 1 // Multiplier for incoming brute damage.
var/burn_mod = 1 // As above for burn.
var/brute_dam = 0 // Actual current brute damage.
var/burn_dam = 0 // Actual current burn damage.
var/last_dam = -1 // used in healing/processing calculations.
// Appearance vars.
var/icon_name = null
var/body_part = null
var/icon_position = 0
var/model
var/force_icon
var/icon/mob_icon
var/gendered_icon = 0
var/s_tone
var/list/s_col
var/list/h_col
var/body_hair
var/icon_name = null // Icon state base.
var/body_part = null // Part flag
var/icon_position = 0 // Used in mob overlay layering calculations.
var/model // Used when caching robolimb icons.
var/force_icon // Used to force override of species-specific limb icons (for prosthetics).
var/icon/mob_icon // Cached icon for use in mob overlays.
var/gendered_icon = 0 // Whether or not the icon state appends a gender.
var/s_tone // Skin tone.
var/list/s_col // skin colour
var/list/h_col // hair colour
var/body_hair // Icon blend for body hair if any.
// Wound and structural data.
var/wound_update_accuracy = 1 // how often wounds should be updated, a higher number means less often
var/list/wounds = list()
var/number_wounds = 0 // cache the number of wounds, which is NOT wounds.len!
var/obj/item/organ/external/parent
var/list/obj/item/organ/external/children
var/list/internal_organs = list() // Internal organs of this body part
var/broken_description
var/sabotaged = 0 // If a prosthetic limb is emagged, it will detonate when it fails.
var/list/implants = list()
var/wound_update_accuracy = 1 // how often wounds should be updated, a higher number means less often
var/list/wounds = list() // wound datum list.
var/number_wounds = 0 // number of wounds, which is NOT wounds.len!
var/obj/item/organ/external/parent // Master-limb.
var/list/children // Sub-limbs.
var/list/internal_organs = list() // Internal organs of this body part
var/sabotaged = 0 // If a prosthetic limb is emagged, it will detonate when it fails.
var/list/implants = list() // Currently implanted objects.
var/organ_rel_size = 25 // Relative size of the organ.
var/base_miss_chance = 20 // Chance of missing.
// Joint/state stuff.
var/can_grasp //It would be more appropriate if these two were named "affects_grasp" and "affects_stand" at this point
var/can_stand
var/disfigured = 0
var/cannot_amputate
var/cannot_break
var/joint = "joint" // Descriptive string used in dislocation.
var/amputation_point // Descriptive string used in amputation.
var/dislocated = 0 // If you target a joint, you can dislocate the limb, causing temporary damage to the organ.
var/encased // Needs to be opened with a saw to access the organs.
var/can_grasp // It would be more appropriate if these two were named "affects_grasp" and "affects_stand" at this point
var/can_stand // Modifies stance tally/ability to stand.
var/disfigured = 0 // Scarred/burned beyond recognition.
var/cannot_amputate // Impossible to amputate.
var/cannot_break // Impossible to fracture.
var/joint = "joint" // Descriptive string used in dislocation.
var/amputation_point // Descriptive string used in amputation.
var/dislocated = 0 // If you target a joint, you can dislocate the limb, causing temporary damage to the organ.
var/encased // Needs to be opened with a saw to access the organs.
// Surgery vars.
var/open = 0
@@ -67,6 +68,7 @@
/obj/item/organ/external/Destroy()
if(parent && parent.children)
parent.children -= src
@@ -78,6 +80,13 @@
for(var/obj/item/organ/O in internal_organs)
qdel(O)
if(owner)
owner.organs -= src
owner.organs_by_name[organ_tag] = null
owner.organs_by_name -= organ_tag
while(null in owner.organs)
owner.organs -= null
return ..()
/obj/item/organ/external/attack_self(var/mob/user)
@@ -183,7 +192,7 @@
/obj/item/organ/external/replaced(var/mob/living/carbon/human/target)
owner = target
if(istype(owner))
owner.organs_by_name[limb_name] = src
owner.organs_by_name[organ_tag] = src
owner.organs |= src
for(var/obj/item/organ/organ in src)
organ.loc = owner
@@ -319,11 +328,6 @@
if(internal)
status &= ~ORGAN_BROKEN
/*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."*/
//Sync the organ's damage with its wounds
src.update_damages()
owner.updatehealth()
@@ -356,11 +360,11 @@ This function completely restores a damaged organ to perfect condition.
if(owner && !ignore_prosthetic_prefs)
if(owner.client && owner.client.prefs && owner.client.prefs.real_name == owner.real_name)
var/status = owner.client.prefs.organ_data[limb_name]
var/status = owner.client.prefs.organ_data[organ_tag]
if(status == "amputated")
remove_rejuv()
else if(status == "cyborg")
var/robodata = owner.client.prefs.rlimb_data[limb_name]
var/robodata = owner.client.prefs.rlimb_data[organ_tag]
if(robodata)
robotize(robodata)
else
@@ -370,20 +374,16 @@ This function completely restores a damaged organ to perfect condition.
/obj/item/organ/external/remove_rejuv()
if(owner)
owner.organs -= src
owner.organs_by_name[limb_name] = null
while(null in owner.organs)
owner.organs -= null
while(null in owner.organs_by_name)
owner.organs_by_name -= null
owner.organs_by_name[organ_tag] = null
owner.organs_by_name -= organ_tag
while(null in owner.organs) owner.organs -= null
if(children && children.len)
for(var/obj/item/organ/external/E in children)
E.remove_rejuv()
children.Cut()
for(var/obj/item/organ/O in contents)
O.remove_rejuv()
qdel(src)
for(var/obj/item/organ/internal/I in internal_organs)
I.remove_rejuv()
..()
/obj/item/organ/external/proc/createwound(var/type = CUT, var/damage)
if(damage == 0) return
@@ -652,7 +652,7 @@ Note that amputating the affected organ does in fact remove the infection from t
else if(W.damage_type == BURN)
burn_dam += W.damage
if(!(status & ORGAN_ROBOT) && W.bleeding() && (H && H.should_have_organ("heart")))
if(!(status & ORGAN_ROBOT) && W.bleeding() && (H && H.should_have_organ(O_HEART)))
W.bleed_timer--
status |= ORGAN_BLEEDING
@@ -661,7 +661,7 @@ Note that amputating the affected organ does in fact remove the infection from t
number_wounds += W.amount
//things tend to bleed if they are CUT OPEN
if (open && !clamped && (H && H.should_have_organ("heart")))
if (open && !clamped && (H && H.should_have_organ(O_HEART)))
status |= ORGAN_BLEEDING
//Bone fractures
@@ -789,7 +789,7 @@ Note that amputating the affected organ does in fact remove the infection from t
if(status & ORGAN_ROBOT)
gore = new /obj/effect/decal/cleanable/blood/gibs/robot(get_turf(victim))
else
gore = new victim.species.single_gib_type(get_turf(victim))
gore = new /obj/effect/decal/cleanable/blood/gibs(get_turf(victim))
if(species)
if(species.get_flesh_colour())
gore.fleshcolor = species.get_flesh_colour()
@@ -905,7 +905,7 @@ Note that amputating the affected organ does in fact remove the infection from t
if(isnull(suit.supporting_limbs))
return
owner << "You feel \the [suit] constrict about your [name], supporting it."
owner << "<span class='notice'>You feel \the [suit] constrict about your [name], supporting it.</span>"
status |= ORGAN_SPLINTED
suit.supporting_limbs |= src
return
@@ -919,14 +919,20 @@ Note that amputating the affected organ does in fact remove the infection from t
status &= ~ORGAN_BROKEN
return 1
/obj/item/organ/external/robotize(var/company, var/ski)
/obj/item/organ/external/robotize(var/company, var/skip_prosthetics = 0, var/keep_organs = 0)
if(status & ORGAN_ROBOT)
return
if(status & ORGAN_ROBOT)
return
..()
brute_mod = 0.8
burn_mod = 0.8
brute_mod = 0.8 // More resistant to brute.
burn_mod = 0.8 // More resistant to burn.
max_damage = initial(max_damage)*0.65 // Significantly easier to remove with trauma.
brute_mod = 0.8
burn_mod = 0.8
@@ -949,23 +955,25 @@ Note that amputating the affected organ does in fact remove the infection from t
for(var/obj/item/organ/external/T in children)
T.robotize(company, 1)
if(owner)
if(!skip_prosthetics)
owner.full_prosthetic = null // Will be rechecked next isSynthetic() call.
for(var/obj/item/organ/thing in src.contents)
if(istype(thing))
if(thing.vital)
continue
owner.internal_organs_by_name[thing.organ_tag] = null
owner.internal_organs.Remove(thing)
qdel(thing)
if(!keep_organs)
for(var/obj/item/organ/thing in internal_organs)
if(istype(thing))
if(thing.vital)
continue
internal_organs -= thing
owner.internal_organs_by_name[thing.organ_tag] = null
owner.internal_organs_by_name -= thing.organ_tag
owner.internal_organs.Remove(thing)
qdel(thing)
while(null in owner.internal_organs)
owner.internal_organs -= null
while(null in owner.internal_organs_by_name)
owner.internal_organs -= null
return 1
@@ -1047,7 +1055,7 @@ Note that amputating the affected organ does in fact remove the infection from t
release_restraints(victim)
victim.organs -= src
victim.organs_by_name[limb_name] = null // Remove from owner's vars.
victim.organs_by_name[organ_tag] = null // Remove from owner's vars.
//Robotic limbs explode if sabotaged.
if(is_robotic && sabotaged)
@@ -1140,7 +1148,7 @@ Note that amputating the affected organ does in fact remove the infection from t
/obj/item/organ/external/chest
name = "upper body"
limb_name = "chest"
organ_tag = BP_TORSO
icon_name = "torso"
max_damage = 100
min_broken_damage = 35
@@ -1154,43 +1162,46 @@ Note that amputating the affected organ does in fact remove the infection from t
cannot_amputate = 1
parent_organ = null
encased = "ribcage"
organ_rel_size = 70
base_miss_chance = 10
/obj/item/organ/external/chest/robotize()
if(..())
// Give them a new cell.
owner.internal_organs_by_name["cell"] = new /obj/item/organ/cell(owner,1)
owner.internal_organs_by_name["cell"] = new /obj/item/organ/internal/cell(owner,1)
/obj/item/organ/external/groin
name = "lower body"
limb_name = "groin"
organ_tag = BP_GROIN
icon_name = "groin"
max_damage = 100
min_broken_damage = 35
w_class = 5
body_part = LOWER_TORSO
vital = 1
parent_organ = "chest"
parent_organ = BP_TORSO
amputation_point = "lumbar"
joint = "hip"
dislocated = -1
gendered_icon = 1
organ_rel_size = 30
/obj/item/organ/external/arm
limb_name = "l_arm"
organ_tag = "l_arm"
name = "left arm"
icon_name = "l_arm"
max_damage = 50
min_broken_damage = 30
w_class = 3
body_part = ARM_LEFT
parent_organ = "chest"
parent_organ = BP_TORSO
joint = "left elbow"
amputation_point = "left shoulder"
can_grasp = 1
/obj/item/organ/external/arm/right
limb_name = "r_arm"
organ_tag = "r_arm"
name = "right arm"
icon_name = "r_arm"
body_part = ARM_RIGHT
@@ -1198,7 +1209,7 @@ Note that amputating the affected organ does in fact remove the infection from t
amputation_point = "right shoulder"
/obj/item/organ/external/leg
limb_name = "l_leg"
organ_tag = "l_leg"
name = "left leg"
icon_name = "l_leg"
max_damage = 50
@@ -1206,13 +1217,13 @@ Note that amputating the affected organ does in fact remove the infection from t
w_class = 3
body_part = LEG_LEFT
icon_position = LEFT
parent_organ = "groin"
parent_organ = BP_GROIN
joint = "left knee"
amputation_point = "left hip"
can_stand = 1
/obj/item/organ/external/leg/right
limb_name = "r_leg"
organ_tag = "r_leg"
name = "right leg"
icon_name = "r_leg"
body_part = LEG_RIGHT
@@ -1221,7 +1232,7 @@ Note that amputating the affected organ does in fact remove the infection from t
amputation_point = "right hip"
/obj/item/organ/external/foot
limb_name = "l_foot"
organ_tag = "l_foot"
name = "left foot"
icon_name = "l_foot"
min_broken_damage = 15
@@ -1232,13 +1243,15 @@ Note that amputating the affected organ does in fact remove the infection from t
joint = "left ankle"
amputation_point = "left ankle"
can_stand = 1
organ_rel_size = 10
base_miss_chance = 50
/obj/item/organ/external/foot/removed()
if(owner) owner.u_equip(owner.shoes)
..()
/obj/item/organ/external/foot/right
limb_name = "r_foot"
organ_tag = "r_foot"
name = "right foot"
icon_name = "r_foot"
body_part = FOOT_RIGHT
@@ -1248,7 +1261,7 @@ Note that amputating the affected organ does in fact remove the infection from t
amputation_point = "right ankle"
/obj/item/organ/external/hand
limb_name = "l_hand"
organ_tag = "l_hand"
name = "left hand"
icon_name = "l_hand"
min_broken_damage = 15
@@ -1258,13 +1271,15 @@ Note that amputating the affected organ does in fact remove the infection from t
joint = "left wrist"
amputation_point = "left wrist"
can_grasp = 1
organ_rel_size = 10
base_miss_chance = 50
/obj/item/organ/external/hand/removed()
owner.u_equip(owner.gloves)
..()
/obj/item/organ/external/hand/right
limb_name = "r_hand"
organ_tag = "r_hand"
name = "right hand"
icon_name = "r_hand"
body_part = HAND_RIGHT
@@ -1273,7 +1288,7 @@ Note that amputating the affected organ does in fact remove the infection from t
amputation_point = "right wrist"
/obj/item/organ/external/head
limb_name = "head"
organ_tag = BP_HEAD
icon_name = "head"
name = "head"
max_damage = 75
@@ -1281,14 +1296,19 @@ Note that amputating the affected organ does in fact remove the infection from t
w_class = 3
body_part = HEAD
vital = 1
parent_organ = "chest"
parent_organ = BP_TORSO
joint = "jaw"
amputation_point = "neck"
gendered_icon = 1
encased = "skull"
base_miss_chance = 40
var/eye_icon = "eyes_s"
// These organs are important for robotizing at chargen.
/obj/item/organ/external/head/robotize(var/company, var/skip_prosthetics, var/keep_organs)
return ..(company, skip_prosthetics, 1)
/obj/item/organ/external/head/removed()
if(owner)
name = "[owner.real_name]'s head"

View File

@@ -40,7 +40,7 @@ var/global/list/limb_icon_cache = list()
/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"]
var/obj/item/organ/internal/eyes/eyes = owner.internal_organs_by_name[O_EYES]
if(eyes) eyes.update_colour()
/obj/item/organ/external/head/removed()
@@ -53,8 +53,8 @@ var/global/list/limb_icon_cache = list()
overlays.Cut()
if(!owner || !owner.species)
return
if(owner.should_have_organ("eyes"))
var/obj/item/organ/eyes/eyes = owner.internal_organs_by_name["eyes"]
if(owner.should_have_organ(O_EYES))
var/obj/item/organ/internal/eyes/eyes = owner.internal_organs_by_name[O_EYES]
if(eye_icon)
var/icon/eyes_icon = new/icon('icons/mob/human_face.dmi', eye_icon)
if(eyes)

View File

@@ -3,24 +3,52 @@
/****************************************************
INTERNAL ORGANS DEFINES
****************************************************/
/obj/item/organ/internal
var/dead_icon // Icon to use when the organ has died.
/obj/item/organ/internal/die()
..()
if((status & ORGAN_DEAD) && dead_icon)
icon_state = dead_icon
/obj/item/organ/internal/Destroy()
if(owner)
owner.internal_organs.Remove(src)
owner.internal_organs_by_name[organ_tag] = null
owner.internal_organs_by_name -= organ_tag
while(null in owner.internal_organs)
owner.internal_organs -= null
var/obj/item/organ/external/E = owner.organs_by_name[parent_organ]
if(istype(E)) E.internal_organs -= src
return ..()
/obj/item/organ/internal/remove_rejuv()
if(owner)
owner.internal_organs -= src
owner.internal_organs_by_name[organ_tag] = null
owner.internal_organs_by_name -= organ_tag
while(null in owner.internal_organs)
owner.internal_organs -= null
var/obj/item/organ/external/E = owner.organs_by_name[parent_organ]
if(istype(E)) E.internal_organs -= src
..()
// Brain is defined in brain_item.dm.
/obj/item/organ/heart
/obj/item/organ/internal/heart
name = "heart"
icon_state = "heart-on"
organ_tag = "heart"
parent_organ = "chest"
organ_tag = O_HEART
parent_organ = BP_TORSO
dead_icon = "heart-off"
/obj/item/organ/lungs
/obj/item/organ/internal/lungs
name = "lungs"
icon_state = "lungs"
gender = PLURAL
organ_tag = "lungs"
parent_organ = "chest"
organ_tag = O_LUNGS
parent_organ = BP_TORSO
/obj/item/organ/lungs/process()
/obj/item/organ/internal/lungs/process()
..()
if(!owner)
@@ -38,14 +66,14 @@
spawn owner.emote("me", 1, "gasps for air!")
owner.losebreath += 15
/obj/item/organ/kidneys
/obj/item/organ/internal/kidneys
name = "kidneys"
icon_state = "kidneys"
gender = PLURAL
organ_tag = "kidneys"
parent_organ = "groin"
organ_tag = O_KIDNEYS
parent_organ = BP_GROIN
/obj/item/organ/kidneys/process()
/obj/item/organ/internal/kidneys/process()
..()
@@ -62,22 +90,39 @@
else if(is_broken())
owner.adjustToxLoss(0.3 * PROCESS_ACCURACY)
/obj/item/organ/eyes
/obj/item/organ/internal/eyes
name = "eyeballs"
icon_state = "eyes"
gender = PLURAL
organ_tag = "eyes"
parent_organ = "head"
organ_tag = O_EYES
parent_organ = BP_HEAD
var/list/eye_colour = list(0,0,0)
/obj/item/organ/eyes/robotize()
/obj/item/organ/internal/eyes/robotize()
..()
name = "optical sensor"
icon = 'icons/obj/robot_component.dmi'
icon_state = "camera"
dead_icon = "camera_broken"
/obj/item/organ/eyes/proc/update_colour()
/obj/item/organ/internal/eyes/robot
name = "optical sensor"
/obj/item/organ/internal/eyes/robot/New()
..()
robotize()
/obj/item/organ/internal/eyes/replaced(var/mob/living/carbon/human/target)
// Apply our eye colour to the target.
if(istype(target) && eye_colour)
target.r_eyes = eye_colour[1]
target.g_eyes = eye_colour[2]
target.b_eyes = eye_colour[3]
target.update_eyes()
..()
/obj/item/organ/internal/eyes/proc/update_colour()
if(!owner)
return
eye_colour = list(
@@ -86,13 +131,13 @@
owner.b_eyes ? owner.b_eyes : 0
)
/obj/item/organ/eyes/take_damage(amount, var/silent=0)
/obj/item/organ/internal/eyes/take_damage(amount, var/silent=0)
var/oldbroken = is_broken()
..()
if(is_broken() && !oldbroken && owner && !owner.stat)
owner << "<span class='danger'>You go blind!</span>"
/obj/item/organ/eyes/process() //Eye damage replaces the old eye_stat var.
/obj/item/organ/internal/eyes/process() //Eye damage replaces the old eye_stat var.
..()
if(!owner)
return
@@ -101,13 +146,13 @@
if(is_broken())
owner.eye_blind = 20
/obj/item/organ/liver
/obj/item/organ/internal/liver
name = "liver"
icon_state = "liver"
organ_tag = "liver"
parent_organ = "groin"
parent_organ = BP_GROIN
/obj/item/organ/liver/process()
/obj/item/organ/internal/liver/process()
..()
@@ -130,7 +175,7 @@
src.damage += 0.2 * PROCESS_ACCURACY
//Damaged one shares the fun
else
var/obj/item/organ/O = pick(owner.internal_organs)
var/obj/item/organ/internal/O = pick(owner.internal_organs)
if(O)
O.damage += 0.2 * PROCESS_ACCURACY
@@ -155,13 +200,13 @@
else
take_damage(owner.chem_effects[CE_ALCOHOL_TOXIC] * 0.1 * PROCESS_ACCURACY, prob(1)) // Chance to warn them
/obj/item/organ/appendix
/obj/item/organ/internal/appendix
name = "appendix"
icon_state = "appendix"
parent_organ = "groin"
parent_organ = BP_GROIN
organ_tag = "appendix"
/obj/item/organ/appendix/removed()
/obj/item/organ/internal/appendix/removed()
if(owner)
var/inflamed = 0
for(var/datum/disease/appendicitis/appendicitis in owner.viruses)

View File

@@ -5,7 +5,7 @@
/obj/item/organ/external/stump/New(var/mob/living/carbon/holder, var/internal, var/obj/item/organ/external/limb)
if(istype(limb))
limb_name = limb.limb_name
organ_tag = limb.organ_tag
body_part = limb.body_part
amputation_point = limb.amputation_point
joint = limb.joint

View File

@@ -1,6 +1,6 @@
var/global/list/all_robolimbs = list()
var/global/list/chargen_robolimbs = list()
var/global/datum/robolimb/basic_robolimb
var/list/all_robolimbs = list()
var/list/chargen_robolimbs = list()
var/datum/robolimb/basic_robolimb
/proc/populate_robolimb_list()
basic_robolimb = new()
@@ -18,26 +18,26 @@ var/global/datum/robolimb/basic_robolimb
var/list/species_cannot_use = list()
/datum/robolimb/bishop
company = "Bishop Cybernetics"
company = "Bishop"
desc = "This limb has a white polymer casing with blue holo-displays."
icon = 'icons/mob/human_races/cyberlimbs/bishop.dmi'
/datum/robolimb/hesphaistos
company = "Hesphiastos Industries"
company = "Hesphiastos"
desc = "This limb has a militaristic black and green casing with gold stripes."
icon = 'icons/mob/human_races/cyberlimbs/hesphaistos.dmi'
/datum/robolimb/zenghu
company = "Zeng-Hu Pharmaceuticals"
company = "Zeng-Hu"
desc = "This limb has a rubbery fleshtone covering with visible seams."
icon = 'icons/mob/human_races/cyberlimbs/zenghu.dmi'
/datum/robolimb/xion
company = "Xion Manufacturing Group"
company = "Xion"
desc = "This limb has a minimalist black and red casing."
icon = 'icons/mob/human_races/cyberlimbs/xion.dmi'
/datum/robolimb/ipc
company = "Morpheus Cyberkinetics"
company = "Morpheus"
desc = "This limb is simple and functional; no effort has been made to make it look human."
icon = 'icons/mob/human_races/cyberlimbs/ipc.dmi'

View File

@@ -26,7 +26,7 @@
/obj/item/organ/external/diona/chest
name = "core trunk"
limb_name = "chest"
organ_tag = BP_TORSO
icon_name = "torso"
max_damage = 200
min_broken_damage = 50
@@ -35,56 +35,58 @@
vital = 1
cannot_amputate = 1
parent_organ = null
gendered_icon = 1
/obj/item/organ/external/diona/groin
name = "fork"
limb_name = "groin"
organ_tag = BP_GROIN
icon_name = "groin"
max_damage = 100
min_broken_damage = 50
w_class = 4
body_part = LOWER_TORSO
parent_organ = "chest"
parent_organ = BP_TORSO
gendered_icon = 1
/obj/item/organ/external/diona/arm
name = "left upper tendril"
limb_name = "l_arm"
organ_tag = "l_arm"
icon_name = "l_arm"
max_damage = 35
min_broken_damage = 20
w_class = 3
body_part = ARM_LEFT
parent_organ = "chest"
parent_organ = BP_TORSO
can_grasp = 1
/obj/item/organ/external/diona/arm/right
name = "right upper tendril"
limb_name = "r_arm"
organ_tag = "r_arm"
icon_name = "r_arm"
body_part = ARM_RIGHT
/obj/item/organ/external/diona/leg
name = "left lower tendril"
limb_name = "l_leg"
organ_tag = "l_leg"
icon_name = "l_leg"
max_damage = 35
min_broken_damage = 20
w_class = 3
body_part = LEG_LEFT
icon_position = LEFT
parent_organ = "groin"
parent_organ = BP_GROIN
can_stand = 1
/obj/item/organ/external/diona/leg/right
name = "right lower tendril"
limb_name = "r_leg"
organ_tag = "r_leg"
icon_name = "r_leg"
body_part = LEG_RIGHT
icon_position = RIGHT
/obj/item/organ/external/diona/foot
name = "left foot"
limb_name = "l_foot"
organ_tag = "l_foot"
icon_name = "l_foot"
max_damage = 20
min_broken_damage = 10
@@ -96,7 +98,7 @@
/obj/item/organ/external/diona/foot/right
name = "right foot"
limb_name = "r_foot"
organ_tag = "r_foot"
icon_name = "r_foot"
body_part = FOOT_RIGHT
icon_position = RIGHT
@@ -106,7 +108,7 @@
/obj/item/organ/external/diona/hand
name = "left grasper"
limb_name = "l_hand"
organ_tag = "l_hand"
icon_name = "l_hand"
max_damage = 30
min_broken_damage = 15
@@ -117,13 +119,15 @@
/obj/item/organ/external/diona/hand/right
name = "right grasper"
limb_name = "r_hand"
organ_tag = "r_hand"
icon_name = "r_hand"
body_part = HAND_RIGHT
parent_organ = "r_arm"
//DIONA ORGANS.
/obj/item/organ/external/diona/removed()
if(status & ORGAN_ROBOT)
return ..()
var/mob/living/carbon/human/H = owner
..()
if(!istype(H) || !H.organs || !H.organs.len)
@@ -131,63 +135,65 @@
if(prob(50) && spawn_diona_nymph(get_turf(src)))
qdel(src)
/obj/item/organ/diona/process()
return
/obj/item/organ/diona/strata
name = "neural strata"
parent_organ = "chest"
/obj/item/organ/diona/bladder
name = "gas bladder"
parent_organ = "head"
/obj/item/organ/diona/polyp
name = "polyp segment"
parent_organ = "groin"
/obj/item/organ/diona/ligament
name = "anchoring ligament"
parent_organ = "groin"
/obj/item/organ/diona/node
name = "receptor node"
parent_organ = "head"
/obj/item/organ/diona/nutrients
name = "nutrient vessel"
parent_organ = "chest"
/obj/item/organ/diona
/obj/item/organ/internal/diona
name = "diona nymph"
icon = 'icons/obj/objects.dmi'
icon_state = "nymph"
organ_tag = "special" // Turns into a nymph instantly, no transplanting possible.
/obj/item/organ/diona/removed(var/mob/living/user)
/obj/item/organ/internal/diona/removed(var/mob/living/user, var/skip_nymph)
if(status & ORGAN_ROBOT)
return ..()
var/mob/living/carbon/human/H = owner
..()
if(!istype(H) || !H.organs || !H.organs.len)
H.death()
if(prob(50) && spawn_diona_nymph(get_turf(src)))
if(prob(50) && !skip_nymph && spawn_diona_nymph(get_turf(src)))
qdel(src)
/obj/item/organ/internal/diona/process()
return
/obj/item/organ/internal/diona/strata
name = "neural strata"
parent_organ = BP_TORSO
/obj/item/organ/internal/diona/bladder
name = "gas bladder"
parent_organ = BP_HEAD
/obj/item/organ/internal/diona/polyp
name = "polyp segment"
parent_organ = BP_GROIN
/obj/item/organ/internal/diona/ligament
name = "anchoring ligament"
parent_organ = BP_GROIN
/obj/item/organ/internal/diona/node
name = "receptor node"
parent_organ = BP_HEAD
/obj/item/organ/internal/diona/nutrients
name = O_NUTRIENT
parent_organ = BP_TORSO
// These are different to the standard diona organs as they have a purpose in other
// species (absorbing radiation and light respectively)
/obj/item/organ/diona/nutrients
name = "nutrient vessel"
organ_tag = "nutrient vessel"
/obj/item/organ/internal/diona/nutrients
name = O_NUTRIENT
organ_tag = O_NUTRIENT
icon = 'icons/mob/alien.dmi'
icon_state = "claw"
/obj/item/organ/diona/nutrients/removed()
return
/obj/item/organ/internal/diona/nutrients/removed(var/mob/user)
return ..(user, 1)
/obj/item/organ/diona/node
/obj/item/organ/internal/diona/node
name = "receptor node"
organ_tag = "receptor node"
icon = 'icons/mob/alien.dmi'
icon_state = "claw"
/obj/item/organ/diona/node/removed()
/obj/item/organ/internal/diona/node/removed()
return

View File

@@ -1,17 +1,17 @@
/obj/item/organ/cell
/obj/item/organ/internal/cell
name = "microbattery"
desc = "A small, powerful cell for use in fully prosthetic bodies."
icon = 'icons/obj/power.dmi'
icon_state = "scell"
organ_tag = "cell"
parent_organ = "chest"
parent_organ = BP_TORSO
vital = 1
/obj/item/organ/cell/New()
/obj/item/organ/internal/cell/New()
robotize()
..()
/obj/item/organ/cell/replaced()
/obj/item/organ/internal/cell/replaced()
..()
// This is very ghetto way of rebooting an IPC. TODO better way.
if(owner && owner.stat == DEAD)
@@ -19,59 +19,50 @@
owner.visible_message("<span class='danger'>\The [owner] twitches visibly!</span>")
// Used for an MMI or posibrain being installed into a human.
/obj/item/organ/mmi_holder
name = "brain"
/obj/item/organ/internal/mmi_holder
name = "brain interface"
organ_tag = "brain"
parent_organ = "head"
parent_organ = BP_HEAD
vital = 1
var/obj/item/device/mmi/stored_mmi
/obj/item/organ/mmi_holder/Destroy()
/obj/item/organ/internal/mmi_holder/Destroy()
stored_mmi = null
return ..()
/obj/item/organ/mmi_holder/New()
..()
/obj/item/organ/internal/mmi_holder/New(var/mob/living/carbon/human/new_owner, var/internal)
..(new_owner, internal)
if(!stored_mmi)
stored_mmi = new(src)
sleep(-1)
update_from_mmi()
spawn(1)
if(!owner)
if(stored_mmi)
stored_mmi.loc = get_turf(src)
qdel(src)
return
update_from_mmi()
if(stored_mmi.brainmob && owner && owner.stat == DEAD)
owner.stat = 0
owner.visible_message("<span class='danger'>\The [owner] twitches visibly!</span>")
/obj/item/organ/mmi_holder/proc/update_from_mmi()
if(!stored_mmi)
return
/obj/item/organ/internal/mmi_holder/proc/update_from_mmi()
if(!stored_mmi.brainmob)
stored_mmi.brainmob = new(src)
stored_mmi.brainmob = new(stored_mmi)
stored_mmi.brainobj = new(stored_mmi)
stored_mmi.brainmob.container = stored_mmi
stored_mmi.brainmob.real_name = owner.real_name
stored_mmi.brainmob.name = stored_mmi.brainmob.real_name
stored_mmi.name = "[initial(stored_mmi.name)] ([owner.real_name])"
stored_mmi.brainmob.real_name = owner.name
stored_mmi.brainmob.name = stored_mmi.brainmob.real_name
if(owner)
stored_mmi.name = "[initial(stored_mmi.name)] ([owner.name])"
if(!owner) return
name = stored_mmi.name
desc = stored_mmi.desc
icon = stored_mmi.icon
stored_mmi.icon_state = "mmi_full"
icon_state = stored_mmi.icon_state
/obj/item/organ/mmi_holder/removed()
update_from_mmi()
return ..()
if(owner && owner.stat == DEAD)
owner.stat = 0
dead_mob_list -= owner
living_mob_list |= owner
owner.visible_message("<span class='danger'>\The [owner] twitches visibly!</span>")
/obj/item/organ/mmi_holder/removed(var/mob/living/user)
/obj/item/organ/internal/mmi_holder/removed(var/mob/living/user)
if(stored_mmi)
stored_mmi.loc = get_turf(src)
@@ -84,9 +75,14 @@
holder_mob.drop_from_inventory(src)
qdel(src)
/obj/item/organ/mmi_holder/posibrain
name = "positronic brain"
/obj/item/organ/internal/mmi_holder/posibrain
name = "positronic brain interface"
/obj/item/organ/mmi_holder/posibrain/New()
/obj/item/organ/internal/mmi_holder/posibrain/New()
stored_mmi = new /obj/item/device/mmi/digital/posibrain(src)
..()
/obj/item/organ/internal/mmi_holder/posibrain/update_from_mmi()
..()
stored_mmi.icon_state = "posibrain-occupied"
icon_state = stored_mmi.icon_state

View File

@@ -4,7 +4,7 @@
/obj/item/organ/external/chest
name = "upper body"
limb_name = "chest"
organ_tag = BP_TORSO
icon_name = "torso"
max_damage = 100
min_broken_damage = 35
@@ -21,34 +21,34 @@
/obj/item/organ/external/groin
name = "lower body"
limb_name = "groin"
organ_tag = BP_GROIN
icon_name = "groin"
max_damage = 100
min_broken_damage = 35
w_class = 4
body_part = LOWER_TORSO
vital = 1
parent_organ = "chest"
parent_organ = BP_TORSO
amputation_point = "lumbar"
joint = "hip"
dislocated = -1
gendered_icon = 1
/obj/item/organ/external/arm
limb_name = "l_arm"
organ_tag = "l_arm"
name = "left arm"
icon_name = "l_arm"
max_damage = 50
min_broken_damage = 30
w_class = 3
body_part = ARM_LEFT
parent_organ = "chest"
parent_organ = BP_TORSO
joint = "left elbow"
amputation_point = "left shoulder"
can_grasp = 1
/obj/item/organ/external/arm/right
limb_name = "r_arm"
organ_tag = "r_arm"
name = "right arm"
icon_name = "r_arm"
body_part = ARM_RIGHT
@@ -56,7 +56,7 @@
amputation_point = "right shoulder"
/obj/item/organ/external/leg
limb_name = "l_leg"
organ_tag = "l_leg"
name = "left leg"
icon_name = "l_leg"
max_damage = 50
@@ -64,13 +64,13 @@
w_class = 3
body_part = LEG_LEFT
icon_position = LEFT
parent_organ = "groin"
parent_organ = BP_GROIN
joint = "left knee"
amputation_point = "left hip"
can_stand = 1
/obj/item/organ/external/leg/right
limb_name = "r_leg"
organ_tag = "r_leg"
name = "right leg"
icon_name = "r_leg"
body_part = LEG_RIGHT
@@ -79,7 +79,7 @@
amputation_point = "right hip"
/obj/item/organ/external/foot
limb_name = "l_foot"
organ_tag = "l_foot"
name = "left foot"
icon_name = "l_foot"
max_damage = 30
@@ -97,7 +97,7 @@
..()
/obj/item/organ/external/foot/right
limb_name = "r_foot"
organ_tag = "r_foot"
name = "right foot"
icon_name = "r_foot"
body_part = FOOT_RIGHT
@@ -107,7 +107,7 @@
amputation_point = "right ankle"
/obj/item/organ/external/hand
limb_name = "l_hand"
organ_tag = "l_hand"
name = "left hand"
icon_name = "l_hand"
max_damage = 30
@@ -124,7 +124,7 @@
..()
/obj/item/organ/external/hand/right
limb_name = "r_hand"
organ_tag = "r_hand"
name = "right hand"
icon_name = "r_hand"
body_part = HAND_RIGHT
@@ -133,7 +133,7 @@
amputation_point = "right wrist"
/obj/item/organ/external/head
limb_name = "head"
organ_tag = BP_HEAD
icon_name = "head"
name = "head"
max_damage = 75
@@ -141,7 +141,7 @@
w_class = 3
body_part = HEAD
vital = 1
parent_organ = "chest"
parent_organ = BP_TORSO
joint = "jaw"
amputation_point = "neck"
gendered_icon = 1

View File

@@ -1,52 +1,52 @@
//XENOMORPH ORGANS
/obj/item/organ/xenos
/obj/item/organ/internal/xenos
name = "xeno organ"
icon = 'icons/effects/blood.dmi'
desc = "It smells like an accident in a chemical factory."
/obj/item/organ/xenos/eggsac
/obj/item/organ/internal/xenos/eggsac
name = "egg sac"
parent_organ = "groin"
parent_organ = BP_GROIN
icon_state = "xgibmid1"
organ_tag = "egg sac"
organ_tag = O_EGG
/obj/item/organ/xenos/plasmavessel
/obj/item/organ/internal/xenos/plasmavessel
name = "plasma vessel"
parent_organ = "chest"
parent_organ = BP_TORSO
icon_state = "xgibdown1"
organ_tag = "plasma vessel"
organ_tag = O_PLASMA
var/stored_plasma = 0
var/max_plasma = 500
/obj/item/organ/xenos/plasmavessel/queen
/obj/item/organ/internal/xenos/plasmavessel/queen
name = "bloated plasma vessel"
stored_plasma = 200
max_plasma = 500
/obj/item/organ/xenos/plasmavessel/sentinel
/obj/item/organ/internal/xenos/plasmavessel/sentinel
stored_plasma = 100
max_plasma = 250
/obj/item/organ/xenos/plasmavessel/hunter
/obj/item/organ/internal/xenos/plasmavessel/hunter
name = "tiny plasma vessel"
stored_plasma = 100
max_plasma = 150
/obj/item/organ/xenos/acidgland
/obj/item/organ/internal/xenos/acidgland
name = "acid gland"
parent_organ = "head"
parent_organ = BP_HEAD
icon_state = "xgibtorso"
organ_tag = "acid gland"
organ_tag = O_ACID
/obj/item/organ/xenos/hivenode
/obj/item/organ/internal/xenos/hivenode
name = "hive node"
parent_organ = "chest"
parent_organ = BP_TORSO
icon_state = "xgibmid2"
organ_tag = "hive node"
organ_tag = O_HIVE
/obj/item/organ/xenos/resinspinner
/obj/item/organ/internal/xenos/resinspinner
name = "resin spinner"
parent_organ = "head"
parent_organ = BP_HEAD
icon_state = "xgibmid2"
organ_tag = "resin spinner"
organ_tag = O_RESIN