From bc1ed62db8189ff5429a8517bd1104bd0b29fb41 Mon Sep 17 00:00:00 2001 From: Springf <10732668+SpringSkipper@users.noreply.github.com> Date: Thu, 27 Jun 2024 10:15:08 -0400 Subject: [PATCH] Flexible Digestion Damage (#8532) --- code/modules/vore/eating/belly_obj_vr.dm | 25 ++++++++++++-- code/modules/vore/eating/vorepanel_vr.dm | 44 +++++++++++++----------- 2 files changed, 47 insertions(+), 22 deletions(-) diff --git a/code/modules/vore/eating/belly_obj_vr.dm b/code/modules/vore/eating/belly_obj_vr.dm index 9d077fa87a..23901117c3 100644 --- a/code/modules/vore/eating/belly_obj_vr.dm +++ b/code/modules/vore/eating/belly_obj_vr.dm @@ -18,6 +18,7 @@ var/human_prey_swallow_time = 100 // Time in deciseconds to swallow /mob/living/carbon/human var/nonhuman_prey_swallow_time = 30 // Time in deciseconds to swallow anything else var/nutrition_percent = 100 // Nutritional percentage per tick in digestion mode + var/digest_max = 36 // CHOMPEdit; maximum total damage across all types var/digest_brute = 0.5 // Brute damage per tick in digestion mode var/digest_burn = 0.5 // Burn damage per tick in digestion mode var/digest_oxy = 0 // Oxy damage per tick in digestion mode @@ -470,7 +471,8 @@ "entrance_logs", "noise_freq", "private_struggle", - "item_digest_logs", //CHOMP end of variables from CHOMP + "item_digest_logs", + "digest_max", //CHOMP end of variables from CHOMP "egg_type", "save_digest_mode", "eating_privacy_local", @@ -1517,6 +1519,24 @@ return +//CHOMPEdit Start - new procs for handling digestion damage as a total rather than per-type +// Returns the current total digestion damage per tick of a belly. +/obj/belly/proc/get_total_digestion_damage() + return (digest_brute + digest_burn + digest_oxy + digest_tox + digest_clone) + +// Returns the remaining 'budget' of digestion damage between the current and the maximum. +/obj/belly/proc/get_unused_digestion_damage() + return max(digest_max - get_total_digestion_damage(), 0) + +/obj/belly/proc/set_zero_digestion_damage() + digest_brute = 0 + digest_burn = 0 + digest_oxy = 0 + digest_tox = 0 + digest_clone = 0 + return +// CHOMPEdit End + // Handle the death of a mob via digestion. // Called from the process_Life() methods of bellies that digest prey. // Default implementation calls M.death() and removes from internal contents. @@ -2592,7 +2612,8 @@ dupe.is_feedable = is_feedable dupe.entrance_logs = entrance_logs dupe.noise_freq = noise_freq - dupe.item_digest_logs = item_digest_logs //CHOMP end of variables from CHOMP + dupe.item_digest_logs = item_digest_logs + dupe.digest_max = digest_max //CHOMP end of variables from CHOMP dupe.belly_fullscreen = belly_fullscreen dupe.disable_hud = disable_hud diff --git a/code/modules/vore/eating/vorepanel_vr.dm b/code/modules/vore/eating/vorepanel_vr.dm index 329f8ba066..a10e1ceed1 100644 --- a/code/modules/vore/eating/vorepanel_vr.dm +++ b/code/modules/vore/eating/vorepanel_vr.dm @@ -1070,25 +1070,27 @@ var/global/list/belly_colorable_only_fullscreens = list("a_synth_flesh_mono", var/new_emote_time = belly_data["emote_time"] new_belly.emote_time = CLAMP(new_emote_time, 60, 600) + new_belly.set_zero_digestion_damage() // CHOMP Edit; needed for importing a belly to overwrite an existing belly; otherwise pre-existing values throw off the unused digestion damage. + if(isnum(belly_data["digest_brute"])) var/new_digest_brute = belly_data["digest_brute"] - new_belly.digest_brute = CLAMP(new_digest_brute, 0, 6) + new_belly.digest_brute = CLAMP(new_digest_brute, 0, new_belly.get_unused_digestion_damage()) // CHOMP Edit; clamped to unused damage instead of 6 if(isnum(belly_data["digest_burn"])) var/new_digest_burn = belly_data["digest_burn"] - new_belly.digest_burn = CLAMP(new_digest_burn, 0, 6) + new_belly.digest_burn = CLAMP(new_digest_burn, 0, new_belly.get_unused_digestion_damage()) // CHOMP Edit; clamped to unused damage instead of 6 if(isnum(belly_data["digest_oxy"])) var/new_digest_oxy = belly_data["digest_oxy"] - new_belly.digest_oxy = CLAMP(new_digest_oxy, 0, 12) + new_belly.digest_oxy = CLAMP(new_digest_oxy, 0, new_belly.get_unused_digestion_damage()) // CHOMP Edit; clamped to unused damage instead of 12 if(isnum(belly_data["digest_tox"])) var/new_digest_tox = belly_data["digest_tox"] - new_belly.digest_tox = CLAMP(new_digest_tox, 0, 6) + new_belly.digest_tox = CLAMP(new_digest_tox, 0, new_belly.get_unused_digestion_damage()) // CHOMP Edit; clamped to unused damage instead of 6 if(isnum(belly_data["digest_clone"])) var/new_digest_clone = belly_data["digest_clone"] - new_belly.digest_clone = CLAMP(new_digest_clone, 0, 6) + new_belly.digest_clone = CLAMP(new_digest_clone, 0, new_belly.get_unused_digestion_damage()) // CHOMP Edit; clamped to unused damage instead of 6 if(isnum(belly_data["shrink_grow_size"])) var/new_shrink_grow_size = belly_data["shrink_grow_size"] @@ -3262,43 +3264,45 @@ var/global/list/belly_colorable_only_fullscreens = list("a_synth_flesh_mono", var/new_new_nutrition = CLAMP(new_nutrition, 0.01, 100) host.vore_selected.nutrition_percent = new_new_nutrition . = TRUE + // CHOMPEdit Start - modified these to be flexible rather than maxing at 6/6/12/6/6 if("b_burn_dmg") - var/new_damage = tgui_input_number(user, "Choose the amount of burn damage prey will take per tick. Ranges from 0 to 6.", "Set Belly Burn Damage.", host.vore_selected.digest_burn, 6, 0, round_value=FALSE) + var/new_damage = tgui_input_number(user, "Choose the amount of burn damage prey will take per tick. Max of [host.vore_selected.digest_max] across all damage types. [host.vore_selected.get_unused_digestion_damage() + host.vore_selected.digest_burn] remaining.", "Set Belly Burn Damage.", host.vore_selected.digest_burn, host.vore_selected.get_unused_digestion_damage() + host.vore_selected.digest_burn, 0, round_value=FALSE) if(new_damage == null) return FALSE - var/new_new_damage = CLAMP(new_damage, 0, 6) - host.vore_selected.digest_burn = new_new_damage + new_damage = CLAMP(new_damage, 0, host.vore_selected.get_unused_digestion_damage() + host.vore_selected.digest_burn) // sanity check following tgui input + host.vore_selected.digest_burn = new_damage host.vore_selected.items_preserved.Cut() //CHOMPAdd . = TRUE if("b_brute_dmg") - var/new_damage = tgui_input_number(user, "Choose the amount of brute damage prey will take per tick. Ranges from 0 to 6", "Set Belly Brute Damage.", host.vore_selected.digest_brute, 6, 0, round_value=FALSE) + var/new_damage = tgui_input_number(user, "Choose the amount of brute damage prey will take per tick. Max of [host.vore_selected.digest_max] across all damage types. [host.vore_selected.get_unused_digestion_damage() + host.vore_selected.digest_brute] remaining.", "Set Belly Brute Damage.", host.vore_selected.digest_brute, host.vore_selected.get_unused_digestion_damage() + host.vore_selected.digest_brute, 0, round_value=FALSE) if(new_damage == null) return FALSE - var/new_new_damage = CLAMP(new_damage, 0, 6) - host.vore_selected.digest_brute = new_new_damage + new_damage = CLAMP(new_damage, 0, host.vore_selected.get_unused_digestion_damage() + host.vore_selected.digest_brute) + host.vore_selected.digest_brute = new_damage host.vore_selected.items_preserved.Cut() //CHOMPAdd . = TRUE if("b_oxy_dmg") - var/new_damage = tgui_input_number(user, "Choose the amount of suffocation damage prey will take per tick. Ranges from 0 to 12.", "Set Belly Suffocation Damage.", host.vore_selected.digest_oxy, 12, 0, round_value=FALSE) + var/new_damage = tgui_input_number(user, "Choose the amount of oxygen damage prey will take per tick. Max of [host.vore_selected.digest_max] across all damage types. [host.vore_selected.get_unused_digestion_damage() + host.vore_selected.digest_oxy] remaining.", "Set Belly Oxygen Damage.", host.vore_selected.digest_oxy, host.vore_selected.get_unused_digestion_damage() + host.vore_selected.digest_oxy, 0, round_value=FALSE) if(new_damage == null) return FALSE - var/new_new_damage = CLAMP(new_damage, 0, 12) - host.vore_selected.digest_oxy = new_new_damage + new_damage = CLAMP(new_damage, 0, host.vore_selected.get_unused_digestion_damage() + host.vore_selected.digest_oxy) + host.vore_selected.digest_oxy = new_damage . = TRUE if("b_tox_dmg") - var/new_damage = tgui_input_number(user, "Choose the amount of toxins damage prey will take per tick. Ranges from 0 to 6", "Set Belly Toxins Damage.", host.vore_selected.digest_tox, 6, 0, round_value=FALSE) + var/new_damage = tgui_input_number(user, "Choose the amount of toxin damage prey will take per tick. Max of [host.vore_selected.digest_max] across all damage types. [host.vore_selected.get_unused_digestion_damage() + host.vore_selected.digest_tox] remaining.", "Set Belly Toxin Damage.", host.vore_selected.digest_tox, host.vore_selected.get_unused_digestion_damage() + host.vore_selected.digest_tox, 0, round_value=FALSE) if(new_damage == null) return FALSE - var/new_new_damage = CLAMP(new_damage, 0, 6) - host.vore_selected.digest_tox = new_new_damage + new_damage = CLAMP(new_damage, 0, host.vore_selected.get_unused_digestion_damage() + host.vore_selected.digest_tox) + host.vore_selected.digest_tox = new_damage . = TRUE if("b_clone_dmg") - var/new_damage = tgui_input_number(user, "Choose the amount of brute DNA damage (clone) prey will take per tick. Ranges from 0 to 6", "Set Belly Clone Damage.", host.vore_selected.digest_clone, 6, 0, round_value=FALSE) + var/new_damage = tgui_input_number(user, "Choose the amount of genetic (clone) damage prey will take per tick. Max of [host.vore_selected.digest_max] across all damage types. [host.vore_selected.get_unused_digestion_damage() + host.vore_selected.digest_clone] remaining.", "Set Belly Genetic Damage.", host.vore_selected.digest_clone, host.vore_selected.get_unused_digestion_damage() + host.vore_selected.digest_clone, 0, round_value=FALSE) if(new_damage == null) return FALSE - var/new_new_damage = CLAMP(new_damage, 0, 6) - host.vore_selected.digest_clone = new_new_damage + new_damage = CLAMP(new_damage, 0, host.vore_selected.get_unused_digestion_damage() + host.vore_selected.digest_clone) + host.vore_selected.digest_clone = new_damage . = TRUE + // CHOMPEdit End if("b_drainmode") var/list/menu_list = host.vore_selected.drainmodes.Copy() var/new_drainmode = tgui_input_list(user, "Choose Mode (currently [host.vore_selected.digest_mode])", "Mode Choice", menu_list) //ChompEDIT - user, not usr