diff --git a/code/game/objects/structures/ghost_pods/event_vr.dm b/code/game/objects/structures/ghost_pods/event_vr.dm
index 701777d4d4e..c8c8c62f87b 100644
--- a/code/game/objects/structures/ghost_pods/event_vr.dm
+++ b/code/game/objects/structures/ghost_pods/event_vr.dm
@@ -105,6 +105,8 @@
var/mob/living/simple_mob/newPred = new mobtype(get_turf(src))
qdel(newPred.ai_holder)
newPred.ai_holder = null
+ newPred.voremob_loaded = TRUE // On-demand belly loading.
+ newPred.init_vore() // On-demand belly loading.
//newPred.movement_cooldown = 0 // The "needless artificial speed cap" exists for a reason
if(M.mind)
M.mind.transfer_to(newPred)
@@ -142,6 +144,8 @@
return
var/mob/living/simple_mob/vore/morph/newMorph = new /mob/living/simple_mob/vore/morph(get_turf(src))
+ newMorph.voremob_loaded = TRUE // On-demand belly loading.
+ newMorph.init_vore() // On-demand belly loading.
if(M.mind)
M.mind.transfer_to(newMorph)
to_chat(M, span_notice("You are a " + span_bold("Morph") + ", somehow having gotten aboard the station in your wandering. \
diff --git a/code/modules/admin/player_effects.dm b/code/modules/admin/player_effects.dm
index 5adc036044e..c16661ef47f 100644
--- a/code/modules/admin/player_effects.dm
+++ b/code/modules/admin/player_effects.dm
@@ -104,6 +104,7 @@
var/mob/living/simple_mob/shadekin/red/shadekin = new(Ts)
//Abuse of shadekin
shadekin.real_name = shadekin.name
+ shadekin.voremob_loaded = TRUE
shadekin.init_vore()
shadekin.ability_flags |= 0x1
shadekin.phase_shift()
@@ -157,6 +158,7 @@
target.transforming = TRUE //Cheap hack to stop them from moving
var/mob/living/simple_mob/shadekin/shadekin = new kin_type(Tt)
shadekin.real_name = shadekin.name
+ shadekin.voremob_loaded = TRUE
shadekin.init_vore()
shadekin.can_be_drop_pred = TRUE
shadekin.dir = SOUTH
diff --git a/code/modules/admin/verbs/smite.dm b/code/modules/admin/verbs/smite.dm
index 82a9b7996d6..16614b7b810 100644
--- a/code/modules/admin/verbs/smite.dm
+++ b/code/modules/admin/verbs/smite.dm
@@ -62,6 +62,7 @@
var/mob/living/simple_mob/shadekin/red/shadekin = new(Ts)
//Abuse of shadekin
shadekin.real_name = shadekin.name
+ shadekin.voremob_loaded = TRUE
shadekin.init_vore()
shadekin.ability_flags |= 0x1
shadekin.phase_shift()
@@ -115,6 +116,7 @@
target.transforming = TRUE //Cheap hack to stop them from moving
var/mob/living/simple_mob/shadekin/shadekin = new kin_type(Tt)
shadekin.real_name = shadekin.name
+ shadekin.voremob_loaded = TRUE
shadekin.init_vore()
shadekin.can_be_drop_pred = TRUE
shadekin.dir = SOUTH
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index 1471229c135..cfc772616de 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -8,15 +8,12 @@
has_huds = TRUE //We do have HUDs (like health, wanted, status, not inventory slots)
- var/vore_capacity = 3
- var/vore_capacity_ex = list("stomach" = 3, "taur belly" = 3)
- var/vore_fullness_ex = list("stomach" = 0, "taur belly" = 0)
- var/vore_icon_bellies = list("stomach", "taur belly")
+ vore_capacity = 3
+ vore_capacity_ex = list("stomach" = 3, "taur belly" = 3)
+ vore_fullness_ex = list("stomach" = 0, "taur belly" = 0)
+ vore_icon_bellies = list("stomach", "taur belly")
var/struggle_anim_stomach = FALSE
var/struggle_anim_taur = FALSE
- var/vore_sprite_color = list("stomach" = "#FFFFFF", "taur belly" = "#FFFFFF")
- var/vore_sprite_multiply = list("stomach" = TRUE, "taur belly" = TRUE)
- var/vore_fullness = 0
var/embedded_flag //To check if we've need to roll for damage on movement while an item is imbedded in us.
var/obj/item/rig/wearing_rig // This is very not good, but it's much much better than calling get_rig() every update_canmove() call.
@@ -1822,22 +1819,6 @@
/mob/living/carbon/human/get_mob_riding_slots()
return list(back, head, wear_suit)
-/mob/living/carbon/human/proc/update_fullness()
- var/list/new_fullness = list()
- vore_fullness = 0
- for(var/belly_class in vore_icon_bellies)
- new_fullness[belly_class] = 0
- for(var/obj/belly/B as anything in vore_organs)
- new_fullness[B.belly_sprite_to_affect] += B.GetFullnessFromBelly()
- for(var/belly_class in vore_icon_bellies)
- new_fullness[belly_class] /= size_multiplier //Divided by pred's size so a macro mob won't get macro belly from a regular prey.
- new_fullness[belly_class] = round(new_fullness[belly_class], 1) // Because intervals of 0.25 are going to make sprite artists cry.
- vore_fullness_ex[belly_class] = min(vore_capacity_ex[belly_class], new_fullness[belly_class])
- vore_fullness += new_fullness[belly_class]
- vore_fullness = min(vore_capacity, vore_fullness)
- update_vore_belly_sprite()
- update_vore_tail_sprite()
-
/mob/living/carbon/human/verb/lay_down_left()
set name = "Rest-Left"
diff --git a/code/modules/mob/living/carbon/human/human_bellies.dm b/code/modules/mob/living/carbon/human/human_bellies.dm
new file mode 100644
index 00000000000..9c3227996cf
--- /dev/null
+++ b/code/modules/mob/living/carbon/human/human_bellies.dm
@@ -0,0 +1,38 @@
+/mob/living/carbon/human/update_fullness(var/returning = FALSE)
+ if(!returning)
+ if(updating_fullness)
+ return
+ var/previous_stomach_fullness = vore_fullness_ex["stomach"]
+ var/previous_taur_fullness = vore_fullness_ex["taur belly"]
+ //update_vore_tail_sprite()
+ //update_vore_belly_sprite()
+ var/list/new_fullness = ..(TRUE)
+ . = new_fullness
+ for(var/datum/category_group/underwear/undergarment_class in global_underwear.categories)
+ if(!new_fullness[undergarment_class.name])
+ continue
+ new_fullness[undergarment_class.name] = -1 * round(-1 * new_fullness[undergarment_class.name]) // Doing a ceiling the only way BYOND knows how I guess
+ new_fullness[undergarment_class.name] = (min(2, new_fullness[undergarment_class.name]) - 2) * -1 //Complicated stuff to get it correctly aligned with the expected TRUE/FALSE
+ var/datum/category_item/underwear/UWI = all_underwear[undergarment_class.name]
+ if(!UWI || UWI.name == "None")
+ //Welllll okay then. If the former then something went wrong, if None was selected then...
+ if(istype(undergarment_class.items_by_name[new_fullness[undergarment_class.name + "-ifnone"]], /datum/category_item/underwear))
+ UWI = undergarment_class.items_by_name[new_fullness[undergarment_class.name + "-ifnone"]]
+ all_underwear[undergarment_class.name] = UWI
+ if(UWI && UWI.has_color && new_fullness[undergarment_class.name + "-color"])
+ all_underwear_metadata[undergarment_class.name]["[gear_tweak_free_color_choice]"] = new_fullness[undergarment_class.name + "-color"]
+ if(UWI && UWI.name != "None" && hide_underwear[undergarment_class.name] != new_fullness[undergarment_class.name])
+ hide_underwear[undergarment_class.name] = new_fullness[undergarment_class.name]
+ update_underwear(1)
+ if(vore_fullness_ex["stomach"] != previous_stomach_fullness)
+ update_vore_belly_sprite()
+ if(vore_fullness_ex["taur belly"] != previous_taur_fullness)
+ update_vore_tail_sprite()
+
+/mob/living/carbon/human/vs_animate(var/belly_to_animate)
+ if(belly_to_animate == "stomach")
+ vore_belly_animation()
+ else if(belly_to_animate == "taur belly")
+ vore_tail_animation()
+ else
+ return
diff --git a/code/modules/mob/living/silicon/pai/pai_vr.dm b/code/modules/mob/living/silicon/pai/pai_vr.dm
index 1fa7a3b6e6b..49d34c454e5 100644
--- a/code/modules/mob/living/silicon/pai/pai_vr.dm
+++ b/code/modules/mob/living/silicon/pai/pai_vr.dm
@@ -68,6 +68,9 @@
var/soft_si = FALSE //signaler
var/soft_ar = FALSE //ar hud
+ vore_capacity = 1
+ vore_capacity_ex = list("stomach" = 1)
+
/mob/living/silicon/pai/Initialize()
. = ..()
@@ -108,13 +111,6 @@
return
return feed_grabbed_to_self(src,T)
-/mob/living/silicon/pai/proc/update_fullness_pai() //Determines if they have something in their stomach. Copied and slightly modified.
- var/new_people_eaten = 0
- for(var/obj/belly/B as anything in vore_organs)
- for(var/mob/living/M in B)
- new_people_eaten += M.size_multiplier
- people_eaten = min(1, new_people_eaten)
-
/mob/living/silicon/pai/update_icon() //Some functions cause this to occur, such as resting
..()
if(chassis == "13")
@@ -122,22 +118,27 @@
add_eyes()
return
- update_fullness_pai()
+ update_fullness()
- if(!people_eaten && !resting)
+ //Add a check when selecting a chassis if you add in support for this, to set vore_capacity to 2 or however many states you have.
+ var/fullness_extension = ""
+ if(vore_capacity > 1 && vore_fullness > 1)
+ fullness_extension = "_[vore_fullness]"
+
+ if(!vore_fullness && !resting)
icon_state = "[chassis]" //Using icon_state here resulted in quite a few bugs. Chassis is much less buggy.
- else if(!people_eaten && resting)
+ else if(!vore_fullness && resting)
icon_state = "[chassis]_rest"
// Unfortunately not all these states exist, ugh.
- else if(people_eaten && !resting)
- if("[chassis]_full" in cached_icon_states(icon))
- icon_state = "[chassis]_full"
+ else if(vore_fullness && !resting)
+ if("[chassis]_full[fullness_extension]" in cached_icon_states(icon))
+ icon_state = "[chassis]_full[fullness_extension]"
else
icon_state = "[chassis]"
- else if(people_eaten && resting)
- if("[chassis]_rest_full" in cached_icon_states(icon))
- icon_state = "[chassis]_rest_full"
+ else if(vore_fullness && resting)
+ if("[chassis]_rest_full[fullness_extension]" in cached_icon_states(icon))
+ icon_state = "[chassis]_rest_full[fullness_extension]"
else
icon_state = "[chassis]_rest"
if(chassis in wide_chassis)
@@ -154,7 +155,7 @@
icon = holo_icon
add_eyes()
return
- update_fullness_pai()
+ update_fullness()
if(!people_eaten && !resting)
icon_state = "[chassis]"
else if(!people_eaten && resting)
@@ -182,6 +183,10 @@
var/oursize = size_multiplier
resize(1, FALSE, TRUE, TRUE, FALSE) //We resize ourselves to normal here for a moment to let the vis_height get reset
chassis = possible_chassis[choice]
+
+ vore_capacity = 1
+ vore_capacity_ex = list("stomach" = 1)
+
if(chassis == "13")
if(!holo_icon)
if(!get_character_icon())
diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm
index b5f8ae2021f..d30ef613efd 100644
--- a/code/modules/mob/living/silicon/robot/robot.dm
+++ b/code/modules/mob/living/silicon/robot/robot.dm
@@ -131,6 +131,11 @@
buckle_movable = TRUE
buckle_lying = FALSE
+ var/list/vore_light_states = list() //Robot exclusive
+ vore_capacity_ex = list()
+ vore_fullness_ex = list()
+ vore_icon_bellies = list()
+
/mob/living/silicon/robot/New(loc, var/unfinished = 0)
spark_system = new /datum/effect/effect/system/spark_spread()
spark_system.set_up(5, 0, src)
@@ -775,6 +780,9 @@
updatename("Default")
has_recoloured = FALSE
robotact?.update_static_data_for_all_viewers()
+ vore_capacity_ex = list()
+ vore_fullness_ex = list()
+ vore_light_states = list()
/mob/living/silicon/robot/proc/ColorMate()
set name = "Recolour Module"
@@ -918,52 +926,24 @@
old_x = sprite_datum.pixel_x
if(stat == CONSCIOUS)
- var/belly_size = 0
- if(sprite_datum.has_vore_belly_sprites && vore_selected.belly_overall_mult != 0)
- if(vore_selected.silicon_belly_overlay_preference == "Sleeper")
- if(sleeper_state)
- belly_size = sprite_datum.max_belly_size
- else if(vore_selected.silicon_belly_overlay_preference == "Vorebelly" || vore_selected.silicon_belly_overlay_preference == "Both")
- if(sleeper_state && vore_selected.silicon_belly_overlay_preference == "Both")
- belly_size += 1
- if(LAZYLEN(vore_selected.contents) > 0)
- for(var/borgfood in vore_selected.contents) //"inspired" (kinda copied) from Chompstation's belly fullness system's procs
- if(istype(borgfood, /mob/living))
- if(vore_selected.belly_mob_mult <= 0) //If mobs dont contribute, dont calculate further
- continue
- var/mob/living/prey = borgfood //typecast to living
- belly_size += (prey.size_multiplier / size_multiplier) / vore_selected.belly_mob_mult //Smaller prey are less filling to larger bellies
- else if(istype(borgfood, /obj/item))
- if(vore_selected.belly_item_mult <= 0) //If items dont contribute, dont calculate further
- continue
- var/obj/item/junkfood = borgfood //typecast to item
- var/fullness_to_add = 0
- switch(junkfood.w_class)
- if(ITEMSIZE_TINY)
- fullness_to_add = ITEMSIZE_COST_TINY
- if(ITEMSIZE_SMALL)
- fullness_to_add = ITEMSIZE_COST_SMALL
- if(ITEMSIZE_NORMAL)
- fullness_to_add = ITEMSIZE_COST_NORMAL
- if(ITEMSIZE_LARGE)
- fullness_to_add = ITEMSIZE_COST_LARGE
- if(ITEMSIZE_HUGE)
- fullness_to_add = ITEMSIZE_COST_HUGE
- else
- fullness_to_add = ITEMSIZE_COST_NO_CONTAINER
- belly_size += (fullness_to_add / 32) //* vore_selected.overlay_item_multiplier //Enable this later when vorepanel is reworked.
- else
- belly_size += 1 //if it's not a person, nor an item... lets just go with 1
-
- belly_size *= vore_selected.belly_overall_mult //Enable this after vore panel rework
- belly_size = round(belly_size, 1)
- belly_size = clamp(belly_size, 0, sprite_datum.max_belly_size) //Value from 0 to however many bellysizes the borg has
-
- if(belly_size > 0) //Borgs probably only have 1 belly size. but here's support for larger ones if that changes.
- if(resting && sprite_datum.has_vore_belly_resting_sprites)
- add_overlay(sprite_datum.get_belly_resting_overlay(src, belly_size))
- else if(!resting)
- add_overlay(sprite_datum.get_belly_overlay(src, belly_size))
+ update_fullness()
+ for(var/belly_class in vore_fullness_ex)
+ reset_belly_lights(belly_class)
+ var/vs_fullness = vore_fullness_ex[belly_class]
+ if(belly_class == "sleeper" && sleeper_state == 0 && vore_selected.silicon_belly_overlay_preference == "Sleeper") continue
+ if(belly_class == "sleeper" && sleeper_state != 0 && !(vs_fullness + 1 > vore_capacity_ex[belly_class]))
+ if(vore_selected.silicon_belly_overlay_preference == "Sleeper")
+ vs_fullness = vore_capacity_ex[belly_class]
+ else if(vore_selected.silicon_belly_overlay_preference == "Both")
+ vs_fullness += 1
+ if(!vs_fullness > 0) continue
+ if(resting)
+ if(!sprite_datum.has_vore_belly_resting_sprites)
+ continue
+ add_overlay(sprite_datum.get_belly_resting_overlay(src, vs_fullness, belly_class))
+ else
+ update_belly_lights(belly_class)
+ add_overlay(sprite_datum.get_belly_overlay(src, vs_fullness, belly_class))
sprite_datum.handle_extra_icon_updates(src) // Various equipment-based sprites go here.
diff --git a/code/modules/mob/living/silicon/robot/robot_bellies.dm b/code/modules/mob/living/silicon/robot/robot_bellies.dm
new file mode 100644
index 00000000000..4f39cb2d6b0
--- /dev/null
+++ b/code/modules/mob/living/silicon/robot/robot_bellies.dm
@@ -0,0 +1,36 @@
+/mob/living/silicon/robot/proc/update_multibelly()
+ vore_icon_bellies = list() //Clear any belly options that may not exist now
+ vore_capacity_ex = list()
+ vore_fullness_ex = list()
+ if(sprite_datum.belly_capacity_list.len)
+ for(var/belly in sprite_datum.belly_capacity_list) //vore icons list only contains a list of names with no associated data
+ vore_capacity_ex[belly] = sprite_datum.belly_capacity_list[belly] //I dont know why but this wasnt working when I just
+ vore_fullness_ex[belly] = 0 //set the lists equal to the old lists
+ vore_icon_bellies += belly
+ for(var/belly in sprite_datum.belly_light_list)
+ vore_light_states[belly] = 0
+ else if(sprite_datum.has_vore_belly_sprites)
+ vore_capacity_ex = list("sleeper" = 1)
+ vore_fullness_ex = list("sleeper" = 0)
+ vore_icon_bellies = list("sleeper")
+ if(sprite_datum.has_sleeper_light_indicator)
+ vore_light_states = list("sleeper" = 0)
+ sprite_datum.belly_light_list = list("sleeper")
+ update_fullness() //Set how full the newly defined bellies are, if they're already full
+
+/mob/living/silicon/robot/proc/reset_belly_lights(var/b_class)
+ if(sprite_datum.belly_light_list.len && sprite_datum.belly_light_list.Find(b_class))
+ vore_light_states[b_class] = 0
+
+/mob/living/silicon/robot/proc/update_belly_lights(var/b_class)
+ if(sprite_datum.belly_light_list.len && sprite_datum.belly_light_list.Find(b_class))
+ vore_light_states[b_class] = 2
+ for (var/belly in vore_organs)
+ var/obj/belly/B = belly
+ if(b_class == "sleeper" && (B.silicon_belly_overlay_preference == "Vorebelly" || B.silicon_belly_overlay_preference == "Both") || b_class != "sleeper")
+ if(B.digest_mode != DM_DIGEST || B.belly_sprite_to_affect != b_class || !B.contents.len)
+ continue
+ for(var/contents in B.contents)
+ if(istype(contents, /mob/living))
+ vore_light_states[b_class] = 1
+ return
diff --git a/code/modules/mob/living/silicon/robot/robot_ui_module.dm b/code/modules/mob/living/silicon/robot/robot_ui_module.dm
index 1554549633e..ba69581df51 100644
--- a/code/modules/mob/living/silicon/robot/robot_ui_module.dm
+++ b/code/modules/mob/living/silicon/robot/robot_ui_module.dm
@@ -140,6 +140,7 @@
if("confirm")
R.apply_name(new_name)
R.apply_module(sprite_datum, selected_module)
+ R.update_multibelly()
R.transform_module()
close_ui()
. = TRUE
diff --git a/code/modules/mob/living/silicon/robot/sprites/_sprite_datum.dm b/code/modules/mob/living/silicon/robot/sprites/_sprite_datum.dm
index c74da24749e..0d8135fe3e7 100644
--- a/code/modules/mob/living/silicon/robot/sprites/_sprite_datum.dm
+++ b/code/modules/mob/living/silicon/robot/sprites/_sprite_datum.dm
@@ -27,6 +27,8 @@
var/is_whitelisted = FALSE
var/whitelist_ckey
var/whitelist_charname
+ var/list/belly_light_list = list() // Support multiple sleepers with r/g light "sleeper"
+ var/list/belly_capacity_list = list() //Support multiple bellies with multiple sizes, default: "sleeper" = 1
/// Determines if the borg has the proper flags to show an overlay.
/datum/robot_sprite/proc/sprite_flag_check(var/flag_to_check)
@@ -84,25 +86,38 @@
continue //Go on to the next.
return
-/datum/robot_sprite/proc/get_belly_overlay(var/mob/living/silicon/robot/ourborg, var/size = 1)
+/datum/robot_sprite/proc/get_belly_overlay(var/mob/living/silicon/robot/ourborg, var/size = 1, var/b_class)
//Size
- if(has_sleeper_light_indicator)
- var/sleeperColor = "g"
- if(ourborg.sleeper_state == 1) // Is our belly safe, or gurgling cuties?
- sleeperColor = "r"
- return "[sprite_icon_state]-sleeper-[size]-[sleeperColor]"
- return "[sprite_icon_state]-sleeper-[size]"
+ if(has_sleeper_light_indicator || belly_light_list.len)
+ if(belly_light_list.len)
+ if(belly_light_list.Find(b_class))
+ //First, Sleeper base icon is input. Second the belly class, supposedly taken from the borg's vore_fullness_ex list.
+ //The belly class should be the same as the belly sprite's name, with as many size values as you defined in the
+ //vore_capacity_ex list. Finally, if the borg has a red/green light sleeper, it'll use g or r appended to the end.
+ //Bellies with lights should be defined in belly_light_list
+ var/sleeperColor = "g"
+ if(ourborg.sleeper_state == 1 || ourborg.vore_light_states[b_class] == 1) // Is our belly safe, or gurgling cuties?
+ sleeperColor = "r"
+ return "[sprite_icon_state]-[b_class]-[size]-[sleeperColor]"
-/datum/robot_sprite/proc/get_belly_resting_overlay(var/mob/living/silicon/robot/ourborg, var/size = 1)
+ return "[sprite_icon_state]-[b_class]-[size]"
+ else
+ var/sleeperColor = "g"
+ if(ourborg.sleeper_state == 1) // Is our belly safe, or gurgling cuties?
+ sleeperColor = "r"
+ return "[sprite_icon_state]-[b_class]-[size]-[sleeperColor]"
+ return "[sprite_icon_state]-[b_class]-[size]"
+
+/datum/robot_sprite/proc/get_belly_resting_overlay(var/mob/living/silicon/robot/ourborg, var/size = 1, var/b_class)
if(!(ourborg.rest_style in rest_sprite_options))
ourborg.rest_style = "Default"
switch(ourborg.rest_style)
if("Sit")
- return "[get_belly_overlay(ourborg, size)]-sit"
+ return "[get_belly_overlay(ourborg, size, b_class)]-sit"
if("Bellyup")
- return "[get_belly_overlay(ourborg, size)]-bellyup"
+ return "[get_belly_overlay(ourborg, size, b_class)]-bellyup"
else
- return "[get_belly_overlay(ourborg, size)]-rest"
+ return "[get_belly_overlay(ourborg, size, b_class)]-rest"
/datum/robot_sprite/proc/get_eyes_overlay(var/mob/living/silicon/robot/ourborg)
if(!(ourborg.resting && has_rest_sprites))
diff --git a/code/modules/mob/living/silicon/robot/sprites/civilian.dm b/code/modules/mob/living/silicon/robot/sprites/civilian.dm
index 2c4923e00df..d4b2664e636 100644
--- a/code/modules/mob/living/silicon/robot/sprites/civilian.dm
+++ b/code/modules/mob/living/silicon/robot/sprites/civilian.dm
@@ -220,11 +220,11 @@
else
ourborg.icon_state = booze_options[ourborg.sprite_extra_customization["boozehound"]]
-/datum/robot_sprite/dogborg/service/booze/get_belly_overlay(var/mob/living/silicon/robot/ourborg, var/size = 1)
- if(!("boozehound" in ourborg.sprite_extra_customization) || !ourborg.sprite_extra_customization["boozehound"])
+/datum/robot_sprite/dogborg/service/booze/get_belly_overlay(var/mob/living/silicon/robot/ourborg, var/size = 1, var/b_class)
+ if(!("boozehound" in ourborg.sprite_extra_customization) || !ourborg.sprite_extra_customization["boozehound"] || b_class != "sleeper")
return ..()
else
- return "[booze_options[ourborg.sprite_extra_customization["boozehound"]]]-sleeper-[size]"
+ return "[booze_options[ourborg.sprite_extra_customization["boozehound"]]]-[b_class]-[size]"
/datum/robot_sprite/dogborg/service/booze/get_rest_sprite(var/mob/living/silicon/robot/ourborg)
if(!(ourborg.rest_style in rest_sprite_options))
diff --git a/code/modules/mob/living/simple_mob/simple_mob.dm b/code/modules/mob/living/simple_mob/simple_mob.dm
index 9f919a2b4b7..8daa5dd31a4 100644
--- a/code/modules/mob/living/simple_mob/simple_mob.dm
+++ b/code/modules/mob/living/simple_mob/simple_mob.dm
@@ -179,6 +179,10 @@
var/hasthermals = TRUE
var/isthermal = 0
+ //vars for vore_icons toggle control
+ var/vore_icons_cache = null // null by default. Going from ON to OFF should store vore_icons val here, OFF to ON reset as null
+
+
/mob/living/simple_mob/Initialize()
remove_verb(src, /mob/verb/observe)
health = maxHealth
@@ -225,6 +229,9 @@
/mob/living/simple_mob/Login()
. = ..()
to_chat(src,span_boldnotice("You are \the [src].") + " [player_msg]")
+ if(vore_active && !voremob_loaded)
+ voremob_loaded = TRUE
+ init_vore()
if(hasthermals)
add_verb(src, /mob/living/simple_mob/proc/hunting_vision) //So that maint preds can see prey through walls, to make it easier to find them.
@@ -390,3 +397,22 @@
/mob/living/simple_mob/proc/character_directory_species()
return "simplemob"
+
+/mob/living/simple_mob/verb/toggle_vore_icons()
+
+ set name = "Toggle Vore Sprite"
+ set desc = "Toggle visibility of changed mob sprite when you have eaten other things."
+ set category = "Abilities.Vore"
+
+ if(!vore_icons && !vore_icons_cache)
+ to_chat(src,span_warning("This simplemob has no vore sprite."))
+ else if(isnull(vore_icons_cache))
+ vore_icons_cache = vore_icons
+ vore_icons = 0
+ to_chat(src,span_warning("Vore sprite disabled."))
+ else
+ vore_icons = vore_icons_cache
+ vore_icons_cache = null
+ to_chat(src,span_warning("Vore sprite enabled."))
+
+ update_icon()
diff --git a/code/modules/mob/living/simple_mob/simple_mob_vr.dm b/code/modules/mob/living/simple_mob/simple_mob_vr.dm
index 6a4ba095f94..bfdcea8360d 100644
--- a/code/modules/mob/living/simple_mob/simple_mob_vr.dm
+++ b/code/modules/mob/living/simple_mob/simple_mob_vr.dm
@@ -7,7 +7,7 @@
var/vore_active = 0 // If vore behavior is enabled for this mob
- var/vore_capacity = 1 // The capacity (in people) this person can hold
+ vore_capacity = 1 // The capacity (in people) this person can hold
var/vore_max_size = RESIZE_HUGE // The max size this mob will consider eating
var/vore_min_size = RESIZE_TINY // The min size this mob will consider eating
var/vore_bump_chance = 0 // Chance of trying to eat anyone that bumps into them, regardless of hostility
@@ -36,10 +36,6 @@
var/vore_default_contamination_flavor = "Generic" //Contamination descriptors
var/vore_default_contamination_color = "green" //Contamination color
- var/vore_fullness = 0 // How "full" the belly is (controls icons)
- var/vore_icons = 0 // Bitfield for which fields we have vore icons for.
- var/vore_eyes = FALSE // For mobs with fullness specific eye overlays.
- var/belly_size_multiplier = 1
var/life_disabled = 0 // For performance reasons
var/vore_attack_override = FALSE // Enable on mobs you want to have special behaviour on melee grab attack.
@@ -54,6 +50,8 @@
var/nom_mob = FALSE //If a mob is meant to be hostile for vore purposes but is otherwise not hostile, if true makes certain AI ignore the mob
+ var/voremob_loaded = FALSE // On-demand belly loading.
+
// Release belly contents before being gc'd!
/mob/living/simple_mob/Destroy()
release_vore_contents()
@@ -65,18 +63,6 @@
if(myid)
return myid
-// Update fullness based on size & quantity of belly contents
-/mob/living/simple_mob/proc/update_fullness()
- var/new_fullness = 0
- for(var/obj/belly/B as anything in vore_organs)
- for(var/mob/living/M in B)
- if(!M.absorbed || B.count_absorbed_prey_for_sprite)
- new_fullness += M.size_multiplier
- new_fullness = new_fullness / size_multiplier //Divided by pred's size so a macro mob won't get macro belly from a regular prey.
- new_fullness = new_fullness * belly_size_multiplier // Some mobs are small even at 100% size. Let's account for that.
- new_fullness = round(new_fullness, 1) // Because intervals of 0.25 are going to make sprite artists cry.
- vore_fullness = min(vore_capacity, new_fullness)
-
/mob/living/simple_mob/update_icon()
. = ..()
if(vore_active)
@@ -97,6 +83,10 @@
remove_eyes()
add_eyes()
update_transform()
+ for(var/belly_class in vore_fullness_ex)
+ var/vs_fullness = vore_fullness_ex[belly_class]
+ if(vs_fullness > 0)
+ add_overlay("[icon_state]_[belly_class]-[vs_fullness]")
/mob/living/simple_mob/regenerate_icons()
..()
@@ -208,7 +198,7 @@
// Make sure you don't call ..() on this one, otherwise you duplicate work.
/mob/living/simple_mob/init_vore()
- if(!vore_active || no_vore)
+ if(!vore_active || no_vore || !voremob_loaded)
return
if(!IsAdvancedToolUser())
@@ -227,6 +217,7 @@
var/obj/belly/B = new /obj/belly(src)
vore_selected = B
B.immutable = 1
+ B.affects_vore_sprites = TRUE
B.name = vore_stomach_name ? vore_stomach_name : "stomach"
B.desc = vore_stomach_flavor ? vore_stomach_flavor : "Your surroundings are warm, soft, and slimy. Makes sense, considering you're inside \the [name]."
B.digest_mode = vore_default_mode
diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/alien animals/catslug.dm b/code/modules/mob/living/simple_mob/subtypes/animal/alien animals/catslug.dm
index 938e59dd41d..f88ff654a81 100644
--- a/code/modules/mob/living/simple_mob/subtypes/animal/alien animals/catslug.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/animal/alien animals/catslug.dm
@@ -115,7 +115,9 @@
say_got_target = list()
/mob/living/simple_mob/vore/alienanimals/catslug/init_vore()
- ..()
+ if(!voremob_loaded)
+ return
+ . = ..()
var/obj/belly/B = vore_selected
B.name = "stomach"
B.desc = "The hot slick gut of a catslug!! Copious slime smears over you as you’re packed away into the gloom and oppressive humidity of this churning gastric sac. The pressure around you is intense, the squashy flesh bends and forms to your figure, clinging to you insistently! There’s basically no free space at all as your ears are filled with the slick slide of flesh against flesh and the burbling of gastric juices glooping all around you. The thumping of a heart booms from somewhere nearby, making everything pulse in against you in time with it! This is it! You’ve been devoured by a catslug!!!"
diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/alien animals/jellyfish.dm b/code/modules/mob/living/simple_mob/subtypes/animal/alien animals/jellyfish.dm
index 64791a2fb1a..7baade88286 100644
--- a/code/modules/mob/living/simple_mob/subtypes/animal/alien animals/jellyfish.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/animal/alien animals/jellyfish.dm
@@ -85,7 +85,9 @@ GLOBAL_VAR_INIT(jellyfish_count, 0)
/mob/living/simple_mob/vore/alienanimals/space_jellyfish/init_vore()
- ..()
+ if(!voremob_loaded)
+ return
+ . = ..()
var/obj/belly/B = vore_selected
B.name = "internal chamber"
B.desc = "It's smooth and translucent. You can see the world around you distort and wobble with the movement of the space jellyfish. It floats casually, while the delicate flesh seems to form to you. It's surprisingly cool, and flickers with its own light. You're on display for all to see, trapped within the confines of this strange space alien!"
diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/alien animals/skeleton.dm b/code/modules/mob/living/simple_mob/subtypes/animal/alien animals/skeleton.dm
index 88f919ac28d..c984051369c 100644
--- a/code/modules/mob/living/simple_mob/subtypes/animal/alien animals/skeleton.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/animal/alien animals/skeleton.dm
@@ -87,7 +87,9 @@
emote_hear = list("rattles","makes a spooky sound","cackles madly","plinks","clacks")
/mob/living/simple_mob/vore/alienanimals/skeleton/init_vore()
- ..()
+ if(!voremob_loaded)
+ return
+ . = ..()
var/obj/belly/B = vore_selected
B.name = "stomach"
B.desc = "You're not sure quite how, but you've found your way inside of the skeleton's stomach! It's cramped and cold and sounds heavily of xylophones!"
diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/alien animals/space_mouse.dm b/code/modules/mob/living/simple_mob/subtypes/animal/alien animals/space_mouse.dm
index 195a7b71306..5cd0282a371 100644
--- a/code/modules/mob/living/simple_mob/subtypes/animal/alien animals/space_mouse.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/animal/alien animals/space_mouse.dm
@@ -62,7 +62,9 @@
vore_default_item_mode = IM_DIGEST
/mob/living/simple_mob/vore/alienanimals/dustjumper/init_vore()
- ..()
+ if(!voremob_loaded)
+ return
+ . = ..()
var/obj/belly/B = vore_selected
B.name = "stomach"
B.desc = "You've been packed into the impossibly tight stomach of the dust jumper!!! The broiling heat seeps into you while the walls churn in powerfully, forcing you to curl up in the darkness."
diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/alien animals/spacewhale.dm b/code/modules/mob/living/simple_mob/subtypes/animal/alien animals/spacewhale.dm
index fe6e37b3609..06c05379f35 100644
--- a/code/modules/mob/living/simple_mob/subtypes/animal/alien animals/spacewhale.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/animal/alien animals/spacewhale.dm
@@ -52,7 +52,9 @@
emote_see = list("ripples and flows", "flashes rhythmically","glows faintly","investigates something")
/mob/living/simple_mob/vore/overmap/spacewhale/init_vore()
- ..()
+ if(!voremob_loaded)
+ return
+ . = ..()
var/obj/belly/B = vore_selected
B.name = "stomach"
B.desc = "It's warm and wet, makes sense, considering it's inside of a space whale. You should take a moment to reflect upon how you got here, and how you might avoid situations like this in the future, while this whale attempts to mercilessly destroy you through various gastric processes."
diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/alien animals/startreader.dm b/code/modules/mob/living/simple_mob/subtypes/animal/alien animals/startreader.dm
index 7f63a58a1df..a90ad11d44e 100644
--- a/code/modules/mob/living/simple_mob/subtypes/animal/alien animals/startreader.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/animal/alien animals/startreader.dm
@@ -92,7 +92,9 @@
/mob/living/simple_mob/vore/alienanimals/startreader/init_vore()
- ..()
+ if(!voremob_loaded)
+ return
+ . = ..()
var/obj/belly/B = vore_selected
B.name = "gastric sac"
B.desc = "It's cramped and hot! You're forced into a small ball as your shape is squeezed into the slick, wet chamber. Despite being swallowed into the creature, you find that you actually stretch out of the top a ways, and can JUST BARELY wiggle around..."
diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/alien animals/succlet.dm b/code/modules/mob/living/simple_mob/subtypes/animal/alien animals/succlet.dm
index 0d8642067eb..bb5d71b8d45 100644
--- a/code/modules/mob/living/simple_mob/subtypes/animal/alien animals/succlet.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/animal/alien animals/succlet.dm
@@ -73,7 +73,9 @@
say_got_target = list("...")
/mob/living/simple_mob/vore/alienanimals/succlet/init_vore()
- ..()
+ if(!voremob_loaded)
+ return
+ . = ..()
var/obj/belly/B = vore_selected
B.name = "stummy"
B.desc = "It's a star shaped stomach. A stummy, if you will. It's warm and soft, not unlike plush, but it's tight!"
diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/alien animals/teppi.dm b/code/modules/mob/living/simple_mob/subtypes/animal/alien animals/teppi.dm
index a119d03c73e..7f68db04e41 100644
--- a/code/modules/mob/living/simple_mob/subtypes/animal/alien animals/teppi.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/animal/alien animals/teppi.dm
@@ -166,7 +166,9 @@ GLOBAL_VAR_INIT(teppi_count, 0) // How mant teppi DO we have?
vore_standing_too = TRUE
/mob/living/simple_mob/vore/alienanimals/teppi/init_vore()
- ..()
+ if(!voremob_loaded)
+ return
+ . = ..()
var/obj/belly/B = vore_selected
B.name = "stomach"
B.desc = "The heat of the roiling flesh around you bakes into you immediately as you’re cast into the gloom of a Teppi’s primary gastric chamber. The undulations are practically smothering, clinging to you and grinding you all over as the Teppi continues about its day. The walls are heavy against you, so it’s really difficult to move at all, while the heart of this creature pulses rhythmically somewhere nearby, and you can feel the throb of its pulse in the doughy squish pressing up against you. Your figure sinks a ways into the flesh as it presses in, wrapping limbs up between countless slick folds and kneading waves. It’s not long before you’re positively soaked in a thin layer of slime as you’re rocked and squeezed and jostled in the stomach of your captor."
@@ -280,6 +282,7 @@ GLOBAL_VAR_INIT(teppi_count, 0) // How mant teppi DO we have?
// The friend zone.
var/obj/belly/p = new /obj/belly(src)
p.immutable = TRUE
+ p.affects_vore_sprites = TRUE
p.mode_flags = 40
p.human_prey_swallow_time = 0.01 SECONDS
p.digestchance = 0
@@ -788,6 +791,9 @@ GLOBAL_VAR_INIT(teppi_count, 0) // How mant teppi DO we have?
vore_selected.digest_burn = 0.05
/mob/living/simple_mob/vore/alienanimals/teppi/animal_nom(mob/living/T in living_mobs(1))
+ if(vore_active && !voremob_loaded)
+ voremob_loaded = TRUE
+ init_vore()
if(client)
return ..()
var/current_affinity = affinity[T.real_name]
diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/pets/cat_vr.dm b/code/modules/mob/living/simple_mob/subtypes/animal/pets/cat_vr.dm
index 392ad3361ff..1b9e64e004b 100644
--- a/code/modules/mob/living/simple_mob/subtypes/animal/pets/cat_vr.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/animal/pets/cat_vr.dm
@@ -1,5 +1,7 @@
/mob/living/simple_mob/animal/passive/cat/runtime/init_vore()
- ..()
+ if(!voremob_loaded)
+ return
+ . = ..()
var/obj/belly/B = vore_selected
B.name = "Stomach"
B.desc = "The slimy wet insides of Runtime! Not quite as clean as the cat on the outside."
diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/pets/fox_vr.dm b/code/modules/mob/living/simple_mob/subtypes/animal/pets/fox_vr.dm
index d42cb23b098..8ae49ab9dad 100644
--- a/code/modules/mob/living/simple_mob/subtypes/animal/pets/fox_vr.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/animal/pets/fox_vr.dm
@@ -51,7 +51,9 @@
base_wander_delay = 4
/mob/living/simple_mob/animal/passive/fox/init_vore()
- ..()
+ if(!voremob_loaded)
+ return
+ . = ..()
var/obj/belly/B = vore_selected
B.name = "Stomach"
B.desc = "Slick foxguts. Cute on the outside, slimy on the inside!"
@@ -197,7 +199,9 @@
makes_dirt = FALSE // No more dirt
/mob/living/simple_mob/animal/passive/fox/renault/init_vore()
- ..()
+ if(!voremob_loaded)
+ return
+ . = ..()
var/obj/belly/B = vore_selected
B.name = "Stomach"
B.desc = "Slick foxguts. They seem somehow more regal than perhaps other foxes!"
diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/space/carp.dm b/code/modules/mob/living/simple_mob/subtypes/animal/space/carp.dm
index 6cef5c086b9..1a8ab85a801 100644
--- a/code/modules/mob/living/simple_mob/subtypes/animal/space/carp.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/animal/space/carp.dm
@@ -145,7 +145,9 @@
ai_holder_type = /datum/ai_holder/simple_mob/vore
/mob/living/simple_mob/animal/space/carp/large/huge/vorny/init_vore()
- ..()
+ if(!voremob_loaded)
+ return
+ . = ..()
var/obj/belly/B = vore_selected
B.name = "stomach"
B.desc = "You've been swallowed whole and alive by a massive white carp! The stomach around you is oppressively tight, squeezing and grinding wrinkled walls across your body, making it hard to make any movement at all. The chamber is flooded with fluids that completely overwhelm you."
diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/space/gaslamp_vr.dm b/code/modules/mob/living/simple_mob/subtypes/animal/space/gaslamp_vr.dm
index 436d6c83153..d452a8bf346 100644
--- a/code/modules/mob/living/simple_mob/subtypes/animal/space/gaslamp_vr.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/animal/space/gaslamp_vr.dm
@@ -88,7 +88,9 @@ TODO: Make them light up and heat the air when exposed to oxygen.
vore_icons = SA_ICON_LIVING
/mob/living/simple_mob/animal/passive/gaslamp/init_vore()
- ..()
+ if(!voremob_loaded)
+ return
+ . = ..()
var/obj/belly/B = vore_selected
B.name = "internal chamber"
B.desc = "Having been too slow to disentangle yourself from the gaslamp's tentacles, the alien creature eventually winds enough of them around your body to lift you up off of the ground. Struggle as you might now, it is too late to deny the jellyfish-esque scavenger its lucky catch; inch by inch, the gaslamp tugs you upwards into its equivalent of a stomach, the transition between the cool-to-frigid atmosphere on the outside to its surprising internal heat something you can feel through any outer wear you possess. Minutes pass, soon resulting in the gentle creature's body sporting a rounded, bulging swell, an indistinct shadow shifting and twitching inside it as you squirm about. Be it to escape or simply to get settled, you might want to take care, however. The gaslamp's internal chamber is slick and squishy instead of overly oppressive, yet, each wave of warmth that pulses over you leaves you feeling weaker than the last..."
diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/space/snake_vr.dm b/code/modules/mob/living/simple_mob/subtypes/animal/space/snake_vr.dm
index 87e5217d5b7..6c5f0322b1c 100644
--- a/code/modules/mob/living/simple_mob/subtypes/animal/space/snake_vr.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/animal/space/snake_vr.dm
@@ -47,6 +47,60 @@
say_list_type = /datum/say_list/snake
ai_holder_type = /datum/ai_holder/simple_mob/passive
+ icon_state = "python"
+ icon_living = "python"
+ icon_dead = "python_dead"
+ icon = 'icons/mob/snake_vr.dmi'
+
+ vore_active = 1
+ vore_capacity = 1
+ vore_default_mode = DM_DIGEST
+ // vore_icons = SA_ICON_LIVING | SA_ICON_REST // Woul require the downstream sprites
+ vore_escape_chance = 20
+ swallowTime = 50
+ vore_bump_chance = 10
+ faction_bump_vore = 1 // Allows snakes to vore people who bump into them even if they are the same "friendly" faction.
+ vore_bump_emote = "coils around and unhinges its jaws at"
+
+ can_be_drop_prey = FALSE
+
+// Adds vore belly
+/mob/living/simple_mob/animal/passive/snake/init_vore()
+ if(!voremob_loaded)
+ return
+ . = ..()
+ var/obj/belly/B = vore_selected
+ B.name = "stomach"
+ B.desc = "The snake coils its tail around you, pushing you to the ground and pinning you with its weight. It flicks its tongue at you, before pouncing onto your head, engulfing the upper half of your body with ease as it unhinges its jaw. With greedy swallows, it pulls you deeper, and deeper. The tight walls undulate rhythmically as the danger noodle rumbles contentedly at this new meal. The snake sends the last of you down with a deep swallow, hissing softly and closing its eyes as it enjoys its new meal, tucked away nicely under those beautiful, green scales."
+ B.item_digest_mode = IM_DIGEST_FOOD
+ B.mode_flags = DM_FLAG_THICKBELLY
+ B.digestchance = 25
+ B.escape_stun = 5
+
+ B.emote_lists[DM_HOLD] = list(
+ "A near-constant string of soft, slick noises drift over you as waves of peristalsis slowly drag you further within the possessive serpent.",
+ "\the [name]'s stomach suddenly squishes inwards from everywhere at once, wrapping you up in a warm, doughy embrace before easing back again.",
+ "A growing sense of relaxed lethargy seeps into your muscles the longer you're massaged over amidst those hot, humid confines.",
+ "Slimy, heat-trapping muscles rhythmically ripple over and knead down into your figure, ensuring the snake's new filling was subdued.",
+ "\the [name] occasionally hisses out in satisfaction as it feels your twitching, filling weight bulge out its scales before giving you a compressing squeeze.",
+ "Hot, viscous ooze clings to and coats your body as time passes, encouraging you to submit and let the snake do all the serpentine, winding slithering.")
+ B.emote_lists[DM_DIGEST] = list(
+ "A chorus of sordid, slick sounds fill your senses as another wave of peristalsis ripples over you, tugging you a deeper into the serpent's digestive system.",
+ "\the [name]'s all-encompassing stomach closes in tight around your figure, soaking acid into your flesh.",
+ "You find it harder to breathe as time goes on, your dizziness growing as you lack the space to breathe in enough of that caustic, thinning air.",
+ "\the [name]'s ample, kneading muscle gradually squeezes the strength and fight from your body with clench after clench.",
+ "A pleased hiss emanates from the well fed serpent, clearly satisfied with the meal it's made out of you.",
+ "Your movements grow sluggish as \the [name]'s oozing stomach walls cling to your entire body, drenchning you in corrosive juices.")
+ B.struggle_messages_inside = list(
+ "You jam your limbs against the tight walls in an effort to get some leverage.",
+ "You writhe inside the tube-like gastric chamber in a bid to force yourself to freedom.",
+ "You push back at the clenched sphincter at the entrance to \the [name]'s gut.")
+ B.struggle_messages_outside = list(
+ "\the [name]'s tail jostles around as something inside of it fights to escape.",
+ "\the [name]'s tail lurches with the struggles of a live meal.")
+ B.examine_messages = list(
+ "\the [name]'s tail is swollen fat with a lump of prey it swallowed whole.")
+
/datum/say_list/snake
emote_hear = list("hisses")
@@ -86,6 +140,8 @@
makes_dirt = FALSE
+ vore_default_mode = DM_HOLD
+
var/turns_since_scan = 0
var/obj/movement_target
diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/squirrel.dm b/code/modules/mob/living/simple_mob/subtypes/animal/squirrel.dm
index ded0cdb570d..4ba69741eb5 100644
--- a/code/modules/mob/living/simple_mob/subtypes/animal/squirrel.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/animal/squirrel.dm
@@ -70,7 +70,9 @@
vore_default_item_mode = IM_DIGEST
/mob/living/simple_mob/vore/squirrel/init_vore()
- ..()
+ if(!voremob_loaded)
+ return
+ . = ..()
var/obj/belly/B = vore_selected
B.name = "stomach"
B.digest_mode = DM_SELECT
diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/turkeygirl.dm b/code/modules/mob/living/simple_mob/subtypes/animal/turkeygirl.dm
index 9c29db15a3a..33f48276fbf 100644
--- a/code/modules/mob/living/simple_mob/subtypes/animal/turkeygirl.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/animal/turkeygirl.dm
@@ -44,7 +44,9 @@
vore_standing_too = TRUE
/mob/living/simple_mob/vore/turkeygirl/init_vore()
- ..()
+ if(!voremob_loaded)
+ return
+ . = ..()
var/obj/belly/B = vore_selected
B.name = "stomach"
B.desc = "The hot churning stomach of a turkey girl! The doughy flesh presses inward to form to your figure, thick slime coating everything, and very shortly that includes you as well! There isn't any escaping that constant full body motion, as her body works to ball yours up into a tight little package. Gurgling and glubbing with every shifting movement, while her pulse throbs through the flesh all around you with every beat of her heart. All in all, one thing is for certain! You've become turkey stuffing! Oh no..."
diff --git a/code/modules/mob/living/simple_mob/subtypes/glamour/blaidd.dm b/code/modules/mob/living/simple_mob/subtypes/glamour/blaidd.dm
index ca2763fcc6f..8be2d053eed 100644
--- a/code/modules/mob/living/simple_mob/subtypes/glamour/blaidd.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/glamour/blaidd.dm
@@ -55,6 +55,8 @@
movement_cooldown = -1
/mob/living/simple_mob/vore/blaidd/init_vore()
+ if(!voremob_loaded)
+ return
. = ..()
var/obj/belly/B = vore_selected
B.name = "stomach"
diff --git a/code/modules/mob/living/simple_mob/subtypes/glamour/ddraig.dm b/code/modules/mob/living/simple_mob/subtypes/glamour/ddraig.dm
index 3b060b51cca..2fdd74aa022 100644
--- a/code/modules/mob/living/simple_mob/subtypes/glamour/ddraig.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/glamour/ddraig.dm
@@ -77,6 +77,8 @@
movement_cooldown = -1
/mob/living/simple_mob/vore/ddraig/init_vore()
+ if(!voremob_loaded)
+ return
. = ..()
var/obj/belly/B = vore_selected
B.name = "stomach"
diff --git a/code/modules/mob/living/simple_mob/subtypes/glamour/fluffball.dm b/code/modules/mob/living/simple_mob/subtypes/glamour/fluffball.dm
index 081494bc1f8..6a85304ac3e 100644
--- a/code/modules/mob/living/simple_mob/subtypes/glamour/fluffball.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/glamour/fluffball.dm
@@ -42,7 +42,9 @@
vore_standing_too = 1
/mob/living/simple_mob/vore/fluffball/init_vore()
- ..()
+ if(!voremob_loaded)
+ return
+ . = ..()
var/obj/belly/B = vore_selected
B.name = "tail"
B.desc = "The small critter seems to suddenly panic, lunging at you with its massive fluffy tail, using it like a weapon. Despite the appearance of the tail, it seems to be much larger on the inside, suddenly engulfing you completely in a world of endless softness. Inside, you are bound up nice and tight in an oddly comfortable prison of hair, it ripples over your body tickling every bit of exposed body on offer."
diff --git a/code/modules/mob/living/simple_mob/subtypes/glamour/unicorn.dm b/code/modules/mob/living/simple_mob/subtypes/glamour/unicorn.dm
index 7da91539fb5..55749ab469b 100644
--- a/code/modules/mob/living/simple_mob/subtypes/glamour/unicorn.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/glamour/unicorn.dm
@@ -36,7 +36,9 @@
projectile_accuracy = -20
/mob/living/simple_mob/vore/horse/unicorn/init_vore()
- ..()
+ if(!voremob_loaded)
+ return
+ . = ..()
var/obj/belly/B = vore_selected
B.name = "stomach"
B.desc = "With a final few gulps, the unicorn finishes swallowing you down into its hot, humid gut... and with a slosh, your weight makes the equine's belly hang down slightly like some sort of organic hammock. The thick, damp air is tinged with the smell of... candyfloss(?), and the surrounding flesh wastes no time in clenching and massaging down over its newfound fodder."
diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/bat.dm b/code/modules/mob/living/simple_mob/subtypes/vore/bat.dm
index 0d682ffd2e5..6ab6004b85d 100644
--- a/code/modules/mob/living/simple_mob/subtypes/vore/bat.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/vore/bat.dm
@@ -43,7 +43,9 @@
emote_see = list("flaps","grooms itself")
/mob/living/simple_mob/vore/bat/init_vore()
- ..()
+ if(!voremob_loaded)
+ return
+ . = ..()
var/obj/belly/B = vore_selected
B.name = "stomach"
B.desc = "The giant bat has managed to swallow you alive, which is particularly impressive given that it's still a rather small creature. It's belly bulges out as you're squeezed into the oppressively tight stomach, and it lands to manage the weight, wings curling over your form beneath. The body groans under your strain, burbling and growling as it gets to work on it's feed. However, at least for now, it seems to do you no physical harm. Instead, the damp walls that squelch across your body try to leech out your energy through some less direct means."
diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/bigdragon.dm b/code/modules/mob/living/simple_mob/subtypes/vore/bigdragon.dm
index 91b62843e7d..55c36dc23b0 100644
--- a/code/modules/mob/living/simple_mob/subtypes/vore/bigdragon.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/vore/bigdragon.dm
@@ -329,17 +329,6 @@ I think I covered everything.
update_fullness()
build_icons()
-/mob/living/simple_mob/vore/bigdragon/update_fullness()
- var/new_fullness = 0
- // Only count stomachs to fullness
- for(var/obj/belly/B in vore_organs)
- if(B.name == "Stomach" || B.name == "Second Stomach")
- for(var/mob/living/M in B)
- new_fullness += M.size_multiplier
- new_fullness /= size_multiplier
- new_fullness = round(new_fullness, 1)
- vore_fullness = min(vore_capacity, new_fullness)
-
/mob/living/simple_mob/vore/bigdragon/proc/build_icons(var/random)
cut_overlays()
if(stat == DEAD)
@@ -516,7 +505,10 @@ I think I covered everything.
/// My thanks to Raeschen for these descriptions
/mob/living/simple_mob/vore/bigdragon/init_vore()
+ if(!voremob_loaded || LAZYLEN(vore_organs))
+ return
var/obj/belly/B = new /obj/belly/dragon/maw(src)
+ B.affects_vore_sprites = FALSE
B.emote_lists[DM_HOLD] = list(
"The dragon's breath continues to pant over you rhythmically, each exhale carrying a bone-shivering growl",
"The thick, heavy tongue lifts, curling around you, cramming you tightly against it's teeth, to squeeze some flavor out of you.",
@@ -526,6 +518,7 @@ I think I covered everything.
gut1 = B
vore_selected = B
B = new /obj/belly/dragon/throat(src)
+ B.affects_vore_sprites = FALSE
B.emote_lists[DM_HOLD] = list(
"Gggllrrrk! Another loud, squelching swallow rings out in your ears, dragging you a little deeper into the furnace-like humid heat of the dragon's body.",
"Nestling in a still throat for a moment, you feel the walls quiver and undulate excitedly in tune with the beast's heartbeat.",
@@ -533,6 +526,7 @@ I think I covered everything.
"The throat closes in tightly, utterly cocooning you with it's silken spongey embrace. Like this it holds, until you feel like you might pass out... eventually, it would shlllrrk agape and loosen up all around you once more, the beast not wanting to lose the wriggly sensation of live prey.",
"Blrrbles and squelching pops from it's stomach echo out below you. Each swallow brings greater clarity to those digestive sounds, and stronger acidity to the muggy air around you, inching you closer to it's grasp. Not long now.")
B = new /obj/belly/dragon/stomach(src)
+ B.affects_vore_sprites = TRUE
B.emote_lists[DM_DIGEST] = list(
"The stomach walls spontaneously contract! Those wavey, fleshy walls binding your body in their embrace for the moment, slathering you with thick, caustic acids.",
"You hear a soft rumbling as the dragon’s insides churn around your body, the well-used stomach walls shuddering with a growl as you melt down.",
@@ -541,6 +535,7 @@ I think I covered everything.
"The constant, rhythmic kneading and massaging starts to take its toll along with the muggy heat, making you feel weaker and weaker!",
"The drake happily wanders around while digesting its meal, almost like it is trying to show off the hanging gut you've given it.")
B = new /obj/belly/dragon/maw/heal(src)
+ B.affects_vore_sprites = FALSE
B.emote_lists[DM_HEAL] = list(
"Gently, the dragon's hot, bumpy tongue cradles you, feeling like a slime-soaked memory-foam bed, twitching with life. The delicacy that the dragon holds you with is quite soothing.",
"The wide, slick throat infront of you constantly quivers and undulates. Every hot muggy exhale of the beast makes that throat spread, ropes of slime within it's hold shivering in the flow, inhales causing it to clench up somewhat.",
@@ -549,6 +544,7 @@ I think I covered everything.
"Saliva soaks the area all around you thickly, lubricating absolutely everything with the hot liquid. From time to time, the beast carefully shifts the rear of it's tongue to piston a cache of the goop down the hatch. The throat seen clenching tightly shut, the tongue's rear bobbing upwards, before down again - showing off a freshly slime-soaked entrance.")
gut2 = B
B = new /obj/belly/dragon/throat/heal(src)
+ B.affects_vore_sprites = FALSE
B.emote_lists[DM_HEAL] = list(
"The tunnel of the gullet closely wraps around you, mummifying you in a hot writhing embrace of silky flesh. The walls are slick, soaked in a lubricating slime, and so very warm.",
"The walls around you pulse in time with the dragon's heartbeat, which itself pounds in your ears. Rushing wind of calm breaths fill the gaps, and distant squelches of slimy payloads shifted around by soft flesh echo down below.",
@@ -556,6 +552,7 @@ I think I covered everything.
"Soothing thrumms from the beast sound out, to try help calm you on your way down. The dragon seems to not want you to panic, using surprisingly gentle intent.",
"Clenchy embraces rhythmically squelch over you. Spreading outwards, the walls would relent, letting you spread a hot, gooey pocket of space around yourself. You linger, before another undulation of a swallow nudges you further down.")
B = new /obj/belly/dragon/stomach/heal(src)
+ B.affects_vore_sprites = TRUE
B.emote_lists[DM_HEAL] = list(
"In tune with the beast's heartbeat, the walls heave and spread all around you. In, tight and close, and then outwards, spreading cobwebs of slime all around.",
"The thick folds of flesh around you blrrrble and sqllrrch, as the flesh itself secretes more of this strange, pure, goopy liquid, clenching it among it's crevices to squeeze it all over you in a mess.",
diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/corrupt_hounds.dm b/code/modules/mob/living/simple_mob/subtypes/vore/corrupt_hounds.dm
index a1335771f85..458d2d63e0c 100644
--- a/code/modules/mob/living/simple_mob/subtypes/vore/corrupt_hounds.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/vore/corrupt_hounds.dm
@@ -126,7 +126,9 @@
return TRUE
/mob/living/simple_mob/vore/aggressive/corrupthound/init_vore()
- ..()
+ if(!voremob_loaded)
+ return
+ . = ..()
var/obj/belly/B = vore_selected
B.name = "fuel processor"
B.desc = "Uttering distorted growls and fragmented voice clips all the while, the corrupted hound gulps the rest of your squirming figure past its jaws... which snap shut with an audible click of metal on metal. Your trip down its slickly lubricated, rubbery gullet is a tight and efficient one... and once you spill out into the machine's fuel processor, your weight making it sag slightly, hot-and-thick slime begins oozing all over your form. Only time will tell if you're destined to become fuel for its next bout of rampaging... be it days, hours, or just mere minutes..."
@@ -148,7 +150,9 @@
"'FU3L mE A1RE@Dy, S0 sO SORrY!?', your corrupted captor growls as its synthetic innards begin oozing more potent juices, grinding down into your body with increasing fervor!")
/mob/living/simple_mob/vore/aggressive/corrupthound/prettyboi/init_vore()
- ..()
+ if(!voremob_loaded)
+ return
+ . = ..()
var/obj/belly/B = vore_selected
B.name = "fuel processor"
B.desc = "The twice-corrupted hound takes a moment to lather over the rest of your figure in heated, slimy synth-slobber before gulping you the rest of the way down its lubricated, rubbery throat. After a short string of slick-sounding, autonomous swallows, you spill out into its awaiting processor, your body immediately making its synth-flesh sag down slightly... and, as an oddly distorted rumble vibrates into the chamber, so too does a slowly accumulating pool of hot, viscous ooze. Only time will tell if whatever extra programming the hound has will spare you from being processed..."
diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/cryptdrake.dm b/code/modules/mob/living/simple_mob/subtypes/vore/cryptdrake.dm
index 0e931f98325..a44eed03cae 100644
--- a/code/modules/mob/living/simple_mob/subtypes/vore/cryptdrake.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/vore/cryptdrake.dm
@@ -69,6 +69,8 @@
movement_cooldown = -1
/mob/living/simple_mob/vore/cryptdrake/init_vore()
+ if(!voremob_loaded)
+ return
. = ..()
var/obj/belly/B = vore_selected
B.name = "stomach"
diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/deathclaw.dm b/code/modules/mob/living/simple_mob/subtypes/vore/deathclaw.dm
index dbb629cbdde..b0611359347 100644
--- a/code/modules/mob/living/simple_mob/subtypes/vore/deathclaw.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/vore/deathclaw.dm
@@ -82,7 +82,9 @@
return
/mob/living/simple_mob/vore/aggressive/deathclaw/init_vore()
- ..()
+ if(!voremob_loaded)
+ return
+ . = ..()
var/obj/belly/B = vore_selected
B.name = "stomach"
B.desc = "The giant mutant of a lizard finishes stuffing you into its jaws and down its ravenously clenching gullet with a worrying ease and efficiency. An assortment of slick, slimy noises assault your senses for a few gulp-filled moments... before you spill out into the apex predator's swelteringly hot stomach, its walls already possessively grinding into your body."
diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/demon/demon.dm b/code/modules/mob/living/simple_mob/subtypes/vore/demon/demon.dm
index 5471175593d..2382cc89144 100644
--- a/code/modules/mob/living/simple_mob/subtypes/vore/demon/demon.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/vore/demon/demon.dm
@@ -45,7 +45,9 @@
var/is_shifting = FALSE
/mob/living/simple_mob/vore/demon/init_vore()
- ..()
+ if(!voremob_loaded)
+ return
+ . = ..()
var/obj/belly/B = vore_selected
B.name = "Stomach"
B.desc = "You slide down the slick, slippery gullet of the creature. It's warm, and the air is thick. You can feel the doughy walls of the creatures gut push and knead into your form! Slimy juices coat your form stinging against your flesh as they waste no time to start digesting you. The creature's heartbeat and the gurgling of their stomach are all you can hear as your jostled about, treated like nothing but food."
diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/devil.dm b/code/modules/mob/living/simple_mob/subtypes/vore/devil.dm
index 1d64e27ef0a..e21854b4c56 100644
--- a/code/modules/mob/living/simple_mob/subtypes/vore/devil.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/vore/devil.dm
@@ -43,7 +43,9 @@
vore_bump_emote = "pounces on"
/mob/living/simple_mob/vore/devil/init_vore()
- ..()
+ if(!voremob_loaded)
+ return
+ . = ..()
var/obj/belly/B = vore_selected
B.name = "stomach"
B.desc = "It turns out that this was not just any old statue, but some form of android waiting for its chance to ambush you. The moment that it laid its hands on you, your fate was decided. The jaws of the machine parted, if you could call them that, and immediately enveloped your head. The inside was hot and slick, but dry. The textures were startlingly realistic, the base was clearly a tongue, the top palate of the mouth was hard but somewhat pliable. Not that you had time to admire it before the rest of your body was stuffed inside. Through a short passage down through a rubbery tube of a gullet, mechanical contractions squeezing you down from behind, you're quickly deposited in something much resembling a stomach. Amid the sounds of mechanical whirrs, you can heard glorping, gurgling and burbling from unknown sources. The walls wrap firmly around your body, deliberately dramping you up into the smallest space that the machine can crush you into, whilst the synthetic lining around you ripples across your hunched up form. You can even see yourself, the gut itself is backlit by some eerie red glow, just enough to tell exactly what is happening to you. It doesn't help that you can see the drooling fluids glistening in the dim light."
diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/fennec.dm b/code/modules/mob/living/simple_mob/subtypes/vore/fennec.dm
index 65b712c2cf4..f9d4ba15e80 100644
--- a/code/modules/mob/living/simple_mob/subtypes/vore/fennec.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/vore/fennec.dm
@@ -130,7 +130,9 @@
add_overlay(bigshadow)
/mob/living/simple_mob/vore/fennec/huge/init_vore()
- ..()
+ if(!voremob_loaded)
+ return
+ . = ..()
var/obj/belly/B = vore_selected
B.name = "Stomach"
B.desc = "The slimy wet insides of a rather large fennec! Not quite as clean as the fen on the outside."
diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/greatwolf.dm b/code/modules/mob/living/simple_mob/subtypes/vore/greatwolf.dm
index 1d0e18733cf..7e3476699d1 100644
--- a/code/modules/mob/living/simple_mob/subtypes/vore/greatwolf.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/vore/greatwolf.dm
@@ -117,6 +117,8 @@
. = ..()
/mob/living/simple_mob/vore/greatwolf/init_vore()
+ if(!voremob_loaded)
+ return
. = ..()
var/obj/belly/B = vore_selected
B.name = "stomach"
diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/horse.dm b/code/modules/mob/living/simple_mob/subtypes/vore/horse.dm
index 4432da92be7..1201e791061 100644
--- a/code/modules/mob/living/simple_mob/subtypes/vore/horse.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/vore/horse.dm
@@ -80,7 +80,9 @@
return
/mob/living/simple_mob/vore/horse/init_vore()
- ..()
+ if(!voremob_loaded)
+ return
+ . = ..()
var/obj/belly/B = vore_selected
B.name = "stomach"
B.desc = "With a final few gulps, the horse finishes swallowing you down into its hot, dark gut... and with a slosh, your weight makes the equine's belly hang down slightly like some sort of organic hammock. The thick, humid air is tinged with the smell of half-digested grass, and the surrounding flesh wastes no time in clenching and massaging down over its newfound fodder."
@@ -137,7 +139,9 @@
vore_bump_emote = "chomps down on"
/mob/living/simple_mob/vore/horse/kelpie/init_vore()
- ..()
+ if(!voremob_loaded)
+ return
+ . = ..()
var/obj/belly/B = vore_selected
B.name = "stomach"
B.desc = "With a final few gulps, the kelpie finishes swallowing you down into its hot, humid gut... and with a slosh, your weight makes the equine's belly hang down slightly like some sort of organic hammock. The thick, damp air is tinged with the smell of seaweed, and the surrounding flesh wastes no time in clenching and massaging down over its newfound fodder."
diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/lamia.dm b/code/modules/mob/living/simple_mob/subtypes/vore/lamia.dm
index ed91a897a8a..a4de696dfae 100644
--- a/code/modules/mob/living/simple_mob/subtypes/vore/lamia.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/vore/lamia.dm
@@ -29,8 +29,11 @@
// Vore tags
vore_active = 1
vore_capacity = 1
+ vore_capacity_ex = list("stomach" = 1, "tail" = 1)
+ vore_fullness_ex = list("stomach" = 0, "tail" = 0)
vore_bump_emote = "coils their tail around"
vore_icons = 0
+ vore_icon_bellies = list("stomach", "tail")
// Default stomach
vore_stomach_name = "upper stomach"
vore_stomach_flavor = "You've ended up inside of the lamia's human stomach. It's pretty much identical to any human stomach, but the valve leading deeper is much bigger."
@@ -52,17 +55,6 @@
say_list_type = /datum/say_list/lamia
ai_holder_type = /datum/ai_holder/simple_mob/passive
-/mob/living/simple_mob/vore/lamia/update_fullness()
- var/new_fullness = 0
- // We only want to count our upper_stomach towards capacity
- for(var/obj/belly/B as anything in vore_organs)
- if(B.name == "upper stomach")
- for(var/mob/living/M in B)
- new_fullness += M.size_multiplier
- new_fullness /= size_multiplier
- new_fullness = round(new_fullness, 1)
- vore_fullness = min(vore_capacity, new_fullness)
-
/mob/living/simple_mob/vore/lamia/update_icon()
. = ..()
@@ -73,23 +65,8 @@
// And copper_vore_1_0 is full upper stomach, but empty tail stomach
// For unconscious: [icon_rest]_vore_[upper]_[tail]
// For dead, it doesn't show.
- var/upper_shows = FALSE
- var/tail_shows = FALSE
-
- for(var/obj/belly/B as anything in vore_organs)
- if(!(B.name in list("upper stomach", "tail stomach")))
- continue
- var/belly_fullness = 0
- for(var/mob/living/M in B)
- belly_fullness += M.size_multiplier
- belly_fullness /= size_multiplier
- belly_fullness = round(belly_fullness, 1)
-
- if(belly_fullness)
- if(B.name == "upper stomach")
- upper_shows = TRUE
- else if(B.name == "tail stomach")
- tail_shows = TRUE
+ var/upper_shows = vore_fullness_ex["stomach"]
+ var/tail_shows = vore_fullness_ex["tail"]
if(upper_shows || tail_shows)
if((stat == CONSCIOUS) && (!icon_rest || !resting || !incapacitated(INCAPACITATION_DISABLED)))
@@ -100,6 +77,8 @@
icon_state = "[icon_rest]_vore_[upper_shows]_[tail_shows]"
/mob/living/simple_mob/vore/lamia/init_vore()
+ if(!voremob_loaded)
+ return
. = ..()
var/obj/belly/B = vore_selected
@@ -108,6 +87,7 @@
var/obj/belly/tail = new /obj/belly(src)
tail.immutable = TRUE
+ tail.affects_vore_sprites = TRUE
tail.name = "tail stomach"
tail.desc = "You slide out into the narrow, constricting tube of flesh that is the lamia's snake half, heated walls and strong muscles all around clinging to your form with every slither."
tail.digest_mode = vore_default_mode
@@ -125,6 +105,7 @@
tail.human_prey_swallow_time = swallowTime
tail.nonhuman_prey_swallow_time = swallowTime
tail.vore_verb = "stuff"
+ tail.belly_sprite_to_affect = "tail"
tail.emote_lists[DM_HOLD] = B.emote_lists[DM_HOLD].Copy()
tail.emote_lists[DM_DIGEST] = B.emote_lists[DM_DIGEST].Copy()
diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/leopardmander.dm b/code/modules/mob/living/simple_mob/subtypes/vore/leopardmander.dm
index 81e756e5277..0f5360c649b 100644
--- a/code/modules/mob/living/simple_mob/subtypes/vore/leopardmander.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/vore/leopardmander.dm
@@ -75,6 +75,8 @@
src.adjust_nutrition(src.max_nutrition)
/mob/living/simple_mob/vore/leopardmander/init_vore()
+ if(!voremob_loaded)
+ return
. = ..()
var/obj/belly/B = vore_selected
B.name = "stomach"
@@ -144,6 +146,8 @@
add_verb(src, /mob/living/simple_mob/vore/leopardmander/exotic/proc/toggle_glow)
/mob/living/simple_mob/vore/leopardmander/exotic/init_vore()
+ if(!voremob_loaded)
+ return
. = ..()
var/obj/belly/B = vore_selected
B.name = "stomach"
diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/macrophage.dm b/code/modules/mob/living/simple_mob/subtypes/vore/macrophage.dm
index 3e340e0abca..edfbaa5dc15 100644
--- a/code/modules/mob/living/simple_mob/subtypes/vore/macrophage.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/vore/macrophage.dm
@@ -62,7 +62,7 @@
/mob/living/simple_mob/vore/aggressive/macrophage/init_vore()
- if(LAZYLEN(vore_organs))
+ if(!voremob_loaded || LAZYLEN(vore_organs))
return TRUE
var/obj/belly/B = new /obj/belly/macrophage(src)
diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/meowl.dm b/code/modules/mob/living/simple_mob/subtypes/vore/meowl.dm
index 5fb2a327ad8..c4c64dd4002 100644
--- a/code/modules/mob/living/simple_mob/subtypes/vore/meowl.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/vore/meowl.dm
@@ -39,7 +39,9 @@
vore_bump_emote = "pounces on"
/mob/living/simple_mob/vore/meowl/init_vore()
- ..()
+ if(!voremob_loaded)
+ return
+ . = ..()
var/obj/belly/B = vore_selected
B.name = "stomach"
B.desc = "The strange critter suddenly takes advantage of you being alone to pounce atop you and quickly engulf your head within its maw! Before you even have a chance to react, the world goes dark with the inside of the meowls mouth covering your face, a rough tounge lapping smearing wet hot slobber over you. The rest of the process is pretty quick as the cat-owl begins to gulp your head down through a surprisingly stretchy throat and along the tight, flexing tunnel of its gullet. Before long you are pushing face first into the creature's stomach, the wrinkled walls quickly beginning grind slick flesh across it like any other piece of food. The rest of your body soon follows into the increasingly tight space, forced to curl up over yourself as the stomach lining bears down on you from every angle. At first, the stomach itself seems rather inactive, happily just squeezing and massaging you as the meowl settles down to slowly enjoy their snack. Though, struggling might risk setting off the gut one way or another..."
diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/oregrub.dm b/code/modules/mob/living/simple_mob/subtypes/vore/oregrub.dm
index 889e8e857b1..13a4cfcd043 100644
--- a/code/modules/mob/living/simple_mob/subtypes/vore/oregrub.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/vore/oregrub.dm
@@ -164,7 +164,9 @@
//I'm no good at writing this stuff, so I've just left it as placeholders and disabled the chances of them eating you.
/*
/mob/living/simple_mob/vore/oregrub/init_vore()
- ..()
+ if(!voremob_loaded)
+ return
+ . = ..()
var/obj/belly/B = vore_selected
B.name = "stomach"
B.desc = "PLACEHOLDER!"
diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/pakkun.dm b/code/modules/mob/living/simple_mob/subtypes/vore/pakkun.dm
index b64e9e8b293..ba0e5becbe8 100644
--- a/code/modules/mob/living/simple_mob/subtypes/vore/pakkun.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/vore/pakkun.dm
@@ -147,7 +147,9 @@
ai_holder.remove_target()
/mob/living/simple_mob/vore/pakkun/init_vore()
- ..()
+ if(!voremob_loaded)
+ return
+ . = ..()
var/obj/belly/B = vore_selected
B.name = "stomach"
B.desc = "you land with a soft bump in what can only be described as a big soft slimy sack, the walls effortlessly stretching to match your every move with no sign of reaching any kind of elastic \
@@ -271,7 +273,9 @@
..()
/mob/living/simple_mob/vore/pakkun/snapdragon/snappy/init_vore()
- ..()
+ if(!voremob_loaded)
+ return
+ . = ..()
var/obj/belly/B = vore_selected
B.digest_mode = DM_HOLD
B.desc = "the lizard gently yet insistently stuffs you down her gullet - evidently enjoying this moment of playtime as you land in a sprawled heap in the stretchy, clinging sack that makes up \
diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/panther.dm b/code/modules/mob/living/simple_mob/subtypes/vore/panther.dm
index fb8e27e3c0e..7d43ea18cfc 100644
--- a/code/modules/mob/living/simple_mob/subtypes/vore/panther.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/vore/panther.dm
@@ -63,7 +63,9 @@
return
/mob/living/simple_mob/vore/aggressive/panther/init_vore()
- ..()
+ if(!voremob_loaded)
+ return
+ . = ..()
var/obj/belly/B = vore_selected
B.name = "stomach"
B.desc = "All it takes is a few more rasps of the panther's rough, barbed tongue to shovel the rest of you down its tightly rippling gullet... and with a final couple ravenous swallows, you spill out into the predatory feline's stomach! Right away, that gut's muscular walls knead and contract around you, forcing you into a curled-up ball as the panther's noisy purring rumbles into you from every direction."
diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/peasant.dm b/code/modules/mob/living/simple_mob/subtypes/vore/peasant.dm
index 3448e7a755c..4a15908f6b9 100644
--- a/code/modules/mob/living/simple_mob/subtypes/vore/peasant.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/vore/peasant.dm
@@ -55,7 +55,9 @@
emote_see = list("exists","just stands there","smiles","looks around")
/mob/living/simple_mob/vore/peasant/init_vore()
- ..()
+ if(!voremob_loaded)
+ return
+ . = ..()
var/obj/belly/B = vore_selected
B.name = "stomach"
B.desc = "You've somehow managed to get yourself eaten by one of the local peasants. After jamming you down into their stomach, you find yourself cramped up tight in a space that clearly shouldn't be able to accept you. They let out a relieved sigh as they heft around their new found weight, giving it a hearty pat, clearly content to get a good meal for once. The world around you groans and grumbles, but the gut is far from harmful to you right now, even as the walls clench down on your body."
diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/plants.dm b/code/modules/mob/living/simple_mob/subtypes/vore/plants.dm
index af3ae2a9891..f35a5424f93 100644
--- a/code/modules/mob/living/simple_mob/subtypes/vore/plants.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/vore/plants.dm
@@ -38,7 +38,9 @@
vore_bump_emote = "encloses on"
/mob/living/simple_mob/vore/mantrap/init_vore()
- ..()
+ if(!voremob_loaded)
+ return
+ . = ..()
var/obj/belly/B = vore_selected
B.name = "trap"
B.desc = "As you step onto the large leaves of the mantrap, they suddenly shoot up and snap shut around you, encasing you in a fleshy-feeling gut. The saw-toothed spikes around the edge of the leaves interlock with one another and exerts a tremendous pressure on your body. Copious volumes of fluids begin to seep in from the walls themselves, rapidly coating your body and pooling around you, all of your movements only seem to speed up this process.."
@@ -125,7 +127,9 @@
projectilesound = 'sound/effects/slime_squish.ogg'
/mob/living/simple_mob/vore/pitcher/init_vore()
- ..()
+ if(!voremob_loaded)
+ return
+ . = ..()
var/obj/belly/B = vore_selected
B.name = "stomach"
B.desc = "Walking a little too close to the pitcher plant, you trigger its trap mechanism and a tendril shoots out towards you. Wrapping around your body, you are rapidly dragged into the open mouth of the plant, stuffing your entire body into a fleshy, green stomach filled with a pool of some sort of tingling liquid. The lid of the plant slams down over the mouth, making it far more difficult to escape, all whilst that pool steadily seems to be filling up."
diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/raptor.dm b/code/modules/mob/living/simple_mob/subtypes/vore/raptor.dm
index 4495c320348..7b02c433041 100644
--- a/code/modules/mob/living/simple_mob/subtypes/vore/raptor.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/vore/raptor.dm
@@ -83,6 +83,8 @@
movement_cooldown = -1
/mob/living/simple_mob/vore/raptor/init_vore()
+ if(!voremob_loaded)
+ return
. = ..()
var/obj/belly/B = vore_selected
B.name = "stomach"
diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/rat.dm b/code/modules/mob/living/simple_mob/subtypes/vore/rat.dm
index 186dfbc9833..bc8285714c1 100644
--- a/code/modules/mob/living/simple_mob/subtypes/vore/rat.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/vore/rat.dm
@@ -73,7 +73,9 @@
allow_mind_transfer = TRUE
/mob/living/simple_mob/vore/aggressive/rat/init_vore()
- ..()
+ if(!voremob_loaded)
+ return
+ . = ..()
var/obj/belly/B = vore_selected
B.name = "stomach"
B.desc = "In a cruel game of cat-and-mouse gone horribly wrong, you struggle to breathe clearly as the giant rat holds your head in its jaws, the rest of its bulk pinning you to the ground. Slimy slurps and its own muffled squeaking fill your senses as it simultaneously tosses its head while backing up. Quickly, ravenously consuming you, bit by bit, packing you down its gullet no matter how you struggle. Passing by its excited heartbeat, your thoroughly slickened head pushes out into its awaiting stomach, a dark and humid hammock eager to accept the rest of you. Soon, those too-warm, plush walls clench and squeeze around you with undeniable need! A need for mere filling, or, perhaps, a proper meal?"
diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/scel.dm b/code/modules/mob/living/simple_mob/subtypes/vore/scel.dm
index ce4ff0fe938..0be9730340c 100644
--- a/code/modules/mob/living/simple_mob/subtypes/vore/scel.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/vore/scel.dm
@@ -95,6 +95,8 @@
movement_cooldown = -1
/mob/living/simple_mob/vore/scel/init_vore()
+ if(!voremob_loaded)
+ return
. = ..()
var/obj/belly/B = vore_selected
B.name = "stomach"
diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/scrubble.dm b/code/modules/mob/living/simple_mob/subtypes/vore/scrubble.dm
index a18160887f3..98e31178b1e 100644
--- a/code/modules/mob/living/simple_mob/subtypes/vore/scrubble.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/vore/scrubble.dm
@@ -41,7 +41,9 @@
vore_standing_too = 1
/mob/living/simple_mob/vore/scrubble/init_vore()
- ..()
+ if(!voremob_loaded)
+ return
+ . = ..()
var/obj/belly/B = vore_selected
B.name = "stomach"
B.desc = "Despite the small size of the scrubble, it seems to have a lot of energy behind it. The critter dives atop you in a panic, its maw quickly engulfing your head as its paws flail scrabble against you, hot slobber slathering across your tightly trapped face. It takes a little repositioning to get itself in the right position, but soon the creature is gulping its way down your entire body. Somehow it manages to squeeze you completely into a gut that should rightly be far too small for anything but a mouse, bundling up your body into a tight ball as the walls around you clench in tightly to keep you nice and compact. The sounds of burbling and glorping echo through the intensely tight space as the stomach lining grinds in thick oozes against your skin, pressure so high that you can barely move a muscle."
diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/shadekin/shadekin.dm b/code/modules/mob/living/simple_mob/subtypes/vore/shadekin/shadekin.dm
index 69977845274..939ed979659 100644
--- a/code/modules/mob/living/simple_mob/subtypes/vore/shadekin/shadekin.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/vore/shadekin/shadekin.dm
@@ -140,12 +140,15 @@
. = ..()
/mob/living/simple_mob/shadekin/init_vore()
+ if(!voremob_loaded)
+ return
if(LAZYLEN(vore_organs))
return
var/obj/belly/B = new /obj/belly(src)
vore_selected = B
B.immutable = 1
+ B.affects_vore_sprites = TRUE
B.name = vore_stomach_name ? vore_stomach_name : "stomach"
B.desc = vore_stomach_flavor ? vore_stomach_flavor : "Your surroundings are warm, soft, and slimy. Makes sense, considering you're inside \the [name]."
B.digest_mode = vore_default_mode
diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/sheep.dm b/code/modules/mob/living/simple_mob/subtypes/vore/sheep.dm
index ad58c3a43f3..6f68198e178 100644
--- a/code/modules/mob/living/simple_mob/subtypes/vore/sheep.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/vore/sheep.dm
@@ -56,7 +56,9 @@
return
/mob/living/simple_mob/vore/sheep/init_vore()
- ..()
+ if(!voremob_loaded)
+ return
+ . = ..()
var/obj/belly/B = vore_selected
B.name = "stomach"
B.desc = "With a final few gulps, the sheep finishes swallowing you down into its hot, dark guts… The wool on the outside is doing you no favors with its insulation. The toasty organic flesh kneads and grinds around you with the stank of wet grass. The sheep seems to have already forgotten about you as it lets out a soft BAAH like belch and carries on doing nothing. "
diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/snake.dm b/code/modules/mob/living/simple_mob/subtypes/vore/snake.dm
index 03945dae5a4..8a06d838772 100644
--- a/code/modules/mob/living/simple_mob/subtypes/vore/snake.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/vore/snake.dm
@@ -64,7 +64,9 @@
swallowTime = 2 SECONDS // Hungry little bastards.
/mob/living/simple_mob/vore/aggressive/giant_snake/init_vore()
- ..()
+ if(!voremob_loaded)
+ return
+ . = ..()
var/obj/belly/B = vore_selected
B.name = "stomach"
B.desc = "As the giant snake's closed jaws seal you away from the outside world, you are immediately greeted with a seemingly endless passage of tightly squeezing flesh. Hot and coated in thick, body-clinging slime, the serpent's stomach walls immediately get to work at rhythmically pulsing and contracting against your figure, slowly tugging you deeper into its ravenous clutches."
diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/softdog.dm b/code/modules/mob/living/simple_mob/subtypes/vore/softdog.dm
index 23d4260cec8..290898a1205 100644
--- a/code/modules/mob/living/simple_mob/subtypes/vore/softdog.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/vore/softdog.dm
@@ -95,7 +95,9 @@
/mob/living/simple_mob/vore/woof/init_vore()
- ..()
+ if(!voremob_loaded)
+ return
+ . = ..()
var/obj/belly/B = vore_selected
B.name = "stomach"
B.desc = "You have found yourself pumping on down, down, down into this extremely soft dog. The slick touches of pulsing walls roll over you in greedy fashion as you're swallowed away, the flesh forms to your figure as in an instant the world is replaced by the hot squeeze of canine gullet. And in another moment a heavy GLLRMMPTCH seals you away, the dog tossing its head eagerly, the way forward stretching to accommodate your shape as you are greedily guzzled down. The wrinkled, doughy walls pulse against you in time to the creature's steady heartbeat. The sounds of the outside world muffled into obscure tones as the wet, grumbling rolls of this soft creature's gut hold you, churning you tightly such that no part of you is spared from these gastric affections."
diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/solargrub.dm b/code/modules/mob/living/simple_mob/subtypes/vore/solargrub.dm
index 61bf3aa6f88..57cb39e77d6 100644
--- a/code/modules/mob/living/simple_mob/subtypes/vore/solargrub.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/vore/solargrub.dm
@@ -143,7 +143,9 @@ List of things solar grubs should be able to do:
glow_override = FALSE
/mob/living/simple_mob/vore/solargrub/init_vore()
- ..()
+ if(!voremob_loaded)
+ return
+ . = ..()
var/obj/belly/B = vore_selected
B.name = "stomach"
B.desc = "Through either grave error, overwhelming willingness, or some other factor, you find yourself lodged halfway past the solargrub's mandibles. While it had initially hissed and chittered in glee at the prospect of a new meal, it is clearly more versed in suckling on power cables; inch by inch, bit by bit, it undulates forth to slowly, noisily gulp you down its short esophagus... and right into its extra-cramped, surprisingly hot stomach. As the rest of you spills out into the plush-walled chamber, the grub's soft body bulges outwards here and there with your compressed figure. Before long, a thick slime oozes out from the surrounding stomach walls; only time will tell how effective it is on something solid like you..."
diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/sonadile.dm b/code/modules/mob/living/simple_mob/subtypes/vore/sonadile.dm
index 49cf20946f3..f28c646f8f9 100644
--- a/code/modules/mob/living/simple_mob/subtypes/vore/sonadile.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/vore/sonadile.dm
@@ -44,7 +44,9 @@
vore_bump_emote = "pounces on"
/mob/living/simple_mob/vore/sonadile/init_vore()
- ..()
+ if(!voremob_loaded)
+ return
+ . = ..()
var/obj/belly/B = vore_selected
B.name = "stomach"
B.desc = "The creature's huge maw drops down over your body, the long neck preventing it from barely having to shift its torso at all. The jaws quickly travel down you, slathering you in a drool as you're quickly stuffed through the flexible muscle of the throat. In a matter of seconds you are effortlessly lifted from the ground, your entire figure now reduced to a bulge within the neck of the beast, your feet soon vanishing into its mouth with a visceral gulp. The journey down is a long and slow one, the gullet squeezing you steadily along with heavy rippling contractions, the sonadile is quite content that you're heading in the right direction. With every inch, the world around you grows louder with the sound of a heartbeat and the gutteral grumbles of your upcoming destination. Before long you are squeezed down through a tight fleshy valve and deposited in the stomach of the reptile, walls immediately bearing down on you from every direction to ensure that you're tightly confined with little room to move. Hot, humid and slick with all manner of thick and thin liquids, this place isn't treating you any different from whatever else this animal likes to eat."
diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/stalker.dm b/code/modules/mob/living/simple_mob/subtypes/vore/stalker.dm
index 57aefb7ba6a..968b91bcc48 100644
--- a/code/modules/mob/living/simple_mob/subtypes/vore/stalker.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/vore/stalker.dm
@@ -44,7 +44,9 @@
vore_bump_emote = "pounces on"
/mob/living/simple_mob/vore/stalker/init_vore()
- ..()
+ if(!voremob_loaded)
+ return
+ . = ..()
var/obj/belly/B = vore_selected
B.name = "stomach"
B.desc = "The lithe creature spends only minimal time with you pinned beneath it, before it's jaws stretch wide ahead of your face. The slightly blue hued interior squelches tightly over your head as the stalker's teeth prod against you, threatening to become much more of a danger if you put up too much of a fight. However, the process is quick, your body is efficiently squeezed through that tight gullet, contractions dragging you effortlessly towards the creature's gut. The stomach swells and hangs beneath the animal, swaying like a hammock under the newfound weight. The walls wrap incredibly tightly around you, compressing you tightly into a small ball as it grinds caustic juices over you."
diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/succubi.dm b/code/modules/mob/living/simple_mob/subtypes/vore/succubi.dm
index 1032d3fc1fc..67fa43187d1 100644
--- a/code/modules/mob/living/simple_mob/subtypes/vore/succubi.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/vore/succubi.dm
@@ -56,7 +56,9 @@
emote_see = list("gestures for you to come over","winks","smiles","stretches")
/mob/living/simple_mob/vore/succubus/init_vore()
- ..()
+ if(!voremob_loaded)
+ return
+ . = ..()
var/obj/belly/B = vore_selected
B.name = "stomach"
B.desc = "You find yourself tightly compressed into the stomach of the succubus, with immense pressure squeezing down on you from every direction. The wrinkled walls of the gut knead over you, like a swelteringly hot, wet massage. You can feel movement from the outside, as though the demoness is running her hands over your form with delight. The world around you groans and gurgles, but the fluids that ooze into this place don't seem harmful, yet. Instead, you feel your very energy being steadily depleted, much to the joy of the woman who's claiming it all for herself."
diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/vampire.dm b/code/modules/mob/living/simple_mob/subtypes/vore/vampire.dm
index ab7198912c0..43d2b86575b 100644
--- a/code/modules/mob/living/simple_mob/subtypes/vore/vampire.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/vore/vampire.dm
@@ -55,7 +55,9 @@
emote_see = list("wafts about","licks their lips","flaps a bit")
/mob/living/simple_mob/vore/vampire/init_vore()
- ..()
+ if(!voremob_loaded)
+ return
+ . = ..()
var/obj/belly/B = vore_selected
B.name = "stomach"
B.desc = "Having been rapidly gulped up by the vampire, you find yourself tightly contained with a set of groaning, wrinkled walls. It seems that the beast has decided against draining your lifeforce through you blood, and instead taking a more direct approach as it saps your strength from all around you. Your attacker seems content to just take that essence for now, but it is a gut afterall and struggling may set it off."
diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/vore_hostile.dm b/code/modules/mob/living/simple_mob/subtypes/vore/vore_hostile.dm
index 1b56a1da37b..9c02600b179 100644
--- a/code/modules/mob/living/simple_mob/subtypes/vore/vore_hostile.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/vore/vore_hostile.dm
@@ -71,7 +71,9 @@
unacidable = TRUE
/mob/living/simple_mob/vore/vore_hostile/abyss_lurker/init_vore()
- ..()
+ if(!voremob_loaded)
+ return
+ . = ..()
var/obj/belly/B = vore_selected
B.name = "interior"
B.desc = "It's hot and overwhelmingly tight! The interior of the pale creature groans with the effort of squeezing you. Everything is hot and churning and eager to grind and smother you in thick fluids. The weight of the creature's body pressing in at you makes it hard to move at all, while you are squeezed to the very core of the creature! There seems almost not to even be an organ for this so much as the creature has folded around you, trying to incorporate your matter into its body with vigor!"
@@ -189,7 +191,9 @@
var/leap_sound = 'sound/weapons/spiderlunge.ogg'
/mob/living/simple_mob/vore/vore_hostile/leaper/init_vore()
- ..()
+ if(!voremob_loaded)
+ return
+ . = ..()
var/obj/belly/B = vore_selected
B.name = "stomach"
B.desc = "The flesh of the tall creature's stomach folds over you in doughy waves, squeezing you into the tightest shape it can manage with idle flexes churning down on you. Your limbs often find themselves lost between folds and tugged this way or that, held in a skin tight press that is not painful, but is hard to pull away from. You can see a strange, glittering pink and purple light glimmering through the flesh of the monster all around you, like your very own sea of stars. The walls rush in to fill all the space, squeezing you from head to toe no matter how you might wiggle, the weight of the semi-transparent interior flesh keeping you neatly secured deep inside while wringing the fight out of you."
@@ -305,7 +309,9 @@
unacidable = TRUE
/mob/living/simple_mob/vore/vore_hostile/gelatinous_cube/init_vore()
- ..()
+ if(!voremob_loaded)
+ return
+ . = ..()
var/obj/belly/B = vore_selected
B.name = "interior"
B.desc = "An incredibly thick oozing slime surrounds you, filling in all the space around your form! It's hard to catch a breath here as the jiggling gel that makes up the body of the creature swiftly fills in the hole you made in its surface by entering. The gel is semi-transparent, and you can see your surroundings though its surface, and similarly you can be seen floating in the gel from the outside. When the cube moves, your whole body is wobbled along with it. There are clouds of still processing material floating all around you as the corrosive substance works on breaking everything down."
diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/wolftaur.dm b/code/modules/mob/living/simple_mob/subtypes/vore/wolftaur.dm
index 29ab5a478a3..3687687c93e 100644
--- a/code/modules/mob/living/simple_mob/subtypes/vore/wolftaur.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/vore/wolftaur.dm
@@ -69,7 +69,9 @@
belly_attack = FALSE
/mob/living/simple_mob/vore/wolftaur/init_vore()
- ..()
+ if(!voremob_loaded)
+ return
+ . = ..()
var/obj/belly/B = vore_selected
B.name = "stomach"
B.desc = "After a gruelling compressive traversal down through the taur's gullet, you briefly get deposited in an oppressively tight stomach at it's humanoid waist. However, the wolf has little interest in keeping you here, instead treating you as a mere snack, an orifice opens beneath you and you're soon dragged deeper into her depths. Soon you're splashing into an active, waiting caustic slurry, and the world around you drops as though you're trapped in a hammock. The taur's underbelly sags with your weight, and you feel a heavy pat from the woman outside settling in to make the most of her meal."
diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/zz_vore_overrides.dm b/code/modules/mob/living/simple_mob/subtypes/vore/zz_vore_overrides.dm
index 29dd6002a1a..0c51d048949 100644
--- a/code/modules/mob/living/simple_mob/subtypes/vore/zz_vore_overrides.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/vore/zz_vore_overrides.dm
@@ -237,6 +237,8 @@
// Override stuff for holodeck carp to make them not digest when set to safe!
/mob/living/simple_mob/animal/space/carp/holographic/init_vore()
+ if(!voremob_loaded)
+ return
. = ..()
var/safe = (faction == FACTION_NEUTRAL)
for(var/obj/belly/B as anything in vore_organs)
diff --git a/code/modules/vore/eating/belly_import.dm b/code/modules/vore/eating/belly_import.dm
index d13389b579b..3fb41309e09 100644
--- a/code/modules/vore/eating/belly_import.dm
+++ b/code/modules/vore/eating/belly_import.dm
@@ -715,10 +715,8 @@
if(istext(belly_data["belly_sprite_to_affect"]))
var/new_belly_sprite_to_affect = sanitize(belly_data["belly_sprite_to_affect"],MAX_MESSAGE_LEN,0,0,0)
if(new_belly_sprite_to_affect)
- if(ishuman(host))
- var/mob/living/carbon/human/H = host
- if (new_belly_sprite_to_affect in H.vore_icon_bellies)
- new_belly.belly_sprite_to_affect = new_belly_sprite_to_affect
+ if (new_belly_sprite_to_affect in host.vore_icon_bellies)
+ new_belly.belly_sprite_to_affect = new_belly_sprite_to_affect
if(istext(belly_data["undergarment_chosen"]))
var/new_undergarment_chosen = sanitize(belly_data["undergarment_chosen"],MAX_MESSAGE_LEN,0,0,0)
@@ -728,7 +726,6 @@
new_belly.undergarment_chosen = U.name
break
- /* Not implemented on virgo
var/datum/category_group/underwear/UWC = global_underwear.categories_by_name[new_belly.undergarment_chosen]
var/invalid_if_none = TRUE
for(var/datum/category_item/underwear/U in UWC.items)
@@ -749,7 +746,6 @@
if(istext(belly_data["undergarment_color"]))
var/new_undergarment_color = sanitize_hexcolor(belly_data["undergarment_color"],new_belly.undergarment_color)
new_belly.undergarment_color = new_undergarment_color
- */
/* These don't seem to actually be available yet
if(istext(belly_data["tail_to_change_to"]))
var/new_tail_to_change_to = sanitize(belly_data["tail_to_change_to"],MAX_MESSAGE_LEN,0,0,0)
@@ -1179,8 +1175,6 @@
new_belly.items_preserved.Cut()
// new_belly.update_internal_overlay() // Signal not implemented!
- if(ishuman(host))
- var/mob/living/carbon/human/H = host
- H.update_fullness()
+ host.update_fullness()
host.updateVRPanel()
unsaved_changes = TRUE
diff --git a/code/modules/vore/eating/belly_obj_vr.dm b/code/modules/vore/eating/belly_obj_vr.dm
index 26bceec35b8..c4c445534e7 100644
--- a/code/modules/vore/eating/belly_obj_vr.dm
+++ b/code/modules/vore/eating/belly_obj_vr.dm
@@ -64,11 +64,12 @@
var/belly_overall_mult = 1 //Multiplier applied ontop of any other specific multipliers
- var/vore_sprite_flags = DM_FLAG_VORESPRITE_ARTICLE
+ var/vore_sprite_flags = DM_FLAG_VORESPRITE_BELLY
var/tmp/static/list/vore_sprite_flag_list= list(
- "Normal Belly Sprite" = DM_FLAG_VORESPRITE_ARTICLE,
+ "Normal Belly Sprite" = DM_FLAG_VORESPRITE_BELLY,
//"Tail adjustment" = DM_FLAG_VORESPRITE_TAIL,
//"Marking addition" = DM_FLAG_VORESPRITE_MARKING
+ "Undergarment addition" = DM_FLAG_VORESPRITE_ARTICLE,
)
var/affects_vore_sprites = FALSE
var/count_absorbed_prey_for_sprite = TRUE
@@ -86,6 +87,8 @@
var/tail_extra_overlay = FALSE
var/tail_extra_overlay2 = FALSE
var/undergarment_chosen = "Underwear, bottom"
+ var/undergarment_if_none
+ var/undergarment_color = COLOR_GRAY
// Generally just used by AI
var/autotransferchance = 0 // % Chance of prey being autotransferred to transfer location
@@ -231,7 +234,10 @@
"belly_sprite_to_affect",
"health_impacts_size",
"count_items_for_sprite",
- "item_multiplier"
+ "item_multiplier",
+ "undergarment_chosen",
+ "undergarment_if_none",
+ "undergarment_color"
)
if (save_digest_mode == 1)
@@ -305,9 +311,7 @@
if(M.ai_holder)
M.ai_holder.handle_eaten()
- if (istype(owner, /mob/living/carbon/human))
- var/mob/living/carbon/human/hum = owner
- hum.update_fullness()
+ owner.update_fullness()
// Intended for simple mobs
if(!owner.client && autotransferlocation && autotransferchance > 0)
@@ -327,9 +331,9 @@
L.toggle_hud_vis()
if((L.stat != DEAD) && L.ai_holder)
L.ai_holder.go_wake()
- if (istype(owner, /mob/living/carbon/human))
- var/mob/living/carbon/human/hum = owner
- hum.update_fullness()
+ owner.update_fullness()
+ return
+
/obj/belly/proc/vore_fx(mob/living/L)
@@ -635,6 +639,10 @@
if(G)
G.forceMove(src)
qdel(M)
+ if(isanimal(owner))
+ owner.update_icon()
+ else
+ owner.update_fullness()
// Handle a mob being absorbed
/obj/belly/proc/absorb_living(mob/living/M)
@@ -684,6 +692,8 @@
owner.updateVRPanel()
if(isanimal(owner))
owner.update_icon()
+ else
+ owner.update_fullness()
// Finally, if they're to be sent to a special pudge belly, send them there
if(transferlocation_absorb)
var/obj/belly/dest_belly
@@ -712,6 +722,8 @@
owner.updateVRPanel()
if(isanimal(owner))
owner.update_icon()
+ else
+ owner.update_fullness()
/////////////////////////////////////////////////////////////////////////
/obj/belly/proc/handle_absorb_langs()
@@ -797,10 +809,8 @@
var/sound/struggle_snuggle
var/sound/struggle_rustle = sound(get_sfx("rustle"))
- if(resist_triggers_animation && affects_vore_sprites)
- var/mob/living/carbon/human/O = owner
- if(istype(O))
- O.vore_belly_animation()
+ if((vore_sprite_flags & DM_FLAG_VORESPRITE_BELLY) && (owner.vore_capacity_ex[belly_sprite_to_affect] >= 1) /*&& !private_struggle*/ && resist_triggers_animation && affects_vore_sprites)
+ owner.vs_animate(belly_sprite_to_affect)
if(is_wet)
if(!fancy_vore)
@@ -1008,8 +1018,6 @@
I.gurgle_contaminate(target.contents, target.contamination_flavor, target.contamination_color)
items_preserved -= content
owner.updateVRPanel()
- if(isanimal(owner))
- owner.update_icon()
for(var/mob/living/M in contents)
M.updateVRPanel()
owner.update_icon()
@@ -1100,6 +1108,9 @@
dupe.health_impacts_size = health_impacts_size
dupe.count_items_for_sprite = count_items_for_sprite
dupe.item_multiplier = item_multiplier
+ dupe.undergarment_chosen = undergarment_chosen
+ dupe.undergarment_if_none = undergarment_if_none
+ dupe.undergarment_color = undergarment_color
//// Object-holding variables
//struggle_messages_outside - strings
@@ -1310,10 +1321,14 @@
if(M.absorbed)
fullness_to_add *= absorbed_multiplier
if(health_impacts_size)
- fullness_to_add *= M.health / M.getMaxHealth()
- belly_fullness += fullness_to_add
- if(count_liquid_for_sprite)
- belly_fullness += (reagents.total_volume / 100) * liquid_multiplier
+ if(ishuman(M))
+ fullness_to_add *= (M.health + 100) / (M.getMaxHealth() + 100)
+ else
+ fullness_to_add *= M.health / M.getMaxHealth()
+ if(fullness_to_add > 0)
+ belly_fullness += fullness_to_add
+ /*if(count_liquid_for_sprite)
+ belly_fullness += (reagents.total_volume / 100) * liquid_multiplier*/// Not yet implemented here
if(count_items_for_sprite)
for(var/obj/item/I in src)
var/fullness_to_add = 0
@@ -1328,7 +1343,7 @@
else if(I.w_class == ITEMSIZE_HUGE)
fullness_to_add = ITEMSIZE_COST_HUGE
else
- fullness_to_add = ITEMSIZE_COST_NO_CONTAINER
+ fullness_to_add = I.w_class
fullness_to_add /= 32
belly_fullness += fullness_to_add * item_multiplier
belly_fullness *= size_factor_for_sprite
diff --git a/code/modules/vore/eating/bellymodes_datum_vr.dm b/code/modules/vore/eating/bellymodes_datum_vr.dm
index f3ac184b8d3..54c2ff9c10b 100644
--- a/code/modules/vore/eating/bellymodes_datum_vr.dm
+++ b/code/modules/vore/eating/bellymodes_datum_vr.dm
@@ -36,9 +36,7 @@ GLOBAL_LIST_INIT(digest_modes, list())
SEND_SOUND(L, sound(get_sfx("fancy_death_prey")))
B.handle_digestion_death(L)
if(!L)
- if (istype(B.owner, /mob/living/carbon/human))
- var/mob/living/carbon/human/howner = B.owner
- howner.update_fullness()
+ B.owner.update_fullness()
if(!B.fancy_vore)
return list("to_update" = TRUE, "soundToPlay" = sound(get_sfx("classic_death_sounds")))
return list("to_update" = TRUE, "soundToPlay" = sound(get_sfx("fancy_death_pred")))
@@ -66,9 +64,7 @@ GLOBAL_LIST_INIT(digest_modes, list())
var/difference = B.owner.size_multiplier / L.size_multiplier
if(B.health_impacts_size)
- if (istype(B.owner, /mob/living/carbon/human))
- var/mob/living/carbon/human/howner = B.owner
- howner.update_fullness()
+ B.owner.update_fullness()
consider_healthbar(L, old_health, B.owner)
@@ -123,6 +119,9 @@ GLOBAL_LIST_INIT(digest_modes, list())
/datum/digest_mode/drain/shrink/process_mob(obj/belly/B, mob/living/L)
if(L.size_multiplier > B.shrink_grow_size)
L.resize(L.size_multiplier - 0.01) // Shrink by 1% per tick
+ if(L.size_multiplier <= B.shrink_grow_size) // Adds some feedback so the pred knows their prey has stopped shrinking.
+ to_chat(B.owner, span_vnotice("You feel [L] get as small as you would like within your [lowertext(B.name)]."))
+ B.owner.update_fullness()
. = ..()
/datum/digest_mode/grow
@@ -132,6 +131,9 @@ GLOBAL_LIST_INIT(digest_modes, list())
/datum/digest_mode/grow/process_mob(obj/belly/B, mob/living/L)
if(L.size_multiplier < B.shrink_grow_size)
L.resize(L.size_multiplier + 0.01) // Shrink by 1% per tick
+ if(L.size_multiplier >= B.shrink_grow_size) // Adds some feedback so the pred knows their prey has stopped growing.
+ to_chat(B.owner, span_vnotice("You feel [L] get as big as you would like within your [lowertext(B.name)]."))
+ B.owner.update_fullness()
/datum/digest_mode/drain/sizesteal
id = DM_SIZE_STEAL
@@ -139,7 +141,12 @@ GLOBAL_LIST_INIT(digest_modes, list())
/datum/digest_mode/drain/sizesteal/process_mob(obj/belly/B, mob/living/L)
if(L.size_multiplier > B.shrink_grow_size && B.owner.size_multiplier < 2) //Grow until either pred is large or prey is small.
B.owner.resize(B.owner.size_multiplier + 0.01) //Grow by 1% per tick.
+ if(B.owner.size_multiplier >= 2) // Adds some feedback so the pred knows they can't grow anymore.
+ to_chat(B.owner, span_notice("You feel you have grown as much as you can."))
L.resize(L.size_multiplier - 0.01) //Shrink by 1% per tick
+ if(L.size_multiplier <= B.shrink_grow_size) // Adds some feedback so the pred knows their prey has stopped shrinking.
+ to_chat(B.owner, span_notice("You feel [L] get as small as you would like within your [lowertext(B.name)]."))
+ B.owner.update_fullness()
. = ..()
/datum/digest_mode/heal
@@ -157,11 +164,15 @@ GLOBAL_LIST_INIT(digest_modes, list())
if(O.brute_dam > 0 || O.burn_dam > 0) //Making sure healing continues until fixed.
O.heal_damage(0.5, 0.5, 0, 1) // Less effective healing as able to fix broken limbs
B.owner.adjust_nutrition(-5) // More costly for the pred, since metals and stuff
+ if(B.health_impacts_size)
+ B.owner.update_fullness()
if(L.health < L.maxHealth)
L.adjustToxLoss(-2)
L.adjustOxyLoss(-2)
L.adjustCloneLoss(-1)
B.owner.adjust_nutrition(-1) // Normal cost per old functionality
+ if(B.health_impacts_size)
+ B.owner.update_fullness()
if(B.owner.nutrition > 90 && (L.health < L.maxHealth) && !H.isSynthetic())
L.adjustBruteLoss(-2.5)
L.adjustFireLoss(-2.5)
@@ -169,6 +180,8 @@ GLOBAL_LIST_INIT(digest_modes, list())
L.adjustOxyLoss(-5)
L.adjustCloneLoss(-1.25)
B.owner.adjust_nutrition(-2)
+ if(B.health_impacts_size)
+ B.owner.update_fullness()
if(L.nutrition <= 400)
L.adjust_nutrition(1)
else if(B.owner.nutrition > 90 && (L.nutrition <= 400))
diff --git a/code/modules/vore/eating/exportpanel_vr.dm b/code/modules/vore/eating/exportpanel_vr.dm
index 03df144bcc9..718e3c9e057 100644
--- a/code/modules/vore/eating/exportpanel_vr.dm
+++ b/code/modules/vore/eating/exportpanel_vr.dm
@@ -154,6 +154,24 @@
for(var/msg in B.secondary_transfer_messages_prey)
belly_data["secondary_transfer_messages_prey"] += msg
+ /* Not yet implemented on virgo
+ belly_data["primary_autotransfer_messages_owner"] = list()
+ for(var/msg in B.primary_autotransfer_messages_owner)
+ belly_data["primary_autotransfer_messages_owner"] += msg
+
+ belly_data["primary_autotransfer_messages_prey"] = list()
+ for(var/msg in B.primary_autotransfer_messages_prey)
+ belly_data["primary_autotransfer_messages_prey"] += msg
+
+ belly_data["secondary_autotransfer_messages_owner"] = list()
+ for(var/msg in B.secondary_autotransfer_messages_owner)
+ belly_data["secondary_autotransfer_messages_owner"] += msg
+
+ belly_data["secondary_autotransfer_messages_prey"] = list()
+ for(var/msg in B.secondary_autotransfer_messages_prey)
+ belly_data["secondary_autotransfer_messages_prey"] += msg
+ */
+
belly_data["digest_chance_messages_owner"] = list()
for(var/msg in B.digest_chance_messages_owner)
belly_data["digest_chance_messages_owner"] += msg
@@ -262,6 +280,7 @@
belly_data["digest_clone"] = B.digest_clone
belly_data["can_taste"] = B.can_taste
+ // belly_data["is_feedable"] = B.is_feedable // Not yet implemented on virgo
belly_data["contaminates"] = B.contaminates
belly_data["contamination_flavor"] = B.contamination_flavor
belly_data["contamination_color"] = B.contamination_color
@@ -272,8 +291,25 @@
belly_data["emote_active"] = B.emote_active
belly_data["emote_time"] = B.emote_time
belly_data["shrink_grow_size"] = B.shrink_grow_size
+ /* Not yet implemented on virgo
+ belly_data["vorespawn_blacklist"] = B.vorespawn_blacklist
+ belly_data["vorespawn_whitelist"] = B.vorespawn_whitelist
+ belly_data["vorespawn_absorbed"] = B.vorespawn_absorbed
+ */
belly_data["egg_type"] = B.egg_type
+ /* Not yet implemented on virgo
+ belly_data["egg_name"] = B.egg_name
+ belly_data["egg_size"] = B.egg_size
+ */
belly_data["selective_preference"] = B.selective_preference
+ /* Not yet implemented on virgo
+ belly_data["recycling"] = B.recycling
+ belly_data["storing_nutrition"] = B.storing_nutrition
+ belly_data["entrance_logs"] = B.entrance_logs
+ belly_data["item_digest_logs"] = B.item_digest_logs
+ belly_data["eating_privacy_local"] = B.eating_privacy_local
+ belly_data["private_struggle"] = B.private_struggle
+ */
// Sounds
belly_data["is_wet"] = B.is_wet
@@ -281,16 +317,58 @@
belly_data["fancy_vore"] = B.fancy_vore
belly_data["vore_sound"] = B.vore_sound
belly_data["release_sound"] = B.release_sound
+ /* Not yet implemented on virgo
+ belly_data["sound_volume"] = B.sound_volume
+ belly_data["noise_freq"] = B.noise_freq
+ */
+
+ // Visuals
+ belly_data["affects_vore_sprites"] = B.affects_vore_sprites
+ var/list/sprite_flags = list()
+ for(var/flag_name in B.vore_sprite_flag_list)
+ if(B.vore_sprite_flags & B.vore_sprite_flag_list[flag_name])
+ sprite_flags.Add(flag_name)
+ belly_data["vore_sprite_flags"] = sprite_flags
+ belly_data["count_absorbed_prey_for_sprite"] = B.count_absorbed_prey_for_sprite
+ belly_data["absorbed_multiplier"] = B.absorbed_multiplier
+ // belly_data["count_liquid_for_sprite"] = B.count_liquid_for_sprite // Not yet implemented on virgo
+ // belly_data["liquid_multiplier"] = B.liquid_multiplier // Not yet implemented on virgo
+ belly_data["count_items_for_sprite"] = B.count_items_for_sprite
+ belly_data["item_multiplier"] = B.item_multiplier
+ belly_data["health_impacts_size"] = B.health_impacts_size
+ belly_data["resist_triggers_animation"] = B.resist_triggers_animation
+ belly_data["size_factor_for_sprite"] = B.size_factor_for_sprite
+ belly_data["belly_sprite_to_affect"] = B.belly_sprite_to_affect
+ belly_data["undergarment_chosen"] = B.undergarment_chosen
+ belly_data["undergarment_if_none"] = B.undergarment_if_none
+ belly_data["undergarment_color"] = B.undergarment_color
+ //belly_data["tail_to_change_to"] = B.tail_to_change_to
+ //belly_data["tail_colouration"] = B.tail_colouration
+ //belly_data["tail_extra_overlay"] = B.tail_extra_overlay
+ //belly_data["tail_extra_overlay2"] = B.tail_extra_overlay2
+
+ // Visuals (Belly Fullscreens Preview and Coloring)
+ /* Not yet implemented on virgo
+ belly_data["belly_fullscreen_color"] = B.belly_fullscreen_color
+ belly_data["belly_fullscreen_color2"] = B.belly_fullscreen_color2
+ belly_data["belly_fullscreen_color3"] = B.belly_fullscreen_color3
+ belly_data["belly_fullscreen_color4"] = B.belly_fullscreen_color4
+ belly_data["belly_fullscreen_alpha"] = B.belly_fullscreen_alpha
+ belly_data["colorization_enabled"] = B.colorization_enabled
+ */
// Visuals (Vore FX)
belly_data["disable_hud"] = B.disable_hud
+ // belly_data["belly_fullscreen"] = B.belly_fullscreen // Not yet implemented on virgo
// Interactions
belly_data["escapable"] = B.escapable
belly_data["escapechance"] = B.escapechance
belly_data["escapechance_absorbed"] = B.escapechance_absorbed
- belly_data["escapetime"] = B.escapetime
+ belly_data["escapetime"] = B.escapetime/10
+
+ // belly_data["belchchance"] = B.belchchance // Not yet implemented on virgo
belly_data["transferchance"] = B.transferchance
belly_data["transferlocation"] = B.transferlocation
@@ -301,6 +379,122 @@
belly_data["absorbchance"] = B.absorbchance
belly_data["digestchance"] = B.digestchance
+ // Interactions (Auto-Transfer)
+ /* Not yet implemented on virgo
+ belly_data["autotransferchance"] = B.autotransferchance
+ belly_data["autotransferwait"] = B.autotransferwait/10
+ belly_data["autotransferlocation"] = B.autotransferlocation
+ belly_data["autotransferextralocation"] = B.autotransferextralocation
+ belly_data["autotransfer_enabled"] = B.autotransfer_enabled
+ belly_data["autotransferchance_secondary"] = B.autotransferchance_secondary
+ belly_data["autotransferlocation_secondary"] = B.autotransferlocation_secondary
+ belly_data["autotransferextralocation_secondary"] = B.autotransferextralocation_secondary
+ belly_data["autotransfer_min_amount"] = B.autotransfer_min_amount
+ belly_data["autotransfer_max_amount"] = B.autotransfer_max_amount
+ var/list/at_whitelist = list()
+ for(var/flag_name in B.autotransfer_flags_list)
+ if(B.autotransfer_whitelist & B.autotransfer_flags_list[flag_name])
+ at_whitelist.Add(flag_name)
+ belly_data["autotransfer_whitelist"] = at_whitelist
+ var/list/at_blacklist = list()
+ for(var/flag_name in B.autotransfer_flags_list)
+ if(B.autotransfer_blacklist & B.autotransfer_flags_list[flag_name])
+ at_blacklist.Add(flag_name)
+ belly_data["autotransfer_blacklist"] = at_blacklist
+ var/list/at_whitelist_items = list()
+ for(var/flag_name in B.autotransfer_flags_list_items)
+ if(B.autotransfer_whitelist_items & B.autotransfer_flags_list_items[flag_name])
+ at_whitelist_items.Add(flag_name)
+ belly_data["autotransfer_whitelist_items"] = at_whitelist_items
+ var/list/at_blacklist_items = list()
+ for(var/flag_name in B.autotransfer_flags_list_items)
+ if(B.autotransfer_blacklist_items & B.autotransfer_flags_list_items[flag_name])
+ at_blacklist_items.Add(flag_name)
+ belly_data["autotransfer_blacklist_items"] = at_blacklist_items
+ var/list/at_secondary_whitelist = list()
+ for(var/flag_name in B.autotransfer_flags_list)
+ if(B.autotransfer_secondary_whitelist & B.autotransfer_flags_list[flag_name])
+ at_secondary_whitelist.Add(flag_name)
+ belly_data["autotransfer_secondary_whitelist"] = at_secondary_whitelist
+ var/list/at_secondary_blacklist = list()
+ for(var/flag_name in B.autotransfer_flags_list)
+ if(B.autotransfer_secondary_blacklist & B.autotransfer_flags_list[flag_name])
+ at_secondary_blacklist.Add(flag_name)
+ belly_data["autotransfer_secondary_blacklist"] = at_secondary_blacklist
+ var/list/at_secondary_whitelist_items = list()
+ for(var/flag_name in B.autotransfer_flags_list_items)
+ if(B.autotransfer_secondary_whitelist_items & B.autotransfer_flags_list_items[flag_name])
+ at_secondary_whitelist_items.Add(flag_name)
+ belly_data["autotransfer_secondary_whitelist_items"] = at_secondary_whitelist_items
+ var/list/at_secondary_blacklist_items = list()
+ for(var/flag_name in B.autotransfer_flags_list_items)
+ if(B.autotransfer_secondary_blacklist_items & B.autotransfer_flags_list_items[flag_name])
+ at_secondary_blacklist_items.Add(flag_name)
+ belly_data["autotransfer_secondary_blacklist_items"] = at_secondary_blacklist_items
+
+ // Liquid Options
+ belly_data["show_liquids"] = B.show_liquids
+ belly_data["reagentbellymode"] = B.reagentbellymode
+ belly_data["reagent_chosen"] = B.reagent_chosen
+ belly_data["reagent_name"] = B.reagent_name
+ belly_data["reagent_transfer_verb"] = B.reagent_transfer_verb
+ belly_data["gen_time_display"] = B.gen_time_display
+ belly_data["custom_max_volume"] = B.custom_max_volume
+ belly_data["vorefootsteps_sounds"] = B.vorefootsteps_sounds
+ belly_data["liquid_overlay"] = B.liquid_overlay
+ belly_data["max_liquid_level"] = B.max_liquid_level
+ belly_data["reagent_toches"] = B.reagent_touches
+ belly_data["mush_overlay"] = B.mush_overlay
+ belly_data["mush_color"] = B.mush_color
+ belly_data["mush_alpha"] = B.mush_alpha
+ belly_data["max_mush"] = B.max_mush
+ belly_data["min_mush"] = B.min_mush
+ belly_data["item_mush_val"] = B.item_mush_val
+ belly_data["custom_reagentcolor"] = B.custom_reagentcolor
+ belly_data["custom_reagentalpha"] = B.custom_reagentalpha
+ belly_data["metabolism_overlay"] = B.metabolism_overlay
+ belly_data["metabolism_mush_ratio"] = B.metabolism_mush_ratio
+ belly_data["max_ingested"] = B.max_ingested
+ belly_data["custom_ingested_color"] = B.custom_ingested_color
+ belly_data["custom_ingested_alpha"] = B.custom_ingested_alpha
+
+ var/list/reagent_flags = list()
+ for(var/flag_name in B.reagent_mode_flag_list)
+ if(B.reagent_mode_flags & B.reagent_mode_flag_list[flag_name])
+ reagent_flags.Add(flag_name)
+ belly_data["reagent_mode_flag_list"] = reagent_flags
+ */
+
data["bellies"] += list(belly_data)
+ // Liquid Messages
+ /* Not yet implemented on virgo
+ belly_data["show_fullness_messages"] = B.show_fullness_messages
+ belly_data["liquid_fullness1_messages"] = B.liquid_fullness1_messages
+ belly_data["liquid_fullness2_messages"] = B.liquid_fullness2_messages
+ belly_data["liquid_fullness3_messages"] = B.liquid_fullness3_messages
+ belly_data["liquid_fullness4_messages"] = B.liquid_fullness4_messages
+ belly_data["liquid_fullness5_messages"] = B.liquid_fullness5_messages
+
+ belly_data["fullness1_messages"] = list()
+ for(var/msg in B.fullness1_messages)
+ belly_data["fullness1_messages"] += msg
+
+ belly_data["fullness2_messages"] = list()
+ for(var/msg in B.fullness2_messages)
+ belly_data["fullness2_messages"] += msg
+
+ belly_data["fullness3_messages"] = list()
+ for(var/msg in B.fullness3_messages)
+ belly_data["fullness3_messages"] += msg
+
+ belly_data["fullness4_messages"] = list()
+ for(var/msg in B.fullness4_messages)
+ belly_data["fullness4_messages"] += msg
+
+ belly_data["fullness5_messages"] = list()
+ for(var/msg in B.fullness5_messages)
+ belly_data["fullness5_messages"] += msg
+ */
+
return data
diff --git a/code/modules/vore/eating/living_bellies.dm b/code/modules/vore/eating/living_bellies.dm
new file mode 100644
index 00000000000..e21936da7cb
--- /dev/null
+++ b/code/modules/vore/eating/living_bellies.dm
@@ -0,0 +1,36 @@
+/mob/proc/update_fullness(var/returning = FALSE)
+ if(!returning)
+ if(updating_fullness)
+ return
+ updating_fullness = TRUE
+ spawn(2)
+ updating_fullness = FALSE
+ src.update_fullness(TRUE)
+ return
+ var/list/new_fullness = list()
+ vore_fullness = 0
+ for(var/belly_class in vore_icon_bellies)
+ new_fullness[belly_class] = 0
+ for(var/obj/belly/B as anything in vore_organs)
+ if(DM_FLAG_VORESPRITE_BELLY & B.vore_sprite_flags)
+ new_fullness[B.belly_sprite_to_affect] += B.GetFullnessFromBelly()
+ if(istype(src, /mob/living/carbon/human) && DM_FLAG_VORESPRITE_ARTICLE & B.vore_sprite_flags)
+ if(!new_fullness[B.undergarment_chosen])
+ new_fullness[B.undergarment_chosen] = 1
+ new_fullness[B.undergarment_chosen] += B.GetFullnessFromBelly()
+ new_fullness[B.undergarment_chosen + "-ifnone"] = B.undergarment_if_none
+ new_fullness[B.undergarment_chosen + "-color"] = B.undergarment_color
+ for(var/belly_class in vore_icon_bellies)
+ new_fullness[belly_class] /= size_multiplier //Divided by pred's size so a macro mob won't get macro belly from a regular prey.
+ new_fullness[belly_class] *= belly_size_multiplier // Some mobs are small even at 100% size. Let's account for that.
+ new_fullness[belly_class] = round(new_fullness[belly_class], 1) // Because intervals of 0.25 are going to make sprite artists cry.
+ vore_fullness_ex[belly_class] = min(vore_capacity_ex[belly_class], new_fullness[belly_class])
+ vore_fullness += new_fullness[belly_class]
+ if(vore_fullness < 0)
+ vore_fullness = 0
+ vore_fullness = min(vore_capacity, vore_fullness)
+ updating_fullness = FALSE
+ return new_fullness
+
+/mob/living/proc/vs_animate(var/belly_to_animate)
+ return
diff --git a/code/modules/vore/eating/living_vr.dm b/code/modules/vore/eating/living_vr.dm
index f83c477e901..208cd04e4f8 100644
--- a/code/modules/vore/eating/living_vr.dm
+++ b/code/modules/vore/eating/living_vr.dm
@@ -319,12 +319,9 @@
nutrition_messages = P.nutrition_messages
weight_message_visible = P.weight_message_visible
weight_messages = P.weight_messages
+ vore_sprite_color = P.vore_sprite_color
allow_mind_transfer = P.allow_mind_transfer
-
- if (istype(src, /mob/living/carbon/human))
- src:vore_sprite_color = P.vore_sprite_color
-
if(bellies)
if(isliving(src))
var/mob/living/L = src
diff --git a/code/modules/vore/eating/mob_vr.dm b/code/modules/vore/eating/mob_vr.dm
index 5a3d89cd30f..0594c4d8e75 100644
--- a/code/modules/vore/eating/mob_vr.dm
+++ b/code/modules/vore/eating/mob_vr.dm
@@ -53,3 +53,18 @@
"They have a very fat frame with a bulging potbelly, squishy rolls of pudge, very wide hips, and plump set of jiggling thighs.",
"They are incredibly obese. Their massive potbelly sags over their waistline while their fat ass would probably require two chairs to sit down comfortably!",
"They are so morbidly obese, you wonder how they can even stand, let alone waddle around the station. They can't get any fatter without being immobilized.")
+
+ var/vore_capacity = 0 // Maximum capacity, -1 for unlimited
+ var/vore_capacity_ex = list("stomach" = 0) //expanded list of capacities
+ var/vore_fullness = 0 // How "full" the belly is (controls icons)
+ var/list/vore_fullness_ex = list("stomach" = 0) // Expanded list of fullness
+ var/belly_size_multiplier = 1
+ var/vore_sprite_multiply = list("stomach" = FALSE, "taur belly" = FALSE)
+ var/vore_sprite_color = list("stomach" = "#000", "taur belly" = "#000")
+
+ var/list/vore_icon_bellies = list("stomach")
+ var/updating_fullness = FALSE
+ var/obj/belly/previewing_belly
+
+ var/vore_icons = 0 // Bitfield for which fields we have vore icons for.
+ var/vore_eyes = FALSE // For mobs with fullness specific eye overlays.
diff --git a/code/modules/vore/eating/simple_animal_vr.dm b/code/modules/vore/eating/simple_animal_vr.dm
index b6eb8840b33..a75aa55f282 100644
--- a/code/modules/vore/eating/simple_animal_vr.dm
+++ b/code/modules/vore/eating/simple_animal_vr.dm
@@ -3,6 +3,12 @@
var/swallowTime = (3 SECONDS) //How long it takes to eat its prey in 1/10 of a second. The default is 3 seconds.
var/list/prey_excludes = null //For excluding people from being eaten.
+/mob/living/simple_mob/insidePanel() //On-demand belly loading.
+ if(vore_active && !voremob_loaded)
+ voremob_loaded = TRUE
+ init_vore()
+ ..()
+
//
// Simple nom proc for if you get ckey'd into a simple_mob mob! Avoids grabs.
//
@@ -11,6 +17,10 @@
set category = "Abilities.Vore" // Moving this to abilities from IC as it's more fitting there
set desc = "Since you can't grab, you get a verb!"
+ if(vore_active && !voremob_loaded) // On-demand belly loading.
+ voremob_loaded = TRUE
+ init_vore()
+
if(stat != CONSCIOUS)
return
// Verbs are horrifying. They don't call overrides. So we're stuck with this.
@@ -23,6 +33,13 @@
feed_grabbed_to_self(src,T)
update_icon()
+/mob/living/simple_mob/perform_the_nom(mob/living/user, mob/living/prey, mob/living/pred, obj/belly/belly, delay)
+ if(vore_active && !voremob_loaded && pred == src) //Only init your own bellies.
+ voremob_loaded = TRUE
+ init_vore()
+ belly = vore_selected
+ return ..()
+
//
// Simple proc for animals to have their digestion toggled on/off externally
// Added as a verb in /mob/living/simple_mob/init_vore() if vore is enabled for this mob.
diff --git a/code/modules/vore/eating/vore_vr.dm b/code/modules/vore/eating/vore_vr.dm
index 492389b2678..0eda2da683c 100644
--- a/code/modules/vore/eating/vore_vr.dm
+++ b/code/modules/vore/eating/vore_vr.dm
@@ -71,6 +71,7 @@ V::::::V V::::::VO:::::::OOO:::::::ORR:::::R R:::::REE::::::EEEEEE
var/pickup_pref = TRUE
var/vore_sprite_color = list("stomach" = "#000", "taur belly" = "#000")
+ var/vore_sprite_multiply = list("stomach" = FALSE, "taur belly" = FALSE)
var/allow_mind_transfer = FALSE
var/list/belly_prefs = list()
@@ -122,6 +123,11 @@ V::::::V V::::::VO:::::::OOO:::::::ORR:::::R R:::::REE::::::EEEEEE
//
/proc/is_vore_predator(mob/living/O)
if(istype(O,/mob/living))
+ if(istype(O,/mob/living/simple_mob)) //On-demand belly loading.
+ var/mob/living/simple_mob/SM = O
+ if(SM.vore_active && !SM.voremob_loaded)
+ SM.voremob_loaded = TRUE
+ SM.init_vore()
if(O.vore_organs.len > 0)
return TRUE
diff --git a/code/modules/vore/eating/vorepanel_vr.dm b/code/modules/vore/eating/vorepanel_vr.dm
index b690ab20f29..c73ef041637 100644
--- a/code/modules/vore/eating/vorepanel_vr.dm
+++ b/code/modules/vore/eating/vorepanel_vr.dm
@@ -249,12 +249,15 @@ var/global/list/belly_colorable_only_fullscreens = list("a_synth_flesh_mono",
"resist_animation" = selected.resist_triggers_animation,
"voresprite_size_factor" = selected.size_factor_for_sprite,
"belly_sprite_to_affect" = selected.belly_sprite_to_affect,
- "belly_sprite_option_shown" = istype(host, /mob/living/carbon/human) ? (LAZYLEN(host:vore_icon_bellies) >= 1 ? TRUE : FALSE) : FALSE, // TODO: FIX THIS (It won't be fixed)
+ "belly_sprite_option_shown" = LAZYLEN(host.vore_icon_bellies) >= 1 ? TRUE : FALSE,
"tail_option_shown" = istype(host, /mob/living/carbon/human),
"tail_to_change_to" = selected.tail_to_change_to,
"tail_colouration" = selected.tail_colouration,
"tail_extra_overlay" = selected.tail_extra_overlay,
- "tail_extra_overlay2" = selected.tail_extra_overlay2
+ "tail_extra_overlay2" = selected.tail_extra_overlay2,
+ "undergarment_chosen" = selected.undergarment_chosen,
+ "undergarment_if_none" = selected.undergarment_if_none || "None",
+ "undergarment_color" = selected.undergarment_color
)
var/list/addons = list()
@@ -671,19 +674,19 @@ var/global/list/belly_colorable_only_fullscreens = list("a_synth_flesh_mono",
unsaved_changes = TRUE
return TRUE
if("set_vs_color")
- if (istype(host, /mob/living/carbon/human))
- var/mob/living/carbon/human/hhost = host
- var/belly_choice = tgui_input_list(ui.user, "Which vore sprite are you going to edit the color of?", "Vore Sprite Color", hhost.vore_icon_bellies)
- var/newcolor = input(ui.user, "Choose a color.", "", hhost.vore_sprite_color[belly_choice]) as color|null
+ var/belly_choice = tgui_input_list(ui.user, "Which vore sprite are you going to edit the color of?", "Vore Sprite Color", host.vore_icon_bellies)
+ if(belly_choice)
+ var/newcolor = input(ui.user, "Choose a color.", "", host.vore_sprite_color[belly_choice]) as color|null
if(newcolor)
- hhost.vore_sprite_color[belly_choice] = newcolor
- var/multiply = tgui_input_list(ui.user, "Set the color to be applied multiplicatively or additively? Currently in [hhost.vore_sprite_multiply[belly_choice] ? "Multiply" : "Add"]", "Vore Sprite Color", list("Multiply", "Add"))
+ host.vore_sprite_color[belly_choice] = newcolor
+ var/multiply = tgui_input_list(ui.user, "Set the color to be applied multiplicatively or additively? Currently in [host.vore_sprite_multiply[belly_choice] ? "Multiply" : "Add"]", "Vore Sprite Color", list("Multiply", "Add"))
if(multiply == "Multiply")
- hhost.vore_sprite_multiply[belly_choice] = TRUE
+ host.vore_sprite_multiply[belly_choice] = TRUE
else if(multiply == "Add")
- hhost.vore_sprite_multiply[belly_choice] = FALSE
- hhost.update_icons_body()
- return TRUE
+ host.vore_sprite_multiply[belly_choice] = FALSE
+ host.update_icons_body()
+ unsaved_changes = TRUE
+ return TRUE
/datum/vore_look/proc/pick_from_inside(mob/user, params)
var/atom/movable/target = locate(params["pick"])
@@ -1453,7 +1456,9 @@ var/global/list/belly_colorable_only_fullscreens = list("a_synth_flesh_mono",
list("Sleeper", "Vorebelly", "Both"))
if(belly_choice == null)
return FALSE
- host.vore_selected.silicon_belly_overlay_preference = belly_choice
+ for (var/belly in host.vore_organs)
+ var/obj/belly/B = belly
+ B.silicon_belly_overlay_preference = belly_choice
host.update_icon()
. = TRUE
if("b_belly_mob_mult")
@@ -1759,97 +1764,125 @@ var/global/list/belly_colorable_only_fullscreens = list("a_synth_flesh_mono",
host.vore_selected = host.vore_organs[1]
. = TRUE
if("b_belly_sprite_to_affect")
- if (istype(host, /mob/living/carbon/human))
- var/mob/living/carbon/human/hhost = host
- var/belly_choice = tgui_input_list(user, "Which belly sprite do you want your [lowertext(hhost.vore_selected.name)] to affect?","Select Region", hhost.vore_icon_bellies)
- if(!belly_choice) //They cancelled, no changes
- return FALSE
+ var/belly_choice = tgui_input_list(user, "Which belly sprite do you want your [lowertext(host.vore_selected.name)] to affect?","Select Region", host.vore_icon_bellies)
+ if(!belly_choice) //They cancelled, no changes
+ return FALSE
+ else
+ host.vore_selected.belly_sprite_to_affect = belly_choice
+ if(isanimal(host))
+ host.update_icon()
else
- hhost.vore_selected.belly_sprite_to_affect = belly_choice
- hhost.update_fullness()
- . = TRUE
+ host.update_fullness()
+ . = TRUE
if("b_affects_vore_sprites")
- if (istype(host, /mob/living/carbon/human))
- var/mob/living/carbon/human/hhost = host
- hhost.vore_selected.affects_vore_sprites = !hhost.vore_selected.affects_vore_sprites
- hhost.update_fullness()
- . = TRUE
+ host.vore_selected.affects_vore_sprites = !host.vore_selected.affects_vore_sprites
+ if(isanimal(host))
+ host.update_icon()
+ else
+ host.update_fullness()
+ . = TRUE
if("b_count_absorbed_prey_for_sprites")
- if (istype(host, /mob/living/carbon/human))
- var/mob/living/carbon/human/hhost = host
- hhost.vore_selected.count_absorbed_prey_for_sprite = !hhost.vore_selected.count_absorbed_prey_for_sprite
- hhost.update_fullness()
- . = TRUE
+ host.vore_selected.count_absorbed_prey_for_sprite = !host.vore_selected.count_absorbed_prey_for_sprite
+ if(isanimal(host))
+ host.update_icon()
+ else
+ host.update_fullness()
+ . = TRUE
if("b_absorbed_multiplier")
- if (istype(host, /mob/living/carbon/human))
- var/mob/living/carbon/human/hhost = host
- var/absorbed_multiplier_input = input(user, "Set the impact absorbed prey's size have on your vore sprite. 1 means no scaling, 0.5 means absorbed prey count half as much, 2 means absorbed prey count double. (Range from 0.1 - 3)", "Absorbed Multiplier") as num|null
- if(!isnull(absorbed_multiplier_input))
- hhost.vore_selected.absorbed_multiplier = CLAMP(absorbed_multiplier_input, 0.1, 3)
- hhost.update_fullness()
- . = TRUE
- if("b_count_items_for_sprites")
- if (istype(host, /mob/living/carbon/human))
- var/mob/living/carbon/human/hhost = host
- hhost.vore_selected.count_items_for_sprite = !hhost.vore_selected.count_items_for_sprite
- hhost.update_fullness()
- . = TRUE
- if("b_item_multiplier")
- if (istype(host, /mob/living/carbon/human))
- var/mob/living/carbon/human/hhost = host
- var/item_multiplier_input = input(user, "Set the impact items will have on your vore sprite. 1 means a belly with 8 normal-sized items will count as 1 normal sized prey-thing's worth, 0.5 means items count half as much, 2 means items count double. (Range from 0.1 - 10)", "Item Multiplier") as num|null
- if(!isnull(item_multiplier_input))
- hhost.vore_selected.item_multiplier = CLAMP(item_multiplier_input, 0.1, 10)
- hhost.update_fullness()
- . = TRUE
- if("b_health_impacts_size")
- if (istype(host, /mob/living/carbon/human))
- var/mob/living/carbon/human/hhost = host
- hhost.vore_selected.health_impacts_size = !hhost.vore_selected.health_impacts_size
- hhost.update_fullness()
- . = TRUE
- if("b_resist_animation")
- if (istype(host, /mob/living/carbon/human))
- var/mob/living/carbon/human/hhost = host
- hhost.vore_selected.resist_triggers_animation = !hhost.vore_selected.resist_triggers_animation
- . = TRUE
- if("b_size_factor_sprites")
- if (istype(host, /mob/living/carbon/human))
- var/mob/living/carbon/human/hhost = host
- var/size_factor_input = input(user, "Set the impact all belly content's collective size has on your vore sprite. 1 means no scaling, 0.5 means content counts half as much, 2 means contents count double. (Range from 0.1 - 3)", "Size Factor") as num|null
- if(!isnull(size_factor_input))
- hhost.vore_selected.size_factor_for_sprite = CLAMP(size_factor_input, 0.1, 3)
- hhost.update_fullness()
- . = TRUE
- if("b_tail_to_change_to")
- if (istype(host, /mob/living/carbon/human))
- var/mob/living/carbon/human/hhost = host
- var/tail_choice = tgui_input_list(user, "Which tail sprite do you want to use when your [lowertext(host.vore_selected.name)] is filled?","Select Sprite", global.tail_styles_list)
- if(!tail_choice) //They cancelled, no changes
- return FALSE
+ var/absorbed_multiplier_input = input(user, "Set the impact absorbed prey's size have on your vore sprite. 1 means no scaling, 0.5 means absorbed prey count half as much, 2 means absorbed prey count double. (Range from 0.1 - 3)", "Absorbed Multiplier") as num|null
+ if(!isnull(absorbed_multiplier_input))
+ host.vore_selected.absorbed_multiplier = CLAMP(absorbed_multiplier_input, 0.1, 3)
+ if(isanimal(host))
+ host.update_icon()
else
- hhost.vore_selected.tail_to_change_to = tail_choice
- . = TRUE
+ host.update_fullness()
+ . = TRUE
+ if("b_count_items_for_sprites")
+ host.vore_selected.count_items_for_sprite = !host.vore_selected.count_items_for_sprite
+ if(isanimal(host))
+ host.update_icon()
+ else
+ host.update_fullness()
+ . = TRUE
+ if("b_item_multiplier")
+ var/item_multiplier_input = input(user, "Set the impact items will have on your vore sprite. 1 means a belly with 8 normal-sized items will count as 1 normal sized prey-thing's worth, 0.5 means items count half as much, 2 means items count double. (Range from 0.1 - 10)", "Item Multiplier") as num|null
+ if(!isnull(item_multiplier_input))
+ host.vore_selected.item_multiplier = CLAMP(item_multiplier_input, 0.1, 10)
+ if(isanimal(host))
+ host.update_icon()
+ else
+ host.update_fullness()
+ . = TRUE
+ if("b_health_impacts_size")
+ host.vore_selected.health_impacts_size = !host.vore_selected.health_impacts_size
+ if(isanimal(host))
+ host.update_icon()
+ else
+ host.update_fullness()
+ . = TRUE
+ if("b_resist_animation")
+ host.vore_selected.resist_triggers_animation = !host.vore_selected.resist_triggers_animation
+ . = TRUE
+ if("b_size_factor_sprites")
+ var/size_factor_input = input(user, "Set the impact all belly content's collective size has on your vore sprite. 1 means no scaling, 0.5 means content counts half as much, 2 means contents count double. (Range from 0.1 - 3)", "Size Factor") as num|null
+ if(!isnull(size_factor_input))
+ host.vore_selected.size_factor_for_sprite = CLAMP(size_factor_input, 0.1, 3)
+ if(isanimal(host))
+ host.update_icon()
+ else
+ host.update_fullness()
+ . = TRUE
+ if("b_vore_sprite_flags")
+ var/list/menu_list = host.vore_selected.vore_sprite_flag_list.Copy()
+ var/toggle_vs_flag = tgui_input_list(user, "Toggle Vore Sprite Modes", "Mode Choice", menu_list)
+ if(!toggle_vs_flag)
+ return FALSE
+ host.vore_selected.vore_sprite_flags ^= host.vore_selected.vore_sprite_flag_list[toggle_vs_flag]
+ . = TRUE
+ if("b_undergarment_choice")
+ var/datum/category_group/underwear/undergarment_choice = tgui_input_list(user, "Which undergarment do you want to enable when your [lowertext(host.vore_selected.name)] is filled?","Select Undergarment Class", global_underwear.categories)
+ if(!undergarment_choice) //They cancelled, no changes
+ return FALSE
+ else
+ host.vore_selected.undergarment_chosen = undergarment_choice.name
+ host.update_fullness()
+ . = TRUE
+ if("b_undergarment_if_none")
+ var/datum/category_group/underwear/UWC = global_underwear.categories_by_name[host.vore_selected.undergarment_chosen]
+ var/datum/category_item/underwear/selected_underwear = tgui_input_list(user, "If no undergarment is equipped, which undergarment style do you want to use?","Select Underwear Style",UWC.items,host.vore_selected.undergarment_if_none)
+ if(!selected_underwear) //They cancelled, no changes
+ return FALSE
+ else
+ host.vore_selected.undergarment_if_none = selected_underwear
+ host.update_fullness()
+ host.updateVRPanel()
+ if("b_undergarment_color")
+ var/newcolor = input(user, "Choose a color.", "", host.vore_selected.undergarment_color) as color|null
+ if(newcolor)
+ host.vore_selected.undergarment_color = newcolor
+ host.update_fullness()
+ . = TRUE
+ if("b_tail_to_change_to")
+ var/tail_choice = tgui_input_list(user, "Which tail sprite do you want to use when your [lowertext(host.vore_selected.name)] is filled?","Select Sprite", global.tail_styles_list)
+ if(!tail_choice) //They cancelled, no changes
+ return FALSE
+ else
+ host.vore_selected.tail_to_change_to = tail_choice
+ . = TRUE
if("b_tail_color")
- if (istype(host, /mob/living/carbon/human))
- var/mob/living/carbon/human/hhost = host
- var/newcolor = input(user, "Choose tail color.", "", hhost.vore_selected.tail_colouration) as color|null
- if(newcolor)
- hhost.vore_selected.tail_colouration = newcolor
- . = TRUE
+ var/newcolor = input(user, "Choose tail color.", "", host.vore_selected.tail_colouration) as color|null
+ if(newcolor)
+ host.vore_selected.tail_colouration = newcolor
+ . = TRUE
if("b_tail_color2")
- if (istype(host, /mob/living/carbon/human))
- var/mob/living/carbon/human/hhost = host
- var/newcolor = input(user, "Choose tail secondary color.", "", hhost.vore_selected.tail_extra_overlay) as color|null
- if(newcolor)
- hhost.vore_selected.tail_extra_overlay = newcolor
- . = TRUE
+ var/newcolor = input(user, "Choose tail secondary color.", "", host.vore_selected.tail_extra_overlay) as color|null
+ if(newcolor)
+ host.vore_selected.tail_extra_overlay = newcolor
+ . = TRUE
if("b_tail_color3")
- if (istype(host, /mob/living/carbon/human))
- var/mob/living/carbon/human/hhost = host
- var/newcolor = input(user, "Choose tail tertiary color.", "", hhost.vore_selected.tail_extra_overlay2) as color|null
- if(newcolor)
- hhost.vore_selected.tail_extra_overlay2 = newcolor
- . = TRUE
+ var/newcolor = input(user, "Choose tail tertiary color.", "", host.vore_selected.tail_extra_overlay2) as color|null
+ if(newcolor)
+ host.vore_selected.tail_extra_overlay2 = newcolor
+ . = TRUE
if(.)
unsaved_changes = TRUE
diff --git a/tgui/packages/tgui/interfaces/VorePanel/VoreSelectedBellyTabs/VoreSelectedBellyVisuals.tsx b/tgui/packages/tgui/interfaces/VorePanel/VoreSelectedBellyTabs/VoreSelectedBellyVisuals.tsx
index c0afa7fd392..d9af4b0ade9 100644
--- a/tgui/packages/tgui/interfaces/VorePanel/VoreSelectedBellyTabs/VoreSelectedBellyVisuals.tsx
+++ b/tgui/packages/tgui/interfaces/VorePanel/VoreSelectedBellyTabs/VoreSelectedBellyVisuals.tsx
@@ -163,7 +163,11 @@ export const VoreSelectedBellyVisuals = (props: { belly: selectedData }) => {
) : (
- ''
+
+
+ You do not have any bellysprites.
+
+
)}
{tail_option_shown &&
vore_sprite_flags.includes('Undergarment addition') ? (
diff --git a/tgui/packages/tgui/interfaces/VorePanel/VoreSelectedBellyTabs/VoreSelectedMobTypeBellyButtons.tsx b/tgui/packages/tgui/interfaces/VorePanel/VoreSelectedBellyTabs/VoreSelectedMobTypeBellyButtons.tsx
index 15bf0c2b0f1..894e3b4b469 100644
--- a/tgui/packages/tgui/interfaces/VorePanel/VoreSelectedBellyTabs/VoreSelectedMobTypeBellyButtons.tsx
+++ b/tgui/packages/tgui/interfaces/VorePanel/VoreSelectedBellyTabs/VoreSelectedMobTypeBellyButtons.tsx
@@ -1,7 +1,7 @@
import { capitalize } from 'common/string';
+import { useBackend } from 'tgui/backend';
+import { Button, LabeledList, Section } from 'tgui/components';
-import { useBackend } from '../../../backend';
-import { Button, LabeledList, Section } from '../../../components';
import { hostMob, selectedData } from '../types';
export const VoreSelectedMobTypeBellyButtons = (props: {
@@ -9,62 +9,43 @@ export const VoreSelectedMobTypeBellyButtons = (props: {
host_mobtype: hostMob;
}) => {
const { act } = useBackend();
-
const { belly, host_mobtype } = props;
const {
silicon_belly_overlay_preference,
- belly_mob_mult,
- belly_item_mult,
- belly_overall_mult,
+ belly_sprite_option_shown,
+ belly_sprite_to_affect,
} = belly;
const { is_cyborg, is_vore_simple_mob } = host_mobtype;
if (is_cyborg) {
- return (
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- );
+ if (belly_sprite_option_shown && belly_sprite_to_affect === 'sleeper') {
+ return (
+
+
+
+
+
+
+
+ );
+ } else {
+ return (
+
+
+ Your module does either not support vore sprites or you've
+ selected a belly sprite other than the sleeper within the Visuals
+ section.
+
+
+ );
+ }
} else if (is_vore_simple_mob) {
return (
// For now, we're only returning empty. TODO: Simple mob belly controls
diff --git a/vorestation.dme b/vorestation.dme
index b3f0b69b81f..eef86bef72e 100644
--- a/vorestation.dme
+++ b/vorestation.dme
@@ -3038,6 +3038,7 @@
#include "code\modules\mob\living\carbon\human\gradient.dm"
#include "code\modules\mob\living\carbon\human\human.dm"
#include "code\modules\mob\living\carbon\human\human_attackhand.dm"
+#include "code\modules\mob\living\carbon\human\human_bellies.dm"
#include "code\modules\mob\living\carbon\human\human_damage.dm"
#include "code\modules\mob\living\carbon\human\human_defense.dm"
#include "code\modules\mob\living\carbon\human\human_defines.dm"
@@ -3182,6 +3183,7 @@
#include "code\modules\mob\living\silicon\robot\photos.dm"
#include "code\modules\mob\living\silicon\robot\robot.dm"
#include "code\modules\mob\living\silicon\robot\robot_animation_vr.dm"
+#include "code\modules\mob\living\silicon\robot\robot_bellies.dm"
#include "code\modules\mob\living\silicon\robot\robot_damage.dm"
#include "code\modules\mob\living\silicon\robot\robot_items.dm"
#include "code\modules\mob\living\silicon\robot\robot_movement.dm"
@@ -4294,6 +4296,7 @@
#include "code\modules\vore\eating\exportpanel_vr.dm"
#include "code\modules\vore\eating\inbelly_spawn.dm"
#include "code\modules\vore\eating\leave_remains_vr.dm"
+#include "code\modules\vore\eating\living_bellies.dm"
#include "code\modules\vore\eating\living_vr.dm"
#include "code\modules\vore\eating\mob_vr.dm"
#include "code\modules\vore\eating\silicon_vr.dm"