diff --git a/modular_citadel/code/modules/vore/eating/belly_obj_vr.dm b/modular_citadel/code/modules/vore/eating/belly_obj_vr.dm
index 1aa8122be5..e76a09d4b7 100644
--- a/modular_citadel/code/modules/vore/eating/belly_obj_vr.dm
+++ b/modular_citadel/code/modules/vore/eating/belly_obj_vr.dm
@@ -26,18 +26,19 @@
var/escapetime = 20 SECONDS // Deciseconds, how long to escape this belly
var/digestchance = 0 // % Chance of stomach beginning to digest if prey struggles
var/absorbchance = 0 // % Chance of stomach beginning to absorb if prey struggles
- var/escapechance = 100 // % Chance of prey beginning to escape if prey struggles.
+ var/escapechance = 0 // % Chance of prey beginning to escape if prey struggles.
var/can_taste = FALSE // If this belly prints the flavor of prey when it eats someone.
var/bulge_size = 0.25 // The minimum size the prey has to be in order to show up on examine.
// var/shrink_grow_size = 1 // This horribly named variable determines the minimum/maximum size it will shrink/grow prey to.
var/silent = FALSE
- var/transferlocation = null // Location that the prey is released if they struggle and get dropped off.
+ var/transferlocation // Location that the prey is released if they struggle and get dropped off.
var/transferchance = 0 // % Chance of prey being transferred to transfer location when resisting
var/autotransferchance = 0 // % Chance of prey being autotransferred to transfer location
var/autotransferwait = 10 // Time between trying to transfer.
var/swallow_time = 10 SECONDS // for mob transfering automation
var/vore_capacity = 1 // simple animal nom capacity
+ var/is_wet = TRUE // Is this belly inside slimy parts?
//I don't think we've ever altered these lists. making them static until someone actually overrides them somewhere.
var/tmp/static/list/digest_modes = list(DM_HOLD,DM_DIGEST,DM_HEAL,DM_NOISY,DM_ABSORB,DM_UNABSORB) // Possible digest modes
@@ -138,7 +139,8 @@
"digest_messages_owner",
"digest_messages_prey",
"examine_messages",
- "emote_lists"
+ "emote_lists",
+ "is_wet"
)
//ommitted list
@@ -167,7 +169,7 @@
to_chat(owner,"[thing] slides into your [lowertext(name)].")
//Sound w/ antispam flag setting
- if(!silent && !recent_sound)
+ if(is_wet && !recent_sound)
for(var/mob/M in get_hearers_in_view(5, get_turf(owner)))
if(M.client && (M.client.prefs.cit_toggles & EATING_NOISES))
playsound(get_turf(owner),"[src.vore_sound]",50,0,-5,0,ignore_walls = FALSE,channel=CHANNEL_PRED)
@@ -268,8 +270,10 @@
prey.forceMove(src)
var/sound/preyloop = sound('sound/vore/prey/loop.ogg', repeat = TRUE)
- if(!silent)
+
+ if(is_wet)
prey.playsound_local(loc,preyloop,70,0, channel = CHANNEL_PREYLOOP)
+
owner.updateVRPanel()
for(var/mob/living/M in contents)
@@ -461,6 +465,9 @@
//Yes, it's ""safe"" to drop items here
/obj/belly/AllowDrop()
return TRUE
+/*
+/obj/belly/onDropInto(var/atom/movable/AM)
+ return null */
//Handle a mob struggling
// Called from /mob/living/carbon/relaymove()
@@ -469,6 +476,23 @@
return // User is not in this belly
R.setClickCooldown(50)
+
+ if(owner.stat) //If owner is stat (dead, KO) we can actually escape
+ to_chat(R,"You attempt to climb out of \the [lowertext(name)]. (This will take around [escapetime/10] seconds.)")
+ to_chat(owner,"Someone is attempting to climb out of your [lowertext(name)]!")
+
+ if(do_after(R, owner, escapetime))
+ if((owner.stat || escapable) && (R.loc == src)) //Can still escape?
+ release_specific_contents(R)
+ return
+ else if(R.loc != src) //Aren't even in the belly. Quietly fail.
+ return
+ else //Belly became inescapable or mob revived
+ to_chat(R,"Your attempt to escape [lowertext(name)] has failed!")
+ to_chat(owner,"The attempt to escape from your [lowertext(name)] has failed!")
+ return
+ return
+
var/struggle_outer_message = pick(struggle_messages_outside)
var/struggle_user_message = pick(struggle_messages_inside)
@@ -483,41 +507,33 @@
struggle_outer_message = "" + struggle_outer_message + ""
struggle_user_message = "" + struggle_user_message + ""
- if((owner.stat || !owner.client) && (R.a_intent != INTENT_HELP)) //If owner is stat (dead, KO) we can actually escape
- to_chat(R,"You attempt to climb out of \the [lowertext(name)]. (This will take around 5 seconds.)")
- to_chat(owner,"Someone is attempting to climb out of your [lowertext(name)]!")
-
- if(!do_mob(R,owner,50))
- return
- if(!(R in contents)) //Aren't even in the belly. Quietly fail.
- return
- if(R.a_intent != INTENT_HELP) //still want to?
- release_specific_contents(R)
- return
- else //Belly became inescapable or mob revived
- to_chat(R,"Your attempt to escape [lowertext(name)] has failed!")
- to_chat(owner,"The attempt to escape from your [lowertext(name)] has failed!")
- return
- else if(R.a_intent != INTENT_HELP) //failsafe to make sure people are able to struggle out. friendly ERP should be on help intent.
- to_chat(R,"You attempt to climb out of [lowertext(name)]. (This will take around [escapetime] seconds.)")
- to_chat(owner,"Someone is attempting to climb out of your [lowertext(name)]!")
- if(!do_mob(R,owner,escapetime))
- return
- release_specific_contents(R)
- return
- else if (R.a_intent == INTENT_HELP)
- for(var/mob/M in get_hearers_in_view(3, get_turf(owner)))
- M.show_message(struggle_outer_message, 1) // visible
- to_chat(R,struggle_user_message)
-
- if(!silent)
- for(var/mob/M in get_hearers_in_view(5, get_turf(owner)))
+ if(is_wet)
+ for(var/mob/M in get_hearers_in_view(2, get_turf(owner)))
if(M.client && (M.client.prefs.cit_toggles & EATING_NOISES))
playsound(get_turf(owner),"struggle_sound",35,0,-5,1,ignore_walls = FALSE,channel=CHANNEL_PRED)
R.stop_sound_channel(CHANNEL_PRED)
var/sound/prey_struggle = sound(get_sfx("prey_struggle"))
R.playsound_local(get_turf(R),prey_struggle,45,0)
+ for(var/mob/M in get_hearers_in_view(3, get_turf(owner)))
+ if(M.client && (M.client.prefs.cit_toggles & EATING_NOISES)) //Might as well censor the normies here too.
+ M.show_message(struggle_outer_message, 1) // visible
+ to_chat(R,struggle_user_message)
+
+ if(escapable) //If the stomach has escapable enabled.
+ if(prob(escapechance)) //Let's have it check to see if the prey escapes first.
+ to_chat(R,"You start to climb out of \the [lowertext(name)].")
+ to_chat(owner,"Someone is attempting to climb out of your [lowertext(name)]!")
+ if(do_after(R, escapetime))
+ if((owner.stat || escapable) && (R.loc == src)) //Can still escape?
+ release_specific_contents(R)
+ return
+ else if(R.loc != src) //Aren't even in the belly. Quietly fail.
+ return
+ else //Belly became inescapable or mob revived
+ to_chat(R,"Your attempt to escape [lowertext(name)] has failed!")
+ to_chat(owner,"The attempt to escape from your [lowertext(name)] has failed!")
+ return
else if(prob(transferchance) && transferlocation) //Next, let's have it see if they end up getting into an even bigger mess then when they started.
var/obj/belly/dest_belly
for(var/belly in owner.vore_organs)
@@ -525,6 +541,7 @@
if(B.name == transferlocation)
dest_belly = B
break
+
if(!dest_belly)
to_chat(owner, "Something went wrong with your belly transfer settings. Your [lowertext(name)] has had it's transfer chance and transfer location cleared as a precaution.")
transferchance = 0
@@ -541,21 +558,10 @@
to_chat(owner,"You feel your [lowertext(name)] start to cling onto its contents...")
digest_mode = DM_ABSORB
return
-/*
- else if(prob(digestchance) && digest_mode != DM_ITEMWEAK && digest_mode != DM_DIGEST) //Finally, let's see if it should run the digest chance.
+
+ else if(prob(digestchance) && digest_mode != DM_DIGEST) //Finally, let's see if it should run the digest chance.
to_chat(R,"In response to your struggling, \the [lowertext(name)] begins to get more active...")
to_chat(owner,"You feel your [lowertext(name)] beginning to become active!")
- digest_mode = DM_ITEMWEAK
- return
-
- else if(prob(digestchance) && digest_mode == DM_ITEMWEAK) //Oh god it gets even worse if you fail twice!
- to_chat(R,"In response to your struggling, \the [lowertext(name)] begins to get even more active!")
- to_chat(owner,"You feel your [lowertext(name)] beginning to become even more active!")
- digest_mode = DM_DIGEST
- return */
- else if(prob(digestchance)) //Finally, let's see if it should run the digest chance.)
- to_chat(R, "In response to your struggling, \the [name] begins to get more active...")
- to_chat(owner, "You feel your [name] beginning to become active!")
digest_mode = DM_DIGEST
return
@@ -609,6 +615,7 @@
dupe.autotransferwait = autotransferwait
dupe.swallow_time = swallow_time
dupe.vore_capacity = vore_capacity
+ dupe.is_wet = is_wet
//// Object-holding variables
//struggle_messages_outside - strings
diff --git a/modular_citadel/code/modules/vore/eating/living_vr.dm b/modular_citadel/code/modules/vore/eating/living_vr.dm
index 2e6018f112..74ae0bfe35 100644
--- a/modular_citadel/code/modules/vore/eating/living_vr.dm
+++ b/modular_citadel/code/modules/vore/eating/living_vr.dm
@@ -1,15 +1,16 @@
///////////////////// Mob Living /////////////////////
/mob/living
var/digestable = FALSE // Can the mob be digested inside a belly?
- var/obj/belly/vore_selected // Default to no vore capability.
- var/list/vore_organs = list() // List of vore containers inside a mob
+ var/showvoreprefs = TRUE // Determines if the mechanical vore preferences button will be displayed on the mob or not.
+ var/obj/belly/vore_selected // Default to no vore capability.
+ var/list/vore_organs = list() // List of vore containers inside a mob
var/devourable = FALSE // Can the mob be vored at all?
-// var/feeding = FALSE // Are we going to feed someone else?
- var/vore_taste = null // What the character tastes like
+// var/feeding = FALSE // Are we going to feed someone else?
+ var/vore_taste = null // What the character tastes like
var/no_vore = FALSE // If the character/mob can vore.
- var/openpanel = 0 // Is the vore panel open?
- var/noisy = FALSE // tummies are rumbly?
- var/absorbed = FALSE //are we absorbed?
+ var/openpanel = 0 // Is the vore panel open?
+ var/noisy = FALSE // tummies are rumbly?
+ var/absorbed = FALSE //are we absorbed?
var/next_preyloop
//
@@ -26,7 +27,8 @@
//Tries to load prefs if a client is present otherwise gives freebie stomach
spawn(10 SECONDS) // long delay because the server delays in its startup. just on the safe side.
- M.init_vore()
+ if(M)
+ M.init_vore()
//Return 1 to hook-caller
return 1
@@ -281,7 +283,7 @@
*/
//
-// Custom resist catches for /mob/living
+// Our custom resist catches for /mob/living
//
/mob/living/proc/vore_process_resist()
@@ -293,7 +295,7 @@
//Other overridden resists go here
- return FALSE
+ return 0
// internal slimy button in case the loop stops playing but the player wants to hear it
/mob/living/proc/preyloop_refresh()
diff --git a/modular_citadel/code/modules/vore/eating/vore_vr.dm b/modular_citadel/code/modules/vore/eating/vore_vr.dm
index 16366bbb14..32d19fc11b 100644
--- a/modular_citadel/code/modules/vore/eating/vore_vr.dm
+++ b/modular_citadel/code/modules/vore/eating/vore_vr.dm
@@ -28,7 +28,7 @@ V::::::V V::::::VO:::::::OOO:::::::ORR:::::R R:::::REE::::::EEEEEE
// The datum type bolted onto normal preferences datums for storing Vore stuff
//
-#define VORE_VERSION 2
+#define VORE_VERSION 3
GLOBAL_LIST_EMPTY(vore_preferences_datums)
diff --git a/modular_citadel/code/modules/vore/eating/vorepanel_vr.dm b/modular_citadel/code/modules/vore/eating/vorepanel_vr.dm
index 30209b6da2..bc30de6ca6 100644
--- a/modular_citadel/code/modules/vore/eating/vorepanel_vr.dm
+++ b/modular_citadel/code/modules/vore/eating/vorepanel_vr.dm
@@ -156,6 +156,10 @@
dat += "Name:"
dat += " '[selected.name]'"
+ //Belly Type button
+ dat += "Has Flesh Noises?"
+ dat += "[selected.is_wet ? "Yes" : "No"]"
+
//Digest Mode Button
dat += "
Belly Mode:"
dat += " [selected.digest_mode]"
@@ -457,6 +461,9 @@
selected.name = new_name
+ if(href_list["b_wetness"])
+ selected.is_wet = !selected.is_wet
+
if(href_list["b_mode"])
var/list/menu_list = selected.digest_modes