diff --git a/citadel.dme b/citadel.dme index 849107403e2..718a4d21a62 100644 --- a/citadel.dme +++ b/citadel.dme @@ -3201,18 +3201,28 @@ #include "code\modules\nifsoft\software\13_soulcatcher.dm" #include "code\modules\nifsoft\software\14_commlink.dm" #include "code\modules\nifsoft\software\15_misc.dm" -#include "code\modules\organs\adherent_external.dm" +#include "code\modules\organs\_organ_defines.dm" #include "code\modules\organs\blood.dm" +#include "code\modules\organs\external_defines.dm" +#include "code\modules\organs\internal_defines.dm" #include "code\modules\organs\misc.dm" #include "code\modules\organs\organ.dm" -#include "code\modules\organs\organ_external.dm" -#include "code\modules\organs\organ_external_vr.dm" -#include "code\modules\organs\organ_icon.dm" -#include "code\modules\organs\organ_stump.dm" +#include "code\modules\organs\external\_external.dm" +#include "code\modules\organs\external\_external_icons.dm" +#include "code\modules\organs\external\standard.dm" +#include "code\modules\organs\external\standard_vr.dm" +#include "code\modules\organs\external\stump.dm" +#include "code\modules\organs\external\species\adherent.dm" +#include "code\modules\organs\external\species\alraune.dm" +#include "code\modules\organs\external\species\diona.dm" +#include "code\modules\organs\external\species\shadekin.dm" +#include "code\modules\organs\external\species\slime.dm" +#include "code\modules\organs\external\species\teshari.dm" +#include "code\modules\organs\external\species\unathi.dm" +#include "code\modules\organs\external\species\xenos.dm" +#include "code\modules\organs\external\wounds\wound.dm" #include "code\modules\organs\pain.dm" -#include "code\modules\organs\robolimbs.dm" -#include "code\modules\organs\wound.dm" -#include "code\modules\organs\internal\adherent.dm" +#include "code\modules\organs\internal\_internal.dm" #include "code\modules\organs\internal\appendix.dm" #include "code\modules\organs\internal\augment.dm" #include "code\modules\organs\internal\brain.dm" @@ -3222,7 +3232,6 @@ #include "code\modules\organs\internal\kidneys.dm" #include "code\modules\organs\internal\liver.dm" #include "code\modules\organs\internal\lungs.dm" -#include "code\modules\organs\internal\organ_internal.dm" #include "code\modules\organs\internal\spleen.dm" #include "code\modules\organs\internal\stomach.dm" #include "code\modules\organs\internal\voicebox.dm" @@ -3231,26 +3240,23 @@ #include "code\modules\organs\internal\robotic\_robotic.dm" #include "code\modules\organs\internal\robotic\diagnostic.dm" #include "code\modules\organs\internal\robotic\heatsink.dm" -#include "code\modules\organs\subtypes\alraune.dm" -#include "code\modules\organs\subtypes\diona.dm" +#include "code\modules\organs\internal\species\adherent.dm" +#include "code\modules\organs\internal\species\diona.dm" +#include "code\modules\organs\internal\species\replicant.dm" +#include "code\modules\organs\internal\species\shadekin.dm" +#include "code\modules\organs\internal\species\slime.dm" +#include "code\modules\organs\internal\species\subspecies_graver.dm" +#include "code\modules\organs\internal\species\vox.dm" +#include "code\modules\organs\internal\species\subspecies_spacer.dm" +#include "code\modules\organs\internal\species\xenochimera.dm" +#include "code\modules\organs\internal\species\unathi.dm" +#include "code\modules\organs\internal\species\xenos.dm" +#include "code\modules\organs\robolimbs.dm" #include "code\modules\organs\subtypes\indestructible.dm" #include "code\modules\organs\subtypes\machine.dm" #include "code\modules\organs\subtypes\nano.dm" -#include "code\modules\organs\subtypes\replicant.dm" -#include "code\modules\organs\subtypes\shadekin.dm" -#include "code\modules\organs\subtypes\slime.dm" -#include "code\modules\organs\subtypes\standard.dm" -#include "code\modules\organs\subtypes\standard_vr.dm" -#include "code\modules\organs\subtypes\subspecies_graver.dm" -#include "code\modules\organs\subtypes\subspecies_spacer.dm" -#include "code\modules\organs\subtypes\teshari.dm" -#include "code\modules\organs\subtypes\unathi.dm" #include "code\modules\organs\subtypes\unbreakable.dm" #include "code\modules\organs\subtypes\unseverable.dm" -#include "code\modules\organs\subtypes\vox.dm" -#include "code\modules\organs\subtypes\vox_vr.dm" -#include "code\modules\organs\subtypes\xenochimera.dm" -#include "code\modules\organs\subtypes\xenos.dm" #include "code\modules\overmap\abductor_vr.dm" #include "code\modules\overmap\bluespace_rift.dm" #include "code\modules\overmap\champagne.dm" diff --git a/code/__DEFINES/carbon/organs.dm b/code/__DEFINES/carbon/organs.dm index faf8546084f..115a4591286 100644 --- a/code/__DEFINES/carbon/organs.dm +++ b/code/__DEFINES/carbon/organs.dm @@ -1,5 +1,11 @@ //! *ALL DEFINES RELATED TO ORGANS GO HERE* !// +//These control the damage thresholds for the various ways of removing limbs +#define DROPLIMB_THRESHOLD_EDGE 5 +#define DROPLIMB_THRESHOLD_TEAROFF 2 +#define DROPLIMB_THRESHOLD_DESTROY 1 + + /// Global list of organs for future use. #define O_ALL (O_ALL_STANDARD + O_ALL_NONSTANDARD) /// Global list of all standard body parts. diff --git a/code/modules/organs/_organ_defines.dm b/code/modules/organs/_organ_defines.dm new file mode 100644 index 00000000000..6707ac2dd99 --- /dev/null +++ b/code/modules/organs/_organ_defines.dm @@ -0,0 +1,80 @@ +var/list/organ_cache = list() + +/obj/item/organ + name = "organ" + icon = 'icons/obj/surgery.dmi' + germ_level = 0 + drop_sound = 'sound/items/drop/flesh.ogg' + pickup_sound = 'sound/items/pickup/flesh.ogg' + + +//! ## STRINGS VARS + /// Unique identifier. + var/organ_tag = "organ" + /// The organ holding this object. + var/parent_organ = BP_TORSO + + +//! STATUS VARS + /// Various status flags + var/status = 0 + /// Lose a vital limb, die immediately. + var/vital + /// Current damage to the organ + var/damage = 0 + /// Flag for what kind of robotic organ, if valid. + var/robotic = 0 + /// If true, this organ can't feel pain. + var/stapled_nerves = FALSE + + +//! ##REFERENCE VARS + /// Current mob owning the organ. + var/mob/living/carbon/human/owner + /// Transplant match data. + var/list/transplant_data + /// Trauma data for forensics. + var/list/autopsy_data = list() + /// Traces of chemicals in the organ. + var/list/trace_chemicals = list() + /// Original DNA. + var/datum/dna/dna + /// Original species. + var/datum/species/species + var/s_base + + +//! ## DAMAGE VARS + /// Damage before considered bruised + var/min_bruised_damage = 10 + /// Damage before becoming broken + var/min_broken_damage = 30 + /// Damage cap + var/max_damage + /// Can this organ reject? + var/can_reject = TRUE + /// Is this organ already being rejected? + var/rejecting + /// Can this organ decay at all? + var/decays = TRUE + /// If true, prevent organ decay. + var/preserved = FALSE + + +//! ## LANGUAGE VARS - For organs that assist with certain languages. + var/list/will_assist_languages = list() + var/list/datum/language/assists_languages = list() + + +//! ## VERB VARS + /// Verbs added by the organ when present in the body. + var/list/organ_verbs + /// Is the parent supposed to be organic, robotic, assisted? + var/list/target_parent_classes = list() + /// Will the organ give its verbs when it isn't a perfect match? I.E., assisted in organic, synthetic in organic. + var/forgiving_class = TRUE + + /// Can we butcher this organ. + var/butcherable = TRUE + /// What does butchering, if possible, make? + var/meat_type diff --git a/code/modules/organs/adherent_external.dm b/code/modules/organs/adherent_external.dm deleted file mode 100644 index 9db60f8bf6d..00000000000 --- a/code/modules/organs/adherent_external.dm +++ /dev/null @@ -1,114 +0,0 @@ -/obj/item/organ/external/chest/crystal - name = "tendril junction" - amputation_point = "axis" - joint = "central axis" - model = "NULL DATA." - w_class = ITEMSIZE_LARGE - gendered_icon = 0 - dislocated = -1 - max_damage = 50 - min_broken_damage = 25 -// arterial_bleed_severity = 0 - encased = "ceramic hull" - robotic = ORGAN_CRYSTAL -// limb_flags = ORGAN_FLAG_CAN_BREAK | ORGAN_FLAG_HEALS_OVERKILL - -/obj/item/organ/external/groin/crystal - name = "trailing tendrils" - joint = "base" -// arterial_bleed_severity = 0 - dislocated = -1 - max_damage = 50 - min_broken_damage = 25 - gendered_icon = 0 - encased = "ceramic hull" - robotic = ORGAN_CRYSTAL -// limb_flags = ORGAN_FLAG_CAN_AMPUTATE | ORGAN_FLAG_CAN_STAND | ORGAN_FLAG_CAN_BREAK - -/obj/item/organ/external/head/crystal - name = "chassis core" - amputation_point = "connector socket" - joint = "connector socket" - gendered_icon = 0 -// arterial_bleed_severity = 0 - dislocated = -1 - max_damage = 50 - min_broken_damage = 25 - encased = "ceramic hull" - eye_icon_location = 'icons/mob/human_races/adherent/eyes.dmi' - eye_icon = "eyes" - robotic = ORGAN_CRYSTAL -// limb_flags = ORGAN_FLAG_CAN_AMPUTATE | ORGAN_FLAG_HEALS_OVERKILL | ORGAN_FLAG_CAN_BREAK - -/obj/item/organ/external/arm/crystal - name = "left grasping tendril" - amputation_point = "midpoint" - joint = "base" - gendered_icon = 0 -// arterial_bleed_severity = 0 - dislocated = -1 - max_damage = 20 - min_broken_damage = 10 - robotic = ORGAN_CRYSTAL -// limb_flags = ORGAN_FLAG_CAN_AMPUTATE | ORGAN_FLAG_CAN_GRASP | ORGAN_FLAG_CAN_STAND | ORGAN_FLAG_CAN_BREAK - -/obj/item/organ/external/arm/right/crystal - name = "right grasping tendril" - amputation_point = "midpoint" - joint = "base" - gendered_icon = 0 -// arterial_bleed_severity = 0 - dislocated = -1 - max_damage = 20 - min_broken_damage = 10 - robotic = ORGAN_CRYSTAL -// limb_flags = ORGAN_FLAG_CAN_AMPUTATE | ORGAN_FLAG_CAN_GRASP | ORGAN_FLAG_CAN_STAND | ORGAN_FLAG_CAN_BREAK - -/obj/item/organ/external/hand/crystal - name = "left maniple tendril" - amputation_point = "midpoint" - joint = "base" - gendered_icon = 0 -// arterial_bleed_severity = 0 - dislocated = -1 - max_damage = 20 - min_broken_damage = 10 - robotic = ORGAN_CRYSTAL -// limb_flags = ORGAN_FLAG_CAN_AMPUTATE | ORGAN_FLAG_CAN_GRASP | ORGAN_FLAG_CAN_STAND | ORGAN_FLAG_CAN_BREAK - -/obj/item/organ/external/hand/right/crystal - name = "right maniple tendril" - amputation_point = "midpoint" - joint = "base" - gendered_icon = 0 -// arterial_bleed_severity = 0 - dislocated = -1 - max_damage = 20 - min_broken_damage = 10 - robotic = ORGAN_CRYSTAL - -// limb_flags = ORGAN_FLAG_CAN_AMPUTATE | ORGAN_FLAG_CAN_GRASP | ORGAN_FLAG_CAN_STAND | ORGAN_FLAG_CAN_BREAK - -/obj/item/organ/external/leg/tendril - name = "first tendril" - amputation_point = "midpoint" - joint = "base" - gendered_icon = 0 - organ_tag = BP_L_LEG - parent_organ = BP_TORSO -// arterial_bleed_severity = 0 - dislocated = -1 - max_damage = 20 - min_broken_damage = 10 - robotic = ORGAN_CRYSTAL -// limb_flags = ORGAN_FLAG_CAN_AMPUTATE | ORGAN_FLAG_CAN_GRASP | ORGAN_FLAG_CAN_STAND | ORGAN_FLAG_CAN_BREAK - -/obj/item/organ/external/leg/right/tendril - name = "second tendril" - robotic = ORGAN_CRYSTAL -/obj/item/organ/external/foot/tendril - name = "third tendril" - robotic = ORGAN_CRYSTAL -/obj/item/organ/external/foot/right/tendril - name = "fourth tendril" - robotic = ORGAN_CRYSTAL diff --git a/code/modules/organs/organ_external.dm b/code/modules/organs/external/_external.dm similarity index 92% rename from code/modules/organs/organ_external.dm rename to code/modules/organs/external/_external.dm index fd2a14be478..068b4efe525 100644 --- a/code/modules/organs/organ_external.dm +++ b/code/modules/organs/external/_external.dm @@ -2,136 +2,6 @@ EXTERNAL ORGANS ****************************************************/ -//These control the damage thresholds for the various ways of removing limbs -#define DROPLIMB_THRESHOLD_EDGE 5 -#define DROPLIMB_THRESHOLD_TEAROFF 2 -#define DROPLIMB_THRESHOLD_DESTROY 1 - -/obj/item/organ/external - name = "external" - min_broken_damage = 30 - max_damage = 0 - dir = SOUTH - organ_tag = "limb" - - //* Strings *// - /// Fracture description if any. - var/broken_description - /// Modifier used for generating the on-mob damage overlay for this limb. - var/damage_state = "00" - - //* Damage vars. *// - /// Multiplier for incoming brute damage. - var/brute_mod = 1 - /// As above for burn. - var/burn_mod = 1 - /// Actual current brute damage. - var/brute_dam = 0 - /// Actual current burn damage. - var/burn_dam = 0 - /// used in healing/processing calculations. - var/last_dam = -1 - var/spread_dam = 0 - /// If a needle has a chance to fail to penetrate. - var/thick_skin = 0 - /// EMP damage multiplier - var/emp_mod = 1 - - //* Appearance vars. *// - /// Snowflake warning, reee. Used for slime limbs. - var/nonsolid - /// Also for slimes. Used for transparent limbs. - var/transparent = 0 - /// Icon state base. - var/icon_name = null - /// Part flag - var/body_part = null - /// Used in mob overlay layering calculations. - var/icon_position = 0 - /// Used when caching robolimb icons. - var/model - /// Used to force override of species-specific limb icons (for prosthetics). Also used for any limbs chopped from a simple mob, and then attached to humans. - var/force_icon - /// Used to force the override of the icon-key generated using the species. Must be used in tandem with the above. - var/force_icon_key - /// Cached icon for use in mob overlays. - var/icon/mob_icon - /// Whether or not the icon state appends a gender. - var/gendered_icon = 0 - /// Skin tone. - var/s_tone - /// Skin colour - var/list/s_col - /// How the skin colour is applied. - var/s_col_blend = ICON_ADD - /// Hair colour - var/list/h_col - /// Icon blend for body hair if any. - var/body_hair - var/mob/living/applied_pressure - /// Markings (body_markings) to apply to the icon - var/list/markings = list() - - //* Wound and structural data. *// - /// How often wounds should be updated, a higher number means less often - var/wound_update_accuracy = 1 - /// Wound datum list. - var/list/wounds = list() - /// Number of wounds, which is NOT wounds.len! - var/number_wounds = 0 - /// Master-limb. - var/obj/item/organ/external/parent - /// Sub-limbs. - var/list/children = list() - /// Internal organs of this body part - var/list/internal_organs = list() - /// If a prosthetic limb is emagged, it will detonate when it fails. - var/sabotaged = 0 - /// Currently implanted objects. - var/list/implants = list() - /// Relative size of the organ. - var/organ_rel_size = 25 - /// Chance of missing. - var/base_miss_chance = 20 - var/atom/movable/splinted - - //* Joint/state stuff. *// - /// It would be more appropriate if these two were named "affects_grasp" and "affects_stand" at this point - var/can_grasp - /// Modifies stance tally/ability to stand. - var/can_stand - /// Scarred/burned beyond recognition. - var/disfigured = 0 - /// Impossible to amputate. - var/cannot_amputate - /// Impossible to fracture. - var/cannot_break - /// Impossible to gib, distinct from amputation. - var/cannot_gib - /// Descriptive string used in dislocation. - var/joint = "joint" - /// Descriptive string used in amputation. - var/amputation_point - /// If you target a joint, you can dislocate the limb, impairing it's usefulness and causing pain. - var/dislocated = 0 - /// Needs to be opened with a saw to access the organs. - var/encased - - //* Surgery vars. *// - var/open = 0 - var/stage = 0 - var/cavity = 0 - /// Surgical repair stage for burn. - var/burn_stage = 0 - /// Surgical repair stage for brute. - var/brute_stage = 0 - - /// HUD element variable, see organ_icon.dm get_damage_hud_image() - var/image/hud_damage_image - - /// makes this dumb as fuck mechanic slightly less awful - records queued syringe infections instead of a spawn() - var/syringe_infection_queued - /obj/item/organ/external/Destroy() if(parent && parent.children) @@ -1204,6 +1074,23 @@ Note that amputating the affected organ does in fact remove the infection from t owner.refresh_modular_limb_verbs() return 1 +//! ## VIRGO HOOK, TODO: Integrate this. +//Sideways override for nanoform limbs (ugh) +/obj/item/organ/external/robotize(var/company, var/skip_prosthetics = FALSE, var/keep_organs = FALSE) + var/original_robotic = robotic + if(original_robotic >= ORGAN_NANOFORM) + var/o_encased = encased + var/o_max_damage = max_damage + var/o_min_broken_damage = min_broken_damage + robotic = FALSE + . = ..(company = company, keep_organs = TRUE) + robotic = original_robotic + encased = o_encased + max_damage = o_max_damage + min_broken_damage = o_min_broken_damage + else + return ..() + /obj/item/organ/external/proc/mutate() if(src.robotic >= ORGAN_ROBOT) return diff --git a/code/modules/organs/organ_icon.dm b/code/modules/organs/external/_external_icons.dm similarity index 100% rename from code/modules/organs/organ_icon.dm rename to code/modules/organs/external/_external_icons.dm diff --git a/code/modules/organs/external/species/adherent.dm b/code/modules/organs/external/species/adherent.dm new file mode 100644 index 00000000000..8cd955830f5 --- /dev/null +++ b/code/modules/organs/external/species/adherent.dm @@ -0,0 +1,116 @@ +/obj/item/organ/external/chest/crystal + name = "tendril junction" + amputation_point = "axis" + joint = "central axis" + model = "NULL DATA." + w_class = ITEMSIZE_LARGE + gendered_icon = 0 + dislocated = -1 + max_damage = 50 + min_broken_damage = 25 +// arterial_bleed_severity = 0 + encased = "ceramic hull" + robotic = ORGAN_CRYSTAL +// limb_flags = ORGAN_FLAG_CAN_BREAK | ORGAN_FLAG_HEALS_OVERKILL + +/obj/item/organ/external/groin/crystal + name = "trailing tendrils" + joint = "base" +// arterial_bleed_severity = 0 + dislocated = -1 + max_damage = 50 + min_broken_damage = 25 + gendered_icon = 0 + encased = "ceramic hull" + robotic = ORGAN_CRYSTAL +// limb_flags = ORGAN_FLAG_CAN_AMPUTATE | ORGAN_FLAG_CAN_STAND | ORGAN_FLAG_CAN_BREAK + +/obj/item/organ/external/head/crystal + name = "chassis core" + amputation_point = "connector socket" + joint = "connector socket" + gendered_icon = 0 +// arterial_bleed_severity = 0 + dislocated = -1 + max_damage = 50 + min_broken_damage = 25 + encased = "ceramic hull" + eye_icon_location = 'icons/mob/human_races/adherent/eyes.dmi' + eye_icon = "eyes" + robotic = ORGAN_CRYSTAL +// limb_flags = ORGAN_FLAG_CAN_AMPUTATE | ORGAN_FLAG_HEALS_OVERKILL | ORGAN_FLAG_CAN_BREAK + +/obj/item/organ/external/arm/crystal + name = "left grasping tendril" + amputation_point = "midpoint" + joint = "base" + gendered_icon = 0 +// arterial_bleed_severity = 0 + dislocated = -1 + max_damage = 20 + min_broken_damage = 10 + robotic = ORGAN_CRYSTAL +// limb_flags = ORGAN_FLAG_CAN_AMPUTATE | ORGAN_FLAG_CAN_GRASP | ORGAN_FLAG_CAN_STAND | ORGAN_FLAG_CAN_BREAK + +/obj/item/organ/external/arm/right/crystal + name = "right grasping tendril" + amputation_point = "midpoint" + joint = "base" + gendered_icon = 0 +// arterial_bleed_severity = 0 + dislocated = -1 + max_damage = 20 + min_broken_damage = 10 + robotic = ORGAN_CRYSTAL +// limb_flags = ORGAN_FLAG_CAN_AMPUTATE | ORGAN_FLAG_CAN_GRASP | ORGAN_FLAG_CAN_STAND | ORGAN_FLAG_CAN_BREAK + +/obj/item/organ/external/hand/crystal + name = "left maniple tendril" + amputation_point = "midpoint" + joint = "base" + gendered_icon = 0 +// arterial_bleed_severity = 0 + dislocated = -1 + max_damage = 20 + min_broken_damage = 10 + robotic = ORGAN_CRYSTAL +// limb_flags = ORGAN_FLAG_CAN_AMPUTATE | ORGAN_FLAG_CAN_GRASP | ORGAN_FLAG_CAN_STAND | ORGAN_FLAG_CAN_BREAK + +/obj/item/organ/external/hand/right/crystal + name = "right maniple tendril" + amputation_point = "midpoint" + joint = "base" + gendered_icon = 0 +// arterial_bleed_severity = 0 + dislocated = -1 + max_damage = 20 + min_broken_damage = 10 + robotic = ORGAN_CRYSTAL + +// limb_flags = ORGAN_FLAG_CAN_AMPUTATE | ORGAN_FLAG_CAN_GRASP | ORGAN_FLAG_CAN_STAND | ORGAN_FLAG_CAN_BREAK + +/obj/item/organ/external/leg/tendril + name = "first tendril" + amputation_point = "midpoint" + joint = "base" + gendered_icon = 0 + organ_tag = BP_L_LEG + parent_organ = BP_TORSO +// arterial_bleed_severity = 0 + dislocated = -1 + max_damage = 20 + min_broken_damage = 10 + robotic = ORGAN_CRYSTAL +// limb_flags = ORGAN_FLAG_CAN_AMPUTATE | ORGAN_FLAG_CAN_GRASP | ORGAN_FLAG_CAN_STAND | ORGAN_FLAG_CAN_BREAK + +/obj/item/organ/external/leg/right/tendril + name = "second tendril" + robotic = ORGAN_CRYSTAL + +/obj/item/organ/external/foot/tendril + name = "third tendril" + robotic = ORGAN_CRYSTAL + +/obj/item/organ/external/foot/right/tendril + name = "fourth tendril" + robotic = ORGAN_CRYSTAL diff --git a/code/modules/organs/subtypes/alraune.dm b/code/modules/organs/external/species/alraune.dm similarity index 70% rename from code/modules/organs/subtypes/alraune.dm rename to code/modules/organs/external/species/alraune.dm index f60c08e3f9d..735f0cd40e5 100644 --- a/code/modules/organs/subtypes/alraune.dm +++ b/code/modules/organs/external/species/alraune.dm @@ -1,34 +1,34 @@ /obj/item/organ/external/chest/unbreakable/plant - spread_dam = 1 + spread_dam = TRUE /obj/item/organ/external/groin/unbreakable/plant - spread_dam = 1 + spread_dam = TRUE /obj/item/organ/external/arm/unbreakable/plant - spread_dam = 1 + spread_dam = TRUE /obj/item/organ/external/arm/right/unbreakable/plant - spread_dam = 1 + spread_dam = TRUE /obj/item/organ/external/leg/unbreakable/plant - spread_dam = 1 + spread_dam = TRUE /obj/item/organ/external/leg/right/unbreakable/plant - spread_dam = 1 + spread_dam = TRUE /obj/item/organ/external/foot/unbreakable/plant - spread_dam = 1 + spread_dam = TRUE /obj/item/organ/external/foot/right/unbreakable/plant - spread_dam = 1 + spread_dam = TRUE /obj/item/organ/external/hand/unbreakable/plant - spread_dam = 1 + spread_dam = TRUE /obj/item/organ/external/hand/right/unbreakable/plant - spread_dam = 1 + spread_dam = TRUE /obj/item/organ/external/head/unbreakable/plant //They don't need this anymore. - cannot_gib = 0 - vital = 0 - spread_dam = 1 + spread_dam = TRUE + cannot_gib = FALSE + vital = FALSE diff --git a/code/modules/organs/subtypes/diona.dm b/code/modules/organs/external/species/diona.dm similarity index 51% rename from code/modules/organs/subtypes/diona.dm rename to code/modules/organs/external/species/diona.dm index ae4f701d1ea..f647ad81eec 100644 --- a/code/modules/organs/subtypes/diona.dm +++ b/code/modules/organs/external/species/diona.dm @@ -1,11 +1,11 @@ -/proc/spawn_diona_nymph(var/turf/target) +/proc/spawn_diona_nymph(turf/target) if(!istype(target)) - return 0 + return FALSE //This is a terrible hack and I should be ashamed. var/datum/seed/diona = SSplants.seeds["diona"] if(!diona) - return 0 + return FALSE . = TRUE @@ -17,9 +17,10 @@ if(D) if(!D.ckey || !D.client) D.death() + /obj/item/organ/external/diona name = "tendril" - cannot_break = 1 + cannot_break = TRUE amputation_point = "branch" joint = "structural ligament" dislocated = -1 @@ -32,10 +33,10 @@ min_broken_damage = 50 w_class = ITEMSIZE_HUGE body_part = UPPER_TORSO - vital = 1 - cannot_amputate = 1 + vital = TRUE + cannot_amputate = TRUE parent_organ = null - gendered_icon = 1 + gendered_icon = TRUE /obj/item/organ/external/diona/groin name = "fork" @@ -46,7 +47,7 @@ w_class = ITEMSIZE_LARGE body_part = LOWER_TORSO parent_organ = BP_TORSO - gendered_icon = 1 + gendered_icon = TRUE /obj/item/organ/external/diona/arm name = "left upper tendril" @@ -57,7 +58,7 @@ w_class = ITEMSIZE_NORMAL body_part = ARM_LEFT parent_organ = BP_TORSO - can_grasp = 1 + can_grasp = TRUE /obj/item/organ/external/diona/arm/right name = "right upper tendril" @@ -75,7 +76,7 @@ body_part = LEG_LEFT icon_position = LEFT parent_organ = BP_GROIN - can_stand = 1 + can_stand = TRUE /obj/item/organ/external/diona/leg/right name = "right lower tendril" @@ -94,7 +95,7 @@ body_part = FOOT_LEFT icon_position = LEFT parent_organ = BP_R_LEG - can_stand = 1 + can_stand = TRUE /obj/item/organ/external/diona/foot/right name = "right foot" @@ -115,7 +116,7 @@ w_class = ITEMSIZE_SMALL body_part = HAND_LEFT parent_organ = BP_L_ARM - can_grasp = 1 + can_grasp = TRUE /obj/item/organ/external/diona/hand/right name = "right grasper" @@ -135,113 +136,12 @@ if(prob(50) && spawn_diona_nymph(get_turf(src))) qdel(src) -/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/internal/diona/removed(var/mob/living/user, var/skip_nymph) - if(robotic >= ORGAN_ROBOT) - return ..() - var/mob/living/carbon/human/H = owner - ..() - if(!istype(H) || !H.organs || !H.organs.len) - H.death() - if(prob(50) && !skip_nymph && spawn_diona_nymph(get_turf(src))) - qdel(src) - -/obj/item/organ/internal/diona/process(delta_time) - return - -/obj/item/organ/internal/diona/strata - name = "neural strata" - parent_organ = BP_TORSO - organ_tag = O_STRATA - -/obj/item/organ/internal/diona/bladder - name = "gas bladder" - parent_organ = BP_HEAD - organ_tag = O_GBLADDER - -/obj/item/organ/internal/diona/polyp - name = "polyp segment" - parent_organ = BP_GROIN - organ_tag = O_POLYP - -/obj/item/organ/internal/diona/ligament - name = "anchoring ligament" - parent_organ = BP_GROIN - organ_tag = O_ANCHOR - -/obj/item/organ/internal/diona/node - name = "receptor node" - parent_organ = BP_HEAD - organ_tag = O_RESPONSE - -/obj/item/organ/internal/diona/nutrients - name = O_NUTRIENT - parent_organ = BP_TORSO - organ_tag = O_NUTRIENT - -// These are different to the standard diona organs as they have a purpose in other -// species (absorbing radiation and light respectively) -/obj/item/organ/internal/diona/nutrients - name = O_NUTRIENT - organ_tag = O_NUTRIENT - icon = 'icons/mob/alien.dmi' - icon_state = "claw" - -/obj/item/organ/internal/diona/nutrients/removed(var/mob/user) - return ..(user, 1) - -/obj/item/organ/internal/diona/node - name = "response node" - parent_organ = BP_HEAD - organ_tag = O_RESPONSE - icon = 'icons/mob/alien.dmi' - icon_state = "claw" - -/obj/item/organ/internal/diona/node/removed() - return - -// A 'brain' for the tree, still becomes a mindless nymph when removed like any other. Satisfies the FBP code. -/obj/item/organ/internal/brain/cephalon - name = "cephalon mass" - parent_organ = BP_TORSO - vital = TRUE - -/obj/item/organ/internal/brain/cephalon/Initialize(mapload) - . = ..() - spawn(30 SECONDS) // FBP Dionaea need some way to be disassembled through surgery, if absolutely necessary. - if(!owner.isSynthetic()) - vital = FALSE - -/obj/item/organ/internal/brain/cephalon/robotize() - return - -/obj/item/organ/internal/brain/cephalon/mechassist() - return - -/obj/item/organ/internal/brain/cephalon/digitize() - return - -/obj/item/organ/internal/brain/cephalon/removed(var/mob/living/user, var/skip_nymph) - if(robotic >= ORGAN_ROBOT) - return ..() - var/mob/living/carbon/human/H = owner - ..() - if(!istype(H) || !H.organs || !H.organs.len) - H.death() - if(prob(50) && !skip_nymph && spawn_diona_nymph(get_turf(src))) - qdel(src) - /obj/item/organ/external/head/no_eyes/diona max_damage = 50 min_broken_damage = 25 - cannot_break = 1 + cannot_break = TRUE amputation_point = "branch" joint = "structural ligament" dislocated = -1 - vital = 0 + vital = FALSE slot_flags = SLOT_BELT diff --git a/code/modules/organs/subtypes/shadekin.dm b/code/modules/organs/external/species/shadekin.dm similarity index 84% rename from code/modules/organs/subtypes/shadekin.dm rename to code/modules/organs/external/species/shadekin.dm index 9d22d0e57d7..9ef3c6c2969 100644 --- a/code/modules/organs/subtypes/shadekin.dm +++ b/code/modules/organs/external/species/shadekin.dm @@ -1,11 +1,3 @@ -/obj/item/organ/internal/brain/shadekin - can_assist = FALSE - - var/dark_energy = 100 - var/max_dark_energy = 100 - var/dark_energy_infinite = FALSE - - //! Blackeyed limbs. /obj/item/organ/external/chest/crewkin diff --git a/code/modules/organs/external/species/slime.dm b/code/modules/organs/external/species/slime.dm new file mode 100644 index 00000000000..a66a7a105e4 --- /dev/null +++ b/code/modules/organs/external/species/slime.dm @@ -0,0 +1,69 @@ +/obj/item/organ/external/chest/unbreakable/slime + nonsolid = 1 + max_damage = 50 + encased = 0 + spread_dam = 1 + transparent = 1 + +/obj/item/organ/external/groin/unbreakable/slime + nonsolid = 1 + max_damage = 30 + spread_dam = 1 + transparent = 1 + +/obj/item/organ/external/arm/unbreakable/slime + nonsolid = 1 + max_damage = 20 + spread_dam = 1 + transparent = 1 + +/obj/item/organ/external/arm/right/unbreakable/slime + nonsolid = 1 + max_damage = 20 + spread_dam = 1 + transparent = 1 + +/obj/item/organ/external/leg/unbreakable/slime + nonsolid = 1 + max_damage = 20 + spread_dam = 1 + transparent = 1 + +/obj/item/organ/external/leg/right/unbreakable/slime + nonsolid = 1 + max_damage = 20 + spread_dam = 1 + transparent = 1 + +/obj/item/organ/external/foot/unbreakable/slime + nonsolid = 1 + max_damage = 20 + spread_dam = 1 + transparent = 1 + +/obj/item/organ/external/foot/right/unbreakable/slime + nonsolid = 1 + max_damage = 20 + spread_dam = 1 + transparent = 1 + +/obj/item/organ/external/hand/unbreakable/slime + nonsolid = 1 + max_damage = 20 + spread_dam = 1 + transparent = 1 + +/obj/item/organ/external/hand/right/unbreakable/slime + nonsolid = 1 + max_damage = 20 + spread_dam = 1 + transparent = 1 + +/obj/item/organ/external/head/unbreakable/slime //They don't need this anymore. + nonsolid = 1 + cannot_gib = 0 + vital = 0 + max_damage = 30 + encased = 0 + spread_dam = 1 + transparent = 1 diff --git a/code/modules/organs/subtypes/teshari.dm b/code/modules/organs/external/species/teshari.dm similarity index 100% rename from code/modules/organs/subtypes/teshari.dm rename to code/modules/organs/external/species/teshari.dm diff --git a/code/modules/organs/external/species/unathi.dm b/code/modules/organs/external/species/unathi.dm new file mode 100644 index 00000000000..793156332c7 --- /dev/null +++ b/code/modules/organs/external/species/unathi.dm @@ -0,0 +1,16 @@ +/obj/item/organ/external/chest/unathi + max_damage = 100 + min_broken_damage = 40 + encased = "upper ribplates" + +/obj/item/organ/external/groin/unathi + max_damage = 100 + min_broken_damage = 40 + encased = "lower ribplates" + +/obj/item/organ/external/head/unathi + max_damage = 75 + min_broken_damage = 35 + eye_icon = "eyes_s" + force = 5 + throwforce = 10 diff --git a/code/modules/organs/external/species/xenos.dm b/code/modules/organs/external/species/xenos.dm new file mode 100644 index 00000000000..9604a3e71fb --- /dev/null +++ b/code/modules/organs/external/species/xenos.dm @@ -0,0 +1,74 @@ +// XENOMORPH EXTERNAL ORGANS + +/obj/item/organ/external/chest/unseverable/xeno + cannot_gib = TRUE + cannot_amputate = TRUE + thick_skin = TRUE + +/obj/item/organ/external/groin/unseverable/xeno + cannot_gib = TRUE + cannot_amputate = TRUE + encased = TRUE + thick_skin = TRUE + +/obj/item/organ/external/arm/unseverable/xeno + cannot_gib = TRUE + cannot_amputate = TRUE + stapled_nerves = TRUE + encased = TRUE + thick_skin = TRUE + +/obj/item/organ/external/arm/right/unseverable/xeno + cannot_gib = TRUE + cannot_amputate = TRUE + stapled_nerves = TRUE + encased = TRUE + thick_skin = TRUE + +/obj/item/organ/external/leg/unseverable/xeno + cannot_gib = TRUE + cannot_amputate = TRUE + stapled_nerves = TRUE + encased = TRUE + thick_skin = TRUE + +/obj/item/organ/external/leg/right/unseverable/xeno + cannot_gib = TRUE + cannot_amputate = TRUE + stapled_nerves = TRUE + encased = TRUE + thick_skin = TRUE + +/obj/item/organ/external/foot/unseverable/xeno + cannot_gib = TRUE + cannot_amputate = TRUE + stapled_nerves = TRUE + encased = TRUE + thick_skin = TRUE + +/obj/item/organ/external/foot/right/unseverable/xeno + cannot_gib = TRUE + cannot_amputate = TRUE + stapled_nerves = TRUE + encased = TRUE + thick_skin = TRUE + +/obj/item/organ/external/hand/unseverable/xeno + cannot_gib = TRUE + cannot_amputate = TRUE + stapled_nerves = TRUE + encased = TRUE + thick_skin = TRUE + +/obj/item/organ/external/hand/right/unseverable/xeno + cannot_gib = TRUE + cannot_amputate = TRUE + stapled_nerves = TRUE + encased = TRUE + thick_skin = TRUE + +/obj/item/organ/external/head/unseverable/xeno + cannot_gib = TRUE + cannot_amputate = TRUE + thick_skin = TRUE + eye_icon = "blank_eyes" diff --git a/code/modules/organs/subtypes/standard.dm b/code/modules/organs/external/standard.dm similarity index 96% rename from code/modules/organs/subtypes/standard.dm rename to code/modules/organs/external/standard.dm index 0a8b4ca9c40..2f352a33d42 100644 --- a/code/modules/organs/subtypes/standard.dm +++ b/code/modules/organs/external/standard.dm @@ -12,12 +12,12 @@ min_broken_damage = 35 w_class = ITEMSIZE_HUGE body_part = UPPER_TORSO - vital = 1 + vital = TRUE amputation_point = "spine" joint = "neck" dislocated = -1 - gendered_icon = 1 - cannot_amputate = 1 + gendered_icon = TRUE + cannot_amputate = TRUE parent_organ = null encased = "ribcage" organ_rel_size = 70 @@ -54,13 +54,13 @@ min_broken_damage = 35 w_class = ITEMSIZE_LARGE body_part = LOWER_TORSO - vital = 1 + vital = TRUE parent_organ = BP_TORSO amputation_point = "lumbar" joint = "hip" dislocated = -1 - gendered_icon = 1 - cannot_amputate = 1 + gendered_icon = TRUE + cannot_amputate = TRUE organ_rel_size = 30 /obj/item/organ/external/groin/handle_germ_effects() @@ -87,7 +87,7 @@ parent_organ = BP_TORSO joint = "left elbow" amputation_point = "left shoulder" - can_grasp = 1 + can_grasp = TRUE force = 7 throwforce = 10 @@ -128,7 +128,7 @@ parent_organ = BP_GROIN joint = "left knee" amputation_point = "left hip" - can_stand = 1 + can_stand = TRUE force = 10 throwforce = 12 @@ -167,7 +167,7 @@ parent_organ = BP_L_LEG joint = "left ankle" amputation_point = "left ankle" - can_stand = 1 + can_stand = TRUE force = 3 throwforce = 6 @@ -211,7 +211,7 @@ parent_organ = BP_L_ARM joint = "left wrist" amputation_point = "left wrist" - can_grasp = 1 + can_grasp = TRUE organ_rel_size = 10 base_miss_chance = 50 force = 3 @@ -257,20 +257,20 @@ min_broken_damage = 35 w_class = ITEMSIZE_NORMAL body_part = HEAD - vital = 1 + vital = TRUE parent_organ = BP_TORSO joint = "jaw" amputation_point = "neck" - gendered_icon = 1 + gendered_icon = TRUE cannot_gib = TRUE encased = "skull" base_miss_chance = 40 - var/can_intake_reagents = 1 - var/eye_icon = "eyes_s" force = 3 throwforce = 7 - var/eyes_over_markings = FALSE + var/can_intake_reagents = TRUE + var/eyes_over_markings = FALSE + var/eye_icon = "eyes_s" var/eye_icon_location = 'icons/mob/human_face.dmi' /obj/item/organ/external/head/Initialize(mapload) @@ -278,7 +278,7 @@ cannot_gib = FALSE return ..() -/obj/item/organ/external/head/robotize(var/company, var/skip_prosthetics, var/keep_organs) +/obj/item/organ/external/head/robotize(company, skip_prosthetics, keep_organs) return ..(company, skip_prosthetics, 1) /obj/item/organ/external/head/removed() diff --git a/code/modules/organs/subtypes/standard_vr.dm b/code/modules/organs/external/standard_vr.dm similarity index 94% rename from code/modules/organs/subtypes/standard_vr.dm rename to code/modules/organs/external/standard_vr.dm index cf1bb09f09c..d6169a173eb 100644 --- a/code/modules/organs/subtypes/standard_vr.dm +++ b/code/modules/organs/external/standard_vr.dm @@ -1,7 +1,7 @@ -//For custom heads with custom parts since the base code is restricted to a single icon file. +//! ## Leave everything here as it is for now since this is using unique behavior. +/// For custom heads with custom parts since the base code is restricted to a single icon file. /obj/item/organ/external/head/vr/get_icon() - ..() overlays.Cut() if(!owner || !owner.species) diff --git a/code/modules/organs/organ_stump.dm b/code/modules/organs/external/stump.dm similarity index 100% rename from code/modules/organs/organ_stump.dm rename to code/modules/organs/external/stump.dm diff --git a/code/modules/organs/wound.dm b/code/modules/organs/external/wounds/wound.dm similarity index 100% rename from code/modules/organs/wound.dm rename to code/modules/organs/external/wounds/wound.dm diff --git a/code/modules/organs/external_defines.dm b/code/modules/organs/external_defines.dm new file mode 100644 index 00000000000..1b9b01ddf8b --- /dev/null +++ b/code/modules/organs/external_defines.dm @@ -0,0 +1,137 @@ +/obj/item/organ/external + name = "external" + max_damage = 0 + min_broken_damage = 30 + dir = SOUTH + organ_tag = "limb" + + +//! ## STRINGS + /// Fracture description if any. + var/broken_description + /// Modifier used for generating the on-mob damage overlay for this limb. + var/damage_state = "00" + + +//! ## DAMAGE VARS + /// Multiplier for incoming brute damage. + var/brute_mod = 1 + /// As above for burn. + var/burn_mod = 1 + /// EMP damage multiplier + var/emp_mod = 1 + /// Actual current brute damage. + var/brute_dam = 0 + /// Actual current burn damage. + var/burn_dam = 0 + /// Used in healing/processing calculations. + var/last_dam = -1 + + /// If damage done to this organ spreads to connected organs. + var/spread_dam = FALSE + /// If a needle has a chance to fail to penetrate. + var/thick_skin = FALSE + /// If a prosthetic limb is emagged, it will detonate when it fails. + var/sabotaged = FALSE + + /// Chance of missing. + var/base_miss_chance = 20 + + +//! ## APPEARANCE VARS + /// Snowflake warning, reee. Used for slime limbs. + var/nonsolid + /// Also for slimes. Used for transparent limbs. + var/transparent = 0 + /// Icon state base. + var/icon_name = null + /// Part flag + var/body_part = null + /// Used in mob overlay layering calculations. + var/icon_position = 0 + /// Used when caching robolimb icons. + var/model + /// Used to force override of species-specific limb icons (for prosthetics). Also used for any limbs chopped from a simple mob, and then attached to humans. + var/force_icon + /// Used to force the override of the icon-key generated using the species. Must be used in tandem with the above. + var/force_icon_key + /// Cached icon for use in mob overlays. + var/icon/mob_icon + /// Whether or not the icon state appends a gender. + var/gendered_icon = 0 + /// Skin tone. + var/s_tone + /// Skin colour + var/list/s_col + /// How the skin colour is applied. + var/s_col_blend = ICON_ADD + /// Hair colour + var/list/h_col + /// Icon blend for body hair if any. + var/body_hair + var/mob/living/applied_pressure + /// Markings (body_markings) to apply to the icon + var/list/markings = list() + + +//! ## STRUCTURAL VARS + /// Master-limb. + var/obj/item/organ/external/parent + /// Sub-limbs. + var/list/children = list() + /// Internal organs of this body part + var/list/internal_organs = list() + /// Currently implanted objects. + var/list/implants = list() + /// Relative size of the organ. + var/organ_rel_size = 25 + var/atom/movable/splinted + + +//! ## WOUND VARS + /// How often wounds should be updated, a higher number means less often + var/wound_update_accuracy = 1 + /// Wound datum list. + var/list/wounds = list() + /// Number of wounds, which is NOT wounds.len! + var/number_wounds = 0 + + +//! ## JOINT/STATE VARS + /// It would be more appropriate if these two were named "affects_grasp" and "affects_stand" at this point + var/can_grasp + /// Modifies stance tally/ability to stand. + var/can_stand + /// Scarred/burned beyond recognition. + var/disfigured = FALSE + /// Impossible to amputate. + var/cannot_amputate + /// Impossible to fracture. + var/cannot_break + /// Impossible to gib, distinct from amputation. + var/cannot_gib + /// Descriptive string used in dislocation. + var/joint = "joint" + /// Descriptive string used in amputation. + var/amputation_point + /// If you target a joint, you can dislocate the limb, impairing it's usefulness and causing pain. + var/dislocated = FALSE + /// Needs to be opened with a saw to access the organs. + var/encased + + +//! ## SURGERY VARS + var/open = FALSE + var/stage = FALSE + var/cavity = FALSE + + /// Surgical repair stage for burn. + var/burn_stage = 0 + /// Surgical repair stage for brute. + var/brute_stage = 0 + + /// HUD element variable, see organ_icon.dm get_damage_hud_image() + var/image/hud_damage_image + + /// makes this dumb as fuck mechanic slightly less awful - records queued syringe infections instead of a spawn() + var/syringe_infection_queued diff --git a/code/modules/organs/internal/organ_internal.dm b/code/modules/organs/internal/_internal.dm similarity index 88% rename from code/modules/organs/internal/organ_internal.dm rename to code/modules/organs/internal/_internal.dm index d4404c8215f..a0590be56e7 100644 --- a/code/modules/organs/internal/organ_internal.dm +++ b/code/modules/organs/internal/_internal.dm @@ -1,10 +1,3 @@ - -/**************************************************** - 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) @@ -60,4 +53,3 @@ if(. >= 3 && antibiotics < ANTIBIO_OD) //INFECTION_LEVEL_THREE if (prob(50)) take_damage(1,silent=prob(15)) - diff --git a/code/modules/organs/internal/adherent.dm b/code/modules/organs/internal/species/adherent.dm similarity index 95% rename from code/modules/organs/internal/adherent.dm rename to code/modules/organs/internal/species/adherent.dm index 1df735f5a7a..7a2f130a43d 100644 --- a/code/modules/organs/internal/adherent.dm +++ b/code/modules/organs/internal/species/adherent.dm @@ -1,8 +1,4 @@ -///Don't ask why it's here, I just know it won't work without it. This is my personnal coconut.jpg - Papalus -//GLOBAL_LIST_INIT(full_alphabet, list("a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z")) -//#define PROTOCOL_ARTICLE "Protocol article [rand(100,999)]-[uppertext(pick(GLOB.full_alphabet))] subsection #[rand(10,99)]" - /obj/item/organ/internal/brain/adherent name = "mentality matrix" desc = "The self-contained, self-supporting internal 'brain' of an Adherent unit." diff --git a/code/modules/organs/internal/species/diona.dm b/code/modules/organs/internal/species/diona.dm new file mode 100644 index 00000000000..7bbe87a19a9 --- /dev/null +++ b/code/modules/organs/internal/species/diona.dm @@ -0,0 +1,101 @@ + +/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/internal/diona/removed(var/mob/living/user, var/skip_nymph) + if(robotic >= ORGAN_ROBOT) + return ..() + var/mob/living/carbon/human/H = owner + ..() + if(!istype(H) || !H.organs || !H.organs.len) + H.death() + if(prob(50) && !skip_nymph && spawn_diona_nymph(get_turf(src))) + qdel(src) + +/obj/item/organ/internal/diona/process(delta_time) + return + +/obj/item/organ/internal/diona/strata + name = "neural strata" + parent_organ = BP_TORSO + organ_tag = O_STRATA + +/obj/item/organ/internal/diona/bladder + name = "gas bladder" + parent_organ = BP_HEAD + organ_tag = O_GBLADDER + +/obj/item/organ/internal/diona/polyp + name = "polyp segment" + parent_organ = BP_GROIN + organ_tag = O_POLYP + +/obj/item/organ/internal/diona/ligament + name = "anchoring ligament" + parent_organ = BP_GROIN + organ_tag = O_ANCHOR + +/obj/item/organ/internal/diona/node + name = "receptor node" + parent_organ = BP_HEAD + organ_tag = O_RESPONSE + +/obj/item/organ/internal/diona/nutrients + name = O_NUTRIENT + parent_organ = BP_TORSO + organ_tag = O_NUTRIENT + +// These are different to the standard diona organs as they have a purpose in other +// species (absorbing radiation and light respectively) +/obj/item/organ/internal/diona/nutrients + name = O_NUTRIENT + organ_tag = O_NUTRIENT + icon = 'icons/mob/alien.dmi' + icon_state = "claw" + +/obj/item/organ/internal/diona/nutrients/removed(mob/user) + return ..(user, 1) + +/obj/item/organ/internal/diona/node + name = "response node" + parent_organ = BP_HEAD + organ_tag = O_RESPONSE + icon = 'icons/mob/alien.dmi' + icon_state = "claw" + +/obj/item/organ/internal/diona/node/removed() + return + +// A 'brain' for the tree, still becomes a mindless nymph when removed like any other. Satisfies the FBP code. +/obj/item/organ/internal/brain/cephalon + name = "cephalon mass" + parent_organ = BP_TORSO + vital = TRUE + +/obj/item/organ/internal/brain/cephalon/Initialize(mapload) + . = ..() + spawn(30 SECONDS) // FBP Dionaea need some way to be disassembled through surgery, if absolutely necessary. + if(!owner.isSynthetic()) + vital = FALSE + +/obj/item/organ/internal/brain/cephalon/robotize() + return + +/obj/item/organ/internal/brain/cephalon/mechassist() + return + +/obj/item/organ/internal/brain/cephalon/digitize() + return + +/obj/item/organ/internal/brain/cephalon/removed(var/mob/living/user, var/skip_nymph) + if(robotic >= ORGAN_ROBOT) + return ..() + var/mob/living/carbon/human/H = owner + ..() + if(!istype(H) || !H.organs || !H.organs.len) + H.death() + if(prob(50) && !skip_nymph && spawn_diona_nymph(get_turf(src))) + qdel(src) diff --git a/code/modules/organs/subtypes/replicant.dm b/code/modules/organs/internal/species/replicant.dm similarity index 100% rename from code/modules/organs/subtypes/replicant.dm rename to code/modules/organs/internal/species/replicant.dm diff --git a/code/modules/organs/internal/species/shadekin.dm b/code/modules/organs/internal/species/shadekin.dm new file mode 100644 index 00000000000..e530adeb854 --- /dev/null +++ b/code/modules/organs/internal/species/shadekin.dm @@ -0,0 +1,6 @@ +/obj/item/organ/internal/brain/shadekin + can_assist = FALSE + + var/dark_energy = 100 + var/max_dark_energy = 100 + var/dark_energy_infinite = FALSE diff --git a/code/modules/organs/subtypes/slime.dm b/code/modules/organs/internal/species/slime.dm similarity index 64% rename from code/modules/organs/subtypes/slime.dm rename to code/modules/organs/internal/species/slime.dm index 9337cf678bf..bda0ed85bfe 100644 --- a/code/modules/organs/subtypes/slime.dm +++ b/code/modules/organs/internal/species/slime.dm @@ -1,73 +1,3 @@ -/obj/item/organ/external/chest/unbreakable/slime - nonsolid = 1 - max_damage = 50 - encased = 0 - spread_dam = 1 - transparent = 1 - -/obj/item/organ/external/groin/unbreakable/slime - nonsolid = 1 - max_damage = 30 - spread_dam = 1 - transparent = 1 - -/obj/item/organ/external/arm/unbreakable/slime - nonsolid = 1 - max_damage = 20 - spread_dam = 1 - transparent = 1 - -/obj/item/organ/external/arm/right/unbreakable/slime - nonsolid = 1 - max_damage = 20 - spread_dam = 1 - transparent = 1 - -/obj/item/organ/external/leg/unbreakable/slime - nonsolid = 1 - max_damage = 20 - spread_dam = 1 - transparent = 1 - -/obj/item/organ/external/leg/right/unbreakable/slime - nonsolid = 1 - max_damage = 20 - spread_dam = 1 - transparent = 1 - -/obj/item/organ/external/foot/unbreakable/slime - nonsolid = 1 - max_damage = 20 - spread_dam = 1 - transparent = 1 - -/obj/item/organ/external/foot/right/unbreakable/slime - nonsolid = 1 - max_damage = 20 - spread_dam = 1 - transparent = 1 - -/obj/item/organ/external/hand/unbreakable/slime - nonsolid = 1 - max_damage = 20 - spread_dam = 1 - transparent = 1 - -/obj/item/organ/external/hand/right/unbreakable/slime - nonsolid = 1 - max_damage = 20 - spread_dam = 1 - transparent = 1 - -/obj/item/organ/external/head/unbreakable/slime //They don't need this anymore. - nonsolid = 1 - cannot_gib = 0 - vital = 0 - max_damage = 30 - encased = 0 - spread_dam = 1 - transparent = 1 - /* * Internal Slime organs. */ diff --git a/code/modules/organs/subtypes/subspecies_graver.dm b/code/modules/organs/internal/species/subspecies_graver.dm similarity index 100% rename from code/modules/organs/subtypes/subspecies_graver.dm rename to code/modules/organs/internal/species/subspecies_graver.dm diff --git a/code/modules/organs/subtypes/subspecies_spacer.dm b/code/modules/organs/internal/species/subspecies_spacer.dm similarity index 100% rename from code/modules/organs/subtypes/subspecies_spacer.dm rename to code/modules/organs/internal/species/subspecies_spacer.dm diff --git a/code/modules/organs/subtypes/unathi.dm b/code/modules/organs/internal/species/unathi.dm similarity index 75% rename from code/modules/organs/subtypes/unathi.dm rename to code/modules/organs/internal/species/unathi.dm index 9fd50293b1e..7005bf12f16 100644 --- a/code/modules/organs/subtypes/unathi.dm +++ b/code/modules/organs/internal/species/unathi.dm @@ -1,21 +1,3 @@ -/obj/item/organ/external/chest/unathi - max_damage = 100 - min_broken_damage = 40 - encased = "upper ribplates" - -/obj/item/organ/external/groin/unathi - max_damage = 100 - min_broken_damage = 40 - encased = "lower ribplates" - -/obj/item/organ/external/head/unathi - max_damage = 75 - min_broken_damage = 35 - eye_icon = "eyes_s" - force = 5 - throwforce = 10 - - /obj/item/organ/internal/heart/unathi icon_state = "unathi_heart-on" dead_icon = "unath_heart-off" diff --git a/code/modules/organs/subtypes/vox.dm b/code/modules/organs/internal/species/vox.dm similarity index 96% rename from code/modules/organs/subtypes/vox.dm rename to code/modules/organs/internal/species/vox.dm index c8872892d3a..f5e1b8ca46d 100644 --- a/code/modules/organs/subtypes/vox.dm +++ b/code/modules/organs/internal/species/vox.dm @@ -1,5 +1,5 @@ /obj/item/organ/external/head/vox - eye_icon = "vox_eyes_s" + eye_icon = "vox_eyes_s_old" //vox got different organs within. This will also help with regular surgeons knowing the organs within an alien as alien as vox. /obj/item/organ/internal/brain/vox diff --git a/code/modules/organs/subtypes/xenochimera.dm b/code/modules/organs/internal/species/xenochimera.dm similarity index 100% rename from code/modules/organs/subtypes/xenochimera.dm rename to code/modules/organs/internal/species/xenochimera.dm diff --git a/code/modules/organs/subtypes/xenos.dm b/code/modules/organs/internal/species/xenos.dm similarity index 73% rename from code/modules/organs/subtypes/xenos.dm rename to code/modules/organs/internal/species/xenos.dm index 23ed9715169..f5314af880b 100644 --- a/code/modules/organs/subtypes/xenos.dm +++ b/code/modules/organs/internal/species/xenos.dm @@ -148,78 +148,3 @@ var/mob/living/carbon/human/H = owner if(H.species.blood_color) add_atom_colour(H.species.blood_color, FIXED_COLOUR_PRIORITY) - -// XENOMORPH EXTERNAL ORGANS - -/obj/item/organ/external/chest/unseverable/xeno - cannot_gib = 1 - cannot_amputate = 1 - thick_skin = TRUE - -/obj/item/organ/external/groin/unseverable/xeno - cannot_gib = 1 - cannot_amputate = 1 - encased = TRUE - thick_skin = TRUE - -/obj/item/organ/external/arm/unseverable/xeno - cannot_gib = 1 - cannot_amputate = 1 - stapled_nerves = TRUE - encased = TRUE - thick_skin = TRUE - -/obj/item/organ/external/arm/right/unseverable/xeno - cannot_gib = 1 - cannot_amputate = 1 - stapled_nerves = TRUE - encased = TRUE - thick_skin = TRUE - -/obj/item/organ/external/leg/unseverable/xeno - cannot_gib = 1 - cannot_amputate = 1 - stapled_nerves = TRUE - encased = TRUE - thick_skin = TRUE - -/obj/item/organ/external/leg/right/unseverable/xeno - cannot_gib = 1 - cannot_amputate = 1 - stapled_nerves = TRUE - encased = TRUE - thick_skin = TRUE - -/obj/item/organ/external/foot/unseverable/xeno - cannot_gib = 1 - cannot_amputate = 1 - stapled_nerves = TRUE - encased = TRUE - thick_skin = TRUE - -/obj/item/organ/external/foot/right/unseverable/xeno - cannot_gib = 1 - cannot_amputate = 1 - stapled_nerves = TRUE - encased = TRUE - thick_skin = TRUE - -/obj/item/organ/external/hand/unseverable/xeno - cannot_gib = 1 - cannot_amputate = 1 - stapled_nerves = TRUE - encased = TRUE - thick_skin = TRUE - -/obj/item/organ/external/hand/right/unseverable/xeno - cannot_gib = 1 - cannot_amputate = 1 - stapled_nerves = TRUE - encased = TRUE - thick_skin = TRUE - -/obj/item/organ/external/head/unseverable/xeno - cannot_gib = 1 - cannot_amputate = 1 - thick_skin = TRUE - eye_icon = "blank_eyes" diff --git a/code/modules/organs/internal_defines.dm b/code/modules/organs/internal_defines.dm new file mode 100644 index 00000000000..61679013d86 --- /dev/null +++ b/code/modules/organs/internal_defines.dm @@ -0,0 +1,8 @@ +/**************************************************** + INTERNAL ORGANS DEFINES +****************************************************/ +/obj/item/organ/internal + /// Icon to use when the organ has died. + var/dead_icon + +// Yep... That's it. - @Zandario diff --git a/code/modules/organs/organ.dm b/code/modules/organs/organ.dm index 394ece712b2..3fb78bd45c7 100644 --- a/code/modules/organs/organ.dm +++ b/code/modules/organs/organ.dm @@ -1,78 +1,3 @@ -var/list/organ_cache = list() - -/obj/item/organ - name = "organ" - icon = 'icons/obj/surgery.dmi' - germ_level = 0 - drop_sound = 'sound/items/drop/flesh.ogg' - pickup_sound = 'sound/items/pickup/flesh.ogg' - - //* Strings. *// - /// Unique identifier. - var/organ_tag = "organ" - /// The organ holding this object. - var/parent_organ = BP_TORSO - - //* Status tracking. *// - /// Various status flags - var/status = 0 - /// Lose a vital limb, die immediately. - var/vital - /// Current damage to the organ - var/damage = 0 - /// Flag for what kind of robotic organ, if valid. - var/robotic = 0 - /// If true, this organ can't feel pain. - var/stapled_nerves = FALSE - - //* Reference data. *// - /// Current mob owning the organ. - var/mob/living/carbon/human/owner - /// Transplant match data. - var/list/transplant_data - /// Trauma data for forensics. - var/list/autopsy_data = list() - /// Traces of chemicals in the organ. - var/list/trace_chemicals = list() - /// Original DNA. - var/datum/dna/dna - /// Original species. - var/datum/species/species - var/s_base - - //* Damage vars. *// - /// Damage before considered bruised - var/min_bruised_damage = 10 - /// Damage before becoming broken - var/min_broken_damage = 30 - /// Damage cap - var/max_damage - /// Can this organ reject? - var/can_reject = TRUE - /// Is this organ already being rejected? - var/rejecting - /// Can this organ decay at all? - var/decays = TRUE - /// If true, prevent organ decay. - var/preserved = FALSE - - //* Language vars. Putting them here in case we decide to do something crazy with sign-or-other-nonverbal languages. - var/list/will_assist_languages = list() - var/list/datum/language/assists_languages = list() - - //* Organ verb vars. - /// Verbs added by the organ when present in the body. - var/list/organ_verbs - /// Is the parent supposed to be organic, robotic, assisted? - var/list/target_parent_classes = list() - /// Will the organ give its verbs when it isn't a perfect match? I.E., assisted in organic, synthetic in organic. - var/forgiving_class = TRUE - - /// Can we butcher this organ. - var/butcherable = TRUE - /// What does butchering, if possible, make? - var/meat_type - /obj/item/organ/Initialize(mapload, internal) . = ..() var/mob/living/holder = loc diff --git a/code/modules/organs/organ_external_vr.dm b/code/modules/organs/organ_external_vr.dm deleted file mode 100644 index 0e3fb07d9ee..00000000000 --- a/code/modules/organs/organ_external_vr.dm +++ /dev/null @@ -1,15 +0,0 @@ -//Sideways override for nanoform limbs (ugh) -/obj/item/organ/external/robotize(var/company, var/skip_prosthetics = FALSE, var/keep_organs = FALSE) - var/original_robotic = robotic - if(original_robotic >= ORGAN_NANOFORM) - var/o_encased = encased - var/o_max_damage = max_damage - var/o_min_broken_damage = min_broken_damage - robotic = FALSE - . = ..(company = company, keep_organs = TRUE) - robotic = original_robotic - encased = o_encased - max_damage = o_max_damage - min_broken_damage = o_min_broken_damage - else - return ..() diff --git a/code/modules/organs/organ_internal.dm b/code/modules/organs/organ_internal.dm deleted file mode 100644 index b5e965734a7..00000000000 --- a/code/modules/organs/organ_internal.dm +++ /dev/null @@ -1,41 +0,0 @@ - -/**************************************************** - 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. -// Heart is defined in heart.dm -// Lungs are defined in lungs.dm -// Kidneys is defined in kidneys.dm -// Eyes are defined in eyes.dm -// Liver is defined in liver.dm. The process here was different than the process in liver.dm, so I just kept the one in liver.dm -// Appendix is defined in appendix.dm diff --git a/code/modules/organs/subtypes/vox_vr.dm b/code/modules/organs/subtypes/vox_vr.dm deleted file mode 100644 index f9c90229a5c..00000000000 --- a/code/modules/organs/subtypes/vox_vr.dm +++ /dev/null @@ -1,2 +0,0 @@ -/obj/item/organ/external/head/vox //Enables old vox eyes. - eye_icon = "vox_eyes_s_old"