[MIRROR] Add a new process option: Break Bone (#11080)

Co-authored-by: ShadowLarkens <shadowlarkens@gmail.com>
Co-authored-by: Kashargul <144968721+Kashargul@users.noreply.github.com>
This commit is contained in:
CHOMPStation2StaffMirrorBot
2025-06-18 01:53:41 -07:00
committed by GitHub
parent 4675ad14ea
commit 46d63bba00
5 changed files with 122 additions and 53 deletions

View File

@@ -409,6 +409,14 @@
parts += O parts += O
return parts return parts
//Returns a list of fracturable organs
/mob/living/carbon/human/proc/get_fracturable_organs()
var/list/obj/item/organ/external/parts = list()
for(var/obj/item/organ/external/O in organs)
if(O.is_fracturable())
parts += O
return parts
//Heals ONE external organ, organ gets randomly selected from damaged ones. //Heals ONE external organ, organ gets randomly selected from damaged ones.
//It automatically updates damage overlays if necesary //It automatically updates damage overlays if necesary
//It automatically updates health status //It automatically updates health status

View File

@@ -289,6 +289,13 @@
//Continued damage to vital organs can kill you, and robot organs don't count towards total damage so no need to cap them. //Continued damage to vital organs can kill you, and robot organs don't count towards total damage so no need to cap them.
return (vital || (robotic >= ORGAN_ROBOT) || brute_dam + burn_dam + additional_damage < max_damage) return (vital || (robotic >= ORGAN_ROBOT) || brute_dam + burn_dam + additional_damage < max_damage)
/obj/item/organ/external/proc/is_fracturable()
if(robotic >= ORGAN_ROBOT)
return FALSE //ORGAN_BROKEN doesn't have the same meaning for robot limbs
if((status & ORGAN_BROKEN) || cannot_break)
return FALSE
return TRUE
/obj/item/organ/external/take_damage(brute, burn, sharp, edge, used_weapon = null, list/forbidden_limbs = list(), permutation = FALSE, projectile) /obj/item/organ/external/take_damage(brute, burn, sharp, edge, used_weapon = null, list/forbidden_limbs = list(), permutation = FALSE, projectile)
brute = round(brute * brute_mod, 0.1) brute = round(brute * brute_mod, 0.1)
burn = round(burn * burn_mod, 0.1) burn = round(burn * burn_mod, 0.1)
@@ -1133,14 +1140,25 @@ Note that amputating the affected organ does in fact remove the infection from t
return return
if(owner) if(owner)
if(organ_can_feel_pain() && !isbelly(owner.loc) && !isliving(owner.loc) && !owner.transforming) var/show_message = TRUE
//CHOMPEdit Begin var/scream = TRUE
if(!organ_can_feel_pain() || owner.transforming)
show_message = FALSE
scream = FALSE
if(isbelly(owner.loc) || isliving(owner.loc))
scream = FALSE
if(!owner.digest_pain)
show_message = FALSE
if(show_message)
// CHOMPEdit Start
owner.custom_pain(pick(\ owner.custom_pain(pick(\
span_danger("You hear a loud cracking sound coming from \the [owner]."),\ span_danger("You hear a loud cracking sound coming from \the [owner]."),\
span_danger("Something feels like it shattered in your [name]!"),\ span_danger("Something feels like it shattered in your [name]!"),\
span_danger("You hear a sickening crack.")),brokenpain) span_danger("You hear a sickening crack.")), brokenpain)
//CHOMPEdit End // CHOMPEdit End
owner.emote("scream") if(scream)
owner.emote("scream")
jostle_bone() jostle_bone()
if(istype(owner.loc, /obj/belly)) //CHOMPedit, bone breaks in bellys should be whisper range to prevent bar wide blender prefbreak. This is a hacky passive hardcode, if a pref gets added, remove this if else if(istype(owner.loc, /obj/belly)) //CHOMPedit, bone breaks in bellys should be whisper range to prevent bar wide blender prefbreak. This is a hacky passive hardcode, if a pref gets added, remove this if else

View File

@@ -0,0 +1,81 @@
/obj/belly/proc/instant_digest(mob/user, mob/living/target)
if(target.absorbed)
to_chat(user, span_vwarning("\The [target] is absorbed, and cannot presently be digested."))
return FALSE
if(tgui_alert(target, "\The [user] is attempting to instantly digest you. Is this something you are okay with happening to you?","Instant Digest", list("No", "Yes")) != "Yes")
to_chat(user, span_vwarning("\The [target] declined your digest attempt."))
to_chat(target, span_vwarning("You declined the digest attempt."))
return FALSE
// must be checked after alert
if(target.loc != src)
to_chat(user, span_vwarning("\The [target] is no longer in \the [src]."))
return FALSE
if(isliving(user))
var/mob/living/l = user
var/thismuch = target.health + 100
if(ishuman(l))
var/mob/living/carbon/human/h = l
thismuch = thismuch * h.species.digestion_nutrition_modifier
l.adjust_nutrition(thismuch)
target.death() // To make sure all on-death procs get properly called
if(target)
if(target.check_sound_preference(/datum/preference/toggle/digestion_noises))
if(!fancy_vore)
SEND_SOUND(target, sound(get_sfx("classic_death_sounds")))
else
SEND_SOUND(target, sound(get_sfx("fancy_death_prey")))
target.mind?.vore_death = TRUE
handle_digestion_death(target)
return TRUE
/obj/belly/proc/instant_break_bone(mob/user, mob/living/target)
if(!ishuman(target))
to_chat(user, span_vwarning("\The [target] has no breakable organs."))
return FALSE
if(target.absorbed)
to_chat(user, span_vwarning("\The [target] is absorbed, and cannot presently be broken."))
return FALSE
if(tgui_alert(target, "\The [user] is attempting to break one of your bones. Is this something you are okay with happening to you?","Break Bones", list("No", "Yes")) != "Yes")
to_chat(user, span_vwarning("\The [target] declined your breaking bones attempt."))
to_chat(target, span_vwarning("You declined the breaking bones attempt."))
return FALSE
if(target.loc != src)
to_chat(user, span_vwarning("\The [target] is no longer in \the [src]."))
return FALSE
var/mob/living/carbon/human/human_target = target
var/obj/item/organ/external/target_organ = pick(human_target.get_fracturable_organs())
if(!target_organ)
to_chat(user, span_vwarning("\The [target] has no breakable organs."))
return FALSE
to_chat(user, span_vwarning("You break [target]'s [target_organ]!"))
target_organ.fracture()
return TRUE
/obj/belly/proc/instant_absorb(mob/user, mob/living/target)
if(tgui_alert(target, "\The [user] is attempting to instantly absorb you. Is this something you are okay with happening to you?","Instant Absorb", list("No", "Yes")) != "Yes")
to_chat(user, span_vwarning("\The [target] declined your absorb attempt."))
to_chat(target, span_vwarning("You declined the absorb attempt."))
return FALSE
if(target.loc != src)
to_chat(user, span_vwarning("\The [target] is no longer in \the [src]."))
return FALSE
if(isliving(user))
var/mob/living/l = user
l.adjust_nutrition(target.nutrition)
var/n = 0 - target.nutrition
target.adjust_nutrition(n)
absorb_living(target)
return TRUE
/obj/belly/proc/instant_knockout(mob/user, mob/living/target)
if(tgui_alert(target, "\The [user] is attempting to instantly make you unconscious, you will be unable until ejected from the pred. Is this something you are okay with happening to you?","Instant Knockout", list("No", "Yes")) != "Yes")
to_chat(user, span_vwarning("\The [target] declined your knockout attempt."))
to_chat(target, span_vwarning("You declined the knockout attempt."))
return FALSE
if(target.loc != src)
to_chat(user, span_vwarning("\The [target] is no longer in \the [src]."))
return FALSE
target.AdjustSleeping(500000)
to_chat(target, span_vwarning("\The [user] has put you to sleep, you will remain unconscious until ejected from the belly."))
return TRUE

View File

@@ -1227,6 +1227,7 @@
if(ourtarget.digestable) if(ourtarget.digestable)
process_options += "Digest" process_options += "Digest"
process_options += "Break Bone"
if(ourtarget.absorbable) if(ourtarget.absorbable)
process_options += "Absorb" process_options += "Absorb"
@@ -1246,58 +1247,18 @@
to_chat(user, span_vwarning("You cannot instantly process [ourtarget].")) to_chat(user, span_vwarning("You cannot instantly process [ourtarget]."))
return FALSE return FALSE
var/obj/belly/b = ourtarget.loc var/obj/belly/b = ourtarget.loc
if(!istype(b) || b.owner != user)
to_chat(user, span_vwarning("[ourtarget] isn't in your belly."))
return FALSE
switch(ourchoice) switch(ourchoice)
if("Digest") if("Digest")
if(ourtarget.absorbed) return b.instant_digest(user, ourtarget)
to_chat(user, span_vwarning("\The [ourtarget] is absorbed, and cannot presently be digested.")) if("Break Bone")
return FALSE return b.instant_break_bone(user, ourtarget)
if(tgui_alert(ourtarget, "\The [user] is attempting to instantly digest you. Is this something you are okay with happening to you?","Instant Digest", list("No", "Yes")) != "Yes")
to_chat(user, span_vwarning("\The [ourtarget] declined your digest attempt."))
to_chat(ourtarget, span_vwarning("You declined the digest attempt."))
return FALSE
if(ourtarget.loc != b)
to_chat(user, span_vwarning("\The [ourtarget] is no longer in \the [b]."))
return FALSE
if(isliving(user))
var/mob/living/l = user
var/thismuch = ourtarget.health + 100
if(ishuman(l))
var/mob/living/carbon/human/h = l
thismuch = thismuch * h.species.digestion_nutrition_modifier
l.adjust_nutrition(thismuch)
ourtarget.death() // To make sure all on-death procs get properly called
if(ourtarget)
if(ourtarget.check_sound_preference(/datum/preference/toggle/digestion_noises))
if(!b.fancy_vore)
SEND_SOUND(ourtarget, sound(get_sfx("classic_death_sounds")))
else
SEND_SOUND(ourtarget, sound(get_sfx("fancy_death_prey")))
ourtarget.mind?.vore_death = TRUE
b.handle_digestion_death(ourtarget)
if("Absorb") if("Absorb")
if(tgui_alert(ourtarget, "\The [user] is attempting to instantly absorb you. Is this something you are okay with happening to you?","Instant Absorb", list("No", "Yes")) != "Yes") return b.instant_absorb(user, ourtarget)
to_chat(user, span_vwarning("\The [ourtarget] declined your absorb attempt."))
to_chat(ourtarget, span_vwarning("You declined the absorb attempt."))
return FALSE
if(ourtarget.loc != b)
to_chat(user, span_vwarning("\The [ourtarget] is no longer in \the [b]."))
return FALSE
if(isliving(user))
var/mob/living/l = user
l.adjust_nutrition(ourtarget.nutrition)
var/n = 0 - ourtarget.nutrition
ourtarget.adjust_nutrition(n)
b.absorb_living(ourtarget)
if("Knockout") if("Knockout")
if(tgui_alert(ourtarget, "\The [user] is attempting to instantly make you unconscious, you will be unable until ejected from the pred. Is this something you are okay with happening to you?","Instant Knockout", list("No", "Yes")) != "Yes") return b.instant_knockout(user, ourtarget)
to_chat(user, span_vwarning("\The [ourtarget] declined your knockout attempt."))
to_chat(ourtarget, span_vwarning("You declined the knockout attempt."))
return FALSE
if(ourtarget.loc != b)
to_chat(user, span_vwarning("\The [ourtarget] is no longer in \the [b]."))
return FALSE
ourtarget.AdjustSleeping(500000)
to_chat(ourtarget, span_vwarning("\The [user] has put you to sleep, you will remain unconscious until ejected from the belly."))
if("Cancel") if("Cancel")
return FALSE return FALSE
if("Health Check") if("Health Check")

View File

@@ -4660,6 +4660,7 @@
#include "code\modules\vore\appearance\preferences_vr.dm" #include "code\modules\vore\appearance\preferences_vr.dm"
#include "code\modules\vore\appearance\sprite_accessories_yw.dm" #include "code\modules\vore\appearance\sprite_accessories_yw.dm"
#include "code\modules\vore\appearance\update_icons_vr.dm" #include "code\modules\vore\appearance\update_icons_vr.dm"
#include "code\modules\vore\eating\belly_actions.dm"
#include "code\modules\vore\eating\belly_dat_vr.dm" #include "code\modules\vore\eating\belly_dat_vr.dm"
#include "code\modules\vore\eating\belly_import.dm" #include "code\modules\vore\eating\belly_import.dm"
#include "code\modules\vore\eating\belly_messages.dm" #include "code\modules\vore\eating\belly_messages.dm"