From f4be16cddca164d8cad447dc5c204be63e141063 Mon Sep 17 00:00:00 2001 From: Chubbygummibear Date: Mon, 6 Jun 2022 20:36:10 -0700 Subject: [PATCH 1/5] i hate vomit code --- code/game/turfs/turf.dm | 22 ++++---- code/modules/mob/living/carbon/carbon.dm | 9 ++-- code/modules/mob/living/carbon/human/human.dm | 4 +- code/modules/surgery/stomachpump.dm | 53 +++++++++++++++++++ code/modules/surgery/surgery_step.dm | 14 +++++ yogstation.dme | 1 + 6 files changed, 85 insertions(+), 18 deletions(-) create mode 100644 code/modules/surgery/stomachpump.dm diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index 3276d2be9ee4..b54880c5725e 100644 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -516,7 +516,7 @@ GLOBAL_LIST_EMPTY(station_turfs) /turf/AllowDrop() return TRUE -/turf/proc/add_vomit_floor(mob/living/M, toxvomit = NONE) +/turf/proc/add_vomit_floor(mob/living/M, toxvomit = NONE, purge_ratio = 0.1) var/obj/effect/decal/cleanable/vomit/V = new /obj/effect/decal/cleanable/vomit(src, M.get_static_viruses()) @@ -525,19 +525,21 @@ GLOBAL_LIST_EMPTY(station_turfs) V = locate() in src if(!V) return - // Make toxins and blazaam vomit look different + // Apply the proper icon set based on vomit type if(toxvomit == VOMIT_PURPLE) V.icon_state = "vomitpurp_[pick(1,4)]" else if (toxvomit == VOMIT_TOXIC) V.icon_state = "vomittox_[pick(1,4)]" - if (iscarbon(M)) - var/mob/living/carbon/C = M - if(C.reagents) - clear_reagents_to_vomit_pool(C,V) - -/proc/clear_reagents_to_vomit_pool(mob/living/carbon/M, obj/effect/decal/cleanable/vomit/V) - M.reagents.trans_to(V, M.reagents.total_volume / 10, 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 (purge_ratio && iscarbon(M)) + clear_reagents_to_vomit_pool(M, V, purge_ratio) + +/proc/clear_reagents_to_vomit_pool(mob/living/carbon/M, obj/effect/decal/cleanable/vomit/V, purge_ratio = 0.1) + var/chemicals_lost = M.reagents.total_volume * purge_ratio + if(V.reagents.total_volume + chemicals_lost > V.reagents.maximum_volume) + V.reagents.total_volume -= chemicals_lost + M.reagents.trans_to(V, chemicals_lost, transfered_by = M) + //clear the stomach of anything even not food + for(var/datum/reagent/R in M.reagents.reagent_list) if(istype(R, /datum/reagent/consumable)) var/datum/reagent/consumable/nutri_check = R if(nutri_check.nutriment_factor >0) diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index cf5cbd64b0ec..1c5ceea3c4c6 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -497,8 +497,8 @@ return 0 return ..() -/mob/living/carbon/proc/vomit(lost_nutrition = 10, blood = FALSE, stun = TRUE, distance = 1, message = TRUE, toxic = FALSE) - if(HAS_TRAIT(src, TRAIT_NOHUNGER)) +/mob/living/carbon/proc/vomit(lost_nutrition = 10, blood = FALSE, stun = TRUE, distance = 1, message = TRUE, vomit_type = VOMIT_TOXIC, harm = TRUE, force = FALSE, purge_ratio = 0.1) + if((HAS_TRAIT(src, TRAIT_NOHUNGER) || HAS_TRAIT(src, TRAIT_TOXINLOVER)) && !force) return TRUE if(istype(src.loc, /obj/effect/dummy)) //cannot vomit while phasing/vomitcrawling @@ -538,12 +538,9 @@ add_splatter_floor(T) if(stun) 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)//toxic barf looks different + T.add_vomit_floor(src, vomit_type, purge_ratio) //toxic barf looks different || call purge when doing detoxicfication to pump more chems out of the stomach. T = get_step(T, dir) if (is_blocked_turf(T)) break diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 5bb356837e3e..92296e7d4668 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -869,8 +869,8 @@ override = dna.species.override_float ..() -/mob/living/carbon/human/vomit(lost_nutrition = 10, blood = 0, stun = 1, distance = 0, message = 1, toxic = 0) - if(blood && (NOBLOOD in dna.species.species_traits)) +/mob/living/carbon/human/vomit(lost_nutrition = 10, blood = FALSE, stun = TRUE, distance = 1, message = TRUE, vomit_type = VOMIT_TOXIC, harm = TRUE, force = FALSE, purge_ratio = 0.1) + if(blood && (NOBLOOD in dna.species.species_traits) && !HAS_TRAIT(src, TRAIT_TOXINLOVER)) if(message) visible_message(span_warning("[src] dry heaves!"), \ span_userdanger("You try to throw up, but there's nothing in your stomach!")) diff --git a/code/modules/surgery/stomachpump.dm b/code/modules/surgery/stomachpump.dm new file mode 100644 index 000000000000..bd8d516f9d66 --- /dev/null +++ b/code/modules/surgery/stomachpump.dm @@ -0,0 +1,53 @@ +/datum/surgery/stomach_pump + name = "Stomach Pump" + steps = list( + /datum/surgery_step/incise, + /datum/surgery_step/retract_skin, + /datum/surgery_step/incise, + /datum/surgery_step/clamp_bleeders, + /datum/surgery_step/stomach_pump, + /datum/surgery_step/close) + + target_mobtypes = list(/mob/living/carbon/human) + possible_locs = list(BODY_ZONE_CHEST) + requires_bodypart_type = TRUE + ignore_clothes = FALSE + +/datum/surgery/stomach_pump/can_start(mob/user, mob/living/carbon/target) + var/obj/item/organ/stomach/target_stomach = target.getorganslot(ORGAN_SLOT_STOMACH) + if(HAS_TRAIT(target, TRAIT_HUSK)) + return FALSE + if(!target_stomach) + return FALSE + return ..() + +//Working the stomach by hand in such a way that you induce vomiting. +/datum/surgery_step/stomach_pump + name = "Pump Stomach" + accept_hand = TRUE + repeatable = TRUE + time = 2 SECONDS + +/datum/surgery_step/stomach_pump/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) + display_results(user, target, span_notice("You begin pumping [target]'s stomach..."), + span_notice("[user] begins to pump [target]'s stomach."), + span_notice("[user] begins to press on [target]'s chest.")) + display_pain(target, "You feel a horrible sloshing feeling in your gut! You're going to be sick!") + +/datum/surgery_step/stomach_pump/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = FALSE) + if(ishuman(target)) + var/mob/living/carbon/human/target_human = target + display_results(user, target, span_notice("[user] forces [target_human] to vomit, cleansing their stomach of some chemicals!"), + span_notice("[user] forces [target_human] to vomit, cleansing their stomach of some chemicals!"), + "[user] forces [target_human] to vomit!") + target_human.vomit(20, FALSE, TRUE, 1, TRUE, FALSE, purge_ratio = 0.67) //higher purge ratio than regular vomiting + return ..() + +/datum/surgery_step/stomach_pump/failure(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) + if(ishuman(target)) + var/mob/living/carbon/human/target_human = target + display_results(user, target, span_warning("You screw up, brusing [target_human]'s chest!"), + span_warning("[user] screws up, brusing [target_human]'s chest!"), + span_warning("[user] screws up!")) + target_human.adjustOrganLoss(ORGAN_SLOT_STOMACH, 5) + target_human.adjustBruteLoss(5) diff --git a/code/modules/surgery/surgery_step.dm b/code/modules/surgery/surgery_step.dm index 783ca874960e..4f186960b8f1 100644 --- a/code/modules/surgery/surgery_step.dm +++ b/code/modules/surgery/surgery_step.dm @@ -193,3 +193,17 @@ //if(ishuman(target) &&fuckup_damage_type == BRUTE && prob(final_ouchie_chance/2)) //var/mob/living/carbon/human/H = target //H.bleed_rate += min(fuckup_damage/4, 10) + +/** + * Sends a pain message to the target, including a chance of screaming. + * + * Arguments: + * * target - Who the message will be sent to + * * pain_message - The message to be displayed + * * mechanical_surgery - Boolean flag that represents if a surgery step is done on a mechanical limb (therefore does not force scream) + */ +/datum/surgery_step/proc/display_pain(mob/living/target, pain_message, mechanical_surgery = FALSE) + if(target.stat < UNCONSCIOUS) + to_chat(target, span_userdanger(pain_message)) + if(prob(30) && !mechanical_surgery) + target.emote("scream") diff --git a/yogstation.dme b/yogstation.dme index df1d0a0453b2..37dba07d8668 100644 --- a/yogstation.dme +++ b/yogstation.dme @@ -3153,6 +3153,7 @@ #include "code\modules\surgery\prosthetic_replacement.dm" #include "code\modules\surgery\remove_embedded_object.dm" #include "code\modules\surgery\repair_puncture.dm" +#include "code\modules\surgery\stomachpump.dm" #include "code\modules\surgery\surgery.dm" #include "code\modules\surgery\surgery_step.dm" #include "code\modules\surgery\tools.dm" From fb4ed0470a95c980359c84e8bf4ed93aea1ca96b Mon Sep 17 00:00:00 2001 From: Chubbygummibear Date: Mon, 6 Jun 2022 21:14:04 -0700 Subject: [PATCH 2/5] toxic --- code/modules/antagonists/changeling/powers/panacea.dm | 4 ++-- code/modules/mob/living/carbon/human/life.dm | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/code/modules/antagonists/changeling/powers/panacea.dm b/code/modules/antagonists/changeling/powers/panacea.dm index 234b195b24d2..8eeb9b14795b 100644 --- a/code/modules/antagonists/changeling/powers/panacea.dm +++ b/code/modules/antagonists/changeling/powers/panacea.dm @@ -15,7 +15,7 @@ H.leave_victim() if(iscarbon(user)) var/mob/living/carbon/C = user - C.vomit(0, toxic = TRUE) + C.vomit(0) to_chat(user, span_notice("A parasite exits our form.")) ..() var/list/bad_organs = list( @@ -30,7 +30,7 @@ O.Remove(user) if(iscarbon(user)) var/mob/living/carbon/C = user - C.vomit(0, toxic = TRUE) + C.vomit(0) O.forceMove(get_turf(user)) user.reagents.add_reagent(/datum/reagent/medicine/mutadone, 10) diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index a685a17423ce..3eca7a5c4d9a 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -286,7 +286,7 @@ if(getToxLoss() >= 45 && nutrition > 20) lastpuke += prob(50) if(lastpuke >= 50) // about 25 second delay I guess - vomit(20, toxic = TRUE) + vomit(20) lastpuke = 0 From af7d8e6ca33a1ba516b0bd5986ad50f29b91d5e8 Mon Sep 17 00:00:00 2001 From: Chubbygummibear <46236974+Chubbygummibear@users.noreply.github.com> Date: Sat, 11 Jun 2022 20:55:32 -0700 Subject: [PATCH 3/5] Theos approved code Co-authored-by: Theos --- code/modules/surgery/surgery_step.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/surgery/surgery_step.dm b/code/modules/surgery/surgery_step.dm index 4f186960b8f1..1727e70c8b4f 100644 --- a/code/modules/surgery/surgery_step.dm +++ b/code/modules/surgery/surgery_step.dm @@ -203,7 +203,7 @@ * * mechanical_surgery - Boolean flag that represents if a surgery step is done on a mechanical limb (therefore does not force scream) */ /datum/surgery_step/proc/display_pain(mob/living/target, pain_message, mechanical_surgery = FALSE) - if(target.stat < UNCONSCIOUS) + if(!HAS_TRAIT(target, TRAIT_SURGERY_PREPARED)) to_chat(target, span_userdanger(pain_message)) if(prob(30) && !mechanical_surgery) target.emote("scream") From 43922ad7116521bcdba1dc1f1c77bdfbcd3639e6 Mon Sep 17 00:00:00 2001 From: Chubbygummibear <46236974+Chubbygummibear@users.noreply.github.com> Date: Wed, 15 Jun 2022 13:09:17 -0700 Subject: [PATCH 4/5] Anvil words Co-authored-by: Anvilman6 <54463777+Anvilman6@users.noreply.github.com> --- code/modules/surgery/stomachpump.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/surgery/stomachpump.dm b/code/modules/surgery/stomachpump.dm index bd8d516f9d66..07e47d2977b9 100644 --- a/code/modules/surgery/stomachpump.dm +++ b/code/modules/surgery/stomachpump.dm @@ -47,7 +47,7 @@ if(ishuman(target)) var/mob/living/carbon/human/target_human = target display_results(user, target, span_warning("You screw up, brusing [target_human]'s chest!"), - span_warning("[user] screws up, brusing [target_human]'s chest!"), + span_warning("[user] screws up, brusing [target_human]'s abdomen!"), span_warning("[user] screws up!")) target_human.adjustOrganLoss(ORGAN_SLOT_STOMACH, 5) target_human.adjustBruteLoss(5) From 45a1037afed772d3ce8d8e78b9d9112622f532e0 Mon Sep 17 00:00:00 2001 From: Chubbygummibear <46236974+Chubbygummibear@users.noreply.github.com> Date: Sat, 18 Jun 2022 13:47:20 -0700 Subject: [PATCH 5/5] anvil code Co-authored-by: Anvilman6 <54463777+Anvilman6@users.noreply.github.com> --- code/modules/surgery/stomachpump.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/surgery/stomachpump.dm b/code/modules/surgery/stomachpump.dm index 07e47d2977b9..45b57042b1ed 100644 --- a/code/modules/surgery/stomachpump.dm +++ b/code/modules/surgery/stomachpump.dm @@ -49,5 +49,5 @@ display_results(user, target, span_warning("You screw up, brusing [target_human]'s chest!"), span_warning("[user] screws up, brusing [target_human]'s abdomen!"), span_warning("[user] screws up!")) - target_human.adjustOrganLoss(ORGAN_SLOT_STOMACH, 5) + target_human.adjustOrganLoss(ORGAN_SLOT_STOMACH, 10) target_human.adjustBruteLoss(5)