Files
Aurora.3/code/modules/organs/internal/stomach.dm
Crosarius 125a7e29b4 Gluttony (#9610)
Fixes an oversight which prevented Unathi from being able to devour big mobs such as space carp, cows, etc. This does not allow them to eat Humanoids.

Looks like carp are back on the menu boys!
2020-08-07 21:49:02 +03:00

145 lines
4.5 KiB
Plaintext

#define PUKE_ACTION_NAME "Empty Stomach"
/obj/item/organ/internal/stomach
name = "stomach"
desc = "Gross. This is hard to stomach."
icon_state = "stomach"
dead_icon = "stomach"
organ_tag = BP_STOMACH
parent_organ = BP_GROIN
robotic_name = "digestive pump"
robotic_sprite = "stomach-prosthetic"
var/datum/reagents/metabolism/ingested
var/next_cramp = 0
var/should_process_alcohol = TRUE
/obj/item/organ/internal/stomach/Destroy()
QDEL_NULL(ingested)
for(var/mob/M in contents)
if(M.stat != DEAD)
M.forceMove(owner.loc)
. = ..()
/obj/item/organ/internal/stomach/Initialize()
. = ..()
ingested = new /datum/reagents/metabolism(240, owner, CHEM_INGEST)
if(!ingested.my_atom)
ingested.my_atom = src
if(species.gluttonous)
action_button_name = PUKE_ACTION_NAME
/obj/item/organ/internal/stomach/removed()
. = ..()
ingested.my_atom = src
ingested.parent = null
/obj/item/organ/internal/stomach/replaced()
. = ..()
ingested.my_atom = owner
ingested.parent = owner
/obj/item/organ/internal/stomach/refresh_action_button()
. = ..()
if(.)
action.button_icon_state = "puke"
if(action.button) action.button.update_icon()
/obj/item/organ/internal/stomach/attack_self(mob/user)
. = ..()
if(. && action_button_name == PUKE_ACTION_NAME && owner && !owner.incapacitated())
owner.vomit(deliberate = TRUE)
refresh_action_button()
/obj/item/organ/internal/stomach/proc/can_eat_atom(var/atom/movable/food)
return !isnull(get_devour_time(food))
/obj/item/organ/internal/stomach/proc/is_full(var/atom/movable/food)
var/total = Floor(ingested.total_volume / 10)
if(species.gluttonous & GLUT_MESSY)
return FALSE //Don't need to check if the stomach is full if we're not using the contents.
for(var/a in contents + food)
if(ismob(a))
var/mob/M = a
total += M.mob_size
else if(isobj(a))
var/obj/item/I = a
total += I.get_storage_cost()
else
continue
if(total > species.stomach_capacity)
return TRUE
return FALSE
/obj/item/organ/internal/stomach/proc/get_devour_time(var/atom/movable/food)
if(iscarbon(food) || isanimal(food))
var/mob/living/L = food
if((species.gluttonous & GLUT_TINY) && (L.mob_size <= MOB_TINY) && !ishuman(food)) // Anything MOB_TINY or smaller
return DEVOUR_SLOW
else if((species.gluttonous & GLUT_MESSY) || ((species.gluttonous & GLUT_SMALLER) && owner.mob_size > L.mob_size)) //Whether you can eat things smaller, or bigger than you.
return DEVOUR_SLOW
else if(species.gluttonous & GLUT_ANYTHING) // Eat anything ever
return DEVOUR_FAST
else if(istype(food, /obj/item) && !istype(food, /obj/item/holder)) //Don't eat holders. They are special.
var/obj/item/I = food
var/cost = I.get_storage_cost()
if(cost != INFINITY) // i blame bay - geeves
if((species.gluttonous & GLUT_ITEM_TINY) && cost < 4)
return DEVOUR_SLOW
else if((species.gluttonous & GLUT_ITEM_NORMAL) && cost <= 4)
return DEVOUR_SLOW
else if(species.gluttonous & GLUT_ITEM_ANYTHING)
return DEVOUR_FAST
/obj/item/organ/internal/stomach/return_air()
return null
// This call needs to be split out to make sure that all the ingested things are metabolised
// before the process call is made on any of the other organs
/obj/item/organ/internal/stomach/proc/metabolize()
if(is_usable())
ingested.metabolize()
#define STOMACH_VOLUME 65
/obj/item/organ/internal/stomach/process()
..()
if(owner)
var/functioning = is_usable()
if(damage >= min_bruised_damage && prob((damage / max_damage) * 100))
functioning = FALSE
if(functioning)
for(var/mob/living/M in contents)
if(M.stat == DEAD)
addtimer(CALLBACK(src, .proc/digest_mob, M), 30 SECONDS, TIMER_UNIQUE)
M.adjustBruteLoss(3)
M.adjustFireLoss(3)
M.adjustToxLoss(3)
var/digestion_product = M.get_digestion_product()
if(digestion_product)
ingested.add_reagent(digestion_product, rand(1,3))
else if(world.time >= next_cramp)
next_cramp = world.time + rand(200,800)
owner.custom_pain("Your stomach cramps agonizingly!",1)
if(should_process_alcohol)
var/alcohol_volume = ingested.get_reagent_amount(/datum/reagent/alcohol/ethanol)
// Alcohol counts as double volume for the purposes of vomit probability
var/effective_volume = ingested.total_volume + alcohol_volume
// Just over the limit, the probability will be low. It rises a lot such that at double ingested it's 64% chance.
var/vomit_probability = (effective_volume / STOMACH_VOLUME) ** 6
if(prob(vomit_probability))
owner.vomit()
/obj/item/organ/internal/stomach/proc/digest_mob(mob/M)
if(!QDELETED(M))
qdel(M)
#undef STOMACH_VOLUME
#undef PUKE_ACTION_NAME