diff --git a/code/datums/observation/stat_set.dm b/code/datums/observation/stat_set.dm
index b980d06ecc..6bc6ea45f0 100644
--- a/code/datums/observation/stat_set.dm
+++ b/code/datums/observation/stat_set.dm
@@ -22,3 +22,12 @@ GLOBAL_DATUM_INIT(stat_set_event, /decl/observ/stat_set, new)
. = ..()
if(stat != old_stat)
GLOB.stat_set_event.raise_event(src, old_stat, new_stat)
+
+ if(isbelly(src.loc))
+ var/obj/belly/ourbelly = src.loc
+ if(!ourbelly.owner.client)
+ return
+ if(stat == CONSCIOUS)
+ to_chat(ourbelly.owner, "\The [src.name] is awake.")
+ else if(stat == UNCONSCIOUS)
+ to_chat(ourbelly.owner, "\The [src.name] has fallen unconscious!")
diff --git a/code/game/objects/items/weapons/material/shards.dm b/code/game/objects/items/weapons/material/shards.dm
index dbae1eead7..5432d46f32 100644
--- a/code/game/objects/items/weapons/material/shards.dm
+++ b/code/game/objects/items/weapons/material/shards.dm
@@ -50,7 +50,7 @@
if(W.has_tool_quality(TOOL_WELDER) && material.shard_can_repair)
var/obj/item/weapon/weldingtool/WT = W.get_welder()
if(WT.remove_fuel(0, user))
- material.place_sheet(loc)
+ material.place_sheet(loc, 1)
qdel(src)
return
return ..()
diff --git a/code/game/objects/structures/stool_bed_chair_nest/bed.dm b/code/game/objects/structures/stool_bed_chair_nest/bed.dm
index 5a934a7e0e..bbbe4302e6 100644
--- a/code/game/objects/structures/stool_bed_chair_nest/bed.dm
+++ b/code/game/objects/structures/stool_bed_chair_nest/bed.dm
@@ -159,7 +159,7 @@
/obj/structure/bed/proc/remove_padding()
if(padding_material)
- padding_material.place_sheet(get_turf(src))
+ padding_material.place_sheet(get_turf(src), 1)
padding_material = null
update_icon()
@@ -168,9 +168,9 @@
update_icon()
/obj/structure/bed/proc/dismantle()
- material.place_sheet(get_turf(src))
+ material.place_sheet(get_turf(src), 1)
if(padding_material)
- padding_material.place_sheet(get_turf(src))
+ padding_material.place_sheet(get_turf(src), 1)
/obj/structure/bed/psych
name = "psychiatrist's couch"
diff --git a/code/game/objects/structures/stool_bed_chair_nest/stools.dm b/code/game/objects/structures/stool_bed_chair_nest/stools.dm
index c1e343a42d..edff9e470f 100644
--- a/code/game/objects/structures/stool_bed_chair_nest/stools.dm
+++ b/code/game/objects/structures/stool_bed_chair_nest/stools.dm
@@ -67,7 +67,7 @@ var/global/list/stool_cache = list() //haha stool
/obj/item/weapon/stool/proc/remove_padding()
if(padding_material)
- padding_material.place_sheet(get_turf(src))
+ padding_material.place_sheet(get_turf(src), 1)
padding_material = null
update_icon()
@@ -104,9 +104,9 @@ var/global/list/stool_cache = list() //haha stool
/obj/item/weapon/stool/proc/dismantle()
if(material)
- material.place_sheet(get_turf(src))
+ material.place_sheet(get_turf(src), 1)
if(padding_material)
- padding_material.place_sheet(get_turf(src))
+ padding_material.place_sheet(get_turf(src), 1)
qdel(src)
/obj/item/weapon/stool/attackby(obj/item/weapon/W as obj, mob/user as mob)
diff --git a/code/modules/client/preference_setup/global/setting_datums.dm b/code/modules/client/preference_setup/global/setting_datums.dm
index 5ea3b57973..5354527af6 100644
--- a/code/modules/client/preference_setup/global/setting_datums.dm
+++ b/code/modules/client/preference_setup/global/setting_datums.dm
@@ -344,6 +344,12 @@ var/list/_client_preferences_by_type
enabled_description = "On"
disabled_description = "Off"
+/datum/client_preference/vore_health_bars
+ description = "Vore Health Bars"
+ key = "VORE_HEALTH_BARS"
+ enabled_description = "Enabled"
+ disabled_description = "Disabled"
+
/datum/client_preference/runechat_mob
description = "Runechat (Mobs)"
key = "RUNECHAT_MOB"
diff --git a/code/modules/client/preferences_toggle_procs.dm b/code/modules/client/preferences_toggle_procs.dm
index 027a6fc87a..c9834d790d 100644
--- a/code/modules/client/preferences_toggle_procs.dm
+++ b/code/modules/client/preferences_toggle_procs.dm
@@ -481,6 +481,19 @@ CHOMPRemove. Bundled voice sounds into emote/whisper/subtle. Going this extra le
feedback_add_details("admin_verb","TSubtleSounds")
*/
+/client/verb/toggle_vore_health_bars()
+ set name = "Toggle Vore Health Bars"
+ set category = "Preferences"
+ set desc = "Toggle the display of vore related health bars"
+
+ var/pref_path = /datum/client_preference/vore_health_bars
+ toggle_preference(pref_path)
+ SScharacter_setup.queue_preferences_save(prefs)
+
+ to_chat(src, "Vore related health bars - [(is_preference_enabled(/datum/client_preference/vore_health_bars)) ? "Enabled" : "Disabled"]")
+
+ feedback_add_details("admin_verb","TVoreHealthBars")
+
// Not attached to a pref datum because those are strict binary toggles
/client/verb/toggle_examine_mode()
set name = "Toggle Examine Mode"
diff --git a/code/modules/materials/materials/_materials.dm b/code/modules/materials/materials/_materials.dm
index be14faf62a..4c5bf68af3 100644
--- a/code/modules/materials/materials/_materials.dm
+++ b/code/modules/materials/materials/_materials.dm
@@ -322,7 +322,7 @@ var/list/name_to_material
// General wall debris product placement.
// Not particularly necessary aside from snowflakey cult girders.
/datum/material/proc/place_dismantled_product(var/turf/target)
- place_sheet(target)
+ place_sheet(target, 1)
// Debris product. Used ALL THE TIME.
/datum/material/proc/place_sheet(var/turf/target, amount)
diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm
index 5f8ef99a03..333070b352 100644
--- a/code/modules/mob/mob.dm
+++ b/code/modules/mob/mob.dm
@@ -696,6 +696,7 @@
stat("Keys Held", keys2text(client.move_keys_held | client.mod_keys_held))
stat("Next Move ADD", dirs2text(client.next_move_dir_add))
stat("Next Move SUB", dirs2text(client.next_move_dir_sub))
+ stat("Current size:", size_multiplier * 100)
if(statpanel("MC"))
stat("Location:", "([x], [y], [z]) [loc]")
diff --git a/code/modules/tables/tables.dm b/code/modules/tables/tables.dm
index 698feefe2f..2dcbf82290 100644
--- a/code/modules/tables/tables.dm
+++ b/code/modules/tables/tables.dm
@@ -305,13 +305,13 @@ var/list/table_icon_cache = list()
var/obj/item/weapon/material/shard/S = null
if(reinforced)
if(reinforced.stack_type && (full_return || prob(20)))
- reinforced.place_sheet(loc)
+ reinforced.place_sheet(loc, 1)
else
S = reinforced.place_shard(loc)
if(S) shards += S
if(material)
if(material.stack_type && (full_return || prob(20)))
- material.place_sheet(loc)
+ material.place_sheet(loc, 1)
else
S = material.place_shard(loc)
if(S) shards += S
diff --git a/code/modules/vore/chat_healthbars.dm b/code/modules/vore/chat_healthbars.dm
new file mode 100644
index 0000000000..95d32afa05
--- /dev/null
+++ b/code/modules/vore/chat_healthbars.dm
@@ -0,0 +1,113 @@
+//Health bars in the game window would be pretty challenging and I don't know how to do that, so I thought this would be a good alternative
+
+/mob/living/proc/chat_healthbar(var/mob/living/reciever, override = FALSE)
+ if(!reciever) //No one to send it to, don't bother
+ return
+ if(!reciever.client) //No one is home, don't bother
+ return
+ if(!override) //Did the person push the verb? Ignore the pref
+ if(!reciever.client.is_preference_enabled(/datum/client_preference/vore_health_bars))
+ return
+ var/ourpercent = 0
+
+ if(ishuman(src)) //humans don't die or become unconcious at 0%, it's actually like -50% or something, so, let's pretend they have 50 more health than they do
+ ourpercent = ((health + 50) / (maxHealth + 50)) * 100
+ else
+ ourpercent = (health / maxHealth) * 100
+
+ var/ourbar = ""
+ var/obj/belly/ourbelly = src.loc
+ var/which_var = "Health"
+ if(ourbelly.digest_mode == "Absorb" || ourbelly.digest_mode == "Drain")
+ ourpercent = round(((nutrition - 100) / 500) * 100)
+ which_var = "Nutrition" //It's secretly also a nutrition bar depending on your digest mode
+
+ ourpercent = round(ourpercent)
+
+ switch(ourpercent) //I thought about trying to do this in a more automated way but my brain isn't very large so enjoy my stupid switch statement
+ if(100)
+ ourbar = "|▓▓▓▓▓▓▓▓▓▓|"
+ if(95 to 99)
+ ourbar = "|▓▓▓▓▓▓▓▓▓▒|"
+ if(90 to 94)
+ ourbar = "|▓▓▓▓▓▓▓▓▓░|"
+ if(85 to 89)
+ ourbar = "|▓▓▓▓▓▓▓▓▒░|"
+ if(80 to 84)
+ ourbar = "|▓▓▓▓▓▓▓▓░░|"
+ if(75 to 79)
+ ourbar = "|▓▓▓▓▓▓▓▒░░|"
+ if(70 to 74)
+ ourbar = "|▓▓▓▓▓▓▓░░░|"
+ if(65 to 69)
+ ourbar = "|▓▓▓▓▓▓▒░░░|"
+ if(60 to 64)
+ ourbar = "|▓▓▓▓▓▓░░░░|"
+ if(55 to 59)
+ ourbar = "|▓▓▓▓▓▒░░░░|"
+ if(50 to 54)
+ ourbar = "|▓▓▓▓▓░░░░░|"
+ if(45 to 49)
+ ourbar = "|▓▓▓▓▒░░░░░|"
+ if(40 to 44)
+ ourbar = "|▓▓▓▓░░░░░░|"
+ if(35 to 39)
+ ourbar = "|▓▓▓▒░░░░░░|"
+ if(30 to 34)
+ ourbar = "|▓▓▓░░░░░░░|"
+ if(25 to 29)
+ ourbar = "|▓▓▒░░░░░░░|"
+ if(20 to 24)
+ ourbar = "|▓▓░░░░░░░░|"
+ if(15 to 19)
+ ourbar = "|▓▒░░░░░░░░|"
+ if(10 to 14)
+ ourbar = "|▓░░░░░░░░░|"
+ if(5 to 9)
+ ourbar = "|▒░░░░░░░░░|"
+ if(0)
+ ourbar = "|░░░░░░░░░░|"
+ else
+ ourbar = "!░░░░░░░░░░!"
+
+ ourbar = "[ourbar] [which_var] - [src.name]"
+
+ if(stat == UNCONSCIOUS)
+ ourbar = "[ourbar] - [span_orange("UNCONSCIOUS")]"
+ else if(stat == DEAD)
+ ourbar = "[ourbar] - [span_red("DEAD")]"
+ if(absorbed)
+ ourbar = span_purple("[ourbar] - ABSORBED") //Absorb is a little funny, I didn't want it to say 'absorbing ABSORBED' so we did it different
+ else if(ourpercent > 75)
+ ourbar = span_green("[ourbar] - [ourbelly.digest_mode]ing")
+ else if(ourpercent > 50)
+ ourbar = span_yellow("[ourbar] - [ourbelly.digest_mode]ing")
+ else if(ourpercent > 25)
+ ourbar = span_orange("[ourbar] - [ourbelly.digest_mode]ing")
+ else if(ourpercent > 0)
+ ourbar = span_red("[ourbar] - [ourbelly.digest_mode]ing")
+ else
+ ourbar = "[ourbar] - [ourbelly.digest_mode]ing"
+
+ to_chat(reciever,"[ourbar]")
+
+/mob/living/verb/print_healthbars()
+ set name = "Print Prey Healthbars"
+ set category = "Abilities"
+
+ var/nuffin = TRUE
+ for(var/obj/belly/b in vore_organs)
+ if(!b.contents.len)
+ continue
+ var/belly_announce = FALSE //We only want to announce the belly once
+ for(var/thing as anything in b.contents)
+ if(!isliving(thing))
+ continue
+ if(!belly_announce)
+ to_chat(src, "[b.digest_mode] - Within [b.name]:") //We only want to announce the belly if we found something
+ belly_announce = TRUE
+ var/mob/living/ourmob = thing
+ ourmob.chat_healthbar(src, TRUE)
+ nuffin = FALSE
+ if(nuffin)
+ to_chat(src, "There are no mobs within any of your bellies to print health bars for.")
diff --git a/code/modules/vore/eating/bellymodes_datum_vr.dm b/code/modules/vore/eating/bellymodes_datum_vr.dm
index b029afc67d..98db38ec09 100644
--- a/code/modules/vore/eating/bellymodes_datum_vr.dm
+++ b/code/modules/vore/eating/bellymodes_datum_vr.dm
@@ -62,7 +62,7 @@ GLOBAL_LIST_INIT(digest_modes, list())
//CHOMPedit end
// Deal digestion damage (and feed the pred)
- var/old_health = L.health; //CHOMPEdit - Store old health for the hard crit calculation
+ var/old_health = L.health
var/old_brute = L.getBruteLoss()
var/old_burn = L.getFireLoss()
var/old_oxy = L.getOxyLoss()
@@ -87,6 +87,8 @@ GLOBAL_LIST_INIT(digest_modes, list())
damage_gain = damage_gain * 0.5
var/offset = (1 + ((L.weight - 137) / 137)) // 130 pounds = .95 140 pounds = 1.02
var/difference = B.owner.size_multiplier / L.size_multiplier
+
+ consider_healthbar(L, old_health, B.owner)
if(B.health_impacts_size) //CHOMPEdit - Health probably changed so...
B.owner.update_fullness() //CHOMPEdit - This is run whenever a belly's contents are changed.
/*if(isrobot(B.owner)) //CHOMPEdit: Borgos can now use nutrition too
@@ -117,12 +119,17 @@ GLOBAL_LIST_INIT(digest_modes, list())
/datum/digest_mode/absorb/process_mob(obj/belly/B, mob/living/L)
if(!L.absorbable || L.absorbed)
return null
+
+ var/old_nutrition = L.nutrition
B.steal_nutrition(L)
if(L.nutrition < 100)
B.absorb_living(L)
if(B.reagent_mode_flags & DM_FLAG_REAGENTSABSORB && B.reagents.total_volume < B.reagents.maximum_volume) //CHOMPedit: absorption reagent production
B.GenerateBellyReagents_absorbed() //CHOMPedit end: A bonus for pred, I know for a fact prey is usually at zero nutrition when absorption finally happens
+ consider_healthbar(L, old_nutrition, B.owner)
return list("to_update" = TRUE)
+ else
+ consider_healthbar(L, old_nutrition, B.owner)
/datum/digest_mode/unabsorb
id = DM_UNABSORB
@@ -138,7 +145,9 @@ GLOBAL_LIST_INIT(digest_modes, list())
noise_chance = 10
/datum/digest_mode/drain/process_mob(obj/belly/B, mob/living/L)
+ var/old_nutrition = L.nutrition
B.steal_nutrition(L)
+ consider_healthbar(L, old_nutrition, B.owner)
/datum/digest_mode/drain/shrink
id = DM_SHRINK
@@ -377,3 +386,106 @@ GLOBAL_LIST_INIT(digest_modes, list())
else
tempmode = DM_DRAIN // Otherwise drain.
return tempmode
+
+/datum/digest_mode/proc/consider_healthbar()
+ return
+
+/datum/digest_mode/digest/consider_healthbar(mob/living/L, old_health, mob/living/reciever)
+
+ if(old_health <= L.health)
+ return
+
+ var/old_percent
+ var/new_percent
+
+ if(ishuman(L))
+ old_percent = ((old_health + 50) / (L.maxHealth + 50)) * 100
+ new_percent = ((L.health + 50) / (L.maxHealth + 50)) * 100
+ else
+ old_percent = (old_health / L.maxHealth) * 100
+ new_percent = (L.health / L.maxHealth) * 100
+
+ var/lets_announce = FALSE
+ if(new_percent <= 75 && old_percent > 75)
+ lets_announce = TRUE
+ else if(new_percent <= 50 && old_percent > 50)
+ lets_announce = TRUE
+ else if(new_percent <= 25 && old_percent > 25)
+ lets_announce = TRUE
+ else if(new_percent <= 5 && old_percent > 5)
+ lets_announce = TRUE
+
+ if(lets_announce)
+ L.chat_healthbar(reciever)
+ L.chat_healthbar(L)
+
+/datum/digest_mode/heal/consider_healthbar(mob/living/L, old_health, mob/living/reciever)
+
+ if(old_health >= L.health)
+ return
+
+ var/old_percent
+ var/new_percent
+
+ if(ishuman(L))
+ old_percent = ((old_health + 50) / (L.maxHealth + 50)) * 100
+ new_percent = ((L.health + 50) / (L.maxHealth + 50)) * 100
+ else
+ old_percent = (old_health / L.maxHealth) * 100
+ new_percent = (L.health / L.maxHealth) * 100
+
+ var/lets_announce = FALSE
+ if(new_percent >= 75 && old_percent < 75)
+ lets_announce = TRUE
+ else if(new_percent >= 50 && old_percent < 50)
+ lets_announce = TRUE
+ else if(new_percent >= 25 && old_percent < 25)
+ lets_announce = TRUE
+ else if(new_percent >= 5 && old_percent < 5)
+ lets_announce = TRUE
+
+ if(lets_announce)
+ L.chat_healthbar(reciever)
+ L.chat_healthbar(L)
+
+/datum/digest_mode/absorb/consider_healthbar(mob/living/L, old_nutrition, mob/living/reciever)
+ if(old_nutrition <= L.nutrition)
+ return
+
+ var/old_percent = ((old_nutrition - 100) / 500) * 100
+ var/new_percent = ((L.nutrition - 100) / 500) * 100
+ var/lets_announce = FALSE
+ if(new_percent <= 75 && old_percent > 75)
+ lets_announce = TRUE
+ else if(new_percent <= 50 && old_percent > 50)
+ lets_announce = TRUE
+ else if(new_percent <= 25 && old_percent > 25)
+ lets_announce = TRUE
+ else if(new_percent <= 0 && old_percent > 0)
+ lets_announce = TRUE
+
+ if(lets_announce)
+ L.chat_healthbar(reciever)
+ L.chat_healthbar(L)
+
+/datum/digest_mode/drain/consider_healthbar(mob/living/L, old_nutrition, mob/living/reciever)
+
+ if(old_nutrition <= L.nutrition)
+ return
+
+ var/old_percent = ((old_nutrition - 100) / 500) * 100
+ var/new_percent = ((L.nutrition - 100) / 500) * 100
+
+ var/lets_announce = FALSE
+ if(new_percent <= 75 && old_percent > 75)
+ lets_announce = TRUE
+ else if(new_percent <= 50 && old_percent > 50)
+ lets_announce = TRUE
+ else if(new_percent <= 25 && old_percent > 25)
+ lets_announce = TRUE
+ else if(new_percent <= 0 && old_percent > 0)
+ lets_announce = TRUE
+
+ if(lets_announce)
+ L.chat_healthbar(reciever)
+ L.chat_healthbar(L)
diff --git a/code/modules/vore/eating/vorepanel_vr.dm b/code/modules/vore/eating/vorepanel_vr.dm
index 52625b0daa..d5995db45a 100644
--- a/code/modules/vore/eating/vorepanel_vr.dm
+++ b/code/modules/vore/eating/vorepanel_vr.dm
@@ -1970,6 +1970,9 @@ var/global/list/belly_colorable_only_fullscreens = list("a_synth_flesh_mono",
if(!results || !results.len)
results = list("You were unable to examine that. Tell a developer!")
to_chat(user, jointext(results, "
"))
+ if(isliving(target))
+ var/mob/living/ourtarget = target
+ ourtarget.chat_healthbar(user)
return TRUE
if("Use Hand")
@@ -2087,6 +2090,9 @@ var/global/list/belly_colorable_only_fullscreens = list("a_synth_flesh_mono",
if(!results || !results.len)
results = list("You were unable to examine that. Tell a developer!")
to_chat(user, jointext(results, "
"))
+ if(isliving(target))
+ var/mob/living/ourtarget = target
+ ourtarget.chat_healthbar(user)
return TRUE
if("Eject")
diff --git a/vorestation.dme b/vorestation.dme
index cf73f1397f..3e27e298da 100644
--- a/vorestation.dme
+++ b/vorestation.dme
@@ -4397,6 +4397,7 @@
#include "code\modules\virus2\helpers.dm"
#include "code\modules\virus2\isolator.dm"
#include "code\modules\virus2\items_devices.dm"
+#include "code\modules\vore\chat_healthbars.dm"
#include "code\modules\vore\hook-defs_vr.dm"
#include "code\modules\vore\mouseray.dm"
#include "code\modules\vore\trycatch_vr.dm"