diff --git a/code/game/atoms.dm b/code/game/atoms.dm
index 9f865aced66..b22079a2efe 100644
--- a/code/game/atoms.dm
+++ b/code/game/atoms.dm
@@ -544,6 +544,11 @@
M.create_chat_message(src, "[runemessage]", FALSE, list("emote"), audible = FALSE)
else if(blind_message)
M.show_message(blind_message, AUDIBLE_MESSAGE)
+ if(isliving(M))
+ var/mob/living/L = M
+ if(L.ai_holder)
+ var/datum/ai_holder/AI = L.ai_holder
+ AI.on_hear_emote(src, message)
// Show a message to all mobs and objects in earshot of this atom
// Use for objects performing audible actions
@@ -570,6 +575,11 @@
M.show_message(msg, AUDIBLE_MESSAGE, deaf_message, VISIBLE_MESSAGE)
if(runemessage != -1)
M.create_chat_message(src, "[runemessage || message]", FALSE, list("emote"))
+ if(isliving(M))
+ var/mob/living/L = M
+ if(L.ai_holder)
+ var/datum/ai_holder/AI = L.ai_holder
+ AI.on_hear_emote(src, message)
/atom/movable/proc/dropInto(var/atom/destination)
while(istype(destination))
diff --git a/code/game/objects/effects/wire_deleter.dm b/code/game/objects/effects/wire_deleter.dm
index 89130ed7cb2..a53d4d3256b 100644
--- a/code/game/objects/effects/wire_deleter.dm
+++ b/code/game/objects/effects/wire_deleter.dm
@@ -6,12 +6,13 @@
unacidable = TRUE
simulated = FALSE
invisibility = 100
+ var/wire_deletion_rate = 33
/obj/effect/wire_deleter/Initialize(mapload)
. = ..()
-
+
for(var/c in loc.contents)
if(istype(c, /obj/structure/cable))
- if(prob(33))
+ if(prob(wire_deletion_rate))
qdel(c)
- qdel(src)
\ No newline at end of file
+ qdel(src)
diff --git a/code/modules/ai/ai_holder_communication.dm b/code/modules/ai/ai_holder_communication.dm
index caafe5c8b8a..343788e3751 100644
--- a/code/modules/ai/ai_holder_communication.dm
+++ b/code/modules/ai/ai_holder_communication.dm
@@ -122,9 +122,16 @@
/datum/ai_holder/proc/on_hear_say(mob/living/speaker, message)
return
+/datum/ai_holder/proc/on_hear_emote(mob/living/speaker, message)
+ return
+
// This is to make responses feel a bit more natural and not instant.
-/datum/ai_holder/proc/delayed_say(var/message, var/mob/speak_to)
- spawn(rand(1 SECOND, 2 SECONDS))
+/datum/ai_holder/proc/delayed_say(var/message, var/mob/speak_to, min, max)
+ if(!min)
+ min = 1
+ if(!max)
+ max = 2
+ spawn(rand(min SECOND, max SECONDS))
if(!src || !holder || !can_act()) // We might've died/got deleted/etc in the meantime.
return
diff --git a/code/modules/ai/ai_holder_targeting.dm b/code/modules/ai/ai_holder_targeting.dm
index 8c0a38b4ff0..eff26839e7f 100644
--- a/code/modules/ai/ai_holder_targeting.dm
+++ b/code/modules/ai/ai_holder_targeting.dm
@@ -27,6 +27,7 @@
var/destructive = FALSE // Will target 'neutral' structures/objects and not just 'hostile' ones.
var/forgive_resting = TRUE //VOREStation add - If TRUE on a RETALIATE mob, then mob will drop target if it becomes hostile to you but hasn't taken damage
+ var/grab_hostile = TRUE
// A lot of this is based off of /TG/'s AI code.
@@ -272,6 +273,9 @@
if(!belly_attack)
if(isbelly(holder.loc))
return FALSE
+ if(!grab_hostile && holder.health == holder.maxHealth)
+ ai_log("react_to_attack() : Was attacked by [attacker], but they did no damage and the AI has grab_hostile set to false.", AI_LOG_TRACE)
+ return FALSE
if(holder.IIsAlly(attacker)) // I'll overlook it THIS time...
ai_log("react_to_attack() : Was attacked by [attacker], but they were an ally.", AI_LOG_TRACE)
return FALSE
diff --git a/code/modules/emotes/definitions/audible_emotes_RS.dm b/code/modules/emotes/definitions/audible_emotes_RS.dm
new file mode 100644
index 00000000000..ad79b56c92a
--- /dev/null
+++ b/code/modules/emotes/definitions/audible_emotes_RS.dm
@@ -0,0 +1,29 @@
+/decl/emote/audible/yip
+ key = "yip"
+ emote_message_1p = "You yip! Yip!"
+ emote_message_3p = "yips!"
+
+ emote_message_impaired = "makes a sound but you can't hear it."
+
+ emote_message_1p_target = "You yip at TARGET! Yip!!!"
+ emote_message_3p_target = "yips at TARGET!"
+
+ emote_sound = null
+ var/list/soundlist = list('sound/rogue-star/yip/yip1.ogg', 'sound/rogue-star/yip/yip2.ogg', 'sound/rogue-star/yip/yip3.ogg', 'sound/rogue-star/yip/yip4.ogg', 'sound/rogue-star/yip/yip5.ogg', 'sound/rogue-star/yip/yip6.ogg', 'sound/rogue-star/yip/yip7.ogg', 'sound/rogue-star/yip/yip8.ogg', 'sound/rogue-star/yip/yip9.ogg', 'sound/rogue-star/yip/yip10.ogg', 'sound/rogue-star/yip/yip11.ogg', 'sound/rogue-star/yip/yip12.ogg', 'sound/rogue-star/yip/yip13.ogg', 'sound/rogue-star/yip/yip14.ogg', 'sound/rogue-star/yip/yip15.ogg')
+ sound_vary = TRUE
+
+/decl/emote/audible/yip/get_emote_sound(var/mob/living/user)
+ emote_sound = pick(soundlist)
+
+ . = ..()
+
+/decl/emote/audible/yip/yap
+ key = "yap"
+ emote_message_1p = "You yap! Yap yap!"
+ emote_message_3p = "yaps!"
+
+ emote_message_impaired = "makes a sound but you can't hear it."
+
+ emote_message_1p_target = "You yap at TARGET! Yap yap!!!"
+ emote_message_3p_target = "yaps at TARGET!"
+ soundlist = list('sound/rogue-star/yap/yap1.ogg', 'sound/rogue-star/yap/yap2.ogg', 'sound/rogue-star/yap/yap4.ogg', 'sound/rogue-star/yap/yap5.ogg', 'sound/rogue-star/yap/yap6.ogg', 'sound/rogue-star/yap/yap7.ogg', 'sound/rogue-star/yap/yap8.ogg', 'sound/rogue-star/yap/yap9.ogg', 'sound/rogue-star/yap/yap10.ogg', 'sound/rogue-star/yap/yap11.ogg', 'sound/rogue-star/yap/yap12.ogg', 'sound/rogue-star/yap/yap13.ogg', 'sound/rogue-star/yap/yap14.ogg')
diff --git a/code/modules/emotes/emote_mob.dm b/code/modules/emotes/emote_mob.dm
index 32fc9a3a97a..bfe4c62e949 100644
--- a/code/modules/emotes/emote_mob.dm
+++ b/code/modules/emotes/emote_mob.dm
@@ -221,6 +221,11 @@
message = "[src] ([ghost_follow_link(src, M)]) [input]"
M.show_message(message, m_type)
M.create_chat_message(src, "[runemessage]", FALSE, list("emote"), (m_type == AUDIBLE_MESSAGE))
+ if(isliving(M))
+ var/mob/living/L = M
+ if(L.ai_holder)
+ var/datum/ai_holder/AI = L.ai_holder
+ AI.on_hear_emote(src, message)
for(var/obj/O as anything in o_viewers)
spawn(0)
diff --git a/code/modules/mob/ghost_simplemob_spawn.dm b/code/modules/mob/ghost_simplemob_spawn.dm
index 4a95483897f..6292092fbe8 100644
--- a/code/modules/mob/ghost_simplemob_spawn.dm
+++ b/code/modules/mob/ghost_simplemob_spawn.dm
@@ -10,6 +10,7 @@ GLOBAL_LIST_INIT(ghost_spawnable_mobs,list(
"Deathclaw" = /mob/living/simple_mob/vore/aggressive/deathclaw,
"Deer" = /mob/living/simple_mob/vore/deer,
"Defanged Xenomorph" = /mob/living/simple_mob/vore/xeno_defanged,
+ "Doglin" = /mob/living/simple_mob/vore/doglin/basic,
"Dragon" = /mob/living/simple_mob/vore/aggressive/dragon,
"Dragon - V3b" = /mob/living/simple_mob/vore/aggressive/dragon/virgo3b,
"Dragon - Giant" = /mob/living/simple_mob/vore/bigdragon/friendly/maintpred,
diff --git a/code/modules/mob/living/carbon/human/emote.dm b/code/modules/mob/living/carbon/human/emote.dm
index f1983b776c5..33ccef4cd59 100644
--- a/code/modules/mob/living/carbon/human/emote.dm
+++ b/code/modules/mob/living/carbon/human/emote.dm
@@ -172,9 +172,11 @@ var/list/_human_default_emotes = list(
/decl/emote/audible/lwarble,
/decl/emote/audible/croak_skrell,
/decl/emote/audible/roarbark,
- /decl/emote/audible/dook
-
+ /decl/emote/audible/dook,
//VOREStation Add End
+ //RS ADD START
+ /decl/emote/audible/yip,
+ /decl/emote/audible/yip/yap
)
//VOREStation Add Start
@@ -315,7 +317,9 @@ var/list/_simple_mob_default_emotes = list(
/decl/emote/audible/vox_shriek,
/decl/emote/audible/purr,
/decl/emote/audible/purrlong,
- /decl/emote/audible/dook
+ /decl/emote/audible/dook,
+ /decl/emote/audible/yip,
+ /decl/emote/audible/yip/yap
)
//VOREStation Add End
diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/doglin.dm b/code/modules/mob/living/simple_mob/subtypes/vore/doglin.dm
new file mode 100644
index 00000000000..4f75fbade5f
--- /dev/null
+++ b/code/modules/mob/living/simple_mob/subtypes/vore/doglin.dm
@@ -0,0 +1,442 @@
+/mob/living/simple_mob/vore/doglin
+ name = "doglin"
+ desc = "A fluffy beastie. It looks something like a dog, or maybe a goblin. Who can say!"
+ tt_desc = "doglin"
+
+ icon_state = "doglin"
+ icon_living = "doglin"
+ icon_dead = "doglin_dead"
+ icon_rest = "doglin_rest" //DO a proper rest sprite later
+ icon = 'icons/rogue-star/mobx32.dmi'
+
+ faction = "dog"
+ maxHealth = 100
+ health = 100
+ movement_cooldown = -1
+
+ response_help = "pets"
+ response_disarm = "rudely paps"
+ response_harm = "punches"
+
+ harm_intent_damage = 3
+ melee_damage_lower = 5
+ melee_damage_upper = 1
+// catalogue_data = list(/datum/category_item/catalogue/fauna/doglin)
+
+ attacktext = list("nipped", "chomped", "slapped", "gnaws on")
+ attack_sound = 'sound/voice/bork.ogg'
+ friendly = list("snoofs", "nuzzles", "yips at", "smooshes on")
+
+ ai_holder_type = /datum/ai_holder/simple_mob/doglin
+
+ mob_size = MOB_SMALL
+
+ has_langs = list(LANGUAGE_ANIMAL, LANGUAGE_CANILUNZT)
+ say_list_type = /datum/say_list/doglin
+
+ has_hands = TRUE
+ humanoid_hands = TRUE
+
+ var/static/list/overlays_cache = list()
+ var/yip_cooldown = 0
+ var/doglin_special = TRUE
+
+
+///// VORE RELATED /////
+ vore_active = 1
+
+ swallowTime = 2 SECONDS
+ vore_capacity = 2
+ vore_bump_chance = 5
+ vore_bump_emote = "greedily homms at"
+ vore_digest_chance = 0
+ vore_absorb_chance = 0
+ vore_escape_chance = 10
+ vore_pounce_chance = 5
+ vore_ignores_undigestable = 0
+ vore_default_mode = DM_SELECT
+ vore_icons = SA_ICON_LIVING
+ vore_stomach_name = "stomach"
+ vore_stomach_flavor = "You have found yourself pumping on down, down, down into this extremely soft dog. The slick touches of pulsing walls roll over you in greedy fashion as you're swallowed away, the flesh forms to your figure as in an instant the world is replaced by the hot squeeze of canine gullet. And in another moment a heavy GLLRMMPTCH seals you away, the dog tossing its head eagerly, the way forward stretching to accommodate your shape as you are greedily guzzled down. The wrinkled, doughy walls pulse against you in time to the creature's steady heartbeat. The sounds of the outside world muffled into obscure tones as the wet, grumbling rolls of this soft creature's gut hold you, churning you tightly such that no part of you is spared from these gastric affections."
+ vore_default_contamination_flavor = "Wet"
+ vore_default_contamination_color = "grey"
+ vore_default_item_mode = IM_DIGEST
+
+/mob/living/simple_mob/vore/doglin/basic
+ doglin_special = FALSE
+
+/mob/living/simple_mob/vore/doglin/Initialize()
+ . = ..()
+ update_icon()
+ if(name == "doglin")
+ funny_name()
+ if(!doglin_special)
+ return
+ if(!color && prob(50))
+ color = random_color()
+ if(prob(25))
+ var/ournum = round(rand(50,150), 25) / 100
+ resize(ournum)
+
+/mob/living/simple_mob/vore/doglin/update_icon()
+ . = ..()
+
+ if(stat != CONSCIOUS || resting)
+ return
+ var/image/eye_image = overlays_cache["doglin-eyes"]
+ if(!eye_image)
+ eye_image = image(icon,null,"doglin-eyes")
+ eye_image.color = "#FFFFFF"
+ eye_image.appearance_flags = RESET_COLOR|KEEP_APART|PIXEL_SCALE
+ overlays_cache["doglin-eyes"] = eye_image
+ add_overlay(eye_image)
+
+/mob/living/simple_mob/vore/doglin/New()
+ ..()
+
+ verbs += /mob/living/proc/hide
+
+
+/mob/living/simple_mob/vore/doglin/Life()
+ . = ..()
+
+ if(client)
+ return
+
+ if(yip_cooldown)
+ yip_cooldown --
+ if(yip_cooldown < 0)
+ yip_cooldown = 0
+
+ if(resting && prob(1))
+ lay_down()
+ ai_holder.go_wake()
+
+/mob/living/simple_mob/vore/doglin/say(message, datum/language/speaking, whispering)
+ . = ..()
+ if(stat == CONSCIOUS && !resting)
+ flick(icon_state + "-y", src)
+
+/mob/living/simple_mob/vore/doglin/proc/funny_name()
+ var/list/adjectives = list(
+ "zesty",
+ "sweet",
+ "sour",
+ "bitter",
+ "kind",
+ "wise",
+ "grouchy",
+ "soft",
+ "plump",
+ "fluffy",
+ "smirking",
+ "dozey",
+ "thin",
+ "weird",
+ "silly",
+ "juicy",
+ "frowning",
+ "smiling",
+ "spicy",
+ "cool",
+ "cute",
+ "dubeous",
+ "immense",
+ "blepping",
+ "mischieveous",
+ "fussy",
+ "pleasant",
+ "unpleasant",
+ "ugly",
+ "elderly",
+ "anxious",
+ "carefree",
+ "shy",
+ "mesmerized",
+ "hyper",
+ "lethargic",
+ "dwarf",
+ "outrageous",
+ "bodacious",
+ "desperate",
+ "moist",
+ "clammy",
+ "effeminate",
+ "macho",
+ "cute",
+ "haunted",
+ "distinguished",
+ "evil",
+ "pure"
+ )
+
+ var/list/subject = list(
+ "doglin",
+ "forager",
+ "hunter",
+ "renegade",
+ "farmer",
+ "tunneller",
+ "tender",
+ "layabout",
+ "vagabond",
+ "looker",
+ "watcher",
+ "gazer",
+ "breeder",
+ "chopper",
+ "chomper",
+ "lust",
+ "glutton",
+ "greed",
+ "sloth",
+ "wrath",
+ "pride",
+ "need",
+ "gofer",
+ "actor",
+ "worker",
+ "leader",
+ "teacher",
+ "baker",
+ "driver",
+ "soldier",
+ "plumber",
+ "dresser",
+ "diver",
+ "delver",
+ "maleficar",
+ "gentledoglin"
+ )
+
+ var/list/suf = list(
+ "ist",
+ "kin",
+ "ling",
+ "chan",
+ "kun",
+ "ful",
+ "y",
+ "mancer",
+ "lin"
+ )
+
+ name = "[pick(adjectives)] [pick(subject)]"
+
+ if(prob(25))
+ name = "[name][pick(suf)]"
+
+/mob/living/simple_mob/vore/doglin/proc/yapyapyap(who, mob/living/speaker)
+ if(prob(50))
+ ai_holder.delayed_say("*yip[who]", speaker, max = 10)
+ else
+ ai_holder.delayed_say("*yap[who]", speaker, max = 10)
+ yip_cooldown += rand(1,50)
+
+//Will be a verb later. For now it is not quite ready.
+/mob/living/simple_mob/vore/doglin/proc/dig()
+ set name = "Doglin - Dig"
+ set category = "Abilities"
+
+ if(!isturf(src.loc) || isspace(src.loc) || istype(src.loc, /turf/simulated/floor/water))
+ to_chat(src, "You can't do that here!")
+ return
+ var/turf/ourturf = get_turf(src)
+
+ if(!(istype(src.loc, /turf/simulated/floor/outdoors) || istype(src.loc, /turf/simulated/floor/tiled) || istype(src.loc, /turf/simulated/floor)))
+ to_chat(src, "You can't do that here!")
+ return
+
+ if(!do_after(src, 10 SECONDS, src.loc, exclusive = TRUE))
+ return
+ if(ourturf.check_density(FALSE,TRUE))
+ to_chat(src, "Something is in the way!")
+ return
+ for(var/stuff in ourturf.contents)
+ if(istype(stuff,/obj/structure/doglin_hole))
+ to_chat(src, "There is already a hold here!")
+ return
+ var/obj/structure/doglin_hole/hole = new(ourturf)
+
+ hole.name = "[src.name] hole"
+
+/datum/say_list/doglin
+ speak = list("*yip", "*yap")
+ emote_hear = list("barks", "woofs", "yaps", "yips", "pants", "sniffs","snoofs")
+ emote_see = list("wags its tail", "stretches", "yawns", "swivels its ears", "wiggles around", "does a little dance")
+ say_maybe_target = list("*growl")
+ say_got_target = list("*roarbark")
+
+/mob/living/simple_mob/vore/doglin/init_vore()
+ ..()
+ var/obj/belly/B = vore_selected
+ B.name = "stomach"
+ B.desc = "You have found yourself pumping on down, down, down into this doglin. The slick touches of pulsing walls roll over you in greedy fashion as you're swallowed away, the flesh forms to your figure as in an instant the world is replaced by the hot squeeze of canine gullet. And in another moment a heavy GLLRMMPTCH seals you away, the doglin tossing its head eagerly, the way forward stretching to accommodate your shape as you are greedily guzzled down. The wrinkled, doughy walls pulse against you in time to the creature's steady heartbeat. The sounds of the outside world muffled into obscure tones as the wet, grumbling rolls of this soft creature's gut hold you, churning you tightly such that no part of you is spared from these gastric affections."
+
+ B.emote_lists[DM_HOLD] = list(
+ "You can feel yourself shift and sway as the doglin moves around. Your figure held tightly there had little room to move in that organic gloom, but every wandering step is another jostling quake that shakes through the canine frame and rocks you once again.",
+ "It is hard to hear much of anything over the grumbling fleshy sounds of the stomach walls pressing to you. The wet sound of flesh gliding over you too was ever-present as the walls encroach upon your personal space. And beyond that, the steady booming of the doglin's heart throbs in your ears, a relaxing drone of excited thumping. Any sounds from the outside world are muffled such that they are hard to hear, as the canine walls hold on to you greedily.",
+ "You can hear the vague dragging, creaking sounds of the flesh holding you stretching and compressing with the doglin's movements. Any time you press out, the walls seem to groan and flex in to smother you heavily for a few moments. ",
+ "When you shift your weight to try to find a more comfortable position you can feel your weight stretch the chamber around you a little more, and it responds by collapsing in on you more tightly! Forming to you with heavily insistence, grinding against your curves. Holding you firmly for a few moments, before slowly relaxing...",
+ "The heat of the doglin's body soaks into your form and relaxes your muscles. It's easy to let yourself go limp, to be squeezed and carried by this soft predator. The sway of its body, the swing of its gait, all enough to lull anyone who likes such things into a deeply relaxed state, as you're rocked and supported, squeezed deep within the gut of this woof. Possessively held, kept.",
+ "Thick slime soaks your form as the doglin's insides churn over you. There is no part of you that is not totally soaked in it before too long as the steady gastric motions massage you from head to toe. Any pushes or squirms only get the affected flesh to cling more tightly, and to press back. It's very hard to get any personal space!",
+ "Beyond the grumbling gurgles and the ever-present drumming of the doglin's heart, you can actually hear, more faintly, the whooshing of the canine's breath. The slow draw in coming with a vague tightening of your surroundings, while the doglin's soft, whooshing exhales make your surroundings more relaxed, easy to sink in against.")
+
+ B.emote_lists[DM_ABSORB] = list(
+ "You can feel the weight of the doglin shift as it moves around. Your figure held tightly there had absolutely no room to move in that organic gloom. Every moment those pumping walls seem to squeeze over you tighter, every wandering step the doglin takes is another jostling quake that seems to sink you that much deeper into the doglin's flesh, the doglin's body steadily collapsing in to claim you.",
+ "It is hard to hear much of anything over the smothering press of stomach walls pressing to you, forming to your features. The tarry flesh you are slowly sinking into squelches here and there as it flows over your features. The sound of the doglin's body absorbing you is oddly quiet. No bubbling or glooping. Just one body slowly blending into and becoming one with another. And beyond all that, the steady booming of the doglin's heart throbs in your ears, moment by moment that sound seems to tug at you, coursing through you as much as the doglin you are steadily becoming a part of. Any sounds from the outside world are muffled such that they are hard to hear, as you sink into the walls of this canine predator.",
+ "You can hear the vague dragging, creaking sounds of the flesh holding you stretching and compressing with the doglin's movements. Any time you press out, the walls seem to simply flow over you, and allow whatever pushed out to sink in that much more. The swell on the doglin's tummy shrinking that much faster... ",
+ "When you shift your weight to try to get some space. you can feel your weight simply sink into that flesh, the folds forming around you tightly, and the deeper you sink, the harder it gets to move. The pressure never seems to let up as the tide of flesh holding you slowly overcomes your form.",
+ "As the seemingly molten heat of this doglin's flesh flows over you, it's easy to let yourself go limp, to just give in and become one with this creature that so obviously wanted you, and indeed, unless something happened to stop this, you soon would be... The doglin tail swaying in a knowing arc as you are added to its figure. Squeezed, tucked away, kept.",
+ "The thick slimes that coat your form do nothing to keep the molten flesh of this doglin's stomach from advancing across your figure and claiming you up. Soon there's not a single part of you that is not totally inundated in the deep press of a woof's gastric massage. Any pushes or squirms only get the affected flesh to cling more tightly, and to press back, flowing over your form, deeper, deeper.",
+ "Beyond the squelching, clinging tide of doglin flesh working to make the two of you one, and the ever-present drumming of the doglin's heart, you can actually hear, more faintly, the whooshing of the canine's breath. The slow draw in coming with a vague tightening of your surroundings, while the doglin's soft, whooshing exhales make your surroundings more relaxed. And you realize suddenly that the doglin's breathing seem to bring you relief even as you are totally smothered in the canine's insistent gastric affections!")
+
+ B.emote_lists[DM_DIGEST] = list(
+ "As the doglin goes about its business, you can feel the shift your weight sway on its tummy. The gurgling glorping sounds that come with the squeezing, kneading, massaging motions let you know that you're held tight, churned. Dog food.",
+ "It is hard to hear much of anything over the roaring gurgles of stomach walls churning over you. The wet sound of flesh grinding heavily over you too was ever-present as the walls encroach upon your personal space, lathering you in tingly, syrupy thick slimes. And beyond that, the steady booming of the doglin's heart throbs in your ears, a drone of excited thumping. Any sounds from the outside world are muffled such that they are hard to hear, as the canine walls churn on to you greedily.",
+ "You can hear the vague dragging, creaking sounds of the flesh holding you stretching and compressing with the doglin's movements. The walls seem to constantly flex and squeeze across you, pressing in against you, massaging thick slime into your figure, steadily trying to soften up your outer layers...",
+ "When you try to shift your weight to try to find a more comfortable position, you find that those heavy walls pumping over you make it hard to move at all. You can feel the weight of the doglin pressing in all around you even without those muscles flexing and throbbing across your form. It forms to you with heavily insistence, grinding against your curves, churning that bubbling gloop into you. Holding you firm and heavy as that stomach does its work...",
+ "The heat of the doglin's body soaks into your form and relaxes your muscles. It's easy to let yourself go limp, to just completely give in to this soft predator. The sway of its body, the swing of its gait, all enough to lull anyone who likes such things into a deeply relaxed state. Churned and slathered, massaged by doughy wrinkled walls deep within the gut of this woof. Possessively held within that needy chamber.",
+ "Thick slime soaks your form as the doglin's insides churn over you. There is no part of you that is not totally soaked in it before too long as the steady gastric motions massage you from head to toe. Any pushes or squirms only get the affected flesh to cling more tightly, and to press back. It's very hard to get any personal space!",
+ "Beyond the grumbling gurgles and the ever-present drumming of the doglin's heart, you can actually hear, more faintly, the whooshing of the canine's breath. The slow draw in coming with a vague tightening of your surroundings, while the doglin's soft, whooshing exhales make your surroundings more relaxed, easy to sink in against. Occasionally though everything would go all tight and cramped! And somewhere up above you can hear the doglin let out a dainty little belch...")
+
+ B.digest_brute = 1
+ B.digest_burn = 1
+ B.colorization_enabled = TRUE
+ B.mode_flags = DM_FLAG_THICKBELLY | DM_FLAG_NUMBING
+ B.belly_fullscreen = "anibelly"
+ B.struggle_messages_inside = list(
+ "Your struggling only causes %pred's doughy gut to smother you against those wrinkled walls...",
+ "As you squirm, %pred's %belly flexxes over you heavily, forming you back into a small ball...",
+ "You push out at those heavy wrinkled walls with all your might and they collapse back in on you! Clinging and churning over you heavily for a few minutes!!!",
+ "As you struggle against the gut of this doglin, you can feel a squeeze roll over you from the bottom to the top! The walls cling to you a little tighter then as the doglin emits a soft little burp...",
+ "You try to squirm, but you can't even move as those heavy walls throb and pulse and churn around you.",
+ "You paddle against the fleshy walls of %pred's %belly, making a little space for yourself for a moment, before the wrinkled surface bounces back against you.",
+ "The slick walls are doughy, smushy under your fingers, and very difficult to grip! The flesh pulses under your grip in time with %pred's heartbeat.",
+ "Your hands slip and slide over the slick slimes of %pred's %belly as you struggle to escape! The walls pulse and squeeze around you greedily.",
+ "%pred lets out a happy little awoo, rocking their hips to jostle you as you squirm, while the weight of those walls closes in on you, squeezing you tightly!",
+ "%pred's %belly glorgles around you as you push and struggle within! The squashy walls are always reluctant to give ground, and the moment your struggles lax, they redouble their efforts in smothering all the fight out of you!")
+ B.struggle_messages_outside = list(
+ "A vague shape briefly swells on %pred's %belly as something moves inside...",
+ "Something shifts within %pred's %belly.",
+ "%pred urps as something shifts in their %belly.")
+ B.examine_messages = list(
+ "Their %belly is distended.",
+ "Vague shapes swell their %belly.",
+ "It looks like they have something solid in their %belly")
+
+/mob/living/simple_mob/vore/doglin/attack_hand(mob/living/carbon/human/M as mob)
+
+ if(stat == DEAD)
+ return ..()
+
+ if(M.a_intent != I_HELP)
+ return ..()
+ playsound(src, 'sound/weapons/thudswoosh.ogg', 50, 1, -1)
+
+ if(M.zone_sel.selecting == BP_GROIN)
+ M.visible_message( \
+ "[M] rubs \the [src]'s tummy...", \
+ "You rub \the [src]'s tummy...", )
+ if(client)
+ return
+ if(resting)
+ if(prob(10))
+ visible_message("\The [src] pants and bleps its tongue out. It looks SO happy...")
+ return
+ else
+ visible_message("\The [src] wags happily and sprawls out for you!")
+ lay_down()
+ ai_holder.go_sleep()
+ playsound(src, pick(bodyfall_sound), 75, 1)
+ return
+ if(resting)
+ M.visible_message("\The [M.name] shakes \the [src] awake from their nap.","You shake \the [src] awake!")
+ lay_down()
+ ai_holder.go_wake()
+ return
+ if(M.zone_sel.selecting == BP_HEAD)
+ M.visible_message( \
+ "[M] pats \the [src] on the head.", \
+ "You pat \the [src] on the head.", )
+ if(client)
+ return
+ if(prob(10))
+ visible_message("\The [src] wags and excitedly bumps their head into [M]'s hand.")
+ else if(M.zone_sel.selecting == BP_R_HAND || M.zone_sel.selecting == BP_L_HAND)
+ M.visible_message( \
+ "[M] shakes \the [src]'s pawb.", \
+ "You shake \the [src]'s pawb.", )
+ if(client)
+ return
+ if(prob(10))
+ visible_message("\The [src]'s looks a little distraught...")
+ else if(M.zone_sel.selecting == "mouth")
+ M.visible_message( \
+ "[M] boops \the [src]'s nose.", \
+ "You boop \the [src] on the nose.", )
+ if(client)
+ return
+ if(prob(10))
+ visible_message("\The [src]'s eyes widen as they stare at [M]. After a moment they rub their prodded snoot.")
+ else if(M.zone_sel.selecting == BP_GROIN)
+ M.visible_message( \
+ "[M] rubs \the [src]'s tummy...", \
+ "You rub \the [src]'s tummy...", )
+ if(client)
+ return
+ visible_message("\The [src] wags happily and sprawls out for you!")
+ lay_down()
+ ai_holder.go_sleep()
+ else
+ return ..()
+
+/datum/category_item/catalogue/fauna/doglin
+ name = "Alien Wildlife - Doglin"
+ desc = "An alien species similar in appearance to Vulpkanin. This species speaks in a barking, yipping language. \
+ These typically bear a pure white coat, though they have been known to come in many colors. These beings are intelligent and advanced tool users, \
+ known to work in groups. They are quite tolerant and accepting, though can be provoked to violence in response to violence. while canine in appearance, \
+ doglins are omnivorous, and are known to grow mushrooms in the extensive tunnels they dig. While generally not a danger to people, doglins can cause issues \
+ where they live with their tendancy to dig. It is possible for people to fall into doglin tunnels and get lost."
+ value = CATALOGUER_REWARD_TRIVIAL
+
+/datum/ai_holder/simple_mob/doglin
+ hostile = FALSE
+ cooperative = TRUE
+ retaliate = TRUE
+ speak_chance = 1
+ wander = TRUE
+ belly_attack = FALSE
+ intelligence_level = AI_SMART
+ threaten_delay = 30 SECONDS
+ grab_hostile = FALSE
+
+/datum/ai_holder/simple_mob/doglin/on_hear_say(mob/living/speaker, message)
+ if(holder.client)
+ return
+ var/mob/living/simple_mob/vore/doglin/D = holder
+ if(D.yip_cooldown)
+ return
+ if(findtext(message, "yip") || findtext(message, "yap"))
+ var/who = null
+ if(!istype(speaker,/mob/living/simple_mob/vore/doglin))
+ who = " [speaker]"
+ D.yapyapyap(who, speaker)
+
+/datum/ai_holder/simple_mob/doglin/on_hear_emote(mob/living/speaker, message)
+ if(holder.client)
+ return
+ var/mob/living/simple_mob/vore/doglin/D = holder
+ if(D.yip_cooldown)
+ return
+ if(findtext(message, "yip") || findtext(message, "yap"))
+ var/who = null
+ if(!istype(speaker,/mob/living/simple_mob/vore/doglin))
+ who = " [speaker]"
+ D.yapyapyap(who, speaker)
+
+/obj/structure/doglin_hole
+ name = "hole"
+ desc = "Someone dug a hole! Heehoo~"
+ icon = 'icons/rogue-star/mobx32.dmi'
+ icon_state = "heehoo"
diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm
index 184980edc70..e5983cb81e8 100644
--- a/code/modules/mob/mob.dm
+++ b/code/modules/mob/mob.dm
@@ -131,6 +131,11 @@
M.show_message(msg, AUDIBLE_MESSAGE, deaf_message, VISIBLE_MESSAGE)
if(runemessage != -1)
M.create_chat_message(src, "[runemessage || message]", FALSE, list("emote"), audible = FALSE)
+ if(isliving(M))
+ var/mob/living/L = M
+ if(L.ai_holder)
+ var/datum/ai_holder/AI = L.ai_holder
+ AI.on_hear_emote(src, message)
/mob/proc/findname(msg)
for(var/mob/M in mob_list)
diff --git a/icons/rogue-star/attributions.txt b/icons/rogue-star/attributions.txt
index 220deeed2c2..3c6e9e80527 100644
--- a/icons/rogue-star/attributions.txt
+++ b/icons/rogue-star/attributions.txt
@@ -1 +1 @@
-The assets within this folder are credited to VerySoft, and may not be used for any purpose without permission.
+The assets within this directory/folder and any sub-directories/sub-folders are credited to VerySoft, and may not be used for any purpose without permission.
diff --git a/icons/rogue-star/mobx32.dmi b/icons/rogue-star/mobx32.dmi
index dc2cdf849a6..e48b5b96ec5 100644
Binary files a/icons/rogue-star/mobx32.dmi and b/icons/rogue-star/mobx32.dmi differ
diff --git a/maps/stellar_delight/stellar_delight1.dmm b/maps/stellar_delight/stellar_delight1.dmm
index 100106112dc..edf55eb36fa 100644
--- a/maps/stellar_delight/stellar_delight1.dmm
+++ b/maps/stellar_delight/stellar_delight1.dmm
@@ -1746,7 +1746,11 @@
/obj/structure/cable/green{
icon_state = "4-8"
},
-/turf/simulated/floor/tiled/techmaint,
+/obj/structure/cable/green{
+ icon_state = "0-4"
+ },
+/obj/machinery/power/quantumpad,
+/turf/simulated/floor,
/area/stellardelight/deck1/aft)
"do" = (
/obj/machinery/conveyor{
@@ -5537,6 +5541,9 @@
/obj/effect/floor_decal/steeldecal/steel_decals4{
dir = 9
},
+/obj/structure/cable/yellow{
+ icon_state = "1-4"
+ },
/turf/simulated/floor/tiled/eris/steel/cargo,
/area/stellardelight/deck1/mining)
"lf" = (
@@ -7082,16 +7089,10 @@
/turf/simulated/floor/tiled/eris/steel/gray_platform,
/area/stellardelight/deck1/exploshuttle)
"on" = (
-/obj/structure/cable/yellow{
- icon_state = "4-8"
- },
-/obj/structure/cable/yellow{
- icon_state = "1-4"
- },
-/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
- dir = 8
- },
-/turf/simulated/floor/tiled/eris/steel/cargo,
+/obj/machinery/door/firedoor/glass,
+/obj/structure/low_wall/bay/reinforced/brown,
+/obj/machinery/smartfridge/sheets/persistent,
+/turf/simulated/floor,
/area/stellardelight/deck1/mining)
"oo" = (
/obj/effect/floor_decal/industrial/warning/corner,
@@ -18403,17 +18404,6 @@
/obj/machinery/atmospherics/pipe/simple/hidden/supply,
/turf/simulated/floor/tiled/techmaint,
/area/stellardelight/deck1/aft)
-"Nm" = (
-/obj/structure/cable/yellow{
- icon_state = "0-2"
- },
-/obj/machinery/power/apc/angled{
- dir = 1;
- name = "night shift APC";
- nightshift_setting = 2
- },
-/turf/simulated/floor/tiled/eris/steel/cargo,
-/area/stellardelight/deck1/mining)
"No" = (
/obj/structure/cable/green{
icon_state = "1-4"
@@ -22431,6 +22421,14 @@
/obj/machinery/recharger{
pixel_y = 5
},
+/obj/machinery/power/apc/angled{
+ dir = 1;
+ name = "night shift APC";
+ nightshift_setting = 2
+ },
+/obj/structure/cable/yellow{
+ icon_state = "0-8"
+ },
/turf/simulated/floor/tiled/eris/steel/cargo,
/area/stellardelight/deck1/mining)
"VF" = (
@@ -33965,9 +33963,9 @@ ip
CG
cA
hg
-dl
-Nm
on
+wp
+pV
pR
rI
SS
diff --git a/maps/stellar_delight/stellar_delight2.dmm b/maps/stellar_delight/stellar_delight2.dmm
index f5f4749fe5e..8d6950fe6cb 100644
--- a/maps/stellar_delight/stellar_delight2.dmm
+++ b/maps/stellar_delight/stellar_delight2.dmm
@@ -2971,7 +2971,7 @@
dir = 2;
icon_state = "pipe-c"
},
-/obj/machinery/smartfridge/sheets/persistent_lossy,
+/obj/machinery/smartfridge/sheets/persistent,
/turf/simulated/floor/tiled/eris/steel/cargo,
/area/quartermaster/storage)
"gc" = (
@@ -4134,6 +4134,9 @@
/obj/structure/cable{
icon_state = "2-8"
},
+/obj/effect/wire_deleter{
+ wire_deletion_rate = 5
+ },
/turf/simulated/floor/airless,
/area/stellardelight/deck2/exterior)
"iI" = (
@@ -7817,6 +7820,9 @@
/obj/structure/cable{
icon_state = "2-8"
},
+/obj/effect/wire_deleter{
+ wire_deletion_rate = 5
+ },
/turf/simulated/floor/airless,
/area/stellardelight/deck2/exterior)
"qH" = (
@@ -8645,6 +8651,9 @@
/obj/structure/cable{
icon_state = "1-8"
},
+/obj/effect/wire_deleter{
+ wire_deletion_rate = 5
+ },
/turf/simulated/floor/airless,
/area/stellardelight/deck2/exterior)
"sD" = (
@@ -9185,6 +9194,18 @@
},
/turf/simulated/floor/plating,
/area/maintenance/stellardelight/substation/engineering)
+"tR" = (
+/obj/structure/cable{
+ icon_state = "1-8"
+ },
+/obj/structure/cable{
+ icon_state = "2-8"
+ },
+/obj/effect/wire_deleter{
+ wire_deletion_rate = 5
+ },
+/turf/simulated/floor/airless,
+/area/stellardelight/deck2/exterior)
"tT" = (
/obj/machinery/atmospherics/pipe/simple/hidden/supply{
dir = 4
@@ -10248,6 +10269,9 @@
/obj/structure/cable{
icon_state = "2-4"
},
+/obj/effect/wire_deleter{
+ wire_deletion_rate = 5
+ },
/turf/simulated/floor/airless,
/area/stellardelight/deck2/exterior)
"ws" = (
@@ -10564,6 +10588,21 @@
},
/turf/simulated/floor/tiled,
/area/stellardelight/deck2/port)
+"xf" = (
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/structure/cable{
+ icon_state = "1-8"
+ },
+/obj/structure/cable{
+ icon_state = "2-8"
+ },
+/obj/effect/wire_deleter{
+ wire_deletion_rate = 5
+ },
+/turf/simulated/floor/airless,
+/area/stellardelight/deck2/exterior)
"xg" = (
/obj/structure/cable/green{
icon_state = "1-4"
@@ -11959,6 +11998,21 @@
/obj/effect/floor_decal/industrial/outline/blue,
/turf/simulated/floor,
/area/stellardelight/deck2/combustionworkshop)
+"Aq" = (
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/structure/cable{
+ icon_state = "2-4"
+ },
+/obj/structure/cable{
+ icon_state = "1-4"
+ },
+/obj/effect/wire_deleter{
+ wire_deletion_rate = 5
+ },
+/turf/simulated/floor/airless,
+/area/stellardelight/deck2/exterior)
"Ar" = (
/obj/machinery/power/pointdefense{
id_tag = "sd_pd"
@@ -12377,8 +12431,8 @@
/turf/simulated/floor/tiled,
/area/storage/art)
"Bj" = (
-/obj/machinery/smartfridge/produce/persistent_lossy,
/obj/machinery/door/firedoor/glass,
+/obj/machinery/smartfridge/produce/persistent,
/turf/simulated/floor,
/area/crew_quarters/kitchen)
"Bk" = (
@@ -12528,6 +12582,9 @@
/obj/structure/cable{
icon_state = "1-4"
},
+/obj/effect/wire_deleter{
+ wire_deletion_rate = 5
+ },
/turf/simulated/floor/airless,
/area/stellardelight/deck2/exterior)
"BF" = (
@@ -15554,6 +15611,9 @@
/obj/structure/cable{
icon_state = "1-4"
},
+/obj/effect/wire_deleter{
+ wire_deletion_rate = 5
+ },
/turf/simulated/floor/airless,
/area/stellardelight/deck2/exterior)
"Ih" = (
@@ -17651,6 +17711,9 @@
/obj/structure/cable{
icon_state = "1-8"
},
+/obj/effect/wire_deleter{
+ wire_deletion_rate = 5
+ },
/turf/simulated/floor/airless,
/area/stellardelight/deck2/exterior)
"MP" = (
@@ -18420,6 +18483,18 @@
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
/turf/simulated/floor/tiled/eris/white/bluecorner,
/area/stellardelight/deck2/triage)
+"Oy" = (
+/obj/structure/cable{
+ icon_state = "1-4"
+ },
+/obj/structure/cable{
+ icon_state = "2-4"
+ },
+/obj/effect/wire_deleter{
+ wire_deletion_rate = 5
+ },
+/turf/simulated/floor/airless,
+/area/stellardelight/deck2/exterior)
"Oz" = (
/obj/machinery/atmospherics/unary/vent_pump/on,
/obj/effect/floor_decal/steeldecal/steel_decals5{
@@ -20925,6 +21000,9 @@
/obj/structure/cable{
icon_state = "2-8"
},
+/obj/effect/wire_deleter{
+ wire_deletion_rate = 5
+ },
/turf/simulated/floor/airless,
/area/stellardelight/deck2/exterior)
"Ui" = (
@@ -21984,6 +22062,15 @@
/obj/machinery/alarm/angled,
/turf/simulated/floor/tiled/eris/dark/cargo,
/area/crew_quarters/recreation_area)
+"WD" = (
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/effect/wire_deleter{
+ wire_deletion_rate = 5
+ },
+/turf/simulated/floor/airless,
+/area/stellardelight/deck2/exterior)
"WE" = (
/obj/machinery/firealarm/angled{
dir = 4
@@ -29455,7 +29542,7 @@ Uh
Uh
Uh
Uh
-NL
+Oy
Ig
Ig
Ig
@@ -29597,7 +29684,7 @@ Cq
Cq
Cq
Cq
-NL
+WD
Cq
Cq
Cq
@@ -29739,7 +29826,7 @@ qG
Uh
Uh
Uh
-NL
+Aq
Ig
Ig
Ig
@@ -29881,7 +29968,7 @@ SO
Mx
Mx
Mx
-NL
+WD
Mx
Mx
Mx
@@ -36981,7 +37068,7 @@ kL
yH
yH
yH
-NL
+WD
yH
yH
yH
@@ -37123,7 +37210,7 @@ wr
Uh
Uh
Uh
-NL
+xf
Ig
Ig
Ig
@@ -37265,7 +37352,7 @@ Cp
Cp
Cp
Cp
-NL
+WD
Cp
Cp
Cp
@@ -37407,7 +37494,7 @@ Uh
Uh
Uh
Uh
-NL
+tR
MN
MN
MN
diff --git a/maps/stellar_delight/stellar_delight_things.dm b/maps/stellar_delight/stellar_delight_things.dm
index 2cdc2a0382c..dde3eb627ec 100644
--- a/maps/stellar_delight/stellar_delight_things.dm
+++ b/maps/stellar_delight/stellar_delight_things.dm
@@ -173,8 +173,12 @@
icon_state = "multitool_red"
return
+//Hopefully this will make it so you can't clear the buffer. :3c
+/obj/item/device/multitool/scioutpost/attack_self(mob/living/user)
+ return
+
/obj/machinery/power/quantumpad/scioutpost
/datum/random_map/noise/ore/virgo2 // Less OP generation map, but better than Underdark
deep_val = 0.7
- rare_val = 0.5
\ No newline at end of file
+ rare_val = 0.5
diff --git a/sound/rogue-star/attributions.txt b/sound/rogue-star/attributions.txt
new file mode 100644
index 00000000000..3c6e9e80527
--- /dev/null
+++ b/sound/rogue-star/attributions.txt
@@ -0,0 +1 @@
+The assets within this directory/folder and any sub-directories/sub-folders are credited to VerySoft, and may not be used for any purpose without permission.
diff --git a/sound/rogue-star/yap/yap1.ogg b/sound/rogue-star/yap/yap1.ogg
new file mode 100644
index 00000000000..1da88497a0c
Binary files /dev/null and b/sound/rogue-star/yap/yap1.ogg differ
diff --git a/sound/rogue-star/yap/yap10.ogg b/sound/rogue-star/yap/yap10.ogg
new file mode 100644
index 00000000000..ee408949475
Binary files /dev/null and b/sound/rogue-star/yap/yap10.ogg differ
diff --git a/sound/rogue-star/yap/yap11.ogg b/sound/rogue-star/yap/yap11.ogg
new file mode 100644
index 00000000000..65f1b502d3c
Binary files /dev/null and b/sound/rogue-star/yap/yap11.ogg differ
diff --git a/sound/rogue-star/yap/yap12.ogg b/sound/rogue-star/yap/yap12.ogg
new file mode 100644
index 00000000000..9e7249b12b3
Binary files /dev/null and b/sound/rogue-star/yap/yap12.ogg differ
diff --git a/sound/rogue-star/yap/yap13.ogg b/sound/rogue-star/yap/yap13.ogg
new file mode 100644
index 00000000000..c4ffc8290e4
Binary files /dev/null and b/sound/rogue-star/yap/yap13.ogg differ
diff --git a/sound/rogue-star/yap/yap14.ogg b/sound/rogue-star/yap/yap14.ogg
new file mode 100644
index 00000000000..58a3fb8b4ba
Binary files /dev/null and b/sound/rogue-star/yap/yap14.ogg differ
diff --git a/sound/rogue-star/yap/yap2.ogg b/sound/rogue-star/yap/yap2.ogg
new file mode 100644
index 00000000000..12babd0eb52
Binary files /dev/null and b/sound/rogue-star/yap/yap2.ogg differ
diff --git a/sound/rogue-star/yap/yap4.ogg b/sound/rogue-star/yap/yap4.ogg
new file mode 100644
index 00000000000..9b8727259e5
Binary files /dev/null and b/sound/rogue-star/yap/yap4.ogg differ
diff --git a/sound/rogue-star/yap/yap5.ogg b/sound/rogue-star/yap/yap5.ogg
new file mode 100644
index 00000000000..a408d54adb1
Binary files /dev/null and b/sound/rogue-star/yap/yap5.ogg differ
diff --git a/sound/rogue-star/yap/yap6.ogg b/sound/rogue-star/yap/yap6.ogg
new file mode 100644
index 00000000000..b6ec192b3a5
Binary files /dev/null and b/sound/rogue-star/yap/yap6.ogg differ
diff --git a/sound/rogue-star/yap/yap7.ogg b/sound/rogue-star/yap/yap7.ogg
new file mode 100644
index 00000000000..34c5147cadd
Binary files /dev/null and b/sound/rogue-star/yap/yap7.ogg differ
diff --git a/sound/rogue-star/yap/yap8.ogg b/sound/rogue-star/yap/yap8.ogg
new file mode 100644
index 00000000000..9df561bbbdd
Binary files /dev/null and b/sound/rogue-star/yap/yap8.ogg differ
diff --git a/sound/rogue-star/yap/yap9.ogg b/sound/rogue-star/yap/yap9.ogg
new file mode 100644
index 00000000000..873b440b6eb
Binary files /dev/null and b/sound/rogue-star/yap/yap9.ogg differ
diff --git a/sound/rogue-star/yip/yip1.ogg b/sound/rogue-star/yip/yip1.ogg
new file mode 100644
index 00000000000..efdfaae622b
Binary files /dev/null and b/sound/rogue-star/yip/yip1.ogg differ
diff --git a/sound/rogue-star/yip/yip10.ogg b/sound/rogue-star/yip/yip10.ogg
new file mode 100644
index 00000000000..68557434c88
Binary files /dev/null and b/sound/rogue-star/yip/yip10.ogg differ
diff --git a/sound/rogue-star/yip/yip11.ogg b/sound/rogue-star/yip/yip11.ogg
new file mode 100644
index 00000000000..4b1c1c21949
Binary files /dev/null and b/sound/rogue-star/yip/yip11.ogg differ
diff --git a/sound/rogue-star/yip/yip12.ogg b/sound/rogue-star/yip/yip12.ogg
new file mode 100644
index 00000000000..e20b2b1ffeb
Binary files /dev/null and b/sound/rogue-star/yip/yip12.ogg differ
diff --git a/sound/rogue-star/yip/yip13.ogg b/sound/rogue-star/yip/yip13.ogg
new file mode 100644
index 00000000000..5363cd0e09d
Binary files /dev/null and b/sound/rogue-star/yip/yip13.ogg differ
diff --git a/sound/rogue-star/yip/yip14.ogg b/sound/rogue-star/yip/yip14.ogg
new file mode 100644
index 00000000000..12089e7f842
Binary files /dev/null and b/sound/rogue-star/yip/yip14.ogg differ
diff --git a/sound/rogue-star/yip/yip15.ogg b/sound/rogue-star/yip/yip15.ogg
new file mode 100644
index 00000000000..85f35fcf954
Binary files /dev/null and b/sound/rogue-star/yip/yip15.ogg differ
diff --git a/sound/rogue-star/yip/yip2.ogg b/sound/rogue-star/yip/yip2.ogg
new file mode 100644
index 00000000000..9b0d7f2a0ff
Binary files /dev/null and b/sound/rogue-star/yip/yip2.ogg differ
diff --git a/sound/rogue-star/yip/yip3.ogg b/sound/rogue-star/yip/yip3.ogg
new file mode 100644
index 00000000000..bf53d8f7670
Binary files /dev/null and b/sound/rogue-star/yip/yip3.ogg differ
diff --git a/sound/rogue-star/yip/yip4.ogg b/sound/rogue-star/yip/yip4.ogg
new file mode 100644
index 00000000000..a9df6049da7
Binary files /dev/null and b/sound/rogue-star/yip/yip4.ogg differ
diff --git a/sound/rogue-star/yip/yip5.ogg b/sound/rogue-star/yip/yip5.ogg
new file mode 100644
index 00000000000..4de84fba5e7
Binary files /dev/null and b/sound/rogue-star/yip/yip5.ogg differ
diff --git a/sound/rogue-star/yip/yip6.ogg b/sound/rogue-star/yip/yip6.ogg
new file mode 100644
index 00000000000..294eab6f5a3
Binary files /dev/null and b/sound/rogue-star/yip/yip6.ogg differ
diff --git a/sound/rogue-star/yip/yip7.ogg b/sound/rogue-star/yip/yip7.ogg
new file mode 100644
index 00000000000..a9eeef31823
Binary files /dev/null and b/sound/rogue-star/yip/yip7.ogg differ
diff --git a/sound/rogue-star/yip/yip8.ogg b/sound/rogue-star/yip/yip8.ogg
new file mode 100644
index 00000000000..80fd5f5e345
Binary files /dev/null and b/sound/rogue-star/yip/yip8.ogg differ
diff --git a/sound/rogue-star/yip/yip9.ogg b/sound/rogue-star/yip/yip9.ogg
new file mode 100644
index 00000000000..9a1e309a8c6
Binary files /dev/null and b/sound/rogue-star/yip/yip9.ogg differ
diff --git a/vorestation.dme b/vorestation.dme
index 1e841a078cd..37dade8d2fd 100644
--- a/vorestation.dme
+++ b/vorestation.dme
@@ -2223,6 +2223,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_emotes_RS.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_vr.dm"
@@ -3235,6 +3236,7 @@
#include "code\modules\mob\living\simple_mob\subtypes\vore\deathclaw.dm"
#include "code\modules\mob\living\simple_mob\subtypes\vore\deer.dm"
#include "code\modules\mob\living\simple_mob\subtypes\vore\dino.dm"
+#include "code\modules\mob\living\simple_mob\subtypes\vore\doglin.dm"
#include "code\modules\mob\living\simple_mob\subtypes\vore\dominated_brain.dm"
#include "code\modules\mob\living\simple_mob\subtypes\vore\dragon.dm"
#include "code\modules\mob\living\simple_mob\subtypes\vore\fennec.dm"
@@ -4270,7 +4272,6 @@
#include "maps\expedition_vr\beach\submaps\mountains.dm"
#include "maps\expedition_vr\beach\submaps\mountains_areas.dm"
#include "maps\gateway_archive_vr\blackmarketpackers.dm"
-#include "maps\groundbase\groundbase.dm"
#include "maps\redgate\fantasy_items.dm"
#include "maps\redgate\code\snowglobe_rs.dm"
#include "maps\southern_cross\items\clothing\sc_accessory.dm"
@@ -4279,6 +4280,7 @@
#include "maps\southern_cross\loadout\loadout_suit.dm"
#include "maps\southern_cross\loadout\loadout_uniform.dm"
#include "maps\southern_cross\loadout\loadout_vr.dm"
+#include "maps\stellar_delight\stellar_delight.dm"
#include "maps\submaps\_helpers.dm"
#include "maps\submaps\_readme.dm"
#include "maps\submaps\admin_use_vr\event_autonomous_drone.dm"