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