From b4724b63fa3d54eb7fac6e62bcf8d151a944635d Mon Sep 17 00:00:00 2001 From: Contrabang <91113370+Contrabang@users.noreply.github.com> Date: Thu, 28 Aug 2025 19:10:32 -0400 Subject: [PATCH] More Suture Changes (#30164) * more suture changes * grammar --- code/__HELPERS/mob_helpers.dm | 8 ++ code/__HELPERS/pronouns.dm | 38 ++++++ .../objects/items/stacks/medical_packs.dm | 120 +++++++++++++----- icons/obj/medical.dmi | Bin 7641 -> 8984 bytes 4 files changed, 132 insertions(+), 34 deletions(-) diff --git a/code/__HELPERS/mob_helpers.dm b/code/__HELPERS/mob_helpers.dm index 1728382defb..fb2e078e9fd 100644 --- a/code/__HELPERS/mob_helpers.dm +++ b/code/__HELPERS/mob_helpers.dm @@ -498,6 +498,14 @@ GLOBAL_LIST_EMPTY(do_after_once_tracker) . = do_after(user, delay, needhand, target, progress, allow_moving, must_be_held, extra_checks = list(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(do_after_once_checks), cache_key, hidden)), interaction_key = interaction_key) GLOB.do_after_once_tracker[cache_key] = FALSE +// Please don't use this unless you absolutely need to. Just have a direct call to do_after_once whenever possible. +/proc/interrupt_do_after_once(mob/user, atom/target, special_identifier) + var/cache_key = "[user.UID()][target.UID()][special_identifier]" + if(GLOB.do_after_once_tracker[cache_key]) + GLOB.do_after_once_tracker[cache_key] = DOAFTERONCE_MAGIC + return TRUE + return FALSE + /proc/do_after_once_checks(cache_key) if(GLOB.do_after_once_tracker[cache_key] && GLOB.do_after_once_tracker[cache_key] == DOAFTERONCE_MAGIC) GLOB.do_after_once_tracker[cache_key] = FALSE diff --git a/code/__HELPERS/pronouns.dm b/code/__HELPERS/pronouns.dm index 2b3d41437c8..7d0c7e07487 100644 --- a/code/__HELPERS/pronouns.dm +++ b/code/__HELPERS/pronouns.dm @@ -248,6 +248,44 @@ if(temp_gender != PLURAL) . = "s" +// Internal dialogue pronouns. This allow replacements of "their" with "your", if the user and target are the same. Src should always be considered the "target". +/mob/proc/i_you(user, capitalized) + ASSERT(user) + if(src != user) + return p_they(capitalized) + . = "you" + if(capitalized) + . = capitalize(.) + +/mob/proc/i_your(user, capitalized) + ASSERT(user) + if(src != user) + return p_their(capitalized) + . = "your" + if(capitalized) + . = capitalize(.) + +/mob/proc/i_yourself(user, capitalized) + ASSERT(user) + if(src != user) + return src // don't say "himself", just refer to them by name + . = "yourself" + if(capitalized) + . = capitalize(.) + +/mob/proc/i_do(user) + ASSERT(user) + if(src != user) + return p_do() + . = "do" + +// External dialogue pronouns, similar to internal dialogue pronouns but for when the observer is a 3rd party. These should only really be used in visible_message() +/mob/proc/e_themselves(user, capitalized) + ASSERT(user) + if(src != user) + return src // refer to them by name, since its user acting on src + return p_themselves(capitalized) + ////////////////////////////// // MARK: Human procs ////////////////////////////// diff --git a/code/game/objects/items/stacks/medical_packs.dm b/code/game/objects/items/stacks/medical_packs.dm index e3840dbda7d..df59f896313 100644 --- a/code/game/objects/items/stacks/medical_packs.dm +++ b/code/game/objects/items/stacks/medical_packs.dm @@ -368,80 +368,95 @@ icon_state = "suture" gender = PLURAL merge_type = /obj/item/stack/medical/suture - healverb = "suturing" amount = 10 max_amount = 10 heal_brute = 10 stop_bleeding = 1200 dynamic_icon_state = TRUE delay = 1 SECONDS + healverb = "suturing" + var/healverb_past = "sutured" var/self_delay = 3 SECONDS - var/applying = FALSE + var/mob/current_target /obj/item/stack/medical/suture/apply(mob/living/carbon/human/target, mob/user) . = TRUE - if(applying) - to_chat(user, "You're already applying [src].") + if(current_target) + if(current_target != target) + to_chat(user, "You're already suturing [current_target].") + return + // Allow for cancelling of the target by clicking again + interrupt_do_after_once(user, current_target) + to_chat(user, "You stop [healverb] [target.i_yourself(user)].") return if(!ishuman(target) || !target.can_inject(user, TRUE)) return var/heal_type = (heal_brute ? BRUTE : BURN) var/heal_display = (heal_brute ? BRUTE : "burn") if(!target.get_damage_amount(heal_type)) - if(target == user) - to_chat(user, "You don't have any [heal_display] damage.") - else - to_chat(user, "They don't have any [heal_display] damage.") + to_chat(user, "[target.i_you(user, TRUE)] [target.i_do(user)]n't have any [heal_display] damage.") return var/obj/item/organ/external/current_limb = target.get_organ(user.zone_selected) if(!current_limb) - to_chat(user, "That limb is missing!") + to_chat(user, "That limb is missing!") return if(current_limb.is_robotic()) - to_chat(user, "This can't be used on a robotic limb.") + to_chat(user, "This can't be used on a robotic limb.") + return + // Swap to another limb if the current one has no damage. + if(!most_damaged_limb(target)) + to_chat(user, "[target.i_you(user, TRUE)] [target.i_do(user)]n't have any [heal_display] damage that could be [healverb_past].") return - if((heal_brute > 0 && !current_limb.brute_dam) || (heal_burn > 0 && !current_limb.burn_dam)) - if(!do_after(user, delay / 2, target = target)) - return - current_limb = most_damaged_limb(target) var/mend_time = delay if(target == user) - target.visible_message("[user] begins [healverb] [user.p_themselves()] with [src].", "You begin [healverb] your [current_limb.name] with [src].") mend_time = self_delay - else - user.visible_message("[user] begins [healverb] [target] with [src].", "You begin [healverb] [target.p_their()] [current_limb.name] with [src].") - applying = TRUE - while(do_after(user, mend_time, target = target)) - if(!target.can_inject(user, TRUE)) + user.visible_message("[user] begins [healverb] [target.e_themselves(user)] with [src].", "You begin [healverb] [target.i_your(user)] [current_limb.name] with [src].") + current_limb = try_swap_to_most_damaged_limb(target, user, current_limb) + if(!current_limb) + return + + var/last_targetted_zone = user.zone_selected + current_target = target + while(do_after_once(user, mend_time, target = target)) + if(!target.can_inject(user, TRUE, current_limb.limb_name)) break + var/cut_open = FALSE if(stop_bleeding) for(var/obj/item/organ/external/E in target.bodyparts) if(E.open >= ORGAN_ORGANIC_OPEN) cut_open = TRUE - to_chat(user, "[target]'s [E.name] is cut open, you'll need more than some [name] to stop their bleeding.") + to_chat(user, "[target]'s [E.name] is cut open, you'll need more than some [name] to stop [target.i_your(user)] bleeding.") break if(!apply_to(target, user, current_limb, !cut_open)) break if(is_zero_amount(TRUE)) break - if((heal_brute > 0 && !current_limb.brute_dam) || (heal_burn > 0 && !current_limb.burn_dam)) - if(!target.get_damage_amount(heal_type)) - if(target == user) - target.visible_message("[user] finishes [healverb] [user.p_themselves()] with [src].", "You finish [healverb] yourself with [src].") - else - user.visible_message("[user] finishes [healverb] [target] with [src].", "You finish [healverb] [target] with [src].") - break - if(!do_after(user, delay / 2, target = target)) - break - current_limb = most_damaged_limb(target) - to_chat(user, "You begin [healverb] [target == user ? "your" : target.p_their()] [current_limb.name] with [src].") - if(!target.can_inject(user, TRUE)) + if(!target.get_damage_amount(heal_type)) + user.visible_message("[user] finishes [healverb] [target.e_themselves(user)] with [src].", "You finish [healverb] [target.i_yourself(user)] with [src].") break - applying = FALSE + + var/skip_swap = FALSE + if(last_targetted_zone != user.zone_selected) + last_targetted_zone = user.zone_selected + var/new_limb = on_target_zone_change(target, user) + if(new_limb && current_limb != new_limb) + current_limb = new_limb + skip_swap = TRUE + to_chat(user, "You switch to [healverb] [target.i_your(user)] [current_limb.name].") + + if(!skip_swap) + current_limb = try_swap_to_most_damaged_limb(target, user, current_limb) + if(!current_limb) + user.visible_message("[user] finishes [healverb] [target.e_themselves(user)] with [src].", "You finish [healverb] [target.i_yourself(user)] with [src].") + break + + if(!target.can_inject(user, TRUE, current_limb.limb_name)) + break + current_target = null user.changeNext_move(CLICK_CD_MELEE) /obj/item/stack/medical/suture/proc/apply_to(mob/living/carbon/human/target, mob/user, obj/item/organ/external/current_limb, allow_stop_bleeding = TRUE) @@ -449,6 +464,7 @@ return FALSE current_limb.heal_damage(heal_brute, heal_burn, FALSE, FALSE, updating_health = TRUE) + target.UpdateDamageIcon() if(stop_bleeding && !target.bleedsuppress && allow_stop_bleeding) target.suppress_bloodloss(stop_bleeding) @@ -459,6 +475,10 @@ var/most_damaged_amount = 0 var/focus_brute = (heal_brute > 0) for(var/obj/item/organ/external/E in target.bodyparts) + if(QDELETED(E)) + continue + if(E.is_robotic()) + continue if(focus_brute) if(E.brute_dam > most_damaged_amount) most_damaged = E @@ -468,10 +488,41 @@ most_damaged_amount = E.burn_dam return most_damaged +/obj/item/stack/medical/suture/proc/try_swap_to_most_damaged_limb(mob/living/carbon/human/target, mob/user, obj/item/organ/external/current_limb) + if(heal_brute && current_limb.brute_dam) + return current_limb + if(heal_burn && current_limb.burn_dam) + return current_limb + + var/obj/item/organ/external/new_limb = most_damaged_limb(target) + if(!new_limb) + return + if(current_limb != new_limb) + to_chat(user, "You begin [healverb] [target.i_your(user)] [new_limb.name].") + if(!do_after(user, delay / 2, target = target)) + return + return new_limb + +/obj/item/stack/medical/suture/proc/on_target_zone_change(mob/living/carbon/human/target, mob/user) + var/obj/item/organ/external/new_limb = target.get_organ(user.zone_selected) + if(!new_limb) + to_chat(user, "That limb is missing!") + return FALSE + if(new_limb.is_robotic()) + to_chat(user, "This can't be used on a robotic limb.") + return FALSE + + if(heal_brute && new_limb.brute_dam) + return new_limb + if(heal_burn && new_limb.burn_dam) + return new_limb + return FALSE + /obj/item/stack/medical/suture/emergency name = "emergency sutures" singular_name = "emergency suture" desc = "A small bundle of cheap sutures. They're not pretty, but still quite effective at keeping the blood inside your body." + icon_state = "suture_emer" merge_type = /obj/item/stack/medical/suture/emergency heal_brute = 5 @@ -491,6 +542,7 @@ icon_state = "regen_mesh" merge_type = /obj/item/stack/medical/suture/regen_mesh healverb = "grafting" + healverb_past = "grafted" heal_brute = 0 heal_burn = 10 /// This var determines if the sterile packaging of the mesh has been opened. diff --git a/icons/obj/medical.dmi b/icons/obj/medical.dmi index 348a22f61caa95bea1a82328340395c8325e34b2..23f67c06c1cea8ec8a3f6ae460ad0851f24e57b6 100644 GIT binary patch literal 8984 zcma)CbyQWsw>~sVH`0($Wn#K&0VPf>M_dLApdbq>+;D@Y0RcCGWfb z-d}IM_11cSoHOT~nYHKJd%oG<%&Zfwud7b07RM^DhBAX1AXP<np^1;mTW>orCl4PdcQ*hC$olwO$GJ;@6le9jPt4=FdJfN~^RE(={K?$3rgVK1 zvj$^&TJ9^VEb&gUYSItdiUQ-NkLw}surY?$fvU{?rp0ULZ`pddK1(POHEYF??TGX) zaHvp`Ih&jhEC}~}q>KoG($yOfS`G(DuUMQt8;)U%H+mzlufCcH_?3?Adh`Ja@ zBo&x--)NByg)?0xFNXHviU>&?S7lRgx�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