From 74eae5a6bd221ba0358808386a9758506540268a Mon Sep 17 00:00:00 2001 From: Zuhayr Date: Tue, 30 Sep 2014 11:58:40 +0930 Subject: [PATCH] Moved radiation and light processing to organs. --- .../carbon/human/alien/alien_species.dm | 71 ++++++++++--------- .../mob/living/carbon/human/human_damage.dm | 2 +- code/modules/mob/living/carbon/human/life.dm | 8 ++- .../mob/living/carbon/human/species.dm | 2 +- code/modules/organs/organ.dm | 13 ---- code/modules/organs/organ_alien.dm | 35 ++++++--- code/modules/organs/organ_internal.dm | 64 ++++++++++++----- code/modules/reagents/Chemistry-Reagents.dm | 21 +++--- code/setup.dm | 7 +- 9 files changed, 134 insertions(+), 89 deletions(-) diff --git a/code/modules/mob/living/carbon/human/alien/alien_species.dm b/code/modules/mob/living/carbon/human/alien/alien_species.dm index a29ce75087a..c7a73828553 100644 --- a/code/modules/mob/living/carbon/human/alien/alien_species.dm +++ b/code/modules/mob/living/carbon/human/alien/alien_species.dm @@ -1,4 +1,3 @@ -//TODO: Generalize some kind of power pool so that other races can use it. //Stand-in until this is made more lore-friendly. /datum/species/xenos name = "Xenomorph" @@ -23,7 +22,7 @@ cold_level_2 = -1 cold_level_3 = -1 - flags = IS_WHITELISTED | NO_BREATHE | NO_SCAN | NO_PAIN | RAD_ABSORB | NO_SLIP | NO_POISON + flags = IS_WHITELISTED | NO_BREATHE | NO_SCAN | NO_PAIN | NO_SLIP | NO_POISON reagent_tag = IS_XENOS @@ -38,11 +37,12 @@ poison_type = null has_organ = list( - "heart" = /datum/organ/internal/heart, - "lungs" = /datum/organ/internal/lungs, - "brain" = /datum/organ/internal/brain, - "plasma vessel" = /datum/organ/internal/xenos/plasmavessel, - "hive node" = /datum/organ/internal/xenos/hivenode + "heart" = /datum/organ/internal/heart, + "lungs" = /datum/organ/internal/lungs, + "brain" = /datum/organ/internal/brain, + "plasma vessel" = /datum/organ/internal/xenos/plasmavessel, + "hive node" = /datum/organ/internal/xenos/hivenode, + "nutrient vessel" = /datum/organ/internal/diona/nutrients ) var/alien_number = 0 @@ -54,7 +54,6 @@ H.visible_message("[H] caresses [target] with its scythe-like arm.", \ "You caress [target] with your scythe-like arm.") - /datum/species/xenos/handle_post_spawn(var/mob/living/carbon/human/H) if(H.mind) @@ -103,13 +102,14 @@ deform = 'icons/mob/human_races/xenos/r_xenos_drone.dmi' has_organ = list( - "heart" = /datum/organ/internal/heart, - "lungs" = /datum/organ/internal/lungs, - "brain" = /datum/organ/internal/brain, - "plasma vessel" = /datum/organ/internal/xenos/plasmavessel/queen, - "acid gland" = /datum/organ/internal/xenos/acidgland, - "hive node" = /datum/organ/internal/xenos/hivenode, - "resin spinner" = /datum/organ/internal/xenos/resinspinner + "heart" = /datum/organ/internal/heart, + "lungs" = /datum/organ/internal/lungs, + "brain" = /datum/organ/internal/brain, + "plasma vessel" = /datum/organ/internal/xenos/plasmavessel/queen, + "acid gland" = /datum/organ/internal/xenos/acidgland, + "hive node" = /datum/organ/internal/xenos/hivenode, + "resin spinner" = /datum/organ/internal/xenos/resinspinner, + "nutrient vessel" = /datum/organ/internal/diona/nutrients ) inherent_verbs = list( @@ -141,11 +141,12 @@ deform = 'icons/mob/human_races/xenos/r_xenos_hunter.dmi' has_organ = list( - "heart" = /datum/organ/internal/heart, - "lungs" = /datum/organ/internal/lungs, - "brain" = /datum/organ/internal/brain, - "plasma vessel" = /datum/organ/internal/xenos/plasmavessel/hunter, - "hive node" = /datum/organ/internal/xenos/hivenode + "heart" = /datum/organ/internal/heart, + "lungs" = /datum/organ/internal/lungs, + "brain" = /datum/organ/internal/brain, + "plasma vessel" = /datum/organ/internal/xenos/plasmavessel/hunter, + "hive node" = /datum/organ/internal/xenos/hivenode, + "nutrient vessel" = /datum/organ/internal/diona/nutrients ) inherent_verbs = list( @@ -168,12 +169,13 @@ deform = 'icons/mob/human_races/xenos/r_xenos_sentinel.dmi' has_organ = list( - "heart" = /datum/organ/internal/heart, - "lungs" = /datum/organ/internal/lungs, - "brain" = /datum/organ/internal/brain, - "plasma vessel" = /datum/organ/internal/xenos/plasmavessel/sentinel, - "acid gland" = /datum/organ/internal/xenos/acidgland, - "hive node" = /datum/organ/internal/xenos/hivenode + "heart" = /datum/organ/internal/heart, + "lungs" = /datum/organ/internal/lungs, + "brain" = /datum/organ/internal/brain, + "plasma vessel" = /datum/organ/internal/xenos/plasmavessel/sentinel, + "acid gland" = /datum/organ/internal/xenos/acidgland, + "hive node" = /datum/organ/internal/xenos/hivenode, + "nutrient vessel" = /datum/organ/internal/diona/nutrients ) inherent_verbs = list( @@ -197,14 +199,15 @@ deform = 'icons/mob/human_races/xenos/r_xenos_queen.dmi' has_organ = list( - "heart" = /datum/organ/internal/heart, - "lungs" = /datum/organ/internal/lungs, - "brain" = /datum/organ/internal/brain, - "egg sac" = /datum/organ/internal/xenos/eggsac, - "plasma vessel" = /datum/organ/internal/xenos/plasmavessel/queen, - "acid gland" = /datum/organ/internal/xenos/acidgland, - "hive node" = /datum/organ/internal/xenos/hivenode, - "resin spinner" = /datum/organ/internal/xenos/resinspinner + "heart" = /datum/organ/internal/heart, + "lungs" = /datum/organ/internal/lungs, + "brain" = /datum/organ/internal/brain, + "egg sac" = /datum/organ/internal/xenos/eggsac, + "plasma vessel" = /datum/organ/internal/xenos/plasmavessel/queen, + "acid gland" = /datum/organ/internal/xenos/acidgland, + "hive node" = /datum/organ/internal/xenos/hivenode, + "resin spinner" = /datum/organ/internal/xenos/resinspinner, + "nutrient vessel" = /datum/organ/internal/diona/nutrients ) inherent_verbs = list( diff --git a/code/modules/mob/living/carbon/human/human_damage.dm b/code/modules/mob/living/carbon/human/human_damage.dm index 1fad51fcd90..b115ffe94cd 100644 --- a/code/modules/mob/living/carbon/human/human_damage.dm +++ b/code/modules/mob/living/carbon/human/human_damage.dm @@ -13,7 +13,7 @@ var/oxy_l = (species.flags & NO_BREATHE ? 0 : getOxyLoss()) var/tox_l = (species.flags & NO_POISON ? 0 : getToxLoss()) - var/clone_l = getCloneLoss() //TODO: link this to RAD_ABSORB or NO_SCAN + var/clone_l = getCloneLoss() //TODO: link this to NO_SCAN health = species.total_health - oxy_l - tox_l - clone_l - total_burn - total_brute diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index c4dec0abe89..e15a622950e 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -282,7 +282,8 @@ radiation = Clamp(radiation,0,100) if (radiation) - if(species.flags & RAD_ABSORB) + var/datum/organ/internal/diona/nutrients/rad_organ = locate() in internal_organs + if(!rad_organ || rad_organ.is_broken()) var/rads = radiation/25 radiation -= rads nutrition += rads @@ -984,7 +985,8 @@ if(status_flags & GODMODE) return 0 //godmode - if(species.flags & REQUIRE_LIGHT) + var/datum/organ/internal/diona/node/light_organ = locate() in internal_organs + if(light_organ && !light_organ.is_broken()) var/light_amount = 0 //how much light there is in the place, affects receiving nutrition and healing if(isturf(loc)) //else, there's considered to be no light var/turf/T = loc @@ -1047,7 +1049,7 @@ if(overeatduration > 1) overeatduration -= 2 //doubled the unfat rate - if(species.flags & REQUIRE_LIGHT) + if(!light_organ || light_organ.is_broken()) if(nutrition < 200) take_overall_damage(2,0) traumatic_shock++ diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index fdbcd422ad7..76a98e5c823 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -384,7 +384,7 @@ body_temperature = T0C + 15 //make the plant people have a bit lower body temperature, why not - flags = IS_WHITELISTED | NO_BREATHE | REQUIRE_LIGHT | NO_SCAN | IS_PLANT | RAD_ABSORB | NO_BLOOD | NO_PAIN | NO_SLIP + flags = IS_WHITELISTED | NO_BREATHE | NO_SCAN | IS_PLANT | NO_BLOOD | NO_PAIN | NO_SLIP blood_color = "#004400" flesh_color = "#907E4A" diff --git a/code/modules/organs/organ.dm b/code/modules/organs/organ.dm index 12b180fd546..a69ee36c7d6 100644 --- a/code/modules/organs/organ.dm +++ b/code/modules/organs/organ.dm @@ -75,19 +75,6 @@ for(var/datum/organ/internal/I in internal_organs) I.process() - // Also handles some internal organ processing when the organs are missing completely. - // Only handles missing liver and kidneys for now. - // This is a bit harsh, but really if you're missing an entire bodily organ you're in deep shit. - if(species.has_organ["liver"]) - var/datum/organ/internal/liver = internal_organs_by_name["liver"] - if(!liver || liver.status & ORGAN_CUT_AWAY) - reagents.add_reagent("toxin", rand(1,3)) - - if(species.has_organ["kidneys"]) - var/datum/organ/internal/kidney = internal_organs_by_name["kidneys"] - if(!kidney || kidney.status & ORGAN_CUT_AWAY) - reagents.add_reagent("toxin", rand(1,3)) - if(!force_process && !bad_external_organs.len) return diff --git a/code/modules/organs/organ_alien.dm b/code/modules/organs/organ_alien.dm index 5d1d4874235..e04287bc3f3 100644 --- a/code/modules/organs/organ_alien.dm +++ b/code/modules/organs/organ_alien.dm @@ -5,18 +5,10 @@ /datum/organ/internal/diona/process() return -/datum/organ/internal/diona/nutrients - name = "nutrient vessel" - parent_organ = "chest" - /datum/organ/internal/diona/strata name = "neural strata" parent_organ = "chest" -/datum/organ/internal/diona/node - name = "receptor node" - parent_organ = "head" - /datum/organ/internal/diona/bladder name = "gas bladder" parent_organ = "head" @@ -29,10 +21,21 @@ name = "anchoring ligament" parent_organ = "groin" +/datum/organ/internal/diona/node + name = "receptor node" + parent_organ = "head" + removed_type = /obj/item/organ/diona/node + +/datum/organ/internal/diona/nutrients + name = "nutrient vessel" + parent_organ = "chest" + removed_type = /obj/item/organ/diona/nutrients + /obj/item/organ/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/target,var/mob/living/user) @@ -53,6 +56,22 @@ del(src) +//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/diona/nutrients/removed() + return + +/obj/item/organ/diona/node + name = "receptor node" + organ_tag = "receptor node" + +/obj/item/organ/diona/node/removed() + return + //CORTICAL BORER ORGANS. /datum/organ/internal/borer name = "cortical borer" diff --git a/code/modules/organs/organ_internal.dm b/code/modules/organs/organ_internal.dm index 9c26f814e95..3a84eb3a11c 100644 --- a/code/modules/organs/organ_internal.dm +++ b/code/modules/organs/organ_internal.dm @@ -1,3 +1,5 @@ +#define PROCESS_ACCURACY 10 + /**************************************************** INTERNAL ORGANS ****************************************************/ @@ -21,7 +23,7 @@ return damage >= min_bruised_damage /datum/organ/internal/proc/is_broken() - return damage >= min_broken_damage + return damage >= min_broken_damage || status & ORGAN_CUT_AWAY /datum/organ/internal/New(mob/living/carbon/human/H) ..() @@ -163,11 +165,12 @@ /datum/organ/internal/liver name = "liver" parent_organ = "chest" - var/process_accuracy = 10 removed_type = /obj/item/organ/liver process() + ..() + if (germ_level > INFECTION_LEVEL_ONE) if(prob(1)) owner << "\red Your skin itches." @@ -175,40 +178,67 @@ if(prob(1)) spawn owner.vomit() - if(owner.life_tick % process_accuracy == 0) - if(src.damage < 0) - src.damage = 0 + 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 + src.damage += 0.2 * PROCESS_ACCURACY //Damaged one shares the fun else var/datum/organ/internal/O = pick(owner.internal_organs) if(O) - O.damage += 0.2 * process_accuracy + 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 + src.damage -= 0.2 * PROCESS_ACCURACY - // Damaged liver means some chemicals are very dangerous - if(src.damage >= src.min_bruised_damage) - for(var/datum/reagent/R in owner.reagents.reagent_list) - // Ethanol and all drinks are bad - if(istype(R, /datum/reagent/ethanol)) - owner.adjustToxLoss(0.1 * process_accuracy) - // Can't cope with toxins at all - if(istype(R, /datum/reagent/toxin)) - owner.adjustToxLoss(0.3 * 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 filtering/processing. + for(var/datum/reagent/R in owner.reagents.reagent_list) + // Damaged liver means some chemicals are very dangerous + // The liver is also responsible for clearing out alcohol and toxins. + // Ethanol and all drinks are bad.K + if(istype(R, /datum/reagent/ethanol)) + if(filter_effect < 3) + owner.adjustToxLoss(0.1 * PROCESS_ACCURACY) + owner.reagents.remove_reagent(R.id, R.custom_metabolism*filter_effect) + // Can't cope with toxins at all + else if(istype(R, /datum/reagent/toxin)) + if(filter_effect < 3) + owner.adjustToxLoss(0.3 * PROCESS_ACCURACY) + owner.reagents.remove_reagent(R.id, ALCOHOL_METABOLISM*filter_effect) /datum/organ/internal/kidney name = "kidneys" parent_organ = "groin" removed_type = /obj/item/organ/kidneys + process() + + ..() + + // 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) + /datum/organ/internal/brain name = "brain" parent_organ = "head" diff --git a/code/modules/reagents/Chemistry-Reagents.dm b/code/modules/reagents/Chemistry-Reagents.dm index 13962c71346..fbf206fbc65 100644 --- a/code/modules/reagents/Chemistry-Reagents.dm +++ b/code/modules/reagents/Chemistry-Reagents.dm @@ -1,7 +1,6 @@ #define SOLID 1 #define LIQUID 2 #define GAS 3 -#define FOOD_METABOLISM 0.4 #define REAGENTS_OVERDOSE 30 #define REM REAGENTS_EFFECT_MULTIPLIER @@ -653,13 +652,17 @@ datum for (var/ID in C.virus2) var/datum/disease2/disease/V = C.virus2[ID] if(prob(5)) + M:antibodies |= V.antigen if(prob(50)) M.radiation += 50 // curing it that way may kill you instead - var/mob/living/carbon/human/H - if(istype(C,/mob/living/carbon/human)) - H = C - if(!H || (H.species && !(H.species.flags & RAD_ABSORB))) M.adjustToxLoss(100) - M:antibodies |= V.antigen + var/absorbed + if(istype(C,/mob/living/carbon)) + var/mob/living/carbon/H = C + var/datum/organ/internal/diona/nutrients/rad_organ = locate() in H.internal_organs + if(rad_organ && !rad_organ.is_broken()) + absorbed = 1 + if(!absorbed) + M.adjustToxLoss(100) ..() return @@ -1493,11 +1496,11 @@ datum var/toxpwr = 0.7 // Toxins are really weak, but without being treated, last very long. custom_metabolism = 0.1 - on_mob_life(var/mob/living/M as mob) + on_mob_life(var/mob/living/M as mob,var/alien) if(!M) M = holder.my_atom if(toxpwr) M.adjustToxLoss(toxpwr*REM) - ..() + if(alien) ..() //Kind of a catch-all for aliens without kidneys. return toxin/amatoxin @@ -2972,7 +2975,7 @@ datum on_mob_life(var/mob/living/M as mob, var/alien) M:nutrition += nutriment_factor - holder.remove_reagent(src.id, FOOD_METABOLISM) + holder.remove_reagent(src.id, (alien ? FOOD_METABOLISM : ALCOHOL_METABOLISM)) // Catch-all for creatures without livers. if (adj_drowsy) M.drowsyness = max(0,M.drowsyness + adj_drowsy) if (adj_sleepy) M.sleeping = max(0,M.sleeping + adj_sleepy) diff --git a/code/setup.dm b/code/setup.dm index fd44b399ca5..f0530653527 100644 --- a/code/setup.dm +++ b/code/setup.dm @@ -754,9 +754,6 @@ var/list/RESTRICTED_CAMERA_NETWORKS = list( //Those networks can only be accesse #define IS_WHITELISTED 4096 #define IS_SYNTHETIC 8192 -#define RAD_ABSORB 16384 -#define REQUIRE_LIGHT 32768 - //Language flags. #define WHITELISTED 1 // Language is available if the speaker is whitelisted. #define RESTRICTED 2 // Language can only be accquired by spawning or an admin. @@ -854,3 +851,7 @@ var/list/RESTRICTED_CAMERA_NETWORKS = list( //Those networks can only be accesse #define ATMOS_DEFAULT_VOLUME_PIPE 70 //L var/list/hit_appends = list("-OOF", "-ACK", "-UGH", "-HRNK", "-HURGH", "-GLORF") + +// Reagent metabolism defines. +#define FOOD_METABOLISM 0.4 +#define ALCOHOL_METABOLISM 0.1