From 79463492946ac1d01cb392ebc36fba9c29fa03f4 Mon Sep 17 00:00:00 2001 From: Anewbe Date: Tue, 12 Jul 2016 22:32:09 -0500 Subject: [PATCH] Splits internal organs into separate files --- code/modules/organs/internal/appendix.dm | 55 +++++++++++++ code/modules/organs/internal/eyes.dm | 78 +++++++++++++++++++ code/modules/organs/internal/heart.dm | 8 ++ code/modules/organs/internal/kidneys.dm | 25 ++++++ code/modules/organs/internal/liver.dm | 55 +++++++++++++ code/modules/organs/internal/lungs.dm | 26 +++++++ .../modules/organs/internal/organ_internal.dm | 36 +++++++++ polaris.dme | 8 +- 8 files changed, 290 insertions(+), 1 deletion(-) create mode 100644 code/modules/organs/internal/appendix.dm create mode 100644 code/modules/organs/internal/eyes.dm create mode 100644 code/modules/organs/internal/heart.dm create mode 100644 code/modules/organs/internal/kidneys.dm create mode 100644 code/modules/organs/internal/liver.dm create mode 100644 code/modules/organs/internal/lungs.dm create mode 100644 code/modules/organs/internal/organ_internal.dm diff --git a/code/modules/organs/internal/appendix.dm b/code/modules/organs/internal/appendix.dm new file mode 100644 index 00000000000..b3fdc28bc2d --- /dev/null +++ b/code/modules/organs/internal/appendix.dm @@ -0,0 +1,55 @@ +#define PROCESS_ACCURACY 10 + +/obj/item/organ/internal/appendix + name = "appendix" + icon_state = "appendix" + parent_organ = BP_GROIN + organ_tag = "appendix" + var/inflamed = 0 + var/inflame_progress = 0 + +/mob/living/carbon/human/proc/appendicitis() + if(stat == DEAD) + return 0 + var/obj/item/organ/internal/appendix/A = internal_organs_by_name[O_APPENDIX] + if(istype(A) && !A.inflamed) + A.inflamed = 1 + return 1 + return 0 + +/obj/item/organ/internal/appendix/process() + if(!inflamed || !owner) + return + + if(++inflame_progress > 200) + ++inflamed + inflame_progress = 0 + + if(inflamed == 1) + if(prob(5)) + owner << "You feel a stinging pain in your abdomen!" + owner.emote("me", 1, "winces slightly.") + if(inflamed > 1) + if(prob(3)) + owner << "You feel a stabbing pain in your abdomen!" + owner.emote("me", 1, "winces painfully.") + owner.adjustToxLoss(1) + if(inflamed > 2) + if(prob(1)) + owner.vomit() + if(inflamed > 3) + if(prob(1)) + owner << "Your abdomen is a world of pain!" + owner.Weaken(10) + + var/obj/item/organ/external/groin = owner.get_organ(BP_GROIN) + var/datum/wound/W = new /datum/wound/internal_bleeding(20) + owner.adjustToxLoss(25) + groin.wounds += W + inflamed = 0 + +/obj/item/organ/internal/appendix/removed() + if(inflamed) + icon_state = "appendixinflamed" + name = "inflamed appendix" + ..() \ No newline at end of file diff --git a/code/modules/organs/internal/eyes.dm b/code/modules/organs/internal/eyes.dm new file mode 100644 index 00000000000..ddde8726620 --- /dev/null +++ b/code/modules/organs/internal/eyes.dm @@ -0,0 +1,78 @@ +#define PROCESS_ACCURACY 10 + +/obj/item/organ/internal/eyes + name = "eyeballs" + icon_state = "eyes" + gender = PLURAL + organ_tag = O_EYES + parent_organ = BP_HEAD + var/list/eye_colour = list(0,0,0) + +/obj/item/organ/internal/eyes/robotize() + ..() + name = "optical sensor" + icon = 'icons/obj/robot_component.dmi' + icon_state = "camera" + dead_icon = "camera_broken" + verbs |= /obj/item/organ/internal/eyes/proc/change_eye_color + +/obj/item/organ/internal/eyes/robot + name = "optical sensor" + +/obj/item/organ/internal/eyes/robot/New() + ..() + robotize() + +/obj/item/organ/internal/eyes/proc/change_eye_color() + set name = "Change Eye Color" + set desc = "Changes your robotic eye color instantly." + set category = "IC" + set src in usr + + var/current_color = rgb(eye_colour[1],eye_colour[2],eye_colour[3]) + var/new_color = input("Pick a new color for your eyes.","Eye Color", current_color) as null|color + if(new_color && owner) + // input() supplies us with a hex color, which we can't use, so we convert it to rbg values. + var/list/new_color_rgb_list = hex2rgb(new_color) + // First, update mob vars. + owner.r_eyes = new_color_rgb_list[1] + owner.g_eyes = new_color_rgb_list[2] + owner.b_eyes = new_color_rgb_list[3] + // Now sync the organ's eye_colour list. + update_colour() + // Finally, update the eye icon on the mob. + owner.update_eyes() + +/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( + owner.r_eyes ? owner.r_eyes : 0, + owner.g_eyes ? owner.g_eyes : 0, + owner.b_eyes ? owner.b_eyes : 0 + ) + +/obj/item/organ/internal/eyes/take_damage(amount, var/silent=0) + var/oldbroken = is_broken() + ..() + if(is_broken() && !oldbroken && owner && !owner.stat) + owner << "You go blind!" + +/obj/item/organ/internal/eyes/process() //Eye damage replaces the old eye_stat var. + ..() + if(!owner) + return + if(is_bruised()) + owner.eye_blurry = 20 + if(is_broken()) + owner.eye_blind = 20 \ No newline at end of file diff --git a/code/modules/organs/internal/heart.dm b/code/modules/organs/internal/heart.dm new file mode 100644 index 00000000000..99b7386403e --- /dev/null +++ b/code/modules/organs/internal/heart.dm @@ -0,0 +1,8 @@ +#define PROCESS_ACCURACY 10 + +/obj/item/organ/internal/heart + name = "heart" + icon_state = "heart-on" + organ_tag = O_HEART + parent_organ = BP_TORSO + dead_icon = "heart-off" \ No newline at end of file diff --git a/code/modules/organs/internal/kidneys.dm b/code/modules/organs/internal/kidneys.dm new file mode 100644 index 00000000000..5d3875ccf54 --- /dev/null +++ b/code/modules/organs/internal/kidneys.dm @@ -0,0 +1,25 @@ +#define PROCESS_ACCURACY 10 + +/obj/item/organ/internal/kidneys + name = "kidneys" + icon_state = "kidneys" + gender = PLURAL + organ_tag = O_KIDNEYS + parent_organ = BP_GROIN + +/obj/item/organ/internal/kidneys/process() + + ..() + + if(!owner) + return + + // Coffee is really bad for you with busted kidneys. + // This should probably be expanded in some way, but fucked if I know + // what else kidneys can process in our reagent list. + var/datum/reagent/coffee = locate(/datum/reagent/drink/coffee) in owner.reagents.reagent_list + if(coffee) + if(is_bruised()) + owner.adjustToxLoss(0.1 * PROCESS_ACCURACY) + else if(is_broken()) + owner.adjustToxLoss(0.3 * PROCESS_ACCURACY) \ No newline at end of file diff --git a/code/modules/organs/internal/liver.dm b/code/modules/organs/internal/liver.dm new file mode 100644 index 00000000000..ef989b7a558 --- /dev/null +++ b/code/modules/organs/internal/liver.dm @@ -0,0 +1,55 @@ +#define PROCESS_ACCURACY 10 + +/obj/item/organ/internal/liver + name = "liver" + icon_state = "liver" + organ_tag = "liver" + parent_organ = BP_GROIN + +/obj/item/organ/internal/liver/process() + + ..() + + if(!owner) + return + + if (germ_level > INFECTION_LEVEL_ONE) + if(prob(1)) + owner << "Your skin itches." + if (germ_level > INFECTION_LEVEL_TWO) + if(prob(1)) + spawn owner.vomit() + + if(owner.life_tick % PROCESS_ACCURACY == 0) + + //High toxins levels are dangerous + if(owner.getToxLoss() >= 60 && !owner.reagents.has_reagent("anti_toxin")) + //Healthy liver suffers on its own + if (src.damage < min_broken_damage) + src.damage += 0.2 * PROCESS_ACCURACY + //Damaged one shares the fun + else + var/obj/item/organ/internal/O = pick(owner.internal_organs) + if(O) + O.damage += 0.2 * PROCESS_ACCURACY + + //Detox can heal small amounts of damage + if (src.damage && src.damage < src.min_bruised_damage && owner.reagents.has_reagent("anti_toxin")) + src.damage -= 0.2 * PROCESS_ACCURACY + + if(src.damage < 0) + src.damage = 0 + + // Get the effectiveness of the liver. + var/filter_effect = 3 + if(is_bruised()) + filter_effect -= 1 + if(is_broken()) + filter_effect -= 2 + + // Do some reagent processing. + if(owner.chem_effects[CE_ALCOHOL_TOXIC]) + if(filter_effect < 3) + owner.adjustToxLoss(owner.chem_effects[CE_ALCOHOL_TOXIC] * 0.1 * PROCESS_ACCURACY) + else + take_damage(owner.chem_effects[CE_ALCOHOL_TOXIC] * 0.1 * PROCESS_ACCURACY, prob(1)) // Chance to warn them \ No newline at end of file diff --git a/code/modules/organs/internal/lungs.dm b/code/modules/organs/internal/lungs.dm new file mode 100644 index 00000000000..fae4bc5ee6b --- /dev/null +++ b/code/modules/organs/internal/lungs.dm @@ -0,0 +1,26 @@ +#define PROCESS_ACCURACY 10 + +/obj/item/organ/internal/lungs + name = "lungs" + icon_state = "lungs" + gender = PLURAL + organ_tag = O_LUNGS + parent_organ = BP_TORSO + +/obj/item/organ/internal/lungs/process() + ..() + + if(!owner) + return + + if (germ_level > INFECTION_LEVEL_ONE) + if(prob(5)) + owner.emote("cough") //respitory tract infection + + if(is_bruised()) + if(prob(2)) + spawn owner.emote("me", 1, "coughs up blood!") + owner.drip(10) + if(prob(4)) + spawn owner.emote("me", 1, "gasps for air!") + owner.losebreath += 15 \ No newline at end of file diff --git a/code/modules/organs/internal/organ_internal.dm b/code/modules/organs/internal/organ_internal.dm new file mode 100644 index 00000000000..100666caaaa --- /dev/null +++ b/code/modules/organs/internal/organ_internal.dm @@ -0,0 +1,36 @@ +#define PROCESS_ACCURACY 10 + +/**************************************************** + 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. \ No newline at end of file diff --git a/polaris.dme b/polaris.dme index aa6ae25e6d9..352bf17d265 100644 --- a/polaris.dme +++ b/polaris.dme @@ -1664,11 +1664,17 @@ #include "code\modules\organs\organ.dm" #include "code\modules\organs\organ_external.dm" #include "code\modules\organs\organ_icon.dm" -#include "code\modules\organs\organ_internal.dm" #include "code\modules\organs\organ_stump.dm" #include "code\modules\organs\pain.dm" #include "code\modules\organs\robolimbs.dm" #include "code\modules\organs\wound.dm" +#include "code\modules\organs\internal\appendix.dm" +#include "code\modules\organs\internal\eyes.dm" +#include "code\modules\organs\internal\heart.dm" +#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\subtypes\diona.dm" #include "code\modules\organs\subtypes\machine.dm" #include "code\modules\organs\subtypes\seromi.dm"