diff --git a/code/__defines/belly_modes_vr.dm b/code/__defines/belly_modes_vr.dm
index e4ccd847f8..2d5ba3e308 100644
--- a/code/__defines/belly_modes_vr.dm
+++ b/code/__defines/belly_modes_vr.dm
@@ -18,6 +18,7 @@
#define DM_FLAG_THICKBELLY 0x8
#define DM_FLAG_AFFECTWORN 0x10
#define DM_FLAG_JAMSENSORS 0x20
+#define DM_FLAG_FORCEPSAY 0x40
//Item related modes
#define IM_HOLD "Hold"
diff --git a/code/_onclick/hud/screen_objects_vr.dm b/code/_onclick/hud/screen_objects_vr.dm
index 1d8df98a38..ac38f2cf43 100644
--- a/code/_onclick/hud/screen_objects_vr.dm
+++ b/code/_onclick/hud/screen_objects_vr.dm
@@ -45,6 +45,8 @@
var/turf/T = get_turf(H)
if(T.get_lumcount() <= 0.1)
to_chat(usr, "You are slowly calming down in darkness' safety...")
+ else if(isbelly(H.loc)) // CHOMPEdit: Safety message for if inside a belly.
+ to_chat(usr, "You are slowly calming down within the darkness of something's belly, listening to their body as it moves around you. ...safe...")
else
to_chat(usr, "You are slowly calming down... But safety of darkness is much preferred.")
else
diff --git a/code/datums/roundstats/roundstats.dm b/code/datums/roundstats/roundstats.dm
index c5ceb686a7..2fc1950bb6 100644
--- a/code/datums/roundstats/roundstats.dm
+++ b/code/datums/roundstats/roundstats.dm
@@ -21,6 +21,10 @@ GLOBAL_VAR_INIT(items_sold_shift_roundstat, 0)
GLOBAL_VAR_INIT(disposals_flush_shift_roundstat, 0)
GLOBAL_VAR_INIT(rocks_drilled_roundstat, 0)
GLOBAL_VAR_INIT(mech_destroyed_roundstat, 0)
+GLOBAL_VAR_INIT(prey_eaten_roundstat, 0) //VOREStation Edit - Obviously
+GLOBAL_VAR_INIT(prey_absorbed_roundstat, 0) //VOREStation Edit - Obviously
+GLOBAL_VAR_INIT(prey_digested_roundstat, 0) //VOREStation Edit - Obviously
+GLOBAL_VAR_INIT(items_digested_roundstat, 0) //VOREStation Edit - Obviously
/hook/roundend/proc/RoundTrivia()//bazinga
var/list/valid_stats_list = list() //This is to be populated with the good shit
@@ -50,6 +54,17 @@ GLOBAL_VAR_INIT(mech_destroyed_roundstat, 0)
else if(GLOB.disposals_flush_shift_roundstat > 40)
valid_stats_list.Add("The disposal system flushed a whole [GLOB.disposals_flush_shift_roundstat] times for this shift. We should really invest in waste treatement.")
+ //VOREStation Add Start - Vore stats lets gooooo
+ if(GLOB.prey_eaten_roundstat > 0)
+ valid_stats_list.Add("A total of [GLOB.prey_eaten_roundstat] individuals were eaten today!")
+ if(GLOB.prey_digested_roundstat > 0)
+ valid_stats_list.Add("A total of [GLOB.prey_digested_roundstat] individuals were digested today!")
+ if(GLOB.prey_absorbed_roundstat > 0)
+ valid_stats_list.Add("A total of [GLOB.prey_absorbed_roundstat] individuals were absorbed today!")
+ if(GLOB.items_digested_roundstat > 0)
+ valid_stats_list.Add("A total of [GLOB.items_digested_roundstat] items were digested today!")
+ //VOREStation Add End
+
if(LAZYLEN(valid_stats_list))
to_world("Shift trivia!")
diff --git a/code/datums/supplypacks/hospitality_vr.dm b/code/datums/supplypacks/hospitality_vr.dm
index 49d4091e50..ff198ab1ec 100644
--- a/code/datums/supplypacks/hospitality_vr.dm
+++ b/code/datums/supplypacks/hospitality_vr.dm
@@ -29,7 +29,7 @@
/obj/item/weapon/reagent_containers/food/snacks/berrymuffin,
/obj/item/weapon/reagent_containers/food/snacks/bunbun,
/obj/item/weapon/reagent_containers/food/snacks/cherrypie,
- /obj/item/weapon/reagent_containers/food/snacks/cookiesnack,
+ /obj/item/weapon/reagent_containers/food/snacks/cookie,
/obj/item/weapon/reagent_containers/food/snacks/croissant,
/obj/item/weapon/reagent_containers/food/snacks/donut/normal,
/obj/item/weapon/reagent_containers/food/snacks/donut/jelly,
diff --git a/code/game/machinery/cryopod.dm b/code/game/machinery/cryopod.dm
index be8639e4bc..f948459970 100644
--- a/code/game/machinery/cryopod.dm
+++ b/code/game/machinery/cryopod.dm
@@ -522,9 +522,18 @@
control_computer.frozen_crew += "[to_despawn.real_name], [to_despawn.mind.role_alt_title] - [stationtime2text()]"
control_computer._admin_logs += "[key_name(to_despawn)] ([to_despawn.mind.role_alt_title]) at [stationtime2text()]"
log_and_message_admins("[key_name(to_despawn)] ([to_despawn.mind.role_alt_title]) entered cryostorage.")
+
+ //VOREStation Edit Start
+ var/depart_announce = TRUE
- announce.autosay("[to_despawn.real_name], [to_despawn.mind.role_alt_title], [on_store_message]", "[on_store_name]", announce_channel, using_map.get_map_levels(z, TRUE, om_range = DEFAULT_OVERMAP_RANGE))
- visible_message("\The [initial(name)] [on_store_visible_message_1] [to_despawn.real_name] [on_store_visible_message_2]", 3)
+ if(istype(to_despawn, /mob/living/dominated_brain))
+ depart_announce = FALSE
+
+ if(depart_announce)
+ announce.autosay("[to_despawn.real_name], [to_despawn.mind.role_alt_title], [on_store_message]", "[on_store_name]", announce_channel, using_map.get_map_levels(z, TRUE, om_range = DEFAULT_OVERMAP_RANGE))
+ visible_message("\The [initial(name)] [on_store_visible_message_1] [to_despawn.real_name] [on_store_visible_message_2]", 3)
+
+ //VOREStation Edit End
//VOREStation Edit begin: Dont delete mobs-in-mobs
if(to_despawn.client && to_despawn.stat<2)
diff --git a/code/game/objects/random/misc.dm b/code/game/objects/random/misc.dm
index 86b64c2e7d..ea559171d9 100644
--- a/code/game/objects/random/misc.dm
+++ b/code/game/objects/random/misc.dm
@@ -859,7 +859,7 @@
/obj/item/weapon/reagent_containers/food/snacks/donut/plain,
/obj/item/weapon/reagent_containers/food/snacks/donut/plain/jelly,
/obj/item/weapon/reagent_containers/food/snacks/chocolatebar,
- /obj/item/weapon/reagent_containers/food/snacks/cookiesnack)
+ /obj/item/weapon/reagent_containers/food/snacks/cookie)
/obj/random/mre/dessert/vegan
name = "random vegan MRE dessert"
diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm
index 2fde716d51..157cc8c25c 100644
--- a/code/modules/admin/topic.dm
+++ b/code/modules/admin/topic.dm
@@ -554,7 +554,7 @@
jobs += "
"
counter = 0
- jobs += "
"
+ jobs += ""
//VOREstation Edit End
//Civilian (Grey)
@@ -635,7 +635,7 @@
jobs += "[entry] | "
else
jobs += "[entry] | "
-
+
if(++counter >= 5) //So things dont get squiiiiished!
jobs += ""
counter = 0
@@ -1417,10 +1417,10 @@
to_chat(usr, "This can only be used on instances of type /mob/living/carbon/human")
return
- H.equip_to_slot_or_del( new /obj/item/weapon/reagent_containers/food/snacks/cookiesnack(H), slot_l_hand )
- if(!(istype(H.l_hand,/obj/item/weapon/reagent_containers/food/snacks/cookiesnack)))
- H.equip_to_slot_or_del( new /obj/item/weapon/reagent_containers/food/snacks/cookiesnack(H), slot_r_hand )
- if(!(istype(H.r_hand,/obj/item/weapon/reagent_containers/food/snacks/cookiesnack)))
+ H.equip_to_slot_or_del( new /obj/item/weapon/reagent_containers/food/snacks/cookie(H), slot_l_hand )
+ if(!(istype(H.l_hand,/obj/item/weapon/reagent_containers/food/snacks/cookie)))
+ H.equip_to_slot_or_del( new /obj/item/weapon/reagent_containers/food/snacks/cookie(H), slot_r_hand )
+ if(!(istype(H.r_hand,/obj/item/weapon/reagent_containers/food/snacks/cookie)))
log_admin("[key_name(H)] has their hands full, so they did not receive their cookie, spawned by [key_name(src.owner)].")
message_admins("[key_name(H)] has their hands full, so they did not receive their cookie, spawned by [key_name(src.owner)].")
return
@@ -1558,7 +1558,7 @@
var/mob/M = locate(href_list["jumpto"])
if(!M)
return
-
+
var/turf/T = get_turf(M)
if(isturf(T))
usr.on_mob_jump()
@@ -1597,16 +1597,16 @@
var/mob/M = locate(href_list["sendmob"])
if(!M)
return
-
+
var/list/areachoices = return_sorted_areas()
var/choice = tgui_input_list(usr, "Pick an area:", "Send Mob", areachoices)
if(!choice)
return
-
+
var/area/A = areachoices[choice]
if(!A)
return
-
+
M.on_mob_jump()
M.forceMove(pick(get_area_turfs(A)))
var/msg = "[key_name_admin(usr)] teleported [ADMIN_LOOKUPFLW(M)]"
diff --git a/code/modules/awaymissions/loot_vr.dm b/code/modules/awaymissions/loot_vr.dm
index 84d6ac438d..ea2e5e41bf 100644
--- a/code/modules/awaymissions/loot_vr.dm
+++ b/code/modules/awaymissions/loot_vr.dm
@@ -267,7 +267,7 @@
/obj/item/weapon/reagent_containers/food/drinks/dry_ramen, \
/obj/item/weapon/reagent_containers/food/snacks/candiedapple, \
/obj/item/weapon/reagent_containers/food/snacks/chocolatebar, \
- /obj/item/weapon/reagent_containers/food/snacks/cookiesnack, \
+ /obj/item/weapon/reagent_containers/food/snacks/cookie, \
/obj/item/weapon/reagent_containers/food/snacks/meatball, \
/obj/item/weapon/reagent_containers/food/snacks/plump_pie, \
/obj/item/weapon/reagent_containers/food/snacks/liquidfood)
diff --git a/code/modules/client/preference_setup/loadout/loadout_uniform_vr.dm b/code/modules/client/preference_setup/loadout/loadout_uniform_vr.dm
index dc1df4a875..6e80ef3de5 100644
--- a/code/modules/client/preference_setup/loadout/loadout_uniform_vr.dm
+++ b/code/modules/client/preference_setup/loadout/loadout_uniform_vr.dm
@@ -267,6 +267,11 @@ Talon jumpsuit
suits[initial(undersuit_type.name)] = undersuit_type
gear_tweaks += new/datum/gear_tweak/path(sortAssoc(suits))
+/datum/gear/uniform/undersuit_haz
+ display_name = "undersuit, hazard (Engineering)"
+ allowed_roles = list("Chief Engineer", "Atmospheric Technician", "Engineer")
+ path = /obj/item/clothing/under/undersuit/hazard
+
/datum/gear/uniform/undersuit_sec
display_name = "undersuit, security (Security)"
allowed_roles = list("Head of Security", "Warden", "Detective", "Security Officer")
diff --git a/code/modules/economy/price_list.dm b/code/modules/economy/price_list.dm
index 10199e9e46..3a92f3d46b 100644
--- a/code/modules/economy/price_list.dm
+++ b/code/modules/economy/price_list.dm
@@ -615,7 +615,7 @@
// Cookies and Candies //
-/obj/item/weapon/reagent_containers/food/snacks/cookiesnack
+/obj/item/weapon/reagent_containers/food/snacks/cookie
price_tag = 1
/obj/item/weapon/reagent_containers/food/snacks/chocolatebar
diff --git a/code/modules/economy/vending_machines.dm b/code/modules/economy/vending_machines.dm
index 351dbab3ea..2f58e90b6f 100644
--- a/code/modules/economy/vending_machines.dm
+++ b/code/modules/economy/vending_machines.dm
@@ -1231,7 +1231,10 @@
/obj/item/clothing/mask/bandana/red = 5,
/obj/item/clothing/suit/storage/hooded/wintercoat/security = 5,
/obj/item/clothing/accessory/armband = 5,
- /obj/item/clothing/accessory/holster/waist = 5
+ /obj/item/clothing/accessory/holster/armpit = 2, //VOREStation edit - gives some variety of available holsters for those who forgot to bring their own
+ /obj/item/clothing/accessory/holster/waist = 2, //VOREStation edit - But also reduces the number per type, so there's 8 overall rather than like, 20
+ /obj/item/clothing/accessory/holster/hip = 2, //VOREStation edit
+ /obj/item/clothing/accessory/holster/leg = 2 //VOREStation edit
)
req_log_access = access_hop
has_logs = 1
diff --git a/code/modules/economy/vending_machines_vr.dm b/code/modules/economy/vending_machines_vr.dm
index d00fb7ca5e..a0542b5b42 100644
--- a/code/modules/economy/vending_machines_vr.dm
+++ b/code/modules/economy/vending_machines_vr.dm
@@ -218,7 +218,7 @@
/obj/item/weapon/reagent_containers/food/snacks/sliceable/orangecake = 10,
/obj/item/weapon/reagent_containers/food/snacks/sliceable/peanutcake = 10,
/obj/item/weapon/reagent_containers/food/snacks/icecreamsandwich = 15,
- /obj/item/weapon/reagent_containers/food/snacks/cookiesnack = 15,
+ /obj/item/weapon/reagent_containers/food/snacks/cookie = 15,
/obj/item/weapon/reagent_containers/food/snacks/sliceable/brownies = 10,
/obj/item/weapon/reagent_containers/food/snacks/chocolatebar = 10,
/obj/item/weapon/reagent_containers/food/snacks/chocolatepiece = 20
@@ -2642,6 +2642,7 @@
/obj/item/weapon/reagent_containers/food/snacks/clownstears = 10,
/obj/item/weapon/reagent_containers/food/snacks/coldchili = 10,
/obj/item/weapon/reagent_containers/food/snacks/cookiesnack = 10,
+ /obj/item/weapon/reagent_containers/food/snacks/cookie = 10,
/obj/item/weapon/reagent_containers/food/snacks/corn_dog = 10,
/obj/item/weapon/reagent_containers/food/snacks/cosmicbrowniesslice = 10,
/obj/item/weapon/reagent_containers/food/snacks/cosmicbrowniesslice/filled = 10,
@@ -3126,6 +3127,7 @@
/obj/item/weapon/reagent_containers/food/snacks/clownstears = 10,
/obj/item/weapon/reagent_containers/food/snacks/coldchili = 10,
/obj/item/weapon/reagent_containers/food/snacks/cookiesnack = 10,
+ /obj/item/weapon/reagent_containers/food/snacks/cookie = 10,
/obj/item/weapon/reagent_containers/food/snacks/corn_dog = 10,
/obj/item/weapon/reagent_containers/food/snacks/cosmicbrowniesslice = 10,
/obj/item/weapon/reagent_containers/food/snacks/cosmicbrowniesslice/filled = 10,
diff --git a/code/modules/emotes/definitions/audible_furry_ch.dm b/code/modules/emotes/definitions/audible_furry_ch.dm
new file mode 100644
index 0000000000..4268ffe2bb
--- /dev/null
+++ b/code/modules/emotes/definitions/audible_furry_ch.dm
@@ -0,0 +1,4 @@
+/decl/emote/audible/coyawoo
+ key = "coyawoo"
+ emote_message_3p = "lets out a scraggly awoo."
+ emote_sound = 'sound/voice/coyoteawoo.ogg'
\ No newline at end of file
diff --git a/code/modules/emotes/emote_mob.dm b/code/modules/emotes/emote_mob.dm
index 7516be2eff..b0b3fce0bb 100644
--- a/code/modules/emotes/emote_mob.dm
+++ b/code/modules/emotes/emote_mob.dm
@@ -27,6 +27,11 @@
if(world.time < next_emote)
to_chat(src, SPAN_WARNING("You cannot use another emote yet."))
return
+ //VOREStation Addition Start
+ if(forced_psay)
+ pme(message)
+ return
+ //VOREStation Addition End
if(act == "help")
if(world.time >= next_emote_refresh)
diff --git a/code/modules/food/food/lunch.dm b/code/modules/food/food/lunch.dm
index d0db75f16d..5879a8e95a 100644
--- a/code/modules/food/food/lunch.dm
+++ b/code/modules/food/food/lunch.dm
@@ -65,7 +65,7 @@ var/list/lunchables_snacks_ = list(/obj/item/weapon/reagent_containers/food/snac
/obj/item/weapon/reagent_containers/food/snacks/honeybun,
/obj/item/weapon/reagent_containers/food/snacks/custardbun,
/obj/item/weapon/reagent_containers/food/snacks/honeytoast,
- /obj/item/weapon/reagent_containers/food/snacks/cookiesnack,
+ /obj/item/weapon/reagent_containers/food/snacks/cookie,
/obj/item/weapon/reagent_containers/food/snacks/fruitbar,
/obj/item/weapon/reagent_containers/food/snacks/semki,
/obj/item/weapon/reagent_containers/food/snacks/salo,
diff --git a/code/modules/mob/living/carbon/human/emote.dm b/code/modules/mob/living/carbon/human/emote.dm
index d7cd2ef0eb..84090269e1 100644
--- a/code/modules/mob/living/carbon/human/emote.dm
+++ b/code/modules/mob/living/carbon/human/emote.dm
@@ -136,8 +136,11 @@ var/list/_human_default_emotes = list(
/decl/emote/helper/vflap,
/decl/emote/audible/prbt,
/decl/emote/audible/gyoh,
- /decl/emote/audible/rumble
+ /decl/emote/audible/rumble,
//VOREStation Add End
+ //CHOMPStation Add Start
+ /decl/emote/audible/coyawoo
+ //CHOMPStation End Start
)
//VOREStation Add Start
diff --git a/code/modules/mob/living/carbon/human/species/station/station_special_vr.dm b/code/modules/mob/living/carbon/human/species/station/station_special_vr.dm
index 290bb6766a..024009275b 100644
--- a/code/modules/mob/living/carbon/human/species/station/station_special_vr.dm
+++ b/code/modules/mob/living/carbon/human/species/station/station_special_vr.dm
@@ -205,6 +205,11 @@
feral++
else
feral = max(0,--feral)
+
+ // Being in a belly or in the darkness decreases stress further. :9
+ var/turf/T = get_turf(H)
+ if(feral && (isbelly(H.loc) || T.get_lumcount() <= 0.1))
+ feral = max(0,--feral)
//Set our real mob's var to our temp var
H.feral = feral
@@ -221,7 +226,7 @@
H.shock_stage = max(H.shock_stage-(feral/20), 0)
//Handle light/dark areas
- var/turf/T = get_turf(H)
+ // var/turf/T = get_turf(H) // CHOMPEdit: Moved up to before the in-belly/dark combined check, should still safely reach here just fine.
if(!T)
update_xenochimera_hud(H, danger, feral_state)
return //Nullspace
@@ -233,8 +238,8 @@
//This is basically the 'lite' version of the below block.
var/list/nearby = H.living_mobs(world.view)
- //Not in the dark and out in the open.
- if(!darkish && isturf(H.loc))
+ //Not in the dark, or a belly, and out in the open.
+ if(!darkish && isturf(H.loc) && !isbelly(H.loc)) // CHOMPEdit: added specific check for if in belly
//Always handle feral if nobody's around and not in the dark.
if(!nearby.len)
@@ -248,8 +253,8 @@
update_xenochimera_hud(H, danger, feral_state)
return
- // In the darkness or "hidden". No need for custom scene-protection checks as it's just an occational infomessage.
- if(darkish || !isturf(H.loc))
+ // In the darkness, "hidden", or in a belly. No need for custom scene-protection checks as it's just an occational infomessage.
+ if(darkish || !isturf(H.loc) || isbelly(H.loc)) // CHOMPEdit: added specific check for if in belly
// If hurt, tell 'em to heal up
if (shock)
to_chat(H,"This place seems safe, secure, hidden, a place to lick your wounds and recover...")
diff --git a/code/modules/mob/living/living_defines_vr.dm b/code/modules/mob/living/living_defines_vr.dm
index 48772e9616..f7a3f113ab 100644
--- a/code/modules/mob/living/living_defines_vr.dm
+++ b/code/modules/mob/living/living_defines_vr.dm
@@ -1,5 +1,6 @@
/mob
- var/muffled = 0 // Used by muffling belly
+ var/muffled = FALSE // Used by muffling belly
+ var/forced_psay = FALSE // If true will prevent the user from speaking with normal say/emotes, and instead redirect these to a private speech mode with their predator.
/mob/living
var/ooc_notes = null
diff --git a/code/modules/mob/living/say.dm b/code/modules/mob/living/say.dm
index cc66172f43..d8b5b24a62 100644
--- a/code/modules/mob/living/say.dm
+++ b/code/modules/mob/living/say.dm
@@ -160,7 +160,11 @@ var/list/channel_to_radio_key = new
if(stat == DEAD && !forbid_seeing_deadchat)
return say_dead(message)
return
-
+ //VOREStation Addition Start
+ if(forced_psay)
+ psay(message)
+ return
+ //VOREStation Addition End
//Parse the mode
var/message_mode = parse_message_mode(message, "headset")
diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/cookiegirl.dm b/code/modules/mob/living/simple_mob/subtypes/vore/cookiegirl.dm
index b7f02e2833..df106b4e1d 100644
--- a/code/modules/mob/living/simple_mob/subtypes/vore/cookiegirl.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/vore/cookiegirl.dm
@@ -16,7 +16,7 @@
melee_damage_upper = 5
meat_amount = 10
- meat_type = /obj/item/weapon/reagent_containers/food/snacks/cookiesnack
+ meat_type = /obj/item/weapon/reagent_containers/food/snacks/cookie
say_list_type = /datum/say_list/cookiegirl
ai_holder_type = /datum/ai_holder/simple_mob/passive/cookiegirl
diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/dominated_brain.dm b/code/modules/mob/living/simple_mob/subtypes/vore/dominated_brain.dm
index b0c3bb9ca6..8b38d1965e 100644
--- a/code/modules/mob/living/simple_mob/subtypes/vore/dominated_brain.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/vore/dominated_brain.dm
@@ -5,6 +5,7 @@
desc = "Someone who has taken a back seat within their own body."
icon = 'icons/obj/surgery.dmi'
icon_state = "brain1"
+ forced_psay = TRUE
var/mob/living/prey_body //The body of the person who dominated the brain
var/prey_ckey //The ckey of the person who dominated the brain
var/prey_name //In case the body is missing. ;3c
@@ -61,107 +62,9 @@
pred_body = null
/mob/living/dominated_brain/Destroy()
- if(pred_body)
- var/P = FALSE
- for(var/I in pred_body)
- if(I == src)
- continue
- if(istype(I, /mob/living/dominated_brain))
- P = TRUE
- if(!P)
- pred_body.verbs -= /mob/proc/psay
- pred_body.verbs -= /mob/proc/pme
-
lets_unregister_our_signals()
. = ..()
-/mob/living/dominated_brain/say(var/message, var/datum/language/speaking = null, var/whispering = 0)
-
- if (src.client)
- if(client.prefs.muted & MUTE_IC)
- to_chat(src, "You cannot speak in IC (muted).")
- return
-
- if(loc == pred_body)
-
- message = sanitize(message)
- if (!message)
- return
- log_say(message,src)
- if (stat == 2)
- return say_dead(message)
-
- to_chat(src, "You think, \"[message]\"")
- to_chat(pred_body, "The captive mind of \the [src] thinks, \"[message]\"")
- for(var/I in pred_body.contents)
- if(istype(I, /mob/living/dominated_brain) && I != src)
- var/mob/living/dominated_brain/db = I
- to_chat(db, "The captive mind of \the [src] thinks, \"[message]\"")
-
- for (var/mob/M in player_list)
- if (istype(M, /mob/new_player))
- continue
- else if(M.stat == DEAD && M.is_preference_enabled(/datum/client_preference/ghost_ears))
- to_chat(M, "The captive mind of [src] whispers, \"[message]\"")
-
-/mob/living/dominated_brain/me_verb(message as text)
- if (src.client)
- if(client.prefs.muted & MUTE_IC)
- to_chat(src, "You cannot speak in IC (muted).")
- return
-
- if(loc == pred_body)
-
- message = sanitize(message)
- if (!message)
- return
- log_emote(message,src)
- if (stat == 2)
- return say_dead(message)
-
- to_chat(src, "\The [src] [message]")
- to_chat(pred_body, "\The [src] [message]")
- for(var/I in pred_body.contents)
- if(istype(I, /mob/living/dominated_brain) && I != src)
- var/mob/living/dominated_brain/db = I
- to_chat(db, "\The [src] [message]")
-
- for (var/mob/M in player_list)
- if (istype(M, /mob/new_player))
- continue
- else if(M.stat == DEAD && M.is_preference_enabled(/datum/client_preference/ghost_ears))
- to_chat(M, "\The [src] [message]")
- return
-
-/mob/living/dominated_brain/emote(var/message)
- if (src.client)
- if(client.prefs.muted & MUTE_IC)
- to_chat(src, "You cannot speak in IC (muted).")
- return
-
- if(loc == pred_body)
-
- message = sanitize(message)
- if (!message)
- return
- log_emote(message,src)
- if (stat == 2)
- return say_dead(message)
-
- to_chat(src, "\The [src] [message]")
- to_chat(pred_body, "\The [src] [message]")
- for(var/I in pred_body.contents)
- if(istype(I, /mob/living/dominated_brain) && I != src)
- var/mob/living/dominated_brain/db = I
- to_chat(db, "\The [src] [message]")
-
- for (var/mob/M in player_list)
- if (istype(M, /mob/new_player))
- continue
- else if(M.stat == DEAD && M.is_preference_enabled(/datum/client_preference/ghost_ears))
- to_chat(M, "\The [src] [message]")
- return
-
/mob/living/dominated_brain/process_resist()
//Resisting control by an alien mind.
if(pred_body.ckey == pred_ckey)
@@ -199,8 +102,6 @@
ndb.name = prey_name
ndb.prey_ckey = src.prey_ckey
ndb.pred_ckey = src.pred_ckey
- ndb.pred_body.verbs |= /mob/proc/pme
- ndb.pred_body.verbs |= /mob/proc/psay
prey_goes_here = ndb
prey_goes_here.real_name = src.prey_name
@@ -215,8 +116,6 @@
ndb.name = prey_name
ndb.prey_ckey = src.prey_ckey
ndb.pred_ckey = src.pred_ckey
- ndb.pred_body.verbs |= /mob/proc/pme
- ndb.pred_body.verbs |= /mob/proc/psay
prey_goes_here = ndb
src.languages -= src.temp_languages
@@ -234,26 +133,29 @@
pred_body.ckey = src.pred_ckey
pred_body.ooc_notes = pred_ooc_notes
log_and_message_admins("[pred_body] is now controlled by [pred_body.ckey]. They were restored to control through prey domination, and had been controlled by [prey_ckey].")
- handle_langs(src)
+ pred_body.absorb_langs()
pred_body.prey_controlled = FALSE
qdel(src)
-/mob/living/dominated_brain/proc/handle_langs(var/mob/M)
+/mob/living/proc/absorb_langs() //This should be called on the predator in the exchange
var/list/langlist = list()
- pred_body.languages -= pred_body.temp_languages
- LAZYCLEARLIST(pred_body.temp_languages)
- pred_body.temp_languages = list()
- for(var/i in loc)
- if(i == M)
- continue
- if(istype(i,/mob/living/dominated_brain))
- var/mob/living/dominated_brain/db = i
- langlist |= db.languages
- langlist |= db.prey_langs
- langlist -= pred_body.languages
- pred_body.temp_languages |= langlist
- pred_body.languages |= langlist
+ languages -= temp_languages
+ LAZYCLEARLIST(src.temp_languages)
+ src.temp_languages = list()
+ for(var/mob/living/L in contents)
+ if(istype(L,/mob/living/dominated_brain))
+ if(L.ckey)
+ langlist |= L.languages
+ for(var/b in vore_organs)
+ for(var/mob/living/L in b)
+ if(isliving(L))
+ if(L.ckey)
+ langlist |= L.languages
+ if(langlist.len)
+ langlist -= languages
+ temp_languages |= langlist
+ languages |= langlist
//Welcome to the adapted borer code.
/mob/proc/dominate_predator()
@@ -319,8 +221,6 @@
else
pred_brain = new /mob/living/dominated_brain(pred, pred, name, prey)
- pred.verbs |= /mob/proc/pme
- pred.verbs |= /mob/proc/psay
pred_brain.prey_ooc_notes = prey.ooc_notes
pred_brain.pred_ooc_notes = pred.ooc_notes
pred_brain.name = pred.name
@@ -330,7 +230,7 @@
pred_brain.prey_langs |= preylangs
pred_brain.prey_ckey = prey.ckey
pred_brain.pred_ckey = pred.ckey
- pred_brain.handle_langs()
+ pred_brain.pred_body.absorb_langs()
pred.ooc_notes = pred_brain.prey_ooc_notes
pred.verbs |= /mob/proc/release_predator
@@ -381,72 +281,6 @@
else
to_chat(src, "\The [pred_body] is already dominated, and cannot be controlled at this time.")
-
-/mob/proc/psay(message as text|null)
- set category = "Abilities"
- set name = "Prey Say (psay)"
- set desc = "Emote to a dominated predator/prey."
-
- if (src.client)
- if(client.prefs.muted & MUTE_IC)
- to_chat(src, "You cannot speak in IC (muted).")
- return
- message = sanitize(message)
- if (!message)
- message = input(usr, "Type a message to emote.","Emote to prey") as text|null
- if (!message)
- return
-
- var/f = FALSE
- for(var/I in contents)
- if(istype(I, /mob/living/dominated_brain))
- var/mob/living/dominated_brain/db = I
- to_chat(db, "\The [src] thinks, \"[message]\"")
- f = TRUE
- if(f)
- to_chat(src, "You think \"[message]\"")
- for (var/mob/M in player_list)
- if (istype(M, /mob/new_player))
- continue
- else if(M.stat == DEAD && M.is_preference_enabled(/datum/client_preference/ghost_ears))
- to_chat(M, "\The [src] thinks, \"[message]\"")
- log_say(message,src)
- else
- to_chat(src, "There is no one inside you to talk to...")
- return
-
-/mob/proc/pme(message as text|null)
- set category = "Abilities"
- set name = "Prey Emote (pme)"
- set desc = "Emote to a dominated predator/prey."
-
- if (src.client)
- if(client.prefs.muted & MUTE_IC)
- to_chat(src, "You cannot speak in IC (muted).")
- return
- message = sanitize(message)
- if (!message)
- message = input(usr, "Type a message to emote.","Emote to prey") as text|null
- if (!message)
- return
- var/f = FALSE
- for(var/I in contents)
- if(istype(I, /mob/living/dominated_brain))
- var/mob/living/dominated_brain/db = I
- to_chat(db, "\The [src] [message]")
- f = TRUE
- if(f)
- to_chat(src, "\The [src] [message]")
- for (var/mob/M in player_list)
- if (istype(M, /mob/new_player))
- continue
- else if(M.stat == DEAD && M.is_preference_enabled(/datum/client_preference/ghost_ears))
- to_chat(M, "\The [src] [message]")
- log_emote(message,src)
- else
- to_chat(src, "There is no one inside you to talk to...")
- return
-
/mob/living/proc/dominate_prey()
set category = "Abilities"
set name = "Dominate Prey"
@@ -491,8 +325,6 @@
var/mob/living/dominated_brain/db = new /mob/living/dominated_brain(src, src, M.name, M)
- verbs |= /mob/proc/pme
- verbs |= /mob/proc/psay
db.name = M.name
db.prey_ckey = M.ckey
db.pred_ckey = src.ckey
@@ -502,10 +334,11 @@
M.languages -= M.temp_languages
db.languages |= M.languages
- db.handle_langs()
db.ooc_notes = M.ooc_notes
db.verbs |= /mob/living/dominated_brain/proc/cease_this_foolishness
+ absorb_langs()
+
db.ckey = db.prey_ckey
log_admin("[db] ([db.ckey]) has agreed to [src]'s dominate prey attempt, and so no longer occupies their original body.")
to_chat(src, "You feel your mind expanded as [M] is incorporated into you.")
@@ -523,7 +356,7 @@
if(prey_body && prey_body.loc.loc == pred_body)
prey_body.ckey = prey_ckey
- handle_langs(src)
+ pred_body.absorb_langs()
to_chat(src, "Your connection to [pred_body] fades, and you awaken back in your own body!")
to_chat(pred_body, "You feel as though a piece of yourself is missing, as \the [src] returns to their body.")
log_admin("[src] ([src.ckey]) has returned to their body, [prey_body].")
diff --git a/code/modules/mob/say.dm b/code/modules/mob/say.dm
index c30d256c59..d51d048da1 100644
--- a/code/modules/mob/say.dm
+++ b/code/modules/mob/say.dm
@@ -4,12 +4,22 @@
/mob/verb/whisper(message as text)
set name = "Whisper"
set category = "IC"
+ //VOREStation Addition Start
+ if(forced_psay)
+ psay(message)
+ return
+ //VOREStation Addition End
usr.say(message,whispering=1)
/mob/verb/say_verb(message as text)
set name = "Say"
set category = "IC"
+ //VOREStation Addition Start
+ if(forced_psay)
+ psay(message)
+ return
+ //VOREStation Addition End
set_typing_indicator(FALSE)
usr.say(message)
@@ -21,6 +31,11 @@
if(say_disabled) //This is here to try to identify lag problems
to_chat(usr, "Speech is currently admin-disabled.")
return
+ //VOREStation Addition Start
+ if(forced_psay)
+ pme(message)
+ return
+ //VOREStation Addition End
//VOREStation Edit Start
if(muffled)
@@ -63,6 +78,15 @@
else if(universal_speak || universal_understand)
return TRUE
+ //VOREStation Addition Start
+ if(isliving(src))
+ var/mob/living/L = src
+ if(isbelly(L.loc) && L.absorbed)
+ var/mob/living/P = L.loc.loc
+ if(P.say_understands(other, speaking))
+ return TRUE
+ //VOREStation Addition End
+
//Languages are handled after.
if(!speaking)
if(!other)
diff --git a/code/modules/mob/say_vr.dm b/code/modules/mob/say_vr.dm
index 8b06163590..59f4f47825 100644
--- a/code/modules/mob/say_vr.dm
+++ b/code/modules/mob/say_vr.dm
@@ -10,6 +10,11 @@
if(say_disabled) //This is here to try to identify lag problems
to_chat(usr, "Speech is currently admin-disabled.")
return
+ //VOREStation Addition Start
+ if(forced_psay)
+ pme(message)
+ return
+ //VOREStation Addition End
message = sanitize_or_reflect(message,src) //VOREStation Edit - Reflect too-long messages (within reason)
if(!message)
@@ -26,6 +31,12 @@
to_chat(src, "You are unable to emote.")
return
+ //VOREStation Addition Start
+ if(forced_psay)
+ pme(message)
+ return
+ //VOREStation Addition End
+
var/muzzled = is_muzzled()
if(m_type == 2 && muzzled) return
@@ -99,3 +110,163 @@
to_chat(user,message)
to_chat(user, "^ This message was NOT SENT ^ -- It was [length] characters, and the limit is [MAX_MESSAGE_LEN]. It would fit in [posts] separate messages.")
#undef MAX_HUGE_MESSAGE_LEN
+
+///// PSAY /////
+
+/mob/verb/psay(message as text|null)
+ set category = "IC"
+ set name = "Psay"
+ set desc = "Talk to people affected by complete absorbed or dominate predator/prey."
+
+ if (src.client)
+ if(client.prefs.muted & MUTE_IC)
+ to_chat(src, "You cannot speak in IC (muted).")
+ return
+ if (!message)
+ message = input(usr, "Type a message to say.","Psay") as text|null
+ message = sanitize_or_reflect(message,src)
+ if (!message)
+ return
+ message = capitalize(message)
+ if (stat == DEAD)
+ return say_dead(message)
+ if(!isliving(src))
+ forced_psay = FALSE
+ say(message)
+ var/f = FALSE //did we find someone to send the message to other than ourself?
+ var/mob/living/pb //predator body
+ var/mob/living/M = src
+ if(istype(M, /mob/living/dominated_brain))
+ var/mob/living/dominated_brain/db = M
+ if(db.loc != db.pred_body)
+ to_chat(db, "You aren't inside of a brain anymore!!!")
+ qdel(db) //Oh no, dominated brains shouldn't exist outside of the body, so if we got here something went very wrong.
+ return
+ else
+ pb = db.pred_body
+ to_chat(pb, "The captive mind of \the [M] thinks, \"[message]\"") //To our pred if dominated brain
+ f = TRUE
+ else if(M.absorbed && isbelly(M.loc))
+ pb = M.loc.loc
+ to_chat(pb, "\The [M] thinks, \"[message]\"") //To our pred if absorbed
+ f = TRUE
+
+ if(pb) //We are prey, let's do the prey thing.
+
+ for(var/I in pb.contents)
+ if(istype(I, /mob/living/dominated_brain) && I != M)
+ var/mob/living/dominated_brain/db = I
+ to_chat(db, "The captive mind of \the [M] thinks, \"[message]\"") //To any dominated brains in the pred
+ f = TRUE
+ for(var/B in pb.vore_organs)
+ for(var/mob/living/L in B)
+ if(L.absorbed && L != M && L.ckey)
+ to_chat(L, "\The [M] thinks, \"[message]\"") //To any absorbed people in the pred
+ f = TRUE
+
+ //Let's also check and see if there's anyone inside of us to send the message to.
+ for(var/I in M.contents)
+ if(istype(I, /mob/living/dominated_brain))
+ var/mob/living/dominated_brain/db = I
+ to_chat(db, "\The [M] thinks, \"[message]\"") //To any dominated brains inside us
+ f = TRUE
+ for(var/B in M.vore_organs)
+ for(var/mob/living/L in B)
+ if(L.absorbed)
+ to_chat(L, "\The [M] thinks, \"[message]\"") //To any absorbed people inside us
+ f = TRUE
+
+ if(f) //We found someone to send the message to
+ if(pb)
+ to_chat(M, "You think \"[message]\"") //To us if we are the prey
+ else
+ to_chat(M, "You think \"[message]\"") //To us if we are the pred
+ for (var/mob/G in player_list)
+ if (istype(G, /mob/new_player))
+ continue
+ else if(G.stat == DEAD && G.is_preference_enabled(/datum/client_preference/ghost_ears))
+ to_chat(G, "\The [M] thinks, \"[message]\"")
+ log_say(message,M)
+ else //There wasn't anyone to send the message to, pred or prey, so let's just say it instead and correct our psay just in case.
+ M.forced_psay = FALSE
+ M.say(message)
+
+///// PME /////
+
+/mob/verb/pme(message as text|null)
+ set category = "IC"
+ set name = "Pme"
+ set desc = "Emote to people affected by complete absorbed or dominate predator/prey."
+
+ if (src.client)
+ if(client.prefs.muted & MUTE_IC)
+ to_chat(src, "You cannot speak in IC (muted).")
+ return
+ if (!message)
+ message = input(usr, "Type a message to emote.","Pme") as text|null
+ message = sanitize_or_reflect(message,src)
+ if (!message)
+ return
+ if (stat == DEAD)
+ return say_dead(message)
+ if(!isliving(src))
+ forced_psay = FALSE
+ me_verb(message)
+ var/f = FALSE //did we find someone to send the message to other than ourself?
+ var/mob/living/pb //predator body
+ var/mob/living/M = src
+ if(istype(M, /mob/living/dominated_brain))
+ var/mob/living/dominated_brain/db = M
+ if(db.loc != db.pred_body)
+ to_chat(db, "You aren't inside of a brain anymore!!!")
+ qdel(db) //Oh no, dominated brains shouldn't exist outside of the body, so if we got here something went very wrong.
+ return
+ else
+ pb = db.pred_body
+ to_chat(pb, "\The [M] [message]") //To our pred if dominated brain
+ f = TRUE
+
+ else if(M.absorbed && isbelly(M.loc))
+ pb = M.loc.loc
+ to_chat(pb, "\The [M] [message]") //To our pred if absorbed
+ f = TRUE
+
+ if(pb) //We are prey, let's do the prey thing.
+
+ for(var/I in pb.contents)
+ if(istype(I, /mob/living/dominated_brain) && I != M)
+ var/mob/living/dominated_brain/db = I
+ to_chat(db, "\The [M] [message]") //To any dominated brains in the pred
+ f = TRUE
+ for(var/B in pb.vore_organs)
+ for(var/mob/living/L in B)
+ if(L.absorbed && L != M && L.ckey)
+ to_chat(L, "\The [M] [message]") //To any absorbed people in the pred
+ f = TRUE
+
+ //Let's also check and see if there's anyone inside of us to send the message to.
+ for(var/I in M.contents)
+ if(istype(I, /mob/living/dominated_brain))
+ var/mob/living/dominated_brain/db = I
+ to_chat(db, "\The [M] [message]") //To any dominated brains inside us
+ f = TRUE
+ for(var/B in M.vore_organs)
+ for(var/mob/living/L in B)
+ if(L.absorbed)
+ to_chat(L, "\The [M] [message]") //To any absorbed people inside us
+ f = TRUE
+
+ if(f) //We found someone to send the message to
+ if(pb)
+ to_chat(M, "\The [M] [message]") //To us if we are the prey
+ else
+ to_chat(M, "\The [M] [message]") //To us if we are the pred
+ for (var/mob/G in player_list)
+ if (istype(G, /mob/new_player))
+ continue
+ else if(G.stat == DEAD && G.is_preference_enabled(/datum/client_preference/ghost_ears))
+ to_chat(G, "\The [M] [message]")
+ log_say(message,M)
+ else //There wasn't anyone to send the message to, pred or prey, so let's just emote it instead and correct our psay just in case.
+ M.forced_psay = FALSE
+ M.me_verb(message)
diff --git a/code/modules/pda/pda.dm b/code/modules/pda/pda.dm
index bda75db610..a19552d368 100644
--- a/code/modules/pda/pda.dm
+++ b/code/modules/pda/pda.dm
@@ -146,10 +146,11 @@ var/global/list/obj/item/device/pda/PDAs = list()
SPECIES_TESHARI = 'icons/mob/species/teshari/pda_wrist.dmi',
SPECIES_VR_TESHARI = 'icons/mob/species/teshari/pda_wrist.dmi',
)
- if(7) icon = 'icons/obj/pda_clam.dmi' //VOREStation edit
+ if(7) icon = 'icons/obj/pda_slider.dmi' //VOREStation edit
else
icon = 'icons/obj/pda_old.dmi'
log_debug("Invalid switch for PDA, defaulting to old PDA icons. [pdachoice] chosen.")
+ add_overlay("pda-pen")
start_program(find_program(/datum/data/pda/app/main_menu))
/obj/item/device/pda/proc/can_use(mob/user)
diff --git a/code/modules/vore/eating/belly_obj_vr.dm b/code/modules/vore/eating/belly_obj_vr.dm
index 489efe80fd..9a01762b28 100644
--- a/code/modules/vore/eating/belly_obj_vr.dm
+++ b/code/modules/vore/eating/belly_obj_vr.dm
@@ -63,7 +63,7 @@
//Actual full digest modes
var/tmp/static/list/digest_modes = list(DM_HOLD,DM_DIGEST,DM_ABSORB,DM_DRAIN,DM_UNABSORB,DM_HEAL,DM_SHRINK,DM_GROW,DM_SIZE_STEAL,DM_EGG)
//Digest mode addon flags
- var/tmp/static/list/mode_flag_list = list("Numbing" = DM_FLAG_NUMBING, "Stripping" = DM_FLAG_STRIPPING, "Leave Remains" = DM_FLAG_LEAVEREMAINS, "Muffles" = DM_FLAG_THICKBELLY, "Affect Worn Items" = DM_FLAG_AFFECTWORN, "Jams Sensors" = DM_FLAG_JAMSENSORS)
+ var/tmp/static/list/mode_flag_list = list("Numbing" = DM_FLAG_NUMBING, "Stripping" = DM_FLAG_STRIPPING, "Leave Remains" = DM_FLAG_LEAVEREMAINS, "Muffles" = DM_FLAG_THICKBELLY, "Affect Worn Items" = DM_FLAG_AFFECTWORN, "Jams Sensors" = DM_FLAG_JAMSENSORS, "Complete Absorb" = DM_FLAG_FORCEPSAY)
//Item related modes
var/tmp/static/list/item_digest_modes = list(IM_HOLD,IM_DIGEST_FOOD,IM_DIGEST,IM_DIGEST_PARALLEL)
@@ -134,7 +134,7 @@
"You feel %prey becoming part of you.")
var/list/absorb_messages_prey = list(
- "Your feel yourself becoming part of %pred's %belly!")
+ "You feel yourself becoming part of %pred's %belly!")
var/list/unabsorb_messages_owner = list(
"You feel %prey reform into a recognizable state again.")
@@ -417,9 +417,12 @@
p.undo_prey_takeover(FALSE)
return 0
for(var/mob/living/L in M.contents)
- L.muffled = 0
+ L.muffled = FALSE
+ L.forced_psay = FALSE
+
for(var/obj/item/weapon/holder/H in M.contents)
- H.held_mob.muffled = 0
+ H.held_mob.muffled = FALSE
+ H.held_mob.forced_psay = FALSE
//Place them into our drop_location
M.forceMove(drop_location())
@@ -433,7 +436,9 @@
if(ML.client)
ML.stop_sound_channel(CHANNEL_PREYLOOP) //Stop the internal loop, it'll restart if the isbelly check on next tick anyway
if(ML.muffled)
- ML.muffled = 0
+ ML.muffled = FALSE
+ if(ML.forced_psay)
+ ML.forced_psay = FALSE
if(ML.absorbed)
ML.absorbed = FALSE
handle_absorb_langs(ML, owner)
@@ -482,6 +487,9 @@
for(var/mob/living/M in contents)
M.updateVRPanel()
+ if(prey.ckey)
+ GLOB.prey_eaten_roundstat++
+
// Get the line that should show up in Examine message if the owner of this belly
// is examined. By making this a proc, we not only take advantage of polymorphism,
// but can easily make the message vary based on how many people are inside, etc.
@@ -744,10 +752,10 @@
M.absorbed = TRUE
if(M.ckey)
- owner.temp_language_sources += M
- M.temp_language_sources += owner
handle_absorb_langs(M, owner)
+ GLOB.prey_absorbed_roundstat++
+
to_chat(M, "[absorb_alert_prey]")
to_chat(owner, "[absorb_alert_owner]")
if(M.noisy) //Mute drained absorbee hunger if enabled.
@@ -826,34 +834,8 @@
owner.update_icon()
/////////////////////////////////////////////////////////////////////////
-/obj/belly/proc/handle_absorb_langs(var/mob/living/prey, var/mob/living/pred)
- for(var/mob/living/p in pred.temp_language_sources) //Let's look at the pred's sources
- if (!p.absorbed)
- for(var/L in pred.temp_languages)
- if(L in p.languages)
- pred.languages -= L
- pred.temp_languages -= L
- pred.temp_language_sources -= p
- else
- for(var/L in p.languages)
- if(L in pred.languages)
- continue
- pred.languages += L
- pred.temp_languages += L
-
- for(var/mob/living/P in prey.temp_language_sources) //Let's look at the prey's sources
- if (!prey.absorbed)
- for(var/L in prey.temp_languages)
- if(L in P.languages)
- prey.languages -= L
- prey.temp_languages -= L
- prey.temp_language_sources -= P
- else
- for(var/L in P.languages)
- if(L in prey.languages)
- continue
- prey.languages += L
- prey.temp_languages += L
+/obj/belly/proc/handle_absorb_langs()
+ owner.absorb_langs()
////////////////////////////////////////////////////////////////////////
@@ -867,6 +849,7 @@
items_preserved |= item
else
owner.adjust_nutrition((nutrition_percent / 100) * 5 * digested)
+ GLOB.items_digested_roundstat++
if(isrobot(owner))
var/mob/living/silicon/robot/R = owner
R.cell.charge += ((nutrition_percent / 100) * 50 * digested)
diff --git a/code/modules/vore/eating/bellymodes_vr.dm b/code/modules/vore/eating/bellymodes_vr.dm
index 0891acef3c..f57da91d7e 100644
--- a/code/modules/vore/eating/bellymodes_vr.dm
+++ b/code/modules/vore/eating/bellymodes_vr.dm
@@ -224,6 +224,10 @@
if((mode_flags & DM_FLAG_THICKBELLY) && !H.muffled)
H.muffled = TRUE
+ //Force psay
+ if((mode_flags & DM_FLAG_FORCEPSAY) && !H.forced_psay && H.absorbed)
+ H.forced_psay = TRUE
+
//Worn items flag
if(mode_flags & DM_FLAG_AFFECTWORN)
for(var/slot in slots)
@@ -312,6 +316,9 @@
to_chat(owner, "[digest_alert_owner]")
to_chat(M, "[digest_alert_prey]")
+ if(M.ckey)
+ GLOB.prey_digested_roundstat++
+
if((mode_flags & DM_FLAG_LEAVEREMAINS) && M.digest_leave_remains)
handle_remains_leaving(M)
digestion_death(M)
diff --git a/code/modules/vore/eating/living_vr.dm b/code/modules/vore/eating/living_vr.dm
index 30dc1b63a4..a9116d9f7d 100644
--- a/code/modules/vore/eating/living_vr.dm
+++ b/code/modules/vore/eating/living_vr.dm
@@ -439,8 +439,8 @@
if(confirm != "Okay" || loc != B)
return
//Actual escaping
- absorbed = 0 //Make sure we're not absorbed
- muffled = 0 //Removes Muffling
+ absorbed = FALSE //Make sure we're not absorbed
+ muffled = FALSE //Removes Muffling
forceMove(get_turf(src)) //Just move me up to the turf, let's not cascade through bellies, there's been a problem, let's just leave.
for(var/mob/living/simple_mob/SA in range(10))
SA.prey_excludes[src] = world.time
diff --git a/icons/obj/pda_clam.dmi b/icons/obj/pda_slider.dmi
similarity index 100%
rename from icons/obj/pda_clam.dmi
rename to icons/obj/pda_slider.dmi
diff --git a/sound/voice/coyoteawoo.ogg b/sound/voice/coyoteawoo.ogg
new file mode 100644
index 0000000000..2801f42097
Binary files /dev/null and b/sound/voice/coyoteawoo.ogg differ
diff --git a/vorestation.dme b/vorestation.dme
index 58e78d7fa0..e2a8ed75fc 100644
--- a/vorestation.dme
+++ b/vorestation.dme
@@ -2289,6 +2289,7 @@
#include "code\modules\emotes\definitions\audible.dm"
#include "code\modules\emotes\definitions\audible_belch.dm"
#include "code\modules\emotes\definitions\audible_cough.dm"
+#include "code\modules\emotes\definitions\audible_furry_ch.dm"
#include "code\modules\emotes\definitions\audible_furry_vr.dm"
#include "code\modules\emotes\definitions\audible_scream.dm"
#include "code\modules\emotes\definitions\audible_scream_ch.dm"