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"