Makes the stomach important part of eating (#53228)

This puts food you eat in to the stomach.
If you do not have a stomach you can not eat, if you try to swallow anything you will spew it out.

Changes to surgeries:

    Stomach pump can now be done on the living, and pushes out the reagents in the stomach.
    Blood filter is a new tool and cleans the reagents out of the body.

This also makes it so that reagents that do not metabolize can accumulate in the stomach reducing how much food you can eat.
This commit is contained in:
NightRed
2020-09-03 15:02:23 -05:00
committed by GitHub
parent 8284f6ee90
commit 4e2dda164f
29 changed files with 253 additions and 87 deletions
@@ -89861,6 +89861,7 @@
/obj/effect/turf_decal/tile/blue{
dir = 1
},
/obj/item/blood_filter,
/turf/open/floor/plasteel/white,
/area/medical/surgery)
"dsO" = (
@@ -49981,6 +49981,7 @@
/obj/item/clothing/glasses/hud/health,
/obj/item/clothing/glasses/hud/health,
/obj/item/clothing/glasses/hud/health,
/obj/item/blood_filter,
/turf/open/floor/plasteel/dark,
/area/medical/storage)
"ddy" = (
@@ -49992,6 +49992,7 @@
/obj/item/storage/backpack/duffelbag/med/surgery,
/obj/item/reagent_containers/glass/bottle/ethanol,
/obj/item/reagent_containers/glass/bottle/ethanol,
/obj/item/blood_filter,
/turf/open/floor/plasteel/dark,
/area/medical/storage)
"cpV" = (
@@ -36167,6 +36167,7 @@
/obj/effect/turf_decal/tile/blue{
dir = 8
},
/obj/item/blood_filter,
/turf/open/floor/plasteel/white,
/area/medical/surgery)
"bMP" = (
+1
View File
@@ -16,6 +16,7 @@
#define TOOL_SAW "saw"
#define TOOL_BONESET "bonesetter"
#define TOOL_KNIFE "knife"
#define TOOL_BLOODFILTER "bloodfilter"
// If delay between the start and the end of tool operation is less than MIN_TOOL_SOUND_DELAY,
// tool sound is only played when op is started. If not, it's played twice.
+1 -3
View File
@@ -165,9 +165,7 @@ Behavior that's still missing from this component that original food items had t
return
if(!CanConsume(eater, feeder))
return
var/fullness = eater.nutrition + 10 //The theoretical fullness of the person eating if they were to eat this
for(var/datum/reagent/consumable/C in eater.reagents.reagent_list) //we add the nutrition value of what we're currently digesting
fullness += C.nutriment_factor * C.volume / C.metabolization_rate
var/fullness = eater.get_fullness() + 10 //The theoretical fullness of the person eating if they were to eat this
. = COMPONENT_ITEM_NO_ATTACK //Point of no return I suppose
+3 -2
View File
@@ -217,8 +217,9 @@ Unless you know what you're doing, only use the first three numbers. They're in
beauty_modifier = -0.01
armor_modifiers = list(MELEE = 1.5, BULLET = 1.1, LASER = 0.3, ENERGY = 0.5, BOMB = 1, BIO = 1, RAD = 1, FIRE = 1.1, ACID = 1)
/datum/material/plastic/on_accidental_mat_consumption(mob/living/carbon/M, obj/item/S)
M.adjust_disgust(17)
/datum/material/plastic/on_accidental_mat_consumption(mob/living/carbon/eater, obj/item/food)
eater.reagents.add_reagent(/datum/reagent/plastic_polymers, rand(6, 8))
food?.reagents?.add_reagent(/datum/reagent/plastic_polymers, food.reagents.total_volume*(2/5))
return TRUE
///Force decrease and mushy sound effect. (Not yet implemented)
@@ -377,6 +377,7 @@
new /obj/item/surgical_drapes(src)
new /obj/item/clothing/mask/surgical(src)
new /obj/item/razor(src)
new /obj/item/blood_filter(src)
/obj/item/storage/backpack/duffelbag/sec
name = "security duffel bag"
@@ -398,6 +399,7 @@
new /obj/item/cautery(src)
new /obj/item/surgical_drapes(src)
new /obj/item/clothing/mask/surgical(src)
new /obj/item/blood_filter(src)
/obj/item/storage/backpack/duffelbag/engineering
name = "industrial duffel bag"
@@ -486,6 +488,7 @@
new /obj/item/clothing/suit/straight_jacket(src)
new /obj/item/clothing/mask/muzzle(src)
new /obj/item/mmi/syndie(src)
new /obj/item/blood_filter(src)
/obj/item/storage/backpack/duffelbag/syndie/ammo
name = "ammunition duffel bag"
+11 -9
View File
@@ -560,18 +560,20 @@ GLOBAL_LIST_EMPTY(station_turfs)
if (iscarbon(M))
var/mob/living/carbon/C = M
if(C.reagents)
clear_reagents_to_vomit_pool(C,V, purge)
clear_reagents_to_vomit_pool(C, V, purge)
/proc/clear_reagents_to_vomit_pool(mob/living/carbon/M, obj/effect/decal/cleanable/vomit/V, purge = FALSE)
var/chemicals_lost = M.reagents.total_volume / 10
var/obj/item/organ/stomach/belly = M.getorganslot(ORGAN_SLOT_STOMACH)
if(!belly)
return
var/chemicals_lost = belly.reagents.total_volume * 0.1
if(purge)
chemicals_lost = (2 * M.reagents.total_volume)/3 //For detoxification surgery, we're manually pumping the stomach out of chemcials, so it's far more efficient.
M.reagents.trans_to(V, chemicals_lost, transfered_by = M)
for(var/datum/reagent/R in M.reagents.reagent_list) //clears the stomach of anything that might be digested as food
if(istype(R, /datum/reagent/consumable) || purge)
var/datum/reagent/consumable/nutri_check = R
if(nutri_check.nutriment_factor >0)
M.reagents.remove_reagent(R.type, min(R.volume, 10))
chemicals_lost = belly.reagents.total_volume * 0.67 //For detoxification surgery, we're manually pumping the stomach out of chemcials, so it's far more efficient.
belly.reagents.trans_to(V, chemicals_lost, transfered_by = M)
//clear the stomach of anything even not food
for(var/bile in belly.reagents.reagent_list)
var/datum/reagent/reagent = bile
belly.reagents.remove_reagent(reagent.type, min(reagent.volume, 10))
//Whatever happens after high temperature fire dies out or thermite reaction works.
//Should return new turf
@@ -44,10 +44,12 @@
M.visible_message("<span class='danger'>[user] fed [M] the contents of [src].</span>", \
"<span class='userdanger'>[user] fed you the contents of [src].</span>")
log_combat(user, M, "fed", reagents.log_list())
SEND_SIGNAL(src, COMSIG_DRINK_DRANK, M, user)
var/fraction = min(gulp_size/reagents.total_volume, 1)
checkLiked(fraction, M)
reagents.trans_to(M, gulp_size, transfered_by = user, methods = INGEST)
checkLiked(fraction, M)
playsound(M.loc,'sound/items/drink.ogg', rand(10,50), TRUE)
if(iscarbon(M))
var/mob/living/carbon/carbon_drinker = M
+1 -3
View File
@@ -109,9 +109,7 @@ All foods are distributed among various categories. Use common sense.
if(!canconsume(M, user))
return FALSE
var/fullness = M.nutrition + 10
for(var/datum/reagent/consumable/C in M.reagents.reagent_list) //we add the nutrition value of what we're currently digesting
fullness += C.nutriment_factor * C.volume / C.metabolization_rate
var/fullness = M.get_fullness() + 10
if(M == user) //If you're eating it yourself.
if(junkiness && M.satiety < -150 && M.nutrition > NUTRITION_LEVEL_STARVING + 50 && !HAS_TRAIT(user, TRAIT_VORACIOUS))
+26 -5
View File
@@ -490,23 +490,44 @@
if(!blood)
adjust_nutrition(-lost_nutrition)
adjustToxLoss(-3)
var/obj/item/organ/stomach/belly = getorganslot(ORGAN_SLOT_STOMACH)
for(var/i=0 to distance)
if(blood)
if(T)
add_splatter_floor(T)
if(harm)
adjustBruteLoss(3)
else if(src.reagents.has_reagent(/datum/reagent/consumable/ethanol/blazaam, needs_metabolizing = TRUE))
if(T)
T.add_vomit_floor(src, VOMIT_PURPLE)
else
if(T)
T.add_vomit_floor(src, VOMIT_TOXIC, purge)//toxic barf looks different || call purge when doing detoxicfication to pump more chems out of the stomach.
if(belly?.reagents.has_reagent(/datum/reagent/consumable/ethanol/blazaam, needs_metabolizing = TRUE))
if(T)
T.add_vomit_floor(src, VOMIT_PURPLE)
else
if(T)
T.add_vomit_floor(src, VOMIT_TOXIC, purge) //toxic barf looks different || call purge when doing detoxicfication to pump more chems out of the stomach.
T = get_step(T, dir)
if (T?.is_blocked_turf())
break
return TRUE
/**
* Expel the reagents you just tried to ingest
*
* When you try to ingest reagents but you do not have a stomach
* you will spew the reagents on the floor.
*
* Vars:
* * bite: /atom the reagents to expel
* * amount: int The amount of reagent
*/
/mob/living/carbon/proc/expel_ingested(var/atom/bite, amount)
visible_message("<span class='danger'>[src] throws up all over [p_them()]self!</span>", \
"<span class='userdanger'>You are unable to keep the [bite] down without a stomach!</span>")
var/turf/floor = get_turf(src)
var/obj/effect/decal/cleanable/vomit/spew = new(floor, get_static_viruses())
bite.reagents.trans_to(spew, amount, transfered_by = src)
/mob/living/carbon/proc/spew_organ(power = 5, amt = 1)
for(var/i in 1 to amt)
if(!internal_organs.len)
@@ -25,17 +25,7 @@
if(chem.type == /datum/reagent/toxin/pestkiller)
H.adjustToxLoss(3)
H.reagents.remove_reagent(chem.type, REAGENTS_METABOLISM)
return 1
/datum/species/fly/handle_chemicals(datum/reagent/chem, mob/living/carbon/human/H)
if(istype(chem, /datum/reagent/consumable))
var/datum/reagent/consumable/nutri_check = chem
if(nutri_check.nutriment_factor > 0)
var/turf/pos = get_turf(H)
H.vomit(0, FALSE, FALSE, 2, TRUE)
playsound(pos, 'sound/effects/splat.ogg', 50, TRUE)
H.visible_message("<span class='danger'>[H] vomits on the floor!</span>", \
"<span class='userdanger'>You throw up on the floor!</span>")
return TRUE
..()
/datum/species/fly/check_species_weakness(obj/item/weapon, mob/living/attacker)
@@ -79,6 +69,21 @@
name = odd_organ_name()
icon_state = pick("brain-x-d", "liver-x", "kidneys-x", "stomach-x", "lungs-x", "random_fly_1", "random_fly_2", "random_fly_3", "random_fly_4", "random_fly_5")
/obj/item/organ/stomach/fly/on_life()
for(var/bile in reagents.reagent_list)
if(!istype(bile, /datum/reagent/consumable))
continue
var/datum/reagent/consumable/chunk = bile
if(chunk.nutriment_factor <= 0)
continue
var/mob/living/carbon/body = owner
var/turf/pos = get_turf(owner)
body.vomit(reagents.total_volume, FALSE, FALSE, 2, TRUE)
playsound(pos, 'sound/effects/splat.ogg', 50, TRUE)
body.visible_message("<span class='danger'>[body] vomits on the floor!</span>", \
"<span class='userdanger'>You throw up on the floor!</span>")
return ..()
/obj/item/organ/appendix/fly
desc = "You have no idea what the hell this is, or how it manages to keep something alive in any capacity."
@@ -919,6 +919,7 @@
species_traits = list(NOBLOOD,NO_UNDERWEAR,NOEYESPRITES,HAS_BONE)
inherent_biotypes = MOB_UNDEAD|MOB_HUMANOID
mutanttongue = /obj/item/organ/tongue/bone
mutantstomach = /obj/item/organ/stomach/bone
sexes = FALSE
fixed_mut_color = null
inherent_traits = list(TRAIT_NOFLASH,TRAIT_RESISTHEAT,TRAIT_NOBREATH,TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_NOFIRE,TRAIT_CHUNKYFINGERS,TRAIT_RADIMMUNE,TRAIT_GENELESS,TRAIT_PIERCEIMMUNE,TRAIT_NODISMEMBER,TRAIT_FAKEDEATH)
@@ -939,15 +940,6 @@
/datum/species/golem/bone/handle_chemicals(datum/reagent/chem, mob/living/carbon/human/H)
. = ..()
if(chem.type == /datum/reagent/consumable/milk)
if(chem.volume > 10)
H.reagents.remove_reagent(chem.type, chem.volume - 10)
to_chat(H, "<span class='warning'>The excess milk is dripping off your bones!</span>")
H.heal_bodypart_damage(1.5,0, 0)
for(var/i in H.all_wounds)
var/datum/wound/iter_wound = i
iter_wound.on_xadone(2)
H.reagents.remove_reagent(chem.type, chem.metabolization_rate)
if(chem.type == /datum/reagent/toxin/bonehurtingjuice)
H.adjustStaminaLoss(7.5, 0)
H.adjustBruteLoss(0.5, 0)
@@ -172,16 +172,6 @@
/datum/species/plasmaman/handle_chemicals(datum/reagent/chem, mob/living/carbon/human/H)
. = ..()
if(istype(chem, /datum/reagent/consumable/milk))
if(chem.volume > 10)
H.reagents.remove_reagent(chem.type, chem.volume - 10)
to_chat(H, "<span class='warning'>The excess milk is dripping off your bones!</span>")
H.heal_bodypart_damage(1.5,0, 0)
H.reagents.remove_reagent(chem.type, chem.metabolization_rate)
for(var/i in H.all_wounds)
var/datum/wound/iter_wound = i
iter_wound.on_xadone(2)
return TRUE
if(istype(chem, /datum/reagent/toxin/plasma))
H.reagents.remove_reagent(chem.type, chem.metabolization_rate)
for(var/i in H.all_wounds)
@@ -10,6 +10,7 @@
TRAIT_PIERCEIMMUNE,TRAIT_NOHUNGER,TRAIT_EASYDISMEMBER,TRAIT_LIMBATTACHMENT,TRAIT_FAKEDEATH,TRAIT_XENO_IMMUNE,TRAIT_NOCLONELOSS)
inherent_biotypes = MOB_UNDEAD|MOB_HUMANOID
mutanttongue = /obj/item/organ/tongue/bone
mutantstomach = /obj/item/organ/stomach/bone
damage_overlay_type = ""//let's not show bloody wounds or burns over bones.
disliked_food = NONE
liked_food = GROSS | MEAT | RAW
@@ -25,16 +26,6 @@
//Can still metabolize milk through meme magic
/datum/species/skeleton/handle_chemicals(datum/reagent/chem, mob/living/carbon/human/H)
. = ..()
if(chem.type == /datum/reagent/consumable/milk)
if(chem.volume > 10)
H.reagents.remove_reagent(chem.type, chem.volume - 10)
to_chat(H, "<span class='warning'>The excess milk is dripping off your bones!</span>")
for(var/i in H.all_wounds)
var/datum/wound/iter_wound = i
iter_wound.on_xadone(2)
H.heal_bodypart_damage(1,1, 0)
H.reagents.remove_reagent(chem.type, chem.metabolization_rate)
return TRUE
if(chem.type == /datum/reagent/toxin/bonehurtingjuice)
H.adjustStaminaLoss(7.5, 0)
H.adjustBruteLoss(0.5, 0)
+21
View File
@@ -702,6 +702,27 @@ All effects don't start immediately, but rather get worse over time; the rate is
bodytemperature = clamp(bodytemperature + amount,min_temp,max_temp)
///////////
//Stomach//
///////////
/mob/living/carbon/get_fullness()
var/fullness = nutrition
var/obj/item/organ/stomach/belly = getorganslot(ORGAN_SLOT_STOMACH)
if(!belly) //nothing to see here if we do not have a stomach
return fullness
for(var/bile in belly.reagents.reagent_list)
var/datum/reagent/bits = bile
if(istype(bits, /datum/reagent/consumable))
var/datum/reagent/consumable/goodbit = bile
fullness += goodbit.nutriment_factor * goodbit.volume / goodbit.metabolization_rate
continue
fullness += 0.6 * bits.volume / bits.metabolization_rate //not food takes up space
return fullness
/////////
//LIVER//
/////////
+17
View File
@@ -115,6 +115,23 @@
var/turf/location = get_turf(src)
location.hotspot_expose(700, 50, 1)
/**
* Get the fullness of the mob
*
* This returns a value form 0 upwards to represent how full the mob is.
* The value is a total amount of consumable reagents in the body combined
* with the total amount of nutrition they have.
* This does not have an upper limit.
*/
/mob/living/proc/get_fullness()
var/fullness = nutrition
// we add the nutrition value of what we're currently digesting
for(var/bile in reagents.reagent_list)
var/datum/reagent/consumable/bits = bile
if(bits)
fullness += bits.nutriment_factor * bits.volume / bits.metabolization_rate
return fullness
//this updates all special effects: knockdown, druggy, stuttering, etc..
/mob/living/proc/handle_status_effects()
+14 -4
View File
@@ -209,8 +209,9 @@
* * methods - passed through to [/datum/reagents/proc/react_single] and [/datum/reagent/proc/on_transfer]
* * show_message - passed through to [/datum/reagents/proc/react_single]
* * round_robin - if round_robin=TRUE, so transfer 5 from 15 water, 15 sugar and 15 plasma becomes 10, 15, 15 instead of 13.3333, 13.3333 13.3333. Good if you hate floating point errors
* * ignore_stomach - when using methods INGEST will not use the stomach as the target
*/
/datum/reagents/proc/trans_to(obj/target, amount = 1, multiplier = 1, preserve_data = TRUE, no_react = FALSE, mob/transfered_by, remove_blacklisted = FALSE, methods = NONE, show_message = TRUE, round_robin = FALSE)
/datum/reagents/proc/trans_to(obj/target, amount = 1, multiplier = 1, preserve_data = TRUE, no_react = FALSE, mob/transfered_by, remove_blacklisted = FALSE, methods = NONE, show_message = TRUE, round_robin = FALSE, ignore_stomach = FALSE)
var/list/cached_reagents = reagent_list
if(!target || !total_volume)
return
@@ -223,10 +224,19 @@
R = target
target_atom = R.my_atom
else
if(!target.reagents)
if(!ignore_stomach && (methods & INGEST) && istype(target, /mob/living/carbon))
var/mob/living/carbon/eater = target
var/obj/item/organ/stomach/belly = eater.getorganslot(ORGAN_SLOT_STOMACH)
if(!belly)
eater.expel_ingested(my_atom, amount)
return
R = belly.reagents
target_atom = belly
else if(!target.reagents)
return
R = target.reagents
target_atom = target
else
R = target.reagents
target_atom = target
amount = min(min(amount, src.total_volume), R.maximum_volume-R.total_volume)
var/trans_data = null
@@ -495,6 +495,15 @@
build_path = /obj/item/clothing/head/foilhat
category = list("hacked", "Misc")
/datum/design/blood_filter
name = "Blood Filter"
id = "blood_filter"
build_type = AUTOLATHE | PROTOLATHE
materials = list(/datum/material/iron = 4000, /datum/material/glass = 1500, /datum/material/silver = 500)
build_path = /obj/item/blood_filter
category = list("initial", "Medical", "Tool Designs")
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_SCIENCE
/datum/design/scalpel
name = "Scalpel"
id = "scalpel"
+4 -2
View File
@@ -56,8 +56,10 @@
starting_node = TRUE
display_name = "Basic Medical Equipment"
description = "Basic medical tools and equipment."
design_ids = list("cybernetic_liver", "cybernetic_heart", "cybernetic_lungs","cybernetic_stomach", "scalpel", "circular_saw", "bonesetter", "surgicaldrill", "retractor", "cautery", "hemostat", "stethoscope",
"surgical_drapes", "syringe", "plumbing_rcd", "beaker", "large_beaker", "xlarge_beaker", "dropper", "defibmountdefault", "surgical_tape", "portable_chem_mixer")
design_ids = list("cybernetic_liver", "cybernetic_heart", "cybernetic_lungs","cybernetic_stomach", "scalpel",
"blood_filter", "circular_saw", "bonesetter", "surgicaldrill", "retractor", "cautery", "hemostat",
"stethoscope", "surgical_drapes", "syringe", "plumbing_rcd", "beaker", "large_beaker", "xlarge_beaker",
"dropper", "defibmountdefault", "surgical_tape", "portable_chem_mixer")
/////////////////////////Biotech/////////////////////////
/datum/techweb_node/biotech
+44
View File
@@ -0,0 +1,44 @@
/datum/surgery/blood_filter
name = "Filter blood"
steps = list(/datum/surgery_step/incise,
/datum/surgery_step/retract_skin,
/datum/surgery_step/incise,
/datum/surgery_step/filter_blood,
/datum/surgery_step/close)
target_mobtypes = list(/mob/living/carbon/human, /mob/living/carbon/monkey)
possible_locs = list(BODY_ZONE_CHEST)
requires_bodypart_type = TRUE
ignore_clothes = FALSE
/datum/surgery_step/filter_blood
name = "Filter blood"
implements = list(/obj/item/blood_filter = 95)
repeatable = TRUE
time = 2.5 SECONDS
/datum/surgery/filter_blood/can_start(mob/user, mob/living/carbon/target)
if(HAS_TRAIT(target, TRAIT_HUSK)) //You can filter the blood of a dead person just not husked
return FALSE
return ..()
/datum/surgery_step/filter_blood/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
display_results(user, target, "<span class='notice'>You begin filtering [target]'s blood...</span>",
"<span class='notice'>[user] uses the [tool] to filtering your blood.</span>",
"<span class='notice'>[user] uses the [tool] on [target]'s chest.</span>")
/datum/surgery_step/filter_blood/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = FALSE)
if(target.reagents?.total_volume)
for(var/blood_chem in target.reagents.reagent_list)
var/datum/reagent/chem = blood_chem
target.reagents.remove_reagent(chem.type, min(chem.volume * 0.22, 10))
display_results(user, target, "<span class='notice'>The [tool] pings as it finishes filtering [target]'s blood.</span>",
"<span class='notice'>The [tool] pings as it stops pumping your blood.</span>",
"The [tool] pings as it stops pumping.")
return ..()
/datum/surgery_step/filter_blood/failure(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
display_results(user, target, "<span class='warning'>You screw up, brusing [target]'s chest!</span>",
"<span class='warning'>[user] screws up, brusing [target]'s chest!</span>",
"<span class='warning'>[user] screws up!</span>")
target.adjustBruteLoss(5)
+57 -16
View File
@@ -18,30 +18,40 @@
var/disgust_metabolism = 1
/obj/item/organ/stomach/on_life()
var/mob/living/carbon/human/H = owner
var/datum/reagent/Nutri
/obj/item/organ/stomach/Initialize()
. = ..()
create_reagents(1000)
..()
if(istype(H))
/obj/item/organ/stomach/on_life()
. = ..()
//Manage species digestion
if(istype(owner, /mob/living/carbon/human))
var/mob/living/carbon/human/humi = owner
if(!(organ_flags & ORGAN_FAILING))
H.dna.species.handle_digestion(H)
handle_disgust(H)
humi.dna.species.handle_digestion(humi)
//digest food
var/mob/living/carbon/body = owner
reagents.metabolize(body, can_overdose=TRUE)
if(body)
handle_disgust(body)
if(damage < low_threshold)
return
Nutri = locate(/datum/reagent/consumable/nutriment) in H.reagents.reagent_list
var/datum/reagent/nutri = locate(/datum/reagent/consumable/nutriment) in reagents.reagent_list
if(!nutri)
return
if(Nutri)
if(prob((damage/40) * Nutri.volume * Nutri.volume))
H.vomit(damage)
to_chat(H, "<span class='warning'>Your stomach reels in pain as you're incapable of holding down all that food!</span>")
if(prob(damage * 0.025 * nutri.volume * nutri.volume))
body.vomit(damage)
to_chat(body, "<span class='warning'>Your stomach reels in pain as you're incapable of holding down all that food!</span>")
return
else if(Nutri && damage > high_threshold)
if(prob((damage/10) * Nutri.volume * Nutri.volume))
H.vomit(damage)
to_chat(H, "<span class='warning'>Your stomach reels in pain as you're incapable of holding down all that food!</span>")
if(damage > high_threshold && prob(damage * 0.1 * nutri.volume * nutri.volume))
body.vomit(damage)
to_chat(body, "<span class='warning'>Your stomach reels in pain as you're incapable of holding down all that food!</span>")
/obj/item/organ/stomach/get_availability(datum/species/S)
return !(NOSTOMACH in S.inherent_traits)
@@ -88,11 +98,42 @@
SEND_SIGNAL(H, COMSIG_CLEAR_MOOD_EVENT, "disgust")
..()
/obj/item/organ/stomach/bone
desc = "You have no idea what this strange ball of bones does."
/obj/item/organ/stomach/bone/on_life()
var/datum/reagent/consumable/milk/milk = locate(/datum/reagent/consumable/milk) in reagents.reagent_list
if(milk)
var/mob/living/carbon/body = owner
if(milk.volume > 10)
reagents.remove_reagent(milk.type, milk.volume - 10)
to_chat(owner, "<span class='warning'>The excess milk is dripping off your bones!</span>")
body.heal_bodypart_damage(1.5,0, 0)
for(var/i in body.all_wounds)
var/datum/wound/iter_wound = i
iter_wound.on_xadone(2)
reagents.remove_reagent(milk.type, milk.metabolization_rate)
return ..()
/obj/item/organ/stomach/plasmaman
name = "digestive crystal"
icon_state = "stomach-p"
desc = "A strange crystal that is responsible for metabolizing the unseen energy force that feeds plasmamen."
/obj/item/organ/stomach/plasmaman/on_life()
var/datum/reagent/consumable/milk/milk = locate(/datum/reagent/consumable/milk) in reagents.reagent_list
if(milk)
var/mob/living/carbon/body = owner
if(milk.volume > 10)
reagents.remove_reagent(milk.type, milk.volume - 10)
to_chat(owner, "<span class='warning'>The excess milk is dripping off your bones!</span>")
body.heal_bodypart_damage(1.5,0, 0)
for(var/i in body.all_wounds)
var/datum/wound/iter_wound = i
iter_wound.on_xadone(2)
reagents.remove_reagent(milk.type, milk.metabolization_rate)
return ..()
/obj/item/organ/stomach/ethereal
name = "biological battery"
icon_state = "stomach-p" //Welp. At least it's more unique in functionaliy.
-2
View File
@@ -15,8 +15,6 @@
/datum/surgery/stomach_pump/can_start(mob/user, mob/living/carbon/target)
var/obj/item/organ/stomach/S = target.getorganslot(ORGAN_SLOT_STOMACH)
if(target.stat != DEAD) //shamelessly lifted off the revival surgery but we're looking for the same critera here, a dead, non-husked, revivable patient.
return FALSE
if(HAS_TRAIT(target, TRAIT_HUSK))
return FALSE
if(!S)
+15
View File
@@ -423,3 +423,18 @@
attack_verb_simple = list("correct", "properly set")
tool_behaviour = TOOL_BONESET
toolspeed = 1
/obj/item/blood_filter
name = "blood filter"
desc = "For filtering the blood."
icon = 'icons/obj/surgery.dmi'
icon_state = "bloodfilter"
lefthand_file = 'icons/mob/inhands/equipment/medical_lefthand.dmi'
righthand_file = 'icons/mob/inhands/equipment/medical_righthand.dmi'
custom_materials = list(/datum/material/iron=2000, /datum/material/glass=1500, /datum/material/silver=500)
item_flags = SURGICAL_TOOL
w_class = WEIGHT_CLASS_NORMAL
attack_verb_continuous = list("pumps", "siphons")
attack_verb_simple = list("pumps", "siphons")
tool_behaviour = TOOL_BLOODFILTER
toolspeed = 1
Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.8 KiB

After

Width:  |  Height:  |  Size: 5.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.7 KiB

After

Width:  |  Height:  |  Size: 4.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 40 KiB

After

Width:  |  Height:  |  Size: 40 KiB

+1
View File
@@ -3052,6 +3052,7 @@
#include "code\modules\station_goals\shield.dm"
#include "code\modules\station_goals\station_goal.dm"
#include "code\modules\surgery\amputation.dm"
#include "code\modules\surgery\blood_filter.dm"
#include "code\modules\surgery\bone_mending.dm"
#include "code\modules\surgery\brain_surgery.dm"
#include "code\modules\surgery\burn_dressing.dm"